@conduction/nextcloud-vue 2.120.0 → 2.122.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 (79) hide show
  1. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +53 -1
  2. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  3. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +546 -523
  4. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  5. package/dist/esm/components/CnIndexPage/useNamedSource.js +9 -0
  6. package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
  7. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  8. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +1 -0
  9. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  10. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js +9 -0
  11. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js.map +1 -0
  12. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js +214 -0
  13. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js.map +1 -0
  14. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js +125 -0
  15. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js.map +1 -0
  16. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js +9 -0
  17. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js.map +1 -0
  18. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js +163 -0
  19. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js.map +1 -0
  20. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js +131 -0
  21. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js.map +1 -0
  22. package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js +127 -0
  23. package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js.map +1 -0
  24. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js +9 -0
  25. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js.map +1 -0
  26. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js +82 -0
  27. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js.map +1 -0
  28. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js +61 -0
  29. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js.map +1 -0
  30. package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js +60 -0
  31. package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js.map +1 -0
  32. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js +10 -0
  33. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js.map +1 -0
  34. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js +226 -0
  35. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js.map +1 -0
  36. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js +126 -0
  37. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js.map +1 -0
  38. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +42 -32
  39. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  40. package/dist/esm/composables/indexSources.js +116 -16
  41. package/dist/esm/composables/indexSources.js.map +1 -1
  42. package/dist/esm/index.js +4 -0
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/l10n/en.json.js +42 -1
  45. package/dist/esm/l10n/en.json.js.map +1 -1
  46. package/dist/esm/l10n/nl.json.js +42 -1
  47. package/dist/esm/l10n/nl.json.js.map +1 -1
  48. package/dist/esm/library-style.js +1 -1
  49. package/dist/esm/nextcloud-vue.css +309 -13
  50. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  51. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  52. package/dist/nextcloud-vue.cjs.js +14136 -12578
  53. package/dist/nextcloud-vue.cjs.js.map +2 -2
  54. package/dist/nextcloud-vue.css +309 -13
  55. package/l10n/en.json +42 -1
  56. package/l10n/nl.json +42 -1
  57. package/package.json +1 -1
  58. package/src/components/CnIndexPage/CnIndexPage.vue +74 -3
  59. package/src/components/CnIndexPage/useNamedSource.js +9 -0
  60. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +1 -0
  61. package/src/components/CnReadinessChecklist/CnReadinessChecklist.vue +335 -0
  62. package/src/components/CnReadinessChecklist/index.js +9 -0
  63. package/src/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue +300 -0
  64. package/src/components/CnSchemaRulesWidget/index.js +10 -0
  65. package/src/components/CnSchemaRulesWidget/schemaRules.js +123 -0
  66. package/src/components/CnSearchIndexStatus/CnSearchIndexStatus.vue +160 -0
  67. package/src/components/CnSearchIndexStatus/index.js +10 -0
  68. package/src/components/CnSearchIndexStatus/searchIndexStatus.js +56 -0
  69. package/src/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue +328 -0
  70. package/src/components/CnShippedConfigurationSection/index.js +9 -0
  71. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +10 -0
  72. package/src/components/index.js +4 -0
  73. package/src/composables/indexSources.js +116 -16
  74. package/src/css/index-page.css +7 -0
  75. package/src/css/look-board-detail.css +27 -0
  76. package/src/css/look-board-index.css +108 -12
  77. package/src/css/look-board.css +27 -1
  78. package/src/index.js +4 -0
  79. package/src/utils/libraryWidgetKeys.js +1 -0
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/nextcloud-vue.cjs.js.map
3
- size: 46896987 bytes
4
- sha256: 1990155de5c018ead9f6319bab791fc3feca55772d4b68352fbb9bfe10ed8314
3
+ size: 47024675 bytes
4
+ sha256: 4ccc3ad4920a651204c55c5c9d57454016160f1c0b2417ac1909f351319e6346
@@ -295,9 +295,15 @@
295
295
  look sets 600 on each button, so every NcButton on a board page draws the
296
296
  board's weight without a rule per surface. Breadcrumb buttons keep the
297
297
  crumb weight.
298
- @spec openspec/changes/board-button-weight/specs/board-button-weight/spec.md#requirement-a-board-button-draws-at-600 */
298
+ The boards also draw a button's text at 14px, against Nextcloud's 15px.
299
+ NcButton reads its size from --default-font-size, so the look sets that
300
+ variable on the button: a surface that sets its own `font-size` (the next
301
+ step card's 15px) keeps it.
302
+ @spec openspec/changes/board-button-weight/specs/board-button-weight/spec.md#requirement-a-board-button-draws-at-600
303
+ @spec openspec/changes/board-control-text/specs/board-control-text/spec.md#requirement-a-board-button-draws-its-text-at-14px */
299
304
  .cn-look-board .button-vue:not(.cn-look-nextcloud *):not(.vue-crumb *) {
300
305
  --font-weight-element: 600;
306
+ --default-font-size: 14px;
301
307
  }
302
308
 
303
309
  /* ---- A button with an icon and a label --------------------------------- */
@@ -460,6 +466,26 @@
460
466
  background: var(--color-background-hover);
461
467
  }
