@conduction/nextcloud-vue 0.1.0-beta.10 → 0.1.0-beta.12

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 (60) hide show
  1. package/dist/nextcloud-vue.cjs.js +64663 -63467
  2. package/dist/nextcloud-vue.cjs.js.map +1 -1
  3. package/dist/nextcloud-vue.css +443 -444
  4. package/dist/nextcloud-vue.esm.js +64637 -63443
  5. package/dist/nextcloud-vue.esm.js.map +1 -1
  6. package/l10n/en.json +164 -0
  7. package/l10n/nl.json +164 -0
  8. package/package.json +19 -3
  9. package/src/components/CnAdvancedFormDialog/CnAdvancedFormDialog.vue +8 -7
  10. package/src/components/CnAdvancedFormDialog/CnDataTab.vue +2 -2
  11. package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +5 -5
  12. package/src/components/CnAdvancedFormDialog/CnPropertiesTab.vue +2 -2
  13. package/src/components/CnCardGrid/CnCardGrid.vue +2 -1
  14. package/src/components/CnChartWidget/CnChartWidget.vue +29 -1
  15. package/src/components/CnCopyDialog/CnCopyDialog.vue +15 -6
  16. package/src/components/CnDashboardPage/CnDashboardPage.vue +5 -4
  17. package/src/components/CnDetailGrid/CnDetailGrid.vue +3 -1
  18. package/src/components/CnDetailPage/CnDetailPage.vue +5 -4
  19. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +3 -2
  20. package/src/components/CnFilterBar/CnFilterBar.vue +3 -2
  21. package/src/components/CnFormDialog/CnFormDialog.vue +122 -9
  22. package/src/components/CnIndexPage/CnIndexPage.vue +1 -0
  23. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +8 -7
  24. package/src/components/CnJsonViewer/CnJsonViewer.vue +33 -4
  25. package/src/components/CnMassActionBar/CnMassActionBar.vue +1 -1
  26. package/src/components/CnMassImportDialog/CnMassImportDialog.vue +2 -2
  27. package/src/components/CnNotesCard/CnNotesCard.vue +7 -6
  28. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +11 -10
  29. package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +3 -2
  30. package/src/components/CnObjectSidebar/CnAuditTrailTab.vue +8 -7
  31. package/src/components/CnObjectSidebar/CnFilesTab.vue +6 -5
  32. package/src/components/CnObjectSidebar/CnNotesTab.vue +8 -7
  33. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +6 -5
  34. package/src/components/CnObjectSidebar/CnTagsTab.vue +3 -2
  35. package/src/components/CnObjectSidebar/CnTasksTab.vue +11 -10
  36. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +14 -13
  37. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +15 -14
  38. package/src/components/CnSchemaFormDialog/CnSchemaPropertyActions.vue +4 -4
  39. package/src/components/CnSchemaFormDialog/CnSchemaSecurityTab.vue +10 -10
  40. package/src/components/CnSettingsSection/CnSettingsSection.vue +5 -4
  41. package/src/components/CnStatsBlock/CnStatsBlock.vue +5 -4
  42. package/src/components/CnStatsPanel/CnStatsPanel.vue +3 -2
  43. package/src/components/CnTabbedFormDialog/CnTabbedFormDialog.vue +9 -8
  44. package/src/components/CnTableWidget/CnTableWidget.vue +3 -2
  45. package/src/components/CnTasksCard/CnTasksCard.vue +5 -4
  46. package/src/components/CnTimelineStages/CnTimelineStages.vue +3 -1
  47. package/src/components/CnUserActionMenu/CnUserActionMenu.vue +7 -6
  48. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +4 -3
  49. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +3 -1
  50. package/src/index.js +4 -0
  51. package/src/l10n/index.js +12 -0
  52. package/src/store/createCrudStore.d.ts +350 -0
  53. package/src/store/createCrudStore.js +58 -5
  54. package/src/store/pluginMerge.js +55 -0
  55. package/src/store/plugins/index.js +1 -0
  56. package/src/store/plugins/logs.d.ts +22 -0
  57. package/src/store/plugins/logs.js +172 -0
  58. package/src/store/useObjectStore.js +19 -49
  59. package/src/types/index.d.ts +32 -0
  60. package/src/utils/schema.js +3 -2
@@ -115,6 +115,7 @@
115
115
  </template>
116
116
 
117
117
  <script>
118
+ import { translate as t } from '@nextcloud/l10n'
118
119
  import { NcButton, NcListItem, NcLoadingIcon, NcSelect, NcDateTimePickerNative } from '@nextcloud/vue'
