@conduction/nextcloud-vue 2.56.0-beta.36 → 2.56.0-beta.38

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 (382) hide show
  1. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  2. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +131 -3
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +54 -18
  5. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue.js +1 -1
  7. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue2.js +3 -2
  8. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue3.js.map +1 -1
  10. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue.js +1 -1
  11. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue2.js +5 -4
  12. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue2.js.map +1 -1
  13. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue3.js.map +1 -1
  14. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue.js +1 -1
  15. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue2.js +2 -1
  16. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue2.js.map +1 -1
  17. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue3.js.map +1 -1
  18. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  19. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +2 -1
  20. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  21. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  22. package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
  23. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +376 -6
  24. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  25. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +146 -71
  26. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  27. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue.js +1 -1
  28. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue2.js +2 -1
  29. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue2.js.map +1 -1
  30. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue3.js.map +1 -1
  31. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue.js +1 -1
  32. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue2.js +2 -1
  33. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue2.js.map +1 -1
  34. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue3.js.map +1 -1
  35. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  36. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +6 -5
  37. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  38. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  39. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue.js +1 -1
  40. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue2.js +2 -1
  41. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue2.js.map +1 -1
  42. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue3.js.map +1 -1
  43. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +1 -1
  44. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +2 -1
  45. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -1
  46. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -1
  47. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
  48. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +2 -1
  49. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
  50. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
  51. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  52. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +47 -1
  53. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  54. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +22 -12
  55. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  56. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue.js +1 -1
  57. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue2.js +3 -1
  58. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue2.js.map +1 -1
  59. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue3.js.map +1 -1
  60. package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue2.js +2 -1
  61. package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue2.js.map +1 -1
  62. package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue3.js.map +1 -1
  63. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +23 -4
  64. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  65. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  66. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  67. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +3 -1
  68. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  69. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  70. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue.js +1 -1
  71. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue2.js +2 -1
  72. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue2.js.map +1 -1
  73. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue3.js.map +1 -1
  74. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  75. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +18 -5
  76. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  77. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  78. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue.js +1 -1
  79. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue2.js +3 -1
  80. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue2.js.map +1 -1
  81. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue3.js.map +1 -1
  82. package/dist/esm/components/CnFileManager/CnFileManager.vue.js +1 -1
  83. package/dist/esm/components/CnFileManager/CnFileManager.vue2.js +3 -1
  84. package/dist/esm/components/CnFileManager/CnFileManager.vue2.js.map +1 -1
  85. package/dist/esm/components/CnFileManager/CnFileManager.vue3.js.map +1 -1
  86. package/dist/esm/components/CnFilePreview/CnFilePreview.vue.js +1 -1
  87. package/dist/esm/components/CnFilePreview/CnFilePreview.vue2.js +2 -1
  88. package/dist/esm/components/CnFilePreview/CnFilePreview.vue2.js.map +1 -1
  89. package/dist/esm/components/CnFilePreview/CnFilePreview.vue3.js.map +1 -1
  90. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  91. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +49 -1
  92. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  93. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +3 -3
  94. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  95. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue.js +1 -1
  96. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js +2 -1
  97. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js.map +1 -1
  98. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js.map +1 -1
  99. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +571 -77
  100. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  101. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +191 -82
  102. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  103. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +11 -2
  104. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  105. package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
  106. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js +2 -1
  107. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
  108. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
  109. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue.js +1 -1
  110. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue2.js +3 -2
  111. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue2.js.map +1 -1
  112. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue3.js.map +1 -1
  113. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  114. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +28 -0
  115. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  116. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +82 -75
  117. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  118. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue.js +1 -1
  119. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue2.js +5 -4
  120. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue2.js.map +1 -1
  121. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue3.js.map +1 -1
  122. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue.js +1 -1
  123. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue2.js +2 -1
  124. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue2.js.map +1 -1
  125. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue3.js.map +1 -1
  126. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue.js +1 -1
  127. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue2.js +2 -1
  128. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue2.js.map +1 -1
  129. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue3.js.map +1 -1
  130. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue.js +1 -1
  131. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +2 -1
  132. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
  133. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
  134. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue.js +1 -1
  135. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue2.js +2 -1
  136. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue2.js.map +1 -1
  137. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue3.js.map +1 -1
  138. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue.js +1 -1
  139. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue2.js +2 -1
  140. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue2.js.map +1 -1
  141. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue3.js.map +1 -1
  142. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  143. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +70 -2
  144. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  145. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  146. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
  147. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +67 -5
  148. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
  149. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +181 -124
  150. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
  151. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue.js +1 -1
  152. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue2.js +2 -1
  153. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue2.js.map +1 -1
  154. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue3.js.map +1 -1
  155. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue2.js +2 -0
  156. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue2.js.map +1 -1
  157. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue3.js +2 -2
  158. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue3.js.map +1 -1
  159. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
  160. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +5 -1
  161. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
  162. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
  163. package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
  164. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +134 -10
  165. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  166. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -2
  167. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  168. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue.js +1 -1
  169. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js +2 -1
  170. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js.map +1 -1
  171. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue3.js.map +1 -1
  172. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue.js +1 -1
  173. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue2.js +2 -1
  174. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue2.js.map +1 -1
  175. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue3.js.map +1 -1
  176. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  177. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +6 -3
  178. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  179. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  180. package/dist/esm/components/CnTasksCard/CnTasksCard.vue.js +1 -1
  181. package/dist/esm/components/CnTasksCard/CnTasksCard.vue2.js +2 -1
  182. package/dist/esm/components/CnTasksCard/CnTasksCard.vue2.js.map +1 -1
  183. package/dist/esm/components/CnTasksCard/CnTasksCard.vue3.js.map +1 -1
  184. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +1 -1
  185. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +2 -1
  186. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
  187. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
  188. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +1 -1
  189. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +140 -7
  190. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -1
  191. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -1
  192. package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue.js +1 -1
  193. package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue2.js +2 -1
  194. package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue2.js.map +1 -1
  195. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue.js +1 -1
  196. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue2.js +2 -1
  197. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue2.js.map +1 -1
  198. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue3.js.map +1 -1
  199. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
  200. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +37 -9
  201. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
  202. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +6 -5
  203. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
  204. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js +53 -1
  205. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js.map +1 -1
  206. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js +3 -2
  207. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js.map +1 -1
  208. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
  209. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +135 -0
  210. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  211. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  212. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
  213. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +19 -0
  214. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  215. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +37 -19
  216. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  217. package/dist/esm/composables/useListView.js +21 -0
  218. package/dist/esm/composables/useListView.js.map +1 -1
  219. package/dist/esm/dialogs/CnNoteHistoryDialog.vue.js +1 -1
  220. package/dist/esm/dialogs/CnNoteHistoryDialog.vue2.js +2 -1
  221. package/dist/esm/dialogs/CnNoteHistoryDialog.vue2.js.map +1 -1
  222. package/dist/esm/dialogs/CnNoteHistoryDialog.vue3.js.map +1 -1
  223. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue.js +1 -1
  224. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue2.js +3 -2
  225. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue2.js.map +1 -1
  226. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue3.js.map +1 -1
  227. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue.js +1 -1
  228. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue2.js +4 -3
  229. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue2.js.map +1 -1
  230. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue3.js.map +1 -1
  231. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue.js +1 -1
  232. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -2
  233. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
  234. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
  235. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue.js +1 -1
  236. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js +2 -1
  237. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js.map +1 -1
  238. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue3.js.map +1 -1
  239. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue.js +1 -1
  240. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js +6 -5
  241. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js.map +1 -1
  242. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue3.js.map +1 -1
  243. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue.js +1 -1
  244. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue2.js +2 -1
  245. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue2.js.map +1 -1
  246. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue3.js.map +1 -1
  247. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue.js +1 -1
  248. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
  249. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
  250. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
  251. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue.js +1 -1
  252. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
  253. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
  254. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
  255. package/dist/esm/integrations/builtin/email/CnEmailCard.vue.js +1 -1
  256. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js +2 -1
  257. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
  258. package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
  259. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue.js +1 -1
  260. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +2 -1
  261. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  262. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  263. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue.js +1 -1
  264. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue2.js +2 -1
  265. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue2.js.map +1 -1
  266. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue3.js.map +1 -1
  267. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue.js +1 -1
  268. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
  269. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
  270. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
  271. package/dist/esm/l10n/en.json.js +57 -2
  272. package/dist/esm/l10n/en.json.js.map +1 -1
  273. package/dist/esm/l10n/nl.json.js +78 -2
  274. package/dist/esm/l10n/nl.json.js.map +1 -1
  275. package/dist/esm/library-style.js +1 -1
  276. package/dist/esm/nextcloud-vue.css +1541 -1166
  277. package/dist/esm/store/useObjectStore.js +23 -4
  278. package/dist/esm/store/useObjectStore.js.map +1 -1
  279. package/dist/esm/utils/boardColumns.js +58 -2
  280. package/dist/esm/utils/boardColumns.js.map +1 -1
  281. package/dist/esm/utils/boardReferenceColumns.js +330 -0
  282. package/dist/esm/utils/boardReferenceColumns.js.map +1 -0
  283. package/dist/esm/utils/buildManifest.js +4 -1
  284. package/dist/esm/utils/buildManifest.js.map +1 -1
  285. package/dist/esm/utils/schema.js +5 -4
  286. package/dist/esm/utils/schema.js.map +1 -1
  287. package/dist/esm/utils/userLocale.js +30 -0
  288. package/dist/esm/utils/userLocale.js.map +1 -0
  289. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  290. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  291. package/dist/esm/utils/widgetDispatch.js +8 -2
  292. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  293. package/dist/nextcloud-vue.cjs.js +30291 -27618
  294. package/dist/nextcloud-vue.cjs.js.map +2 -2
  295. package/dist/nextcloud-vue.css +1541 -1166
  296. package/l10n/en.json +57 -2
  297. package/l10n/nl.json +78 -2
  298. package/package.json +1 -1
  299. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +160 -8
  300. package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +3 -2
  301. package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +5 -4
  302. package/src/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue +2 -1
  303. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +2 -1
  304. package/src/components/CnBoardView/CnBoardView.vue +433 -12
  305. package/src/components/CnCalendarEventPicker/CnCalendarEventPicker.vue +2 -1
  306. package/src/components/CnCalendarWidget/CnCalendarWidget.vue +2 -1
  307. package/src/components/CnChartWidget/CnChartWidget.vue +6 -5
  308. package/src/components/CnCollectivePagePicker/CnCollectivePagePicker.vue +2 -1
  309. package/src/components/CnConversationThread/CnConversationThread.vue +2 -1
  310. package/src/components/CnCountdownWidget/CnCountdownWidget.vue +2 -1
  311. package/src/components/CnDashboardPage/CnDashboardPage.vue +59 -3
  312. package/src/components/CnDataMatrix/CnDataMatrix.vue +2 -1
  313. package/src/components/CnDetailPage/CnDetailHeaderChips.vue +2 -1
  314. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  315. package/src/components/CnDetailPage/CnDetailPage.vue +23 -4
  316. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +3 -1
  317. package/src/components/CnEmailPicker/CnEmailPicker.vue +2 -1
  318. package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -5
  319. package/src/components/CnFederationStatus/CnFederationStatus.vue +3 -1
  320. package/src/components/CnFileManager/CnFileManager.vue +2 -1
  321. package/src/components/CnFilePreview/CnFilePreview.vue +2 -1
  322. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +54 -6
  323. package/src/components/CnFollowToggle/CnFollowToggle.vue +2 -1
  324. package/src/components/CnIndexPage/CnIndexPage.vue +610 -25
  325. package/src/components/CnIndexPage/useSelfFetchList.js +10 -1
  326. package/src/components/CnNotesCard/CnNotesCard.vue +2 -1
  327. package/src/components/CnObjectCalendar/CnObjectCalendar.vue +3 -2
  328. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +36 -0
  329. package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +5 -4
  330. package/src/components/CnObjectSidebar/CnAuditTrailTab.vue +2 -1
  331. package/src/components/CnObjectSidebar/CnFlowTasksPanel.vue +2 -1
  332. package/src/components/CnObjectSidebar/CnNotesTab.vue +2 -1
  333. package/src/components/CnObjectSidebar/CnTasksTab.vue +2 -1
  334. package/src/components/CnPropertySourceField/CnPropertySourceField.vue +2 -1
  335. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +70 -2
  336. package/src/components/CnRegisterMapping/CnRegisterMapping.md +5 -0
  337. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +231 -96
  338. package/src/components/CnRoadmapItem/CnRoadmapItem.vue +2 -1
  339. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +4 -2
  340. package/src/components/CnSettingsPage/CnSettingsPage.vue +5 -1
  341. package/src/components/CnStatWidget/CnStatWidget.vue +136 -11
  342. package/src/components/CnStatsBlock/CnStatsBlock.vue +2 -1
  343. package/src/components/CnSummaryAggregates/CnSummaryAggregates.vue +2 -1
  344. package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -3
  345. package/src/components/CnTasksCard/CnTasksCard.vue +2 -1
  346. package/src/components/CnTimelineWidget/CnTimelineWidget.vue +2 -1
  347. package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +140 -7
  348. package/src/components/CnTranslatedBadge/CnTranslatedBadge.vue +2 -1
  349. package/src/components/CnVersionHistory/CnVersionHistory.vue +2 -1
  350. package/src/components/CnVersionInfoCard/CnVersionInfoCard.md +2 -1
  351. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +42 -13
  352. package/src/components/CnWidgetCardGrid/CnWidgetCardGrid.vue +55 -2
  353. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +135 -0
  354. package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +10 -0
  355. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +44 -1
  356. package/src/composables/useListView.js +21 -0
  357. package/src/css/board.css +105 -4
  358. package/src/css/dialog.css +4 -2
  359. package/src/css/index-page.css +49 -0
  360. package/src/css/look-board.css +77 -7
  361. package/src/dialogs/CnNoteHistoryDialog.vue +2 -1
  362. package/src/integrations/builtin/activity/CnActivityCard.vue +3 -2
  363. package/src/integrations/builtin/activity/CnActivityTab.vue +4 -3
  364. package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +3 -2
  365. package/src/integrations/builtin/calendar/CnCalendarCard.vue +2 -1
  366. package/src/integrations/builtin/calendar/CnCalendarTab.vue +6 -5
  367. package/src/integrations/builtin/contactmoment/CnContactmomentCard.vue +2 -1
  368. package/src/integrations/builtin/cospend/CnCospendTab.vue +2 -1
  369. package/src/integrations/builtin/deck/CnDeckTab.vue +2 -1
  370. package/src/integrations/builtin/email/CnEmailCard.vue +2 -1
  371. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +2 -1
  372. package/src/integrations/builtin/field-inspection/CnFieldInspectionTab.vue +2 -1
  373. package/src/integrations/builtin/photos/CnPhotosTab.vue +2 -1
  374. package/src/schemas/app-manifest-v2.schema.json +116 -5
  375. package/src/store/useObjectStore.js +23 -4
  376. package/src/utils/boardColumns.js +57 -1
  377. package/src/utils/boardReferenceColumns.js +326 -0
  378. package/src/utils/buildManifest.js +4 -1
  379. package/src/utils/schema.js +5 -4
  380. package/src/utils/userLocale.js +26 -0
  381. package/src/utils/validateManifestV2.compiled.js +3 -3
  382. package/src/utils/widgetDispatch.js +8 -2
