@conduction/nextcloud-vue 2.135.0 → 2.137.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 (123) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +2 -1
  3. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +65 -50
  5. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  7. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +9 -0
  8. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +4 -3
  10. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  11. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +4 -1
  12. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  13. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +61 -28
  14. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  15. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  16. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +6 -0
  17. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  18. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js +9 -1
  19. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  20. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  21. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  22. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +4 -11
  23. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +32 -0
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +34 -26
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +24 -0
  29. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  30. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -2
  31. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  33. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  34. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +2 -1
  35. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  36. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +39 -2
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  38. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +6 -5
  39. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  40. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  41. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +11 -0
  42. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  43. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +10 -2
  44. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  45. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  46. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +18 -0
  47. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  48. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +38 -23
  49. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  50. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
  51. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
  52. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +1 -0
  53. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
  54. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +1 -1
  55. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -1
  56. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue.js +1 -1
  58. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue2.js +14 -4
  59. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue2.js.map +1 -1
  60. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue3.js.map +1 -1
  61. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +1 -1
  62. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +10 -0
  63. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -1
  64. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +29 -13
  65. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -1
  66. package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js +3 -1
  67. package/dist/esm/components/CnTimelineWidget/dashboardRegistration.js.map +1 -1
  68. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js +1 -1
  69. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js.map +1 -1
  70. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js.map +1 -1
  71. package/dist/esm/composables/indexSources.js +69 -3
  72. package/dist/esm/composables/indexSources.js.map +1 -1
  73. package/dist/esm/l10n/en.json.js +20 -20
  74. package/dist/esm/l10n/nl.json.js +21 -21
  75. package/dist/esm/library-style.js +1 -1
  76. package/dist/esm/nextcloud-vue.css +580 -324
  77. package/dist/esm/utils/contentHeaderLink.js +7 -1
  78. package/dist/esm/utils/contentHeaderLink.js.map +1 -1
  79. package/dist/esm/utils/savedViewMenu.js +4 -1
  80. package/dist/esm/utils/savedViewMenu.js.map +1 -1
  81. package/dist/esm/utils/savedViewSummary.js +11 -4
  82. package/dist/esm/utils/savedViewSummary.js.map +1 -1
  83. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  84. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  85. package/dist/esm/utils/widgetDispatch.js +3 -1
  86. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  87. package/dist/nextcloud-vue.cjs.js +1159 -812
  88. package/dist/nextcloud-vue.cjs.js.map +2 -2
  89. package/dist/nextcloud-vue.css +580 -324
  90. package/l10n/en.json +20 -20
  91. package/l10n/nl.json +21 -21
  92. package/package.json +1 -1
  93. package/src/components/CnActionDialog/CnActionDialog.vue +45 -4
  94. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +13 -1
  95. package/src/components/CnAppNav/CnAppNav.vue +28 -3
  96. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +15 -0
  97. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +2 -10
  98. package/src/components/CnDataTable/CnDataTable.md +1 -0
  99. package/src/components/CnDataTable/CnDataTable.vue +38 -1
  100. package/src/components/CnDetailPage/CnDetailPage.md +1 -0
  101. package/src/components/CnDetailPage/CnDetailPage.vue +26 -2
  102. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +1 -0
  103. package/src/components/CnIndexPage/CnIndexPage.vue +44 -6
  104. package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -0
  105. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +21 -0
  106. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +38 -2
  107. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +7 -0
  108. package/src/components/CnRetentionWidget/CnRetentionWidget.vue +13 -0
  109. package/src/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue +14 -4
  110. package/src/components/CnTimelineWidget/CnTimelineManage.vue +23 -0
  111. package/src/components/CnTimelineWidget/dashboardRegistration.js +3 -1
  112. package/src/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue +7 -0
  113. package/src/composables/indexSources.js +69 -3
  114. package/src/css/look-board-detail.css +57 -1
  115. package/src/css/look-board-index.css +76 -1
  116. package/src/css/look-board.css +51 -4
  117. package/src/css/table.css +5 -0
  118. package/src/schemas/app-manifest-v2.schema.json +4 -2
  119. package/src/utils/contentHeaderLink.js +7 -1
  120. package/src/utils/savedViewMenu.js +4 -1
  121. package/src/utils/savedViewSummary.js +11 -4
  122. package/src/utils/validateManifestV2.compiled.js +2 -2
  123. package/src/utils/widgetDispatch.js +3 -1
