@conduction/nextcloud-vue 2.78.0 → 2.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/dist/bundled-packages.json +0 -2
  2. package/dist/esm/bundled-packages.json +0 -2
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
  5. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  6. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
  7. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  8. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +115 -104
  9. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  10. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +12 -2
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  12. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  13. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +39 -3
  14. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  15. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +158 -0
  17. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  18. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +157 -96
  19. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  20. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +139 -1
  21. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  22. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +140 -92
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +77 -0
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +5 -2
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +62 -4
  29. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  30. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +85 -1
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  33. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
  34. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  35. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
  36. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
  37. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +736 -0
  38. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
  39. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
  40. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
  41. package/dist/esm/components/CnFactsWidget/index.js +30 -0
  42. package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
  43. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
  44. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
  45. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +551 -0
  46. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
  47. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +183 -0
  48. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
  49. package/dist/esm/components/CnFieldListWidget/index.js +29 -0
  50. package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
  51. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +173 -5
  52. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  53. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +181 -99
  54. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  55. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +29 -11
  56. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  57. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js +252 -0
  58. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js.map +1 -0
  59. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +66 -18
  60. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  61. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
  62. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  63. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +18 -3
  64. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  65. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  66. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +330 -74
  67. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  68. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +34 -15
  69. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  70. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
  71. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
  72. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
  73. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
  74. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
  75. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
  76. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +100 -3
  77. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  78. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +4 -2
  79. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  80. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
  81. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  82. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  83. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +3 -2
  84. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  85. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  86. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
  87. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
  88. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +387 -0
  89. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
  90. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +169 -0
  91. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
  92. package/dist/esm/components/CnRecordListWidget/index.js +31 -0
  93. package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
  94. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  95. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js +1 -1
  96. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  97. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
  98. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
  99. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
  100. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
  101. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
  102. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
  103. package/dist/esm/components/CnSectionsWidget/index.js +35 -0
  104. package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
  105. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
  106. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  107. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  108. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  109. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
  110. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  111. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +152 -8
  112. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  113. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +84 -23
  114. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  115. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  116. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  117. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -0
  118. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  119. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  120. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +106 -2
  121. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  122. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +105 -53
  123. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  124. package/dist/esm/composables/useAppManifest.js +8 -3
  125. package/dist/esm/composables/useAppManifest.js.map +1 -1
  126. package/dist/esm/composables/useFormDraft.js +140 -9
  127. package/dist/esm/composables/useFormDraft.js.map +1 -1
  128. package/dist/esm/index.js +5 -0
  129. package/dist/esm/index.js.map +1 -1
  130. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
  131. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  132. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
  133. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  134. package/dist/esm/integrations/builtin/field-inspection.js +21 -0
  135. package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
  136. package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
  137. package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
  138. package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
  139. package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
  140. package/dist/esm/integrations/offline/index.js +2 -1
  141. package/dist/esm/integrations/offline/index.js.map +1 -1
  142. package/dist/esm/integrations/offline/offlineDb.js +6 -1
  143. package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
  144. package/dist/esm/integrations/offline/syncReplayService.js +8 -2
  145. package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
  146. package/dist/esm/l10n/en.json.js +72 -1
  147. package/dist/esm/l10n/en.json.js.map +1 -1
  148. package/dist/esm/l10n/nl.json.js +120 -2
  149. package/dist/esm/l10n/nl.json.js.map +1 -1
  150. package/dist/esm/nextcloud-vue.css +1314 -74
  151. package/dist/esm/utils/boardDate.js +193 -0
  152. package/dist/esm/utils/boardDate.js.map +1 -0
  153. package/dist/esm/utils/detailActionModel.js +60 -3
  154. package/dist/esm/utils/detailActionModel.js.map +1 -1
  155. package/dist/esm/utils/dynamicProperties.js +5 -1
  156. package/dist/esm/utils/dynamicProperties.js.map +1 -1
  157. package/dist/esm/utils/fillTemplate.js +114 -0
  158. package/dist/esm/utils/fillTemplate.js.map +1 -0
  159. package/dist/esm/utils/libraryWidgetKeys.js +4 -0
  160. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  161. package/dist/esm/utils/queryPresets.js +96 -0
  162. package/dist/esm/utils/queryPresets.js.map +1 -0
  163. package/dist/esm/utils/resolveFilterTokens.js +11 -0
  164. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  165. package/dist/esm/utils/schema.js +21 -0
  166. package/dist/esm/utils/schema.js.map +1 -1
  167. package/dist/esm/utils/sentinelTokens.js +3 -3
  168. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  169. package/dist/esm/utils/validateManifestV2.compiled.js +57 -6
  170. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  171. package/dist/esm/utils/widgetDispatch.js +7 -1
  172. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  173. package/dist/nextcloud-vue.cjs.js +14278 -8169
  174. package/dist/nextcloud-vue.cjs.js.map +2 -2
  175. package/dist/nextcloud-vue.css +1314 -74
  176. package/l10n/en.json +72 -1
  177. package/l10n/nl.json +120 -2
  178. package/package.json +1 -1
  179. package/scripts/build-validators.js +26 -0
  180. package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
  181. package/src/components/CnActionsBar/CnActionsBar.md +4 -0
  182. package/src/components/CnActionsBar/CnActionsBar.vue +83 -42
  183. package/src/components/CnAppRoot/CnAppRoot.vue +12 -2
  184. package/src/components/CnBannerWidget/CnBannerWidget.vue +39 -3
  185. package/src/components/CnCellRenderer/CnCellRenderer.vue +306 -2
  186. package/src/components/CnDashboardPage/CnDashboardPage.vue +219 -4
  187. package/src/components/CnDataTable/CnDataTable.md +2 -0
  188. package/src/components/CnDataTable/CnDataTable.vue +82 -2
  189. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  190. package/src/components/CnDetailPage/CnDetailPage.vue +63 -3
  191. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +127 -1
  192. package/src/components/CnFactsWidget/CnFactsWidget.vue +1050 -0
  193. package/src/components/CnFactsWidget/index.js +29 -0
  194. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +746 -0
  195. package/src/components/CnFieldListWidget/index.js +28 -0
  196. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +232 -11
  197. package/src/components/CnFilesBrowser/filesBrowser.js +43 -2
  198. package/src/components/CnFilesBrowser/index.js +1 -0
  199. package/src/components/CnFilesBrowser/openRegisterSource.js +248 -0
  200. package/src/components/CnFormDialog/CnFormDialog.md +9 -3
  201. package/src/components/CnFormDialog/CnFormDialog.vue +70 -22
  202. package/src/components/CnFormPage/CnFormPage.vue +18 -3
  203. package/src/components/CnIndexPage/CnIndexPage.vue +281 -9
  204. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
  205. package/src/components/CnObjectSidebar/CnFilesTab.vue +103 -4
  206. package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
  207. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +3 -2
  208. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +603 -0
  209. package/src/components/CnRecordListWidget/index.js +30 -0
  210. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +1 -1
  211. package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
  212. package/src/components/CnSectionsWidget/index.js +34 -0
  213. package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
  214. package/src/components/CnStatWidget/CnStatWidget.vue +1 -1
  215. package/src/components/CnTabsWidget/CnTabsWidget.vue +214 -9
  216. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  217. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -0
  218. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +188 -4
  219. package/src/components/index.js +5 -1
  220. package/src/composables/__tests__/useFormDraft.spec.js +69 -0
  221. package/src/composables/useAppManifest.js +8 -3
  222. package/src/composables/useFormDraft.js +139 -8
  223. package/src/css/form-field.css +14 -0
  224. package/src/css/index-page.css +71 -0
  225. package/src/css/kpi-card.css +32 -0
  226. package/src/css/look-board-detail.css +87 -0
  227. package/src/css/look-board-index.css +143 -14
  228. package/src/css/look-board.css +114 -2
  229. package/src/css/table.css +56 -0
  230. package/src/index.js +8 -0
  231. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
  232. package/src/integrations/builtin/field-inspection.js +21 -0
  233. package/src/integrations/offline/checklistSubmission.js +137 -0
  234. package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
  235. package/src/integrations/offline/index.js +3 -0
  236. package/src/integrations/offline/offlineDb.js +6 -1
  237. package/src/integrations/offline/syncReplayService.js +8 -2
  238. package/src/schemas/app-manifest-v2.schema.json +149 -5
  239. package/src/utils/boardDate.js +189 -0
  240. package/src/utils/detailActionModel.js +59 -2
  241. package/src/utils/dynamicProperties.js +5 -1
  242. package/src/utils/fillTemplate.js +110 -0
  243. package/src/utils/libraryWidgetKeys.js +4 -0
  244. package/src/utils/queryPresets.js +93 -0
  245. package/src/utils/resolveFilterTokens.js +11 -0
  246. package/src/utils/schema.js +21 -0
  247. package/src/utils/sentinelTokens.js +3 -3
  248. package/src/utils/validateManifestV2.compiled.js +57 -2
  249. package/src/utils/widgetDispatch.js +7 -1
  250. package/dist/esm/_virtual/equal.js +0 -4
  251. package/dist/esm/_virtual/equal.js.map +0 -1
  252. package/dist/esm/_virtual/ucs2length.js +0 -4
  253. package/dist/esm/_virtual/ucs2length.js.map +0 -1
  254. package/dist/esm/node_modules/ajv/dist/runtime/equal.js +0 -9
  255. package/dist/esm/node_modules/ajv/dist/runtime/equal.js.map +0 -1
  256. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js +0 -25
  257. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js.map +0 -1
  258. package/dist/esm/node_modules/fast-deep-equal/index.js +0 -47
  259. package/dist/esm/node_modules/fast-deep-equal/index.js.map +0 -1
