@conduction/nextcloud-vue 2.104.0 → 2.106.0

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 (224) hide show
  1. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  2. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  5. package/dist/esm/components/CnCardGrid/CnCardGrid.vue.js +1 -1
  6. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +18 -0
  7. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  8. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js +3 -1
  9. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  10. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  11. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +18 -0
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  13. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +1 -1
  14. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  15. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  16. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +93 -1
  17. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  18. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  20. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +6 -3
  21. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  22. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +3 -3
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +112 -5
  25. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +9 -0
  28. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js.map +1 -0
  29. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js +24 -0
  30. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -0
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js +49 -0
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -0
  33. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  34. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +36 -18
  35. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  36. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +17 -38
  37. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  38. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  39. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue.js +1 -1
  42. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js +1 -1
  43. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  44. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  45. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js +1 -1
  46. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js +2 -0
  47. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js.map +1 -1
  48. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js +32 -29
  49. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js.map +1 -1
  50. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  51. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +53 -2
  52. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  53. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +119 -111
  54. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  55. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue.js +1 -1
  56. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +62 -1
  57. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  58. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  59. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue.js +1 -1
  60. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js +73 -4
  61. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js.map +1 -1
  62. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js +74 -27
  63. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js.map +1 -1
  64. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +208 -46
  65. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  66. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +121 -98
  67. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  68. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +1 -1
  69. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +24 -0
  70. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -1
  71. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +20 -4
  72. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -1
  73. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +25 -6
  74. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  75. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +112 -1
  76. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  77. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +100 -44
  78. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  79. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue.js +1 -1
  80. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js +67 -4
  81. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js.map +1 -1
  82. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js +1 -1
  83. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js.map +1 -1
  84. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue.js +9 -0
  85. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue.js.map +1 -0
  86. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue2.js +88 -0
  87. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue2.js.map +1 -0
  88. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue3.js +39 -0
  89. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue3.js.map +1 -0
  90. package/dist/esm/components/CnObjectCard/CnObjectCard.vue.js +1 -1
  91. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +295 -12
  92. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  93. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +267 -144
  94. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  95. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  96. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +4 -0
  97. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  98. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +3 -1
  99. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  100. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  101. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +93 -1
  102. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  103. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +322 -246
  104. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  105. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue.js +1 -1
  106. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +122 -7
  107. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  108. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js +189 -93
  109. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  110. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +1 -1
  111. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -1
  112. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +3 -3
  113. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -1
  114. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue.js +1 -1
  115. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  116. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +16 -4
  117. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  118. package/dist/esm/components/CnTabs/CnTabs.vue.js +1 -1
  119. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  120. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  121. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  122. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +42 -0
  123. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  124. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +38 -19
  125. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  126. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js +9 -0
  127. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js.map +1 -0
  128. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js +258 -0
  129. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js.map +1 -0
  130. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js +69 -0
  131. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js.map +1 -0
  132. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
  133. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +11 -0
  134. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
  135. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +4 -4
  136. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
  137. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +16 -14
  138. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  139. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  140. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  141. package/dist/esm/index.js +2 -0
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/l10n/en.json.js +24 -1
  144. package/dist/esm/l10n/en.json.js.map +1 -1
  145. package/dist/esm/l10n/nl.json.js +24 -1
  146. package/dist/esm/l10n/nl.json.js.map +1 -1
  147. package/dist/esm/library-style.js +1 -1
  148. package/dist/esm/nextcloud-vue.css +1369 -748
  149. package/dist/esm/utils/dueText.js +18 -3
  150. package/dist/esm/utils/dueText.js.map +1 -1
  151. package/dist/esm/utils/libraryWidgetKeys.js +2 -0
  152. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  153. package/dist/esm/utils/nextcloudApps.js +45 -0
  154. package/dist/esm/utils/nextcloudApps.js.map +1 -0
  155. package/dist/esm/utils/scopeListLayout.js +9 -2
  156. package/dist/esm/utils/scopeListLayout.js.map +1 -1
  157. package/dist/esm/utils/sortOrder.js +11 -1
  158. package/dist/esm/utils/sortOrder.js.map +1 -1
  159. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  160. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  161. package/dist/esm/utils/visibleWhen.js +12 -4
  162. package/dist/esm/utils/visibleWhen.js.map +1 -1
  163. package/dist/nextcloud-vue.cjs.js +8965 -6497
  164. package/dist/nextcloud-vue.cjs.js.map +2 -2
  165. package/dist/nextcloud-vue.css +1369 -748
  166. package/l10n/en.json +24 -1
  167. package/l10n/nl.json +24 -1
  168. package/package.json +1 -1
  169. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -1
  170. package/src/components/CnCardGrid/CnCardGrid.md +2 -0
  171. package/src/components/CnCardGrid/CnCardGrid.vue +20 -0
  172. package/src/components/CnCellRenderer/CnCellRenderer.vue +19 -1
  173. package/src/components/CnChartWidget/CnChartWidget.md +2 -0
  174. package/src/components/CnChartWidget/CnChartWidget.vue +93 -1
  175. package/src/components/CnDashboardPage/CnDashboardPage.vue +9 -6
  176. package/src/components/CnDetailPage/CnDetailPage.md +3 -2
  177. package/src/components/CnDetailPage/CnDetailPage.vue +112 -5
  178. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +60 -0
  179. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +36 -29
  180. package/src/components/CnFactsWidget/CnFactsWidget.vue +4 -0
  181. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -1
  182. package/src/components/CnFeaturesBoard/CnFeaturesBoard.vue +4 -1
  183. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +70 -4
  184. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +62 -1
  185. package/src/components/CnFlowsPage/CnFlowBoard.vue +132 -8
  186. package/src/components/CnIndexPage/CnIndexPage.md +8 -5
  187. package/src/components/CnIndexPage/CnIndexPage.vue +236 -54
  188. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +36 -1
  189. package/src/components/CnIndexPage/useSelfFetchList.js +25 -6
  190. package/src/components/CnIndexSidebar/CnIndexSidebar.md +2 -0
  191. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +148 -1
  192. package/src/components/CnNcWidgetWidget/CnNcWidgetWidget.vue +68 -5
  193. package/src/components/CnNoticeWidget/CnNoticeWidget.vue +153 -0
  194. package/src/components/CnNoticeWidget/index.js +12 -0
  195. package/src/components/CnObjectCard/CnObjectCard.md +1 -0
  196. package/src/components/CnObjectCard/CnObjectCard.vue +354 -13
  197. package/src/components/CnObjectSidebar/CnFilesTab.vue +6 -0
  198. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +190 -4
  199. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +209 -9
  200. package/src/components/CnSettingsField/CnSettingsField.vue +4 -1
  201. package/src/components/CnSetupWizard/CnSetupWizard.vue +9 -1
  202. package/src/components/CnTabs/CnTabs.vue +11 -0
  203. package/src/components/CnTabsWidget/CnTabsWidget.vue +91 -18
  204. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.md +11 -0
  205. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue +382 -0
  206. package/src/components/CnTeamWorkloadWidget/index.js +14 -0
  207. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +15 -4
  208. package/src/components/CnWidgetGrid/builtInWidgets.js +2 -0
  209. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  210. package/src/components/index.js +2 -0
  211. package/src/css/dialog.css +20 -2
  212. package/src/css/index-page.css +14 -2
  213. package/src/css/look-board-detail.css +125 -8
  214. package/src/css/look-board-index.css +100 -4
  215. package/src/css/look-board.css +122 -14
  216. package/src/index.js +2 -1
  217. package/src/schemas/app-manifest-v2.schema.json +110 -8
  218. package/src/utils/dueText.js +18 -3
  219. package/src/utils/libraryWidgetKeys.js +2 -0
  220. package/src/utils/nextcloudApps.js +50 -0
  221. package/src/utils/scopeListLayout.js +9 -2
  222. package/src/utils/sortOrder.js +10 -0
  223. package/src/utils/validateManifestV2.compiled.js +3 -3
  224. package/src/utils/visibleWhen.js +12 -4
