@conduction/nextcloud-vue 2.78.0 → 2.80.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 (259) hide show
  1. package/dist/bundled-packages.json +0 -2
  2. package/dist/esm/bundled-packages.json +0 -2
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
  5. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  6. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
  7. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  8. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +115 -104
  9. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  10. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +12 -2
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  12. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  13. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +39 -3
  14. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  15. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +158 -0
  17. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  18. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +157 -96
  19. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  20. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +139 -1
  21. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  22. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +140 -92
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +77 -0
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +5 -2
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +62 -4
  29. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  30. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +85 -1
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  33. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
  34. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  35. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
  36. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
  37. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +736 -0
  38. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
  39. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
  40. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
  41. package/dist/esm/components/CnFactsWidget/index.js +30 -0
  42. package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
  43. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
  44. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
  45. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +551 -0
  46. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
  47. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +183 -0
  48. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
  49. package/dist/esm/components/CnFieldListWidget/index.js +29 -0
  50. package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
  51. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +173 -5
  52. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  53. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +181 -99
  54. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  55. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +29 -11
  56. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  57. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js +252 -0
  58. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js.map +1 -0
  59. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +66 -18
  60. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  61. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
  62. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  63. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +18 -3
  64. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  65. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  66. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +330 -74
  67. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  68. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +34 -15
  69. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  70. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
  71. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
  72. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
  73. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
  74. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
  75. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
  76. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +100 -3
  77. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  78. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +4 -2
  79. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  80. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
  81. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  82. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  83. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +3 -2
  84. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  85. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  86. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
  87. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
  88. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +387 -0
  89. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
  90. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +169 -0
  91. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
  92. package/dist/esm/components/CnRecordListWidget/index.js +31 -0
  93. package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
  94. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  95. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js +1 -1
  96. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  97. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
  98. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
  99. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
  100. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
  101. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
  102. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
  103. package/dist/esm/components/CnSectionsWidget/index.js +35 -0
  104. package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
  105. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
  106. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  107. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  108. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  109. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
  110. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  111. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +152 -8
  112. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  113. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +84 -23
  114. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  115. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  116. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  117. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -0
  118. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  119. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  120. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +106 -2
  121. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  122. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +105 -53
  123. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  124. package/dist/esm/composables/useAppManifest.js +8 -3
  125. package/dist/esm/composables/useAppManifest.js.map +1 -1
  126. package/dist/esm/composables/useFormDraft.js +140 -9
  127. package/dist/esm/composables/useFormDraft.js.map +1 -1
  128. package/dist/esm/index.js +5 -0
  129. package/dist/esm/index.js.map +1 -1
  130. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
  131. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  132. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
  133. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  134. package/dist/esm/integrations/builtin/field-inspection.js +21 -0
  135. package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
  136. package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
  137. package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
  138. package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
  139. package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
  140. package/dist/esm/integrations/offline/index.js +2 -1
  141. package/dist/esm/integrations/offline/index.js.map +1 -1
  142. package/dist/esm/integrations/offline/offlineDb.js +6 -1
  143. package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
  144. package/dist/esm/integrations/offline/syncReplayService.js +8 -2
  145. package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
  146. package/dist/esm/l10n/en.json.js +72 -1
  147. package/dist/esm/l10n/en.json.js.map +1 -1
  148. package/dist/esm/l10n/nl.json.js +120 -2
  149. package/dist/esm/l10n/nl.json.js.map +1 -1
  150. package/dist/esm/nextcloud-vue.css +1314 -74
  151. package/dist/esm/utils/boardDate.js +193 -0
  152. package/dist/esm/utils/boardDate.js.map +1 -0
  153. package/dist/esm/utils/detailActionModel.js +60 -3
  154. package/dist/esm/utils/detailActionModel.js.map +1 -1
  155. package/dist/esm/utils/dynamicProperties.js +5 -1
  156. package/dist/esm/utils/dynamicProperties.js.map +1 -1
  157. package/dist/esm/utils/fillTemplate.js +114 -0
  158. package/dist/esm/utils/fillTemplate.js.map +1 -0
  159. package/dist/esm/utils/libraryWidgetKeys.js +4 -0
  160. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  161. package/dist/esm/utils/queryPresets.js +96 -0
  162. package/dist/esm/utils/queryPresets.js.map +1 -0
  163. package/dist/esm/utils/resolveFilterTokens.js +11 -0
  164. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  165. package/dist/esm/utils/schema.js +21 -0
  166. package/dist/esm/utils/schema.js.map +1 -1
  167. package/dist/esm/utils/sentinelTokens.js +3 -3
  168. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  169. package/dist/esm/utils/validateManifestV2.compiled.js +57 -6
  170. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  171. package/dist/esm/utils/widgetDispatch.js +7 -1
  172. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  173. package/dist/nextcloud-vue.cjs.js +14278 -8169
  174. package/dist/nextcloud-vue.cjs.js.map +2 -2
  175. package/dist/nextcloud-vue.css +1314 -74
  176. package/l10n/en.json +72 -1
  177. package/l10n/nl.json +120 -2
  178. package/package.json +1 -1
  179. package/scripts/build-validators.js +26 -0
  180. package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
  181. package/src/components/CnActionsBar/CnActionsBar.md +4 -0
  182. package/src/components/CnActionsBar/CnActionsBar.vue +83 -42
  183. package/src/components/CnAppRoot/CnAppRoot.vue +12 -2
  184. package/src/components/CnBannerWidget/CnBannerWidget.vue +39 -3
  185. package/src/components/CnCellRenderer/CnCellRenderer.vue +306 -2
  186. package/src/components/CnDashboardPage/CnDashboardPage.vue +219 -4
  187. package/src/components/CnDataTable/CnDataTable.md +2 -0
  188. package/src/components/CnDataTable/CnDataTable.vue +82 -2
  189. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  190. package/src/components/CnDetailPage/CnDetailPage.vue +63 -3
  191. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +127 -1
  192. package/src/components/CnFactsWidget/CnFactsWidget.vue +1050 -0
  193. package/src/components/CnFactsWidget/index.js +29 -0
  194. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +746 -0
  195. package/src/components/CnFieldListWidget/index.js +28 -0
  196. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +232 -11
  197. package/src/components/CnFilesBrowser/filesBrowser.js +43 -2
  198. package/src/components/CnFilesBrowser/index.js +1 -0
  199. package/src/components/CnFilesBrowser/openRegisterSource.js +248 -0
  200. package/src/components/CnFormDialog/CnFormDialog.md +9 -3
  201. package/src/components/CnFormDialog/CnFormDialog.vue +70 -22
  202. package/src/components/CnFormPage/CnFormPage.vue +18 -3
  203. package/src/components/CnIndexPage/CnIndexPage.vue +281 -9
  204. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
  205. package/src/components/CnObjectSidebar/CnFilesTab.vue +103 -4
  206. package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
  207. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +3 -2
  208. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +603 -0
  209. package/src/components/CnRecordListWidget/index.js +30 -0
  210. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +1 -1
  211. package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
  212. package/src/components/CnSectionsWidget/index.js +34 -0
  213. package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
  214. package/src/components/CnStatWidget/CnStatWidget.vue +1 -1
  215. package/src/components/CnTabsWidget/CnTabsWidget.vue +214 -9
  216. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  217. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -0
  218. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +188 -4
  219. package/src/components/index.js +5 -1
  220. package/src/composables/__tests__/useFormDraft.spec.js +69 -0
  221. package/src/composables/useAppManifest.js +8 -3
  222. package/src/composables/useFormDraft.js +139 -8
  223. package/src/css/form-field.css +14 -0
  224. package/src/css/index-page.css +71 -0
  225. package/src/css/kpi-card.css +32 -0
  226. package/src/css/look-board-detail.css +87 -0
  227. package/src/css/look-board-index.css +143 -14
  228. package/src/css/look-board.css +114 -2
  229. package/src/css/table.css +56 -0
  230. package/src/index.js +8 -0
  231. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
  232. package/src/integrations/builtin/field-inspection.js +21 -0
  233. package/src/integrations/offline/checklistSubmission.js +137 -0
  234. package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
  235. package/src/integrations/offline/index.js +3 -0
  236. package/src/integrations/offline/offlineDb.js +6 -1
  237. package/src/integrations/offline/syncReplayService.js +8 -2
  238. package/src/schemas/app-manifest-v2.schema.json +149 -5
  239. package/src/utils/boardDate.js +189 -0
  240. package/src/utils/detailActionModel.js +59 -2
  241. package/src/utils/dynamicProperties.js +5 -1
  242. package/src/utils/fillTemplate.js +110 -0
  243. package/src/utils/libraryWidgetKeys.js +4 -0
  244. package/src/utils/queryPresets.js +93 -0
  245. package/src/utils/resolveFilterTokens.js +11 -0
  246. package/src/utils/schema.js +21 -0
  247. package/src/utils/sentinelTokens.js +3 -3
  248. package/src/utils/validateManifestV2.compiled.js +57 -2
  249. package/src/utils/widgetDispatch.js +7 -1
  250. package/dist/esm/_virtual/equal.js +0 -4
  251. package/dist/esm/_virtual/equal.js.map +0 -1
  252. package/dist/esm/_virtual/ucs2length.js +0 -4
  253. package/dist/esm/_virtual/ucs2length.js.map +0 -1
  254. package/dist/esm/node_modules/ajv/dist/runtime/equal.js +0 -9
  255. package/dist/esm/node_modules/ajv/dist/runtime/equal.js.map +0 -1
  256. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js +0 -25
  257. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js.map +0 -1
  258. package/dist/esm/node_modules/fast-deep-equal/index.js +0 -47
  259. package/dist/esm/node_modules/fast-deep-equal/index.js.map +0 -1
