160 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | ||
|   <modal-inner class="modal__inner-1--sync-management" aria-label="Manage synchronized locations">
 | ||
|     <div class="modal__content">
 | ||
|       <div class="modal__image">
 | ||
|         <icon-sync></icon-sync>
 | ||
|       </div>
 | ||
|       <p v-if="syncLocations.length"><b>{{currentFileName}}</b> is synchronized with the following location(s):</p>
 | ||
|       <p v-else><b>{{currentFileName}}</b> is not synchronized yet.</p>
 | ||
|       <div>
 | ||
|         <div class="sync-entry flex flex--column" v-for="location in syncLocations" :key="location.id">
 | ||
|           <div class="sync-entry__header flex flex--row flex--align-center">
 | ||
|             <div class="sync-entry__icon flex flex--column flex--center">
 | ||
|               <icon-provider :provider-id="location.providerId"></icon-provider>
 | ||
|             </div>
 | ||
|             <div class="sync-entry__description">
 | ||
|               {{location.description}}
 | ||
|             </div>
 | ||
|             <div class="sync-entry__buttons flex flex--row flex--center">
 | ||
|               <button class="sync-entry__button button" @click="remove(location)" v-title="'删除位置'">
 | ||
|                 <icon-delete></icon-delete>
 | ||
|               </button>
 | ||
|             </div>
 | ||
|           </div>
 | ||
|           <div class="sync-entry__row flex flex--row flex--align-center">
 | ||
|             <div class="sync-entry__url">
 | ||
|               {{location.url || 'Google Drive app data'}}
 | ||
|             </div>
 | ||
|             <div class="sync-entry__buttons flex flex--row flex--center" v-if="location.url">
 | ||
|               <button class="sync-entry__button button" v-clipboard="location.url" @click="info('位置URL复制到剪贴板!')" v-title="'复制URL'">
 | ||
|                 <icon-content-copy></icon-content-copy>
 | ||
|               </button>
 | ||
|               <a class="sync-entry__button button" v-if="location.url" :href="location.url" target="_blank" v-title="'打开位置'">
 | ||
|                 <icon-open-in-new></icon-open-in-new>
 | ||
|               </a>
 | ||
|             </div>
 | ||
|           </div>
 | ||
|         </div>
 | ||
|       </div>
 | ||
|       <div class="modal__info" v-if="syncLocations.length">
 | ||
|         <b>Tip:</b> Removing a location won't delete any file.
 | ||
|       </div>
 | ||
|     </div>
 | ||
|     <div class="modal__button-bar">
 | ||
|       <button class="button button--resolve" @click="config.resolve()">Close</button>
 | ||
|     </div>
 | ||
|   </modal-inner>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| import { mapGetters, mapActions } from 'vuex';
 | ||
| import ModalInner from './common/ModalInner';
 | ||
| import store from '../../store';
 | ||
| import badgeSvc from '../../services/badgeSvc';
 | ||
| 
 | ||
| export default {
 | ||
|   components: {
 | ||
|     ModalInner,
 | ||
|   },
 | ||
|   computed: {
 | ||
|     ...mapGetters('modal', [
 | ||
|       'config',
 | ||
|     ]),
 | ||
|     ...mapGetters('syncLocation', {
 | ||
|       syncLocations: 'currentWithWorkspaceSyncLocation',
 | ||
|     }),
 | ||
|     currentFileName() {
 | ||
|       return store.getters['file/current'].name;
 | ||
|     },
 | ||
|   },
 | ||
|   methods: {
 | ||
|     ...mapActions('notification', [
 | ||
|       'info',
 | ||
|     ]),
 | ||
|     remove(location) {
 | ||
|       if (location.id === 'main') {
 | ||
|         this.info('This location can not be removed.');
 | ||
|       } else {
 | ||
|         store.commit('syncLocation/deleteItem', location.id);
 | ||
|         badgeSvc.addBadge('removeSyncLocation');
 | ||
|       }
 | ||
|     },
 | ||
|   },
 | ||
| };
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss">
 | ||
| @import '../../styles/variables.scss';
 | ||
| 
 | ||
| .sync-entry {
 | ||
|   margin: 1.5em 0;
 | ||
|   height: auto;
 | ||
|   font-size: 17px;
 | ||
|   line-height: 1.5;
 | ||
| }
 | ||
| 
 | ||
| $button-size: 30px;
 | ||
| $small-button-size: 22px;
 | ||
| 
 | ||
| .sync-entry__header {
 | ||
|   line-height: $button-size;
 | ||
| }
 | ||
| 
 | ||
| .sync-entry__row {
 | ||
|   border-top: 1px solid $hr-color;
 | ||
|   line-height: $small-button-size;
 | ||
| }
 | ||
| 
 | ||
| .sync-entry__icon {
 | ||
|   height: 22px;
 | ||
|   width: 22px;
 | ||
|   margin-right: 0.75rem;
 | ||
|   flex: none;
 | ||
| }
 | ||
| 
 | ||
| .sync-entry__description {
 | ||
|   width: 100%;
 | ||
|   overflow: hidden;
 | ||
|   white-space: nowrap;
 | ||
|   text-overflow: ellipsis;
 | ||
| }
 | ||
| 
 | ||
| .sync-entry__url {
 | ||
|   width: 100%;
 | ||
|   overflow: hidden;
 | ||
|   white-space: nowrap;
 | ||
|   text-overflow: ellipsis;
 | ||
|   opacity: 0.5;
 | ||
|   font-size: 0.67em;
 | ||
| }
 | ||
| 
 | ||
| .sync-entry__buttons {
 | ||
|   margin-left: 0.75rem;
 | ||
| 
 | ||
|   .sync-entry__row & {
 | ||
|     margin-left: 0.5rem;
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| .sync-entry__button {
 | ||
|   width: $button-size;
 | ||
|   height: $button-size;
 | ||
|   padding: 4px;
 | ||
|   background-color: transparent;
 | ||
|   opacity: 0.75;
 | ||
| 
 | ||
|   .sync-entry__row & {
 | ||
|     width: $small-button-size;
 | ||
|     height: $small-button-size;
 | ||
|     padding: 4px;
 | ||
|   }
 | ||
| 
 | ||
|   &:active,
 | ||
|   &:focus,
 | ||
|   &:hover {
 | ||
|     opacity: 1;
 | ||
|     background-color: rgba(0, 0, 0, 0.1);
 | ||
|   }
 | ||
| }
 | ||
| </style>
 | 