462
468
 
469
+ /* ---- A secondary button --------------------------------------------------- */
470
+ /* The boards draw every secondary button neutral: the main background, a 1px
471
+ control border, the main text, the hover ground on hover (DqFlow "Testen
472
+ met een zaak", DqFunctionaliteiten "Documentatie", DqTaak "Afronden").
473
+ NcButton draws its secondary from the primary-light variables, on a 2px
474
+ bottom edge; the look points those variables at the neutral colours on the
475
+ button itself. The selector weighs (0,3,0): it outranks NcButton's border
476
+ (0,2,0), and a surface rule of the same weight later in the cascade (a
477
+ dialog's cancel) still decides for its surface.
478
+ @spec openspec/changes/board-secondary-neutral/specs/board-secondary-neutral/spec.md#requirement-a-board-secondary-button-is-neutral */
479
+ .cn-look-board .button-vue.button-vue--secondary:where(:not(.cn-look-nextcloud *):not(.vue-crumb *)),
480
+ .cn-look-board .button-vue.button-vue--vue-secondary:where(:not(.cn-look-nextcloud *):not(.vue-crumb *)) {
481
+ --color-primary-element-light: var(--color-main-background);
482
+ --color-primary-element-light-hover: var(--color-background-hover);
483
+ --color-primary-element-light-text: var(--color-main-text);
484
+ --nldesign-color-on-surface: var(--color-main-text);
485
+ border: 1px solid var(--cn-board-control-border);
486
+ color: var(--color-main-text);
487
+ }
488
+
463
489
  /* ---- Header action buttons (CnActionButtons) ----------------------------- */
464
490
  /* The board draws a page's secondary actions as neutral 40px buttons: the
465
491
  main background, a grey border, the main text at 600 (DqZaak "Bericht",
@@ -3456,16 +3482,36 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
3456
3482
  width: 18%;
3457
3483
  }
3458
3484
 
3459
- /* The board's data cells sit 12px apart (PqTickets), the first one 18px from
3460
- the selection column; the selection and menu columns keep 16px. */
3461
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon),
3462
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon) {
3485
+ /* An index table pads every cell 16px at the sides (DqZaken). The plain-title
3486
+ table (`rowTitle: "plain"`: PqTickets, OcPublicaties) sets its data cells
3487
+ 12px apart and its title column 18px from the selection column; the
3488
+ selection and menu columns keep 16px. The title column is left out of the
3489
+ 12px rule, which would otherwise outrank the 18px one.
3490
+ @spec openspec/changes/board-table-density/specs/board-table-density/spec.md#requirement-a-board-table-pads-its-cells-as-the-boards-draw-them */
3491
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table th:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon):not(.cn-table-head--title),
3492
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table td:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon):not(.cn-table-col--title) {
3463
3493
  padding-inline: 12px;
3464
3494
  }
3465
3495
 
