@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
@@ -2,13 +2,14 @@ import { translate } from '@nextcloud/l10n';
2
2
  import __sfc_main from '../CnStatusBadge/CnStatusBadge.vue.js';
3
3
  import { normalizeLook } from '../../composables/useLook.js';
4
4
  import { isBadgeVariant } from '../../utils/badgeVariants.js';
5
- import { buildBoardColumns, resolveStageColor } from '../../utils/boardColumns.js';
5
+ import { buildBoardColumns, normalizeAllowed, resolveStageColor } from '../../utils/boardColumns.js';
6
6
  import { buildSwimlanes } from '../../utils/boardSwimlanes.js';
7
7
  import { runBoardDrop, DROP_OUTCOMES } from '../../utils/boardTransition.js';
8
8
  import { dueStateForRow } from '../../utils/dueRule.js';
9
9
  import { formatMetricValue } from '../../utils/formatMetric.js';
10
10
  import { readPath } from '../../utils/readPath.js';
11
11
  import { preventMiddleClickAutoscroll, isRowMiddleClick } from '../../utils/rowAuxClick.js';
12
+ import { userLocale } from '../../utils/userLocale.js';
12
13
  import { daysUntil } from '../../utils/dateVariant.js';
13
14
 
14
15
  /**
@@ -46,6 +47,12 @@ var script = {
46
47
  * draws the screens' board anatomy (screens-kanban-parity).
47
48
  */
48
49
  cnLook: { default: 'nextcloud' },
50
+ /**
51
+ * The app's cell-formatter registry, provided by CnAppRoot. A card
52
+ * role named in `cardRoles.formatters` shows its value through it, as
53
+ * the table's cells do (screens-board-reference-columns).
54
+ */
55
+ cnFormatters: { default: () => ({}) },
49
56
  },
50
57
 
51
58
  props: {
@@ -186,9 +193,78 @@ var script = {
186
193
  type: Number,
187
194
  default: 0,
188
195
  },
196
+
197
+ /**
198
+ * The column a row belongs in, for a status whose raw value is not
199
+ * the column key: a reference whose rows are merged by name
200
+ * (screens-board-reference-columns). Absent, the row's `statusField`
201
+ * value is the key.
202
+ *
203
+ * @type {((row: object) => string)|null}
204
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-columns-can-be-the-rows-a-field-references
205
+ */
206
+ columnKeyOf: {
207
+ type: Function,
208
+ default: null,
209
+ },
210
+
211
+ /**
212
+ * Wrap the columns onto more rows, as many to a row as fit at 240px,
213
+ * instead of one row that scrolls sideways (manifest
214
+ * `config.board.wrap`). For a board with more stages than fit.
215
+ *
216
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-a-wide-board-can-wrap-its-columns
217
+ */
218
+ wrapColumns: {
219
+ type: Boolean,
220
+ default: false,
221
+ },
222
+
223
+ /**
224
+ * Offer a checkbox on every card, so cards can be selected for the
225
+ * list's bulk actions (the same selection the table holds).
226
+ *
227
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-cards-can-be-selected-for-bulk-actions
228
+ */
229
+ selectable: {
230
+ type: Boolean,
231
+ default: false,
232
+ },
233
+
234
+ /**
235
+ * The selected cards, by row key.
236
+ *
237
+ * @type {Array<string|number>}
238
+ */
239
+ selectedIds: {
240
+ type: Array,
241
+ default: () => [],
242
+ },
243
+
244
+ /**
245
+ * The columns one card may move to, asked when its menu opens or its
246
+ * drag starts: `(card) => Promise<Array<string>|null>`, column keys,
247
+ * `null` for every column. A column the card cannot reach is greyed
248
+ * during the drag and marked "not allowed" in the menu, and a drop on
249
+ * it is refused without asking the host. Absent, every column is
250
+ * offered and the host's move decides.
251
+ *
252
+ * An entry may also be `{ key, allowed, reason }`. With `allowed:
253
+ * false` the column is blocked: the menu shows the reason under its
254
+ * name, the column shows it under its header during a drag, and a
255
+ * drop there is refused with it.
256
+ *
257
+ * @type {((card: object) => Promise<Array<string|{key: string, allowed?: boolean, reason?: string}>|null>)|null}
258
+ * @spec openspec/changes/board-move-block-reasons/specs/board-view/spec.md#requirement-a-move-target-can-be-blocked-with-a-reason
259
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-the-board-shows-where-a-card-can-go
260
+ */
261
+ allowedMoves: {
262
+ type: Function,
263
+ default: null,
264
+ },
189
265
  },
