@conduction/nextcloud-vue 2.56.0-beta.37 → 2.56.0-beta.39

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 (301) hide show
  1. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue.js +1 -1
  2. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue2.js +3 -2
  3. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue.js +1 -1
  6. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue2.js +5 -4
  7. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue.js +1 -1
  10. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue2.js +2 -1
  11. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue2.js.map +1 -1
  12. package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue3.js.map +1 -1
  13. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  14. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +2 -1
  15. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  16. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  17. package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
  18. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +156 -14
  19. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  20. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +105 -74
  21. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  22. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue.js +1 -1
  23. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue2.js +2 -1
  24. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue2.js.map +1 -1
  25. package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue3.js.map +1 -1
  26. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue.js +1 -1
  27. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue2.js +2 -1
  28. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue2.js.map +1 -1
  29. package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue3.js.map +1 -1
  30. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  31. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +6 -5
  32. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  33. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  34. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue.js +1 -1
  35. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue2.js +2 -1
  36. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue2.js.map +1 -1
  37. package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue3.js.map +1 -1
  38. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +1 -1
  39. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +2 -1
  40. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -1
  41. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -1
  42. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
  43. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +2 -1
  44. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
  45. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
  46. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  47. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +2 -1
  48. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  49. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  50. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue.js +1 -1
  51. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue2.js +3 -1
  52. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue2.js.map +1 -1
  53. package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue3.js.map +1 -1
  54. package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue2.js +2 -1
  55. package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue2.js.map +1 -1
  56. package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue3.js.map +1 -1
  57. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue.js +1 -1
  58. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue2.js +2 -1
  59. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue2.js.map +1 -1
  60. package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue3.js.map +1 -1
  61. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue.js +1 -1
  62. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue2.js +3 -1
  63. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue2.js.map +1 -1
  64. package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue3.js.map +1 -1
  65. package/dist/esm/components/CnFileManager/CnFileManager.vue.js +1 -1
  66. package/dist/esm/components/CnFileManager/CnFileManager.vue2.js +3 -1
  67. package/dist/esm/components/CnFileManager/CnFileManager.vue2.js.map +1 -1
  68. package/dist/esm/components/CnFileManager/CnFileManager.vue3.js.map +1 -1
  69. package/dist/esm/components/CnFilePreview/CnFilePreview.vue.js +1 -1
  70. package/dist/esm/components/CnFilePreview/CnFilePreview.vue2.js +2 -1
  71. package/dist/esm/components/CnFilePreview/CnFilePreview.vue2.js.map +1 -1
  72. package/dist/esm/components/CnFilePreview/CnFilePreview.vue3.js.map +1 -1
  73. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  74. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +49 -1
  75. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  76. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +3 -3
  77. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  78. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue.js +1 -1
  79. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js +2 -1
  80. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js.map +1 -1
  81. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js.map +1 -1
  82. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -5
  83. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  84. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  85. package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
  86. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js +2 -1
  87. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
  88. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
  89. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue.js +1 -1
  90. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue2.js +3 -2
  91. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue2.js.map +1 -1
  92. package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue3.js.map +1 -1
  93. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  94. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +28 -0
  95. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  96. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +82 -75
  97. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  98. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue.js +1 -1
  99. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue2.js +5 -4
  100. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue2.js.map +1 -1
  101. package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue3.js.map +1 -1
  102. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue.js +1 -1
  103. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue2.js +2 -1
  104. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue2.js.map +1 -1
  105. package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue3.js.map +1 -1
  106. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue.js +1 -1
  107. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue2.js +2 -1
  108. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue2.js.map +1 -1
  109. package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue3.js.map +1 -1
  110. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue.js +1 -1
  111. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +2 -1
  112. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
  113. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
  114. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue.js +1 -1
  115. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue2.js +2 -1
  116. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue2.js.map +1 -1
  117. package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue3.js.map +1 -1
  118. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue.js +1 -1
  119. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue2.js +2 -1
  120. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue2.js.map +1 -1
  121. package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue3.js.map +1 -1
  122. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue.js +1 -1
  123. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue2.js +2 -1
  124. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue2.js.map +1 -1
  125. package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue3.js.map +1 -1
  126. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue2.js +2 -0
  127. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue2.js.map +1 -1
  128. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue3.js +2 -2
  129. package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue3.js.map +1 -1
  130. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue.js +1 -1
  131. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js +2 -1
  132. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js.map +1 -1
  133. package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue3.js.map +1 -1
  134. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue.js +1 -1
  135. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue2.js +2 -1
  136. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue2.js.map +1 -1
  137. package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue3.js.map +1 -1
  138. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  139. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +36 -0
  140. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  141. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +55 -40
  142. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  143. package/dist/esm/components/CnTasksCard/CnTasksCard.vue.js +1 -1
  144. package/dist/esm/components/CnTasksCard/CnTasksCard.vue2.js +2 -1
  145. package/dist/esm/components/CnTasksCard/CnTasksCard.vue2.js.map +1 -1
  146. package/dist/esm/components/CnTasksCard/CnTasksCard.vue3.js.map +1 -1
  147. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +1 -1
  148. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +2 -1
  149. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
  150. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
  151. package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue.js +1 -1
  152. package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue2.js +2 -1
  153. package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue2.js.map +1 -1
  154. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue.js +1 -1
  155. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue2.js +2 -1
  156. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue2.js.map +1 -1
  157. package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue3.js.map +1 -1
  158. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
  159. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +3 -26
  160. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  161. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  162. package/dist/esm/dialogs/CnNoteHistoryDialog.vue.js +1 -1
  163. package/dist/esm/dialogs/CnNoteHistoryDialog.vue2.js +2 -1
  164. package/dist/esm/dialogs/CnNoteHistoryDialog.vue2.js.map +1 -1
  165. package/dist/esm/dialogs/CnNoteHistoryDialog.vue3.js.map +1 -1
  166. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue.js +1 -1
  167. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue2.js +3 -2
  168. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue2.js.map +1 -1
  169. package/dist/esm/integrations/builtin/activity/CnActivityCard.vue3.js.map +1 -1
  170. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue.js +1 -1
  171. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue2.js +4 -3
  172. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue2.js.map +1 -1
  173. package/dist/esm/integrations/builtin/activity/CnActivityTab.vue3.js.map +1 -1
  174. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue.js +1 -1
  175. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -2
  176. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
  177. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
  178. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue.js +1 -1
  179. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js +2 -1
  180. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js.map +1 -1
  181. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue3.js.map +1 -1
  182. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue.js +1 -1
  183. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js +6 -5
  184. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js.map +1 -1
  185. package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue3.js.map +1 -1
  186. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue.js +1 -1
  187. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue2.js +2 -1
  188. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue2.js.map +1 -1
  189. package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue3.js.map +1 -1
  190. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue.js +1 -1
  191. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
  192. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
  193. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
  194. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue.js +1 -1
  195. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
  196. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
  197. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
  198. package/dist/esm/integrations/builtin/email/CnEmailCard.vue.js +1 -1
  199. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js +2 -1
  200. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
  201. package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
  202. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue.js +1 -1
  203. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +2 -1
  204. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  205. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  206. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue.js +1 -1
  207. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue2.js +2 -1
  208. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue2.js.map +1 -1
  209. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue3.js.map +1 -1
  210. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue.js +1 -1
  211. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
  212. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
  213. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
  214. package/dist/esm/l10n/en.json.js +35 -2
  215. package/dist/esm/l10n/en.json.js.map +1 -1
  216. package/dist/esm/l10n/nl.json.js +38 -2
  217. package/dist/esm/l10n/nl.json.js.map +1 -1
  218. package/dist/esm/library-style.js +1 -1
  219. package/dist/esm/nextcloud-vue.css +1068 -962
  220. package/dist/esm/store/useObjectStore.js +7 -2
  221. package/dist/esm/store/useObjectStore.js.map +1 -1
  222. package/dist/esm/utils/boardColumns.js +50 -1
  223. package/dist/esm/utils/boardColumns.js.map +1 -1
  224. package/dist/esm/utils/boardReferenceColumns.js +115 -4
  225. package/dist/esm/utils/boardReferenceColumns.js.map +1 -1
  226. package/dist/esm/utils/contentHeaderLink.js +48 -1
  227. package/dist/esm/utils/contentHeaderLink.js.map +1 -1
  228. package/dist/esm/utils/schema.js +5 -4
  229. package/dist/esm/utils/schema.js.map +1 -1
  230. package/dist/esm/utils/userLocale.js +30 -0
  231. package/dist/esm/utils/userLocale.js.map +1 -0
  232. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  233. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  234. package/dist/nextcloud-vue.cjs.js +1088 -476
  235. package/dist/nextcloud-vue.cjs.js.map +2 -2
  236. package/dist/nextcloud-vue.css +1068 -962
  237. package/l10n/en.json +35 -2
  238. package/l10n/nl.json +38 -2
  239. package/package.json +1 -1
  240. package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +3 -2
  241. package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +5 -4
  242. package/src/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue +2 -1
  243. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +2 -1
  244. package/src/components/CnBoardView/CnBoardView.vue +189 -24
  245. package/src/components/CnCalendarEventPicker/CnCalendarEventPicker.vue +2 -1
  246. package/src/components/CnCalendarWidget/CnCalendarWidget.vue +2 -1
  247. package/src/components/CnChartWidget/CnChartWidget.vue +6 -5
  248. package/src/components/CnCollectivePagePicker/CnCollectivePagePicker.vue +2 -1
  249. package/src/components/CnConversationThread/CnConversationThread.vue +2 -1
  250. package/src/components/CnCountdownWidget/CnCountdownWidget.vue +2 -1
  251. package/src/components/CnDashboardPage/CnDashboardPage.vue +2 -1
  252. package/src/components/CnDataMatrix/CnDataMatrix.vue +2 -1
  253. package/src/components/CnDetailPage/CnDetailHeaderChips.vue +2 -1
  254. package/src/components/CnEmailPicker/CnEmailPicker.vue +2 -1
  255. package/src/components/CnFederationStatus/CnFederationStatus.vue +3 -1
  256. package/src/components/CnFileManager/CnFileManager.vue +2 -1
  257. package/src/components/CnFilePreview/CnFilePreview.vue +2 -1
  258. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +54 -6
  259. package/src/components/CnFollowToggle/CnFollowToggle.vue +2 -1
  260. package/src/components/CnIndexPage/CnIndexPage.vue +30 -4
  261. package/src/components/CnNotesCard/CnNotesCard.vue +2 -1
  262. package/src/components/CnObjectCalendar/CnObjectCalendar.vue +3 -2
  263. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +36 -0
  264. package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +5 -4
  265. package/src/components/CnObjectSidebar/CnAuditTrailTab.vue +2 -1
  266. package/src/components/CnObjectSidebar/CnFlowTasksPanel.vue +2 -1
  267. package/src/components/CnObjectSidebar/CnNotesTab.vue +2 -1
  268. package/src/components/CnObjectSidebar/CnTasksTab.vue +2 -1
  269. package/src/components/CnPropertySourceField/CnPropertySourceField.vue +2 -1
  270. package/src/components/CnRoadmapItem/CnRoadmapItem.vue +2 -1
  271. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +4 -2
  272. package/src/components/CnStatsBlock/CnStatsBlock.vue +2 -1
  273. package/src/components/CnSummaryAggregates/CnSummaryAggregates.vue +2 -1
  274. package/src/components/CnTabsWidget/CnTabsWidget.vue +71 -0
  275. package/src/components/CnTasksCard/CnTasksCard.vue +2 -1
  276. package/src/components/CnTimelineWidget/CnTimelineWidget.vue +2 -1
  277. package/src/components/CnTranslatedBadge/CnTranslatedBadge.vue +2 -1
  278. package/src/components/CnVersionHistory/CnVersionHistory.vue +2 -1
  279. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +3 -26
  280. package/src/css/board.css +40 -0
  281. package/src/dialogs/CnNoteHistoryDialog.vue +2 -1
  282. package/src/integrations/builtin/activity/CnActivityCard.vue +3 -2
  283. package/src/integrations/builtin/activity/CnActivityTab.vue +4 -3
  284. package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +3 -2
  285. package/src/integrations/builtin/calendar/CnCalendarCard.vue +2 -1
  286. package/src/integrations/builtin/calendar/CnCalendarTab.vue +6 -5
  287. package/src/integrations/builtin/contactmoment/CnContactmomentCard.vue +2 -1
  288. package/src/integrations/builtin/cospend/CnCospendTab.vue +2 -1
  289. package/src/integrations/builtin/deck/CnDeckTab.vue +2 -1
  290. package/src/integrations/builtin/email/CnEmailCard.vue +2 -1
  291. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +2 -1
  292. package/src/integrations/builtin/field-inspection/CnFieldInspectionTab.vue +2 -1
  293. package/src/integrations/builtin/photos/CnPhotosTab.vue +2 -1
  294. package/src/schemas/app-manifest-v2.schema.json +4 -1
  295. package/src/store/useObjectStore.js +7 -2
  296. package/src/utils/boardColumns.js +49 -0
  297. package/src/utils/boardReferenceColumns.js +114 -3
  298. package/src/utils/contentHeaderLink.js +47 -0
  299. package/src/utils/schema.js +5 -4
  300. package/src/utils/userLocale.js +26 -0
  301. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -88,6 +88,7 @@
