mirror of
https://github.com/nextcloud/server.git
synced 2026-04-26 00:27:49 -04:00
1 line
No EOL
9.5 KiB
Text
1 line
No EOL
9.5 KiB
Text
{"version":3,"file":"ProfilesCustomPicker-D0VTmaly.chunk.mjs","sources":["../build/frontend/apps/profile/src/components/ProfilesCustomPicker.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"profile-picker\">\n\t\t<div class=\"profile-picker__heading\">\n\t\t\t<h2>\n\t\t\t\t{{ t('profile', 'Profile picker') }}\n\t\t\t</h2>\n\t\t\t<div class=\"input-wrapper\">\n\t\t\t\t<NcSelect\n\t\t\t\t\tref=\"profiles-search-input\"\n\t\t\t\t\tv-model=\"selectedProfile\"\n\t\t\t\t\tinputId=\"profiles-search\"\n\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t:filterable=\"false\"\n\t\t\t\t\t:placeholder=\"t('profile', 'Search for a user profile')\"\n\t\t\t\t\t:clearSearchOnBlur=\"() => false\"\n\t\t\t\t\t:multiple=\"false\"\n\t\t\t\t\t:options=\"options\"\n\t\t\t\t\tlabel=\"displayName\"\n\t\t\t\t\t@search=\"searchForProfile\"\n\t\t\t\t\t@option:selecting=\"resolveResult\">\n\t\t\t\t\t<template #no-options=\"{ search }\">\n\t\t\t\t\t\t{{ search ? noResultText : t('profile', 'Search for a user profile. Start typing') }}\n\t\t\t\t\t</template>\n\t\t\t\t</NcSelect>\n\t\t\t</div>\n\t\t\t<NcEmptyContent class=\"empty-content\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<AccountOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcEmptyContent>\n\t\t</div>\n\t\t<div class=\"profile-picker__footer\">\n\t\t\t<NcButton\n\t\t\t\tv-if=\"selectedProfile !== null\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:aria-label=\"t('profile', 'Insert selected user profile link')\"\n\t\t\t\t:disabled=\"loading || selectedProfile === null\"\n\t\t\t\t@click=\"submit\">\n\t\t\t\t{{ t('profile', 'Insert') }}\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ArrowRightIcon />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl, generateUrl } from '@nextcloud/router'\nimport debounce from 'debounce'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'\nimport NcSelect from '@nextcloud/vue/components/NcSelect'\nimport AccountOutline from 'vue-material-design-icons/AccountOutline.vue'\nimport ArrowRightIcon from 'vue-material-design-icons/ArrowRight.vue'\nimport { logger } from '../services/logger.ts'\n\nexport default {\n\tname: 'ProfilesCustomPicker',\n\n\tcomponents: {\n\t\tNcSelect,\n\t\tNcButton,\n\t\tNcEmptyContent,\n\t\tAccountOutline,\n\t\tArrowRightIcon,\n\t},\n\n\tprops: {\n\t\tproviderId: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\taccessible: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['submit'],\n\n\tdata() {\n\t\treturn {\n\t\t\tsearchQuery: '',\n\t\t\tloading: false,\n\t\t\tresultUrl: null,\n\t\t\treference: null,\n\t\t\tprofiles: [],\n\t\t\tselectedProfile: null,\n\t\t\tabortController: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\toptions() {\n\t\t\tif (this.searchQuery !== '') {\n\t\t\t\treturn this.profiles\n\t\t\t}\n\t\t\treturn []\n\t\t},\n\n\t\tnoResultText() {\n\t\t\treturn this.loading ? t('profile', 'Searching …') : t('profile', 'Not found')\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.focusOnInput()\n\t},\n\n\tmethods: {\n\t\tfocusOnInput() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs['profiles-search-input'].$el.getElementsByTagName('input')[0]?.focus()\n\t\t\t})\n\t\t},\n\n\t\tasync searchForProfile(query) {\n\t\t\tif (query.trim() === '' || query.trim().length < 3) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.searchQuery = query.trim()\n\t\t\tthis.loading = true\n\t\t\tawait this.debounceFindProfiles(query)\n\t\t},\n\n\t\tdebounceFindProfiles: debounce(function(...args) {\n\t\t\tthis.findProfiles(...args)\n\t\t}, 300),\n\n\t\tasync findProfiles(query) {\n\t\t\tconst url = generateOcsUrl('core/autocomplete/get?search={searchQuery}&itemType=%20&itemId=%20&shareTypes[]=0&limit=20', { searchQuery: query })\n\t\t\ttry {\n\t\t\t\tconst res = await axios.get(url)\n\t\t\t\tthis.profiles = res.data.ocs.data.map((userAutocomplete) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuser: userAutocomplete.id,\n\t\t\t\t\t\tdisplayName: userAutocomplete.label,\n\t\t\t\t\t\ticon: userAutocomplete.icon,\n\t\t\t\t\t\tsubtitle: userAutocomplete.subline,\n\t\t\t\t\t\tisNoUser: userAutocomplete.source.startsWith('users'),\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('profile_picker: error while searching for users', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tsubmit() {\n\t\t\tthis.resultUrl = window.location.origin + generateUrl(`/u/${this.selectedProfile.user.trim().toLowerCase()}`, null, { noRewrite: true })\n\t\t\tthis.$emit('submit', this.resultUrl)\n\t\t\tthis.$el.dispatchEvent(new CustomEvent('submit', { detail: this.resultUrl, bubbles: true }))\n\t\t},\n\n\t\tasync resolveResult(selectedItem) {\n\t\t\tthis.loading = true\n\t\t\tthis.abortController = new AbortController()\n\t\t\tthis.selectedProfile = selectedItem\n\t\t\tthis.resultUrl = window.location.origin + generateUrl(`/u/${this.selectedProfile.user.trim().toLowerCase()}`, null, { noRewrite: true })\n\t\t\ttry {\n\t\t\t\tconst res = await axios.get(generateOcsUrl('references/resolve', 2) + '?reference=' + encodeURIComponent(this.resultUrl), {\n\t\t\t\t\tsignal: this.abortController.signal,\n\t\t\t\t})\n\t\t\t\tthis.reference = res.data.ocs.data.references[this.resultUrl]\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('profile_picker: error resolving the user profile link', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tclearSelection() {\n\t\t\tthis.selectedProfile = null\n\t\t\tthis.resultUrl = null\n\t\t\tthis.reference = null\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.profile-picker {\n\twidth: 100%;\n\tmin-height: 450px;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 12px 16px 16px 16px;\n\n\t&__heading, .select {\n\t\twidth: 100%;\n\n\t\th2 {\n\t\t\ttext-align: center;\n\t\t}\n\t}\n\n\t&__footer {\n\t\twidth: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: end;\n\t\tmargin-top: 12px;\n\n\t\t> * {\n\t\t\tmargin-left: 4px;\n\t\t}\n\t}\n}\n</style>\n"],"names":["_sfc_main","NcSelect","NcButton","NcEmptyContent","AccountOutline","ArrowRightIcon","query","debounce","args","url","generateOcsUrl","res","axios","userAutocomplete","error","logger","generateUrl","selectedItem","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_createElementVNode","_ctx","_createVNode","_component_NcSelect","$data","$event","$options","_withCtx","search","_component_NcEmptyContent","_component_AccountOutline","_createBlock","_component_NcButton","_component_ArrowRightIcon","_createTextVNode","_toDisplayString"],"mappings":"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"} |