{"version":3,"file":"InvalidFilenameDialog-CUCOa7uH.cjs","sources":["../../lib/components/InvalidFilenameDialog.vue"],"sourcesContent":["<!--\n  - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<NcDialog :buttons=\"dialogButtons\"\n\t\t:name=\"t('Invalid filename')\"\n\t\t@close=\"$emit('close', { cancel: true })\">\n\t\t<NcNoteCard severity=\"error\">\n\t\t\t{{ getErrorText(error) }}\n\t\t\t{{ t('You can either rename the file, skip this file or cancel the whole operation.') }}\n\t\t</NcNoteCard>\n\t\t<NcTextField v-if=\"canRename\"\n\t\t\tref=\"textfield\"\n\t\t\tclass=\"invalid-filename-dialog__input\"\n\t\t\t:error=\"!isValidName\"\n\t\t\t:helper-text=\"validationError\"\n\t\t\t:label=\"t('New filename')\"\n\t\t\t:value.sync=\"newName\" />\n\t</NcDialog>\n</template>\n\n<script lang=\"ts\">\nimport type { ComponentPublicInstance, PropType } from 'vue'\n\nimport { InvalidFilenameError, InvalidFilenameErrorReason } from '@nextcloud/files'\nimport { defineComponent } from 'vue'\nimport { t } from '../utils/l10n'\nimport NcDialog from '@nextcloud/vue/dist/Components/NcDialog.js'\nimport NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js'\nimport NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js'\n\nexport default defineComponent({\n\tcomponents: {\n\t\tNcDialog,\n\t\tNcNoteCard,\n\t\tNcTextField,\n\t},\n\n\tprops: {\n\t\terror: {\n\t\t\ttype: InvalidFilenameError,\n\t\t\trequired: true,\n\t\t},\n\t\t/**\n\t\t * @deprecated just for legacy reasons, replace with function from @nextcloud/files in future\n\t\t */\n\t\tvalidateFilename: {\n\t\t\ttype: Function as PropType<(filename: string) => void>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tsetup() {\n\t\treturn {\n\t\t\tt,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tnewName: '',\n\t\t\tvalidationError: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisValidName(): boolean {\n\t\t\treturn this.validationError === ''\n\t\t},\n\n\t\tisInvalidFileType(): boolean {\n\t\t\treturn this.error.reason === InvalidFilenameErrorReason.Extension && this.error.segment.match(/^\\.\\w/) !== null\n\t\t},\n\n\t\tcanRename(): boolean {\n\t\t\treturn !this.isInvalidFileType\n\t\t},\n\n\t\tdialogButtons() {\n\t\t\tconst buttons = [\n\t\t\t\t{\n\t\t\t\t\tlabel: t('Cancel'),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.$emit('close', { cancel: true })\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: t('Skip'),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.$emit('close', { skip: true })\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t] as unknown[]\n\n\t\t\t// Only add the rename option if possible\n\t\t\tif (this.canRename) {\n\t\t\t\tbuttons.push({\n\t\t\t\t\tlabel: t('Rename'),\n\t\t\t\t\ttype: 'primary',\n\t\t\t\t\tdisabled: !this.isValidName,\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.$emit('close', { rename: this.newName.trimEnd() })\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn buttons\n\t\t},\n\t},\n\twatch: {\n\t\terror: {\n\t\t\thandler() {\n\t\t\t\tthis.validationError = this.getErrorText(this.error)\n\t\t\t\tthis.newName = this.error.filename\n\t\t\t},\n\t\t\timmediate: true,\n\t\t},\n\n\t\tnewName() {\n\t\t\ttry {\n\t\t\t\tthis.validateFilename(this.newName.trimEnd())\n\t\t\t\tthis.validationError = ''\n\t\t\t} catch (error) {\n\t\t\t\tthis.validationError = this.getErrorText(error as InvalidFilenameError)\n\t\t\t} finally {\n\t\t\t\tconst textfield = (this.$refs.textfield as ComponentPublicInstance)?.$el.querySelector('input')\n\t\t\t\tif (textfield) {\n\t\t\t\t\ttextfield.setCustomValidity(this.validationError)\n\t\t\t\t\ttextfield.reportValidity()\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetErrorText(error: InvalidFilenameError): string {\n\t\t\tswitch (error.reason) {\n\t\t\tcase InvalidFilenameErrorReason.Character:\n\t\t\t\treturn t('\"{segment}\" is not allowed inside a file or folder name.', { segment: error.segment })\n\t\t\tcase InvalidFilenameErrorReason.ReservedName:\n\t\t\t\treturn t('\"{segment}\" is a forbidden file or folder name.', { segment: error.segment })\n\t\t\tcase InvalidFilenameErrorReason.Extension:\n\t\t\t\treturn error.segment.match(/\\.\\w/)\n\t\t\t\t\t? t('\"{segment}\" is a forbidden file type.', { segment: error.segment })\n\t\t\t\t\t: t('Filenames must not end with \"{segment}\".', { segment: error.segment })\n\t\t\t}\n\t\t},\n\t},\n})\n</script>\n\n<style scoped>\n.invalid-filename-dialog__input {\n\t/* Ensure the helper text can always be shown without jumping */\n\tmin-height: calc(var(--default-clickable-area) + 4 * var(--default-font-size));\n}\n</style>\n"],"names":["defineComponent","NcDialog","NcNoteCard","NcTextField","InvalidFilenameError","t","InvalidFilenameErrorReason"],"mappings":";;;;;;;;;;;;AAgCA,MAAA,YAAAA,oBAAA;AAAA,EACA,YAAA;AAAA,IAAA,UACAC,kBAAA;AAAA,IAAA,YACAC,oBAAA;AAAA,IACAC,aAAAA,qBAAAA;AAAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,OAAA;AAAA,MACA,MAAAC,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA,kBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IAAA;AAAA,EAEA;AAAA,EAEA,QAAA;AACA,WAAA;AAAA,MACAC,GAAAA,MAAAA;AAAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AAAA,IACA,cAAA;AACA,aAAA,KAAA,oBAAA;AAAA,IACA;AAAA,IAEA,oBAAA;AACA,aAAA,KAAA,MAAA,WAAAC,MAAA,2BAAA,aAAA,KAAA,MAAA,QAAA,MAAA,OAAA,MAAA;AAAA,IACA;AAAA,IAEA,YAAA;AACA,aAAA,CAAA,KAAA;AAAA,IACA;AAAA,IAEA,gBAAA;AACA,YAAA,UAAA;AAAA,QACA;AAAA,UACA,OAAAD,QAAA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA,MAAA;AACA,iBAAA,MAAA,SAAA,EAAA,QAAA,MAAA;AAAA,UAAA;AAAA,QAEA;AAAA,QACA;AAAA,UACA,OAAAA,QAAA,MAAA;AAAA,UACA,UAAA,MAAA;AACA,iBAAA,MAAA,SAAA,EAAA,MAAA,MAAA;AAAA,UAAA;AAAA,QACA;AAAA,MAEA;AAGA,UAAA,KAAA,WAAA;AACA,gBAAA,KAAA;AAAA,UACA,OAAAA,QAAA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA,CAAA,KAAA;AAAA,UACA,UAAA,MAAA;AACA,iBAAA,MAAA,SAAA,EAAA,QAAA,KAAA,QAAA,QAAA,GAAA;AAAA,UAAA;AAAA,QACA,CACA;AAAA,MAAA;AAGA,aAAA;AAAA,IAAA;AAAA,EAEA;AAAA,EACA,OAAA;AAAA,IACA,OAAA;AAAA,MACA,UAAA;AACA,aAAA,kBAAA,KAAA,aAAA,KAAA,KAAA;AACA,aAAA,UAAA,KAAA,MAAA;AAAA,MACA;AAAA,MACA,WAAA;AAAA,IACA;AAAA,IAEA,UAAA;AACA,UAAA;AACA,aAAA,iBAAA,KAAA,QAAA,QAAA,CAAA;AACA,aAAA,kBAAA;AAAA,eACA,OAAA;AACA,aAAA,kBAAA,KAAA,aAAA,KAAA;AAAA,MAAA,UACA;AACA,cAAA,YAAA,KAAA,MAAA,WAAA,IAAA,cAAA,OAAA;AACA,YAAA,WAAA;AACA,oBAAA,kBAAA,KAAA,eAAA;AACA,oBAAA,eAAA;AAAA,QAAA;AAAA,MACA;AAAA,IACA;AAAA,EAEA;AAAA,EAEA,SAAA;AAAA,IACA,aAAA,OAAA;AACA,cAAA,MAAA,QAAA;AAAA,QACA,KAAAC,MAAA,2BAAA;AACA,iBAAAD,MAAAA,EAAA,4DAAA,EAAA,SAAA,MAAA,SAAA;AAAA,QACA,KAAAC,MAAA,2BAAA;AACA,iBAAAD,MAAAA,EAAA,mDAAA,EAAA,SAAA,MAAA,SAAA;AAAA,QACA,KAAAC,MAAA,2BAAA;AACA,iBAAA,MAAA,QAAA,MAAA,MAAA,IACAD,MAAA,EAAA,yCAAA,EAAA,SAAA,MAAA,QAAA,CAAA,IACAA,QAAA,4CAAA,EAAA,SAAA,MAAA,SAAA;AAAA,MAAA;AAAA,IACA;AAAA,EACA;AAEA,CAAA;;;;;;;;;;;;;;;;;;;;;"}