3466
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th.cn-table-head--title,
3467
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td.cn-table-col--title {
3468
- padding-inline-start: 18px;
3496
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table th.cn-table-head--title,
3497
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table td.cn-table-col--title {
3498
+ padding-inline: 18px 12px;
3499
+ }
3500
+
3501
+ /* A table that is not an index page's main list sits in a card and is the
3502
+ compact one: 10px 12px in the header, 11px 12px in the cells
3503
+ (DqInstellingen, DqVthInstellingen, DqZaaktype, DqTermijnen). The selection
3504
+ column keeps its 16px, so it stays 60px wide. */
3505
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table th {
3506
+ padding: 10px 12px;
3507
+ }
3508
+
3509
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table td {
3510
+ padding: 11px 12px;
3511
+ }
3512
+
3513
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table .cn-table-col--checkbox {
3514
+ padding-inline: 16px;
3469
3515
  }
3470
3516
 
3471
3517
  .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td > .cn-cell-renderer {
@@ -3695,12 +3741,15 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
3695
3741
  }
3696
3742
 
3697
3743
  /* A page link is a <button>: Nextcloud's `button` rule sets it bold, the
3698
- boards set the links at the regular weight and only the current page at 600. */
3744
+ boards set the links at the regular weight and only the current page at 600.
3745
+ The boards size a link's content box at 34px, so a bordered link is 36px
3746
+ and the borderless current page 34px (DqZaken "2", "Volgende", "1").
3747
+ @spec openspec/changes/board-pagination-links/specs/board-pagination-links/spec.md#requirement-a-board-page-link-is-sized-as-the-boards-draw-it */
3699
3748
  .cn-look-board .cn-pagination--board .cn-pagination__board-link {
3700
3749
  box-sizing: border-box;
3701
- min-width: 34px;
3702
- height: 34px;
3703
- min-height: 34px;
3750
+ min-width: 36px;
3751
+ height: 36px;
3752
+ min-height: 36px;
3704
3753
  margin: 0;
3705
3754
  padding: 0 8px;
3706
3755
  border: 1px solid var(--color-border);
@@ -3725,7 +3774,10 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
3725
3774
  }
3726
3775
 
3727
3776
  .cn-look-board .cn-pagination--board .cn-pagination__board-link--current {
3728
- border-color: var(--color-primary-element);
3777
+ min-width: 34px;
3778
+ height: 34px;
3779
+ min-height: 34px;
3780
+ border: 0;
3729
3781
  background: var(--color-primary-element);
3730
3782
  color: var(--color-primary-element-text);
3731
3783
  font-weight: 600;
@@ -4228,6 +4280,76 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
4228
4280
  border-bottom: none;
4229
4281
  padding-block: 2px;
4230
4282
  }
4283
+
4284
+ /* ---- The index side panel (CnIndexSidebar, board IndexZijpaneel) -------- */
4285
+ /* The panel's title is 20px bold without the schema icon, and its tabs are
4286
+ one row of 40px labels, 14px weight 600 in the soft ink, the open one in
4287
+ the deep primary ink and underlined 2px in the primary colour on the
4288
+ strip's rule (DqFilterBeheren). NcAppSidebar stacks the icon over the
4289
+ label in a 54px tile with a highlight bar; the board does neither. The
4290
+ header rule repeats NcAppSidebar's own chain to outrank it.
4291
+ @spec openspec/changes/board-index-sidebar-tabs/specs/board-index-sidebar-tabs/spec.md#requirement-the-board-index-side-panel-draws-the-boards-header-and-tab-row */
4292
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-header__desc .app-sidebar-header__name-container .app-sidebar-header__mainname-container h2.app-sidebar-header__mainname {
4293
+ font-size: 20px;
4294
+ font-weight: 700;
4295
+ line-height: 1.2;
4296
+ min-height: 0;
4297
+ }
4298
+
4299
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-header__figure:has(> .cn-index-sidebar__header-icon) {
4300
+ display: none;
4301
+ }
4302
+
4303
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__nav[role="tablist"] {
4304
+ justify-content: flex-start;
4305
+ gap: 4px;
4306
+ margin: 0;
4307
+ padding: 14px 12px 0;
4308
+ border-bottom: 1px solid var(--color-border);
4309
+ }
4310
+
4311
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__highlight {
4312
+ display: none;
4313
+ }
4314
+
4315
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"] {
4316
+ flex: 0 0 auto;
4317
+ flex-direction: row;
4318
+ align-items: center;
4319
+ gap: 6px;
4320
+ box-sizing: border-box;
4321
+ height: 40px;
4322
+ min-height: 40px;
4323
+ margin: 0 0 -1px;
4324
+ padding: 0 10px;
4325
+ border: 0;
4326
+ border-bottom: 2px solid transparent;
4327
+ border-radius: 0;
4328
+ background: transparent;
4329
+ color: var(--cn-board-text-soft);
4330
+ font-size: 14px;
4331
+ font-weight: 600;
4332
+ }
4333
+
4334
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"] * {
4335
+ font-weight: inherit;
4336
+ }
4337
+
4338
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"]::after {
4339
+ content: none;
4340
+ }
4341
+
4342
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"]:hover {
4343
+ background: transparent;
4344
+ border-bottom-color: var(--color-border-dark);
4345
+ color: var(--color-main-text);
4346
+ }
4347
+
4348
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"][aria-selected="true"] {
4349
+ background: transparent;
4350
+ border-bottom-color: var(--color-primary-element);
4351
+ color: var(--color-primary-element-light-text);
4352
+ }
4231
4353
  /* ========================================
4232
4354
  @conduction/nextcloud-vue — Table Styles
4233
4355
  ======================================== */
@@ -7092,6 +7214,13 @@ a.cn-kpi-card--board * {
7092
7214
  color: var(--color-text-maxcontrast);
7093
7215
  }
7094
7216
 
