{"version":3,"file":"onlyoffice-main.mjs","sources":["../src/views/DownloadPicker.vue","../img/new-docx.svg?raw","../img/new-pdf.svg?raw","../img/new-pptx.svg?raw","../img/new-xlsx.svg?raw","../src/services/FileService.ts","../src/main.js"],"sourcesContent":["<!--\n  Copyright (C) Ascensio System SIA, 2009-2026\n\n  This program is a free software product. You can redistribute it and/or\n  modify it under the terms of the GNU Affero General Public License (AGPL)\n  version 3 as published by the Free Software Foundation, together with the\n  additional terms provided in the LICENSE file.\n\n  This program is distributed WITHOUT ANY WARRANTY; without even the implied\n  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For\n  details, see the GNU AGPL at: https://www.gnu.org/licenses/agpl-3.0.html\n\n  You can contact Ascensio System SIA by email at info@onlyoffice.com\n  or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,\n  LV-1050, Latvia, European Union.\n\n  The interactive user interfaces in modified versions of the Program\n  are required to display Appropriate Legal Notices in accordance with\n  Section 5 of the GNU AGPL version 3.\n\n  No trademark rights are granted under this License.\n\n  All non-code elements of the Product, including illustrations,\n  icon sets, and technical writing content, are licensed under the\n  Creative Commons Attribution-ShareAlike 4.0 International License:\n  https://creativecommons.org/licenses/by-sa/4.0/legalcode\n\n  This license applies only to such non-code elements and does not\n  modify or replace the licensing terms applicable to the Program's\n  source code, which remains licensed under the GNU Affero General\n  Public License v3.\n\n  SPDX-License-Identifier: AGPL-3.0-only\n-->\n<template>\n\t<NcDialog\n\t\tclass=\"onlyoffice-download-picker\"\n\t\t:name=\"t('onlyoffice', 'Download as')\"\n\t\t:buttons=\"buttons\"\n\t\t@update:open=\"$emit('close', null)\">\n\t\t<div class=\"onlyoffice-download-container\">\n\t\t\t<p>{{ t('onlyoffice', 'Choose a format to convert {fileName}', { fileName }) }}</p>\n\t\t\t<select id=\"onlyoffice-download-select\" v-model=\"selectedFormat\">\n\t\t\t\t<option :value=\"extension\">\n\t\t\t\t\t{{ t('onlyoffice', 'Origin format') }}\n\t\t\t\t</option>\n\t\t\t\t<option v-for=\"ext in saveasFormats\" :key=\"ext\" :value=\"ext\">\n\t\t\t\t\t{{ ext }}\n\t\t\t\t</option>\n\t\t\t</select>\n\t\t</div>\n\t</NcDialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { computed, ref } from 'vue'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\n\ndeclare const appName: string\n\nconst props = defineProps<{\n\tfileName: string\n\tfileId: number | string\n\textension: string\n\tsaveasFormats: string[]\n}>()\n\nconst emit = defineEmits<{\n\tclose: [value: boolean | null]\n}>()\n\nconst selectedFormat = ref(props.extension)\n\nconst buttons = computed(() => [\n\t{\n\t\tlabel: t('core', 'Cancel'),\n\t\tvariant: 'secondary',\n\t\tsize: 'large',\n\t\tcallback: () => emit('close', null),\n\t},\n\t{\n\t\tlabel: t('onlyoffice', 'Download'),\n\t\tvariant: 'primary',\n\t\tsize: 'large',\n\t\tcallback: () => {\n\t\t\tlocation.href = generateUrl('apps/' + appName + '/downloadas?fileId={fileId}&toExtension={toExtension}', {\n\t\t\t\tfileId: props.fileId,\n\t\t\t\ttoExtension: selectedFormat.value,\n\t\t\t})\n\t\t\temit('close', true)\n\t\t},\n\t},\n])\n</script>\n\n<style scoped lang=\"scss\">\n.onlyoffice-download-picker :deep(.modal-container) {\n\twidth: auto !important;\n\tpadding: 24px !important;\n}\n\n.onlyoffice-download-picker :deep(.dialog__name) {\n\tmargin-top: 24px;\n\tfont-size: 1.8em;\n\ttext-align: left;\n}\n\n.onlyoffice-download-picker :deep(.dialog__content) {\n\tpadding-inline-end: 0;\n}\n\n.onlyoffice-download-picker :deep(.dialog__actions) {\n\tjustify-content: space-between;\n\tmargin-block: 0 !important;\n\tpadding-inline-end: 0;\n\tpadding: 0;\n\tpadding-top: 10px;\n}\n\n.onlyoffice-download-container {\n\tdisplay: flex;\n\talign-items: center;\n\tcolumn-gap: 10px;\n\n\tselect {\n\t\tcursor: pointer;\n\t}\n}\n</style>\n","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#1E7AAA\\\"/>\\n<rect x=\\\"5\\\" y=\\\"6\\\" width=\\\"9\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"9\\\" width=\\\"9\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"12\\\" width=\\\"9\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n</svg>\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#9E1919\\\"/>\\n<path d=\\\"M14 6H11V7H14V6Z\\\" fill=\\\"white\\\"/>\\n<path d=\\\"M14 9H11V10H14V9Z\\\" fill=\\\"white\\\"/>\\n<path d=\\\"M5 12H14V13H5V12Z\\\" fill=\\\"white\\\"/>\\n<path d=\\\"M5 10V6H9V10H5ZM6 7V9H8V7H6Z\\\" fill=\\\"white\\\"/>\\n</svg>\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#F36700\\\"/>\\n<rect x=\\\"4\\\" y=\\\"5\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"4\\\" y=\\\"13\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 5 5)\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"15\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 15 5)\\\" fill=\\\"white\\\"/>\\n</svg>\"","export default \"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"15\\\" height=\\\"15\\\" rx=\\\"2\\\" fill=\\\"#6AAA1E\\\"/>\\n<rect x=\\\"4\\\" y=\\\"5\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"4\\\" y=\\\"9\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"4\\\" y=\\\"13\\\" width=\\\"11\\\" height=\\\"1\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"5\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 5 5)\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"15\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 15 5)\\\" fill=\\\"white\\\"/>\\n<rect x=\\\"10\\\" y=\\\"5\\\" width=\\\"9\\\" height=\\\"1\\\" transform=\\\"rotate(90 10 5)\\\" fill=\\\"white\\\"/>\\n</svg>\"","/*\n * Copyright (C) Ascensio System SIA, 2009-2026\n *\n * This program is a free software product. You can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License (AGPL)\n * version 3 as published by the Free Software Foundation, together with the\n * additional terms provided in the LICENSE file.\n *\n * This program is distributed WITHOUT ANY WARRANTY; without even the implied\n * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For\n * details, see the GNU AGPL at: https://www.gnu.org/licenses/agpl-3.0.html\n *\n * You can contact Ascensio System SIA by email at info@onlyoffice.com\n * or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,\n * LV-1050, Latvia, European Union.\n *\n * The interactive user interfaces in modified versions of the Program\n * are required to display Appropriate Legal Notices in accordance with\n * Section 5 of the GNU AGPL version 3.\n *\n * No trademark rights are granted under this License.\n *\n * All non-code elements of the Product, including illustrations,\n * icon sets, and technical writing content, are licensed under the\n * Creative Commons Attribution-ShareAlike 4.0 International License:\n * https://creativecommons.org/licenses/by-sa/4.0/legalcode\n *\n * This license applies only to such non-code elements and does not\n * modify or replace the licensing terms applicable to the Program's\n * source code, which remains licensed under the GNU Affero General\n * Public License v3.\n *\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\nimport type { FileInfo } from '../types.ts'\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\n\nexport interface CreateFileData {\n\tname: string\n\tdir: string\n\ttemplateId?: number\n\ttargetId?: number\n\tshareToken?: string\n}\n\nexport interface ConvertFileData {\n\tfileId: number\n\tshareToken?: string\n}\n\n/**\n *\n * @param data\n */\nexport async function createFile(data: CreateFileData): Promise<FileInfo> {\n\tconst response = await axios.post<FileInfo>(\n\t\tgenerateUrl('apps/onlyoffice/ajax/new'),\n\t\tdata,\n\t)\n\treturn response.data\n}\n\n/**\n *\n * @param data\n */\nexport async function convertFile(data: ConvertFileData): Promise<FileInfo> {\n\tconst response = await axios.post<FileInfo>(\n\t\tgenerateUrl('apps/onlyoffice/ajax/convert'),\n\t\tdata,\n\t)\n\treturn response.data\n}\n","/*\n * Copyright (C) Ascensio System SIA, 2009-2026\n *\n * This program is a free software product. You can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License (AGPL)\n * version 3 as published by the Free Software Foundation, together with the\n * additional terms provided in the LICENSE file.\n *\n * This program is distributed WITHOUT ANY WARRANTY; without even the implied\n * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For\n * details, see the GNU AGPL at: https://www.gnu.org/licenses/agpl-3.0.html\n *\n * You can contact Ascensio System SIA by email at info@onlyoffice.com\n * or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga,\n * LV-1050, Latvia, European Union.\n *\n * The interactive user interfaces in modified versions of the Program\n * are required to display Appropriate Legal Notices in accordance with\n * Section 5 of the GNU AGPL version 3.\n *\n * No trademark rights are granted under this License.\n *\n * All non-code elements of the Product, including illustrations,\n * icon sets, and technical writing content, are licensed under the\n * Creative Commons Attribution-ShareAlike 4.0 International License:\n * https://creativecommons.org/licenses/by-sa/4.0/legalcode\n *\n * This license applies only to such non-code elements and does not\n * modify or replace the licensing terms applicable to the Program's\n * source code, which remains licensed under the GNU Affero General\n * Public License v3.\n *\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\nimport { getCurrentUser, getRequestToken } from '@nextcloud/auth'\nimport { getFilePickerBuilder, showError, showSuccess } from '@nextcloud/dialogs'\nimport { emit } from '@nextcloud/event-bus'\nimport {\n\taddNewFileMenuEntry,\n\tDefaultType,\n\tFile,\n\tgetNewFileMenuEntries,\n\tgetSidebar,\n\tPermission,\n\tregisterFileAction,\n} from '@nextcloud/files'\nimport {\n\tgetClient,\n\tgetDefaultPropfind,\n\tgetRootPath,\n\tresultToNode,\n} from '@nextcloud/files/dav'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateFilePath, generateUrl } from '@nextcloud/router'\nimport { getSharingToken, isPublicShare } from '@nextcloud/sharing/public'\nimport { spawnDialog } from '@nextcloud/vue/functions/dialog'\nimport DownloadPicker from './views/DownloadPicker.vue'\nimport AppDarkSvg from '../img/app-dark.svg?raw'\nimport NewDocxSvg from '../img/new-docx.svg?raw'\nimport NewPdfSvg from '../img/new-pdf.svg?raw'\nimport NewPptxSvg from '../img/new-pptx.svg?raw'\nimport NewXlsxSvg from '../img/new-xlsx.svg?raw'\nimport { convertFile, createFile } from './services/FileService.ts'\nimport { getFileExtension } from './utils/files.ts'\n\nimport '@nextcloud/dialogs/style.css'\n\nOCA.Onlyoffice = { AppName: 'onlyoffice', context: null, frameSelector: null, ...OCA.Onlyoffice }\n\nOCA.Onlyoffice.setting = loadState(OCA.Onlyoffice.AppName, 'settings')\nOCA.Onlyoffice.mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini|Macintosh/i.test(navigator.userAgent)\n\t&& navigator.maxTouchPoints && navigator.maxTouchPoints > 1\n\n/**\n * @param {string} name file name\n * @param {object} context files context with dir and view\n * @param {number} templateId template file id\n * @param {number} targetId target file id to convert from\n * @param {boolean} open whether to open the editor after creation\n * @param {object|null} filesContext files app context for node creation\n */\nfunction createFileOverload(name, context, templateId, targetId, open = true, filesContext = null) {\n\tif (!context.view) {\n\t\tcontext.view = OCP.Files.Router._router.app.currentView\n\t}\n\n\tcreateFileProcess(name, context.dir, templateId, targetId, open, async (response) => {\n\t\tif (!context.view && filesContext !== null) {\n\t\t\tconst file = new File({\n\t\t\t\tsource: filesContext.source + '/' + response.name,\n\t\t\t\tid: response.id,\n\t\t\t\tmtime: new Date(),\n\t\t\t\tmime: response.mimetype,\n\t\t\t\tname: response.name,\n\t\t\t\towner: getCurrentUser()?.uid || null,\n\t\t\t\tpermissions: Permission.ALL,\n\t\t\t\ttype: 'file',\n\t\t\t\troot: filesContext?.root || '/files/' + getCurrentUser().uid,\n\t\t\t})\n\t\t\temit('files:node:created', file)\n\t\t} else {\n\t\t\tconst viewContents = await context.view.getContents(context.dir)\n\t\t\tif (viewContents.folder && (viewContents.folder.fileid === response.parentId)) {\n\t\t\t\tconst newFile = viewContents.contents.find((node) => node.fileid === response.id)\n\t\t\t\tif (newFile) {\n\t\t\t\t\temit('files:node:created', newFile)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n\n/**\n * @param {string} name file name\n * @param {string} dir directory path\n * @param {number} templateId template file id\n * @param {number} targetId target file id to convert from\n * @param {boolean} open whether to open the editor after creation\n * @param {Function} callback called with the created file response\n */\nfunction createFileProcess(name, dir, templateId, targetId, open, callback) {\n\tlet winEditor = null\n\tif (((!OCA.Onlyoffice.setting.sameTab && !OCA.Onlyoffice.setting.enableSharing) || OCA.Onlyoffice.mobile || OCA.Onlyoffice.Desktop) && open) {\n\t\tconst loaderUrl = OCA.Onlyoffice.Desktop ? '' : generateFilePath(OCA.Onlyoffice.AppName, 'templates', 'loader.html')\n\t\twinEditor = window.open(loaderUrl)\n\t}\n\n\tconst createData = {\n\t\tname,\n\t\tdir,\n\t}\n\n\tif (templateId) {\n\t\tcreateData.templateId = templateId\n\t}\n\n\tif (targetId) {\n\t\tcreateData.targetId = targetId\n\t}\n\n\tif (isPublicShare()) {\n\t\tcreateData.shareToken = encodeURIComponent(getSharingToken())\n\t}\n\n\tcreateFile(createData).then((response) => {\n\t\tif (response.error) {\n\t\t\tif (winEditor) {\n\t\t\t\twinEditor.close()\n\t\t\t}\n\t\t\tshowError(response.error)\n\t\t\treturn\n\t\t}\n\n\t\tcallback(response)\n\n\t\tif (open) {\n\t\t\tconst fileName = response.name\n\t\t\topenEditor(response.id, dir, fileName, winEditor)\n\n\t\t\tOCA.Onlyoffice.context = {\n\t\t\t\tfileName: response.name,\n\t\t\t\tdir,\n\t\t\t}\n\t\t}\n\n\t\tshowSuccess(t(OCA.Onlyoffice.AppName, 'File created'))\n\t})\n}\n\n/**\n * @param {number} fileId file id\n * @param {string} fileDir directory path\n * @param {string} fileName file name\n * @param {Window|null} winEditor pre-opened editor window\n * @param {boolean} isDefault whether this is the default open action\n */\nfunction openEditor(fileId, fileDir, fileName, winEditor, isDefault = true) {\n\tlet filePath = ''\n\tif (fileName) {\n\t\tfilePath = fileDir.replace(/\\/$/, '') + '/' + fileName\n\t}\n\tlet url = generateUrl('/apps/' + OCA.Onlyoffice.AppName + '/{fileId}?filePath={filePath}', {\n\t\tfileId,\n\t\tfilePath,\n\t})\n\n\tif (isPublicShare()) {\n\t\turl = generateUrl('apps/' + OCA.Onlyoffice.AppName + '/s/{shareToken}?fileId={fileId}', {\n\t\t\tshareToken: encodeURIComponent(getSharingToken()),\n\t\t\tfileId,\n\t\t})\n\t}\n\n\tif (winEditor && winEditor.location) {\n\t\tsetDefaultUrl()\n\t\twinEditor.location.href = url\n\t} else if ((!OCA.Onlyoffice.setting.sameTab && !OCA.Onlyoffice.setting.enableSharing)\n\t\t|| OCA.Onlyoffice.mobile || OCA.Onlyoffice.Desktop || (isPublicShare() && !isPublicFileShare()\n\t\t\t&& !OCA.Onlyoffice.setting.sameTab && OCA.Onlyoffice.setting.enableSharing)\n\t\t|| (!OCA.Onlyoffice.setting.sameTab && !isDefault)) {\n\t\tsetDefaultUrl()\n\t\twindow.open(url, '_blank')\n\t} else {\n\t\tif (OCA.Onlyoffice.setting.enableSharing\n\t\t\t&& !isPublicShare()\n\t\t\t&& (window.OCP?.Files?.Router?.query?.openfile === undefined || window.OCP?.Files?.Router?.query?.openfile === 'false'\n\t\t\t\t|| window.OCP?.Files?.Router?.query?.enableSharing === undefined\n\t\t\t)) {\n\t\t\twindow.OCP?.Files?.Router?.goToRoute(\n\t\t\t\tnull, // use default route\n\t\t\t\t{ view: 'files', fileid: fileId },\n\t\t\t\t{ ...OCP.Files.Router.query, openfile: 'true', enableSharing: 'true' },\n\t\t\t)\n\t\t\turl = window.location.href\n\t\t\tsetDefaultUrl()\n\t\t\twindow.open(url, '_blank')\n\t\t\treturn\n\t\t}\n\t\tOCA.Onlyoffice.frameSelector = '#onlyofficeFrame'\n\t\tconst iframeEl = document.createElement('iframe')\n\t\tiframeEl.id = 'onlyofficeFrame'\n\t\tiframeEl.setAttribute('nonce', btoa(getRequestToken()))\n\t\tiframeEl.setAttribute('scrolling', 'no')\n\t\tiframeEl.setAttribute('allowfullscreen', '')\n\t\tiframeEl.src = url + '&inframe=true'\n\t\tconst iframeContainer = document.createElement('div')\n\t\tiframeContainer.className = 'onlyoffice-iframe-container'\n\t\tiframeContainer.append(iframeEl)\n\n\t\tconst frameContainer = document.getElementById('app-content') ?? document.getElementById('app-content-vue')\n\t\tframeContainer.append(iframeContainer)\n\n\t\tdocument.body.classList.add('onlyoffice-inline')\n\n\t\tconst sidebar = getSidebar()\n\t\tif (sidebar) {\n\t\t\tsidebar.close()\n\t\t}\n\n\t\tconst scrollTop = document.getElementById('app-content')?.scrollTop ?? 0\n\t\tdocument.querySelector(OCA.Onlyoffice.frameSelector).style.top = scrollTop + 'px'\n\n\t\tconst currentQuery = { ...OCP.Files.Router.query }\n\t\tif (isDefault) {\n\t\t\tcurrentQuery.openfile = 'true'\n\t\t} else {\n\t\t\tdelete currentQuery.openfile\n\t\t}\n\n\t\twindow.OCP?.Files?.Router?.goToRoute(\n\t\t\tnull, // use default route\n\t\t\t{ view: 'files', fileid: fileId },\n\t\t\tcurrentQuery,\n\t\t)\n\t}\n}\n\n/**\n * Close the inline editor and restore the Files app view\n */\nfunction closeEditor() {\n\tdocument.body.classList.remove('onlyoffice-inline')\n\n\tconst iframeContainer = document.querySelector('.onlyoffice-iframe-container')\n\tif (iframeContainer !== null) {\n\t\tiframeContainer.remove()\n\t}\n\n\tOCA.Onlyoffice.context = null\n\n\tsetDefaultUrl()\n}\n\n/**\n * Reset the Files router URL, removing openfile and enableSharing query params\n */\nfunction setDefaultUrl() {\n\tconst { openfile, enableSharing, ...query } = OCP.Files.Router.query\n\twindow.OCP?.Files?.Router?.goToRoute(\n\t\tnull, // use default route\n\t\t{ view: 'files', fileid: undefined },\n\t\tquery,\n\t)\n}\n\n/**\n * Open or close the sharing sidebar for the currently open file\n */\nfunction openShareDialog() {\n\tif (OCA.Onlyoffice.context) {\n\t\tconst sidebar = getSidebar()\n\t\tif (!sidebar.isOpen) {\n\t\t\tconst client = getClient()\n\t\t\tclient.stat(`${getRootPath()}${OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName}`, {\n\t\t\t\tdetails: true,\n\t\t\t\tdata: getDefaultPropfind(),\n\t\t\t}).then((result) => {\n\t\t\t\tconst node = resultToNode(result.data)\n\t\t\t\temit('files:node:updated', node)\n\t\t\t\tsidebar.open(node)\n\t\t\t\tsidebar.setActiveTab('sharing')\n\t\t\t})\n\t\t} else {\n\t\t\tsidebar.close()\n\t\t}\n\t}\n}\n\n/**\n * Refresh the versions sidebar tab for the currently open file\n */\nfunction refreshVersionsDialog() {\n\tif (OCA.Onlyoffice.context) {\n\t\tconst sidebar = getSidebar()\n\t\tif (sidebar.isOpen) {\n\t\t\tsidebar.close()\n\t\t\tconst client = getClient()\n\t\t\tclient.stat(`${getRootPath()}${OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName}`, {\n\t\t\t\tdetails: true,\n\t\t\t\tdata: getDefaultPropfind(),\n\t\t\t}).then((result) => {\n\t\t\t\tconst node = resultToNode(result.data)\n\t\t\t\temit('files:node:updated', node)\n\t\t\t\tsidebar.open(node)\n\t\t\t\tsidebar.setActiveTab('versionsTabView')\n\t\t\t})\n\t\t}\n\t}\n}\n\n/**\n * @param {object} params\n * @param {object[]} params.nodes Nextcloud file nodes\n * @param {object} params.view current files view\n * @param {string} params.dir current directory path\n * @param {boolean} params.isDefault whether triggered as the default action\n * @return {null} null\n */\nasync function fileOpenHandler({ nodes, view, dir, isDefault = true }) {\n\tconst file = nodes[0]\n\tif (OCA.Onlyoffice.context !== null\n\t\t&& document.querySelector('.onlyoffice-iframe-container')\n\t\t&& !OCA.Onlyoffice.Desktop) {\n\t\treturn null\n\t}\n\n\topenEditor(file.fileid, file.dirname, file.basename, 0, isDefault)\n\n\tOCA.Onlyoffice.context = {\n\t\tfileName: file.basename,\n\t\tdir: file.dirname,\n\t}\n\n\treturn null\n}\n\n/**\n * @param {object} params\n * @param {object[]} params.nodes Nextcloud file nodes\n * @param {object} params.view current files view\n * @param {string} params.dir current directory path\n * @return {null} null\n */\nasync function fileConvertHandler({ nodes, view, dir }) {\n\tconst file = nodes[0]\n\tfileConvert(file.fileid, async (response) => {\n\t\tconst viewContents = await view.getContents(dir)\n\n\t\tif (viewContents.folder && (viewContents.folder.fileid === response.parentId)) {\n\t\t\tconst newFile = viewContents.contents.find((node) => node.fileid === response.id)\n\t\t\tif (newFile) {\n\t\t\t\temit('files:node:created', newFile)\n\t\t\t}\n\t\t}\n\t})\n\n\treturn null\n}\n\n/**\n * @param {number} fileId file id to convert\n * @param {Function} callback called with the converted file response\n */\nfunction fileConvert(fileId, callback) {\n\tconst convertData = {\n\t\tfileId,\n\t}\n\n\tif (isPublicShare()) {\n\t\tconvertData.shareToken = encodeURIComponent(getSharingToken())\n\t}\n\n\tconvertFile(convertData).then((response) => {\n\t\tif (response.error) {\n\t\t\tshowError(response.error)\n\t\t\treturn\n\t\t}\n\n\t\tcallback(response)\n\n\t\tshowSuccess(t(OCA.Onlyoffice.AppName, 'File has been converted. Its content might look different.'))\n\t})\n}\n\n/**\n * @param {object} file Nextcloud file node\n * @param file.nodes\n * @return {null} null\n */\nasync function fileDownloadAsHandler({ nodes }) {\n\tconst file = nodes[0]\n\tconst fileName = file.basename\n\tconst fileId = file.fileid\n\tconst extension = getFileExtension(fileName)\n\tconst saveasFormats = OCA.Onlyoffice.setting.formats[extension].saveas\n\n\tspawnDialog(DownloadPicker, {\n\t\tfileName,\n\t\tfileId,\n\t\textension,\n\t\tsaveasFormats,\n\t})\n\n\treturn null\n}\n\n/**\n * @param {string} name new file name\n * @param {object} filelist files list context with dir\n * @param {object|null} filesContext files app context for node creation\n */\nfunction openFormPicker(name, filelist, filesContext = null) {\n\tconst filterMimes = [\n\t\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t]\n\n\tconst startDir = filelist.getCurrentDirectory ? filelist.getCurrentDirectory() : filelist.dir\n\n\tgetFilePickerBuilder(t(OCA.Onlyoffice.AppName, 'Create new PDF form'))\n\t\t.setMimeTypeFilter(filterMimes)\n\t\t.startAt(startDir)\n\t\t.addButton({\n\t\t\tlabel: t(OCA.Onlyoffice.AppName, 'Blank'),\n\t\t\tvariant: 'secondary',\n\t\t\tcallback: () => createFileOverload(name, filelist, 0, 0, true, filesContext),\n\t\t})\n\t\t.addButton({\n\t\t\tlabel: t(OCA.Onlyoffice.AppName, 'From text document'),\n\t\t\tcallback: (nodes) => {\n\t\t\t\tif (!nodes[0]) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst targetId = nodes[0].id ?? 0\n\t\t\t\tcreateFileOverload(name, filelist, 0, targetId, true, filesContext)\n\t\t\t},\n\t\t\tvariant: 'primary',\n\t\t})\n\t\t.build()\n\t\t.pickNodes()\n}\n\n/**\n * @param {object} params\n * @param {object[]} params.nodes Nextcloud file nodes\n * @param {object} params.view current files view\n * @param {string} params.dir current directory path\n * @return {null} null\n */\nasync function fileCreateFormHandler({ nodes, view, dir }) {\n\tconst file = nodes[0]\n\tconst name = file.basename.replace(/\\.[^.]+$/, '.pdf')\n\tconst context = {\n\t\tdir: file.dirname,\n\t\tview,\n\t}\n\n\tcreateFileOverload(name, context, 0, file.fileid, false)\n\n\treturn null\n}\n\n/**\n * Register all ONLYOFFICE file actions with the Nextcloud Files app\n */\nfunction registerFileActions() {\n\tconst formats = OCA.Onlyoffice.setting.formats\n\n\tconst getConfig = function(file) {\n\t\tconst fileExt = getFileExtension(file?.extension || file?.displayname)\n\t\tconst config = formats[fileExt]\n\n\t\treturn config\n\t}\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-open-def',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Open in ONLYOFFICE'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tif (OCA.Onlyoffice.setting.restrictExternalStorage\n\t\t\t\t&& (nodes[0].attributes['mount-type'] === 'external' || nodes[0].attributes['mount-type'] === 'external-root')) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst fileExt = getFileExtension(nodes[0]?.extension || nodes[0]?.displayname)\n\t\t\tconst config = formats[fileExt]\n\n\t\t\tif (!config\n\t\t\t\t|| !config.def) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (Permission.READ !== (nodes[0].permissions & Permission.READ)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec: fileOpenHandler,\n\t\tdefault: DefaultType.HIDDEN,\n\t\torder: -2,\n\t})\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-open',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Open in ONLYOFFICE'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tif (OCA.Onlyoffice.setting.restrictExternalStorage\n\t\t\t\t&& (nodes[0].attributes['mount-type'] === 'external' || nodes[0].attributes['mount-type'] === 'external-root')) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\tif (!config) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (config.def) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (Permission.READ !== (nodes[0].permissions & Permission.READ)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec({ nodes, view, dir }) {\n\t\t\tfileOpenHandler({ nodes, view, dir, isDefault: false })\n\t\t},\n\t})\n\n\t// Skip the rest if the page is public file share\n\tif (isPublicFileShare()) {\n\t\treturn\n\t}\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-convert',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Convert with ONLYOFFICE'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\tif (!config) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!config.conv) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst required = isPublicShare() ? Permission.UPDATE : Permission.READ\n\t\t\tif (required !== (nodes[0].permissions & required)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (nodes[0].attributes['mount-type'] === 'shared') {\n\t\t\t\tif (required !== (nodes[0].attributes['share-permissions'] & required)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst attributes = JSON.parse(nodes[0].attributes['share-attributes'])\n\t\t\t\tconst downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')\n\t\t\t\tif (downloadAttribute !== undefined && downloadAttribute.value === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec: fileConvertHandler,\n\t})\n\n\tregisterFileAction({\n\t\tid: 'onlyoffice-create-form',\n\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Create form'),\n\t\ticonSvgInline: () => AppDarkSvg,\n\t\tenabled: ({ nodes }) => {\n\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\tif (!config) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!config.createForm) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst required = isPublicShare() ? Permission.UPDATE : Permission.READ\n\t\t\tif (required !== (nodes[0].permissions & required)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (nodes[0].attributes['mount-type'] === 'shared') {\n\t\t\t\tif (required !== (nodes[0].attributes['share-permissions'] & required)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst attributes = JSON.parse(nodes[0].attributes['share-attributes'])\n\t\t\t\tconst downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')\n\t\t\t\tif (downloadAttribute !== undefined && downloadAttribute.value === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t\texec: fileCreateFormHandler,\n\t})\n\n\tif (!isPublicShare()) {\n\t\tregisterFileAction({\n\t\t\tid: 'onlyoffice-download-as',\n\t\t\tdisplayName: () => t(OCA.Onlyoffice.AppName, 'Download as'),\n\t\t\ticonSvgInline: () => AppDarkSvg,\n\t\t\tenabled: ({ nodes }) => {\n\t\t\t\tif (OCA.Onlyoffice.setting.disableDownload) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tconst config = getConfig(nodes[0])\n\n\t\t\t\tif (!config) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (!config.saveas) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tif (Permission.READ !== (nodes[0].permissions & Permission.READ)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tif (nodes[0].attributes['mount-type'] === 'shared') {\n\t\t\t\t\tconst attributes = JSON.parse(nodes[0].attributes['share-attributes'])\n\t\t\t\t\tconst downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')\n\t\t\t\t\tif (downloadAttribute !== undefined && downloadAttribute.value === false) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true\n\t\t\t},\n\t\t\texec: fileDownloadAsHandler,\n\t\t})\n\t}\n}\n\n/**\n * Register ONLYOFFICE entries in the new file menu\n */\nfunction registerNewFileMenu() {\n\tconst alreadyRegistered = getNewFileMenuEntries().some((menu) => menu.id.includes('onlyoffice'))\n\n\tif (isPublicShare() && !alreadyRegistered) {\n\t\t// Document\n\t\taddNewFileMenuEntry({\n\t\t\tid: 'new-onlyoffice-docx',\n\t\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New document'),\n\t\t\tenabled: (folder) => {\n\t\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t\t},\n\t\t\ticonSvgInline: NewDocxSvg,\n\t\t\torder: 21,\n\t\t\thandler: (context) => {\n\t\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New document')\n\t\t\t\tconst dirContext = { dir: context.path }\n\t\t\t\tcreateFileOverload(name + '.docx', dirContext, null, null, true, context)\n\t\t\t},\n\t\t})\n\n\t\t// Spreadsheet\n\t\taddNewFileMenuEntry({\n\t\t\tid: 'new-onlyoffice-xlsx',\n\t\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New spreadsheet'),\n\t\t\tenabled: (folder) => {\n\t\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t\t},\n\t\t\ticonSvgInline: NewXlsxSvg,\n\t\t\torder: 22,\n\t\t\thandler: (context) => {\n\t\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New spreadsheet')\n\t\t\t\tconst dirContext = { dir: context.path }\n\t\t\t\tcreateFileOverload(name + '.xlsx', dirContext, null, null, true, context)\n\t\t\t},\n\t\t})\n\n\t\t// Presentation\n\t\taddNewFileMenuEntry({\n\t\t\tid: 'new-onlyoffice-pptx',\n\t\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New presentation'),\n\t\t\tenabled: (folder) => {\n\t\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t\t},\n\t\t\ticonSvgInline: NewPptxSvg,\n\t\t\torder: 23,\n\t\t\thandler: (context) => {\n\t\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New presentation')\n\t\t\t\tconst dirContext = { dir: context.path }\n\t\t\t\tcreateFileOverload(name + '.pptx', dirContext, null, null, true, context)\n\t\t\t},\n\t\t})\n\t}\n\n\t// PDF Form\n\taddNewFileMenuEntry({\n\t\tid: 'new-onlyoffice-pdf',\n\t\tdisplayName: t(OCA.Onlyoffice.AppName, 'New PDF form'),\n\t\tenabled: (folder) => {\n\t\t\treturn (folder.permissions & Permission.CREATE) !== 0\n\t\t},\n\t\ticonSvgInline: NewPdfSvg,\n\t\torder: 24,\n\t\thandler: (context) => {\n\t\t\tconst name = t(OCA.Onlyoffice.AppName, 'New PDF form')\n\t\t\tconst dirContext = { dir: context.path }\n\t\t\topenFormPicker(name + '.pdf', dirContext, context)\n\t\t},\n\t})\n}\n\n/**\n * @return {boolean} true if the current page is a public file share\n */\nfunction isPublicFileShare() {\n\treturn loadState('files_sharing', 'view', null) === 'public-file-share'\n}\n\n// Expose cross-bundle API surface consumed by listener.js and share.js\nObject.assign(OCA.Onlyoffice, {\n\tCloseEditor: closeEditor,\n\tOpenShareDialog: openShareDialog,\n\tRefreshVersionsDialog: refreshVersionsDialog,\n})\n\nif (!OCA.Onlyoffice._initialized) {\n\tOCA.Onlyoffice._initialized = true\n\tif (!isPublicFileShare()) {\n\t\tregisterNewFileMenu()\n\t}\n\tregisterFileActions()\n}\n"],"names":["props","__props","emit","__emit","selectedFormat","ref","buttons","computed","t","generateUrl","appName","_createBlock","_unref","NcDialog","$emit","_createElementVNode","_hoisted_1","_toDisplayString","$event","_hoisted_2","_createElementBlock","_Fragment","_renderList","ext","_hoisted_3","NewDocxSvg","NewPdfSvg","NewPptxSvg","NewXlsxSvg","createFile","data","axios","convertFile","loadState","createFileOverload","name","context","templateId","targetId","open","filesContext","createFileProcess","response","file","File","getCurrentUser","Permission","viewContents","newFile","node","dir","callback","winEditor","loaderUrl","generateFilePath","createData","isPublicShare","getSharingToken","showError","fileName","openEditor","showSuccess","fileId","fileDir","isDefault","filePath","url","setDefaultUrl","isPublicFileShare","iframeEl","getRequestToken","iframeContainer","sidebar","getSidebar","scrollTop","currentQuery","closeEditor","openfile","enableSharing","query","openShareDialog","getClient","getRootPath","getDefaultPropfind","result","resultToNode","refreshVersionsDialog","fileOpenHandler","nodes","view","fileConvertHandler","fileConvert","convertData","fileDownloadAsHandler","extension","getFileExtension","saveasFormats","spawnDialog","DownloadPicker","openFormPicker","filelist","filterMimes","startDir","getFilePickerBuilder","fileCreateFormHandler","registerFileActions","formats","getConfig","fileExt","registerFileAction","AppDarkSvg","config","DefaultType","required","downloadAttribute","attribute","registerNewFileMenu","alreadyRegistered","getNewFileMenuEntries","menu","addNewFileMenuEntry","folder","dirContext"],"mappings":"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"}