@@ -104,6 +104,19 @@
104
104
  margin-top: 0;
105
105
  }
106
106
 
107
+ /* The board view's footer: how many rows it holds of how many match, and
108
+ "Load more" while the list is not complete. */
109
+ .cn-index-page__board-load {
110
+ display: flex;
111
+ flex-wrap: wrap;
112
+ align-items: center;
113
+ justify-content: space-between;
114
+ gap: 8px 16px;
115
+ padding: 12px 16px;
116
+ color: var(--color-text-maxcontrast);
117
+ font-size: 14px;
118
+ }
119
+
107
120
  /* Table view owns both scroll axes. With the page column scrolling instead, the
108
121
  table's horizontal scrollbar sat at the bottom of the (taller-than-viewport)
109
122
  table, so it only appeared after scrolling down, and the pagination was
@@ -369,3 +382,39 @@
369
382
  outline: 2px solid var(--color-primary-element);
370
383
  outline-offset: 2px;
371
384
  }
385
+
386
+ /*
387
+ * screens-board-reference-columns: the board view's controls after the
388
+ * search (board DqWerkbord): "Case type:" and "Columns:" as a 600 label and a
389
+ * 36px select, then the hint in the secondary text colour.
390
+ */
391
+ .cn-index-page__board-control {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ gap: 8px;
395
+ font-size: 14px;
396
+ font-weight: 600;
397
+ color: var(--color-main-text);
398
+ }
399
+
400
+ .cn-index-page__board-select {
401
+ height: 36px;
402
+ min-height: 36px;
403
+ margin: 0;
404
+ padding: 0 10px;
405
+ border: 1px solid var(--color-border-maxcontrast);
406
+ border-radius: 8px;
407
+ background-color: var(--color-main-background);
408
+ color: var(--color-main-text);
409
+ font: inherit;
410
+ font-weight: 400;
411
+ }
412
+
413
+ .cn-index-page__board-select--strong {
414
+ font-weight: 500;
415
+ }
416
+
417
+ .cn-index-page__board-hint {
418
+ font-size: 14px;
419
+ color: var(--color-text-maxcontrast);
420
+ }
@@ -422,6 +422,7 @@
422
422
  `.cn-look-board.cn-admin-settings-shell` is a shell told `look: "board"`
