@conduction/nextcloud-vue 2.100.0 → 2.102.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 (168) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +22 -0
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +8 -6
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  5. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  6. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +29 -4
  7. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  8. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js +9 -1
  9. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  10. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue.js +1 -1
  11. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js +22 -1
  12. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
  13. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js +26 -16
  14. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
  15. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  16. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +70 -6
  17. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  18. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +105 -74
  19. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  20. package/dist/esm/components/CnExportsWidget/CnExportsWidget.vue.js +9 -0
  21. package/dist/esm/components/CnExportsWidget/CnExportsWidget.vue.js.map +1 -0
  22. package/dist/esm/components/CnExportsWidget/CnExportsWidget.vue2.js +139 -0
  23. package/dist/esm/components/CnExportsWidget/CnExportsWidget.vue2.js.map +1 -0
  24. package/dist/esm/components/CnExportsWidget/CnExportsWidget.vue3.js +76 -0
  25. package/dist/esm/components/CnExportsWidget/CnExportsWidget.vue3.js.map +1 -0
  26. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  27. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +160 -2
  28. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  29. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +206 -94
  30. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  31. package/dist/esm/components/CnFilesBrowser/filesReview.js +61 -0
  32. package/dist/esm/components/CnFilesBrowser/filesReview.js.map +1 -0
  33. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue.js +9 -0
  34. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue.js.map +1 -0
  35. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue2.js +279 -0
  36. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue2.js.map +1 -0
  37. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue3.js +122 -0
  38. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue3.js.map +1 -0
  39. package/dist/esm/components/CnGroupedCardsWidget/index.js +29 -0
  40. package/dist/esm/components/CnGroupedCardsWidget/index.js.map +1 -0
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +320 -74
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  43. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +323 -213
  44. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  45. package/dist/esm/components/CnIndexPage/useNamedSource.js +30 -3
  46. package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
  47. package/dist/esm/components/CnMapWidget/CnMapWidget.vue.js +1 -1
  48. package/dist/esm/components/CnMapWidget/CnMapWidget.vue2.js +15 -0
  49. package/dist/esm/components/CnMapWidget/CnMapWidget.vue2.js.map +1 -1
  50. package/dist/esm/components/CnMapWidget/CnMapWidget.vue3.js.map +1 -1
  51. package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue.js +1 -1
  52. package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue2.js +25 -1
  53. package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue2.js.map +1 -1
  54. package/dist/esm/components/CnMenuWidget/CnMenuWidget.vue3.js.map +1 -1
  55. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
  56. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +14 -1
  57. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  58. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +14 -6
  59. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  60. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  61. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +10 -0
  62. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  63. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +6 -1
  64. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  65. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js +1 -1
  66. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js +91 -4
  67. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js.map +1 -1
  68. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js +63 -38
  69. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js.map +1 -1
  70. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue.js +1 -1
  71. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +106 -4
  72. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  73. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +70 -25
  74. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  75. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue.js +9 -0
  76. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue.js.map +1 -0
  77. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue2.js +175 -0
  78. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue2.js.map +1 -0
  79. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue3.js +77 -0
  80. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue3.js.map +1 -0
  81. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue.js +1 -1
  82. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +35 -2
  83. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  84. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  85. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +4 -0
  86. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  87. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  88. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  89. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
  90. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +2 -23
  91. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  92. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  93. package/dist/esm/composables/indexSources.js +176 -20
  94. package/dist/esm/composables/indexSources.js.map +1 -1
  95. package/dist/esm/composables/useEndpointSource.js +28 -6
  96. package/dist/esm/composables/useEndpointSource.js.map +1 -1
  97. package/dist/esm/index.js +1 -0
  98. package/dist/esm/index.js.map +1 -1
  99. package/dist/esm/l10n/en.json.js +41 -1
  100. package/dist/esm/l10n/en.json.js.map +1 -1
  101. package/dist/esm/l10n/nl.json.js +39 -1
  102. package/dist/esm/l10n/nl.json.js.map +1 -1
  103. package/dist/esm/library-style.js +1 -1
  104. package/dist/esm/nextcloud-vue.css +939 -376
  105. package/dist/esm/utils/builtInFormatters.js +24 -4
  106. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  107. package/dist/esm/utils/languageMapText.js +50 -0
  108. package/dist/esm/utils/languageMapText.js.map +1 -0
  109. package/dist/esm/utils/libraryWidgetKeys.js +3 -0
  110. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  111. package/dist/esm/utils/mapList.js +71 -0
  112. package/dist/esm/utils/mapList.js.map +1 -0
  113. package/dist/esm/utils/rowClassRules.js +43 -0
  114. package/dist/esm/utils/rowClassRules.js.map +1 -0
  115. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  116. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  117. package/dist/esm/utils/visibleWhen.js +19 -2
  118. package/dist/esm/utils/visibleWhen.js.map +1 -1
  119. package/dist/nextcloud-vue.cjs.js +9681 -7136
  120. package/dist/nextcloud-vue.cjs.js.map +2 -2
  121. package/dist/nextcloud-vue.css +939 -376
  122. package/l10n/en.json +41 -1
  123. package/l10n/nl.json +39 -1
  124. package/package.json +1 -1
  125. package/src/components/CnActionsBar/CnActionsBar.md +1 -0
  126. package/src/components/CnActionsBar/CnActionsBar.vue +31 -4
  127. package/src/components/CnChartWidget/CnChartWidget.md +3 -2
  128. package/src/components/CnChartWidget/CnChartWidget.vue +42 -4
  129. package/src/components/CnChoiceCards/CnChoiceCards.md +39 -0
  130. package/src/components/CnChoiceCards/CnChoiceCards.vue +93 -16
  131. package/src/components/CnDashboardPage/CnDashboardPage.vue +110 -21
  132. package/src/components/CnExportsWidget/CnExportsWidget.vue +233 -0
  133. package/src/components/CnExportsWidget/index.js +7 -0
  134. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +324 -0
  135. package/src/components/CnFilesBrowser/filesReview.js +57 -0
  136. package/src/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue +433 -0
  137. package/src/components/CnGroupedCardsWidget/index.js +28 -0
  138. package/src/components/CnIndexPage/CnIndexPage.md +5 -1
  139. package/src/components/CnIndexPage/CnIndexPage.vue +313 -9
  140. package/src/components/CnIndexPage/useNamedSource.js +30 -3
  141. package/src/components/CnMapWidget/CnMapWidget.vue +37 -0
  142. package/src/components/CnMenuWidget/CnMenuWidget.vue +25 -1
  143. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +29 -1
  144. package/src/components/CnObjectSidebar/CnFilesTab.vue +15 -0
  145. package/src/components/CnOrderedListField/CnOrderedListField.vue +151 -5
  146. package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +1 -0
  147. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +159 -5
  148. package/src/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue +272 -0
  149. package/src/components/CnSavedViewAlertWidget/index.js +7 -0
  150. package/src/components/CnSetupWizard/CnSetupWizard.vue +35 -2
  151. package/src/components/CnWidgetGrid/builtInWidgets.js +4 -0
  152. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  153. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +2 -23
  154. package/src/components/index.js +3 -0
  155. package/src/composables/indexSources.js +175 -19
  156. package/src/composables/useEndpointSource.js +28 -6
  157. package/src/css/index-page.css +117 -0
  158. package/src/css/look-board-index.css +10 -0
  159. package/src/css/look-board.css +44 -0
  160. package/src/index.js +1 -0
  161. package/src/schemas/app-manifest-v2.schema.json +85 -3
  162. package/src/utils/builtInFormatters.js +24 -4
  163. package/src/utils/languageMapText.js +46 -0
  164. package/src/utils/libraryWidgetKeys.js +3 -0
  165. package/src/utils/mapList.js +67 -0
  166. package/src/utils/rowClassRules.js +39 -0
  167. package/src/utils/validateManifestV2.compiled.js +3 -3
  168. package/src/utils/visibleWhen.js +19 -2
