@conduction/nextcloud-vue 2.105.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 (153) hide show
  1. package/dist/esm/components/CnCardGrid/CnCardGrid.vue.js +1 -1
  2. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +18 -0
  3. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  4. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js +3 -1
  5. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  6. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  7. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +18 -0
  8. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  9. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +1 -1
  10. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  11. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +53 -4
  12. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  13. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  14. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +9 -0
  15. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js.map +1 -0
  16. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js +24 -0
  17. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -0
  18. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js +49 -0
  19. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -0
  20. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  21. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +36 -18
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  23. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +17 -38
  24. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  25. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  26. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  27. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  28. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  29. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +53 -2
  30. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  31. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +119 -111
  32. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  33. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue.js +1 -1
  34. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +62 -1
  35. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +159 -50
  38. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  39. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +121 -98
  40. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +1 -1
  42. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +24 -0
  43. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -1
  44. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +20 -4
  45. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -1
  46. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +22 -4
  47. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  48. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +112 -1
  49. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  50. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +100 -44
  51. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  52. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue.js +1 -1
  53. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js +67 -4
  54. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js.map +1 -1
  55. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js +1 -1
  56. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnObjectCard/CnObjectCard.vue.js +1 -1
  58. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +295 -12
  59. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  60. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +267 -144
  61. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  62. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  63. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +4 -0
  64. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  65. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +3 -1
  66. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  67. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  68. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +93 -1
  69. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  70. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +322 -246
  71. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  72. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue.js +1 -1
  73. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +122 -7
  74. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  75. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js +189 -93
  76. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  77. package/dist/esm/components/CnTabs/CnTabs.vue.js +1 -1
  78. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  79. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  80. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  81. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +42 -0
  82. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  83. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +38 -19
  84. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  85. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js +9 -0
  86. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js.map +1 -0
  87. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js +258 -0
  88. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js.map +1 -0
  89. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js +69 -0
  90. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js.map +1 -0
  91. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  92. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  93. package/dist/esm/index.js +1 -0
  94. package/dist/esm/index.js.map +1 -1
  95. package/dist/esm/l10n/en.json.js +21 -1
  96. package/dist/esm/l10n/en.json.js.map +1 -1
  97. package/dist/esm/l10n/nl.json.js +21 -1
  98. package/dist/esm/l10n/nl.json.js.map +1 -1
  99. package/dist/esm/library-style.js +1 -1
  100. package/dist/esm/nextcloud-vue.css +803 -453
  101. package/dist/esm/utils/dueText.js +18 -3
  102. package/dist/esm/utils/dueText.js.map +1 -1
  103. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  104. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  105. package/dist/esm/utils/sortOrder.js +11 -1
  106. package/dist/esm/utils/sortOrder.js.map +1 -1
  107. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  108. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  109. package/dist/nextcloud-vue.cjs.js +8281 -6350
  110. package/dist/nextcloud-vue.cjs.js.map +2 -2
  111. package/dist/nextcloud-vue.css +803 -453
  112. package/l10n/en.json +21 -1
  113. package/l10n/nl.json +21 -1
  114. package/package.json +1 -1
  115. package/src/components/CnCardGrid/CnCardGrid.md +2 -0
  116. package/src/components/CnCardGrid/CnCardGrid.vue +20 -0
  117. package/src/components/CnCellRenderer/CnCellRenderer.vue +19 -1
  118. package/src/components/CnDetailPage/CnDetailPage.md +2 -2
  119. package/src/components/CnDetailPage/CnDetailPage.vue +53 -4
  120. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +60 -0
  121. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +36 -29
  122. package/src/components/CnFactsWidget/CnFactsWidget.vue +4 -0
  123. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +70 -4
  124. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +62 -1
  125. package/src/components/CnIndexPage/CnIndexPage.md +7 -5
  126. package/src/components/CnIndexPage/CnIndexPage.vue +187 -58
  127. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +36 -1
  128. package/src/components/CnIndexPage/useSelfFetchList.js +22 -4
  129. package/src/components/CnIndexSidebar/CnIndexSidebar.md +2 -0
  130. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +148 -1
  131. package/src/components/CnNcWidgetWidget/CnNcWidgetWidget.vue +68 -5
  132. package/src/components/CnObjectCard/CnObjectCard.md +1 -0
  133. package/src/components/CnObjectCard/CnObjectCard.vue +354 -13
  134. package/src/components/CnObjectSidebar/CnFilesTab.vue +6 -0
  135. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +190 -4
  136. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +209 -9
  137. package/src/components/CnTabs/CnTabs.vue +11 -0
  138. package/src/components/CnTabsWidget/CnTabsWidget.vue +91 -18
  139. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.md +11 -0
  140. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue +382 -0
  141. package/src/components/CnTeamWorkloadWidget/index.js +14 -0
  142. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  143. package/src/components/index.js +1 -0
  144. package/src/css/index-page.css +14 -2
  145. package/src/css/look-board-detail.css +48 -4
  146. package/src/css/look-board-index.css +64 -2
  147. package/src/css/look-board.css +25 -2
  148. package/src/index.js +1 -1
  149. package/src/schemas/app-manifest-v2.schema.json +75 -6
  150. package/src/utils/dueText.js +18 -3
  151. package/src/utils/libraryWidgetKeys.js +1 -0
  152. package/src/utils/sortOrder.js +10 -0
  153. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -30,6 +30,7 @@ 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';