423
423
  itself, on an admin page no CnAppRoot wraps. */
424
424
  .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .cn-admin-settings-shell__header,
425
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):not(.cn-credentials),
425
426
  .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):not(.cn-credentials),
426
427
  .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):not(.cn-credentials) {
427
428
  grid-column: 1 / -1;
@@ -429,6 +430,7 @@
429
430
 
430
431
  .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *),
431
432
  .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *),
433
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *),
432
434
  .cn-look-board .cn-settings-page__sections:not(.cn-look-nextcloud *) {
433
435
  display: grid;
434
436
  grid-template-columns: repeat(auto-fit, minmax(420px, 1fr));
@@ -440,14 +442,17 @@
440
442
  Settings.vue) takes no box of its own: its sections are grid items and
441
443
  cards, as if the shell held them directly. Only an element whose own
442
444
  children are sections; anything else keeps spanning the grid. */
445
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section),
443
446
  .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section),
444
447
  .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) {
445
448
  display: contents;
446
449
  }
447
450
 
448
- /* The card: a section of the shell (also one inside a wrapping element), or a CnSettingsCard of the page. */
451
+ /* The card: a section of the shell or of one of its tab panels (also one inside a wrapping element), or a CnSettingsCard of the page. */
452
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section,
449
453
  .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
