@conduction/nextcloud-vue 0.1.0-beta.13 → 0.1.0-beta.14

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 (30) hide show
  1. package/dist/nextcloud-vue.cjs.js +20518 -1290
  2. package/dist/nextcloud-vue.cjs.js.map +1 -1
  3. package/dist/nextcloud-vue.css +470 -185
  4. package/dist/nextcloud-vue.esm.js +20518 -1290
  5. package/dist/nextcloud-vue.esm.js.map +1 -1
  6. package/l10n/en.json +255 -2
  7. package/l10n/nl.json +247 -2
  8. package/package.json +2 -1
  9. package/src/components/CnAdvancedFormDialog/CnDataTab.vue +1 -4
  10. package/src/components/CnContextMenu/CnContextMenu.vue +1 -1
  11. package/src/components/CnDataTable/CnDataTable.vue +7 -2
  12. package/src/components/CnInfoWidget/CnInfoWidget.vue +0 -1
  13. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +2 -2
  14. package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +2 -2
  15. package/src/components/CnRowActions/CnRowActions.vue +1 -1
  16. package/src/components/CnSchemaFormDialog/CnSchemaConfigurationTab.vue +36 -34
  17. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +47 -36
  18. package/src/components/CnSchemaFormDialog/CnSchemaPropertiesTab.vue +29 -22
  19. package/src/components/CnSchemaFormDialog/CnSchemaPropertyActions.vue +170 -163
  20. package/src/components/CnSchemaFormDialog/CnSchemaSecurityTab.vue +473 -116
  21. package/src/components/CnStatsBlock/CnStatsBlock.vue +18 -18
  22. package/src/components/CnTabbedFormDialog/CnTabbedFormDialog.vue +12 -0
  23. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +7 -7
  24. package/src/composables/useContextMenu.js +1 -1
  25. package/src/css/CnSchemaFormDialog.css +258 -2
  26. package/src/css/dashboard.css +1 -0
  27. package/src/css/detail-page.css +5 -5
  28. package/src/css/index.css +1 -0
  29. package/src/css/patches.css +20 -0
  30. package/src/store/plugins/search.js +7 -7
@@ -1,119 +1,119 @@
1
1
  <template>
2
2
  <NcActions>
3
- <NcActionCaption name="Actions" />
4
- <NcActionButton :aria-label="'Copy ' + propertyKey" @click="$emit('copy-property', propertyKey)">
3
+ <NcActionCaption :name="t('nextcloud-vue', 'Actions')" />
4
+ <NcActionButton :aria-label="t('nextcloud-vue', 'Copy {key}', { key: propertyKey })" @click="$emit('copy-property', propertyKey)">
5
5
  <template #icon>
6
6
  <ContentCopy :size="16" />
7
7
  </template>
8
- Copy Property
8
+ {{ t('nextcloud-vue', 'Copy property') }}
9
9
  </NcActionButton>
10
- <NcActionButton :aria-label="'Delete ' + propertyKey" @click="$emit('delete-property', propertyKey)">
10
+ <NcActionButton :aria-label="t('nextcloud-vue', 'Delete {key}', { key: propertyKey })" @click="$emit('delete-property', propertyKey)">
11
11
  <template #icon>
12
12
  <TrashCanOutline :size="16" />
13
13
  </template>
14
- Delete Property
14
+ {{ t('nextcloud-vue', 'Delete property') }}
15
15
  </NcActionButton>
16
16
 
17
17
  <NcActionSeparator />
18
- <NcActionCaption name="General" />
18
+ <NcActionCaption :name="t('nextcloud-vue', 'General')" />
19
19
  <NcActionCheckbox
20
20
  :checked="isPropertyRequired(schema, propertyKey)"
21
21
  @update:checked="updatePropertyRequired(propertyKey, $event)">
22
- Required
22
+ {{ t('nextcloud-vue', 'Required') }}
23
23
  </NcActionCheckbox>
24
24
  <NcActionCheckbox
25
25
  :checked="property.immutable || false"
26
26
  @update:checked="updatePropertySetting(propertyKey, 'immutable', $event)">
27
- Immutable
27
+ {{ t('nextcloud-vue', 'Immutable') }}
28
28
  </NcActionCheckbox>
29
29
  <NcActionCheckbox
30
30
  :checked="property.deprecated || false"
31
31
  @update:checked="updatePropertySetting(propertyKey, 'deprecated', $event)">
32
- Deprecated
32
+ {{ t('nextcloud-vue', 'Deprecated') }}
33
33
  </NcActionCheckbox>
34
34
  <NcActionCheckbox
35
35
  :checked="property.visible !== false"
36
36
  @update:checked="updatePropertySetting(propertyKey, 'visible', $event)">
37
- Visible to end users
37
+ {{ t('nextcloud-vue', 'Visible to end users') }}
38
38
  </NcActionCheckbox>
39
39
  <NcActionCheckbox
40
40
  :checked="property.hideOnCollection || false"
41
41
  @update:checked="updatePropertySetting(propertyKey, 'hideOnCollection', $event)">
42
- Hide in collection view
42
+ {{ t('nextcloud-vue', 'Hide in collection view') }}
43
43
  </NcActionCheckbox>
44
44
  <NcActionCheckbox
45
45
  :checked="property.hideOnForm || false"
46
46
  @update:checked="updatePropertySetting(propertyKey, 'hideOnForm', $event)">
47
- Hide in form view
47
+ {{ t('nextcloud-vue', 'Hide in form view') }}
48
48
  </NcActionCheckbox>
49
49
  <NcActionCheckbox
50
50
  :checked="isFacetableEnabled(property)"
51
51
  @update:checked="toggleFacetable(propertyKey, $event)">
