{"version":3,"file":"ViewerView-BAvG-HpN.chunk.mjs","sources":["../src/components/SourceView.vue","../src/components/ViewerComponent.vue","../src/views/ViewerView.js"],"sourcesContent":["<!--\n  - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\tid=\"editor-container\"\n\t\tdata-text-el=\"editor-container\"\n\t\tclass=\"text-editor source-viewer\">\n\t\t<Component\n\t\t\t:is=\"readerComponent\"\n\t\t\t:content=\"content\"\n\t\t\t:file-id=\"fileid\"\n\t\t\t:read-only=\"true\"\n\t\t\t:show-menu-bar=\"false\" />\n\t\t<NcButton\n\t\t\tv-if=\"isEmbedded\"\n\t\t\tclass=\"toggle-interactive\"\n\t\t\t@click=\"$emit('edit')\">\n\t\t\t{{ t('text', 'Edit') }}\n\t\t\t<template #icon>\n\t\t\t\t<PencilOutlineIcon />\n\t\t\t</template>\n\t\t</NcButton>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { getClient, getRootPath } from '@nextcloud/files/dav'\nimport { t } from '@nextcloud/l10n'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport Vue from 'vue'\nimport PencilOutlineIcon from 'vue-material-design-icons/PencilOutline.vue'\nimport MarkdownContentEditor from './Editor/MarkdownContentEditor.vue'\nimport PlainTextReader from './PlainTextReader.vue'\n\nexport default {\n\tname: 'SourceView',\n\tcomponents: {\n\t\tNcButton: Vue.extend(NcButton),\n\t\tPencilOutlineIcon: Vue.extend(PencilOutlineIcon),\n\t\tPlainTextReader: Vue.extend(PlainTextReader),\n\t\tMarkdownContentEditor: Vue.extend(MarkdownContentEditor),\n\t},\n\tinject: ['isEmbedded'],\n\tprops: {\n\t\tfilename: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tfileid: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t\tmime: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\t\tisEncrypted: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcontent: '',\n\t\t}\n\t},\n\tcomputed: {\n\t\tisMarkdown() {\n\t\t\treturn (\n\t\t\t\tthis.mime === 'text/markdown' || this.mime === 'text/x-web-markdown'\n\t\t\t)\n\t\t},\n\n\t\treaderComponent() {\n\t\t\treturn this.isMarkdown ? MarkdownContentEditor : PlainTextReader\n\t\t},\n\t},\n\n\twatch: {\n\t\tsource() {\n\t\t\tthis.loadFileContent()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.loadFileContent()\n\t},\n\n\tmethods: {\n\t\tasync loadFileContent() {\n\t\t\tif (this.isEncrypted) {\n\t\t\t\tthis.content = await this.fetchDecryptedContent()\n\t\t\t\tthis.contentLoaded = true\n\t\t\t} else {\n\t\t\t\tconst response = await axios.get(this.source)\n\t\t\t\tthis.content = response.data\n\t\t\t\tthis.contentLoaded = true\n\t\t\t}\n\t\t\tthis.$emit('loaded', true)\n\t\t},\n\t\tasync fetchDecryptedContent() {\n\t\t\tconst client = getClient()\n\t\t\tconst response = await client.getFileContents(\n\t\t\t\t`${getRootPath()}${this.filename}`,\n\t\t\t\t{ details: true },\n\t\t\t)\n\t\t\tconst blob = new Blob([response.data], {\n\t\t\t\ttype: response.headers['content-type'],\n\t\t\t})\n\t\t\tconst reader = new FileReader()\n\t\t\treader.readAsText(blob)\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\treader.onload = () => {\n\t\t\t\t\tresolve(reader.result)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tt,\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n.source-viewer {\n\tdisplay: block;\n\n\t.editor__content-wrapper {\n\t\tmargin-top: var(--header-height);\n\t}\n\n\t.toggle-interactive {\n\t\tposition: sticky;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\tz-index: 1;\n\t\tmargin-left: auto;\n\t\tmargin-right: 0;\n\t}\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<Editor\n\t\tv-if=\"!useSourceView\"\n\t\t:file-id=\"fileid\"\n\t\t:relative-path=\"filename\"\n\t\t:active=\"active || isEmbedded\"\n\t\t:autofocus=\"autofocus\"\n\t\t:share-token=\"shareToken\"\n\t\t:class=\"{ 'text-editor--embedding': isEmbedded }\"\n\t\t:mime=\"mime\" />\n\t<SourceView\n\t\tv-else\n\t\t:fileid=\"fileid\"\n\t\t:filename=\"filename\"\n\t\t:is-encrypted=\"isEncrypted\"\n\t\t:mime=\"mime\"\n\t\t:source=\"source\"\n\t\tv-bind=\"$attrs\"\n\t\t@loaded=\"onLoaded\"\n\t\t@edit=\"toggleEdit\" />\n</template>\n\n<script>\nimport { getSharingToken } from '@nextcloud/sharing/public'\nimport { defineComponent } from 'vue'\nimport Editor from './Editor.vue'\nimport SourceView from './SourceView.vue'\n\nexport default defineComponent({\n\tname: 'ViewerComponent',\n\tcomponents: {\n\t\tSourceView,\n\t\tEditor,\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tisEmbedded: this.isEmbedded,\n\t\t}\n\t},\n\tinheritAttrs: false,\n\tprops: {\n\t\tfilename: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tfileid: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tautofocus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tshareToken: {\n\t\t\ttype: String,\n\t\t\tdefault: () => getSharingToken(),\n\t\t},\n\t\tmime: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\t\tisEmbedded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\thasToggledInteractiveEmbedding: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\t/** @return {boolean} */\n\t\tuseSourceView() {\n\t\t\treturn (\n\t\t\t\tthis.source\n\t\t\t\t&& (this.fileVersion\n\t\t\t\t\t|| !this.fileid\n\t\t\t\t\t|| this.isEmbedded\n\t\t\t\t\t|| this.isEncrypted)\n\t\t\t\t&& !this.hasToggledInteractiveEmbedding\n\t\t\t)\n\t\t},\n\n\t\tisEncrypted() {\n\t\t\treturn this.$attrs.e2EeIsEncrypted || false\n\t\t},\n\t},\n\n\tmounted() {\n\t\tif (!this.useSourceView) {\n\t\t\tthis.onLoaded()\n\t\t}\n\t},\n\n\tmethods: {\n\t\tasync onLoaded() {\n\t\t\tthis.$emit('update:loaded', true)\n\t\t},\n\t\ttoggleEdit() {\n\t\t\tthis.hasToggledInteractiveEmbedding = true\n\t\t},\n\t\tt,\n\t},\n})\n</script>\n<style lang=\"scss\" scoped>\n.text-editor:not(.viewer__file--hidden) {\n\ttop: 0;\n\twidth: 100%;\n\tmax-width: 100%;\n\theight: 100%;\n\tleft: 0;\n\tmargin: 0 auto;\n\tposition: relative;\n\tbackground-color: var(--color-main-background);\n\n\t&.text-editor--embedding {\n\t\tmin-height: 400px;\n\t}\n}\n</style>\n<style lang=\"scss\">\n@media only screen and (max-width: 512px) {\n\t// on mobile, modal-container has top: 50px\n\t.text-editor {\n\t\ttop: auto;\n\t}\n}\n\nbody .toastify.dialogs {\n\t// Move the dialogs below the toolbar / status\n\tmargin-top: calc(45px + var(--default-clickable-area));\n}\n\n.viewer[data-handler='text'] .modal-wrapper .modal-container {\n\tbottom: 0;\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport Vue, { defineComponent } from 'vue'\nimport ViewerComponent from '../components/ViewerComponent.vue'\n\n// The vue instance used inside text constructed with the import above.\nlet innerVue\n\n/**\n * This thin Component wrapper can be rendered inside the viewer.\n *\n * The viewers vue instance is used for this component as it simply exports\n * the options for the options api.\n *\n * When mounted this component constructs the vue instance\n * used inside text based on texts vue import.\n */\nexport default defineComponent({\n\tname: 'ViewerView',\n\trender: (h) => h('div'),\n\tprops: ViewerComponent.props,\n\tmounted() {\n\t\tinnerVue = new Vue({\n\t\t\trender: (h) => {\n\t\t\t\treturn h(ViewerComponent, {\n\t\t\t\t\tattrs: this.$attrs,\n\t\t\t\t\tprops: this.$props,\n\t\t\t\t\ton: this.$listeners,\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\tinnerVue.$mount(this.$el)\n\t},\n\tbeforeDestroy() {\n\t\tinnerVue.$destroy()\n\t},\n})\n"],"names":["_sfc_main","Vue","NcButton","PencilOutlineIcon","PlainTextReader","MarkdownContentEditor","response","axios","getClient","getRootPath","blob","reader","resolve","t","defineComponent","SourceView","Editor","getSharingToken","innerVue","ViewerView","h","ViewerComponent"],"mappings":"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"}