mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-11-04 03:59:08 +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>
 |