package/l10n/en.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "translations": {
3
+ "You cannot see these files": "You cannot see these files",
4
+ "Delete {name}? This cannot be undone here.": "Delete {name}? This cannot be undone here.",
3
5
  "Linked items": "Linked items",
4
6
  "Still loading: {sections}": "Still loading: {sections}",
5
7
  "Could not load {section}.": "Could not load {section}.",
@@ -65,6 +67,7 @@
65
67
  "Follow this record to get its updates": "Follow this record to get its updates",
66
68
  "You will see it under Following. This register sends no change notifications.": "You will see it under Following. This register sends no change notifications.",
67
69
  "Since {date}": "Since {date}",
70
+ "since {date}": "since {date}",
68
71
  "Remove {name} as a follower": "Remove {name} as a follower",
69
72
  "Could not change following.": "Could not change following.",
70
73
  "Could not add this colleague.": "Could not add this colleague.",
@@ -224,6 +227,7 @@
224
227
  "Access URL": "Access URL",
225
228
  "Action": "Action",
226
229
  "Actions": "Actions",
230
+ "optional": "optional",
227
231
  "Add": "Add",
228
232
  "Add condition": "Add condition",
229
233
  "Add enum value": "Add enum value",
@@ -298,6 +302,9 @@
298
302
  "Constant": "Constant",
299
303
  "Copy": "Copy",
300
304
  "Copied": "Copied",
305
+ "Show": "Show",
306
+ "Copy {label}": "Copy {label}",
307
+ "Show {label}": "Show {label}",
301
308
  "Copy item": "Copy item",
302
309
  "Copy items": "Copy items",
303
310
  "Copy of {name}": "Copy of {name}",
@@ -572,6 +579,8 @@
572
579
  "Order": "Order",
573
580
  "Owner:": "Owner:",
574
581
  "Page {current} of {total}": "Page {current} of {total}",
582
+ "{shown} of {total}": "{shown} of {total}",
583
+ "{from}–{to} of {total}": "{from}–{to} of {total}",
575
584
  "Parent schemas:": "Parent schemas:",
576
585
  "Password": "Password",
577
586
  "Pattern (regex)": "Pattern (regex)",
@@ -771,6 +780,28 @@
771
780
  "Message input": "Message input",
772
781
  "Start new chat": "Start new chat",
773
782
  "History": "History",
783
+ "No audit entries yet": "No audit entries yet",
784
+ "Meetings": "Meetings",
785
+ "No meetings": "No meetings",
786
+ "Open in Calendar": "Open in Calendar",
787
+ "(no title)": "(no title)",
788
+ "Could not load meetings.": "Could not load meetings.",
789
+ "Could not load meeting.": "Could not load meeting.",
790
+ "Calendar is currently unavailable.": "Calendar is currently unavailable.",
791
+ "Show all {count} fields": "Show all {count} fields",
792
+ "Show less": "Show less",
793
+ "{count} more": "{count} more",
794
+ "Identifier: {identifier}": "Identifier: {identifier}",
795
+ "What happened, who did it and when, newest first": "What happened, who did it and when, newest first",
796
+ "{app} is not installed": "{app} is not installed",
797
+ "Install and enable the {app} app to see this.": "Install and enable the {app} app to see this.",
798
+ "{title} needs the {app} app. Install and enable it to see this.": "{title} needs the {app} app. Install and enable it to see this.",
799
+ "View all ({total})": "View all ({total})",
800
+ "No items": "No items",
801
+ "Nothing here yet": "Nothing here yet",
802
+ "This list could not be loaded.": "This list could not be loaded.",
803
+ "No items match this filter": "No items match this filter",
804
+ "Could not load these records": "Could not load these records",
774
805
  "No conversations yet": "No conversations yet",
775
806
  "Connecting...": "Connecting...",
776
807
  "Loading conversations...": "Loading conversations...",
@@ -1309,9 +1340,41 @@
1309
1340
  "Filter by {column}, active": "Filter by {column}, active",
1310
1341
  "Turn notifications off": "Turn notifications off",
1311
1342
  "Turn notifications on": "Turn notifications on",
1312
- "Could not change notifications.": "Could not change notifications."
1343
+ "Could not change notifications.": "Could not change notifications.",
1344
+ "Actions for the selection": "Actions for the selection",
1345
+ "Active:": "Active:",
1346
+ "Filter": "Filter",
1347
+ "List": "List",
1348
+ "Map": "Map",
1349
+ "Remove filter: {label}": "Remove filter: {label}",
1350
+ "Search and columns": "Search and columns",
1351
+ "Sort by": "Sort by",
1352
+ "View mode": "View mode",
1353
+ "With the selected {plural}": "With the selected {plural}",
1354
+ "items": "items",
1355
+ "{count} active": "{count} active",
1356
+ "Delete \"{name}\"": "Delete \"{name}\"",
1357
+ "No saved views yet": "No saved views yet",
1358
+ "No views with this label": "No views with this label",
1359
+ "Save current view…": "Save current view…",
1360
+ "Save view": "Save view",
1361
+ "Saved views": "Saved views",
1362
+ "Show only views labelled \"{label}\"": "Show only views labelled \"{label}\"",
1363
+ "Stop filtering on \"{label}\"": "Stop filtering on \"{label}\"",
1364
+ "{name}, level {level}": "{name}, level {level}",
1365
+ "{name}. Parts of this view come from one you cannot see.": "{name}. Parts of this view come from one you cannot see.",
1366
+ "More filters": "More filters",
1367
+ "Quick filters": "Quick filters",
1368
+ "{count} filters": "{count} filters",
1369
+ "{count} more filters": "{count} more filters",
1370
+ "{label} — show the other filters": "{label} — show the other filters",
1371
+ "{view}: not available on this list": "{view}: not available on this list"
1313
1372
  },
