@conduction/nextcloud-vue 2.119.0 → 2.121.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/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js +9 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue.js.map +1 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js +226 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js +211 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js +9 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue.js.map +1 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js +64 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue2.js.map +1 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js +89 -0
- package/dist/esm/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue3.js.map +1 -0
- package/dist/esm/components/CnIcon/semanticIcons.js +2 -2
- package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +53 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +546 -523
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useNamedSource.js +9 -0
- package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
- package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js +9 -0
- package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue.js.map +1 -0
- package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js +257 -0
- package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue2.js.map +1 -0
- package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js +266 -0
- package/dist/esm/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue3.js.map +1 -0
- package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue.js +1 -1
- package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js +14 -7
- package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnObjectSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js +9 -0
- package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js +278 -0
- package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js +128 -0
- package/dist/esm/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js +9 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js.map +1 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js +214 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js.map +1 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js +125 -0
- package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js +9 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js +163 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js +131 -0
- package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js +127 -0
- package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js +9 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js +82 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js +61 -0
- package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js.map +1 -0
- package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js +60 -0
- package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js.map +1 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js +10 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js.map +1 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js +226 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js.map +1 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js +126 -0
- package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js +10 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js +944 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue2.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js +276 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineEditor.vue3.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js +9 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js +354 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue2.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js +392 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineFields.vue3.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js +9 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js +180 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue2.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js +208 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachineNode.vue3.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js +9 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js +244 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue2.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js +76 -0
- package/dist/esm/components/CnStateMachineEditor/CnStateMachinePanel.vue3.js.map +1 -0
- package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js +290 -0
- package/dist/esm/components/CnStateMachineEditor/stateMachineFields.js.map +1 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +9 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js.map +1 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +448 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +303 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +19 -2
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js +73 -62
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +6 -0
- package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +42 -32
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/composables/indexSources.js +116 -16
- package/dist/esm/composables/indexSources.js.map +1 -1
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +207 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +207 -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 +951 -16
- package/dist/esm/utils/aiFeatures.js +245 -0
- package/dist/esm/utils/aiFeatures.js.map +1 -0
- package/dist/esm/utils/aiSuggestionTracker.js +182 -0
- package/dist/esm/utils/aiSuggestionTracker.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +2 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/objectPermissions.js +552 -0
- package/dist/esm/utils/objectPermissions.js.map +1 -0
- package/dist/esm/utils/objectTranslations.js +180 -0
- package/dist/esm/utils/objectTranslations.js.map +1 -0
- package/dist/esm/utils/stateMachineValidation.js +254 -0
- package/dist/esm/utils/stateMachineValidation.js.map +1 -0
- package/dist/esm/utils/widgetDispatch.js +3 -1
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +23038 -14567
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +951 -16
- package/l10n/en.json +207 -1
- package/l10n/nl.json +207 -1
- package/package.json +1 -1
- package/src/components/CnAiFeaturesWidget/CnAiFeaturesWidget.vue +416 -0
- package/src/components/CnAiFeaturesWidget/CnAiSuggestionDecision.vue +136 -0
- package/src/components/CnAiFeaturesWidget/__tests__/CnAiFeaturesWidget.spec.js +213 -0
- package/src/components/CnAiFeaturesWidget/index.js +14 -0
- package/src/components/CnIndexPage/CnIndexPage.vue +74 -3
- package/src/components/CnIndexPage/useNamedSource.js +9 -0
- package/src/components/CnObjectPermissionsTab/CnObjectPermissionsTab.vue +499 -0
- package/src/components/CnObjectPermissionsTab/__tests__/CnObjectPermissionsTab.spec.js +186 -0
- package/src/components/CnObjectPermissionsTab/index.js +13 -0
- package/src/components/CnObjectSidebar/CnObjectSidebar.vue +8 -1
- package/src/components/CnObjectTranslationsWidget/CnObjectTranslationsWidget.vue +424 -0
- package/src/components/CnObjectTranslationsWidget/__tests__/CnObjectTranslationsWidget.spec.js +189 -0
- package/src/components/CnObjectTranslationsWidget/index.js +13 -0
- package/src/components/CnReadinessChecklist/CnReadinessChecklist.vue +335 -0
- package/src/components/CnReadinessChecklist/index.js +9 -0
- package/src/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue +300 -0
- package/src/components/CnSchemaRulesWidget/index.js +10 -0
- package/src/components/CnSchemaRulesWidget/schemaRules.js +123 -0
- package/src/components/CnSearchIndexStatus/CnSearchIndexStatus.vue +160 -0
- package/src/components/CnSearchIndexStatus/index.js +10 -0
- package/src/components/CnSearchIndexStatus/searchIndexStatus.js +56 -0
- package/src/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue +328 -0
- package/src/components/CnShippedConfigurationSection/index.js +9 -0
- package/src/components/CnStateMachineEditor/CnStateMachineEditor.vue +1332 -0
- package/src/components/CnStateMachineEditor/CnStateMachineFields.vue +791 -0
- package/src/components/CnStateMachineEditor/CnStateMachineNode.vue +442 -0
- package/src/components/CnStateMachineEditor/CnStateMachinePanel.vue +326 -0
- package/src/components/CnStateMachineEditor/index.js +8 -0
- package/src/components/CnStateMachineEditor/stateMachineFields.js +287 -0
- package/src/components/CnTimelineWidget/CnTimelineManage.vue +827 -0
- package/src/components/CnTimelineWidget/CnTimelineWidget.vue +29 -3
- package/src/components/CnWidgetGrid/builtInWidgets.js +6 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +10 -0
- package/src/components/index.js +8 -0
- package/src/composables/indexSources.js +116 -16
- package/src/css/index-page.css +7 -0
- package/src/index.js +9 -0
- package/src/utils/aiFeatures.js +241 -0
- package/src/utils/aiSuggestionTracker.js +178 -0
- package/src/utils/libraryWidgetKeys.js +2 -0
- package/src/utils/objectPermissions.js +548 -0
- package/src/utils/objectTranslations.js +176 -0
- package/src/utils/stateMachineValidation.js +250 -0
- 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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"}
|