@conduction/nextcloud-vue 2.119.0 → 2.120.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.
Files changed (126) hide show
  1. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js +9 -0
  2. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js.map +1 -0
  3. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js +226 -0
  4. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js.map +1 -0
  5. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js +211 -0
  6. package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js.map +1 -0
  7. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js +9 -0
  8. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js.map +1 -0
  9. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js +64 -0
  10. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js.map +1 -0
  11. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js +89 -0
  12. package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js.map +1 -0
  13. package/dist/esm/components/CnIcon/semanticIcons.js +2 -2
  14. package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
  15. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js +9 -0
  16. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js.map +1 -0
  17. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js +257 -0
  18. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js.map +1 -0
  19. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js +266 -0
  20. package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js.map +1 -0
  21. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue.js +1 -1
  22. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js +14 -7
  23. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js.map +1 -1
  24. package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue3.js.map +1 -1
  25. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js +9 -0
  26. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js.map +1 -0
  27. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js +278 -0
  28. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js.map +1 -0
  29. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js +128 -0
  30. package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js.map +1 -0
  31. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js +10 -0
  32. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js.map +1 -0
  33. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js +944 -0
  34. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js.map +1 -0
  35. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js +276 -0
  36. package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js.map +1 -0
  37. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js +9 -0
  38. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js.map +1 -0
  39. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js +354 -0
  40. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js.map +1 -0
  41. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js +392 -0
  42. package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js.map +1 -0
  43. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js +9 -0
  44. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js.map +1 -0
  45. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js +180 -0
  46. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js.map +1 -0
  47. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js +208 -0
  48. package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js.map +1 -0
  49. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js +9 -0
  50. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js.map +1 -0
  51. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js +244 -0
  52. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js.map +1 -0
  53. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js +76 -0
  54. package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js.map +1 -0
  55. package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js +290 -0
  56. package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js.map +1 -0
  57. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +9 -0
  58. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js.map +1 -0
  59. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +448 -0
  60. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -0
  61. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +303 -0
  62. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -0
  63. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +1 -1
  64. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +19 -2
  65. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
  66. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js +73 -62
  67. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +6 -0
  69. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  70. package/dist/esm/index.js +5 -0
  71. package/dist/esm/index.js.map +1 -1
  72. package/dist/esm/l10n/en.json.js +166 -1
  73. package/dist/esm/l10n/en.json.js.map +1 -1
  74. package/dist/esm/l10n/nl.json.js +166 -1
  75. package/dist/esm/l10n/nl.json.js.map +1 -1
  76. package/dist/esm/library-style.js +1 -1
  77. package/dist/esm/nextcloud-vue.css +889 -101
  78. package/dist/esm/utils/aiFeatures.js +245 -0
  79. package/dist/esm/utils/aiFeatures.js.map +1 -0
  80. package/dist/esm/utils/aiSuggestionTracker.js +182 -0
  81. package/dist/esm/utils/aiSuggestionTracker.js.map +1 -0
  82. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  83. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  84. package/dist/esm/utils/objectPermissions.js +552 -0
  85. package/dist/esm/utils/objectPermissions.js.map +1 -0
  86. package/dist/esm/utils/objectTranslations.js +180 -0
  87. package/dist/esm/utils/objectTranslations.js.map +1 -0
  88. package/dist/esm/utils/stateMachineValidation.js +254 -0
  89. package/dist/esm/utils/stateMachineValidation.js.map +1 -0
  90. package/dist/esm/utils/widgetDispatch.js +3 -1
  91. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  92. package/dist/nextcloud-vue.cjs.js +20052 -13138
  93. package/dist/nextcloud-vue.cjs.js.map +2 -2
  94. package/dist/nextcloud-vue.css +889 -101
  95. package/l10n/en.json +166 -1
  96. package/l10n/nl.json +166 -1
  97. package/package.json +1 -1
  98. package/src/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue +416 -0
  99. package/src/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue +136 -0
  100. package/src/components/CnAiFeaturesWidget/__tests__/CnAiFeaturesWidget.spec.js +213 -0
  101. package/src/components/CnAiFeaturesWidget/index.js +14 -0
  102. package/src/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue +499 -0
  103. package/src/components/CnObjectPermissionsTab/__tests__/CnObjectPermissionsTab.spec.js +186 -0
  104. package/src/components/CnObjectPermissionsTab/index.js +13 -0
  105. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +8 -1
  106. package/src/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue +424 -0
  107. package/src/components/CnObjectTranslationsWidget/__tests__/CnObjectTranslationsWidget.spec.js +189 -0
  108. package/src/components/CnObjectTranslationsWidget/index.js +13 -0
  109. package/src/components/CnStateMachineEditor/CnStateMachineEditor.vue +1332 -0
  110. package/src/components/CnStateMachineEditor/CnStateMachineFields.vue +791 -0
  111. package/src/components/CnStateMachineEditor/CnStateMachineNode.vue +442 -0
  112. package/src/components/CnStateMachineEditor/CnStateMachinePanel.vue +326 -0
  113. package/src/components/CnStateMachineEditor/index.js +8 -0
  114. package/src/components/CnStateMachineEditor/stateMachineFields.js +287 -0
  115. package/src/components/CnTimelineWidget/CnTimelineManage.vue +827 -0
  116. package/src/components/CnTimelineWidget/CnTimelineWidget.vue +29 -3
  117. package/src/components/CnWidgetGrid/builtInWidgets.js +6 -0
  118. package/src/components/index.js +4 -0
  119. package/src/index.js +5 -0
  120. package/src/utils/aiFeatures.js +241 -0
  121. package/src/utils/aiSuggestionTracker.js +178 -0
  122. package/src/utils/libraryWidgetKeys.js +1 -0
  123. package/src/utils/objectPermissions.js +548 -0
  124. package/src/utils/objectTranslations.js +176 -0
  125. package/src/utils/stateMachineValidation.js +250 -0
  126. package/src/utils/widgetDispatch.js +3 -1