52
- Facetable
52
+ {{ t('nextcloud-vue', 'Facetable') }}
53
53
  </NcActionCheckbox>
54
54
  <NcActionCheckbox
55
55
  v-if="isFacetableEnabled(property)"
56
56
  :checked="getFacetConfig(property).aggregated !== false"
57
57
  @update:checked="updateFacetConfigField(propertyKey, property, 'aggregated', $event)">
58
- Aggregated across schemas
58
+ {{ t('nextcloud-vue', 'Aggregated across schemas') }}
59
59
  </NcActionCheckbox>
60
60
  <NcActionInput
61
61
  v-if="isFacetableEnabled(property)"
62
62
  :value="getFacetConfig(property).title || ''"
63
- label="Facet Title"
63
+ :label="t('nextcloud-vue', 'Facet title')"
64
64
  @update:value="updateFacetConfigField(propertyKey, property, 'title', $event)" />
65
65
  <NcActionInput
66
66
  v-if="isFacetableEnabled(property)"
67
67
  :value="getFacetConfig(property).description || ''"
68
- label="Facet Description"
68
+ :label="t('nextcloud-vue', 'Facet description')"
69
69
  @update:value="updateFacetConfigField(propertyKey, property, 'description', $event)" />
70
70
  <NcActionInput
71
71
  v-if="isFacetableEnabled(property)"
72
72
  :value="getFacetConfig(property).order != null ? String(getFacetConfig(property).order) : ''"
73
73
  type="number"
74
- label="Facet Order"
74
+ :label="t('nextcloud-vue', 'Facet order')"
75
75
  @update:value="updateFacetConfigField(propertyKey, property, 'order', $event)" />
76
76
 
77
77
  <NcActionSeparator />
78
- <NcActionCaption name="Properties" />
78
+ <NcActionCaption :name="t('nextcloud-vue', 'Properties')" />
79
79
  <NcActionInput
80
80
  :value="property.title || ''"
81
- label="Title"
81
+ :label="t('nextcloud-vue', 'Title')"
82
82
  @update:value="updatePropertySetting(propertyKey, 'title', $event)" />
83
83
  <NcActionInput
84
84
  v-if="getFormatOptionsForType(property.type).length > 0"
85
85
  v-model="schema.properties[propertyKey].format"
86
86
  type="multiselect"
87
87
  :options="getFormatOptionsForType(property.type)"
88
- input-label="Format"
89
- label="Format" />
88
+ :input-label="t('nextcloud-vue', 'Format')"
89
+ :label="t('nextcloud-vue', 'Format')" />
90
90
  <NcActionInput
91
91
  :value="property.description || ''"
92
- label="Description"
92
+ :label="t('nextcloud-vue', 'Description')"
93
93
  @update:value="updatePropertySetting(propertyKey, 'description', $event)" />
94
94
  <NcActionInput
95
95
  :value="property.example || ''"
96
- label="Example"
96
+ :label="t('nextcloud-vue', 'Example')"
97
97
  @update:value="updatePropertySetting(propertyKey, 'example', $event)" />
98
98
  <NcActionInput
99
99
  :value="property.order || 0"
100
100
  type="number"
101
- label="Order"
101
+ :label="t('nextcloud-vue', 'Order')"
102
102
  @update:value="updatePropertySetting(propertyKey, 'order', Number($event))" />
103
103
 
104
104
  <!-- Const and Enum Configuration -->
105
105
  <NcActionSeparator />
106
- <NcActionCaption name="Value Constraints" />
106
+ <NcActionCaption :name="t('nextcloud-vue', 'Value constraints')" />
107
107
  <NcActionInput
108
108
  :value="property.const || ''"
109
- label="Constant"
109
+ :label="t('nextcloud-vue', 'Constant')"
110
110
  @update:value="updatePropertySetting(propertyKey, 'const', $event === '' ? undefined : $event)" />
111
111
  <template v-if="property.enum && property.enum.length > 0">
112
- <NcActionCaption :name="'Current Enum Values (' + property.enum.length + ')'" />
112
+ <NcActionCaption :name="t('nextcloud-vue', 'Current enum values ({count})', { count: property.enum.length })" />
113
113
  <NcActionButton
114
114
  v-for="(enumValue, index) in property.enum"
115
115
  :key="`enum-chip-${index}-${enumValue}`"
116
- :aria-label="'Remove ' + enumValue"
116
+ :aria-label="t('nextcloud-vue', 'Remove {value}', { value: enumValue })"
117
117
  class="cn-schema-form__enum-action-chip"
118
118
  @click="removeEnumValue(propertyKey, index)">
119
119
  <template #icon>
@@ -124,45 +124,45 @@
124
124
  </template>
125
125
  <NcActionInput
126
126
  :value="enumInputValue"
127
- label="Add Enum Value"
128
- placeholder="Type value and press Enter"
127
+ :label="t('nextcloud-vue', 'Add enum value')"
128
+ :placeholder="t('nextcloud-vue', 'Type value and press Enter')"
129
129
  @update:value="enumInputValue = $event"
130
130
  @keydown.enter.prevent="addEnumValueAndClear(propertyKey)" />
131
131
 
132
132
  <!-- Default Value Configuration -->
133
133
  <NcActionSeparator />
134
- <NcActionCaption name="Default Value Configuration" />
134
+ <NcActionCaption :name="t('nextcloud-vue', 'Default value configuration')" />
135
135
  <template v-if="property.type === 'string'">
136
136
  <NcActionInput
137
137
  :value="property.default || ''"
138
- label="Default Value"
138
+ :label="t('nextcloud-vue', 'Default value')"
139
139
  @update:value="updatePropertySetting(propertyKey, 'default', $event === '' ? undefined : $event)" />
140
140
  </template>
141
141
  <template v-else-if="property.type === 'number' || property.type === 'integer'">
