@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
@@ -4,7 +4,8 @@
4
4
  :description="description"
5
5
  :docUrl="docUrl"
6
6
  :loading="loading"
7
- loadingMessage="Loading version information...">
7
+ :wide="isBoard && wide"
8
+ :loadingMessage="t('nextcloud-vue', 'Loading version information…')">
8
9
  <!-- Actions slot (top right). Under the board look the same buttons sit
9
10
  in the footer row of the card instead. -->
10
11
  <template v-if="!isBoard" #actions>
@@ -34,19 +35,19 @@
34
35
  <div class="cn-version-info__details">
35
36
  <!-- Application Name -->
36
37
  <div class="cn-version-info__item">
37
- <span class="cn-version-info__label">{{ labels.appName }}:</span>
38
+ <span class="cn-version-info__label">{{ fieldLabels.appName }}:</span>
38
39
  <span class="cn-version-info__value">{{ appName }}</span>
39
40
  </div>
40
41
 
41
42
  <!-- Version -->
42
43
  <div class="cn-version-info__item">
43
- <span class="cn-version-info__label">{{ labels.version }}:</span>
44
+ <span class="cn-version-info__label">{{ fieldLabels.version }}:</span>
44
45
  <span class="cn-version-info__value">{{ appVersion }}</span>
45
46
  </div>
46
47
 
47
48
  <!-- Configured Version (if provided) -->
48
49
  <div v-if="configuredVersion" class="cn-version-info__item">
49
- <span class="cn-version-info__label">{{ labels.configuredVersion }}:</span>
50
+ <span class="cn-version-info__label">{{ fieldLabels.configuredVersion }}:</span>
50
51
  <span class="cn-version-info__value">{{ configuredVersion }}</span>
51
52
  </div>
52
53
 
@@ -157,6 +158,18 @@ export default {
157
158
  default: '',
158
159
  },
159
160
 
161
+ /**
162
+ * Under the board look the card spans the whole settings grid, as the
163
+ * boards draw the version card. Set to `false` to keep it one card in
164
+ * the grid. Without the board look it has no effect.
165
+ *
166
+ * @spec openspec/changes/board-version-card-full-width/specs/settings-board-look/spec.md#requirement-the-board-version-card-spans-the-settings-grid
167
+ */
168
+ wide: {
169
+ type: Boolean,
170
+ default: true,
171
+ },
172
+
160
173
  /** Section title */
161
174
  title: {
162
175
  type: String,
@@ -232,14 +245,13 @@ export default {
232
245
  default: false,
233
246
  },
234
247
 
235
- /** Custom labels for the standard fields */
248
+ /**
249
+ * Custom labels for the standard fields, `{ appName?, version?, configuredVersion? }`.
250
+ * A label left out keeps the translated default.
251
+ */
236
252
  labels: {
237
253
  type: Object,
238
- default: () => ({
239
- appName: 'Application Name',
240
- version: 'Version',
241
- configuredVersion: 'Configured Version',
242
- }),
254
+ default: () => ({}),
243
255
  },
244
256
  },
245
257
 
@@ -251,6 +263,21 @@ export default {
251
263
  },
252
264
 