@@ -89,7 +89,7 @@
89
89
  }
90
90
 
91
91
  .cn-look-board .cn-index-page .cn-index-page__header-buttons > .button-vue--secondary:hover,
92
- .cn-look-board .cn-index-page .cn-index-page__header-buttons > .action-item .button-vue:hover {
92
+ .cn-look-board .cn-index-page .cn-index-page__header-buttons > .action-item:not(.action-item--open) .button-vue:hover {
93
93
  background: var(--color-background-hover) !important;
94
94
  }
95
95
 
@@ -1368,6 +1368,7 @@
1368
1368
  margin-inline-start: auto;
1369
1369
  color: var(--color-text-maxcontrast);
1370
1370
  font-size: 13px;
1371
+ white-space: nowrap;
1371
1372
  }
1372
1373
 
1373
1374
  .cn-look-board .cn-object-card--board .cn-object-card__record .cn-object-card__title {
@@ -1380,12 +1381,19 @@
1380
1381
  }
1381
1382
 
1382
1383
  .cn-look-board .cn-object-card--board .cn-object-card__record-meta {
1384
+ --nldesign-component-paragraph-font-size: 14px;
1385
+ --nldesign-component-paragraph-color: var(--color-text-maxcontrast);
1383
1386
  margin: 0;
1384
1387
  color: var(--color-text-maxcontrast);
1385
1388
  font-size: 14px;
1386
1389
  }
1387
1390
 
1391
+ /* The meta line, note and description are paragraphs: each hands the theme,
1392
+ which sets paragraphs with `!important`, its own size and ink. */
1388
1393
  .cn-look-board .cn-object-card--board .cn-object-card__record-note {
1394
+ --nldesign-component-paragraph-font-size: 13px;
1395
+ --nldesign-component-paragraph-font-weight: 600;
1396
+ --nldesign-component-paragraph-color: var(--cn-board-text-soft);
1389
1397
  margin: 0;
1390
1398
  color: var(--cn-board-text-soft);
1391
1399
  font-size: 13px;
@@ -1393,10 +1401,12 @@
1393
1401
  }
1394
1402
 
1395
1403
  .cn-look-board .cn-object-card--board .cn-object-card__record-note--purple {
1404
+ --nldesign-component-paragraph-color: var(--cn-status-purple-text);
1396
1405
  color: var(--cn-status-purple-text);
1397
1406
  }
1398
1407
 
1399
1408
  .cn-look-board .cn-object-card--board .cn-object-card__record-note--teal {
1409
+ --nldesign-component-paragraph-color: var(--cn-status-teal-text);
1400
1410
  color: var(--cn-status-teal-text);
1401
1411
  }
1402
1412
 
@@ -1433,6 +1443,9 @@
1433
1443
  }
1434
1444
 
1435
1445
  .cn-look-board .cn-object-card--board .cn-object-card__record-description {
1446
+ --nldesign-component-paragraph-font-size: 14px;
1447
+ --nldesign-component-paragraph-line-height: 1.4;
1448
+ --nldesign-component-paragraph-color: var(--color-text-maxcontrast);
1436
1449
  margin: 0;
1437
1450
  color: var(--color-text-maxcontrast);
1438
1451
  font-size: 14px;
@@ -1869,6 +1882,22 @@
1869
1882
  font-weight: 700;
1870
1883
  }
1871
1884
 
1885
+ /* A pill in a trailing cell stays inside the cell's width and ends in an
1886
+ ellipsis, instead of running over the next cell (DqTeamwachtrij). */
1887
+ .cn-look-board .cn-object-row__trail .cn-cell-renderer:not(.cn-look-nextcloud *) {
1888
+ display: block;
1889
+ max-width: 100%;
1890
+ }
1891
+
1892
+ .cn-look-board .cn-object-row__trail .cn-status-badge:not(.cn-look-nextcloud *) {
1893
+ display: inline-block;
1894
+ box-sizing: border-box;
1895
+ max-width: 100%;
1896
+ overflow: hidden;
1897
+ text-overflow: ellipsis;
1898
+ vertical-align: middle;
1899
+ }
1900
+
1872
1901
  /* ---- The map view's missing-address card (DqZakenKaart) ---------------- */