@@ -56,7 +57,7 @@ import { DEFAULT_ROW_INDICATOR_CAP } from '../../utils/rowIndicators.js';
56
57
  import { viewMatchesScope, extractViewState, buildRouteQueryFromViewState, extractViewStateFromRouteQuery, buildViewCreatePayload, savedViewScope, normalizeSharedWith } from '../../utils/savedViewHelpers.js';
57
58
  import { fieldsFromSchema, columnsFromSchema } from '../../utils/schema.js';
58
59
  import { resolveScopeLayout, resolveScopePresentation } from '../../utils/scopeListLayout.js';
59
- import { sameSortKeys, orderToSortKeys } from '../../utils/sortOrder.js';
60
+ import { orderToSortKeys } from '../../utils/sortOrder.js';
60
61
  import { dispatchObjectCreated } from '../../utils/walkthroughSignals.js';
61
62
  import __sfc_main$7 from '../CnActionButtons/CnActionButtons.vue.js';
62
63
  import __sfc_main$8 from '../CnActionsBar/CnActionsBar.vue.js';
@@ -98,7 +99,7 @@ import { reconcilePersonalColumns, orderColumns, personalColumnsKey } from './pe
98
99
  import { createSelfModeActions, resolveRowTarget } from './selfModeActions.js';
99
100
  import { applyRowPatches, splitLayoutFor, normalisePaneWidth, rowIdOf } from './splitView.js';
100
101
  import { useNamedSource } from './useNamedSource.js';
101
- import { useSelfFetchList, BOARD_PAGE_SIZE } from './useSelfFetchList.js';
102
+ import { useSelfFetchList, resolveInitialQuickFilterIndex, BOARD_PAGE_SIZE } from './useSelfFetchList.js';
102
103
  import { useContextMenu } from '../../composables/useContextMenu.js';
103
104
 
104
105
  /** Rows fetched for one month in calendar mode. */
@@ -683,6 +684,20 @@ var script = {
683
684
  default: null,
684
685
  },
685
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
+
686
701
  /**
687
702
  * Gives each card in the card view a status accent: a colored start
688
703
  * border and icon. See CnObjectCard `accent`.
@@ -906,13 +921,15 @@ var script = {
906
921
  * the Filter button and the view switch, in whatever width that row has
907
922
  * beside a side panel (DqTeamwachtrij): the chips take the room the
908
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.
909
926
  *
910
- * @type {''|'toolbar'}
927
+ * @type {''|'toolbar'|'row'}
911
928
  */
912
929
  quickFilterPlacement: {
913
930
  type: String,
914
931
  default: '',
915
- validator: (v) => ['', 'toolbar'].includes(v),
932
+ validator: (v) => ['', 'toolbar', 'row'].includes(v),
916
933
  },
917
934
 