@@ -11,11 +11,12 @@ import Export from 'vue-material-design-icons/Export.vue';
11
11
  import Eye from 'vue-material-design-icons/Eye.vue';
12
12
  import FilterOutline from 'vue-material-design-icons/FilterOutline.vue';
13
13
  import ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue';
14
- import __sfc_main$v from '../../dialogs/CnConfirmDialog.vue.js';
15
- import __sfc_main$w from '../../dialogs/CnQuickEditDialog.vue.js';
16
- import __sfc_main from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
17
- import __sfc_main$2 from '../CnEmptyContent/CnEmptyContent.vue.js';
18
- import __sfc_main$1 from '../CnFollowToggle/CnFollowToggle.vue.js';
14
+ import __sfc_main$w from '../../dialogs/CnConfirmDialog.vue.js';
15
+ import __sfc_main$x from '../../dialogs/CnQuickEditDialog.vue.js';
16
+ import __sfc_main$1 from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
17
+ import __sfc_main$3 from '../CnEmptyContent/CnEmptyContent.vue.js';
18
+ import __sfc_main$2 from '../CnFollowToggle/CnFollowToggle.vue.js';
19
+ import __sfc_main from './CnIndexPageWidgets.vue.js';
19
20
  import { useLook } from '../../composables/useLook.js';