1873
1902
  /* The board draws "3 zaken zonder adres" as a 15px title at its normal line
1874
1903
  height with "Toon ze in de tabel" under it as a link flush with the title,
@@ -1943,6 +1972,31 @@
1943
1972
  border-radius: 50%;
1944
1973
  }
1945
1974
 
1975
+ /* The panel's words (DqFilterBeheren): a group heading at 15px/700 in the
1976
+ main ink, the group's note and a view's description at 13px in the muted
1977
+ ink, never bold.
1978
+ @spec openspec/changes/board-saved-views-panel-type/specs/board-saved-views-panel-type/spec.md */
1979
+ .cn-look-board .cn-saved-views-panel:not(.cn-look-nextcloud *) .cn-saved-views-panel__section {
1980
+ margin: 12px 0 0;
1981
+ font-size: 15px;
1982
+ font-weight: 700;
1983
+ line-height: 1.2;
1984
+ color: var(--color-main-text);
1985
+ }
1986
+
1987
+ .cn-look-board .cn-saved-views-panel:not(.cn-look-nextcloud *) .cn-saved-views-panel__note {
1988
+ font-size: 13px;
1989
+ font-weight: 400;
1990
+ line-height: 1.3;
1991
+ color: var(--color-text-maxcontrast);
1992
+ }
1993
+
1994
+ .cn-look-board .cn-saved-views-panel:not(.cn-look-nextcloud *) .cn-saved-views-panel__subline {
1995
+ font-size: 13px;
1996
+ font-weight: 400;
1997
+ color: var(--color-text-maxcontrast);
1998
+ }
1999
+
1946
2000
  /* ---- A saved view row's menu ------------------------------------------- */
1947
2001
  /* The menu trigger on a saved view row ("Beheer Termijn deze week") is a
1948
2002
  round 34px button (DqFilterBeheren, DqFilterInMenu); NcActions drew the
@@ -2005,3 +2059,24 @@
2005
2059
  .cn-look-board .cn-saved-views-panel:not(.cn-look-nextcloud *) .cn-saved-views-panel__row:is(.cn-saved-views-panel__row--selected, :has(.action-item--open)) .cn-saved-views-panel__name-text {
2006
2060
  color: var(--color-primary-element-light-text);
2007
2061
  }
2062
+
2063
+ /* ---- The side-panel grid's row spacing --------------------------------- */
2064
+ /* The side-panel page is a grid of seven rows; a row-gap opens between every
2065
+ pair, empty or not, so a page without below-header, stat row or chip row
2066
+ drew 60px of nothing under its header (DqZoekresultaten). The grid has no
2067
+ row gap here; each part that is present carries the section gap under it.
2068
+ @spec openspec/changes/side-panel-grid-no-empty-row-gaps/specs/side-panel-grid-no-empty-row-gaps/spec.md */
2069
+ .cn-look-board .cn-index-page--with-side-panel:not(.cn-look-nextcloud *) {
2070
+ row-gap: 0;
2071
+ }
2072
+
2073
+ .cn-look-board .cn-index-page--with-side-panel:not(.cn-look-nextcloud *) > :first-child,
2074
+ .cn-look-board .cn-index-page--with-side-panel:not(.cn-look-nextcloud *) > .cn-index-page__below-header,
2075
+ .cn-look-board .cn-index-page--with-side-panel:not(.cn-look-nextcloud *) > .cn-index-page__stat-row,
2076
+ .cn-look-board .cn-index-page--with-side-panel:not(.cn-look-nextcloud *) > .cn-actions-bar {
2077
+ margin-bottom: var(--cn-board-section-gap);
2078
+ }
2079
+
2080
+ .cn-look-board .cn-index-page--with-side-panel:not(.cn-look-nextcloud *) > .cn-index-page__quick-filter-row {
2081
+ margin-bottom: calc(var(--cn-board-section-gap) + 12px);
2082
+ }
@@ -582,6 +582,31 @@
582
582
  background: var(--color-background-hover);
583
583
  }
584
584
 