119
120
  import History from 'vue-material-design-icons/History.vue'
120
121
  import { buildHeaders } from '../../utils/index.js'
@@ -129,13 +130,13 @@ export default {
129
130
  register: { type: String, default: '' },
130
131
  schema: { type: String, default: '' },
131
132
  apiBase: { type: String, default: '/apps/openregister/api' },
132
- noAuditTrailLabel: { type: String, default: 'No audit trail entries' },
133
- noMatchLabel: { type: String, default: 'No matching entries' },
134
- actionFilterLabel: { type: String, default: 'Action' },
135
- userFilterLabel: { type: String, default: 'User' },
136
- fromLabel: { type: String, default: 'From' },
137
- toLabel: { type: String, default: 'To' },
138
- loadMoreLabel: { type: String, default: 'Load more' },
133
+ noAuditTrailLabel: { type: String, default: () => t('nextcloud-vue', 'No audit trail entries') },
134
+ noMatchLabel: { type: String, default: () => t('nextcloud-vue', 'No matching entries') },
135
+ actionFilterLabel: { type: String, default: () => t('nextcloud-vue', 'Action') },
136
+ userFilterLabel: { type: String, default: () => t('nextcloud-vue', 'User') },
137
+ fromLabel: { type: String, default: () => t('nextcloud-vue', 'From') },
138
+ toLabel: { type: String, default: () => t('nextcloud-vue', 'To') },
139
+ loadMoreLabel: { type: String, default: () => t('nextcloud-vue', 'Load more') },
139
140
  },
140
141
 