190
266
 
191
- emits: ['card-click', 'card-aux-click', 'moved', 'refused', 'stale', 'load-more'],
267
+ emits: ['card-click', 'card-aux-click', 'moved', 'refused', 'stale', 'load-more', 'select'],
192
268
 
193
269
  data() {
194
270
  return {
@@ -204,6 +280,10 @@ var script = {
204
280
  expanded: [],
205
281
  /** The card whose menu is open (board look), by card key. */
206
282
  openMenuKey: null,
283
+ /** Where each card may move (`allowedMoves`), as `{ keys, reasons }` by card key; null = everywhere, absent = not asked yet. */
284
+ allowedByCard: {},
285
+ /** Where the dragged card may move, as `{ keys, reasons }`, or null for everywhere. */
286
+ dragAllowed: null,
207
287
  }
208
288
  },
209
289
 
@@ -221,6 +301,7 @@ var script = {
221
301
  statusField: this.statusField,
222
302
  offBoardLabel: translate('nextcloud-vue', 'Elsewhere'),
223
303
  colorField: this.colorField,
304
+ keyOf: this.columnKeyOf,
224
305
  })
225
306
  },
226
307
 
@@ -248,9 +329,35 @@ var script = {
248
329
  due: (given && given.due) || '',
249
330
  owner: (given && given.owner) || '',
250
331
  pillColors: (given && given.pillColors) || {},
332
+ formatters: (given && given.formatters && typeof given.formatters === 'object') ? given.formatters : {},
251
333
  }
252
334
  },
253
335
 
336
+ /** @return {string} The note on a menu target the card cannot reach. */
337
+ notAllowedLabel() {
338
+ return translate('nextcloud-vue', 'not allowed')
339
+ },
340
+
341
+ /** @return {string} The note on a menu target that is full. */
342
+ fullLabel() {
343
+ return translate('nextcloud-vue', 'full')
344
+ },
345
+
346
+ /**
347
+ * Every column's total over all lanes, by key: what a limit is
348
+ * measured against, since a swimlane holds only part of a column.
349
+ *
350
+ * @return {Map<string, number>} The totals.
351
+ */
352
+ columnTotals() {
353
+ return new Map(this.board.columns.map((column) => [String(column.key), column.count]))
354
+ },
355
+
356
+ /** @return {Array<string>} The selected row keys as strings. */
357
+ selectedKeys() {
358
+ return (Array.isArray(this.selectedIds) ? this.selectedIds : []).map(String)
359
+ },
360
+
254
361
  /** @return {string} The Open in new tab menu item. */