585
+ /* ---- An ordered list field ----------------------------------------------- */
586
+ /* DqPersoonlijkeInstellingen "Weergaven in mijn menu": a row's labelled remove
587
+ button ("Uit menu halen") is an outlined secondary button, and the select
588
+ that adds a row runs the field's full width.
589
+ @spec openspec/changes/board-ordered-list-field/specs/board-ordered-list-field/spec.md */
590
+ .cn-look-board .cn-ordered-list-field__button--text:not(.cn-look-nextcloud *) {
591
+ box-sizing: border-box;
592
+ height: 34px;
593
+ min-height: 34px;
594
+ padding: 0 14px;
595
+ border: 1px solid var(--cn-board-control-border);
596
+ background: var(--color-main-background);
597
+ color: var(--color-main-text);
598
+ font-size: 14px;
599
+ }
600
+
601
+ .cn-look-board .cn-ordered-list-field__button--text:not(.cn-look-nextcloud *):hover:not(:disabled) {
602
+ background: var(--color-background-hover);
603
+ }
604
+
605
+ .cn-look-board .cn-ordered-list-field__add .v-select:not(.cn-look-nextcloud *) {
606
+ width: 100%;
607
+ max-width: none;
608
+ }
609
+
585
610
  /* ---- A secondary button --------------------------------------------------- */
586
611
  /* The boards draw every secondary button neutral: the main background, a 1px
587
612
  control border, the main text, the hover ground on hover (DqFlow "Testen
@@ -1407,6 +1432,15 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1407
1432
  color: var(--color-text-maxcontrast);
1408
1433
  }
1409
1434
 
1435
+ /* A linked cell in a settings card's table reads in the text ink, as the index
1436
+ tables do, not in the settings page's link blue (DqInstellingen: a
1437
+ connection's name opens its settings card). The underline marks the link.
1438
+ @spec openspec/changes/settings-table-link-ink/specs/settings-board-look/spec.md */
1439
+ .cn-look-board .settings-section .cn-data-table a.cn-cell-renderer__link:not(.cn-look-nextcloud *) {
1440
+ color: var(--color-main-text);
1441
+ text-decoration: underline;
1442
+ }
1443
+
1410
1444
  /* Section actions sit at the end of the title row. The row is a grid, so a
1411
1445
  long title wraps beside the buttons instead of running under them. A
1412
1446
  half-width card keeps them there (DqVthInstellingen "Inspectiechecklists",
@@ -1801,14 +1835,16 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1801
1835
  line-height: 1.5;
1802
1836
  }
1803
1837
 
1838
+ /* `!important` on the size: a theme that sizes every paragraph with
1839
+ `!important` (thematiq's paragraph token, 15px) would win otherwise. */
1804
1840
  .cn-look-board .notecard.notecard--info:not(.cn-look-nextcloud *) p {
1805
1841
  color: var(--color-primary-element-light-text) !important;
1806
- font-size: inherit;
1842
+ font-size: inherit !important;
1807
1843
  line-height: inherit;
1808
1844
  }
1809
1845
 
1810
1846
  .cn-look-board .notecard.notecard--info:not(.cn-look-nextcloud *) .notecard__heading {
1811
- font-size: inherit;
1847
+ font-size: inherit !important;
1812
1848
  font-weight: 700 !important;
1813
1849
  }
1814
1850
 
@@ -2850,8 +2886,12 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
2850
2886
  font-size: 14px;
2851
2887
  }
2852
2888
 
2889
+ /* The version card's title follows its board: 17px on DqInstellingenAlgemeen
2890
+ and LrBeheerinstellingen; an app whose board draws another size passes the
2891
+ shell's `versionTitleSize`.
2892
+ @spec openspec/changes/board-version-title-size/specs/board-settings-card-controls/spec.md */
2853
2893
  .cn-look-board .settings-section:not(.cn-look-nextcloud *):has(.cn-version-info--compact) > .settings-section__name {
2854
- font-size: 18px;
2894
+ font-size: var(--cn-board-version-title-size, 17px);
2855
2895
  }
2856
2896
 
2857
2897
  /* ---- A card titled as a side card (`titleTone: "side"`) ------------------ */
@@ -2886,9 +2926,16 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
2886
2926
  gives the second pixel back so the words stay put. The board draws no
2887
2927
  option icon, only the radio and the words.