141
142
  data() {
@@ -73,6 +73,7 @@
73
73
  </template>
74
74
 
75
75
  <script>
76
+ import { translate as t } from '@nextcloud/l10n'
76
77
  import { NcButton, NcListItem, NcActionButton, NcLoadingIcon } from '@nextcloud/vue'
77
78
  import Upload from 'vue-material-design-icons/Upload.vue'
78
79
  import FileOutline from 'vue-material-design-icons/FileOutline.vue'
@@ -90,11 +91,11 @@ export default {
90
91
  register: { type: String, default: '' },
91
92
  schema: { type: String, default: '' },
92
93
  apiBase: { type: String, default: '/apps/openregister/api' },
93
- dropZoneLabel: { type: String, default: 'Drop files here or click to browse' },
94
- noFilesLabel: { type: String, default: 'No files attached' },
95
- openLabel: { type: String, default: 'Open' },
96
- deleteLabel: { type: String, default: 'Delete' },
97
- loadMoreLabel: { type: String, default: 'Load more' },
94
+ dropZoneLabel: { type: String, default: () => t('nextcloud-vue', 'Drop files here or click to browse') },
95
+ noFilesLabel: { type: String, default: () => t('nextcloud-vue', 'No files attached') },
96
+ openLabel: { type: String, default: () => t('nextcloud-vue', 'Open') },
97
+ deleteLabel: { type: String, default: () => t('nextcloud-vue', 'Delete') },
98
+ loadMoreLabel: { type: String, default: () => t('nextcloud-vue', 'Load more') },
98
99
  },
99
100
 
100
101
  data() {
@@ -67,6 +67,7 @@
67
67
  </template>
68
68
 
69
69
  <script>
70
+ import { translate as t } from '@nextcloud/l10n'
70
71
  import { NcButton, NcListItem, NcActionButton, NcLoadingIcon } from '@nextcloud/vue'
71
72
  import CommentTextOutline from 'vue-material-design-icons/CommentTextOutline.vue'
72
73
  import Send from 'vue-material-design-icons/Send.vue'
@@ -84,13 +85,13 @@ export default {
84
85
  register: { type: String, default: '' },
85
86
  schema: { type: String, default: '' },
86
87
  apiBase: { type: String, default: '/apps/openregister/api' },
87
- addNoteLabel: { type: String, default: 'Add note' },
88
- addNotePlaceholder: { type: String, default: 'Write a note...' },
89
- editLabel: { type: String, default: 'Edit' },
90
- saveLabel: { type: String, default: 'Save' },
91
- cancelLabel: { type: String, default: 'Cancel' },
92
- deleteLabel: { type: String, default: 'Delete' },
93
- noNotesLabel: { type: String, default: 'No notes yet' },
88
+ addNoteLabel: { type: String, default: () => t('nextcloud-vue', 'Add note') },
89
+ addNotePlaceholder: { type: String, default: () => t('nextcloud-vue', 'Write a note...') },
90
+ editLabel: { type: String, default: () => t('nextcloud-vue', 'Edit') },
91
+ saveLabel: { type: String, default: () => t('nextcloud-vue', 'Save') },
92
+ cancelLabel: { type: String, default: () => t('nextcloud-vue', 'Cancel') },
93
+ deleteLabel: { type: String, default: () => t('nextcloud-vue', 'Delete') },
94
+ noNotesLabel: { type: String, default: () => t('nextcloud-vue', 'No notes yet') },
94
95
  },
95
96
 
96
97
  data() {
@@ -109,6 +109,7 @@
109
109
  </template>
110
110
 
111
111
  <script>
112
+ import { translate as t } from '@nextcloud/l10n'
112
113
  import { NcAppSidebar, NcAppSidebarTab } from '@nextcloud/vue'
113
114
 
114
115
  import Paperclip from 'vue-material-design-icons/Paperclip.vue'
@@ -221,11 +222,11 @@ export default {
221
222
  },
222
223
 
223
224
  // --- Pre-translated labels ---
224
- filesLabel: { type: String, default: 'Files' },
225
- notesLabel: { type: String, default: 'Notes' },
226
- tagsLabel: { type: String, default: 'Tags' },
227
- tasksLabel: { type: String, default: 'Tasks' },
228
- auditTrailLabel: { type: String, default: 'Audit Trail' },
225
+ filesLabel: { type: String, default: () => t('nextcloud-vue', 'Files') },
226
+ notesLabel: { type: String, default: () => t('nextcloud-vue', 'Notes') },
227
+ tagsLabel: { type: String, default: () => t('nextcloud-vue', 'Tags') },
228
+ tasksLabel: { type: String, default: () => t('nextcloud-vue', 'Tasks') },
229
+ auditTrailLabel: { type: String, default: () => t('nextcloud-vue', 'Audit trail') },
229
230
  },
230
231
 
231
232
  emits: ['update:open'],
@@ -56,6 +56,7 @@
56
56
  </template>
57
57
 
58
58
  <script>
59
+ import { translate as t } from '@nextcloud/l10n'
59
60
  import { NcButton, NcTextField, NcLoadingIcon } from '@nextcloud/vue'
60
61
  import TagOutline from 'vue-material-design-icons/TagOutline.vue'
61
62
  import Plus from 'vue-material-design-icons/Plus.vue'
@@ -72,8 +73,8 @@ export default {
72
73
  register: { type: String, default: '' },
73
74
  schema: { type: String, default: '' },
74
75
  apiBase: { type: String, default: '/apps/openregister/api' },
75
- addTagPlaceholder: { type: String, default: 'Add tag...' },
76
- noTagsLabel: { type: String, default: 'No tags' },
76
+ addTagPlaceholder: { type: String, default: () => t('nextcloud-vue', 'Add tag...') },
77
+ noTagsLabel: { type: String, default: () => t('nextcloud-vue', 'No tags') },
77
78
  },
78
79
 
79
80
  data() {
@@ -125,6 +125,7 @@
125
125
  </template>
126
126
 
127
127
  <script>
128
+ import { translate as t } from '@nextcloud/l10n'
128
129
  import { NcButton, NcTextField, NcListItem, NcActionButton, NcLoadingIcon, NcDateTimePickerNative, NcSelect } from '@nextcloud/vue'
129
130
  import Plus from 'vue-material-design-icons/Plus.vue'
130
131
  import Delete from 'vue-material-design-icons/Delete.vue'
@@ -160,16 +161,16 @@ export default {
160
161
  register: { type: String, default: '' },
161
162
  schema: { type: String, default: '' },
162
163
  apiBase: { type: String, default: '/apps/openregister/api' },
163
- addTaskPlaceholder: { type: String, default: 'Add task...' },
164
- deadlineLabel: { type: String, default: 'Deadline' },
165
- assigneeLabel: { type: String, default: 'Assignee' },
166
- completeLabel: { type: String, default: 'Complete' },
167
- editLabel: { type: String, default: 'Edit' },
168
- deleteLabel: { type: String, default: 'Delete' },
169
- noTasksLabel: { type: String, default: 'No linked tasks' },
170
- loadMoreLabel: { type: String, default: 'Load more' },
171
- statusFilterLabel: { type: String, default: 'Status' },
172
- assigneeFilterLabel: { type: String, default: 'Assignee' },
164
+ addTaskPlaceholder: { type: String, default: () => t('nextcloud-vue', 'Add task...') },
165
+ deadlineLabel: { type: String, default: () => t('nextcloud-vue', 'Deadline') },
166
+ assigneeLabel: { type: String, default: () => t('nextcloud-vue', 'Assignee') },
167
+ completeLabel: { type: String, default: () => t('nextcloud-vue', 'Complete') },
168
+ editLabel: { type: String, default: () => t('nextcloud-vue', 'Edit') },
169
+ deleteLabel: { type: String, default: () => t('nextcloud-vue', 'Delete') },
170
+ noTasksLabel: { type: String, default: () => t('nextcloud-vue', 'No linked tasks') },
171
+ loadMoreLabel: { type: String, default: () => t('nextcloud-vue', 'Load more') },
172
+ statusFilterLabel: { type: String, default: () => t('nextcloud-vue', 'Status') },
173
+ assigneeFilterLabel: { type: String, default: () => t('nextcloud-vue', 'Assignee') },
173
174
  },
174
175
 
175
176
  data() {
@@ -150,6 +150,7 @@
150
150
  </template>
151
151
 
152
152
  <script>
153
+ import { translate as t } from '@nextcloud/l10n'
153
154
  import { CnSettingsSection } from '../CnSettingsSection/index.js'
154
155
  import { NcButton, NcLoadingIcon, NcNoteCard, NcSelect } from '@nextcloud/vue'
155
156
  import ContentSave from 'vue-material-design-icons/ContentSave.vue'
@@ -209,12 +210,12 @@ export default {
209
210
  /** Section title */
210
211
  name: {
211
212
  type: String,
212
- default: 'Register Configuration',
213
+ default: () => t('nextcloud-vue', 'Register configuration'),
213
214
  },
214
215
  /** Section description */
215
216
  description: {
216
217
  type: String,
217
- default: 'Configure OpenRegister schema mappings for your object types',
218
+ default: () => t('nextcloud-vue', 'Configure OpenRegister schema mappings for your object types'),
218
219
  },
219
220
  /** Documentation URL */
220
221
  docUrl: {
@@ -259,12 +260,12 @@ export default {
259
260
  /** Save button text */
260
261
  saveButtonText: {
261
262
  type: String,
262
- default: 'Save Configuration',
263
+ default: () => t('nextcloud-vue', 'Save configuration'),
263
264
  },
264
265
  /** Reimport button text */
265
266
  reimportButtonText: {
266
267
  type: String,
267
- default: 'Re-import configuration',
268
+ default: () => t('nextcloud-vue', 'Re-import configuration'),
268
269
  },
269
270
  /** Auto-match schema titles to type slugs on register change */
270
271
  autoMatch: {
@@ -275,15 +276,15 @@ export default {
275
276
  labels: {
276
277
  type: Object,
277
278
  default: () => ({
278
- register: 'Register',
279
- schema: 'Schema',
280
- configured: 'Configured',
281
- notConfigured: 'Not configured',
282
- noSchemas: 'No schemas available in this register',
283
- selectRegister: 'Select a register',
284
- selectSchema: 'Select a schema',
285
- allConfigured: 'All types configured',
286
- partiallyConfigured: 'configured',
279
+ register: t('nextcloud-vue', 'Register'),
280
+ schema: t('nextcloud-vue', 'Schema'),
281
+ configured: t('nextcloud-vue', 'Configured'),
282
+ notConfigured: t('nextcloud-vue', 'Not configured'),
283
+ noSchemas: t('nextcloud-vue', 'No schemas available in this register'),
284
+ selectRegister: t('nextcloud-vue', 'Select a register'),
285
+ selectSchema: t('nextcloud-vue', 'Select a schema'),
286
+ allConfigured: t('nextcloud-vue', 'All types configured'),
287
+ partiallyConfigured: t('nextcloud-vue', 'configured'),
287
288
  }),
288
289
  },
289
290
  },
@@ -179,6 +179,7 @@
179
179
  </template>
180
180
 
181
181
  <script>
182
+ import { translate as t } from '@nextcloud/l10n'
182
183
  import {
183
184
  NcButton,
184
185
  NcTextField,
@@ -268,25 +269,25 @@ export default {
268
269
  /** Show "Delete" button */
269
270
  showDelete: { type: Boolean, default: false },
270
271
  // Labels (pre-translated strings with English defaults)
271
- cancelLabel: { type: String, default: 'Cancel' },
272
- closeLabel: { type: String, default: 'Close' },
272
+ cancelLabel: { type: String, default: () => t('nextcloud-vue', 'Cancel') },
273
+ closeLabel: { type: String, default: () => t('nextcloud-vue', 'Close') },
273
274
  /** Confirm button label. Defaults to "Create" or "Save". */
274
275
  confirmLabel: { type: String, default: '' },
275
276
  /** Success message. Defaults to "Schema saved successfully." */
276
277
  successText: { type: String, default: '' },
277
- extendSchemaLabel: { type: String, default: 'Extend Schema' },
278
- analyzePropertiesLabel: { type: String, default: 'Analyze Properties' },
279
- validateObjectsLabel: { type: String, default: 'Validate Objects' },
280
- deleteObjectsLabel: { type: String, default: 'Delete Objects' },
281
- publishObjectsLabel: { type: String, default: 'Publish Objects' },
282
- deleteLabel: { type: String, default: 'Delete' },
283
- deleteObjectsTooltip: { type: String, default: 'Delete all objects in this schema' },
284
- publishObjectsTooltip: { type: String, default: 'Publish all objects in this schema' },
278
+ extendSchemaLabel: { type: String, default: () => t('nextcloud-vue', 'Extend schema') },
279
+ analyzePropertiesLabel: { type: String, default: () => t('nextcloud-vue', 'Analyze properties') },
280
+ validateObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Validate objects') },
281
+ deleteObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Delete objects') },
282
+ publishObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Publish objects') },
283
+ deleteLabel: { type: String, default: () => t('nextcloud-vue', 'Delete') },
284
+ deleteObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'Delete all objects in this schema') },
285
+ publishObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'Publish all objects in this schema') },
285
286
  /** Tooltip for the Delete Objects button when no objects exist */
286
- noDeleteObjectsTooltip: { type: String, default: 'No objects to delete' },
287
+ noDeleteObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'No objects to delete') },
287
288
  /** Tooltip for the Publish Objects button when no objects exist */
288
- noPublishObjectsTooltip: { type: String, default: 'No objects to publish' },
289
- cannotDeleteTooltip: { type: String, default: 'Cannot delete: objects are still attached' },
289
+ noPublishObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'No objects to publish') },
290
+ cannotDeleteTooltip: { type: String, default: () => t('nextcloud-vue', 'Cannot delete: objects are still attached') },
290
291
  },
291
292
  data() {
292
293
  return {
@@ -333,7 +334,7 @@ export default {
333
334
  },
334
335
  sortedUserGroups() {
335
336
  return this.userGroups
336
- .filter(group => group.id !== 'admin' && group.id !== 'public')
337
+ .filter(group => group.id !== 'admin' && group.id !== 'public' && group.id !== 'authenticated')
337
338
  .sort((a, b) => {
338
339
  const nameA = a.displayname || a.id
339
340
  const nameB = b.displayname || b.id
@@ -1240,7 +1240,7 @@ export default {
1240
1240
 
1241
1241
  getDisplayGroupName(groupId) {
1242
1242
  if (groupId === 'public') return 'Public'
1243
- if (groupId === 'user') return 'User'
1243
+ if (groupId === 'authenticated') return 'Authenticated'
1244
1244
  if (groupId === 'admin') return 'Admin'
1245
1245
 
1246
1246
  const group = this.userGroups.find(g => g.id === groupId)
@@ -1284,8 +1284,8 @@ export default {
1284
1284
  return permissionsList.sort((a, b) => {
1285
1285
  if (a.groupId === 'public') return -1
1286
1286
  if (b.groupId === 'public') return 1
1287
- if (a.groupId === 'user') return -1
1288
- if (b.groupId === 'user') return 1
1287
+ if (a.groupId === 'authenticated') return -1
1288
+ if (b.groupId === 'authenticated') return 1
1289
1289
  if (a.groupId === 'admin') return 1
1290
1290
  if (b.groupId === 'admin') return -1
1291
1291
  return a.group.localeCompare(b.group)
@@ -1295,7 +1295,7 @@ export default {
1295
1295
  getAvailableGroupsForProperty() {
1296
1296
  return [
1297
1297
  { id: 'public', label: 'Public (Unauthenticated)' },
1298
- { id: 'user', label: 'User (Authenticated)' },
1298
+ { id: 'authenticated', label: 'Authenticated' },
1299
1299
  ...this.sortedUserGroups.map(group => ({
1300
1300
  id: group.id,
1301
1301
  label: group.displayname || group.id,
@@ -57,31 +57,31 @@
57
57
  </td>
58
58
  </tr>
59
59
 
60
- <!-- User group (authenticated users) -->
60
+ <!-- Authenticated users group -->
61
61
  <tr class="cn-schema-form__user-row">
62
62
  <td class="cn-schema-form__group-name">
63
- <span class="cn-schema-form__group-badge cn-schema-form__user">user</span>
63
+ <span class="cn-schema-form__group-badge cn-schema-form__user">authenticated</span>
64
64
  <small>Authenticated users</small>
65
65
  </td>
66
66
  <td>
67
67
  <NcCheckboxRadioSwitch
68
- :checked="hasGroupPermission('user', 'create')"
69
- @update:checked="updateGroupPermission('user', 'create', $event)" />
68
+ :checked="hasGroupPermission('authenticated', 'create')"
69
+ @update:checked="updateGroupPermission('authenticated', 'create', $event)" />
70
70
  </td>
71
71
  <td>
72
72
  <NcCheckboxRadioSwitch
73
- :checked="hasGroupPermission('user', 'read')"
74
- @update:checked="updateGroupPermission('user', 'read', $event)" />
73
+ :checked="hasGroupPermission('authenticated', 'read')"
74
+ @update:checked="updateGroupPermission('authenticated', 'read', $event)" />
75
75
  </td>
76
76
  <td>
77
77
  <NcCheckboxRadioSwitch
78
- :checked="hasGroupPermission('user', 'update')"
79
- @update:checked="updateGroupPermission('user', 'update', $event)" />
78
+ :checked="hasGroupPermission('authenticated', 'update')"
79
+ @update:checked="updateGroupPermission('authenticated', 'update', $event)" />
80
80
  </td>
81
81
  <td>
82
82
  <NcCheckboxRadioSwitch
83
- :checked="hasGroupPermission('user', 'delete')"
84
- @update:checked="updateGroupPermission('user', 'delete', $event)" />
83
+ :checked="hasGroupPermission('authenticated', 'delete')"
84
+ @update:checked="updateGroupPermission('authenticated', 'delete', $event)" />
85
85
  </td>
86
86
  </tr>
87
87
 
@@ -60,6 +60,7 @@
60
60
  </template>
61
61
 
62
62
  <script>
63
+ import { translate as t } from '@nextcloud/l10n'
63
64
  import { NcSettingsSection, NcLoadingIcon, NcButton } from '@nextcloud/vue'
64
65
  import Refresh from 'vue-material-design-icons/Refresh.vue'
65
66
  import InformationOutline from 'vue-material-design-icons/InformationOutline.vue'
@@ -140,7 +141,7 @@ export default {
140
141
  /** Message shown during loading */
141
142
  loadingMessage: {
142
143
  type: String,
143
- default: 'Loading...',
144
+ default: () => t('nextcloud-vue', 'Loading...'),
144
145
  },
145
146
  /** Whether the section is in an error state */
146
147
  error: {
@@ -150,7 +151,7 @@ export default {
150
151
  /** Message shown when in error state */
151
152
  errorMessage: {
152
153
  type: String,
153
- default: 'An error occurred',
154
+ default: () => t('nextcloud-vue', 'An error occurred'),
154
155
  },
155
156
  /** Callback function for retry button (shown in error state). If null, no retry button is shown. */
156
157
  onRetry: {
@@ -160,7 +161,7 @@ export default {
160
161
  /** Text for the retry button */
161
162
  retryButtonText: {
162
163
  type: String,
163
- default: 'Retry',
164
+ default: () => t('nextcloud-vue', 'Retry'),
164
165
  },
165
166
  /** Whether the section has no data to show */
166
167
  empty: {
@@ -170,7 +171,7 @@ export default {
170
171
  /** Message shown when section is empty */
171
172
  emptyMessage: {
172
173
  type: String,
173
- default: 'No data available',
174
+ default: () => t('nextcloud-vue', 'No data available'),
174
175
  },
175
176
  },
176
177
  }
@@ -15,7 +15,7 @@
15
15
  <!-- Content -->
16
16
  <div class="cn-stats-block__content">
17
17
  <div class="cn-stats-block__header">
18
- <h4>{{ title || 'Objects' }}</h4>
18
+ <h4>{{ title || t('nextcloud-vue', 'Objects') }}</h4>
19
19
  </div>
20
20
 
21
21
  <div v-if="count > 0 || (showZeroCount && count === 0)" class="cn-stats-block__count">
@@ -49,6 +49,7 @@
49
49
  </template>
50
50
 
51
51
  <script>
52
+ import { translate as t } from '@nextcloud/l10n'
52
53
  import { NcLoadingIcon } from '@nextcloud/vue'
53
54
 
54
55
  /**
@@ -112,7 +113,7 @@ export default {
112
113
  /** Label displayed next to the count */
113
114
  countLabel: {
114
115
  type: String,
115
- default: 'objects',
116
+ default: () => t('nextcloud-vue', 'objects'),
116
117
  },
117
118
  /** Detailed breakdown object (key-value pairs) */
118
119
  breakdown: {
@@ -127,12 +128,12 @@ export default {
127
128
  /** Text shown while loading */
128
129
  loadingLabel: {
129
130
  type: String,
130
- default: 'Loading...',
131
+ default: () => t('nextcloud-vue', 'Loading...'),
131
132
  },
132
133
  /** Text shown when count is 0 */
133
134
  emptyLabel: {
134
135
  type: String,
135
- default: 'No items found',
136
+ default: () => t('nextcloud-vue', 'No items found'),
136
137
  },
137
138
  /** Icon component (e.g., imported MDI icon) */
138
139
  icon: {
@@ -143,6 +143,7 @@
143
143
  </template>
144
144
 
145
145
  <script>
146
+ import { translate as t } from '@nextcloud/l10n'
146
147
  import { NcLoadingIcon, NcListItem } from '@nextcloud/vue'
147
148
  import { CnStatsBlock } from '../CnStatsBlock/index.js'
148
149
  import { CnKpiGrid } from '../CnKpiGrid/index.js'
@@ -238,13 +239,13 @@ export default {
238
239
  /** Label shown during loading state */
239
240
  loadingLabel: {
240
241
  type: String,
241
- default: 'Loading...',
242
+ default: () => t('nextcloud-vue', 'Loading...'),
242
243
  },
243
244
 
244
245
  /** Default text shown when a section has no items. Can be overridden per section via `section.emptyLabel`. */
245
246
  emptyLabel: {
246
247
  type: String,
247
- default: 'No data available',
248
+ default: () => t('nextcloud-vue', 'No data available'),
248
249
  },
249
250
  },
250
251
 
@@ -102,6 +102,7 @@
102
102
  </template>
103
103
 
104
104
  <script>
105
+ import { translate as t } from '@nextcloud/l10n'
105
106
  import {
106
107
  NcButton,
107
108
  NcDialog,
@@ -171,7 +172,7 @@ export default {
171
172
  */
172
173
  entityName: {
173
174
  type: String,
174
- default: 'Item',
175
+ default: () => t('nextcloud-vue', 'Item'),
175
176
  },
176
177
  /**
177
178
  * NcDialog size. One of 'small', 'normal', 'large', 'full'.
@@ -220,7 +221,7 @@ export default {
220
221
  */
221
222
  cancelLabel: {
222
223
  type: String,
223
- default: 'Cancel',
224
+ default: () => t('nextcloud-vue', 'Cancel'),
224
225
  },
225
226
  /**
226
227
  * Close button label shown in the result phase.
@@ -229,7 +230,7 @@ export default {
229
230
  */
230
231
  closeLabel: {
231
232
  type: String,
232
- default: 'Close',
233
+ default: () => t('nextcloud-vue', 'Close'),
233
234
  },
234
235
  /**
235
236
  * Primary confirm button label. Defaults to "Create" in create mode
@@ -248,7 +249,7 @@ export default {
248
249
  */
249
250
  createAnotherLabel: {
250
251
  type: String,
251
- default: 'Create another',
252
+ default: () => t('nextcloud-vue', 'Create another'),
252
253
  },
253
254
  },
254
255
  data() {
@@ -292,8 +293,8 @@ export default {
292
293
  return this.dialogTitle
293
294
  }
294
295
  return this.isCreateMode
295
- ? `Create ${this.entityName}`
296
- : `Edit ${this.entityName}`
296
+ ? t('nextcloud-vue', 'Create {title}', { title: this.entityName })
297
+ : t('nextcloud-vue', 'Edit {title}', { title: this.entityName })
297
298
  },
298
299
  /**
299
300
  * Resolved success text for NcNoteCard.
@@ -304,7 +305,7 @@ export default {
304
305
  if (this.successText) {
305
306
  return this.successText
306
307
  }
307
- return `${this.entityName} saved successfully`
308
+ return t('nextcloud-vue', '{title} saved successfully.', { title: this.entityName })
308
309
  },
309
310
  /**
310
311
  * Resolved primary button label.
@@ -315,7 +316,7 @@ export default {
315
316
  if (this.confirmLabel) {
316
317
  return this.confirmLabel
317
318
  }
318
- return this.isCreateMode ? 'Create' : 'Save'
319
+ return this.isCreateMode ? t('nextcloud-vue', 'Create') : t('nextcloud-vue', 'Save')
319
320
  },
320
321
  },
321
322
  beforeDestroy() {
@@ -51,6 +51,7 @@
51
51
  </template>
52
52
 
53
53
  <script>
54
+ import { translate as t } from '@nextcloud/l10n'
54
55
  import { NcLoadingIcon } from '@nextcloud/vue'
55
56
  import CnDataTable from '../CnDataTable/CnDataTable.vue'
56
57
 
@@ -153,12 +154,12 @@ export default {
153
154
  /** Pre-translated "View all" label. */
154
155
  viewAllLabel: {
155
156
  type: String,
156
- default: 'View all',
157
+ default: () => t('nextcloud-vue', 'View all'),
157
158
  },
158
159
  /** Pre-translated empty state text. */
159
160
  emptyText: {
160
161
  type: String,
161
- default: 'No data available',
162
+ default: () => t('nextcloud-vue', 'No data available'),
162
163
  },
163
164
  },
164
165
 
@@ -87,6 +87,7 @@
87
87
  </template>
88
88
 
89
89
  <script>
90
+ import { translate as t } from '@nextcloud/l10n'
90
91
  import { NcLoadingIcon } from '@nextcloud/vue'
91
92
  import CheckboxMarkedOutline from 'vue-material-design-icons/CheckboxMarkedOutline.vue'
92
93
  import CheckboxBlankOutline from 'vue-material-design-icons/CheckboxBlankOutline.vue'
@@ -162,10 +163,10 @@ export default {
162
163
  },
163
164
 
164
165
  // --- Pre-translated labels ---
165
- titleLabel: { type: String, default: 'Tasks' },
166
- noTasksLabel: { type: String, default: 'No tasks' },
167
- showAllLabel: { type: String, default: 'Show all' },
168
- unassignedLabel: { type: String, default: 'Unassigned' },
166
+ titleLabel: { type: String, default: () => t('nextcloud-vue', 'Tasks') },
167
+ noTasksLabel: { type: String, default: () => t('nextcloud-vue', 'No tasks') },
168
+ showAllLabel: { type: String, default: () => t('nextcloud-vue', 'Show all') },
169
+ unassignedLabel: { type: String, default: () => t('nextcloud-vue', 'Unassigned') },
169
170
  },
170
171
 
171
172
  emits: ['show-all'],
@@ -67,6 +67,8 @@
67
67
  </template>
68
68
 
69
69
  <script>
70
+ import { translate as t } from '@nextcloud/l10n'
71
+
70
72
  /**
71
73
  * CnTimelineStages — Timeline/progress stages component.
72
74
  *
@@ -148,7 +150,7 @@ export default {
148
150
  */
149
151
  ariaLabel: {
150
152
  type: String,
151
- default: 'Progress stages',
153
+ default: () => t('nextcloud-vue', 'Progress stages'),
152
154
  },
153
155
  },
154
156
 
@@ -97,6 +97,7 @@
97
97
  </template>
98
98
 
99
99
  <script>
100
+ import { translate as t } from '@nextcloud/l10n'
100
101
  import { NcPopover, NcActionButton, NcAvatar } from '@nextcloud/vue'
101
102
 
102
103
  import MessageTextOutline from 'vue-material-design-icons/MessageTextOutline.vue'
@@ -143,7 +144,7 @@ export default {
143
144
  /** The user's display name */
144
145
  displayName: {
145
146
  type: String,
146
- default: 'Unknown',
147
+ default: () => t('nextcloud-vue', 'Unknown'),
147
148
  },
148
149
  /** Whether the menu is interactive (false for current user or system accounts) */
149
150
  interactive: {
@@ -152,11 +153,11 @@ export default {
152
153
  },
153
154
 
154
155
  // --- Pre-translated labels ---
155
- sendMessageLabel: { type: String, default: 'Send message' },
156
- startChatLabel: { type: String, default: 'Start chat' },
157
- sendEmailLabel: { type: String, default: 'Send email' },
158
- planMeetingLabel: { type: String, default: 'Plan meeting' },
159
- noActionsLabel: { type: String, default: 'No communication apps available' },
156
+ sendMessageLabel: { type: String, default: () => t('nextcloud-vue', 'Send message') },
157
+ startChatLabel: { type: String, default: () => t('nextcloud-vue', 'Start chat') },
158
+ sendEmailLabel: { type: String, default: () => t('nextcloud-vue', 'Send email') },
159
+ planMeetingLabel: { type: String, default: () => t('nextcloud-vue', 'Schedule meeting') },
160
+ noActionsLabel: { type: String, default: () => t('nextcloud-vue', 'No communication apps available') },
160
161
  },
161
162
 
162
163
  emits: ['action'],