mirror of
https://github.com/nextcloud/server.git
synced 2026-02-03 20:41:22 -05:00
1 line
No EOL
38 KiB
Text
1 line
No EOL
38 KiB
Text
{"version":3,"file":"SystemTagPicker-L1La5tAP.chunk.mjs","sources":["../node_modules/vue-material-design-icons/CheckCircle.vue","../node_modules/vue-material-design-icons/Circle.vue","../node_modules/vue-material-design-icons/CircleOutline.vue","../node_modules/vue-material-design-icons/TagOutline.vue","../build/frontend/apps/systemtags/src/components/SystemTagPicker.vue"],"sourcesContent":["<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon check-circle-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M10 17L5 12L6.41 10.59L10 14.17L17.59 6.58L19 8L10 17Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"CheckCircleIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon circle-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"CircleIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon circle-outline-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"CircleOutlineIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon tag-outline-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M21.41 11.58L12.41 2.58A2 2 0 0 0 11 2H4A2 2 0 0 0 2 4V11A2 2 0 0 0 2.59 12.42L11.59 21.42A2 2 0 0 0 13 22A2 2 0 0 0 14.41 21.41L21.41 14.41A2 2 0 0 0 22 13A2 2 0 0 0 21.41 11.58M13 20L4 11V4H11L20 13M6.5 5A1.5 1.5 0 1 1 5 6.5A1.5 1.5 0 0 1 6.5 5Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"TagOutlineIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<!--\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcDialog\n\t\tdata-cy-systemtags-picker\n\t\t:noClose=\"status === Status.LOADING\"\n\t\t:name=\"t('systemtags', 'Manage tags')\"\n\t\t:open=\"opened\"\n\t\t:class=\"'systemtags-picker--' + status\"\n\t\tclass=\"systemtags-picker\"\n\t\tcloseOnClickOutside\n\t\toutTransition\n\t\t@update:open=\"onCancel\">\n\t\t<NcEmptyContent\n\t\t\tv-if=\"status === Status.LOADING || status === Status.DONE\"\n\t\t\t:name=\"t('systemtags', 'Applying tags changes…')\">\n\t\t\t<template #icon>\n\t\t\t\t<NcLoadingIcon v-if=\"status === Status.LOADING\" />\n\t\t\t\t<CheckIcon v-else fillColor=\"var(--color-border-success)\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<template v-else>\n\t\t\t<!-- Search or create input -->\n\t\t\t<div class=\"systemtags-picker__input\">\n\t\t\t\t<NcTextField\n\t\t\t\t\tv-model=\"input\"\n\t\t\t\t\t:label=\"canEditOrCreateTag ? t('systemtags', 'Search or create tag') : t('systemtags', 'Search tag')\"\n\t\t\t\t\tdata-cy-systemtags-picker-input>\n\t\t\t\t\t<TagIcon :size=\"20\" />\n\t\t\t\t</NcTextField>\n\t\t\t</div>\n\n\t\t\t<!-- Tags list -->\n\t\t\t<ul\n\t\t\t\tclass=\"systemtags-picker__tags\"\n\t\t\t\tdata-cy-systemtags-picker-tags>\n\t\t\t\t<li\n\t\t\t\t\tv-for=\"tag in filteredTags\"\n\t\t\t\t\t:key=\"tag.id\"\n\t\t\t\t\tref=\"tags\"\n\t\t\t\t\t:data-cy-systemtags-picker-tag=\"tag.id\"\n\t\t\t\t\t:style=\"tagListStyle(tag)\"\n\t\t\t\t\tclass=\"systemtags-picker__tag\">\n\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t:modelValue=\"isChecked(tag)\"\n\t\t\t\t\t\t:disabled=\"!tag.canAssign\"\n\t\t\t\t\t\t:indeterminate=\"isIndeterminate(tag)\"\n\t\t\t\t\t\t:label=\"tag.displayName\"\n\t\t\t\t\t\tclass=\"systemtags-picker__tag-checkbox\"\n\t\t\t\t\t\t@update:modelValue=\"onCheckUpdate(tag, $event)\">\n\t\t\t\t\t\t{{ formatTagName(tag) }}\n\t\t\t\t\t</NcCheckboxRadioSwitch>\n\n\t\t\t\t\t<!-- Color picker -->\n\t\t\t\t\t<NcColorPicker\n\t\t\t\t\t\tv-if=\"canEditOrCreateTag\"\n\t\t\t\t\t\t:data-cy-systemtags-picker-tag-color=\"tag.id\"\n\t\t\t\t\t\t:modelValue=\"`#${tag.color || '000000'}`\"\n\t\t\t\t\t\t:shown=\"openedPicker === tag.id\"\n\t\t\t\t\t\tclass=\"systemtags-picker__tag-color\"\n\t\t\t\t\t\t@update:shown=\"openedPicker = $event ? tag.id : false\"\n\t\t\t\t\t\t@submit=\"onColorChange(tag, $event)\">\n\t\t\t\t\t\t<NcButton :aria-label=\"t('systemtags', 'Change tag color')\" variant=\"tertiary\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<CircleIcon\n\t\t\t\t\t\t\t\t\tv-if=\"tag.color\"\n\t\t\t\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\t\t\t\tfillColor=\"var(--color-circle-icon)\"\n\t\t\t\t\t\t\t\t\tclass=\"button-color-circle\" />\n\t\t\t\t\t\t\t\t<CircleOutlineIcon\n\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\t\t\t\tfillColor=\"var(--color-circle-icon)\"\n\t\t\t\t\t\t\t\t\tclass=\"button-color-empty\" />\n\t\t\t\t\t\t\t\t<PencilIcon class=\"button-color-pencil\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</NcColorPicker>\n\t\t\t\t</li>\n\n\t\t\t\t<!-- Create new tag -->\n\t\t\t\t<li>\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tv-if=\"canEditOrCreateTag && canCreateTag\"\n\t\t\t\t\t\t:disabled=\"status === Status.CREATING_TAG\"\n\t\t\t\t\t\talignment=\"start\"\n\t\t\t\t\t\tclass=\"systemtags-picker__tag-create\"\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\tdata-cy-systemtags-picker-button-create\n\t\t\t\t\t\t@click=\"onNewTag\">\n\t\t\t\t\t\t{{ input.trim() }}<br>\n\t\t\t\t\t\t<span class=\"systemtags-picker__tag-create-subline\">{{ t('systemtags', 'Create new tag') }}</span>\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<PlusIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</li>\n\t\t\t</ul>\n\n\t\t\t<!-- Note -->\n\t\t\t<div class=\"systemtags-picker__note\">\n\t\t\t\t<NcNoteCard v-if=\"!hasChanges\" type=\"info\">\n\t\t\t\t\t{{ t('systemtags', 'Choose tags for the selected files') }}\n\t\t\t\t</NcNoteCard>\n\t\t\t\t<NcNoteCard v-else type=\"info\">\n\t\t\t\t\t<!-- eslint-disable-next-line vue/no-v-html -- we use this to format the message with chips -->\n\t\t\t\t\t<span v-html=\"statusMessage\" />\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\t:disabled=\"status !== Status.BASE\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\tdata-cy-systemtags-picker-button-cancel\n\t\t\t\t@click=\"onCancel\">\n\t\t\t\t{{ t('systemtags', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\t:disabled=\"!hasChanges || status !== Status.BASE\"\n\t\t\t\tdata-cy-systemtags-picker-button-submit\n\t\t\t\t@click=\"onSubmit\">\n\t\t\t\t{{ t('systemtags', 'Apply') }}\n\t\t\t</NcButton>\n\t\t</template>\n\n\t\t<!-- Chip html for v-html tag rendering -->\n\t\t<div v-show=\"false\">\n\t\t\t<NcChip\n\t\t\t\tref=\"chip\"\n\t\t\t\ttext=\"%s\"\n\t\t\t\tnoClose\n\t\t\t\tvariant=\"primary\" />\n\t\t</div>\n\t</NcDialog>\n</template>\n\n<script lang=\"ts\">\nimport type { INode } from '@nextcloud/files'\nimport type { PropType } from 'vue'\nimport type { Tag, TagWithId } from '../types.ts'\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { showError } from '@nextcloud/dialogs'\nimport { emit } from '@nextcloud/event-bus'\nimport { loadState } from '@nextcloud/initial-state'\nimport { getLanguage, n, t } from '@nextcloud/l10n'\nimport debounce from 'debounce'\nimport domPurify from 'dompurify'\nimport escapeHTML from 'escape-html'\nimport { defineComponent } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcChip from '@nextcloud/vue/components/NcChip'\nimport NcColorPicker from '@nextcloud/vue/components/NcColorPicker'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\nimport CheckIcon from 'vue-material-design-icons/CheckCircle.vue'\nimport CircleIcon from 'vue-material-design-icons/Circle.vue'\nimport CircleOutlineIcon from 'vue-material-design-icons/CircleOutline.vue'\nimport PencilIcon from 'vue-material-design-icons/PencilOutline.vue'\nimport PlusIcon from 'vue-material-design-icons/Plus.vue'\nimport TagIcon from 'vue-material-design-icons/TagOutline.vue'\nimport logger from '../logger.ts'\nimport { createTag, fetchTag, fetchTags, getTagObjects, setTagObjects, updateTag } from '../services/api.ts'\nimport { getNodeSystemTags, setNodeSystemTags } from '../utils.ts'\nimport { elementColor, invertTextColor, isDarkModeEnabled } from '../utils/colorUtils.ts'\n\nconst debounceUpdateTag = debounce(updateTag, 500)\nconst mainBackgroundColor = getComputedStyle(document.body)\n\t.getPropertyValue('--color-main-background')\n\t.replace('#', '') || (isDarkModeEnabled() ? '000000' : 'ffffff')\n\ntype TagListCount = {\n\tstring: number\n}\n\nenum Status {\n\tBASE = 'base',\n\tLOADING = 'loading',\n\tCREATING_TAG = 'creating-tag',\n\tDONE = 'done',\n}\n\nconst restrictSystemTagsCreationToAdmin = loadState('systemtags', 'restrictSystemTagsCreationToAdmin', false)\n\nexport default defineComponent({\n\tname: 'SystemTagPicker',\n\n\tcomponents: {\n\t\tCheckIcon,\n\t\tCircleIcon,\n\t\tCircleOutlineIcon,\n\t\tNcButton,\n\t\tNcCheckboxRadioSwitch,\n\n\t\tNcChip,\n\t\tNcColorPicker,\n\t\tNcDialog,\n\t\tNcEmptyContent,\n\t\tNcLoadingIcon,\n\t\tNcNoteCard,\n\t\tNcTextField,\n\t\tPencilIcon,\n\t\tPlusIcon,\n\t\tTagIcon,\n\t},\n\n\tprops: {\n\t\tnodes: {\n\t\t\ttype: Array as PropType<INode[]>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\temits: {\n\t\tclose(status: null | boolean) {\n\t\t\treturn status === null || typeof status === 'boolean'\n\t\t},\n\t},\n\n\tsetup() {\n\t\treturn {\n\t\t\temit,\n\t\t\tStatus,\n\t\t\tt,\n\t\t\t// Either tag creation is not restricted to admins or the current user is an admin\n\t\t\tcanEditOrCreateTag: !restrictSystemTagsCreationToAdmin || getCurrentUser()?.isAdmin,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tstatus: Status.BASE,\n\t\t\topened: true,\n\t\t\topenedPicker: false as number | false,\n\n\t\t\tinput: '',\n\t\t\ttags: [] as TagWithId[],\n\t\t\ttagList: {} as TagListCount,\n\n\t\t\ttoAdd: [] as TagWithId[],\n\t\t\ttoRemove: [] as TagWithId[],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tsortedTags(): TagWithId[] {\n\t\t\treturn [...this.tags]\n\t\t\t\t.sort((a, b) => a.displayName.localeCompare(b.displayName, getLanguage(), { ignorePunctuation: true }))\n\t\t},\n\n\t\tfilteredTags(): TagWithId[] {\n\t\t\tif (this.input.trim() === '') {\n\t\t\t\treturn this.sortedTags\n\t\t\t}\n\n\t\t\treturn this.sortedTags\n\t\t\t\t.filter((tag) => tag.displayName.normalize().toLowerCase().includes(this.input.normalize().toLowerCase()))\n\t\t},\n\n\t\thasChanges(): boolean {\n\t\t\treturn this.toAdd.length > 0 || this.toRemove.length > 0\n\t\t},\n\n\t\tcanCreateTag(): boolean {\n\t\t\treturn this.input.trim() !== ''\n\t\t\t\t&& !this.tags.some((tag) => tag.displayName.trim().toLocaleLowerCase() === this.input.trim().toLocaleLowerCase())\n\t\t},\n\n\t\tstatusMessage(): string {\n\t\t\tif (this.toAdd.length === 0 && this.toRemove.length === 0) {\n\t\t\t\t// should not happen™\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\tif (this.toAdd.length === 1 && this.toRemove.length === 1) {\n\t\t\t\treturn n(\n\t\t\t\t\t'systemtags',\n\t\t\t\t\t'{tag1} will be set and {tag2} will be removed from 1 file.',\n\t\t\t\t\t'{tag1} will be set and {tag2} will be removed from {count} files.',\n\t\t\t\t\tthis.nodes.length,\n\t\t\t\t\t{\n\t\t\t\t\t\ttag1: this.formatTagChip(this.toAdd[0]),\n\t\t\t\t\t\ttag2: this.formatTagChip(this.toRemove[0]),\n\t\t\t\t\t\tcount: this.nodes.length,\n\t\t\t\t\t},\n\t\t\t\t\t{ escape: false },\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst tagsAdd = this.toAdd.map(this.formatTagChip)\n\t\t\tconst lastTagAdd = tagsAdd.pop() as string\n\t\t\tconst tagsRemove = this.toRemove.map(this.formatTagChip)\n\t\t\tconst lastTagRemove = tagsRemove.pop() as string\n\n\t\t\tconst addStringSingular = n(\n\t\t\t\t'systemtags',\n\t\t\t\t'{tag} will be set to 1 file.',\n\t\t\t\t'{tag} will be set to {count} files.',\n\t\t\t\tthis.nodes.length,\n\t\t\t\t{\n\t\t\t\t\ttag: lastTagAdd,\n\t\t\t\t\tcount: this.nodes.length,\n\t\t\t\t},\n\t\t\t\t{ escape: false },\n\t\t\t)\n\n\t\t\tconst removeStringSingular = n(\n\t\t\t\t'systemtags',\n\t\t\t\t'{tag} will be removed from 1 file.',\n\t\t\t\t'{tag} will be removed from {count} files.',\n\t\t\t\tthis.nodes.length,\n\t\t\t\t{\n\t\t\t\t\ttag: lastTagRemove,\n\t\t\t\t\tcount: this.nodes.length,\n\t\t\t\t},\n\t\t\t\t{ escape: false },\n\t\t\t)\n\n\t\t\tconst addStringPlural = n(\n\t\t\t\t'systemtags',\n\t\t\t\t'{tags} and {lastTag} will be set to 1 file.',\n\t\t\t\t'{tags} and {lastTag} will be set to {count} files.',\n\t\t\t\tthis.nodes.length,\n\t\t\t\t{\n\t\t\t\t\ttags: tagsAdd.join(', '),\n\t\t\t\t\tlastTag: lastTagAdd,\n\t\t\t\t\tcount: this.nodes.length,\n\t\t\t\t},\n\t\t\t\t{ escape: false },\n\t\t\t)\n\n\t\t\tconst removeStringPlural = n(\n\t\t\t\t'systemtags',\n\t\t\t\t'{tags} and {lastTag} will be removed from 1 file.',\n\t\t\t\t'{tags} and {lastTag} will be removed from {count} files.',\n\t\t\t\tthis.nodes.length,\n\t\t\t\t{\n\t\t\t\t\ttags: tagsRemove.join(', '),\n\t\t\t\t\tlastTag: lastTagRemove,\n\t\t\t\t\tcount: this.nodes.length,\n\t\t\t\t},\n\t\t\t\t{ escape: false },\n\t\t\t)\n\n\t\t\t// Singular\n\t\t\tif (this.toAdd.length === 1 && this.toRemove.length === 0) {\n\t\t\t\treturn addStringSingular\n\t\t\t}\n\t\t\tif (this.toAdd.length === 0 && this.toRemove.length === 1) {\n\t\t\t\treturn removeStringSingular\n\t\t\t}\n\n\t\t\t// Plural\n\t\t\tif (this.toAdd.length > 1 && this.toRemove.length === 0) {\n\t\t\t\treturn addStringPlural\n\t\t\t}\n\t\t\tif (this.toAdd.length === 0 && this.toRemove.length > 1) {\n\t\t\t\treturn removeStringPlural\n\t\t\t}\n\n\t\t\t// Mixed\n\t\t\tif (this.toAdd.length > 1 && this.toRemove.length === 1) {\n\t\t\t\treturn `${addStringPlural} ${removeStringSingular}`\n\t\t\t}\n\t\t\tif (this.toAdd.length === 1 && this.toRemove.length > 1) {\n\t\t\t\treturn `${addStringSingular} ${removeStringPlural}`\n\t\t\t}\n\n\t\t\t// Both plural\n\t\t\treturn `${addStringPlural} ${removeStringPlural}`\n\t\t},\n\t},\n\n\tbeforeMount() {\n\t\tfetchTags().then((tags) => {\n\t\t\tthis.tags = tags\n\t\t})\n\n\t\t// Efficient way of counting tags and their occurrences\n\t\tthis.tagList = this.nodes.reduce((acc: TagListCount, node: INode) => {\n\t\t\tconst tags = getNodeSystemTags(node) || []\n\t\t\ttags.forEach((tag) => {\n\t\t\t\tacc[tag] = (acc[tag] || 0) + 1\n\t\t\t})\n\t\t\treturn acc\n\t\t}, {} as TagListCount) as TagListCount\n\n\t\tif (!this.canEditOrCreateTag) {\n\t\t\tlogger.debug('System tag creation is restricted to admins and the current user is not an admin')\n\t\t}\n\t},\n\n\tmethods: {\n\t\t// Format & sanitize a tag chip for v-html tag rendering\n\t\tformatTagChip(tag: TagWithId): string {\n\t\t\tconst chip = this.$refs.chip as InstanceType<typeof NcChip>\n\t\t\tconst chipCloneEl = chip.$el.cloneNode(true) as HTMLElement\n\t\t\tif (tag.color) {\n\t\t\t\tconst style = this.tagListStyle(tag)\n\t\t\t\tObject.entries(style).forEach(([key, value]) => {\n\t\t\t\t\tchipCloneEl.style.setProperty(key, value)\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst chipHtml = chipCloneEl.outerHTML\n\t\t\treturn chipHtml.replace('%s', escapeHTML(domPurify.sanitize(tag.displayName)))\n\t\t},\n\n\t\tformatTagName(tag: TagWithId): string {\n\t\t\tif (!tag.userVisible) {\n\t\t\t\treturn t('systemtags', '{displayName} (hidden)', { displayName: tag.displayName })\n\t\t\t}\n\n\t\t\tif (!tag.userAssignable) {\n\t\t\t\treturn t('systemtags', '{displayName} (restricted)', { displayName: tag.displayName })\n\t\t\t}\n\n\t\t\treturn tag.displayName\n\t\t},\n\n\t\tonColorChange(tag: TagWithId, color: `#${string}`) {\n\t\t\ttag.color = color.replace('#', '')\n\t\t\tdebounceUpdateTag(tag)\n\t\t},\n\n\t\tisChecked(tag: TagWithId): boolean {\n\t\t\treturn tag.displayName in this.tagList\n\t\t\t\t&& this.tagList[tag.displayName] === this.nodes.length\n\t\t},\n\n\t\tisIndeterminate(tag: TagWithId): boolean {\n\t\t\treturn tag.displayName in this.tagList\n\t\t\t\t&& this.tagList[tag.displayName] !== 0\n\t\t\t\t&& this.tagList[tag.displayName] !== this.nodes.length\n\t\t},\n\n\t\tonCheckUpdate(tag: TagWithId, checked: boolean) {\n\t\t\tif (checked) {\n\t\t\t\tthis.toAdd.push(tag)\n\t\t\t\tthis.toRemove = this.toRemove.filter((search) => search.id !== tag.id)\n\t\t\t\tthis.tagList[tag.displayName] = this.nodes.length\n\t\t\t} else {\n\t\t\t\tthis.toRemove.push(tag)\n\t\t\t\tthis.toAdd = this.toAdd.filter((search) => search.id !== tag.id)\n\t\t\t\tthis.tagList[tag.displayName] = 0\n\t\t\t}\n\t\t},\n\n\t\tasync onNewTag() {\n\t\t\tif (!this.canEditOrCreateTag) {\n\t\t\t\t// Should not happen ™\n\t\t\t\tshowError(t('systemtags', 'Only admins can create new tags'))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.status = Status.CREATING_TAG\n\t\t\ttry {\n\t\t\t\tconst payload: Tag = {\n\t\t\t\t\tdisplayName: this.input.trim(),\n\t\t\t\t\tuserAssignable: true,\n\t\t\t\t\tuserVisible: true,\n\t\t\t\t\tcanAssign: true,\n\t\t\t\t}\n\t\t\t\tconst id = await createTag(payload)\n\t\t\t\tconst tag = await fetchTag(id)\n\t\t\t\tthis.tags.push(tag)\n\t\t\t\tthis.input = ''\n\n\t\t\t\t// Check the newly created tag\n\t\t\t\tthis.onCheckUpdate(tag, true)\n\n\t\t\t\t// Scroll to the newly created tag\n\t\t\t\tawait this.$nextTick()\n\t\t\t\tif (Array.isArray(this.$refs.tags)) {\n\t\t\t\t\tconst newTagEl = this.$refs.tags\n\t\t\t\t\t\t.find((el: HTMLElement) => el.dataset.cySystemtagsPickerTag === id.toString())\n\t\t\t\t\tnewTagEl?.scrollIntoView({\n\t\t\t\t\t\tbehavior: 'instant',\n\t\t\t\t\t\tblock: 'center',\n\t\t\t\t\t\tinline: 'center',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tshowError((error as Error)?.message || t('systemtags', 'Failed to create tag'))\n\t\t\t} finally {\n\t\t\t\tthis.status = Status.BASE\n\t\t\t}\n\t\t},\n\n\t\tasync onSubmit() {\n\t\t\tthis.status = Status.LOADING\n\t\t\tlogger.debug('Applying tags', {\n\t\t\t\ttoAdd: this.toAdd,\n\t\t\t\ttoRemove: this.toRemove,\n\t\t\t})\n\n\t\t\ttry {\n\t\t\t\t// Add tags\n\t\t\t\tfor (const tag of this.toAdd) {\n\t\t\t\t\tconst { etag, objects } = await getTagObjects(tag, 'files')\n\n\t\t\t\t\t// Create a new list of ids in one pass\n\t\t\t\t\tconst ids = [...new Set([\n\t\t\t\t\t\t...objects.map((obj) => obj.id).filter(Boolean),\n\t\t\t\t\t\t...this.nodes.map((node) => node.fileid).filter(Boolean),\n\t\t\t\t\t])] as number[]\n\n\t\t\t\t\t// Set tags\n\t\t\t\t\tawait setTagObjects(tag, 'files', ids.map((id) => ({ id, type: 'files' })), etag)\n\t\t\t\t}\n\n\t\t\t\t// Remove tags\n\t\t\t\tfor (const tag of this.toRemove) {\n\t\t\t\t\tconst { etag, objects } = await getTagObjects(tag, 'files')\n\n\t\t\t\t\t// Get file IDs from the nodes array just once\n\t\t\t\t\tconst nodeFileIds = new Set(this.nodes.map((node) => node.fileid))\n\n\t\t\t\t\t// Create a filtered and deduplicated list of ids in one pass\n\t\t\t\t\tconst ids = objects\n\t\t\t\t\t\t.map((obj) => obj.id)\n\t\t\t\t\t\t.filter((id, index, self) => !nodeFileIds.has(id) && self.indexOf(id) === index)\n\n\t\t\t\t\t// Set tags\n\t\t\t\t\tawait setTagObjects(tag, 'files', ids.map((id) => ({ id, type: 'files' })), etag)\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Failed to apply tags', { error })\n\t\t\t\tshowError(t('systemtags', 'Failed to apply tags changes'))\n\t\t\t\tthis.status = Status.BASE\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst nodes = [] as INode[]\n\n\t\t\t// Update nodes\n\t\t\tthis.toAdd.forEach((tag) => {\n\t\t\t\tthis.nodes.forEach((node) => {\n\t\t\t\t\tconst tags = [...(getNodeSystemTags(node) || []), tag.displayName]\n\t\t\t\t\t\t.sort((a, b) => a.localeCompare(b, getLanguage(), { ignorePunctuation: true }))\n\t\t\t\t\tsetNodeSystemTags(node, tags)\n\t\t\t\t\tnodes.push(node)\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tthis.toRemove.forEach((tag) => {\n\t\t\t\tthis.nodes.forEach((node) => {\n\t\t\t\t\tconst tags = [...(getNodeSystemTags(node) || [])].filter((t) => t !== tag.displayName)\n\t\t\t\t\t\t.sort((a, b) => a.localeCompare(b, getLanguage(), { ignorePunctuation: true }))\n\t\t\t\t\tsetNodeSystemTags(node, tags)\n\t\t\t\t\tnodes.push(node)\n\t\t\t\t})\n\t\t\t})\n\n\t\t\t// trigger update event\n\t\t\tnodes.forEach((node) => emit('systemtags:node:updated', node))\n\n\t\t\tthis.status = Status.DONE\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.opened = false\n\t\t\t\tthis.$emit('close', true)\n\t\t\t}, 2000)\n\t\t},\n\n\t\tonCancel() {\n\t\t\tthis.opened = false\n\t\t\tthis.$emit('close', null)\n\t\t},\n\n\t\ttagListStyle(tag: TagWithId): Record<string, string> {\n\t\t\t// No color, no style\n\t\t\tif (!tag.color) {\n\t\t\t\treturn {\n\t\t\t\t\t// See inline system tag color\n\t\t\t\t\t'--color-circle-icon': 'var(--color-text-maxcontrast)',\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Make the checkbox color the same as the tag color\n\t\t\t// as well as the circle icon color picker\n\t\t\tconst primaryElement = elementColor(`#${tag.color}`, `#${mainBackgroundColor}`)\n\t\t\tconst textColor = invertTextColor(primaryElement) ? '#000000' : '#ffffff'\n\t\t\treturn {\n\t\t\t\t'--color-circle-icon': 'var(--color-primary-element)',\n\t\t\t\t'--color-primary': primaryElement,\n\t\t\t\t'--color-primary-text': textColor,\n\t\t\t\t'--color-primary-element': primaryElement,\n\t\t\t\t'--color-primary-element-text': textColor,\n\t\t\t}\n\t\t},\n\t},\n})\n</script>\n\n<style scoped lang=\"scss\">\n// Common sticky properties\n.systemtags-picker__input,\n.systemtags-picker__note {\n\tposition: sticky;\n\tz-index: 9;\n\tbackground-color: var(--color-main-background);\n}\n\n.systemtags-picker__input {\n\tdisplay: flex;\n\ttop: 0;\n\tgap: 8px;\n\tpadding-block-end: 8px;\n\talign-items: flex-end;\n}\n\n.systemtags-picker__tags {\n\tpadding-block: 8px;\n\tgap: var(--default-grid-baseline);\n\tdisplay: flex;\n\tflex-direction: column;\n\n\tli {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\n\t\t// Make switch full width\n\t\t:deep(.checkbox-radio-switch) {\n\t\t\twidth: 100%;\n\n\t\t\t.checkbox-content {\n\t\t\t\t// adjust width\n\t\t\t\tmax-width: none;\n\t\t\t\t// recalculate padding\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\t\t}\n\t}\n\n\t.systemtags-picker__tag-color button {\n\t\tmargin-inline-start: calc(var(--default-grid-baseline) * 2);\n\n\t\t.button-color-pencil {\n\t\t\tdisplay: none;\n\t\t\tcolor: var(--color-main-text);\n\t\t}\n\n\t\t&:focus,\n\t\t&:hover,\n\t\t&[aria-expanded='true'] {\n\t\t\t.button-color-pencil {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\t.button-color-circle,\n\t\t\t.button-color-empty {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t.systemtags-picker__tag-create {\n\t\t:deep(span) {\n\t\t\ttext-align: start;\n\t\t}\n\t\t&-subline {\n\t\t\tfont-weight: normal;\n\t\t}\n\t}\n}\n\n.systemtags-picker__note {\n\tbottom: 0;\n\tpadding-block: 8px;\n\n\t:deep(.notecard) {\n\t\t// min 2 lines of text to avoid jumping\n\t\tmin-height: 2lh;\n\t\talign-items: center;\n\t}\n\n\t& > div {\n\t\tmargin: 0 !important;\n\t}\n}\n\n.systemtags-picker--done :deep(.empty-content__icon) {\n\topacity: 1;\n}\n\n// Rendered chip in note\n.nc-chip {\n\tdisplay: inline !important;\n}\n</style>\n"],"names":["_sfc_main","_hoisted_3","_createElementBlock","_mergeProps","_ctx","$props","_cache","$event","_createElementVNode","_openBlock","debounceUpdateTag","debounce","updateTag","mainBackgroundColor","isDarkModeEnabled","Status","restrictSystemTagsCreationToAdmin","loadState","defineComponent","CheckIcon","CircleIcon","CircleOutlineIcon","NcButton","NcCheckboxRadioSwitch","NcChip","NcColorPicker","NcDialog","NcEmptyContent","NcLoadingIcon","NcNoteCard","NcTextField","PencilIcon","PlusIcon","TagIcon","status","emit","t","getCurrentUser","a","b","getLanguage","tag","n","tagsAdd","lastTagAdd","tagsRemove","lastTagRemove","addStringSingular","removeStringSingular","addStringPlural","removeStringPlural","fetchTags","tags","acc","node","getNodeSystemTags","logger","chipCloneEl","style","key","value","escapeHTML","domPurify","color","checked","search","showError","payload","id","createTag","fetchTag","el","error","etag","objects","getTagObjects","ids","obj","setTagObjects","nodeFileIds","index","self","nodes","setNodeSystemTags","primaryElement","elementColor","textColor","invertTextColor","_hoisted_1","_hoisted_4","_hoisted_5","_createBlock","_component_NcDialog","_normalizeClass","_withCtx","_createVNode","_component_NcButton","_createTextVNode","_toDisplayString","_component_NcEmptyContent","_component_NcLoadingIcon","_component_CheckIcon","_Fragment","_component_NcTextField","_component_TagIcon","_hoisted_2","_renderList","_normalizeStyle","_component_NcCheckboxRadioSwitch","_component_NcColorPicker","_component_CircleIcon","_component_CircleOutlineIcon","_component_PencilIcon","_component_PlusIcon","_component_NcNoteCard","_hoisted_6","_component_NcChip"],"mappings":"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","x_google_ignoreList":[0,1,2,3]} |