mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-26 14:06:23 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			209 lines
		
	
	
	
		
			8.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
	
		
			8.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="protocol-section protocol-information mb-4" data-e2e="e2e-CO-protocolTemplates-protocolDetails">
 | |
|     <div id="protocol-details" class="protocol-section-header">
 | |
|       <div class="protocol-details-container">
 | |
|         <a class="protocol-section-caret" role="button" data-toggle="collapse"
 | |
|            href="#details-container" aria-expanded="false" aria-controls="details-container">
 | |
|           <i class="sn-icon sn-icon-right"></i>
 | |
|           <span id="protocolDetailsLabel" class="protocol-section-title">
 | |
|             <h2 data-e2e="e2e-TX-protocolTemplates-protocolDetails-title">
 | |
|               {{ i18n.t("protocols.header.details") }}
 | |
|             </h2>
 | |
|             <span class="protocol-code" data-e2e="e2e-TX-protocolTemplates-protocolDetails-protocolId">{{ protocol.attributes.code }}</span>
 | |
|           </span>
 | |
|         </a>
 | |
|       </div>
 | |
|       <div class="actions-block">
 | |
|         <a class="btn btn-light icon-btn pull-right"
 | |
|            :href="protocol.attributes.urls.print_protocol_url" target="_blank"
 | |
|            data-e2e="e2e-BT-protocolTemplates-protocolDetails-print">
 | |
|           <span class="sn-icon sn-icon-printer" aria-hidden="true"></span>
 | |
|         </a>
 | |
|         <button class="btn btn-light" @click="openVersionsModal" data-e2e="e2e-BT-protocolTemplates-protocolDetails-versions">
 | |
|           {{ i18n.t("protocols.header.versions") }}
 | |
|         </button>
 | |
|         <button v-if="protocol.attributes.urls.publish_url"
 | |
|                 @click="$emit('publish')" class="btn btn-primary" data-e2e="e2e-BT-protocolTemplates-protocolDetails-publish">
 | |
|           {{ i18n.t("protocols.header.publish") }}</button>
 | |
|         <button v-if="protocol.attributes.urls.save_as_draft_url"
 | |
|                 :disabled="protocol.attributes.has_draft || creatingDraft"
 | |
|                 @click="saveAsdraft" class="btn btn-secondary" data-e2e="e2e-BT-protocolTemplates-protocolDetails-saveAsDraft">
 | |
|           {{ i18n.t("protocols.header.save_as_draft") }}
 | |
|         </button>
 | |
|       </div>
 | |
|     </div>
 | |
|     <div id="details-container" class="protocol-details collapse in">
 | |
|       <div class="protocol-metadata">
 | |
|         <p class="data-block">
 | |
|           <span data-e2e="e2e-TX-protocolTemplates-protocolDetails-versionLabel">{{ i18n.t("protocols.header.version") }}</span>
 | |
|           <b data-e2e="e2e-TX-protocolTemplates-protocolDetails-version">{{ titleVersion }}</b>
 | |
|         </p>
 | |
|         <p class="data-block" v-if="protocol.attributes.published">
 | |
|           <span data-e2e="e2e-TX-protocolTemplates-protocolDetails-publishedOnLabel">{{ i18n.t("protocols.header.published_on") }}</span>
 | |
|           <b data-e2e="e2e-TX-protocolTemplates-protocolDetails-publishedOn">{{ protocol.attributes.published_on_formatted }}</b>
 | |
|         </p>
 | |
|         <p class="data-block" v-if="protocol.attributes.published" data-e2e="e2e-TX-protocolTemplates-protocolDetails-publishedBy">
 | |
|           <span>{{ i18n.t("protocols.header.published_by") }}</span>
 | |
|           <img :src="protocol.attributes.published_by.avatar" class="rounded-full"/>
 | |
|           {{ protocol.attributes.published_by.name }}
 | |
|         </p>
 | |
|         <p class="data-block">
 | |
|           <span data-e2e="e2e-TX-protocolTemplates-protocolDetails-updatedAtLabel">{{ i18n.t("protocols.header.updated_at") }}</span>
 | |
|           <b data-e2e="e2e-TX-protocolTemplates-protocolDetails-updatedAt">{{ protocol.attributes.updated_at_formatted }}</b>
 | |
|         </p>
 | |
|         <p class="data-block">
 | |
|           <span data-e2e="e2e-TX-protocolTemplates-protocolDetails-createdAtLabel">{{ i18n.t("protocols.header.created_at") }}</span>
 | |
|           <b data-e2e="e2e-TX-protocolTemplates-protocolDetails-createdAt">{{ protocol.attributes.created_at_formatted }}</b>
 | |
|         </p>
 | |
|         <p class="data-block" data-e2e="e2e-TX-protocolTemplates-protocolDetails-createdBy">
 | |
|           <span>{{ i18n.t("protocols.header.added_by") }}</span>
 | |
|           <img :src="protocol.attributes.added_by.avatar" class="rounded-full"/>
 | |
|           {{ protocol.attributes.added_by.name }}
 | |
|         </p>
 | |
|         <p class="data-block authors-data">
 | |
|           <span data-e2e="e2e-TX-protocolTemplates-protocolDetails-authorsLabel">{{ i18n.t("protocols.header.authors") }}</span>
 | |
|           <span class="authors-list" v-if="protocol.attributes.urls.update_protocol_authors_url">
 | |
|             <InlineEdit
 | |
|               :value="protocol.attributes.authors"
 | |
|               :placeholder="i18n.t('protocols.header.add_authors')"
 | |
|               :allowBlank="true"
 | |
|               :attributeName="`${i18n.t('Protocol')} ${i18n.t('protocols.header.authors_list')}`"
 | |