142
142
  <NcActionInput
143
143
  :value="property.default || 0"
144
144
  type="number"
145
- label="Default Value"
145
+ :label="t('nextcloud-vue', 'Default value')"
146
146
  @update:value="updatePropertySetting(propertyKey, 'default', Number($event))" />
147
147
  </template>
148
148
  <template v-else-if="property.type === 'boolean'">
149
149
  <NcActionCheckbox
150
150
  :checked="property.default === true"
151
151
  @update:checked="updatePropertySetting(propertyKey, 'default', $event)">
152
- Default Value
152
+ {{ t('nextcloud-vue', 'Default value') }}
153
153
  </NcActionCheckbox>
154
154
  </template>
155
155
  <template v-else-if="property.type === 'array' && property.items && property.items.type === 'string'">
156
156
  <NcActionInput
157
157
  :value="getArrayDefaultAsString(property.default)"
158
- label="Default Values (comma separated)"
158
+ :label="t('nextcloud-vue', 'Default values (comma separated)')"
159
159
  placeholder="value1, value2, value3"
160
160
  @update:value="updateArrayDefault(propertyKey, $event)" />
161
161
  </template>
162
162
  <template v-else-if="property.type === 'object'">
163
163
  <NcActionInput
164
164
  :value="typeof property.default === 'object' ? JSON.stringify(property.default, null, 2) : (property.default || '{}')"
165
- label="Default Value (JSON)"
165
+ :label="t('nextcloud-vue', 'Default value (JSON)')"
166
166
  @update:value="updateObjectDefault(propertyKey, $event)" />
167
167
  </template>
168
168
 
@@ -171,122 +171,115 @@
171
171
  <NcActionCheckbox
172
172
  :checked="property.defaultBehavior === 'falsy'"
173
173
  @update:checked="updatePropertySetting(propertyKey, 'defaultBehavior', $event ? 'falsy' : 'false')">
174
- Apply default for empty values
174
+ {{ t('nextcloud-vue', 'Apply default for empty values') }}
175
175
  </NcActionCheckbox>
176
176
  <NcActionCaption
177
177
  v-if="property.defaultBehavior === 'falsy'"
178
- name="ℹ️ Default will be applied when value is missing, null, or empty string"
178
+ :name="'ℹ️ ' + t('nextcloud-vue', 'Default will be applied when value is missing, null, or empty string')"
179
179
  style="color: var(--color-text-lighter); font-size: 11px;" />
180
180
  <NcActionCaption
181
181
  v-else
182
- name="ℹ️ Default will only be applied when value is missing or null"
182
+ :name="'ℹ️ ' + t('nextcloud-vue', 'Default will only be applied when value is missing or null')"
183
183
  style="color: var(--color-text-lighter); font-size: 11px;" />
184
184
  </template>
185
185
 
186
186
  <!-- Type-specific configurations -->
187
187
  <template v-if="property.type === 'string'">
188
188
  <NcActionSeparator />
189
- <NcActionCaption name="String Configuration" />
189
+ <NcActionCaption :name="t('nextcloud-vue', 'String configuration')" />
190
190
  <NcActionInput
191
191
  :value="property.minLength || 0"
192
192
  type="number"
193
- label="Minimum Length"
193
+ :label="t('nextcloud-vue', 'Minimum length')"
194
194
  @update:value="updatePropertySetting(propertyKey, 'minLength', Number($event))" />
195
195
  <NcActionInput
196
196
  :value="property.maxLength || 0"
197
197
  type="number"
198
- label="Maximum Length"
198
+ :label="t('nextcloud-vue', 'Maximum length')"
199
199
  @update:value="updatePropertySetting(propertyKey, 'maxLength', Number($event))" />
200
200
  <NcActionInput
201
201
  :value="property.pattern || ''"
202
- label="Pattern (regex)"
202
+ :label="t('nextcloud-vue', 'Pattern (regex)')"
203
203
  @update:value="updatePropertySetting(propertyKey, 'pattern', $event)" />
204
204
  </template>
205
205
 
206
206
  <template v-if="property.type === 'number' || property.type === 'integer'">
207
207
  <NcActionSeparator />
208
- <NcActionCaption name="Number Configuration" />
208
+ <NcActionCaption :name="t('nextcloud-vue', 'Number configuration')" />
209
209
  <NcActionInput
210
210
  :value="property.minimum || 0"
211
211
  type="number"
212
- label="Minimum Value"
212
+ :label="t('nextcloud-vue', 'Minimum value')"
213
213
  @update:value="updatePropertySetting(propertyKey, 'minimum', Number($event))" />
214
214
  <NcActionInput
215
215
  :value="property.maximum || 0"
216
216
  type="number"
217
- label="Maximum Value"
217
+ :label="t('nextcloud-vue', 'Maximum value')"
218
218
  @update:value="updatePropertySetting(propertyKey, 'maximum', Number($event))" />
219
219
  <NcActionInput
220
220
  :value="property.multipleOf || 0"
221
221
  type="number"
222
- label="Multiple Of"
222
+ :label="t('nextcloud-vue', 'Multiple of')"
223
223
  @update:value="updatePropertySetting(propertyKey, 'multipleOf', Number($event))" />
224
224
  <NcActionCheckbox
225
225
  :checked="property.exclusiveMin || false"
226
226
  @update:checked="updatePropertySetting(propertyKey, 'exclusiveMin', $event)">
227
- Exclusive Minimum
227
+ {{ t('nextcloud-vue', 'Exclusive minimum') }}
228
228
  </NcActionCheckbox>
229
229
  <NcActionCheckbox
230
230
  :checked="property.exclusiveMax || false"
231
231
  @update:checked="updatePropertySetting(propertyKey, 'exclusiveMax', $event)">