88
88
  import { translate as t } from '@nextcloud/l10n'
89
89
  import { NcLoadingIcon } from '@nextcloud/vue'
90
90
  import { normalizeLook } from '../../composables/useLook.js'
91
+ import { userLocale } from '../../utils/userLocale.js'
91
92
 
92
93
  // The canonical KPI look, shared with CnStatWidget. Imported here so the
93
94
  // card is styled even when the consuming app has not pulled in the
@@ -372,7 +373,7 @@ export default {
372
373
  },
373
374
 
374
375
  formattedCount() {
375
- return this.count.toLocaleString()
376
+ return this.count.toLocaleString(userLocale())
376
377
  },
377
378
 
378
379
  /**
@@ -21,6 +21,7 @@
21
21
  <script>
22
22
  import { NcLoadingIcon } from '@nextcloud/vue'
23
23
  import { fetchAggregateValue } from '../../utils/fetchAggregate.js'
24
+ import { userLocale } from '../../utils/userLocale.js'
24
25
 
25
26
  /**
26
27
  * CnSummaryAggregates — declarative count/sum/avg stat chips for a
@@ -150,7 +151,7 @@ export default {
150
151
  return new Intl.NumberFormat(undefined, { style: 'currency', currency: 'EUR' }).format(num)
151
152
  }
152
153
  if (typeof raw === 'number') {
153
- return raw.toLocaleString()
154
+ return raw.toLocaleString(userLocale())
154
155
  }
155
156
  return raw
156
157
  },
@@ -15,7 +15,19 @@
15
15
  is showing. This is the point of the component: six tabbed
16
16
  widgets used to mean six card headers stacked down the page. -->
17
17
  <template #nav-end>
18
+ <!-- The open panel's header link ("All sales invoices"): a panel
19
+ draws no card header, so the link its widget declares is
20
+ drawn here, and changes with the tab. -->
21
+ <component
22
+ :is="activeHeaderLinkTarget.tag"
23
+ v-if="activeHeaderLinkTarget.tag"
24
+ class="cn-tabs-widget__header-link"
25
+ data-testid="cn-tabs-widget-header-link"
26
+ v-bind="activeHeaderLinkTarget.attrs">
27
+ {{ cnTranslate(activeHeaderLink.label) }}
28
+ </component>
18
29
  <CnActionsMenu
30
+ v-if="showActions"
19
31
  :showRefresh="showRefresh"
20
32
  :showRequestFeature="showRequestFeature"
21
33
  :showDocumentation="showDocumentation"
@@ -169,6 +181,7 @@ import CnIcon from '../CnIcon/CnIcon.vue'
169
181
  import CnTab from '../CnTabs/CnTab.vue'
170
182
  import CnTabs from '../CnTabs/CnTabs.vue'
171
183
  import { normalizeLook } from '../../composables/useLook.js'
184
+ import { headerLinkTarget, widgetHeaderLink } from '../../utils/contentHeaderLink.js'
172
185
  import { resolveTabCount } from '../../utils/detailActionModel.js'
173
186
  import { fetchListTotal } from '../../utils/fetchFilterCounts.js'
174
187
  import { isActivityWidget } from '../../utils/headerMeta.js'
@@ -430,6 +443,18 @@ export default {
430
443
  default: () => ({}),
431
444
  },
432
445
 
446
+ /**
447
+ * Whether the strip draws its Actions menu at all. `false` drops the
448
+ * whole menu, the open panel's own items included, for a board that
449
+ * draws none. Manifest: `content.showActions` on the tabs widget.
450
+ *
451
+ * @spec openspec/changes/tabs-widget-actions-off/specs/tabs-widget-actions-off/spec.md#requirement-a-manifest-can-turn-off-the-tab-strips-actions-menu
452
+ */
453
+ showActions: {
454
+ type: Boolean,
455
+ default: true,
456
+ },
457
+
433
458
  /** Show the Refresh entry in the hoisted Actions menu. */