918
935
  /**
@@ -1946,9 +1963,11 @@ var script = {
1946
1963
  },
1947
1964
 
1948
1965
  /**
1949
- * Show a standalone sort dropdown in the actions bar (for card/list
1950
- * views without sortable headers). Emits `@sort-change` with the value.
1951
- * 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
1952
1971
  */
1953
1972
  showSortSelect: {
1954
1973
  type: Boolean,
@@ -1956,7 +1975,11 @@ var script = {
1956
1975
  },
1957
1976
 
1958
1977
  /**
1959
- * 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.
1960
1983
  *
1961
1984
  * @type {Array<{ value: string, label: string }>}
1962
1985
  */
@@ -1966,8 +1989,10 @@ var script = {
1966
1989
  },
1967
1990
 
1968
1991
  /**
1969
- * Selected value of the standalone sort dropdown. Empty lets a
1970
- * 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
1971
1996
  */
1972
1997
  sortSelectValue: {
1973
1998
  type: String,
@@ -2020,6 +2045,9 @@ var script = {
2020
2045
  * defaults to `field`).
2021
2046
  * - `folders` — explicit folder list for `source:'custom'`.
2022
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.
2023
2051
  * - `pane` — `false` draws no pane: the scope still comes from the
2024
2052
  * deep-link filter (`?caseType=<id>`) and still applies its look, as
2025
2053
  * a list narrowed to one case type does without a folder column.
@@ -3751,22 +3779,45 @@ var script = {
3751
3779
  },
3752
3780
 
3753
3781
  /**
3754
- * The sort select's shown value: `sortSelectValue` when the host
3755
- * controls it, else on a self-fetch page the option whose order is the
3756
- * 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.
3757
3784
  *
3758
- * @return {string} The option value, or '' when none matches.
3785
+ * @return {Array<{key: string, order: string}>} The order.
3759
3786
  */
3760
- effectiveSortSelectValue() {
3761
- if (this.sortSelectValue) {
3762
- return this.sortSelectValue
3787
+ currentSortKeys() {
3788
+ if (this.isSelfFetchMode && this.list && this.list.sortKeys) {
3789
+ return this.list.sortKeys.value || []
3763
3790
  }
3764
- if (!this.isSelfFetchMode || !this.list || !this.list.sortKeys) {
3765
- return ''
3791
+ if (Array.isArray(this.sortKeys) && this.sortKeys.length > 0) {
3792
+ return this.sortKeys
3766
3793
  }
3767
- const current = this.list.sortKeys.value || [];
3768
- const match = (this.sortSelectOptions || []).find((o) => o && sameSortKeys(this.sortSelectKeys(o), current));
3769
- return match ? match.value : ''
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)
3817
+ }
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' }] }))
3770
3821
  },
3771
3822
 
3772
3823
  /**
@@ -3798,7 +3849,7 @@ var script = {
3798
3849
  * @spec openspec/changes/index-columns-per-scope/specs/index-page/spec.md
3799
3850
  */
3800
3851
  activeScopeLayout() {
3801
- if (!this.folderSidebar) {
3852
+ if (!this.folderSidebar || !this.scopeShapesView) {
3802
3853
  return { columns: null, sortKeys: [], searchFields: [] }
3803
3854
  }
3804
3855
  return resolveScopeLayout({
@@ -3808,6 +3859,23 @@ var script = {
3808
3859
  })
3809
3860
  },
3810
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
+
3811
3879
  /**
3812
3880
  * This page's own value of each presentation key, which a query preset
3813
3881
  * may have set: what `presented()` falls back to without a scope.
@@ -3842,7 +3910,7 @@ var script = {
3842
3910
  * @spec openspec/changes/index-scope-presentation/specs/index-page/spec.md#requirement-a-preset-or-a-scope-sets-the-list-s-presentation
3843
3911
  */
3844
3912
  activeScopePresentation() {
3845
- if (!this.folderSidebar) {
3913
+ if (!this.folderSidebar || !this.scopeShapesView) {
3846
3914
  return {}
3847
3915
  }
3848
3916
  return resolveScopePresentation({ scope: this.activeScope, row: this.activeScopeRow })
@@ -4084,6 +4152,20 @@ var script = {
4084
4152
  * @return {(Array<object>|null)} The tabs.
4085
4153
  * @spec openspec/changes/working-list-row-actions/specs/index-page/spec.md
4086
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
+
4087
4169
  tabStripEntries() {
4088
4170
  if (this.lensTabs.length > 0) {
4089
4171
  return this.lensTabs
@@ -4310,6 +4392,22 @@ var script = {
4310
4392
  return specs
4311
4393
  },
4312
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
+
4313
4411
  /**
4314
4412
  * The property keys the board look's card facts show: the page's
4315
4413
  * `cardFields`, else the first four list columns. Null without the
@@ -5159,8 +5257,11 @@ var script = {
5159
5257
 
5160
5258
  const present = new Set(cols.map((c) => (typeof c === 'string' ? c : c.key)));
5161
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 : '';
5162
5263
  visible.forEach((key) => {
5163
- if (present.has(key)) {
5264
+ if (present.has(key) || key === scopeField) {
5164
5265
  return
5165
5266
  }
5166
5267
  const def = byKey.get(key);
@@ -5635,6 +5736,28 @@ var script = {
5635
5736
  return count > 0 ? `${name}, ${translate('nextcloud-vue', '{count} active', { count })}` : name
5636
5737
  },
5637
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
+
5638
5761
  /**
5639
5762
  * The active filters as chips for the board toolbar's second row, one
5640
5763
  * per filter: "Team: Woo". A filter with no value is not active.
@@ -6038,6 +6161,8 @@ var script = {
6038
6161
  showMetadata: this.resolvedSidebar.showMetadata !== false,
6039
6162
  personalColumns: this.personalColumns,
6040
6163
  pinnedCount: this.pinnedColumnCount,
6164
+ sortOptions: this.sidebarSortOptions,
6165
+ currentSort: this.currentSortKeys,
6041
6166
  ...this.sidebarSearchProps,
6042
6167
  }
6043
6168
  },
@@ -7510,35 +7635,18 @@ var script = {
7510
7635
  },
7511
7636
 
7512
7637
  /**
7513
- * The sort keys a sort-select option stands for: its `order` (any
7514
- * `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.
7515
7641
  *
7516
- * @param {object} option A `sortSelectOptions` entry.
7517
- * @return {Array<{key: string, order: string}>} The sort keys.
7518
- */
7519
- sortSelectKeys(option) {
7520
- if (!option) {
7521
- return []
7522
- }
7523
- return orderToSortKeys(option.order !== undefined ? option.order : option.value)
7524
- },
7525
-
7526
- /**
7527
- * A choice in the sort select. On a self-fetch page it orders the list
7528
- * as a header click does (`_order`, kept in the address); every page
7529
- * also emits `sort-change` with the value.
7530
- *
7531
- * @param {string} value The chosen option's value.
7642
+ * @param {Array<{key: string, order: string}>} keys The chosen order.
7532
7643
  * @return {void}
7533
7644
  */
7534
- onSortSelectChange(value) {
7535
- const option = (this.sortSelectOptions || []).find((o) => o && o.value === value);
7536
- const keys = this.sortSelectKeys(option);
7537
- if (option && keys.length > 0 && this.isSelfFetchMode && typeof this.list.onSort === 'function') {
7538
- this.list.onSort({ key: keys[0].key, order: keys[0].order, keys });
7539
- this.persistViewStateToRoute(this.currentViewState());
7645
+ onSidebarSortChange(keys) {
7646
+ if (!Array.isArray(keys) || keys.length === 0) {
7647
+ return
7540
7648
  }
7541
- this.$emit('sort-change', value);
7649
+ this.onSortEvent({ key: keys[0].key, order: keys[0].order, keys });
7542
7650
  },
7543
7651
 
7544
7652
  /**
@@ -8726,6 +8834,7 @@ var script = {
8726
8834
  'columns-reset': () => this.onColumnsReset(),
8727
8835
  'filter-change': (event) => this.onFilterEvent(event),
8728
8836
  'clear-filters': () => this.onClearFilters(),
8837
+ 'sort-change': (keys) => this.onSidebarSortChange(keys),
8729
8838
  },
8730
8839
  };
8731
8840
  },