@@ -14,11 +14,12 @@ import ImportIcon from 'vue-material-design-icons/Import.vue';
14
14
  import TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue';
15
15
  import Tune from 'vue-material-design-icons/Tune.vue';
16
16
  import ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue';
17
- import __sfc_main$x from '../../dialogs/CnConfirmDialog.vue.js';
18
- import __sfc_main$y from '../../dialogs/CnQuickEditDialog.vue.js';
19
- import __sfc_main$1 from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
20
- import __sfc_main$3 from '../CnEmptyContent/CnEmptyContent.vue.js';
21
- import __sfc_main$2 from '../CnFollowToggle/CnFollowToggle.vue.js';
17
+ import __sfc_main$y from '../../dialogs/CnConfirmDialog.vue.js';
18
+ import __sfc_main$z from '../../dialogs/CnQuickEditDialog.vue.js';
19
+ import __sfc_main$2 from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
20
+ import __sfc_main$4 from '../CnEmptyContent/CnEmptyContent.vue.js';
21
+ import __sfc_main$3 from '../CnFollowToggle/CnFollowToggle.vue.js';
22
+ import __sfc_main$1 from '../CnStatusBadge/CnStatusBadge.vue.js';
22
23
  import __sfc_main from './CnIndexPageWidgets.vue.js';
23
24
  import { useLook } from '../../composables/useLook.js';
24
25
  import { copyKindsOf } from '../../composables/useObjectCopy.js';
@@ -37,6 +38,7 @@ import { lensUnavailableText } from '../../utils/lensAvailability.js';
37
38
  import { isModifiedClick, openRowTarget } from '../../utils/linkNavigation.js';
38
39
  import { resolveClaimedTeams, splitViewsIntoTabs, viewAsTab, resolveClaimTokens, viewIdOf } from '../../utils/listLenses.js';
39
40
  import { LIST_SHORTCUTS, listPaletteCommands, shortcutFor } from '../../utils/listShortcuts.js';
41
+ import { mapListItems } from '../../utils/mapList.js';
40
42
  import { multiKeySort } from '../../utils/multiKeySort.js';
41
43
  import { fetchGroups } from '../../utils/nextcloudDirectory.js';
42
44
  import { OBJECTS_CHANGED_EVENT } from '../../utils/objectSignals.js';
@@ -48,43 +50,44 @@ import { resolveFilterMap } from '../../utils/routeFilters.js';
48
50
  import { DEFAULT_ROW_ACTION_FIELD, withoutViewWhenRowOpensDetail, availableRowActions, refusalReasonFor, undeclaredRowActions } from '../../utils/rowActionAvailability.js';
49
51
  import { isRowActionVisible, rowActionPayload } from '../../utils/rowActionItem.js';
50
52
  import { isNewTabClick, preventMiddleClickAutoscroll, isRowMiddleClick, isNewTabHandled, markNewTabHandled } from '../../utils/rowAuxClick.js';