@@ -30,9 +30,11 @@ import { useObjectStore } from '../../store/useObjectStore.js';
30
30
  import { routeHref, followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js';
31
31
  import { resolveRegisteredHandler, buildOnSuccessRoute } from '../../utils/actionsDispatcher.js';
32
32
  import { columnFieldsOf, refIdOf, buildValueStages, buildReferenceStages, columnKeyOfRow, resolveDropValue, fullTargetOf, referenceTargetOf, fetchReferenceObjects } from '../../utils/boardReferenceColumns.js';
33
+ import { isColumnSortable } from '../../utils/columnFilters.js';
33
34
  import { reportBindingProblems } from '../../utils/diagnostics.js';
34
35
  import { fetchGroupedCounts } from '../../utils/fetchAggregate.js';
35
36
  import { fetchListTotal, fetchFilterCounts } from '../../utils/fetchFilterCounts.js';
37
+ import { unwrapAppConfig } from '../../utils/formatMetric.js';
36
38
  import { buildExportUrl } from '../../utils/indexExportHelpers.js';
37
39
  import { lensUnavailableText } from '../../utils/lensAvailability.js';
38
40
  import { isModifiedClick, openRowTarget } from '../../utils/linkNavigation.js';
@@ -55,7 +57,7 @@ import { DEFAULT_ROW_INDICATOR_CAP } from '../../utils/rowIndicators.js';
55
57
  import { viewMatchesScope, extractViewState, buildRouteQueryFromViewState, extractViewStateFromRouteQuery, buildViewCreatePayload, savedViewScope, normalizeSharedWith } from '../../utils/savedViewHelpers.js';
56
58
  import { fieldsFromSchema, columnsFromSchema } from '../../utils/schema.js';
57
59
  import { resolveScopeLayout, resolveScopePresentation } from '../../utils/scopeListLayout.js';
58
- import { sameSortKeys, orderToSortKeys } from '../../utils/sortOrder.js';
60
+ import { orderToSortKeys } from '../../utils/sortOrder.js';
59
61
  import { dispatchObjectCreated } from '../../utils/walkthroughSignals.js';
60
62
  import __sfc_main$7 from '../CnActionButtons/CnActionButtons.vue.js';
61
63
  import __sfc_main$8 from '../CnActionsBar/CnActionsBar.vue.js';
@@ -97,7 +99,7 @@ import { reconcilePersonalColumns, orderColumns, personalColumnsKey } from './pe
97
99
  import { createSelfModeActions, resolveRowTarget } from './selfModeActions.js';
98
100
  import { applyRowPatches, splitLayoutFor, normalisePaneWidth, rowIdOf } from './splitView.js';
99
101
  import { useNamedSource } from './useNamedSource.js';
100
- import { useSelfFetchList, BOARD_PAGE_SIZE } from './useSelfFetchList.js';
102
+ import { useSelfFetchList, resolveInitialQuickFilterIndex, BOARD_PAGE_SIZE } from './useSelfFetchList.js';
101
103
  import { useContextMenu } from '../../composables/useContextMenu.js';
102
104
 
103
105
  /** Rows fetched for one month in calendar mode. */
@@ -426,6 +428,8 @@ var script = {
426
428
  cnCustomComponents: { default: () => ({}) },
427
429
  /** The permissions the user holds, provided by CnAppRoot; for gated page tabs. */
428
430
  cnPermissions: { default: () => [] },
431
+ /** The app config an ancestor provides, for `@config.<key>` in quick-filter labels. */
432
+ cnAppConfig: { default: null },
429
433
  /** The app id CnAppRoot provides, for the plural form of `countSubtitle`. */
430
434
  cnAppId: { default: '' },
431
435
  /**
@@ -680,6 +684,20 @@ var script = {
680
684
  default: null,
681
685
  },
682
686
 
687
+ /**
688
+ * Board look: the record layout of each card in the cards view
689
+ * (manifest key `config.cardLayout`): `{ headPill, number, title,
690
+ * meta, footerPill, footerDate }`, each part naming a field. See
691
+ * CnObjectCard `layout`.
692
+ *
693
+ * @type {object}
694
+ * @spec openspec/changes/board-record-card-layout/specs/board-record-card-layout/spec.md#requirement-a-board-card-can-draw-the-record-layout-from-config
695
+ */
696
+ cardLayout: {
697
+ type: Object,
698
+ default: null,
699
+ },
700
+
683
701
  /**
684
702
  * Gives each card in the card view a status accent: a colored start
685
703
  * border and icon. See CnObjectCard `accent`.
@@ -903,13 +921,15 @@ var script = {
903
921
  * the Filter button and the view switch, in whatever width that row has
904
922
  * beside a side panel (DqTeamwachtrij): the chips take the room the
905
923
  * buttons leave, and those that do not fit move into the overflow chip.
924
+ * `'row'` puts them on a row of their own above the toolbar, wrapping
925
+ * onto more lines instead of folding into the overflow chip.
906
926
  *
907
- * @type {''|'toolbar'}
927
+ * @type {''|'toolbar'|'row'}
908
928
  */
909
929
  quickFilterPlacement: {
910
930
  type: String,
911
931
  default: '',
912
- validator: (v) => ['', 'toolbar'].includes(v),
932
+ validator: (v) => ['', 'toolbar', 'row'].includes(v),
913
933
  },
914
934
 
915
935
  /**
@@ -1882,6 +1902,19 @@ var script = {
1882
1902
  default: true,
1883
1903
  },
1884
1904
 
1905
+ /**
1906
+ * The app config `@config.<key>` tokens resolve against, in quick-filter
1907
+ * filters and labels (`"Residence @config.municipality"`), as on the
1908
+ * dashboard and detail pages. Merged over a config an ancestor provides
1909
+ * on `cnAppConfig`. Manifest: `config.appConfig`.
1910
+ *
1911
+ * @type {object}
1912
+ */
1913
+ appConfig: {
1914
+ type: Object,
1915
+ default: () => ({}),
1916
+ },
1917
+
1885
1918
  /**
1886
1919
  * Keep the "Showing X of Y" counter visible beside the inline search field,
1887
1920
  * after any `#after-search` controls (only relevant with `inlineSearch`,
@@ -1930,9 +1963,11 @@ var script = {
1930
1963
  },
1931
1964
 
1932
1965
  /**
1933
- * Show a standalone sort dropdown in the actions bar (for card/list
1934
- * views without sortable headers). Emits `@sort-change` with the value.
1935
- * Fed from the manifest as `pages[].config.showSortSelect`.
1966
+ * Deprecated, without effect: the toolbar draws no sort select. The
1967
+ * table sorts by its column headers, the list, card and map views by
1968
+ * the Sort section in the index sidebar.
1969
+ *
1970
+ * @deprecated
1936
1971
  */
1937
1972
  showSortSelect: {
1938
1973
  type: Boolean,
@@ -1940,7 +1975,11 @@ var script = {
1940
1975
  },
1941
1976
 
1942
1977
  /**
1943
- * Options for the standalone sort dropdown (manifest `config.sortSelectOptions`).
1978
+ * The orders the index sidebar's Sort section offers in the list, card
1979
+ * and map views (manifest `config.sortSelectOptions`): `{ value, label,
1980
+ * order? }`, the order its `order` (an `orderToSortKeys` form) or its
1981
+ * `value` read as one. Without them the section offers the sortable
1982
+ * columns.
1944
1983
  *
1945
1984
  * @type {Array<{ value: string, label: string }>}
1946
1985
  */
@@ -1950,8 +1989,10 @@ var script = {
1950
1989
  },
1951
1990
 
1952
1991
  /**
1953
- * Selected value of the standalone sort dropdown. Empty lets a
1954
- * self-fetch page show the option matching its current order.
1992
+ * Deprecated, without effect: the toolbar sort select is gone; the
1993
+ * Sort section in the index sidebar shows the current order.
1994
+ *
1995
+ * @deprecated
1955
1996
  */
1956
1997
  sortSelectValue: {
1957
1998
  type: String,
@@ -2004,6 +2045,9 @@ var script = {
2004
2045
  * defaults to `field`).
2005
2046
  * - `folders` — explicit folder list for `source:'custom'`.
2006
2047
  * - `allLabel` / `title` / `allowCreate` — passed to CnFolderSidebar.
2048
+ * - `scopeViews` — the view modes the scope's look (columns, title,
2049
+ * count line and the other scope keys) applies in, e.g. `["table",
2050
+ * "list"]`; other views keep the page's own look. Default: every view.
2007
2051
  * - `pane` — `false` draws no pane: the scope still comes from the
2008
2052
  * deep-link filter (`?caseType=<id>`) and still applies its look, as
2009
2053
  * a list narrowed to one case type does without a folder column.
@@ -3735,22 +3779,45 @@ var script = {
3735
3779
  },
3736
3780
 
3737
3781
  /**
3738
- * The sort select's shown value: `sortSelectValue` when the host
3739
- * controls it, else on a self-fetch page the option whose order is the
3740
- * list's current order (a header click that matches one shows it).
3782
+ * The list's current order, `[{ key, order }]`: the self-fetched list's,
3783
+ * else the `sortKeys` / `sortKey` props.
3741
3784
  *
3742
- * @return {string} The option value, or '' when none matches.
3785
+ * @return {Array<{key: string, order: string}>} The order.
3743
3786
  */
3744
- effectiveSortSelectValue() {
3745
- if (this.sortSelectValue) {
3746
- return this.sortSelectValue
3787
+ currentSortKeys() {
3788
+ if (this.isSelfFetchMode && this.list && this.list.sortKeys) {
3789
+ return this.list.sortKeys.value || []
3747
3790
  }
3748
- if (!this.isSelfFetchMode || !this.list || !this.list.sortKeys) {
3749
- return ''
3791
+ if (Array.isArray(this.sortKeys) && this.sortKeys.length > 0) {
3792
+ return this.sortKeys
3793
+ }
3794
+ return this.sortKey ? [{ key: this.sortKey, order: this.sortOrder || 'asc' }] : []
3795
+ },
3796
+
3797
+ /**
3798
+ * The orders the index sidebar's Sort section offers: none in the table
3799
+ * view, which sorts by its column headers; else `sortSelectOptions`,
3800
+ * or else the sortable columns, ascending.
3801
+ *
3802
+ * @return {Array<{value: string, label: string, keys: Array<{key: string, order: string}>}>} The options.
3803
+ */
3804
+ sidebarSortOptions() {
3805
+ if (this.currentViewMode === 'table') {
3806
+ return []
3807
+ }
3808
+ if (Array.isArray(this.sortSelectOptions) && this.sortSelectOptions.length > 0) {
3809
+ return this.sortSelectOptions
3810
+ .filter((o) => o && o.value !== undefined && o.value !== null)
3811
+ .map((o) => ({
3812
+ value: String(o.value),
3813
+ label: this.cnTranslate(o.label || String(o.value)),
3814
+ keys: orderToSortKeys(o.order !== undefined ? o.order : o.value),
3815
+ }))
3816
+ .filter((o) => o.keys.length > 0)
3750
3817
  }
3751
- const current = this.list.sortKeys.value || [];
3752
- const match = (this.sortSelectOptions || []).find((o) => o && sameSortKeys(this.sortSelectKeys(o), current));
3753
- return match ? match.value : ''
3818
+ return (this.tableColumns || [])
3819
+ .filter((c) => c && typeof c === 'object' && c.key && isColumnSortable(c, this.effectiveSchema))
3820
+ .map((c) => ({ value: c.key, label: this.cnTranslate(c.label || c.key), keys: [{ key: c.key, order: 'asc' }] }))
3754
3821
  },
3755
3822
 
3756
3823
  /**
@@ -3782,7 +3849,7 @@ var script = {
3782
3849
  * @spec openspec/changes/index-columns-per-scope/specs/index-page/spec.md
3783
3850
  */
3784
3851
  activeScopeLayout() {
3785
- if (!this.folderSidebar) {
3852
+ if (!this.folderSidebar || !this.scopeShapesView) {
3786
3853
  return { columns: null, sortKeys: [], searchFields: [] }
3787
3854
  }
3788
3855
  return resolveScopeLayout({
@@ -3792,6 +3859,23 @@ var script = {
3792
3859
  })
3793
3860
  },
3794
3861
 
3862
+ /**
3863
+ * Whether the active scope's look applies in the current view mode:
3864
+ * always, unless `folderSidebar.scopeViews` names the view modes it is
3865
+ * for (`["table", "list"]`), so the board keeps the page's generic
3866
+ * look (DqWerkbord). The scope's filter applies in every view.
3867
+ *
3868
+ * @spec openspec/changes/index-scope-views/specs/index-page/spec.md#requirement-a-scope-look-can-be-limited-to-view-modes
3869
+ * @return {boolean}
3870
+ */
3871
+ scopeShapesView() {
3872
+ const views = this.folderSidebar && this.folderSidebar.scopeViews;
3873
+ if (!Array.isArray(views) || views.length === 0) {
3874
+ return true
3875
+ }
3876
+ return views.includes(this.currentViewMode)
3877
+ },
3878
+
3795
3879
  /**
3796
3880
  * This page's own value of each presentation key, which a query preset
3797
3881
  * may have set: what `presented()` falls back to without a scope.
@@ -3826,7 +3910,7 @@ var script = {
3826
3910
  * @spec openspec/changes/index-scope-presentation/specs/index-page/spec.md#requirement-a-preset-or-a-scope-sets-the-list-s-presentation
3827
3911
  */
3828
3912
  activeScopePresentation() {
3829
- if (!this.folderSidebar) {
3913
+ if (!this.folderSidebar || !this.scopeShapesView) {
3830
3914
  return {}
3831
3915
  }
3832
3916
  return resolveScopePresentation({ scope: this.activeScope, row: this.activeScopeRow })
@@ -4068,6 +4152,20 @@ var script = {
4068
4152
  * @return {(Array<object>|null)} The tabs.
4069
4153
  * @spec openspec/changes/working-list-row-actions/specs/index-page/spec.md
4070
4154
  */
4155
+ /**
4156
+ * The chip the strip lights: the active tab, else the default tab of
4157
+ * tabs that arrived after setup (`quickFiltersFrom`), which is the
4158
+ * one the fetch applies.
4159
+ *
4160
+ * @return {number|null} The tab index, or null without tabs.
4161
+ */
4162
+ shownQuickFilterIndex() {
4163
+ if (this.activeQuickFilterIndex !== null && this.activeQuickFilterIndex !== undefined) {
4164
+ return this.activeQuickFilterIndex
4165
+ }
4166
+ return this.quickFilterMultiple ? null : resolveInitialQuickFilterIndex(this.tabStripEntries)
4167
+ },
4168
+
4071
4169
  tabStripEntries() {
4072
4170
  if (this.lensTabs.length > 0) {
4073
4171
  return this.lensTabs
@@ -4294,6 +4392,22 @@ var script = {
4294
4392
  return specs
4295
4393
  },
4296
4394
 
4395
+ /**
4396
+ * The rendered columns by key, so a card fact shows what its table
4397
+ * cell shows (label, formatter, widget).
4398
+ *
4399
+ * @return {object} Column definitions keyed by property.
4400
+ */
4401
+ cardFieldColumns() {
4402
+ const byKey = {};
4403
+ for (const col of this.renderedColumns || []) {
4404
+ if (col && typeof col === 'object' && typeof col.key === 'string') {
4405
+ byKey[col.key] = col;
4406
+ }
4407
+ }
4408
+ return byKey
4409
+ },
4410
+
4297
4411
  /**
4298
4412
  * The property keys the board look's card facts show: the page's
4299
4413
  * `cardFields`, else the first four list columns. Null without the
@@ -5143,8 +5257,11 @@ var script = {
5143
5257
 
5144
5258
  const present = new Set(cols.map((c) => (typeof c === 'string' ? c : c.key)));
5145
5259
  const byKey = new Map(this.governedColumns.map((c) => [c.key, c]));
5260
+ // A scope that sets its own columns does not get its folder field back:
5261
+ // every row of the scope holds the same value there.
5262
+ const scopeField = this.activeScopeLayout.columns ? this.folderFilterKey : '';
5146
5263
  visible.forEach((key) => {
5147
- if (present.has(key)) {
5264
+ if (present.has(key) || key === scopeField) {
5148
5265
  return
5149
5266
  }
5150
5267
  const def = byKey.get(key);
@@ -5427,11 +5544,21 @@ var script = {
5427
5544
  effectiveQuickFilters() {
5428
5545
  const own = withPersonalLenses(this.presented('quickFilters') || this.generatedQuickFilters, this.personalLenses);
5429
5546
  if (own && own.length > 0) {
5430
- return own
5547
+ return own.map((tab) => this.withConfigLabels(tab))
5431
5548
  }
5432
5549
  return (this.isNamedSource && this.namedQuickFilters) || null
5433
5550
  },
5434
5551
 
5552
+ /**
5553
+ * The app config `@config.<key>` tokens resolve against: the `appConfig`
5554
+ * prop over a config an ancestor provides.
5555
+ *
5556
+ * @return {object} The config.
5557
+ */
5558
+ effectiveAppConfig() {
5559
+ return { ...unwrapAppConfig(this.cnAppConfig), ...(this.appConfig || {}) }
5560
+ },
5561
+
5435
5562
  /**
5436
5563
  * Whether the Add button renders. A named source that declares
5437
5564
  * `showAdd: false` suppresses it (a task is created by a flow, never
@@ -5609,6 +5736,28 @@ var script = {
5609
5736
  return count > 0 ? `${name}, ${translate('nextcloud-vue', '{count} active', { count })}` : name
5610
5737
  },
5611
5738
 
5739
+ /** @return {string} The field the folder sidebar filters by, or ''. */
5740
+ folderFilterKey() {
5741
+ return (this.folderSidebar && (this.folderSidebar.filterField || this.folderSidebar.field)) || ''
5742
+ },
5743
+
5744
+ /**
5745
+ * The filters the table's header filters show: every active filter but
5746
+ * the selected folder's own, which the Active chip already names, so
5747
+ * the table draws no summary chip for it.
5748
+ *
5749
+ * @return {object} The filters.
5750
+ */
5751
+ tableActiveFilters() {
5752
+ const filters = this.effectiveActiveFilters || {};
5753
+ const key = this.folderFilterKey;
5754
+ if (!key || this.selectedFolderId === null || this.selectedFolderId === undefined || !Object.hasOwn(filters, key)) {
5755
+ return filters
5756
+ }
5757
+ const { [key]: _folder, ...rest } = filters;
5758
+ return rest
5759
+ },
5760
+
5612
5761
  /**
5613
5762
  * The active filters as chips for the board toolbar's second row, one
5614
5763
  * per filter: "Team: Woo". A filter with no value is not active.
@@ -6012,6 +6161,8 @@ var script = {
6012
6161
  showMetadata: this.resolvedSidebar.showMetadata !== false,
6013
6162
  personalColumns: this.personalColumns,
6014
6163
  pinnedCount: this.pinnedColumnCount,
6164
+ sortOptions: this.sidebarSortOptions,
6165
+ currentSort: this.currentSortKeys,
6015
6166
  ...this.sidebarSearchProps,
6016
6167
  }
6017
6168
  },
@@ -7484,35 +7635,45 @@ var script = {
7484
7635
  },
7485
7636
 
7486
7637
  /**
7487
- * The sort keys a sort-select option stands for: its `order` (any
7488
- * `orderToSortKeys` form), else its `value` read as an order.
7638
+ * An order chosen in the index sidebar's Sort section. It goes the way
7639
+ * a header click goes: the self-fetched list sorts (`_order`, kept in
7640
+ * the address), and `sort` is emitted for a host that sorts itself.
7489
7641
  *
7490
- * @param {object} option A `sortSelectOptions` entry.
7491
- * @return {Array<{key: string, order: string}>} The sort keys.
7642
+ * @param {Array<{key: string, order: string}>} keys The chosen order.
7643
+ * @return {void}
7492
7644
  */
7493
- sortSelectKeys(option) {
7494
- if (!option) {
7495
- return []
7645
+ onSidebarSortChange(keys) {
7646
+ if (!Array.isArray(keys) || keys.length === 0) {
7647
+ return
7496
7648
  }
7497
- return orderToSortKeys(option.order !== undefined ? option.order : option.value)
7649
+ this.onSortEvent({ key: keys[0].key, order: keys[0].order, keys });
7498
7650
  },
7499
7651
 
7500
7652
  /**
7501
- * A choice in the sort select. On a self-fetch page it orders the list
7502
- * as a header click does (`_order`, kept in the address); every page
7503
- * also emits `sort-change` with the value.
7653
+ * A quick filter with `@config.<key>` in its `label` or `activeLabel`
7654
+ * (`"Residence @config.municipality"`): the label translated first, then
7655
+ * each token replaced by its configured value. A key the config does
7656
+ * not hold leaves its token in place. Other tabs pass unchanged.
7504
7657
  *
7505
- * @param {string} value The chosen option's value.
7506
- * @return {void}
7658
+ * @param {object} tab A quick-filter tab.
7659
+ * @return {object} The tab, with its labels resolved.
7507
7660
  */
7508
- onSortSelectChange(value) {
7509
- const option = (this.sortSelectOptions || []).find((o) => o && o.value === value);
7510
- const keys = this.sortSelectKeys(option);
7511
- if (option && keys.length > 0 && this.isSelfFetchMode && typeof this.list.onSort === 'function') {
7512
- this.list.onSort({ key: keys[0].key, order: keys[0].order, keys });
7513
- this.persistViewStateToRoute(this.currentViewState());
7661
+ withConfigLabels(tab) {
7662
+ if (!tab || typeof tab !== 'object') {
7663
+ return tab
7664
+ }
7665
+ const hasToken = (value) => typeof value === 'string' && value.includes('@config.');
7666
+ if (!hasToken(tab.label) && !hasToken(tab.activeLabel)) {
7667
+ return tab
7514
7668
  }
7515
- this.$emit('sort-change', value);
7669
+ const config = this.effectiveAppConfig;
7670
+ const fill = (value) => (hasToken(value)
7671
+ ? this.cnTranslate(value).replace(/@config\.([A-Za-z0-9_.-]*[A-Za-z0-9_])/g, (token, key) => {
7672
+ const found = this.getByPath(config, key);
7673
+ return found === undefined || found === null || found === '' ? token : String(found)
7674
+ })
7675
+ : value);
7676
+ return { ...tab, label: fill(tab.label), activeLabel: fill(tab.activeLabel) }
7516
7677
  },
7517
7678
 
7518
7679
  /**
@@ -8673,6 +8834,7 @@ var script = {
8673
8834
  'columns-reset': () => this.onColumnsReset(),
8674
8835
  'filter-change': (event) => this.onFilterEvent(event),
8675
8836
  'clear-filters': () => this.onClearFilters(),
8837
+ 'sort-change': (keys) => this.onSidebarSortChange(keys),
8676
8838
  },
8677
8839
  };
8678
8840
  },