253
265
  computed: {
266
+ /**
267
+ * The field labels: the app's, else the library's in the reader's language.
268
+ *
269
+ * @return {{appName: string, version: string, configuredVersion: string}}
270
+ * @spec openspec/changes/version-card-dutch-and-header/specs/settings-board-look/spec.md#requirement-the-admin-chrome-reads-in-the-readers-language
271
+ */
272
+ fieldLabels() {
273
+ return {
274
+ appName: t('nextcloud-vue', 'Application name'),
275
+ version: t('nextcloud-vue', 'Version'),
276
+ configuredVersion: t('nextcloud-vue', 'Configured version'),
277
+ ...(this.labels || {}),
278
+ }
279
+ },
280
+
254
281
  /** @return {string} Button type based on update status */
255
282
  updateButtonType() {
256
283
  if (this.isUpToDate) {
@@ -267,16 +294,18 @@ export default {
267
294
  /** @return {string} Update button label text */
268
295
  updateButtonText() {
269
296
  if (this.updating) {
270
- return 'Updating...'
297
+ return t('nextcloud-vue', 'Updating…')
271
298
  }
272
299
  if (this.isUpToDate) {
273
- return 'Up to date'
300
+ return t('nextcloud-vue', 'Up to date')
274
301
  }
275
- return 'Update'
302
+ return t('nextcloud-vue', 'Update')
276
303
  },
277
304
  },
278
305
 
279
306
  methods: {
307
+ t,
308
+
280
309
  handleUpdateClick() {
281
310
  if (!this.updateButtonDisabled) {
282
311
  this.$emit('update')
@@ -14,10 +14,11 @@
14
14
  :title="title"
15
15
  :widgetId="widgetId"
16
16
  :documentationUrl="documentationUrl"
17
+ :refreshing="epLoading"
17
18
  flush>
18
19
  <div class="cn-widget-card-grid">
19
20
  <CnObjectCard
20
- v-for="(item, index) in objects"
21
+ v-for="(item, index) in cards"
21
22
  :key="item.id || index"
22
23
  :object="item" />
23
24
  </div>
@@ -26,7 +27,10 @@
26
27
 
27
28
  <script>
28
29
  import { translate as t } from '@nextcloud/l10n'
30
+ import { inject, ref } from 'vue'
29
31
  import CnObjectCard from '../CnObjectCard/CnObjectCard.vue'
32
+ import { useEndpointSource } from '../../composables/useEndpointSource.js'
33
+ import { resolveObjectTokenContext } from '../../utils/detailObjectContext.js'
30
34
  import { CnWidgetWrapper } from '../CnWidgetWrapper/index.js'
31
35
 
32
36
  /**
@@ -35,7 +39,9 @@ import { CnWidgetWrapper } from '../CnWidgetWrapper/index.js'
35
39
  * Renders the card grid on the shared CnWidgetWrapper chrome, which supplies
36
40
  * the widget title and the standard overflow Actions menu (Refresh /
37
41
  * Documentation / Request a feature). Each entry in `objects` is rendered as a
38
- * CnObjectCard.
42
+ * CnObjectCard. Without `objects`, an `endpointSource` (`{ url, method?,
43
+ * params?, responsePath? }`, as on the object table) supplies them: the
44
+ * payload after `responsePath` is the array of objects.
39
45
  */
40
46
  export default {
41
47
  name: 'CnWidgetCardGrid',
@@ -75,6 +81,53 @@ export default {
75
81
  type: Array,
76
82
  default: () => [],
77
83
  },
84
+
85
+ /**
86
+ * Read the objects from an app endpoint: `{ url, method?, params?,
87
+ * responsePath? }`, with the token grammar of widget filters. Ignored
88
+ * while `objects` holds any.
89
+ *
90
+ * @type {object|null}
91
+ */
92
+ endpointSource: {
93
+ type: Object,
94
+ default: null,
95
+ },
96
+ },
97
+
98
+ setup(props) {
99
+ const objectCtxRaw = inject('cnObjectContext', null)
100
+ const detailCtxRaw = inject('cnDetailObjectContext', null)
101
+ const workspaceRaw = inject('cnWorkspaceContext', ref(null))
102
+ const appConfigRaw = inject('cnAppConfig', ref({}))
103
+ const unwrap = (v) => ((v && typeof v === 'object' && 'value' in v) ? v.value : v)
104
+ const { data, loading } = useEndpointSource(
105
+ () => ((props.objects && props.objects.length > 0) ? null : props.endpointSource),
106
+ {
107
+ ctx: () => ({
108
+ ...(resolveObjectTokenContext(objectCtxRaw, detailCtxRaw) || {}),
109
+ workspace: unwrap(workspaceRaw) || {},
110
+ config: unwrap(appConfigRaw) || {},
111
+ }),
112
+ widgetId: () => props.widgetId,
113
+ },
114
+ )
115
+ return { epData: data, epLoading: loading }
116
+ },
117
+
118
+ computed: {
119
+ /**
120
+ * The objects drawn: `objects` when given, else the endpoint's array.
121
+ *
122
+ * @return {Array<object>}
123
+ * @spec openspec/changes/endpoint-source-card-grid-record-list/specs/dashboard-page/spec.md#requirement-a-record-list-and-a-card-grid-can-read-an-endpoint
124
+ */
125
+ cards() {
126
+ if (this.objects && this.objects.length > 0) {
127
+ return this.objects
128
+ }
129
+ return Array.isArray(this.epData) ? this.epData : []
130
+ },
78
131
  },
79
132
  }
80
133
  </script>
@@ -88,6 +88,7 @@ import { dispatchAction, resolveObjectOpType } from '../../utils/actionsDispatch
88
88
  import { resolveObjectTokenContext } from '../../utils/detailObjectContext.js'
89
89
  import { pageFilter, pageSort } from '../../utils/pageControls.js'
90
90
  import { dropOptionalUnresolved, hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'
91
+ import { fieldsFromSchema } from '../../utils/schema.js'
91
92
  import { compareVisibleWhen, readVisibleWhenPath } from '../../utils/visibleWhen.js'
92
93
  import { CnIcon } from '../CnIcon/index.js'
93
94
  import { CnRowActions } from '../CnRowActions/index.js'
@@ -231,6 +232,12 @@ export default {
231
232
  * the object form (`{ key, label, sortable, width, cellClass,
232
233
  * formatter, widget, format, aggregate }`) both pass straight through.
233
234
  *
235
+ * A column that holds a reference shows the referenced object's label
236
+ * with `labelField` (the property to show) and/or `resolve`
237
+ * (`{ register, schema, labelField? }`, where the reference points).
238
+ * Without `resolve` the target is read off the source schema's `$ref`
239
+ * for that property. Such a column renders as an `fkResolve` cell.
240
+ *
234
241
  * @type {Array<object|string>}
235
242
  */
236
243
  columns: {
@@ -469,6 +476,8 @@ export default {
469
476
  confirmAction: null,
470
477
  /** @type {object|null} The row the pending confirm-gated action targets. */
471
478
  confirmRow: null,
479
+ /** Where each label column's references point, read off the source schema, by column key. */
480
+ refTargets: {},
472
481
  }
473
482
  },
474
483
 
@@ -638,6 +647,57 @@ export default {
638
647
  return params
639
648
  },
640
649
 
650
+ /**
651
+ * Columns that ask for the label of the object they reference
652
+ * (`labelField` or `resolve`) and draw no cell widget of their own.
653
+ *
654
+ * @return {Array<object>}
655
+ * @spec openspec/changes/dashboard-table-reference-labels/specs/dashboard-page/spec.md#requirement-a-dashboard-table-shows-a-referenced-objects-label
656
+ */
657
+ refLabelColumns() {
658
+ return (this.columns || []).filter((col) => col && typeof col === 'object' && !col.widget
659
+ && ((typeof col.labelField === 'string' && col.labelField !== '') || (col.resolve && typeof col.resolve === 'object')))
660
+ },
661
+
662
+ /**
663
+ * The columns handed to CnDataTable: a label column whose target is
664
+ * known renders as an `fkResolve` cell; every other column as given.
665
+ *
666
+ * @return {Array<object|string>}
667
+ * @spec openspec/changes/dashboard-table-reference-labels/specs/dashboard-page/spec.md#requirement-a-dashboard-table-shows-a-referenced-objects-label
668
+ */
669
+ renderedColumns() {
670
+ if (this.refLabelColumns.length === 0) {
671
+ return this.columns
672
+ }
673
+ return this.columns.map((col) => {
674
+ if (!this.refLabelColumns.includes(col)) {
675
+ return col
676
+ }
677
+ const target = this.refTargetOf(col)
678
+ if (!target) {
679
+ return col
680
+ }
681
+ const labelField = (col.resolve && typeof col.resolve.labelField === 'string' && col.resolve.labelField) || col.labelField || 'name'
682
+ return { ...col, widget: 'fkResolve', widgetProps: { ...(col.widgetProps || {}), register: target.register, schema: target.schema, labelField } }
683
+ })
684
+ },
685
+
686
+ /**
687
+ * The label columns whose target has to be read off the source schema.
688
+ *
689
+ * @return {string[]} Their keys.
690
+ */
691
+ schemaRefKeys() {
692
+ return this.refLabelColumns.filter((col) => !this.explicitTarget(col)).map((col) => col.key)
693
+ },
694
+
695
+ /** @return {string} The label columns to look up and the source schema, to read again when either changes. */
696
+ refTargetsKey() {
697
+ const src = this.source || {}
698
+ return `${src.register || ''}/${src.schema || ''}:${this.schemaRefKeys.join('|')}`
699
+ },
700
+
641
701
  /**
642
702
  * `$props` minus the chrome props (`title`, `documentationUrl`,
643
703
  * `widgetId`, `hideWrapper`) and the widget-only props (`source`,
@@ -669,6 +729,9 @@ export default {
669
729
  if (this.compiledRowClass) {
670
730
  inner.rowClass = this.compiledRowClass
671
731
  }
732
+ if (this.refLabelColumns.length > 0) {
733
+ inner.columns = this.renderedColumns
734
+ }
672
735
  if (this.selfFetchActive) {
673
736
  inner.register = this.source.register
674
737
  inner.schemaId = this.source.schema
@@ -804,6 +867,16 @@ export default {
804
867
  },
805
868
  },
806
869
 
870
+ watch: {
871
+ refTargetsKey() {
872
+ this.loadRefTargets()
873
+ },
874
+ },
875
+
876
+ mounted() {
877
+ this.loadRefTargets()
878
+ },
879
+
807
880
  methods: {
808
881
  /**
809
882
  * Entry point for every declarative action trigger (row menu or
@@ -914,6 +987,68 @@ export default {
914
987
  }
915
988
  },
916
989
 
990
+ /**
991
+ * Where a label column's references point when the column says so
992
+ * itself (`resolve.register` and `resolve.schema`).
993
+ *
994
+ * @param {object} col The column.
995
+ * @return {{register: string, schema: string}|null}
996
+ */
997
+ explicitTarget(col) {
998
+ const r = col && col.resolve
999
+ if (r && typeof r === 'object' && typeof r.register === 'string' && r.register !== '' && typeof r.schema === 'string' && r.schema !== '') {
1000
+ return { register: r.register, schema: r.schema }
1001
+ }
1002
+ return null
1003
+ },
1004
+
1005
+ /**
1006
+ * Where a label column's references point: the column's `resolve`, else
1007
+ * the source schema's `$ref` for the property, else null (the column
1008
+ * then shows the raw value).
1009
+ *
1010
+ * @param {object} col The column.
1011
+ * @return {{register: string, schema: string}|null}
1012
+ */
1013
+ refTargetOf(col) {
1014
+ return this.explicitTarget(col) || this.refTargets[col.key] || null
1015
+ },
1016
+
1017
+ /**
1018
+ * Read the source schema once and note, for each label column without a
1019
+ * `resolve`, the register and schema its property's `$ref` names. A
1020
+ * failed or missing schema leaves those columns showing raw values.
1021
+ *
1022
+ * @return {Promise<void>}
1023
+ * @spec openspec/changes/dashboard-table-reference-labels/specs/dashboard-page/spec.md#requirement-a-dashboard-table-shows-a-referenced-objects-label
1024
+ */
1025
+ async loadRefTargets() {
1026
+ const keys = this.schemaRefKeys
1027
+ const src = this.source
1028
+ if (keys.length === 0 || !src || typeof src.register !== 'string' || src.register === '' || src.register.startsWith('@') || typeof src.schema !== 'string' || src.schema === '') {
1029
+ return
1030
+ }
1031
+ const store = this.getObjectStore()
1032
+ if (!store || typeof store.fetchSchema !== 'function') {
1033
+ return
1034
+ }
1035
+ const type = resolveObjectOpType(store, { register: src.register, schema: src.schema }, { exactSchema: true })
1036
+ const schema = await store.fetchSchema(type).catch(() => null)
1037
+ if (!schema || typeof schema !== 'object') {
1038
+ return
1039
+ }
1040
+ const fields = fieldsFromSchema(schema, { includeReadOnly: true })
1041
+ const found = {}
1042
+ for (const key of keys) {
1043
+ const field = fields.find((f) => f.key === key)
1044
+ const ref = field && field.reference
1045
+ if (ref && ref.schema !== undefined && ref.schema !== null) {
1046
+ found[key] = { register: ref.register || src.register, schema: String(ref.schema) }
1047
+ }
1048
+ }
1049
+ this.refTargets = { ...this.refTargets, ...found }
1050
+ },
1051
+
917
1052
  /**
918
1053
  * The shared object store instance, or null when no Pinia is active
919
1054
  * (`dispatchAction` then warns and no-ops).
@@ -12,6 +12,16 @@ Basic — widget card with title and content:
12
12
  </div>
13
13
  ```
14
14
 
15
+ With an `eyebrow`, a short muted line above the title:
16
+
17
+ ```vue
18
+ <div style="width: 320px; height: 160px; position: relative; border: 1px solid var(--color-border); border-radius: 8px; overflow: hidden;">
19
+ <CnWidgetWrapper title="Forecast 13 weeks" eyebrow="Balance per week" :show-title="true">
20
+ <p style="margin: 0; padding: 0 16px;">Week 41</p>
21
+ </CnWidgetWrapper>
22
+ </div>
23
+ ```
24
+
15
25
  With footer buttons:
16
26
 
17
27
  ```vue
@@ -52,7 +52,15 @@
52
52
  v-else-if="iconClass"
53
53
  :class="iconClass"
54
54
  class="cn-widget-wrapper__icon" />
55
- <h3 :id="titleId" class="cn-widget-wrapper__title">
55
+ <!-- An eyebrow (`eyebrow`) is a muted line above the title:
56
+ "Saldo per week" above "Prognose 13 weken". -->
57
+ <div v-if="resolvedEyebrow" class="cn-widget-wrapper__title-stack">
58
+ <span class="cn-widget-wrapper__eyebrow" data-testid="cn-widget-wrapper-eyebrow">{{ resolvedEyebrow }}</span>
59
+ <h3 :id="titleId" class="cn-widget-wrapper__title">
60
+ {{ resolvedTitle }}
61
+ </h3>
62
+ </div>
63
+ <h3 v-else :id="titleId" class="cn-widget-wrapper__title">
56
64
  {{ resolvedTitle }}
57
65
  </h3>
58
66
  <!-- @slot title-meta Rendered inside the header's left group,
@@ -234,6 +242,15 @@ export default {
234
242
  default: () => t('nextcloud-vue', 'Widget'),
235
243
  },
236
244
 
245
+ /**
246
+ * A short muted line above the title ("Saldo per week" above
247
+ * "Prognose 13 weken"), through the host translate. Empty draws none.
248
+ */
249
+ eyebrow: {
250
+ type: String,
251
+ default: '',
252
+ },
253
+
237
254
  /** Whether to show the header with title */
238
255
  showTitle: {
239
256
  type: Boolean,
@@ -717,6 +734,16 @@ export default {
717
734
  return label ? this.effectiveTranslate(label) : ''
718
735
  },
719
736
 
737
+ /**
738
+ * The eyebrow through the host translate, or ''.
739
+ *
740
+ * @return {string}
741
+ * @spec openspec/changes/widget-title-eyebrow/specs/dashboard-page/spec.md#requirement-a-widget-card-can-carry-a-line-above-its-title
742
+ */
743
+ resolvedEyebrow() {
744
+ return this.eyebrow ? this.effectiveTranslate(this.eyebrow) : ''
745
+ },
746
+
720
747
  /**
721
748
  * The RENDERED widget title — `displayTitle` run through the host
722
749
  * translate function. Kept separate from `displayTitle` on purpose:
@@ -1152,6 +1179,22 @@ export default {
1152
1179
  color: var(--cn-widget-icon-color, var(--color-primary-element));
1153
1180
  }
1154
1181
 
1182
+ .cn-widget-wrapper__title-stack {
1183
+ display: flex;
1184
+ flex-direction: column;
1185
+ gap: 2px;
1186
+ min-width: 0;
1187
+ }
1188
+
1189
+ .cn-widget-wrapper__eyebrow {
1190
+ font-size: 13px;
1191
+ line-height: 1.3;
1192
+ color: var(--color-text-maxcontrast);
1193
+ white-space: nowrap;
1194
+ overflow: hidden;
1195
+ text-overflow: ellipsis;
1196
+ }
1197
+
1155
1198
  .cn-widget-wrapper__title {
1156
1199
  font-weight: 600;
1157
1200
  font-size: 14px;
@@ -291,6 +291,26 @@ export function useListView(objectTypeOrOptions, options) {
291
291
  refresh(page)
292
292
  }
293
293
 
294
+ /**
295
+ * Add the next page after the rows already loaded, for a view that shows
296
+ * every row at once (the board). Does nothing on the last page. A refresh
297
+ * started while the page is in flight drops it.
298
+ *
299
+ * @return {Promise<void>}
300
+ */
301
+ async function loadMore() {
302
+ const current = pagination.value
303
+ const next = Number(current.page || 1) + 1
304
+ if (next > Number(current.pages || 1)) {
305
+ return
306
+ }
307
+ const seq = refreshSeq
308
+ await objectStore.fetchCollection(getType(), buildParams(next), {
309
+ append: true,
310
+ isCurrent: () => seq === refreshSeq,
311
+ })
312
+ }
313
+
294
314
  /**
295
315
  * Handle page-size change. Resets to page 1.
296
316
  *
@@ -402,6 +422,7 @@ export function useListView(objectTypeOrOptions, options) {
402
422
  onPageSizeChange,
403
423
  // Explicit fetch
404
424
  refresh,
425
+ loadMore,
405
426
  // The query the list sends (search, sort, facet filters, fixed filters),
406
427
  // built from the current state, for an export that must follow the list.
407
428
  buildParams,
package/src/css/board.css CHANGED
@@ -61,6 +61,12 @@
61
61
  font-weight: 400;
62
62
  }
63
63
 
64
+ /* A column at its limit: the count in the error colour; "full" is said in words too. */
65
+ .cn-board-view.cn-board-view--board .cn-board-view__badge.cn-board-view__badge--full {
66
+ color: var(--color-error-text, var(--color-error));
67
+ font-weight: 600;
68
+ }
69
+
64
70
  .cn-board-view.cn-board-view--board .cn-board-view__sum {
65
71
  font-size: 13px;
66
72
  color: var(--color-text-maxcontrast);
@@ -96,19 +102,24 @@
96
102
  gap: 8px;
97
103
  }
98
104
 
99
- .cn-board-view.cn-board-view--board .cn-board-view__card-title {
105
+ /* The title is a link drawn as a heading (board DqWerkbord): main text, no
106
+ underline. `!important` because a theme's `a { color; text-decoration }`
107
+ carries it (thematiq), and a bare `a` with `!important` beats any class. */
108
+ .cn-board-view.cn-board-view--board .cn-board-view__card-title,
109
+ .cn-board-view.cn-board-view--board .cn-board-view__card-title:visited {
100
110
  flex: 1 1 auto;
101
111
  min-width: 0;
102
112
  font-size: 15px;
103
113
  font-weight: 700;
104
114
  line-height: 1.3;
105
- color: var(--color-main-text);
106
- text-decoration: none;
115
+ color: var(--color-main-text) !important;
116
+ text-decoration: none !important;
107
117
  overflow-wrap: anywhere;
108
118
  }
109
119
 
110
120
  .cn-board-view.cn-board-view--board .cn-board-view__card-title:hover {
111
- text-decoration: underline;
121
+ color: var(--color-main-text) !important;
122
+ text-decoration: underline !important;
112
123
  }
113
124
 
114
125
  .cn-board-view.cn-board-view--board .cn-board-view__card-title:focus-visible {
@@ -267,3 +278,93 @@
267
278
  outline: 2px solid var(--color-primary-element);
268
279
  outline-offset: 2px;
269
280
  }
281
+
282
+ /*
283
+ * screens-board-reference-columns: a wide board wraps its columns onto more
284
+ * rows (`config.board.wrap`), as many to a row as fit at 240px, instead of
285
+ * one row that scrolls sideways.
286
+ */
287
+ .cn-board-view.cn-board-view--wrap .cn-board-view__columns {
288
+ display: grid;
289
+ grid-auto-flow: row;
290
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
291
+ overflow-x: visible;
292
+ }
293
+
294
+ .cn-board-view.cn-board-view--wrap:not(.cn-board-view--board) .cn-board-view__columns {
295
+ gap: 12px;
296
+ }
297
+
298
+ /* A column the dragged card cannot reach fades; the label stays readable. */
299
+ .cn-board-view .cn-board-view__column--unreachable {
300
+ opacity: 0.45;
301
+ }
302
+
303
+ /* The selection checkbox: in the board look's card head, before the title. */
304
+ .cn-board-view .cn-board-view__select {
305
+ flex: none;
306
+ width: 16px;
307
+ height: 16px;
308
+ margin: 2px 0 0;
309
+ accent-color: var(--color-primary-element);
310
+ cursor: pointer;
311
+ }
312
+
313
+ /* Board look: the board draws no checkbox. It shows on a hovered card, on a
314
+ card holding focus (so Tab still reaches it), once anything is selected, and
315
+ always where there is no hover. Collapsed rather than hidden, so it stays in
316
+ the tab order. */
317
+ @media (hover: hover) {
318
+ .cn-board-view.cn-board-view--board:not(.cn-board-view--selecting) .cn-board-view__card:not(:hover, :focus-within) .cn-board-view__select {
319
+ width: 0;
320
+ margin-inline-end: -8px;
321
+ opacity: 0;
322
+ }
323
+ }
324
+
325
+ /* A menu target the card cannot reach: still listed, greyed, with its note. */
326
+ .cn-board-view.cn-board-view--board .cn-board-view__menu-item.cn-board-view__menu-item--blocked {
327
+ color: var(--color-text-maxcontrast);
328
+ cursor: not-allowed;
329
+ }
330
+
331
+ .cn-board-view .cn-board-view__menu-note {
332
+ margin-inline-start: auto;
333
+ padding-inline-start: 12px;
334
+ font-size: 12px;
335
+ color: var(--color-text-maxcontrast);
336
+ }
337
+
338
+ /* A blocked target with the host's reason: the reason on its own line under the name. */
339
+ .cn-board-view.cn-board-view--board .cn-board-view__menu-item.cn-board-view__menu-item--reason {
340
+ flex-wrap: wrap;
341
+ max-width: 320px;
342
+ padding-block: 6px;
343
+ }
344
+
345
+ .cn-board-view .cn-board-view__menu-reason {
346
+ flex-basis: 100%;
347
+ font-size: 12px;
348
+ line-height: 1.4;
349
+ color: var(--color-text-maxcontrast);
350
+ }
351
+
352
+ /* While a card is dragged: why it cannot land in this column, under the header.
353
+ The rest of the column fades; the reason stays at full contrast. */
354
+ .cn-board-view .cn-board-view__column-reason {
355
+ margin: 0 0 8px;
356
+ padding: 6px 8px;
357
+ border-radius: var(--border-radius);
358
+ background-color: var(--color-main-background);
359
+ font-size: 12px;
360
+ line-height: 1.4;
361
+ color: var(--color-main-text);
362
+ }
363
+
364
+ .cn-board-view .cn-board-view__column--unreachable.cn-board-view__column--reason {
365
+ opacity: 1;
366
+ }
367
+
368
+ .cn-board-view .cn-board-view__column--reason > :not(.cn-board-view__column-reason) {
369
+ opacity: 0.45;
370
+ }
@@ -35,8 +35,10 @@
35
35
  }
36
36
 
37
37
  /* The header is ours: NcModal's own close button and NcDialog's heading give
38
- way (the heading stays as the accessible name, visually hidden). */
39
- .cn-dialog-board .modal-container__close {
38
+ way (the heading stays as the accessible name, visually hidden). The mask
39
+ class raises the rule above NcButton's `.button-vue[data-v-…]`, whose
40
+ stylesheet a spawned dialog can load after this one. */
41
+ .modal-mask.cn-dialog-board .modal-container__close {
40
42
  display: none;
41
43
  }
42
44