@conduction/nextcloud-vue 2.84.0 → 2.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +131 -3
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +54 -18
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +232 -4
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +95 -51
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +114 -0
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js +2 -2
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +45 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +22 -12
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +23 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +3 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +18 -5
- 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/CnIndexPage/CnIndexPage.vue2.js +548 -77
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +191 -82
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js +11 -2
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +95 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +24 -2
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +70 -2
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +67 -5
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +181 -124
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +5 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +134 -10
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -2
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +6 -3
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +140 -7
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +37 -9
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +6 -5
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +2 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js +53 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js +3 -2
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +135 -0
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +19 -0
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +37 -19
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/composables/useListView.js +21 -0
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +23 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +41 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +742 -397
- package/dist/esm/store/useObjectStore.js +16 -2
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/boardColumns.js +8 -1
- package/dist/esm/utils/boardColumns.js.map +1 -1
- package/dist/esm/utils/boardReferenceColumns.js +278 -0
- package/dist/esm/utils/boardReferenceColumns.js.map +1 -0
- package/dist/esm/utils/buildManifest.js +4 -1
- package/dist/esm/utils/buildManifest.js.map +1 -1
- package/dist/esm/utils/gridStack.js +40 -1
- package/dist/esm/utils/gridStack.js.map +1 -1
- package/dist/esm/utils/humaniseKey.js +41 -0
- package/dist/esm/utils/humaniseKey.js.map +1 -0
- package/dist/esm/utils/notificationRuleLabel.js +6 -23
- package/dist/esm/utils/notificationRuleLabel.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/widgetDispatch.js +8 -2
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +15075 -12590
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +742 -397
- package/l10n/en.json +23 -1
- package/l10n/nl.json +41 -1
- package/package.json +1 -1
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +160 -8
- package/src/components/CnBoardView/CnBoardView.vue +262 -6
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +116 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +57 -2
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +23 -4
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +3 -1
- package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -5
- package/src/components/CnIndexPage/CnIndexPage.vue +586 -25
- package/src/components/CnIndexPage/useSelfFetchList.js +10 -1
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +123 -3
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +70 -2
- package/src/components/CnRegisterMapping/CnRegisterMapping.md +5 -0
- package/src/components/CnRegisterMapping/CnRegisterMapping.vue +231 -96
- package/src/components/CnSettingsPage/CnSettingsPage.vue +5 -1
- package/src/components/CnStatWidget/CnStatWidget.vue +136 -11
- package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -3
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +140 -7
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.md +2 -1
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +42 -13
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +2 -1
- package/src/components/CnWidgetCardGrid/CnWidgetCardGrid.vue +55 -2
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +135 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +10 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +44 -1
- package/src/composables/useListView.js +21 -0
- package/src/css/board.css +65 -4
- package/src/css/dialog.css +4 -2
- package/src/css/index-page.css +49 -0
- package/src/css/kpi-card.css +13 -0
- package/src/css/look-board.css +96 -7
- package/src/index.js +2 -0
- package/src/schemas/app-manifest-v2.schema.json +115 -5
- package/src/store/useObjectStore.js +16 -2
- package/src/utils/boardColumns.js +8 -1
- package/src/utils/boardReferenceColumns.js +274 -0
- package/src/utils/buildManifest.js +4 -1
- package/src/utils/gridStack.js +39 -0
- package/src/utils/humaniseKey.js +38 -0
- package/src/utils/notificationRuleLabel.js +5 -23
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/widgetDispatch.js +8 -2
|
@@ -1,32 +1,48 @@
|
|
|
1
|
-
import { resolveComponent, openBlock, createBlock, createSlots, withCtx, createTextVNode, toDisplayString, createCommentVNode, renderSlot, createElementBlock, Fragment, renderList, createElementVNode,
|
|
1
|
+
import { resolveComponent, openBlock, createBlock, createSlots, withCtx, createTextVNode, toDisplayString, createCommentVNode, renderSlot, createElementBlock, Fragment, renderList, normalizeClass, createElementVNode, withDirectives, createVNode, Transition, vShow } from 'vue';
|
|
2
2
|
|
|
3
3
|
const _hoisted_1 = {
|
|
4
4
|
key: 0,
|
|
5
5
|
class: "cn-register-mapping"
|
|
6
6
|
};
|
|
7
|
-
const _hoisted_2 = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const _hoisted_2 = {
|
|
8
|
+
key: 0,
|
|
9
|
+
class: "cn-register-mapping__group-heading"
|
|
10
|
+
};
|
|
11
|
+
const _hoisted_3 = ["aria-expanded", "aria-controls", "onClick"];
|
|
12
|
+
const _hoisted_4 = {
|
|
13
|
+
class: "cn-register-mapping__group-chevron",
|
|
14
|
+
"aria-hidden": "true"
|
|
15
|
+
};
|
|
16
|
+
const _hoisted_5 = { class: "cn-register-mapping__group-header" };
|
|
17
|
+
const _hoisted_6 = { class: "cn-register-mapping__group-title" };
|
|
18
|
+
const _hoisted_7 = {
|
|
19
|
+
class: "cn-register-mapping__group-status",
|
|
20
|
+
"data-testid": "cn-register-mapping-group-count"
|
|
21
|
+
};
|
|
22
|
+
const _hoisted_8 = { class: "cn-register-mapping__group-header" };
|
|
23
|
+
const _hoisted_9 = { class: "cn-register-mapping__group-title" };
|
|
24
|
+
const _hoisted_10 = { class: "cn-register-mapping__group-status" };
|
|
25
|
+
const _hoisted_11 = ["id"];
|
|
26
|
+
const _hoisted_12 = {
|
|
11
27
|
key: 0,
|
|
12
28
|
class: "cn-register-mapping__group-description"
|
|
13
29
|
};
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const _hoisted_8 = {
|
|
30
|
+
const _hoisted_13 = { class: "cn-register-mapping__register-select" };
|
|
31
|
+
const _hoisted_14 = {
|
|
17
32
|
key: 1,
|
|
18
33
|
class: "cn-register-mapping__type-list"
|
|
19
34
|
};
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
35
|
+
const _hoisted_15 = { class: "cn-register-mapping__type-list-header" };
|
|
36
|
+
const _hoisted_16 = ["onClick"];
|
|
37
|
+
const _hoisted_17 = { class: "cn-register-mapping__type-name" };
|
|
38
|
+
const _hoisted_18 = { class: "cn-register-mapping__type-schema" };
|
|
39
|
+
const _hoisted_19 = { class: "cn-register-mapping__type-status" };
|
|
40
|
+
const _hoisted_20 = { class: "cn-register-mapping__type-chevron" };
|
|
41
|
+
const _hoisted_21 = {
|
|
26
42
|
key: 0,
|
|
27
43
|
class: "cn-register-mapping__type-detail"
|
|
28
44
|
};
|
|
29
|
-
const
|
|
45
|
+
const _hoisted_22 = {
|
|
30
46
|
key: 0,
|
|
31
47
|
class: "cn-register-mapping__type-description"
|
|
32
48
|
};
|
|
@@ -36,9 +52,9 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
36
52
|
const _component_ContentSave = resolveComponent("ContentSave");
|
|
37
53
|
const _component_NcButton = resolveComponent("NcButton");
|
|
38
54
|
const _component_Refresh = resolveComponent("Refresh");
|
|
39
|
-
const _component_NcSelect = resolveComponent("NcSelect");
|
|
40
55
|
const _component_ChevronUp = resolveComponent("ChevronUp");
|
|
41
56
|
const _component_ChevronDown = resolveComponent("ChevronDown");
|
|
57
|
+
const _component_NcSelect = resolveComponent("NcSelect");
|
|
42
58
|
const _component_NcNoteCard = resolveComponent("NcNoteCard");
|
|
43
59
|
const _component_CnSettingsSection = resolveComponent("CnSettingsSection");
|
|
44
60
|
|
|
@@ -47,7 +63,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
47
63
|
description: $props.description,
|
|
48
64
|
docUrl: $props.docUrl,
|
|
49
65
|
loading: $data.registersLoading,
|
|
50
|
-
loadingMessage:
|
|
66
|
+
loadingMessage: $options.t('nextcloud-vue', 'Loading registers…'),
|
|
51
67
|
error: !!$data.registersError,
|
|
52
68
|
errorMessage: $data.registersError || '',
|
|
53
69
|
onRetry: $options.loadRegisters
|
|
@@ -72,7 +88,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
72
88
|
}))
|
|
73
89
|
]),
|
|
74
90
|
default: withCtx(() => [
|
|
75
|
-
createTextVNode(" " + toDisplayString($props.saving ? 'Saving
|
|
91
|
+
createTextVNode(" " + toDisplayString($props.saving ? $options.t('nextcloud-vue', 'Saving…') : $props.saveButtonText), 1 /* TEXT */)
|
|
76
92
|
]),
|
|
77
93
|
_: 1 /* STABLE */
|
|
78
94
|
}, 8 /* PROPS */, ["disabled", "onClick"]))
|
|
@@ -96,7 +112,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
96
112
|
}))
|
|
97
113
|
]),
|
|
98
114
|
default: withCtx(() => [
|
|
99
|
-
createTextVNode(" " + toDisplayString($props.reimporting ? 'Importing
|
|
115
|
+
createTextVNode(" " + toDisplayString($props.reimporting ? $options.t('nextcloud-vue', 'Importing…') : $props.reimportButtonText), 1 /* TEXT */)
|
|
100
116
|
]),
|
|
101
117
|
_: 1 /* STABLE */
|
|
102
118
|
}, 8 /* PROPS */, ["disabled"]))
|
|
@@ -109,118 +125,159 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
109
125
|
(openBlock(true), createElementBlock(Fragment, null, renderList($props.groups, (group, groupIdx) => {
|
|
110
126
|
return (openBlock(), createElementBlock("div", {
|
|
111
127
|
key: groupIdx,
|
|
112
|
-
class: "cn-register-mapping__group"
|
|
128
|
+
class: normalizeClass(["cn-register-mapping__group", { 'cn-register-mapping__group--collapsed': !$options.isGroupOpen(groupIdx) }]),
|
|
129
|
+
"data-testid": "cn-register-mapping-group"
|
|
113
130
|
}, [
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
createElementVNode("span")
|
|
147
|
-
], -1 /* CACHED */)),
|
|
148
|
-
(openBlock(true), createElementBlock(Fragment, null, renderList(group.types, (type) => {
|
|
149
|
-
return (openBlock(), createElementBlock(Fragment, {
|
|
150
|
-
key: type.slug + '-row'
|
|
151
|
-
}, [
|
|
152
|
-
createElementVNode("div", {
|
|
153
|
-
class: normalizeClass(["cn-register-mapping__type-row", { 'cn-register-mapping__type-row--expanded': $options.isExpanded(groupIdx, type.slug) }]),
|
|
154
|
-
onClick: $event => ($options.toggleExpand(groupIdx, type.slug))
|
|
155
|
-
}, [
|
|
156
|
-
createElementVNode("span", _hoisted_10, toDisplayString(type.label), 1 /* TEXT */),
|
|
157
|
-
createElementVNode("span", _hoisted_11, toDisplayString($options.schemaLabel(groupIdx, type) || $props.labels.notConfigured), 1 /* TEXT */),
|
|
158
|
-
createElementVNode("span", _hoisted_12, [
|
|
159
|
-
createElementVNode("span", {
|
|
160
|
-
class: normalizeClass(["cn-register-mapping__status-dot", $options.schemaValue(groupIdx, type)
|
|
161
|
-
? 'cn-register-mapping__status-dot--configured'
|
|
162
|
-
: 'cn-register-mapping__status-dot--unconfigured'])
|
|
163
|
-
}, null, 2 /* CLASS */)
|
|
164
|
-
]),
|
|
165
|
-
createElementVNode("span", _hoisted_13, [
|
|
166
|
-
($options.isExpanded(groupIdx, type.slug))
|
|
167
|
-
? (openBlock(), createBlock(_component_ChevronUp, {
|
|
168
|
-
key: 0,
|
|
169
|
-
size: 20
|
|
170
|
-
}))
|
|
171
|
-
: (openBlock(), createBlock(_component_ChevronDown, {
|
|
172
|
-
key: 1,
|
|
173
|
-
size: 20
|
|
174
|
-
}))
|
|
175
|
-
])
|
|
176
|
-
], 10 /* CLASS, PROPS */, _hoisted_9),
|
|
177
|
-
createVNode(Transition, { name: "slide" }, {
|
|
178
|
-
default: withCtx(() => [
|
|
179
|
-
($options.isExpanded(groupIdx, type.slug))
|
|
180
|
-
? (openBlock(), createElementBlock("div", _hoisted_14, [
|
|
181
|
-
(type.description)
|
|
182
|
-
? (openBlock(), createElementBlock("p", _hoisted_15, toDisplayString(type.description), 1 /* TEXT */))
|
|
183
|
-
: createCommentVNode("v-if", true),
|
|
184
|
-
createVNode(_component_NcSelect, {
|
|
185
|
-
modelValue: $options.selectedSchema(groupIdx, type),
|
|
186
|
-
options: $options.schemaSelectOptions(groupIdx),
|
|
187
|
-
placeholder: $props.labels.selectSchema,
|
|
188
|
-
inputLabel: $props.labels.schema,
|
|
189
|
-
label: "label",
|
|
190
|
-
trackBy: "value",
|
|
191
|
-
"onUpdate:modelValue": $event => ($options.handleSchemaChange(groupIdx, type, $event))
|
|
192
|
-
}, null, 8 /* PROPS */, ["modelValue", "options", "placeholder", "inputLabel", "onUpdate:modelValue"])
|
|
193
|
-
]))
|
|
194
|
-
: createCommentVNode("v-if", true)
|
|
195
|
-
]),
|
|
196
|
-
_: 2 /* DYNAMIC */
|
|
197
|
-
}, 1024 /* DYNAMIC_SLOTS */)
|
|
198
|
-
], 64 /* STABLE_FRAGMENT */))
|
|
199
|
-
}), 128 /* KEYED_FRAGMENT */))
|
|
131
|
+
($options.groupsCollapsible)
|
|
132
|
+
? (openBlock(), createElementBlock("h4", _hoisted_2, [
|
|
133
|
+
createElementVNode("button", {
|
|
134
|
+
type: "button",
|
|
135
|
+
class: "cn-register-mapping__group-toggle",
|
|
136
|
+
"aria-expanded": String($options.isGroupOpen(groupIdx)),
|
|
137
|
+
"aria-controls": $options.groupBodyId(groupIdx),
|
|
138
|
+
"data-testid": "cn-register-mapping-group-toggle",
|
|
139
|
+
onClick: $event => ($options.toggleGroup(groupIdx))
|
|
140
|
+
}, [
|
|
141
|
+
createElementVNode("span", _hoisted_4, [
|
|
142
|
+
($options.isGroupOpen(groupIdx))
|
|
143
|
+
? (openBlock(), createBlock(_component_ChevronUp, {
|
|
144
|
+
key: 0,
|
|
145
|
+
size: 20
|
|
146
|
+
}))
|
|
147
|
+
: (openBlock(), createBlock(_component_ChevronDown, {
|
|
148
|
+
key: 1,
|
|
149
|
+
size: 20
|
|
150
|
+
}))
|
|
151
|
+
]),
|
|
152
|
+
renderSlot(_ctx.$slots, "group-header", {
|
|
153
|
+
group: group,
|
|
154
|
+
configuredCount: $options.configuredCount(groupIdx),
|
|
155
|
+
totalCount: group.types.length
|
|
156
|
+
}, () => [
|
|
157
|
+
createElementVNode("span", _hoisted_5, [
|
|
158
|
+
createElementVNode("span", _hoisted_6, toDisplayString(group.name), 1 /* TEXT */),
|
|
159
|
+
createElementVNode("span", _hoisted_7, toDisplayString($options.configuredCount(groupIdx)) + "/" + toDisplayString(group.types.length) + " " + toDisplayString($props.labels.partiallyConfigured), 1 /* TEXT */)
|
|
160
|
+
])
|
|
161
|
+
])
|
|
162
|
+
], 8 /* PROPS */, _hoisted_3)
|
|
200
163
|
]))
|
|
201
|
-
: (
|
|
164
|
+
: renderSlot(_ctx.$slots, "group-header", {
|
|
165
|
+
group: group,
|
|
166
|
+
configuredCount: $options.configuredCount(groupIdx),
|
|
167
|
+
totalCount: group.types.length
|
|
168
|
+
}, () => [
|
|
169
|
+
createElementVNode("div", _hoisted_8, [
|
|
170
|
+
createElementVNode("h4", _hoisted_9, toDisplayString(group.name), 1 /* TEXT */),
|
|
171
|
+
createElementVNode("span", _hoisted_10, toDisplayString($options.configuredCount(groupIdx)) + "/" + toDisplayString(group.types.length) + " " + toDisplayString($props.labels.partiallyConfigured), 1 /* TEXT */)
|
|
172
|
+
])
|
|
173
|
+
], undefined, 1),
|
|
174
|
+
withDirectives(createElementVNode("div", {
|
|
175
|
+
id: $options.groupBodyId(groupIdx),
|
|
176
|
+
class: "cn-register-mapping__group-body",
|
|
177
|
+
"data-testid": "cn-register-mapping-group-body"
|
|
178
|
+
}, [
|
|
179
|
+
(group.description)
|
|
180
|
+
? (openBlock(), createElementBlock("p", _hoisted_12, toDisplayString(group.description), 1 /* TEXT */))
|
|
181
|
+
: createCommentVNode("v-if", true),
|
|
182
|
+
createElementVNode("div", _hoisted_13, [
|
|
183
|
+
createVNode(_component_NcSelect, {
|
|
184
|
+
modelValue: $options.selectedRegister(groupIdx),
|
|
185
|
+
options: $options.registerSelectOptions,
|
|
186
|
+
placeholder: $props.labels.selectRegister,
|
|
187
|
+
inputLabel: $props.labels.register,
|
|
188
|
+
loading: $data.registersLoading,
|
|
189
|
+
label: "label",
|
|
190
|
+
trackBy: "value",
|
|
191
|
+
"onUpdate:modelValue": $event => ($options.handleRegisterChange(groupIdx, $event))
|
|
192
|
+
}, null, 8 /* PROPS */, ["modelValue", "options", "placeholder", "inputLabel", "loading", "onUpdate:modelValue"])
|
|
193
|
+
]),
|
|
194
|
+
($options.selectedRegister(groupIdx))
|
|
195
|
+
? (openBlock(), createElementBlock("div", _hoisted_14, [
|
|
196
|
+
createElementVNode("div", _hoisted_15, [
|
|
197
|
+
createElementVNode("span", null, toDisplayString($options.t('nextcloud-vue', 'Object type')), 1 /* TEXT */),
|
|
198
|
+
createElementVNode("span", null, toDisplayString($props.labels.schema), 1 /* TEXT */),
|
|
199
|
+
_cache[1] || (_cache[1] = createElementVNode("span", null, null, -1 /* CACHED */)),
|
|
200
|
+
_cache[2] || (_cache[2] = createElementVNode("span", null, null, -1 /* CACHED */))
|
|
201
|
+
]),
|
|
202
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(group.types, (type) => {
|
|
203
|
+
return (openBlock(), createElementBlock(Fragment, {
|
|
204
|
+
key: type.slug + '-row'
|
|
205
|
+
}, [
|
|
206
|
+
createElementVNode("div", {
|
|
207
|
+
class: normalizeClass(["cn-register-mapping__type-row", { 'cn-register-mapping__type-row--expanded': $options.isExpanded(groupIdx, type.slug) }]),
|
|
208
|
+
onClick: $event => ($options.toggleExpand(groupIdx, type.slug))
|
|
209
|
+
}, [
|
|
210
|
+
createElementVNode("span", _hoisted_17, toDisplayString(type.label), 1 /* TEXT */),
|
|
211
|
+
createElementVNode("span", _hoisted_18, toDisplayString($options.schemaLabel(groupIdx, type) || $props.labels.notConfigured), 1 /* TEXT */),
|
|
212
|
+
createElementVNode("span", _hoisted_19, [
|
|
213
|
+
createElementVNode("span", {
|
|
214
|
+
class: normalizeClass(["cn-register-mapping__status-dot", $options.schemaValue(groupIdx, type)
|
|
215
|
+
? 'cn-register-mapping__status-dot--configured'
|
|
216
|
+
: 'cn-register-mapping__status-dot--unconfigured'])
|
|
217
|
+
}, null, 2 /* CLASS */)
|
|
218
|
+
]),
|
|
219
|
+
createElementVNode("span", _hoisted_20, [
|
|
220
|
+
($options.isExpanded(groupIdx, type.slug))
|
|
221
|
+
? (openBlock(), createBlock(_component_ChevronUp, {
|
|
222
|
+
key: 0,
|
|
223
|
+
size: 20
|
|
224
|
+
}))
|
|
225
|
+
: (openBlock(), createBlock(_component_ChevronDown, {
|
|
226
|
+
key: 1,
|
|
227
|
+
size: 20
|
|
228
|
+
}))
|
|
229
|
+
])
|
|
230
|
+
], 10 /* CLASS, PROPS */, _hoisted_16),
|
|
231
|
+
createVNode(Transition, { name: "slide" }, {
|
|
232
|
+
default: withCtx(() => [
|
|
233
|
+
($options.isExpanded(groupIdx, type.slug))
|
|
234
|
+
? (openBlock(), createElementBlock("div", _hoisted_21, [
|
|
235
|
+
(type.description)
|
|
236
|
+
? (openBlock(), createElementBlock("p", _hoisted_22, toDisplayString(type.description), 1 /* TEXT */))
|
|
237
|
+
: createCommentVNode("v-if", true),
|
|
238
|
+
createVNode(_component_NcSelect, {
|
|
239
|
+
modelValue: $options.selectedSchema(groupIdx, type),
|
|
240
|
+
options: $options.schemaSelectOptions(groupIdx),
|
|
241
|
+
placeholder: $props.labels.selectSchema,
|
|
242
|
+
inputLabel: $props.labels.schema,
|
|
243
|
+
label: "label",
|
|
244
|
+
trackBy: "value",
|
|
245
|
+
"onUpdate:modelValue": $event => ($options.handleSchemaChange(groupIdx, type, $event))
|
|
246
|
+
}, null, 8 /* PROPS */, ["modelValue", "options", "placeholder", "inputLabel", "onUpdate:modelValue"])
|
|
247
|
+
]))
|
|
248
|
+
: createCommentVNode("v-if", true)
|
|
249
|
+
]),
|
|
250
|
+
_: 2 /* DYNAMIC */
|
|
251
|
+
}, 1024 /* DYNAMIC_SLOTS */)
|
|
252
|
+
], 64 /* STABLE_FRAGMENT */))
|
|
253
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
254
|
+
]))
|
|
255
|
+
: (!$data.registersLoading)
|
|
256
|
+
? (openBlock(), createBlock(_component_NcNoteCard, {
|
|
257
|
+
key: 2,
|
|
258
|
+
type: "info"
|
|
259
|
+
}, {
|
|
260
|
+
default: withCtx(() => [
|
|
261
|
+
createTextVNode(toDisplayString($props.labels.selectRegister), 1 /* TEXT */)
|
|
262
|
+
]),
|
|
263
|
+
_: 1 /* STABLE */
|
|
264
|
+
}))
|
|
265
|
+
: createCommentVNode("v-if", true),
|
|
266
|
+
($options.selectedRegister(groupIdx) && $options.schemaSelectOptions(groupIdx).length === 0 && !$data.registersLoading)
|
|
202
267
|
? (openBlock(), createBlock(_component_NcNoteCard, {
|
|
203
|
-
key:
|
|
204
|
-
|
|
268
|
+
key: 3,
|
|
269
|
+
variant: "warning"
|
|
205
270
|
}, {
|
|
206
271
|
default: withCtx(() => [
|
|
207
|
-
createTextVNode(toDisplayString($props.labels.
|
|
272
|
+
createTextVNode(toDisplayString($props.labels.noSchemas), 1 /* TEXT */)
|
|
208
273
|
]),
|
|
209
274
|
_: 1 /* STABLE */
|
|
210
275
|
}))
|
|
211
|
-
: createCommentVNode("v-if", true)
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}, {
|
|
217
|
-
default: withCtx(() => [
|
|
218
|
-
createTextVNode(toDisplayString($props.labels.noSchemas), 1 /* TEXT */)
|
|
219
|
-
]),
|
|
220
|
-
_: 1 /* STABLE */
|
|
221
|
-
}))
|
|
222
|
-
: createCommentVNode("v-if", true)
|
|
223
|
-
]))
|
|
276
|
+
: createCommentVNode("v-if", true)
|
|
277
|
+
], 8 /* PROPS */, _hoisted_11), [
|
|
278
|
+
[vShow, $options.isGroupOpen(groupIdx)]
|
|
279
|
+
])
|
|
280
|
+
], 2 /* CLASS */))
|
|
224
281
|
}), 128 /* KEYED_FRAGMENT */))
|
|
225
282
|
]))
|
|
226
283
|
: createCommentVNode("v-if", true)
|
|
@@ -236,7 +293,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
236
293
|
key: "0"
|
|
237
294
|
}
|
|
238
295
|
: undefined
|
|
239
|
-
]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["name", "description", "docUrl", "loading", "error", "errorMessage", "onRetry"]))
|
|
296
|
+
]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["name", "description", "docUrl", "loading", "loadingMessage", "error", "errorMessage", "onRetry"]))
|
|
240
297
|
}
|
|
241
298
|
|
|
242
299
|
export { render };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnRegisterMapping.vue3.js","sources":["../../../../src/components/CnRegisterMapping/CnRegisterMapping.vue?vue&type=template&id=0abd37fe&lang.js"],"sourcesContent":["<template>\n\t<CnSettingsSection\n\t\t:name=\"name\"\n\t\t:description=\"description\"\n\t\t:docUrl=\"docUrl\"\n\t\t:loading=\"registersLoading\"\n\t\tloadingMessage=\"Loading registers...\"\n\t\t:error=\"!!registersError\"\n\t\t:errorMessage=\"registersError || ''\"\n\t\t:onRetry=\"loadRegisters\">\n\t\t<!-- Action buttons -->\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showSaveButton\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t@click=\"handleSave\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"saving\" :size=\"20\" />\n\t\t\t\t\t<ContentSave v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ saving ? 'Saving...' : saveButtonText }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showReimportButton\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"reimporting\"\n\t\t\t\t@click=\"$emit('reimport')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"reimporting\" :size=\"20\" />\n\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ reimporting ? 'Importing...' : reimportButtonText }}\n\t\t\t</NcButton>\n\t\t\t<slot name=\"actions\" />\n\t\t</template>\n\n\t\t<!-- Group sections -->\n\t\t<div v-if=\"!registersLoading && !registersError\" class=\"cn-register-mapping\">\n\t\t\t<div\n\t\t\t\tv-for=\"(group, groupIdx) in groups\"\n\t\t\t\t:key=\"groupIdx\"\n\t\t\t\tclass=\"cn-register-mapping__group\">\n\t\t\t\t<!-- Group header -->\n\t\t\t\t<slot name=\"group-header\"\n\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t:configuredCount=\"configuredCount(groupIdx)\"\n\t\t\t\t\t:totalCount=\"group.types.length\">\n\t\t\t\t\t<div class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t<h4 class=\"cn-register-mapping__group-title\">\n\t\t\t\t\t\t\t{{ group.name }}\n\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\">\n\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</slot>\n\n\t\t\t\t<!-- Group description -->\n\t\t\t\t<p v-if=\"group.description\" class=\"cn-register-mapping__group-description\">\n\t\t\t\t\t{{ group.description }}\n\t\t\t\t</p>\n\n\t\t\t\t<!-- Register selector -->\n\t\t\t\t<div class=\"cn-register-mapping__register-select\">\n\t\t\t\t\t<label class=\"cn-register-mapping__label\">{{ labels.register }}</label>\n\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t:modelValue=\"selectedRegister(groupIdx)\"\n\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\t:loading=\"registersLoading\"\n\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(groupIdx, $event)\" />\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Type list -->\n\t\t\t\t<div v-if=\"selectedRegister(groupIdx)\" class=\"cn-register-mapping__type-list\">\n\t\t\t\t\t<!-- Header row -->\n\t\t\t\t\t<div class=\"cn-register-mapping__type-list-header\">\n\t\t\t\t\t\t<span>Name</span>\n\t\t\t\t\t\t<span>Schema</span>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Type rows -->\n\t\t\t\t\t<template v-for=\"type in group.types\" :key=\"type.slug + '-row'\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-row\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-register-mapping__type-row--expanded': isExpanded(groupIdx, type.slug) }\"\n\t\t\t\t\t\t\t@click=\"toggleExpand(groupIdx, type.slug)\">\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-name\">{{ type.label }}</span>\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-schema\">\n\t\t\t\t\t\t\t\t{{ schemaLabel(groupIdx, type) || labels.notConfigured }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-status\">\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__status-dot\"\n\t\t\t\t\t\t\t\t\t:class=\"schemaValue(groupIdx, type)\n\t\t\t\t\t\t\t\t\t\t? 'cn-register-mapping__status-dot--configured'\n\t\t\t\t\t\t\t\t\t\t: 'cn-register-mapping__status-dot--unconfigured'\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-chevron\">\n\t\t\t\t\t\t\t\t<ChevronUp v-if=\"isExpanded(groupIdx, type.slug)\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Expanded detail -->\n\t\t\t\t\t\t<transition name=\"slide\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-if=\"isExpanded(groupIdx, type.slug)\"\n\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-detail\">\n\t\t\t\t\t\t\t\t<p v-if=\"type.description\" class=\"cn-register-mapping__type-description\">\n\t\t\t\t\t\t\t\t\t{{ type.description }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t\t:modelValue=\"selectedSchema(groupIdx, type)\"\n\t\t\t\t\t\t\t\t\t:options=\"schemaSelectOptions(groupIdx)\"\n\t\t\t\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t\t\t\t:inputLabel=\"labels.schema\"\n\t\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(groupIdx, type, $event)\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</transition>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- No register selected -->\n\t\t\t\t<NcNoteCard v-else-if=\"!registersLoading\" type=\"info\">\n\t\t\t\t\t{{ labels.selectRegister }}\n\t\t\t\t</NcNoteCard>\n\n\t\t\t\t<!-- No schemas available -->\n\t\t\t\t<NcNoteCard\n\t\t\t\t\tv-if=\"selectedRegister(groupIdx) && schemaSelectOptions(groupIdx).length === 0 && !registersLoading\"\n\t\t\t\t\tvariant=\"warning\">\n\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t</NcNoteCard>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Footer -->\n\t\t<template v-if=\"$slots.footer\" #footer>\n\t\t\t<slot name=\"footer\" />\n\t\t</template>\n\t</CnSettingsSection>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcLoadingIcon, NcNoteCard, NcSelect } from '@nextcloud/vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport ContentSave from 'vue-material-design-icons/ContentSave.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { CnSettingsSection } from '../CnSettingsSection/index.js'\n\n/**\n * CnRegisterMapping - OpenRegister register/schema configuration component.\n *\n * Displays and manages register-to-schema mappings for app object types.\n * Self-fetches available registers and schemas from the OpenRegister API.\n * Supports multiple register groups (stacked sections) with expandable\n * type rows for manual schema override.\n *\n * Single register (Pipelinq)\n * ```vue\n * <CnRegisterMapping\n * name=\"Register Configuration\"\n * :groups=\"[{\n * name: 'Core Objects',\n * types: [\n * { slug: 'client', label: 'Client' },\n * { slug: 'contact', label: 'Contact' },\n * ],\n * }]\"\n * :configuration=\"config\"\n * :show-reimport-button=\"true\"\n * @save=\"saveConfig\"\n * @reimport=\"reimport\" />\n * ```\n *\n * Multi-register (Stackiq)\n * ```vue\n * <CnRegisterMapping\n * :groups=\"[\n * { name: 'Voorzieningen', registerConfigKey: 'voorzieningen_register', types: [...] },\n * { name: 'AMEF', registerConfigKey: 'amef_register', types: [...] },\n * ]\"\n * :configuration=\"config\"\n * @save=\"saveConfig\" />\n * ```\n */\nexport default {\n\tname: 'CnRegisterMapping',\n\n\tcomponents: {\n\t\tCnSettingsSection,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcNoteCard,\n\t\tNcSelect,\n\t\tContentSave,\n\t\tRefresh,\n\t\tChevronDown,\n\t\tChevronUp,\n\t},\n\n\tprops: {\n\t\t/** Section title */\n\t\tname: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Register configuration'),\n\t\t},\n\n\t\t/** Section description */\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Configure OpenRegister schema mappings for your object types'),\n\t\t},\n\n\t\t/** Documentation URL */\n\t\tdocUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Groups of object types that share a register.\n\t\t *\n\t\t * @type {Array<{ name: string, description: string, registerConfigKey: string, types: Array<{ slug: string, label: string, description: string, configKey: string }> }>}\n\t\t */\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator: (groups) => groups.length > 0\n\t\t\t\t&& groups.every((g) => g.name && Array.isArray(g.types) && g.types.length > 0),\n\t\t},\n\n\t\t/** Current configuration values: { register: '5', client_schema: '28', ... } */\n\t\tconfiguration: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Show save button */\n\t\tshowSaveButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether save is in progress */\n\t\tsaving: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show reimport button */\n\t\tshowReimportButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether reimport is in progress */\n\t\treimporting: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Save button text */\n\t\tsaveButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Save configuration'),\n\t\t},\n\n\t\t/** Reimport button text */\n\t\treimportButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Re-import configuration'),\n\t\t},\n\n\t\t/** Auto-match schema titles to type slugs on register change */\n\t\tautoMatch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** UI labels (i18n) */\n\t\tlabels: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({\n\t\t\t\tregister: t('nextcloud-vue', 'Register'),\n\t\t\t\tschema: t('nextcloud-vue', 'Schema'),\n\t\t\t\tconfigured: t('nextcloud-vue', 'Configured'),\n\t\t\t\tnotConfigured: t('nextcloud-vue', 'Not configured'),\n\t\t\t\tnoSchemas: t('nextcloud-vue', 'No schemas available in this register'),\n\t\t\t\tselectRegister: t('nextcloud-vue', 'Select a register'),\n\t\t\t\tselectSchema: t('nextcloud-vue', 'Select a schema'),\n\t\t\t\tallConfigured: t('nextcloud-vue', 'All types configured'),\n\t\t\t\tpartiallyConfigured: t('nextcloud-vue', 'configured'),\n\t\t\t}),\n\t\t},\n\t},\n\n\temits: ['update:configuration', 'save', 'reimport'],\n\n\tdata() {\n\t\treturn {\n\t\t\t// Fetched data\n\t\t\tregisters: [],\n\t\t\tschemasByRegister: {},\n\t\t\tregistersLoading: false,\n\t\t\tregistersError: null,\n\t\t\t// Local state\n\t\t\tlocalConfig: {},\n\t\t\texpandedRows: {},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Register options for NcSelect */\n\t\tregisterSelectOptions() {\n\t\t\treturn this.registers.map((r) => ({\n\t\t\t\tlabel: r.title || r.slug || `Register ${r.id}`,\n\t\t\t\tvalue: String(r.id),\n\t\t\t}))\n\t\t},\n\n\t\t/** Whether local config differs from prop */\n\t\thasChanges() {\n\t\t\treturn JSON.stringify(this.localConfig) !== JSON.stringify(this.configuration)\n\t\t},\n\t},\n\n\twatch: {\n\t\tconfiguration: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.localConfig = { ...newVal }\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.loadRegisters()\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Get the config key for a group's register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string} Config key\n\t\t */\n\t\tregisterConfigKey(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tif (group.registerConfigKey) {\n\t\t\t\treturn group.registerConfigKey\n\t\t\t}\n\t\t\tif (this.groups.length === 1) {\n\t\t\t\treturn 'register'\n\t\t\t}\n\t\t\treturn group.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_register'\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a type's schema.\n\t\t *\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Config key\n\t\t */\n\t\tschemaConfigKey(type) {\n\t\t\treturn type.configKey || type.slug + '_schema'\n\t\t},\n\n\t\t/**\n\t\t * Get the selected register option for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedRegister(groupIdx) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.registerSelectOptions.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the selected schema option for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedSchema(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\t\t\treturn options.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the schema value (ID) for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema ID or empty string\n\t\t */\n\t\tschemaValue(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\treturn this.localConfig[key] || ''\n\t\t},\n\n\t\t/**\n\t\t * Get the display label for a type's current schema.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema label or empty string\n\t\t */\n\t\tschemaLabel(groupIdx, type) {\n\t\t\tconst selected = this.selectedSchema(groupIdx, type)\n\t\t\tif (selected) {\n\t\t\t\treturn selected.label\n\t\t\t}\n\t\t\tconst value = this.schemaValue(groupIdx, type)\n\t\t\treturn value ? `Schema ${value}` : ''\n\t\t},\n\n\t\t/**\n\t\t * Get schema options for a group's selected register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {Array<{label: string, value: string}>} NcSelect options\n\t\t */\n\t\tschemaSelectOptions(groupIdx) {\n\t\t\tconst reg = this.selectedRegister(groupIdx)\n\t\t\tif (!reg) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst schemas = this.schemasByRegister[reg.value] || []\n\t\t\treturn schemas.map((s) => ({\n\t\t\t\tlabel: s.title || s.slug || `Schema ${s.id}`,\n\t\t\t\tvalue: String(s.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Count configured types in a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {number} Count\n\t\t */\n\t\tconfiguredCount(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\treturn group.types.filter((type) => !!this.schemaValue(groupIdx, type)).length\n\t\t},\n\n\t\t/**\n\t\t * Check if a type row is expanded.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t * @return {boolean}\n\t\t */\n\t\tisExpanded(groupIdx, slug) {\n\t\t\treturn !!this.expandedRows[groupIdx + '-' + slug]\n\t\t},\n\n\t\t/**\n\t\t * Toggle a type row expansion.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t */\n\t\ttoggleExpand(groupIdx, slug) {\n\t\t\tconst key = groupIdx + '-' + slug\n\t\t\tthis.expandedRows = {\n\t\t\t\t...this.expandedRows,\n\t\t\t\t[key]: !this.expandedRows[key],\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle register selection change for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\tasync handleRegisterChange(groupIdx, option) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\n\t\t\t// Clear schema selections for this group\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: '' }\n\t\t\t}\n\n\t\t\t// Fetch schemas for the new register\n\t\t\tif (value) {\n\t\t\t\tawait this.loadSchemasForRegister(value)\n\n\t\t\t\t// Auto-match schemas\n\t\t\t\tif (this.autoMatch) {\n\t\t\t\t\tthis.autoMatchSchemas(groupIdx)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Handle schema selection change for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\thandleSchemaChange(groupIdx, type, option) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Auto-match schema titles to type slugs/labels (case-insensitive).\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t */\n\t\tautoMatchSchemas(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\t// Skip if already has a value\n\t\t\t\tif (this.localConfig[schemaKey]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst slug = type.slug.toLowerCase()\n\t\t\t\tconst label = type.label.toLowerCase()\n\n\t\t\t\tconst match = options.find((o) => {\n\t\t\t\t\tconst optLabel = o.label.toLowerCase()\n\t\t\t\t\treturn optLabel === slug || optLabel === label\n\t\t\t\t\t\t|| optLabel.includes(slug) || slug.includes(optLabel)\n\t\t\t\t})\n\n\t\t\t\tif (match) {\n\t\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: match.value }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** Emit save event with current config */\n\t\thandleSave() {\n\t\t\tthis.$emit('save', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Fetch all registers from OpenRegister API.\n\t\t */\n\t\tasync loadRegisters() {\n\t\t\tthis.registersLoading = true\n\t\t\tthis.registersError = null\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl('/apps/openregister/api/registers?_extend[]=schemas'), {\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.registersError = `Failed to fetch registers: ${response.statusText}`\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst results = data.results || data\n\t\t\t\tthis.registers = Array.isArray(results) ? results : []\n\n\t\t\t\t// Cache expanded schemas\n\t\t\t\tfor (const reg of this.registers) {\n\t\t\t\t\tif (Array.isArray(reg.schemas) && reg.schemas.length > 0) {\n\t\t\t\t\t\tconst schemas = reg.schemas.filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\t\t\tif (schemas.length > 0) {\n\t\t\t\t\t\t\tthis.schemasByRegister = {\n\t\t\t\t\t\t\t\t...this.schemasByRegister,\n\t\t\t\t\t\t\t\t[String(reg.id)]: schemas,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.registersError = error.message || 'Network error fetching registers'\n\t\t\t} finally {\n\t\t\t\tthis.registersLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch schemas for a specific register.\n\t\t *\n\t\t * @param {string} registerId Register ID\n\t\t */\n\t\tasync loadSchemasForRegister(registerId) {\n\t\t\tconst id = String(registerId)\n\n\t\t\t// Return cached\n\t\t\tif (this.schemasByRegister[id]?.length > 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(\n\t\t\t\t\tprefixUrl(`/apps/openregister/api/registers/${encodeURIComponent(id)}?_extend[]=schemas`),\n\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t)\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst schemas = (data.schemas || []).filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\tthis.schemasByRegister = { ...this.schemasByRegister, [id]: schemas }\n\t\t\t} catch {\n\t\t\t\t// Silently fail — register already selected, schemas just won't populate\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-register-mapping__group {\n\tmargin-bottom: 24px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: 20px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__group:last-child {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: 12px;\n}\n\n.cn-register-mapping__group-title {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tmargin: 0;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__group-status {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 12px 0;\n}\n\n.cn-register-mapping__label {\n\tdisplay: block;\n\tfont-weight: 500;\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-bottom: 4px;\n}\n\n.cn-register-mapping__register-select {\n\tmargin-bottom: 16px;\n\tmax-width: 400px;\n}\n\n.cn-register-mapping__type-list {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\toverflow: hidden;\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-list-header {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 8px 16px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.5px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 10px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tcursor: pointer;\n\ttransition: background-color 0.15s ease;\n}\n\n.cn-register-mapping__type-row:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row--expanded {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-name {\n\tfont-weight: 500;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__type-schema {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-register-mapping__type-status {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.cn-register-mapping__type-chevron {\n\tdisplay: flex;\n\tjustify-content: center;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__status-dot {\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 50%;\n}\n\n.cn-register-mapping__status-dot--configured {\n\tbackground-color: var(--color-success);\n}\n\n.cn-register-mapping__status-dot--unconfigured {\n\tbackground-color: var(--color-warning);\n}\n\n.cn-register-mapping__type-detail {\n\tpadding: 12px 16px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 8px 0;\n}\n\n/* Slide transition */\n.slide-enter-active,\n.slide-leave-active {\n\ttransition: all 0.2s ease;\n\tmax-height: 200px;\n\toverflow: hidden;\n}\n\n.slide-enter,\n.slide-leave-to {\n\tmax-height: 0;\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\topacity: 0;\n}\n\n/* Last row in list should not have bottom border */\n.cn-register-mapping__type-list > :last-child {\n\tborder-bottom: none;\n}\n\n@media (max-width: 768px) {\n\t.cn-register-mapping__type-list-header {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__type-row {\n\t\tgrid-template-columns: 1fr auto 32px;\n\t}\n\n\t.cn-register-mapping__type-schema {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__register-select {\n\t\tmax-width: none;\n\t}\n}\n</style>\n"],"names":["_createBlock","_toDisplayString","_renderSlot","_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_createVNode","_normalizeClass","_Transition","_createTextVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnRegisterMapping.vue3.js","sources":["../../../../src/components/CnRegisterMapping/CnRegisterMapping.vue?vue&type=template&id=8d3cad98&lang.js"],"sourcesContent":["<template>\n\t<CnSettingsSection\n\t\t:name=\"name\"\n\t\t:description=\"description\"\n\t\t:docUrl=\"docUrl\"\n\t\t:loading=\"registersLoading\"\n\t\t:loadingMessage=\"t('nextcloud-vue', 'Loading registers…')\"\n\t\t:error=\"!!registersError\"\n\t\t:errorMessage=\"registersError || ''\"\n\t\t:onRetry=\"loadRegisters\">\n\t\t<!-- Action buttons -->\n\t\t<template #actions>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showSaveButton\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"saving || !hasChanges\"\n\t\t\t\t@click=\"handleSave\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"saving\" :size=\"20\" />\n\t\t\t\t\t<ContentSave v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ saving ? t('nextcloud-vue', 'Saving…') : saveButtonText }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showReimportButton\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"reimporting\"\n\t\t\t\t@click=\"$emit('reimport')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"reimporting\" :size=\"20\" />\n\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ reimporting ? t('nextcloud-vue', 'Importing…') : reimportButtonText }}\n\t\t\t</NcButton>\n\t\t\t<slot name=\"actions\" />\n\t\t</template>\n\n\t\t<!-- Group sections -->\n\t\t<div v-if=\"!registersLoading && !registersError\" class=\"cn-register-mapping\">\n\t\t\t<div\n\t\t\t\tv-for=\"(group, groupIdx) in groups\"\n\t\t\t\t:key=\"groupIdx\"\n\t\t\t\tclass=\"cn-register-mapping__group\"\n\t\t\t\t:class=\"{ 'cn-register-mapping__group--collapsed': !isGroupOpen(groupIdx) }\"\n\t\t\t\tdata-testid=\"cn-register-mapping-group\">\n\t\t\t\t<!-- Group header. With collapsible groups a heading holds the button\n\t\t\t\t that opens and closes the group (the WAI-ARIA accordion); the\n\t\t\t\t count stays visible while it is closed. -->\n\t\t\t\t<h4 v-if=\"groupsCollapsible\" class=\"cn-register-mapping__group-heading\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-register-mapping__group-toggle\"\n\t\t\t\t\t\t:aria-expanded=\"String(isGroupOpen(groupIdx))\"\n\t\t\t\t\t\t:aria-controls=\"groupBodyId(groupIdx)\"\n\t\t\t\t\t\tdata-testid=\"cn-register-mapping-group-toggle\"\n\t\t\t\t\t\t@click=\"toggleGroup(groupIdx)\">\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-chevron\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<ChevronUp v-if=\"isGroupOpen(groupIdx)\" :size=\"20\" />\n\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<slot name=\"group-header\"\n\t\t\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t\t\t:configuredCount=\"configuredCount(groupIdx)\"\n\t\t\t\t\t\t\t:totalCount=\"group.types.length\">\n\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-title\">{{ group.name }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\" data-testid=\"cn-register-mapping-group-count\">\n\t\t\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</slot>\n\t\t\t\t\t</button>\n\t\t\t\t</h4>\n\t\t\t\t<slot v-else\n\t\t\t\t\tname=\"group-header\"\n\t\t\t\t\t:group=\"group\"\n\t\t\t\t\t:configuredCount=\"configuredCount(groupIdx)\"\n\t\t\t\t\t:totalCount=\"group.types.length\">\n\t\t\t\t\t<div class=\"cn-register-mapping__group-header\">\n\t\t\t\t\t\t<h4 class=\"cn-register-mapping__group-title\">\n\t\t\t\t\t\t\t{{ group.name }}\n\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t<span class=\"cn-register-mapping__group-status\">\n\t\t\t\t\t\t\t{{ configuredCount(groupIdx) }}/{{ group.types.length }} {{ labels.partiallyConfigured }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</slot>\n\n\t\t\t\t<div\n\t\t\t\t\tv-show=\"isGroupOpen(groupIdx)\"\n\t\t\t\t\t:id=\"groupBodyId(groupIdx)\"\n\t\t\t\t\tclass=\"cn-register-mapping__group-body\"\n\t\t\t\t\tdata-testid=\"cn-register-mapping-group-body\">\n\t\t\t\t\t<!-- Group description -->\n\t\t\t\t\t<p v-if=\"group.description\" class=\"cn-register-mapping__group-description\">\n\t\t\t\t\t\t{{ group.description }}\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<!-- Register selector -->\n\t\t\t\t\t<div class=\"cn-register-mapping__register-select\">\n\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t:modelValue=\"selectedRegister(groupIdx)\"\n\t\t\t\t\t\t\t:options=\"registerSelectOptions\"\n\t\t\t\t\t\t\t:placeholder=\"labels.selectRegister\"\n\t\t\t\t\t\t\t:inputLabel=\"labels.register\"\n\t\t\t\t\t\t\t:loading=\"registersLoading\"\n\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t@update:modelValue=\"handleRegisterChange(groupIdx, $event)\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Type list -->\n\t\t\t\t\t<div v-if=\"selectedRegister(groupIdx)\" class=\"cn-register-mapping__type-list\">\n\t\t\t\t\t\t<!-- Header row -->\n\t\t\t\t\t\t<div class=\"cn-register-mapping__type-list-header\">\n\t\t\t\t\t\t\t<span>{{ t('nextcloud-vue', 'Object type') }}</span>\n\t\t\t\t\t\t\t<span>{{ labels.schema }}</span>\n\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Type rows -->\n\t\t\t\t\t\t<template v-for=\"type in group.types\" :key=\"type.slug + '-row'\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-row\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-register-mapping__type-row--expanded': isExpanded(groupIdx, type.slug) }\"\n\t\t\t\t\t\t\t\t@click=\"toggleExpand(groupIdx, type.slug)\">\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-name\">{{ type.label }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-schema\">\n\t\t\t\t\t\t\t\t\t{{ schemaLabel(groupIdx, type) || labels.notConfigured }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-status\">\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__status-dot\"\n\t\t\t\t\t\t\t\t\t\t:class=\"schemaValue(groupIdx, type)\n\t\t\t\t\t\t\t\t\t\t\t? 'cn-register-mapping__status-dot--configured'\n\t\t\t\t\t\t\t\t\t\t\t: 'cn-register-mapping__status-dot--unconfigured'\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-register-mapping__type-chevron\">\n\t\t\t\t\t\t\t\t\t<ChevronUp v-if=\"isExpanded(groupIdx, type.slug)\" :size=\"20\" />\n\t\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"20\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Expanded detail -->\n\t\t\t\t\t\t\t<transition name=\"slide\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tv-if=\"isExpanded(groupIdx, type.slug)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-register-mapping__type-detail\">\n\t\t\t\t\t\t\t\t\t<p v-if=\"type.description\" class=\"cn-register-mapping__type-description\">\n\t\t\t\t\t\t\t\t\t\t{{ type.description }}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<NcSelect\n\t\t\t\t\t\t\t\t\t\t:modelValue=\"selectedSchema(groupIdx, type)\"\n\t\t\t\t\t\t\t\t\t\t:options=\"schemaSelectOptions(groupIdx)\"\n\t\t\t\t\t\t\t\t\t\t:placeholder=\"labels.selectSchema\"\n\t\t\t\t\t\t\t\t\t\t:inputLabel=\"labels.schema\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t\t\t\t\t\ttrackBy=\"value\"\n\t\t\t\t\t\t\t\t\t\t@update:modelValue=\"handleSchemaChange(groupIdx, type, $event)\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</transition>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- No register selected -->\n\t\t\t\t\t<NcNoteCard v-else-if=\"!registersLoading\" type=\"info\">\n\t\t\t\t\t\t{{ labels.selectRegister }}\n\t\t\t\t\t</NcNoteCard>\n\n\t\t\t\t\t<!-- No schemas available -->\n\t\t\t\t\t<NcNoteCard\n\t\t\t\t\t\tv-if=\"selectedRegister(groupIdx) && schemaSelectOptions(groupIdx).length === 0 && !registersLoading\"\n\t\t\t\t\t\tvariant=\"warning\">\n\t\t\t\t\t\t{{ labels.noSchemas }}\n\t\t\t\t\t</NcNoteCard>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Footer -->\n\t\t<template v-if=\"$slots.footer\" #footer>\n\t\t\t<slot name=\"footer\" />\n\t\t</template>\n\t</CnSettingsSection>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcLoadingIcon, NcNoteCard, NcSelect } from '@nextcloud/vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport ContentSave from 'vue-material-design-icons/ContentSave.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport { buildHeaders, prefixUrl } from '../../utils/headers.js'\nimport { CnSettingsSection } from '../CnSettingsSection/index.js'\n\nlet mappingCount = 0\n\n/**\n * CnRegisterMapping - OpenRegister register/schema configuration component.\n *\n * Displays and manages register-to-schema mappings for app object types.\n * Self-fetches available registers and schemas from the OpenRegister API.\n * Supports multiple register groups (stacked sections) with expandable\n * type rows for manual schema override.\n *\n * Single register (Pipelinq)\n * ```vue\n * <CnRegisterMapping\n * name=\"Register Configuration\"\n * :groups=\"[{\n * name: 'Core Objects',\n * types: [\n * { slug: 'client', label: 'Client' },\n * { slug: 'contact', label: 'Contact' },\n * ],\n * }]\"\n * :configuration=\"config\"\n * :show-reimport-button=\"true\"\n * @save=\"saveConfig\"\n * @reimport=\"reimport\" />\n * ```\n *\n * Multi-register (Stackiq)\n * ```vue\n * <CnRegisterMapping\n * :groups=\"[\n * { name: 'Voorzieningen', registerConfigKey: 'voorzieningen_register', types: [...] },\n * { name: 'AMEF', registerConfigKey: 'amef_register', types: [...] },\n * ]\"\n * :configuration=\"config\"\n * @save=\"saveConfig\" />\n * ```\n */\nexport default {\n\tname: 'CnRegisterMapping',\n\n\tcomponents: {\n\t\tCnSettingsSection,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcNoteCard,\n\t\tNcSelect,\n\t\tContentSave,\n\t\tRefresh,\n\t\tChevronDown,\n\t\tChevronUp,\n\t},\n\n\tprops: {\n\t\t/** Section title */\n\t\tname: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Register configuration'),\n\t\t},\n\n\t\t/** Section description */\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Configure OpenRegister schema mappings for your object types'),\n\t\t},\n\n\t\t/** Documentation URL */\n\t\tdocUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Groups of object types that share a register.\n\t\t *\n\t\t * @type {Array<{ name: string, description: string, registerConfigKey: string, types: Array<{ slug: string, label: string, description: string, configKey: string }> }>}\n\t\t */\n\t\tgroups: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator: (groups) => groups.length > 0\n\t\t\t\t&& groups.every((g) => g.name && Array.isArray(g.types) && g.types.length > 0),\n\t\t},\n\n\t\t/** Current configuration values: { register: '5', client_schema: '28', ... } */\n\t\tconfiguration: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Show save button */\n\t\tshowSaveButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether save is in progress */\n\t\tsaving: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show reimport button */\n\t\tshowReimportButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether reimport is in progress */\n\t\treimporting: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Save button text */\n\t\tsaveButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Save configuration'),\n\t\t},\n\n\t\t/** Reimport button text */\n\t\treimportButtonText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Re-import configuration'),\n\t\t},\n\n\t\t/**\n\t\t * Draw each group as a header that opens and closes it, showing its\n\t\t * configured count while closed. The groups start closed. `null` (the\n\t\t * default) collapses them when there is more than one group, so a page\n\t\t * with several registers is not one long card.\n\t\t *\n\t\t * @type {boolean|null}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\tcollapseGroups: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Auto-match schema titles to type slugs on register change */\n\t\tautoMatch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** UI labels (i18n) */\n\t\tlabels: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({\n\t\t\t\tregister: t('nextcloud-vue', 'Register'),\n\t\t\t\tschema: t('nextcloud-vue', 'Schema'),\n\t\t\t\tconfigured: t('nextcloud-vue', 'Configured'),\n\t\t\t\tnotConfigured: t('nextcloud-vue', 'Not configured'),\n\t\t\t\tnoSchemas: t('nextcloud-vue', 'No schemas available in this register'),\n\t\t\t\tselectRegister: t('nextcloud-vue', 'Select a register'),\n\t\t\t\tselectSchema: t('nextcloud-vue', 'Select a schema'),\n\t\t\t\tallConfigured: t('nextcloud-vue', 'All types configured'),\n\t\t\t\tpartiallyConfigured: t('nextcloud-vue', 'configured'),\n\t\t\t}),\n\t\t},\n\t},\n\n\temits: ['update:configuration', 'save', 'reimport'],\n\n\tdata() {\n\t\treturn {\n\t\t\t// Fetched data\n\t\t\tregisters: [],\n\t\t\tschemasByRegister: {},\n\t\t\tregistersLoading: false,\n\t\t\tregistersError: null,\n\t\t\t// Local state\n\t\t\tlocalConfig: {},\n\t\t\texpandedRows: {},\n\t\t\t// The groups opened by the reader, by index.\n\t\t\topenGroups: {},\n\t\t\tuid: ++mappingCount,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** Register options for NcSelect */\n\t\tregisterSelectOptions() {\n\t\t\treturn this.registers.map((r) => ({\n\t\t\t\tlabel: r.title || r.slug || t('nextcloud-vue', 'Register {id}', { id: r.id }),\n\t\t\t\tvalue: String(r.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether the groups open and close.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\tgroupsCollapsible() {\n\t\t\treturn this.collapseGroups === null ? this.groups.length > 1 : this.collapseGroups\n\t\t},\n\n\t\t/** Whether local config differs from prop */\n\t\thasChanges() {\n\t\t\treturn JSON.stringify(this.localConfig) !== JSON.stringify(this.configuration)\n\t\t},\n\t},\n\n\twatch: {\n\t\tconfiguration: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.localConfig = { ...newVal }\n\t\t\t},\n\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait this.loadRegisters()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * Whether a group's body shows.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {boolean}\n\t\t */\n\t\tisGroupOpen(groupIdx) {\n\t\t\treturn !this.groupsCollapsible || this.openGroups[groupIdx] === true\n\t\t},\n\n\t\t/**\n\t\t * Open a closed group, or close an open one.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {void}\n\t\t * @spec openspec/changes/register-mapping-collapsed-groups/specs/register-mapping/spec.md#requirement-register-groups-start-closed-with-their-count\n\t\t */\n\t\ttoggleGroup(groupIdx) {\n\t\t\tthis.openGroups = { ...this.openGroups, [groupIdx]: !this.isGroupOpen(groupIdx) }\n\t\t},\n\n\t\t/**\n\t\t * The id of a group's body, for the header's `aria-controls`.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string}\n\t\t */\n\t\tgroupBodyId(groupIdx) {\n\t\t\treturn `cn-register-mapping-${this.uid}-group-${groupIdx}`\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a group's register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {string} Config key\n\t\t */\n\t\tregisterConfigKey(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tif (group.registerConfigKey) {\n\t\t\t\treturn group.registerConfigKey\n\t\t\t}\n\t\t\tif (this.groups.length === 1) {\n\t\t\t\treturn 'register'\n\t\t\t}\n\t\t\treturn group.name.toLowerCase().replace(/[^a-z0-9]+/g, '_') + '_register'\n\t\t},\n\n\t\t/**\n\t\t * Get the config key for a type's schema.\n\t\t *\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Config key\n\t\t */\n\t\tschemaConfigKey(type) {\n\t\t\treturn type.configKey || type.slug + '_schema'\n\t\t},\n\n\t\t/**\n\t\t * Get the selected register option for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedRegister(groupIdx) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.registerSelectOptions.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the selected schema option for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {object|null} NcSelect option\n\t\t */\n\t\tselectedSchema(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = String(this.localConfig[key] || '')\n\t\t\tif (!value) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\t\t\treturn options.find((o) => o.value === value) || null\n\t\t},\n\n\t\t/**\n\t\t * Get the schema value (ID) for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema ID or empty string\n\t\t */\n\t\tschemaValue(groupIdx, type) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\treturn this.localConfig[key] || ''\n\t\t},\n\n\t\t/**\n\t\t * Get the display label for a type's current schema.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @return {string} Schema label or empty string\n\t\t */\n\t\tschemaLabel(groupIdx, type) {\n\t\t\tconst selected = this.selectedSchema(groupIdx, type)\n\t\t\tif (selected) {\n\t\t\t\treturn selected.label\n\t\t\t}\n\t\t\tconst value = this.schemaValue(groupIdx, type)\n\t\t\treturn value ? t('nextcloud-vue', 'Schema {id}', { id: value }) : ''\n\t\t},\n\n\t\t/**\n\t\t * Get schema options for a group's selected register.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {Array<{label: string, value: string}>} NcSelect options\n\t\t */\n\t\tschemaSelectOptions(groupIdx) {\n\t\t\tconst reg = this.selectedRegister(groupIdx)\n\t\t\tif (!reg) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst schemas = this.schemasByRegister[reg.value] || []\n\t\t\treturn schemas.map((s) => ({\n\t\t\t\tlabel: s.title || s.slug || t('nextcloud-vue', 'Schema {id}', { id: s.id }),\n\t\t\t\tvalue: String(s.id),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Count configured types in a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @return {number} Count\n\t\t */\n\t\tconfiguredCount(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\treturn group.types.filter((type) => !!this.schemaValue(groupIdx, type)).length\n\t\t},\n\n\t\t/**\n\t\t * Check if a type row is expanded.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t * @return {boolean}\n\t\t */\n\t\tisExpanded(groupIdx, slug) {\n\t\t\treturn !!this.expandedRows[groupIdx + '-' + slug]\n\t\t},\n\n\t\t/**\n\t\t * Toggle a type row expansion.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {string} slug Type slug\n\t\t */\n\t\ttoggleExpand(groupIdx, slug) {\n\t\t\tconst key = groupIdx + '-' + slug\n\t\t\tthis.expandedRows = {\n\t\t\t\t...this.expandedRows,\n\t\t\t\t[key]: !this.expandedRows[key],\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle register selection change for a group.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\tasync handleRegisterChange(groupIdx, option) {\n\t\t\tconst key = this.registerConfigKey(groupIdx)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\n\t\t\t// Clear schema selections for this group\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: '' }\n\t\t\t}\n\n\t\t\t// Fetch schemas for the new register\n\t\t\tif (value) {\n\t\t\t\tawait this.loadSchemasForRegister(value)\n\n\t\t\t\t// Auto-match schemas\n\t\t\t\tif (this.autoMatch) {\n\t\t\t\t\tthis.autoMatchSchemas(groupIdx)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Handle schema selection change for a type.\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t * @param {object} type Type definition\n\t\t * @param {object|null} option NcSelect option\n\t\t */\n\t\thandleSchemaChange(groupIdx, type, option) {\n\t\t\tconst key = this.schemaConfigKey(type)\n\t\t\tconst value = option?.value || ''\n\n\t\t\tthis.localConfig = { ...this.localConfig, [key]: value }\n\t\t\tthis.$emit('update:configuration', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Auto-match schema titles to type slugs/labels (case-insensitive).\n\t\t *\n\t\t * @param {number} groupIdx Group index\n\t\t */\n\t\tautoMatchSchemas(groupIdx) {\n\t\t\tconst group = this.groups[groupIdx]\n\t\t\tconst options = this.schemaSelectOptions(groupIdx)\n\n\t\t\tfor (const type of group.types) {\n\t\t\t\tconst schemaKey = this.schemaConfigKey(type)\n\t\t\t\t// Skip if already has a value\n\t\t\t\tif (this.localConfig[schemaKey]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst slug = type.slug.toLowerCase()\n\t\t\t\tconst label = type.label.toLowerCase()\n\n\t\t\t\tconst match = options.find((o) => {\n\t\t\t\t\tconst optLabel = o.label.toLowerCase()\n\t\t\t\t\treturn optLabel === slug || optLabel === label\n\t\t\t\t\t\t|| optLabel.includes(slug) || slug.includes(optLabel)\n\t\t\t\t})\n\n\t\t\t\tif (match) {\n\t\t\t\t\tthis.localConfig = { ...this.localConfig, [schemaKey]: match.value }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** Emit save event with current config */\n\t\thandleSave() {\n\t\t\tthis.$emit('save', { ...this.localConfig })\n\t\t},\n\n\t\t/**\n\t\t * Fetch all registers from OpenRegister API.\n\t\t */\n\t\tasync loadRegisters() {\n\t\t\tthis.registersLoading = true\n\t\t\tthis.registersError = null\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl('/apps/openregister/api/registers?_extend[]=schemas'), {\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthis.registersError = t('nextcloud-vue', 'The registers could not be loaded: {reason}', { reason: response.statusText || response.status })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst results = data.results || data\n\t\t\t\tthis.registers = Array.isArray(results) ? results : []\n\n\t\t\t\t// Cache expanded schemas\n\t\t\t\tfor (const reg of this.registers) {\n\t\t\t\t\tif (Array.isArray(reg.schemas) && reg.schemas.length > 0) {\n\t\t\t\t\t\tconst schemas = reg.schemas.filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\t\t\tif (schemas.length > 0) {\n\t\t\t\t\t\t\tthis.schemasByRegister = {\n\t\t\t\t\t\t\t\t...this.schemasByRegister,\n\t\t\t\t\t\t\t\t[String(reg.id)]: schemas,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.registersError = error.message || t('nextcloud-vue', 'The registers could not be loaded: {reason}', { reason: t('nextcloud-vue', 'no connection') })\n\t\t\t} finally {\n\t\t\t\tthis.registersLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch schemas for a specific register.\n\t\t *\n\t\t * @param {string} registerId Register ID\n\t\t */\n\t\tasync loadSchemasForRegister(registerId) {\n\t\t\tconst id = String(registerId)\n\n\t\t\t// Return cached\n\t\t\tif (this.schemasByRegister[id]?.length > 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(\n\t\t\t\t\tprefixUrl(`/apps/openregister/api/registers/${encodeURIComponent(id)}?_extend[]=schemas`),\n\t\t\t\t\t{ method: 'GET', headers: buildHeaders() },\n\t\t\t\t)\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json()\n\t\t\t\tconst schemas = (data.schemas || []).filter((s) => s && typeof s === 'object' && s.id)\n\t\t\t\tthis.schemasByRegister = { ...this.schemasByRegister, [id]: schemas }\n\t\t\t} catch {\n\t\t\t\t// Silently fail — register already selected, schemas just won't populate\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-register-mapping__group {\n\tmargin-bottom: 24px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: 20px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__group:last-child {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: 12px;\n}\n\n.cn-register-mapping__group-heading {\n\tmargin: 0 0 12px;\n\tfont: inherit;\n}\n\n.cn-register-mapping__group--collapsed .cn-register-mapping__group-heading {\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-toggle {\n\tbox-sizing: border-box;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\twidth: 100%;\n\tmin-height: 44px;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\ttext-align: start;\n\tcursor: pointer;\n}\n\n.cn-register-mapping__group-toggle:focus-visible {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n\tborder-radius: var(--border-radius);\n}\n\n.cn-register-mapping__group-chevron {\n\tdisplay: inline-flex;\n\tflex: none;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-toggle .cn-register-mapping__group-header {\n\tflex: 1 1 auto;\n\tflex-wrap: wrap;\n\tgap: 4px 12px;\n\tmin-width: 0;\n\tmargin-bottom: 0;\n}\n\n.cn-register-mapping__group-title {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tmargin: 0;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__group-status {\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__group-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 12px 0;\n}\n\n.cn-register-mapping__register-select {\n\tmargin-bottom: 16px;\n\tmax-width: 400px;\n}\n\n.cn-register-mapping__type-list {\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius);\n\toverflow: hidden;\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-list-header {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 8px 16px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.5px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 40px 32px;\n\talign-items: center;\n\tpadding: 10px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tcursor: pointer;\n\ttransition: background-color 0.15s ease;\n}\n\n.cn-register-mapping__type-row:hover {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-row--expanded {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-register-mapping__type-name {\n\tfont-weight: 500;\n\tcolor: var(--color-main-text);\n}\n\n.cn-register-mapping__type-schema {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-register-mapping__type-status {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n\n.cn-register-mapping__type-chevron {\n\tdisplay: flex;\n\tjustify-content: center;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-register-mapping__status-dot {\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 10px;\n\tborder-radius: 50%;\n}\n\n.cn-register-mapping__status-dot--configured {\n\tbackground-color: var(--color-success);\n}\n\n.cn-register-mapping__status-dot--unconfigured {\n\tbackground-color: var(--color-warning);\n}\n\n.cn-register-mapping__type-detail {\n\tpadding: 12px 16px 16px;\n\tborder-bottom: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n}\n\n.cn-register-mapping__type-description {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n\tmargin: 0 0 8px 0;\n}\n\n/* Slide transition */\n.slide-enter-active,\n.slide-leave-active {\n\ttransition: all 0.2s ease;\n\tmax-height: 200px;\n\toverflow: hidden;\n}\n\n.slide-enter,\n.slide-leave-to {\n\tmax-height: 0;\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\topacity: 0;\n}\n\n/* Last row in list should not have bottom border */\n.cn-register-mapping__type-list > :last-child {\n\tborder-bottom: none;\n}\n\n@media (max-width: 768px) {\n\t.cn-register-mapping__type-list-header {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__type-row {\n\t\tgrid-template-columns: 1fr auto 32px;\n\t}\n\n\t.cn-register-mapping__type-schema {\n\t\tdisplay: none;\n\t}\n\n\t.cn-register-mapping__register-select {\n\t\tmax-width: none;\n\t}\n}\n</style>\n"],"names":["_createBlock","_createTextVNode","_toDisplayString","_renderSlot","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createElementVNode","_createVNode","_Transition","_vShow"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import script from './CnSettingsPage.vue2.js';
|
|
|
2
2
|
import { render } from './CnSettingsPage.vue3.js';
|
|
3
3
|
|
|
4
4
|
script.render = render;
|
|
5
|
-
script.__scopeId = "data-v-
|
|
5
|
+
script.__scopeId = "data-v-04e49f77";
|
|
6
6
|
const __sfc_main = script;
|
|
7
7
|
|
|
8
8
|
export { __sfc_main as default };
|
|
@@ -4,6 +4,7 @@ import { NcButton, NcCheckboxRadioSwitch, NcLoadingIcon, NcSelect, NcTextField }
|
|
|
4
4
|
import ContentSave from 'vue-material-design-icons/ContentSave.vue';
|
|
5
5
|
import __sfc_main from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
|
|
6
6
|
import __sfc_main$5 from '../CnRegisterMapping/CnRegisterMapping.vue.js';
|
|
7
|
+
import __sfc_main$6 from '../CnToggleTableWidget/CnToggleTableWidget.vue.js';
|
|
7
8
|
import __sfc_main$4 from '../CnVersionInfoCard/CnVersionInfoCard.vue.js';
|
|
8
9
|
import { useLook } from '../../composables/useLook.js';
|
|
9
10
|
import { prefixUrl } from '../../utils/headers.js';
|
|
@@ -41,6 +42,8 @@ const COMPONENT_DISCRIMINATOR = Symbol('cn-settings-component-widget');
|
|
|
41
42
|
const BUILTIN_SETTINGS_WIDGETS = Object.freeze({
|
|
42
43
|
'version-info': __sfc_main$4,
|
|
43
44
|
'register-mapping': __sfc_main$5,
|
|
45
|
+
// Rows with a switch: objects (`bind.mode: 'each'`) or a config map (`'map'`).
|
|
46
|
+
'toggle-table': __sfc_main$6,
|
|
44
47
|
component: COMPONENT_DISCRIMINATOR,
|
|
45
48
|
});
|
|
46
49
|
|
|
@@ -68,7 +71,8 @@ const BUILTIN_SETTINGS_WIDGETS = Object.freeze({
|
|
|
68
71
|
* - `widgets[]` — ordered list of widgets. Each entry has a `type`
|
|
69
72
|
* string and optional `props`. Built-in widget types resolve
|
|
70
73
|
* first (`version-info` → `CnVersionInfoCard`, `register-mapping`
|
|
71
|
-
* → `CnRegisterMapping`);
|
|
74
|
+
* → `CnRegisterMapping`, `toggle-table` → `CnToggleTableWidget`);
|
|
75
|
+
* unknown types fall back to the
|
|
72
76
|
* `customComponents` registry.
|
|
73
77
|
*
|
|
74
78
|
* Widget events (e.g. CnRegisterMapping's `@save`, CnVersionInfoCard's
|