@conduction/nextcloud-vue 2.56.0-beta.31 → 2.56.0-beta.32
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/CnBannerWidget/CnBannerWidget.vue2.js +55 -4
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +51 -15
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +13 -2
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +63 -52
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js +10 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js +252 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js +140 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js +26 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js +10 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js +354 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js +172 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js +27 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js.map +1 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +25 -2
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +3 -2
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +29 -0
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +20 -3
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +7 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +77 -3
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +282 -69
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +0 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +65 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +10 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +174 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +75 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js +28 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +18 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +34 -25
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js +10 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js +222 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js +64 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js +30 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +10 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +347 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +184 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js +27 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js.map +1 -0
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +87 -6
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +10 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +159 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js +60 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js +26 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js.map +1 -0
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +47 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +16 -14
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +80 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +75 -32
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +10 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +269 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js +106 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/index.js +27 -0
- package/dist/esm/components/CnToggleTableWidget/index.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +7 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +4 -2
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +1 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +1 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +843 -4
- package/dist/esm/utils/contentHeaderLink.js +51 -0
- package/dist/esm/utils/contentHeaderLink.js.map +1 -0
- package/dist/esm/utils/fetchFilterCounts.js +40 -5
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
- package/dist/esm/utils/initials.js +32 -0
- package/dist/esm/utils/initials.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +7 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/objectWrite.js +59 -0
- package/dist/esm/utils/objectWrite.js.map +1 -0
- package/dist/esm/utils/widgetDispatch.js +1 -1
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +10510 -6830
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +843 -4
- package/l10n/en.json +1 -0
- package/l10n/nl.json +1 -0
- package/package.json +1 -1
- package/src/components/CnBannerWidget/CnBannerWidget.vue +93 -13
- package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +43 -3
- package/src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue +433 -0
- package/src/components/CnChipsFieldWidget/index.js +25 -0
- package/src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue +556 -0
- package/src/components/CnChoicePickerWidget/index.js +26 -0
- package/src/components/CnDashboardPage/CnDashboardPage.vue +38 -2
- package/src/components/CnDataTable/CnDataTable.vue +2 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +45 -2
- package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -3
- package/src/components/CnFieldListWidget/CnFieldListWidget.vue +265 -4
- package/src/components/CnIndexPage/CnIndexPage.vue +0 -1
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +69 -2
- package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
- package/src/components/CnRadioCardsWidget/index.js +27 -0
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +43 -1
- package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
- package/src/components/CnSavedViewsWidget/index.js +29 -0
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +13 -0
- package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +555 -0
- package/src/components/CnSettingsFormWidget/index.js +26 -0
- package/src/components/CnStatWidget/CnStatWidget.vue +87 -6
- package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +226 -0
- package/src/components/CnSwitchRowsWidget/index.js +25 -0
- package/src/components/CnTabsWidget/CnTabsWidget.vue +82 -3
- package/src/components/CnTasksWidget/CnTasksWidget.vue +175 -15
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +386 -0
- package/src/components/CnToggleTableWidget/index.js +26 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +7 -0
- package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +28 -1
- package/src/components/index.js +7 -0
- package/src/css/look-board-detail.css +36 -2
- package/src/css/look-board-index.css +23 -0
- package/src/css/look-board.css +72 -0
- package/src/index.js +7 -0
- package/src/utils/contentHeaderLink.js +48 -0
- package/src/utils/fetchFilterCounts.js +39 -4
- package/src/utils/initials.js +29 -0
- package/src/utils/libraryWidgetKeys.js +7 -0
- package/src/utils/objectWrite.js +55 -0
- package/src/utils/widgetDispatch.js +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, toDisplayString, createElementVNode, Fragment, renderList, createCommentVNode, createBlock, withCtx, createTextVNode } from 'vue';
|
|
2
|
+
|
|
3
|
+
const _hoisted_1 = {
|
|
4
|
+
class: "cn-toggle-table",
|
|
5
|
+
"data-testid": "cn-toggle-table"
|
|
6
|
+
};
|
|
7
|
+
const _hoisted_2 = {
|
|
8
|
+
key: 0,
|
|
9
|
+
class: "cn-toggle-table__empty",
|
|
10
|
+
"data-testid": "cn-toggle-table-empty"
|
|
11
|
+
};
|
|
12
|
+
const _hoisted_3 = {
|
|
13
|
+
key: 1,
|
|
14
|
+
class: "cn-toggle-table__table"
|
|
15
|
+
};
|
|
16
|
+
const _hoisted_4 = { key: 0 };
|
|
17
|
+
const _hoisted_5 = {
|
|
18
|
+
scope: "col",
|
|
19
|
+
class: "cn-toggle-table__head"
|
|
20
|
+
};
|
|
21
|
+
const _hoisted_6 = {
|
|
22
|
+
scope: "col",
|
|
23
|
+
class: "cn-toggle-table__head cn-toggle-table__head--toggle"
|
|
24
|
+
};
|
|
25
|
+
const _hoisted_7 = ["data-testid"];
|
|
26
|
+
const _hoisted_8 = { class: "cn-toggle-table__cell cn-toggle-table__cell--main" };
|
|
27
|
+
const _hoisted_9 = { class: "cn-toggle-table__title" };
|
|
28
|
+
const _hoisted_10 = {
|
|
29
|
+
key: 0,
|
|
30
|
+
class: "cn-toggle-table__hint"
|
|
31
|
+
};
|
|
32
|
+
const _hoisted_11 = { class: "cn-toggle-table__cell cn-toggle-table__cell--toggle" };
|
|
33
|
+
|
|
34
|
+
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
35
|
+
const _component_NcCheckboxRadioSwitch = resolveComponent("NcCheckboxRadioSwitch");
|
|
36
|
+
const _component_NcNoteCard = resolveComponent("NcNoteCard");
|
|
37
|
+
|
|
38
|
+
return (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
39
|
+
($options.rows.length === 0)
|
|
40
|
+
? (openBlock(), createElementBlock("p", _hoisted_2, toDisplayString($options.emptyLabel), 1 /* TEXT */))
|
|
41
|
+
: (openBlock(), createElementBlock("table", _hoisted_3, [
|
|
42
|
+
($options.showHeader)
|
|
43
|
+
? (openBlock(), createElementBlock("thead", _hoisted_4, [
|
|
44
|
+
createElementVNode("tr", null, [
|
|
45
|
+
createElementVNode("th", _hoisted_5, toDisplayString($options.titleHeader), 1 /* TEXT */),
|
|
46
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.columns, (column) => {
|
|
47
|
+
return (openBlock(), createElementBlock("th", {
|
|
48
|
+
key: column.path,
|
|
49
|
+
scope: "col",
|
|
50
|
+
class: "cn-toggle-table__head"
|
|
51
|
+
}, toDisplayString(column.header), 1 /* TEXT */))
|
|
52
|
+
}), 128 /* KEYED_FRAGMENT */)),
|
|
53
|
+
createElementVNode("th", _hoisted_6, toDisplayString($options.toggleHeader), 1 /* TEXT */)
|
|
54
|
+
])
|
|
55
|
+
]))
|
|
56
|
+
: createCommentVNode("v-if", true),
|
|
57
|
+
createElementVNode("tbody", null, [
|
|
58
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.rows, (row) => {
|
|
59
|
+
return (openBlock(), createElementBlock("tr", {
|
|
60
|
+
key: row.key,
|
|
61
|
+
class: "cn-toggle-table__row",
|
|
62
|
+
"data-testid": `cn-toggle-table-row-${row.key}`
|
|
63
|
+
}, [
|
|
64
|
+
createElementVNode("td", _hoisted_8, [
|
|
65
|
+
createElementVNode("span", _hoisted_9, toDisplayString(row.title), 1 /* TEXT */),
|
|
66
|
+
(row.hint)
|
|
67
|
+
? (openBlock(), createElementBlock("span", _hoisted_10, toDisplayString(row.hint), 1 /* TEXT */))
|
|
68
|
+
: createCommentVNode("v-if", true)
|
|
69
|
+
]),
|
|
70
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.columns, (column) => {
|
|
71
|
+
return (openBlock(), createElementBlock("td", {
|
|
72
|
+
key: column.path,
|
|
73
|
+
class: "cn-toggle-table__cell"
|
|
74
|
+
}, toDisplayString($options.cell(row, column)), 1 /* TEXT */))
|
|
75
|
+
}), 128 /* KEYED_FRAGMENT */)),
|
|
76
|
+
createElementVNode("td", _hoisted_11, [
|
|
77
|
+
(openBlock(), createBlock(_component_NcCheckboxRadioSwitch, {
|
|
78
|
+
key: `${row.key}-${$data.undone[row.key] || 0}`,
|
|
79
|
+
modelValue: $options.isOn(row),
|
|
80
|
+
type: "switch",
|
|
81
|
+
disabled: $options.readOnly || $data.busy === row.key,
|
|
82
|
+
"aria-label": row.title,
|
|
83
|
+
"onUpdate:modelValue": $event => ($options.toggle(row, $event))
|
|
84
|
+
}, null, 8 /* PROPS */, ["modelValue", "disabled", "aria-label", "onUpdate:modelValue"]))
|
|
85
|
+
])
|
|
86
|
+
], 8 /* PROPS */, _hoisted_7))
|
|
87
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
88
|
+
])
|
|
89
|
+
])),
|
|
90
|
+
($data.notice)
|
|
91
|
+
? (openBlock(), createBlock(_component_NcNoteCard, {
|
|
92
|
+
key: 2,
|
|
93
|
+
type: "error",
|
|
94
|
+
"data-testid": "cn-toggle-table-notice"
|
|
95
|
+
}, {
|
|
96
|
+
default: withCtx(() => [
|
|
97
|
+
createTextVNode(toDisplayString($data.notice), 1 /* TEXT */)
|
|
98
|
+
]),
|
|
99
|
+
_: 1 /* STABLE */
|
|
100
|
+
}))
|
|
101
|
+
: createCommentVNode("v-if", true)
|
|
102
|
+
]))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export { render };
|
|
106
|
+
//# sourceMappingURL=CnToggleTableWidget.vue3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnToggleTableWidget.vue3.js","sources":["../../../../src/components/CnToggleTableWidget/CnToggleTableWidget.vue?vue&type=template&id=53a57112&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-toggle-table\" data-testid=\"cn-toggle-table\">\n\t\t<p v-if=\"rows.length === 0\" class=\"cn-toggle-table__empty\" data-testid=\"cn-toggle-table-empty\">\n\t\t\t{{ emptyLabel }}\n\t\t</p>\n\t\t<table v-else class=\"cn-toggle-table__table\">\n\t\t\t<thead v-if=\"showHeader\">\n\t\t\t\t<tr>\n\t\t\t\t\t<th scope=\"col\" class=\"cn-toggle-table__head\">\n\t\t\t\t\t\t{{ titleHeader }}\n\t\t\t\t\t</th>\n\t\t\t\t\t<th\n\t\t\t\t\t\tv-for=\"column in columns\"\n\t\t\t\t\t\t:key=\"column.path\"\n\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\tclass=\"cn-toggle-table__head\">\n\t\t\t\t\t\t{{ column.header }}\n\t\t\t\t\t</th>\n\t\t\t\t\t<th scope=\"col\" class=\"cn-toggle-table__head cn-toggle-table__head--toggle\">\n\t\t\t\t\t\t{{ toggleHeader }}\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr\n\t\t\t\t\tv-for=\"row in rows\"\n\t\t\t\t\t:key=\"row.key\"\n\t\t\t\t\tclass=\"cn-toggle-table__row\"\n\t\t\t\t\t:data-testid=\"`cn-toggle-table-row-${row.key}`\">\n\t\t\t\t\t<td class=\"cn-toggle-table__cell cn-toggle-table__cell--main\">\n\t\t\t\t\t\t<span class=\"cn-toggle-table__title\">{{ row.title }}</span>\n\t\t\t\t\t\t<span v-if=\"row.hint\" class=\"cn-toggle-table__hint\">{{ row.hint }}</span>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td\n\t\t\t\t\t\tv-for=\"column in columns\"\n\t\t\t\t\t\t:key=\"column.path\"\n\t\t\t\t\t\tclass=\"cn-toggle-table__cell\">\n\t\t\t\t\t\t{{ cell(row, column) }}\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"cn-toggle-table__cell cn-toggle-table__cell--toggle\">\n\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t:key=\"`${row.key}-${undone[row.key] || 0}`\"\n\t\t\t\t\t\t\t:modelValue=\"isOn(row)\"\n\t\t\t\t\t\t\ttype=\"switch\"\n\t\t\t\t\t\t\t:disabled=\"readOnly || busy === row.key\"\n\t\t\t\t\t\t\t:aria-label=\"row.title\"\n\t\t\t\t\t\t\t@update:modelValue=\"toggle(row, $event)\" />\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\t\t<NcNoteCard v-if=\"notice\" type=\"error\" data-testid=\"cn-toggle-table-notice\">\n\t\t\t{{ notice }}\n\t\t</NcNoteCard>\n\t</div>\n</template>\n\n<script>\nimport { NcCheckboxRadioSwitch, NcNoteCard } from '@nextcloud/vue'\nimport { prefixUrl } from '../../utils/headers.js'\nimport { objectUrlOf, patchObject } from '../../utils/objectWrite.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { serverErrorMessage } from '../../utils/serverErrorMessage.js'\n\n/**\n * CnToggleTableWidget — the `toggle-table` widget: rows from a configured list\n * (`rows`) or read from a source (`source`), each with a switch bound to the\n * CURRENT object, and optional extra columns read off the row. A switch is\n * stored in one of two ways:\n *\n * - `bind.mode: 'flag'` — each row names its own boolean field of the object\n * (`row.field`); the switch is that field.\n * - `bind.mode: 'list'` — ONE array field of the object (`bind.field`) holds\n * the keys of the rows that are in it; the switch is on when the row's key is\n * in the list, or NOT in it with `bind.invert` (a list of hidden items shown\n * as \"visible\" switches).\n *\n * A toggle saves at once with ONE PATCH of that field; a refused PATCH puts the\n * switch back and shows the server's words.\n *\n * @spec openspec/changes/abstract-toggle-table/specs/toggle-table/spec.md\n */\nexport default {\n\tname: 'CnToggleTableWidget',\n\n\tcomponents: { NcCheckboxRadioSwitch, NcNoteCard },\n\n\tinject: {\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget configuration.\n\t\t *\n\t\t * - `bind` — `{ mode: 'flag' }` (default) or `{ mode: 'list', field, invert? }`.\n\t\t * - `rows` — static rows `[{ key, label, hint?, field?, ...extra }]`.\n\t\t * - `source` — `{ url, path?, key, label, hint? }`: rows read from an endpoint (tokens `@objectId`, `@object.<field>`), in addition to `rows`.\n\t\t * - `columns` — extra columns `[{ header, path, map? }]` read off each row.\n\t\t * - `titleHeader`, `toggleHeader`, `emptyText`, `readOnly`.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The current detail-page object. */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The current object id. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister register slug of the surface. */\n\t\tregister: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister schema slug of the surface. */\n\t\tschema: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['saved'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** Rows read from `source`. */\n\t\t\tsourced: [],\n\t\t\t/** What the object holds, by field: the flags and the list, as last saved. */\n\t\t\tsaved: {},\n\t\t\tbusy: '',\n\t\t\tnotice: '',\n\t\t\t/** Per row, how often a refused toggle forced the switch to be drawn again from the stored value. */\n\t\t\tundone: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tbind() {\n\t\t\tconst bind = this.content.bind || {}\n\t\t\treturn bind.mode === 'list' ? { mode: 'list', field: bind.field, invert: bind.invert === true } : { mode: 'flag' }\n\t\t},\n\n\t\t/** The drawn rows: configured first, then sourced, each with a key, title and hint. */\n\t\trows() {\n\t\t\tconst configured = (Array.isArray(this.content.rows) ? this.content.rows : [])\n\t\t\t\t.filter((row) => row && row.key !== undefined)\n\t\t\t\t.map((row) => ({ ...row, key: String(row.key), title: this.tr(row.label || String(row.key)), hint: this.tr(row.hint || '') }))\n\t\t\treturn [...configured, ...this.sourced]\n\t\t},\n\n\t\tcolumns() {\n\t\t\treturn (Array.isArray(this.content.columns) ? this.content.columns : [])\n\t\t\t\t.filter((column) => column && column.path)\n\t\t\t\t.map((column) => ({ ...column, header: this.tr(column.header || '') }))\n\t\t},\n\n\t\tshowHeader() {\n\t\t\treturn this.columns.length > 0 || Boolean(this.content.titleHeader || this.content.toggleHeader)\n\t\t},\n\n\t\ttitleHeader() {\n\t\t\treturn this.tr(this.content.titleHeader || '')\n\t\t},\n\n\t\ttoggleHeader() {\n\t\t\treturn this.tr(this.content.toggleHeader || '')\n\t\t},\n\n\t\temptyLabel() {\n\t\t\treturn this.tr(this.content.emptyText || 'Nothing listed yet')\n\t\t},\n\n\t\treadOnly() {\n\t\t\treturn this.content.readOnly === true\n\t\t},\n\n\t\tobjectUrl() {\n\t\t\treturn objectUrlOf(this.register, this.schema, this.objectId || (this.objectData && this.objectData.id))\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectData() {\n\t\t\tthis.saved = {}\n\t\t\tthis.loadSource()\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.loadSource()\n\t},\n\n\tmethods: {\n\t\ttr(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The stored value of a field: what this widget last saved, else the object's.\n\t\t *\n\t\t * @param {string} field The field.\n\t\t * @return {unknown}\n\t\t */\n\t\tstored(field) {\n\t\t\treturn Object.hasOwn(this.saved, field) ? this.saved[field] : readPath(this.objectData || {}, field)\n\t\t},\n\n\t\t/**\n\t\t * Whether a row's switch is on.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {boolean}\n\t\t */\n\t\tisOn(row) {\n\t\t\tif (this.bind.mode === 'list') {\n\t\t\t\tconst list = this.stored(this.bind.field)\n\t\t\t\tconst inList = Array.isArray(list) && list.map(String).includes(row.key)\n\t\t\t\treturn this.bind.invert ? !inList : inList\n\t\t\t}\n\t\t\treturn row.field ? this.stored(row.field) === true : false\n\t\t},\n\n\t\t/**\n\t\t * The text of an extra column for a row.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {object} column The column.\n\t\t * @return {string}\n\t\t */\n\t\tcell(row, column) {\n\t\t\tconst raw = readPath(row, column.path)\n\t\t\tif (raw === undefined || raw === null || raw === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tif (column.map && Object.hasOwn(column.map, String(raw))) {\n\t\t\t\treturn this.tr(column.map[String(raw)])\n\t\t\t}\n\t\t\treturn typeof raw === 'object' ? '' : String(raw)\n\t\t},\n\n\t\t/** Read the rows of `source`, resolving tokens in its url. */\n\t\tasync loadSource() {\n\t\t\tconst source = this.content.source\n\t\t\tif (!source || !source.url || !source.key) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst object = this.objectData || {}\n\t\t\tconst url = String(source.url)\n\t\t\t\t.replace(/@objectId/g, () => encodeURIComponent(String(this.objectId || object.id || '')))\n\t\t\t\t.replace(/@object\\.([\\w.@]+)/g, (m, path) => encodeURIComponent(String(readPath(object, path) ?? '')))\n\t\t\ttry {\n\t\t\t\tconst { default: axios } = await import('@nextcloud/axios')\n\t\t\t\tconst { data } = await axios.get(prefixUrl(url))\n\t\t\t\tconst list = source.path ? readPath(data, source.path) : data\n\t\t\t\tthis.sourced = (Array.isArray(list) ? list : [])\n\t\t\t\t\t.filter((item) => item && readPath(item, source.key) !== undefined)\n\t\t\t\t\t.map((item) => ({\n\t\t\t\t\t\t...item,\n\t\t\t\t\t\tkey: String(readPath(item, source.key)),\n\t\t\t\t\t\ttitle: String(readPath(item, source.label || source.key) ?? readPath(item, source.key)),\n\t\t\t\t\t\thint: source.hint ? String(readPath(item, source.hint) ?? '') : '',\n\t\t\t\t\t}))\n\t\t\t} catch (e) {\n\t\t\t\tthis.notice = serverErrorMessage(e)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Flip one switch and save that one field.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {boolean} on The new switch state.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/abstract-toggle-table/specs/toggle-table/spec.md#requirement-a-toggle-saves-one-field\n\t\t */\n\t\tasync toggle(row, on) {\n\t\t\tconst field = this.bind.mode === 'list' ? this.bind.field : row.field\n\t\t\tif (!this.objectUrl || !field) {\n\t\t\t\tthis.notice = this.tr('This switch cannot be saved here.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlet next\n\t\t\tif (this.bind.mode === 'list') {\n\t\t\t\tconst list = (Array.isArray(this.stored(field)) ? this.stored(field) : []).map(String)\n\t\t\t\tconst wantInList = this.bind.invert ? !on : on\n\t\t\t\tnext = wantInList ? (list.includes(row.key) ? list : [...list, row.key]) : list.filter((key) => key !== row.key)\n\t\t\t} else {\n\t\t\t\tnext = on\n\t\t\t}\n\t\t\tthis.notice = ''\n\t\t\tthis.busy = row.key\n\t\t\ttry {\n\t\t\t\tconst data = await patchObject(this.objectUrl, { [field]: next })\n\t\t\t\tconst written = data[field] !== undefined ? data[field] : next\n\t\t\t\tthis.saved = { ...this.saved, [field]: written }\n\t\t\t\t/**\n\t\t\t\t * @event saved A switch was written.\n\t\t\t\t * @type {{field: string, value: unknown}}\n\t\t\t\t */\n\t\t\t\tthis.$emit('saved', { field, value: written })\n\t\t\t} catch (e) {\n\t\t\t\tthis.notice = serverErrorMessage(e)\n\t\t\t\tthis.undone = { ...this.undone, [row.key]: (this.undone[row.key] || 0) + 1 }\n\t\t\t} finally {\n\t\t\t\tthis.busy = ''\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-toggle-table {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmin-width: 0;\n}\n\n.cn-toggle-table__table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n}\n\n.cn-toggle-table__head {\n\tpadding: 8px 12px;\n\ttext-align: start;\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\tbackground: var(--color-background-hover);\n}\n\n.cn-toggle-table__head--toggle,\n.cn-toggle-table__cell--toggle {\n\twidth: 1%;\n\twhite-space: nowrap;\n\ttext-align: end;\n}\n\n.cn-toggle-table__row {\n\tborder-top: 1px solid var(--cn-board-hairline, var(--color-border));\n}\n\n.cn-toggle-table__cell {\n\tpadding: 10px 12px;\n\tvertical-align: middle;\n\toverflow-wrap: anywhere;\n}\n\n.cn-toggle-table__title {\n\tdisplay: block;\n\tfont-weight: 600;\n}\n\n.cn-toggle-table__hint {\n\tdisplay: block;\n\tfont-size: 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-toggle-table__empty {\n\tmargin: 0;\n\tcolor: var(--color-text-maxcontrast);\n}\n</style>\n"],"names":["_createElementBlock","_toDisplayString","_createElementVNode","_Fragment","_renderList","_openBlock"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import __sfc_main from './CnToggleTableWidget.vue.js';
|
|
2
|
+
import { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
6
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
7
|
+
*
|
|
8
|
+
* CnToggleTableWidget — self-registers the `toggle-table` widget type (rows
|
|
9
|
+
* from a configured list or a source, each with a switch bound to the current
|
|
10
|
+
* object, and optional extra columns) into the shared dashboardWidgetRegistry.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
registerDashboardWidget('toggle-table', {
|
|
15
|
+
renderer: __sfc_main,
|
|
16
|
+
form: null,
|
|
17
|
+
defaultContent: {
|
|
18
|
+
bind: { mode: 'flag' },
|
|
19
|
+
rows: [],
|
|
20
|
+
},
|
|
21
|
+
displayName: 'Toggle table',
|
|
22
|
+
icon: 'TableCheck',
|
|
23
|
+
surfaces: ['detail-page'],
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export { __sfc_main as CnToggleTableWidget, __sfc_main as default };
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/CnToggleTableWidget/index.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * CnToggleTableWidget — self-registers the `toggle-table` widget type (rows\n * from a configured list or a source, each with a switch bound to the current\n * object, and optional extra columns) into the shared dashboardWidgetRegistry.\n */\n\nimport CnToggleTableWidget from './CnToggleTableWidget.vue'\nimport { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js'\n\nregisterDashboardWidget('toggle-table', {\n\trenderer: CnToggleTableWidget,\n\tform: null,\n\tdefaultContent: {\n\t\tbind: { mode: 'flag' },\n\t\trows: [],\n\t},\n\tdisplayName: 'Toggle table',\n\ticon: 'TableCheck',\n\tsurfaces: ['detail-page'],\n})\n\nexport { CnToggleTableWidget }\nexport default CnToggleTableWidget\n"],"names":["CnToggleTableWidget"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA,uBAAuB,CAAC,cAAc,EAAE;AACxC,CAAC,QAAQ,EAAEA,UAAmB;AAC9B,CAAC,IAAI,EAAE,IAAI;AACX,CAAC,cAAc,EAAE;AACjB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AACxB,EAAE,IAAI,EAAE,EAAE;AACV,EAAE;AACF,CAAC,WAAW,EAAE,cAAc;AAC5B,CAAC,IAAI,EAAE,YAAY;AACnB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC;;;;"}
|
|
@@ -51,7 +51,14 @@ import '../CnTasksWidget/index.js';
|
|
|
51
51
|
import '../CnSectionsWidget/index.js';
|
|
52
52
|
import '../CnFactsWidget/index.js';
|
|
53
53
|
import '../CnFieldListWidget/index.js';
|
|
54
|
+
import '../CnSettingsFormWidget/index.js';
|
|
55
|
+
import '../CnSwitchRowsWidget/index.js';
|
|
56
|
+
import '../CnRadioCardsWidget/index.js';
|
|
57
|
+
import '../CnChipsFieldWidget/index.js';
|
|
58
|
+
import '../CnToggleTableWidget/index.js';
|
|
59
|
+
import '../CnChoicePickerWidget/index.js';
|
|
54
60
|
import '../CnRecordListWidget/index.js';
|
|
61
|
+
import '../CnSavedViewsWidget/index.js';
|
|
55
62
|
import '../CnNotepadWidget/index.js';
|
|
56
63
|
import '../CnObjectDataWidget/dashboardRegistration.js';
|
|
57
64
|
import '../CnObjectGeoWidget/dashboardRegistration.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerDashboardWidgets.js","sources":["../../../../src/components/CnWidgetGrid/registerDashboardWidgets.js"],"sourcesContent":["/**\n * Side-effect aggregator for the cn-widget-library dashboard widget catalog.\n *\n * Importing this module imports every migrated widget's `index.js`, each of\n * which self-registers its `{ renderer, form, defaultContent, displayName,\n * icon }` into `dashboardWidgetRegistry` at load time. The library barrel\n * imports this module so the catalog is populated whenever a consuming app\n * imports `@conduction/nextcloud-vue`; `CnWidgetGrid` then resolves widgets by\n * type key and `CnAddWidgetModal` lists the addable types.\n *\n * The individual widget components are intentionally NOT public exports — they\n * are resolved by their registry type key (the whole point of the registry),\n * so consumers reference them via the manifest `widgetKey`, not by import.\n *\n * @module components/CnWidgetGrid/registerDashboardWidgets\n */\n\nimport CnChartWidget from '../CnChartWidget/CnChartWidget.vue'\nimport CnChartWidgetForm from '../CnChartWidgetForm/CnChartWidgetForm.vue'\nimport CnConversationWidget from '../CnConversationThread/CnConversationWidget.vue'\nimport CnCountdownWidget from '../CnCountdownWidget/CnCountdownWidget.vue'\nimport CnCountdownWidgetForm from '../CnCountdownWidgetForm/CnCountdownWidgetForm.vue'\nimport CnDocumentReviewWidget from '../CnDocumentReviewList/CnDocumentReviewWidget.vue'\nimport CnMapWidget from '../CnMapWidget/CnMapWidget.vue'\nimport CnMapWidgetForm from '../CnMapWidgetForm/CnMapWidgetForm.vue'\nimport CnMarkdownWidget2 from '../CnMarkdownWidget/CnMarkdownWidget.vue'\nimport CnMarkdownWidgetForm2 from '../CnMarkdownWidgetForm/CnMarkdownWidgetForm.vue'\nimport CnNextStepWidget from '../CnNextStepCard/CnNextStepWidget.vue'\nimport CnObjectListWidget2 from '../CnObjectListWidget/CnObjectListWidget.vue'\nimport CnObjectListWidgetForm2 from '../CnObjectListWidgetForm/CnObjectListWidgetForm.vue'\nimport CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'\nimport CnRelatedObjectsWidgetForm from '../CnRelatedObjectsWidgetForm/CnRelatedObjectsWidgetForm.vue'\nimport CnSavedViewWidget2 from '../CnSavedViewWidget/CnSavedViewWidget.vue'\nimport CnSavedViewWidgetForm2 from '../CnSavedViewWidgetForm/CnSavedViewWidgetForm.vue'\nimport CnStackedBarWidget from '../CnStackedBarWidget/CnStackedBarWidget.vue'\nimport CnStackedBarWidgetForm from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue'\nimport CnStagesWidget from '../CnStagesWidget/CnStagesWidget.vue'\nimport CnStagesWidgetForm from '../CnStagesWidgetForm/CnStagesWidgetForm.vue'\nimport CnStatsBlockWidget from '../CnStatsBlockWidget/CnStatsBlockWidget.vue'\nimport CnStatsBlockWidgetForm from '../CnStatsBlockWidgetForm/CnStatsBlockWidgetForm.vue'\nimport CnTabsWidget from '../CnTabsWidget/CnTabsWidget.vue'\nimport CnTabsWidgetForm from '../CnTabsWidgetForm/CnTabsWidgetForm.vue'\nimport CnWeekStripWidget from '../CnWeekStripWidget/CnWeekStripWidget.vue'\nimport CnWeekStripWidgetForm from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue'\n// Typed widgets registered with an explicit renderer + config FORM. chart /\n// stats-block render through CnDashboardPage's own isChart()/isStatsBlock()\n// branches and `related` through CnDetailPage's isRelatedWidget() branch — the\n// registry entry exists so the cog editor + Add-widget picker get a form (and,\n// for `related`, the detail-page surface). `table` aliases the object-list\n// renderer/form for legacy manifests using type:'table'.\nimport { registerDashboardWidget } from './dashboardWidgetRegistry.js'\n\nimport '../CnLabelWidget/index.js'\nimport '../CnTextWidget/index.js'\nimport '../CnImageWidget/index.js'\nimport '../CnLinkButtonWidget/index.js'\nimport '../CnDividerWidget/index.js'\nimport '../CnHeaderWidget/index.js'\nimport '../CnQuicklinksWidget/index.js'\nimport '../CnVideoWidget/index.js'\nimport '../CnDashTileWidget/index.js'\nimport '../CnLinksWidget/index.js'\nimport '../CnMenuWidget/index.js'\nimport '../CnContainerWidget/index.js'\nimport '../CnFilesWidget/index.js'\nimport '../CnPeopleWidget/index.js'\nimport '../CnCalendarWidget/index.js'\nimport '../CnNcWidgetWidget/index.js'\nimport '../CnSpendAnalyticsWidget/index.js'\nimport '../CnStatWidget/index.js'\nimport '../CnDeltaWidget/index.js'\nimport '../CnGaugeWidget/index.js'\nimport '../CnFlowRunsWidget/index.js'\nimport '../CnTasksWidget/index.js'\nimport '../CnSectionsWidget/index.js'\nimport '../CnFactsWidget/index.js'\nimport '../CnFieldListWidget/index.js'\nimport '../CnRecordListWidget/index.js'\nimport '../CnNotepadWidget/index.js'\nimport '../CnObjectDataWidget/dashboardRegistration.js'\nimport '../CnObjectGeoWidget/dashboardRegistration.js'\nimport '../CnWidgetObjectTable/dashboardRegistration.js'\nimport '../CnAuditTrailWidget/dashboardRegistration.js'\nimport '../CnTimelineWidget/dashboardRegistration.js'\nimport '../CnKbSearchWidget/index.js'\nimport '../CnInteractionFormWidget/index.js'\nimport '../CnBannerWidget/index.js'\nimport '../CnWorkspaceFilterWidget/index.js'\n\nregisterDashboardWidget('chart', {\n\trenderer: CnChartWidget,\n\tform: CnChartWidgetForm,\n\tdefaultContent: {\n\t\tchartKind: 'area',\n\t\tdataSource: { register: '', schema: '', filter: {}, bucket: { field: '', interval: 'month', metric: 'count', metricField: '' } },\n\t},\n\tdisplayName: 'Chart',\n\ticon: 'ChartLine',\n})\n\nregisterDashboardWidget('stats-block', {\n\trenderer: CnStatsBlockWidget,\n\tform: CnStatsBlockWidgetForm,\n\tdefaultContent: {\n\t\ttitle: '',\n\t\tprops: { countLabel: '', variant: 'default', iconClass: '' },\n\t\tdataSource: { register: '', schema: '', metric: 'count', field: '', filter: {} },\n\t},\n\tdisplayName: 'Statistic card',\n\ticon: 'ChartBar',\n\t// Card family (docs/architecture/cards-and-widgets.md), like `stat` and\n\t// `delta`: the tile headlines itself with its own title, so the wrapper\n\t// renders no header of its own and would otherwise show the title twice.\n\tcard: true,\n})\n\n// `table` and `object-list` (below) are legacy aliases of `object-table` — same\n// config form (CnObjectListWidgetForm), same job. They stay registered so\n// existing placements keep rendering, but are hidden from every Add-widget\n// picker via a sentinel surface no picker queries (see widgetTypeAllowsSurface):\n// `object-table` is the one to add now. Rendering resolves through\n// getWidgetTypeEntry, which ignores `surfaces`, so hidden ≠ broken.\nregisterDashboardWidget('table', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 10,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Table',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `object-list` is registered HERE and only here. Registering it from\n// CnObjectListWidget/index.js instead is not enough: package.json declares\n// `sideEffects: [\"**/*.css\"]` (ADR-061 tree-shaking), which lets\n// rollup/webpack legally DROP bare imports of side-effect-free JS modules —\n// the dist bundle shipped without the object-list registration and every\n// manifest `type:\"object-list\"` widget rendered blank. Inline calls in this\n// module survive because consumers import live bindings from the registry.\n//\n// That index.js ALSO self-registered, with a divergent entry (limit 5, no\n// `surfaces`), so both ran in a consumer's build — components/index.js\n// re-exports it, so it was never tree-shaken — and last-registration-wins\n// decided whether this legacy alias stayed hidden from the Add-widget picker.\n// The self-registration is gone; this entry is the one that already won.\nregisterDashboardWidget('object-list', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 25,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Object list',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `saved-view`: a list driven by one of the reader's saved views. The only data\n// widget a user may add themselves, because the view carries the register and\n// schema a user would otherwise have to name. Registered inline for the same\n// tree-shaking reason as `object-list` above.\n// @spec openspec/changes/a-saved-view-drives-a-widget/tasks.md#task-1.1\nregisterDashboardWidget('saved-view', {\n\trenderer: CnSavedViewWidget2,\n\tform: CnSavedViewWidgetForm2,\n\tdefaultContent: { viewId: '', limit: 10 },\n\tdisplayName: 'Saved view',\n\ticon: 'ClipboardList',\n\tuserAddable: true,\n})\n\n// `markdown`: prose inside a grid page, through the one shared renderer. The\n// only catalog widget a PUBLIC host may mount so far: every other entry is\n// `public: false` until its author opts in deliberately.\n// @spec openspec/changes/widget-registry-public-flag/tasks.md#task-4\nregisterDashboardWidget('markdown', {\n\trenderer: CnMarkdownWidget2,\n\tform: CnMarkdownWidgetForm2,\n\tdefaultContent: { markdown: '' },\n\tdisplayName: 'Markdown',\n\ticon: 'FormatTitle',\n\tpublic: true,\n})\n\nregisterDashboardWidget('related', {\n\trenderer: CnRelatedObjectsWidget,\n\tform: CnRelatedObjectsWidgetForm,\n\tdefaultContent: { title: '', groups: [], hideSingleTabTitle: true, showTotalCount: true },\n\tdisplayName: 'Object relations',\n\ticon: 'FileTreeOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// `map` is registered here for the same tree-shaking reason as `object-list`\n// above — a bare `import '../CnMapWidget/index.js'` is a side-effect-free JS module\n// as far as the bundler is concerned, so it may legally be dropped and the widget\n// would silently never appear in Add Widget. CnMapWidget/index.js carried a\n// byte-identical copy of this entry, which only produced a duplicate-registration\n// warning on every consumer's boot; it no longer registers.\nregisterDashboardWidget('map', {\n\trenderer: CnMapWidget,\n\tform: CnMapWidgetForm,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\t// The Netherlands, roughly — only visible until autoFit frames the objects.\n\t\tcenter: [52.13, 5.29],\n\t\tzoom: 7,\n\t\theight: '400px',\n\t\tpopupField: '',\n\t\tclustering: false,\n\t\tautoFit: true,\n\t\t// A map with no tile layer renders as a grey box. `basemaps` is opt-in and\n\t\t// empty by default (so consumers declaring a `tile` entry in `layers` are\n\t\t// unaffected), which meant a freshly-placed Map widget had NO background at\n\t\t// all. Ship OpenStreetMap — the Nextcloud CSP already allows *.tile.openstreetmap.org.\n\t\tbasemaps: [\n\t\t\t{\n\t\t\t\tname: 'OpenStreetMap',\n\t\t\t\turl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n\t\t\t\tattribution: '© OpenStreetMap contributors',\n\t\t\t\toptions: { maxZoom: 19 },\n\t\t\t},\n\t\t],\n\t\tmarkers: {\n\t\t\tdataSource: { register: '', schema: '' },\n\t\t\tpopupField: '',\n\t\t\tclustering: false,\n\t\t},\n\t},\n\tdisplayName: 'Map',\n\ticon: 'Map',\n})\n\nregisterDashboardWidget('countdown', {\n\trenderer: CnCountdownWidget,\n\tform: CnCountdownWidgetForm,\n\tdefaultContent: {\n\t\tlabel: '',\n\t\tfield: '',\n\t\ticon: 'ClockOutline',\n\t\tthresholds: {},\n\t\tshowDate: true,\n\t},\n\tdisplayName: 'Countdown',\n\ticon: 'ClockOutline',\n\t// Card family: the tile headlines itself, so the wrapper draws no header.\n\tcard: true,\n\t// It reads a date off the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\n// The case surfaces (detail-action-model-and-case-surfaces). Each reads the\n// BOUND RECORD, which only a detail page has, and none has a config form yet,\n// so `form: null` keeps them out of the Add-widget picker: they are placed\n// from the manifest. Registered inline for the same tree-shaking reason as\n// `map` above.\nregisterDashboardWidget('next-step', {\n\trenderer: CnNextStepWidget,\n\tform: null,\n\tdefaultContent: { field: 'status', stages: {} },\n\tdisplayName: 'Next step',\n\ticon: 'CheckCircleOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('document-review', {\n\trenderer: CnDocumentReviewWidget,\n\tform: null,\n\tdefaultContent: { field: 'documents', statusField: 'reviewStatus', statuses: [] },\n\tdisplayName: 'Document review',\n\ticon: 'FileDocumentCheckOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('conversation', {\n\trenderer: CnConversationWidget,\n\tform: null,\n\tdefaultContent: { field: 'messages', endpoint: '' },\n\tdisplayName: 'Conversation',\n\ticon: 'ForumOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// The record's stages, where clicking a stage moves the record there.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('stages', {\n\trenderer: CnStagesWidget,\n\tform: CnStagesWidgetForm,\n\tdefaultContent: {\n\t\tcurrentField: 'status',\n\t\torientation: 'horizontal',\n\t\tsize: 'medium',\n\t\tstagesEndpoint: { url: '', path: '' },\n\t\t// The LIFECYCLE, not a record write. OpenRegister decides what is\n\t\t// reachable and re-validates the move; a field write has neither.\n\t\ttransition: { kind: 'lifecycle' },\n\t},\n\tdisplayName: 'Stages',\n\ticon: 'Timeline',\n\t// Card family on the detail grid: a titled wrapper around a self-contained\n\t// strip, like the KPI tiles it usually sits beside.\n\tcard: true,\n\t// It reads and moves the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\nregisterDashboardWidget('tabs', {\n\trenderer: CnTabsWidget,\n\tform: CnTabsWidgetForm,\n\tdefaultContent: {\n\t\ttabs: [],\n\t\tariaLabel: '',\n\t},\n\tdisplayName: 'Tabs',\n\ticon: 'TabPlus',\n\t// Renders OTHER widgets, so CnDetailWidgetHost hands it the surface's\n\t// sibling definitions and the context its children will need.\n\tcontainer: true,\n\t// The strip's labels ARE the titles, so a card header above them would name\n\t// the group twice.\n\townsTitle: true,\n\tsurfaces: ['detail-page'],\n})\n\n// The current week as day columns, with the dated items under each day.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('week-strip', {\n\trenderer: CnWeekStripWidget,\n\tform: CnWeekStripWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', filter: {} },\n\t\tdateField: '',\n\t\ttitleField: '',\n\t\tmetaFields: [],\n\t\tdays: 5,\n\t\titemRoute: '',\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Week strip',\n\ticon: 'Calendar',\n})\n\n// One segmented bar with a legend that carries the numbers.\nregisterDashboardWidget('stacked-bar', {\n\trenderer: CnStackedBarWidget,\n\tform: CnStackedBarWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', groupBy: '', filter: {} },\n\t\torder: [],\n\t\tlabels: {},\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Stacked bar',\n\ticon: 'ChartBar',\n})\n\n/**\n * Explicit no-op that guarantees this module (and therefore every widget's\n * self-registration side effect) is evaluated. Now optional: `CnDashboardPage`\n * and `CnDetailPage` import this module themselves, and a second call changes\n * nothing because the module body runs once.\n *\n * @return {void}\n */\nexport function registerBuiltinDashboardWidgets() {}\n"],"names":["CnChartWidget","CnChartWidgetForm","CnStatsBlockWidget","CnStatsBlockWidgetForm","CnObjectListWidget2","CnObjectListWidgetForm2","CnSavedViewWidget2","CnSavedViewWidgetForm2","CnMarkdownWidget2","CnMarkdownWidgetForm2","CnRelatedObjectsWidget","CnRelatedObjectsWidgetForm","CnMapWidget","CnMapWidgetForm","CnCountdownWidget","CnCountdownWidgetForm","CnNextStepWidget","CnDocumentReviewWidget","CnConversationWidget","CnStagesWidget","CnStagesWidgetForm","CnTabsWidget","CnTabsWidgetForm","CnWeekStripWidget","CnWeekStripWidgetForm","CnStackedBarWidget","CnStackedBarWidgetForm"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAwEA;AACA,uBAAuB,CAAC,OAAO,EAAE;AACjC,CAAC,QAAQ,EAAEA,UAAa;AACxB,CAAC,IAAI,EAAEC,YAAiB;AACxB,CAAC,cAAc,EAAE;AACjB,EAAE,SAAS,EAAE,MAAM;AACnB,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE;AAClI,EAAE;AACF,CAAC,WAAW,EAAE,OAAO;AACrB,CAAC,IAAI,EAAE,WAAW;AAClB,CAAC,EAAC;AACF;AACA,uBAAuB,CAAC,aAAa,EAAE;AACvC,CAAC,QAAQ,EAAEC,YAAkB;AAC7B,CAAC,IAAI,EAAEC,YAAsB;AAC7B,CAAC,cAAc,EAAE;AACjB,EAAE,KAAK,EAAE,EAAE;AACX,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;AAC9D,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;AAClF,EAAE;AACF,CAAC,WAAW,EAAE,gBAAgB;AAC9B,CAAC,IAAI,EAAE,UAAU;AACjB;AACA;AACA;AACA,CAAC,IAAI,EAAE,IAAI;AACX,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,CAAC,OAAO,EAAE;AACjC,CAAC,QAAQ,EAAEC,YAAmB;AAC9B,CAAC,IAAI,EAAEC,YAAuB;AAC9B,CAAC,cAAc,EAAE;AACjB,EAAE,QAAQ,EAAE,EAAE;AACd,EAAE,MAAM,EAAE,EAAE;AACZ,EAAE,MAAM,EAAE,EAAE;AACZ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;AACjC,EAAE,KAAK,EAAE,EAAE;AACX,EAAE,OAAO,EAAE,EAAE;AACb,EAAE;AACF,CAAC,WAAW,EAAE,OAAO;AACrB,CAAC,IAAI,EAAE,eAAe;AACtB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AACrB,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,CAAC,aAAa,EAAE;AACvC,CAAC,QAAQ,EAAED,YAAmB;AAC9B,CAAC,IAAI,EAAEC,YAAuB;AAC9B,CAAC,cAAc,EAAE;AACjB,EAAE,QAAQ,EAAE,EAAE;AACd,EAAE,MAAM,EAAE,EAAE;AACZ,EAAE,MAAM,EAAE,EAAE;AACZ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;AACjC,EAAE,KAAK,EAAE,EAAE;AACX,EAAE,OAAO,EAAE,EAAE;AACb,EAAE;AACF,CAAC,WAAW,EAAE,aAAa;AAC3B,CAAC,IAAI,EAAE,eAAe;AACtB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AACrB,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,CAAC,YAAY,EAAE;AACtC,CAAC,QAAQ,EAAEC,YAAkB;AAC7B,CAAC,IAAI,EAAEC,YAAsB;AAC7B,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;AAC1C,CAAC,WAAW,EAAE,YAAY;AAC1B,CAAC,IAAI,EAAE,eAAe;AACtB,CAAC,WAAW,EAAE,IAAI;AAClB,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA,uBAAuB,CAAC,UAAU,EAAE;AACpC,CAAC,QAAQ,EAAEC,YAAiB;AAC5B,CAAC,IAAI,EAAEC,YAAqB;AAC5B,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;AACjC,CAAC,WAAW,EAAE,UAAU;AACxB,CAAC,IAAI,EAAE,aAAa;AACpB,CAAC,MAAM,EAAE,IAAI;AACb,CAAC,EAAC;AACF;AACA,uBAAuB,CAAC,SAAS,EAAE;AACnC,CAAC,QAAQ,EAAEC,YAAsB;AACjC,CAAC,IAAI,EAAEC,YAA0B;AACjC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;AAC1F,CAAC,WAAW,EAAE,kBAAkB;AAChC,CAAC,IAAI,EAAE,iBAAiB;AACxB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC,SAAS,EAAE,IAAI;AAChB,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,CAAC,KAAK,EAAE;AAC/B,CAAC,QAAQ,EAAEC,YAAW;AACtB,CAAC,IAAI,EAAEC,YAAe;AACtB,CAAC,cAAc,EAAE;AACjB,EAAE,QAAQ,EAAE,EAAE;AACd,EAAE,MAAM,EAAE,EAAE;AACZ;AACA,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;AACvB,EAAE,IAAI,EAAE,CAAC;AACT,EAAE,MAAM,EAAE,OAAO;AACjB,EAAE,UAAU,EAAE,EAAE;AAChB,EAAE,UAAU,EAAE,KAAK;AACnB,EAAE,OAAO,EAAE,IAAI;AACf;AACA;AACA;AACA;AACA,EAAE,QAAQ,EAAE;AACZ,GAAG;AACH,IAAI,IAAI,EAAE,eAAe;AACzB,IAAI,GAAG,EAAE,oDAAoD;AAC7D,IAAI,WAAW,EAAE,8BAA8B;AAC/C,IAAI,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;AAC5B,IAAI;AACJ,GAAG;AACH,EAAE,OAAO,EAAE;AACX,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;AAC3C,GAAG,UAAU,EAAE,EAAE;AACjB,GAAG,UAAU,EAAE,KAAK;AACpB,GAAG;AACH,EAAE;AACF,CAAC,WAAW,EAAE,KAAK;AACnB,CAAC,IAAI,EAAE,KAAK;AACZ,CAAC,EAAC;AACF;AACA,uBAAuB,CAAC,WAAW,EAAE;AACrC,CAAC,QAAQ,EAAEC,YAAiB;AAC5B,CAAC,IAAI,EAAEC,YAAqB;AAC5B,CAAC,cAAc,EAAE;AACjB,EAAE,KAAK,EAAE,EAAE;AACX,EAAE,KAAK,EAAE,EAAE;AACX,EAAE,IAAI,EAAE,cAAc;AACtB,EAAE,UAAU,EAAE,EAAE;AAChB,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE;AACF,CAAC,WAAW,EAAE,WAAW;AACzB,CAAC,IAAI,EAAE,cAAc;AACrB;AACA,CAAC,IAAI,EAAE,IAAI;AACX;AACA,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,CAAC,WAAW,EAAE;AACrC,CAAC,QAAQ,EAAEC,YAAgB;AAC3B,CAAC,IAAI,EAAE,IAAI;AACX,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;AAChD,CAAC,WAAW,EAAE,WAAW;AACzB,CAAC,IAAI,EAAE,oBAAoB;AAC3B,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC,SAAS,EAAE,IAAI;AAChB,CAAC,EAAC;AACF;AACA,uBAAuB,CAAC,iBAAiB,EAAE;AAC3C,CAAC,QAAQ,EAAEC,YAAsB;AACjC,CAAC,IAAI,EAAE,IAAI;AACX,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE;AAClF,CAAC,WAAW,EAAE,iBAAiB;AAC/B,CAAC,IAAI,EAAE,0BAA0B;AACjC,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC,SAAS,EAAE,IAAI;AAChB,CAAC,EAAC;AACF;AACA,uBAAuB,CAAC,cAAc,EAAE;AACxC,CAAC,QAAQ,EAAEC,YAAoB;AAC/B,CAAC,IAAI,EAAE,IAAI;AACX,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;AACpD,CAAC,WAAW,EAAE,cAAc;AAC5B,CAAC,IAAI,EAAE,cAAc;AACrB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC,SAAS,EAAE,IAAI;AAChB,CAAC,EAAC;AACF;AACA;AACA;AACA,uBAAuB,CAAC,QAAQ,EAAE;AAClC,CAAC,QAAQ,EAAEC,YAAc;AACzB,CAAC,IAAI,EAAEC,YAAkB;AACzB,CAAC,cAAc,EAAE;AACjB,EAAE,YAAY,EAAE,QAAQ;AACxB,EAAE,WAAW,EAAE,YAAY;AAC3B,EAAE,IAAI,EAAE,QAAQ;AAChB,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;AACvC;AACA;AACA,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;AACnC,EAAE;AACF,CAAC,WAAW,EAAE,QAAQ;AACtB,CAAC,IAAI,EAAE,UAAU;AACjB;AACA;AACA,CAAC,IAAI,EAAE,IAAI;AACX;AACA,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC,EAAC;AACF;AACA,uBAAuB,CAAC,MAAM,EAAE;AAChC,CAAC,QAAQ,EAAEC,YAAY;AACvB,CAAC,IAAI,EAAEC,YAAgB;AACvB,CAAC,cAAc,EAAE;AACjB,EAAE,IAAI,EAAE,EAAE;AACV,EAAE,SAAS,EAAE,EAAE;AACf,EAAE;AACF,CAAC,WAAW,EAAE,MAAM;AACpB,CAAC,IAAI,EAAE,SAAS;AAChB;AACA;AACA,CAAC,SAAS,EAAE,IAAI;AAChB;AACA;AACA,CAAC,SAAS,EAAE,IAAI;AAChB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC,EAAC;AACF;AACA;AACA;AACA,uBAAuB,CAAC,YAAY,EAAE;AACtC,CAAC,QAAQ,EAAEC,YAAiB;AAC5B,CAAC,IAAI,EAAEC,YAAqB;AAC5B,CAAC,cAAc,EAAE;AACjB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;AAClD,EAAE,SAAS,EAAE,EAAE;AACf,EAAE,UAAU,EAAE,EAAE;AAChB,EAAE,UAAU,EAAE,EAAE;AAChB,EAAE,IAAI,EAAE,CAAC;AACT,EAAE,SAAS,EAAE,EAAE;AACf,EAAE,SAAS,EAAE,EAAE;AACf,EAAE;AACF,CAAC,WAAW,EAAE,YAAY;AAC1B,CAAC,IAAI,EAAE,UAAU;AACjB,CAAC,EAAC;AACF;AACA;AACA,uBAAuB,CAAC,aAAa,EAAE;AACvC,CAAC,QAAQ,EAAEC,YAAkB;AAC7B,CAAC,IAAI,EAAEC,YAAsB;AAC7B,CAAC,cAAc,EAAE;AACjB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;AAC/D,EAAE,KAAK,EAAE,EAAE;AACX,EAAE,MAAM,EAAE,EAAE;AACZ,EAAE,SAAS,EAAE,EAAE;AACf,EAAE;AACF,CAAC,WAAW,EAAE,aAAa;AAC3B,CAAC,IAAI,EAAE,UAAU;AACjB,CAAC,EAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,+BAA+B,GAAG;;;;"}
|
|
1
|
+
{"version":3,"file":"registerDashboardWidgets.js","sources":["../../../../src/components/CnWidgetGrid/registerDashboardWidgets.js"],"sourcesContent":["/**\n * Side-effect aggregator for the cn-widget-library dashboard widget catalog.\n *\n * Importing this module imports every migrated widget's `index.js`, each of\n * which self-registers its `{ renderer, form, defaultContent, displayName,\n * icon }` into `dashboardWidgetRegistry` at load time. The library barrel\n * imports this module so the catalog is populated whenever a consuming app\n * imports `@conduction/nextcloud-vue`; `CnWidgetGrid` then resolves widgets by\n * type key and `CnAddWidgetModal` lists the addable types.\n *\n * The individual widget components are intentionally NOT public exports — they\n * are resolved by their registry type key (the whole point of the registry),\n * so consumers reference them via the manifest `widgetKey`, not by import.\n *\n * @module components/CnWidgetGrid/registerDashboardWidgets\n */\n\nimport CnChartWidget from '../CnChartWidget/CnChartWidget.vue'\nimport CnChartWidgetForm from '../CnChartWidgetForm/CnChartWidgetForm.vue'\nimport CnConversationWidget from '../CnConversationThread/CnConversationWidget.vue'\nimport CnCountdownWidget from '../CnCountdownWidget/CnCountdownWidget.vue'\nimport CnCountdownWidgetForm from '../CnCountdownWidgetForm/CnCountdownWidgetForm.vue'\nimport CnDocumentReviewWidget from '../CnDocumentReviewList/CnDocumentReviewWidget.vue'\nimport CnMapWidget from '../CnMapWidget/CnMapWidget.vue'\nimport CnMapWidgetForm from '../CnMapWidgetForm/CnMapWidgetForm.vue'\nimport CnMarkdownWidget2 from '../CnMarkdownWidget/CnMarkdownWidget.vue'\nimport CnMarkdownWidgetForm2 from '../CnMarkdownWidgetForm/CnMarkdownWidgetForm.vue'\nimport CnNextStepWidget from '../CnNextStepCard/CnNextStepWidget.vue'\nimport CnObjectListWidget2 from '../CnObjectListWidget/CnObjectListWidget.vue'\nimport CnObjectListWidgetForm2 from '../CnObjectListWidgetForm/CnObjectListWidgetForm.vue'\nimport CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'\nimport CnRelatedObjectsWidgetForm from '../CnRelatedObjectsWidgetForm/CnRelatedObjectsWidgetForm.vue'\nimport CnSavedViewWidget2 from '../CnSavedViewWidget/CnSavedViewWidget.vue'\nimport CnSavedViewWidgetForm2 from '../CnSavedViewWidgetForm/CnSavedViewWidgetForm.vue'\nimport CnStackedBarWidget from '../CnStackedBarWidget/CnStackedBarWidget.vue'\nimport CnStackedBarWidgetForm from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue'\nimport CnStagesWidget from '../CnStagesWidget/CnStagesWidget.vue'\nimport CnStagesWidgetForm from '../CnStagesWidgetForm/CnStagesWidgetForm.vue'\nimport CnStatsBlockWidget from '../CnStatsBlockWidget/CnStatsBlockWidget.vue'\nimport CnStatsBlockWidgetForm from '../CnStatsBlockWidgetForm/CnStatsBlockWidgetForm.vue'\nimport CnTabsWidget from '../CnTabsWidget/CnTabsWidget.vue'\nimport CnTabsWidgetForm from '../CnTabsWidgetForm/CnTabsWidgetForm.vue'\nimport CnWeekStripWidget from '../CnWeekStripWidget/CnWeekStripWidget.vue'\nimport CnWeekStripWidgetForm from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue'\n// Typed widgets registered with an explicit renderer + config FORM. chart /\n// stats-block render through CnDashboardPage's own isChart()/isStatsBlock()\n// branches and `related` through CnDetailPage's isRelatedWidget() branch — the\n// registry entry exists so the cog editor + Add-widget picker get a form (and,\n// for `related`, the detail-page surface). `table` aliases the object-list\n// renderer/form for legacy manifests using type:'table'.\nimport { registerDashboardWidget } from './dashboardWidgetRegistry.js'\n\nimport '../CnLabelWidget/index.js'\nimport '../CnTextWidget/index.js'\nimport '../CnImageWidget/index.js'\nimport '../CnLinkButtonWidget/index.js'\nimport '../CnDividerWidget/index.js'\nimport '../CnHeaderWidget/index.js'\nimport '../CnQuicklinksWidget/index.js'\nimport '../CnVideoWidget/index.js'\nimport '../CnDashTileWidget/index.js'\nimport '../CnLinksWidget/index.js'\nimport '../CnMenuWidget/index.js'\nimport '../CnContainerWidget/index.js'\nimport '../CnFilesWidget/index.js'\nimport '../CnPeopleWidget/index.js'\nimport '../CnCalendarWidget/index.js'\nimport '../CnNcWidgetWidget/index.js'\nimport '../CnSpendAnalyticsWidget/index.js'\nimport '../CnStatWidget/index.js'\nimport '../CnDeltaWidget/index.js'\nimport '../CnGaugeWidget/index.js'\nimport '../CnFlowRunsWidget/index.js'\nimport '../CnTasksWidget/index.js'\nimport '../CnSectionsWidget/index.js'\nimport '../CnFactsWidget/index.js'\nimport '../CnFieldListWidget/index.js'\nimport '../CnSettingsFormWidget/index.js'\nimport '../CnSwitchRowsWidget/index.js'\nimport '../CnRadioCardsWidget/index.js'\nimport '../CnChipsFieldWidget/index.js'\nimport '../CnToggleTableWidget/index.js'\nimport '../CnChoicePickerWidget/index.js'\nimport '../CnRecordListWidget/index.js'\nimport '../CnSavedViewsWidget/index.js'\nimport '../CnNotepadWidget/index.js'\nimport '../CnObjectDataWidget/dashboardRegistration.js'\nimport '../CnObjectGeoWidget/dashboardRegistration.js'\nimport '../CnWidgetObjectTable/dashboardRegistration.js'\nimport '../CnAuditTrailWidget/dashboardRegistration.js'\nimport '../CnTimelineWidget/dashboardRegistration.js'\nimport '../CnKbSearchWidget/index.js'\nimport '../CnInteractionFormWidget/index.js'\nimport '../CnBannerWidget/index.js'\nimport '../CnWorkspaceFilterWidget/index.js'\n\nregisterDashboardWidget('chart', {\n\trenderer: CnChartWidget,\n\tform: CnChartWidgetForm,\n\tdefaultContent: {\n\t\tchartKind: 'area',\n\t\tdataSource: { register: '', schema: '', filter: {}, bucket: { field: '', interval: 'month', metric: 'count', metricField: '' } },\n\t},\n\tdisplayName: 'Chart',\n\ticon: 'ChartLine',\n})\n\nregisterDashboardWidget('stats-block', {\n\trenderer: CnStatsBlockWidget,\n\tform: CnStatsBlockWidgetForm,\n\tdefaultContent: {\n\t\ttitle: '',\n\t\tprops: { countLabel: '', variant: 'default', iconClass: '' },\n\t\tdataSource: { register: '', schema: '', metric: 'count', field: '', filter: {} },\n\t},\n\tdisplayName: 'Statistic card',\n\ticon: 'ChartBar',\n\t// Card family (docs/architecture/cards-and-widgets.md), like `stat` and\n\t// `delta`: the tile headlines itself with its own title, so the wrapper\n\t// renders no header of its own and would otherwise show the title twice.\n\tcard: true,\n})\n\n// `table` and `object-list` (below) are legacy aliases of `object-table` — same\n// config form (CnObjectListWidgetForm), same job. They stay registered so\n// existing placements keep rendering, but are hidden from every Add-widget\n// picker via a sentinel surface no picker queries (see widgetTypeAllowsSurface):\n// `object-table` is the one to add now. Rendering resolves through\n// getWidgetTypeEntry, which ignores `surfaces`, so hidden ≠ broken.\nregisterDashboardWidget('table', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 10,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Table',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `object-list` is registered HERE and only here. Registering it from\n// CnObjectListWidget/index.js instead is not enough: package.json declares\n// `sideEffects: [\"**/*.css\"]` (ADR-061 tree-shaking), which lets\n// rollup/webpack legally DROP bare imports of side-effect-free JS modules —\n// the dist bundle shipped without the object-list registration and every\n// manifest `type:\"object-list\"` widget rendered blank. Inline calls in this\n// module survive because consumers import live bindings from the registry.\n//\n// That index.js ALSO self-registered, with a divergent entry (limit 5, no\n// `surfaces`), so both ran in a consumer's build — components/index.js\n// re-exports it, so it was never tree-shaken — and last-registration-wins\n// decided whether this legacy alias stayed hidden from the Add-widget picker.\n// The self-registration is gone; this entry is the one that already won.\nregisterDashboardWidget('object-list', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 25,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Object list',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `saved-view`: a list driven by one of the reader's saved views. The only data\n// widget a user may add themselves, because the view carries the register and\n// schema a user would otherwise have to name. Registered inline for the same\n// tree-shaking reason as `object-list` above.\n// @spec openspec/changes/a-saved-view-drives-a-widget/tasks.md#task-1.1\nregisterDashboardWidget('saved-view', {\n\trenderer: CnSavedViewWidget2,\n\tform: CnSavedViewWidgetForm2,\n\tdefaultContent: { viewId: '', limit: 10 },\n\tdisplayName: 'Saved view',\n\ticon: 'ClipboardList',\n\tuserAddable: true,\n})\n\n// `markdown`: prose inside a grid page, through the one shared renderer. The\n// only catalog widget a PUBLIC host may mount so far: every other entry is\n// `public: false` until its author opts in deliberately.\n// @spec openspec/changes/widget-registry-public-flag/tasks.md#task-4\nregisterDashboardWidget('markdown', {\n\trenderer: CnMarkdownWidget2,\n\tform: CnMarkdownWidgetForm2,\n\tdefaultContent: { markdown: '' },\n\tdisplayName: 'Markdown',\n\ticon: 'FormatTitle',\n\tpublic: true,\n})\n\nregisterDashboardWidget('related', {\n\trenderer: CnRelatedObjectsWidget,\n\tform: CnRelatedObjectsWidgetForm,\n\tdefaultContent: { title: '', groups: [], hideSingleTabTitle: true, showTotalCount: true },\n\tdisplayName: 'Object relations',\n\ticon: 'FileTreeOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// `map` is registered here for the same tree-shaking reason as `object-list`\n// above — a bare `import '../CnMapWidget/index.js'` is a side-effect-free JS module\n// as far as the bundler is concerned, so it may legally be dropped and the widget\n// would silently never appear in Add Widget. CnMapWidget/index.js carried a\n// byte-identical copy of this entry, which only produced a duplicate-registration\n// warning on every consumer's boot; it no longer registers.\nregisterDashboardWidget('map', {\n\trenderer: CnMapWidget,\n\tform: CnMapWidgetForm,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\t// The Netherlands, roughly — only visible until autoFit frames the objects.\n\t\tcenter: [52.13, 5.29],\n\t\tzoom: 7,\n\t\theight: '400px',\n\t\tpopupField: '',\n\t\tclustering: false,\n\t\tautoFit: true,\n\t\t// A map with no tile layer renders as a grey box. `basemaps` is opt-in and\n\t\t// empty by default (so consumers declaring a `tile` entry in `layers` are\n\t\t// unaffected), which meant a freshly-placed Map widget had NO background at\n\t\t// all. Ship OpenStreetMap — the Nextcloud CSP already allows *.tile.openstreetmap.org.\n\t\tbasemaps: [\n\t\t\t{\n\t\t\t\tname: 'OpenStreetMap',\n\t\t\t\turl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n\t\t\t\tattribution: '© OpenStreetMap contributors',\n\t\t\t\toptions: { maxZoom: 19 },\n\t\t\t},\n\t\t],\n\t\tmarkers: {\n\t\t\tdataSource: { register: '', schema: '' },\n\t\t\tpopupField: '',\n\t\t\tclustering: false,\n\t\t},\n\t},\n\tdisplayName: 'Map',\n\ticon: 'Map',\n})\n\nregisterDashboardWidget('countdown', {\n\trenderer: CnCountdownWidget,\n\tform: CnCountdownWidgetForm,\n\tdefaultContent: {\n\t\tlabel: '',\n\t\tfield: '',\n\t\ticon: 'ClockOutline',\n\t\tthresholds: {},\n\t\tshowDate: true,\n\t},\n\tdisplayName: 'Countdown',\n\ticon: 'ClockOutline',\n\t// Card family: the tile headlines itself, so the wrapper draws no header.\n\tcard: true,\n\t// It reads a date off the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\n// The case surfaces (detail-action-model-and-case-surfaces). Each reads the\n// BOUND RECORD, which only a detail page has, and none has a config form yet,\n// so `form: null` keeps them out of the Add-widget picker: they are placed\n// from the manifest. Registered inline for the same tree-shaking reason as\n// `map` above.\nregisterDashboardWidget('next-step', {\n\trenderer: CnNextStepWidget,\n\tform: null,\n\tdefaultContent: { field: 'status', stages: {} },\n\tdisplayName: 'Next step',\n\ticon: 'CheckCircleOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('document-review', {\n\trenderer: CnDocumentReviewWidget,\n\tform: null,\n\tdefaultContent: { field: 'documents', statusField: 'reviewStatus', statuses: [] },\n\tdisplayName: 'Document review',\n\ticon: 'FileDocumentCheckOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('conversation', {\n\trenderer: CnConversationWidget,\n\tform: null,\n\tdefaultContent: { field: 'messages', endpoint: '' },\n\tdisplayName: 'Conversation',\n\ticon: 'ForumOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// The record's stages, where clicking a stage moves the record there.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('stages', {\n\trenderer: CnStagesWidget,\n\tform: CnStagesWidgetForm,\n\tdefaultContent: {\n\t\tcurrentField: 'status',\n\t\torientation: 'horizontal',\n\t\tsize: 'medium',\n\t\tstagesEndpoint: { url: '', path: '' },\n\t\t// The LIFECYCLE, not a record write. OpenRegister decides what is\n\t\t// reachable and re-validates the move; a field write has neither.\n\t\ttransition: { kind: 'lifecycle' },\n\t},\n\tdisplayName: 'Stages',\n\ticon: 'Timeline',\n\t// Card family on the detail grid: a titled wrapper around a self-contained\n\t// strip, like the KPI tiles it usually sits beside.\n\tcard: true,\n\t// It reads and moves the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\nregisterDashboardWidget('tabs', {\n\trenderer: CnTabsWidget,\n\tform: CnTabsWidgetForm,\n\tdefaultContent: {\n\t\ttabs: [],\n\t\tariaLabel: '',\n\t},\n\tdisplayName: 'Tabs',\n\ticon: 'TabPlus',\n\t// Renders OTHER widgets, so CnDetailWidgetHost hands it the surface's\n\t// sibling definitions and the context its children will need.\n\tcontainer: true,\n\t// The strip's labels ARE the titles, so a card header above them would name\n\t// the group twice.\n\townsTitle: true,\n\tsurfaces: ['detail-page'],\n})\n\n// The current week as day columns, with the dated items under each day.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('week-strip', {\n\trenderer: CnWeekStripWidget,\n\tform: CnWeekStripWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', filter: {} },\n\t\tdateField: '',\n\t\ttitleField: '',\n\t\tmetaFields: [],\n\t\tdays: 5,\n\t\titemRoute: '',\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Week strip',\n\ticon: 'Calendar',\n})\n\n// One segmented bar with a legend that carries the numbers.\nregisterDashboardWidget('stacked-bar', {\n\trenderer: CnStackedBarWidget,\n\tform: CnStackedBarWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', groupBy: '', filter: {} },\n\t\torder: [],\n\t\tlabels: {},\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Stacked bar',\n\ticon: 'ChartBar',\n})\n\n/**\n * Explicit no-op that guarantees this module (and therefore every widget's\n * self-registration side effect) is evaluated. Now optional: `CnDashboardPage`\n * and `CnDetailPage` import this module themselves, and a second call changes\n * nothing because the module body runs once.\n *\n * @return {void}\n */\nexport function registerBuiltinDashboardWidgets() {}\n"],"names":["CnChartWidget","CnChartWidgetForm","CnStatsBlockWidget","CnStatsBlockWidgetForm","CnObjectListWidget2","CnObjectListWidgetForm2","CnSavedViewWidget2","CnSavedViewWidgetForm2","CnMarkdownWidget2","CnMarkdownWidgetForm2","CnRelatedObjectsWidget","CnRelatedObjectsWidgetForm","CnMapWidget","CnMapWidgetForm","CnCountdownWidget","CnCountdownWidgetForm","CnNextStepWidget","CnDocumentReviewWidget","CnConversationWidget","CnStagesWidget","CnStagesWidgetForm","CnTabsWidget","CnTabsWidgetForm","CnWeekStripWidget","CnWeekStripWidgetForm","CnStackedBarWidget","CnStackedBarWidgetForm"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnWorkspaceFilterWidget.vue2.js","sources":["../../../../src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div\n\t\tclass=\"cn-workspace-filter-widget\"\n\t\t:class=\"{\n\t\t\t'cn-workspace-filter-widget--start': isStart,\n\t\t\t'cn-workspace-filter-widget--chips': style === 'chips',\n\t\t\t'cn-workspace-filter-widget--bar': isBar,\n\t\t\t'cn-workspace-filter-widget--inline': content.inline === true,\n\t\t\t'cn-workspace-filter-widget--end': content.align === 'end',\n\t\t}\"\n\t\tdata-testid=\"cn-workspace-filter-widget\">\n\t\t<!-- The start card (`layout: \"start\"`): a title and one line of\n\t\t guidance beside the control, as the \"Contact starten\" card. -->\n\t\t<div v-if=\"isStart && (title || description)\" class=\"cn-workspace-filter-widget__text\">\n\t\t\t<h3 v-if=\"title\" class=\"cn-workspace-filter-widget__title\">\n\t\t\t\t{{ title }}\n\t\t\t</h3>\n\t\t\t<p v-if=\"description\" class=\"cn-workspace-filter-widget__description\">\n\t\t\t\t{{ description }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<!-- A bar (`layout: \"bar\"`): its `controls` side by side in one row,\n\t\t each a workspace filter of its own (chips, a switch, a select). -->\n\t\t<template v-if=\"isBar\">\n\t\t\t<CnWorkspaceFilterWidget\n\t\t\t\tv-for=\"(control, index) in barControls\"\n\t\t\t\t:key=\"index\"\n\t\t\t\t:content=\"control\"\n\t\t\t\t@change=\"$emit('change', $event)\" />\n\t\t</template>\n\n\t\t<p v-if=\"!isBar && label && style !== 'chips' && style !== 'toggle'\" class=\"cn-workspace-filter-widget__label\">\n\t\t\t{{ label }}\n\t\t</p>\n\n\t\t<!-- An object picker (`objectSource`): searches OpenRegister on the\n\t\t server, so it reaches every object, not a fetched page. -->\n\t\t<CnResourceSelect\n\t\t\tv-if=\"!isBar && objectSource\"\n\t\t\tclass=\"cn-workspace-filter-widget__control\"\n\t\t\t:register=\"objectSource.register\"\n\t\t\t:schema=\"objectSource.schema\"\n\t\t\t:labelField=\"objectSource.labelField || 'title'\"\n\t\t\t:modelValue=\"selected === undefined || selected === null ? '' : String(selected)\"\n\t\t\t:placeholder=\"tr(objectSource.placeholder || '')\"\n\t\t\t:ariaLabelCombobox=\"tr(objectSource.ariaLabel || '') || title || label || writeKey\"\n\t\t\t:preload=\"objectSource.preload !== false\"\n\t\t\t:clearable=\"Boolean(content.allLabel)\"\n\t\t\t:allowCreate=\"false\"\n\t\t\tdata-testid=\"cn-workspace-filter-object\"\n\t\t\t@update:modelValue=\"applySelection($event || '')\" />\n\n\t\t<div v-else-if=\"loading\" class=\"cn-workspace-filter-widget__status\">\n\t\t\t{{ loadingLabel }}\n\t\t</div>\n\n\t\t<!-- Chips style (screens-page-lenses): one compact segmented group,\n\t\t a count after each label, arrow keys move the choice. -->\n\t\t<CnSegmentedControl\n\t\t\tv-else-if=\"style === 'chips'\"\n\t\t\tclass=\"cn-workspace-filter-widget__chips\"\n\t\t\tsize=\"compact\"\n\t\t\t:options=\"chipOptions\"\n\t\t\t:modelValue=\"selected === undefined || selected === null ? null : String(selected)\"\n\t\t\t:ariaLabel=\"label || writeKey\"\n\t\t\tdata-testid=\"cn-workspace-filter-chips\"\n\t\t\t@update:modelValue=\"applySelection\" />\n\n\t\t<!-- Toggle style (screens-page-controls): a switch that writes\n\t\t `onValue` / `offValue` (true / false) to the key. -->\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-else-if=\"style === 'toggle'\"\n\t\t\tclass=\"cn-workspace-filter-widget__toggle\"\n\t\t\ttype=\"switch\"\n\t\t\t:modelValue=\"toggleOn\"\n\t\t\tdata-testid=\"cn-workspace-filter-toggle\"\n\t\t\t@update:modelValue=\"onToggle\">\n\t\t\t{{ tr(label) }}\n\t\t</NcCheckboxRadioSwitch>\n\n\t\t<!-- Select style -->\n\t\t<NcSelect\n\t\t\tv-else-if=\"style === 'select'\"\n\t\t\t:modelValue=\"selectedOption\"\n\t\t\t:options=\"displayOptions\"\n\t\t\t:clearable=\"false\"\n\t\t\t:inputLabel=\"label || writeKey\"\n\t\t\tlabel=\"label\"\n\t\t\tdata-testid=\"cn-workspace-filter-select\"\n\t\t\t@update:modelValue=\"onSelect\" />\n\n\t\t<!-- Radio-list style (default) -->\n\t\t<ul v-else-if=\"!isBar\"\n\t\t\tclass=\"cn-workspace-filter-widget__list\"\n\t\t\trole=\"radiogroup\"\n\t\t\t:aria-label=\"label || writeKey\">\n\t\t\t<li\n\t\t\t\tv-for=\"option in displayOptions\"\n\t\t\t\t:key=\"String(option.value)\"\n\t\t\t\tclass=\"cn-workspace-filter-widget__item\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"radioGroupName\"\n\t\t\t\t\t:modelValue=\"isActive(option) ? String(option.value) : ''\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:data-testid=\"`cn-workspace-filter-option-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"onRadioPick(option)\">\n\t\t\t\t\t<span class=\"cn-workspace-filter-widget__option-label\">{{ option.label }}</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"showCounts && option.count !== undefined && option.count !== null\"\n\t\t\t\t\t\tclass=\"cn-workspace-filter-widget__count\">{{ option.count }}</span>\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<component\n\t\t\t:is=\"startLink.to ? 'router-link' : 'a'\"\n\t\t\tv-if=\"startLink\"\n\t\t\t:to=\"startLink.to || undefined\"\n\t\t\t:href=\"startLink.href || undefined\"\n\t\t\tclass=\"cn-workspace-filter-widget__link\"\n\t\t\tdata-testid=\"cn-workspace-filter-link\">\n\t\t\t{{ startLink.label }}\n\t\t</component>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue'\nimport CnResourceSelect from '../CnResourceSelect/CnResourceSelect.vue'\nimport CnSegmentedControl from '../CnSegmentedControl/CnSegmentedControl.vue'\nimport { fetchEndpointSource } from '../../composables/useEndpointSource.js'\nimport { fetchListTotal } from '../../utils/fetchFilterCounts.js'\nimport { resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\n\n/**\n * CnWorkspaceFilterWidget — a dashboard choice-list that writes the selected\n * value into the page workspace context so sibling widgets refetch (#91\n * Wave 3, the `workspace-filter` widget).\n *\n * Options come from ONE of three sources (checked in order):\n * 1. static `options[]` — each `{ value, label, count? }`.\n * 2. an OpenRegister `source` — `{ register, schema, groupBy, filter? }`,\n * fetched from OR's `/grouped` facet so each distinct value becomes an\n * option with its object `count`.\n * 3. an `endpointSource` — `{ url, params?, responsePath? }` returning an\n * array of `{ value, label, count? }` (or `{ id, name }` / bare strings,\n * normalised).\n *\n * The chosen value is written to the workspace context key named by `writes`\n * (`\"@workspace.<key>\"` or a bare `\"<key>\"`). CnDashboardPage provides\n * `cnWorkspaceContext`; every sibling widget whose declarative source\n * interpolates `@workspace.<key>` re-resolves its tokens and refetches when\n * the selection changes — the pipelinq WerkplekQueueFilter contract.\n *\n * An optional leading \"All\" option (`allLabel`) clears the key (writes the\n * empty string), so an optional `@workspace.<key>?` token drops and siblings\n * show the unfiltered set.\n *\n * ```js\n * content: {\n * label: 'Queue',\n * writes: '@workspace.queue',\n * style: 'radio', // 'radio' (default) | 'select' | 'chips'\n * allLabel: 'All',\n * showCounts: true,\n * source: { register: 'pipelinq', schema: 'werkitem', groupBy: 'queue' },\n * }\n * ```\n */\nexport default {\n\tname: 'CnWorkspaceFilterWidget',\n\n\tcomponents: { CnResourceSelect, CnSegmentedControl, NcSelect, NcCheckboxRadioSwitch },\n\n\tinject: {\n\t\t/**\n\t\t * Page-level workspace context. CnDashboardPage provides a `ref({})`;\n\t\t * Vue 2.7's Options-API inject AUTO-UNWRAPS it, so this is the plain\n\t\t * reactive bag (the raw-ref `{ value }` shape is also handled on write).\n\t\t * Null on pages without one (the widget then just emits `@change`).\n\t\t */\n\t\tcnWorkspaceContext: { default: null },\n\t\t/** Host translate function, for the start card's texts. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * Persisted configuration blob.\n\t\t *\n\t\t * Start card keys (abstract-start-card): `layout: \"start\"` draws\n\t\t * `title` and `description` beside the control, and `link`\n\t\t * (`{ label, route? | href? }`) after it. `objectSource`\n\t\t * (`{ register, schema, labelField?, placeholder?, ariaLabel?, preload? }`)\n\t\t * makes the control an OpenRegister object picker that searches on the\n\t\t * server and writes the picked object's id; without a selection and\n\t\t * without `allLabel` it selects the first object.\n\t\t *\n\t\t * Chips (screens-page-lenses): `style: \"chips\"` draws the options as one\n\t\t * compact segmented group with a count after each label. An option's\n\t\t * `countFrom` (`{ register, schema, filter? }`, or a list of them that\n\t\t * are added up) counts that list; a static `count` is used otherwise.\n\t\t * `urlKey` keeps the choice in the address (`?<urlKey>=<value>`), and\n\t\t * the address wins over `default` on load.\n\t\t *\n\t\t * Page controls (screens-page-controls): `style: \"toggle\"` is a switch\n\t\t * that writes `onValue` / `offValue` (true / false); `layout: \"bar\"`\n\t\t * with `controls` draws several controls side by side in one row, and\n\t\t * `align: \"end\"` pushes a control to the right edge.\n\t\t *\n\t\t * @type {{label?: string, controls?: Array<object>, onValue?: unknown, offValue?: unknown, align?: string, urlKey?: string, writes?: string, style?: string, allLabel?: string, showCounts?: boolean, options?: Array, source?: object, endpointSource?: object, objectSource?: object, default?: (string|number), layout?: string, title?: string, description?: string, link?: object}}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\n\temits: ['change'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** Fetched options (from source / endpointSource); static options use content.options directly. */\n\t\t\tfetchedOptions: null,\n\t\t\t/** True while options are being fetched. */\n\t\t\tloading: false,\n\t\t\t/** The currently-selected value (mirrors the workspace key). */\n\t\t\tselected: undefined,\n\t\t\t/** Counted totals of the options that ask (`countFrom`), by option position. */\n\t\t\toptionCounts: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Section label. */\n\t\tlabel() {\n\t\t\treturn this.content.label || ''\n\t\t},\n\n\t\t/** Whether the widget draws the start card. */\n\t\tisStart() {\n\t\t\treturn this.content.layout === 'start'\n\t\t},\n\n\t\t/** The start card's title, translated. */\n\t\ttitle() {\n\t\t\treturn this.tr(this.content.title || '')\n\t\t},\n\n\t\t/** The start card's guidance line, translated. */\n\t\tdescription() {\n\t\t\treturn this.tr(this.content.description || '')\n\t\t},\n\n\t\t/**\n\t\t * The link after the control, or null.\n\t\t *\n\t\t * @return {{label: string, to?: object, href?: string}|null}\n\t\t */\n\t\tstartLink() {\n\t\t\tconst link = this.content.link\n\t\t\tif (!link || typeof link !== 'object' || !link.label) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (link.route && typeof link.route === 'object' && link.route.name) {\n\t\t\t\treturn { label: this.tr(link.label), to: link.route }\n\t\t\t}\n\t\t\tif (typeof link.href === 'string' && link.href !== '') {\n\t\t\t\treturn { label: this.tr(link.label), href: link.href }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/**\n\t\t * The object picker declaration, or null.\n\t\t *\n\t\t * @return {{register: string, schema: string, labelField?: string}|null}\n\t\t */\n\t\tobjectSource() {\n\t\t\tconst src = this.content.objectSource\n\t\t\treturn src && typeof src === 'object' && src.register && src.schema ? src : null\n\t\t},\n\n\t\t/** Choice style: 'chips', 'select' or 'radio' (default). */\n\t\tstyle() {\n\t\t\treturn ['select', 'chips', 'toggle'].includes(this.content.style) ? this.content.style : 'radio'\n\t\t},\n\n\t\t/**\n\t\t * The chips: each option with its label translated and its count,\n\t\t * the static one or the counted one.\n\t\t *\n\t\t * @return {Array<{value: string, label: string, count?: number}>}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-workspace-filter-can-draw-chips-with-counts\n\t\t */\n\t\tchipOptions() {\n\t\t\treturn this.displayOptions.map((option, index) => {\n\t\t\t\tconst counted = this.optionCounts[index]\n\t\t\t\tconst count = counted !== undefined && counted !== null ? counted : option.count\n\t\t\t\tconst chip = { value: String(option.value), label: this.tr(option.label) }\n\t\t\t\tif (this.showCounts && Number.isFinite(count)) {\n\t\t\t\t\tchip.count = count\n\t\t\t\t}\n\t\t\t\treturn chip\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget is a bar of controls (`layout: \"bar\"`).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-bar-holds-the-pages-controls-in-one-row\n\t\t */\n\t\tisBar() {\n\t\t\treturn this.content.layout === 'bar' && Array.isArray(this.content.controls)\n\t\t},\n\n\t\t/**\n\t\t * The bar's controls, each an inline workspace filter of its own.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tbarControls() {\n\t\t\treturn this.content.controls\n\t\t\t\t.filter((control) => control && typeof control === 'object')\n\t\t\t\t.map((control) => ({ ...control, inline: true }))\n\t\t},\n\n\t\t/** @return {unknown} The value a switch writes when on. */\n\t\tonValue() {\n\t\t\treturn this.content.onValue !== undefined ? this.content.onValue : true\n\t\t},\n\n\t\t/** @return {unknown} The value a switch writes when off. */\n\t\toffValue() {\n\t\t\treturn this.content.offValue !== undefined ? this.content.offValue : false\n\t\t},\n\n\t\t/** @return {boolean} Whether the switch is on. */\n\t\ttoggleOn() {\n\t\t\treturn this.selected !== undefined && String(this.selected) === String(this.onValue)\n\t\t},\n\n\t\t/**\n\t\t * The address key that carries the choice (`urlKey`), or ''.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\turlKey() {\n\t\t\treturn typeof this.content.urlKey === 'string' ? this.content.urlKey : ''\n\t\t},\n\n\t\t/** Whether to render per-option counts. */\n\t\tshowCounts() {\n\t\t\treturn this.content.showCounts !== false\n\t\t},\n\n\t\t/** The bare workspace key the selection writes (strips a `@workspace.` / `@page.` prefix). */\n\t\twriteKey() {\n\t\t\tconst w = this.content.writes || ''\n\t\t\treturn String(w).replace(/^@(workspace|page)\\./, '')\n\t\t},\n\n\t\t/** A stable radiogroup name so the radios are mutually exclusive. */\n\t\tradioGroupName() {\n\t\t\treturn `cn-wsf-${this.writeKey || 'filter'}`\n\t\t},\n\n\t\t/** The option list actually rendered — the optional \"All\" entry prepended. */\n\t\tdisplayOptions() {\n\t\t\tconst base = this.normalisedOptions\n\t\t\tif (this.content.allLabel) {\n\t\t\t\treturn [{ value: '', label: this.content.allLabel }, ...base]\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/** Normalised `{ value, label, count? }` options from whichever source is configured. */\n\t\tnormalisedOptions() {\n\t\t\tconst raw = this.fetchedOptions !== null\n\t\t\t\t? this.fetchedOptions\n\t\t\t\t: (Array.isArray(this.content.options) ? this.content.options : [])\n\t\t\treturn raw.map((o) => this.normaliseOption(o)).filter((o) => o.value !== undefined && o.value !== null)\n\t\t},\n\n\t\t/** The selected option object (for NcSelect). */\n\t\tselectedOption() {\n\t\t\treturn this.displayOptions.find((o) => String(o.value) === String(this.selected)) || null\n\t\t},\n\n\t\t/**\n\t\t * The reactive workspace value for this key — watched so an external\n\t\t * write (another widget) syncs the local selection.\n\t\t *\n\t\t * @return {unknown}\n\t\t */\n\t\tworkspaceValue() {\n\t\t\treturn this.readWorkspace()\n\t\t},\n\n\t\tloadingLabel() {\n\t\t\treturn t('nextcloud-vue', 'Loading…')\n\t\t},\n\t},\n\n\twatch: {\n\t\t/** Re-fetch options when a dynamic source changes. */\n\t\tcontent: {\n\t\t\tdeep: true,\n\t\t\thandler() {\n\t\t\t\tthis.loadOptions()\n\t\t\t},\n\t\t},\n\n\t\t/**\n\t\t * Track external workspace changes (another widget writing the same key).\n\t\t *\n\t\t * @param {unknown} val The new workspace value for this key.\n\t\t */\n\t\tworkspaceValue(val) {\n\t\t\tif (val !== undefined) {\n\t\t\t\tthis.selected = val\n\t\t\t}\n\t\t},\n\t},\n\n\tcreated() {\n\t\t// Seed the selection: existing workspace value → content.default → the\n\t\t// \"All\" clear option (empty) when present, else the first option once\n\t\t// loaded (handled in loadOptions).\n\t\tconst fromAddress = this.readAddress()\n\t\tconst existing = this.readWorkspace()\n\t\tif (fromAddress !== undefined) {\n\t\t\tthis.selected = fromAddress\n\t\t\tthis.writeWorkspace(fromAddress)\n\t\t} else if (existing !== undefined) {\n\t\t\tthis.selected = existing\n\t\t} else if (this.content.default !== undefined) {\n\t\t\tthis.selected = this.content.default\n\t\t\tthis.writeWorkspace(this.content.default)\n\t\t} else if (this.style === 'toggle') {\n\t\t\t// A switch starts off, and says so, so a condition on its key holds.\n\t\t\tthis.selected = this.offValue\n\t\t\tthis.writeWorkspace(this.offValue)\n\t\t}\n\t\tthis.loadOptions()\n\t},\n\n\tmounted() {\n\t\tthis.onPageRefresh = () => this.loadCounts()\n\t\tsubscribe('cn:page:refresh', this.onPageRefresh)\n\t\tthis.loadCounts()\n\t},\n\n\tbeforeUnmount() {\n\t\tunsubscribe('cn:page:refresh', this.onPageRefresh)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The choice named in the address (`?<urlKey>=…`), when it is one of\n\t\t * the options; undefined otherwise.\n\t\t *\n\t\t * @return {string|undefined}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-the-choice-is-in-the-address\n\t\t */\n\t\treadAddress() {\n\t\t\tif (!this.urlKey || !this.$route || !this.$route.query) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst raw = this.$route.query[this.urlKey]\n\t\t\tif (this.style === 'toggle') {\n\t\t\t\tif (raw === undefined) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [this.onValue, this.offValue].find((value) => String(value) === String(raw))\n\t\t\t}\n\t\t\tconst known = this.displayOptions.some((option) => String(option.value) === String(raw))\n\t\t\treturn known ? String(raw) : undefined\n\t\t},\n\n\t\t/**\n\t\t * Write the choice to the address, replacing the history entry and\n\t\t * keeping the other query keys.\n\t\t *\n\t\t * @param {unknown} value The chosen value.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-the-choice-is-in-the-address\n\t\t */\n\t\twriteAddress(value) {\n\t\t\tif (!this.urlKey || !this.$router || !this.$route) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst query = this.$route.query || {}\n\t\t\tif (String(query[this.urlKey]) === String(value)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst result = this.$router.replace({ query: { ...query, [this.urlKey]: String(value) } })\n\t\t\tif (result && typeof result.catch === 'function') {\n\t\t\t\tresult.catch(() => {})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Count the lists behind the options that ask (`countFrom`: a list\n\t\t * `{ register, schema, filter? }`, or several that are added up). One\n\t\t * list request each; an option whose count failed shows none.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-workspace-filter-can-draw-chips-with-counts\n\t\t */\n\t\tasync loadCounts() {\n\t\t\tconst options = this.displayOptions\n\t\t\tconst seq = (this.countSeq = (this.countSeq || 0) + 1)\n\t\t\tconst ctx = { workspace: this.readWorkspaceBag() }\n\t\t\tawait Promise.all(options.map(async (option, index) => {\n\t\t\t\tconst raw = (Array.isArray(this.content.options) ? this.content.options : [])\n\t\t\t\t\t.find((candidate) => candidate && typeof candidate === 'object' && String(candidate.value ?? candidate.id) === String(option.value))\n\t\t\t\tconst from = raw ? raw.countFrom : null\n\t\t\t\tconst lists = (Array.isArray(from) ? from : [from]).filter((list) => list && typeof list === 'object' && list.register && list.schema)\n\t\t\t\tif (lists.length === 0) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlet total\n\t\t\t\ttry {\n\t\t\t\t\tconst parts = await Promise.all(lists.map((list) => fetchListTotal(list.register, list.schema, list.filter || {}, ctx)))\n\t\t\t\t\tif (parts.some((part) => part === null)) {\n\t\t\t\t\t\tthrow new Error('no total')\n\t\t\t\t\t}\n\t\t\t\t\ttotal = parts.reduce((sum, part) => sum + part, 0)\n\t\t\t\t} catch {\n\t\t\t\t\ttotal = null\n\t\t\t\t}\n\t\t\t\tif (seq === this.countSeq) {\n\t\t\t\t\tthis.optionCounts = { ...this.optionCounts, [index]: total }\n\t\t\t\t}\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Normalise a raw option into `{ value, label, count? }`. Accepts\n\t\t * `{ value, label, count }`, `{ id, name }`, `{ key, count }` (OR\n\t\t * facet), or a bare string/number.\n\t\t *\n\t\t * @param {unknown} o The raw option.\n\t\t * @return {{value: unknown, label: string, count?: number}}\n\t\t */\n\t\tnormaliseOption(o) {\n\t\t\tif (o === null || o === undefined) {\n\t\t\t\treturn { value: undefined, label: '' }\n\t\t\t}\n\t\t\tif (typeof o !== 'object') {\n\t\t\t\treturn { value: o, label: String(o) }\n\t\t\t}\n\t\t\tconst value = o.value !== undefined ? o.value : (o.id !== undefined ? o.id : o.key)\n\t\t\tconst label = o.label !== undefined ? o.label : (o.name !== undefined ? o.name : String(value))\n\t\t\tconst out = { value, label: String(label) }\n\t\t\tif (o.count !== undefined) {\n\t\t\t\tout.count = o.count\n\t\t\t}\n\t\t\treturn out\n\t\t},\n\n\t\t/**\n\t\t * Load options for the active source (static content.options need no\n\t\t * fetch). Seeds the first option as the selection when nothing is set\n\t\t * and no \"All\" clear option exists.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadOptions() {\n\t\t\tif (this.objectSource) {\n\t\t\t\tawait this.seedFirstObject()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.content.endpointSource && this.content.endpointSource.url) {\n\t\t\t\tawait this.loadFromEndpoint()\n\t\t\t} else if (this.content.source && this.content.source.schema) {\n\t\t\t\tawait this.loadFromOrSource()\n\t\t\t} else {\n\t\t\t\tthis.fetchedOptions = null\n\t\t\t}\n\t\t\t// Default selection: when nothing is selected and there's no \"All\"\n\t\t\t// clear affordance, adopt the first option so siblings have a value.\n\t\t\tif ((this.selected === undefined || this.selected === '') && !this.content.allLabel) {\n\t\t\t\tconst first = this.normalisedOptions[0]\n\t\t\t\tif (first && this.readWorkspace() === undefined && this.content.default === undefined) {\n\t\t\t\t\tthis.selected = first.value\n\t\t\t\t\tthis.writeWorkspace(first.value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Translate a manifest string through the host app.\n\t\t *\n\t\t * @param {string} text The text.\n\t\t * @return {string}\n\t\t */\n\t\ttr(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The object picker's default: with nothing selected, no `default` and\n\t\t * no `allLabel`, select the first object the source lists, so the page\n\t\t * always has one in focus. Fail-safe: a failed read selects nothing.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync seedFirstObject() {\n\t\t\tif ((this.selected !== undefined && this.selected !== '') || this.content.allLabel || this.content.default !== undefined) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst src = this.objectSource\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: src.register, schema: src.schema })\n\t\t\t\tconst res = await axios.get(url, { params: { _limit: 1 } })\n\t\t\t\tconst data = res && res.data\n\t\t\t\tconst rows = Array.isArray(data) ? data : ((data && data.results) || [])\n\t\t\t\tconst first = rows[0]\n\t\t\t\tconst id = first && (first.id || (first['@self'] && first['@self'].id))\n\t\t\t\tif (id && (this.selected === undefined || this.selected === '') && this.readWorkspace() === undefined) {\n\t\t\t\t\tthis.selected = String(id)\n\t\t\t\t\tthis.writeWorkspace(String(id))\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Nothing selected: the siblings wait for a pick.\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch options from an `endpointSource` (array of options at\n\t\t * responsePath). Fail-safe: a failed fetch leaves an empty list.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadFromEndpoint() {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst payload = await fetchEndpointSource(this.content.endpointSource, {\n\t\t\t\t\tworkspace: this.readWorkspaceBag(),\n\t\t\t\t})\n\t\t\t\tthis.fetchedOptions = Array.isArray(payload) ? payload : []\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch options from an OpenRegister `/grouped` facet — each distinct\n\t\t * `groupBy` value becomes an option with its object count. Fail-safe.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadFromOrSource() {\n\t\t\tconst src = this.content.source\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst url = generateUrl(\n\t\t\t\t\t'/apps/openregister/api/objects/aggregations/{register}/{schema}/grouped',\n\t\t\t\t\t{ register: src.register, schema: src.schema },\n\t\t\t\t)\n\t\t\t\tconst params = { groupBy: src.groupBy, metric: 'count' }\n\t\t\t\tconst filter = resolveFilterTokens(src.filter || {}, { workspace: this.readWorkspaceBag() })\n\t\t\t\tfor (const [k, v] of Object.entries(filter)) {\n\t\t\t\t\tif (v !== '' && v !== null && v !== undefined) {\n\t\t\t\t\t\tparams[`filter[${k}]`] = v\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst res = await axios.get(url, { params })\n\t\t\t\tconst groups = (res && res.data && res.data.groups) || []\n\t\t\t\tthis.fetchedOptions = groups\n\t\t\t\t\t.filter((g) => g.key !== null && g.key !== undefined && g.key !== '')\n\t\t\t\t\t.map((g) => ({ value: g.key, label: String(g.key), count: Number(g.value) || 0 }))\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether an option is the active selection.\n\t\t *\n\t\t * @param {object} option The option.\n\t\t * @return {boolean}\n\t\t */\n\t\tisActive(option) {\n\t\t\treturn String(option.value) === String(this.selected ?? '')\n\t\t},\n\n\t\t/**\n\t\t * Radio-list pick handler.\n\t\t *\n\t\t * @param {object} option The picked option.\n\t\t * @return {void}\n\t\t */\n\t\tonRadioPick(option) {\n\t\t\tthis.applySelection(option.value)\n\t\t},\n\n\t\t/**\n\t\t * Switch handler: write `onValue` or `offValue`.\n\t\t *\n\t\t * @param {boolean} on Whether the switch is on.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-toggle-and-a-select-are-page-controls\n\t\t */\n\t\tonToggle(on) {\n\t\t\tthis.applySelection(on ? this.onValue : this.offValue)\n\t\t},\n\n\t\t/**\n\t\t * NcSelect input handler.\n\t\t *\n\t\t * @param {object|null} option The picked option object.\n\t\t * @return {void}\n\t\t */\n\t\tonSelect(option) {\n\t\t\tthis.applySelection(option ? option.value : '')\n\t\t},\n\n\t\t/**\n\t\t * Apply a new selection: mirror it locally, write it into the workspace\n\t\t * context (so sibling widgets refetch), and emit `@change`.\n\t\t *\n\t\t * @param {unknown} value The new value.\n\t\t * @return {void}\n\t\t */\n\t\tapplySelection(value) {\n\t\t\tthis.selected = value\n\t\t\tthis.writeWorkspace(value)\n\t\t\tthis.writeAddress(value)\n\t\t\t/**\n\t\t\t * @event change Emitted when the selection changes. Payload: `{ key, value }`.\n\t\t\t */\n\t\t\tthis.$emit('change', { key: this.writeKey, value })\n\t\t},\n\n\t\t/**\n\t\t * The unwrapped workspace bag (or `{}`).\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\treadWorkspaceBag() {\n\t\t\tconst holder = this.cnWorkspaceContext\n\t\t\tif (!holder || typeof holder !== 'object') {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn ('value' in holder) ? (holder.value || {}) : holder\n\t\t},\n\n\t\t/**\n\t\t * Read the current workspace value for this widget's key (undefined\n\t\t * when unset).\n\t\t *\n\t\t * @return {unknown}\n\t\t */\n\t\treadWorkspace() {\n\t\t\tif (!this.writeKey) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst bag = this.readWorkspaceBag()\n\t\t\treturn bag[this.writeKey]\n\t\t},\n\n\t\t/**\n\t\t * Write a value into the reactive workspace bag under this widget's key\n\t\t * (the CnInteractionFormWidget write pattern — replace-in-place for the\n\t\t * unwrapped bag, `.value` for the raw-ref shape).\n\t\t *\n\t\t * @param {unknown} value The value to write.\n\t\t * @return {void}\n\t\t */\n\t\twriteWorkspace(value) {\n\t\t\tif (!this.writeKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst holder = this.cnWorkspaceContext\n\t\t\tif (!holder || typeof holder !== 'object') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ('value' in holder) {\n\t\t\t\tholder.value = { ...(holder.value || {}), [this.writeKey]: value }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tholder[this.writeKey] = value\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-workspace-filter-widget {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\twidth: 100%;\n}\n\n.cn-workspace-filter-widget__label {\n\tmargin: 0;\n\tfont-weight: 600;\n\tcolor: var(--color-main-text);\n}\n\n.cn-workspace-filter-widget__status {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n}\n\n.cn-workspace-filter-widget__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n/* The chips: the compact segmented group, left, in the card the grid draws. */\n.cn-workspace-filter-widget--chips {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\talign-items: center;\n}\n\n/* A bar: its controls in one row, an `align: \"end\"` control pushed right. */\n.cn-workspace-filter-widget--bar {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px 16px;\n}\n\n/* An inline control sits in a bar: label left of the control, width to its content. */\n.cn-workspace-filter-widget--inline {\n\tflex-direction: row;\n\talign-items: center;\n\tgap: 8px;\n\twidth: auto;\n}\n\n.cn-workspace-filter-widget--inline .cn-workspace-filter-widget__label {\n\tfont-weight: 400;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-workspace-filter-widget--end {\n\tmargin-inline-start: auto;\n}\n\n.cn-workspace-filter-widget--end ~ .cn-workspace-filter-widget--end {\n\tmargin-inline-start: 0;\n}\n\n.cn-workspace-filter-widget__toggle {\n\tfont-weight: 600;\n}\n\n/* The start card: text left, control (and link) right, as PqDashboard's \"Contact starten\". */\n.cn-workspace-filter-widget--start {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 16px 24px;\n}\n\n.cn-workspace-filter-widget__text {\n\tflex: 1 1 320px;\n\tmin-width: 0;\n}\n\n.cn-workspace-filter-widget__title {\n\tmargin: 0 0 4px;\n\tfont-size: 17px;\n\tfont-weight: 700;\n\tcolor: var(--color-main-text);\n}\n\n.cn-workspace-filter-widget__description {\n\tmargin: 0;\n\tmax-width: 420px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-workspace-filter-widget--start .cn-workspace-filter-widget__control,\n.cn-workspace-filter-widget--start > .v-select {\n\tflex: 0 1 480px;\n\tmin-width: 240px;\n}\n\n.cn-workspace-filter-widget__link {\n\tfont-weight: 600;\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n\twhite-space: nowrap;\n}\n\n.cn-workspace-filter-widget__count {\n\tmargin-inline-start: 6px;\n\tpadding: 0 6px;\n\tborder-radius: 999px;\n\tbackground: var(--color-background-hover);\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n}\n</style>\n"],"names":["CnResourceSelect","CnSegmentedControl","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnWorkspaceFilterWidget.vue2.js","sources":["../../../../src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div\n\t\tclass=\"cn-workspace-filter-widget\"\n\t\t:class=\"{\n\t\t\t'cn-workspace-filter-widget--start': isStart,\n\t\t\t'cn-workspace-filter-widget--chips': style === 'chips',\n\t\t\t'cn-workspace-filter-widget--bar': isBar,\n\t\t\t'cn-workspace-filter-widget--inline': content.inline === true,\n\t\t\t'cn-workspace-filter-widget--end': content.align === 'end',\n\t\t}\"\n\t\tdata-testid=\"cn-workspace-filter-widget\">\n\t\t<!-- The start card (`layout: \"start\"`): a title and one line of\n\t\t guidance beside the control, as the \"Contact starten\" card. -->\n\t\t<div v-if=\"isStart && (title || description)\" class=\"cn-workspace-filter-widget__text\">\n\t\t\t<h3 v-if=\"title\" class=\"cn-workspace-filter-widget__title\">\n\t\t\t\t{{ title }}\n\t\t\t</h3>\n\t\t\t<p v-if=\"description\" class=\"cn-workspace-filter-widget__description\">\n\t\t\t\t{{ description }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<!-- A bar (`layout: \"bar\"`): its `controls` side by side in one row,\n\t\t each a workspace filter of its own (chips, a switch, a select). -->\n\t\t<template v-if=\"isBar\">\n\t\t\t<CnWorkspaceFilterWidget\n\t\t\t\tv-for=\"(control, index) in barControls\"\n\t\t\t\t:key=\"index\"\n\t\t\t\t:content=\"control\"\n\t\t\t\t@change=\"$emit('change', $event)\" />\n\t\t</template>\n\n\t\t<p v-if=\"!isBar && label && style !== 'chips' && style !== 'toggle'\" class=\"cn-workspace-filter-widget__label\">\n\t\t\t{{ label }}\n\t\t</p>\n\n\t\t<!-- An object picker (`objectSource`): searches OpenRegister on the\n\t\t server, so it reaches every object, not a fetched page. -->\n\t\t<CnResourceSelect\n\t\t\tv-if=\"!isBar && objectSource\"\n\t\t\tclass=\"cn-workspace-filter-widget__control\"\n\t\t\t:register=\"objectSource.register\"\n\t\t\t:schema=\"objectSource.schema\"\n\t\t\t:labelField=\"objectSource.labelField || 'title'\"\n\t\t\t:modelValue=\"selected === undefined || selected === null ? '' : String(selected)\"\n\t\t\t:placeholder=\"tr(objectSource.placeholder || '')\"\n\t\t\t:ariaLabelCombobox=\"tr(objectSource.ariaLabel || '') || title || label || writeKey\"\n\t\t\t:preload=\"objectSource.preload !== false\"\n\t\t\t:clearable=\"Boolean(content.allLabel)\"\n\t\t\t:allowCreate=\"false\"\n\t\t\tdata-testid=\"cn-workspace-filter-object\"\n\t\t\t@update:modelValue=\"applySelection($event || '')\" />\n\n\t\t<div v-else-if=\"loading\" class=\"cn-workspace-filter-widget__status\">\n\t\t\t{{ loadingLabel }}\n\t\t</div>\n\n\t\t<!-- Chips style (screens-page-lenses): one compact segmented group,\n\t\t a count after each label, arrow keys move the choice. -->\n\t\t<CnSegmentedControl\n\t\t\tv-else-if=\"style === 'chips'\"\n\t\t\tclass=\"cn-workspace-filter-widget__chips\"\n\t\t\tsize=\"compact\"\n\t\t\t:options=\"chipOptions\"\n\t\t\t:modelValue=\"selected === undefined || selected === null ? null : String(selected)\"\n\t\t\t:ariaLabel=\"label || writeKey\"\n\t\t\tdata-testid=\"cn-workspace-filter-chips\"\n\t\t\t@update:modelValue=\"applySelection\" />\n\n\t\t<!-- Toggle style (screens-page-controls): a switch that writes\n\t\t `onValue` / `offValue` (true / false) to the key. -->\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-else-if=\"style === 'toggle'\"\n\t\t\tclass=\"cn-workspace-filter-widget__toggle\"\n\t\t\ttype=\"switch\"\n\t\t\t:modelValue=\"toggleOn\"\n\t\t\tdata-testid=\"cn-workspace-filter-toggle\"\n\t\t\t@update:modelValue=\"onToggle\">\n\t\t\t{{ tr(label) }}\n\t\t</NcCheckboxRadioSwitch>\n\n\t\t<!-- Select style -->\n\t\t<NcSelect\n\t\t\tv-else-if=\"style === 'select'\"\n\t\t\t:modelValue=\"selectedOption\"\n\t\t\t:options=\"displayOptions\"\n\t\t\t:clearable=\"false\"\n\t\t\t:inputLabel=\"content.inline ? '' : (label || writeKey)\"\n\t\t\t:labelOutside=\"content.inline === true\"\n\t\t\t:ariaLabelCombobox=\"label || writeKey\"\n\t\t\tlabel=\"label\"\n\t\t\tdata-testid=\"cn-workspace-filter-select\"\n\t\t\t@update:modelValue=\"onSelect\" />\n\n\t\t<!-- Radio-list style (default) -->\n\t\t<ul v-else-if=\"!isBar\"\n\t\t\tclass=\"cn-workspace-filter-widget__list\"\n\t\t\trole=\"radiogroup\"\n\t\t\t:aria-label=\"label || writeKey\">\n\t\t\t<li\n\t\t\t\tv-for=\"option in displayOptions\"\n\t\t\t\t:key=\"String(option.value)\"\n\t\t\t\tclass=\"cn-workspace-filter-widget__item\">\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"radioGroupName\"\n\t\t\t\t\t:modelValue=\"isActive(option) ? String(option.value) : ''\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:data-testid=\"`cn-workspace-filter-option-${option.value}`\"\n\t\t\t\t\t@update:modelValue=\"onRadioPick(option)\">\n\t\t\t\t\t<span class=\"cn-workspace-filter-widget__option-label\">{{ option.label }}</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"showCounts && option.count !== undefined && option.count !== null\"\n\t\t\t\t\t\tclass=\"cn-workspace-filter-widget__count\">{{ option.count }}</span>\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<component\n\t\t\t:is=\"startLink.to ? 'router-link' : 'a'\"\n\t\t\tv-if=\"startLink\"\n\t\t\t:to=\"startLink.to || undefined\"\n\t\t\t:href=\"startLink.href || undefined\"\n\t\t\tclass=\"cn-workspace-filter-widget__link\"\n\t\t\tdata-testid=\"cn-workspace-filter-link\">\n\t\t\t{{ startLink.label }}\n\t\t</component>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcCheckboxRadioSwitch, NcSelect } from '@nextcloud/vue'\nimport CnResourceSelect from '../CnResourceSelect/CnResourceSelect.vue'\nimport CnSegmentedControl from '../CnSegmentedControl/CnSegmentedControl.vue'\nimport { fetchEndpointSource } from '../../composables/useEndpointSource.js'\nimport { fetchListTotal } from '../../utils/fetchFilterCounts.js'\nimport { resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\n\n/**\n * CnWorkspaceFilterWidget — a dashboard choice-list that writes the selected\n * value into the page workspace context so sibling widgets refetch (#91\n * Wave 3, the `workspace-filter` widget).\n *\n * Options come from ONE of three sources (checked in order):\n * 1. static `options[]` — each `{ value, label, count? }`.\n * 2. an OpenRegister `source` — `{ register, schema, groupBy, filter? }`,\n * fetched from OR's `/grouped` facet so each distinct value becomes an\n * option with its object `count`.\n * 3. an `endpointSource` — `{ url, params?, responsePath? }` returning an\n * array of `{ value, label, count? }` (or `{ id, name }` / bare strings,\n * normalised).\n *\n * The chosen value is written to the workspace context key named by `writes`\n * (`\"@workspace.<key>\"` or a bare `\"<key>\"`). CnDashboardPage provides\n * `cnWorkspaceContext`; every sibling widget whose declarative source\n * interpolates `@workspace.<key>` re-resolves its tokens and refetches when\n * the selection changes — the pipelinq WerkplekQueueFilter contract.\n *\n * An optional leading \"All\" option (`allLabel`) clears the key (writes the\n * empty string), so an optional `@workspace.<key>?` token drops and siblings\n * show the unfiltered set.\n *\n * ```js\n * content: {\n * label: 'Queue',\n * writes: '@workspace.queue',\n * style: 'radio', // 'radio' (default) | 'select' | 'chips'\n * allLabel: 'All',\n * showCounts: true,\n * source: { register: 'pipelinq', schema: 'werkitem', groupBy: 'queue' },\n * }\n * ```\n */\nexport default {\n\tname: 'CnWorkspaceFilterWidget',\n\n\tcomponents: { CnResourceSelect, CnSegmentedControl, NcSelect, NcCheckboxRadioSwitch },\n\n\tinject: {\n\t\t/**\n\t\t * Page-level workspace context. CnDashboardPage provides a `ref({})`;\n\t\t * Vue 2.7's Options-API inject AUTO-UNWRAPS it, so this is the plain\n\t\t * reactive bag (the raw-ref `{ value }` shape is also handled on write).\n\t\t * Null on pages without one (the widget then just emits `@change`).\n\t\t */\n\t\tcnWorkspaceContext: { default: null },\n\t\t/** Host translate function, for the start card's texts. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * Persisted configuration blob.\n\t\t *\n\t\t * Start card keys (abstract-start-card): `layout: \"start\"` draws\n\t\t * `title` and `description` beside the control, and `link`\n\t\t * (`{ label, route? | href? }`) after it. `objectSource`\n\t\t * (`{ register, schema, labelField?, placeholder?, ariaLabel?, preload? }`)\n\t\t * makes the control an OpenRegister object picker that searches on the\n\t\t * server and writes the picked object's id; without a selection and\n\t\t * without `allLabel` it selects the first object.\n\t\t *\n\t\t * Chips (screens-page-lenses): `style: \"chips\"` draws the options as one\n\t\t * compact segmented group with a count after each label. An option's\n\t\t * `countFrom` (`{ register, schema, filter? }`, or a list of them that\n\t\t * are added up) counts that list; a static `count` is used otherwise.\n\t\t * `urlKey` keeps the choice in the address (`?<urlKey>=<value>`), and\n\t\t * the address wins over `default` on load.\n\t\t *\n\t\t * Page controls (screens-page-controls): `style: \"toggle\"` is a switch\n\t\t * that writes `onValue` / `offValue` (true / false); `layout: \"bar\"`\n\t\t * with `controls` draws several controls side by side in one row, and\n\t\t * `align: \"end\"` pushes a control to the right edge.\n\t\t *\n\t\t * @type {{label?: string, controls?: Array<object>, onValue?: unknown, offValue?: unknown, align?: string, urlKey?: string, writes?: string, style?: string, allLabel?: string, showCounts?: boolean, options?: Array, source?: object, endpointSource?: object, objectSource?: object, default?: (string|number), layout?: string, title?: string, description?: string, link?: object}}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\n\temits: ['change'],\n\n\tdata() {\n\t\treturn {\n\t\t\t/** Fetched options (from source / endpointSource); static options use content.options directly. */\n\t\t\tfetchedOptions: null,\n\t\t\t/** True while options are being fetched. */\n\t\t\tloading: false,\n\t\t\t/** The currently-selected value (mirrors the workspace key). */\n\t\t\tselected: undefined,\n\t\t\t/** Counted totals of the options that ask (`countFrom`), by option position. */\n\t\t\toptionCounts: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Section label. */\n\t\tlabel() {\n\t\t\treturn this.content.label || ''\n\t\t},\n\n\t\t/** Whether the widget draws the start card. */\n\t\tisStart() {\n\t\t\treturn this.content.layout === 'start'\n\t\t},\n\n\t\t/** The start card's title, translated. */\n\t\ttitle() {\n\t\t\treturn this.tr(this.content.title || '')\n\t\t},\n\n\t\t/** The start card's guidance line, translated. */\n\t\tdescription() {\n\t\t\treturn this.tr(this.content.description || '')\n\t\t},\n\n\t\t/**\n\t\t * The link after the control, or null.\n\t\t *\n\t\t * @return {{label: string, to?: object, href?: string}|null}\n\t\t */\n\t\tstartLink() {\n\t\t\tconst link = this.content.link\n\t\t\tif (!link || typeof link !== 'object' || !link.label) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (link.route && typeof link.route === 'object' && link.route.name) {\n\t\t\t\treturn { label: this.tr(link.label), to: link.route }\n\t\t\t}\n\t\t\tif (typeof link.href === 'string' && link.href !== '') {\n\t\t\t\treturn { label: this.tr(link.label), href: link.href }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\n\t\t/**\n\t\t * The object picker declaration, or null.\n\t\t *\n\t\t * @return {{register: string, schema: string, labelField?: string}|null}\n\t\t */\n\t\tobjectSource() {\n\t\t\tconst src = this.content.objectSource\n\t\t\treturn src && typeof src === 'object' && src.register && src.schema ? src : null\n\t\t},\n\n\t\t/** Choice style: 'chips', 'select' or 'radio' (default). */\n\t\tstyle() {\n\t\t\treturn ['select', 'chips', 'toggle'].includes(this.content.style) ? this.content.style : 'radio'\n\t\t},\n\n\t\t/**\n\t\t * The chips: each option with its label translated and its count,\n\t\t * the static one or the counted one.\n\t\t *\n\t\t * @return {Array<{value: string, label: string, count?: number}>}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-workspace-filter-can-draw-chips-with-counts\n\t\t */\n\t\tchipOptions() {\n\t\t\treturn this.displayOptions.map((option, index) => {\n\t\t\t\tconst counted = this.optionCounts[index]\n\t\t\t\tconst count = counted !== undefined && counted !== null ? counted : option.count\n\t\t\t\tconst chip = { value: String(option.value), label: this.tr(option.label) }\n\t\t\t\tif (this.showCounts && Number.isFinite(count)) {\n\t\t\t\t\tchip.count = count\n\t\t\t\t}\n\t\t\t\treturn chip\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget is a bar of controls (`layout: \"bar\"`).\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-bar-holds-the-pages-controls-in-one-row\n\t\t */\n\t\tisBar() {\n\t\t\treturn this.content.layout === 'bar' && Array.isArray(this.content.controls)\n\t\t},\n\n\t\t/**\n\t\t * The bar's controls, each an inline workspace filter of its own.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tbarControls() {\n\t\t\treturn this.content.controls\n\t\t\t\t.filter((control) => control && typeof control === 'object')\n\t\t\t\t.map((control) => ({ ...control, inline: true }))\n\t\t},\n\n\t\t/** @return {unknown} The value a switch writes when on. */\n\t\tonValue() {\n\t\t\treturn this.content.onValue !== undefined ? this.content.onValue : true\n\t\t},\n\n\t\t/** @return {unknown} The value a switch writes when off. */\n\t\toffValue() {\n\t\t\treturn this.content.offValue !== undefined ? this.content.offValue : false\n\t\t},\n\n\t\t/** @return {boolean} Whether the switch is on. */\n\t\ttoggleOn() {\n\t\t\treturn this.selected !== undefined && String(this.selected) === String(this.onValue)\n\t\t},\n\n\t\t/**\n\t\t * The address key that carries the choice (`urlKey`), or ''.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\turlKey() {\n\t\t\treturn typeof this.content.urlKey === 'string' ? this.content.urlKey : ''\n\t\t},\n\n\t\t/** Whether to render per-option counts. */\n\t\tshowCounts() {\n\t\t\treturn this.content.showCounts !== false\n\t\t},\n\n\t\t/** The bare workspace key the selection writes (strips a `@workspace.` / `@page.` prefix). */\n\t\twriteKey() {\n\t\t\tconst w = this.content.writes || ''\n\t\t\treturn String(w).replace(/^@(workspace|page)\\./, '')\n\t\t},\n\n\t\t/** A stable radiogroup name so the radios are mutually exclusive. */\n\t\tradioGroupName() {\n\t\t\treturn `cn-wsf-${this.writeKey || 'filter'}`\n\t\t},\n\n\t\t/** The option list actually rendered — the optional \"All\" entry prepended. */\n\t\tdisplayOptions() {\n\t\t\tconst base = this.normalisedOptions\n\t\t\tif (this.content.allLabel) {\n\t\t\t\treturn [{ value: '', label: this.content.allLabel }, ...base]\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/** Normalised `{ value, label, count? }` options from whichever source is configured. */\n\t\tnormalisedOptions() {\n\t\t\tconst raw = this.fetchedOptions !== null\n\t\t\t\t? this.fetchedOptions\n\t\t\t\t: (Array.isArray(this.content.options) ? this.content.options : [])\n\t\t\treturn raw.map((o) => this.normaliseOption(o)).filter((o) => o.value !== undefined && o.value !== null)\n\t\t},\n\n\t\t/** The selected option object (for NcSelect). */\n\t\tselectedOption() {\n\t\t\treturn this.displayOptions.find((o) => String(o.value) === String(this.selected)) || null\n\t\t},\n\n\t\t/**\n\t\t * The reactive workspace value for this key — watched so an external\n\t\t * write (another widget) syncs the local selection.\n\t\t *\n\t\t * @return {unknown}\n\t\t */\n\t\tworkspaceValue() {\n\t\t\treturn this.readWorkspace()\n\t\t},\n\n\t\tloadingLabel() {\n\t\t\treturn t('nextcloud-vue', 'Loading…')\n\t\t},\n\t},\n\n\twatch: {\n\t\t/** Re-fetch options when a dynamic source changes. */\n\t\tcontent: {\n\t\t\tdeep: true,\n\t\t\thandler() {\n\t\t\t\tthis.loadOptions()\n\t\t\t},\n\t\t},\n\n\t\t/**\n\t\t * Track external workspace changes (another widget writing the same key).\n\t\t *\n\t\t * @param {unknown} val The new workspace value for this key.\n\t\t */\n\t\tworkspaceValue(val) {\n\t\t\tif (val !== undefined) {\n\t\t\t\tthis.selected = val\n\t\t\t}\n\t\t},\n\t},\n\n\tcreated() {\n\t\t// Seed the selection: existing workspace value → content.default → the\n\t\t// \"All\" clear option (empty) when present, else the first option once\n\t\t// loaded (handled in loadOptions).\n\t\tconst fromAddress = this.readAddress()\n\t\tconst existing = this.readWorkspace()\n\t\tif (fromAddress !== undefined) {\n\t\t\tthis.selected = fromAddress\n\t\t\tthis.writeWorkspace(fromAddress)\n\t\t} else if (existing !== undefined) {\n\t\t\tthis.selected = existing\n\t\t} else if (this.content.default !== undefined) {\n\t\t\tthis.selected = this.content.default\n\t\t\tthis.writeWorkspace(this.content.default)\n\t\t} else if (this.style === 'toggle') {\n\t\t\t// A switch starts off, and says so, so a condition on its key holds.\n\t\t\tthis.selected = this.offValue\n\t\t\tthis.writeWorkspace(this.offValue)\n\t\t}\n\t\tthis.loadOptions()\n\t},\n\n\tmounted() {\n\t\tthis.onPageRefresh = () => this.loadCounts()\n\t\tsubscribe('cn:page:refresh', this.onPageRefresh)\n\t\tthis.loadCounts()\n\t},\n\n\tbeforeUnmount() {\n\t\tunsubscribe('cn:page:refresh', this.onPageRefresh)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The choice named in the address (`?<urlKey>=…`), when it is one of\n\t\t * the options; undefined otherwise.\n\t\t *\n\t\t * @return {string|undefined}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-the-choice-is-in-the-address\n\t\t */\n\t\treadAddress() {\n\t\t\tif (!this.urlKey || !this.$route || !this.$route.query) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst raw = this.$route.query[this.urlKey]\n\t\t\tif (this.style === 'toggle') {\n\t\t\t\tif (raw === undefined) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [this.onValue, this.offValue].find((value) => String(value) === String(raw))\n\t\t\t}\n\t\t\tconst known = this.displayOptions.some((option) => String(option.value) === String(raw))\n\t\t\treturn known ? String(raw) : undefined\n\t\t},\n\n\t\t/**\n\t\t * Write the choice to the address, replacing the history entry and\n\t\t * keeping the other query keys.\n\t\t *\n\t\t * @param {unknown} value The chosen value.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-the-choice-is-in-the-address\n\t\t */\n\t\twriteAddress(value) {\n\t\t\tif (!this.urlKey || !this.$router || !this.$route) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst query = this.$route.query || {}\n\t\t\tif (String(query[this.urlKey]) === String(value)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst result = this.$router.replace({ query: { ...query, [this.urlKey]: String(value) } })\n\t\t\tif (result && typeof result.catch === 'function') {\n\t\t\t\tresult.catch(() => {})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Count the lists behind the options that ask (`countFrom`: a list\n\t\t * `{ register, schema, filter? }`, or several that are added up). One\n\t\t * list request each; an option whose count failed shows none.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-workspace-filter-can-draw-chips-with-counts\n\t\t */\n\t\tasync loadCounts() {\n\t\t\tconst options = this.displayOptions\n\t\t\tconst seq = (this.countSeq = (this.countSeq || 0) + 1)\n\t\t\tconst ctx = { workspace: this.readWorkspaceBag() }\n\t\t\tawait Promise.all(options.map(async (option, index) => {\n\t\t\t\tconst raw = (Array.isArray(this.content.options) ? this.content.options : [])\n\t\t\t\t\t.find((candidate) => candidate && typeof candidate === 'object' && String(candidate.value ?? candidate.id) === String(option.value))\n\t\t\t\tconst from = raw ? raw.countFrom : null\n\t\t\t\tconst lists = (Array.isArray(from) ? from : [from]).filter((list) => list && typeof list === 'object' && list.register && list.schema)\n\t\t\t\tif (lists.length === 0) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlet total\n\t\t\t\ttry {\n\t\t\t\t\tconst parts = await Promise.all(lists.map((list) => fetchListTotal(list.register, list.schema, list.filter || {}, ctx)))\n\t\t\t\t\tif (parts.some((part) => part === null)) {\n\t\t\t\t\t\tthrow new Error('no total')\n\t\t\t\t\t}\n\t\t\t\t\ttotal = parts.reduce((sum, part) => sum + part, 0)\n\t\t\t\t} catch {\n\t\t\t\t\ttotal = null\n\t\t\t\t}\n\t\t\t\tif (seq === this.countSeq) {\n\t\t\t\t\tthis.optionCounts = { ...this.optionCounts, [index]: total }\n\t\t\t\t}\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Normalise a raw option into `{ value, label, count? }`. Accepts\n\t\t * `{ value, label, count }`, `{ id, name }`, `{ key, count }` (OR\n\t\t * facet), or a bare string/number.\n\t\t *\n\t\t * @param {unknown} o The raw option.\n\t\t * @return {{value: unknown, label: string, count?: number}}\n\t\t */\n\t\tnormaliseOption(o) {\n\t\t\tif (o === null || o === undefined) {\n\t\t\t\treturn { value: undefined, label: '' }\n\t\t\t}\n\t\t\tif (typeof o !== 'object') {\n\t\t\t\treturn { value: o, label: String(o) }\n\t\t\t}\n\t\t\tconst value = o.value !== undefined ? o.value : (o.id !== undefined ? o.id : o.key)\n\t\t\tconst label = o.label !== undefined ? o.label : (o.name !== undefined ? o.name : String(value))\n\t\t\tconst out = { value, label: String(label) }\n\t\t\tif (o.count !== undefined) {\n\t\t\t\tout.count = o.count\n\t\t\t}\n\t\t\treturn out\n\t\t},\n\n\t\t/**\n\t\t * Load options for the active source (static content.options need no\n\t\t * fetch). Seeds the first option as the selection when nothing is set\n\t\t * and no \"All\" clear option exists.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadOptions() {\n\t\t\tif (this.objectSource) {\n\t\t\t\tawait this.seedFirstObject()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.content.endpointSource && this.content.endpointSource.url) {\n\t\t\t\tawait this.loadFromEndpoint()\n\t\t\t} else if (this.content.source && this.content.source.schema) {\n\t\t\t\tawait this.loadFromOrSource()\n\t\t\t} else {\n\t\t\t\tthis.fetchedOptions = null\n\t\t\t}\n\t\t\t// Default selection: when nothing is selected and there's no \"All\"\n\t\t\t// clear affordance, adopt the first option so siblings have a value.\n\t\t\tif ((this.selected === undefined || this.selected === '') && !this.content.allLabel) {\n\t\t\t\tconst first = this.normalisedOptions[0]\n\t\t\t\tif (first && this.readWorkspace() === undefined && this.content.default === undefined) {\n\t\t\t\t\tthis.selected = first.value\n\t\t\t\t\tthis.writeWorkspace(first.value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Translate a manifest string through the host app.\n\t\t *\n\t\t * @param {string} text The text.\n\t\t * @return {string}\n\t\t */\n\t\ttr(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The object picker's default: with nothing selected, no `default` and\n\t\t * no `allLabel`, select the first object the source lists, so the page\n\t\t * always has one in focus. Fail-safe: a failed read selects nothing.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync seedFirstObject() {\n\t\t\tif ((this.selected !== undefined && this.selected !== '') || this.content.allLabel || this.content.default !== undefined) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst src = this.objectSource\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: src.register, schema: src.schema })\n\t\t\t\tconst res = await axios.get(url, { params: { _limit: 1 } })\n\t\t\t\tconst data = res && res.data\n\t\t\t\tconst rows = Array.isArray(data) ? data : ((data && data.results) || [])\n\t\t\t\tconst first = rows[0]\n\t\t\t\tconst id = first && (first.id || (first['@self'] && first['@self'].id))\n\t\t\t\tif (id && (this.selected === undefined || this.selected === '') && this.readWorkspace() === undefined) {\n\t\t\t\t\tthis.selected = String(id)\n\t\t\t\t\tthis.writeWorkspace(String(id))\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Nothing selected: the siblings wait for a pick.\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch options from an `endpointSource` (array of options at\n\t\t * responsePath). Fail-safe: a failed fetch leaves an empty list.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadFromEndpoint() {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst payload = await fetchEndpointSource(this.content.endpointSource, {\n\t\t\t\t\tworkspace: this.readWorkspaceBag(),\n\t\t\t\t})\n\t\t\t\tthis.fetchedOptions = Array.isArray(payload) ? payload : []\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch options from an OpenRegister `/grouped` facet — each distinct\n\t\t * `groupBy` value becomes an option with its object count. Fail-safe.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadFromOrSource() {\n\t\t\tconst src = this.content.source\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst url = generateUrl(\n\t\t\t\t\t'/apps/openregister/api/objects/aggregations/{register}/{schema}/grouped',\n\t\t\t\t\t{ register: src.register, schema: src.schema },\n\t\t\t\t)\n\t\t\t\tconst params = { groupBy: src.groupBy, metric: 'count' }\n\t\t\t\tconst filter = resolveFilterTokens(src.filter || {}, { workspace: this.readWorkspaceBag() })\n\t\t\t\tfor (const [k, v] of Object.entries(filter)) {\n\t\t\t\t\tif (v !== '' && v !== null && v !== undefined) {\n\t\t\t\t\t\tparams[`filter[${k}]`] = v\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst res = await axios.get(url, { params })\n\t\t\t\tconst groups = (res && res.data && res.data.groups) || []\n\t\t\t\tthis.fetchedOptions = groups\n\t\t\t\t\t.filter((g) => g.key !== null && g.key !== undefined && g.key !== '')\n\t\t\t\t\t.map((g) => ({ value: g.key, label: String(g.key), count: Number(g.value) || 0 }))\n\t\t\t} catch {\n\t\t\t\tthis.fetchedOptions = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether an option is the active selection.\n\t\t *\n\t\t * @param {object} option The option.\n\t\t * @return {boolean}\n\t\t */\n\t\tisActive(option) {\n\t\t\treturn String(option.value) === String(this.selected ?? '')\n\t\t},\n\n\t\t/**\n\t\t * Radio-list pick handler.\n\t\t *\n\t\t * @param {object} option The picked option.\n\t\t * @return {void}\n\t\t */\n\t\tonRadioPick(option) {\n\t\t\tthis.applySelection(option.value)\n\t\t},\n\n\t\t/**\n\t\t * Switch handler: write `onValue` or `offValue`.\n\t\t *\n\t\t * @param {boolean} on Whether the switch is on.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-toggle-and-a-select-are-page-controls\n\t\t */\n\t\tonToggle(on) {\n\t\t\tthis.applySelection(on ? this.onValue : this.offValue)\n\t\t},\n\n\t\t/**\n\t\t * NcSelect input handler.\n\t\t *\n\t\t * @param {object|null} option The picked option object.\n\t\t * @return {void}\n\t\t */\n\t\tonSelect(option) {\n\t\t\tthis.applySelection(option ? option.value : '')\n\t\t},\n\n\t\t/**\n\t\t * Apply a new selection: mirror it locally, write it into the workspace\n\t\t * context (so sibling widgets refetch), and emit `@change`.\n\t\t *\n\t\t * @param {unknown} value The new value.\n\t\t * @return {void}\n\t\t */\n\t\tapplySelection(value) {\n\t\t\tthis.selected = value\n\t\t\tthis.writeWorkspace(value)\n\t\t\tthis.writeAddress(value)\n\t\t\t/**\n\t\t\t * @event change Emitted when the selection changes. Payload: `{ key, value }`.\n\t\t\t */\n\t\t\tthis.$emit('change', { key: this.writeKey, value })\n\t\t},\n\n\t\t/**\n\t\t * The unwrapped workspace bag (or `{}`).\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\treadWorkspaceBag() {\n\t\t\tconst holder = this.cnWorkspaceContext\n\t\t\tif (!holder || typeof holder !== 'object') {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn ('value' in holder) ? (holder.value || {}) : holder\n\t\t},\n\n\t\t/**\n\t\t * Read the current workspace value for this widget's key (undefined\n\t\t * when unset).\n\t\t *\n\t\t * @return {unknown}\n\t\t */\n\t\treadWorkspace() {\n\t\t\tif (!this.writeKey) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst bag = this.readWorkspaceBag()\n\t\t\treturn bag[this.writeKey]\n\t\t},\n\n\t\t/**\n\t\t * Write a value into the reactive workspace bag under this widget's key\n\t\t * (the CnInteractionFormWidget write pattern — replace-in-place for the\n\t\t * unwrapped bag, `.value` for the raw-ref shape).\n\t\t *\n\t\t * @param {unknown} value The value to write.\n\t\t * @return {void}\n\t\t */\n\t\twriteWorkspace(value) {\n\t\t\tif (!this.writeKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst holder = this.cnWorkspaceContext\n\t\t\tif (!holder || typeof holder !== 'object') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ('value' in holder) {\n\t\t\t\tholder.value = { ...(holder.value || {}), [this.writeKey]: value }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tholder[this.writeKey] = value\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-workspace-filter-widget {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\twidth: 100%;\n}\n\n.cn-workspace-filter-widget__label {\n\tmargin: 0;\n\tfont-weight: 600;\n\tcolor: var(--color-main-text);\n}\n\n.cn-workspace-filter-widget__status {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n}\n\n.cn-workspace-filter-widget__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n/* The chips: the compact segmented group, left, in the card the grid draws. */\n.cn-workspace-filter-widget--chips {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\talign-items: center;\n}\n\n/* A bar: its controls in one row, an `align: \"end\"` control pushed right. */\n.cn-workspace-filter-widget--bar {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 12px 16px;\n}\n\n/* An inline control sits in a bar: label left of the control, width to its content. */\n.cn-workspace-filter-widget--inline {\n\tflex-direction: row;\n\talign-items: center;\n\tgap: 8px;\n\twidth: auto;\n}\n\n.cn-workspace-filter-widget--inline .cn-workspace-filter-widget__label {\n\tfont-weight: 400;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-workspace-filter-widget--end {\n\tmargin-inline-start: auto;\n}\n\n.cn-workspace-filter-widget--end ~ .cn-workspace-filter-widget--end {\n\tmargin-inline-start: 0;\n}\n\n.cn-workspace-filter-widget__toggle {\n\tfont-weight: 600;\n}\n\n/* The start card: text left, control (and link) right, as PqDashboard's \"Contact starten\". */\n.cn-workspace-filter-widget--start {\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 16px 24px;\n}\n\n.cn-workspace-filter-widget__text {\n\tflex: 1 1 320px;\n\tmin-width: 0;\n}\n\n.cn-workspace-filter-widget__title {\n\tmargin: 0 0 4px;\n\tfont-size: 17px;\n\tfont-weight: 700;\n\tcolor: var(--color-main-text);\n}\n\n.cn-workspace-filter-widget__description {\n\tmargin: 0;\n\tmax-width: 420px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-workspace-filter-widget--start .cn-workspace-filter-widget__control,\n.cn-workspace-filter-widget--start > .v-select {\n\tflex: 0 1 480px;\n\tmin-width: 240px;\n}\n\n.cn-workspace-filter-widget__link {\n\tfont-weight: 600;\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n\twhite-space: nowrap;\n}\n\n.cn-workspace-filter-widget__count {\n\tmargin-inline-start: 6px;\n\tpadding: 0 6px;\n\tborder-radius: 999px;\n\tbackground: var(--color-background-hover);\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n}\n\n/* On a phone the bar's controls take a row each (the chips already wrap), and\n a switch and a select are 44px touch targets. */\n@media (max-width: 640px) {\n\t.cn-workspace-filter-widget--bar > .cn-workspace-filter-widget--inline {\n\t\tflex: 1 1 100%;\n\t}\n\n\t.cn-workspace-filter-widget--bar > .cn-workspace-filter-widget--end {\n\t\tmargin-inline-start: 0;\n\t}\n\n\t.cn-workspace-filter-widget--inline .cn-workspace-filter-widget__toggle {\n\t\tmin-height: 44px;\n\t}\n\n\t.cn-workspace-filter-widget--inline :deep(.v-select) {\n\t\tflex: 1 1 auto;\n\t\tmin-width: 0;\n\t}\n\n\t.cn-workspace-filter-widget--inline :deep(.vs__dropdown-toggle) {\n\t\tmin-height: 44px;\n\t}\n}\n</style>\n"],"names":["CnResourceSelect","CnSegmentedControl","t"],"mappings":"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"}
|
|
@@ -115,11 +115,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
115
115
|
modelValue: $options.selectedOption,
|
|
116
116
|
options: $options.displayOptions,
|
|
117
117
|
clearable: false,
|
|
118
|
-
inputLabel: $options.label || $options.writeKey,
|
|
118
|
+
inputLabel: $props.content.inline ? '' : ($options.label || $options.writeKey),
|
|
119
|
+
labelOutside: $props.content.inline === true,
|
|
120
|
+
ariaLabelCombobox: $options.label || $options.writeKey,
|
|
119
121
|
label: "label",
|
|
120
122
|
"data-testid": "cn-workspace-filter-select",
|
|
121
123
|
"onUpdate:modelValue": $options.onSelect
|
|
122
|
-
}, null, 8 /* PROPS */, ["modelValue", "options", "inputLabel", "onUpdate:modelValue"]))
|
|
124
|
+
}, null, 8 /* PROPS */, ["modelValue", "options", "inputLabel", "labelOutside", "ariaLabelCombobox", "onUpdate:modelValue"]))
|
|
123
125
|
: (!$options.isBar)
|
|
124
126
|
? (openBlock(), createElementBlock("ul", {
|
|
125
127
|
key: 8,
|