@conduction/nextcloud-vue 2.141.0 → 2.143.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.
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +27 -0
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue2.js.map +1 -1
- package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js +2 -1
- package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js.map +1 -1
- package/dist/esm/components/CnAiCompanion/CnAiInput.vue2.js +9 -0
- package/dist/esm/components/CnAiCompanion/CnAiInput.vue2.js.map +1 -1
- package/dist/esm/components/CnAiCompanion/CnAiInput.vue3.js +21 -22
- package/dist/esm/components/CnAiCompanion/CnAiInput.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +29 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js +28 -13
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +2 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +13 -0
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +3 -3
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue.js +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
- package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +21 -0
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +2 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +34 -3
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +70 -5
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +5 -3
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js +17 -4
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +21 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +36 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js +14 -0
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +3 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +2 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPageHeader/CnHeaderTrail.vue2.js +6 -1
- package/dist/esm/components/CnPageHeader/CnHeaderTrail.vue2.js.map +1 -1
- package/dist/esm/components/CnPageHeader/CnHeaderTrail.vue3.js.map +1 -1
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue.js +1 -1
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js +31 -1
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js.map +1 -1
- package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +12 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +2 -2
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue.js +1 -1
- package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +4 -0
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +18 -8
- package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/contacts/CnContactsTab.vue.js +1 -1
- package/dist/esm/integrations/builtin/contacts/CnContactsTab.vue2.js +52 -1
- package/dist/esm/integrations/builtin/contacts/CnContactsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/contacts/CnContactsTab.vue3.js +119 -65
- package/dist/esm/integrations/builtin/contacts/CnContactsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +86 -4
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js +67 -5
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +10 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +12 -3
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +976 -592
- package/dist/esm/utils/buildViewTree.js +23 -8
- package/dist/esm/utils/buildViewTree.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +1363 -734
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +976 -592
- package/l10n/en.json +10 -1
- package/l10n/nl.json +12 -3
- package/package.json +1 -1
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +28 -1
- package/src/components/CnAiCompanion/CnAiChatPanel.vue +12 -0
- package/src/components/CnAiCompanion/CnAiInput.vue +32 -1
- package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +34 -4
- package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +1 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +15 -1
- package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +8 -0
- package/src/components/CnChoiceCards/CnChoiceCards.vue +1 -0
- package/src/components/CnDataTable/CnDataTable.md +1 -0
- package/src/components/CnDataTable/CnDataTable.vue +22 -1
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +1 -0
- package/src/components/CnFactsWidget/CnFactsWidget.vue +34 -3
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +72 -7
- package/src/components/CnFilesBrowser/filesBrowser.js +17 -4
- package/src/components/CnFilesBrowser/filesBrowserColumns.js +20 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +37 -2
- package/src/components/CnIndexPage/useSelfFetchList.js +14 -0
- package/src/components/CnObjectSidebar/CnFilesTab.vue +4 -1
- package/src/components/CnPageHeader/CnHeaderTrail.vue +6 -1
- package/src/components/CnPartyPicker/CnPartyPicker.vue +31 -1
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +21 -1
- package/src/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue +6 -0
- package/src/components/CnTimelineWidget/CnTimelineManage.vue +10 -1
- package/src/css/dialog.css +18 -0
- package/src/css/look-board-detail.css +126 -0
- package/src/css/look-board-index.css +95 -1
- package/src/css/look-board.css +90 -1
- package/src/integrations/builtin/contacts/CnContactsTab.vue +101 -26
- package/src/integrations/builtin/contacts/__tests__/CnContactsTabBoardRows.spec.js +67 -0
- package/src/integrations/builtin/deck/CnDeckCard.vue +121 -2
- package/src/integrations/builtin/deck/__tests__/CnDeckCardHeaderActions.spec.js +68 -0
- package/src/utils/buildViewTree.js +23 -8
|
@@ -824,6 +824,15 @@
|
|
|
824
824
|
padding: 10px 12px;
|
|
825
825
|
}
|
|
826
826
|
|
|
827
|
+
/* A table on a settings card draws its head 42.5px, as DqInstellingen and
|
|
828
|
+
DqVthInstellingen do, also when no head cell carries a control that makes
|
|
829
|
+
it that tall (the VTH tables read 37.5px).
|
|
830
|
+
@spec openspec/changes/board-settings-table-head-height/specs/settings-board-look/spec.md */
|
|
831
|
+
.cn-look-board .settings-section .cn-table-container--board .cn-data-table thead th:not(.cn-look-nextcloud *) {
|
|
832
|
+
height: 42.5px;
|
|
833
|
+
box-sizing: border-box;
|
|
834
|
+
}
|
|
835
|
+
|
|
827
836
|
.cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table td {
|
|
828
837
|
padding: 11px 12px;
|
|
829
838
|
}
|
|
@@ -900,11 +909,13 @@
|
|
|
900
909
|
`#content[class*="app-"]`, an id selector no class rule outranks, so a plain
|
|
901
910
|
`content-box` here was ignored and the cell left 12px for the checkbox (the
|
|
902
911
|
header's checkbox showed as a stray bracket). */
|
|
912
|
+
/* The checkbox starts 20px in, as the boards draw a native checkbox (16px of
|
|
913
|
+
cell padding and its 4px margin; DqZoekresultaten), in the same 60px. */
|
|
903
914
|
.cn-look-board .cn-table-container--board .cn-data-table .cn-table-col--checkbox {
|
|
904
915
|
box-sizing: border-box !important;
|
|
905
916
|
width: 60px;
|
|
906
917
|
min-width: 60px;
|
|
907
|
-
padding-inline:
|
|
918
|
+
padding-inline: 20px 12px;
|
|
908
919
|
text-align: start;
|
|
909
920
|
}
|
|
910
921
|
|
|
@@ -1008,6 +1019,19 @@
|
|
|
1008
1019
|
font-weight: 700;
|
|
1009
1020
|
}
|
|
1010
1021
|
|
|
1022
|
+
/* `widgetProps.tone: "neutral"`: the grey person chip (DqContacten), 13px,
|
|
1023
|
+
12px before the name.
|
|
1024
|
+
@spec openspec/changes/board-avatar-chip/specs/data-table/spec.md#requirement-a-board-avatar-cell-draws-the-initials-chip */
|
|
1025
|
+
.cn-look-board .cn-table-container--board .cn-data-table .cn-cell-renderer__avatar-initials--neutral {
|
|
1026
|
+
background: var(--color-background-dark);
|
|
1027
|
+
color: var(--color-main-text);
|
|
1028
|
+
font-size: 13px;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
.cn-look-board .cn-table-container--board .cn-data-table .cn-cell-renderer__avatar:has(.cn-cell-renderer__avatar-initials--neutral) {
|
|
1032
|
+
gap: 12px;
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1011
1035
|
.cn-look-board .cn-table-container--board .cn-data-table td.cn-table-col--title .cn-cell-renderer__avatar-name {
|
|
1012
1036
|
text-decoration: underline;
|
|
1013
1037
|
text-underline-offset: 2px;
|
|
@@ -1687,6 +1711,36 @@
|
|
|
1687
1711
|
margin-bottom: 16px;
|
|
1688
1712
|
}
|
|
1689
1713
|
|
|
1714
|
+
/* The heading sits above the list card, not inside it (DqAfdelingen: "Vergunningen"
|
|
1715
|
+
and its line, then the card): with a heading the list area is unframed and
|
|
1716
|
+
its table and footer carry the card.
|
|
1717
|
+
@spec openspec/changes/board-folder-scope-outside-card/specs/index-page/spec.md#requirement-the-selected-folder-heads-the-list-from-outside-its-card */
|
|
1718
|
+
.cn-look-board .cn-index-page__main.cn-index-page__main--table:has(> .cn-index-page__scope-heading) {
|
|
1719
|
+
border: 0;
|
|
1720
|
+
border-radius: 0;
|
|
1721
|
+
background: transparent;
|
|
1722
|
+
overflow: visible;
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
.cn-look-board .cn-index-page__main--table:has(> .cn-index-page__scope-heading) > .cn-table-container.cn-table-container--board {
|
|
1726
|
+
border: 1px solid var(--color-border);
|
|
1727
|
+
border-radius: var(--cn-board-card-radius, 12px);
|
|
1728
|
+
background: var(--color-main-background);
|
|
1729
|
+
overflow: hidden;
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
.cn-look-board .cn-index-page__main--table:has(> .cn-index-page__scope-heading):has(> .cn-index-page__pagination) > .cn-table-container.cn-table-container--board {
|
|
1733
|
+
border-bottom: 0;
|
|
1734
|
+
border-radius: var(--cn-board-card-radius, 12px) var(--cn-board-card-radius, 12px) 0 0;
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
.cn-look-board .cn-index-page__main--table:has(> .cn-index-page__scope-heading) > .cn-index-page__pagination {
|
|
1738
|
+
border: 1px solid var(--color-border);
|
|
1739
|
+
border-top: 0;
|
|
1740
|
+
border-radius: 0 0 var(--cn-board-card-radius, 12px) var(--cn-board-card-radius, 12px);
|
|
1741
|
+
background: var(--color-main-background);
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1690
1744
|
.cn-look-board .cn-index-page__scope-title {
|
|
1691
1745
|
font-size: 20px;
|
|
1692
1746
|
font-weight: 700;
|
|
@@ -2184,3 +2238,43 @@
|
|
|
2184
2238
|
color: var(--color-text-maxcontrast);
|
|
2185
2239
|
font-size: 13px;
|
|
2186
2240
|
}
|
|
2241
|
+
|
|
2242
|
+
/* A table's leading icon on a 32px tile, radius 8, an 18px glyph, 12px
|
|
2243
|
+
before the title (DqOrganisaties, PqOrganisaties: teal; most boards: the
|
|
2244
|
+
light primary). The tile's tone is the page's `rowIconTone`.
|
|
2245
|
+
@spec openspec/changes/board-row-icon-tile/specs/data-table/spec.md#requirement-a-board-tables-leading-icon-sits-on-a-tile */
|
|
2246
|
+
.cn-look-board .cn-data-table td.cn-table-col--icon,
|
|
2247
|
+
.cn-look-board .cn-data-table th.cn-table-col--icon {
|
|
2248
|
+
width: 48px;
|
|
2249
|
+
padding-inline: 16px 0;
|
|
2250
|
+
}
|
|
2251
|
+
|
|
2252
|
+
.cn-look-board .cn-data-table td.cn-table-col--icon .material-design-icon {
|
|
2253
|
+
width: 32px;
|
|
2254
|
+
height: 32px;
|
|
2255
|
+
border-radius: 8px;
|
|
2256
|
+
justify-content: center;
|
|
2257
|
+
align-items: center;
|
|
2258
|
+
background: var(--color-primary-element-light);
|
|
2259
|
+
color: var(--color-primary-element-light-text);
|
|
2260
|
+
}
|
|
2261
|
+
|
|
2262
|
+
.cn-look-board .cn-data-table td.cn-table-col--icon-teal .material-design-icon {
|
|
2263
|
+
background: var(--cn-status-teal-bg);
|
|
2264
|
+
color: var(--cn-status-teal-text);
|
|
2265
|
+
}
|
|
2266
|
+
|
|
2267
|
+
.cn-look-board .cn-data-table td.cn-table-col--icon-neutral .material-design-icon {
|
|
2268
|
+
background: var(--color-background-dark);
|
|
2269
|
+
color: var(--color-main-text);
|
|
2270
|
+
}
|
|
2271
|
+
|
|
2272
|
+
.cn-look-board .cn-data-table td.cn-table-col--icon .material-design-icon svg {
|
|
2273
|
+
width: 18px;
|
|
2274
|
+
height: 18px;
|
|
2275
|
+
}
|
|
2276
|
+
|
|
2277
|
+
.cn-look-board .cn-data-table td.cn-table-col--icon + td,
|
|
2278
|
+
.cn-look-board .cn-data-table th.cn-table-col--icon + th {
|
|
2279
|
+
padding-inline-start: 12px;
|
|
2280
|
+
}
|
package/src/css/look-board.css
CHANGED
|
@@ -1458,6 +1458,9 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
|
|
|
1458
1458
|
connection's name opens its settings card). The underline marks the link.
|
|
1459
1459
|
@spec openspec/changes/settings-table-link-ink/specs/settings-board-look/spec.md */
|
|
1460
1460
|
.cn-look-board .settings-section .cn-data-table a.cn-cell-renderer__link:not(.cn-look-nextcloud *) {
|
|
1461
|
+
/* thematiq colours every link with `!important` from these two tokens. */
|
|
1462
|
+
--nldesign-component-link-color: var(--color-main-text);
|
|
1463
|
+
--nldesign-color-on-surface: var(--color-main-text);
|
|
1461
1464
|
color: var(--color-main-text);
|
|
1462
1465
|
text-decoration: underline;
|
|
1463
1466
|
}
|
|
@@ -1542,7 +1545,13 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
|
|
|
1542
1545
|
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc,
|
|
1543
1546
|
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc,
|
|
1544
1547
|
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc {
|
|
1545
|
-
|
|
1548
|
+
/* 4px under the title and 14px above the content (PtBeheerinstellingen);
|
|
1549
|
+
the shell's `descGap` sets another gap, the content 10px further, as
|
|
1550
|
+
the boards drawn from NcBeheerInstellingen space them (6 and 16:
|
|
1551
|
+
DqBeheerinstellingen, LrBeheerinstellingen). The card's gap is 14px.
|
|
1552
|
+
@spec openspec/changes/board-settings-desc-spacing/specs/settings-board-look/spec.md */
|
|
1553
|
+
margin-top: calc(var(--cn-board-settings-desc-gap, 4px) - 14px);
|
|
1554
|
+
margin-bottom: calc(var(--cn-board-settings-desc-gap, 4px) - 4px);
|
|
1546
1555
|
}
|
|
1547
1556
|
|
|
1548
1557
|
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section > .notecard,
|
|
@@ -2122,6 +2131,15 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
|
|
|
2122
2131
|
padding: 20px var(--cn-board-dashboard-card-inset) calc(12px - var(--cn-board-first-line-leading, 0.15em));
|
|
2123
2132
|
}
|
|
2124
2133
|
|
|
2134
|
+
/* Over a list that rules above its first row (record list ruleAbove, task
|
|
2135
|
+
list, decision list) the rule stands 6px under the title and the row's own
|
|
2136
|
+
12px follows it: the boards' card is title, 6px, rule, row (DqMijnTeam
|
|
2137
|
+
"Vastgelopen zaken", DqMijnWerk "Zaken die u volgt").
|
|
2138
|
+
@spec openspec/changes/board-card-title-above-ruled-list/specs/board-card-title-above-ruled-list/spec.md#requirement-a-ruled-list-starts-6px-under-the-card-title */
|
|
2139
|
+
.cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--nc-dashboard):not(.cn-widget-wrapper--borderless):has(> .cn-widget-wrapper__content .cn-record-list--rule-above, > .cn-widget-wrapper__content .cn-tasks-widget__list, > .cn-widget-wrapper__content .cn-decision-list__rows) .cn-widget-wrapper__header {
|
|
2140
|
+
padding-bottom: 6px;
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2125
2143
|
/* ---- Macros rows (CnMacrosWidget) ---------------------------------------- */
|
|
2126
2144
|
/* A macro reads as the boards draw a card's list row: the name at weight 500
|
|
2127
2145
|
over its 13px line, both at the font's normal line height, 56px a row
|
|
@@ -2222,6 +2240,23 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
|
|
|
2222
2240
|
line-height: normal;
|
|
2223
2241
|
}
|
|
2224
2242
|
|
|
2243
|
+
/* A stacked audit row (DqTaak "Historie", `content.layout: "stacked"`): 12px
|
|
2244
|
+
above and below, the action 15px weight 600, the moment and who under it
|
|
2245
|
+
13px muted, 2px apart.
|
|
2246
|
+
@spec openspec/changes/audit-card-stacked-rows/specs/audit-trail/spec.md#requirement-an-audit-row-can-put-its-moment-under-the-action */
|
|
2247
|
+
.cn-look-board .cn-audit-card__row--stacked:not(.cn-look-nextcloud *) {
|
|
2248
|
+
padding: 12px 0;
|
|
2249
|
+
}
|
|
2250
|
+
|
|
2251
|
+
.cn-look-board .cn-audit-card__row--stacked .cn-audit-card__action:not(.cn-look-nextcloud *) {
|
|
2252
|
+
font-size: 15px;
|
|
2253
|
+
font-weight: 600;
|
|
2254
|
+
}
|
|
2255
|
+
|
|
2256
|
+
.cn-look-board .cn-audit-card__row--stacked .cn-audit-card__when:not(.cn-look-nextcloud *) {
|
|
2257
|
+
color: var(--color-text-maxcontrast);
|
|
2258
|
+
}
|
|
2259
|
+
|
|
2225
2260
|
/* ---- Managed timeline rows (DqZaakHistorie "Historie van de zaak") ------ */
|
|
2226
2261
|
/* The board draws a timeline entry as a rail row: a 34px circle on a 2px
|
|
2227
2262
|
line, the message first at 15px weight 600, the kind, author and moment
|
|
@@ -3115,6 +3150,23 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
|
|
|
3115
3150
|
background: var(--cn-board-sunken-ground);
|
|
3116
3151
|
}
|
|
3117
3152
|
|
|
3153
|
+
/* An option's two lines at line height 1.2 and its icon at the top of the
|
|
3154
|
+
row, as DqVolgendeStap draws them (rows 60 high, not 70). */
|
|
3155
|
+
.cn-look-board .cn-choice-cards .cn-choice-cards__row-title:not(.cn-look-nextcloud *),
|
|
3156
|
+
.cn-look-board .cn-choice-cards .cn-choice-cards__row-description:not(.cn-look-nextcloud *) {
|
|
3157
|
+
line-height: 1.2;
|
|
3158
|
+
}
|
|
3159
|
+
|
|
3160
|
+
.cn-look-board .cn-choice-cards .cn-choice-cards__row-icon:not(.cn-look-nextcloud *) {
|
|
3161
|
+
align-self: flex-start;
|
|
3162
|
+
}
|
|
3163
|
+
|
|
3164
|
+
/* The chosen option's fields start under its text: radio 18, icon 20 and
|
|
3165
|
+
two 12px gaps past the row's 14px inset. */
|
|
3166
|
+
.cn-look-board .cn-choice-cards .cn-choice-cards__cell--with-details:has(.cn-choice-cards__row-icon) .cn-choice-cards__details:not(.cn-look-nextcloud *) {
|
|
3167
|
+
padding-inline-start: 76px;
|
|
3168
|
+
}
|
|
3169
|
+
|
|
3118
3170
|
/* A chosen option stays white under its primary edge, as every Dq dialog board
|
|
3119
3171
|
draws it (design-system #371); the Nextcloud look keeps the tint.
|
|
3120
3172
|
@spec openspec/changes/board-choice-row-chosen-white/specs/board-choice-row-chosen-white/spec.md#requirement-a-chosen-board-option-is-white */
|
|
@@ -3196,3 +3248,40 @@ html :where(.cn-look-board) :is(h2, h3, h5, h6):where(.cn-inner-heading) {
|
|
|
3196
3248
|
.cn-look-board .cn-map-widget .leaflet-bar a.cn-map-widget__control:not(.cn-look-nextcloud *):focus-visible {
|
|
3197
3249
|
background: var(--color-background-hover);
|
|
3198
3250
|
}
|
|
3251
|
+
|
|
3252
|
+
/* The manage timeline's lines as DqZaakHistorie draws them: the subtitle and
|
|
3253
|
+
the event count 14px muted (over a theme's paragraph tokens, which set a
|
|
3254
|
+
paragraph 15px ink), the count line under a hairline, and the note form
|
|
3255
|
+
card 12px under its heading with each label 6px over its field. */
|
|
3256
|
+
.cn-look-board .cn-timeline-manage__subtitle:not(.cn-look-nextcloud *),
|
|
3257
|
+
.cn-look-board .cn-timeline-manage__count:not(.cn-look-nextcloud *) {
|
|
3258
|
+
--nldesign-component-paragraph-font-size: 14px;
|
|
3259
|
+
--nldesign-component-paragraph-line-height: 1.2;
|
|
3260
|
+
--nldesign-component-paragraph-color: var(--color-text-maxcontrast);
|
|
3261
|
+
font-size: 14px;
|
|
3262
|
+
line-height: 1.2;
|
|
3263
|
+
color: var(--color-text-maxcontrast);
|
|
3264
|
+
}
|
|
3265
|
+
|
|
3266
|
+
.cn-look-board .cn-timeline-manage__footer:not(.cn-look-nextcloud *) {
|
|
3267
|
+
padding-top: 12px;
|
|
3268
|
+
border-top: 1px solid var(--cn-board-hairline);
|
|
3269
|
+
}
|
|
3270
|
+
|
|
3271
|
+
.cn-look-board .cn-timeline-manage--composer-only .cn-timeline-manage__header:not(.cn-look-nextcloud *) {
|
|
3272
|
+
margin-block-end: 12px;
|
|
3273
|
+
}
|
|
3274
|
+
|
|
3275
|
+
.cn-look-board .cn-timeline-manage__composer:not(.cn-look-nextcloud *) {
|
|
3276
|
+
gap: 6px;
|
|
3277
|
+
}
|
|
3278
|
+
|
|
3279
|
+
.cn-look-board .cn-timeline-manage__draft-label:not(.cn-look-nextcloud *) {
|
|
3280
|
+
margin-block-start: 6px;
|
|
3281
|
+
font-size: 14px;
|
|
3282
|
+
font-weight: 600;
|
|
3283
|
+
}
|
|
3284
|
+
|
|
3285
|
+
.cn-look-board .cn-timeline-manage__draft-label:first-child:not(.cn-look-nextcloud *) {
|
|
3286
|
+
margin-block-start: 0;
|
|
3287
|
+
}
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
class="cn-contacts-tab__group">
|
|
88
88
|
<h3 class="cn-contacts-tab__group-title">
|
|
89
89
|
{{ group.label }}
|
|
90
|
-
<span class="cn-contacts-tab__group-count">{{ group.items.length }}</span>
|
|
90
|
+
<span v-if="!isBoard" class="cn-contacts-tab__group-count">{{ group.items.length }}</span>
|
|
91
91
|
</h3>
|
|
92
92
|
<ul class="cn-contacts-tab__list">
|
|
93
93
|
<li
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
@click="openReverseLookup(contact)">
|
|
98
98
|
<div class="cn-contacts-tab__avatar">
|
|
99
99
|
<NcAvatar
|
|
100
|
-
:size="40"
|
|
100
|
+
:size="isBoard ? 32 : 40"
|
|
101
101
|
:displayName="contact.displayName || unknownLabel"
|
|
102
102
|
:user="avatarSeed(contact)"
|
|
103
103
|
:url="contact.avatarUrl || undefined"
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
{{ contact.displayName || unknownLabel }}
|
|
113
113
|
</span>
|
|
114
114
|
<CnStatusBadge
|
|
115
|
-
v-if="contact.role"
|
|
115
|
+
v-if="contact.role && !isBoard"
|
|
116
116
|
:label="roleLabel(contact)"
|
|
117
117
|
:variant="roleVariant(contact)"
|
|
118
118
|
size="small" />
|
|
@@ -123,30 +123,54 @@
|
|
|
123
123
|
size="small"
|
|
124
124
|
data-testid="cn-contacts-tab-inactive" />
|
|
125
125
|
</div>
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
<
|
|
131
|
-
<
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
<
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
v-if="
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
<
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
126
|
+
<!-- The board look sets the details on one line (DqZaakBetrokkenen). -->
|
|
127
|
+
<span v-if="isBoard && boardMetaOf(contact)"
|
|
128
|
+
class="cn-contacts-tab__meta"
|
|
129
|
+
data-testid="cn-contacts-tab-meta">{{ boardMetaOf(contact) }}</span>
|
|
130
|
+
<template v-if="!isBoard">
|
|
131
|
+
<div v-if="contact.email" class="cn-contacts-tab__sub">
|
|
132
|
+
<Email :size="14" class="cn-contacts-tab__sub-icon" />
|
|
133
|
+
<span class="cn-contacts-tab__sub-text">{{ contact.email }}</span>
|
|
134
|
+
</div>
|
|
135
|
+
<div v-if="contact.phone" class="cn-contacts-tab__sub">
|
|
136
|
+
<Phone :size="14" class="cn-contacts-tab__sub-icon" />
|
|
137
|
+
<span class="cn-contacts-tab__sub-text">{{ contact.phone }}</span>
|
|
138
|
+
</div>
|
|
139
|
+
<div v-if="contact.org" class="cn-contacts-tab__sub">
|
|
140
|
+
<OfficeBuildingOutline :size="14" class="cn-contacts-tab__sub-icon" />
|
|
141
|
+
<span class="cn-contacts-tab__sub-text">{{ contact.org }}</span>
|
|
142
|
+
</div>
|
|
143
|
+
<div
|
|
144
|
+
v-if="periodOf(contact)"
|
|
145
|
+
class="cn-contacts-tab__sub"
|
|
146
|
+
data-testid="cn-contacts-tab-period">
|
|
147
|
+
<CalendarRange :size="14" class="cn-contacts-tab__sub-icon" />
|
|
148
|
+
<span class="cn-contacts-tab__sub-text">{{ periodOf(contact) }}</span>
|
|
149
|
+
</div>
|
|
150
|
+
<div v-if="contact.note" class="cn-contacts-tab__sub">
|
|
151
|
+
<span class="cn-contacts-tab__sub-text">{{ contact.note }}</span>
|
|
152
|
+
</div>
|
|
153
|
+
</template>
|
|
148
154
|
</div>
|
|
155
|
+
<template v-if="isBoard">
|
|
156
|
+
<span v-if="boardPeriodOf(contact)"
|
|
157
|
+
class="cn-contacts-tab__period"
|
|
158
|
+
data-testid="cn-contacts-tab-board-period">{{ boardPeriodOf(contact) }}</span>
|
|
159
|
+
<NcActions class="cn-contacts-tab__menu"
|
|
160
|
+
variant="secondary"
|
|
161
|
+
:aria-label="moreActionsLabel(contact)"
|
|
162
|
+
data-testid="cn-contacts-tab-menu"
|
|
163
|
+
@click.stop>
|
|
164
|
+
<NcActionButton :closeAfterClick="true" @click="unlink(contact)">
|
|
165
|
+
<template #icon>
|
|
166
|
+
<Close :size="20" />
|
|
167
|
+
</template>
|
|
168
|
+
{{ unlinkLabel }}
|
|
169
|
+
</NcActionButton>
|
|
170
|
+
</NcActions>
|
|
171
|
+
</template>
|
|
149
172
|
<button
|
|
173
|
+
v-else
|
|
150
174
|
type="button"
|
|
151
175
|
class="cn-contacts-tab__unlink"
|
|
152
176
|
:aria-label="unlinkLabel"
|
|
@@ -178,7 +202,7 @@
|
|
|
178
202
|
|
|
179
203
|
<script>
|
|
180
204
|
import { translate as t } from '@nextcloud/l10n'
|
|
181
|
-
import { NcAvatar, NcButton, NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'
|
|
205
|
+
import { NcActionButton, NcActions, NcAvatar, NcButton, NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'
|
|
182
206
|
import AccountMultipleOutline from 'vue-material-design-icons/AccountMultipleOutline.vue'
|
|
183
207
|
import AccountPlus from 'vue-material-design-icons/AccountPlus.vue'
|
|
184
208
|
import AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'
|
|
@@ -193,6 +217,7 @@ import CnContactPicker from '../../../components/CnContactPicker/CnContactPicker
|
|
|
193
217
|
import CnStatusBadge from '../../../components/CnStatusBadge/CnStatusBadge.vue'
|
|
194
218
|
import CnWidgetHeaderActionButtons from '../../../components/CnWidgetWrapper/CnWidgetHeaderActionButtons.vue'
|
|
195
219
|
import { normalizeLook } from '../../../composables/useLook.js'
|
|
220
|
+
import { formatBoardDate } from '../../../utils/boardDate.js'
|
|
196
221
|
import { buildHeaders, prefixUrl } from '../../../utils/index.js'
|
|
197
222
|
import { WIDGET_BODY_ACTIONS } from '../../../utils/widgetHeaderActions.js'
|
|
198
223
|
|
|
@@ -223,6 +248,8 @@ export default {
|
|
|
223
248
|
name: 'CnContactsTab',
|
|
224
249
|
|
|
225
250
|
components: {
|
|
251
|
+
NcActionButton,
|
|
252
|
+
NcActions,
|
|
226
253
|
NcAvatar,
|
|
227
254
|
NcButton,
|
|
228
255
|
NcEmptyContent,
|
|
@@ -313,6 +340,11 @@ export default {
|
|
|
313
340
|
},
|
|
314
341
|
|
|
315
342
|
computed: {
|
|
343
|
+
/** @return {boolean} The board look draws the rows as DqZaakBetrokkenen does. */
|
|
344
|
+
isBoard() {
|
|
345
|
+
return normalizeLook(this.cnLook) === 'board'
|
|
346
|
+
},
|
|
347
|
+
|
|
316
348
|
/**
|
|
317
349
|
* The two header buttons in the order and weight of the look: the
|
|
318
350
|
* board look draws Link contact then New contact, both outlined; the
|
|
@@ -605,6 +637,49 @@ export default {
|
|
|
605
637
|
*
|
|
606
638
|
* @return {string} The window.
|
|
607
639
|
*/
|
|
640
|
+
/**
|
|
641
|
+
* A person's details on one line for the board look: e-mail, phone,
|
|
642
|
+
* organisation and note, separated by middots.
|
|
643
|
+
*
|
|
644
|
+
* @param {object} contact The contact link.
|
|
645
|
+
* @return {string}
|
|
646
|
+
*/
|
|
647
|
+
boardMetaOf(contact) {
|
|
648
|
+
return [contact?.email, contact?.phone, contact?.org, contact?.note].filter((part) => typeof part === 'string' && part !== '').join(' · ')
|
|
649
|
+
},
|
|
650
|
+
|
|
651
|
+
/**
|
|
652
|
+
* The validity window in the board's short dates: "Vanaf 3 okt",
|
|
653
|
+
* "Tot 31 okt" or "3 okt – 31 okt".
|
|
654
|
+
*
|
|
655
|
+
* @param {object} contact The contact link.
|
|
656
|
+
* @return {string}
|
|
657
|
+
*/
|
|
658
|
+
boardPeriodOf(contact) {
|
|
659
|
+
const from = formatBoardDate(contact?.validFrom || '')
|
|
660
|
+
const until = formatBoardDate(contact?.validUntil || '')
|
|
661
|
+
if (from === '' && until === '') {
|
|
662
|
+
return ''
|
|
663
|
+
}
|
|
664
|
+
if (until === '') {
|
|
665
|
+
return t('nextcloud-vue', 'From {date}', { date: from })
|
|
666
|
+
}
|
|
667
|
+
if (from === '') {
|
|
668
|
+
return t('nextcloud-vue', 'Until {date}', { date: until })
|
|
669
|
+
}
|
|
670
|
+
return `${from} – ${until}`
|
|
671
|
+
},
|
|
672
|
+
|
|
673
|
+
/**
|
|
674
|
+
* The label of a person's actions menu.
|
|
675
|
+
*
|
|
676
|
+
* @param {object} contact The contact link.
|
|
677
|
+
* @return {string}
|
|
678
|
+
*/
|
|
679
|
+
moreActionsLabel(contact) {
|
|
680
|
+
return t('nextcloud-vue', 'More actions for {name}', { name: contact?.displayName || this.unknownLabel })
|
|
681
|
+
},
|
|
682
|
+
|
|
608
683
|
periodOf(contact) {
|
|
609
684
|
const from = contact?.validFrom || ''
|
|
610
685
|
const until = contact?.validUntil || ''
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
3
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
4
|
+
*
|
|
5
|
+
* CnContactsTab in the board look draws a person as DqZaakBetrokkenen
|
|
6
|
+
* "Partijen" does: no role badge under a group that already names the role
|
|
7
|
+
* (r26a showed a role id as a badge), no count beside the group heading, the
|
|
8
|
+
* contact details on one line, the period at the right in the board's short
|
|
9
|
+
* date ("Vanaf 3 okt"), and the remove action in a "…" menu.
|
|
10
|
+
*
|
|
11
|
+
* @spec openspec/changes/board-contacts-rows/specs/contacts/spec.md
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const { flushPromises, mount } = require('@vue/test-utils')
|
|
15
|
+
const CnContactsTab = require('../CnContactsTab.vue').default
|
|
16
|
+
const { formatBoardDate } = require('../../../../utils/boardDate.js')
|
|
17
|
+
|
|
18
|
+
const ROWS = [{
|
|
19
|
+
id: 1,
|
|
20
|
+
contactUid: 'c1',
|
|
21
|
+
displayName: 'Sanne de Vries',
|
|
22
|
+
role: '3c0f5a00-0000-4000-a000-0000000c0001',
|
|
23
|
+
email: 'sanne@example.nl',
|
|
24
|
+
note: 'ingelogd met DigiD',
|
|
25
|
+
validFrom: '2026-10-03',
|
|
26
|
+
}]
|
|
27
|
+
|
|
28
|
+
function mountTab(look) {
|
|
29
|
+
return mount(CnContactsTab, {
|
|
30
|
+
propsData: { objectId: 'o1', register: 'r1', schema: 's1' },
|
|
31
|
+
global: { provide: { cnLook: look } },
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe('CnContactsTab board rows', () => {
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
global.fetch = jest.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve({ results: ROWS, total: 1 }) })
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
afterEach(() => {
|
|
41
|
+
delete global.fetch
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('draws the board row in the board look', async () => {
|
|
45
|
+
const w = mountTab('board')
|
|
46
|
+
await flushPromises()
|
|
47
|
+
const item = w.find('.cn-contacts-tab__item')
|
|
48
|
+
expect(item.find('.cn-contacts-tab__group-count').exists()).toBe(false)
|
|
49
|
+
expect(w.find('.cn-contacts-tab__group-count').exists()).toBe(false)
|
|
50
|
+
expect(item.text()).not.toContain('3c0f5a00')
|
|
51
|
+
expect(item.find('[data-testid="cn-contacts-tab-meta"]').text()).toBe('sanne@example.nl · ingelogd met DigiD')
|
|
52
|
+
expect(item.find('[data-testid="cn-contacts-tab-board-period"]').text()).toBe(`From ${formatBoardDate('2026-10-03')}`)
|
|
53
|
+
expect(item.find('.cn-contacts-tab__unlink').exists()).toBe(false)
|
|
54
|
+
expect(item.find('[data-testid="cn-contacts-tab-menu"]').exists()).toBe(true)
|
|
55
|
+
w.unmount()
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('keeps the Nextcloud row in the Nextcloud look', async () => {
|
|
59
|
+
const w = mountTab('nextcloud')
|
|
60
|
+
await flushPromises()
|
|
61
|
+
const item = w.find('.cn-contacts-tab__item')
|
|
62
|
+
expect(w.find('.cn-contacts-tab__group-count').exists()).toBe(true)
|
|
63
|
+
expect(item.find('.cn-contacts-tab__unlink').exists()).toBe(true)
|
|
64
|
+
expect(item.find('[data-testid="cn-contacts-tab-meta"]').exists()).toBe(false)
|
|
65
|
+
w.unmount()
|
|
66
|
+
})
|
|
67
|
+
})
|