@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
@@ -5,7 +5,7 @@
5
5
  <template>
6
6
  <div
7
7
  class="cn-board-view"
8
- :class="{ 'cn-board-view--board': isBoardLook }"
8
+ :class="{ 'cn-board-view--board': isBoardLook, 'cn-board-view--wrap': wrapColumns, 'cn-board-view--selecting': selectedKeys.length > 0 }"
9
9
  data-testid="cn-board-view">
10
10
  <p v-if="!usable" class="cn-board-view__unusable" data-testid="cn-board-unusable">
11
11
  {{ unusableText }}
@@ -36,9 +36,12 @@
36
36
  v-for="column in lane.columns"
37
37
  :key="`col-${lane.key}-${column.key}`"
38
38
  class="cn-board-view__column"
39
+ :class="{ 'cn-board-view__column--unreachable': isUnreachable(column), 'cn-board-view__column--full': isFull(column), 'cn-board-view__column--reason': dragReason(column) !== '' }"
39
40
  role="listitem"
40
41
  data-testid="cn-board-column"
41
42
  :data-column="column.key"
43
+ :data-unreachable="isUnreachable(column) ? 'true' : null"
44
+ :data-full="isFull(column) ? 'true' : null"
42
45
  @dragover.prevent
43
46
  @drop="onDrop(column, $event)">
44
47
  <!-- Board look: a dot, the label and a white count badge, with an
@@ -51,8 +54,11 @@
51
54
  :style="{ background: dotColor(column) }"
52
55
  aria-hidden="true" />
53
56
  <span class="cn-board-view__column-title">{{ column.label }}</span>
54
- <span class="cn-board-view__badge" data-testid="cn-board-count">
55
- {{ column.count }}<span v-if="paged" class="hidden-visually"> {{ t('nextcloud-vue', 'on this page') }}</span>
57
+ <span
58
+ class="cn-board-view__badge"
59
+ :class="{ 'cn-board-view__badge--full': isFull(column) }"
60
+ data-testid="cn-board-count">
61
+ {{ capacityOf(column) === null ? column.count : capacityText(column) }}<span v-if="paged" class="hidden-visually"> {{ t('nextcloud-vue', 'on this page') }}</span><span v-if="isFull(column)" class="hidden-visually">{{ ' ' + t('nextcloud-vue', 'full') }}</span>
56
62
  </span>
57
63
  </h2>
58
64
  <span
@@ -64,11 +70,21 @@
64
70
  </div>
65
71
  <h3 v-else class="cn-board-view__column-header">
66
72
  {{ column.label }}
67
- <span class="cn-board-view__count" data-testid="cn-board-count">
68
- {{ countLabel(column) }}
73
+ <span
74
+ class="cn-board-view__count"
75
+ :class="{ 'cn-board-view__count--full': isFull(column) }"
76
+ data-testid="cn-board-count">
77
+ {{ countLabel(column) }}<span v-if="isFull(column)" class="hidden-visually">{{ ' ' + t('nextcloud-vue', 'full') }}</span>
69
78
  </span>
70
79
  </h3>
71
80
 
81
+ <p
82
+ v-if="dragReason(column) !== ''"
83
+ class="cn-board-view__column-reason"
84
+ data-testid="cn-board-column-reason">
85
+ {{ dragReason(column) }}
86
+ </p>
87
+
72
88
  <!--
73
89
  A list of its own, so a reader is told how many cards
74
90
  this column holds. The column is a listitem of the
@@ -116,11 +132,21 @@
116
132
  :data-card-id="cardKey(card)"
117
133
  :draggable="canMove"
118
134
  @dragstart="onDragStart(card, column, $event)"
135
+ @dragend="onDragEnd"
119
136
  @keydown="onCardKeydown(card, column, lane, $event)">
120
137
  <!-- Board look: title link, sub line, pill, footer, and a
121
138
  menu button instead of the Move to select. -->
122
139
  <template v-if="isBoardLook">
123
140
  <div class="cn-board-view__card-head">
141
+ <input
142
+ v-if="selectable"
143
+ type="checkbox"
144
+ class="cn-board-view__select"
145
+ data-testid="cn-board-card-select"
146
+ :data-card-id="cardKey(card)"
147
+ :checked="isSelected(card)"
148
+ :aria-label="selectLabel(card)"
149
+ @change="toggleSelected(card)">
124
150
  <a