232
- Exclusive Maximum
232
+ {{ t('nextcloud-vue', 'Exclusive maximum') }}
233
233
  </NcActionCheckbox>
234
234
  </template>
235
235
 
236
236
  <template v-if="property.type === 'array'">
237
237
  <NcActionSeparator />
238
- <NcActionCaption name="Array Configuration" />
238
+ <NcActionCaption :name="t('nextcloud-vue', 'Array configuration')" />
239
239
  <NcActionInput
240
240
  v-model="schema.properties[propertyKey].items.type"
241
241
  type="multiselect"
242
- :options="[
243
- { id: 'string', label: 'String' },
244
- { id: 'number', label: 'Number' },
245
- { id: 'integer', label: 'Integer' },
246
- { id: 'object', label: 'Object' },
247
- { id: 'boolean', label: 'Boolean' },
248
- { id: 'file', label: 'File' }
249
- ]"
250
- input-label="Array Item Type"
251
- label="Array Item Type" />
242
+ :options="arrayItemTypeOptions"
243
+ :input-label="t('nextcloud-vue', 'Array item type')"
244
+ :label="t('nextcloud-vue', 'Array item type')" />
252
245
  <NcActionInput
253
246
  :value="property.minItems || 0"
254
247
  type="number"
255
- label="Minimum Items"
248
+ :label="t('nextcloud-vue', 'Minimum items')"
256
249
  @update:value="updatePropertySetting(propertyKey, 'minItems', Number($event))" />
257
250
  <NcActionInput
258
251
  :value="property.maxItems || 0"
259
252
  type="number"
260
- label="Maximum Items"
253
+ :label="t('nextcloud-vue', 'Maximum items')"
261
254
  @update:value="updatePropertySetting(propertyKey, 'maxItems', Number($event))" />
262
255
 
263
256
  <!-- Show object configuration for array items when item type is object -->
264
257
  <template v-if="property.items && property.items.type === 'object'">
265
258
  <NcActionSeparator />
266
- <NcActionCaption name="Array Item Object Configuration" />
259
+ <NcActionCaption :name="t('nextcloud-vue', 'Array item object configuration')" />
267
260
  <NcActionInput
268
261
  v-model="schema.properties[propertyKey].items.objectConfiguration.handling"
269
262
  type="multiselect"
270
263
  :options="objectHandlingOptions"
271
- input-label="Object Handling"
272
- label="Object Handling" />
264
+ :input-label="t('nextcloud-vue', 'Object handling')"
265
+ :label="t('nextcloud-vue', 'Object handling')" />
273
266
  <NcActionInput
274
267
  :value="schema.properties[propertyKey].items.$ref"
275
268
  type="multiselect"
276
269
  :options="availableSchemas"
277
- input-label="Schema Reference"
278
- label="Schema Reference"
270
+ :input-label="t('nextcloud-vue', 'Schema reference')"
271
+ :label="t('nextcloud-vue', 'Schema reference')"
279
272
  @update:value="updateArrayItemSchemaReference(propertyKey, $event)" />
280
273
  <NcActionCaption
281
274
  v-if="isArrayItemRefInvalid(propertyKey)"
282
- :name="`⚠️ Invalid Schema Reference: Expected string, got number (${schema.properties[propertyKey].items.$ref}). This will be sent to backend as-is.`"
275
+ :name="'⚠️ ' + t('nextcloud-vue', 'Invalid schema reference: Expected string, got number ({value}). This will be sent to backend as-is.', { value: schema.properties[propertyKey].items.$ref })"
283
276
  style="color: var(--color-error); font-weight: bold;" />
284
277
  <NcActionInput
285
278
  :value="getArrayItemRegisterValue(propertyKey)"
286
279
  type="multiselect"
287
280
  :options="availableRegisters"
288
- input-label="Register"
289
- label="Register (Required when schema is selected)"
281
+ :input-label="t('nextcloud-vue', 'Register')"
282
+ :label="t('nextcloud-vue', 'Register (required when schema is selected)')"
290
283
  :required="!!schema.properties[propertyKey].items.$ref"
291
284
  :disabled="!schema.properties[propertyKey].items.$ref"
292
285
  @update:value="updateArrayItemRegisterReference(propertyKey, $event)" />
@@ -294,59 +287,59 @@
294
287
  v-model="schema.properties[propertyKey].items.inversedBy"
295
288
  type="multiselect"
296
289
  :options="getInversedByOptionsForArrayItems(propertyKey)"
297
- input-label="Inversed By Property"
298
- label="Inversed By"
290
+ :input-label="t('nextcloud-vue', 'Inversed by property')"
291
+ :label="t('nextcloud-vue', 'Inversed by')"
299
292
  :disabled="!schema.properties[propertyKey].items.$ref"
300
293
  @update:value="updateInversedByForArrayItems(propertyKey, $event)" />
301
294
  <NcActionInput
302
295
  :value="getArrayItemQueryParams(propertyKey)"
303
- label="Query Parameters"
296
+ :label="t('nextcloud-vue', 'Query parameters')"
304
297
  placeholder="e.g. gemmaType=referentiecomponent&_extend=aanbevolenStandaarden"
305
298
  @update:value="updateArrayItemQueryParams(propertyKey, $event)" />
306
299
  <NcActionCheckbox
307
300
  :checked="property.items.writeBack || false"
308
301
  @update:checked="updateArrayItemObjectConfigurationSetting(propertyKey, 'writeBack', $event)">
309
- Write Back
302
+ {{ t('nextcloud-vue', 'Write back') }}
310
303
  </NcActionCheckbox>
311
304
  <NcActionCheckbox
312
305
  :checked="property.items.removeAfterWriteBack || false"