7217
+ /* A note the named source read off its answer, above the rows. */
7218
+ .cn-index-page__source-note {
7219
+ margin: 0 0 8px;
7220
+ color: var(--color-text-maxcontrast);
7221
+ font-size: 0.9em;
7222
+ }
7223
+
7095
7224
  .cn-index-page__scope-heading {
7096
7225
  display: flex;
7097
7226
  flex-direction: column;
@@ -9476,6 +9605,33 @@ li[data-cn-admin-tag] > .action-link::after {
9476
9605
  .cn-look-board .cn-tasks-widget .cn-tasks-widget__cell-actions .button-vue .button-vue__text.button-vue__text {
9477
9606
  padding-inline: 0;
9478
9607
  }
9608
+
9609
+ /* ---- Grouped cards (CnGroupedCardsWidget, DqZaaktype "Fasen en taken") --- */
9610
+ /* Groups 14px apart, each padded 14px with a 10px radius and a bold title; a
9611
+ card in a group is padded 9px 12px with the 8px control radius, its title
9612
+ 15px. The doubled class outranks the widget's scoped rules.
9613
+ @spec openspec/changes/board-grouped-cards/specs/board-grouped-cards/spec.md#requirement-board-grouped-cards-take-the-boards-group-and-card-shape */
9614
+ .cn-look-board .cn-grouped-cards__grid.cn-grouped-cards__grid {
9615
+ gap: 14px;
9616
+ }
9617
+
9618
+ .cn-look-board .cn-grouped-cards__group.cn-grouped-cards__group {
9619
+ padding: 14px;
9620
+ border-radius: 10px;
9621
+ }
9622
+
9623
+ .cn-look-board .cn-grouped-cards__group-title.cn-grouped-cards__group-title {
9624
+ font-weight: 700;
9625
+ }
9626
+
9627
+ .cn-look-board .cn-grouped-cards__item.cn-grouped-cards__item {
9628
+ padding: 9px 12px;
9629
+ border-radius: var(--cn-board-control-radius, 8px);
9630
+ }
9631
+
9632
+ .cn-look-board .cn-grouped-cards__item-title.cn-grouped-cards__item-title {
9633
+ font-size: 15px;
9634
+ }
9479
9635
  /*
9480
9636
  * The reports page under the board look (screens-reports-page-board-look,
9481
9637
  * board DcRapportages): a 28px title over a muted lead, one section per
@@ -25769,6 +25925,46 @@ a.cn-xwiki-card__title[data-v-1a6b61fd]:hover {
25769
25925
  }
25770
25926
 
25771
25927
 
25928
+ .cn-schema-rules__hint[data-v-1d1c1c13] {
25929
+ font-size: 12px;
25930
+ color: var(--color-text-maxcontrast);
25931
+ margin: 4px 0 12px;
25932
+ }
25933
+ .cn-schema-rules__table[data-v-1d1c1c13] {
25934
+ width: 100%;
25935
+ border-collapse: collapse;
25936
+ }
25937
+ .cn-schema-rules__table th[data-v-1d1c1c13],
25938
+ .cn-schema-rules__table td[data-v-1d1c1c13] {
25939
+ text-align: start;
25940
+ padding: 6px 8px;
25941
+ border-bottom: 1px solid var(--color-border);
25942
+ }
25943
+ .cn-schema-rules__trial[data-v-1d1c1c13] {
25944
+ margin-top: 16px;
25945
+ border-top: 1px solid var(--color-border);
25946
+ padding-top: 12px;
25947
+ }
25948
+ .cn-schema-rules__trace[data-v-1d1c1c13] {
25949
+ margin-top: 8px;
25950
+ padding: 8px 12px;
25951
+ border-radius: var(--border-radius-large, 8px);
25952
+ background-color: var(--color-background-hover);
25953
+ }
25954
+ .cn-schema-rules__trace p[data-v-1d1c1c13] {
25955
+ margin: 0;
25956
+ }
25957
+ .cn-schema-rules__verdict[data-v-1d1c1c13] {
25958
+ font-weight: bold;
25959
+ }
25960
+ .cn-schema-rules__error[data-v-1d1c1c13] {
25961
+ color: var(--color-error-text);
25962
+ }
25963
+ .cn-schema-rules__empty[data-v-1d1c1c13] {
25964
+ color: var(--color-text-maxcontrast);
25965
+ }
25966
+
25967
+
25772
25968
  .cn-stacked-bar[data-v-29628f56] {
25773
25969
  display: flex;
25774
25970
  flex-direction: column;
@@ -51565,6 +51761,106 @@ a.cn-integration-card__title[data-v-093a874d]:hover {
51565
51761
  }
51566
51762
 
51567
51763
 
51764
+ .cn-shipped-configuration__intro[data-v-fd515054],
51765
+ .cn-shipped-configuration__muted[data-v-fd515054] {
51766
+ color: var(--color-text-maxcontrast);
51767
+ }
51768
+ .cn-shipped-configuration__picker[data-v-fd515054] {
51769
+ max-width: 320px;
51770
+ }
51771
+ .cn-shipped-configuration__table[data-v-fd515054] {
51772
+ width: 100%;
51773
+ border-collapse: collapse;
51774
+ margin-top: 12px;
51775
+ /* Nextcloud sets `table { white-space: nowrap }`; a cell here can be a sentence. */
51776
+ white-space: normal;
51777
+ }
51778
+ .cn-shipped-configuration__table th[data-v-fd515054],
51779
+ .cn-shipped-configuration__table td[data-v-fd515054] {
51780
+ padding: 6px 8px;
51781
+ border-bottom: 1px solid var(--color-border);
51782
+ text-align: start;
51783
+ }
51784
+
51785
+
51786
+ /* Label above value, and the label wraps: Nextcloud's settings stylesheet gives a `dt` a fixed width. */
51787
+ .cn-search-index-status__figures[data-v-52b442a4] {
51788
+ display: grid;
51789
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
51790
+ gap: 16px 24px;
51791
+ margin-block: 0 12px;
51792
+ }
51793
+ .cn-search-index-status__figures > div[data-v-52b442a4] {
51794
+ display: flex;
51795
+ flex-direction: column;
51796
+ gap: 2px;
51797
+ min-width: 0;
51798
+ }
51799
+ .cn-search-index-status__figures dt[data-v-52b442a4] {
51800
+ display: block;
51801
+ float: none;
51802
+ width: auto;
51803
+ margin: 0;
51804
+ padding: 0;
51805
+ text-align: start;
51806
+ white-space: normal;
51807
+ overflow-wrap: anywhere;
51808
+ color: var(--color-text-maxcontrast);
51809
+ }
51810
+ .cn-search-index-status__figures dd[data-v-52b442a4] {
51811
+ font-weight: bold;
51812
+ margin: 0;
51813
+ overflow-wrap: anywhere;
51814
+ }
51815
+
51816
+
51817
+ .cn-readiness-checklist__description[data-v-4e10a556],
51818
+ .cn-readiness-checklist__empty[data-v-4e10a556] {
51819
+ color: var(--color-text-maxcontrast);
51820
+ margin: 0 0 12px;
51821
+ }
51822
+ .cn-readiness-checklist__group-title[data-v-4e10a556] {
51823
+ margin: 12px 0 4px;
51824
+ }
51825
+ .cn-readiness-checklist__list[data-v-4e10a556] {
51826
+ list-style: none;
51827
+ margin: 0;
51828
+ padding: 0;
51829
+ }
51830
+ .cn-readiness-checklist__item[data-v-4e10a556] {
51831
+ display: flex;
51832
+ gap: calc(var(--default-grid-baseline, 4px) * 3);
51833
+ padding-block: calc(var(--default-grid-baseline, 4px) * 2);
51834
+ border-block-end: 1px solid var(--color-border);
51835
+ }
51836
+ .cn-readiness-checklist__state[data-v-4e10a556] {
51837
+ flex: 0 0 auto;
51838
+ min-width: 6em;
51839
+ font-weight: bold;
51840
+ }
51841
+ .cn-readiness-checklist__state--met[data-v-4e10a556] {
51842
+ color: var(--color-success-text, var(--color-success));
51843
+ }
51844
+ .cn-readiness-checklist__state--unmet[data-v-4e10a556] {
51845
+ color: var(--color-error-text, var(--color-error));
51846
+ }
51847
+ .cn-readiness-checklist__state--unknown[data-v-4e10a556] {
51848
+ color: var(--color-text-maxcontrast);
51849
+ }
51850
+ .cn-readiness-checklist__body[data-v-4e10a556] {
51851
+ display: flex;
51852
+ flex-direction: column;
51853
+ gap: 2px;
51854
+ min-width: 0;
51855
+ }
51856
+ .cn-readiness-checklist__explanation[data-v-4e10a556] {
51857
+ color: var(--color-text-maxcontrast);
51858
+ }
51859
+ .cn-readiness-checklist__failure[data-v-4e10a556] {
51860
+ color: var(--color-error-text, var(--color-error));
51861
+ }
51862
+
51863
+
51568
51864
  .cn-ai-agent-picker {
51569
51865
  width: 100%;
51570
51866
  }
package/l10n/en.json CHANGED
@@ -2178,7 +2178,48 @@
2178
2178
  "When": "When",
2179
2179
  "Who": "Who",
2180
2180
  "Message": "Message",
2181
- "That change could not be saved.": "That change could not be saved."
2181
+ "That change could not be saved.": "That change could not be saved.",
2182
+ "You may not read this list.": "You may not read this list.",
2183
+ "Shipped set": "Shipped set",
2184
+ "Newer version": "Newer version",
2185
+ "The register holds {count} of these. None came from a shipped set, so there is no shipped version to compare with.": "The register holds {count} of these. None came from a shipped set, so there is no shipped version to compare with.",
2186
+ "Nothing has been seeded yet.": "Nothing has been seeded yet.",
2187
+ "Could not read the shipped configuration.": "Could not read the shipped configuration.",
2188
+ "Shipped, unchanged": "Shipped, unchanged",
2189
+ "Shipped, changed here": "Shipped, changed here",
2190
+ "Shipped, removed here": "Shipped, removed here",
2191
+ "Yours": "Yours",
2192
+ "Take {version} and lose your change": "Take {version} and lose your change",
2193
+ "Take {version}": "Take {version}",
2194
+ "The newer version was taken.": "The newer version was taken.",
2195
+ "The newer version was not taken.": "The newer version was not taken.",
2196
+ "Tables in scope": "Tables in scope",
2197
+ "Indexes on them": "Indexes on them",
2198
+ "Rebuild without locking": "Rebuild without locking",
2199
+ "Run {command} status on the server for the same figures, and {command} rebuild --apply after a schema change.": "Run {command} status on the server for the same figures, and {command} rebuild --apply after a schema change.",
2200
+ "Never": "Never",
2201
+ "No, a rebuild locks the table it is on": "No, a rebuild locks the table it is on",
2202
+ "Rules on this schema": "Rules on this schema",
2203
+ "Everything the platform checks when an object is saved, in the order it checks it.": "Everything the platform checks when an object is saved, in the order it checks it.",
2204
+ "Nothing is checked on this schema yet.": "Nothing is checked on this schema yet.",
2205
+ "Try": "Try",
2206
+ "Try it": "Try it",
2207
+ "Object to try a rule against": "Object to try a rule against",
2208
+ "Paste an object id": "Paste an object id",
2209
+ "A trial writes nothing. It reads the object as it stands and says what the rule would have decided.": "A trial writes nothing. It reads the object as it stands and says what the rule would have decided.",
2210
+ "It read {operand} and found {value}.": "It read {operand} and found {value}.",
2211
+ "nothing": "nothing",
2212
+ "The rule fired.": "The rule fired.",
2213
+ "The rule did not match this object.": "The rule did not match this object.",
2214
+ "The rule refused the save.": "The rule refused the save.",
2215
+ "The rule could not be evaluated.": "The rule could not be evaluated.",
2216
+ "Only an administrator can read the rules of this schema.": "Only an administrator can read the rules of this schema.",
2217
+ "The rules could not be read. Ask an administrator.": "The rules could not be read. Ask an administrator.",
2218
+ "That object could not be read.": "That object could not be read.",
2219
+ "Nothing to check.": "Nothing to check.",
2220
+ "This could not be read: {reason}": "This could not be read: {reason}",
2221
+ "Still open": "Still open",
2222
+ "The checklist could not be read.": "The checklist could not be read."
2182
2223
  },