125
151
  href="#"
126
152
  class="cn-board-view__card-title"
@@ -164,8 +190,18 @@
164
190
  class="cn-board-view__menu-item"
165
191
  data-testid="cn-board-menu-move"
166
192
  :data-target="target.key"
167
- @click="onMenuMove(card, column, target)">
193
+ :aria-disabled="canMoveTo(card, target) ? null : 'true'"
194
+ :class="{ 'cn-board-view__menu-item--blocked': !canMoveTo(card, target), 'cn-board-view__menu-item--reason': blockReason(card, target) !== '' }"
195
+ @click="canMoveTo(card, target) && onMenuMove(card, column, target)">
168
196
  {{ target.label }}
197
+ <span
198
+ v-if="!canMoveTo(card, target) && blockedNote(card, target) !== ''"
199
+ class="cn-board-view__menu-note"
200
+ data-testid="cn-board-menu-blocked">{{ blockedNote(card, target) }}</span>
201
+ <span
202
+ v-if="blockReason(card, target) !== ''"
203
+ class="cn-board-view__menu-reason"
204
+ data-testid="cn-board-menu-reason">{{ blockReason(card, target) }}</span>
169
205
  </button>
170
206
  </div>
171
207
  <button
@@ -216,6 +252,16 @@
216
252
  </span>
217
253
  </template>
218
254
  <template v-else>
255
+ <label v-if="selectable" class="cn-board-view__select-label">
256
+ <input
257
+ type="checkbox"
258
+ class="cn-board-view__select"
259
+ data-testid="cn-board-card-select"
260
+ :data-card-id="cardKey(card)"
261
+ :checked="isSelected(card)"
262
+ :aria-label="selectLabel(card)"
263
+ @change="toggleSelected(card)">
264
+ </label>
219
265
  <span
220
266
  v-if="dueLabel(card)"
221
267
  class="cn-board-view__due"
@@ -309,13 +355,14 @@ import { translate as t } from '@nextcloud/l10n'
309
355
  import CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'
310
356
  import { normalizeLook } from '../../composables/useLook.js'
311
357
  import { isBadgeVariant } from '../../utils/badgeVariants.js'
312
- import { buildBoardColumns, resolveStageColor } from '../../utils/boardColumns.js'
358
+ import { buildBoardColumns, normalizeAllowed, resolveStageColor } from '../../utils/boardColumns.js'
313
359
  import { buildSwimlanes } from '../../utils/boardSwimlanes.js'
314
360
  import { DROP_OUTCOMES, runBoardDrop } from '../../utils/boardTransition.js'
315
361
  import { daysUntil, dueStateForRow } from '../../utils/dueRule.js'
316
362
  import { formatMetricValue } from '../../utils/formatMetric.js'
317
363
  import { readPath } from '../../utils/readPath.js'
318
364
  import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
365
+ import { userLocale } from '../../utils/userLocale.js'
319
366
 
320
367
  import '../../css/board.css'
321
368
 
@@ -354,6 +401,12 @@ export default {
354
401
  * draws the screens' board anatomy (screens-kanban-parity).
355
402
  */
356
403
  cnLook: { default: 'nextcloud' },
404
+ /**
405
+ * The app's cell-formatter registry, provided by CnAppRoot. A card
406
+ * role named in `cardRoles.formatters` shows its value through it, as
407
+ * the table's cells do (screens-board-reference-columns).
408
+ */
409
+ cnFormatters: { default: () => ({}) },
357
410
  },
358
411
 