2888
2928
  @spec openspec/changes/board-setup-choice-rows/specs/board-setup-choice-rows/spec.md */
2929
+ /* The radio sits 21px inside the option's edge (DqInstellen): 1px border and
2930
+ 20px padding, or 2px and 19px on the chosen option.
2931
+ @spec openspec/changes/board-setup-choice-inset/specs/board-setup-choice-rows/spec.md */
2932
+ .cn-look-board .cn-setup-step .cn-choice-cards .cn-choice-cards__row:not(.cn-look-nextcloud *) {
2933
+ padding: 12px 20px;
2934
+ }
2935
+
2889
2936
  .cn-look-board .cn-setup-step .cn-choice-cards .cn-choice-cards__row--selected:not(.cn-look-nextcloud *),
2890
2937
  .cn-look-board .cn-setup-step .cn-choice-cards .cn-choice-cards__row--selected:hover:not(.cn-look-nextcloud *) {
2891
- padding: 11px 13px;
2938
+ padding: 11px 19px;
2892
2939
  border-width: 2px;
2893
2940
  box-shadow: none;
2894
2941
  }
package/src/css/table.css CHANGED
@@ -203,6 +203,11 @@
203
203
  /* The overline of a cell (`columns[].overline` / `overlineText`): muted and
204
204
  smaller, on its own line above the value. Same theme hooks as the
205
205
  secondary line. */