1314
1373
  "plurals": {
1374
+ "{count} selected": [
1375
+ "{count} selected",
1376
+ "{count} selected"
1377
+ ],
1315
1378
  "%n year": [
1316
1379
  "%n year",
1317
1380
  "%n years"
@@ -1320,6 +1383,10 @@
1320
1383
  "%n month",
1321
1384
  "%n months"
1322
1385
  ],
1386
+ "%n hour": [
1387
+ "%n hour",
1388
+ "%n hours"
1389
+ ],
1323
1390
  "%n day": [
1324
1391
  "%n day",
1325
1392
  "%n days"
@@ -1375,6 +1442,10 @@
1375
1442
  "in {count} day": [
1376
1443
  "in {count} day",
1377
1444
  "in {count} days"
1445
+ ],
1446
+ "{count} more filter": [
1447
+ "{count} more filter",
1448
+ "{count} more filters"
1378
1449
  ]
1379
1450
  }
1380
1451
  }
package/l10n/nl.json CHANGED
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "translations": {
3
+ "You cannot see these files": "Je kunt deze bestanden niet zien",
4
+ "Delete {name}? This cannot be undone here.": "{name} verwijderen? Dit kun je hier niet ongedaan maken.",
3
5
  "Linked items": "Gekoppelde items",
4
6
  "Still loading: {sections}": "Nog aan het laden: {sections}",
5
7
  "Could not load {section}.": "{section} kon niet worden geladen.",
@@ -65,6 +67,7 @@
65
67
  "Follow this record to get its updates": "Volg dit dossier om de wijzigingen te ontvangen",
66
68
  "You will see it under Following. This register sends no change notifications.": "U ziet het onder Volgend. Dit register stuurt geen wijzigingsmeldingen.",
67
69
  "Since {date}": "Sinds {date}",
70
+ "since {date}": "sinds {date}",
68
71
  "Remove {name} as a follower": "{name} als volger verwijderen",
69
72
  "Could not change following.": "Volgen kon niet worden gewijzigd.",
70
73
  "Could not add this colleague.": "Deze collega kon niet worden toegevoegd.",
@@ -223,6 +226,7 @@
223
226
  "Access URL": "Toegangs-URL",
224
227
  "Action": "Actie",
225
228
  "Actions": "Acties",
229
+ "optional": "niet verplicht",
226
230
  "Add": "Toevoegen",
227
231
  "Add condition": "Voorwaarde toevoegen",
228
232
  "Add enum value": "Opsommingswaarde toevoegen",
@@ -297,6 +301,9 @@
297
301
  "Constant": "Constante",
298
302
  "Copy": "Kopiëren",
299
303
  "Copied": "Gekopieerd",
304
+ "Show": "Tonen",
305
+ "Copy {label}": "{label} kopiëren",
306
+ "Show {label}": "{label} tonen",
300
307
  "Copy item": "Item kopiëren",
301
308
  "Copy items": "Items kopiëren",
302
309
  "Copy of {name}": "Kopie van {name}",
@@ -567,10 +574,16 @@
567
574
  "Open": "Openen",
568
575
  "Open access:": "Openbare toegang:",
569
576
  "Open row": "Rij openen",
577
+ "Select all rows": "Alle rijen selecteren",
578
+ "Select row": "Rij selecteren",
579
+ "Scrollable table": "Scrollbare tabel",
580
+ "{title} — scrollable table": "{title}, scrollbare tabel",
570
581
  "Operator": "Operator",
571
582
  "Order": "Volgorde",
572
583
  "Owner:": "Eigenaar:",
573
584
  "Page {current} of {total}": "Pagina {current} van {total}",
585
+ "{shown} of {total}": "{shown} van {total}",
586
+ "{from}–{to} of {total}": "{from}–{to} van {total}",
574
587
  "Parent schemas:": "Bovenliggende schema's:",
575
588
  "Password": "Wachtwoord",
576
589
  "Pattern (regex)": "Patroon (regex)",
@@ -769,7 +782,29 @@
769
782
  "AI assistant": "AI-assistent",
770
783
  "Message input": "Berichtinvoer",
771
784
  "Start new chat": "Nieuwe chat starten",
772
- "History": "Geschiedenis",
785
+ "History": "Historie",
786
+ "No audit entries yet": "Nog geen wijzigingen vastgelegd",
787
+ "Meetings": "Afspraken",
788
+ "No meetings": "Geen afspraken",
789
+ "Open in Calendar": "Openen in Agenda",
790
+ "(no title)": "(geen titel)",
791
+ "Could not load meetings.": "De afspraken konden niet worden geladen.",
792
+ "Could not load meeting.": "De afspraak kon niet worden geladen.",
793
+ "Calendar is currently unavailable.": "De agenda is nu niet beschikbaar.",
794
+ "Show all {count} fields": "Alle {count} velden tonen",
795
+ "Show less": "Minder tonen",
796
+ "{count} more": "Nog {count}",
797
+ "Identifier: {identifier}": "Kenmerk: {identifier}",
798
+ "What happened, who did it and when, newest first": "Wat er gebeurde, door wie en wanneer, nieuwste eerst",
799
+ "{app} is not installed": "{app} is niet geïnstalleerd",
800
+ "Install and enable the {app} app to see this.": "Installeer en activeer de app {app} om dit te zien.",
801
+ "{title} needs the {app} app. Install and enable it to see this.": "{title} heeft de app {app} nodig. Installeer en activeer die om dit te zien.",
802
+ "View all ({total})": "Alles bekijken ({total})",
803
+ "No items": "Geen items",
804
+ "Nothing here yet": "Hier staat nog niets",
805
+ "This list could not be loaded.": "Deze lijst kon niet worden geladen.",
806
+ "No items match this filter": "Geen items voldoen aan dit filter",
807
+ "Could not load these records": "Deze gegevens konden niet worden geladen",
773
808
  "No conversations yet": "Nog geen gesprekken",
774
809
  "Connecting...": "Verbinden...",
775
810
  "Loading conversations...": "Gesprekken laden...",
@@ -1360,9 +1395,84 @@
1360
1395
  "Filter by {column}, active": "Filteren op {column}, actief",
1361
1396
  "Turn notifications off": "Meldingen uitzetten",
1362
1397
  "Turn notifications on": "Meldingen aanzetten",
1363
- "Could not change notifications.": "Meldingen konden niet worden gewijzigd."
1398
+ "Could not change notifications.": "Meldingen konden niet worden gewijzigd.",
1399
+ "Actions for the selection": "Acties voor de selectie",
1400
+ "Active:": "Actief:",
1401
+ "Filter": "Filter",
1402
+ "List": "Lijst",
1403
+ "Map": "Kaart",
1404
+ "Remove filter: {label}": "Filter verwijderen: {label}",
1405
+ "Search and columns": "Zoeken en kolommen",
1406
+ "Sort by": "Sorteren op",
1407
+ "View mode": "Weergave",
1408
+ "With the selected {plural}": "Met de geselecteerde {plural}",
1409
+ "items": "items",
1410
+ "{count} active": "{count} actief",
1411
+ "Delete \"{name}\"": "\"{name}\" verwijderen",
1412
+ "No saved views yet": "Nog geen opgeslagen weergaven",
1413
+ "No views with this label": "Geen weergaven met dit label",
1414
+ "Save current view…": "Huidige weergave opslaan…",
1415
+ "Save view": "Weergave opslaan",
1416
+ "Saved views": "Opgeslagen weergaven",
1417
+ "Show only views labelled \"{label}\"": "Alleen weergaven met label \"{label}\" tonen",
1418
+ "Stop filtering on \"{label}\"": "Niet meer filteren op \"{label}\"",
1419
+ "{name}, level {level}": "{name}, niveau {level}",
1420
+ "{name}. Parts of this view come from one you cannot see.": "{name}. Delen van deze weergave komen uit een weergave die u niet kunt zien.",
1421
+ "More filters": "Meer filters",
1422
+ "Quick filters": "Snelfilters",
1423
+ "{count} filters": "{count} filters",
1424
+ "{count} more filters": "{count} filters meer",
1425
+ "{label} — show the other filters": "{label}, toon de andere filters",
1426
+ "A file or folder with that name is already here": "Hier staat al een bestand of map met die naam",
1427
+ "A file with that name is already here": "Hier staat al een bestand met die naam",
1428
+ "A name cannot contain a slash": "Een naam kan geen schuine streep bevatten",
1429
+ "Actions for {name}": "Acties voor {name}",
1430
+ "Download": "Downloaden",
1431
+ "Drop files here, or use New": "Sleep bestanden hierheen, of gebruik Nieuw",
1432
+ "Folder name": "Mapnaam",
1433
+ "Modified": "Gewijzigd",
1434
+ "New": "Nieuw",
1435
+ "New folder": "Nieuwe map",
1436
+ "New name": "Nieuwe naam",
1437
+ "Rename": "Naam wijzigen",
1438
+ "Show in Files": "Tonen in Bestanden",
1439
+ "Size": "Grootte",
1440
+ "The folder could not be created": "De map kon niet worden gemaakt",
1441
+ "The folder could not be read": "De map kon niet worden gelezen",
1442
+ "The name could not be changed": "De naam kon niet worden gewijzigd",
1443
+ "The upload failed": "Het uploaden is mislukt",
1444
+ "This folder is empty": "Deze map is leeg",
1445
+ "This folder no longer exists": "Deze map bestaat niet meer",
1446
+ "Try again": "Opnieuw proberen",
1447
+ "Upload files": "Bestanden uploaden",
1448
+ "You cannot see this folder": "Je kunt deze map niet zien",
1449
+ "{action} did not succeed": "{action} is niet gelukt",
1450
+ "Error:": "Fout:",
1451
+ "Copy link": "Link kopiëren",
1452
+ "Details and sharing": "Details en delen",
1453
+ "Link copied": "Link gekopieerd",
1454
+ "Share uploaded files": "Geüploade bestanden delen",
1455
+ "The link could not be copied": "De link kon niet worden gekopieerd",
1456
+ "Invalid JSON: {msg}": "Ongeldige JSON: {msg}",
1457
+ "Loading the fields this choice adds.": "De velden van deze keuze worden geladen.",
1458
+ "Restore": "Herstellen",
1459
+ "Save draft": "Concept opslaan",
1460
+ "Saved {title}": "{title} opgeslagen",
1461
+ "Saved, but some rows were not saved: {rows}": "Opgeslagen, maar sommige rijen zijn niet opgeslagen: {rows}",
1462
+ "The list of choices could not be loaded. Enter the value by hand.": "De keuzelijst kon niet worden geladen. Vul de waarde zelf in.",
1463
+ "You have unsaved changes from an earlier visit.": "Je hebt niet-opgeslagen wijzigingen van een eerder bezoek.",
1464
+ "no longer offered": "niet meer beschikbaar",
1465
+ "1 day left": "Nog 1 dag",
1466
+ "{count} days left": "Nog {count} dagen",
1467
+ "1 day overdue": "1 dag te laat",
1468
+ "{count} days overdue": "{count} dagen te laat",
1469
+ "{view}: not available on this list": "{view}: niet beschikbaar in deze lijst"
1364
1470
  },
