@conduction/nextcloud-vue 2.65.0 → 2.66.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 (61) hide show
  1. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +99 -2
  2. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  3. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +438 -383
  4. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  5. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js +9 -3
  6. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js.map +1 -1
  7. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js +1 -1
  8. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js.map +1 -1
  9. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +78 -21
  10. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  11. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +129 -96
  12. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  13. package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js +3 -1
  14. package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js.map +1 -1
  15. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +144 -4
  16. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  17. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  18. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +63 -7
  19. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  20. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +2 -1
  21. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  22. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +11 -0
  23. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
  24. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +2 -1
  25. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
  26. package/dist/esm/l10n/en.json.js +3 -0
  27. package/dist/esm/l10n/en.json.js.map +1 -1
  28. package/dist/esm/l10n/nl.json.js +3 -0
  29. package/dist/esm/l10n/nl.json.js.map +1 -1
  30. package/dist/esm/mixins/pageViews.js +400 -0
  31. package/dist/esm/mixins/pageViews.js.map +1 -0
  32. package/dist/esm/nextcloud-vue.css +18 -0
  33. package/dist/esm/utils/actionsDispatcher.js +11 -2
  34. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  35. package/dist/esm/utils/columnFilters.js +27 -3
  36. package/dist/esm/utils/columnFilters.js.map +1 -1
  37. package/dist/esm/utils/schema.js +40 -2
  38. package/dist/esm/utils/schema.js.map +1 -1
  39. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  40. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  41. package/dist/nextcloud-vue.cjs.js +1521 -596
  42. package/dist/nextcloud-vue.cjs.js.map +2 -2
  43. package/dist/nextcloud-vue.css +18 -0
  44. package/l10n/en.json +3 -0
  45. package/l10n/nl.json +3 -0
  46. package/package.json +1 -1
  47. package/src/components/CnDashboardPage/CnDashboardPage.vue +165 -8
  48. package/src/components/CnDataTable/CnColumnFilterPopover.vue +11 -5
  49. package/src/components/CnDetailPage/CnDetailPage.vue +94 -5
  50. package/src/components/CnFkResolveCell/CnFkResolveCell.vue +3 -1
  51. package/src/components/CnFormDialog/CnFormDialog.vue +144 -4
  52. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +67 -8
  53. package/src/components/CnSegmentedControl/CnSegmentedControl.md +1 -1
  54. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +12 -0
  55. package/src/css/detail-page.css +5 -0
  56. package/src/mixins/pageViews.js +396 -0
  57. package/src/schemas/app-manifest-v2.schema.json +29 -1
  58. package/src/utils/actionsDispatcher.js +11 -2
  59. package/src/utils/columnFilters.js +29 -2
  60. package/src/utils/schema.js +40 -2
  61. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -13,6 +13,7 @@ import __sfc_main$b from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
13
13
  import __sfc_main$4 from '../CnChartWidget/CnChartWidget.vue.js';
14
14
  import __sfc_main from '../CnDashboardGrid/CnDashboardGrid.vue.js';
15
15
  import __sfc_main$8 from '../CnDateRangePicker/CnDateRangePicker.vue.js';
16
+ import __sfc_main$e from '../CnSegmentedControl/CnSegmentedControl.vue.js';
16
17
  import __sfc_main$5 from '../CnStatsBlockWidget/CnStatsBlockWidget.vue.js';
17
18
  import __sfc_main$3 from '../CnTileWidget/CnTileWidget.vue.js';
18
19
  import __sfc_main$6 from '../CnWidgetRefItem/CnWidgetRefItem.vue.js';
@@ -20,6 +21,7 @@ import __sfc_main$2 from '../CnWidgetRenderer/CnWidgetRenderer.vue.js';
20
21
  import __sfc_main$1 from '../CnWidgetWrapper/CnWidgetWrapper.vue.js';
21
22
  import { useIntegrationRegistry } from '../../composables/useIntegrationRegistry.js';
22
23
  import { readUserPreference, writeUserPreference } from '../../composables/useUserPreferences.js';
24
+ import { pageViews } from '../../mixins/pageViews.js';
23
25
  import { mergeUserLayout, dashboardLayoutKey } from '../../store/plugins/dashboardLayouts.js';
24
26
  import { isAppInstalled } from '../../utils/appInstalled.js';
25
27
  import { readVisibleWhenValue, compareVisibleWhen } from '../../utils/visibleWhen.js';
@@ -175,8 +177,11 @@ var script = {
175
177
  CnBuildiqEditButton: __sfc_main$b,
176
178
  CnWidgetStyleEditorModal: __sfc_main$c,
177
179
  CnLeafMountHost: __sfc_main$d,
180
+ CnSegmentedControl: __sfc_main$e,
178
181
  },
179
182
 