206
+ /* A count column's zero label as text (`aggregate.zeroAs: "text"`): "Geen" in the muted ink. */
207
+ .cn-data-table .cn-table-cell__zero {
208
+ color: var(--color-text-maxcontrast);
209
+ }
210
+
206
211
  .cn-data-table .cn-table-cell__overline {
207
212
  display: block;
208
213
  color: var(--cn-table-secondary-color, var(--color-text-maxcontrast));
@@ -3,7 +3,7 @@
3
3
  "$id": "https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json",
4
4
  "title": "Conduction App Manifest v2",
5
5
  "description": "v2 schema for the JSON-driven page and navigation manifest consumed by @conduction/nextcloud-vue. Introduces a uniform widgets[] array on every page type with a per-slot grid coordinate system, a typed actions[] discriminator, and the required $schema field for version detection. v1 manifests continue to validate against app-manifest.schema.json (unchanged).",
6
- "version": "2.154.0",
6
+ "version": "2.155.0",
7
7
  "type": "object",
8
8
  "required": ["$schema", "version"],
9
9
  "allOf": [
@@ -3609,7 +3609,9 @@
3609
3609
  "else": {
3610
3610
  "$ref": "#/$defs/actionFields",
3611
3611
  "properties": {
3612
- "children": { "items": { "$ref": "#/$defs/headerAction" } }
3612
+ "children": { "items": { "$ref": "#/$defs/headerAction" } },
3613
+ "tabs": { "type": "array", "items": { "type": "string", "minLength": 1 }, "description": "As a `primaryActionByStage` entry: the body tabs beside which its header button shows (2.155.0)." },
3614
+ "notTabs": { "type": "array", "items": { "type": "string", "minLength": 1 }, "description": "As a `primaryActionByStage` entry: the body tabs beside which its header button stands aside; it stays in the Actions menu (2.155.0)." }
3613
3615
  },
3614
3616
  "unevaluatedProperties": false
3615
3617
  }
@@ -52,6 +52,8 @@ export function contentHeaderLink(content) {
52
52
  /**
53
53
  * The header link a widget DEFINITION declares: `headerLink` on the
54
54
  * definition itself, else what its content asks for (see contentHeaderLink).
55
+ * A view-all the widget draws under its own content
56
+ * (`viewAllPlacement: "footer"`) is not a header link.
55
57
  *
56
58
  * @param {object|null|undefined} widget A widget definition.
57
59
  * @return {{label: string, route?: string, params?: object, query?: object, href?: string}|null}
@@ -64,7 +66,11 @@ export function widgetHeaderLink(widget) {
64
66
  if (declared && typeof declared === 'object' && typeof declared.label === 'string' && declared.label !== '') {
65
67
  return declared
66
68
  }
67
- return contentHeaderLink(widget.content)
69
+ const content = widget.content
70
+ if (content && content.viewAllPlacement === 'footer' && !content.headerLink) {
71
+ return null
72
+ }
73
+ return contentHeaderLink(content)
68
74
  }
69
75
 
70
76
  /**
@@ -198,6 +198,9 @@ export const SAVED_VIEW_MENU_EMPTY = 'saved-views-empty'
198
198
  * An entry with a badge carries it as the menu entry's `count` (and
199
199
  * `counterVariant`), which CnAppRoot fetches like any filtered menu count.
200
200
  *
201
+ * The caption carries a pencil that opens the user settings, where the views
202
+ * in the menu are reordered, removed and added.
203
+ *
201
204
  * With `showEmpty`, an app that offers saved views shows the group also while
202
205
  * the user pinned none, with one line saying how to add one, so the group can
203
206
  * be found.
@@ -215,7 +218,7 @@ export function withSavedViewMenu(menu, entries, options = {}) {
215
218
  }
216
219
  const sorted = menu.map((item, index) => ({ item, index })).sort((a, b) => byOrder(a.item, b.item) || a.index - b.index).map(({ item }) => item)
217
220
  const group = [
218
- { id: SAVED_VIEW_MENU_CAPTION, type: 'caption', label: t('nextcloud-vue', 'My views') },
221
+ { id: SAVED_VIEW_MENU_CAPTION, type: 'caption', label: t('nextcloud-vue', 'My views'), action: 'user-settings' },
219
222
  ...(list.length > 0
220
223
  ? list.map((e) => ({
221
224
  id: `${SAVED_VIEW_MENU_PREFIX}${e.id}`,
@@ -69,17 +69,23 @@ export function summarizeViewFilters(state, options = {}) {
69
69
 
70
70
  /**
71
71
  * The ids a view's filters hold per reference property, for a label lookup.
72
+ * A filter on a value that identifies a record without being its id (a case
73
+ * type's `identifier`) is a reference too when the page's `filterLabels`
74
+ * entry names it: `reference: { register?, schema, matchField, labelField }`.
72
75
  *
73
76
  * @param {{filters?: object}} state The view's state.
74
77
  * @param {Array<object>} fields The page schema's fields (`fieldsFromSchema`).
75
- * @return {Array<{key: string, register: string, schema: string, labelField: string, ids: Array<string>}>} One entry per reference filter.
78
+ * @param {{[key: string]: {reference?: object}}} [filterLabels] The page's `config.filterLabels`.
79
+ * @return {Array<{key: string, register: string, schema: string, labelField: string, matchField?: string, ids: Array<string>}>} One entry per reference filter.
80
+ * @spec openspec/changes/saved-view-summary-match-field-labels/specs/saved-view-menu-settings/spec.md#requirement-a-filter-on-a-records-identifier-reads-as-the-records-name
76
81
  */
77
- export function viewFilterReferences(state, fields) {
82
+ export function viewFilterReferences(state, fields, filterLabels = {}) {
78
83
  const filters = (state && state.filters && typeof state.filters === 'object') ? state.filters : {}
79
84
  const out = []
80
85
  for (const [key, raw] of Object.entries(filters)) {
81
86
  const field = (Array.isArray(fields) ? fields : []).find((f) => f && f.key === key)
82
- const ref = field && field.reference
87
+ const named = filterLabels && filterLabels[key] && filterLabels[key].reference && typeof filterLabels[key].reference === 'object' ? filterLabels[key].reference : null
88
+ const ref = (field && field.reference) || named
83
89
  if (!ref || ref.schema === undefined || ref.schema === null) {
84
90
  continue
85
91
  }
@@ -87,7 +93,8 @@ export function viewFilterReferences(state, fields) {
87
93
  .filter((id) => (typeof id === 'string' || typeof id === 'number') && id !== '' && id !== MISSING_VALUE)
88
94
  .map(String)
89
95
  if (ids.length > 0) {
90
- out.push({ key, register: ref.register || '', schema: String(ref.schema), labelField: ref.labelField || '', ids })
96
+ const matchField = ref === named && typeof ref.matchField === 'string' && ref.matchField !== '' ? { matchField: ref.matchField } : {}
97
+ out.push({ key, register: ref.register || '', schema: String(ref.schema), labelField: ref.labelField || '', ...matchField, ids })
91
98
  }
92
99
  }
93
100
  return out