1365
1471
  "plurals": {
1472
+ "{count} selected": [
1473
+ "{count} geselecteerd",
1474
+ "{count} geselecteerd"
1475
+ ],
1366
1476
  "%n year": [
1367
1477
  "%n jaar",
1368
1478
  "%n jaar"
@@ -1371,6 +1481,10 @@
1371
1481
  "%n maand",
1372
1482
  "%n maanden"
1373
1483
  ],
1484
+ "%n hour": [
1485
+ "%n uur",
1486
+ "%n uur"
1487
+ ],
1374
1488
  "%n day": [
1375
1489
  "%n dag",
1376
1490
  "%n dagen"
@@ -1426,6 +1540,10 @@
1426
1540
  "in {count} day": [
1427
1541
  "over {count} dag",
1428
1542
  "over {count} dagen"
1543
+ ],
1544
+ "{count} more filter": [
1545
+ "Nog {count} filter",
1546
+ "Nog {count} filters"
1429
1547
  ]
1430
1548
  }
1431
1549
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.78.0",
3
+ "version": "2.80.0",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -148,6 +148,32 @@ if (/require\("ajv-formats/.test(moduleCode)) {
148
148
  throw new Error('build-validators: a require("ajv-formats…") reference survived inlining — the standalone validator is not self-contained')
149
149
  }
150
150
 
151
+ // Inline Ajv's runtime helpers for the same reason. The standalone output
152
+ // emits `require("ajv/dist/runtime/ucs2length").default` (every `minLength` /
153
+ // `maxLength`) and `require("ajv/dist/runtime/equal").default` (`enum` / `const`
154
+ // on objects). Rollup turns each into a bare side-effect import that fills an
155
+ // `__exports` object, and a consumer's webpack drops that import because the
156
+ // library's `sideEffects` allowlist does not name it. `.default` is then
157
+ // undefined, the validator throws "f is not a function" on the first string it
158
+ // length-checks, and useAppManifest's catch-all kept the bundled manifest: the
159
+ // `/api/manifest` delta never reached the navigation (observed 2026-10-10 on
160
+ // dossiq). Both helpers are self-contained functions (fast-deep-equal recurses
161
+ // through its own name), so their source inlines as is.
162
+ moduleCode = moduleCode.replace(
163
+ /require\("ajv\/dist\/runtime\/([A-Za-z0-9_]+)"\)\.default/g,
164
+ (_match, name) => {
165
+ const fn = require(`ajv/dist/runtime/${name}`).default
166
+ if (typeof fn !== 'function') {
167
+ throw new Error(`build-validators: ajv runtime helper "${name}" is not a function and cannot be inlined`)
168
+ }
169
+ return `(${fn.toString()})`
170
+ },
171
+ )
172
+
173
+ if (/require\(/.test(moduleCode)) {
174
+ throw new Error('build-validators: a require(…) survived inlining — the standalone validator is not self-contained')
175
+ }
176
+
151
177
  const banner = `// SPDX-License-Identifier: EUPL-1.2
152
178
  // Copyright (C) 2026 Conduction B.V.
153
179
  //
@@ -175,6 +175,8 @@
175
175
  :register="formRegister"
176
176
  :initialData="formInitialValues || {}"
177
177
  :dialogTitle="tr(formEntry.formTitle) || ''"
178
+ :eyebrow="tr(formEntry.formEyebrow) || ''"
179
+ :subtitle="tr(formEntry.formSubtitle) || ''"
178
180
  :includeFields="formEntry.includeFields || null"
179
181
  :excludeFields="formEntry.excludeFields || []"
180
182
  :fieldOverrides="formEntry.fieldOverrides || {}"
@@ -222,3 +222,7 @@ Controlling the inline action button count — `inlineActionCount` sets how many
222
222
  `showBuildiqButton` is documented in the prop table of the component reference (board look, screens-chrome-parity).
223
223
 
224
224
  Slot `actions-end`: custom buttons after the primary Add button (CnIndexPage's saved views). Under the board look it renders in row 1, after the quick-filter chips.
225
+
226
+ ### Disabled view segments
227
+
228
+ Under the board look `disabledViewModes` (an array of modes) draws view switch segments the page cannot open, in the fixed order table, cards, board, map, disabled and titled "<mode>: not available on this list". A mode that is also offered renders once, enabled. `CnIndexPage` fills it from `config.viewSwitch`.
@@ -18,45 +18,57 @@
18
18
  @description Under the board look: saved views as chips and the Save view button, in row 1 after the quick-filter chips.
19
19
  -->
20
20
  <slot name="actions-end" />
21
- <NcButton v-if="showSidebarToggle"
22
- variant="secondary"
23
- class="cn-actions-bar__filter-button"
24
- data-testid="cn-actions-bar-filter-button"
25
- :pressed="sidebarOpen"
26
- @click="$emit('toggle-sidebar')">
27
- <template #icon>
28
- <Tune :size="18" />
29
- </template>
30
- {{ t('nextcloud-vue', 'Filter') }}
31
- <span
32
- v-if="filterCount > 0"
33
- class="cn-actions-bar__filter-badge"
34
- data-testid="cn-actions-bar-filter-badge"
35
- :aria-label="filterCountLabel">{{ filterCount }}</span>
36
- </NcButton>
37
- <div v-if="showViewToggle && viewSegments.length > 1"
38
- class="cn-actions-bar__view-toggle"
39
- role="group"
40
- :aria-label="t('nextcloud-vue', 'View')">
41
- <button
42
- v-for="seg in viewSegments"
43
- :key="seg.mode"
44
- type="button"
45
- class="cn-actions-bar__view-toggle-btn"
46
- :class="{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }"
47
- :aria-pressed="viewMode === seg.mode"
48
- :aria-label="seg.label"
49
- :title="seg.label"
50
- @click="$emit('view-mode-change', seg.mode)">
51
- <CnIcon v-if="seg.icon"
52
- :name="seg.icon"
53
- :size="24"
54
- class="cn-actions-bar__view-toggle-icon" />
55
- <component :is="seg.fallback"
56
- v-else
57
- :size="24"
58
- class="cn-actions-bar__view-toggle-icon" />
59
- </button>
21
+ <!--
22
+ Filter and the view switch are one unit: when row 1 is full they
23
+ wrap together to the start of the next line (the DqZaken board),
24
+ never the switch alone.
25
+ -->
26
+ <div v-if="showSidebarToggle || (showViewToggle && viewSegments.length > 1)"
27
+ class="cn-actions-bar__view-controls"
28
+ data-testid="cn-actions-bar-view-controls">
29
+ <NcButton v-if="showSidebarToggle"
30
+ variant="secondary"
31
+ class="cn-actions-bar__filter-button"
32
+ data-testid="cn-actions-bar-filter-button"
33
+ :pressed="sidebarOpen"
34
+ @click="$emit('toggle-sidebar')">
35
+ <template #icon>
36
+ <Tune :size="16" />
37
+ </template>
38
+ {{ t('nextcloud-vue', 'Filter') }}
39
+ <span
40
+ v-if="filterCount > 0"
41
+ class="cn-actions-bar__filter-badge"
42
+ data-testid="cn-actions-bar-filter-badge"
43
+ :aria-label="filterCountLabel">{{ filterCount }}</span>
44
+ </NcButton>
45
+ <div v-if="showViewToggle && viewSegments.length > 1"
46
+ class="cn-actions-bar__view-toggle"
47
+ role="group"
48
+ :aria-label="t('nextcloud-vue', 'View mode')">
49
+ <!-- A segment the page cannot open (`disabledViewModes`) is drawn, as the board does, but disabled and named so. -->
50
+ <button
51
+ v-for="seg in viewSegments"
52
+ :key="seg.mode"
53
+ type="button"
54
+ class="cn-actions-bar__view-toggle-btn"
55
+ :class="{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode, 'cn-actions-bar__view-toggle-btn--disabled': seg.disabled }"
56
+ :aria-pressed="viewMode === seg.mode"
57
+ :aria-label="seg.label"
58
+ :title="seg.disabled ? unavailableViewLabel(seg.label) : seg.label"
59
+ :disabled="seg.disabled"
60
+ :data-mode="seg.mode"
61
+ @click="seg.disabled || $emit('view-mode-change', seg.mode)">
62
+ <CnIcon v-if="seg.icon"
63
+ :name="seg.icon"
64
+ :size="18"
65
+ class="cn-actions-bar__view-toggle-icon" />
66
+ <component :is="seg.boardFallback || seg.fallback"
67
+ v-else
68
+ :size="18"
69
+ class="cn-actions-bar__view-toggle-icon" />
70
+ </button>
71
+ </div>
60
72
  </div>
61
73
  </div>
62
74
  <div v-if="!isBoardLayout" class="cn-actions-bar__info">
@@ -518,6 +530,7 @@ import CalendarMonthOutline from 'vue-material-design-icons/CalendarMonthOutline
518
530
  import Close from 'vue-material-design-icons/Close.vue'
519
531
  import ContentCopy from 'vue-material-design-icons/ContentCopy.vue'
520
532
  import Export from 'vue-material-design-icons/Export.vue'
533
+ import FormatListBulleted from 'vue-material-design-icons/FormatListBulleted.vue'
521
534
  import FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'
522
535
  import Import from 'vue-material-design-icons/Import.vue'
523
536
  import Magnify from 'vue-material-design-icons/Magnify.vue'
@@ -576,6 +589,7 @@ export default {
576
589
  Tune,
577
590
  ViewColumnOutline,
578
591
  ViewGridOutline,
592
+ FormatListBulleted,
579
593
  FormatListBulletedSquare,
580
594
  CalendarMonthOutline,
581
595
  MapMarkerOutline,
@@ -625,6 +639,19 @@ export default {
625
639
  default: () => [],
626
640
  },
627
641
 
642
+ /**
643
+ * Board look: view modes the switch draws although the page cannot
644
+ * open them, as disabled segments (the boards always draw table, cards,
645
+ * board and map). Ignored without the board look.
646
+ *
647
+ * @type {Array<string>}
648
+ * @spec openspec/changes/screens-view-switch-parity/specs/view-switch-board-look/spec.md#requirement-the-manifest-can-draw-segments-the-page-cannot-open
649
+ */
650
+ disabledViewModes: {
651
+ type: Array,
652
+ default: () => [],
653
+ },
654
+
628
655
  /**
629
656
  * The number on the Filter button's badge. Empty (`null`) counts the
630
657
  * `activeFilterChips`.
@@ -1156,11 +1183,15 @@ export default {
1156
1183
  // only when the page offers it. A mode the board switch does not
1157
1184
  // name (list, calendar) follows, so it is never lost.
1158
1185
  defs.board = { label: t('nextcloud-vue', 'Board'), icon: '', fallback: ViewColumnOutline }
1186
+ // The board's list icon: plain bullets, not the boxed ones.
1187
+ defs.table.boardFallback = FormatListBulleted
1188
+ const disabled = (this.disabledViewModes || []).filter((mode) => !modes.includes(mode))
1189
+ const all = [...modes, ...disabled]
1159
1190
  const fixed = ['table', 'cards', 'board', 'map']
1160
- const rest = modes.filter((mode) => !fixed.includes(mode))
1161
- return [...fixed.filter((mode) => modes.includes(mode)), ...rest]
1191
+ const rest = all.filter((mode) => !fixed.includes(mode))
1192
+ return [...fixed.filter((mode) => all.includes(mode)), ...rest]
1162
1193
  .filter((mode) => defs[mode])
1163
- .map((mode) => ({ mode, ...defs[mode] }))
1194
+ .map((mode) => ({ mode, ...defs[mode], disabled: disabled.includes(mode) }))
1164
1195
  }
1165
1196
  return modes
1166
1197
  .filter((mode) => defs[mode])
@@ -1219,6 +1250,16 @@ export default {
1219
1250
  },
1220
1251
 
1221
1252
  methods: {
1253
+ /**
1254
+ * The tooltip of a segment the page cannot open.
1255
+ *
1256
+ * @param {string} label The segment's name.
1257
+ * @return {string} "Map: not available on this list".
1258
+ */
1259
+ unavailableViewLabel(label) {
1260
+ return t('nextcloud-vue', '{view}: not available on this list', { view: label })
1261
+ },
1262
+
1222
1263
  /**
1223
1264
  * The accessible name of a filter chip's remove button.
1224
1265
  *
@@ -3724,6 +3724,7 @@ export default {
3724
3724
  * entry continues there (local mirror + per-user preference).
3725
3725
  *
3726
3726
  * @spec openspec/changes/walkthrough-advance-pause-resume/specs/cn-walkthrough/spec.md
3727
+ * @spec openspec/changes/walkthrough-autostart-and-countdown-dutch/specs/walkthrough-autostart-and-countdown-dutch/spec.md#requirement-a-tour-that-opens-on-its-own-opens-once
3727
3728
  * @param {object} progress `{ tourId, stepId, index }` from CnWalkthrough.
3728
3729
  * @return {void}
3729
3730
  */
@@ -3731,9 +3732,18 @@ export default {
3731
3732
  if (!progress || !progress.tourId) {
3732
3733
  return
3733
3734
  }
3734
- // The first step of a fresh tour is where a restart lands anyway,
3735
- // so it costs no request.
3735
+ // A fresh tour that opens on its own is recorded as paused at its
3736
+ // first step, so a user who never touches it does not get it again
3737
+ // on every page load; "Continue" in the settings brings it back.
3738
+ // Kept out of memory so the open tour runs on as it is.
3736
3739
  if (progress.index === 0 && !this.walkthroughProgressValue) {
3740
+ persistWalkthroughProgress(this.appId, this.walkthroughConfigKey, {
3741
+ tourId: progress.tourId,
3742
+ stepId: progress.stepId || '',
3743
+ index: 0,
3744
+ version: String((this.manifest && this.manifest.version) || ''),
3745
+ paused: true,
3746
+ })
3737
3747
  return
3738
3748
  }
3739
3749
  const value = {