183
+ mixins: [pageViews],
184
+
180
185
  inject: {
181
186
  /**
182
187
  * Buildiq in-app edit state (ADR-041), provided by CnAppRoot as a ref.
@@ -1179,6 +1184,89 @@ var script = {
1179
1184
  return this.layout.length > 0 || this.widgetRefItems.length > 0
1180
1185
  },
1181
1186
 
1187
+ /**
1188
+ * Whether the grid sections render at all: not while loading, not
1189
+ * while the widget predicates settle, not on the empty page and not
1190
+ * on a widget-ref content page.
1191
+ *
1192
+ * @return {boolean}
1193
+ * @spec openspec/changes/view-switch-containers/specs/view-switch-containers/spec.md#requirement-a-page-declares-views-that-each-hold-a-widget-grid
1194
+ */
1195
+ gridSectionsShown() {
1196
+ if (this.loading || (!this.widgetConditionsSettled && !this.gridEditable)) {
1197
+ return false
1198
+ }
1199
+ if (!this.hasWidgets && !this.hasBodyWidgets && !this.hasViews) {
1200
+ return false
1201
+ }
1202
+ return this.widgetRefItems.length === 0
1203
+ },
1204
+
1205
+ /**
1206
+ * The chosen view's layout as the grid draws it: in live mode the
1207
+ * widgets that would draw nothing leave and the rest close up, as
1208
+ * for the page's own layout.
1209
+ *
1210
+ * @return {Array<object>}
1211
+ * @spec openspec/changes/view-switch-containers/specs/view-switch-containers/spec.md#requirement-a-view-with-nothing-to-draw-says-so
1212
+ */
1213
+ viewDisplayLayout() {
1214
+ const items = this.activeView ? this.activeView.layout : [];
1215
+ if (this.gridEditable) {
1216
+ return items
1217
+ }
1218
+ const visible = items.filter((item) => !this.isCollapsedWidget(item));
1219
+ return visible.length === items.length ? items : this.compactDisplayLayout(visible)
1220
+ },
1221
+
1222
+ /**
1223
+ * Whether the chosen view has nothing to draw.
1224
+ *
1225
+ * @return {boolean}
1226
+ * @spec openspec/changes/view-switch-containers/specs/view-switch-containers/spec.md#requirement-a-view-with-nothing-to-draw-says-so
1227
+ */
1228
+ viewIsEmpty() {
1229
+ return this.hasViews && this.viewDisplayLayout.length === 0
1230
+ },
1231
+
1232
+ /**
1233
+ * The grids this page draws. Without views: the page's own layout,
1234
+ * as it always was. With views: the page's own layout when it has
1235
+ * items, then the chosen view's layout in the region the switch
1236
+ * controls (left out when the view is empty; the empty state takes
1237
+ * the region then).
1238
+ *
1239
+ * @return {Array<{key: string, view: boolean, layout: Array<object>, editable: boolean, attrs: object}>}
1240
+ * @spec openspec/changes/view-switch-containers/specs/view-switch-containers/spec.md#requirement-a-page-declares-views-that-each-hold-a-widget-grid
1241
+ */
1242
+ gridSections() {
1243
+ if (!this.gridSectionsShown) {
1244
+ return []
1245
+ }
1246
+ const page = { key: 'page', view: false, layout: this.displayLayout, editable: this.gridEditable, attrs: {} };
1247
+ if (!this.hasViews) {
1248
+ return [page]
1249
+ }
1250
+ const sections = this.displayLayout.length > 0 ? [page] : [];
1251
+ if (!this.viewIsEmpty) {
1252
+ sections.push({
1253
+ key: `view-${this.activeViewId}`,
1254
+ view: true,
1255
+ layout: this.viewDisplayLayout,
1256
+ // A user arrangement covers the page's own layout only.
1257
+ editable: this.gridEditable && !this.userLayout,
1258
+ attrs: {
1259
+ id: this.viewRegionId,
1260
+ role: 'region',
1261
+ 'aria-label': this.activeView.label,
1262
+ class: 'cn-page-view-region',
1263
+ 'data-testid': 'cn-dashboard-page-view-region',
1264
+ },
1265
+ });
1266
+ }
1267
+ return sections
1268
+ },
1269
+
1182
1270
  /**
1183
1271
  * The widget settings object handed to CnWidgetStyleEditorModal,
1184
1272
  * built from the widget definition currently being configured
@@ -1309,6 +1397,14 @@ var script = {
1309
1397
  this.evaluateWidgetConditions();
1310
1398
  },
1311
1399
  },
1400
+
1401
+ /** A view's widgets carry predicates too. */
1402
+ views: {
1403
+ deep: true,
1404
+ handler() {
1405
+ this.evaluateWidgetConditions();
1406
+ },
1407
+ },
1312
1408
  },
1313
1409
 
1314
1410
  created() {
@@ -2173,7 +2269,8 @@ var script = {
2173
2269
  * @spec openspec/changes/live-check-follow-ups/specs/live-check-follow-ups/spec.md#requirement-an-attention-card-says-when-it-could-not-check
2174
2270
  */
2175
2271
  async evaluateWidgetConditions() {
2176
- const conditional = (this.widgets || []).filter((def) => def && def.id && def.type
2272
+ const defs = [...(this.widgets || []), ...this.normalizedViews.flatMap((view) => view.widgets)];
2273
+ const conditional = defs.filter((def) => def && def.id && def.type
2177
2274
  && this.widgetDisplayConfig(def).visibleWhen);
2178
2275
  // Skip when the CONDITIONAL SET is unchanged: the deep `widgets`
2179
2276
  // watch fires on any def edit, but only an added/removed/edited
@@ -2307,7 +2404,7 @@ var script = {
2307
2404
  */
2308
2405
  getWidgetDef(widgetId) {
2309
2406
  const list = Array.isArray(this.widgets) ? this.widgets : [];
2310
- return list.find((w) => w && w.id === widgetId) || null
2407
+ return list.find((w) => w && w.id === widgetId) || this.findViewWidget(widgetId)
2311
2408
  },
2312
2409
 
2313
2410
  /**