20
21
  import { copyKindsOf } from '../../composables/useObjectCopy.js';
21
22
  import { createRefLabelResolver } from '../../composables/useRefLabels.js';
@@ -45,37 +46,37 @@ import { viewMatchesScope, extractViewState, buildRouteQueryFromViewState, extra
45
46
  import { fieldsFromSchema, columnsFromSchema } from '../../utils/schema.js';
46
47
  import { resolveScopeLayout } from '../../utils/scopeListLayout.js';
47
48
  import { dispatchObjectCreated } from '../../utils/walkthroughSignals.js';
48
- import __sfc_main$5 from '../CnActionsBar/CnActionsBar.vue.js';
49
- import __sfc_main$o from '../CnAdvancedFormDialog/CnAdvancedFormDialog.vue.js';
49
+ import __sfc_main$6 from '../CnActionsBar/CnActionsBar.vue.js';
50
+ import __sfc_main$p from '../CnAdvancedFormDialog/CnAdvancedFormDialog.vue.js';
50
51
  import '../CnAdvancedFormDialog/CnMetadataTab.vue.js';
51
52
  import '../CnAdvancedFormDialog/CnPropertiesTab.vue.js';
52
53
  import '../CnAdvancedFormDialog/CnPropertyValueCell.vue.js';
53
- import __sfc_main$9 from '../CnBoardView/CnBoardView.vue.js';
54
- import __sfc_main$8 from '../CnCardGrid/CnCardGrid.vue.js';
55
- import __sfc_main$p from '../CnContextMenu/CnContextMenu.vue.js';
56
- import __sfc_main$m from '../CnCopyDialog/CnCopyDialog.vue.js';
57
- import __sfc_main$7 from '../CnDataTable/CnDataTable.vue.js';
58
- import __sfc_main$a from '../CnDateAxisView/CnDateAxisView.vue.js';
59
- import __sfc_main$l from '../CnDeleteDialog/CnDeleteDialog.vue.js';
60
- import __sfc_main$e from '../CnFolderSidebar/CnFolderSidebar.vue.js';
61
- import __sfc_main$n from '../CnFormDialog/CnFormDialog.vue.js';
62
- import __sfc_main$6 from '../CnIcon/CnIcon.vue.js';
63
- import __sfc_main$q from '../CnIndexSidebar/CnIndexSidebar.vue.js';
64
- import __sfc_main$c from '../CnMapWidget/CnMapWidget.vue.js';
65
- import __sfc_main$i from '../CnMassCopyDialog/CnMassCopyDialog.vue.js';
66
- import __sfc_main$h from '../CnMassDeleteDialog/CnMassDeleteDialog.vue.js';
67
- import __sfc_main$j from '../CnMassExportDialog/CnMassExportDialog.vue.js';
68
- import __sfc_main$k from '../CnMassImportDialog/CnMassImportDialog.vue.js';
69
- import __sfc_main$b from '../CnObjectCalendar/CnObjectCalendar.vue.js';
70
- import __sfc_main$d from '../CnObjectList/CnObjectList.vue.js';
71
- import __sfc_main$3 from '../CnPageHeader/CnPageHeader.vue.js';
72
- import __sfc_main$f from '../CnPagination/CnPagination.vue.js';
73
- import __sfc_main$4 from '../CnQuickFilterBar/CnQuickFilterBar.vue.js';
74
- import __sfc_main$g from '../CnRowActions/CnRowActions.vue.js';
75
- import __sfc_main$s from '../CnSavedViewPresentationDialog/CnSavedViewPresentationDialog.vue.js';
76
- import __sfc_main$r from '../CnSavedViewsControl/CnSavedViewsControl.vue.js';
77
- import __sfc_main$t from '../CnSavedViewShareDialog/CnSavedViewShareDialog.vue.js';
78
- import __sfc_main$u from '../CnSaveViewDialog/CnSaveViewDialog.vue.js';
54
+ import __sfc_main$a from '../CnBoardView/CnBoardView.vue.js';
55
+ import __sfc_main$9 from '../CnCardGrid/CnCardGrid.vue.js';
56
+ import __sfc_main$q from '../CnContextMenu/CnContextMenu.vue.js';
57
+ import __sfc_main$n from '../CnCopyDialog/CnCopyDialog.vue.js';
58
+ import __sfc_main$8 from '../CnDataTable/CnDataTable.vue.js';
59
+ import __sfc_main$b from '../CnDateAxisView/CnDateAxisView.vue.js';
60
+ import __sfc_main$m from '../CnDeleteDialog/CnDeleteDialog.vue.js';
61
+ import __sfc_main$f from '../CnFolderSidebar/CnFolderSidebar.vue.js';
62
+ import __sfc_main$o from '../CnFormDialog/CnFormDialog.vue.js';
63
+ import __sfc_main$7 from '../CnIcon/CnIcon.vue.js';
64
+ import __sfc_main$r from '../CnIndexSidebar/CnIndexSidebar.vue.js';
65
+ import __sfc_main$d from '../CnMapWidget/CnMapWidget.vue.js';
66
+ import __sfc_main$j from '../CnMassCopyDialog/CnMassCopyDialog.vue.js';
67
+ import __sfc_main$i from '../CnMassDeleteDialog/CnMassDeleteDialog.vue.js';
68
+ import __sfc_main$k from '../CnMassExportDialog/CnMassExportDialog.vue.js';
69
+ import __sfc_main$l from '../CnMassImportDialog/CnMassImportDialog.vue.js';
70
+ import __sfc_main$c from '../CnObjectCalendar/CnObjectCalendar.vue.js';
71
+ import __sfc_main$e from '../CnObjectList/CnObjectList.vue.js';
72
+ import __sfc_main$4 from '../CnPageHeader/CnPageHeader.vue.js';
73
+ import __sfc_main$g from '../CnPagination/CnPagination.vue.js';
74
+ import __sfc_main$5 from '../CnQuickFilterBar/CnQuickFilterBar.vue.js';
75
+ import __sfc_main$h from '../CnRowActions/CnRowActions.vue.js';
76
+ import __sfc_main$t from '../CnSavedViewPresentationDialog/CnSavedViewPresentationDialog.vue.js';
77
+ import __sfc_main$s from '../CnSavedViewsControl/CnSavedViewsControl.vue.js';
78
+ import __sfc_main$u from '../CnSavedViewShareDialog/CnSavedViewShareDialog.vue.js';
79
+ import __sfc_main$v from '../CnSaveViewDialog/CnSaveViewDialog.vue.js';
79
80
  import { applyAiContext } from './aiContext.js';
80
81
  import { buildDefaultActions } from './defaultActions.js';
81
82
  import { dispatchAction } from './manifestActionDispatch.js';
@@ -303,10 +304,11 @@ var script = {
303
304
  name: 'CnIndexPage',
304
305
 
305
306
  components: {
306
- CnBuildiqEditButton: __sfc_main,
307
- CnFollowToggle: __sfc_main$1,
307
+ CnIndexPageWidgets: __sfc_main,
308
+ CnBuildiqEditButton: __sfc_main$1,
309
+ CnFollowToggle: __sfc_main$2,
308
310
  NcLoadingIcon,
309
- CnEmptyContent: __sfc_main$2,
311
+ CnEmptyContent: __sfc_main$3,
310
312
  NcActions,
311
313
  NcActionButton,
312
314
  NcActionCaption,
@@ -320,37 +322,37 @@ var script = {
320
322
  FilterOutline,
321
323
  ViewColumnOutline,
322
324
  NcCheckboxRadioSwitch,
323
- CnPageHeader: __sfc_main$3,
324
- CnQuickFilterBar: __sfc_main$4,
325
- CnActionsBar: __sfc_main$5,
325
+ CnPageHeader: __sfc_main$4,
326
+ CnQuickFilterBar: __sfc_main$5,
327
+ CnActionsBar: __sfc_main$6,
326
328
  DotsHorizontal,
327
- CnIcon: __sfc_main$6,
328
- CnDataTable: __sfc_main$7,
329
- CnCardGrid: __sfc_main$8,
330
- CnBoardView: __sfc_main$9,
331
- CnDateAxisView: __sfc_main$a,
332
- CnObjectCalendar: __sfc_main$b,
333
- CnMapWidget: __sfc_main$c,
334
- CnObjectList: __sfc_main$d,
335
- CnFolderSidebar: __sfc_main$e,
336
- CnPagination: __sfc_main$f,
337
- CnRowActions: __sfc_main$g,
338
- CnMassDeleteDialog: __sfc_main$h,
339
- CnMassCopyDialog: __sfc_main$i,
340
- CnMassExportDialog: __sfc_main$j,
341
- CnMassImportDialog: __sfc_main$k,
342
- CnDeleteDialog: __sfc_main$l,
343
- CnCopyDialog: __sfc_main$m,
344
- CnFormDialog: __sfc_main$n,
345
- CnAdvancedFormDialog: __sfc_main$o,
346
- CnContextMenu: __sfc_main$p,
347
- CnIndexSidebar: __sfc_main$q,
348
- CnSavedViewsControl: __sfc_main$r,
349
- CnSavedViewPresentationDialog: __sfc_main$s,
350
- CnSavedViewShareDialog: __sfc_main$t,
351
- CnSaveViewDialog: __sfc_main$u,
352
- CnConfirmDialog: __sfc_main$v,
353
- CnQuickEditDialog: __sfc_main$w,
329
+ CnIcon: __sfc_main$7,
330
+ CnDataTable: __sfc_main$8,
331
+ CnCardGrid: __sfc_main$9,
332
+ CnBoardView: __sfc_main$a,
333
+ CnDateAxisView: __sfc_main$b,
334
+ CnObjectCalendar: __sfc_main$c,
335
+ CnMapWidget: __sfc_main$d,
336
+ CnObjectList: __sfc_main$e,
337
+ CnFolderSidebar: __sfc_main$f,
338
+ CnPagination: __sfc_main$g,
339
+ CnRowActions: __sfc_main$h,
340
+ CnMassDeleteDialog: __sfc_main$i,
341
+ CnMassCopyDialog: __sfc_main$j,
342
+ CnMassExportDialog: __sfc_main$k,
343
+ CnMassImportDialog: __sfc_main$l,
344
+ CnDeleteDialog: __sfc_main$m,
345
+ CnCopyDialog: __sfc_main$n,
346
+ CnFormDialog: __sfc_main$o,
347
+ CnAdvancedFormDialog: __sfc_main$p,
348
+ CnContextMenu: __sfc_main$q,
349
+ CnIndexSidebar: __sfc_main$r,
350
+ CnSavedViewsControl: __sfc_main$s,
351
+ CnSavedViewPresentationDialog: __sfc_main$t,
352
+ CnSavedViewShareDialog: __sfc_main$u,
353
+ CnSaveViewDialog: __sfc_main$v,
354
+ CnConfirmDialog: __sfc_main$w,
355
+ CnQuickEditDialog: __sfc_main$x,
354
356
  },
355
357
 
356
358
  /**
@@ -594,6 +596,21 @@ var script = {
594
596
  default: () => [],
595
597
  },
596
598
 
599
+ /**
600
+ * How the board look draws the table's title column (manifest
601
+ * `config.rowTitle`): `link` (the default) underlines the title,
602
+ * `plain` draws it as bold text without an underline over a 13px muted
603
+ * secondary line. The row stays clickable. The Nextcloud look ignores
604
+ * it. Maps to CnDataTable `rowTitle`.
605
+ *
606
+ * @spec openspec/changes/screens-table-rows-parity/specs/index-list-board-look/spec.md#requirement-a-row-title-can-be-plain-text
607
+ */
608
+ rowTitle: {
609
+ type: String,
610
+ default: 'link',
611
+ validator: (value) => ['link', 'plain'].includes(value),
612
+ },
613
+
597
614
  /** Optional MDI icon name. Defaults to schema.icon when a schema is provided. */
598
615
  icon: {
599
616
  type: String,
@@ -632,7 +649,10 @@ var script = {
632
649
  * `$route.params` just like the `filter` prop. The first tab with
633
650
  * `default:true` (else index 0) is active on mount; changing tabs
634
651
  * re-fetches at page 1. Omit (or `null`) → no tab strip, behaviour
635
- * unchanged.
652
+ * unchanged. Under the board look a tab with `activeLabel` ("Pipeline:
653
+ * Sales") adds a removable chip with that text to the Active line and
654
+ * counts on the Filter badge while it is selected; removing the chip
655
+ * goes back to the default tab.
636
656
  */
637
657
  quickFilters: {
638
658
  type: Array,
@@ -1003,6 +1023,22 @@ var script = {
1003
1023
  default: null,
1004
1024
  },
1005
1025
 
1026
+ /**
1027
+ * Board look: the segments the view switch draws, e.g. `['table',
1028
+ * 'cards', 'board', 'map']` as the boards do. A listed mode the page
1029
+ * can open is an ordinary segment; one it cannot (no board columns, no
1030
+ * map configured) is drawn disabled, named "<mode>: not available on
1031
+ * this list". Fed from `pages[].config.viewSwitch`. Ignored without the
1032
+ * board look, and absent the switch is as before.
1033
+ *
1034
+ * @type {Array<'table' | 'cards' | 'board' | 'map'>}
1035
+ * @spec openspec/changes/screens-view-switch-parity/specs/view-switch-board-look/spec.md#requirement-the-manifest-can-draw-segments-the-page-cannot-open
1036
+ */
1037
+ viewSwitch: {
1038
+ type: Array,
1039
+ default: null,
1040
+ },
1041
+
1006
1042
  /**
1007
1043
  * The board's configuration, mirroring the manifest `config.board`
1008
1044
  * block: `{ statusField, cardFields, swimlaneField }`. The board is
@@ -1689,6 +1725,35 @@ var script = {
1689
1725
  default: null,
1690
1726
  },
1691
1727
 
1728
+ /**
1729
+ * KPI tiles above the list (manifest `config.statRow`): dashboard
1730
+ * widget definitions `{ id, type, title?, content }`, usually `stat`,
1731
+ * drawn in an auto-fit row (each at least 200px) in the listed order.
1732
+ * Types resolve like dashboard widgets: the app registry, then the
1733
+ * dashboard catalog. Empty by default.
1734
+ *
1735
+ * @spec openspec/changes/screens-index-stat-row/specs/index-page/spec.md#requirement-an-index-page-can-draw-a-stat-row-above-the-list
1736
+ * @type {Array<object>}
1737
+ */
1738
+ statRow: {
1739
+ type: Array,
1740
+ default: () => [],
1741
+ },
1742
+
1743
+ /**
1744
+ * Cards beside the list (manifest `config.sidePanel`): dashboard
1745
+ * widget definitions `{ id, type, title?, content, headerLink? }`
1746
+ * drawn in a 300px column right of the toolbar and the list. Empty
1747
+ * by default; below 1024px the column moves above the list.
1748
+ *
1749
+ * @spec openspec/changes/screens-index-stat-row/specs/index-page/spec.md#requirement-an-index-page-can-draw-a-side-panel-beside-the-list
1750
+ * @type {Array<object>}
1751
+ */
1752
+ sidePanel: {
1753
+ type: Array,
1754
+ default: () => [],
1755
+ },
1756
+
1692
1757
  /**
1693
1758
  * Where a row carries the actions the server says this caller may run
1694
1759
  * on it: a dotted path, read off the rows the list already fetched, so
@@ -2368,6 +2433,16 @@ var script = {
2368
2433
  },
2369
2434
 
2370
2435
  computed: {
2436
+ /**
2437
+ * Whether the page draws cards beside its list (`sidePanel`).
2438
+ *
2439
+ * @spec openspec/changes/screens-index-stat-row/specs/index-page/spec.md#requirement-an-index-page-can-draw-a-side-panel-beside-the-list
2440
+ * @return {boolean}
2441
+ */
2442
+ hasSidePanel() {
2443
+ return Array.isArray(this.sidePanel) && this.sidePanel.length > 0
2444
+ },
2445
+
2371
2446
  /**
2372
2447
  * The empty-state copy run through the host translate function
2373
2448
  * (the injected `cnTranslate`, identity by default). Only this
@@ -2740,6 +2815,21 @@ var script = {
2740
2815
  return Object.keys(this.mapConfig || {}).length > 0
2741
2816
  },
2742
2817
 
2818
+ /**
2819
+ * Board look: the modes `viewSwitch` lists that this page cannot open,
2820
+ * drawn as disabled segments.
2821
+ *
2822
+ * @return {Array<string>} The disabled modes.
2823
+ * @spec openspec/changes/screens-view-switch-parity/specs/view-switch-board-look/spec.md#requirement-the-manifest-can-draw-segments-the-page-cannot-open
2824
+ */
2825
+ viewSwitchDisabledModes() {
2826
+ if (!this.isBoardLook || !Array.isArray(this.viewSwitch)) {
2827
+ return []
2828
+ }
2829
+ const offered = [...this.effectiveToggleModes, ...(this.showMapSegment ? ['map'] : [])];
2830
+ return this.viewSwitch.filter((mode) => ['table', 'cards', 'board', 'map'].includes(mode) && !offered.includes(mode))
2831
+ },
2832
+
2743
2833
  /**
2744
2834
  * The base view-toggle segments (cards/table/list) passed to CnActionsBar.
2745
2835
  * Beta's explicit `viewModes` whitelist wins when set; otherwise the
@@ -4309,11 +4399,11 @@ var script = {
4309
4399
  return []
4310
4400
  }
4311
4401
  const props = this.effectiveSchema?.properties || {};
4312
- const chips = [];
4402
+ const chips = [...this.quickFilterActiveChips];
4313
4403
  for (const [key, raw] of Object.entries(this.effectiveActiveFilters || {})) {
4314
4404
  const values = (Array.isArray(raw) ? raw : [raw])
4315
4405
  .filter((value) => value !== null && value !== undefined && value !== '')
4316
- .map((value) => String(value));
4406
+ .map((value) => this.activeFilterValueLabel(key, value));
4317
4407
  if (values.length === 0) {
4318
4408
  continue
4319
4409
  }
@@ -4323,6 +4413,87 @@ var script = {
4323
4413
  return chips
4324
4414
  },
4325
4415
 
4416
+ /**
4417
+ * The Active line's chips for the selected quick filters: one per
4418
+ * selected tab that declares an `activeLabel` ("Pipeline: Sales"), run
4419
+ * through the app's translate. A tab without one (an "All" tab) adds no
4420
+ * chip. The chip carries the tab's index so removing it can deselect it.
4421
+ *
4422
+ * @spec openspec/changes/screens-active-filter-line-parity/specs/active-filter-line-board-look/spec.md#requirement-a-quick-filter-with-an-active-label-joins-the-active-line
4423
+ * @return {Array<{key: string, label: string, quickFilterIndex: number}>}
4424
+ */
4425
+ quickFilterActiveChips() {
4426
+ const tabs = this.tabStripEntries || [];
4427
+ if (tabs.length === 0) {
4428
+ return []
4429
+ }
4430
+ const indices = this.quickFilterMultiple
4431
+ ? (this.selectedQuickFilterIndices || [])
4432
+ : [this.activeQuickFilterIndex];
4433
+ return indices
4434
+ .filter((index) => typeof index === 'number' && tabs[index] && typeof tabs[index].activeLabel === 'string' && tabs[index].activeLabel !== '')
4435
+ .map((index) => ({ key: `quick-filter:${index}`, label: this.cnTranslate(tabs[index].activeLabel), quickFilterIndex: index }))
4436
+ },
4437
+
4438
+ /**
4439
+ * Filter keys over a reference property that the Active line must name,
4440
+ * and that no reference column resolves already: one spec each, with the
4441
+ * referenced register and schema off the page schema's `$ref`.
4442
+ *
4443
+ * @spec openspec/changes/screens-active-filter-line-parity/specs/active-filter-line-board-look/spec.md#requirement-an-active-chip-names-the-value-not-its-id
4444
+ * @return {Array<{key: string, labelField: string, register: string, schema: string}>}
4445
+ */
4446
+ activeFilterRefSpecs() {
4447
+ if (!this.isBoardLook || !this.effectiveSchema) {
4448
+ return []
4449
+ }
4450
+ const keys = Object.keys(this.effectiveActiveFilters || {});
4451
+ if (keys.length === 0) {
4452
+ return []
4453
+ }
4454
+ const covered = new Set(this.refLabelSpecs.map((spec) => spec.key));
4455
+ const fields = fieldsFromSchema(this.effectiveSchema, { includeReadOnly: true });
4456
+ const specs = [];
4457
+ for (const key of keys) {
4458
+ if (covered.has(key)) {
4459
+ continue
4460
+ }
4461
+ const field = fields.find((f) => f.key === key);
4462
+ const ref = field && field.reference;
4463
+ if (!ref || ref.schema === undefined || ref.schema === null) {
4464
+ continue
4465
+ }
4466
+ specs.push({
4467
+ key,
4468
+ labelField: '',
4469
+ register: ref.register || (typeof this.register === 'string' ? this.register : ''),
4470
+ schema: String(ref.schema),
4471
+ });
4472
+ }
4473
+ return specs
4474
+ },
4475
+
4476
+ /**
4477
+ * The ids each active reference filter holds, per filter key, for the
4478
+ * label lookup of the Active line.
4479
+ *
4480
+ * @return {{[key: string]: string[]}} Distinct ids per filter key.
4481
+ */
4482
+ activeFilterRefIds() {
4483
+ const out = {};
4484
+ const keys = new Set([...this.refLabelSpecs, ...this.activeFilterRefSpecs].map((spec) => spec.key));
4485
+ for (const [key, raw] of Object.entries(this.effectiveActiveFilters || {})) {
4486
+ if (!keys.has(key)) {
4487
+ continue
4488
+ }
4489
+ out[key] = (Array.isArray(raw) ? raw : [raw])
4490
+ .filter((id) => id !== null && id !== undefined && id !== '' && typeof id !== 'object')
4491
+ .map((id) => String(id))
4492
+ .sort();
4493
+ }
4494
+ return out
4495
+ },
4496
+
4326
4497
  /**
4327
4498
  * The plural the board bulk band names: "With the selected cases".
4328
4499
  * The schema's `titlePlural` (or `plural`), else the lower-cased
@@ -4405,6 +4576,7 @@ var script = {
4405
4576
  * filled in when one is known, else `description`.
4406
4577
  *
4407
4578
  * @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-an-index-page-title-is-a-manifest-key
4579
+ * @spec openspec/changes/screens-table-footer-and-system-dates-parity/specs/index-list-board-look/spec.md#requirement-the-count-reads-in-the-users-language
4408
4580
  * @return {string}
4409
4581
  */
4410
4582
  headerDescription() {
@@ -4412,9 +4584,16 @@ var script = {
4412
4584
  // Board look: the count line is a template over the rows on this page
4413
4585
  // and all rows, "{shown} of {total}" unless the page says otherwise.
4414
4586
  if (this.isBoardLook && typeof total === 'number' && total >= 0) {
4415
- const template = this.countText || this.countSubtitle || '{shown} of {total}';
4587
+ const shown = this.effectiveObjects.length;
4588
+ // The default count line is the library's own string, so it
4589
+ // reads "14 van 14" in Dutch; a page's own template goes
4590
+ // through the app's label lookup.
4591
+ if (!this.countText && !this.countSubtitle) {
4592
+ return translate('nextcloud-vue', '{shown} of {total}', { shown, total })
4593
+ }
4594
+ const template = this.countText || this.countSubtitle;
4416
4595
  return this.cnTranslate(template)
4417
- .replace('{shown}', String(this.effectiveObjects.length))
4596
+ .replace('{shown}', String(shown))
4418
4597
  .replace('{total}', String(total))
4419
4598
  }
4420
4599
  if (this.countSubtitle && typeof total === 'number' && total >= 0) {
@@ -4595,6 +4774,14 @@ var script = {
4595
4774
  },
4596
4775
  },
4597
4776
 
4777
+ // The Active line names a referenced value, not its id.
4778
+ activeFilterRefIds: {
4779
+ deep: true,
4780
+ handler() {
4781
+ this.loadRefLabels();
4782
+ },
4783
+ },
4784
+
4598
4785
  countRequestKey: {
4599
4786
  immediate: true,
4600
4787
  /** @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views */
@@ -4863,7 +5050,7 @@ var script = {
4863
5050
  * @spec openspec/changes/index-ref-column-labels/tasks.md#task-2
4864
5051
  */
4865
5052
  async loadRefLabels() {
4866
- const specs = this.refLabelSpecs;
5053
+ const specs = [...this.refLabelSpecs, ...this.activeFilterRefSpecs];
4867
5054
  if (specs.length === 0) {
4868
5055
  return
4869
5056
  }
@@ -4878,7 +5065,8 @@ var script = {
4878
5065
  }
4879
5066
  await Promise.all(specs.map(async (spec) => {
4880
5067
  const known = this.refLabels[spec.key] || {};
4881
- const ids = (this.refLabelIds[spec.key] || []).filter((id) => !Object.hasOwn(known, id));
5068
+ const wanted = new Set([...(this.refLabelIds[spec.key] || []), ...(this.activeFilterRefIds[spec.key] || [])]);
5069
+ const ids = [...wanted].filter((id) => !Object.hasOwn(known, id));
4882
5070
  if (ids.length === 0) {
4883
5071
  return
4884
5072
  }
@@ -5562,6 +5750,11 @@ var script = {
5562
5750
  * @return {void}
5563
5751
  */
5564
5752
  onClearFilters() {
5753
+ // "Clear all" on the Active line also undoes the quick filters it
5754
+ // listed (a tab without an `activeLabel` is not a filter there).
5755
+ for (const chip of this.quickFilterActiveChips) {
5756
+ this.deselectQuickFilterChip(chip.quickFilterIndex);
5757
+ }
5565
5758
  // Clearing the view brings the person's own columns back.
5566
5759
  this.appliedViewColumns = null;
5567
5760
  this.appliedSavedViewId = '';
@@ -5652,11 +5845,74 @@ var script = {
5652
5845
  * @spec openspec/changes/screens-index-list-parity/specs/index-list-board-look/spec.md#requirement-the-toolbar-sits-on-the-ground-in-two-rows
5653
5846
  */
5654
5847
  onRemoveActiveFilter(chip) {
5848
+ if (chip && typeof chip.quickFilterIndex === 'number') {
5849
+ this.deselectQuickFilterChip(chip.quickFilterIndex);
5850
+ return
5851
+ }
5655
5852
  if (chip && typeof chip.key === 'string') {
5656
5853
  this.onFilterEvent({ key: chip.key, values: [] });
5657
5854
  }
5658
5855
  },
5659
5856
 
5857
+ /**
5858
+ * Undo a quick filter from the Active line. With several tabs selectable
5859
+ * the tab leaves the selection; with one, the page goes back to its
5860
+ * default tab when that tab names no active filter itself, and else to no
5861
+ * tab at all, so the chip does not come straight back.
5862
+ *
5863
+ * @param {number} index The tab index the chip stands for.
5864
+ * @return {void}
5865
+ * @spec openspec/changes/screens-active-filter-line-parity/specs/active-filter-line-board-look/spec.md#requirement-a-quick-filter-with-an-active-label-joins-the-active-line
5866
+ */
5867
+ deselectQuickFilterChip(index) {
5868
+ if (this.quickFilterMultiple) {
5869
+ this.onQuickFilterMultiChange((this.selectedQuickFilterIndices || []).filter((i) => i !== index));
5870
+ return
5871
+ }
5872
+ if (this.activeQuickFilterIndex !== index) {
5873
+ return
5874
+ }
5875
+ const tabs = this.tabStripEntries || [];
5876
+ let fallback = tabs.findIndex((tab) => tab && tab.default === true);
5877
+ if (fallback < 0 && tabs.length > 0) {
5878
+ fallback = 0;
5879
+ }
5880
+ const fallbackNamed = fallback >= 0 && typeof tabs[fallback].activeLabel === 'string' && tabs[fallback].activeLabel !== '';
5881
+ this.onQuickFilterChange(fallback >= 0 && fallback !== index && !fallbackNamed ? fallback : null);
5882
+ },
5883
+
5884
+ /**
5885
+ * The text an Active chip shows for one filter value: the referenced
5886
+ * object's label, the facet bucket's label, the schema's `oneOf` title,
5887
+ * else the value itself.
5888
+ *
5889
+ * @param {string} key The filter key.
5890
+ * @param {unknown} value One value of that filter.
5891
+ * @return {string} The label.
5892
+ * @spec openspec/changes/screens-active-filter-line-parity/specs/active-filter-line-board-look/spec.md#requirement-an-active-chip-names-the-value-not-its-id
5893
+ */
5894
+ activeFilterValueLabel(key, value) {
5895
+ const id = String(value);
5896
+ const refs = this.refLabels[key];
5897
+ if (refs && typeof refs[id] === 'string' && refs[id] !== '') {
5898
+ return refs[id]
5899
+ }
5900
+ const facet = this.effectiveFacetData && this.effectiveFacetData[key];
5901
+ const bucket = facet && Array.isArray(facet.values)
5902
+ ? facet.values.find((fv) => fv && typeof fv === 'object' && String(fv.value) === id)
5903
+ : null;
5904
+ if (bucket && typeof bucket.label === 'string' && bucket.label !== '') {
5905
+ return this.cnTranslate(bucket.label)
5906
+ }
5907
+ const prop = this.effectiveSchema?.properties?.[key];
5908
+ const options = prop && Array.isArray(prop.oneOf) ? prop.oneOf : [];
5909
+ const option = options.find((o) => o && String(o.const) === id && typeof o.title === 'string');
5910
+ if (option) {
5911
+ return this.cnTranslate(option.title)
5912
+ }
5913
+ return id
5914
+ },
5915
+
5660
5916
  /**
5661
5917
  * A header filter was applied or cleared. One column can own several
5662
5918
  * query parameters (a range is `key[gte]` and `key[lte]`), so they are
@@ -6351,7 +6607,7 @@ var script = {
6351
6607
  this.cnIndexSidebarConfig.value = {
6352
6608
  // markRaw: the holder is CnAppRoot `data()`, so it is deeply
6353
6609
  // reactive and would proxy the component definition itself.
6354
- component: markRaw(__sfc_main$q),
6610
+ component: markRaw(__sfc_main$r),
6355
6611
  props: this.hoistedSidebarProps,
6356
6612
  listeners: {
6357
6613
  'update:open': (val) => {