359
412
  props: {
@@ -494,9 +547,78 @@ export default {
494
547
  type: Number,
495
548
  default: 0,
496
549
  },
550
+
551
+ /**
552
+ * The column a row belongs in, for a status whose raw value is not
553
+ * the column key: a reference whose rows are merged by name
554
+ * (screens-board-reference-columns). Absent, the row's `statusField`
555
+ * value is the key.
556
+ *
557
+ * @type {((row: object) => string)|null}
558
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-columns-can-be-the-rows-a-field-references
559
+ */
560
+ columnKeyOf: {
561
+ type: Function,
562
+ default: null,
563
+ },
564
+
565
+ /**
566
+ * Wrap the columns onto more rows, as many to a row as fit at 240px,
567
+ * instead of one row that scrolls sideways (manifest
568
+ * `config.board.wrap`). For a board with more stages than fit.
569
+ *
570
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-a-wide-board-can-wrap-its-columns
571
+ */
572
+ wrapColumns: {
573
+ type: Boolean,
574
+ default: false,
575
+ },
576
+
577
+ /**
578
+ * Offer a checkbox on every card, so cards can be selected for the
579
+ * list's bulk actions (the same selection the table holds).
580
+ *
581
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-cards-can-be-selected-for-bulk-actions
582
+ */
583
+ selectable: {
584
+ type: Boolean,
585
+ default: false,
586
+ },
587
+
588
+ /**
589
+ * The selected cards, by row key.
590
+ *
591
+ * @type {Array<string|number>}
592
+ */
593
+ selectedIds: {
594
+ type: Array,
595
+ default: () => [],
596
+ },
597
+
598
+ /**
599
+ * The columns one card may move to, asked when its menu opens or its
600
+ * drag starts: `(card) => Promise<Array<string>|null>`, column keys,
601
+ * `null` for every column. A column the card cannot reach is greyed
602
+ * during the drag and marked "not allowed" in the menu, and a drop on
603
+ * it is refused without asking the host. Absent, every column is
604
+ * offered and the host's move decides.
605
+ *
606
+ * An entry may also be `{ key, allowed, reason }`. With `allowed:
607
+ * false` the column is blocked: the menu shows the reason under its
608
+ * name, the column shows it under its header during a drag, and a
609
+ * drop there is refused with it.
610
+ *
611
+ * @type {((card: object) => Promise<Array<string|{key: string, allowed?: boolean, reason?: string}>|null>)|null}
612
+ * @spec openspec/changes/board-move-block-reasons/specs/board-view/spec.md#requirement-a-move-target-can-be-blocked-with-a-reason
613
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-the-board-shows-where-a-card-can-go
614
+ */
615
+ allowedMoves: {
616
+ type: Function,
617
+ default: null,
618
+ },
497
619
  },
498
620
 
499
- emits: ['card-click', 'card-aux-click', 'moved', 'refused', 'stale', 'load-more'],
621
+ emits: ['card-click', 'card-aux-click', 'moved', 'refused', 'stale', 'load-more', 'select'],
500
622
 
501
623
  data() {
502
624
  return {
@@ -512,6 +634,10 @@ export default {
512
634
  expanded: [],
513
635
  /** The card whose menu is open (board look), by card key. */
514
636
  openMenuKey: null,
637
+ /** Where each card may move (`allowedMoves`), as `{ keys, reasons }` by card key; null = everywhere, absent = not asked yet. */
638
+ allowedByCard: {},
639
+ /** Where the dragged card may move, as `{ keys, reasons }`, or null for everywhere. */
640
+ dragAllowed: null,
515
641
  }
516
642
  },
517
643
 
@@ -529,6 +655,7 @@ export default {
529
655
  statusField: this.statusField,
530
656
  offBoardLabel: t('nextcloud-vue', 'Elsewhere'),
531
657
  colorField: this.colorField,
658
+ keyOf: this.columnKeyOf,
532
659
  })
533
660
  },
534
661
 
@@ -556,9 +683,35 @@ export default {
556
683
  due: (given && given.due) || '',
557
684
  owner: (given && given.owner) || '',
558
685
  pillColors: (given && given.pillColors) || {},
686
+ formatters: (given && given.formatters && typeof given.formatters === 'object') ? given.formatters : {},
559
687
  }
560
688
  },
561
689
 
690
+ /** @return {string} The note on a menu target the card cannot reach. */
691
+ notAllowedLabel() {
692
+ return t('nextcloud-vue', 'not allowed')
693
+ },
694
+
695
+ /** @return {string} The note on a menu target that is full. */
696
+ fullLabel() {
697
+ return t('nextcloud-vue', 'full')
698
+ },
699
+
700
+ /**
701
+ * Every column's total over all lanes, by key: what a limit is
702
+ * measured against, since a swimlane holds only part of a column.
703
+ *
704
+ * @return {Map<string, number>} The totals.
705
+ */
706
+ columnTotals() {
707
+ return new Map(this.board.columns.map((column) => [String(column.key), column.count]))
708
+ },
709
+
710
+ /** @return {Array<string>} The selected row keys as strings. */
711
+ selectedKeys() {
712
+ return (Array.isArray(this.selectedIds) ? this.selectedIds : []).map(String)
713
+ },
714
+
562
715
  /** @return {string} The Open in new tab menu item. */
