@conduction/nextcloud-vue 2.101.0 → 2.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +22 -0
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +8 -6
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +29 -4
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js +9 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +73 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +99 -64
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +46 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +37 -2
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +49 -6
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue.js +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +113 -20
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +387 -359
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +84 -4
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +8 -6
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useNamedSource.js +26 -2
- package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
- package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue.js +1 -1
- package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue2.js +25 -1
- package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +10 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue.js +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +106 -4
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +70 -25
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +97 -3
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +46 -2
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue.js +9 -0
- package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue.js.map +1 -0
- package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue2.js +165 -0
- package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue2.js.map +1 -0
- package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue3.js +85 -0
- package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue3.js.map +1 -0
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue.js +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +54 -6
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +3 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +8 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +2 -23
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue.js +1 -1
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js +19 -0
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js +1 -1
- package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js.map +1 -1
- package/dist/esm/composables/indexSources.js +9 -0
- package/dist/esm/composables/indexSources.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +5 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +5 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/mixins/pageViews.js +8 -1
- package/dist/esm/mixins/pageViews.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +593 -459
- package/dist/esm/utils/builtInFormatters.js +24 -4
- package/dist/esm/utils/builtInFormatters.js.map +1 -1
- package/dist/esm/utils/rowClassRules.js +43 -0
- package/dist/esm/utils/rowClassRules.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/visibleWhen.js +32 -4
- package/dist/esm/utils/visibleWhen.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +10093 -8858
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +593 -459
- package/l10n/en.json +5 -1
- package/l10n/nl.json +5 -1
- package/package.json +1 -1
- package/src/components/CnActionsBar/CnActionsBar.md +1 -0
- package/src/components/CnActionsBar/CnActionsBar.vue +31 -4
- package/src/components/CnChartWidget/CnChartWidget.md +3 -2
- package/src/components/CnChartWidget/CnChartWidget.vue +42 -4
- package/src/components/CnConversationThread/CnConversationThread.md +17 -0
- package/src/components/CnConversationThread/CnConversationThread.vue +113 -8
- package/src/components/CnConversationThread/CnConversationWidget.vue +60 -1
- package/src/components/CnDashboardPage/CnDashboardPage.md +4 -1
- package/src/components/CnDashboardPage/CnDashboardPage.vue +50 -7
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnFormDialog/CnFormDialog.md +1 -1
- package/src/components/CnFormDialog/CnFormDialog.vue +127 -0
- package/src/components/CnIndexPage/CnIndexPage.md +15 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +92 -9
- package/src/components/CnIndexPage/useNamedSource.js +26 -2
- package/src/components/CnMenuWidget/CnMenuWidget.vue +25 -1
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +10 -1
- package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +1 -0
- package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +159 -5
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +134 -2
- package/src/components/CnSearchSelect/CnSearchSelect.vue +283 -0
- package/src/components/CnSearchSelect/index.js +12 -0
- package/src/components/CnSetupWizard/CnSetupWizard.vue +56 -6
- package/src/components/CnTabsWidget/CnTabsWidget.vue +8 -1
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +2 -23
- package/src/components/CnWizardDialog/CnWizardDialog.vue +20 -1
- package/src/components/index.js +1 -0
- package/src/composables/indexSources.js +9 -0
- package/src/css/dialog.css +5 -3
- package/src/css/look-board-index.css +10 -0
- package/src/index.js +1 -0
- package/src/mixins/pageViews.js +8 -1
- package/src/schemas/app-manifest-v2.schema.json +107 -8
- package/src/utils/builtInFormatters.js +24 -4
- package/src/utils/rowClassRules.js +39 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/visibleWhen.js +32 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnSearchSelect.vue2.js","sources":["../../../../src/components/CnSearchSelect/CnSearchSelect.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-search-select\" :class=\"{ 'cn-search-select--label-outside': labelOutside }\" data-testid=\"cn-search-select\">\n\t\t<NcSelect\n\t\t\t:inputId=\"inputId\"\n\t\t\t:inputLabel=\"inputLabel\"\n\t\t\t:labelOutside=\"labelOutside\"\n\t\t\t:modelValue=\"selectedOption\"\n\t\t\t:options=\"options\"\n\t\t\t:loading=\"loading\"\n\t\t\t:clearable=\"clearable\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:placeholder=\"resolvedPlaceholder\"\n\t\t\t:filterable=\"filterable\"\n\t\t\tlabel=\"label\"\n\t\t\t@search=\"onSearch\"\n\t\t\t@update:modelValue=\"onInput\">\n\t\t\t<template #option=\"option\">\n\t\t\t\t<span class=\"cn-search-select__row\" data-testid=\"cn-search-select-row\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"option.avatar || option.icon\"\n\t\t\t\t\t\tclass=\"cn-search-select__lead\"\n\t\t\t\t\t\t:class=\"{ 'cn-search-select__lead--avatar': option.avatar && !option.icon }\"\n\t\t\t\t\t\taria-hidden=\"true\">\n\t\t\t\t\t\t<CnIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"18\" />\n\t\t\t\t\t\t<template v-else>{{ initialsOf(option) }}</template>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\"cn-search-select__text\">\n\t\t\t\t\t\t<span class=\"cn-search-select__name\">{{ option.label }}</span>\n\t\t\t\t\t\t<span v-if=\"option.secondary\" class=\"cn-search-select__secondary\">{{ option.secondary }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<Check\n\t\t\t\t\t\tv-if=\"isSelected(option)\"\n\t\t\t\t\t\tclass=\"cn-search-select__check\"\n\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\tdata-testid=\"cn-search-select-check\" />\n\t\t\t\t</span>\n\t\t\t</template>\n\t\t</NcSelect>\n\t\t<Magnify class=\"cn-search-select__magnifier\" :size=\"18\" aria-hidden=\"true\" />\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcSelect } from '@nextcloud/vue'\nimport Check from 'vue-material-design-icons/Check.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport CnIcon from '../CnIcon/CnIcon.vue'\nimport { initialsOf } from '../../utils/initials.js'\n\n/**\n * CnSearchSelect — a single picker drawn as a search field: a magnifier\n * instead of the chevron, and results as rows with an icon or initials, a\n * name, a secondary line and a check on the chosen one (boards DqOverdragen\n * \"Nieuw team\", DqNieuweZaak \"Aanvrager\").\n *\n * Each option is `{ id, label, secondary?, icon?, avatar? }`: `icon` names a\n * CnIcon, `avatar: true` draws the label's initials in a circle. The value is\n * the option's `id` (or `value`); `update:modelValue` emits that id, or null\n * when cleared. Searching is the host's: listen to `search` and pass new\n * `options`, with `filterable: false` when the host already filtered them.\n *\n * ```vue\n * <CnSearchSelect\n * v-model=\"team\"\n * inputLabel=\"Nieuw team\"\n * :options=\"[{ id: 'legal', label: 'Juridische zaken', secondary: '6 leden · bezwaar, beroep en Woo-advies', avatar: true }]\" />\n * ```\n */\nexport default {\n\tname: 'CnSearchSelect',\n\n\tcomponents: { Check, CnIcon, Magnify, NcSelect },\n\n\tprops: {\n\t\t/** The chosen option's id, or the option itself. */\n\t\tmodelValue: {\n\t\t\ttype: [String, Number, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The options: `{ id, label, secondary?, icon?, avatar? }`.\n\t\t *\n\t\t * @type {Array<{id: (string|number), label: string, secondary?: string, icon?: string, avatar?: boolean}>}\n\t\t */\n\t\toptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The field's label. */\n\t\tinputLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Draw the label above the field instead of inside it. */\n\t\tlabelOutside: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** The input's id. */\n\t\tinputId: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\n\t\t/** Placeholder text; defaults to \"Search…\". */\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show the loading spinner. */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Offer a clear button. */\n\t\tclearable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Disable the field. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Filter the options on the typed text; false when the host searches. */\n\t\tfilterable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'search'],\n\n\tcomputed: {\n\t\t/**\n\t\t * The option matching `modelValue`, or a bare one carrying it.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tselectedOption() {\n\t\t\tconst value = this.modelValue\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof value === 'object') {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\treturn this.options.find((o) => this.idOf(o) === String(value)) || { id: value, label: String(value) }\n\t\t},\n\n\t\t/** @return {string} The placeholder. */\n\t\tresolvedPlaceholder() {\n\t\t\treturn this.placeholder || t('nextcloud-vue', 'Search…')\n\t\t},\n\t},\n\n\tmethods: {\n\t\tinitialsOf(option) {\n\t\t\treturn initialsOf(option.label || '')\n\t\t},\n\n\t\t/**\n\t\t * @param {object} option An option.\n\t\t * @return {string} Its id as a string, '' without one.\n\t\t */\n\t\tidOf(option) {\n\t\t\tconst id = option && (option.id ?? option.value)\n\t\t\treturn id === null || id === undefined ? '' : String(id)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} option An option.\n\t\t * @return {boolean} Whether it is the chosen one.\n\t\t */\n\t\tisSelected(option) {\n\t\t\treturn this.selectedOption !== null && this.idOf(option) !== '' && this.idOf(option) === this.idOf(this.selectedOption)\n\t\t},\n\n\t\t/**\n\t\t * @param {object|null} option The picked option.\n\t\t */\n\t\tonInput(option) {\n\t\t\tconst id = option ? (option.id ?? option.value ?? null) : null\n\t\t\t/** @event update:modelValue The picked option's id, or null when cleared. */\n\t\t\tthis.$emit('update:modelValue', id)\n\t\t},\n\n\t\t/**\n\t\t * @param {string} query The typed text.\n\t\t */\n\t\tonSearch(query) {\n\t\t\t/** @event search The typed text, for a host that searches itself. */\n\t\t\tthis.$emit('search', query)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-search-select {\n\tposition: relative;\n}\n\n/* The magnifier sits where the chevron was: in the field, at its end. */\n.cn-search-select__magnifier {\n\tposition: absolute;\n\tinset-inline-end: 12px;\n\tbottom: 0;\n\theight: var(--default-clickable-area, 34px);\n\tdisplay: flex;\n\talign-items: center;\n\tcolor: var(--color-text-maxcontrast);\n\tpointer-events: none;\n}\n\n.cn-search-select :deep(.vs__open-indicator),\n.cn-search-select :deep(.vs__open-indicator-button) {\n\tdisplay: none;\n}\n\n.cn-search-select :deep(.vs__actions) {\n\tpadding-inline-end: 36px;\n}\n\n.cn-search-select__row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\twidth: 100%;\n\tmin-width: 0;\n\tpadding: 4px 0;\n}\n\n.cn-search-select__lead {\n\tflex: 0 0 32px;\n\twidth: 32px;\n\theight: 32px;\n\tborder-radius: 50%;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--color-primary-element-light);\n\tcolor: var(--color-primary-element-light-text);\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-search-select__text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 auto;\n\tmin-width: 0;\n}\n\n.cn-search-select__name {\n\tfont-weight: 600;\n\toverflow-wrap: anywhere;\n}\n\n.cn-search-select__secondary {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow-wrap: anywhere;\n}\n\n.cn-search-select__check {\n\tflex: 0 0 auto;\n\tcolor: var(--color-primary-element);\n}\n</style>\n"],"names":["CnIcon","t"],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, createElementVNode, createBlock, Fragment, createTextVNode, toDisplayString, createCommentVNode } from 'vue';
|
|
2
|
+
|
|
3
|
+
const _hoisted_1 = {
|
|
4
|
+
class: "cn-search-select__row",
|
|
5
|
+
"data-testid": "cn-search-select-row"
|
|
6
|
+
};
|
|
7
|
+
const _hoisted_2 = { class: "cn-search-select__text" };
|
|
8
|
+
const _hoisted_3 = { class: "cn-search-select__name" };
|
|
9
|
+
const _hoisted_4 = {
|
|
10
|
+
key: 0,
|
|
11
|
+
class: "cn-search-select__secondary"
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
15
|
+
const _component_CnIcon = resolveComponent("CnIcon");
|
|
16
|
+
const _component_Check = resolveComponent("Check");
|
|
17
|
+
const _component_NcSelect = resolveComponent("NcSelect");
|
|
18
|
+
const _component_Magnify = resolveComponent("Magnify");
|
|
19
|
+
|
|
20
|
+
return (openBlock(), createElementBlock("div", {
|
|
21
|
+
class: normalizeClass(["cn-search-select", { 'cn-search-select--label-outside': $props.labelOutside }]),
|
|
22
|
+
"data-testid": "cn-search-select"
|
|
23
|
+
}, [
|
|
24
|
+
createVNode(_component_NcSelect, {
|
|
25
|
+
inputId: $props.inputId,
|
|
26
|
+
inputLabel: $props.inputLabel,
|
|
27
|
+
labelOutside: $props.labelOutside,
|
|
28
|
+
modelValue: $options.selectedOption,
|
|
29
|
+
options: $props.options,
|
|
30
|
+
loading: $props.loading,
|
|
31
|
+
clearable: $props.clearable,
|
|
32
|
+
disabled: $props.disabled,
|
|
33
|
+
placeholder: $options.resolvedPlaceholder,
|
|
34
|
+
filterable: $props.filterable,
|
|
35
|
+
label: "label",
|
|
36
|
+
onSearch: $options.onSearch,
|
|
37
|
+
"onUpdate:modelValue": $options.onInput
|
|
38
|
+
}, {
|
|
39
|
+
option: withCtx((option) => [
|
|
40
|
+
createElementVNode("span", _hoisted_1, [
|
|
41
|
+
(option.avatar || option.icon)
|
|
42
|
+
? (openBlock(), createElementBlock("span", {
|
|
43
|
+
key: 0,
|
|
44
|
+
class: normalizeClass(["cn-search-select__lead", { 'cn-search-select__lead--avatar': option.avatar && !option.icon }]),
|
|
45
|
+
"aria-hidden": "true"
|
|
46
|
+
}, [
|
|
47
|
+
(option.icon)
|
|
48
|
+
? (openBlock(), createBlock(_component_CnIcon, {
|
|
49
|
+
key: 0,
|
|
50
|
+
name: option.icon,
|
|
51
|
+
size: 18
|
|
52
|
+
}, null, 8 /* PROPS */, ["name"]))
|
|
53
|
+
: (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
54
|
+
createTextVNode(toDisplayString($options.initialsOf(option)), 1 /* TEXT */)
|
|
55
|
+
], 64 /* STABLE_FRAGMENT */))
|
|
56
|
+
], 2 /* CLASS */))
|
|
57
|
+
: createCommentVNode("v-if", true),
|
|
58
|
+
createElementVNode("span", _hoisted_2, [
|
|
59
|
+
createElementVNode("span", _hoisted_3, toDisplayString(option.label), 1 /* TEXT */),
|
|
60
|
+
(option.secondary)
|
|
61
|
+
? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(option.secondary), 1 /* TEXT */))
|
|
62
|
+
: createCommentVNode("v-if", true)
|
|
63
|
+
]),
|
|
64
|
+
($options.isSelected(option))
|
|
65
|
+
? (openBlock(), createBlock(_component_Check, {
|
|
66
|
+
key: 1,
|
|
67
|
+
class: "cn-search-select__check",
|
|
68
|
+
size: 18,
|
|
69
|
+
"data-testid": "cn-search-select-check"
|
|
70
|
+
}))
|
|
71
|
+
: createCommentVNode("v-if", true)
|
|
72
|
+
])
|
|
73
|
+
]),
|
|
74
|
+
_: 1 /* STABLE */
|
|
75
|
+
}, 8 /* PROPS */, ["inputId", "inputLabel", "labelOutside", "modelValue", "options", "loading", "clearable", "disabled", "placeholder", "filterable", "onSearch", "onUpdate:modelValue"]),
|
|
76
|
+
createVNode(_component_Magnify, {
|
|
77
|
+
class: "cn-search-select__magnifier",
|
|
78
|
+
size: 18,
|
|
79
|
+
"aria-hidden": "true"
|
|
80
|
+
})
|
|
81
|
+
], 2 /* CLASS */))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { render };
|
|
85
|
+
//# sourceMappingURL=CnSearchSelect.vue3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnSearchSelect.vue3.js","sources":["../../../../src/components/CnSearchSelect/CnSearchSelect.vue?vue&type=template&id=6cd354af&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-search-select\" :class=\"{ 'cn-search-select--label-outside': labelOutside }\" data-testid=\"cn-search-select\">\n\t\t<NcSelect\n\t\t\t:inputId=\"inputId\"\n\t\t\t:inputLabel=\"inputLabel\"\n\t\t\t:labelOutside=\"labelOutside\"\n\t\t\t:modelValue=\"selectedOption\"\n\t\t\t:options=\"options\"\n\t\t\t:loading=\"loading\"\n\t\t\t:clearable=\"clearable\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:placeholder=\"resolvedPlaceholder\"\n\t\t\t:filterable=\"filterable\"\n\t\t\tlabel=\"label\"\n\t\t\t@search=\"onSearch\"\n\t\t\t@update:modelValue=\"onInput\">\n\t\t\t<template #option=\"option\">\n\t\t\t\t<span class=\"cn-search-select__row\" data-testid=\"cn-search-select-row\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"option.avatar || option.icon\"\n\t\t\t\t\t\tclass=\"cn-search-select__lead\"\n\t\t\t\t\t\t:class=\"{ 'cn-search-select__lead--avatar': option.avatar && !option.icon }\"\n\t\t\t\t\t\taria-hidden=\"true\">\n\t\t\t\t\t\t<CnIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"18\" />\n\t\t\t\t\t\t<template v-else>{{ initialsOf(option) }}</template>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\"cn-search-select__text\">\n\t\t\t\t\t\t<span class=\"cn-search-select__name\">{{ option.label }}</span>\n\t\t\t\t\t\t<span v-if=\"option.secondary\" class=\"cn-search-select__secondary\">{{ option.secondary }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<Check\n\t\t\t\t\t\tv-if=\"isSelected(option)\"\n\t\t\t\t\t\tclass=\"cn-search-select__check\"\n\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\tdata-testid=\"cn-search-select-check\" />\n\t\t\t\t</span>\n\t\t\t</template>\n\t\t</NcSelect>\n\t\t<Magnify class=\"cn-search-select__magnifier\" :size=\"18\" aria-hidden=\"true\" />\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcSelect } from '@nextcloud/vue'\nimport Check from 'vue-material-design-icons/Check.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport CnIcon from '../CnIcon/CnIcon.vue'\nimport { initialsOf } from '../../utils/initials.js'\n\n/**\n * CnSearchSelect — a single picker drawn as a search field: a magnifier\n * instead of the chevron, and results as rows with an icon or initials, a\n * name, a secondary line and a check on the chosen one (boards DqOverdragen\n * \"Nieuw team\", DqNieuweZaak \"Aanvrager\").\n *\n * Each option is `{ id, label, secondary?, icon?, avatar? }`: `icon` names a\n * CnIcon, `avatar: true` draws the label's initials in a circle. The value is\n * the option's `id` (or `value`); `update:modelValue` emits that id, or null\n * when cleared. Searching is the host's: listen to `search` and pass new\n * `options`, with `filterable: false` when the host already filtered them.\n *\n * ```vue\n * <CnSearchSelect\n * v-model=\"team\"\n * inputLabel=\"Nieuw team\"\n * :options=\"[{ id: 'legal', label: 'Juridische zaken', secondary: '6 leden · bezwaar, beroep en Woo-advies', avatar: true }]\" />\n * ```\n */\nexport default {\n\tname: 'CnSearchSelect',\n\n\tcomponents: { Check, CnIcon, Magnify, NcSelect },\n\n\tprops: {\n\t\t/** The chosen option's id, or the option itself. */\n\t\tmodelValue: {\n\t\t\ttype: [String, Number, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The options: `{ id, label, secondary?, icon?, avatar? }`.\n\t\t *\n\t\t * @type {Array<{id: (string|number), label: string, secondary?: string, icon?: string, avatar?: boolean}>}\n\t\t */\n\t\toptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The field's label. */\n\t\tinputLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Draw the label above the field instead of inside it. */\n\t\tlabelOutside: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** The input's id. */\n\t\tinputId: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\n\t\t/** Placeholder text; defaults to \"Search…\". */\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show the loading spinner. */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Offer a clear button. */\n\t\tclearable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Disable the field. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Filter the options on the typed text; false when the host searches. */\n\t\tfilterable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'search'],\n\n\tcomputed: {\n\t\t/**\n\t\t * The option matching `modelValue`, or a bare one carrying it.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tselectedOption() {\n\t\t\tconst value = this.modelValue\n\t\t\tif (value === null || value === undefined || value === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof value === 'object') {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\treturn this.options.find((o) => this.idOf(o) === String(value)) || { id: value, label: String(value) }\n\t\t},\n\n\t\t/** @return {string} The placeholder. */\n\t\tresolvedPlaceholder() {\n\t\t\treturn this.placeholder || t('nextcloud-vue', 'Search…')\n\t\t},\n\t},\n\n\tmethods: {\n\t\tinitialsOf(option) {\n\t\t\treturn initialsOf(option.label || '')\n\t\t},\n\n\t\t/**\n\t\t * @param {object} option An option.\n\t\t * @return {string} Its id as a string, '' without one.\n\t\t */\n\t\tidOf(option) {\n\t\t\tconst id = option && (option.id ?? option.value)\n\t\t\treturn id === null || id === undefined ? '' : String(id)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} option An option.\n\t\t * @return {boolean} Whether it is the chosen one.\n\t\t */\n\t\tisSelected(option) {\n\t\t\treturn this.selectedOption !== null && this.idOf(option) !== '' && this.idOf(option) === this.idOf(this.selectedOption)\n\t\t},\n\n\t\t/**\n\t\t * @param {object|null} option The picked option.\n\t\t */\n\t\tonInput(option) {\n\t\t\tconst id = option ? (option.id ?? option.value ?? null) : null\n\t\t\t/** @event update:modelValue The picked option's id, or null when cleared. */\n\t\t\tthis.$emit('update:modelValue', id)\n\t\t},\n\n\t\t/**\n\t\t * @param {string} query The typed text.\n\t\t */\n\t\tonSearch(query) {\n\t\t\t/** @event search The typed text, for a host that searches itself. */\n\t\t\tthis.$emit('search', query)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-search-select {\n\tposition: relative;\n}\n\n/* The magnifier sits where the chevron was: in the field, at its end. */\n.cn-search-select__magnifier {\n\tposition: absolute;\n\tinset-inline-end: 12px;\n\tbottom: 0;\n\theight: var(--default-clickable-area, 34px);\n\tdisplay: flex;\n\talign-items: center;\n\tcolor: var(--color-text-maxcontrast);\n\tpointer-events: none;\n}\n\n.cn-search-select :deep(.vs__open-indicator),\n.cn-search-select :deep(.vs__open-indicator-button) {\n\tdisplay: none;\n}\n\n.cn-search-select :deep(.vs__actions) {\n\tpadding-inline-end: 36px;\n}\n\n.cn-search-select__row {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\twidth: 100%;\n\tmin-width: 0;\n\tpadding: 4px 0;\n}\n\n.cn-search-select__lead {\n\tflex: 0 0 32px;\n\twidth: 32px;\n\theight: 32px;\n\tborder-radius: 50%;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: var(--color-primary-element-light);\n\tcolor: var(--color-primary-element-light-text);\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-search-select__text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 auto;\n\tmin-width: 0;\n}\n\n.cn-search-select__name {\n\tfont-weight: 600;\n\toverflow-wrap: anywhere;\n}\n\n.cn-search-select__secondary {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow-wrap: anywhere;\n}\n\n.cn-search-select__check {\n\tflex: 0 0 auto;\n\tcolor: var(--color-primary-element);\n}\n</style>\n"],"names":["_normalizeClass","_withCtx","_createElementVNode","_createElementBlock","_createBlock","_Fragment","_createTextVNode","_toDisplayString","_openBlock"],"mappings":";;;AAyBU,EAAA,KAAM,EAAA,uBAAuB;AAAC,EAAA,aAAW,EAAC,sBAAsB;;AAShE,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,wBAAA,GAAA;AACE,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,wBAAY,GAAA;;;AACM,EAAA,KAAA,EAAA,6BAAA;;;;;;;;;;IA3B9B,KAAK,EAAAA,cAAA,CAAA,CAAC,kBAAkB,EAAA,EAAA,iCAAA,EAAA,MAAA,CAAA,YAAA,EAAA,CAAA,CAAA;AAAA,IAAA,aAAA,EAAA,kBAAA;;;AAE1B,MAAA,OAAO,EAAE,MAAO,CAAA,OAAA;AAChB,MAAA,UAAU,EAAE,MAAI,CAAA,UAAA;AAChB,MAAA,YAAY,EAAE,MAAM,CAAA,YAAA;AACpB,MAAA,UAAU,EAAE,QAAM,CAAA,cAAA;AAClB,MAAA,OAAO,EAAE,MAAO,CAAA,OAAA;AAChB,MAAA,OAAO,EAAE,MAAO,CAAA,OAAA;AAChB,MAAA,SAAS,EAAE,MAAA,CAAA,SAAA;AACX,MAAA,QAAQ,EAAE,MAAM,CAAA,QAAA;AAChB,MAAA,WAAW,EAAE,QAAc,CAAA,mBAAA;AAC3B,MAAA,UAAU,EAAE,MAAU,CAAA,UAAA;AACtB,MAAA,KAAI,EAAA,OAAQ;cACP,EAAA,QAAA,CAAA,QAAA;AACH,MAAA,qBAAe,EAAE,QAAO,CAAA,OAAA;;MAChB,MAAM,EAAAC,OAAA,CACd,CAkBA,MAnBsB,KAAA;AACtB,QAAAC,kBAAA,CAkBA,QAlBA,UAkBA,EAAA;AAhBM,UAAA,CAAA,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI;4BADlCC,kBAOK,CAAA,MAAA,EAAA;;gBALL,KAAK,EAAAH,cAAA,CAAA,CAAC,wBAAwB,EACzB,EAAA,gCAAA,EAAA,MAAA,CAAA,MAAA,IAAA,CAAA,MAAA,CAAA,IAAA,EAAA,CAAA,CAAA;AACL,gBAAA,aAAW,EAAC,MAAM;;AACJ,gBAAA,CAAA,MAAM,CAAC,IAAI;kCAAzBI,WAA4D,CAAA,iBAAA,EAAA;;sBAAhC,IAAI,EAAE,MAAM,CAAC,IAAI;AAAG,sBAAA,IAAK,EAAC,EAAE;;kCACxDD,kBAAoD,CAAAE,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;AAAhC,sBAAAC,eAAA,CAAAC,eAAA,CAAA,QAAA,CAAA,UAAU,CAAC,MAAM,CAAA,CAAA,EAAA,CAAA,YAAA;;;;AAEtC,UAAAL,kBAAA,CAGO,QAHP,UAGO,EAAA;AAFN,YAAAA,kBAAA,CAAwB,MAAxB,EAAA,UAAwB,EAAAK,eAAA,CAAA,MAAA,CAAA,KAAA,CAAA,EAAA,CAAA,YAAA;AACZ,YAAA,CAAA,MAAM,CAAC,SAAS;AAA5B,iBAAAC,SAAA,EAAA,EAAAL,kBAAA,CAA8B,MAA9B,EAAA,UAA8B,EAAAI,eAAA,CAAA,MAAA,CAAA,SAAA,CAAA,EAAA,CAAA,YAAA;;;AAG1B,UAAA,CAAA,QAAA,CAAA,UAAA,CAAA,MAAA,CAAA;4BADJH,WAIuC,CAAA,gBAAA,EAAA;;AAFvC,gBAAA,KAAK,EAAC,yBAAC;AACN,gBAAA,IAAI,EAAC,EAAA;AACN,gBAAA,aAAW,EAAC,wBAAwB;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,7 @@ import script from './CnSetupWizard.vue2.js';
|
|
|
2
2
|
import { render } from './CnSetupWizard.vue3.js';
|
|
3
3
|
|
|
4
4
|
script.render = render;
|
|
5
|
-
script.__scopeId = "data-v-
|
|
5
|
+
script.__scopeId = "data-v-130330d9";
|
|
6
6
|
const __sfc_main = script;
|
|
7
7
|
|
|
8
8
|
export { __sfc_main as default };
|
|
@@ -249,14 +249,16 @@ var script = {
|
|
|
249
249
|
computed: {
|
|
250
250
|
/**
|
|
251
251
|
* The title actually rendered by CnWizardDialog: "Set up {appName}"
|
|
252
|
-
* when a display name was passed
|
|
253
|
-
* resolves to (a caller
|
|
252
|
+
* when a display name was passed (the name through the host's
|
|
253
|
+
* translate), otherwise whatever `dialogTitle` resolves to (a caller
|
|
254
|
+
* override, or its own generic default). In the board look it is the
|
|
255
|
+
* eyebrow's context and the current step's title is the heading.
|
|
254
256
|
*
|
|
255
257
|
* @return {string}
|
|
256
258
|
*/
|
|
257
259
|
resolvedDialogTitle() {
|
|
258
260
|
return this.appName
|
|
259
|
-
? translate('nextcloud-vue', 'Set up {app}', { app: this.appName })
|
|
261
|
+
? translate('nextcloud-vue', 'Set up {app}', { app: this.cnTranslate(this.appName) })
|
|
260
262
|
: this.dialogTitle
|
|
261
263
|
},
|
|
262
264
|
|
|
@@ -512,6 +514,12 @@ var script = {
|
|
|
512
514
|
},
|
|
513
515
|
},
|
|
514
516
|
|
|
517
|
+
created() {
|
|
518
|
+
for (const step of this.setupSteps) {
|
|
519
|
+
this.applyDefault(step);
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
|
|
515
523
|
mounted() {
|
|
516
524
|
// Covers a RESUMED wizard opening straight onto its run-action step
|
|
517
525
|
// (`initialStepId`) — `onStepChange` only fires on later navigation,
|
|
@@ -729,13 +737,14 @@ var script = {
|
|
|
729
737
|
},
|
|
730
738
|
|
|
731
739
|
/**
|
|
732
|
-
* Whether a choice step renders as a card grid
|
|
740
|
+
* Whether a choice step renders as CnChoiceCards (a card grid, or radio
|
|
741
|
+
* rows with `display: "rows"`) rather than a dropdown.
|
|
733
742
|
*
|
|
734
743
|
* @param {object} step The choice step.
|
|
735
|
-
* @return {boolean} True for `display: "cards"`.
|
|
744
|
+
* @return {boolean} True for `display: "cards"` and `display: "rows"`.
|
|
736
745
|
*/
|
|
737
746
|
isCardChoice(step) {
|
|
738
|
-
return step.display === 'cards'
|
|
747
|
+
return step.display === 'cards' || step.display === 'rows'
|
|
739
748
|
},
|
|
740
749
|
|
|
741
750
|
/**
|
|
@@ -839,6 +848,36 @@ var script = {
|
|
|
839
848
|
}
|
|
840
849
|
},
|
|
841
850
|
|
|
851
|
+
/**
|
|
852
|
+
* Preselect a `choice` step's `default` option. Skipped once the user
|
|
853
|
+
* picked here, when a value is already chosen, and for a step the
|
|
854
|
+
* server already completed (its stored value must not be overwritten
|
|
855
|
+
* by a Next). A card step holds the plain value; a dropdown holds the
|
|
856
|
+
* option object, or the value while the options are still loading.
|
|
857
|
+
*
|
|
858
|
+
* @param {object} step The choice step.
|
|
859
|
+
* @return {void}
|
|
860
|
+
*/
|
|
861
|
+
applyDefault(step) {
|
|
862
|
+
if (!step || step.type !== 'choice' || step.default === undefined || step.default === null) {
|
|
863
|
+
return
|
|
864
|
+
}
|
|
865
|
+
if (this.userTouched[step.id] === true || this.hasChoice(step) || this.isServerDone(step.id)) {
|
|
866
|
+
return
|
|
867
|
+
}
|
|
868
|
+
const wanted = step.multiple === true ? [].concat(step.default) : step.default;
|
|
869
|
+
if (this.isCardChoice(step)) {
|
|
870
|
+
this.choiceModel[step.id] = wanted;
|
|
871
|
+
} else {
|
|
872
|
+
const options = this.optionsFor(step);
|
|
873
|
+
const pick = (value) => options.find((o) => o.value === value) || value;
|
|
874
|
+
this.choiceModel[step.id] = Array.isArray(wanted) ? wanted.map(pick) : pick(wanted);
|
|
875
|
+
}
|
|
876
|
+
if (step.configKey) {
|
|
877
|
+
this.choiceValues[step.configKey] = this.scalarChoice(step);
|
|
878
|
+
}
|
|
879
|
+
},
|
|
880
|
+
|
|
842
881
|
/**
|
|
843
882
|
* Auto-fill a `choice` step's suggested default from an earlier choice
|
|
844
883
|
* (its `suggestFrom` configKey → `suggestMap[parentValue]`). No-op once
|
|
@@ -1145,6 +1184,15 @@ var script = {
|
|
|
1145
1184
|
if (step && step.suggestFrom) {
|
|
1146
1185
|
this.applySuggestion(step);
|
|
1147
1186
|
}
|
|
1187
|
+
// A default seeded before a dropdown's options arrived is a bare
|
|
1188
|
+
// value; swap in its option object now the step opens.
|
|
1189
|
+
if (step && step.default !== undefined && this.userTouched[step.id] !== true && !this.isCardChoice(step)) {
|
|
1190
|
+
const held = this.choiceModel[step.id];
|
|
1191
|
+
const option = this.optionsFor(step).find((o) => o.value === held);
|
|
1192
|
+
if (option && held !== null && typeof held !== 'object') {
|
|
1193
|
+
this.choiceModel[step.id] = option;
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1148
1196
|
this.maybeAutoRunStep(payload.stepId);
|
|
1149
1197
|
/**
|
|
1150
1198
|
* @event step-change Emitted when the active step changes.
|