313
306
  @update:checked="updateArrayItemObjectConfigurationSetting(propertyKey, 'removeAfterWriteBack', $event)">
314
- Remove After Write Back
307
+ {{ t('nextcloud-vue', 'Remove after write back') }}
315
308
  </NcActionCheckbox>
316
309
  <NcActionCheckbox
317
310
  :checked="property.items.cascadeDelete || false"
318
311
  @update:checked="updateArrayItemObjectConfigurationSetting(propertyKey, 'cascadeDelete', $event)">
319
- Cascade Delete
312
+ {{ t('nextcloud-vue', 'Cascade delete') }}
320
313
  </NcActionCheckbox>
321
314
  </template>
322
315
  </template>
323
316
 
324
317
  <template v-if="property.type === 'object'">
325
318
  <NcActionSeparator />
326
- <NcActionCaption name="Object Configuration" />
319
+ <NcActionCaption :name="t('nextcloud-vue', 'Object configuration')" />
327
320
  <NcActionInput
328
321
  v-model="schema.properties[propertyKey].objectConfiguration.handling"
329
322
  type="multiselect"
330
323
  :options="objectHandlingOptions"
331
- input-label="Object Handling"
332
- label="Object Handling" />
324
+ :input-label="t('nextcloud-vue', 'Object handling')"
325
+ :label="t('nextcloud-vue', 'Object handling')" />
333
326
  <NcActionInput
334
327
  :value="schema.properties[propertyKey].$ref"
335
328
  type="multiselect"
336
329
  :options="availableSchemas"
337
- input-label="Schema Reference"
338
- label="Schema Reference"
330
+ :input-label="t('nextcloud-vue', 'Schema reference')"
331
+ :label="t('nextcloud-vue', 'Schema reference')"
339
332
  @update:value="updateSchemaReference(propertyKey, $event)" />
340
333
  <NcActionCaption
341
334
  v-if="isRefInvalid(propertyKey)"
342
- :name="`⚠️ Invalid Schema Reference: Expected string, got number (${schema.properties[propertyKey].$ref}). This will be sent to backend as-is.`"
335
+ :name="'⚠️ ' + t('nextcloud-vue', 'Invalid schema reference: Expected string, got number ({value}). This will be sent to backend as-is.', { value: schema.properties[propertyKey].$ref })"
343
336
  style="color: var(--color-error); font-weight: bold;" />
344
337
  <NcActionInput
345
338
  :value="getRegisterValue(propertyKey)"
346
339
  type="multiselect"
347
340
  :options="availableRegisters"
348
- input-label="Register"
349
- label="Register (Required when schema is selected)"
341
+ :input-label="t('nextcloud-vue', 'Register')"
342
+ :label="t('nextcloud-vue', 'Register (required when schema is selected)')"
350
343
  :required="!!schema.properties[propertyKey].$ref"
351
344
  :disabled="!schema.properties[propertyKey].$ref"
352
345
  @update:value="updateRegisterReference(propertyKey, $event)" />
@@ -354,86 +347,86 @@
354
347
  v-model="schema.properties[propertyKey].inversedBy"
355
348
  type="multiselect"
356
349
  :options="getInversedByOptions(propertyKey)"
357
- input-label="Inversed By Property"
358
- label="Inversed By"
350
+ :input-label="t('nextcloud-vue', 'Inversed by property')"
351
+ :label="t('nextcloud-vue', 'Inversed by')"
359
352
  :disabled="!schema.properties[propertyKey].$ref"
360
353
  @update:value="updateInversedBy(propertyKey, $event)" />
361
354
  <NcActionInput
362
355
  :value="getObjectQueryParams(propertyKey)"
363
- label="Query Parameters"
356
+ :label="t('nextcloud-vue', 'Query parameters')"
364
357
  placeholder="e.g. gemmaType=referentiecomponent&_extend=aanbevolenStandaarden"
365
358
  @update:value="updateObjectQueryParams(propertyKey, $event)" />
366
359
  <NcActionCheckbox
367
360
  :checked="property.writeBack || false"
368
361
  @update:checked="updatePropertySetting(propertyKey, 'writeBack', $event)">
369
- Write Back
362
+ {{ t('nextcloud-vue', 'Write back') }}
370
363
  </NcActionCheckbox>
371
364
  <NcActionCheckbox
372
365
  :checked="property.removeAfterWriteBack || false"
373
366
  @update:checked="updatePropertySetting(propertyKey, 'removeAfterWriteBack', $event)">
374
- Remove After Write Back
367
+ {{ t('nextcloud-vue', 'Remove after write back') }}
375
368
  </NcActionCheckbox>
376
369
  <NcActionCheckbox
377
370
  :checked="property.cascadeDelete || false"
378
371
  @update:checked="updatePropertySetting(propertyKey, 'cascadeDelete', $event)">
379
- Cascade Delete
372
+ {{ t('nextcloud-vue', 'Cascade delete') }}
380
373
  </NcActionCheckbox>
381
374
  </template>
382
375
 
383
376
  <!-- File Configuration -->
384
377
  <template v-if="property.type === 'file' || (property.type === 'array' && property.items && property.items.type === 'file')">
385
378
  <NcActionSeparator />
386
- <NcActionCaption name="File Configuration" />
379
+ <NcActionCaption :name="t('nextcloud-vue', 'File configuration')" />
387
380
  <NcActionCheckbox
388
381
  :checked="getFilePropertySetting(propertyKey, 'autoPublish')"
389
382
  @update:checked="updateFilePropertySetting(propertyKey, 'autoPublish', $event)">
390
- Auto-Publish Files
383
+ {{ t('nextcloud-vue', 'Auto-publish files') }}
391
384
  </NcActionCheckbox>
392
385
  <NcActionCaption
393
386
  v-if="getFilePropertySetting(propertyKey, 'autoPublish')"