53
+ import { compileRowClass } from '../../utils/rowClassRules.js';
51
54
  import { DEFAULT_ROW_INDICATOR_CAP } from '../../utils/rowIndicators.js';
52
55
  import { viewMatchesScope, extractViewState, buildRouteQueryFromViewState, extractViewStateFromRouteQuery, buildViewCreatePayload, savedViewScope, normalizeSharedWith } from '../../utils/savedViewHelpers.js';
53
56
  import { fieldsFromSchema, columnsFromSchema } from '../../utils/schema.js';
54
57
  import { resolveScopeLayout, resolveScopePresentation } from '../../utils/scopeListLayout.js';
55
58
  import { dispatchObjectCreated } from '../../utils/walkthroughSignals.js';
56
- import __sfc_main$6 from '../CnActionButtons/CnActionButtons.vue.js';
57
- import __sfc_main$7 from '../CnActionsBar/CnActionsBar.vue.js';
58
- import __sfc_main$q from '../CnAdvancedFormDialog/CnAdvancedFormDialog.vue.js';
59
+ import __sfc_main$7 from '../CnActionButtons/CnActionButtons.vue.js';
60
+ import __sfc_main$8 from '../CnActionsBar/CnActionsBar.vue.js';
61
+ import __sfc_main$r from '../CnAdvancedFormDialog/CnAdvancedFormDialog.vue.js';
59
62
  import '../CnAdvancedFormDialog/CnMetadataTab.vue.js';
60
63
  import '../CnAdvancedFormDialog/CnPropertiesTab.vue.js';
61
64
  import '../CnAdvancedFormDialog/CnPropertyValueCell.vue.js';
62
- import __sfc_main$b from '../CnBoardView/CnBoardView.vue.js';
63
- import __sfc_main$a from '../CnCardGrid/CnCardGrid.vue.js';
64
- import __sfc_main$r from '../CnContextMenu/CnContextMenu.vue.js';
65
- import __sfc_main$o from '../CnCopyDialog/CnCopyDialog.vue.js';
66
- import __sfc_main$9 from '../CnDataTable/CnDataTable.vue.js';
67
- import __sfc_main$c from '../CnDateAxisView/CnDateAxisView.vue.js';
68
- import __sfc_main$n from '../CnDeleteDialog/CnDeleteDialog.vue.js';
69
- import __sfc_main$g from '../CnFolderSidebar/CnFolderSidebar.vue.js';
70
- import __sfc_main$p from '../CnFormDialog/CnFormDialog.vue.js';
71
- import __sfc_main$8 from '../CnIcon/CnIcon.vue.js';
72
- import __sfc_main$s from '../CnIndexSidebar/CnIndexSidebar.vue.js';
73
- import __sfc_main$e from '../CnMapWidget/CnMapWidget.vue.js';
74
- import __sfc_main$k from '../CnMassCopyDialog/CnMassCopyDialog.vue.js';
75
- import __sfc_main$j from '../CnMassDeleteDialog/CnMassDeleteDialog.vue.js';
76
- import __sfc_main$l from '../CnMassExportDialog/CnMassExportDialog.vue.js';
77
- import __sfc_main$m from '../CnMassImportDialog/CnMassImportDialog.vue.js';
78
- import __sfc_main$d from '../CnObjectCalendar/CnObjectCalendar.vue.js';
79
- import __sfc_main$f from '../CnObjectList/CnObjectList.vue.js';
80
- import __sfc_main$4 from '../CnPageHeader/CnPageHeader.vue.js';
81
- import __sfc_main$h from '../CnPagination/CnPagination.vue.js';
82
- import __sfc_main$5 from '../CnQuickFilterBar/CnQuickFilterBar.vue.js';
83
- import __sfc_main$i from '../CnRowActions/CnRowActions.vue.js';
84
- import __sfc_main$u from '../CnSavedViewPresentationDialog/CnSavedViewPresentationDialog.vue.js';
85
- import __sfc_main$t from '../CnSavedViewsControl/CnSavedViewsControl.vue.js';
86
- import __sfc_main$v from '../CnSavedViewShareDialog/CnSavedViewShareDialog.vue.js';
87
- import __sfc_main$w from '../CnSaveViewDialog/CnSaveViewDialog.vue.js';
65
+ import __sfc_main$c from '../CnBoardView/CnBoardView.vue.js';
66
+ import __sfc_main$b from '../CnCardGrid/CnCardGrid.vue.js';
67
+ import __sfc_main$s from '../CnContextMenu/CnContextMenu.vue.js';
68
+ import __sfc_main$p from '../CnCopyDialog/CnCopyDialog.vue.js';
69
+ import __sfc_main$a from '../CnDataTable/CnDataTable.vue.js';
70
+ import __sfc_main$d from '../CnDateAxisView/CnDateAxisView.vue.js';
71
+ import __sfc_main$o from '../CnDeleteDialog/CnDeleteDialog.vue.js';
72
+ import __sfc_main$h from '../CnFolderSidebar/CnFolderSidebar.vue.js';
73
+ import __sfc_main$q from '../CnFormDialog/CnFormDialog.vue.js';
74
+ import __sfc_main$9 from '../CnIcon/CnIcon.vue.js';
75
+ import __sfc_main$t from '../CnIndexSidebar/CnIndexSidebar.vue.js';
76
+ import __sfc_main$f from '../CnMapWidget/CnMapWidget.vue.js';
77
+ import __sfc_main$l from '../CnMassCopyDialog/CnMassCopyDialog.vue.js';
78
+ import __sfc_main$k from '../CnMassDeleteDialog/CnMassDeleteDialog.vue.js';
79
+ import __sfc_main$m from '../CnMassExportDialog/CnMassExportDialog.vue.js';
80
+ import __sfc_main$n from '../CnMassImportDialog/CnMassImportDialog.vue.js';
81
+ import __sfc_main$e from '../CnObjectCalendar/CnObjectCalendar.vue.js';
82
+ import __sfc_main$g from '../CnObjectList/CnObjectList.vue.js';
83
+ import __sfc_main$5 from '../CnPageHeader/CnPageHeader.vue.js';
84
+ import __sfc_main$i from '../CnPagination/CnPagination.vue.js';
85
+ import __sfc_main$6 from '../CnQuickFilterBar/CnQuickFilterBar.vue.js';
86
+ import __sfc_main$j from '../CnRowActions/CnRowActions.vue.js';
87
+ import __sfc_main$v from '../CnSavedViewPresentationDialog/CnSavedViewPresentationDialog.vue.js';
88
+ import __sfc_main$u from '../CnSavedViewsControl/CnSavedViewsControl.vue.js';
89
+ import __sfc_main$w from '../CnSavedViewShareDialog/CnSavedViewShareDialog.vue.js';
90
+ import __sfc_main$x from '../CnSaveViewDialog/CnSaveViewDialog.vue.js';
88
91
  import { applyAiContext } from './aiContext.js';
