{"version":3,"file":"DatasetCitationTable.vue.mjs","sources":["../../lib/citation/DatasetCitationTable.vue"],"sourcesContent":["/**\n * Shows a table with the dataset citation based on the current state of DatasetDetails store.\n */\n\n<template>\n  <div>\n    <table class=\"table table-borderless table-responsive\">\n      <tbody>\n        <tr>\n          <th scope=\"row\" class=\"text-muted font-weight-light\">\n            {{ availableCitationStyles[citationStyle] }}\n          </th>\n          <td v-if=\"isReady\">\n            <div ref=\"bibliography\" v-html=\"bibliographyHtml\" data-cy=\"bibliography\" />\n          </td>\n          <td v-else>\n            <div>...</div>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n    <div class=\"mt-3 d-flex justify-content-start align-items-center\">\n      <button class=\"btn btn-sm btn-outline-primary\" :disabled=\"!isReady\" @click=\"handleCopyToClipboard\"\n        data-cy=\"citation-copy-to-clipboard\">\n        {{ $t('message.cite.copyToClipboard') }}\n      </button>\n    </div>\n  </div>\n\n</template>\n\n<script>\nimport { debounce } from 'lodash-es';\nimport { mapGetters } from 'vuex';\nimport { getRepresentativeLocaleOf } from '../utils/helpers';\n\nexport default {\n  props: {\n    modalId: {\n      type: String,\n      required: true,\n    },\n    citationStyle: {\n      type: String,\n      required: true,\n    },\n    availableCitationStyles: {\n      type: Object,\n      required: true,\n    },\n  },\n  emits: ['ready'],\n  data: () => ({\n    currentCitationId: null,\n    citation: null,\n    // Currently unused, but might be useful in the future\n    // exportFormats: {\n    //   bibtex: {\n    //     name: 'BibTeX',\n    //     format: 'bibtex',\n    //     args: ['biblatex'],\n    //     extension: 'bib',\n    //   },\n    //   datacite: {\n    //     name: 'DataCite XML',\n    //     format: 'datacite',\n    //     args: ['data'],\n    //     extension: 'xml',\n    //     // todo\n    //     disabled: true,\n    //   },\n    //   json: {\n    //     name: 'JSON',\n    //     format: 'json',\n    //     args: ['data', { format: 'object' }],\n    //     extension: 'json',\n    //     postprocess: o => JSON.stringify(o[0], null, 2),\n    //   },\n    //   jsonld: {\n    //     name: 'JSON-LD',\n    //     format: 'json-ld',\n    //     extension: 'jsonld',\n    //     // todo\n    //     disabled: true,\n    //   },\n    // },\n  }),\n  computed: {\n    ...mapGetters('datasetDetails', [\n      'getLoading',\n      'getID',\n    ]),\n    /**\n     * Provide bibliography html based on current citation and citation style\n     */\n    bibliographyHtml() {\n      if (!this.citation) {\n        return '';\n      }\n      let bibliography = this.citation.format('bibliography', {\n        format: 'html',\n        template: this.citationStyle || 'apa',\n        lang: 'en-US',\n      });\n\n      // Bibliography conditional post-processing\n      // Remove Vancouver citation style numbering header from bibliography\n      const isVancouver = this.citationStyle === 'vancouver';\n      bibliography = bibliography && isVancouver\n        ? bibliography.replace(/<div class=\"csl-left-margin\">\\d+\\. <\\/div>/g, '')\n        : bibliography;\n\n      return bibliography || '';\n    },\n    /**\n     * Provide bibliography text for clipboard content\n     */\n    bibliographyText() {\n      if (!this.citation) {\n        return '';\n      }\n\n      const bibliographyText = this.citationStyle === 'vancouver'\n        // If vancouver style, refer to html text content because it has postformatting applied\n        ? this.$refs.bibliography.textContent.trim()\n        // Otherwise, just format bibliography as text\n        : this.citation.format('bibliography', {\n          format: 'text',\n          template: this.citationStyle || 'apa',\n          lang: 'en-US',\n        });\n\n      return bibliographyText || '';\n    },\n    isReady() {\n      this.$emit('ready');\n      return !this.getLoading && this.citation && this.bibliographyHtml;\n    },\n  },\n  watch: {\n    // Update citation when dataset details are loaded\n    // Uses watcher instead of computed property because computed is unable to\n    // handle async code (i.e. citation retrieval per http request)\n    getLoading: {\n      /**\n       * Assign citation object (CSL) based on current dataset in store to vm.citation\n       */\n      handler(isLoading) {\n        if (isLoading) return;\n        if (this.currentCitationId === this.getID) return;\n        this.currentCitationId = this.getID;\n        this.retrieveCitation(this);\n      },\n      immediate: false,\n    },\n  },\n  async created() {\n    const { plugins } = await import('@citation-js/core');\n\n    await import('@citation-js/plugin-csl');\n    await import('@citation-js/plugin-doi');\n\n    const { default: installDcatStateToCsl } = await import('./plugins/dcat-state-to-csl');\n    const { default: installCslAddAccessed } = await import('./plugins/csl-add-accessed');\n    installDcatStateToCsl(plugins);\n    installCslAddAccessed(plugins);\n\n    const { default: deu } = await import('./template/deu');\n    const styleConfig = plugins.config.get('@csl');\n    if (styleConfig) {\n      // styleConfig.templates.add(chicago.name, chicago.csl);\n      // styleConfig.templates.add(datacite.name, datacite.csl);\n      styleConfig.templates.add(deu.name, deu.csl);\n    }\n\n    this.retrieveCitation(this);\n  },\n  methods: {\n    /**\n     * Retrieves Citation Style Language (CSL) based on current dataset in store\n     * Side-effect: sets vm.citation to the resulting citation object\n     * @param vm Vue instance\n     */\n    retrieveCitation: async (vm) => {\n      // Deep-clone state to avoid any unintended mutations while citation is generated\n      const dataset = JSON.parse(JSON.stringify(vm.$store.state.datasetDetails.dataset));\n      Object.freeze(dataset);\n\n      if (!dataset || !dataset.id) return null;\n\n      const citationParams = [{\n        // Pass some additional data to the dataset object\n        __meta: {\n          // Pass the chosen dataset language for the bibliography\n          lang: getRepresentativeLocaleOf(dataset.title, vm.$route.query.locale || 'en', dataset.languages),\n          // Pass dataset URL for the bibliography\n          url: `http://data.europa.eu/88u/dataset/${dataset.id || vm.$route.params.ds_id}`,\n          skipDoiNegotiation: false,\n        },\n        ...dataset,\n      }, {\n        forceType: '@piveau/dcat-state',\n        generateGraph: false,\n      }];\n\n      let citation = null;\n\n      const { Cite } = await import('@citation-js/core')\n      try {\n        citation = await Cite.async(...citationParams);\n        // eslint-disable-next-line no-param-reassign\n        vm.citation = citation;\n        return citation;\n      } catch (e) {\n        // eslint-disable-next-line no-console\n        console.error(e);\n      }\n\n      // Retry by using manual citation generation as fallback\n      // in case above DOI content negotiation service fails\n      try {\n        // eslint-disable-next-line no-underscore-dangle\n        citationParams[0].__meta = { ...citationParams[0].__meta, skipDoiNegotiation: true };\n        citation = await Cite.async(...citationParams);\n        // eslint-disable-next-line no-param-reassign\n        vm.citation = citation;\n        return citation;\n      } catch (e) {\n        // eslint-disable-next-line no-console\n        console.error(e);\n      }\n\n      return citation;\n    },\n    /**\n     * Handle export of the citation\n     *\n     * @param {Object} format - The export format object\n     * @param {String} format.args - The arguments to be passed into citation.format\n     * @param {String} format.postprocess - A function to be called on the result of citation.format\n     * @param {String} format.extension - The file extension\n     * @param {String} format.filename - The filename\n     */\n    // handleCitationExport({\n    //   args,\n    //   postprocess = o => o,\n    //   extension,\n    //   filename = 'dataset',\n    // }) {\n    //   const exportedCitation = this.citation.format(\n    //     ...args,\n    //     { graph: false },\n    //   );\n    //   const postprocessedCitation = postprocess(exportedCitation);\n\n    //   this.download(`${filename}.${extension}`, postprocessedCitation);\n    // },\n    /**\n     * Download the given content as a file\n     *\n     * @see https://stackoverflow.com/a/45831280\n     *\n     * @param {String} filename - The filename\n     * @param {String} content - The content to be downloaded\n     */\n    // download(filename, text) {\n    //   const element = document.createElement('a');\n    //   element.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(text)}`);\n    //   element.setAttribute('download', filename);\n\n    //   element.style.display = 'none';\n    //   document.body.appendChild(element);\n\n    //   element.click();\n\n    //   document.body.removeChild(element);\n    // },\n    /**\n     * Copy the bibliography to the clipboard\n     */\n    async handleCopyToClipboard() {\n      // Select the bibliography text\n      window.getSelection().selectAllChildren(this.$refs.bibliography);\n\n      // Copy the text to the clipboard\n      try {\n        await navigator.clipboard.writeText(this.bibliographyText);\n      } catch (err) {\n        // eslint-disable-next-line no-console\n        console.error('Failed to copy to clipboard: ', err);\n      }\n    },\n  },\n};\n</script>\n"],"names":["_sfc_main","mapGetters","bibliography","isVancouver","isLoading","plugins","installDcatStateToCsl","installCslAddAccessed","deu","styleConfig","vm","dataset","citationParams","getRepresentativeLocaleOf","citation","Cite","e","err","_hoisted_1","_hoisted_6","_createElementBlock","_createElementVNode","_hoisted_2","_toDisplayString","$props","$options","_hoisted_3","_hoisted_5","_cache","args","_ctx","_hoisted_7"],"mappings":"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"}