563
716
  openInNewTabLabel() {
564
717
  return t('nextcloud-vue', 'Open in new tab')
@@ -617,6 +770,206 @@ export default {
617
770
 
618
771
  preventMiddleClickAutoscroll,
619
772
 
773
+ /**
774
+ * Whether a card is selected.
775
+ *
776
+ * @param {object} card The card.
777
+ * @return {boolean} True when selected.
778
+ */
779
+ isSelected(card) {
780
+ return this.selectedKeys.includes(this.cardKey(card))
781
+ },
782
+
783
+ /**
784
+ * The checkbox's accessible name.
785
+ *
786
+ * @param {object} card The card.
787
+ * @return {string} "Select <name>".
788
+ */
789
+ selectLabel(card) {
790
+ const name = this.roleText(card, this.roles.title) || this.cardKey(card)
791
+ return t('nextcloud-vue', 'Select {name}', { name })
792
+ },
793
+
794
+ /**
795
+ * Select a card, or unselect it.
796
+ *
797
+ * @param {object} card The card.
798
+ * @return {void}
799
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-cards-can-be-selected-for-bulk-actions
800
+ */
801
+ toggleSelected(card) {
802
+ const key = this.cardKey(card)
803
+ const next = this.isSelected(card)
804
+ ? this.selectedIds.filter((id) => String(id) !== key)
805
+ : [...this.selectedIds, card?.[this.rowKey]]
806
+ /**
807
+ * @event select Emitted when a card's checkbox changes. Payload: the selected row keys.
808
+ */
809
+ this.$emit('select', next)
810
+ },
811
+
812
+ /**
813
+ * Ask the host where one card may go (`allowedMoves`), once per card.
814
+ *
815
+ * @param {object} card The card.
816
+ * @return {Promise<{keys: Array<string>, reasons: object}|null>} Where it may go, or null for everywhere.
817
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-the-board-shows-where-a-card-can-go
818
+ */
819
+ async loadAllowed(card) {
820
+ if (typeof this.allowedMoves !== 'function') {
821
+ return null
822
+ }
823
+ const key = this.cardKey(card)
824
+ if (Object.hasOwn(this.allowedByCard, key)) {
825
+ return this.allowedByCard[key]
826
+ }
827
+ let allowed
828
+ try {
829
+ allowed = normalizeAllowed(await this.allowedMoves(card))
830
+ } catch {
831
+ // Unknown is not "nowhere": the host's move stays the authority.
832
+ allowed = null
833
+ }
834
+ this.allowedByCard = { ...this.allowedByCard, [key]: allowed }
835
+ return allowed
836
+ },
837
+
838
+ /**
839
+ * Whether a card may move to a column, as far as the board knows.
840
+ *
841
+ * @param {object} card The card.
842
+ * @param {object} target The column.
843
+ * @return {boolean} False only when the host said it cannot.
844
+ */
845
+ isMoveAllowed(card, target) {
846
+ const allowed = this.allowedByCard[this.cardKey(card)]
847
+ return !allowed || allowed.keys.includes(String(target.key))
848
+ },
849
+
850
+ /**
851
+ * Why the host blocked a card's move to a column, when it said.
852
+ *
853
+ * @param {object} card The card.
854
+ * @param {object} target The column.
855
+ * @return {string} The reason, '' when the move is allowed or no reason was given.
856
+ * @spec openspec/changes/board-move-block-reasons/specs/board-view/spec.md#requirement-a-move-target-can-be-blocked-with-a-reason
857
+ */
858
+ blockReason(card, target) {
859
+ const allowed = this.allowedByCard[this.cardKey(card)]
860
+ if (!allowed || this.isMoveAllowed(card, target)) {
861
+ return ''
862
+ }
863
+ return allowed.reasons[String(target.key)] || ''
864
+ },
865
+
866
+ /**
867
+ * The note beside a menu target the card cannot move to.
868
+ *
869
+ * @param {object} card The card.
870
+ * @param {object} target The column.
871
+ * @return {string} "full" or "not allowed"; '' when a reason is shown instead.
872
+ */
873
+ blockedNote(card, target) {
874
+ if (this.blockReason(card, target) !== '') {
875
+ return ''
876
+ }
877
+ return this.isMoveAllowed(card, target) && this.isFull(target) ? this.fullLabel : this.notAllowedLabel
878
+ },
879
+
880
+ /**
881
+ * Why the dragged card cannot land on a column, shown under its header.
882
+ *
883
+ * @param {object} column The column.
884
+ * @return {string} The host's reason while a drag is on, else ''.
885
+ * @spec openspec/changes/board-move-block-reasons/specs/board-view/spec.md#requirement-a-move-target-can-be-blocked-with-a-reason
886
+ */
887
+ dragReason(column) {
888
+ if (this.dragging === null || !this.dragAllowed || column.key === this.dragging.fromKey) {
889
+ return ''
890
+ }
891
+ const key = String(column.key)
892
+ return this.dragAllowed.keys.includes(key) ? '' : (this.dragAllowed.reasons[key] || '')
893
+ },
894
+
895
+ /**
896
+ * A column's limit.
897
+ *
898
+ * @param {object} column The column.
899
+ * @return {number|null} The limit, or null when it has none.
900
+ * @spec openspec/changes/board-column-capacity/specs/board-view/spec.md#requirement-a-column-can-carry-a-capacity
901
+ */
902
+ capacityOf(column) {
903
+ const capacity = Number(column?.capacity)
904
+ return Number.isFinite(capacity) && capacity > 0 ? capacity : null
905
+ },
906
+
907
+ /**
908
+ * Whether a column holds as many cards as its limit, or more.
909
+ *
910
+ * @param {object} column The column.
911
+ * @return {boolean} True when full; false without a limit.
912
+ * @spec openspec/changes/board-column-capacity/specs/board-view/spec.md#requirement-a-column-can-carry-a-capacity
913
+ */
914
+ isFull(column) {
915
+ const capacity = this.capacityOf(column)
916
+ return capacity !== null && (this.columnTotals.get(String(column.key)) ?? column.count) >= capacity
917
+ },
918
+
919
+ /**
920
+ * "count / capacity" for a column with a limit.
921
+ *
922
+ * @param {object} column The column.
923
+ * @return {string} The text.
924
+ */
925
+ capacityText(column) {
926
+ return t('nextcloud-vue', '{count} / {capacity}', {
927
+ count: this.columnTotals.get(String(column.key)) ?? column.count,
928
+ capacity: this.capacityOf(column),
929
+ })
930
+ },
931
+
932
+ /**
933
+ * Whether a card may move to a column: the host allows it and the
934
+ * column is not full.
935
+ *
936
+ * @param {object} card The card.
937
+ * @param {object} target The column.
938
+ * @return {boolean} True when the move may be asked for.
939
+ * @spec openspec/changes/board-column-capacity/specs/board-view/spec.md#requirement-a-drop-into-a-full-column-is-refused
940
+ */
941
+ canMoveTo(card, target) {
942
+ return this.isMoveAllowed(card, target) && !this.isFull(target)
943
+ },
944
+
945
+ /**
946
+ * The sentence a drop into a full column is refused with.
947
+ *
948
+ * @param {object} column The column.
949
+ * @return {string} The sentence.
950
+ */
951
+ fullRefusal(column) {
952
+ return t('nextcloud-vue', '{column} is full: {count} of {capacity}.', {
953
+ column: column.label,
954
+ count: this.columnTotals.get(String(column.key)) ?? column.count,
955
+ capacity: this.capacityOf(column),
956
+ })
957
+ },
958
+
959
+ /**
960
+ * Whether a column is out of reach for the card being dragged.
961
+ *
962
+ * @param {object} column The column.
963
+ * @return {boolean} True while a drag is on and the card cannot go there.
964
+ */
965
+ isUnreachable(column) {
966
+ if (this.dragging === null || column.key === this.dragging.fromKey) {
967
+ return false
968
+ }
969
+ return this.isFull(column)
970
+ || (this.dragAllowed !== null && !this.dragAllowed.keys.includes(String(column.key)))
971
+ },
972
+
620
973
  /**
621
974
  * A card's due state under `dueRule`.
622
975
  *
@@ -658,11 +1011,35 @@ export default {
658
1011
  const fields = Array.isArray(role) ? role : [role]
659
1012
  return fields
660
1013
  .filter((field) => typeof field === 'string' && field !== '')
661
- .map((field) => this.textOf(readPath(card, field)))
1014
+ .map((field) => this.fieldText(card, field))
662
1015
  .filter((value) => value !== '')
663
1016
  .join(' \u00b7 ')
664
1017
  },
665
1018
 
1019
+ /**
1020
+ * One card field as text: through the formatter `cardRoles.formatters`
1021
+ * names for it, else the value itself.
1022
+ *
1023
+ * @param {object} card The card's row.
1024
+ * @param {string} field The dot-path.
1025
+ * @return {string} The text.
1026
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-a-card-field-can-show-through-a-formatter
1027
+ */
1028
+ fieldText(card, field) {
1029
+ const raw = readPath(card, field)
1030
+ const id = this.roles.formatters[field]
1031
+ const fn = id && this.cnFormatters ? this.cnFormatters[id] : null
1032
+ if (typeof fn === 'function') {
1033
+ try {
1034
+ const out = fn(raw, card, null)
1035
+ return out === null || out === undefined ? '' : String(out).trim()
1036
+ } catch {
1037
+ return this.textOf(raw)
1038
+ }
1039
+ }
1040
+ return this.textOf(raw)
1041
+ },
1042
+
666
1043
  /**
667
1044
  * A value as text: a string or number as is, an object by its label.
668
1045
  *
@@ -687,7 +1064,7 @@ export default {
687
1064
  * @return {string} A CnStatusBadge variant.
688
1065
  */
689
1066
  pillVariant(card) {
690
- const raw = this.textOf(readPath(card, this.roles.pill))
1067
+ const raw = this.fieldText(card, this.roles.pill)
691
1068
  const variant = this.roles.pillColors[raw] ?? this.roles.pillColors[raw.toLowerCase()]
692
1069
  return isBadgeVariant(variant) ? variant : 'default'
693
1070
  },
@@ -714,7 +1091,7 @@ export default {
714
1091
  const date = new Date(value)
715
1092
  const shown = Number.isNaN(date.getTime())
716
1093
  ? String(value)
717
- : date.toLocaleDateString(undefined, { day: 'numeric', month: 'short' })
1094
+ : date.toLocaleDateString(userLocale(), { day: 'numeric', month: 'short' })
718
1095
  return days < 0
719
1096
  ? t('nextcloud-vue', 'Overdue {date}', { date: shown })
720
1097
  : t('nextcloud-vue', 'Due {date}', { date: shown })
@@ -727,7 +1104,7 @@ export default {
727
1104
  * @return {string} The name, '' when there is none.
728
1105
  */
729
1106
  ownerName(card) {
730
- return this.roles.owner === '' ? '' : this.textOf(readPath(card, this.roles.owner))
1107
+ return this.roles.owner === '' ? '' : this.fieldText(card, this.roles.owner)
731
1108
  },
732
1109
 
733
1110
  /**
@@ -879,6 +1256,7 @@ export default {
879
1256
  const key = this.cardKey(card)
880
1257
  this.openMenuKey = this.openMenuKey === key ? null : key
881
1258
  if (this.openMenuKey !== null) {
1259
+ this.loadAllowed(card)
882
1260
  this.focusMenuItem(card, 0)
883
1261
  }
884
1262
  },
@@ -967,6 +1345,7 @@ export default {
967
1345
  event.preventDefault()
968
1346
  if (!this.isMenuOpen(card)) {
969
1347
  this.openMenuKey = this.cardKey(card)
1348
+ this.loadAllowed(card)
970
1349
  this.focusMenuItem(card, 0)
971
1350
  }
972
1351
  }
@@ -1062,6 +1441,9 @@ export default {
1062
1441
  * @return {string} The count.
1063
1442
  */
1064
1443
  countLabel(column) {
1444
+ if (this.capacityOf(column) !== null) {
1445
+ return this.capacityText(column)
1446
+ }
1065
1447
  return this.paged
1066
1448
  ? t('nextcloud-vue', '{count} on this page', { count: column.count })
1067
1449
  : String(column.count)
@@ -1113,8 +1495,27 @@ export default {
1113
1495
  */
1114
1496
  onDragStart(card, column, event) {
1115
1497
  this.dragging = { card, fromKey: column.key }
1498
+ this.dragAllowed = null
1116
1499
  // Firefox drops a drag that carries no data.
1117
1500
  event?.dataTransfer?.setData?.('text/plain', this.cardKey(card))
1501
+ if (typeof this.allowedMoves === 'function') {
1502
+ this.loadAllowed(card).then((allowed) => {
1503
+ if (this.dragging && this.dragging.card === card) {
1504
+ this.dragAllowed = allowed
1505
+ }
1506
+ })
1507
+ }
1508
+ },
1509
+
1510
+ /**
1511
+ * The drag ended (dropped anywhere, or cancelled): no column stays
1512
+ * greyed. A drop on a column has already run by now.
1513
+ *
1514
+ * @return {void}
1515
+ */
1516
+ onDragEnd() {
1517
+ this.dragging = null
1518
+ this.dragAllowed = null
1118
1519
  },
1119
1520
 
1120
1521
  /**
@@ -1129,6 +1530,14 @@ export default {
1129
1530
  }
1130
1531
  const { card, fromKey } = this.dragging
1131
1532
  this.dragging = null
1533
+ this.dragAllowed = null
1534
+ if (column.key !== fromKey && !this.isMoveAllowed(card, column)) {
1535
+ const name = this.roleText(card, this.roles.title) || this.cardKey(card)
1536
+ this.refusal = this.blockReason(card, column)
1537
+ || t('nextcloud-vue', '{name} cannot move to {column}.', { name, column: column.label })
1538
+ this.$emit('refused', { card, message: this.refusal })
1539
+ return
1540
+ }
1132
1541
  await this.move(card, fromKey, column.key)
1133
1542
  },
1134
1543
 
@@ -1155,6 +1564,13 @@ export default {
1155
1564
  async move(card, fromKey, toKey) {
1156
1565
  this.refusal = ''
1157
1566
 
1567
+ const target = this.board.columns.find((column) => String(column.key) === String(toKey))
1568
+ if (target && String(toKey) !== String(fromKey) && this.isFull(target)) {
1569
+ this.refusal = this.fullRefusal(target)
1570
+ this.$emit('refused', { card, message: this.refusal })
1571
+ return
1572
+ }
1573
+
1158
1574
  const result = await runBoardDrop({
1159
1575
  card,
1160
1576
  fromKey,
@@ -1295,4 +1711,9 @@ export default {
1295
1711
  .cn-board-view__refusal {
1296
1712
  color: var(--color-error);
1297
1713
  }
1714
+
1715
+ .cn-board-view__count--full {
1716
+ color: var(--color-error-text, var(--color-error));
1717
+ font-weight: 600;
1718
+ }
1298
1719
  </style>
@@ -120,6 +120,7 @@ import { translate as t } from '@nextcloud/l10n'
120
120
  import { NcButton, NcDialog, NcLoadingIcon, NcTextField } from '@nextcloud/vue'
121
121
  import ChevronLeft from 'vue-material-design-icons/ChevronLeft.vue'
122
122
  import { buildHeaders, prefixUrl } from '../../utils/index.js'
123
+ import { userLocale } from '../../utils/userLocale.js'
123
124
 
124
125
  /**
125
126
  * CnCalendarEventPicker — 2-step calendar/event picker modal for the
@@ -307,7 +308,7 @@ export default {
307
308
  if (Number.isNaN(d.getTime())) {
308
309
  return String(ev.dtstart)
309
310
  }
310
- return d.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })
311
+ return d.toLocaleString(userLocale(), { dateStyle: 'medium', timeStyle: 'short' })
311
312
  } catch {
312
313
  return String(ev.dtstart)
313
314
  }
@@ -130,6 +130,7 @@
130
130
 
131
131
  <script>
132
132
  import { translate as t } from '@nextcloud/l10n'
133
+ import { userLocale } from '../../utils/userLocale.js'
133
134
 
134
135
  const VIEW_MODES = ['month', 'week', 'agenda']
135
136
  const DEFAULT_DAYS_AHEAD = 14
@@ -604,7 +605,7 @@ export default {
604
605
  * @return {string} the header label.
605
606
  */
606
607
  formatDayHeader(date) {
607
- const month = date.toLocaleString(undefined, { month: 'short' })
608
+ const month = date.toLocaleString(userLocale(), { month: 'short' })
608
609
  return `${this.weekdayHeaders[date.getDay()]} ${date.getDate()} ${month}`
609
610
  },
610
611