@@ -0,0 +1,354 @@
1
+ import { translate } from '@nextcloud/l10n';
2
+ import { NcButton } from '@nextcloud/vue';
3
+ import ArrowDown from 'vue-material-design-icons/ArrowDown.vue';
4
+ import ArrowUp from 'vue-material-design-icons/ArrowUp.vue';
5
+ import ChevronDown from 'vue-material-design-icons/ChevronDown.vue';
6
+ import ChevronRight from 'vue-material-design-icons/ChevronRight.vue';
7
+ import Close from 'vue-material-design-icons/Close.vue';
8
+ import DragVertical from 'vue-material-design-icons/DragVertical.vue';
9
+ import { newListItem } from './stateMachineFields.js';
10
+
11
+ /**
12
+ * Renders field descriptors against one object of a property panel's copy.
13
+ *
14
+ * Every write goes through the panel's injected `set`, so the panel owns the
15
+ * copy and hears each change. Recursive for groups, rows and typed lists.
16
+ */
17
+ var script = {
18
+ name: 'CnStateMachineFields',
19
+
20
+ components: { NcButton, ArrowDown, ArrowUp, ChevronDown, ChevronRight, Close, DragVertical },
21
+
22
+ inject: ['cnStateMachinePanel'],
23
+
24
+ props: {
25
+ /** The field descriptors to render. */
26
+ fields: {
27
+ type: Array,
28
+ default: () => [],
29
+ },
30
+
31
+ /** The object of the panel's copy these fields edit. */
32
+ target: {
33
+ type: Object,
34
+ required: true,
35
+ },
36
+
37
+ /** Where `target` sits in the copy, for ids and optional-group state. */
38
+ path: {
39
+ type: String,
40
+ default: '',
41
+ },
42
+
43
+ /** Disable every control. */
44
+ disabled: {
45
+ type: Boolean,
46
+ default: false,
47
+ },
48
+
49
+ /** Lay the fields out on one line. */
50
+ row: {
51
+ type: Boolean,
52
+ default: false,
53
+ },
54
+ },
55
+
56
+ data() {
57
+ return {
58
+ open: {},
59
+ dragIndex: null,
60
+ dragKey: null,
61
+ }
62
+ },
63
+
64
+ computed: {
65
+ /**
66
+ * @return {object} The owning panel's API.
67
+ */
68
+ panel() {
69
+ return this.cnStateMachinePanel
70
+ },
71
+ },
72
+
73
+ methods: {
74
+ t: translate,
75
+
76
+ /**
77
+ * @param {object} field A descriptor.
78
+ * @return {boolean} Whether its controls are disabled.
79
+ */
80
+ isDisabled(field) {
81
+ return this.disabled || (field.lockable === true && this.panel.locked === true)
82
+ },
83
+
84
+ /**
85
+ * @param {object} field A descriptor.
86
+ * @return {string} The path of the object a group or list edits.
87
+ */
88
+ childPath(field) {
89
+ if (!field.key) {
90
+ return this.path
91
+ }
92
+ return this.path ? `${this.path}.${field.key}` : field.key
93
+ },
94
+
95
+ /**
96
+ * @param {object} field A descriptor.
97
+ * @param {string} [suffix] A part name.
98
+ * @return {string} A DOM id unique within the editor.
99
+ */
100
+ idFor(field, suffix = '') {
101
+ const raw = [this.panel.uid, this.childPath(field) || field.type, suffix].filter(Boolean).join('-');
102
+ return raw.replace(/[^A-Za-z0-9_-]/g, '-')
103
+ },
104
+
105
+ /**
106
+ * @param {object} field A descriptor.
107
+ * @return {string|null} The width modifier class.
108
+ */
109
+ widthClass(field) {
110
+ return field.width === 'narrow' ? 'cn-sm-field--narrow' : null
111
+ },
112
+
113
+ /**
114
+ * @param {object} field A collapsible group.
115
+ * @return {boolean} Whether it is open.
116
+ */
117
+ isOpen(field) {
118
+ const key = this.childPath(field) || field.label;
119
+ return this.open[key] ?? field.open === true
120
+ },
121
+
122
+ /**
123
+ * @param {object} field A collapsible group.
124
+ * @return {void}
125
+ */
126
+ toggleOpen(field) {
127
+ const key = this.childPath(field) || field.label;
128
+ this.open = { ...this.open, [key]: !this.isOpen(field) };
129
+ },
130
+
131
+ /**
132
+ * @param {object} field A text or number descriptor.
133
+ * @param {string} raw The input's value.
134
+ * @return {void}
135
+ */
136
+ onInput(field, raw) {
137
+ if (field.type === 'number') {
138
+ this.panel.set(this.target, field.key, raw === '' ? null : Number(raw));
139
+ return
140
+ }
141
+ this.panel.set(this.target, field.key, raw);
142
+ },
143
+
144
+ /**
145
+ * @param {object} field A select descriptor.
146
+ * @return {Array<object>} Its options, the empty option first.
147
+ */
148
+ selectOptions(field) {
149
+ const options = this.panel.optionsOf(field);
150
+ if (field.emptyOption) {
151
+ return [{ value: field.emptyOption.value ?? null, label: this.panel.tr(field.emptyOption.label || '') }, ...options]
152
+ }
153
+ return options
154
+ },
155
+
156
+ /**
157
+ * @param {unknown} a One value.
158
+ * @param {unknown} b Another.
159
+ * @return {boolean} Whether they are the same option, treating null and undefined alike.
160
+ */
161
+ sameValue(a, b) {
162
+ return (a ?? null) === (b ?? null)
163
+ },
164
+
165
+ /**
166
+ * @param {object} field A select descriptor.
167
+ * @param {string} index The chosen option's index.
168
+ * @return {void}
169
+ */
170
+ onSelect(field, index) {
171
+ const option = this.selectOptions(field)[Number(index)];
172
+ this.panel.set(this.target, field.key, option ? option.value : null);
173
+ },
174
+
175
+ /**
176
+ * @param {object} field A checkboxes descriptor.
177
+ * @param {unknown} value The option toggled.
178
+ * @return {void}
179
+ */
180
+ toggleOption(field, value) {
181
+ const current = [...(this.target[field.key] || [])];
182
+ const at = current.indexOf(value);
183
+ if (at >= 0) {
184
+ current.splice(at, 1);
185
+ } else {
186
+ current.push(value);
187
+ }
188
+ this.panel.set(this.target, field.key, current);
189
+ },
190
+
191
+ /**
192
+ * @param {object} field A list descriptor.
193
+ * @param {unknown} item An entry.
194
+ * @param {number} index Its index.
195
+ * @return {string} A stable key for the entry.
196
+ */
197
+ itemKey(field, item, index) {
198
+ if (field.idKey && item && typeof item === 'object' && item[field.idKey] !== undefined) {
199
+ return String(item[field.idKey])
200
+ }
201
+ return `${field.key}-${index}`
202
+ },
203
+
204
+ /**
205
+ * @param {object} field A list descriptor.
206
+ * @param {unknown} item An entry.
207
+ * @return {string} The text the entry's input shows.
208
+ */
209
+ itemText(field, item) {
210
+ if (field.itemType === 'object') {
211
+ return (item && item[field.itemKey || 'label']) ?? ''
212
+ }
213
+ return item ?? ''
214
+ },
215
+
216
+ /**
217
+ * @param {object} field A list descriptor.
218
+ * @param {number} index The entry.
219
+ * @param {string} value The new text.
220
+ * @return {void}
221
+ */
222
+ setItemText(field, index, value) {
223
+ const list = this.target[field.key];
224
+ if (field.itemType === 'object') {
225
+ this.panel.set(list[index], field.itemKey || 'label', value);
226
+ return
227
+ }
228
+ this.panel.set(list, index, value);
229
+ },
230
+
231
+ /**
232
+ * @param {object} field A list descriptor.
233
+ * @param {number} index The entry.
234
+ * @return {string} The entry input's accessible name.
235
+ */
236
+ itemAriaLabel(field, index) {
237
+ const label = this.panel.tr(field.itemLabel || field.label);
238
+ return this.target[field.key].length > 1 ? `${label} ${index + 1}` : label
239
+ },
240
+
241
+ /**
242
+ * @param {object} field A list descriptor.
243
+ * @param {number} index The entry.
244
+ * @return {string} The remove button's accessible name.
245
+ */
246
+ removeLabel(field, index) {
247
+ const label = this.panel.tr(field.removeLabel) || translate('nextcloud-vue', 'Remove');
248
+ return this.target[field.key].length > 1 ? `${label} ${index + 1}` : label
249
+ },
250
+
251
+ /**
252
+ * @param {object} field A list descriptor.
253
+ * @param {number} index The entry.
254
+ * @param {string} direction `up` or `down`.
255
+ * @return {string} The move button's accessible name.
256
+ */
257
+ moveLabel(field, index, direction) {
258
+ const label = direction === 'up' ? translate('nextcloud-vue', 'Move up') : translate('nextcloud-vue', 'Move down');
259
+ return `${label}: ${this.itemText(field, this.target[field.key][index]) || index + 1}`
260
+ },
261
+
262
+ /**
263
+ * @param {object} field A list descriptor.
264
+ * @return {void}
265
+ */
266
+ addItem(field) {
267
+ this.panel.push(this.target[field.key], newListItem(field));
268
+ },
269
+
270
+ /**
271
+ * @param {object} field A list descriptor.
272
+ * @param {number} index The entry.
273
+ * @return {void}
274
+ */
275
+ removeItem(field, index) {
276
+ this.panel.splice(this.target[field.key], index);
277
+ },
278
+
279
+ /**
280
+ * @param {object} field A list descriptor.
281
+ * @param {number} from The entry's index.
282
+ * @param {number} to Its new index.
283
+ * @return {void}
284
+ */
285
+ move(field, from, to) {
286
+ this.panel.move(this.target[field.key], from, to);
287
+ },
288
+
289
+ /**
290
+ * @param {object} field A list descriptor.
291
+ * @param {number} index The dragged entry.
292
+ * @param {DragEvent} event The drag event.
293
+ * @return {void}
294
+ */
295
+ onItemDragStart(field, index, event) {
296
+ if (!field.reorderable || this.isDisabled(field)) {
297
+ return
298
+ }
299
+ this.dragIndex = index;
300
+ this.dragKey = field.key;
301
+ if (event.dataTransfer) {
302
+ event.dataTransfer.effectAllowed = 'move';
303
+ event.dataTransfer.setData('text/plain', String(index));
304
+ }
305
+ },
306
+
307
+ /**
308
+ * @param {object} field A list descriptor.
309
+ * @param {number} index The entry dropped on.
310
+ * @return {void}
311
+ */
312
+ onItemDrop(field, index) {
313
+ if (this.dragKey === field.key && this.dragIndex !== null) {
314
+ this.move(field, this.dragIndex, index);
315
+ }
316
+ this.dragIndex = null;
317
+ this.dragKey = null;
318
+ },
319
+
320
+ /**
321
+ * @param {object} field A typed-list descriptor.
322
+ * @return {string} The key holding an entry's type.
323
+ */
324
+ typeKey(field) {
325
+ return field.typeKey || 'type'
326
+ },
327
+
328
+ /**
329
+ * The types an entry can be set to: the offered ones, plus its own when
330
+ * that is one no longer offered, so a stored entry still shows what it is.
331
+ *
332
+ * @param {object} field A typed-list descriptor.
333
+ * @param {object} item The entry.
334
+ * @return {Array<object>} The types.
335
+ */
336
+ typesFor(field, item) {
337
+ const own = item[this.typeKey(field)];
338
+ return (field.types || []).filter((type) => !type.hidden || type.value === own)
339
+ },
340
+
341
+ /**
342
+ * @param {object} field A typed-list descriptor.
343
+ * @param {object} item The entry.
344
+ * @return {Array<object>} The fields of the entry's type.
345
+ */
346
+ fieldsOfType(field, item) {
347
+ const type = (field.types || []).find((candidate) => candidate.value === item[this.typeKey(field)]);
348
+ return type && Array.isArray(type.fields) ? type.fields : []
349
+ },
350
+ },
351
+ };
352
+
353
+ export { script as default };
354
+ //# sourceMappingURL=CnStateMachineFields.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnStateMachineFields.vue2.js","sources":["../../../../src/components/CnStateMachineEditor/CnStateMachineFields.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>\n - SPDX-License-Identifier: EUPL-1.2\n -->\n<template>\n\t<div class=\"cn-sm-fields\" :class=\"{ 'cn-sm-fields--row': row }\">\n\t\t<template v-for=\"(field, fieldIndex) in fields\" :key=\"field.key || `${field.type}-${fieldIndex}`\">\n\t\t\t<!-- One line of fields side by side. -->\n\t\t\t<CnStateMachineFields\n\t\t\t\tv-if=\"field.type === 'row'\"\n\t\t\t\t:fields=\"field.fields\"\n\t\t\t\t:target=\"target\"\n\t\t\t\t:path=\"path\"\n\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\trow />\n\n\t\t\t<!-- A group: collapsible, switchable, or a nested object. -->\n\t\t\t<div v-else-if=\"field.type === 'group'\" class=\"cn-sm-group\" :class=\"{ 'cn-sm-group--section': field.section }\">\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"field.collapsible\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-sm-group__toggle\"\n\t\t\t\t\t:aria-expanded=\"isOpen(field) ? 'true' : 'false'\"\n\t\t\t\t\t:aria-controls=\"idFor(field, 'body')\"\n\t\t\t\t\t@click=\"toggleOpen(field)\">\n\t\t\t\t\t<span>{{ panel.tr(field.label) }}</span>\n\t\t\t\t\t<ChevronDown v-if=\"isOpen(field)\" :size=\"18\" />\n\t\t\t\t\t<ChevronRight v-else :size=\"18\" />\n\t\t\t\t</button>\n\t\t\t\t<h4 v-else-if=\"field.label && !field.optional\" class=\"cn-sm-group__heading\">\n\t\t\t\t\t{{ panel.tr(field.label) }}\n\t\t\t\t</h4>\n\n\t\t\t\t<p v-if=\"field.lockable && panel.locked && field.lockedNotice\" class=\"cn-sm-group__notice\" role=\"note\">\n\t\t\t\t\t{{ panel.tr(field.lockedNotice) }}\n\t\t\t\t</p>\n\n\t\t\t\t<div v-if=\"!field.collapsible || isOpen(field)\" :id=\"idFor(field, 'body')\" class=\"cn-sm-group__body\">\n\t\t\t\t\t<div v-if=\"field.optional\" class=\"cn-sm-field cn-sm-field--check\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:id=\"idFor(field, 'enabled')\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t:checked=\"panel.isEnabled(childPath(field))\"\n\t\t\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t\t\t@change=\"panel.setEnabled(childPath(field), $event.target.checked)\">\n\t\t\t\t\t\t<label :for=\"idFor(field, 'enabled')\">{{ panel.tr(field.toggleLabel || field.label) }}</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CnStateMachineFields\n\t\t\t\t\t\tv-if=\"!field.optional || panel.isEnabled(childPath(field))\"\n\t\t\t\t\t\t:class=\"{ 'cn-sm-fields--boxed': field.optional }\"\n\t\t\t\t\t\t:fields=\"field.fields\"\n\t\t\t\t\t\t:target=\"field.key ? target[field.key] : target\"\n\t\t\t\t\t\t:path=\"childPath(field)\"\n\t\t\t\t\t\t:disabled=\"isDisabled(field)\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- A list of strings or of objects with one edited text. -->\n\t\t\t<fieldset v-else-if=\"field.type === 'list'\" class=\"cn-sm-list\" :class=\"{ 'cn-sm-list--section': field.section }\">\n\t\t\t\t<legend class=\"cn-sm-field__label\" :class=\"{ 'cn-sm-list__legend--section': field.section }\">\n\t\t\t\t\t{{ panel.tr(field.label) }}\n\t\t\t\t</legend>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(item, index) in target[field.key]\"\n\t\t\t\t\t:key=\"itemKey(field, item, index)\"\n\t\t\t\t\tclass=\"cn-sm-list__item\"\n\t\t\t\t\t:draggable=\"field.reorderable && !isDisabled(field) ? 'true' : 'false'\"\n\t\t\t\t\t@dragstart=\"onItemDragStart(field, index, $event)\"\n\t\t\t\t\t@dragover.prevent\n\t\t\t\t\t@drop.stop.prevent=\"onItemDrop(field, index)\">\n\t\t\t\t\t<span v-if=\"field.reorderable\" class=\"cn-sm-list__handle\" aria-hidden=\"true\">\n\t\t\t\t\t\t<DragVertical :size=\"16\" />\n\t\t\t\t\t</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclass=\"cn-sm-field__input\"\n\t\t\t\t\t\t:value=\"itemText(field, item)\"\n\t\t\t\t\t\t:placeholder=\"field.itemLabel ? panel.tr(field.itemLabel) : ''\"\n\t\t\t\t\t\t:aria-label=\"itemAriaLabel(field, index)\"\n\t\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t\t@input=\"setItemText(field, index, $event.target.value)\">\n\t\t\t\t\t<template v-if=\"field.reorderable\">\n\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"isDisabled(field) || index === 0\"\n\t\t\t\t\t\t\t:aria-label=\"moveLabel(field, index, 'up')\"\n\t\t\t\t\t\t\t@click=\"move(field, index, index - 1)\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<ArrowUp :size=\"16\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t:disabled=\"isDisabled(field) || index === target[field.key].length - 1\"\n\t\t\t\t\t\t\t:aria-label=\"moveLabel(field, index, 'down')\"\n\t\t\t\t\t\t\t@click=\"move(field, index, index + 1)\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<ArrowDown :size=\"16\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</template>\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t\t:aria-label=\"removeLabel(field, index)\"\n\t\t\t\t\t\t@click=\"removeItem(field, index)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Close :size=\"16\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t\t<NcButton variant=\"secondary\" :disabled=\"isDisabled(field)\" @click=\"addItem(field)\">\n\t\t\t\t\t{{ panel.tr(field.addLabel) || t('nextcloud-vue', 'Add') }}\n\t\t\t\t</NcButton>\n\t\t\t</fieldset>\n\n\t\t\t<!-- A list of objects whose fields depend on their type. -->\n\t\t\t<fieldset v-else-if=\"field.type === 'typed-list'\" class=\"cn-sm-list\" :class=\"{ 'cn-sm-list--section': field.section }\">\n\t\t\t\t<legend class=\"cn-sm-field__label\" :class=\"{ 'cn-sm-list__legend--section': field.section }\">\n\t\t\t\t\t{{ panel.tr(field.label) }}\n\t\t\t\t</legend>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(item, index) in target[field.key]\"\n\t\t\t\t\t:key=\"itemKey(field, item, index)\"\n\t\t\t\t\tclass=\"cn-sm-list__typed\">\n\t\t\t\t\t<div class=\"cn-sm-field\">\n\t\t\t\t\t\t<label :for=\"idFor(field, `type-${index}`)\" class=\"cn-sm-field__label\">\n\t\t\t\t\t\t\t{{ field.typeLabel ? panel.tr(field.typeLabel) : t('nextcloud-vue', 'Type') }}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t:id=\"idFor(field, `type-${index}`)\"\n\t\t\t\t\t\t\tclass=\"cn-sm-field__input\"\n\t\t\t\t\t\t\t:value=\"item[typeKey(field)]\"\n\t\t\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t\t\t@change=\"panel.set(item, typeKey(field), $event.target.value)\">\n\t\t\t\t\t\t\t<option\n\t\t\t\t\t\t\t\tv-for=\"type in typesFor(field, item)\"\n\t\t\t\t\t\t\t\t:key=\"type.value\"\n\t\t\t\t\t\t\t\t:value=\"type.value\">\n\t\t\t\t\t\t\t\t{{ panel.tr(type.label) }}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CnStateMachineFields\n\t\t\t\t\t\t:fields=\"fieldsOfType(field, item)\"\n\t\t\t\t\t\t:target=\"item\"\n\t\t\t\t\t\t:path=\"`${childPath(field)}.${index}`\"\n\t\t\t\t\t\t:disabled=\"isDisabled(field)\" />\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\tclass=\"cn-sm-list__remove\"\n\t\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t\t:aria-label=\"panel.tr(field.removeLabel) || t('nextcloud-vue', 'Remove')\"\n\t\t\t\t\t\t@click=\"removeItem(field, index)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<Close :size=\"16\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t\t<NcButton variant=\"secondary\" :disabled=\"isDisabled(field)\" @click=\"addItem(field)\">\n\t\t\t\t\t{{ panel.tr(field.addLabel) || t('nextcloud-vue', 'Add') }}\n\t\t\t\t</NcButton>\n\t\t\t</fieldset>\n\n\t\t\t<!-- Several values picked from a set of options. -->\n\t\t\t<fieldset v-else-if=\"field.type === 'checkboxes'\" class=\"cn-sm-list\">\n\t\t\t\t<legend class=\"cn-sm-field__label\">\n\t\t\t\t\t{{ panel.tr(field.label) }}\n\t\t\t\t</legend>\n\t\t\t\t<div v-for=\"(option, index) in panel.optionsOf(field)\" :key=\"String(option.value)\" class=\"cn-sm-field cn-sm-field--check\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:id=\"idFor(field, `option-${index}`)\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t:checked=\"(target[field.key] || []).includes(option.value)\"\n\t\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t\t@change=\"toggleOption(field, option.value)\">\n\t\t\t\t\t<label :for=\"idFor(field, `option-${index}`)\">{{ option.label }}</label>\n\t\t\t\t</div>\n\t\t\t</fieldset>\n\n\t\t\t<!-- A single check box. -->\n\t\t\t<div v-else-if=\"field.type === 'checkbox'\" class=\"cn-sm-field cn-sm-field--check\">\n\t\t\t\t<input\n\t\t\t\t\t:id=\"idFor(field)\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:checked=\"!!target[field.key]\"\n\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t@change=\"panel.set(target, field.key, $event.target.checked)\">\n\t\t\t\t<label :for=\"idFor(field)\">{{ panel.tr(field.label) }}</label>\n\t\t\t</div>\n\n\t\t\t<!-- One value from a set of options. -->\n\t\t\t<div v-else-if=\"field.type === 'select'\" class=\"cn-sm-field\" :class=\"widthClass(field)\">\n\t\t\t\t<label :for=\"idFor(field)\" class=\"cn-sm-field__label\" :class=\"{ 'cn-sm-visually-hidden': field.hideLabel }\">\n\t\t\t\t\t{{ panel.tr(field.label) }}\n\t\t\t\t</label>\n\t\t\t\t<select\n\t\t\t\t\t:id=\"idFor(field)\"\n\t\t\t\t\tclass=\"cn-sm-field__input\"\n\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t@change=\"onSelect(field, $event.target.value)\">\n\t\t\t\t\t<option\n\t\t\t\t\t\tv-for=\"(option, index) in selectOptions(field)\"\n\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t:value=\"String(index)\"\n\t\t\t\t\t\t:selected=\"sameValue(option.value, target[field.key])\">\n\t\t\t\t\t\t{{ option.label }}\n\t\t\t\t\t</option>\n\t\t\t\t</select>\n\t\t\t</div>\n\n\t\t\t<!-- Free text, a longer text, or a number. -->\n\t\t\t<div v-else class=\"cn-sm-field\" :class=\"widthClass(field)\">\n\t\t\t\t<label :for=\"idFor(field)\" class=\"cn-sm-field__label\" :class=\"{ 'cn-sm-visually-hidden': field.hideLabel }\">\n\t\t\t\t\t{{ panel.tr(field.label) }}\n\t\t\t\t</label>\n\t\t\t\t<textarea\n\t\t\t\t\tv-if=\"field.type === 'textarea'\"\n\t\t\t\t\t:id=\"idFor(field)\"\n\t\t\t\t\tclass=\"cn-sm-field__input\"\n\t\t\t\t\t:rows=\"field.rows || 3\"\n\t\t\t\t\t:value=\"target[field.key] ?? ''\"\n\t\t\t\t\t:placeholder=\"field.placeholder ? panel.tr(field.placeholder) : ''\"\n\t\t\t\t\t:aria-describedby=\"field.hint ? idFor(field, 'hint') : undefined\"\n\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t@input=\"panel.set(target, field.key, $event.target.value)\" />\n\t\t\t\t<input\n\t\t\t\t\tv-else\n\t\t\t\t\t:id=\"idFor(field)\"\n\t\t\t\t\tclass=\"cn-sm-field__input\"\n\t\t\t\t\t:type=\"field.type === 'number' ? 'number' : (field.inputType || 'text')\"\n\t\t\t\t\t:min=\"field.min\"\n\t\t\t\t\t:max=\"field.max\"\n\t\t\t\t\t:value=\"target[field.key] ?? ''\"\n\t\t\t\t\t:placeholder=\"field.placeholder ? panel.tr(field.placeholder) : ''\"\n\t\t\t\t\t:aria-describedby=\"field.hint ? idFor(field, 'hint') : undefined\"\n\t\t\t\t\t:disabled=\"isDisabled(field)\"\n\t\t\t\t\t@input=\"onInput(field, $event.target.value)\">\n\t\t\t\t<p v-if=\"field.hint\" :id=\"idFor(field, 'hint')\" class=\"cn-sm-field__hint\">\n\t\t\t\t\t{{ panel.tr(field.hint) }}\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton } from '@nextcloud/vue'\nimport ArrowDown from 'vue-material-design-icons/ArrowDown.vue'\nimport ArrowUp from 'vue-material-design-icons/ArrowUp.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport DragVertical from 'vue-material-design-icons/DragVertical.vue'\nimport { newListItem } from './stateMachineFields.js'\n\n/**\n * Renders field descriptors against one object of a property panel's copy.\n *\n * Every write goes through the panel's injected `set`, so the panel owns the\n * copy and hears each change. Recursive for groups, rows and typed lists.\n */\nexport default {\n\tname: 'CnStateMachineFields',\n\n\tcomponents: { NcButton, ArrowDown, ArrowUp, ChevronDown, ChevronRight, Close, DragVertical },\n\n\tinject: ['cnStateMachinePanel'],\n\n\tprops: {\n\t\t/** The field descriptors to render. */\n\t\tfields: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The object of the panel's copy these fields edit. */\n\t\ttarget: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/** Where `target` sits in the copy, for ids and optional-group state. */\n\t\tpath: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Disable every control. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Lay the fields out on one line. */\n\t\trow: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\topen: {},\n\t\t\tdragIndex: null,\n\t\t\tdragKey: null,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * @return {object} The owning panel's API.\n\t\t */\n\t\tpanel() {\n\t\t\treturn this.cnStateMachinePanel\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * @param {object} field A descriptor.\n\t\t * @return {boolean} Whether its controls are disabled.\n\t\t */\n\t\tisDisabled(field) {\n\t\t\treturn this.disabled || (field.lockable === true && this.panel.locked === true)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A descriptor.\n\t\t * @return {string} The path of the object a group or list edits.\n\t\t */\n\t\tchildPath(field) {\n\t\t\tif (!field.key) {\n\t\t\t\treturn this.path\n\t\t\t}\n\t\t\treturn this.path ? `${this.path}.${field.key}` : field.key\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A descriptor.\n\t\t * @param {string} [suffix] A part name.\n\t\t * @return {string} A DOM id unique within the editor.\n\t\t */\n\t\tidFor(field, suffix = '') {\n\t\t\tconst raw = [this.panel.uid, this.childPath(field) || field.type, suffix].filter(Boolean).join('-')\n\t\t\treturn raw.replace(/[^A-Za-z0-9_-]/g, '-')\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A descriptor.\n\t\t * @return {string|null} The width modifier class.\n\t\t */\n\t\twidthClass(field) {\n\t\t\treturn field.width === 'narrow' ? 'cn-sm-field--narrow' : null\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A collapsible group.\n\t\t * @return {boolean} Whether it is open.\n\t\t */\n\t\tisOpen(field) {\n\t\t\tconst key = this.childPath(field) || field.label\n\t\t\treturn this.open[key] ?? field.open === true\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A collapsible group.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleOpen(field) {\n\t\t\tconst key = this.childPath(field) || field.label\n\t\t\tthis.open = { ...this.open, [key]: !this.isOpen(field) }\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A text or number descriptor.\n\t\t * @param {string} raw The input's value.\n\t\t * @return {void}\n\t\t */\n\t\tonInput(field, raw) {\n\t\t\tif (field.type === 'number') {\n\t\t\t\tthis.panel.set(this.target, field.key, raw === '' ? null : Number(raw))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.panel.set(this.target, field.key, raw)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A select descriptor.\n\t\t * @return {Array<object>} Its options, the empty option first.\n\t\t */\n\t\tselectOptions(field) {\n\t\t\tconst options = this.panel.optionsOf(field)\n\t\t\tif (field.emptyOption) {\n\t\t\t\treturn [{ value: field.emptyOption.value ?? null, label: this.panel.tr(field.emptyOption.label || '') }, ...options]\n\t\t\t}\n\t\t\treturn options\n\t\t},\n\n\t\t/**\n\t\t * @param {unknown} a One value.\n\t\t * @param {unknown} b Another.\n\t\t * @return {boolean} Whether they are the same option, treating null and undefined alike.\n\t\t */\n\t\tsameValue(a, b) {\n\t\t\treturn (a ?? null) === (b ?? null)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A select descriptor.\n\t\t * @param {string} index The chosen option's index.\n\t\t * @return {void}\n\t\t */\n\t\tonSelect(field, index) {\n\t\t\tconst option = this.selectOptions(field)[Number(index)]\n\t\t\tthis.panel.set(this.target, field.key, option ? option.value : null)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A checkboxes descriptor.\n\t\t * @param {unknown} value The option toggled.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleOption(field, value) {\n\t\t\tconst current = [...(this.target[field.key] || [])]\n\t\t\tconst at = current.indexOf(value)\n\t\t\tif (at >= 0) {\n\t\t\t\tcurrent.splice(at, 1)\n\t\t\t} else {\n\t\t\t\tcurrent.push(value)\n\t\t\t}\n\t\t\tthis.panel.set(this.target, field.key, current)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {unknown} item An entry.\n\t\t * @param {number} index Its index.\n\t\t * @return {string} A stable key for the entry.\n\t\t */\n\t\titemKey(field, item, index) {\n\t\t\tif (field.idKey && item && typeof item === 'object' && item[field.idKey] !== undefined) {\n\t\t\t\treturn String(item[field.idKey])\n\t\t\t}\n\t\t\treturn `${field.key}-${index}`\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {unknown} item An entry.\n\t\t * @return {string} The text the entry's input shows.\n\t\t */\n\t\titemText(field, item) {\n\t\t\tif (field.itemType === 'object') {\n\t\t\t\treturn (item && item[field.itemKey || 'label']) ?? ''\n\t\t\t}\n\t\t\treturn item ?? ''\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} index The entry.\n\t\t * @param {string} value The new text.\n\t\t * @return {void}\n\t\t */\n\t\tsetItemText(field, index, value) {\n\t\t\tconst list = this.target[field.key]\n\t\t\tif (field.itemType === 'object') {\n\t\t\t\tthis.panel.set(list[index], field.itemKey || 'label', value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.panel.set(list, index, value)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} index The entry.\n\t\t * @return {string} The entry input's accessible name.\n\t\t */\n\t\titemAriaLabel(field, index) {\n\t\t\tconst label = this.panel.tr(field.itemLabel || field.label)\n\t\t\treturn this.target[field.key].length > 1 ? `${label} ${index + 1}` : label\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} index The entry.\n\t\t * @return {string} The remove button's accessible name.\n\t\t */\n\t\tremoveLabel(field, index) {\n\t\t\tconst label = this.panel.tr(field.removeLabel) || t('nextcloud-vue', 'Remove')\n\t\t\treturn this.target[field.key].length > 1 ? `${label} ${index + 1}` : label\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} index The entry.\n\t\t * @param {string} direction `up` or `down`.\n\t\t * @return {string} The move button's accessible name.\n\t\t */\n\t\tmoveLabel(field, index, direction) {\n\t\t\tconst label = direction === 'up' ? t('nextcloud-vue', 'Move up') : t('nextcloud-vue', 'Move down')\n\t\t\treturn `${label}: ${this.itemText(field, this.target[field.key][index]) || index + 1}`\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @return {void}\n\t\t */\n\t\taddItem(field) {\n\t\t\tthis.panel.push(this.target[field.key], newListItem(field))\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} index The entry.\n\t\t * @return {void}\n\t\t */\n\t\tremoveItem(field, index) {\n\t\t\tthis.panel.splice(this.target[field.key], index)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} from The entry's index.\n\t\t * @param {number} to Its new index.\n\t\t * @return {void}\n\t\t */\n\t\tmove(field, from, to) {\n\t\t\tthis.panel.move(this.target[field.key], from, to)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} index The dragged entry.\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonItemDragStart(field, index, event) {\n\t\t\tif (!field.reorderable || this.isDisabled(field)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.dragIndex = index\n\t\t\tthis.dragKey = field.key\n\t\t\tif (event.dataTransfer) {\n\t\t\t\tevent.dataTransfer.effectAllowed = 'move'\n\t\t\t\tevent.dataTransfer.setData('text/plain', String(index))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A list descriptor.\n\t\t * @param {number} index The entry dropped on.\n\t\t * @return {void}\n\t\t */\n\t\tonItemDrop(field, index) {\n\t\t\tif (this.dragKey === field.key && this.dragIndex !== null) {\n\t\t\t\tthis.move(field, this.dragIndex, index)\n\t\t\t}\n\t\t\tthis.dragIndex = null\n\t\t\tthis.dragKey = null\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A typed-list descriptor.\n\t\t * @return {string} The key holding an entry's type.\n\t\t */\n\t\ttypeKey(field) {\n\t\t\treturn field.typeKey || 'type'\n\t\t},\n\n\t\t/**\n\t\t * The types an entry can be set to: the offered ones, plus its own when\n\t\t * that is one no longer offered, so a stored entry still shows what it is.\n\t\t *\n\t\t * @param {object} field A typed-list descriptor.\n\t\t * @param {object} item The entry.\n\t\t * @return {Array<object>} The types.\n\t\t */\n\t\ttypesFor(field, item) {\n\t\t\tconst own = item[this.typeKey(field)]\n\t\t\treturn (field.types || []).filter((type) => !type.hidden || type.value === own)\n\t\t},\n\n\t\t/**\n\t\t * @param {object} field A typed-list descriptor.\n\t\t * @param {object} item The entry.\n\t\t * @return {Array<object>} The fields of the entry's type.\n\t\t */\n\t\tfieldsOfType(field, item) {\n\t\t\tconst type = (field.types || []).find((candidate) => candidate.value === item[this.typeKey(field)])\n\t\t\treturn type && Array.isArray(type.fields) ? type.fields : []\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-sm-fields {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tmin-width: 0;\n}\n\n.cn-sm-fields--row {\n\tflex-direction: row;\n\talign-items: flex-end;\n\tgap: 8px;\n}\n\n.cn-sm-fields--row > * {\n\tflex: 1 1 0;\n\tmin-width: 0;\n}\n\n.cn-sm-fields--row > .cn-sm-field--narrow {\n\tflex: 0 0 88px;\n}\n\n.cn-sm-fields--boxed {\n\tpadding: 8px;\n\tborder-radius: var(--border-radius, 8px);\n\tbackground: var(--color-background-dark, #ededed);\n}\n\n.cn-sm-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n\tmin-width: 0;\n}\n\n.cn-sm-field--check {\n\tflex-direction: row;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-sm-field__label,\n.cn-sm-field > label {\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tcolor: var(--color-main-text, #222);\n}\n\n.cn-sm-field--check > label {\n\tfont-weight: 400;\n}\n\n.cn-sm-field__input {\n\twidth: 100%;\n\tmin-height: 36px;\n\tbox-sizing: border-box;\n\tpadding: 6px 8px;\n\tborder: 1px solid var(--color-border-maxcontrast, #7f7f7f);\n\tborder-radius: var(--border-radius-element, 8px);\n\tbackground: var(--color-main-background, #fff);\n\tcolor: var(--color-main-text, #222);\n\tfont: inherit;\n}\n\ntextarea.cn-sm-field__input {\n\tresize: vertical;\n}\n\n.cn-sm-field__input:focus-visible {\n\toutline: 2px solid var(--color-primary-element, #0082c9);\n\toutline-offset: 1px;\n}\n\n.cn-sm-field__hint {\n\tmargin: 0;\n\tfont-size: 13px;\n\tcolor: var(--color-text-maxcontrast, #6b6b6b);\n}\n\n.cn-sm-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n\tmin-width: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-sm-list--section,\n.cn-sm-group--section {\n\tpadding-top: 12px;\n\tborder-top: 1px solid var(--color-border, #d0d0d0);\n}\n\n.cn-sm-list legend {\n\tpadding: 0;\n\tmargin-bottom: 6px;\n}\n\n.cn-sm-list__legend--section,\n.cn-sm-group__heading {\n\tmargin: 0 0 6px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-maxcontrast, #6b6b6b);\n}\n\n.cn-sm-list__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 4px;\n}\n\n.cn-sm-list__handle {\n\tdisplay: inline-flex;\n\tcursor: grab;\n\tcolor: var(--color-text-maxcontrast, #6b6b6b);\n}\n\n.cn-sm-list__typed {\n\tposition: relative;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n\tpadding: 8px 44px 8px 8px;\n\tborder-radius: var(--border-radius, 8px);\n\tbackground: var(--color-background-dark, #ededed);\n}\n\n.cn-sm-list__remove {\n\tposition: absolute;\n\ttop: 4px;\n\tinset-inline-end: 4px;\n}\n\n.cn-sm-group {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-sm-group__toggle {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\twidth: 100%;\n\tmin-height: 34px;\n\tpadding: 4px 0;\n\tborder: 0;\n\tbackground: none;\n\tcolor: var(--color-text-maxcontrast, #6b6b6b);\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n\tcursor: pointer;\n}\n\n.cn-sm-group__toggle:focus-visible {\n\toutline: 2px solid var(--color-primary-element, #0082c9);\n\toutline-offset: 2px;\n}\n\n.cn-sm-group__notice {\n\tmargin: 0;\n\tpadding: 8px;\n\tborder-inline-start: 4px solid var(--color-warning, #c28900);\n\tborder-radius: var(--border-radius, 8px);\n\tbackground: var(--color-background-dark, #ededed);\n\tfont-size: 13px;\n}\n\n.cn-sm-group__body {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n\n.cn-sm-visually-hidden {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\toverflow: hidden;\n\tclip-path: inset(50%);\n\twhite-space: nowrap;\n}\n</style>\n"],"names":["t"],"mappings":"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"}