394
- name="ℹ️ Files uploaded to this property will be automatically publicly shared"
387
+ :name="'ℹ️ ' + t('nextcloud-vue', 'Files uploaded to this property will be automatically publicly shared')"
395
388
  style="color: var(--color-text-lighter); font-size: 11px;" />
396
389
  <NcActionInput
397
390
  :value="(property.allowedTypes || []).join(', ')"
398
- label="Allowed MIME Types (comma separated)"
391
+ :label="t('nextcloud-vue', 'Allowed MIME types (comma separated)')"
399
392
  placeholder="image/png, image/jpeg, application/pdf"
400
393
  @update:value="updateFileProperty(propertyKey, 'allowedTypes', $event)" />
401
394
  <NcActionInput
402
395
  :value="property.maxSize || ''"
403
396
  type="number"
404
- label="Maximum File Size (bytes)"
397
+ :label="t('nextcloud-vue', 'Maximum file size (bytes)')"
405
398
  placeholder="5242880"
406
399
  @update:value="updateFileProperty(propertyKey, 'maxSize', $event)" />
407
400
  <NcActionInput
408
401
  :value="getFilePropertyTags(propertyKey, 'allowedTags')"
409
402
  type="multiselect"
410
403
  :options="availableTagsOptions"
411
- input-label="Allowed Tags"
412
- label="Allowed Tags (select from available tags)"
404
+ :input-label="t('nextcloud-vue', 'Allowed tags')"
405
+ :label="t('nextcloud-vue', 'Allowed tags (select from available tags)')"
413
406
  multiple
414
407
  @update:value="updateFilePropertyTags(propertyKey, 'allowedTags', $event)" />
415
408
  <NcActionInput
416
409
  :value="getFilePropertyTags(propertyKey, 'autoTags')"
417
410
  type="multiselect"
418
411
  :options="availableTagsOptions"
419
- input-label="Auto Tags"
420
- label="Auto Tags (automatically applied to uploaded files)"
412
+ :input-label="t('nextcloud-vue', 'Auto tags')"
413
+ :label="t('nextcloud-vue', 'Auto tags (automatically applied to uploaded files)')"
421
414
  multiple
422
415
  @update:value="updateFilePropertyTags(propertyKey, 'autoTags', $event)" />
423
416
  </template>
424
417
 
425
418
  <!-- Property-level Table Configuration -->
426
419
  <NcActionSeparator />
427
- <NcActionCaption name="Table" />
420
+ <NcActionCaption :name="t('nextcloud-vue', 'Table')" />
428
421
  <NcActionCheckbox
429
422
  :checked="getPropertyTableSetting(propertyKey, 'default')"
430
423
  @update:checked="updatePropertyTableSetting(propertyKey, 'default', $event)">
431
- Default
424
+ {{ t('nextcloud-vue', 'Default') }}
432
425
  </NcActionCheckbox>
433
426
 
434
427
  <!-- Property-level Security Configuration -->
435
428
  <NcActionSeparator />
436
- <NcActionCaption name="Property Security" />
429
+ <NcActionCaption :name="t('nextcloud-vue', 'Property security')" />
437
430
 
438
431
  <template v-if="!loadingGroups">
439
432
  <!-- Current Property Permissions List -->
@@ -445,20 +438,20 @@
445
438
  <NcActionButton
446
439
  v-if="permission.groupId !== 'admin'"
447
440
  :key="`${propertyKey}-perm-remove-${permission.group}`"
448
- :aria-label="`Remove ${permission.group} permissions`"
441
+ :aria-label="t('nextcloud-vue', 'Remove {group} permissions', { group: permission.group })"
449
442
  class="cn-schema-form__property-permission-remove-btn"
450
443
  @click="removePropertyGroupPermissions(propertyKey, permission.group)">
451
444
  <template #icon>
452
445
  <Close :size="16" />
453
446
  </template>
454
- Remove {{ permission.group }}
447
+ {{ t('nextcloud-vue', 'Remove {group}', { group: permission.group }) }}
455
448
  </NcActionButton>
456
449
  </div>
457
450
 
458
451
  <!-- Show inheritance status if no specific permissions -->
459
452
  <NcActionCaption
460
453
  v-if="!hasPropertyAnyPermissions(propertyKey)"
461
- name="📄 Inherits schema permissions"
454
+ :name="'📄 ' + t('nextcloud-vue', 'Inherits schema permissions')"
462
455
  style="color: var(--color-success); font-size: 11px;" />
463
456
 
464
457
  <!-- Add Permission Interface -->
@@ -467,31 +460,31 @@
467
460
  v-model="propertyNewPermissionGroup"
468
461
  type="multiselect"
469
462
  :options="getAvailableGroupsForProperty()"
470
- input-label="Group"
471
- label="Add Group Permission"
472
- placeholder="Select group..." />
463
+ :input-label="t('nextcloud-vue', 'Group')"
464
+ :label="t('nextcloud-vue', 'Add group permission')"
465
+ :placeholder="t('nextcloud-vue', 'Select group...')" />
473
466
 
474
467
  <template v-if="propertyNewPermissionGroup">
475
- <NcActionCaption name="Select Permissions:" />
468
+ <NcActionCaption :name="t('nextcloud-vue', 'Select permissions:')" />
476
469
  <NcActionCheckbox
477
470
  :checked="propertyNewPermissionCreate"
478
471
  @update:checked="propertyNewPermissionCreate = $event">
479
- Create (C)
472
+ {{ t('nextcloud-vue', 'Create (C)') }}
480
473
  </NcActionCheckbox>
481
474
  <NcActionCheckbox
482
475
  :checked="propertyNewPermissionRead"
483
476
  @update:checked="propertyNewPermissionRead = $event">