|               :characterLimit="10000"
 | |
|               :dataE2e="'protocolTemplates-protocolDetails-authors'"
 | |
|               @update="updateAuthors"
 | |
|             />
 | |
|           </span>
 | |
|           <span class="authors-list" data-e2e="e2e-TX-protocolTemplates-protocolDetails-authorsPublished" v-else>
 | |
|             {{ protocol.attributes.authors }}
 | |
|           </span>
 | |
|         </p>
 | |
|         <p class="data-block keywords-data">
 | |
|           <span data-e2e="e2e-TX-protocolTemplates-protocolDetails-keywordsLabel">{{ i18n.t("protocols.header.keywords") }}</span>
 | |
|           <span
 | |
|             class="keywords-list"
 | |
|             v-if="protocol.attributes.urls.update_protocol_authors_url || protocol.attributes.keywords.length">
 | |
|             <DropdownSelector
 | |
|               :inputTagMode="true"
 | |
|               :options="this.protocol.attributes.keywords"
 | |
|               :placeholder="i18n.t('protocols.header.add_keywords')"
 | |
|               :selectorId="'keywordsSelector'"
 | |
|               :singleSelect="false"
 | |
|               :closeOnSelect="false"
 | |
|               :noEmptyOption="false"
 | |
|               :selectAppearance="'tag'"
 | |
|               :viewMode="protocol.attributes.urls.update_protocol_keywords_url == null"
 | |
|               :dataE2e="'e2e-IF-protocolTemplates-protocolDetails-keywords'"
 | |
|               @dropdown:changed="updateKeywords"
 | |
|             />
 | |
|           </span>
 | |
|         </p>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
|   <Teleport to="body">
 | |
|     <VersionsModal v-if="VersionsModalObject" :protocol="VersionsModalObject"
 | |
|                  @close="VersionsModalObject = null"
 | |
|                  @reloadPage="reloadPage"
 | |
|                  @redirectToProtocols="redirectToProtocols"/>
 | |
|   </Teleport>
 | |
| </template>
 | |
| <script>
 | |
| /* global HelperModule */
 | |
| import InlineEdit from '../shared/inline_edit.vue';
 | |
| import DropdownSelector from '../shared/legacy/dropdown_selector.vue';
 | |
| import VersionsModal from '../protocols/modals/versions.vue';
 | |
| 
 | |
| export default {
 | |
|   name: 'ProtocolMetadata',
 | |
|   components: { InlineEdit, DropdownSelector, VersionsModal },
 | |
|   props: {
 | |
|     protocol: {
 | |
|       type: Object,
 | |
|       required: true
 | |
|     }
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       VersionsModalObject: null,
 | |
|       creatingDraft: false
 | |
|     };
 | |
|   },
 | |
|   computed: {
 | |
|     titleVersion() {
 | |
|       const createdFromVersion = this.protocol.attributes.created_from_version;
 | |
| 
 | |
|       if (this.protocol.attributes.published) {
 | |
|         return this.protocol.attributes.version;
 | |
|       }
 | |
| 
 | |
|       if (!createdFromVersion) {
 | |
|         return this.i18n.t('protocols.draft');
 | |
|       }
 | |
| 
 | |
|       return this.i18n.t('protocols.header.draft_with_from_version', { nr: createdFromVersion });
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     saveAsdraft() {
 | |
|       if (this.creatingDraft) {
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       this.creatingDraft = true;
 | |
| 
 | |
|       $.post(this.protocol.attributes.urls.save_as_draft_url, (result) => {
 | |
|         this.creatingDraft = false;
 | |
|         window.location.replace(result.url);
 | |
|       }).fail(() => {
 | |
|         this.creatingDraft = false;
 | |
|         HelperModule.flashAlertMsg(this.i18n.t('errors.general'));
 | |
|       });
 | |
|     },
 | |
|     updateAuthors(authors) {
 | |
|       $.ajax({
 | |
|         type: 'PATCH',
 | |
|         url: this.protocol.attributes.urls.update_protocol_authors_url,
 | |
|         data: { protocol: { authors } },
 | |
|         success: (result) => {
 | |
|           this.$emit('update', result.data.attributes);
 | |
|         },
 | |
|         error: (data) => {
 | |
|           let message;
 | |
|           if (data.responseJSON) {
 | |
|             message = Object.values(data.responseJSON).join(', ');
 | |
|           } else {
 | |
|             message = this.i18n.t('errors.general');
 | |
|           }
 | |
|           HelperModule.flashAlertMsg(message);
 | |
|         }
 | |
|       });
 | |
|     },
 | |
|     updateKeywords(keywords) {
 | |
|       const uniqueKeywords = [...new Set(keywords.map((kw) => kw.trim()).filter((kw) => !!kw))];
 | |
|       $.ajax({
 | |
|         type: 'PATCH',
 | |
|         url: this.protocol.attributes.urls.update_protocol_keywords_url,
 | |
|         data: { keywords: uniqueKeywords },
 | |
|         success: (result) => {
 | |
|           this.$emit('update', result.data.attributes);
 | |
|         }
 | |
|       });
 | |
|     },
 | |
|     openVersionsModal() {
 | |
|       this.VersionsModalObject = {
 | |
|         id: this.protocol.id,
 | |
|         name: this.protocol.attributes.name,
 | |
|         urls: {
 | |
|           versions_modal: this.protocol.attributes.urls.versions_modal
 | |
|         }
 | |
|       };
 | |
|     },
 | |
|     reloadPage() {
 | |
|       window.location.reload();
 | |
|     },
 | |
|     redirectToProtocols() {
 | |
|       window.location.href = this.protocol.attributes.urls.redirect_to_protocols;
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 |