@conduction/nextcloud-vue 2.120.0 → 2.122.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/CnIndexPage/CnIndexPage.vue2.js +53 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +546 -523
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useNamedSource.js +9 -0
- package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +1 -0
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js +9 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js.map +1 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js +214 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js.map +1 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js +125 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js +9 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js +163 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js +131 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js +127 -0
- package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js +9 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js +82 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js +61 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js +60 -0
- package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js.map +1 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js +10 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js.map +1 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js +226 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js.map +1 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js +126 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +42 -32
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/composables/indexSources.js +116 -16
- package/dist/esm/composables/indexSources.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +42 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +42 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +309 -13
- package/dist/esm/utils/libraryWidgetKeys.js +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +14136 -12578
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +309 -13
- package/l10n/en.json +42 -1
- package/l10n/nl.json +42 -1
- package/package.json +1 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +74 -3
- package/src/components/CnIndexPage/useNamedSource.js +9 -0
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +1 -0
- package/src/components/CnReadinessChecklist/CnReadinessChecklist.vue +335 -0
- package/src/components/CnReadinessChecklist/index.js +9 -0
- package/src/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue +300 -0
- package/src/components/CnSchemaRulesWidget/index.js +10 -0
- package/src/components/CnSchemaRulesWidget/schemaRules.js +123 -0
- package/src/components/CnSearchIndexStatus/CnSearchIndexStatus.vue +160 -0
- package/src/components/CnSearchIndexStatus/index.js +10 -0
- package/src/components/CnSearchIndexStatus/searchIndexStatus.js +56 -0
- package/src/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue +328 -0
- package/src/components/CnShippedConfigurationSection/index.js +9 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +10 -0
- package/src/components/index.js +4 -0
- package/src/composables/indexSources.js +116 -16
- package/src/css/index-page.css +7 -0
- package/src/css/look-board-detail.css +27 -0
- package/src/css/look-board-index.css +108 -12
- package/src/css/look-board.css +27 -1
- package/src/index.js +4 -0
- package/src/utils/libraryWidgetKeys.js +1 -0
|
@@ -60,6 +60,9 @@ import { searchFieldParams } from '../../utils/searchFieldParams.js';
|
|
|
60
60
|
* chosen values, `{ fieldKey: values }`. Mapped through the source's
|
|
61
61
|
* `searchFields` declaration into loader arguments and merged into every
|
|
62
62
|
* load, so a manifest page's sidebar narrows the SERVER's query.
|
|
63
|
+
* @param {import('vue').Ref<string>} [options.searchTerm] The page's search
|
|
64
|
+
* term. A source that names a `searchParam` gets it as that argument, so the
|
|
65
|
+
* server searches; a new term reloads from the first page.
|
|
63
66
|
*
|
|
64
67
|
* @return {object} { isNamedSource, namedSource, namedRows, namedLoading, namedQuickFilters }
|
|
65
68
|
*/
|
|
@@ -107,6 +110,7 @@ function useNamedSource(props, options = {}) {
|
|
|
107
110
|
const tabs = manifestTabs || sourceTabs;
|
|
108
111
|
const activeIndex = options.activeQuickFilterIndex || null;
|
|
109
112
|
const activeFilters = options.activeFilters || null;
|
|
113
|
+
const searchTerm = (typeof source.searchParam === 'string' && source.searchParam !== '') ? (options.searchTerm || null) : null;
|
|
110
114
|
// A source that pages (`pages: true`) gets the page as `limit` and
|
|
111
115
|
// `offset`, from the pager the page draws for it.
|
|
112
116
|
const paging = source.pages === true ? (options.paging || null) : null;
|
|
@@ -170,6 +174,7 @@ function useNamedSource(props, options = {}) {
|
|
|
170
174
|
activeFilters ? activeFilters.value : null,
|
|
171
175
|
props.entitySource,
|
|
172
176
|
),
|
|
177
|
+
...(searchTerm && searchTerm.value ? { [source.searchParam]: searchTerm.value } : {}),
|
|
173
178
|
...(paging ? { limit: paging.value.limit, offset: (paging.value.page - 1) * paging.value.limit } : {}),
|
|
174
179
|
},
|
|
175
180
|
tokenCtx(),
|
|
@@ -219,6 +224,10 @@ function useNamedSource(props, options = {}) {
|
|
|
219
224
|
watch(activeFilters, reloadFromFirstPage, { deep: true });
|
|
220
225
|
}
|
|
221
226
|
|
|
227
|
+
if (searchTerm) {
|
|
228
|
+
watch(searchTerm, reloadFromFirstPage);
|
|
229
|
+
}
|
|
230
|
+
|
|
222
231
|
// A new page, or a new page size, is a new request. A new tab or filter
|
|
223
232
|
// first returns to page 1, which reloads through here.
|
|
224
233
|
if (paging) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNamedSource.js","sources":["../../../../src/components/CnIndexPage/useNamedSource.js"],"sourcesContent":["/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n */\n\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { computed, inject, onMounted, onUnmounted, watch } from 'vue'\nimport { resolveIndexSource } from '../../composables/indexSources.js'\nimport { withPersonalLenses } from '../../utils/personalLenses.js'\nimport { resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\nimport { searchFieldParams } from '../../utils/searchFieldParams.js'\n\n/**\n * Third data mode for CnIndexPage: a NAMED source.\n *\n * The page already knew two ways to get rows — fetch OpenRegister objects from\n * `register` + `schema`, or accept them as `:objects`. Neither reaches a list\n * that is not an OpenRegister object and not already in a parent's hands, so\n * those lists became `type: \"custom\"` pages whose only real job was loading\n * rows from somewhere else.\n *\n * `source` closes that: the manifest names a source and the index loads it.\n *\n * Precedence is deliberate and narrow. NON-EMPTY `:objects` still wins, so a\n * parent that hands rows down is never overridden by a source it did not ask\n * for; and a source wins over `register`/`schema`, because naming both is a\n * contradiction and silently self-fetching would render the WRONG list rather\n * than an obviously empty one.\n *\n * Note the test is \"has rows\", not \"was the prop passed\" — `useSelfFetchList`\n * uses the latter. The difference only shows for `:objects=\"[]\"` alongside a\n * source, where the source wins; that is the useful reading of an empty array\n * next to an explicit source name.\n *\n * Quick filters (cn-tasks-entity-source): a source may supply its own tabs\n * (`quickFilters`, same `{ label, filter, default? }` shape the manifest\n * uses). A manifest that declares `config.quickFilters` still wins. The\n * active tab's filter is merged OVER `sourceConfig` into every load, tab\n * winning on a colliding key, the same precedence self-fetch gives its tabs.\n * The default tab is seeded BEFORE the watcher registers, so mounting issues\n * exactly one request. Single mode only: `quickFilterMultiple` unions filter\n * maps for an OpenRegister query, which a source loader has no grammar for.\n *\n * 🔑 TOKENS RESOLVE HERE TOO. A tab filter is a filter, and a manifest author\n * writing `{ dueBefore: '@today+7d' }` has no way of knowing that the page\n * behind the label happens to be a named source rather than a self-fetch.\n * Without this the literal string `@today+7d` went over the wire, and a\n * source's server either rejected it or, worse, quietly answered the wrong\n * window: dossiq's \"Due this week\" lens is exactly that shape. Self-fetch\n * resolved tokens from the first day; this closes the gap rather than\n * teaching manifests which pages may use them.\n *\n * @param {object} props The CnIndexPage props.\n * @param {object} [options] Wiring handed down by CnIndexPage's setup.\n * @param {import('vue').Ref<number|null>} [options.activeQuickFilterIndex]\n * The shared tab-index ref `useSelfFetchList` owns (it exists even when\n * self-fetch is off); this composable seeds and watches it.\n * @param {import('vue').Ref<object>} [options.activeFilters] The sidebar's\n * chosen values, `{ fieldKey: values }`. Mapped through the source's\n * `searchFields` declaration into loader arguments and merged into every\n * load, so a manifest page's sidebar narrows the SERVER's query.\n *\n * @return {object} { isNamedSource, namedSource, namedRows, namedLoading, namedQuickFilters }\n */\nexport function useNamedSource(props, options = {}) {\n\tconst objectsProvided = !!(props.objects && props.objects.length > 0)\n\tconst isNamedSource = !!props.entitySource && !objectsProvided\n\n\tif (!isNamedSource) {\n\t\treturn {\n\t\t\tisNamedSource: false,\n\t\t\tnamedSource: null,\n\t\t\tnamedRows: computed(() => []),\n\t\t\tnamedLoading: computed(() => false),\n\t\t\tnamedQuickFilters: null,\n\t\t}\n\t}\n\n\tconst cnTranslate = inject('cnTranslate', null)\n\tconst source = resolveIndexSource(props.entitySource, props.sourceConfig, {\n\t\ttranslate: (text) => (typeof cnTranslate === 'function' ? cnTranslate(text) : text),\n\t})\n\n\t// An unknown source name resolves to null and was already warned about.\n\t// The page then behaves as an empty index rather than throwing.\n\tif (!source) {\n\t\treturn {\n\t\t\tisNamedSource: true,\n\t\t\tnamedSource: null,\n\t\t\tnamedRows: computed(() => []),\n\t\t\tnamedLoading: computed(() => false),\n\t\t\tnamedQuickFilters: null,\n\t\t}\n\t}\n\n\t// Effective tabs: the manifest's own strip wins, the source's is the\n\t// default. Both flow into the SAME load-merge below, so a manifest tab\n\t// can steer a source loader too.\n\tconst ownTabs = withPersonalLenses(props.quickFilters, props.personalLenses)\n\tconst manifestTabs = (Array.isArray(ownTabs) && ownTabs.length > 0)\n\t\t? ownTabs\n\t\t: null\n\tconst sourceTabs = (Array.isArray(source.quickFilters) && source.quickFilters.length > 0)\n\t\t? source.quickFilters\n\t\t: null\n\tconst tabs = manifestTabs || sourceTabs\n\tconst activeIndex = options.activeQuickFilterIndex || null\n\tconst activeFilters = options.activeFilters || null\n\t// A source that pages (`pages: true`) gets the page as `limit` and\n\t// `offset`, from the pager the page draws for it.\n\tconst paging = source.pages === true ? (options.paging || null) : null\n\n\t// Seed the default tab before the watcher below registers: the mount load\n\t// already carries this tab's filter, so the seed must not fire a second\n\t// request. `useSelfFetchList` resolved the index from the PROP only, so\n\t// source-supplied tabs arrive with the ref still null.\n\tif (tabs && activeIndex && activeIndex.value === null) {\n\t\tconst di = tabs.findIndex((tab) => tab && tab.default === true)\n\t\tactiveIndex.value = di >= 0 ? di : 0\n\t}\n\n\t// The same three bags `useSelfFetchList` injects, so a token means the\n\t// same thing on both kinds of page. They default to null/absent, so a\n\t// host that provides none is unaffected and `@today` still works: that\n\t// one needs no context at all.\n\tconst objectCtxRaw = inject('cnObjectContext', null)\n\tconst workspaceCtxRaw = inject('cnWorkspaceContext', null)\n\tconst appConfigRaw = inject('cnAppConfig', null)\n\tconst unwrapCtx = (v) => ((v && typeof v === 'object' && 'value' in v) ? v.value : v)\n\n\t/**\n\t * Build the token-resolution ctx from the injected bags, unwrapping refs.\n\t *\n\t * @return {object} The ctx `{ objectId?, object?, workspace, config }`.\n\t */\n\tconst tokenCtx = () => {\n\t\tconst objCtx = unwrapCtx(objectCtxRaw)\n\t\tconst base = (objCtx && typeof objCtx === 'object') ? { ...objCtx } : {}\n\t\tbase.workspace = unwrapCtx(workspaceCtxRaw) || {}\n\t\tbase.config = unwrapCtx(appConfigRaw) || {}\n\t\treturn base\n\t}\n\n\t/**\n\t * Load the source with the active tab's filter merged over the page's\n\t * `sourceConfig` (tab wins on a colliding key), tokens resolved.\n\t *\n\t * The ctx is rebuilt on every load rather than captured once, the same\n\t * way `useSelfFetchList` does it: `@today` has to mean today at the\n\t * moment of the fetch, not at the moment the page mounted, and a tab\n\t * left open across midnight would otherwise keep asking for yesterday.\n\t *\n\t * @return {Promise<void>} Resolves when the load settles.\n\t */\n\tconst loadActive = async () => {\n\t\tconst idx = activeIndex ? activeIndex.value : null\n\t\tconst tab = (tabs && idx !== null && idx !== undefined) ? tabs[idx] : null\n\t\t// 🔑 THE FIELD NARROWS WITHIN THE LENS, SO IT IS MERGED LAST. A lens\n\t\t// sets the question (\"unclaimed work\"); a field narrows the answer\n\t\t// (\"on this case\"). On the rare colliding key the field wins, because\n\t\t// it is the thing the person just chose and can see selected. Both\n\t\t// reach the SERVER: nothing here reduces a fetched page.\n\t\tconst config = resolveFilterTokens(\n\t\t\t{\n\t\t\t\t...(props.sourceConfig || {}),\n\t\t\t\t...((tab && tab.filter) || {}),\n\t\t\t\t...searchFieldParams(\n\t\t\t\t\tsource.searchFields,\n\t\t\t\t\tactiveFilters ? activeFilters.value : null,\n\t\t\t\t\tprops.entitySource,\n\t\t\t\t),\n\t\t\t\t...(paging ? { limit: paging.value.limit, offset: (paging.value.page - 1) * paging.value.limit } : {}),\n\t\t\t},\n\t\t\ttokenCtx(),\n\t\t)\n\t\ttry {\n\t\t\tawait source.load(config)\n\t\t} catch (error) {\n\t\t\t// Surfaced, not swallowed: a failed load and an empty source look\n\t\t\t// identical in the table, and only one of them is a problem.\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(`[CnIndexPage] entitySource \"${props.entitySource}\" failed to load`, error)\n\t\t}\n\t}\n\n\tonMounted(loadActive)\n\n\t// A dialog that acted on a row (CnActionDialog, CnAssignDialog) signals\n\t// `cn:page:refresh`; the rows it changed are read again.\n\tconst onPageRefresh = () => loadActive()\n\tonMounted(() => subscribe('cn:page:refresh', onPageRefresh))\n\tonUnmounted(() => unsubscribe('cn:page:refresh', onPageRefresh))\n\n\t// Registered AFTER the seed above, so only a person switching tabs\n\t// reloads. Without tabs there is nothing to watch.\n\t/**\n\t * Reload for a new query: on a paging source back to page 1, which\n\t * reloads through the paging watcher below.\n\t *\n\t * @return {void}\n\t */\n\tfunction reloadFromFirstPage() {\n\t\tif (paging && paging.value.page !== 1) {\n\t\t\tpaging.value = { ...paging.value, page: 1 }\n\t\t\treturn\n\t\t}\n\t\tloadActive()\n\t}\n\n\tif (tabs && activeIndex) {\n\t\twatch(activeIndex, reloadFromFirstPage)\n\t}\n\n\t// A sidebar choice is a new QUERY, not a new view of the page already\n\t// fetched, so it reloads. `deep` because the map is rewritten key by key\n\t// and a shallow watch misses a second value added to the same field.\n\tif (activeFilters) {\n\t\twatch(activeFilters, reloadFromFirstPage, { deep: true })\n\t}\n\n\t// A new page, or a new page size, is a new request. A new tab or filter\n\t// first returns to page 1, which reloads through here.\n\tif (paging) {\n\t\twatch(paging, loadActive, { deep: true })\n\t}\n\n\t// No manual invalidation tick here on purpose. The adapters read from a\n\t// reactive store, so a computed that calls into them tracks it the ordinary\n\t// way. A hand-cranked counter would REPLACE that reactivity rather than add\n\t// to it, and would then miss every update that did not go through load() —\n\t// a flow renamed in the editor, for instance.\n\treturn {\n\t\tisNamedSource: true,\n\t\tnamedSource: source,\n\t\tnamedRows: computed(() => source.rows() || []),\n\t\tnamedLoading: computed(() => source.loading()),\n\t\t// The tabs the page should RENDER: the manifest's when it declared\n\t\t// any (the strip then also drives self-authored filters), else the\n\t\t// source's own. Null when neither exists.\n\t\tnamedQuickFilters: tabs,\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useNamedSource.js","sources":["../../../../src/components/CnIndexPage/useNamedSource.js"],"sourcesContent":["/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n */\n\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { computed, inject, onMounted, onUnmounted, watch } from 'vue'\nimport { resolveIndexSource } from '../../composables/indexSources.js'\nimport { withPersonalLenses } from '../../utils/personalLenses.js'\nimport { resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\nimport { searchFieldParams } from '../../utils/searchFieldParams.js'\n\n/**\n * Third data mode for CnIndexPage: a NAMED source.\n *\n * The page already knew two ways to get rows — fetch OpenRegister objects from\n * `register` + `schema`, or accept them as `:objects`. Neither reaches a list\n * that is not an OpenRegister object and not already in a parent's hands, so\n * those lists became `type: \"custom\"` pages whose only real job was loading\n * rows from somewhere else.\n *\n * `source` closes that: the manifest names a source and the index loads it.\n *\n * Precedence is deliberate and narrow. NON-EMPTY `:objects` still wins, so a\n * parent that hands rows down is never overridden by a source it did not ask\n * for; and a source wins over `register`/`schema`, because naming both is a\n * contradiction and silently self-fetching would render the WRONG list rather\n * than an obviously empty one.\n *\n * Note the test is \"has rows\", not \"was the prop passed\" — `useSelfFetchList`\n * uses the latter. The difference only shows for `:objects=\"[]\"` alongside a\n * source, where the source wins; that is the useful reading of an empty array\n * next to an explicit source name.\n *\n * Quick filters (cn-tasks-entity-source): a source may supply its own tabs\n * (`quickFilters`, same `{ label, filter, default? }` shape the manifest\n * uses). A manifest that declares `config.quickFilters` still wins. The\n * active tab's filter is merged OVER `sourceConfig` into every load, tab\n * winning on a colliding key, the same precedence self-fetch gives its tabs.\n * The default tab is seeded BEFORE the watcher registers, so mounting issues\n * exactly one request. Single mode only: `quickFilterMultiple` unions filter\n * maps for an OpenRegister query, which a source loader has no grammar for.\n *\n * 🔑 TOKENS RESOLVE HERE TOO. A tab filter is a filter, and a manifest author\n * writing `{ dueBefore: '@today+7d' }` has no way of knowing that the page\n * behind the label happens to be a named source rather than a self-fetch.\n * Without this the literal string `@today+7d` went over the wire, and a\n * source's server either rejected it or, worse, quietly answered the wrong\n * window: dossiq's \"Due this week\" lens is exactly that shape. Self-fetch\n * resolved tokens from the first day; this closes the gap rather than\n * teaching manifests which pages may use them.\n *\n * @param {object} props The CnIndexPage props.\n * @param {object} [options] Wiring handed down by CnIndexPage's setup.\n * @param {import('vue').Ref<number|null>} [options.activeQuickFilterIndex]\n * The shared tab-index ref `useSelfFetchList` owns (it exists even when\n * self-fetch is off); this composable seeds and watches it.\n * @param {import('vue').Ref<object>} [options.activeFilters] The sidebar's\n * chosen values, `{ fieldKey: values }`. Mapped through the source's\n * `searchFields` declaration into loader arguments and merged into every\n * load, so a manifest page's sidebar narrows the SERVER's query.\n * @param {import('vue').Ref<string>} [options.searchTerm] The page's search\n * term. A source that names a `searchParam` gets it as that argument, so the\n * server searches; a new term reloads from the first page.\n *\n * @return {object} { isNamedSource, namedSource, namedRows, namedLoading, namedQuickFilters }\n */\nexport function useNamedSource(props, options = {}) {\n\tconst objectsProvided = !!(props.objects && props.objects.length > 0)\n\tconst isNamedSource = !!props.entitySource && !objectsProvided\n\n\tif (!isNamedSource) {\n\t\treturn {\n\t\t\tisNamedSource: false,\n\t\t\tnamedSource: null,\n\t\t\tnamedRows: computed(() => []),\n\t\t\tnamedLoading: computed(() => false),\n\t\t\tnamedQuickFilters: null,\n\t\t}\n\t}\n\n\tconst cnTranslate = inject('cnTranslate', null)\n\tconst source = resolveIndexSource(props.entitySource, props.sourceConfig, {\n\t\ttranslate: (text) => (typeof cnTranslate === 'function' ? cnTranslate(text) : text),\n\t})\n\n\t// An unknown source name resolves to null and was already warned about.\n\t// The page then behaves as an empty index rather than throwing.\n\tif (!source) {\n\t\treturn {\n\t\t\tisNamedSource: true,\n\t\t\tnamedSource: null,\n\t\t\tnamedRows: computed(() => []),\n\t\t\tnamedLoading: computed(() => false),\n\t\t\tnamedQuickFilters: null,\n\t\t}\n\t}\n\n\t// Effective tabs: the manifest's own strip wins, the source's is the\n\t// default. Both flow into the SAME load-merge below, so a manifest tab\n\t// can steer a source loader too.\n\tconst ownTabs = withPersonalLenses(props.quickFilters, props.personalLenses)\n\tconst manifestTabs = (Array.isArray(ownTabs) && ownTabs.length > 0)\n\t\t? ownTabs\n\t\t: null\n\tconst sourceTabs = (Array.isArray(source.quickFilters) && source.quickFilters.length > 0)\n\t\t? source.quickFilters\n\t\t: null\n\tconst tabs = manifestTabs || sourceTabs\n\tconst activeIndex = options.activeQuickFilterIndex || null\n\tconst activeFilters = options.activeFilters || null\n\tconst searchTerm = (typeof source.searchParam === 'string' && source.searchParam !== '') ? (options.searchTerm || null) : null\n\t// A source that pages (`pages: true`) gets the page as `limit` and\n\t// `offset`, from the pager the page draws for it.\n\tconst paging = source.pages === true ? (options.paging || null) : null\n\n\t// Seed the default tab before the watcher below registers: the mount load\n\t// already carries this tab's filter, so the seed must not fire a second\n\t// request. `useSelfFetchList` resolved the index from the PROP only, so\n\t// source-supplied tabs arrive with the ref still null.\n\tif (tabs && activeIndex && activeIndex.value === null) {\n\t\tconst di = tabs.findIndex((tab) => tab && tab.default === true)\n\t\tactiveIndex.value = di >= 0 ? di : 0\n\t}\n\n\t// The same three bags `useSelfFetchList` injects, so a token means the\n\t// same thing on both kinds of page. They default to null/absent, so a\n\t// host that provides none is unaffected and `@today` still works: that\n\t// one needs no context at all.\n\tconst objectCtxRaw = inject('cnObjectContext', null)\n\tconst workspaceCtxRaw = inject('cnWorkspaceContext', null)\n\tconst appConfigRaw = inject('cnAppConfig', null)\n\tconst unwrapCtx = (v) => ((v && typeof v === 'object' && 'value' in v) ? v.value : v)\n\n\t/**\n\t * Build the token-resolution ctx from the injected bags, unwrapping refs.\n\t *\n\t * @return {object} The ctx `{ objectId?, object?, workspace, config }`.\n\t */\n\tconst tokenCtx = () => {\n\t\tconst objCtx = unwrapCtx(objectCtxRaw)\n\t\tconst base = (objCtx && typeof objCtx === 'object') ? { ...objCtx } : {}\n\t\tbase.workspace = unwrapCtx(workspaceCtxRaw) || {}\n\t\tbase.config = unwrapCtx(appConfigRaw) || {}\n\t\treturn base\n\t}\n\n\t/**\n\t * Load the source with the active tab's filter merged over the page's\n\t * `sourceConfig` (tab wins on a colliding key), tokens resolved.\n\t *\n\t * The ctx is rebuilt on every load rather than captured once, the same\n\t * way `useSelfFetchList` does it: `@today` has to mean today at the\n\t * moment of the fetch, not at the moment the page mounted, and a tab\n\t * left open across midnight would otherwise keep asking for yesterday.\n\t *\n\t * @return {Promise<void>} Resolves when the load settles.\n\t */\n\tconst loadActive = async () => {\n\t\tconst idx = activeIndex ? activeIndex.value : null\n\t\tconst tab = (tabs && idx !== null && idx !== undefined) ? tabs[idx] : null\n\t\t// 🔑 THE FIELD NARROWS WITHIN THE LENS, SO IT IS MERGED LAST. A lens\n\t\t// sets the question (\"unclaimed work\"); a field narrows the answer\n\t\t// (\"on this case\"). On the rare colliding key the field wins, because\n\t\t// it is the thing the person just chose and can see selected. Both\n\t\t// reach the SERVER: nothing here reduces a fetched page.\n\t\tconst config = resolveFilterTokens(\n\t\t\t{\n\t\t\t\t...(props.sourceConfig || {}),\n\t\t\t\t...((tab && tab.filter) || {}),\n\t\t\t\t...searchFieldParams(\n\t\t\t\t\tsource.searchFields,\n\t\t\t\t\tactiveFilters ? activeFilters.value : null,\n\t\t\t\t\tprops.entitySource,\n\t\t\t\t),\n\t\t\t\t...(searchTerm && searchTerm.value ? { [source.searchParam]: searchTerm.value } : {}),\n\t\t\t\t...(paging ? { limit: paging.value.limit, offset: (paging.value.page - 1) * paging.value.limit } : {}),\n\t\t\t},\n\t\t\ttokenCtx(),\n\t\t)\n\t\ttry {\n\t\t\tawait source.load(config)\n\t\t} catch (error) {\n\t\t\t// Surfaced, not swallowed: a failed load and an empty source look\n\t\t\t// identical in the table, and only one of them is a problem.\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(`[CnIndexPage] entitySource \"${props.entitySource}\" failed to load`, error)\n\t\t}\n\t}\n\n\tonMounted(loadActive)\n\n\t// A dialog that acted on a row (CnActionDialog, CnAssignDialog) signals\n\t// `cn:page:refresh`; the rows it changed are read again.\n\tconst onPageRefresh = () => loadActive()\n\tonMounted(() => subscribe('cn:page:refresh', onPageRefresh))\n\tonUnmounted(() => unsubscribe('cn:page:refresh', onPageRefresh))\n\n\t// Registered AFTER the seed above, so only a person switching tabs\n\t// reloads. Without tabs there is nothing to watch.\n\t/**\n\t * Reload for a new query: on a paging source back to page 1, which\n\t * reloads through the paging watcher below.\n\t *\n\t * @return {void}\n\t */\n\tfunction reloadFromFirstPage() {\n\t\tif (paging && paging.value.page !== 1) {\n\t\t\tpaging.value = { ...paging.value, page: 1 }\n\t\t\treturn\n\t\t}\n\t\tloadActive()\n\t}\n\n\tif (tabs && activeIndex) {\n\t\twatch(activeIndex, reloadFromFirstPage)\n\t}\n\n\t// A sidebar choice is a new QUERY, not a new view of the page already\n\t// fetched, so it reloads. `deep` because the map is rewritten key by key\n\t// and a shallow watch misses a second value added to the same field.\n\tif (activeFilters) {\n\t\twatch(activeFilters, reloadFromFirstPage, { deep: true })\n\t}\n\n\tif (searchTerm) {\n\t\twatch(searchTerm, reloadFromFirstPage)\n\t}\n\n\t// A new page, or a new page size, is a new request. A new tab or filter\n\t// first returns to page 1, which reloads through here.\n\tif (paging) {\n\t\twatch(paging, loadActive, { deep: true })\n\t}\n\n\t// No manual invalidation tick here on purpose. The adapters read from a\n\t// reactive store, so a computed that calls into them tracks it the ordinary\n\t// way. A hand-cranked counter would REPLACE that reactivity rather than add\n\t// to it, and would then miss every update that did not go through load() —\n\t// a flow renamed in the editor, for instance.\n\treturn {\n\t\tisNamedSource: true,\n\t\tnamedSource: source,\n\t\tnamedRows: computed(() => source.rows() || []),\n\t\tnamedLoading: computed(() => source.loading()),\n\t\t// The tabs the page should RENDER: the manifest's when it declared\n\t\t// any (the strip then also drives self-authored filters), else the\n\t\t// source's own. Null when neither exists.\n\t\tnamedQuickFilters: tabs,\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnIndexSidebar.vue2.js","sources":["../../../../src/components/CnIndexSidebar/CnIndexSidebar.vue"],"sourcesContent":["<template>\n\t<NcAppSidebar\n\t\tv-model:open=\"internalOpen\"\n\t\t:name=\"resolvedName\"\n\t\t:title=\"resolvedName\"\n\t\t:subname=\"resolvedSubname\"\n\t\t:active=\"internalActiveTab\"\n\t\t:compact=\"!!resolvedIcon\"\n\t\t@close=\"$emit('update:open', false)\"\n\t\t@update:active=\"onTabChange\">\n\t\t<!-- Schema icon in sidebar header -->\n\t\t<template v-if=\"resolvedIcon\" #header>\n\t\t\t<div class=\"cn-index-sidebar__header-icon\">\n\t\t\t\t<CnIcon :name=\"resolvedIcon\" :size=\"32\" />\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- Search Tab -->\n\t\t<NcAppSidebarTab\n\t\t\tid=\"search-tab\"\n\t\t\t:name=\"searchTabLabel\"\n\t\t\t:order=\"1\">\n\t\t\t<template #icon>\n\t\t\t\t<FilterOutline :size=\"20\" />\n\t\t\t</template>\n\n\t\t\t<div class=\"cn-index-sidebar__tab-content\">\n\t\t\t\t<div v-if=\"$slots['search-above']\" class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<slot name=\"search-above\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t:modelValue=\"searchValue || ''\"\n\t\t\t\t\t\t:placeholder=\"searchPlaceholder\"\n\t\t\t\t\t\t:label=\"searchLabel\"\n\t\t\t\t\t\t@update:modelValue=\"$emit('search', $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Sort (list, card and map views; the table sorts by its headers):\n\t\t\t\t the field, the direction and the order the list has now. -->\n\t\t\t\t<div v-if=\"sortOptions.length > 0\" class=\"cn-index-sidebar__section cn-index-sidebar__sort\" data-testid=\"cn-index-sidebar-sort\">\n\t\t\t\t\t<h3>{{ t('nextcloud-vue', 'Sort') }}</h3>\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:modelValue=\"sortSelected\"\n\t\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\t:inputLabel=\"t('nextcloud-vue', 'Sort by')\"\n\t\t\t\t\t\t@update:modelValue=\"onSortField\" />\n\t\t\t\t\t<div class=\"cn-index-sidebar__sort-direction\" role=\"radiogroup\" :aria-label=\"t('nextcloud-vue', 'Direction')\">\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"cn-index-sidebar-sort-direction\"\n\t\t\t\t\t\t\tvalue=\"asc\"\n\t\t\t\t\t\t\t:modelValue=\"sortDirection\"\n\t\t\t\t\t\t\t:disabled=\"!sortSelected || sortSelected.fixed === true\"\n\t\t\t\t\t\t\t@update:modelValue=\"onSortDirection\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Ascending') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"cn-index-sidebar-sort-direction\"\n\t\t\t\t\t\t\tvalue=\"desc\"\n\t\t\t\t\t\t\t:modelValue=\"sortDirection\"\n\t\t\t\t\t\t\t:disabled=\"!sortSelected || sortSelected.fixed === true\"\n\t\t\t\t\t\t\t@update:modelValue=\"onSortDirection\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Descending') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t</div>\n\t\t\t\t\t<p class=\"cn-index-sidebar__sort-current\" data-testid=\"cn-index-sidebar-sort-current\">\n\t\t\t\t\t\t{{ currentSortText }}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"hasActiveFilters\" class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<NcButton variant=\"tertiary\" @click=\"onClearAll\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<FilterRemoveOutline :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ clearAllLabel }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"schemaFilters.length > 0\" class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<h3>{{ filtersLabel }}</h3>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-for=\"filter in schemaFilters\"\n\t\t\t\t\t\t:key=\"filter.key\"\n\t\t\t\t\t\tclass=\"cn-index-sidebar__filter-group\">\n\t\t\t\t\t\t<div class=\"cn-index-sidebar__filter-header\">\n\t\t\t\t\t\t\t<span class=\"cn-index-sidebar__filter-label\">{{ filter.label }}</span>\n\t\t\t\t\t\t\t<NcPopover v-if=\"filter.description\" popupRole=\"dialog\">\n\t\t\t\t\t\t\t\t<template #trigger>\n\t\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\t\tvariant=\"tertiary-no-background\"\n\t\t\t\t\t\t\t\t\t\t:aria-label=\"filter.label + ' info'\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-index-sidebar__info-btn\">\n\t\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t\t<InformationOutline :size=\"16\" />\n\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<p class=\"cn-index-sidebar__filter-description\">\n\t\t\t\t\t\t\t\t\t{{ filter.description }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</NcPopover>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- A window, not a list of values: two bounds and a\n\t\t\t\t\t\t preset, emitted as the `{ from, to }` the range\n\t\t\t\t\t\t filters upstream are already spelled in. -->\n\t\t\t\t\t\t<CnDateRangePicker\n\t\t\t\t\t\t\tv-if=\"filter.type === 'date-range'\"\n\t\t\t\t\t\t\tclass=\"cn-index-sidebar__date-range\"\n\t\t\t\t\t\t\t:modelValue=\"getRangeValue(filter)\"\n\t\t\t\t\t\t\t:presets=\"filter.presets || rangePresets\"\n\t\t\t\t\t\t\t:fromLabel=\"filter.fromLabel || fromLabel\"\n\t\t\t\t\t\t\t:toLabel=\"filter.toLabel || toLabel\"\n\t\t\t\t\t\t\t:presetLabel=\"filter.label\"\n\t\t\t\t\t\t\t@update:modelValue=\"onRangeChange(filter.key, $event)\" />\n\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\tv-else-if=\"filter.type === 'text'\"\n\t\t\t\t\t\t\tclass=\"cn-index-sidebar__filter-text\"\n\t\t\t\t\t\t\t:modelValue=\"getTextValue(filter)\"\n\t\t\t\t\t\t\t:label=\"filter.label\"\n\t\t\t\t\t\t\t:placeholder=\"filter.label\"\n\t\t\t\t\t\t\t@update:modelValue=\"onTextChange(filter.key, $event)\" />\n\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\tclass=\"cn-index-sidebar__select\"\n\t\t\t\t\t\t\t:modelValue=\"getSelectedFilterOptions(filter)\"\n\t\t\t\t\t\t\t:options=\"getFilterOptions(filter)\"\n\t\t\t\t\t\t\t:loading=\"isLoadingOptions(filter)\"\n\t\t\t\t\t\t\tplaceholder=\"Select...\"\n\t\t\t\t\t\t\t:inputLabel=\"filter.label\"\n\t\t\t\t\t\t\t:multiple=\"filter.multiple !== false\"\n\t\t\t\t\t\t\t:keepOpen=\"filter.multiple !== false\"\n\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t@update:modelValue=\"onFilterChange(filter.key, $event)\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<slot name=\"search-extra\" />\n\t\t\t</div>\n\t\t</NcAppSidebarTab>\n\n\t\t<!-- Columns Tab -->\n\t\t<NcAppSidebarTab\n\t\t\tid=\"columns-tab\"\n\t\t\t:name=\"columnsTabLabel\"\n\t\t\t:order=\"2\">\n\t\t\t<template #icon>\n\t\t\t\t<ViewColumnOutline :size=\"20\" />\n\t\t\t</template>\n\n\t\t\t<div class=\"cn-index-sidebar__tab-content\">\n\t\t\t\t<div class=\"cn-sidebar-columns\">\n\t\t\t\t\t<h3>{{ columnsHeading }}</h3>\n\t\t\t\t\t<p class=\"cn-sidebar-columns__description\">\n\t\t\t\t\t\t{{ columnsDescription }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Order and pin the visible columns. Drag and the Move buttons\n\t\t\t\t\t call the same method (moveColumn); the table header is not a drag target. -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"personalColumns && orderedVisible.length > 0\"\n\t\t\t\t\t\tclass=\"cn-sidebar-columns__order\"\n\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-order\">\n\t\t\t\t\t\t<h4>{{ t('nextcloud-vue', 'Order and pin') }}</h4>\n\t\t\t\t\t\t<ol class=\"cn-sidebar-columns__order-list\">\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tv-for=\"(item, index) in orderedVisible\"\n\t\t\t\t\t\t\t\t:key=\"item.key\"\n\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__order-item\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-sidebar-columns__order-item--pinned': index < pinnedCount }\"\n\t\t\t\t\t\t\t\tdraggable=\"true\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-order-item\"\n\t\t\t\t\t\t\t\t@dragstart=\"dragFrom = index\"\n\t\t\t\t\t\t\t\t@dragover.prevent\n\t\t\t\t\t\t\t\t@drop.prevent=\"onDropColumn(index)\">\n\t\t\t\t\t\t\t\t<DragVertical :size=\"18\" class=\"cn-sidebar-columns__handle\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<span class=\"cn-sidebar-columns__order-label\">{{ item.label }}</span>\n\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:disabled=\"index === 0 || index === pinnedCount\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Move {column} up', { column: item.label })\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-up\"\n\t\t\t\t\t\t\t\t\t@click=\"moveColumn(index, index - 1)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<ChevronUp :size=\"18\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:disabled=\"index === orderedVisible.length - 1 || index === pinnedCount - 1\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Move {column} down', { column: item.label })\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-down\"\n\t\t\t\t\t\t\t\t\t@click=\"moveColumn(index, index + 1)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<ChevronDown :size=\"18\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:aria-pressed=\"String(index < pinnedCount)\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"index < pinnedCount ? t('nextcloud-vue', 'Unpin {column}', { column: item.label }) : t('nextcloud-vue', 'Pin {column}', { column: item.label })\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-pin\"\n\t\t\t\t\t\t\t\t\t@click=\"togglePin(index)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<Pin v-if=\"index < pinnedCount\" :size=\"18\" />\n\t\t\t\t\t\t\t\t\t\t<PinOutline v-else :size=\"18\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-reset\"\n\t\t\t\t\t\t\t@click=\"$emit('columns-reset')\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Reset columns') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<template v-if=\"allColumns.length > 0 || allGroups.length > 0\">\n\t\t\t\t\t\t<!-- Schema properties group (collapsible) -->\n\t\t\t\t\t\t<div v-if=\"allColumns.length > 0\" class=\"cn-sidebar-columns__group cn-sidebar-columns__group--collapsible\">\n\t\t\t\t\t\t\t<div class=\"cn-sidebar-columns__group-header\" @click=\"propertiesExpanded = !propertiesExpanded\">\n\t\t\t\t\t\t\t\t<ChevronDown v-if=\"propertiesExpanded\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ChevronRight v-else :size=\"20\" />\n\t\t\t\t\t\t\t\t<h4>{{ resolvedPropertiesLabel }}</h4>\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"isGroupAllVisible(allColumns)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__select-all\"\n\t\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleGroupAll(allColumns)\">\n\t\t\t\t\t\t\t\t\tAll\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-if=\"propertiesExpanded\" class=\"cn-sidebar-columns__group-content\">\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\tv-for=\"col in allColumns\"\n\t\t\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t\t\t:modelValue=\"isColumnVisible(col.key)\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleColumn(col.key)\">\n\t\t\t\t\t\t\t\t\t{{ col.label }}\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Extra column groups (built-in Metadata + external) -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"group in allGroups\"\n\t\t\t\t\t\t\t:key=\"group.id\"\n\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__group cn-sidebar-columns__group--collapsible\">\n\t\t\t\t\t\t\t<div class=\"cn-sidebar-columns__group-header\" @click=\"toggleGroup(group.id)\">\n\t\t\t\t\t\t\t\t<ChevronDown v-if=\"expandedGroups[group.id]\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ChevronRight v-else :size=\"20\" />\n\t\t\t\t\t\t\t\t<h4 :lang=\"langOf(group.label)\">\n\t\t\t\t\t\t\t\t\t{{ shown(group.label) }}\n\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"isGroupAllVisible(group.columns)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__select-all\"\n\t\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleGroupAll(group.columns)\">\n\t\t\t\t\t\t\t\t\tAll\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-if=\"expandedGroups[group.id]\" class=\"cn-sidebar-columns__group-content\">\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\tv-for=\"col in group.columns\"\n\t\t\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t\t\t:modelValue=\"isColumnVisible(col.key)\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleColumn(col.key)\">\n\t\t\t\t\t\t\t\t\t{{ shown(col.label) }}\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<p v-else class=\"cn-sidebar-columns__empty\">\n\t\t\t\t\t\tNo columns available. Provide a schema to auto-generate columns.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<slot name=\"columns-extra\" />\n\t\t\t</div>\n\t\t</NcAppSidebarTab>\n\n\t\t<!-- Views tab (id filters-tab): the page's saved views (save, list, manage, add to menu). -->\n\t\t<NcAppSidebarTab\n\t\t\tv-if=\"savedViews\"\n\t\t\tid=\"filters-tab\"\n\t\t\t:name=\"t('nextcloud-vue', 'Views')\"\n\t\t\t:order=\"3\">\n\t\t\t<template #icon>\n\t\t\t\t<BookmarkOutline :size=\"20\" />\n\t\t\t</template>\n\n\t\t\t<div class=\"cn-index-sidebar__tab-content\">\n\t\t\t\t<div class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<CnSavedViewsPanel\n\t\t\t\t\t\tv-bind=\"savedViewsPanelProps\"\n\t\t\t\t\t\t@apply=\"onSavedView('apply', $event)\"\n\t\t\t\t\t\t@saveRequest=\"onSavedView('save', null)\"\n\t\t\t\t\t\t@editRequest=\"onSavedView('edit', $event)\"\n\t\t\t\t\t\t@shareRequest=\"onSavedView('share', $event)\"\n\t\t\t\t\t\t@updateRequest=\"onSavedView('update', $event)\"\n\t\t\t\t\t\t@copyRequest=\"onSavedView('copy', $event)\"\n\t\t\t\t\t\t@menuToggle=\"onSavedView('menu', $event)\"\n\t\t\t\t\t\t@deleteRequest=\"onSavedView('delete', $event)\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</NcAppSidebarTab>\n\n\t\t<!-- Extra tabs injected by the consumer -->\n\t\t<slot name=\"tabs\" />\n\t</NcAppSidebar>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcAppSidebar, NcAppSidebarTab, NcButton, NcCheckboxRadioSwitch, NcPopover, NcSelect, NcTextField } from '@nextcloud/vue'\nimport BookmarkOutline from 'vue-material-design-icons/BookmarkOutline.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport DragVertical from 'vue-material-design-icons/DragVertical.vue'\nimport FilterOutline from 'vue-material-design-icons/FilterOutline.vue'\nimport FilterRemoveOutline from 'vue-material-design-icons/FilterRemoveOutline.vue'\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\nimport Pin from 'vue-material-design-icons/Pin.vue'\nimport PinOutline from 'vue-material-design-icons/PinOutline.vue'\nimport ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport CnSavedViewsPanel from '../CnSavedViewsPanel/CnSavedViewsPanel.vue'\nimport { METADATA_COLUMNS } from '../../constants/metadata.js'\nimport { facetOptions } from '../../utils/facets.js'\nimport { labelLang } from '../../utils/manifestTranslate.js'\nimport { columnsFromSchema, filtersFromSchema } from '../../utils/schema.js'\nimport { reverseSortKeys, sameSortKeys } from '../../utils/sortOrder.js'\nimport { CnDateRangePicker, DEFAULT_DATE_RANGE_PRESETS } from '../CnDateRangePicker/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnIndexSidebar — Reusable NcAppSidebar wrapper with Search + Columns tabs.\n *\n * Designed to be schema-driven: pass a schema and the sidebar auto-generates\n * search filters, column visibility controls, and the standard Metadata group.\n * Title and properties group label are derived from schema.title by default.\n *\n * Must be rendered at the App.vue level as a sibling of NcAppContent.\n * Use provide/inject to connect it to page components.\n *\n * @slot search-above - Content rendered above the search field in the Search tab (e.g. hints, quick actions).\n * @slot search-extra - Content rendered below the search field and filters in the Search tab (e.g. saved searches).\n */\nexport default {\n\tname: 'CnIndexSidebar',\n\n\tcomponents: {\n\t\tNcAppSidebar,\n\t\tNcAppSidebarTab,\n\t\tCnSavedViewsPanel,\n\t\tBookmarkOutline,\n\t\tNcTextField,\n\t\tNcSelect,\n\t\tCnDateRangePicker,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcPopover,\n\t\tNcButton,\n\t\tCnIcon,\n\t\tFilterOutline,\n\t\tFilterRemoveOutline,\n\t\tViewColumnOutline,\n\t\tChevronDown,\n\t\tChevronRight,\n\t\tChevronUp,\n\t\tDragVertical,\n\t\tPin,\n\t\tPinOutline,\n\t\tInformationOutline,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Consumer translation function, provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). Column and\n\t\t * filter labels come from schema property titles, authored in English as\n\t\t * the canonical source; the visible label is resolved through this\n\t\t * function so it follows the user's language. Defaults to identity when\n\t\t * used standalone (no CnAppRoot ancestor).\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Sidebar title. Defaults to schema.title when not set. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name or emoji. Defaults to schema.icon when not set. */\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Schema object for auto-generating filters, columns, and labels */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Array of currently visible column keys */\n\t\tvisibleColumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Show the Order and pin controls in the Columns tab, and Reset columns.\n\t\t * Off keeps show and hide only.\n\t\t */\n\t\tpersonalColumns: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** How many of the first visible columns are pinned to the start of the table. */\n\t\tpinnedCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * The orders the Sort section offers, `[{ value, label, keys, fixed? }]`,\n\t\t * each `keys` a `[{ key, order }]` list read as its ascending form. An\n\t\t * option with `fixed: true` is an order of its own (the rows an endpoint\n\t\t * ranks): it is chosen by its value, has no direction, and its keys are\n\t\t * not matched against the current order. Empty draws no Sort section\n\t\t * (the table view sorts by its headers).\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The list's current order, `[{ key, order }]`. */\n\t\tcurrentSort: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The Sort option chosen by its value, for an order that is not a list\n\t\t * of sort keys (an option with `fixed: true`, such as one whose rows an\n\t\t * endpoint ranks). Wins over matching `currentSort`.\n\t\t */\n\t\tcurrentSortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Current search term */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether sidebar is open */\n\t\topen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current active facet filters: { fieldName: [values] } */\n\t\tactiveFilters: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Live facet data from the API: `{ fieldName: { values: [{ value, count?, label? }] } }` */\n\t\tfacetData: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * Additional column groups beyond schema properties and the built-in Metadata.\n\t\t * Each group: { id: string, label: string, columns: Array<{key, label}>, expanded?: boolean }\n\t\t */\n\t\tcolumnGroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Whether to include the built-in Metadata column group */\n\t\tshowMetadata: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Search input placeholder */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Type to search…'),\n\t\t},\n\n\t\t/** Search tab label */\n\t\tsearchTabLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Search'),\n\t\t},\n\n\t\t/** Columns tab label */\n\t\tcolumnsTabLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Columns'),\n\t\t},\n\n\t\t/** Search section heading */\n\t\tsearchLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Search'),\n\t\t},\n\n\t\t/** Filters section heading */\n\t\tfiltersLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Filters'),\n\t\t},\n\n\t\t/** \"Clear all\" button label, shown when search or a filter is active */\n\t\tclearAllLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Clear all'),\n\t\t},\n\n\t\t/**\n\t\t * Filter declarations for a page with no schema of its own: `{ name: declaration }`, the same shape a schema property has. Wins over `schema`, and feeds the Search tab only.\n\t\t *\n\t\t * 🔑 A FILTER IS NOT A COLUMN, which is the whole reason this is its\n\t\t * own prop rather than a synthetic `schema`. The schema feeds BOTH\n\t\t * tabs, so a page that declared its filters there would also offer\n\t\t * them in the Columns tab: the toggle would tick and no column would\n\t\t * appear, because the table's columns come from somewhere else\n\t\t * entirely. These reach the Search tab and nothing else.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tfilterFields: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Start-of-window label on a date-range filter. */\n\t\tfromLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'From'),\n\t\t},\n\n\t\t/** End-of-window label on a date-range filter. */\n\t\ttoLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'To'),\n\t\t},\n\n\t\t/** Columns section heading */\n\t\tcolumnsHeading: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Column visibility'),\n\t\t},\n\n\t\t/** Columns section description */\n\t\tcolumnsDescription: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Select which columns to display in the table'),\n\t\t},\n\n\t\t/** Override label for the schema properties group. Defaults to schema.title. */\n\t\tpropertiesGroupLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * ID of the tab that should be active when the sidebar opens.\n\t\t * Built-in IDs are 'search-tab' and 'columns-tab'.\n\t\t * Use the id you set on your custom NcAppSidebarTab for custom tabs.\n\t\t */\n\t\tdefaultTab: {\n\t\t\ttype: String,\n\t\t\tdefault: 'search-tab',\n\t\t},\n\n\t\t/**\n\t\t * Switch to a tab while the sidebar is mounted, e.g. `'filters-tab'`\n\t\t * after a view was saved from the toolbar. Empty leaves the tab alone.\n\t\t */\n\t\tactiveTab: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The page's saved views, shown in the Filters tab:\n\t\t * `{ views, loading, currentUserId, counts, selectedViewId, maxDepth, menuIds }`\n\t\t * as `CnSavedViewsPanel` takes them. `null` shows no saved views.\n\t\t * Every intent comes back as one `saved-view` event.\n\t\t */\n\t\tsavedViews: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether the current user is an admin.\n\t\t * When false, schema properties with `adminOnly: true` are hidden from filters.\n\t\t */\n\t\tuserIsAdmin: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\n\temits: ['clear-filters', 'columns-change', 'columns-reorder', 'columns-reset', 'pin-change', 'filter-change', 'saved-view', 'search', 'sort-change', 'tab-change', 'update:open'],\n\n\tdata() {\n\t\treturn {\n\t\t\tinternalOpen: this.open,\n\t\t\tinternalActiveTab: this.defaultTab,\n\t\t\t/** Index of the column being dragged in the Order and pin list, or -1. */\n\t\t\tdragFrom: -1,\n\t\t\tpropertiesExpanded: true,\n\t\t\texpandedGroups: {},\n\t\t\t/**\n\t\t\t * Options loaded for a `reference` filter, keyed by field.\n\t\t\t *\n\t\t\t * A reference picker lists rows from ANOTHER list (the cases a\n\t\t\t * task can hang off, say), and neither the schema nor a facet\n\t\t\t * bucket carries them. Loaded once per field and cached, because\n\t\t\t * the sidebar re-renders on every keystroke in the search box.\n\t\t\t *\n\t\t\t * @type {Record<string, Array<{id: string, label: string}>>}\n\t\t\t */\n\t\t\treferenceOptions: {},\n\t\t\t/** @type {Record<string, boolean>} Which reference loads are in flight. */\n\t\t\treferenceLoading: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The Sort option the current order matches, as declared or reversed.\n\t\t *\n\t\t * @return {{option: object, direction: string}|null} The match, or null.\n\t\t */\n\t\tsortMatch() {\n\t\t\tif (this.currentSortValue) {\n\t\t\t\tconst chosen = this.sortOptions.find((o) => o.value === this.currentSortValue)\n\t\t\t\tif (chosen) {\n\t\t\t\t\treturn { option: chosen, direction: 'asc' }\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst current = Array.isArray(this.currentSort) ? this.currentSort : []\n\t\t\tfor (const option of this.sortOptions) {\n\t\t\t\tif (option.fixed === true) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst keys = Array.isArray(option.keys) ? option.keys : []\n\t\t\t\tif (sameSortKeys(keys, current)) {\n\t\t\t\t\treturn { option, direction: 'asc' }\n\t\t\t\t}\n\t\t\t\tif (sameSortKeys(reverseSortKeys(keys), current)) {\n\t\t\t\t\treturn { option, direction: 'desc' }\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/** @return {object|null} The Sort option shown as chosen. */\n\t\tsortSelected() {\n\t\t\treturn this.sortMatch ? this.sortMatch.option : null\n\t\t},\n\n\t\t/** @return {string} The chosen direction, `asc` or `desc`. */\n\t\tsortDirection() {\n\t\t\treturn this.sortMatch ? this.sortMatch.direction : 'asc'\n\t\t},\n\n\t\t/**\n\t\t * The order the list has now, in words: \"Current order: Created,\n\t\t * descending\", or that it is not sorted.\n\t\t *\n\t\t * @return {string} The sentence.\n\t\t */\n\t\tcurrentSortText() {\n\t\t\tif (this.sortMatch && this.sortMatch.option.fixed === true) {\n\t\t\t\treturn t('nextcloud-vue', 'Current order: {order}', { order: this.sortMatch.option.label })\n\t\t\t}\n\t\t\tconst current = Array.isArray(this.currentSort) ? this.currentSort : []\n\t\t\tif (current.length === 0) {\n\t\t\t\treturn t('nextcloud-vue', 'Not sorted')\n\t\t\t}\n\t\t\tconst labelOf = (key) => {\n\t\t\t\tconst single = this.sortOptions.find((o) => Array.isArray(o.keys) && o.keys.length === 1 && o.keys[0].key === key)\n\t\t\t\treturn single ? single.label : key\n\t\t\t}\n\t\t\tconst order = this.sortMatch && this.sortMatch.option.keys.length > 1\n\t\t\t\t? `${this.sortMatch.option.label}, ${this.sortDirection === 'desc' ? t('nextcloud-vue', 'descending') : t('nextcloud-vue', 'ascending')}`\n\t\t\t\t: current.map((entry) => `${labelOf(entry.key)}, ${entry.order === 'desc' ? t('nextcloud-vue', 'descending') : t('nextcloud-vue', 'ascending')}`).join('; ')\n\t\t\treturn t('nextcloud-vue', 'Current order: {order}', { order })\n\t\t},\n\n\t\t/**\n\t\t * The panel's props, from `savedViews`.\n\t\t *\n\t\t * @return {object}\n\t\t * @spec openspec/changes/saved-views-manage-and-defaults/tasks.md#task-6\n\t\t */\n\t\tsavedViewsPanelProps() {\n\t\t\tconst f = this.savedViews || {}\n\t\t\treturn {\n\t\t\t\tviews: Array.isArray(f.views) ? f.views : [],\n\t\t\t\tloading: f.loading === true,\n\t\t\t\tcurrentUserId: f.currentUserId || '',\n\t\t\t\tcounts: f.counts || null,\n\t\t\t\tselectedViewId: f.selectedViewId || '',\n\t\t\t\tmaxDepth: typeof f.maxDepth === 'number' ? f.maxDepth : 3,\n\t\t\t\tmenuIds: Array.isArray(f.menuIds) ? f.menuIds : null,\n\t\t\t}\n\t\t},\n\n\t\t/** Resolved icon — explicit prop overrides schema.icon */\n\t\tresolvedIcon() {\n\t\t\treturn this.icon || this.schema?.icon || ''\n\t\t},\n\n\t\t/** Sidebar name — schema title, shown as the h2 header */\n\t\tresolvedName() {\n\t\t\tif (this.title) {\n\t\t\t\treturn this.shown(this.title)\n\t\t\t}\n\t\t\treturn this.schema?.title || 'Search'\n\t\t},\n\n\t\t/** Sidebar subname — schema description, shown below the name */\n\t\tresolvedSubname() {\n\t\t\treturn this.schema?.description || ''\n\t\t},\n\n\t\t/** Properties group label — derived from schema.title if not explicitly set */\n\t\tresolvedPropertiesLabel() {\n\t\t\tif (this.propertiesGroupLabel) {\n\t\t\t\treturn this.propertiesGroupLabel\n\t\t\t}\n\t\t\treturn this.schema?.title || 'Properties'\n\t\t},\n\n\t\t/** All available columns from schema */\n\t\tallColumns() {\n\t\t\tif (!this.schema) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn columnsFromSchema(this.schema, { translate: this.cnTranslate })\n\t\t},\n\n\t\t/** Filter definitions from schema (facetable properties, respecting RBAC) */\n\t\tschemaFilters() {\n\t\t\t// An explicitly declared filter set wins: it is the page saying\n\t\t\t// \"these are the questions\", where a schema only says \"these are\n\t\t\t// the properties\" and the sidebar has to guess which of them are\n\t\t\t// worth asking about.\n\t\t\tif (this.filterFields && Object.keys(this.filterFields).length > 0) {\n\t\t\t\treturn filtersFromSchema(\n\t\t\t\t\t{ properties: this.filterFields },\n\t\t\t\t\t{ isAdmin: this.userIsAdmin, translate: this.cnTranslate },\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (!this.schema) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn filtersFromSchema(this.schema, { isAdmin: this.userIsAdmin, translate: this.cnTranslate })\n\t\t},\n\n\t\t/** Whether a search term or any facet filter is currently active. */\n\t\thasActiveFilters() {\n\t\t\tif ((this.searchValue || '').length > 0) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn Object.values(this.activeFilters || {}).some((v) => (Array.isArray(v) ? v.length > 0 : !!v))\n\t\t},\n\n\t\t/** Combined column groups: built-in Metadata + external groups */\n\t\tallGroups() {\n\t\t\tconst groups = []\n\t\t\tif (this.showMetadata && this.schema) {\n\t\t\t\tgroups.push({\n\t\t\t\t\tid: 'metadata',\n\t\t\t\t\tlabel: 'Metadata',\n\t\t\t\t\tcolumns: METADATA_COLUMNS,\n\t\t\t\t\texpanded: true,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn [...groups, ...this.columnGroups]\n\t\t},\n\n\t\t/** Label of each column key, from the schema properties and the groups. */\n\t\tcolumnLabels() {\n\t\t\tconst map = {}\n\t\t\tthis.allColumns.forEach((c) => {\n\t\t\t\tmap[c.key] = c.label\n\t\t\t})\n\t\t\tthis.allGroups.forEach((g) => g.columns.forEach((c) => {\n\t\t\t\tmap[c.key] = c.label\n\t\t\t}))\n\t\t\treturn map\n\t\t},\n\n\t\t/** The visible columns in their order, with labels (all columns when none were chosen). */\n\t\torderedVisible() {\n\t\t\tconst keys = this.visibleColumns === null ? this.allColumnKeys : this.visibleColumns\n\t\t\treturn keys.filter((k) => this.columnLabels[k] !== undefined).map((key) => ({ key, label: this.columnLabels[key] }))\n\t\t},\n\n\t\t/** All column keys across schema properties and all groups */\n\t\tallColumnKeys() {\n\t\t\treturn [\n\t\t\t\t...this.allColumns.map((c) => c.key),\n\t\t\t\t...this.allGroups.flatMap((g) => g.columns.map((c) => c.key)),\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * The presets a date-range filter offers when it declares none.\n\t\t *\n\t\t * Just `custom`. Every shipped preset rolls BACKWARDS from today\n\t\t * (\"Last 30 days\"), and a sidebar filter is as often a forward window\n\t\t * (\"due next week\") as a backward one. Offering a preset that answers\n\t\t * the wrong direction is worse than offering none: it is one click and\n\t\t * it looks deliberate.\n\t\t *\n\t\t * @return {Array<object>} The preset list.\n\t\t */\n\t\trangePresets() {\n\t\t\t// Taken FROM the picker's own list rather than written out again, so\n\t\t\t// the one preset a filter offers carries the same id and the same\n\t\t\t// label as everywhere else it appears.\n\t\t\treturn DEFAULT_DATE_RANGE_PRESETS\n\t\t\t\t.filter((preset) => preset.id === 'custom')\n\t\t\t\t.map((preset) => ({ ...preset }))\n\t\t},\n\t},\n\n\twatch: {\n\t\tactiveTab(tab) {\n\t\t\tif (tab) {\n\t\t\t\tthis.internalActiveTab = tab\n\t\t\t}\n\t\t},\n\n\t\topen(val) {\n\t\t\tthis.internalOpen = val\n\t\t},\n\n\t\tinternalOpen(val) {\n\t\t\tthis.$emit('update:open', val)\n\t\t},\n\n\t\tdefaultTab(val) {\n\t\t\tthis.internalActiveTab = val\n\t\t},\n\n\t\tallGroups: {\n\t\t\timmediate: true,\n\t\t\thandler(groups) {\n\t\t\t\tfor (const group of groups) {\n\t\t\t\t\tif (!(group.id in this.expandedGroups)) {\n\t\t\t\t\t\tthis.expandedGroups[group.id] = group.expanded !== false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\t// A reference picker's rows load once the schema naming them arrives,\n\t\t// which on a manifest page is after mount. Watching the FILTERS rather\n\t\t// than calling from `mounted()` covers both orders.\n\t\tschemaFilters: {\n\t\t\timmediate: true,\n\t\t\thandler() {\n\t\t\t\tthis.loadReferenceOptions()\n\t\t\t},\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A field chosen in the Sort section: its order, in the direction\n\t\t * already chosen.\n\t\t *\n\t\t * @param {object|null} option The chosen option.\n\t\t * @return {void}\n\t\t */\n\t\tonSortField(option) {\n\t\t\tconst chosen = option && this.sortOptions.find((o) => o.value === option.value)\n\t\t\tif (!chosen) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.emitSort(chosen, this.sortDirection)\n\t\t},\n\n\t\t/**\n\t\t * A direction chosen in the Sort section, for the chosen field.\n\t\t *\n\t\t * @param {string} direction `asc` or `desc`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortDirection(direction) {\n\t\t\tif (!this.sortSelected) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.emitSort(this.sortSelected, direction === 'desc' ? 'desc' : 'asc')\n\t\t},\n\n\t\t/**\n\t\t * Emit the order an option stands for in a direction.\n\t\t *\n\t\t * @param {object} option The Sort option.\n\t\t * @param {string} direction `asc` or `desc`.\n\t\t * @return {void}\n\t\t */\n\t\temitSort(option, direction) {\n\t\t\tconst keys = Array.isArray(option.keys) ? option.keys : []\n\t\t\t/**\n\t\t\t * @event sort-change The Sort section chose an order. Payload: `[{ key, order }]`,\n\t\t\t * and the chosen option's value, which names an order that is not keys (`fixed`).\n\t\t\t */\n\t\t\tthis.$emit('sort-change', direction === 'desc' ? reverseSortKeys(keys) : keys.map((k) => ({ key: k.key, order: k.order || 'asc' })), option.value)\n\t\t},\n\n\t\t/**\n\t\t * Hand a saved-view intent to the page.\n\t\t *\n\t\t * @param {'apply'|'save'|'edit'|'share'|'presentation'|'update'|'copy'|'menu'|'delete'} action The intent.\n\t\t * @param {object|null} view The view, or null for save.\n\t\t * @spec openspec/changes/saved-views-manage-and-defaults/tasks.md#task-6\n\t\t */\n\t\tonSavedView(action, view) {\n\t\t\t/**\n\t\t\t * @event saved-view A saved-view intent from the Filters tab. Payload: `{ action, view }`.\n\t\t\t * @type {{action: string, view: (object|null)}}\n\t\t\t */\n\t\t\tthis.$emit('saved-view', { action, view })\n\t\t},\n\n\t\t/**\n\t\t * A manifest label through the injected lookup, or as written.\n\t\t *\n\t\t * @param {string} text The label as written.\n\t\t * @return {string} The label in the user's language.\n\t\t */\n\t\tshown(text) {\n\t\t\treturn typeof this.cnTranslate === 'function' && typeof text === 'string' && text !== '' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The `lang` of a label that fell back to its written text in another language.\n\t\t *\n\t\t * @param {string} text The label as written.\n\t\t * @return {string|undefined} The source language, or undefined.\n\t\t */\n\t\tlangOf(text) {\n\t\t\treturn labelLang(this.cnTranslate, text) || undefined\n\t\t},\n\n\t\t/**\n\t\t * Handle tab change from NcAppSidebar\n\t\t *\n\t\t * @param {string} tabId Tab identifier\n\t\t */\n\t\tonTabChange(tabId) {\n\t\t\tthis.internalActiveTab = tabId\n\t\t\tthis.$emit('tab-change', tabId)\n\t\t},\n\n\t\t/**\n\t\t * Check if a column is currently visible\n\t\t *\n\t\t * @param {string} key Column key\n\t\t */\n\t\tisColumnVisible(key) {\n\t\t\tif (this.visibleColumns === null) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn this.visibleColumns.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * Check if all columns in a group are visible\n\t\t *\n\t\t * @param {string[]} columns Array of column keys\n\t\t */\n\t\tisGroupAllVisible(columns) {\n\t\t\treturn columns.every((col) => this.isColumnVisible(col.key))\n\t\t},\n\n\t\t/**\n\t\t * Toggle a single column's visibility\n\t\t *\n\t\t * @param {string} key Column key\n\t\t */\n\t\ttoggleColumn(key) {\n\t\t\tlet newVisible\n\t\t\tif (this.visibleColumns === null) {\n\t\t\t\tnewVisible = this.allColumnKeys.filter((k) => k !== key)\n\t\t\t} else if (this.isColumnVisible(key)) {\n\t\t\t\tnewVisible = this.visibleColumns.filter((k) => k !== key)\n\t\t\t} else {\n\t\t\t\tnewVisible = [...this.visibleColumns, key]\n\t\t\t}\n\t\t\tthis.$emit('columns-change', newVisible)\n\t\t},\n\n\t\t/**\n\t\t * Select or deselect all columns in a group\n\t\t *\n\t\t * @param {string[]} columns Array of column keys\n\t\t */\n\t\ttoggleGroupAll(columns) {\n\t\t\tconst groupKeys = columns.map((c) => c.key)\n\t\t\tconst allVisible = this.isGroupAllVisible(columns)\n\n\t\t\tlet newVisible\n\t\t\tif (this.visibleColumns === null) {\n\t\t\t\t// Currently all visible — deselect this group\n\t\t\t\tnewVisible = this.allColumnKeys.filter((k) => !groupKeys.includes(k))\n\t\t\t} else if (allVisible) {\n\t\t\t\t// All in group visible — deselect them\n\t\t\t\tnewVisible = this.visibleColumns.filter((k) => !groupKeys.includes(k))\n\t\t\t} else {\n\t\t\t\t// Not all visible — select them all\n\t\t\t\tconst current = new Set(this.visibleColumns)\n\t\t\t\tgroupKeys.forEach((k) => current.add(k))\n\t\t\t\tnewVisible = [...current]\n\t\t\t}\n\t\t\tthis.$emit('columns-change', newVisible)\n\t\t},\n\n\t\t/**\n\t\t * Move a visible column to another place in the order. The drag and the\n\t\t * Move buttons both call this. A column stays inside its block: pinned\n\t\t * columns move among the pinned, the rest among the rest.\n\t\t *\n\t\t * @param {number} from Current index.\n\t\t * @param {number} to Target index.\n\t\t * @return {void}\n\t\t */\n\t\tmoveColumn(from, to) {\n\t\t\tconst list = this.orderedVisible.map((c) => c.key)\n\t\t\tconst lo = from < this.pinnedCount ? 0 : this.pinnedCount\n\t\t\tconst hi = from < this.pinnedCount ? this.pinnedCount - 1 : list.length - 1\n\t\t\tconst target = Math.min(hi, Math.max(lo, to))\n\t\t\tif (from < 0 || from >= list.length || target === from) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst [moved] = list.splice(from, 1)\n\t\t\tlist.splice(target, 0, moved)\n\t\t\t/**\n\t\t\t * @event columns-reorder Emitted when the user moves a column. Payload: the visible column keys in their new order.\n\t\t\t * @type {string[]}\n\t\t\t */\n\t\t\tthis.$emit('columns-reorder', list)\n\t\t},\n\n\t\t/**\n\t\t * Dropping a dragged column on another row.\n\t\t *\n\t\t * @param {number} index Index of the row it was dropped on.\n\t\t * @return {void}\n\t\t */\n\t\tonDropColumn(index) {\n\t\t\tconst from = this.dragFrom\n\t\t\tthis.dragFrom = -1\n\t\t\tif (from >= 0) {\n\t\t\t\tthis.moveColumn(from, index)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pin a column (it joins the pinned block at the start) or unpin it (it\n\t\t * leaves that block, to the first place after it).\n\t\t *\n\t\t * @param {number} index Index of the column.\n\t\t * @return {void}\n\t\t */\n\t\ttogglePin(index) {\n\t\t\tconst list = this.orderedVisible.map((c) => c.key)\n\t\t\tconst [moved] = list.splice(index, 1)\n\t\t\tlet count = this.pinnedCount\n\t\t\tif (index < count) {\n\t\t\t\tcount -= 1\n\t\t\t\tlist.splice(count, 0, moved)\n\t\t\t} else {\n\t\t\t\tlist.splice(count, 0, moved)\n\t\t\t\tcount += 1\n\t\t\t}\n\t\t\tthis.$emit('columns-reorder', list)\n\t\t\t/**\n\t\t\t * @event pin-change Emitted when a column is pinned or unpinned. Payload: the new number of pinned columns.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.$emit('pin-change', count)\n\t\t},\n\n\t\t/**\n\t\t * Toggle a group's expanded state\n\t\t *\n\t\t * @param {string} groupId Filter group identifier\n\t\t */\n\t\ttoggleGroup(groupId) {\n\t\t\tthis.expandedGroups[groupId] = !this.expandedGroups[groupId]\n\t\t},\n\n\t\t/**\n\t\t * Get filter options for a filter definition\n\t\t *\n\t\t * @param {object} filter Filter object\n\t\t */\n\t\tgetFilterOptions(filter) {\n\t\t\tconst live = facetOptions(\n\t\t\t\tthis.facetData[filter.key],\n\t\t\t\t(count) => t('nextcloud-vue', 'No value ({count})', { count }),\n\t\t\t)\n\t\t\tif (live !== null) {\n\t\t\t\treturn live\n\t\t\t}\n\t\t\t// A reference picker's rows come from another list, and neither a\n\t\t\t// schema enum nor a facet bucket can carry them.\n\t\t\tif (filter.type === 'reference') {\n\t\t\t\treturn this.referenceOptions[filter.key] || []\n\t\t\t}\n\t\t\treturn filter.options || []\n\t\t},\n\n\t\t/**\n\t\t * Whether a reference filter is still fetching its rows.\n\t\t *\n\t\t * Shown rather than hidden: an empty picker that is still loading and\n\t\t * one that genuinely has nothing to pick look identical, and only one\n\t\t * of them means the person should stop waiting.\n\t\t *\n\t\t * @param {object} filter The filter definition.\n\t\t *\n\t\t * @return {boolean} True while the load is in flight.\n\t\t */\n\t\tisLoadingOptions(filter) {\n\t\t\treturn this.referenceLoading[filter.key] === true\n\t\t},\n\n\t\t/**\n\t\t * The `{ from, to }` window a date-range filter currently holds.\n\t\t *\n\t\t * @param {object} filter The filter definition.\n\t\t *\n\t\t * @return {object|null} The window, or null when none is set.\n\t\t */\n\t\tgetRangeValue(filter) {\n\t\t\tconst value = this.activeFilters[filter.key]\n\t\t\tif (value && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/**\n\t\t * A date-range filter changed.\n\t\t *\n\t\t * Emitted in the SAME `filter-change` shape every other control uses,\n\t\t * with the window as the payload's `values`, so a consumer has one\n\t\t * event to listen to and not two.\n\t\t *\n\t\t * @param {string} key The filter key.\n\t\t * @param {object|null} window The `{ from, to, preset }` value.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonRangeChange(key, window) {\n\t\t\tconst from = (window && window.from) || ''\n\t\t\tconst to = (window && window.to) || ''\n\t\t\tif (from === '' && to === '') {\n\t\t\t\tthis.$emit('filter-change', { key, values: [] })\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$emit('filter-change', { key, values: { from, to } })\n\t\t},\n\n\t\t/**\n\t\t * The text a `text` filter currently holds.\n\t\t *\n\t\t * @param {object} filter The filter definition.\n\t\t *\n\t\t * @return {string} The current value.\n\t\t */\n\t\tgetTextValue(filter) {\n\t\t\tconst value = this.activeFilters[filter.key]\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.length > 0 ? String(value[0]) : ''\n\t\t\t}\n\t\t\treturn (value === undefined || value === null) ? '' : String(value)\n\t\t},\n\n\t\t/**\n\t\t * A text filter changed.\n\t\t *\n\t\t * @param {string} key The filter key.\n\t\t * @param {string} value The typed value.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonTextChange(key, value) {\n\t\t\tconst text = String(value ?? '').trim()\n\t\t\tthis.$emit('filter-change', { key, values: text === '' ? [] : [text] })\n\t\t},\n\n\t\t/**\n\t\t * Load the rows a `reference` filter picks from.\n\t\t *\n\t\t * Reads `optionsSource` off the schema property:\n\t\t * `{ register, schema, labelField, valueField, limit }`. The VALUE is\n\t\t * the referenced object's uuid, because that is what the server\n\t\t * filters on; the label is only what the person reads.\n\t\t *\n\t\t * Failures are logged and leave the picker empty rather than throwing:\n\t\t * one unreachable list must not take the whole sidebar with it.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when every reference filter settled.\n\t\t */\n\t\tasync loadReferenceOptions() {\n\t\t\tconst pending = this.schemaFilters.filter((filter) => filter.type === 'reference'\n\t\t\t\t&& filter.optionsSource\n\t\t\t\t&& this.referenceOptions[filter.key] === undefined\n\t\t\t\t&& this.referenceLoading[filter.key] !== true)\n\t\t\tif (pending.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\timport('@nextcloud/router'),\n\t\t\t])\n\n\t\t\tawait Promise.all(pending.map(async (filter) => {\n\t\t\t\tconst source = filter.optionsSource\n\t\t\t\tif (!source.register || !source.schema) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.referenceLoading = { ...this.referenceLoading, [filter.key]: true }\n\t\t\t\ttry {\n\t\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', {\n\t\t\t\t\t\tregister: source.register,\n\t\t\t\t\t\tschema: source.schema,\n\t\t\t\t\t})\n\t\t\t\t\tconst response = await axios.get(url, { params: { _limit: source.limit || 200 } })\n\t\t\t\t\tconst rows = response?.data?.results || response?.data || []\n\t\t\t\t\tconst valueField = source.valueField || '@self.uuid'\n\t\t\t\t\tconst labelField = source.labelField || 'title'\n\t\t\t\t\tconst options = rows\n\t\t\t\t\t\t.map((row) => ({\n\t\t\t\t\t\t\tid: this.readPath(row, valueField),\n\t\t\t\t\t\t\tlabel: String(this.readPath(row, labelField) ?? this.readPath(row, valueField) ?? ''),\n\t\t\t\t\t\t}))\n\t\t\t\t\t\t.filter((option) => option.id !== null && option.id !== undefined && option.id !== '')\n\t\t\t\t\t\t.sort((a, b) => a.label.localeCompare(b.label))\n\t\t\t\t\tthis.referenceOptions = { ...this.referenceOptions, [filter.key]: options }\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(`[CnIndexSidebar] the reference filter \"${filter.key}\" could not load its options`, error)\n\t\t\t\t\tthis.referenceOptions = { ...this.referenceOptions, [filter.key]: [] }\n\t\t\t\t} finally {\n\t\t\t\t\tthis.referenceLoading = { ...this.referenceLoading, [filter.key]: false }\n\t\t\t\t}\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Read a dotted path off a row (`@self.uuid`, `title`).\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {string} path The dotted path.\n\t\t *\n\t\t * @return {unknown} The value, or undefined.\n\t\t */\n\t\treadPath(row, path) {\n\t\t\treturn String(path).split('.').reduce((acc, part) => ((acc === null || acc === undefined) ? acc : acc[part]), row)\n\t\t},\n\n\t\t/**\n\t\t * Get currently selected options for a filter\n\t\t *\n\t\t * @param {object} filter Filter object\n\t\t */\n\t\tgetSelectedFilterOptions(filter) {\n\t\t\tconst value = this.activeFilters[filter.key]\n\t\t\tif (!value) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst values = Array.isArray(value) ? value : [value]\n\t\t\tconst options = this.getFilterOptions(filter)\n\t\t\treturn values.map((v) => options.find((o) => o.id === v) || { id: v, label: String(v) })\n\t\t},\n\n\t\t/**\n\t\t * Handle filter select change\n\t\t *\n\t\t * @param {string} key Filter key\n\t\t * @param {Array} selected Selected values\n\t\t */\n\t\tonFilterChange(key, selected) {\n\t\t\t// 🔴 A SINGLE-VALUED SELECT EMITS AN OBJECT, NOT AN ARRAY. NcSelect\n\t\t\t// changes the SHAPE of its payload with `multiple`, and `.map` on\n\t\t\t// the object shape throws inside an event handler, where Vue logs\n\t\t\t// it and carries on: the picker looks inert and the console says\n\t\t\t// why in a place nobody is looking.\n\t\t\tconst chosen = Array.isArray(selected) ? selected : (selected ? [selected] : [])\n\t\t\tconst values = chosen.map((o) => ((o && typeof o === 'object' && 'id' in o) ? o.id : o))\n\t\t\tthis.$emit('filter-change', { key, values })\n\t\t},\n\n\t\t/**\n\t\t * \"Clear all\" click: reset search and every active facet filter in\n\t\t * one shot, so the parent does one fetch instead of one per field.\n\t\t */\n\t\tonClearAll() {\n\t\t\t/**\n\t\t\t * @event clear-filters \"Clear all\" clicked; reset search and every active filter.\n\t\t\t */\n\t\t\tthis.$emit('clear-filters')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/index-sidebar.css -->\n"],"names":["CnSavedViewsPanel","CnDateRangePicker","CnIcon","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnIndexSidebar.vue2.js","sources":["../../../../src/components/CnIndexSidebar/CnIndexSidebar.vue"],"sourcesContent":["<template>\n\t<NcAppSidebar\n\t\tv-model:open=\"internalOpen\"\n\t\tclass=\"cn-index-sidebar-panel\"\n\t\t:name=\"resolvedName\"\n\t\t:title=\"resolvedName\"\n\t\t:subname=\"resolvedSubname\"\n\t\t:active=\"internalActiveTab\"\n\t\t:compact=\"!!resolvedIcon\"\n\t\t@close=\"$emit('update:open', false)\"\n\t\t@update:active=\"onTabChange\">\n\t\t<!-- Schema icon in sidebar header -->\n\t\t<template v-if=\"resolvedIcon\" #header>\n\t\t\t<div class=\"cn-index-sidebar__header-icon\">\n\t\t\t\t<CnIcon :name=\"resolvedIcon\" :size=\"32\" />\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- Search Tab -->\n\t\t<NcAppSidebarTab\n\t\t\tid=\"search-tab\"\n\t\t\t:name=\"searchTabLabel\"\n\t\t\t:order=\"1\">\n\t\t\t<template #icon>\n\t\t\t\t<FilterOutline :size=\"20\" />\n\t\t\t</template>\n\n\t\t\t<div class=\"cn-index-sidebar__tab-content\">\n\t\t\t\t<div v-if=\"$slots['search-above']\" class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<slot name=\"search-above\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t:modelValue=\"searchValue || ''\"\n\t\t\t\t\t\t:placeholder=\"searchPlaceholder\"\n\t\t\t\t\t\t:label=\"searchLabel\"\n\t\t\t\t\t\t@update:modelValue=\"$emit('search', $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Sort (list, card and map views; the table sorts by its headers):\n\t\t\t\t the field, the direction and the order the list has now. -->\n\t\t\t\t<div v-if=\"sortOptions.length > 0\" class=\"cn-index-sidebar__section cn-index-sidebar__sort\" data-testid=\"cn-index-sidebar-sort\">\n\t\t\t\t\t<h3>{{ t('nextcloud-vue', 'Sort') }}</h3>\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:modelValue=\"sortSelected\"\n\t\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\t:inputLabel=\"t('nextcloud-vue', 'Sort by')\"\n\t\t\t\t\t\t@update:modelValue=\"onSortField\" />\n\t\t\t\t\t<div class=\"cn-index-sidebar__sort-direction\" role=\"radiogroup\" :aria-label=\"t('nextcloud-vue', 'Direction')\">\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"cn-index-sidebar-sort-direction\"\n\t\t\t\t\t\t\tvalue=\"asc\"\n\t\t\t\t\t\t\t:modelValue=\"sortDirection\"\n\t\t\t\t\t\t\t:disabled=\"!sortSelected || sortSelected.fixed === true\"\n\t\t\t\t\t\t\t@update:modelValue=\"onSortDirection\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Ascending') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"cn-index-sidebar-sort-direction\"\n\t\t\t\t\t\t\tvalue=\"desc\"\n\t\t\t\t\t\t\t:modelValue=\"sortDirection\"\n\t\t\t\t\t\t\t:disabled=\"!sortSelected || sortSelected.fixed === true\"\n\t\t\t\t\t\t\t@update:modelValue=\"onSortDirection\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Descending') }}\n\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t</div>\n\t\t\t\t\t<p class=\"cn-index-sidebar__sort-current\" data-testid=\"cn-index-sidebar-sort-current\">\n\t\t\t\t\t\t{{ currentSortText }}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"hasActiveFilters\" class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<NcButton variant=\"tertiary\" @click=\"onClearAll\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<FilterRemoveOutline :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ clearAllLabel }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\n\t\t\t\t<div v-if=\"schemaFilters.length > 0\" class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<h3>{{ filtersLabel }}</h3>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-for=\"filter in schemaFilters\"\n\t\t\t\t\t\t:key=\"filter.key\"\n\t\t\t\t\t\tclass=\"cn-index-sidebar__filter-group\">\n\t\t\t\t\t\t<div class=\"cn-index-sidebar__filter-header\">\n\t\t\t\t\t\t\t<span class=\"cn-index-sidebar__filter-label\">{{ filter.label }}</span>\n\t\t\t\t\t\t\t<NcPopover v-if=\"filter.description\" popupRole=\"dialog\">\n\t\t\t\t\t\t\t\t<template #trigger>\n\t\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\t\tvariant=\"tertiary-no-background\"\n\t\t\t\t\t\t\t\t\t\t:aria-label=\"filter.label + ' info'\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-index-sidebar__info-btn\">\n\t\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t\t<InformationOutline :size=\"16\" />\n\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<p class=\"cn-index-sidebar__filter-description\">\n\t\t\t\t\t\t\t\t\t{{ filter.description }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</NcPopover>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- A window, not a list of values: two bounds and a\n\t\t\t\t\t\t preset, emitted as the `{ from, to }` the range\n\t\t\t\t\t\t filters upstream are already spelled in. -->\n\t\t\t\t\t\t<CnDateRangePicker\n\t\t\t\t\t\t\tv-if=\"filter.type === 'date-range'\"\n\t\t\t\t\t\t\tclass=\"cn-index-sidebar__date-range\"\n\t\t\t\t\t\t\t:modelValue=\"getRangeValue(filter)\"\n\t\t\t\t\t\t\t:presets=\"filter.presets || rangePresets\"\n\t\t\t\t\t\t\t:fromLabel=\"filter.fromLabel || fromLabel\"\n\t\t\t\t\t\t\t:toLabel=\"filter.toLabel || toLabel\"\n\t\t\t\t\t\t\t:presetLabel=\"filter.label\"\n\t\t\t\t\t\t\t@update:modelValue=\"onRangeChange(filter.key, $event)\" />\n\t\t\t\t\t\t<NcTextField\n\t\t\t\t\t\t\tv-else-if=\"filter.type === 'text'\"\n\t\t\t\t\t\t\tclass=\"cn-index-sidebar__filter-text\"\n\t\t\t\t\t\t\t:modelValue=\"getTextValue(filter)\"\n\t\t\t\t\t\t\t:label=\"filter.label\"\n\t\t\t\t\t\t\t:placeholder=\"filter.label\"\n\t\t\t\t\t\t\t@update:modelValue=\"onTextChange(filter.key, $event)\" />\n\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\tclass=\"cn-index-sidebar__select\"\n\t\t\t\t\t\t\t:modelValue=\"getSelectedFilterOptions(filter)\"\n\t\t\t\t\t\t\t:options=\"getFilterOptions(filter)\"\n\t\t\t\t\t\t\t:loading=\"isLoadingOptions(filter)\"\n\t\t\t\t\t\t\tplaceholder=\"Select...\"\n\t\t\t\t\t\t\t:inputLabel=\"filter.label\"\n\t\t\t\t\t\t\t:multiple=\"filter.multiple !== false\"\n\t\t\t\t\t\t\t:keepOpen=\"filter.multiple !== false\"\n\t\t\t\t\t\t\t:clearable=\"true\"\n\t\t\t\t\t\t\t@update:modelValue=\"onFilterChange(filter.key, $event)\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<slot name=\"search-extra\" />\n\t\t\t</div>\n\t\t</NcAppSidebarTab>\n\n\t\t<!-- Columns Tab -->\n\t\t<NcAppSidebarTab\n\t\t\tid=\"columns-tab\"\n\t\t\t:name=\"columnsTabLabel\"\n\t\t\t:order=\"2\">\n\t\t\t<template #icon>\n\t\t\t\t<ViewColumnOutline :size=\"20\" />\n\t\t\t</template>\n\n\t\t\t<div class=\"cn-index-sidebar__tab-content\">\n\t\t\t\t<div class=\"cn-sidebar-columns\">\n\t\t\t\t\t<h3>{{ columnsHeading }}</h3>\n\t\t\t\t\t<p class=\"cn-sidebar-columns__description\">\n\t\t\t\t\t\t{{ columnsDescription }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Order and pin the visible columns. Drag and the Move buttons\n\t\t\t\t\t call the same method (moveColumn); the table header is not a drag target. -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"personalColumns && orderedVisible.length > 0\"\n\t\t\t\t\t\tclass=\"cn-sidebar-columns__order\"\n\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-order\">\n\t\t\t\t\t\t<h4>{{ t('nextcloud-vue', 'Order and pin') }}</h4>\n\t\t\t\t\t\t<ol class=\"cn-sidebar-columns__order-list\">\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tv-for=\"(item, index) in orderedVisible\"\n\t\t\t\t\t\t\t\t:key=\"item.key\"\n\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__order-item\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-sidebar-columns__order-item--pinned': index < pinnedCount }\"\n\t\t\t\t\t\t\t\tdraggable=\"true\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-order-item\"\n\t\t\t\t\t\t\t\t@dragstart=\"dragFrom = index\"\n\t\t\t\t\t\t\t\t@dragover.prevent\n\t\t\t\t\t\t\t\t@drop.prevent=\"onDropColumn(index)\">\n\t\t\t\t\t\t\t\t<DragVertical :size=\"18\" class=\"cn-sidebar-columns__handle\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<span class=\"cn-sidebar-columns__order-label\">{{ item.label }}</span>\n\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:disabled=\"index === 0 || index === pinnedCount\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Move {column} up', { column: item.label })\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-up\"\n\t\t\t\t\t\t\t\t\t@click=\"moveColumn(index, index - 1)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<ChevronUp :size=\"18\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:disabled=\"index === orderedVisible.length - 1 || index === pinnedCount - 1\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Move {column} down', { column: item.label })\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-down\"\n\t\t\t\t\t\t\t\t\t@click=\"moveColumn(index, index + 1)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<ChevronDown :size=\"18\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:aria-pressed=\"String(index < pinnedCount)\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"index < pinnedCount ? t('nextcloud-vue', 'Unpin {column}', { column: item.label }) : t('nextcloud-vue', 'Pin {column}', { column: item.label })\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-pin\"\n\t\t\t\t\t\t\t\t\t@click=\"togglePin(index)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<Pin v-if=\"index < pinnedCount\" :size=\"18\" />\n\t\t\t\t\t\t\t\t\t\t<PinOutline v-else :size=\"18\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tdata-testid=\"cn-sidebar-columns-reset\"\n\t\t\t\t\t\t\t@click=\"$emit('columns-reset')\">\n\t\t\t\t\t\t\t{{ t('nextcloud-vue', 'Reset columns') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<template v-if=\"allColumns.length > 0 || allGroups.length > 0\">\n\t\t\t\t\t\t<!-- Schema properties group (collapsible) -->\n\t\t\t\t\t\t<div v-if=\"allColumns.length > 0\" class=\"cn-sidebar-columns__group cn-sidebar-columns__group--collapsible\">\n\t\t\t\t\t\t\t<div class=\"cn-sidebar-columns__group-header\" @click=\"propertiesExpanded = !propertiesExpanded\">\n\t\t\t\t\t\t\t\t<ChevronDown v-if=\"propertiesExpanded\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ChevronRight v-else :size=\"20\" />\n\t\t\t\t\t\t\t\t<h4>{{ resolvedPropertiesLabel }}</h4>\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"isGroupAllVisible(allColumns)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__select-all\"\n\t\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleGroupAll(allColumns)\">\n\t\t\t\t\t\t\t\t\tAll\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-if=\"propertiesExpanded\" class=\"cn-sidebar-columns__group-content\">\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\tv-for=\"col in allColumns\"\n\t\t\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t\t\t:modelValue=\"isColumnVisible(col.key)\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleColumn(col.key)\">\n\t\t\t\t\t\t\t\t\t{{ col.label }}\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Extra column groups (built-in Metadata + external) -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"group in allGroups\"\n\t\t\t\t\t\t\t:key=\"group.id\"\n\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__group cn-sidebar-columns__group--collapsible\">\n\t\t\t\t\t\t\t<div class=\"cn-sidebar-columns__group-header\" @click=\"toggleGroup(group.id)\">\n\t\t\t\t\t\t\t\t<ChevronDown v-if=\"expandedGroups[group.id]\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ChevronRight v-else :size=\"20\" />\n\t\t\t\t\t\t\t\t<h4 :lang=\"langOf(group.label)\">\n\t\t\t\t\t\t\t\t\t{{ shown(group.label) }}\n\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"isGroupAllVisible(group.columns)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-sidebar-columns__select-all\"\n\t\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleGroupAll(group.columns)\">\n\t\t\t\t\t\t\t\t\tAll\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-if=\"expandedGroups[group.id]\" class=\"cn-sidebar-columns__group-content\">\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\tv-for=\"col in group.columns\"\n\t\t\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t\t\t:modelValue=\"isColumnVisible(col.key)\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleColumn(col.key)\">\n\t\t\t\t\t\t\t\t\t{{ shown(col.label) }}\n\t\t\t\t\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<p v-else class=\"cn-sidebar-columns__empty\">\n\t\t\t\t\t\tNo columns available. Provide a schema to auto-generate columns.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<slot name=\"columns-extra\" />\n\t\t\t</div>\n\t\t</NcAppSidebarTab>\n\n\t\t<!-- Views tab (id filters-tab): the page's saved views (save, list, manage, add to menu). -->\n\t\t<NcAppSidebarTab\n\t\t\tv-if=\"savedViews\"\n\t\t\tid=\"filters-tab\"\n\t\t\t:name=\"t('nextcloud-vue', 'Views')\"\n\t\t\t:order=\"3\">\n\t\t\t<template #icon>\n\t\t\t\t<BookmarkOutline :size=\"20\" />\n\t\t\t</template>\n\n\t\t\t<div class=\"cn-index-sidebar__tab-content\">\n\t\t\t\t<div class=\"cn-index-sidebar__section\">\n\t\t\t\t\t<CnSavedViewsPanel\n\t\t\t\t\t\tv-bind=\"savedViewsPanelProps\"\n\t\t\t\t\t\t@apply=\"onSavedView('apply', $event)\"\n\t\t\t\t\t\t@saveRequest=\"onSavedView('save', null)\"\n\t\t\t\t\t\t@editRequest=\"onSavedView('edit', $event)\"\n\t\t\t\t\t\t@shareRequest=\"onSavedView('share', $event)\"\n\t\t\t\t\t\t@updateRequest=\"onSavedView('update', $event)\"\n\t\t\t\t\t\t@copyRequest=\"onSavedView('copy', $event)\"\n\t\t\t\t\t\t@menuToggle=\"onSavedView('menu', $event)\"\n\t\t\t\t\t\t@deleteRequest=\"onSavedView('delete', $event)\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</NcAppSidebarTab>\n\n\t\t<!-- Extra tabs injected by the consumer -->\n\t\t<slot name=\"tabs\" />\n\t</NcAppSidebar>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcAppSidebar, NcAppSidebarTab, NcButton, NcCheckboxRadioSwitch, NcPopover, NcSelect, NcTextField } from '@nextcloud/vue'\nimport BookmarkOutline from 'vue-material-design-icons/BookmarkOutline.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport DragVertical from 'vue-material-design-icons/DragVertical.vue'\nimport FilterOutline from 'vue-material-design-icons/FilterOutline.vue'\nimport FilterRemoveOutline from 'vue-material-design-icons/FilterRemoveOutline.vue'\nimport InformationOutline from 'vue-material-design-icons/InformationOutline.vue'\nimport Pin from 'vue-material-design-icons/Pin.vue'\nimport PinOutline from 'vue-material-design-icons/PinOutline.vue'\nimport ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport CnSavedViewsPanel from '../CnSavedViewsPanel/CnSavedViewsPanel.vue'\nimport { METADATA_COLUMNS } from '../../constants/metadata.js'\nimport { facetOptions } from '../../utils/facets.js'\nimport { labelLang } from '../../utils/manifestTranslate.js'\nimport { columnsFromSchema, filtersFromSchema } from '../../utils/schema.js'\nimport { reverseSortKeys, sameSortKeys } from '../../utils/sortOrder.js'\nimport { CnDateRangePicker, DEFAULT_DATE_RANGE_PRESETS } from '../CnDateRangePicker/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnIndexSidebar — Reusable NcAppSidebar wrapper with Search + Columns tabs.\n *\n * Designed to be schema-driven: pass a schema and the sidebar auto-generates\n * search filters, column visibility controls, and the standard Metadata group.\n * Title and properties group label are derived from schema.title by default.\n *\n * Must be rendered at the App.vue level as a sibling of NcAppContent.\n * Use provide/inject to connect it to page components.\n *\n * @slot search-above - Content rendered above the search field in the Search tab (e.g. hints, quick actions).\n * @slot search-extra - Content rendered below the search field and filters in the Search tab (e.g. saved searches).\n */\nexport default {\n\tname: 'CnIndexSidebar',\n\n\tcomponents: {\n\t\tNcAppSidebar,\n\t\tNcAppSidebarTab,\n\t\tCnSavedViewsPanel,\n\t\tBookmarkOutline,\n\t\tNcTextField,\n\t\tNcSelect,\n\t\tCnDateRangePicker,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcPopover,\n\t\tNcButton,\n\t\tCnIcon,\n\t\tFilterOutline,\n\t\tFilterRemoveOutline,\n\t\tViewColumnOutline,\n\t\tChevronDown,\n\t\tChevronRight,\n\t\tChevronUp,\n\t\tDragVertical,\n\t\tPin,\n\t\tPinOutline,\n\t\tInformationOutline,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Consumer translation function, provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). Column and\n\t\t * filter labels come from schema property titles, authored in English as\n\t\t * the canonical source; the visible label is resolved through this\n\t\t * function so it follows the user's language. Defaults to identity when\n\t\t * used standalone (no CnAppRoot ancestor).\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Sidebar title. Defaults to schema.title when not set. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name or emoji. Defaults to schema.icon when not set. */\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Schema object for auto-generating filters, columns, and labels */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Array of currently visible column keys */\n\t\tvisibleColumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Show the Order and pin controls in the Columns tab, and Reset columns.\n\t\t * Off keeps show and hide only.\n\t\t */\n\t\tpersonalColumns: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** How many of the first visible columns are pinned to the start of the table. */\n\t\tpinnedCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * The orders the Sort section offers, `[{ value, label, keys, fixed? }]`,\n\t\t * each `keys` a `[{ key, order }]` list read as its ascending form. An\n\t\t * option with `fixed: true` is an order of its own (the rows an endpoint\n\t\t * ranks): it is chosen by its value, has no direction, and its keys are\n\t\t * not matched against the current order. Empty draws no Sort section\n\t\t * (the table view sorts by its headers).\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The list's current order, `[{ key, order }]`. */\n\t\tcurrentSort: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The Sort option chosen by its value, for an order that is not a list\n\t\t * of sort keys (an option with `fixed: true`, such as one whose rows an\n\t\t * endpoint ranks). Wins over matching `currentSort`.\n\t\t */\n\t\tcurrentSortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Current search term */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether sidebar is open */\n\t\topen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current active facet filters: { fieldName: [values] } */\n\t\tactiveFilters: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Live facet data from the API: `{ fieldName: { values: [{ value, count?, label? }] } }` */\n\t\tfacetData: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * Additional column groups beyond schema properties and the built-in Metadata.\n\t\t * Each group: { id: string, label: string, columns: Array<{key, label}>, expanded?: boolean }\n\t\t */\n\t\tcolumnGroups: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Whether to include the built-in Metadata column group */\n\t\tshowMetadata: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Search input placeholder */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Type to search…'),\n\t\t},\n\n\t\t/** Search tab label */\n\t\tsearchTabLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Search'),\n\t\t},\n\n\t\t/** Columns tab label */\n\t\tcolumnsTabLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Columns'),\n\t\t},\n\n\t\t/** Search section heading */\n\t\tsearchLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Search'),\n\t\t},\n\n\t\t/** Filters section heading */\n\t\tfiltersLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Filters'),\n\t\t},\n\n\t\t/** \"Clear all\" button label, shown when search or a filter is active */\n\t\tclearAllLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Clear all'),\n\t\t},\n\n\t\t/**\n\t\t * Filter declarations for a page with no schema of its own: `{ name: declaration }`, the same shape a schema property has. Wins over `schema`, and feeds the Search tab only.\n\t\t *\n\t\t * 🔑 A FILTER IS NOT A COLUMN, which is the whole reason this is its\n\t\t * own prop rather than a synthetic `schema`. The schema feeds BOTH\n\t\t * tabs, so a page that declared its filters there would also offer\n\t\t * them in the Columns tab: the toggle would tick and no column would\n\t\t * appear, because the table's columns come from somewhere else\n\t\t * entirely. These reach the Search tab and nothing else.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tfilterFields: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Start-of-window label on a date-range filter. */\n\t\tfromLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'From'),\n\t\t},\n\n\t\t/** End-of-window label on a date-range filter. */\n\t\ttoLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'To'),\n\t\t},\n\n\t\t/** Columns section heading */\n\t\tcolumnsHeading: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Column visibility'),\n\t\t},\n\n\t\t/** Columns section description */\n\t\tcolumnsDescription: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Select which columns to display in the table'),\n\t\t},\n\n\t\t/** Override label for the schema properties group. Defaults to schema.title. */\n\t\tpropertiesGroupLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * ID of the tab that should be active when the sidebar opens.\n\t\t * Built-in IDs are 'search-tab' and 'columns-tab'.\n\t\t * Use the id you set on your custom NcAppSidebarTab for custom tabs.\n\t\t */\n\t\tdefaultTab: {\n\t\t\ttype: String,\n\t\t\tdefault: 'search-tab',\n\t\t},\n\n\t\t/**\n\t\t * Switch to a tab while the sidebar is mounted, e.g. `'filters-tab'`\n\t\t * after a view was saved from the toolbar. Empty leaves the tab alone.\n\t\t */\n\t\tactiveTab: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The page's saved views, shown in the Filters tab:\n\t\t * `{ views, loading, currentUserId, counts, selectedViewId, maxDepth, menuIds }`\n\t\t * as `CnSavedViewsPanel` takes them. `null` shows no saved views.\n\t\t * Every intent comes back as one `saved-view` event.\n\t\t */\n\t\tsavedViews: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether the current user is an admin.\n\t\t * When false, schema properties with `adminOnly: true` are hidden from filters.\n\t\t */\n\t\tuserIsAdmin: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\n\temits: ['clear-filters', 'columns-change', 'columns-reorder', 'columns-reset', 'pin-change', 'filter-change', 'saved-view', 'search', 'sort-change', 'tab-change', 'update:open'],\n\n\tdata() {\n\t\treturn {\n\t\t\tinternalOpen: this.open,\n\t\t\tinternalActiveTab: this.defaultTab,\n\t\t\t/** Index of the column being dragged in the Order and pin list, or -1. */\n\t\t\tdragFrom: -1,\n\t\t\tpropertiesExpanded: true,\n\t\t\texpandedGroups: {},\n\t\t\t/**\n\t\t\t * Options loaded for a `reference` filter, keyed by field.\n\t\t\t *\n\t\t\t * A reference picker lists rows from ANOTHER list (the cases a\n\t\t\t * task can hang off, say), and neither the schema nor a facet\n\t\t\t * bucket carries them. Loaded once per field and cached, because\n\t\t\t * the sidebar re-renders on every keystroke in the search box.\n\t\t\t *\n\t\t\t * @type {Record<string, Array<{id: string, label: string}>>}\n\t\t\t */\n\t\t\treferenceOptions: {},\n\t\t\t/** @type {Record<string, boolean>} Which reference loads are in flight. */\n\t\t\treferenceLoading: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The Sort option the current order matches, as declared or reversed.\n\t\t *\n\t\t * @return {{option: object, direction: string}|null} The match, or null.\n\t\t */\n\t\tsortMatch() {\n\t\t\tif (this.currentSortValue) {\n\t\t\t\tconst chosen = this.sortOptions.find((o) => o.value === this.currentSortValue)\n\t\t\t\tif (chosen) {\n\t\t\t\t\treturn { option: chosen, direction: 'asc' }\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst current = Array.isArray(this.currentSort) ? this.currentSort : []\n\t\t\tfor (const option of this.sortOptions) {\n\t\t\t\tif (option.fixed === true) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst keys = Array.isArray(option.keys) ? option.keys : []\n\t\t\t\tif (sameSortKeys(keys, current)) {\n\t\t\t\t\treturn { option, direction: 'asc' }\n\t\t\t\t}\n\t\t\t\tif (sameSortKeys(reverseSortKeys(keys), current)) {\n\t\t\t\t\treturn { option, direction: 'desc' }\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/** @return {object|null} The Sort option shown as chosen. */\n\t\tsortSelected() {\n\t\t\treturn this.sortMatch ? this.sortMatch.option : null\n\t\t},\n\n\t\t/** @return {string} The chosen direction, `asc` or `desc`. */\n\t\tsortDirection() {\n\t\t\treturn this.sortMatch ? this.sortMatch.direction : 'asc'\n\t\t},\n\n\t\t/**\n\t\t * The order the list has now, in words: \"Current order: Created,\n\t\t * descending\", or that it is not sorted.\n\t\t *\n\t\t * @return {string} The sentence.\n\t\t */\n\t\tcurrentSortText() {\n\t\t\tif (this.sortMatch && this.sortMatch.option.fixed === true) {\n\t\t\t\treturn t('nextcloud-vue', 'Current order: {order}', { order: this.sortMatch.option.label })\n\t\t\t}\n\t\t\tconst current = Array.isArray(this.currentSort) ? this.currentSort : []\n\t\t\tif (current.length === 0) {\n\t\t\t\treturn t('nextcloud-vue', 'Not sorted')\n\t\t\t}\n\t\t\tconst labelOf = (key) => {\n\t\t\t\tconst single = this.sortOptions.find((o) => Array.isArray(o.keys) && o.keys.length === 1 && o.keys[0].key === key)\n\t\t\t\treturn single ? single.label : key\n\t\t\t}\n\t\t\tconst order = this.sortMatch && this.sortMatch.option.keys.length > 1\n\t\t\t\t? `${this.sortMatch.option.label}, ${this.sortDirection === 'desc' ? t('nextcloud-vue', 'descending') : t('nextcloud-vue', 'ascending')}`\n\t\t\t\t: current.map((entry) => `${labelOf(entry.key)}, ${entry.order === 'desc' ? t('nextcloud-vue', 'descending') : t('nextcloud-vue', 'ascending')}`).join('; ')\n\t\t\treturn t('nextcloud-vue', 'Current order: {order}', { order })\n\t\t},\n\n\t\t/**\n\t\t * The panel's props, from `savedViews`.\n\t\t *\n\t\t * @return {object}\n\t\t * @spec openspec/changes/saved-views-manage-and-defaults/tasks.md#task-6\n\t\t */\n\t\tsavedViewsPanelProps() {\n\t\t\tconst f = this.savedViews || {}\n\t\t\treturn {\n\t\t\t\tviews: Array.isArray(f.views) ? f.views : [],\n\t\t\t\tloading: f.loading === true,\n\t\t\t\tcurrentUserId: f.currentUserId || '',\n\t\t\t\tcounts: f.counts || null,\n\t\t\t\tselectedViewId: f.selectedViewId || '',\n\t\t\t\tmaxDepth: typeof f.maxDepth === 'number' ? f.maxDepth : 3,\n\t\t\t\tmenuIds: Array.isArray(f.menuIds) ? f.menuIds : null,\n\t\t\t}\n\t\t},\n\n\t\t/** Resolved icon — explicit prop overrides schema.icon */\n\t\tresolvedIcon() {\n\t\t\treturn this.icon || this.schema?.icon || ''\n\t\t},\n\n\t\t/** Sidebar name — schema title, shown as the h2 header */\n\t\tresolvedName() {\n\t\t\tif (this.title) {\n\t\t\t\treturn this.shown(this.title)\n\t\t\t}\n\t\t\treturn this.schema?.title || 'Search'\n\t\t},\n\n\t\t/** Sidebar subname — schema description, shown below the name */\n\t\tresolvedSubname() {\n\t\t\treturn this.schema?.description || ''\n\t\t},\n\n\t\t/** Properties group label — derived from schema.title if not explicitly set */\n\t\tresolvedPropertiesLabel() {\n\t\t\tif (this.propertiesGroupLabel) {\n\t\t\t\treturn this.propertiesGroupLabel\n\t\t\t}\n\t\t\treturn this.schema?.title || 'Properties'\n\t\t},\n\n\t\t/** All available columns from schema */\n\t\tallColumns() {\n\t\t\tif (!this.schema) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn columnsFromSchema(this.schema, { translate: this.cnTranslate })\n\t\t},\n\n\t\t/** Filter definitions from schema (facetable properties, respecting RBAC) */\n\t\tschemaFilters() {\n\t\t\t// An explicitly declared filter set wins: it is the page saying\n\t\t\t// \"these are the questions\", where a schema only says \"these are\n\t\t\t// the properties\" and the sidebar has to guess which of them are\n\t\t\t// worth asking about.\n\t\t\tif (this.filterFields && Object.keys(this.filterFields).length > 0) {\n\t\t\t\treturn filtersFromSchema(\n\t\t\t\t\t{ properties: this.filterFields },\n\t\t\t\t\t{ isAdmin: this.userIsAdmin, translate: this.cnTranslate },\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (!this.schema) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn filtersFromSchema(this.schema, { isAdmin: this.userIsAdmin, translate: this.cnTranslate })\n\t\t},\n\n\t\t/** Whether a search term or any facet filter is currently active. */\n\t\thasActiveFilters() {\n\t\t\tif ((this.searchValue || '').length > 0) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn Object.values(this.activeFilters || {}).some((v) => (Array.isArray(v) ? v.length > 0 : !!v))\n\t\t},\n\n\t\t/** Combined column groups: built-in Metadata + external groups */\n\t\tallGroups() {\n\t\t\tconst groups = []\n\t\t\tif (this.showMetadata && this.schema) {\n\t\t\t\tgroups.push({\n\t\t\t\t\tid: 'metadata',\n\t\t\t\t\tlabel: 'Metadata',\n\t\t\t\t\tcolumns: METADATA_COLUMNS,\n\t\t\t\t\texpanded: true,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn [...groups, ...this.columnGroups]\n\t\t},\n\n\t\t/** Label of each column key, from the schema properties and the groups. */\n\t\tcolumnLabels() {\n\t\t\tconst map = {}\n\t\t\tthis.allColumns.forEach((c) => {\n\t\t\t\tmap[c.key] = c.label\n\t\t\t})\n\t\t\tthis.allGroups.forEach((g) => g.columns.forEach((c) => {\n\t\t\t\tmap[c.key] = c.label\n\t\t\t}))\n\t\t\treturn map\n\t\t},\n\n\t\t/** The visible columns in their order, with labels (all columns when none were chosen). */\n\t\torderedVisible() {\n\t\t\tconst keys = this.visibleColumns === null ? this.allColumnKeys : this.visibleColumns\n\t\t\treturn keys.filter((k) => this.columnLabels[k] !== undefined).map((key) => ({ key, label: this.columnLabels[key] }))\n\t\t},\n\n\t\t/** All column keys across schema properties and all groups */\n\t\tallColumnKeys() {\n\t\t\treturn [\n\t\t\t\t...this.allColumns.map((c) => c.key),\n\t\t\t\t...this.allGroups.flatMap((g) => g.columns.map((c) => c.key)),\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * The presets a date-range filter offers when it declares none.\n\t\t *\n\t\t * Just `custom`. Every shipped preset rolls BACKWARDS from today\n\t\t * (\"Last 30 days\"), and a sidebar filter is as often a forward window\n\t\t * (\"due next week\") as a backward one. Offering a preset that answers\n\t\t * the wrong direction is worse than offering none: it is one click and\n\t\t * it looks deliberate.\n\t\t *\n\t\t * @return {Array<object>} The preset list.\n\t\t */\n\t\trangePresets() {\n\t\t\t// Taken FROM the picker's own list rather than written out again, so\n\t\t\t// the one preset a filter offers carries the same id and the same\n\t\t\t// label as everywhere else it appears.\n\t\t\treturn DEFAULT_DATE_RANGE_PRESETS\n\t\t\t\t.filter((preset) => preset.id === 'custom')\n\t\t\t\t.map((preset) => ({ ...preset }))\n\t\t},\n\t},\n\n\twatch: {\n\t\tactiveTab(tab) {\n\t\t\tif (tab) {\n\t\t\t\tthis.internalActiveTab = tab\n\t\t\t}\n\t\t},\n\n\t\topen(val) {\n\t\t\tthis.internalOpen = val\n\t\t},\n\n\t\tinternalOpen(val) {\n\t\t\tthis.$emit('update:open', val)\n\t\t},\n\n\t\tdefaultTab(val) {\n\t\t\tthis.internalActiveTab = val\n\t\t},\n\n\t\tallGroups: {\n\t\t\timmediate: true,\n\t\t\thandler(groups) {\n\t\t\t\tfor (const group of groups) {\n\t\t\t\t\tif (!(group.id in this.expandedGroups)) {\n\t\t\t\t\t\tthis.expandedGroups[group.id] = group.expanded !== false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\t// A reference picker's rows load once the schema naming them arrives,\n\t\t// which on a manifest page is after mount. Watching the FILTERS rather\n\t\t// than calling from `mounted()` covers both orders.\n\t\tschemaFilters: {\n\t\t\timmediate: true,\n\t\t\thandler() {\n\t\t\t\tthis.loadReferenceOptions()\n\t\t\t},\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A field chosen in the Sort section: its order, in the direction\n\t\t * already chosen.\n\t\t *\n\t\t * @param {object|null} option The chosen option.\n\t\t * @return {void}\n\t\t */\n\t\tonSortField(option) {\n\t\t\tconst chosen = option && this.sortOptions.find((o) => o.value === option.value)\n\t\t\tif (!chosen) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.emitSort(chosen, this.sortDirection)\n\t\t},\n\n\t\t/**\n\t\t * A direction chosen in the Sort section, for the chosen field.\n\t\t *\n\t\t * @param {string} direction `asc` or `desc`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortDirection(direction) {\n\t\t\tif (!this.sortSelected) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.emitSort(this.sortSelected, direction === 'desc' ? 'desc' : 'asc')\n\t\t},\n\n\t\t/**\n\t\t * Emit the order an option stands for in a direction.\n\t\t *\n\t\t * @param {object} option The Sort option.\n\t\t * @param {string} direction `asc` or `desc`.\n\t\t * @return {void}\n\t\t */\n\t\temitSort(option, direction) {\n\t\t\tconst keys = Array.isArray(option.keys) ? option.keys : []\n\t\t\t/**\n\t\t\t * @event sort-change The Sort section chose an order. Payload: `[{ key, order }]`,\n\t\t\t * and the chosen option's value, which names an order that is not keys (`fixed`).\n\t\t\t */\n\t\t\tthis.$emit('sort-change', direction === 'desc' ? reverseSortKeys(keys) : keys.map((k) => ({ key: k.key, order: k.order || 'asc' })), option.value)\n\t\t},\n\n\t\t/**\n\t\t * Hand a saved-view intent to the page.\n\t\t *\n\t\t * @param {'apply'|'save'|'edit'|'share'|'presentation'|'update'|'copy'|'menu'|'delete'} action The intent.\n\t\t * @param {object|null} view The view, or null for save.\n\t\t * @spec openspec/changes/saved-views-manage-and-defaults/tasks.md#task-6\n\t\t */\n\t\tonSavedView(action, view) {\n\t\t\t/**\n\t\t\t * @event saved-view A saved-view intent from the Filters tab. Payload: `{ action, view }`.\n\t\t\t * @type {{action: string, view: (object|null)}}\n\t\t\t */\n\t\t\tthis.$emit('saved-view', { action, view })\n\t\t},\n\n\t\t/**\n\t\t * A manifest label through the injected lookup, or as written.\n\t\t *\n\t\t * @param {string} text The label as written.\n\t\t * @return {string} The label in the user's language.\n\t\t */\n\t\tshown(text) {\n\t\t\treturn typeof this.cnTranslate === 'function' && typeof text === 'string' && text !== '' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The `lang` of a label that fell back to its written text in another language.\n\t\t *\n\t\t * @param {string} text The label as written.\n\t\t * @return {string|undefined} The source language, or undefined.\n\t\t */\n\t\tlangOf(text) {\n\t\t\treturn labelLang(this.cnTranslate, text) || undefined\n\t\t},\n\n\t\t/**\n\t\t * Handle tab change from NcAppSidebar\n\t\t *\n\t\t * @param {string} tabId Tab identifier\n\t\t */\n\t\tonTabChange(tabId) {\n\t\t\tthis.internalActiveTab = tabId\n\t\t\tthis.$emit('tab-change', tabId)\n\t\t},\n\n\t\t/**\n\t\t * Check if a column is currently visible\n\t\t *\n\t\t * @param {string} key Column key\n\t\t */\n\t\tisColumnVisible(key) {\n\t\t\tif (this.visibleColumns === null) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn this.visibleColumns.includes(key)\n\t\t},\n\n\t\t/**\n\t\t * Check if all columns in a group are visible\n\t\t *\n\t\t * @param {string[]} columns Array of column keys\n\t\t */\n\t\tisGroupAllVisible(columns) {\n\t\t\treturn columns.every((col) => this.isColumnVisible(col.key))\n\t\t},\n\n\t\t/**\n\t\t * Toggle a single column's visibility\n\t\t *\n\t\t * @param {string} key Column key\n\t\t */\n\t\ttoggleColumn(key) {\n\t\t\tlet newVisible\n\t\t\tif (this.visibleColumns === null) {\n\t\t\t\tnewVisible = this.allColumnKeys.filter((k) => k !== key)\n\t\t\t} else if (this.isColumnVisible(key)) {\n\t\t\t\tnewVisible = this.visibleColumns.filter((k) => k !== key)\n\t\t\t} else {\n\t\t\t\tnewVisible = [...this.visibleColumns, key]\n\t\t\t}\n\t\t\tthis.$emit('columns-change', newVisible)\n\t\t},\n\n\t\t/**\n\t\t * Select or deselect all columns in a group\n\t\t *\n\t\t * @param {string[]} columns Array of column keys\n\t\t */\n\t\ttoggleGroupAll(columns) {\n\t\t\tconst groupKeys = columns.map((c) => c.key)\n\t\t\tconst allVisible = this.isGroupAllVisible(columns)\n\n\t\t\tlet newVisible\n\t\t\tif (this.visibleColumns === null) {\n\t\t\t\t// Currently all visible — deselect this group\n\t\t\t\tnewVisible = this.allColumnKeys.filter((k) => !groupKeys.includes(k))\n\t\t\t} else if (allVisible) {\n\t\t\t\t// All in group visible — deselect them\n\t\t\t\tnewVisible = this.visibleColumns.filter((k) => !groupKeys.includes(k))\n\t\t\t} else {\n\t\t\t\t// Not all visible — select them all\n\t\t\t\tconst current = new Set(this.visibleColumns)\n\t\t\t\tgroupKeys.forEach((k) => current.add(k))\n\t\t\t\tnewVisible = [...current]\n\t\t\t}\n\t\t\tthis.$emit('columns-change', newVisible)\n\t\t},\n\n\t\t/**\n\t\t * Move a visible column to another place in the order. The drag and the\n\t\t * Move buttons both call this. A column stays inside its block: pinned\n\t\t * columns move among the pinned, the rest among the rest.\n\t\t *\n\t\t * @param {number} from Current index.\n\t\t * @param {number} to Target index.\n\t\t * @return {void}\n\t\t */\n\t\tmoveColumn(from, to) {\n\t\t\tconst list = this.orderedVisible.map((c) => c.key)\n\t\t\tconst lo = from < this.pinnedCount ? 0 : this.pinnedCount\n\t\t\tconst hi = from < this.pinnedCount ? this.pinnedCount - 1 : list.length - 1\n\t\t\tconst target = Math.min(hi, Math.max(lo, to))\n\t\t\tif (from < 0 || from >= list.length || target === from) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst [moved] = list.splice(from, 1)\n\t\t\tlist.splice(target, 0, moved)\n\t\t\t/**\n\t\t\t * @event columns-reorder Emitted when the user moves a column. Payload: the visible column keys in their new order.\n\t\t\t * @type {string[]}\n\t\t\t */\n\t\t\tthis.$emit('columns-reorder', list)\n\t\t},\n\n\t\t/**\n\t\t * Dropping a dragged column on another row.\n\t\t *\n\t\t * @param {number} index Index of the row it was dropped on.\n\t\t * @return {void}\n\t\t */\n\t\tonDropColumn(index) {\n\t\t\tconst from = this.dragFrom\n\t\t\tthis.dragFrom = -1\n\t\t\tif (from >= 0) {\n\t\t\t\tthis.moveColumn(from, index)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pin a column (it joins the pinned block at the start) or unpin it (it\n\t\t * leaves that block, to the first place after it).\n\t\t *\n\t\t * @param {number} index Index of the column.\n\t\t * @return {void}\n\t\t */\n\t\ttogglePin(index) {\n\t\t\tconst list = this.orderedVisible.map((c) => c.key)\n\t\t\tconst [moved] = list.splice(index, 1)\n\t\t\tlet count = this.pinnedCount\n\t\t\tif (index < count) {\n\t\t\t\tcount -= 1\n\t\t\t\tlist.splice(count, 0, moved)\n\t\t\t} else {\n\t\t\t\tlist.splice(count, 0, moved)\n\t\t\t\tcount += 1\n\t\t\t}\n\t\t\tthis.$emit('columns-reorder', list)\n\t\t\t/**\n\t\t\t * @event pin-change Emitted when a column is pinned or unpinned. Payload: the new number of pinned columns.\n\t\t\t * @type {number}\n\t\t\t */\n\t\t\tthis.$emit('pin-change', count)\n\t\t},\n\n\t\t/**\n\t\t * Toggle a group's expanded state\n\t\t *\n\t\t * @param {string} groupId Filter group identifier\n\t\t */\n\t\ttoggleGroup(groupId) {\n\t\t\tthis.expandedGroups[groupId] = !this.expandedGroups[groupId]\n\t\t},\n\n\t\t/**\n\t\t * Get filter options for a filter definition\n\t\t *\n\t\t * @param {object} filter Filter object\n\t\t */\n\t\tgetFilterOptions(filter) {\n\t\t\tconst live = facetOptions(\n\t\t\t\tthis.facetData[filter.key],\n\t\t\t\t(count) => t('nextcloud-vue', 'No value ({count})', { count }),\n\t\t\t)\n\t\t\tif (live !== null) {\n\t\t\t\treturn live\n\t\t\t}\n\t\t\t// A reference picker's rows come from another list, and neither a\n\t\t\t// schema enum nor a facet bucket can carry them.\n\t\t\tif (filter.type === 'reference') {\n\t\t\t\treturn this.referenceOptions[filter.key] || []\n\t\t\t}\n\t\t\treturn filter.options || []\n\t\t},\n\n\t\t/**\n\t\t * Whether a reference filter is still fetching its rows.\n\t\t *\n\t\t * Shown rather than hidden: an empty picker that is still loading and\n\t\t * one that genuinely has nothing to pick look identical, and only one\n\t\t * of them means the person should stop waiting.\n\t\t *\n\t\t * @param {object} filter The filter definition.\n\t\t *\n\t\t * @return {boolean} True while the load is in flight.\n\t\t */\n\t\tisLoadingOptions(filter) {\n\t\t\treturn this.referenceLoading[filter.key] === true\n\t\t},\n\n\t\t/**\n\t\t * The `{ from, to }` window a date-range filter currently holds.\n\t\t *\n\t\t * @param {object} filter The filter definition.\n\t\t *\n\t\t * @return {object|null} The window, or null when none is set.\n\t\t */\n\t\tgetRangeValue(filter) {\n\t\t\tconst value = this.activeFilters[filter.key]\n\t\t\tif (value && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/**\n\t\t * A date-range filter changed.\n\t\t *\n\t\t * Emitted in the SAME `filter-change` shape every other control uses,\n\t\t * with the window as the payload's `values`, so a consumer has one\n\t\t * event to listen to and not two.\n\t\t *\n\t\t * @param {string} key The filter key.\n\t\t * @param {object|null} window The `{ from, to, preset }` value.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonRangeChange(key, window) {\n\t\t\tconst from = (window && window.from) || ''\n\t\t\tconst to = (window && window.to) || ''\n\t\t\tif (from === '' && to === '') {\n\t\t\t\tthis.$emit('filter-change', { key, values: [] })\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$emit('filter-change', { key, values: { from, to } })\n\t\t},\n\n\t\t/**\n\t\t * The text a `text` filter currently holds.\n\t\t *\n\t\t * @param {object} filter The filter definition.\n\t\t *\n\t\t * @return {string} The current value.\n\t\t */\n\t\tgetTextValue(filter) {\n\t\t\tconst value = this.activeFilters[filter.key]\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.length > 0 ? String(value[0]) : ''\n\t\t\t}\n\t\t\treturn (value === undefined || value === null) ? '' : String(value)\n\t\t},\n\n\t\t/**\n\t\t * A text filter changed.\n\t\t *\n\t\t * @param {string} key The filter key.\n\t\t * @param {string} value The typed value.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonTextChange(key, value) {\n\t\t\tconst text = String(value ?? '').trim()\n\t\t\tthis.$emit('filter-change', { key, values: text === '' ? [] : [text] })\n\t\t},\n\n\t\t/**\n\t\t * Load the rows a `reference` filter picks from.\n\t\t *\n\t\t * Reads `optionsSource` off the schema property:\n\t\t * `{ register, schema, labelField, valueField, limit }`. The VALUE is\n\t\t * the referenced object's uuid, because that is what the server\n\t\t * filters on; the label is only what the person reads.\n\t\t *\n\t\t * Failures are logged and leave the picker empty rather than throwing:\n\t\t * one unreachable list must not take the whole sidebar with it.\n\t\t *\n\t\t * @return {Promise<void>} Resolves when every reference filter settled.\n\t\t */\n\t\tasync loadReferenceOptions() {\n\t\t\tconst pending = this.schemaFilters.filter((filter) => filter.type === 'reference'\n\t\t\t\t&& filter.optionsSource\n\t\t\t\t&& this.referenceOptions[filter.key] === undefined\n\t\t\t\t&& this.referenceLoading[filter.key] !== true)\n\t\t\tif (pending.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\timport('@nextcloud/router'),\n\t\t\t])\n\n\t\t\tawait Promise.all(pending.map(async (filter) => {\n\t\t\t\tconst source = filter.optionsSource\n\t\t\t\tif (!source.register || !source.schema) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.referenceLoading = { ...this.referenceLoading, [filter.key]: true }\n\t\t\t\ttry {\n\t\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', {\n\t\t\t\t\t\tregister: source.register,\n\t\t\t\t\t\tschema: source.schema,\n\t\t\t\t\t})\n\t\t\t\t\tconst response = await axios.get(url, { params: { _limit: source.limit || 200 } })\n\t\t\t\t\tconst rows = response?.data?.results || response?.data || []\n\t\t\t\t\tconst valueField = source.valueField || '@self.uuid'\n\t\t\t\t\tconst labelField = source.labelField || 'title'\n\t\t\t\t\tconst options = rows\n\t\t\t\t\t\t.map((row) => ({\n\t\t\t\t\t\t\tid: this.readPath(row, valueField),\n\t\t\t\t\t\t\tlabel: String(this.readPath(row, labelField) ?? this.readPath(row, valueField) ?? ''),\n\t\t\t\t\t\t}))\n\t\t\t\t\t\t.filter((option) => option.id !== null && option.id !== undefined && option.id !== '')\n\t\t\t\t\t\t.sort((a, b) => a.label.localeCompare(b.label))\n\t\t\t\t\tthis.referenceOptions = { ...this.referenceOptions, [filter.key]: options }\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(`[CnIndexSidebar] the reference filter \"${filter.key}\" could not load its options`, error)\n\t\t\t\t\tthis.referenceOptions = { ...this.referenceOptions, [filter.key]: [] }\n\t\t\t\t} finally {\n\t\t\t\t\tthis.referenceLoading = { ...this.referenceLoading, [filter.key]: false }\n\t\t\t\t}\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Read a dotted path off a row (`@self.uuid`, `title`).\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {string} path The dotted path.\n\t\t *\n\t\t * @return {unknown} The value, or undefined.\n\t\t */\n\t\treadPath(row, path) {\n\t\t\treturn String(path).split('.').reduce((acc, part) => ((acc === null || acc === undefined) ? acc : acc[part]), row)\n\t\t},\n\n\t\t/**\n\t\t * Get currently selected options for a filter\n\t\t *\n\t\t * @param {object} filter Filter object\n\t\t */\n\t\tgetSelectedFilterOptions(filter) {\n\t\t\tconst value = this.activeFilters[filter.key]\n\t\t\tif (!value) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst values = Array.isArray(value) ? value : [value]\n\t\t\tconst options = this.getFilterOptions(filter)\n\t\t\treturn values.map((v) => options.find((o) => o.id === v) || { id: v, label: String(v) })\n\t\t},\n\n\t\t/**\n\t\t * Handle filter select change\n\t\t *\n\t\t * @param {string} key Filter key\n\t\t * @param {Array} selected Selected values\n\t\t */\n\t\tonFilterChange(key, selected) {\n\t\t\t// 🔴 A SINGLE-VALUED SELECT EMITS AN OBJECT, NOT AN ARRAY. NcSelect\n\t\t\t// changes the SHAPE of its payload with `multiple`, and `.map` on\n\t\t\t// the object shape throws inside an event handler, where Vue logs\n\t\t\t// it and carries on: the picker looks inert and the console says\n\t\t\t// why in a place nobody is looking.\n\t\t\tconst chosen = Array.isArray(selected) ? selected : (selected ? [selected] : [])\n\t\t\tconst values = chosen.map((o) => ((o && typeof o === 'object' && 'id' in o) ? o.id : o))\n\t\t\tthis.$emit('filter-change', { key, values })\n\t\t},\n\n\t\t/**\n\t\t * \"Clear all\" click: reset search and every active facet filter in\n\t\t * one shot, so the parent does one fetch instead of one per field.\n\t\t */\n\t\tonClearAll() {\n\t\t\t/**\n\t\t\t * @event clear-filters \"Clear all\" clicked; reset search and every active filter.\n\t\t\t */\n\t\t\tthis.$emit('clear-filters')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/index-sidebar.css -->\n"],"names":["CnSavedViewsPanel","CnDateRangePicker","CnIcon","t"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwVA;AACC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGD,aAAe;AACd,CAAA,IAAI,EAAE,gBAAgB;;CAEtB,UAAU,EAAE;EACX,YAAY;AACZ,EAAA,eAAe;AACf,qBAAAA,UAAiB;AACjB,EAAA,eAAe;EACf,WAAW;AACX,EAAA,QAAQ;AACR,qBAAAC,YAAiB;AACjB,EAAA,qBAAqB;AACrB,EAAA,SAAS;AACT,EAAA,QAAQ;AACR,UAAAC,YAAM;EACN,aAAa;AACb,EAAA,mBAAmB;AACnB,EAAA,iBAAiB;EACjB,WAAW;EACX,YAAY;AACZ,EAAA,SAAS;EACT,YAAY;AACZ,EAAA,GAAG;EACH,UAAU;AACV,EAAA,kBAAkB;EAClB;;AAED,CAAA,MAAM,EAAE;AACP;;;;;;AAMC;;AAED,EAAA,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,KAAK;EAC5C;;AAED,CAAA,KAAK,EAAE;;AAEN,EAAA,KAAK,EAAE;GACN,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,EAAE;GACX;;;EAGD,IAAI,EAAE;GACL,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,EAAE;GACX;;;AAGD,EAAA,MAAM,EAAE;GACP,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,IAAI;GACb;;AAED;AACA,EAAA,cAAc,EAAE;GACf,IAAI,EAAE,KAAK;GACX,OAAO,EAAE,IAAI;GACb;;AAED;;;;AAIA,EAAA,eAAe,EAAE;GAChB,IAAI,EAAE,OAAO;GACb,OAAO,EAAE,IAAI;GACb;;AAED;EACA,WAAW,EAAE;GACZ,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,CAAC;GACV;;AAED;;;;;;AAMC;;EAED,WAAW,EAAE;GACZ,IAAI,EAAE,KAAK;AACX,GAAA,OAAO,EAAE,MAAM,EAAE;GACjB;;AAED;EACA,WAAW,EAAE;GACZ,IAAI,EAAE,KAAK;AACX,GAAA,OAAO,EAAE,MAAM,EAAE;GACjB;;AAED;;;AAGC;;AAED,EAAA,gBAAgB,EAAE;GACjB,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,EAAE;GACX;;AAED;EACA,WAAW,EAAE;GACZ,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,EAAE;GACX;;;EAGD,IAAI,EAAE;GACL,IAAI,EAAE,OAAO;GACb,OAAO,EAAE,IAAI;GACb;;;AAGD,EAAA,aAAa,EAAE;GACd,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,OAAO,EAAE,CAAC;GACnB;;AAED;EACA,SAAS,EAAE;GACV,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,OAAO,EAAE,CAAC;GACnB;;AAED;AACC;AACA;;EAED,YAAY,EAAE;GACb,IAAI,EAAE,KAAK;AACX,GAAA,OAAO,EAAE,MAAM,EAAE;GACjB;;;EAGD,YAAY,EAAE;GACb,IAAI,EAAE,OAAO;GACb,OAAO,EAAE,IAAI;GACb;;;AAGD,EAAA,iBAAiB,EAAE;GAClB,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,MAAMC,SAAC,CAAC,eAAe,EAAE,iBAAiB,CAAC;GACpD;;AAED;AACA,EAAA,cAAc,EAAE;GACf,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAC;GAC3C;;AAED;AACA,EAAA,eAAe,EAAE;GAChB,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,SAAS,CAAC;GAC5C;;;EAGD,WAAW,EAAE;GACZ,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAC;GAC3C;;;EAGD,YAAY,EAAE;GACb,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,SAAS,CAAC;GAC5C;;;AAGD,EAAA,aAAa,EAAE;GACd,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,WAAW,CAAC;GAC9C;;AAED;AACC;AACA;;;;;;;AAOA;AACA;;EAED,YAAY,EAAE;GACb,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,IAAI;GACb;;AAED;EACA,SAAS,EAAE;GACV,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,MAAM,CAAC;GACzC;;AAED;AACA,EAAA,OAAO,EAAE;GACR,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,IAAI,CAAC;GACvC;;;AAGD,EAAA,cAAc,EAAE;GACf,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,mBAAmB,CAAC;GACtD;;;AAGD,EAAA,kBAAkB,EAAE;GACnB,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,8CAA8C,CAAC;GACjF;;AAED;AACA,EAAA,oBAAoB,EAAE;GACrB,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,EAAE;GACX;;AAED;;AAEC;;;EAGD,UAAU,EAAE;GACX,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,YAAY;GACrB;;AAED;;;;EAIA,SAAS,EAAE;GACV,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,EAAE;GACX;;AAED;AACC;AACA;;AAEA;;EAED,UAAU,EAAE;GACX,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,IAAI;GACb;;AAED;AACC;AACA;;EAED,WAAW,EAAE;GACZ,IAAI,EAAE,OAAO;GACb,OAAO,EAAE,IAAI;GACb;EACD;;AAED,CAAA,KAAK,EAAE,CAAC,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,CAAC;;AAEjL,CAAA,IAAI,GAAG;AACN,EAAA,OAAO;GACN,YAAY,EAAE,IAAI,CAAC,IAAI;AACvB,GAAA,iBAAiB,EAAE,IAAI,CAAC,UAAU;;GAElC,QAAQ,EAAE,CAAC,CAAC;GACZ,kBAAkB,EAAE,IAAI;AACxB,GAAA,cAAc,EAAE,EAAE;AAClB;;AAEC;;;;;AAKA;;;AAGD,GAAA,gBAAgB,EAAE,EAAE;AACpB;AACA,GAAA,gBAAgB,EAAE,EAAE;AACrB,GAAA;EACA;;AAED,CAAA,QAAQ,EAAE;AACT;;AAEC;AACA;;EAED,SAAS,GAAG;GACX,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC1B,IAAA,MAAM,MAAO,GAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAI,KAAM,IAAI,CAAC,gBAAgB,EAAA;IAC7E,IAAI,MAAM,EAAE;AACX,KAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAM,EAAA;AAC3C,KAAA;AACD,IAAA;AACA,GAAA,MAAM,OAAQ,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAE,GAAE,IAAI,CAAC,WAAU,GAAI,GAAC;AACtE,GAAA,KAAK,MAAM,UAAU,IAAI,CAAC,WAAW,EAAE;IACtC,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE;AAC1B,KAAA,QAAO;AACR,KAAA;IACA,MAAM,IAAK,GAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,CAAC,IAAK,GAAE,GAAC;AACzD,IAAA,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;KAChC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAM,EAAA;AACnC,KAAA;IACA,IAAI,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE;AACjD,KAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAO,EAAA;AACpC,KAAA;AACD,IAAA;AACA,GAAA,OAAO,IAAG;GACV;;;AAGD,EAAA,YAAY,GAAG;GACd,OAAO,IAAI,CAAC,SAAQ,GAAI,IAAI,CAAC,SAAS,CAAC,SAAS,IAAG;GACnD;;;AAGD,EAAA,aAAa,GAAG;GACf,OAAO,IAAI,CAAC,SAAU,GAAE,IAAI,CAAC,SAAS,CAAC,YAAY,KAAI;GACvD;;AAED;;AAEC;AACA;;;AAGD,EAAA,eAAe,GAAG;GACjB,IAAI,IAAI,CAAC,SAAU,IAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAI,KAAM,IAAI,EAAE;AAC3D,IAAA,OAAOA,SAAC,CAAC,eAAe,EAAE,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAA;AAC3F,IAAA;AACA,GAAA,MAAM,OAAQ,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAE,GAAE,IAAI,CAAC,WAAU,GAAI,GAAC;GACtE,IAAI,OAAO,CAAC,MAAK,KAAM,CAAC,EAAE;AACzB,IAAA,OAAOA,SAAC,CAAC,eAAe,EAAE,YAAY,CAAA;AACvC,IAAA;AACA,GAAA,MAAM,OAAM,GAAI,CAAC,GAAG,KAAK;IACxB,MAAM,MAAK,GAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,MAAK,KAAM,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAE,KAAM,GAAG,EAAA;IACjH,OAAO,MAAK,GAAI,MAAM,CAAC,KAAI,GAAI,GAAE;AAClC,KAAA;GACA,MAAM,KAAI,GAAI,IAAI,CAAC,SAAU,IAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAK,GAAI,CAAA;AACnE,MAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,aAAY,KAAM,MAAO,GAAEA,SAAC,CAAC,eAAe,EAAE,YAAY,CAAE,GAAEA,SAAC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAA;AACxI,MAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,KAAM,KAAI,MAAO,GAAEA,SAAC,CAAC,eAAe,EAAE,YAAY,CAAE,GAAEA,SAAC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAA;GAC5J,OAAOA,SAAC,CAAC,eAAe,EAAE,wBAAwB,EAAE,EAAE,KAAI,EAAG,CAAA;GAC7D;;AAED;AACC;AACA;AACA;AACA;;EAED,oBAAoB,GAAG;GACtB,MAAM,IAAI,IAAI,CAAC,UAAS,IAAK,GAAC;AAC9B,GAAA,OAAO;AACN,IAAA,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAE,GAAE,CAAC,CAAC,KAAM,GAAE,EAAE;IAC5C,OAAO,EAAE,CAAC,CAAC,OAAQ,KAAI,IAAI;AAC3B,IAAA,aAAa,EAAE,CAAC,CAAC,aAAY,IAAK,EAAE;AACpC,IAAA,MAAM,EAAE,CAAC,CAAC,MAAO,IAAG,IAAI;AACxB,IAAA,cAAc,EAAE,CAAC,CAAC,cAAa,IAAK,EAAE;IACtC,QAAQ,EAAE,OAAO,CAAC,CAAC,aAAa,QAAS,GAAE,CAAC,CAAC,QAAS,GAAE,CAAC;IACzD,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA,GAAI,CAAC,CAAC,UAAU,IAAI;AACrD,IAAA;GACA;;;AAGD,EAAA,YAAY,GAAG;AACd,GAAA,OAAO,IAAI,CAAC,IAAG,IAAK,IAAI,CAAC,MAAM,EAAE,IAAK,IAAG,EAAC;GAC1C;;;AAGD,EAAA,YAAY,GAAG;AACd,GAAA,IAAI,IAAI,CAAC,KAAK,EAAE;IACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;AAC7B,IAAA;AACA,GAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAM,IAAG,QAAO;GACpC;;;AAGD,EAAA,eAAe,GAAG;AACjB,GAAA,OAAO,IAAI,CAAC,MAAM,EAAE,WAAY,IAAG,EAAC;GACpC;;AAED;EACA,uBAAuB,GAAG;GACzB,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC9B,IAAA,OAAO,IAAI,CAAC,oBAAmB;AAChC,IAAA;AACA,GAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAM,IAAG,YAAW;GACxC;;AAED;EACA,UAAU,GAAG;AACZ,GAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACjB,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAA;GACrE;;AAED;AACA,EAAA,aAAa,GAAG;;;;AAIf;AACA,GAAA,IAAI,IAAI,CAAC,YAAa,IAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAK,GAAI,CAAC,EAAE;IACnE,OAAO,iBAAiB;AACvB,KAAA,EAAE,UAAU,EAAE,IAAI,CAAC,YAAW,EAAG;KACjC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,WAAU,EAAG;AAC3D,KAAA;AACD,IAAA;AACA,GAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACjB,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAA;GAChG;;;AAGD,EAAA,gBAAgB,GAAG;AAClB,GAAA,IAAI,CAAC,IAAI,CAAC,WAAY,IAAG,EAAE,EAAE,MAAO,GAAE,CAAC,EAAE;AACxC,IAAA,OAAO,IAAG;AACX,IAAA;AACA,GAAA,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAA,GAAI,CAAC,CAAC,CAAC,CAAC,CAAA;GAClG;;;EAGD,SAAS,GAAG;GACX,MAAM,MAAO,GAAE,GAAC;AAChB,GAAA,IAAI,IAAI,CAAC,YAAa,IAAG,IAAI,CAAC,MAAM,EAAE;IACrC,MAAM,CAAC,IAAI,CAAC;KACX,EAAE,EAAE,UAAU;AACd,KAAA,KAAK,EAAE,UAAU;KACjB,OAAO,EAAE,gBAAgB;KACzB,QAAQ,EAAE,IAAI;KACd,EAAA;AACF,IAAA;AACA,GAAA,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;GACvC;;;AAGD,EAAA,YAAY,GAAG;GACd,MAAM,GAAE,GAAI,GAAC;GACb,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;AAC9B,IAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA,GAAI,CAAC,CAAC,MAAI;IACnB,EAAA;GACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;AACtD,IAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA,GAAI,CAAC,CAAC,MAAI;AACpB,IAAC,CAAC,EAAA;AACF,GAAA,OAAO,GAAE;GACT;;AAED;AACA,EAAA,cAAc,GAAG;AAChB,GAAA,MAAM,IAAK,GAAE,IAAI,CAAC,cAAa,KAAM,IAAK,GAAE,IAAI,CAAC,aAAc,GAAE,IAAI,CAAC,eAAa;GACnF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA,KAAM,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAE,EAAC,CAAC,CAAA;GACnH;;;AAGD,EAAA,aAAa,GAAG;AACf,GAAA,OAAO;AACN,IAAA,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;IACpC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9D,IAAA;GACA;;AAED;;AAEC;;;;;AAKA;AACA;AACA;;AAED,EAAA,YAAY,GAAG;;;AAGd;AACA,GAAA,OAAO,0BAAyB;AAC/B,KAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,QAAQ,CAAA;KACzC,GAAG,CAAC,CAAC,MAAM,MAAM,EAAE,GAAG,MAAO,EAAC,CAAC,CAAA;GACjC;EACD;;AAED,CAAA,KAAK,EAAE;AACN,EAAA,SAAS,CAAC,GAAG,EAAE;AACd,GAAA,IAAI,GAAG,EAAE;IACR,IAAI,CAAC,iBAAgB,GAAI,IAAE;AAC5B,IAAA;GACA;;AAED,EAAA,IAAI,CAAC,GAAG,EAAE;AACT,GAAA,IAAI,CAAC,YAAa,GAAE,IAAE;GACtB;;AAED,EAAA,YAAY,CAAC,GAAG,EAAE;GACjB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAA;GAC7B;;AAED,EAAA,UAAU,CAAC,GAAG,EAAE;GACf,IAAI,CAAC,iBAAgB,GAAI,IAAE;GAC3B;;EAED,SAAS,EAAE;AACV,GAAA,SAAS,EAAE,IAAI;AACf,GAAA,OAAO,CAAC,MAAM,EAAE;IACf,KAAK,MAAM,KAAI,IAAK,MAAM,EAAE;AAC3B,KAAA,IAAI,EAAE,KAAK,CAAC,EAAC,IAAK,IAAI,CAAC,cAAc,CAAC,EAAE;MACvC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,QAAS,KAAI,MAAI;AACxD,MAAA;AACD,KAAA;IACA;GACD;;;;AAID;AACA,EAAA,aAAa,EAAE;AACd,GAAA,SAAS,EAAE,IAAI;AACf,GAAA,OAAO,GAAG;IACT,IAAI,CAAC,oBAAoB,GAAC;IAC1B;GACD;EACD;;AAED,CAAA,OAAO,EAAE;KACRA,SAAC;;AAED;;AAEC;AACA;AACA;;;AAGD,EAAA,WAAW,CAAC,MAAM,EAAE;AACnB,GAAA,MAAM,MAAK,GAAI,MAAK,IAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAI,KAAM,MAAM,CAAC,KAAK,EAAA;GAC9E,IAAI,CAAC,MAAM,EAAE;IACZ,MAAK;AACN,IAAA;AACA,GAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAA;GACxC;;AAED;;AAEC;AACA;;;EAGD,eAAe,CAAC,SAAS,EAAE;GAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;IACvB,MAAK;AACN,IAAA;AACA,GAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,SAAQ,KAAM,MAAO,GAAE,MAAK,GAAI,KAAK,EAAA;GACtE;;AAED;AACC;AACA;AACA;AACA;;;EAGD,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE;GAC3B,MAAM,IAAK,GAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,CAAC,IAAK,GAAE,GAAC;AACzD;AACC;AACA;;AAED,GAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,SAAU,KAAI,MAAK,GAAI,eAAe,CAAC,IAAI,CAAE,GAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAM,IAAG,KAAI,EAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAA;GACjJ;;AAED;AACC;AACA;;AAEA;AACA;;EAED,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;AACzB;AACC;AACA;;AAED,GAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAA;GACzC;;AAED;;AAEC;AACA;AACA;;EAED,KAAK,CAAC,IAAI,EAAE;GACX,OAAO,OAAO,IAAI,CAAC,WAAU,KAAM,UAAS,IAAK,OAAO,IAAK,KAAI,QAAO,IAAK,IAAG,KAAM,EAAC,GAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAE,GAAE,IAAG;GACvH;;AAED;AACC;AACA;AACA;;;EAGD,MAAM,CAAC,IAAI,EAAE;GACZ,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAE,IAAG,SAAQ;GACpD;;AAED;AACC;AACA;AACA;;AAED,EAAA,WAAW,CAAC,KAAK,EAAE;GAClB,IAAI,CAAC,iBAAgB,GAAI,MAAI;GAC7B,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,EAAA;GAC9B;;AAED;AACC;AACA;;;AAGD,EAAA,eAAe,CAAC,GAAG,EAAE;AACpB,GAAA,IAAI,IAAI,CAAC,cAAe,KAAI,IAAI,EAAE;AACjC,IAAA,OAAO,IAAG;AACX,IAAA;AACA,GAAA,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAA;GACvC;;AAED;AACC;AACA;AACA;;EAED,iBAAiB,CAAC,OAAO,EAAE;GAC1B,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;GAC3D;;AAED;AACC;AACA;;;AAGD,EAAA,YAAY,CAAC,GAAG,EAAE;GACjB,IAAI,WAAS;AACb,GAAA,IAAI,IAAI,CAAC,cAAe,KAAI,IAAI,EAAE;IACjC,UAAW,GAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA,KAAM,GAAG,EAAA;AACxD,IAAA,MAAO,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;IACrC,UAAS,GAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA,KAAM,GAAG,EAAA;IACvD,MAAK;AACN,IAAA,UAAW,GAAE,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,EAAA;AAC1C,IAAA;AACA,GAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,UAAU,EAAA;GACvC;;AAED;AACC;AACA;AACA;;EAED,cAAc,CAAC,OAAO,EAAE;AACvB,GAAA,MAAM,SAAU,GAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAA;GAC1C,MAAM,aAAa,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAA;;GAEjD,IAAI,WAAS;AACb,GAAA,IAAI,IAAI,CAAC,cAAe,KAAI,IAAI,EAAE;AACjC;AACA,IAAA,UAAW,GAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAA;AACrE,IAAA,MAAO,IAAI,UAAU,EAAE;AACtB;AACA,IAAA,UAAW,GAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAA;IACpE,MAAK;;AAEN,IAAA,MAAM,UAAU,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAA;AAC3C,IAAA,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAA;IACvC,UAAW,GAAE,CAAC,GAAG,OAAO,EAAA;AACzB,IAAA;AACA,GAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,UAAU,EAAA;GACvC;;AAED;;;;AAIC;AACA;;;;AAID,EAAA,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE;AACpB,GAAA,MAAM,IAAK,GAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAA;GACjD,MAAM,EAAG,GAAE,OAAO,IAAI,CAAC,WAAU,GAAI,CAAE,GAAE,IAAI,CAAC,YAAU;GACxD,MAAM,EAAG,GAAE,IAAG,GAAI,IAAI,CAAC,WAAY,GAAE,IAAI,CAAC,WAAU,GAAI,CAAA,GAAI,IAAI,CAAC,MAAK,GAAI,EAAA;AAC1E,GAAA,MAAM,MAAK,GAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAA;AAC5C,GAAA,IAAI,IAAG,GAAI,CAAE,IAAG,IAAK,IAAG,IAAI,CAAC,UAAU,MAAK,KAAM,IAAI,EAAE;IACvD,MAAK;AACN,IAAA;AACA,GAAA,MAAM,CAAC,KAAK,CAAE,GAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAA;GACnC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAA;AAC5B;;AAEC;;AAED,GAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAA;GAClC;;AAED;AACC;AACA;;;;AAID,EAAA,YAAY,CAAC,KAAK,EAAE;GACnB,MAAM,OAAO,IAAI,CAAC,SAAO;AACzB,GAAA,IAAI,CAAC,QAAO,GAAI,CAAC,EAAA;GACjB,IAAI,IAAK,IAAG,CAAC,EAAE;IACd,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAA;AAC5B,IAAA;GACA;;AAED;;AAEC;AACA;AACA;;;AAGD,EAAA,SAAS,CAAC,KAAK,EAAE;AAChB,GAAA,MAAM,IAAK,GAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAA;AACjD,GAAA,MAAM,CAAC,KAAK,CAAE,GAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAA;GACpC,IAAI,KAAI,GAAI,IAAI,CAAC,YAAU;AAC3B,GAAA,IAAI,KAAM,GAAE,KAAK,EAAE;AAClB,IAAA,KAAI,IAAK,EAAA;IACT,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAA;IAC1B,MAAK;IACN,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAA;AAC3B,IAAA,KAAI,IAAK,EAAA;AACV,IAAA;AACA,GAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAA;AAClC;AACC;;;GAGD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,EAAA;GAC9B;;AAED;;AAEC;AACA;;AAED,EAAA,WAAW,CAAC,OAAO,EAAE;GACpB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAA,GAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAA;GAC3D;;AAED;AACC;AACA;AACA;;EAED,gBAAgB,CAAC,MAAM,EAAE;GACxB,MAAM,OAAO,YAAY;IACxB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;IAC1B,CAAC,KAAK,KAAKA,SAAC,CAAC,eAAe,EAAE,oBAAoB,EAAE,EAAE,KAAM,EAAC,CAAC;AAC/D,KAAA;AACA,GAAA,IAAI,IAAG,KAAM,IAAI,EAAE;AAClB,IAAA,OAAO,IAAG;AACX,IAAA;;AAEA;GACA,IAAI,MAAM,CAAC,IAAG,KAAM,WAAW,EAAE;AAChC,IAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAE,IAAG,EAAC;AAC9C,IAAA;GACA,OAAO,MAAM,CAAC,OAAM,IAAK,EAAC;GAC1B;;AAED;;AAEC;;;AAGA;AACA;AACA;AACA;AACA;;EAED,gBAAgB,CAAC,MAAM,EAAE;AACxB,GAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAE,KAAI,IAAG;GAChD;;AAED;;AAEC;AACA;AACA;;;AAGD,EAAA,aAAa,CAAC,MAAM,EAAE;AACrB,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAA;GAC3C,IAAI,KAAM,IAAG,OAAO,KAAM,KAAI,QAAS,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;IAChE,OAAO,KAAI;AACZ,IAAA;AACA,GAAA,OAAO,IAAG;GACV;;AAED;;AAEC;;;;AAIA;AACA;;AAEA;;;EAGD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE;AAC1B,GAAA,MAAM,IAAK,GAAE,CAAC,MAAK,IAAK,MAAM,CAAC,IAAI,KAAK,GAAC;AACzC,GAAA,MAAM,EAAC,GAAI,CAAC,MAAK,IAAK,MAAM,CAAC,EAAE,KAAK,GAAC;GACrC,IAAI,IAAK,KAAI,MAAM,EAAG,KAAI,EAAE,EAAE;AAC7B,IAAA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAA;IAC/C,MAAK;AACN,IAAA;GACA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAG,EAAA,EAAG,EAAA;GACzD;;AAED;AACC;AACA;AACA;AACA;AACA;;AAED,EAAA,YAAY,CAAC,MAAM,EAAE;AACpB,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAA;GAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,IAAA,OAAO,KAAK,CAAC,MAAO,GAAE,CAAE,GAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,GAAI,EAAC;AAC/C,IAAA;GACA,OAAO,CAAC,KAAM,KAAI,SAAU,IAAG,KAAM,KAAI,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,CAAA;GAClE;;AAED;AACC;AACA;AACA;AACA;AACA;;;EAGD,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE;AACxB,GAAA,MAAM,IAAG,GAAI,MAAM,CAAC,KAAI,IAAK,EAAE,CAAC,CAAC,IAAI,GAAC;GACtC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAK,KAAI,EAAC,GAAI,EAAG,GAAE,CAAC,IAAI,CAAA,EAAG,EAAA;GACtE;;AAED;AACC;AACA;AACA;;;AAGA;AACA;;;AAGA;AACA;;EAED,MAAM,oBAAoB,GAAG;AAC5B,GAAA,MAAM,OAAM,GAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAK,KAAI,WAAU;AAC/E,OAAG,MAAM,CAAC,aAAY;OACnB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAA,KAAM,SAAQ;AACjD,OAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,EAAA;GAC9C,IAAI,OAAO,CAAC,MAAK,KAAM,CAAC,EAAE;IACzB,MAAK;AACN,IAAA;;GAEA,MAAM,CAAC,EAAE,OAAO,EAAE,KAAI,EAAG,EAAE,EAAE,WAAU,EAAG,CAAE,GAAE,MAAM,OAAO,CAAC,GAAG,CAAC;IAC/D,OAAO,kBAAkB,CAAC;IAC1B,OAAO,mBAAmB,CAAC;IAC3B,EAAA;;AAED,GAAA,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,KAAK;AAC/C,IAAA,MAAM,MAAK,GAAI,MAAM,CAAC,cAAY;AAClC,IAAA,IAAI,CAAC,MAAM,CAAC,QAAS,IAAG,CAAC,MAAM,CAAC,MAAM,EAAE;KACvC,MAAK;AACN,KAAA;AACA,IAAA,IAAI,CAAC,gBAAe,GAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,GAAG,GAAG,IAAK,GAAA;AACvE,IAAA,IAAI;AACH,KAAA,MAAM,GAAE,GAAI,WAAW,CAAC,oDAAoD,EAAE;MAC7E,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,MAAA,MAAM,EAAE,MAAM,CAAC,MAAM;MACrB,EAAA;AACD,KAAA,MAAM,QAAO,GAAI,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAM,IAAG,GAAE,IAAK,EAAA;KACjF,MAAM,IAAK,GAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,QAAQ,EAAE,IAAG,IAAK,GAAC;KAC3D,MAAM,aAAa,MAAM,CAAC,cAAc,aAAW;AACnD,KAAA,MAAM,aAAa,MAAM,CAAC,UAAS,IAAK,QAAM;AAC9C,KAAA,MAAM,OAAM,GAAI,IAAG;OACjB,GAAG,CAAC,CAAC,GAAG,MAAM;AACd,OAAA,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;AAClC,OAAA,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAE,IAAG,EAAE,CAAC;AACtF,OAAC,CAAC,CAAA;AACF,OAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAG,KAAI,QAAQ,MAAM,CAAC,EAAC,KAAM,SAAQ,IAAK,MAAM,CAAC,EAAG,KAAI,EAAE,CAAA;AACrF,OAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,EAAA;AAC/C,KAAA,IAAI,CAAC,gBAAiB,GAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,GAAG,GAAG,OAAQ,GAAA;KACzE,CAAA,OAAO,KAAK,EAAE;AACf;AACA,KAAA,OAAO,CAAC,KAAK,CAAC,CAAC,uCAAuC,EAAE,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,KAAK,EAAA;AACvG,KAAA,IAAI,CAAC,gBAAe,GAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,GAAG,GAAG,EAAG,GAAA;AACtE,KAAA,SAAU;AACT,KAAA,IAAI,CAAC,gBAAiB,GAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,GAAG,GAAG,KAAM,GAAA;AACzE,KAAA;AACD,IAAC,CAAC,EAAA;GACF;;AAED;AACC;AACA;;AAEA;AACA;AACA;;AAED,EAAA,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE;GACnB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,GAAI,KAAI,IAAG,IAAK,GAAI,KAAI,SAAS,IAAI,GAAE,GAAI,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAA;GACjH;;AAED;AACC;AACA;AACA;;AAED,EAAA,wBAAwB,CAAC,MAAM,EAAE;AAChC,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAA;GAC3C,IAAI,CAAC,KAAK,EAAE;AACX,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,MAAM,SAAS,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAA;AACpD,GAAA,MAAM,UAAU,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAA;AAC5C,GAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAG,KAAI,CAAC,CAAE,IAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAA;GACvF;;AAED;;AAEC;;AAEA;;EAED,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE;;;;;;AAM7B,GAAA,MAAM,MAAK,GAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAE,GAAE,QAAO,IAAK,QAAS,GAAE,CAAC,QAAQ,CAAE,GAAE,EAAE,EAAA;AAC/E,GAAA,MAAM,MAAK,GAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAS,IAAG,IAAK,IAAG,CAAC,IAAI,CAAC,CAAC,EAAG,GAAE,CAAC,CAAC,EAAA;AACvF,GAAA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAA;GAC3C;;AAED;;;;EAIA,UAAU,GAAG;AACZ;AACC;;GAED,IAAI,CAAC,KAAK,CAAC,eAAe,EAAA;GAC1B;EACD;AACF;;;;"}
|
|
@@ -86,6 +86,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
86
86
|
return (openBlock(), createBlock(_component_NcAppSidebar, {
|
|
87
87
|
open: $data.internalOpen,
|
|
88
88
|
"onUpdate:open": _cache[15] || (_cache[15] = $event => (($data.internalOpen) = $event)),
|
|
89
|
+
class: "cn-index-sidebar-panel",
|
|
89
90
|
name: $options.resolvedName,
|
|
90
91
|
title: $options.resolvedName,
|
|
91
92
|
subname: $options.resolvedSubname,
|