484
- Read (R)
477
+ {{ t('nextcloud-vue', 'Read (R)') }}
485
478
  </NcActionCheckbox>
486
479
  <NcActionCheckbox
487
480
  :checked="propertyNewPermissionUpdate"
488
481
  @update:checked="propertyNewPermissionUpdate = $event">
489
- Update (U)
482
+ {{ t('nextcloud-vue', 'Update (U)') }}
490
483
  </NcActionCheckbox>
491
484
  <NcActionCheckbox
492
485
  :checked="propertyNewPermissionDelete"
493
486
  @update:checked="propertyNewPermissionDelete = $event">
494
- Delete (D)
487
+ {{ t('nextcloud-vue', 'Delete (D)') }}
495
488
  </NcActionCheckbox>
496
489
 
497
490
  <NcActionButton
@@ -500,17 +493,18 @@
500
493
  <template #icon>
501
494
  <Plus :size="16" />
502
495
  </template>
503
- Add Permission
496
+ {{ t('nextcloud-vue', 'Add permission') }}
504
497
  </NcActionButton>
505
498
  </template>
506
499
  </template>
507
500
  <template v-else>
508
- <NcActionCaption name="Loading groups..." />
501
+ <NcActionCaption :name="t('nextcloud-vue', 'Loading groups...')" />
509
502
  </template>
510
503
  </NcActions>
511
504
  </template>
512
505
 
513
506
  <script>
507
+ import { translate as t } from '@nextcloud/l10n'
514
508
  import {
515
509
  NcActions,
516
510
  NcActionButton,
@@ -583,13 +577,6 @@ export default {
583
577
  propertyNewPermissionRead: false,
584
578
  propertyNewPermissionUpdate: false,
585
579
  propertyNewPermissionDelete: false,
586
- objectHandlingOptions: [
587
- { id: 'nested-object', label: 'Nested Object' },
588
- { id: 'related-object', label: 'Related Object' },
589
- { id: 'nested-schema', label: 'Nested Schema' },
590
- { id: 'related-schema', label: 'Related Schema' },
591
- { id: 'uri', label: 'URI' },
592
- ],
593
580
  }
594
581
  },