89
92
  import { buildDefaultActions } from './defaultActions.js';
90
93
  import { dispatchAction } from './manifestActionDispatch.js';
@@ -326,11 +329,12 @@ var script = {
326
329
 
327
330
  components: {
328
331
  CnIndexPageWidgets: __sfc_main,
332
+ CnStatusBadge: __sfc_main$1,
329
333
  NcNoteCard,
330
- CnBuildiqEditButton: __sfc_main$1,
331
- CnFollowToggle: __sfc_main$2,
334
+ CnBuildiqEditButton: __sfc_main$2,
335
+ CnFollowToggle: __sfc_main$3,
332
336
  NcLoadingIcon,
333
- CnEmptyContent: __sfc_main$3,
337
+ CnEmptyContent: __sfc_main$4,
334
338
  NcActions,
335
339
  NcActionLink,
336
340
  NcActionButton,
@@ -347,38 +351,38 @@ var script = {
347
351
  Tune,
348
352
  ViewColumnOutline,
349
353
  NcCheckboxRadioSwitch,
350
- CnPageHeader: __sfc_main$4,
351
- CnQuickFilterBar: __sfc_main$5,
352
- CnActionButtons: __sfc_main$6,
353
- CnActionsBar: __sfc_main$7,
354
+ CnPageHeader: __sfc_main$5,
355
+ CnQuickFilterBar: __sfc_main$6,
356
+ CnActionButtons: __sfc_main$7,
357
+ CnActionsBar: __sfc_main$8,
354
358
  DotsHorizontal,
355
- CnIcon: __sfc_main$8,
356
- CnDataTable: __sfc_main$9,
357
- CnCardGrid: __sfc_main$a,
358
- CnBoardView: __sfc_main$b,
359
- CnDateAxisView: __sfc_main$c,
360
- CnObjectCalendar: __sfc_main$d,
361
- CnMapWidget: __sfc_main$e,
362
- CnObjectList: __sfc_main$f,
363
- CnFolderSidebar: __sfc_main$g,
364
- CnPagination: __sfc_main$h,
365
- CnRowActions: __sfc_main$i,
366
- CnMassDeleteDialog: __sfc_main$j,
367
- CnMassCopyDialog: __sfc_main$k,
368
- CnMassExportDialog: __sfc_main$l,
369
- CnMassImportDialog: __sfc_main$m,
370
- CnDeleteDialog: __sfc_main$n,
371
- CnCopyDialog: __sfc_main$o,
372
- CnFormDialog: __sfc_main$p,
373
- CnAdvancedFormDialog: __sfc_main$q,
374
- CnContextMenu: __sfc_main$r,
375
- CnIndexSidebar: __sfc_main$s,
376
- CnSavedViewsControl: __sfc_main$t,
377
- CnSavedViewPresentationDialog: __sfc_main$u,
378
- CnSavedViewShareDialog: __sfc_main$v,
379
- CnSaveViewDialog: __sfc_main$w,
380
- CnConfirmDialog: __sfc_main$x,
381
- CnQuickEditDialog: __sfc_main$y,
359
+ CnIcon: __sfc_main$9,
360
+ CnDataTable: __sfc_main$a,
361
+ CnCardGrid: __sfc_main$b,
362
+ CnBoardView: __sfc_main$c,
363
+ CnDateAxisView: __sfc_main$d,
364
+ CnObjectCalendar: __sfc_main$e,
365
+ CnMapWidget: __sfc_main$f,
366
+ CnObjectList: __sfc_main$g,
367
+ CnFolderSidebar: __sfc_main$h,
368
+ CnPagination: __sfc_main$i,
369
+ CnRowActions: __sfc_main$j,
370
+ CnMassDeleteDialog: __sfc_main$k,
371
+ CnMassCopyDialog: __sfc_main$l,
372
+ CnMassExportDialog: __sfc_main$m,
373
+ CnMassImportDialog: __sfc_main$n,
374
+ CnDeleteDialog: __sfc_main$o,
375
+ CnCopyDialog: __sfc_main$p,
376
+ CnFormDialog: __sfc_main$q,
377
+ CnAdvancedFormDialog: __sfc_main$r,
378
+ CnContextMenu: __sfc_main$s,
379
+ CnIndexSidebar: __sfc_main$t,
380
+ CnSavedViewsControl: __sfc_main$u,
381
+ CnSavedViewPresentationDialog: __sfc_main$v,
382
+ CnSavedViewShareDialog: __sfc_main$w,
383
+ CnSaveViewDialog: __sfc_main$x,
384
+ CnConfirmDialog: __sfc_main$y,
385
+ CnQuickEditDialog: __sfc_main$z,
382
386
  },
383
387
 
384
388
  /**
@@ -394,6 +398,29 @@ var script = {
394
398
  * Falls back to an empty object so `CnIndexPage` works standalone
395
399
  * (unit tests, isolated mount) without `CnAppRoot`.
396
400
  */
401
+ /**
402
+ * The list a side-panel widget reads (`cnIndexList`): the applied saved
403
+ * view, the list's total, and a way to hand back a view that changed
404
+ * (the saved-view alert widget). Getters, so a widget follows the page.
405
+ *
406
+ * @return {object}
407
+ */
408
+ provide() {
409
+ return {
410
+ cnIndexList: Object.defineProperties({}, {
411
+ appliedView: { enumerable: true, get: () => this.appliedSavedView },
412
+ total: {
413
+ enumerable: true,
414
+ get: () => {
415
+ const total = this.effectivePagination && this.effectivePagination.total;
416
+ return typeof total === 'number' ? total : undefined
417
+ },
418
+ },
419
+ replaceSavedView: { enumerable: true, value: (view) => this.replaceSavedView(view) },
420
+ }),
421
+ }
422
+ },
423
+
397
424
  inject: {
398
425
  cnCustomComponents: { default: () => ({}) },
399
426
  /** The permissions the user holds, provided by CnAppRoot; for gated page tabs. */
@@ -674,6 +701,17 @@ var script = {
674
701
  default: '',
675
702
  },
676
703
 
704
+ /**
705
+ * Board look: draw the bulk band before anything is selected too, its
706
+ * buttons disabled until there is a selection (DqZaken, DqWerkbord).
707
+ * Manifest key `config.bulkBandAlways`. Only when the band has an
708
+ * action to offer.
709
+ */
710
+ bulkBandAlways: {
711
+ type: Boolean,
712
+ default: false,
713
+ },
714
+
677
715
  /**
678
716
  * Board look: the 13px hint after the bulk band's buttons ("See what
679
717
  * changes first, then run it"). Manifest key `config.bulkHint`.
@@ -691,7 +729,9 @@ var script = {
691
729
  * variant?, icon?, format?, id? }`: `action` is `add` (the Add flow;
692
730
  * its label defaults to the Add label), `export` (the export leaf in
693
731
  * `format`, `csv` by default, else the export dialog), `import`,
694
- * `refresh`, or the id of a `headerActions` entry; `variant` is
732
+ * `refresh`, `save-view` (the save-current-view dialog: the board's
733
+ * "Zoekopdracht opslaan", label "Save view" by default), or the id of a
734
+ * `headerActions` entry; `variant` is
695
735
  * `primary` or `secondary` (the default). Shown only with
696
736
  * `showTitle`. When they show, the actions bar drops its Views and
697
737
  * Actions menus, and the Add button and Export menu when a button
@@ -853,6 +893,21 @@ var script = {
853
893
  default: null,
854
894
  },
855
895
 
896
+ /**
897
+ * Where the quick-filter chips sit (manifest `config.quickFilterPlacement`).
898
+ * `''` (the default) as before. `'toolbar'` keeps them on one row with
899
+ * the Filter button and the view switch, in whatever width that row has
900
+ * beside a side panel (DqTeamwachtrij): the chips take the room the
901
+ * buttons leave, and those that do not fit move into the overflow chip.
902
+ *
903
+ * @type {''|'toolbar'}
904
+ */
905
+ quickFilterPlacement: {
906
+ type: String,
907
+ default: '',
908
+ validator: (v) => ['', 'toolbar'].includes(v),
909
+ },
910
+
856
911
  /**
857
912
  * How the quick filters render: `'chips'` (pill strip, default) or
858
913
  * `'dropdown'` (a single `NcSelect`). Sourced from the manifest as
@@ -1003,6 +1058,16 @@ var script = {
1003
1058
  default: true,
1004
1059
  },
1005
1060
 
1061
+ /**
1062
+ * Draw the table without its column-header row (manifest
1063
+ * `config.hideTableHeader`), for a list the board draws as plain rows
1064
+ * (DqTeamwachtrij). Pair it with `selectable: false` for no checkboxes.
1065
+ */
1066
+ hideTableHeader: {
1067
+ type: Boolean,
1068
+ default: false,
1069
+ },
1070
+
1006
1071
  /**
1007
1072
  * When true, a row/card click emits `row-click` (to open/navigate) even
1008
1073
  * while `selectable` — selection then happens via the checkbox only.
@@ -1146,8 +1211,15 @@ var script = {
1146
1211
  * - `popupField` — object property rendered in the marker popup.
1147
1212
  * - `center` — optional `[lat, lng]` fallback centre when the filtered set
1148
1213
  * has no plottable rows.
1214
+ * - `zoom` — the map's initial zoom level.
1215
+ * - `list` — a numbered list beside the map, map and list in one card
1216
+ * (DqZakenKaart): `{ title, sub?, pills?: [{ path?, text?, map?,
1217
+ * colorMap? }], due? }`, field templates read per row. The pins carry the
1218
+ * list's numbers, the row under the pointer is marked on both, the rows
1219
+ * without a place are counted under the list with a link to the table,
1220
+ * and the page's count line adds how many are on the map.
1149
1221
  *
1150
- * @type {{ latField?: string, lngField?: string, geoField?: string, popupField?: string, center?: [number, number] }}
1222
+ * @type {{ latField?: string, lngField?: string, geoField?: string, popupField?: string, center?: [number, number], zoom?: number, list?: object }}
1151
1223
  */
1152
1224
  mapConfig: {
1153
1225
  type: Object,
@@ -1412,9 +1484,18 @@ var script = {
1412
1484
  default: 'Loading…',
1413
1485
  },
1414
1486
 
1415
- /** Function returning CSS class(es) for a row */
1487
+ /**
1488
+ * CSS class(es) for a row: a function `(row) => string`, or (manifest
1489
+ * `config.rowClass`) rules `[{ when: { field, op?, value }, class }]`,
1490
+ * each adding its class to a row whose field compares to the value
1491
+ * (the `visibleWhen` operators, `@today` included). DqTaken marks an
1492
+ * overdue task: `{ when: { field: "dueAt", op: "lt", value: "@today" },
1493
+ * class: "cn-row--overdue" }`.
1494
+ *
1495
+ * @type {((row: object) => string)|Array<{when: {field: string, op?: string, value: unknown}, class: string}>|null}
1496
+ */
1416
1497
  rowClass: {
1417
- type: Function,
1498
+ type: [Function, Array],
1418
1499
  default: null,
1419
1500
  },
1420
1501
 
@@ -2496,6 +2577,10 @@ var script = {
2496
2577
  //
2497
2578
  // Seeded from the route query so a shared link lands filtered, the
2498
2579
  // same way `_order` and a deep-link filter already do for self-fetch.
2580
+ // The page a paging named source shows: page 1 at the source config's
2581
+ // `limit` (20 by default), moved by the pager.
2582
+ const namedPageSize = Number(props.sourceConfig && props.sourceConfig.limit) > 0 ? Number(props.sourceConfig.limit) : 20;
2583
+ const namedPaging = ref({ page: 1, limit: namedPageSize });
2499
2584
  const namedActiveFilters = ref(namedFiltersFromRoute(getCurrentInstance(), props));
2500
2585
 
2501
2586
  const {
@@ -2504,7 +2589,7 @@ var script = {
2504
2589
  namedRows,
2505
2590
  namedLoading,
2506
2591
  namedQuickFilters,
2507
- } = useNamedSource(props, { activeQuickFilterIndex, activeFilters: namedActiveFilters });
2592
+ } = useNamedSource(props, { activeQuickFilterIndex, activeFilters: namedActiveFilters, paging: namedPaging });
2508
2593
 
2509
2594
  return {
2510
2595
  isBoard: isBoardLook,
@@ -2516,6 +2601,7 @@ var script = {
2516
2601
  namedLoading,
2517
2602
  namedQuickFilters,
2518
2603
  namedActiveFilters,
2604
+ namedPaging,
2519
2605
  contextMenuOpen,
2520
2606
  contextMenuRow,
2521
2607
  openContextMenu,
@@ -2563,6 +2649,8 @@ var script = {
2563
2649
  pageTabCounts: {},
2564
2650
  /** The `headerMetaCounts` totals, by name; a failed one is null. */
2565
2651
  headerMetaCountValues: {},
2652
+ /** The row the pointer is on in the map list, by key; '' for none. */
2653
+ activeMapKey: '',
2566
2654
  /** The tabs `quickFiltersFrom` produced, or null before they load. */
2567
2655
  generatedQuickFilters: null,
2568
2656
  /** Count per saved-view id, for the views control; null = none. */
@@ -3476,6 +3564,9 @@ var script = {
3476
3564
  const loaded = this.effectivePagination || {};
3477
3565
  return Number(loaded.page || 1) < Number(loaded.pages || 1)
3478
3566
  }
3567
+ if (this.isNamedSource && this.namedSource && this.namedSource.pages === true) {
3568
+ return Number(this.effectivePagination?.pages || 1) > 1
3569
+ }
3479
3570
  return Number(this.pagination?.pages || 1) > 1
3480
3571
  },
3481
3572
 
@@ -4321,6 +4412,8 @@ var script = {
4321
4412
  */
4322
4413
  mapMarkers() {
4323
4414
  const features = [];
4415
+ // With the list beside the map, a pin carries the row's number there.
4416
+ const numbers = this.mapListEnabled ? new Map(this.mapList.items.map((item) => [item.row, item.n])) : null;
4324
4417
  for (const row of this.displayObjects) {
4325
4418
  const geometry = this.resolveRowGeometry(row);
4326
4419
  if (!geometry) {
@@ -4332,6 +4425,7 @@ var script = {
4332
4425
  properties: {
4333
4426
  [this.rowKey]: row[this.rowKey],
4334
4427
  ...(this.mapConfig.popupField ? { [this.mapConfig.popupField]: row[this.mapConfig.popupField] } : {}),
4428
+ ...(numbers && numbers.has(row) ? { markerNumber: numbers.get(row), markerActive: this.activeMapKey === String(row[this.rowKey]) } : {}),
4335
4429
  },
4336
4430
  });
4337
4431
  }
@@ -4358,6 +4452,57 @@ var script = {
4358
4452
  return this.mapConfig.clustering !== false
4359
4453
  },
4360
4454
 
4455
+ /** @return {number|undefined} The map's initial zoom (`mapConfig.zoom`), when a number. */
4456
+ mapZoom() {
4457
+ const zoom = this.mapConfig && this.mapConfig.zoom;
4458
+ return typeof zoom === 'number' && Number.isFinite(zoom) ? zoom : undefined
4459
+ },
4460
+
4461
+ /** @return {boolean} Whether the map draws its numbered list (`mapConfig.list`). */
4462
+ mapListEnabled() {
4463
+ const list = this.mapConfig && this.mapConfig.list;
4464
+ return Boolean(list && typeof list === 'object' && typeof list.title === 'string' && list.title !== '')
4465
+ },
4466
+
4467
+ /**
4468
+ * The map list's entries, numbered as the pins, and the rows without a
4469
+ * place. Templates go through the host's translate first.
4470
+ *
4471
+ * @return {{items: Array<object>, missing: Array<object>}}
4472
+ */
4473
+ mapList() {
4474
+ if (!this.mapListEnabled) {
4475
+ return { items: [], missing: [] }
4476
+ }
4477
+ const list = this.mapConfig.list;
4478
+ const translated = {
4479
+ ...list,
4480
+ title: this.cnTranslate(list.title),
4481
+ sub: list.sub ? this.cnTranslate(list.sub) : '',
4482
+ due: list.due ? this.cnTranslate(list.due) : '',
4483
+ };
4484
+ return mapListItems(this.displayObjects, translated, {
4485
+ rowKey: this.rowKey,
4486
+ located: (row) => Boolean(this.resolveRowGeometry(row)),
4487
+ translate: (text) => this.cnTranslate(text),
4488
+ })
4489
+ },
4490
+
4491
+ /** @return {string} The list's accessible name. */
4492
+ mapListLabel() {
4493
+ return translate('nextcloud-vue', 'On the map')
4494
+ },
4495
+
4496
+ /** @return {string} The card under the list, for the rows without a place. */
4497
+ mapMissingTitle() {
4498
+ return translatePlural('nextcloud-vue', '%n without an address', '%n without an address', this.mapList.missing.length)
4499
+ },
4500
+
4501
+ /** @return {string} The link from that card to the table. */
4502
+ mapMissingLink() {
4503
+ return translate('nextcloud-vue', 'Show them in the table')
4504
+ },
4505
+
4361
4506
  /**
4362
4507
  * Extra (non-background) map layers — WMS / WFS / GeoJSON overlays declared in
4363
4508
  * `mapConfig.layers`. The background map comes from `mapBasemaps` instead, so
@@ -4458,9 +4603,57 @@ var script = {
4458
4603
  if (this.selfFetchFailed) {
4459
4604
  return { ...this.list.pagination.value, total: 0, page: 1, pages: 1 }
4460
4605
  }
4606
+ // A named source that reports its own total (the search source)
4607
+ // gives the count line its number.
4608
+ if (this.isNamedSource && this.namedSource && typeof this.namedSource.total === 'function') {
4609
+ const total = this.namedSource.total();
4610
+ // A source with `pages: true` gets the pager the self-fetched lists draw.
4611
+ if (this.namedSource.pages === true) {
4612
+ const { page, limit } = this.namedPaging;
4613
+ return { page, limit, total, pages: Math.max(1, Math.ceil(total / limit)) }
4614
+ }
4615
+ return { ...(this.pagination || {}), total }
4616
+ }
4461
4617
  return this.isSelfFetchMode ? this.list.pagination.value : this.pagination
4462
4618
  },
4463
4619
 
4620
+ /**
4621
+ * The saved view the page has applied, or null.
4622
+ *
4623
+ * @return {object|null}
4624
+ */
4625
+ appliedSavedView() {
4626
+ const id = this.appliedSavedViewId;
4627
+ if (!id) {
4628
+ return null
4629
+ }
4630
+ return (this.savedViews || []).find((view) => view && (String(view.id) === id || String(view.slug) === id || String(view.uuid) === id)) || null
4631
+ },
4632
+
4633
+ /**
4634
+ * The term a named source searched for, for `{term}` in the title and
4635
+ * the count line ("Zoeken: Lindelaan"), or ''.
4636
+ *
4637
+ * @return {string}
4638
+ */
4639
+ sourceTerm() {
4640
+ return this.isNamedSource && this.namedSource && typeof this.namedSource.term === 'function' ? String(this.namedSource.term() || '') : ''
4641
+ },
4642
+
4643
+ /**
4644
+ * The page title with `{term}` filled in.
4645
+ *
4646
+ * @return {string}
4647
+ */
4648
+ shownTitle() {
4649
+ const title = this.presented('title');
4650
+ // A title with the term is translated here, before the term goes in,
4651
+ // so its catalogue entry is found ("Zoeken: {term}").
4652
+ return typeof title === 'string' && title.includes('{term}')
4653
+ ? this.cnTranslate(title).replace(/\{term\}/g, this.sourceTerm)
4654
+ : title
4655
+ },
4656
+
4464
4657
  /**
4465
4658
  * Whether the table marks unread rows. The boards draw every row alike,
4466
4659
  * so under the board look only a page that offers the Unread lens
@@ -4672,6 +4865,16 @@ var script = {
4672
4865
  return (this.effectiveSchema && this.effectiveSchema.slug) || ''
4673
4866
  },
4674
4867
 
4868
+ /**
4869
+ * The row-class function the table takes: a function as given, or the
4870
+ * manifest's rules compiled.
4871
+ *
4872
+ * @return {?(row: object) => string}
4873
+ */
4874
+ compiledRowClass() {
4875
+ return compileRowClass(this.rowClass)
4876
+ },
4877
+
4675
4878
  /** @return {number} How many leading columns the person pinned (0 while a saved view's columns are applied). */
4676
4879
  pinnedColumnCount() {
4677
4880
  if (!this.personalColumns || Array.isArray(this.appliedViewColumns) || !this.personalLayout) {
@@ -5201,6 +5404,9 @@ var script = {
5201
5404
  if (label === '' && button.action === 'actions-menu') {
5202
5405
  label = translate('nextcloud-vue', 'Actions');
5203
5406
  }
5407
+ if (label === '' && button.action === 'save-view') {
5408
+ label = translate('nextcloud-vue', 'Save view');
5409
+ }
5204
5410
  return {
5205
5411
  key: String(button.id || button.action || index),
5206
5412
  label,
@@ -5528,7 +5734,23 @@ var script = {
5528
5734
  return valid.length > 0 ? JSON.stringify(valid) : ''
5529
5735
  },
5530
5736
 
5737
+ /**
5738
+ * The header's description line, and on the map with its list the
5739
+ * number of rows on the map after a middle dot ("· 5 met een adres op
5740
+ * de kaart", DqZakenKaart).
5741
+ *
5742
+ * @return {string}
5743
+ */
5531
5744
  headerDescription() {
5745
+ const base = this.headerDescriptionBase;
5746
+ if (this.currentViewMode !== 'map' || !this.mapListEnabled) {
5747
+ return base
5748
+ }
5749
+ const onMap = translatePlural('nextcloud-vue', '%n with an address on the map', '%n with an address on the map', this.mapList.items.length);
5750
+ return base ? `${base} · ${onMap}` : onMap
5751
+ },
5752
+
5753
+ headerDescriptionBase() {
5532
5754
  const total = this.effectivePagination?.total;
5533
5755
  // Board look: the count line is a template over the rows on this page
5534
5756
  // and all rows, "{shown} of {total}" unless the page says otherwise.
@@ -5549,6 +5771,7 @@ var script = {
5549
5771
  return this.cnTranslate(countText)
5550
5772
  .replace('{shown}', String(shown))
5551
5773
  .replace('{total}', String(total))
5774
+ .replace(/\{term\}/g, this.sourceTerm)
5552
5775
  }
5553
5776
  return this.countLine(this.countSubtitle, total, shown)
5554
5777
  }
@@ -6995,6 +7218,8 @@ var script = {
6995
7218
  this.showImportDialog = true;
6996
7219
  } else if (button.action === 'refresh') {
6997
7220
  this.onRefreshEvent();
7221
+ } else if (button.action === 'save-view') {
7222
+ this.showSaveViewDialog = true;
6998
7223
  } else {
6999
7224
  this.onHeaderAction({ action: button.action, id: button.action });
7000
7225
  }
@@ -7374,6 +7599,9 @@ var script = {
7374
7599
  if (this.isSelfFetchMode && typeof this.list.onPageChange === 'function') {
7375
7600
  this.list.onPageChange(page);
7376
7601
  }
7602
+ if (this.isNamedSource && this.namedSource && this.namedSource.pages === true) {
7603
+ this.namedPaging = { ...this.namedPaging, page };
7604
+ }
7377
7605
  this.$emit('page-changed', page);
7378
7606
  },
7379
7607
 
@@ -7389,6 +7617,9 @@ var script = {
7389
7617
  if (this.isSelfFetchMode && typeof this.list.onPageSizeChange === 'function') {
7390
7618
  this.list.onPageSizeChange(size);
7391
7619
  }
7620
+ if (this.isNamedSource && this.namedSource && this.namedSource.pages === true) {
7621
+ this.namedPaging = { page: 1, limit: size };
7622
+ }
7392
7623
  this.$emit('page-size-changed', size);
7393
7624
  },
7394
7625
 
@@ -8258,7 +8489,7 @@ var script = {
8258
8489
  this.cnIndexSidebarConfig.value = {
8259
8490
  // markRaw: the holder is CnAppRoot `data()`, so it is deeply
8260
8491
  // reactive and would proxy the component definition itself.
8261
- component: markRaw(__sfc_main$s),
8492
+ component: markRaw(__sfc_main$t),
8262
8493
  props: this.hoistedSidebarProps,
8263
8494
  listeners: {
8264
8495
  'update:open': (val) => {
@@ -9005,6 +9236,21 @@ var script = {
9005
9236
  }
9006
9237
  },
9007
9238
 
9239
+ /**
9240
+ * Put a saved view that changed elsewhere (its alert) back in the list,
9241
+ * matched on its id or uuid.
9242
+ *
9243
+ * @param {object} view The saved view as the server returned it.
9244
+ * @return {void}
9245
+ */
9246
+ replaceSavedView(view) {
9247
+ if (!view || typeof view !== 'object') {
9248
+ return
9249
+ }
9250
+ const same = (other) => other && ((view.id !== undefined && other.id === view.id) || (view.uuid && other.uuid === view.uuid));
9251
+ this.savedViews = (this.savedViews || []).map((other) => (same(other) ? view : other));
9252
+ },
9253
+
9008
9254
  async onSaveViewConfirm({ name, isPublic, sharedWith, presentation }) {
9009
9255
  const state = this.isSelfFetchMode
9010
9256
  ? this.currentViewState()