434
459
  showRefresh: {
435
460
  type: Boolean,
@@ -654,6 +679,29 @@ export default {
654
679
  return this.activeTab?.widgetId || ''
655
680
  },
656
681
 
682
+ /**
683
+ * The header link the open tab's widget declares (`headerLink` on the
684
+ * definition, or in its content), or null. For a stack, the first
685
+ * widget's.
686
+ *
687
+ * @spec openspec/changes/tabs-widget-header-link/specs/tabs-widget-header-link/spec.md#requirement-the-tab-strip-draws-the-open-panels-header-link
688
+ * @return {object|null}
689
+ */
690
+ activeHeaderLink() {
691
+ return widgetHeaderLink(this.activeTab?.widget)
692
+ },
693
+
694
+ /**
695
+ * How to draw the open panel's header link: a router link for a
696
+ * route, an anchor for an href, nothing otherwise.
697
+ *
698
+ * @spec openspec/changes/tabs-widget-header-link/specs/tabs-widget-header-link/spec.md#requirement-the-tab-strip-draws-the-open-panels-header-link
699
+ * @return {{tag: string, attrs: object}}
700
+ */
701
+ activeHeaderLinkTarget() {
702
+ return headerLinkTarget(this.activeHeaderLink, Boolean(this.$router))
703
+ },
704
+
657
705
  /**
658
706
  * The active child's label, so the Actions menu names what it acts on.
659
707
  *
@@ -1231,6 +1279,29 @@ export default {
1231
1279
  margin: auto -12px -12px;
1232
1280
  }
1233
1281
 
1282
+ /* The open panel's header link, beside the strip. Same look and theme hooks
1283
+ as a card header link (CnWidgetWrapper). */
1284
+ .cn-tabs-widget__header-link {
1285
+ align-self: center;
1286
+ padding: 0 calc(1 * var(--default-grid-baseline));
1287
+ color: var(--color-primary-element);
1288
+ font-size: var(--cn-widget-header-link-size, 14px);
1289
+ font-weight: var(--cn-widget-header-link-weight, 600);
1290
+ text-decoration: none;
1291
+ white-space: nowrap;
1292
+ }
1293
+
1294
+ .cn-tabs-widget__header-link:hover,
1295
+ .cn-tabs-widget__header-link:focus-visible {
1296
+ text-decoration: underline;
1297
+ }
1298
+
1299
+ .cn-tabs-widget__header-link:focus-visible {
1300
+ outline: 2px solid var(--color-primary-element);
1301
+ outline-offset: 2px;
1302
+ border-radius: var(--border-radius-small, 4px);
1303
+ }
1304
+
1234
1305
  .cn-tabs-widget__title {
1235
1306
  align-items: center;
1236
1307
  display: inline-flex;
@@ -97,6 +97,7 @@ import ProgressClock from 'vue-material-design-icons/ProgressClock.vue'
97
97
  import CnDetailCard from '../CnDetailCard/CnDetailCard.vue'
98
98
  import CnUserActionMenu from '../CnUserActionMenu/CnUserActionMenu.vue'
99
99
  import { buildHeaders, prefixUrl } from '../../utils/index.js'
100
+ import { userLocale } from '../../utils/userLocale.js'
100
101
 
101
102
  /**
102
103
  * CnTasksCard — Inline tasks widget for detail pages.
@@ -261,7 +262,7 @@ export default {
261
262
  return ''
262
263
  }
263
264
  try {
264
- return new Date(dateStr).toLocaleDateString(undefined, {
265
+ return new Date(dateStr).toLocaleDateString(userLocale(), {
265
266
  year: 'numeric',
266
267
  month: 'short',
267
268
  day: 'numeric',
@@ -54,6 +54,7 @@
54
54
  import { getLanguage, translate as t } from '@nextcloud/l10n'
55
55
  import { NcLoadingIcon, NcNoteCard } from '@nextcloud/vue'
56
56
  import { auditEvents, fieldEvents, listEvents, relatedEvents, sortEvents, timelineEntryEvents } from '../../utils/timelineEvents.js'
57
+ import { userLocale } from '../../utils/userLocale.js'
57
58
 
58
59
  /**
59
60
  * CnTimelineWidget — an object's dated events in time order (`timeline`
@@ -296,7 +297,7 @@ export default {
296
297
  try {
297
298
  return new Intl.DateTimeFormat(locale, options).format(event.at)
298
299
  } catch {
299
- return event.at.toLocaleString()
300
+ return event.at.toLocaleString(userLocale())
300
301
  }
301
302
  },
302
303
 
@@ -28,6 +28,7 @@
28
28
 
29
29
  <script>
30
30
  import { translate as t } from '@nextcloud/l10n'
31
+ import { userLocale } from '../../utils/userLocale.js'
31
32
 
32
33
  /**
33
34
  * CnTranslatedBadge — surfaces OR's `_translationMeta.translatedFrom`
@@ -173,7 +174,7 @@ export default {
173
174
  try {
174
175
  const d = new Date(this.translatedAt)
175
176
  if (!Number.isNaN(d.getTime())) {
176
- return t('nextcloud-vue', 'Translated at {when}', { when: d.toLocaleString() })
177
+ return t('nextcloud-vue', 'Translated at {when}', { when: d.toLocaleString(userLocale()) })
177
178
  }
178
179
  } catch {
179
180
  // fall through to raw ISO
@@ -132,6 +132,7 @@ import CnDetailCard from '../CnDetailCard/CnDetailCard.vue'
132
132
  import { foldAuditTrailEntries } from '../../utils/auditTrailDiff.js'
133
133
  import { computeObjectDiff } from '../../utils/computeObjectDiff.js'
134
134
  import { buildHeaders } from '../../utils/index.js'
135
+ import { userLocale } from '../../utils/userLocale.js'
135
136
 
136
137
  /**
137
138
  * A single row rendered in the top-level diff table.
@@ -472,7 +473,7 @@ export default {
472
473
  if (Number.isNaN(d.getTime()) === true) {
473
474
  return String(raw)
474
475
  }
475
- return d.toLocaleString()
476
+ return d.toLocaleString(userLocale())
476
477
  },
477
478
  },
478
479
  }
@@ -176,6 +176,7 @@
176
176
 
177
177
  <script>
178
178
  import { translate as t } from '@nextcloud/l10n'
179
+ import { headerLinkTarget } from '../../utils/contentHeaderLink.js'
179
180
  import { slotRenders } from '../../utils/slotContent.js'
180
181
  import { CnActionsMenu } from '../CnActionsMenu/index.js'
181
182
 
@@ -686,17 +687,7 @@ export default {
686
687
  * @return {string}
687
688
  */
688
689
  headerLinkTag() {
689
- const link = this.headerLink
690
- if (!link || typeof link.label !== 'string' || link.label === '') {
691
- return ''
692
- }
693
- if (link.route && this.$router) {
694
- return 'router-link'
695
- }
696
- if (typeof link.href === 'string' && link.href !== '') {
697
- return 'a'
698
- }
699
- return ''
690
+ return headerLinkTarget(this.headerLink, Boolean(this.$router)).tag
700
691
  },
701
692
 
702
693
  /**
@@ -706,21 +697,7 @@ export default {
706
697
  * @return {object}
707
698
  */
708
699
  headerLinkAttrs() {
709
- const link = this.headerLink || {}
710
- if (this.headerLinkTag === 'router-link') {
711
- const to = { name: link.route }
712
- if (link.params && typeof link.params === 'object') {
713
- to.params = link.params
714
- }
715
- if (link.query && typeof link.query === 'object') {
716
- to.query = link.query
717
- }
718
- return { to }
719
- }
720
- if (this.headerLinkTag === 'a') {
721
- return { href: link.href }
722
- }
723
- return {}
700
+ return headerLinkTarget(this.headerLink, Boolean(this.$router)).attrs
724
701
  },
725
702
 
726
703
  /**
package/src/css/board.css CHANGED
@@ -61,6 +61,12 @@
61
61
  font-weight: 400;
62
62
  }
63
63
 
64
+ /* A column at its limit: the count in the error colour; "full" is said in words too. */
65
+ .cn-board-view.cn-board-view--board .cn-board-view__badge.cn-board-view__badge--full {
66
+ color: var(--color-error-text, var(--color-error));
67
+ font-weight: 600;
68
+ }
69
+
64
70
  .cn-board-view.cn-board-view--board .cn-board-view__sum {
65
71
  font-size: 13px;
66
72
  color: var(--color-text-maxcontrast);
@@ -328,3 +334,37 @@
328
334
  font-size: 12px;
329
335
  color: var(--color-text-maxcontrast);
330
336
  }
337
+
338
+ /* A blocked target with the host's reason: the reason on its own line under the name. */
339
+ .cn-board-view.cn-board-view--board .cn-board-view__menu-item.cn-board-view__menu-item--reason {
340
+ flex-wrap: wrap;
341
+ max-width: 320px;
342
+ padding-block: 6px;
343
+ }
344
+
345
+ .cn-board-view .cn-board-view__menu-reason {
346
+ flex-basis: 100%;
347
+ font-size: 12px;
348
+ line-height: 1.4;
349
+ color: var(--color-text-maxcontrast);
350
+ }
351
+
352
+ /* While a card is dragged: why it cannot land in this column, under the header.
353
+ The rest of the column fades; the reason stays at full contrast. */
354
+ .cn-board-view .cn-board-view__column-reason {
355
+ margin: 0 0 8px;
356
+ padding: 6px 8px;
357
+ border-radius: var(--border-radius);
358
+ background-color: var(--color-main-background);
359
+ font-size: 12px;
360
+ line-height: 1.4;
361
+ color: var(--color-main-text);
362
+ }
363
+
364
+ .cn-board-view .cn-board-view__column--unreachable.cn-board-view__column--reason {
365
+ opacity: 1;
366
+ }
367
+
368
+ .cn-board-view .cn-board-view__column--reason > :not(.cn-board-view__column-reason) {
369
+ opacity: 0.45;
370
+ }
@@ -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.99.0",
6
+ "version": "2.102.0",
7
7
  "type": "object",
8
8
  "required": ["$schema", "version"],
9
9
  "allOf": [
@@ -1176,6 +1176,9 @@
1176
1176
  "orderField": { "type": "string", "description": "The referenced row's numeric field the columns are ordered by." },
1177
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
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
+ "neutralColor": { "type": "string", "minLength": 1, "description": "board-neutral-column-colour (2.101.0): the colour a referenced row holds when nobody chose one (the schema default, e.g. \"grey\"). A column merged from several rows (`mergeBy`) then takes the first row colour that is not this one, and this one only when every row has it. Compared as written: \"Grey\" is not \"grey\", and a hex value is not a name. Unset, a merged column takes its first row's colour." },
1181
+ "colorMap": { "type": "object", "description": "board-column-colour-map (2.102.0): a stored row colour to the CSS colour its column is drawn in, e.g. `{ \"orange\": \"var(--nl-color-orange, #e17000)\" }`, so a palette name draws a theme token. Applied after the merge, so `neutralColor` still compares the stored values. A colour it does not map draws as before.", "additionalProperties": { "type": "string", "minLength": 1 } },
1179
1182
  "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." },
1180
1183
  "narrowBy": {
1181
1184
  "type": "object",
@@ -618,6 +618,7 @@ const baseActions = {
618
618
  * Fetch the schema definition for a registered type.
619
619
  * Uses cache — only fetches once per type per session.
620
620
  *
621
+ * @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-schema-title-falls-back-to-its-written-form
621
622
  * @param {string} type The registered type slug
622
623
  * @return {Promise<object|null>} The schema object or null on error
623
624
  */
@@ -638,8 +639,12 @@ const baseActions = {
638
639
  const registerScope = config.register
639
640
  ? `?register=${encodeURIComponent(config.register)}`
640
641
  : ''
641
- const response = await trackedFetch(
642
- prefixUrl(`/apps/openregister/api/schemas/${config.schema}${registerScope}`),
642
+ // Through the schema fallback like every objects-API call: a type
643
+ // resolveObjectOpType registered from a title (`APInvoice` ->
644
+ // `ap-invoice`) retries once with the title as written on a 404.
645
+ const response = await this._fetchWithSchemaFallback(
646
+ type,
647
+ (schema) => prefixUrl(`/apps/openregister/api/schemas/${schema ?? config.schema}${registerScope}`),
643
648
  { method: 'GET', headers: this._buildHeaders() },
644
649
  )
645
650