2183
2224
  "plurals": {
2184
2225
  "{count} member": [
package/l10n/nl.json CHANGED
@@ -2428,7 +2428,48 @@
2428
2428
  "When": "Wanneer",
2429
2429
  "Who": "Wie",
2430
2430
  "Message": "Bericht",
2431
- "That change could not be saved.": "Die wijziging kon niet worden opgeslagen."
2431
+ "That change could not be saved.": "Die wijziging kon niet worden opgeslagen.",
2432
+ "You may not read this list.": "Je mag deze lijst niet lezen.",
2433
+ "Shipped set": "Meegeleverde set",
2434
+ "Newer version": "Nieuwere versie",
2435
+ "The register holds {count} of these. None came from a shipped set, so there is no shipped version to compare with.": "Het register bevat er {count}. Geen ervan kwam uit een meegeleverde set, dus er is geen meegeleverde versie om mee te vergelijken.",
2436
+ "Nothing has been seeded yet.": "Er is nog niets geplaatst.",
2437
+ "Could not read the shipped configuration.": "De meegeleverde configuratie kon niet worden gelezen.",
2438
+ "Shipped, unchanged": "Meegeleverd, ongewijzigd",
2439
+ "Shipped, changed here": "Meegeleverd, hier gewijzigd",
2440
+ "Shipped, removed here": "Meegeleverd, hier verwijderd",
2441
+ "Yours": "Van jezelf",
2442
+ "Take {version} and lose your change": "Neem {version} en verlies je wijziging",
2443
+ "Take {version}": "Neem {version}",
2444
+ "The newer version was taken.": "De nieuwere versie is overgenomen.",
2445
+ "The newer version was not taken.": "De nieuwere versie is niet overgenomen.",
2446
+ "Tables in scope": "Tabellen in bereik",
2447
+ "Indexes on them": "Indexen daarop",
2448
+ "Rebuild without locking": "Herbouwen zonder vergrendelen",
2449
+ "Run {command} status on the server for the same figures, and {command} rebuild --apply after a schema change.": "Draai {command} status op de server voor dezelfde cijfers, en {command} rebuild --apply na een schemawijziging.",
2450
+ "Never": "Nooit",
2451
+ "No, a rebuild locks the table it is on": "Nee, een herbouw vergrendelt de tabel waar hij op staat",
2452
+ "Rules on this schema": "Regels op dit schema",
2453
+ "Everything the platform checks when an object is saved, in the order it checks it.": "Alles wat het platform controleert als een object wordt opgeslagen, in de volgorde waarin het dat doet.",
2454
+ "Nothing is checked on this schema yet.": "Op dit schema wordt nog niets gecontroleerd.",
2455
+ "Try": "Proberen",
2456
+ "Try it": "Probeer het",
2457
+ "Object to try a rule against": "Object om een regel op te proberen",
2458
+ "Paste an object id": "Plak een object-id",
2459
+ "A trial writes nothing. It reads the object as it stands and says what the rule would have decided.": "Een proef schrijft niets. Hij leest het object zoals het nu is en zegt wat de regel zou hebben besloten.",
2460
+ "It read {operand} and found {value}.": "Hij las {operand} en vond {value}.",
2461
+ "nothing": "niets",
2462
+ "The rule fired.": "De regel is afgegaan.",
2463
+ "The rule did not match this object.": "De regel paste niet op dit object.",
2464
+ "The rule refused the save.": "De regel weigerde het opslaan.",
2465
+ "The rule could not be evaluated.": "De regel kon niet worden beoordeeld.",
2466
+ "Only an administrator can read the rules of this schema.": "Alleen een beheerder kan de regels van dit schema lezen.",
2467
+ "The rules could not be read. Ask an administrator.": "De regels konden niet worden gelezen. Vraag het een beheerder.",
2468
+ "That object could not be read.": "Dat object kon niet worden gelezen.",
2469
+ "Nothing to check.": "Er is niets te controleren.",
2470
+ "This could not be read: {reason}": "Dit kon niet worden gelezen: {reason}",
2471
+ "Still open": "Nog open",
2472
+ "The checklist could not be read.": "De lijst kon niet worden gelezen."
2432
2473
  },
2433
2474
  "plurals": {
2434
2475
  "{count} member": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.120.0",
3
+ "version": "2.122.0",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -210,7 +210,7 @@
210
210
  :mapLabel="mapLabel"
211
211
  :mapIcon="mapIcon"
212
212
  :listIcon="listIcon"
213
- :showSearch="search !== false && (inlineSearch || isBoardLook)"
213
+ :showSearch="search !== false && (inlineSearch || isBoardLook) && !sourceRefusal"
214
214
  :searchPlacement="searchPlacement"
215
215
  :searchValue="effectiveSearchValue"
216
216
  :searchPlaceholder="presented('searchPlaceholder') ? cnTranslate(presented('searchPlaceholder')) : presented('searchPlaceholder')"
@@ -745,12 +745,31 @@
745
745
  <span v-if="scopeHeading.subtitle" class="cn-index-page__scope-subtitle" data-testid="cn-index-page-scope-subtitle">{{ scopeHeading.subtitle }}</span>
746
746
  </div>
747
747
 
748
+ <!-- A note the named source read off its answer ("Filters run in
749
+ this order: ..."). -->
750
+ <p v-if="sourceNote && !sourceRefusal"
751
+ class="cn-index-page__source-note"
752
+ data-testid="cn-index-page-source-note">
753
+ {{ sourceNote }}
754
+ </p>
755
+
748
756
  <!-- Loading state — initial fetch only; a background refresh keeps the table visible -->
749
757
  <div v-if="showInitialLoader" class="cn-index-page__loading">
750
758
  <!-- name gives NcLoadingIcon a non-empty aria-label (WCAG role-img-alt); empty name ships an unlabeled role="img" -->
751
759
  <NcLoadingIcon :size="32" :name="loadingText" />
752
760
  </div>
753
761
 
762
+ <!-- The named source's server refused this reader: its sentence
763
+ instead of the rows, never an empty list. -->
764
+ <div v-else-if="sourceRefusal"
765
+ class="cn-index-page__source-refusal"
766
+ role="status"
767
+ data-testid="cn-index-page-source-refusal">
768
+ <NcNoteCard type="error">
769
+ {{ sourceRefusal }}
770
+ </NcNoteCard>
771
+ </div>
772
+
754
773
  <!-- A search the server refused for its grammar: the term with the
755
774
  character it stopped at, the server's reason, and what to do. -->
756
775
  <div v-else-if="searchRefusal"
@@ -774,7 +793,7 @@
774
793
  </div>
775
794
 
776
795
  <!-- Error state: the latest self-fetch failed (e.g. a search term the server rejects) -->
777
- <div v-else-if="selfFetchFailed"
796
+ <div v-else-if="selfFetchFailed || sourceFailed"
778
797
  class="cn-index-page__empty"
779
798
  role="status"
780
799
  data-testid="cn-index-page-fetch-error">
@@ -4107,6 +4126,8 @@ export default {
4107
4126
  const namedPageSize = Number(props.sourceConfig && props.sourceConfig.limit) > 0 ? Number(props.sourceConfig.limit) : 20
4108
4127
  const namedPaging = ref({ page: 1, limit: namedPageSize })
4109
4128
  const namedActiveFilters = ref(namedFiltersFromRoute(getCurrentInstance(), props))
4129
+ // The search term on a named source that searches (`searchParam`).
4130
+ const namedSearchTerm = ref('')
4110
4131
 
4111
4132
  const {
4112
4133
  isNamedSource,
@@ -4114,7 +4135,7 @@ export default {
4114
4135
  namedRows,
4115
4136
  namedLoading,
4116
4137
  namedQuickFilters,
4117
- } = useNamedSource(props, { activeQuickFilterIndex, activeFilters: namedActiveFilters, paging: namedPaging })
4138
+ } = useNamedSource(props, { activeQuickFilterIndex, activeFilters: namedActiveFilters, paging: namedPaging, searchTerm: namedSearchTerm })
4118
4139
 
4119
4140
  return {
4120
4141
  isBoard: isBoardLook,
@@ -4127,6 +4148,7 @@ export default {
4127
4148
  namedQuickFilters,
4128
4149
  namedActiveFilters,
4129
4150
  namedPaging,
4151
+ namedSearchTerm,
4130
4152
  contextMenuOpen,
4131
4153
  contextMenuRow,
4132
4154
  openContextMenu,
@@ -4536,6 +4558,46 @@ export default {
4536
4558
  return this.selfFetchFailed ? readSearchRefusal(this.list.error.value, this.effectiveSearchValue) : null
4537
4559
  },
4538
4560
 
4561
+ /**
4562
+ * Whether the named source sends the search term to its server.
4563
+ *
4564
+ * @return {boolean}
4565
+ */
4566
+ namedSourceSearches() {
4567
+ return this.isNamedSource && !!this.namedSource && typeof this.namedSource.searchParam === 'string' && this.namedSource.searchParam !== ''
4568
+ },
4569
+
4570
+ /**
4571
+ * The sentence the named source's server refused this reader with, or ''.
4572
+ * While it holds the page shows it instead of the rows, the search and
4573
+ * the tabs: a list nobody may read is not an empty list.
4574
+ *
4575
+ * @return {string}
4576
+ * @spec openspec/changes/index-endpoint-source-states/specs/index-page/spec.md
4577
+ */
4578
+ sourceRefusal() {
4579
+ return this.isNamedSource && this.namedSource && typeof this.namedSource.refusal === 'function' ? (this.namedSource.refusal() || '') : ''
4580
+ },
4581
+
4582
+ /**
4583
+ * Whether the named source's last load failed (not refused).
4584
+ *
4585
+ * @return {boolean}
4586
+ */
4587
+ sourceFailed() {
4588
+ return this.isNamedSource && !!this.namedSource && typeof this.namedSource.failed === 'function' && this.namedSource.failed() === true
4589
+ },
4590
+
4591
+ /**
4592
+ * The note the named source read off its last answer, or ''.
4593
+ *
4594
+ * @return {string}
4595
+ * @spec openspec/changes/index-endpoint-source-states/specs/index-page/spec.md
4596
+ */
4597
+ sourceNote() {
4598
+ return this.isNamedSource && this.namedSource && typeof this.namedSource.note === 'function' ? (this.namedSource.note() || '') : ''
4599
+ },
4600
+
4539
4601
  /** @return {string} What to do after a refused search. */
4540
4602
  searchRefusalHintText() {
4541
4603
  if (this.searchRefusalHint) {
@@ -5821,6 +5883,9 @@ export default {
5821
5883
  },
5822
5884
 
5823
5885
  tabStripEntries() {
5886
+ if (this.sourceRefusal) {
5887
+ return []
5888
+ }
5824
5889
  if (this.lensTabs.length > 0) {
5825
5890
  return this.lensTabs
5826
5891
  }
@@ -6921,6 +6986,9 @@ export default {
6921
6986
 
6922
6987
  /** Search term / visible columns / active facet filters for the embedded sidebar. */
6923
6988
  effectiveSearchValue() {
6989
+ if (this.namedSourceSearches) {
6990
+ return this.namedSearchTerm || ''
6991
+ }
6924
6992
  return this.isSelfFetchMode ? (this.list.searchTerm.value || '') : (this.searchValue || '')
6925
6993
  },
6926
6994
 
@@ -9691,6 +9759,9 @@ export default {
9691
9759
  * @return {void}
9692
9760
  */
9693
9761
  onSearchEvent(value) {
9762
+ if (this.namedSourceSearches) {
9763
+ this.namedSearchTerm = value || ''
9764
+ }
9694
9765
  if (this.isSelfFetchMode && typeof this.list.onSearch === 'function') {
9695
9766
  this.list.onSearch(value)
9696
9767
  this.persistViewStateToRoute(this.currentViewState())