595
582
  computed: {
@@ -597,8 +584,29 @@ export default {
597
584
  schema() {
598
585
  return this.schemaItem
599
586
  },
587
+ objectHandlingOptions() {
588
+ return [
589
+ { id: 'nested-object', label: t('nextcloud-vue', 'Nested object') },
590
+ { id: 'related-object', label: t('nextcloud-vue', 'Related object') },
591
+ { id: 'nested-schema', label: t('nextcloud-vue', 'Nested schema') },
592
+ { id: 'related-schema', label: t('nextcloud-vue', 'Related schema') },
593
+ { id: 'uri', label: 'URI' },
594
+ ]
595
+ },
596
+ arrayItemTypeOptions() {
597
+ return [
598
+ { id: 'string', label: t('nextcloud-vue', 'String') },
599
+ { id: 'number', label: t('nextcloud-vue', 'Number') },
600
+ { id: 'integer', label: t('nextcloud-vue', 'Integer') },
601
+ { id: 'object', label: t('nextcloud-vue', 'Object') },
602
+ { id: 'boolean', label: t('nextcloud-vue', 'Boolean') },
603
+ { id: 'file', label: t('nextcloud-vue', 'File') },
604
+ ]
605
+ },
600
606
  },
601
607
  methods: {
608
+ t,
609
+
602
610
  // --- General helpers ---
603
611
 
604
612
  isPropertyRequired(schema, key) {
@@ -618,7 +626,6 @@ export default {
618
626
 
619
627
  checkPropertiesModified() {
620
628
  // Bubble up to parent — the parent's deep watcher handles this
621
- // This is a no-op placeholder; modifications are detected by the parent's watcher
622
629
  },
623
630
 
624
631
  // --- Property setting updates ---
@@ -715,50 +722,50 @@ export default {
715
722
  getFormatOptionsForType(type) {
716
723
  const formatMap = {
717
724
  string: [
718
- { id: 'text', label: 'Text' },
719
- { id: 'markdown', label: 'Markdown' },
720
- { id: 'html', label: 'HTML' },
721
- { id: 'date-time', label: 'Date Time' },
722
- { id: 'date', label: 'Date' },
723
- { id: 'time', label: 'Time' },
724
- { id: 'duration', label: 'Duration' },
725
- { id: 'email', label: 'Email' },
726
- { id: 'idn-email', label: 'IDN Email' },
727
- { id: 'hostname', label: 'Hostname' },
728
- { id: 'idn-hostname', label: 'IDN Hostname' },
725
+ { id: 'text', label: t('nextcloud-vue', 'Text') },
726
+ { id: 'markdown', label: t('nextcloud-vue', 'Markdown') },
727
+ { id: 'html', label: t('nextcloud-vue', 'HTML') },
728
+ { id: 'date-time', label: t('nextcloud-vue', 'Date time') },
729
+ { id: 'date', label: t('nextcloud-vue', 'Date') },
730
+ { id: 'time', label: t('nextcloud-vue', 'Time') },
731
+ { id: 'duration', label: t('nextcloud-vue', 'Duration') },
732
+ { id: 'email', label: t('nextcloud-vue', 'Email') },
733
+ { id: 'idn-email', label: t('nextcloud-vue', 'IDN email') },
734
+ { id: 'hostname', label: t('nextcloud-vue', 'Hostname') },
735
+ { id: 'idn-hostname', label: t('nextcloud-vue', 'IDN hostname') },
729
736
  { id: 'ipv4', label: 'IPv4' },
730
737
  { id: 'ipv6', label: 'IPv6' },
731
738
  { id: 'uri', label: 'URI' },
732
- { id: 'uri-reference', label: 'URI Reference' },
739
+ { id: 'uri-reference', label: t('nextcloud-vue', 'URI reference') },
733
740
  { id: 'iri', label: 'IRI' },
734
- { id: 'iri-reference', label: 'IRI Reference' },
741
+ { id: 'iri-reference', label: t('nextcloud-vue', 'IRI reference') },
735
742
  { id: 'uuid', label: 'UUID' },
736
- { id: 'uri-template', label: 'URI Template' },
737
- { id: 'json-pointer', label: 'JSON Pointer' },
738
- { id: 'relative-json-pointer', label: 'Relative JSON Pointer' },
739
- { id: 'regex', label: 'Regex' },
740
- { id: 'binary', label: 'Binary' },
741
- { id: 'byte', label: 'Byte' },
742
- { id: 'password', label: 'Password' },
743
+ { id: 'uri-template', label: t('nextcloud-vue', 'URI template') },
744
+ { id: 'json-pointer', label: t('nextcloud-vue', 'JSON pointer') },
745
+ { id: 'relative-json-pointer', label: t('nextcloud-vue', 'Relative JSON pointer') },
746
+ { id: 'regex', label: t('nextcloud-vue', 'Regex') },
747
+ { id: 'binary', label: t('nextcloud-vue', 'Binary') },
748
+ { id: 'byte', label: t('nextcloud-vue', 'Byte') },
749
+ { id: 'password', label: t('nextcloud-vue', 'Password') },
743
750
  { id: 'rsin', label: 'RSIN' },
744
751
  { id: 'kvk', label: 'KVK' },
745
752
  { id: 'bsn', label: 'BSN' },
746
753
  { id: 'oidn', label: 'OIDN' },
747
- { id: 'telephone', label: 'Telephone' },
748
- { id: 'accessUrl', label: 'Access URL' },
749
- { id: 'shareUrl', label: 'Share URL' },
750
- { id: 'downloadUrl', label: 'Download URL' },
751
- { id: 'extension', label: 'Extension' },
752
- { id: 'filename', label: 'Filename' },
753
- { id: 'semver', label: 'Semantic Version' },
754
+ { id: 'telephone', label: t('nextcloud-vue', 'Telephone') },
755
+ { id: 'accessUrl', label: t('nextcloud-vue', 'Access URL') },
756
+ { id: 'shareUrl', label: t('nextcloud-vue', 'Share URL') },
757
+ { id: 'downloadUrl', label: t('nextcloud-vue', 'Download URL') },
758
+ { id: 'extension', label: t('nextcloud-vue', 'Extension') },
759
+ { id: 'filename', label: t('nextcloud-vue', 'Filename') },
760
+ { id: 'semver', label: t('nextcloud-vue', 'Semantic version') },
754
761
  { id: 'url', label: 'URL' },
755
- { id: 'color', label: 'Color' },
756
- { id: 'color-hex', label: 'Color Hex' },
757
- { id: 'color-hex-alpha', label: 'Color Hex Alpha' },
758
- { id: 'color-rgb', label: 'Color RGB' },
759
- { id: 'color-rgba', label: 'Color RGBA' },
760
- { id: 'color-hsl', label: 'Color HSL' },
761
- { id: 'color-hsla', label: 'Color HSLA' },
762
+ { id: 'color', label: t('nextcloud-vue', 'Color') },
763
+ { id: 'color-hex', label: t('nextcloud-vue', 'Color hex') },
764
+ { id: 'color-hex-alpha', label: t('nextcloud-vue', 'Color hex alpha') },
765
+ { id: 'color-rgb', label: t('nextcloud-vue', 'Color RGB') },
766
+ { id: 'color-rgba', label: t('nextcloud-vue', 'Color RGBA') },
767
+ { id: 'color-hsl', label: t('nextcloud-vue', 'Color HSL') },
768
+ { id: 'color-hsla', label: t('nextcloud-vue', 'Color HSLA') },
762
769
  ],
763
770
  number: [],
764
771
  integer: [],
@@ -1239,9 +1246,9 @@ export default {
1239
1246
  },
1240
1247
 
1241
1248
  getDisplayGroupName(groupId) {
1242
- if (groupId === 'public') return 'Public'
1243
- if (groupId === 'authenticated') return 'Authenticated'
1244
- if (groupId === 'admin') return 'Admin'
1249
+ if (groupId === 'public') return t('nextcloud-vue', 'Public')
1250
+ if (groupId === 'authenticated') return t('nextcloud-vue', 'Authenticated')
1251
+ if (groupId === 'admin') return t('nextcloud-vue', 'Admin')
1245
1252
 
1246
1253
  const group = this.userGroups.find(g => g.id === groupId)
1247
1254
  return group ? (group.displayname || group.id) : groupId
@@ -1276,7 +1283,7 @@ export default {
1276
1283
  })
1277
1284
 
1278
1285
  permissionsList.push({
1279
- group: 'Admin',
1286
+ group: t('nextcloud-vue', 'Admin'),
1280
1287
  groupId: 'admin',
1281
1288
  rights: 'C,R,U,D',
1282
1289
  })
@@ -1294,8 +1301,8 @@ export default {
1294
1301
 
1295
1302
  getAvailableGroupsForProperty() {
1296
1303
  return [
1297
- { id: 'public', label: 'Public (Unauthenticated)' },
1298
- { id: 'authenticated', label: 'Authenticated' },
1304
+ { id: 'public', label: t('nextcloud-vue', 'Public (unauthenticated)') },
1305
+ { id: 'authenticated', label: t('nextcloud-vue', 'Authenticated') },
1299
1306
  ...this.sortedUserGroups.map(group => ({
1300
1307
  id: group.id,
1301
1308
  label: group.displayname || group.id,