{"version":3,"file":"systemtags-admin.mjs","sources":["../build/frontend/apps/systemtags/src/components/SystemTagForm.vue","../build/frontend/apps/systemtags/src/components/SystemTagsCreationControl.vue","../build/frontend/apps/systemtags/src/views/SystemTagsSection.vue","../build/frontend/apps/systemtags/src/admin.ts"],"sourcesContent":["<!--\n  - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { Tag, TagWithId } from '../types.ts'\n\nimport { showSuccess } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport { computed, ref, useTemplateRef, watch } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport NcSelect from '@nextcloud/vue/components/NcSelect'\nimport NcSelectTags from '@nextcloud/vue/components/NcSelectTags'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\nimport { createTag, deleteTag, updateTag } from '../services/api.ts'\nimport { defaultBaseTag } from '../utils.ts'\n\nconst props = defineProps<{\n\ttags: TagWithId[]\n}>()\n\nconst emit = defineEmits<{\n\t'tag:created': [tag: TagWithId]\n\t'tag:updated': [tag: TagWithId]\n\t'tag:deleted': [tag: TagWithId]\n}>()\n\nenum TagLevel {\n\tPublic = 'Public',\n\tRestricted = 'Restricted',\n\tInvisible = 'Invisible',\n}\n\ninterface TagLevelOption {\n\tid: TagLevel\n\tlabel: string\n}\n\nconst tagLevelOptions: TagLevelOption[] = [\n\t{\n\t\tid: TagLevel.Public,\n\t\tlabel: t('systemtags', 'Public'),\n\t},\n\t{\n\t\tid: TagLevel.Restricted,\n\t\tlabel: t('systemtags', 'Restricted'),\n\t},\n\t{\n\t\tid: TagLevel.Invisible,\n\t\tlabel: t('systemtags', 'Invisible'),\n\t},\n]\n\nconst tagNameInputElement = useTemplateRef('tagNameInput')\n\nconst loading = ref(false)\nconst errorMessage = ref('')\nconst tagName = ref('')\nconst tagLevel = ref(TagLevel.Public)\n\nconst selectedTag = ref<null | TagWithId>(null)\nwatch(selectedTag, (tag: null | TagWithId) => {\n\ttagName.value = tag ? tag.displayName : ''\n\ttagLevel.value = tag ? getTagLevel(tag.userVisible, tag.userAssignable) : TagLevel.Public\n})\n\nconst isCreating = computed(() => selectedTag.value === null)\nconst isCreateDisabled = computed(() => tagName.value === '')\n\nconst isUpdateDisabled = computed(() => (\n\ttagName.value === ''\n\t|| (\n\t\tselectedTag.value?.displayName === tagName.value\n\t\t&& getTagLevel(selectedTag.value?.userVisible, selectedTag.value?.userAssignable) === tagLevel.value\n\t)\n))\n\nconst isResetDisabled = computed(() => {\n\tif (isCreating.value) {\n\t\treturn tagName.value === '' && tagLevel.value === TagLevel.Public\n\t}\n\treturn selectedTag.value === null\n})\n\nconst userVisible = computed((): boolean => {\n\tconst matchLevel: Record<TagLevel, boolean> = {\n\t\t[TagLevel.Public]: true,\n\t\t[TagLevel.Restricted]: true,\n\t\t[TagLevel.Invisible]: false,\n\t}\n\treturn matchLevel[tagLevel.value]\n})\n\nconst userAssignable = computed(() => {\n\tconst matchLevel: Record<TagLevel, boolean> = {\n\t\t[TagLevel.Public]: true,\n\t\t[TagLevel.Restricted]: false,\n\t\t[TagLevel.Invisible]: false,\n\t}\n\treturn matchLevel[tagLevel.value]\n})\n\nconst tagProperties = computed((): Omit<Tag, 'id' | 'canAssign'> => {\n\treturn {\n\t\tdisplayName: tagName.value,\n\t\tuserVisible: userVisible.value,\n\t\tuserAssignable: userAssignable.value,\n\t}\n})\n\n/**\n * Handle tag selection\n *\n * @param tagId - The selected tag ID\n */\nfunction onSelectTag(tagId: number | null) {\n\tconst tag = props.tags.find((search) => search.id === tagId) || null\n\tselectedTag.value = tag\n}\n\n/**\n * Handle form submission\n */\nasync function handleSubmit() {\n\tif (isCreating.value) {\n\t\tawait create()\n\t\treturn\n\t}\n\tawait update()\n}\n\n/**\n * Create a new tag\n */\nasync function create() {\n\tconst tag: Tag = { ...defaultBaseTag, ...tagProperties.value }\n\tloading.value = true\n\ttry {\n\t\tconst id = await createTag(tag)\n\t\tconst createdTag: TagWithId = { ...tag, id }\n\t\temit('tag:created', createdTag)\n\t\tshowSuccess(t('systemtags', 'Created tag'))\n\t\treset()\n\t} catch {\n\t\terrorMessage.value = t('systemtags', 'Failed to create tag')\n\t}\n\tloading.value = false\n}\n\n/**\n * Update the selected tag\n */\nasync function update() {\n\tif (selectedTag.value === null) {\n\t\treturn\n\t}\n\tconst tag: TagWithId = { ...selectedTag.value, ...tagProperties.value }\n\tloading.value = true\n\ttry {\n\t\tawait updateTag(tag)\n\t\tselectedTag.value = tag\n\t\temit('tag:updated', tag)\n\t\tshowSuccess(t('systemtags', 'Updated tag'))\n\t\ttagNameInputElement.value?.focus()\n\t} catch {\n\t\terrorMessage.value = t('systemtags', 'Failed to update tag')\n\t}\n\tloading.value = false\n}\n\n/**\n * Delete the selected tag\n */\nasync function handleDelete() {\n\tif (selectedTag.value === null) {\n\t\treturn\n\t}\n\tloading.value = true\n\ttry {\n\t\tawait deleteTag(selectedTag.value)\n\t\temit('tag:deleted', selectedTag.value)\n\t\tshowSuccess(t('systemtags', 'Deleted tag'))\n\t\treset()\n\t} catch {\n\t\terrorMessage.value = t('systemtags', 'Failed to delete tag')\n\t}\n\tloading.value = false\n}\n\n/**\n * Reset the form\n */\nfunction reset() {\n\tselectedTag.value = null\n\terrorMessage.value = ''\n\ttagName.value = ''\n\ttagLevel.value = TagLevel.Public\n\ttagNameInputElement.value?.focus()\n}\n\n/**\n * Get tag level based on visibility and assignability\n *\n * @param userVisible - Whether the tag is visible to users\n * @param userAssignable - Whether the tag is assignable by users\n */\nfunction getTagLevel(userVisible: boolean, userAssignable: boolean): TagLevel {\n\tconst matchLevel: Record<string, TagLevel> = {\n\t\t[[true, true].join(',')]: TagLevel.Public,\n\t\t[[true, false].join(',')]: TagLevel.Restricted,\n\t\t[[false, false].join(',')]: TagLevel.Invisible,\n\t}\n\treturn matchLevel[[userVisible, userAssignable].join(',')]!\n}\n</script>\n\n<template>\n\t<form\n\t\tclass=\"system-tag-form\"\n\t\t:disabled=\"loading\"\n\t\taria-labelledby=\"system-tag-form-heading\"\n\t\t@submit.prevent=\"handleSubmit\"\n\t\t@reset=\"reset\">\n\t\t<h4 id=\"system-tag-form-heading\">\n\t\t\t{{ t('systemtags', 'Create or edit tags') }}\n\t\t</h4>\n\n\t\t<div class=\"system-tag-form__group\">\n\t\t\t<label for=\"system-tags-input\">{{ t('systemtags', 'Search for a tag to edit') }}</label>\n\t\t\t<NcSelectTags\n\t\t\t\t:modelValue=\"selectedTag\"\n\t\t\t\tinputId=\"system-tags-input\"\n\t\t\t\t:placeholder=\"t('systemtags', 'Collaborative tags …')\"\n\t\t\t\t:fetchTags=\"false\"\n\t\t\t\t:options=\"tags\"\n\t\t\t\t:multiple=\"false\"\n\t\t\t\tlabelOutside\n\t\t\t\t@update:modelValue=\"onSelectTag\">\n\t\t\t\t<template #no-options>\n\t\t\t\t\t{{ t('systemtags', 'No tags to select') }}\n\t\t\t\t</template>\n\t\t\t</NcSelectTags>\n\t\t</div>\n\n\t\t<div class=\"system-tag-form__group\">\n\t\t\t<label for=\"system-tag-name\">{{ t('systemtags', 'Tag name') }}</label>\n\t\t\t<NcTextField\n\t\t\t\tid=\"system-tag-name\"\n\t\t\t\tref=\"tagNameInput\"\n\t\t\t\tv-model=\"tagName\"\n\t\t\t\t:error=\"Boolean(errorMessage)\"\n\t\t\t\t:helperText=\"errorMessage\"\n\t\t\t\tlabelOutside />\n\t\t</div>\n\n\t\t<div class=\"system-tag-form__group\">\n\t\t\t<label for=\"system-tag-level\">{{ t('systemtags', 'Tag level') }}</label>\n\t\t\t<NcSelect\n\t\t\t\tv-model=\"tagLevel\"\n\t\t\t\tinputId=\"system-tag-level\"\n\t\t\t\t:options=\"tagLevelOptions\"\n\t\t\t\t:reduce=\"level => level.id\"\n\t\t\t\t:clearable=\"false\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\tlabelOutside />\n\t\t</div>\n\n\t\t<div class=\"system-tag-form__row\">\n\t\t\t<NcButton\n\t\t\t\tv-if=\"isCreating\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\t:disabled=\"isCreateDisabled || loading\">\n\t\t\t\t{{ t('systemtags', 'Create') }}\n\t\t\t</NcButton>\n\t\t\t<template v-else>\n\t\t\t\t<NcButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t:disabled=\"isUpdateDisabled || loading\">\n\t\t\t\t\t{{ t('systemtags', 'Update') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t@click=\"handleDelete\">\n\t\t\t\t\t{{ t('systemtags', 'Delete') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t\t<NcButton\n\t\t\t\ttype=\"reset\"\n\t\t\t\t:disabled=\"isResetDisabled || loading\">\n\t\t\t\t{{ t('systemtags', 'Reset') }}\n\t\t\t</NcButton>\n\t\t\t<NcLoadingIcon\n\t\t\t\tv-if=\"loading\"\n\t\t\t\t:name=\"t('systemtags', 'Loading …')\"\n\t\t\t\t:size=\"32\" />\n\t\t</div>\n\t</form>\n</template>\n\n<style lang=\"scss\" scoped>\n.system-tag-form {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmax-width: 400px;\n\tgap: 8px 0;\n\n\t&__group {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t&__row {\n\t\tmargin-top: 8px;\n\t\tdisplay: flex;\n\t\tgap: 0 4px;\n\t}\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { ref } from 'vue'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport logger from '../logger.ts'\nimport { updateSystemTagsAdminRestriction } from '../services/api.ts'\n\n// By default, system tags creation is not restricted to admins\nconst systemTagsCreationRestrictedToAdmin = ref(loadState('systemtags', 'restrictSystemTagsCreationToAdmin', false))\n\n/**\n * Update system tags admin restriction setting\n *\n * @param isRestricted - True if system tags creation should be restricted to admins\n */\nasync function updateSystemTagsDefault(isRestricted: boolean) {\n\ttry {\n\t\tconst responseData = await updateSystemTagsAdminRestriction(isRestricted)\n\t\tlogger.debug('updateSystemTagsDefault', { responseData })\n\t\thandleResponse({\n\t\t\tisRestricted,\n\t\t\tstatus: responseData.ocs?.meta?.status,\n\t\t})\n\t} catch (e) {\n\t\thandleResponse({\n\t\t\terrorMessage: t('systemtags', 'Unable to update setting'),\n\t\t\terror: e,\n\t\t})\n\t}\n}\n\n/**\n * Handle response from updating system tags admin restriction\n *\n * @param context - The response context\n * @param context.isRestricted - Whether system tags creation is restricted to admins\n * @param context.status - The response status\n * @param context.errorMessage - The error message, if any\n * @param context.error - The error object, if any\n */\nfunction handleResponse({ isRestricted, status, errorMessage, error }: {\n\tisRestricted?: boolean\n\tstatus?: string\n\terrorMessage?: string\n\terror?: unknown\n}) {\n\tif (status === 'ok') {\n\t\tsystemTagsCreationRestrictedToAdmin.value = !!isRestricted\n\t\tshowSuccess(isRestricted\n\t\t\t? t('systemtags', 'System tag creation is now restricted to administrators')\n\t\t\t: t('systemtags', 'System tag creation is now allowed for everybody'))\n\t\treturn\n\t}\n\n\tif (errorMessage) {\n\t\tshowError(errorMessage)\n\t\tlogger.error(errorMessage, { error })\n\t}\n}\n</script>\n\n<template>\n\t<div id=\"system-tags-creation-control\">\n\t\t<h4 class=\"inlineblock\">\n\t\t\t{{ t('systemtags', 'System tag management') }}\n\t\t</h4>\n\n\t\t<p class=\"settings-hint\">\n\t\t\t{{ t('systemtags', 'If enabled, only administrators can create and edit tags. Accounts can still assign and remove them from files.') }}\n\t\t</p>\n\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-model=\"systemTagsCreationRestrictedToAdmin\"\n\t\t\ttype=\"switch\"\n\t\t\t@update:modelValue=\"updateSystemTagsDefault\">\n\t\t\t{{ t('systemtags', 'Restrict tag creation and editing to administrators') }}\n\t\t</NcCheckboxRadioSwitch>\n\t</div>\n</template>\n","<!--\n  - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { TagWithId } from '../types.ts'\n\nimport { showError } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport { onBeforeMount, ref } from 'vue'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport SystemTagForm from '../components/SystemTagForm.vue'\nimport SystemTagsCreationControl from '../components/SystemTagsCreationControl.vue'\nimport logger from '../logger.ts'\nimport { fetchTags } from '../services/api.ts'\n\nconst loadingTags = ref(false)\nconst tags = ref<TagWithId[]>([])\n\nonBeforeMount(async () => {\n\tloadingTags.value = true\n\ttry {\n\t\ttags.value = await fetchTags()\n\t} catch (error) {\n\t\tshowError(t('systemtags', 'Failed to load tags'))\n\t\tlogger.error('Failed to load tags', { error })\n\t}\n\tloadingTags.value = false\n})\n\n/**\n * Handle tag creation\n *\n * @param tag - The created tag\n */\nfunction handleCreate(tag: TagWithId) {\n\ttags.value.unshift(tag)\n}\n\n/**\n * Handle tag update\n *\n * @param tag - The updated tag\n */\nfunction handleUpdate(tag: TagWithId) {\n\tconst tagIndex = tags.value.findIndex((currTag) => currTag.id === tag.id)\n\ttags.value.splice(tagIndex, 1)\n\ttags.value.unshift(tag)\n}\n\n/**\n * Handle tag deletion\n *\n * @param tag - The deleted tag\n */\nfunction handleDelete(tag: TagWithId) {\n\tconst tagIndex = tags.value.findIndex((currTag) => currTag.id === tag.id)\n\ttags.value.splice(tagIndex, 1)\n}\n</script>\n\n<template>\n\t<NcSettingsSection\n\t\t:name=\"t('systemtags', 'Collaborative tags')\"\n\t\t:description=\"t('systemtags', 'Collaborative tags are available for all users. Restricted tags are visible to users but cannot be assigned by them. Invisible tags are for internal use, since users cannot see or assign them.')\">\n\t\t<SystemTagsCreationControl />\n\t\t<NcLoadingIcon\n\t\t\tv-if=\"loadingTags\"\n\t\t\t:name=\"t('systemtags', 'Loading collaborative tags …')\"\n\t\t\t:size=\"32\" />\n\t\t<SystemTagForm\n\t\t\tv-else\n\t\t\t:tags=\"tags\"\n\t\t\t@tag:created=\"handleCreate\"\n\t\t\t@tag:updated=\"handleUpdate\"\n\t\t\t@tag:deleted=\"handleDelete\" />\n\t</NcSettingsSection>\n</template>\n","/*!\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport SystemTagsSection from './views/SystemTagsSection.vue'\n\nconst app = createApp(SystemTagsSection)\napp.mount('#vue-admin-systemtags')\n"],"names":["props","__props","emit","__emit","tagLevelOptions","t","tagNameInputElement","useTemplateRef","loading","ref","errorMessage","tagName","tagLevel","selectedTag","watch","tag","getTagLevel","isCreating","computed","isCreateDisabled","isUpdateDisabled","isResetDisabled","userVisible","userAssignable","tagProperties","onSelectTag","tagId","search","handleSubmit","create","update","defaultBaseTag","id","createTag","createdTag","showSuccess","reset","updateTag","handleDelete","deleteTag","_createElementBlock","_createElementVNode","_hoisted_2","_toDisplayString","_unref","_hoisted_3","_hoisted_4","_createVNode","NcSelectTags","_hoisted_5","_hoisted_6","NcTextField","$event","_hoisted_7","_hoisted_8","NcSelect","level","_hoisted_9","_createBlock","NcButton","_Fragment","NcLoadingIcon","systemTagsCreationRestrictedToAdmin","loadState","updateSystemTagsDefault","isRestricted","responseData","updateSystemTagsAdminRestriction","logger","handleResponse","e","status","error","showError","_openBlock","_hoisted_1","NcCheckboxRadioSwitch","loadingTags","tags","onBeforeMount","fetchTags","handleCreate","handleUpdate","tagIndex","currTag","NcSettingsSection","SystemTagsCreationControl","SystemTagForm","app","createApp","SystemTagsSection"],"mappings":"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"}