450
454
  .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
455
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
451
456
  .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
452
457
  .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
453
458
  .cn-look-board .cn-settings-page__sections:not(.cn-look-nextcloud *) > .cn-settings-card {
@@ -483,7 +488,7 @@
483
488
  justify-content: flex-start;
484
489
  text-align: start;
485
490
  margin: 0;
486
- font-size: 19px;
491
+ font-size: 17px;
487
492
  font-weight: 700;
488
493
  line-height: 1.3;
489
494
  }
@@ -491,18 +496,83 @@
491
496
  .cn-look-board .settings-section:not(.cn-look-nextcloud *) .settings-section__desc {
492
497
  margin: 4px 0 0;
493
498
  font-size: 14px;
494
- line-height: 1.45;
499
+ line-height: 1.5;
495
500
  color: var(--color-text-maxcontrast);
496
501
  }
497
502
 
498
- /* Section actions sit at the end of the title row. */
503
+ /* Section actions sit at the end of the title row. The row is a grid, so a
504
+ long title wraps beside the buttons instead of running under them, and in a
505
+ narrow card the buttons drop under the title and description. */
506
+ .cn-look-board .settings-section:not(.cn-look-nextcloud *):has(> .cn-settings-section__actions) {
507
+ /* `!important`: the card rules above set `display: flex` at higher specificity for a section in a wrapping element. */
508
+ display: grid !important;
509
+ grid-template-columns: minmax(0, 1fr) auto;
510
+ align-items: start;
511
+ column-gap: 16px;
512
+ container-type: inline-size;
513
+ }
514
+
515
+ .cn-look-board .settings-section:not(.cn-look-nextcloud *):has(> .cn-settings-section__actions) > * {
516
+ grid-column: 1 / -1;
517
+ }
518
+
519
+ .cn-look-board .settings-section:not(.cn-look-nextcloud *):has(> .cn-settings-section__actions) > .settings-section__name {
520
+ grid-row: 1;
521
+ grid-column: 1;
522
+ }
523
+
499
524
  .cn-look-board .settings-section:not(.cn-look-nextcloud *) > .cn-settings-section__actions {
500
- position: absolute;
501
- inset-block-start: 22px;
502
- inset-inline-end: 24px;
525
+ grid-row: 1;
526
+ grid-column: 2;
527
+ position: static;
528
+ flex-wrap: wrap;
529
+ justify-self: end;
503
530
  float: none;
504
531
  }
505
532
 
533
+ @container (max-width: 520px) {
534
+ .cn-look-board .settings-section:not(.cn-look-nextcloud *) > .cn-settings-section__actions {
535
+ grid-row: auto;
536
+ grid-column: 1 / -1;
537
+ justify-self: start;
538
+ justify-content: flex-start;
539
+ }
540
+ }
541
+
542
+ /* An admin settings card as the board draws it (PtBeheerinstellingen,
543
+ KqBeheerAlgemeen, HuInstellingen): 20px 22px padding, and the title and
544
+ description one group, 4px apart, spaced from the rest of the card by the
545
+ card's 14px gap. The description is a sibling of the title in that column,
546
+ so it pulls itself back up to 4px under the title. The gap spaces the
547
+ content, so a note card adds no margin of its own (NcNoteCard draws 16px
548
+ above and below). A CnSettingsPage card keeps 22px 24px. */
549
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section,
550
+ .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
551
+ .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
552
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
553
+ .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
554
+ .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section {
555
+ padding: 20px 22px;
556
+ }
557
+
558
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section > .settings-section__desc,
559
+ .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .settings-section__desc,
560
+ .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .settings-section__desc,
561
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc,
562
+ .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc,
563
+ .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc {
564
+ margin-top: -10px;
565
+ }
566
+
567
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section > .notecard,
568
+ .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .notecard,
569
+ .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .notecard,
570
+ .cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .notecard,
571
+ .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .notecard,
572
+ .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .notecard {
573
+ margin-block: 0;
574
+ }
575
+
506
576
  .cn-look-board .settings-section.cn-settings-section--wide:not(.cn-look-nextcloud *),
