mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-28 07:00:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			141 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div ref="modal" class="modal" tabindex="-1" role="dialog">
 | |
|     <div class="modal-dialog" role="document">
 | |
|       <div class="modal-content">
 | |
|         <div class="modal-header">
 | |
|           <button type="button" class="close" data-dismiss="modal" aria-label="Close">
 | |
|             <i class="sn-icon sn-icon-close"></i>
 | |
|           </button>
 | |
|           <h4 class="modal-title truncate !block">
 | |
|             {{ i18n.t('modal_share.title', {object_name: object.name }) }}
 | |
|           </h4>
 | |
|         </div>
 | |
|         <div class="modal-body">
 | |
|           <div class="grid grid-cols-3 gap-2">
 | |
|             <div class="col-span-2">
 | |
|               {{ i18n.t("modal_share.share_with_team") }}
 | |
|             </div>
 | |
|             <div class="text-center">
 | |
|               {{ i18n.t("modal_share.can_edit") }}
 | |
|             </div>
 | |
|             <div v-if="globalShareEnabled" class="col-span-2 flex items-center h-9 gap-1">
 | |
|               <span class="sci-checkbox-container">
 | |
|                 <input type="checkbox" class="sci-checkbox" v-model="sharedWithAllRead" />
 | |
|                 <span class="sci-checkbox-label"></span>
 | |
|               </span>
 | |
|               {{ i18n.t("modal_share.all_teams") }}
 | |
|             </div>
 | |
|             <div v-if="globalShareEnabled" class="flex justify-center items-center">
 | |
|               <span v-if="sharedWithAllRead" class="sci-toggle-checkbox-container">
 | |
|                 <input type="checkbox"
 | |
|                        class="sci-toggle-checkbox"
 | |
|                        :disabled="!object.shareable_write"
 | |
|                        v-model="sharedWithAllWrite" />
 | |
|                 <span class="sci-toggle-checkbox-label"></span>
 | |
|               </span>
 | |
|             </div>
 | |
|             <template v-for="team in shareableTeams">
 | |
|               <div class="col-span-2 flex items-center h-9 gap-1">
 | |
|                 <span class="sci-checkbox-container" :class="{'opacity-0 pointer-events-none': sharedWithAllRead}">
 | |
|                   <input :disabled="!team.attributes.readable" type="checkbox" class="sci-checkbox" v-model="team.attributes.private_shared_with" />
 | |
|                   <span class="sci-checkbox-label"></span>
 | |
|                 </span>
 | |
|                 {{ team.attributes.name || `(${i18n.t('teams.private_team')})` }}
 | |
|               </div>
 | |
|               <div class="flex justify-center items-center">
 | |
|                 <span v-if="team.attributes.private_shared_with"
 | |
|                       :class="{'opacity-0 pointer-events-none': sharedWithAllRead || !team.attributes.readable}"
 | |
|                       class="sci-toggle-checkbox-container">
 | |
|                   <input type="checkbox"
 | |
|                         class="sci-toggle-checkbox"
 | |
|                         :disabled="!object.shareable_write"
 | |
|                         v-model="team.attributes.private_shared_with_write" />
 | |
|                   <span class="sci-toggle-checkbox-label"></span>
 | |
|                 </span>
 | |
|               </div>
 | |
|             </template>
 | |
|           </div>
 | |
|         </div>
 | |
|         <div class="modal-footer">
 | |
|           <button type="button" class="btn btn-secondary" data-dismiss="modal">{{ i18n.t('general.cancel') }}</button>
 | |
|           <button class="btn btn-primary" @click="submit" type="submit">
 | |
|             {{ i18n.t('modal_share.submit') }}
 | |
|           </button>
 | |
|         </div>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| /* global HelperModule */
 | |
| 
 | |
| import axios from '../../packs/custom_axios.js';
 | |
| import modalMixin from './modal_mixin';
 | |
| 
 | |
| export default {
 | |
|   name: 'ShareObjectModal',
 | |
|   props: {
 | |
|     object: Object,
 | |
|     globalShareEnabled: { type: Boolean, default: false },
 | |
|     confirmationModal: { type: Object }
 | |
|   },
 | |
|   mixins: [modalMixin],
 | |
|   data() {
 | |
|     return {
 | |
|       sharedWithAllRead: this.object.shared_read || this.object.shared_write,
 | |
|       sharedWithAllWrite: this.object.shared_write,
 | |
|       initialState: {},
 | |
|       shareableTeams: []
 | |
|     };
 | |
|   },
 | |
|   mounted() {
 | |
|     this.initTeams();
 | |
|   },
 | |
|   computed: {
 | |
|     willUnshare() {
 | |
|       if (this.globalShareEnabled && !this.sharedWithAllRead && this.initialState.sharedWithAllRead) return true;
 | |
| 
 | |
|       // true if any team would switch from shared to unshared, based on initial state
 | |
|       return this.shareableTeams.some((t) => {
 | |
|         return this.initialState.shareableTeams.find((it) => t.id === it.id).attributes.private_shared_with && !t.attributes.private_shared_with;
 | |
|       });
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     initTeams() {
 | |
|       axios.get(this.object.urls.shareable_teams).then((response) => {
 | |
|         this.initialState = {
 | |
|           shareableTeams: JSON.parse(JSON.stringify(response.data.data)), // object needs to be deep cloned to get rid of references
 | |
|           sharedWithAllRead: this.sharedWithAllRead,
 | |
|           sharedWithAllWrite: this.sharedWithAllWrite
 | |
|         };
 | |
|         this.shareableTeams = response.data.data;
 | |
|       });
 | |
|     },
 | |
|     async submit() {
 | |
|       $(this.$refs.modal).hide();
 | |
| 
 | |
|       if (this.confirmationModal ? !this.willUnshare || await this.confirmationModal.show() : true) {
 | |
|         this.doRequest();
 | |
|       } else {
 | |
|         $(this.$refs.modal).show();
 | |
|       }
 | |
|     },
 | |
|     doRequest() {
 | |
|       const data = {
 | |
|         select_all_teams: this.sharedWithAllRead,
 | |
|         select_all_write_permission: this.sharedWithAllWrite,
 | |
|         team_share_params: this.sharedWithAllRead ? [] : this.shareableTeams.map((team) => { return { id: team.id, ...team.attributes } })
 | |
|       };
 | |
|       axios.post(this.object.urls.share, data).then(() => {
 | |
|         HelperModule.flashAlertMsg(this.i18n.t(
 | |
|           'modal_share.success_message',
 | |
|           { object_name: this.object.name }
 | |
|         ), 'success');
 | |
|         this.$emit('share');
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 |