255
362
  openInNewTabLabel() {
256
363
  return translate('nextcloud-vue', 'Open in new tab')
@@ -309,6 +416,206 @@ var script = {
309
416
 
310
417
  preventMiddleClickAutoscroll,
311
418
 
419
+ /**
420
+ * Whether a card is selected.
421
+ *
422
+ * @param {object} card The card.
423
+ * @return {boolean} True when selected.
424
+ */
425
+ isSelected(card) {
426
+ return this.selectedKeys.includes(this.cardKey(card))
427
+ },
428
+
429
+ /**
430
+ * The checkbox's accessible name.
431
+ *
432
+ * @param {object} card The card.
433
+ * @return {string} "Select <name>".
434
+ */
435
+ selectLabel(card) {
436
+ const name = this.roleText(card, this.roles.title) || this.cardKey(card);
437
+ return translate('nextcloud-vue', 'Select {name}', { name })
438
+ },
439
+
440
+ /**
441
+ * Select a card, or unselect it.
442
+ *
443
+ * @param {object} card The card.
444
+ * @return {void}
445
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-cards-can-be-selected-for-bulk-actions
446
+ */
447
+ toggleSelected(card) {
448
+ const key = this.cardKey(card);
449
+ const next = this.isSelected(card)
450
+ ? this.selectedIds.filter((id) => String(id) !== key)
451
+ : [...this.selectedIds, card?.[this.rowKey]];
452
+ /**
453
+ * @event select Emitted when a card's checkbox changes. Payload: the selected row keys.
454
+ */
455
+ this.$emit('select', next);
456
+ },
457
+
458
+ /**
459
+ * Ask the host where one card may go (`allowedMoves`), once per card.
460
+ *
461
+ * @param {object} card The card.
462
+ * @return {Promise<{keys: Array<string>, reasons: object}|null>} Where it may go, or null for everywhere.
463
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-the-board-shows-where-a-card-can-go
464
+ */
465
+ async loadAllowed(card) {
466
+ if (typeof this.allowedMoves !== 'function') {
467
+ return null
468
+ }
469
+ const key = this.cardKey(card);
470
+ if (Object.hasOwn(this.allowedByCard, key)) {
471
+ return this.allowedByCard[key]
472
+ }
473
+ let allowed;
474
+ try {
475
+ allowed = normalizeAllowed(await this.allowedMoves(card));
476
+ } catch {
477
+ // Unknown is not "nowhere": the host's move stays the authority.
478
+ allowed = null;
479
+ }
480
+ this.allowedByCard = { ...this.allowedByCard, [key]: allowed };
481
+ return allowed
482
+ },
483
+
484
+ /**
485
+ * Whether a card may move to a column, as far as the board knows.
486
+ *
487
+ * @param {object} card The card.
488
+ * @param {object} target The column.
489
+ * @return {boolean} False only when the host said it cannot.
490
+ */
491
+ isMoveAllowed(card, target) {
492
+ const allowed = this.allowedByCard[this.cardKey(card)];
493
+ return !allowed || allowed.keys.includes(String(target.key))
494
+ },
495
+
496
+ /**
497
+ * Why the host blocked a card's move to a column, when it said.
498
+ *
499
+ * @param {object} card The card.
500
+ * @param {object} target The column.
501
+ * @return {string} The reason, '' when the move is allowed or no reason was given.
502
+ * @spec openspec/changes/board-move-block-reasons/specs/board-view/spec.md#requirement-a-move-target-can-be-blocked-with-a-reason
503
+ */
504
+ blockReason(card, target) {
505
+ const allowed = this.allowedByCard[this.cardKey(card)];
506
+ if (!allowed || this.isMoveAllowed(card, target)) {
507
+ return ''
508
+ }
509
+ return allowed.reasons[String(target.key)] || ''
510
+ },
511
+
512
+ /**
513
+ * The note beside a menu target the card cannot move to.
514
+ *
515
+ * @param {object} card The card.
516
+ * @param {object} target The column.
517
+ * @return {string} "full" or "not allowed"; '' when a reason is shown instead.
518
+ */
519
+ blockedNote(card, target) {
520
+ if (this.blockReason(card, target) !== '') {
521
+ return ''
522
+ }
523
+ return this.isMoveAllowed(card, target) && this.isFull(target) ? this.fullLabel : this.notAllowedLabel
524
+ },
525
+
526
+ /**
527
+ * Why the dragged card cannot land on a column, shown under its header.
528
+ *
529
+ * @param {object} column The column.
530
+ * @return {string} The host's reason while a drag is on, else ''.
531
+ * @spec openspec/changes/board-move-block-reasons/specs/board-view/spec.md#requirement-a-move-target-can-be-blocked-with-a-reason
532
+ */
533
+ dragReason(column) {
534
+ if (this.dragging === null || !this.dragAllowed || column.key === this.dragging.fromKey) {
535
+ return ''
536
+ }
537
+ const key = String(column.key);
538
+ return this.dragAllowed.keys.includes(key) ? '' : (this.dragAllowed.reasons[key] || '')
539
+ },
540
+
541
+ /**
542
+ * A column's limit.
543
+ *
544
+ * @param {object} column The column.
545
+ * @return {number|null} The limit, or null when it has none.
546
+ * @spec openspec/changes/board-column-capacity/specs/board-view/spec.md#requirement-a-column-can-carry-a-capacity
547
+ */
548
+ capacityOf(column) {
549
+ const capacity = Number(column?.capacity);
550
+ return Number.isFinite(capacity) && capacity > 0 ? capacity : null
551
+ },
552
+
553
+ /**
554
+ * Whether a column holds as many cards as its limit, or more.
555
+ *
556
+ * @param {object} column The column.
557
+ * @return {boolean} True when full; false without a limit.
558
+ * @spec openspec/changes/board-column-capacity/specs/board-view/spec.md#requirement-a-column-can-carry-a-capacity
559
+ */
560
+ isFull(column) {
561
+ const capacity = this.capacityOf(column);
562
+ return capacity !== null && (this.columnTotals.get(String(column.key)) ?? column.count) >= capacity
563
+ },
564
+
565
+ /**
566
+ * "count / capacity" for a column with a limit.
567
+ *
568
+ * @param {object} column The column.
569
+ * @return {string} The text.
570
+ */
571
+ capacityText(column) {
572
+ return translate('nextcloud-vue', '{count} / {capacity}', {
573
+ count: this.columnTotals.get(String(column.key)) ?? column.count,
574
+ capacity: this.capacityOf(column),
575
+ })
576
+ },
577
+
578
+ /**
579
+ * Whether a card may move to a column: the host allows it and the
580
+ * column is not full.
581
+ *
582
+ * @param {object} card The card.
583
+ * @param {object} target The column.
584
+ * @return {boolean} True when the move may be asked for.
585
+ * @spec openspec/changes/board-column-capacity/specs/board-view/spec.md#requirement-a-drop-into-a-full-column-is-refused
586
+ */
587
+ canMoveTo(card, target) {
588
+ return this.isMoveAllowed(card, target) && !this.isFull(target)
589
+ },
590
+
591
+ /**
592
+ * The sentence a drop into a full column is refused with.
593
+ *
594
+ * @param {object} column The column.
595
+ * @return {string} The sentence.
596
+ */
597
+ fullRefusal(column) {
598
+ return translate('nextcloud-vue', '{column} is full: {count} of {capacity}.', {
599
+ column: column.label,
600
+ count: this.columnTotals.get(String(column.key)) ?? column.count,
601
+ capacity: this.capacityOf(column),
602
+ })
603
+ },
604
+
605
+ /**
606
+ * Whether a column is out of reach for the card being dragged.
607
+ *
608
+ * @param {object} column The column.
609
+ * @return {boolean} True while a drag is on and the card cannot go there.
610
+ */
611
+ isUnreachable(column) {
612
+ if (this.dragging === null || column.key === this.dragging.fromKey) {
613
+ return false
614
+ }
615
+ return this.isFull(column)
616
+ || (this.dragAllowed !== null && !this.dragAllowed.keys.includes(String(column.key)))
617
+ },
618
+
312
619
  /**
313
620
  * A card's due state under `dueRule`.
314
621
  *
@@ -350,11 +657,35 @@ var script = {
350
657
  const fields = Array.isArray(role) ? role : [role];
351
658
  return fields
352
659
  .filter((field) => typeof field === 'string' && field !== '')
353
- .map((field) => this.textOf(readPath(card, field)))
660
+ .map((field) => this.fieldText(card, field))
354
661
  .filter((value) => value !== '')
355
662
  .join(' \u00b7 ')
356
663
  },
357
664
 
665
+ /**
666
+ * One card field as text: through the formatter `cardRoles.formatters`
667
+ * names for it, else the value itself.
668
+ *
669
+ * @param {object} card The card's row.
670
+ * @param {string} field The dot-path.
671
+ * @return {string} The text.
672
+ * @spec openspec/changes/screens-board-reference-columns/specs/board-view/spec.md#requirement-a-card-field-can-show-through-a-formatter
673
+ */
674
+ fieldText(card, field) {
675
+ const raw = readPath(card, field);
676
+ const id = this.roles.formatters[field];
677
+ const fn = id && this.cnFormatters ? this.cnFormatters[id] : null;
678
+ if (typeof fn === 'function') {
679
+ try {
680
+ const out = fn(raw, card, null);
681
+ return out === null || out === undefined ? '' : String(out).trim()
682
+ } catch {
683
+ return this.textOf(raw)
684
+ }
685
+ }
686
+ return this.textOf(raw)
687
+ },
688
+
358
689
  /**
359
690
  * A value as text: a string or number as is, an object by its label.
360
691
  *
@@ -379,7 +710,7 @@ var script = {
379
710
  * @return {string} A CnStatusBadge variant.
380
711
  */
381
712
  pillVariant(card) {
382
- const raw = this.textOf(readPath(card, this.roles.pill));
713
+ const raw = this.fieldText(card, this.roles.pill);
383
714
  const variant = this.roles.pillColors[raw] ?? this.roles.pillColors[raw.toLowerCase()];
384
715
  return isBadgeVariant(variant) ? variant : 'default'
385
716
  },
@@ -406,7 +737,7 @@ var script = {
406
737
  const date = new Date(value);
407
738
  const shown = Number.isNaN(date.getTime())
408
739
  ? String(value)
409
- : date.toLocaleDateString(undefined, { day: 'numeric', month: 'short' });
740
+ : date.toLocaleDateString(userLocale(), { day: 'numeric', month: 'short' });
410
741
  return days < 0
411
742
  ? translate('nextcloud-vue', 'Overdue {date}', { date: shown })
412
743
  : translate('nextcloud-vue', 'Due {date}', { date: shown })
@@ -419,7 +750,7 @@ var script = {
419
750
  * @return {string} The name, '' when there is none.
420
751
  */
421
752
  ownerName(card) {
422
- return this.roles.owner === '' ? '' : this.textOf(readPath(card, this.roles.owner))
753
+ return this.roles.owner === '' ? '' : this.fieldText(card, this.roles.owner)
423
754
  },
424
755
 
425
756
  /**
@@ -571,6 +902,7 @@ var script = {
571
902
  const key = this.cardKey(card);
572
903
  this.openMenuKey = this.openMenuKey === key ? null : key;
573
904
  if (this.openMenuKey !== null) {
905
+ this.loadAllowed(card);
574
906
  this.focusMenuItem(card, 0);
575
907
  }
576
908
  },
@@ -659,6 +991,7 @@ var script = {
659
991
  event.preventDefault();
660
992
  if (!this.isMenuOpen(card)) {
661
993
  this.openMenuKey = this.cardKey(card);
994
+ this.loadAllowed(card);
662
995
  this.focusMenuItem(card, 0);
663
996
  }
664
997
  }
@@ -754,6 +1087,9 @@ var script = {
754
1087
  * @return {string} The count.
755
1088
  */
756
1089
  countLabel(column) {
1090
+ if (this.capacityOf(column) !== null) {
1091
+ return this.capacityText(column)
1092
+ }
757
1093
  return this.paged
758
1094
  ? translate('nextcloud-vue', '{count} on this page', { count: column.count })
759
1095
  : String(column.count)
@@ -805,8 +1141,27 @@ var script = {
805
1141
  */
806
1142
  onDragStart(card, column, event) {
807
1143
  this.dragging = { card, fromKey: column.key };
1144
+ this.dragAllowed = null;
808
1145
  // Firefox drops a drag that carries no data.
809
1146
  event?.dataTransfer?.setData?.('text/plain', this.cardKey(card));
1147
+ if (typeof this.allowedMoves === 'function') {
1148
+ this.loadAllowed(card).then((allowed) => {
1149
+ if (this.dragging && this.dragging.card === card) {
1150
+ this.dragAllowed = allowed;
1151
+ }
1152
+ });
1153
+ }
1154
+ },
1155
+
1156
+ /**
1157
+ * The drag ended (dropped anywhere, or cancelled): no column stays
1158
+ * greyed. A drop on a column has already run by now.
1159
+ *
1160
+ * @return {void}
1161
+ */
1162
+ onDragEnd() {
1163
+ this.dragging = null;
1164
+ this.dragAllowed = null;
810
1165
  },
811
1166
 
812
1167
  /**
@@ -821,6 +1176,14 @@ var script = {
821
1176
  }
822
1177
  const { card, fromKey } = this.dragging;
823
1178
  this.dragging = null;
1179
+ this.dragAllowed = null;
1180
+ if (column.key !== fromKey && !this.isMoveAllowed(card, column)) {
1181
+ const name = this.roleText(card, this.roles.title) || this.cardKey(card);
1182
+ this.refusal = this.blockReason(card, column)
1183
+ || translate('nextcloud-vue', '{name} cannot move to {column}.', { name, column: column.label });
1184
+ this.$emit('refused', { card, message: this.refusal });
1185
+ return
1186
+ }
824
1187
  await this.move(card, fromKey, column.key);
825
1188
  },
826
1189
 
@@ -847,6 +1210,13 @@ var script = {
847
1210
  async move(card, fromKey, toKey) {
848
1211
  this.refusal = '';
849
1212
 
1213
+ const target = this.board.columns.find((column) => String(column.key) === String(toKey));
1214
+ if (target && String(toKey) !== String(fromKey) && this.isFull(target)) {
1215
+ this.refusal = this.fullRefusal(target);
1216
+ this.$emit('refused', { card, message: this.refusal });
1217
+ return
1218
+ }
1219
+
850
1220
  const result = await runBoardDrop({
851
1221
  card,
852
1222
  fromKey,