507
577
  .cn-look-board .cn-settings-card:has(.cn-settings-section--wide):not(.cn-look-nextcloud *) {
508
578
  grid-column: 1 / -1;
@@ -78,6 +78,7 @@ import HistoryIcon from 'vue-material-design-icons/History.vue'
78
78
  import CnDialog from '../components/CnDialog/CnDialog.vue'
79
79
  import { dialogBoardMixin } from '../mixins/dialogBoard.js'
80
80
  import { buildHeaders, prefixUrl } from '../utils/index.js'
81
+ import { userLocale } from '../utils/userLocale.js'
81
82
 
82
83
  export default {
83
84
  name: 'CnNoteHistoryDialog',
@@ -193,7 +194,7 @@ export default {
193
194
  return ''
194
195
  }
195
196
  try {
196
- return new Date(dateStr).toLocaleString(undefined, {
197
+ return new Date(dateStr).toLocaleString(userLocale(), {
197
198
  year: 'numeric',
198
199
  month: 'short',
199
200
  day: 'numeric',
@@ -112,6 +112,7 @@ import Timeline from 'vue-material-design-icons/Timeline.vue'
112
112
  import CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'
113
113
  import CnVisibilityChip from '../../../components/CnVisibilityChip/CnVisibilityChip.vue'
114
114
  import { buildHeaders, prefixUrl } from '../../../utils/index.js'
115
+ import { userLocale } from '../../../utils/userLocale.js'
115
116
 
116
117
  const VALID_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity']
117
118
  const COMPACT_LIMIT = 4
@@ -297,7 +298,7 @@ export default {
297
298
  return t('nextcloud-vue', 'Yesterday')
298
299
  }
299
300
  try {
300
- return date.toLocaleDateString(undefined, { weekday: 'short', day: 'numeric', month: 'short' })
301
+ return date.toLocaleDateString(userLocale(), { weekday: 'short', day: 'numeric', month: 'short' })
301
302
  } catch {
302
303
  return date.toISOString().split('T')[0]
303
304
  }
@@ -309,7 +310,7 @@ export default {
309
310
  return ''
310
311
  }
311
312
  try {
312
- return ts.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })
313
+ return ts.toLocaleTimeString(userLocale(), { hour: '2-digit', minute: '2-digit' })
313
314
  } catch {
314
315
  return ts.toISOString().split('T')[1].slice(0, 5)
315
316
  }
@@ -319,6 +319,7 @@ import Timeline from 'vue-material-design-icons/Timeline.vue'
319
319
  import CnVisibilityChip from '../../../components/CnVisibilityChip/CnVisibilityChip.vue'
320
320
  import { normalizeLook } from '../../../composables/useLook.js'
321
321
  import { buildHeaders, prefixUrl } from '../../../utils/index.js'
322
+ import { userLocale } from '../../../utils/userLocale.js'
322
323
  import { ACTIVITY_FEED_KINDS, exportBody, feedPath, feedQuery, isReadRow, parseFeed } from './activityFeedWire.js'
323
324
 
324
325
  const DEFAULT_PAGE_SIZE = 25
@@ -643,7 +644,7 @@ export default {
643
644
  return t('nextcloud-vue', 'Yesterday')
644
645
  }
645
646
  try {
646
- return date.toLocaleDateString(undefined, { weekday: 'short', day: 'numeric', month: 'short' })
647
+ return date.toLocaleDateString(userLocale(), { weekday: 'short', day: 'numeric', month: 'short' })
647
648
  } catch {
648
649
  return date.toISOString().split('T')[0]
649
650
  }
@@ -655,7 +656,7 @@ export default {
655
656
  return ''
656
657
  }
657
658
  try {
658
- return ts.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })
659
+ return ts.toLocaleTimeString(userLocale(), { hour: '2-digit', minute: '2-digit' })
659
660
  } catch {
660
661
  return ts.toISOString().split('T')[1].slice(0, 5)
661
662
  }
@@ -703,7 +704,7 @@ export default {
703
704
  let when = ''
704
705
  if (ts !== null) {
705
706
  try {
706
- when = ts.toLocaleString(undefined, { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' })
707
+ when = ts.toLocaleString(userLocale(), { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' })
707
708
  } catch {
708
709
  when = ts.toISOString().replace('T', ' ').slice(0, 16)
709
710
  }
@@ -177,6 +177,7 @@ import CnAnalyticsReportCreate from '../../../components/CnAnalyticsReportCreate
177
177
  import CnAnalyticsReportPicker from '../../../components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue'
178
178
  import CnStatusBadge from '../../../components/CnStatusBadge/CnStatusBadge.vue'
179
179
  import { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'
180
+ import { userLocale } from '../../../utils/userLocale.js'
180
181
 
181
182
  /**
182
183
  * CnAnalyticsTab — bespoke dataset list for the `analytics` integration.
@@ -394,7 +395,7 @@ export default {
394
395
  const num = Number(raw)
395
396
  if (Number.isFinite(num) && String(raw).trim() !== '') {
396
397
  try {
397
- return num.toLocaleString()
398
+ return num.toLocaleString(userLocale())
398
399
  } catch {
399
400
  return String(num)
400
401
  }
@@ -436,7 +437,7 @@ export default {
436
437
  if (Number.isNaN(d.getTime())) {
437
438
  return String(value)
438
439
  }
439
- return d.toLocaleDateString(undefined, { dateStyle: 'medium' })
440
+ return d.toLocaleDateString(userLocale(), { dateStyle: 'medium' })
440
441
  } catch {
441
442
  return String(value)
442
443
  }
@@ -107,6 +107,7 @@ import CalendarCheck from 'vue-material-design-icons/CalendarCheck.vue'
107
107
  import CalendarClock from 'vue-material-design-icons/CalendarClock.vue'
108
108
  import CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'
109
109
  import { buildHeaders, prefixUrl } from '../../../utils/index.js'
110
+ import { userLocale } from '../../../utils/userLocale.js'
110
111
 
111
112
  /**
112
113
  * CnCalendarCard — surface-aware compact widget for the calendar
@@ -323,7 +324,7 @@ export default {
323
324
  const opts = this.surface === 'single-entity'
324
325
  ? { dateStyle: 'medium' }
325
326
  : { dateStyle: 'medium', timeStyle: 'short' }
326
- return d.toLocaleString(undefined, opts)
327
+ return d.toLocaleString(userLocale(), opts)
327
328
  } catch {
328
329
  return String(value)
329
330
  }
@@ -240,6 +240,7 @@ import CnCalendarEventCreate from '../../../components/CnCalendarEventCreate/CnC
240
240
  import CnCalendarEventPicker from '../../../components/CnCalendarEventPicker/CnCalendarEventPicker.vue'
241
241
  import CnStatusBadge from '../../../components/CnStatusBadge/CnStatusBadge.vue'
242
242
  import { buildHeaders, prefixUrl } from '../../../utils/index.js'
243
+ import { userLocale } from '../../../utils/userLocale.js'
243
244
 
244
245
  const MAX_AVATARS = 3
245
246
 
@@ -524,7 +525,7 @@ export default {
524
525
  if (!d) {
525
526
  return '—'
526
527
  }
527
- return d.toLocaleDateString(undefined, { month: 'short' })
528
+ return d.toLocaleDateString(userLocale(), { month: 'short' })
528
529
  },
529
530
 
530
531
  dayOf(ev) {
@@ -541,16 +542,16 @@ export default {
541
542
  return ev.dtstart ? String(ev.dtstart) : t('nextcloud-vue', 'Time not set')
542
543
  }
543
544
  const end = this.parseDate(ev.dtend)
544
- const dateLabel = start.toLocaleDateString(undefined, { weekday: 'short', day: 'numeric', month: 'short' })
545
+ const dateLabel = start.toLocaleDateString(userLocale(), { weekday: 'short', day: 'numeric', month: 'short' })
545
546
  const timeOpts = { hour: '2-digit', minute: '2-digit' }
546
- const startTime = start.toLocaleTimeString(undefined, timeOpts)
547
+ const startTime = start.toLocaleTimeString(userLocale(), timeOpts)
547
548
  if (end) {
548
549
  const sameDay = start.toDateString() === end.toDateString()
549
- const endTime = end.toLocaleTimeString(undefined, timeOpts)
550
+ const endTime = end.toLocaleTimeString(userLocale(), timeOpts)
550
551
  if (sameDay) {
551
552
  return `${dateLabel} · ${startTime} – ${endTime}`
552
553
  }
553
- const endDateLabel = end.toLocaleDateString(undefined, { day: 'numeric', month: 'short' })
554
+ const endDateLabel = end.toLocaleDateString(userLocale(), { day: 'numeric', month: 'short' })
554
555
  return `${dateLabel} ${startTime} – ${endDateLabel} ${endTime}`
555
556
  }
556
557
  return `${dateLabel} · ${startTime}`
@@ -61,6 +61,7 @@ import { NcLoadingIcon } from '@nextcloud/vue'
61
61
  import PhoneOutline from 'vue-material-design-icons/PhoneOutline.vue'
62
62
  import CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'
63
63
  import { prefixUrl } from '../../../utils/index.js'
64
+ import { userLocale } from '../../../utils/userLocale.js'
64
65
 
65
66
  export default {
66
67
  name: 'CnContactmomentCard',
@@ -182,7 +183,7 @@ export default {
182
183
  */
183
184
  formatWhen(value) {
184
185
  const d = new Date(value)
185
- return isNaN(d.getTime()) ? value : d.toLocaleString()
186
+ return isNaN(d.getTime()) ? value : d.toLocaleString(userLocale())
186
187
  },
187
188
  },
188
189
  }
@@ -175,6 +175,7 @@ import CnCospendCreate from '../../../components/CnCospendCreate/CnCospendCreate
175
175
  import CnCospendPicker from '../../../components/CnCospendPicker/CnCospendPicker.vue'
176
176
  import CnStatusBadge from '../../../components/CnStatusBadge/CnStatusBadge.vue'
177
177
  import { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'
178
+ import { userLocale } from '../../../utils/userLocale.js'
178
179
 
179
180
  /**
180
181
  * CnCospendTab — bespoke sidebar tab for the `cospend` integration.
@@ -495,7 +496,7 @@ export default {
495
496
  if (Number.isNaN(date.getTime())) {
496
497
  return ''
497
498
  }
498
- return date.toLocaleDateString(undefined, { dateStyle: 'medium' })
499
+ return date.toLocaleDateString(userLocale(), { dateStyle: 'medium' })
499
500
  },
500
501
 
501
502
  /**
@@ -168,6 +168,7 @@ import CnDeckCardCreate from '../../../components/CnDeckCardCreate/CnDeckCardCre
168
168
  import CnDeckCardPicker from '../../../components/CnDeckCardPicker/CnDeckCardPicker.vue'
169
169
  import CnStatusBadge from '../../../components/CnStatusBadge/CnStatusBadge.vue'
170
170
  import { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'
171
+ import { userLocale } from '../../../utils/userLocale.js'
171
172
 
172
173
  /** Maximum assignee avatars shown before collapsing the rest into a +N overflow badge. */
173
174
  const MAX_VISIBLE_ASSIGNEES = 3
@@ -427,7 +428,7 @@ export default {
427
428
  if (Number.isNaN(date.getTime())) {
428
429
  return ''
429
430
  }
430
- return date.toLocaleDateString(undefined, { dateStyle: 'medium' })
431
+ return date.toLocaleDateString(userLocale(), { dateStyle: 'medium' })
431
432
  },
432
433
 
433
434
  /**
@@ -68,6 +68,7 @@ import { markRaw } from 'vue'
68
68
  import Email from 'vue-material-design-icons/Email.vue'
69
69
  import CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'
70
70
  import { buildHeaders, prefixUrl } from '../../../utils/index.js'
71
+ import { userLocale } from '../../../utils/userLocale.js'
71
72
 
72
73
  /**
73
74
  * CnEmailCard — compact widget for the `email` integration leaf.
@@ -279,7 +280,7 @@ export default {
279
280
  if (Number.isNaN(d.getTime()) === true) {
280
281
  return String(raw)
281
282
  }
282
- return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' })
283
+ return d.toLocaleDateString(userLocale(), { year: 'numeric', month: 'short', day: 'numeric' })
283
284
  },
284
285
 
285
286
  // Thread deep-link into NC Mail; undefined when the row lacks ids.
@@ -164,6 +164,7 @@ import { NcButton, NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'
164
164
  import ClipboardCheckOutline from 'vue-material-design-icons/ClipboardCheckOutline.vue'
165
165
  import CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'
166
166
  import CnOfflineQueue from '../../../components/CnOfflineQueue/index.js'
167
+ import { userLocale } from '../../../utils/userLocale.js'
167
168
  import { buildChecklistSubmission } from '../../offline/checklistSubmission.js'
168
169
  import { checklistProgress, classifyGps, normaliseChecklistTemplate, syncIndicator, validateChecklistAnswers } from '../../offline/fieldCollectionHelpers.js'
169
170
  import {
@@ -379,7 +380,7 @@ export default {
379
380
  if (!iso) {
380
381
  return ''
381
382
  }
382
- return new Date(iso).toLocaleString()
383
+ return new Date(iso).toLocaleString(userLocale())
383
384
  },
384
385
 
385
386
  errorFor(questionId) {
@@ -86,6 +86,7 @@ import { NcButton, NcLoadingIcon } from '@nextcloud/vue'
86
86
  import ClipboardCheckOutline from 'vue-material-design-icons/ClipboardCheckOutline.vue'
87
87
  import Sync from 'vue-material-design-icons/Sync.vue'
88
88
  import CnOfflineQueue from '../../../components/CnOfflineQueue/index.js'
89
+ import { userLocale } from '../../../utils/userLocale.js'
89
90
  import { syncIndicator } from '../../offline/fieldCollectionHelpers.js'
90
91
  import {
91
92
  countPending,
@@ -186,7 +187,7 @@ export default {
186
187
  return ''
187
188
  }
188
189
  const moment = new Date(syncedAt)
189
- return Number.isNaN(moment.getTime()) ? '' : moment.toLocaleString()
190
+ return Number.isNaN(moment.getTime()) ? '' : moment.toLocaleString(userLocale())
190
191
  },
191
192
 
192
193
  /**
@@ -154,6 +154,7 @@ import Plus from 'vue-material-design-icons/Plus.vue'
154
154
  import CnPhotoAlbumCreate from '../../../components/CnPhotoAlbumCreate/CnPhotoAlbumCreate.vue'
155
155
  import CnPhotoAlbumPicker from '../../../components/CnPhotoAlbumPicker/CnPhotoAlbumPicker.vue'
156
156
  import { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'
157
+ import { userLocale } from '../../../utils/userLocale.js'
157
158
 
158
159
  /**
159
160
  * CnPhotosTab — bespoke album grid for the `photos` integration.
@@ -317,7 +318,7 @@ export default {
317
318
  if (Number.isNaN(d.getTime())) {
318
319
  return String(value)
319
320
  }
320
- return d.toLocaleDateString(undefined, { dateStyle: 'medium' })
321
+ return d.toLocaleDateString(userLocale(), { dateStyle: 'medium' })
321
322
  } catch {
322
323
  return String(value)
323
324
  }
@@ -3,7 +3,7 @@
3
3
  "$id": "https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json",
4
4
  "title": "Conduction App Manifest v2",
5
5
  "description": "v2 schema for the JSON-driven page and navigation manifest consumed by @conduction/nextcloud-vue. Introduces a uniform widgets[] array on every page type with a per-slot grid coordinate system, a typed actions[] discriminator, and the required $schema field for version detection. v1 manifests continue to validate against app-manifest.schema.json (unchanged).",
6
- "version": "2.96.0",
6
+ "version": "2.100.0",
7
7
  "type": "object",
8
8
  "required": ["$schema", "version"],
9
9
  "allOf": [
@@ -1116,7 +1116,12 @@
1116
1116
  "additionalProperties": { "type": "string", "enum": ["default", "primary", "success", "warning", "error", "info", "purple", "teal"] }
1117
1117
  },
1118
1118
  "due": { "type": "string", "description": "The date field of the footer's due text, marked by `dueRule`." },
1119
- "owner": { "type": "string", "description": "The field of the owner shown as an avatar (initials) at the footer's end." }
1119
+ "owner": { "type": "string", "description": "The field of the owner shown as an avatar (initials) at the footer's end." },
1120
+ "formatters": {
1121
+ "type": "object",
1122
+ "description": "screens-board-reference-columns (2.97.0): a card field (one of the role fields above) to the id of a formatter in the app's `cnFormatters` registry, the one table columns name in `formatter`. The card shows the formatted text, so a reference reads as its name (`{ \"caseType\": \"caseTypeName\" }`).",
1123
+ "additionalProperties": { "type": "string", "minLength": 1 }
1124
+ }
1120
1125
  }
1121
1126
  },
1122
1127
  "colorField": {
@@ -1145,6 +1150,96 @@
1145
1150
  "dueRule": {
1146
1151
  "$ref": "#/$defs/dueRule",
1147
1152
  "description": "Marks late cards. A card whose date is before today gets an error edge and the label 'Overdue'; one due within `soonDays` gets 'Due soon'. Omitted, no card is marked."
1153
+ },
1154
+ "columnFields": {
1155
+ "type": "array",
1156
+ "minItems": 1,
1157
+ "description": "screens-board-reference-columns (2.97.0): the fields the columns can come from, offered in a \"Columns:\" switch after the search when there are two or more (\"status | type | assignee\"). The entry on `statusField` is the default. An entry with a `source` takes its columns from the rows the field REFERENCES (a case's status pointing at statusType rows), fetched, not from the values on the cards; `kind: \"values\"` (a user id, which references no schema) takes the values present plus a column for no value. Without a `source` or `kind` the field's enum or lifecycle states are read as before. A drop writes the reference: through `moveHandler` when named, else a PATCH of the field on the row.",
1158
+ "items": {
1159
+ "type": "object",
1160
+ "additionalProperties": false,
1161
+ "required": ["field"],
1162
+ "properties": {
1163
+ "field": { "type": "string", "minLength": 1, "description": "The row field the columns come from." },
1164
+ "label": { "type": "string", "description": "Its name in the column switch (an i18n key). Defaults to the field." },
1165
+ "kind": { "type": "string", "enum": ["values"], "description": "`values`: the field references no schema (a Nextcloud user id); the columns are the values present on the rows, by `valueLabels` or the value itself, then one column for no value (`emptyLabel`)." },
1166
+ "valueLabels": { "type": "object", "additionalProperties": { "type": "string" }, "description": "`kind: values`: raw value to the column label." },
1167
+ "emptyLabel": { "type": "string", "description": "`kind: values`: the label of the column for no value (an i18n key). Defaults to \"Nobody\"." },
1168
+ "source": {
1169
+ "type": "object",
1170
+ "additionalProperties": false,
1171
+ "description": "The referenced rows that are the columns: one list request to `register`/`schema` (defaults: the page's register and the property's `$ref`).",
1172
+ "properties": {
1173
+ "register": { "type": "string", "minLength": 1 },
1174
+ "schema": { "type": "string", "minLength": 1 },
1175
+ "labelField": { "type": "string", "description": "The referenced row's field that names a column. Defaults to `name`, then `title`." },
1176
+ "orderField": { "type": "string", "description": "The referenced row's numeric field the columns are ordered by." },
1177
+ "colorField": { "type": "string", "description": "The referenced row's field that holds the column's dot colour (a badge variant or a CSS colour)." },
1178
+ "filter": { "type": "object", "description": "Equality filters on the referenced rows, e.g. `{ \"isFinal\": false }` to leave out end states.", "additionalProperties": { "type": ["string", "number", "boolean"] } },
1179
+ "capacityField": { "type": "string", "minLength": 1, "description": "board-column-capacity (2.100.0): the referenced row's numeric field that holds the column's limit. The header reads \"count / capacity\" and turns full at the limit, and a move into a full row is refused before it is written (the server still guards). A column merged from several rows shows no limit, but each row's own limit still refuses a move into it. A row without a number above 0 has no limit." },
1180
+ "mergeBy": { "type": "string", "description": "Merge referenced rows with the same value of this field into one column (statuses of every case type by `name`). A drop then writes the row of the card's own parent (`narrowBy`), and is refused when that parent has none." },
1181
+ "narrowBy": {
1182
+ "type": "object",
1183
+ "additionalProperties": false,
1184
+ "required": ["field", "rowField"],
1185
+ "description": "The parent link: the referenced row's `field` equals the card's `rowField` (statusType.caseType = case.caseType). While the page filters on `rowField` with one value, the columns are that parent's rows only.",
1186
+ "properties": {
1187
+ "field": { "type": "string", "minLength": 1 },
1188
+ "rowField": { "type": "string", "minLength": 1 }
1189
+ }
1190
+ }
1191
+ }
1192
+ },
1193
+ "readOnly": { "type": "boolean", "default": false, "description": "No drag and no Move to while the columns come from this field." },
1194
+ "moveHandler": { "type": "string", "minLength": 1, "description": "A handler in the app's registry that makes the move: it gets `{ card, toKey, field, value, target }` (value: the referenced id to write; target: its row) and returns a promise; a rejection shows its message as the refusal. Absent, the field is written with a PATCH." },
1195
+ "moveTargetsHandler": { "type": "string", "minLength": 1, "description": "A handler in the app's registry that answers where one card may go: it gets `{ card, field }` and returns the values (referenced ids) it can reach. Columns out of reach fade during a drag, read \"not allowed\" in the card menu, and refuse a drop." }
1196
+ }
1197
+ }
1198
+ },
1199
+ "moveHandler": {
1200
+ "type": "string",
1201
+ "minLength": 1,
1202
+ "description": "screens-board-reference-columns (2.97.0): a handler in the app's registry that moves a card on `statusField` (the app's transition), with the `columnFields[].moveHandler` call shape. Lets a manifest-only page run the host's transition, which the `runTransition` prop could not."
1203
+ },
1204
+ "moveTargetsHandler": {
1205
+ "type": "string",
1206
+ "minLength": 1,
1207
+ "description": "screens-board-reference-columns (2.97.0): where a card on `statusField` may go, with the `columnFields[].moveTargetsHandler` call shape."
1208
+ },
1209
+ "narrow": {
1210
+ "type": "object",
1211
+ "additionalProperties": false,
1212
+ "required": ["field"],
1213
+ "description": "screens-board-reference-columns (2.97.0): a select after the search (\"Case type: All case types | Woo-verzoek | ...\") that sets the page filter on `field`. With a reference column's `narrowBy.rowField` on the same field, the columns narrow to that parent's rows.",
1214
+ "properties": {
1215
+ "field": { "type": "string", "minLength": 1, "description": "The row field the select filters on." },
1216
+ "label": { "type": "string", "description": "The select's label (an i18n key), shown with a colon. Defaults to the property's title." },
1217
+ "allLabel": { "type": "string", "description": "The option for no narrowing (an i18n key). Defaults to \"All\"." },
1218
+ "source": {
1219
+ "type": "object",
1220
+ "additionalProperties": false,
1221
+ "description": "Where the options come from (defaults: the page's register and the property's `$ref`).",
1222
+ "properties": {
1223
+ "register": { "type": "string", "minLength": 1 },
1224
+ "schema": { "type": "string", "minLength": 1 },
1225
+ "labelField": { "type": "string", "description": "The option row's label field. Defaults to `title`." },
1226
+ "filter": { "type": "object", "additionalProperties": { "type": ["string", "number", "boolean"] } }
1227
+ }
1228
+ }
1229
+ }
1230
+ },
1231
+ "columnSwitchLabel": {
1232
+ "type": "string",
1233
+ "description": "screens-board-reference-columns (2.97.0): the column switch's label (an i18n key), shown with a colon. Defaults to \"Columns\"."
1234
+ },
1235
+ "hint": {
1236
+ "type": "string",
1237
+ "description": "screens-board-reference-columns (2.97.0): one sentence after the board's controls, in the secondary colour (an i18n key), e.g. how a move works."
1238
+ },
1239
+ "wrap": {
1240
+ "type": "boolean",
1241
+ "default": false,
1242
+ "description": "screens-board-reference-columns (2.97.0): wrap the columns onto more rows, as many to a row as fit at 240px, instead of one row that scrolls sideways. For a board with more stages than fit."
1148
1243
  }
1149
1244
  }
1150
1245
  },
@@ -3533,7 +3628,7 @@
3533
3628
  },
3534
3629
  "titleField": {
3535
3630
  "type": "string",
3536
- "description": "type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop."
3631
+ "description": "type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop. type='detail' (detail-title-field): the record field (a dotted path, for example `number`) the header names the record by, as an invoice page names the invoice number instead of the schema title; an empty value falls back to the display name, and the breadcrumb's current crumb and the type eyebrow follow. Maps to CnDetailPage `titleField`."
3537
3632
  },
3538
3633
  "idParam": {
3539
3634
  "type": "string",
@@ -4177,8 +4272,19 @@
4177
4272
  "description": "type='index': show the page header (icon, title, description) inline. Default false: the title renders visually hidden and the sidebar names the page. Maps to CnIndexPage `showTitle`."
4178
4273
  },
4179
4274
  "countSubtitle": {
4180
- "type": "string",
4181
- "description": "type='index': an i18n key for the description line with `{total}` replaced by the collection's total, e.g. \"{total} open cases\" (zuiddrecht-pixel-gaps). Shown in place of `description` once a total is known. Maps to CnIndexPage `countSubtitle`."
4275
+ "anyOf": [
4276
+ { "type": "string" },
4277
+ {
4278
+ "type": "object",
4279
+ "additionalProperties": false,
4280
+ "required": ["singular", "plural"],
4281
+ "properties": {
4282
+ "singular": { "type": "string", "minLength": 1, "description": "i18n key of the line for a total of one, e.g. \"{total} invoice\"." },
4283
+ "plural": { "type": "string", "minLength": 1, "description": "i18n key of the line for any other total, e.g. \"{total} invoices\"." }
4284
+ }
4285
+ }
4286
+ ],
4287
+ "description": "type='index': an i18n key for the description line with `{total}` replaced by the collection's total, e.g. \"{total} open cases\" (zuiddrecht-pixel-gaps). Shown in place of `description` once a total is known. `{ singular, plural }` picks the form by the total through the app's plural translation (`translatePlural`), so \"1 factuur\" and \"12 facturen\" each read right (index-count-plural). Maps to CnIndexPage `countSubtitle`."
4182
4288
  },
4183
4289
  "showTitleIcon": {
4184
4290
  "type": "boolean",
@@ -4531,6 +4637,11 @@
4531
4637
  }
4532
4638
  }
4533
4639
  },
4640
+ {
4641
+ "description": "screens-board-reference-columns (2.97.0): config.board on an index page, the block CnPageRenderer hands to CnIndexPage's `board` prop, is typed by boardView like pages[].board.",
4642
+ "if": { "properties": { "type": { "const": "index" } }, "required": ["type"] },
4643
+ "then": { "properties": { "config": { "properties": { "board": { "$ref": "#/$defs/boardView" } } } } }
4644
+ },
4534
4645
  {
4535
4646
  "description": "index-calendar-view-mode: config.calendar on an index page is typed by calendarView.",
4536
4647
  "if": { "properties": { "type": { "const": "index" } }, "required": ["type"] },