@conduction/nextcloud-vue 2.84.0 → 2.85.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 +131 -3
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +54 -18
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +232 -4
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +95 -51
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +114 -0
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js +2 -2
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +45 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +22 -12
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +23 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +3 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -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 +18 -5
- 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/CnIndexPage/CnIndexPage.vue2.js +548 -77
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +191 -82
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js +11 -2
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +95 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +24 -2
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +70 -2
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +67 -5
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +181 -124
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +5 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +134 -10
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -2
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +6 -3
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +140 -7
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +37 -9
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +6 -5
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +2 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js +53 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js +3 -2
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +135 -0
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +19 -0
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +37 -19
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/composables/useListView.js +21 -0
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +23 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +41 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +742 -397
- package/dist/esm/store/useObjectStore.js +16 -2
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/boardColumns.js +8 -1
- package/dist/esm/utils/boardColumns.js.map +1 -1
- package/dist/esm/utils/boardReferenceColumns.js +278 -0
- package/dist/esm/utils/boardReferenceColumns.js.map +1 -0
- package/dist/esm/utils/buildManifest.js +4 -1
- package/dist/esm/utils/buildManifest.js.map +1 -1
- package/dist/esm/utils/gridStack.js +40 -1
- package/dist/esm/utils/gridStack.js.map +1 -1
- package/dist/esm/utils/humaniseKey.js +41 -0
- package/dist/esm/utils/humaniseKey.js.map +1 -0
- package/dist/esm/utils/notificationRuleLabel.js +6 -23
- package/dist/esm/utils/notificationRuleLabel.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/widgetDispatch.js +8 -2
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +15075 -12590
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +742 -397
- package/l10n/en.json +23 -1
- package/l10n/nl.json +41 -1
- package/package.json +1 -1
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +160 -8
- package/src/components/CnBoardView/CnBoardView.vue +262 -6
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +116 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +57 -2
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +23 -4
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +3 -1
- package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -5
- package/src/components/CnIndexPage/CnIndexPage.vue +586 -25
- package/src/components/CnIndexPage/useSelfFetchList.js +10 -1
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +123 -3
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +70 -2
- package/src/components/CnRegisterMapping/CnRegisterMapping.md +5 -0
- package/src/components/CnRegisterMapping/CnRegisterMapping.vue +231 -96
- package/src/components/CnSettingsPage/CnSettingsPage.vue +5 -1
- package/src/components/CnStatWidget/CnStatWidget.vue +136 -11
- package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -3
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +140 -7
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.md +2 -1
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +42 -13
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +2 -1
- package/src/components/CnWidgetCardGrid/CnWidgetCardGrid.vue +55 -2
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +135 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +10 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +44 -1
- package/src/composables/useListView.js +21 -0
- package/src/css/board.css +65 -4
- package/src/css/dialog.css +4 -2
- package/src/css/index-page.css +49 -0
- package/src/css/kpi-card.css +13 -0
- package/src/css/look-board.css +96 -7
- package/src/index.js +2 -0
- package/src/schemas/app-manifest-v2.schema.json +115 -5
- package/src/store/useObjectStore.js +16 -2
- package/src/utils/boardColumns.js +8 -1
- package/src/utils/boardReferenceColumns.js +274 -0
- package/src/utils/buildManifest.js +4 -1
- package/src/utils/gridStack.js +39 -0
- package/src/utils/humaniseKey.js +38 -0
- package/src/utils/notificationRuleLabel.js +5 -23
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/widgetDispatch.js +8 -2
package/src/css/look-board.css
CHANGED
|
@@ -422,6 +422,7 @@
|
|
|
422
422
|
`.cn-look-board.cn-admin-settings-shell` is a shell told `look: "board"`
|
|
423
423
|
itself, on an admin page no CnAppRoot wraps. */
|
|
424
424
|
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .cn-admin-settings-shell__header,
|
|
425
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):not(.cn-credentials),
|
|
425
426
|
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):not(.cn-credentials),
|
|
426
427
|
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):not(.cn-credentials) {
|
|
427
428
|
grid-column: 1 / -1;
|
|
@@ -429,6 +430,7 @@
|
|
|
429
430
|
|
|
430
431
|
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *),
|
|
431
432
|
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *),
|
|
433
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *),
|
|
432
434
|
.cn-look-board .cn-settings-page__sections:not(.cn-look-nextcloud *) {
|
|
433
435
|
display: grid;
|
|
434
436
|
grid-template-columns: repeat(auto-fit, minmax(420px, 1fr));
|
|
@@ -440,14 +442,17 @@
|
|
|
440
442
|
Settings.vue) takes no box of its own: its sections are grid items and
|
|
441
443
|
cards, as if the shell held them directly. Only an element whose own
|
|
442
444
|
children are sections; anything else keeps spanning the grid. */
|
|
445
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section),
|
|
443
446
|
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section),
|
|
444
447
|
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) {
|
|
445
448
|
display: contents;
|
|
446
449
|
}
|
|
447
450
|
|
|
448
|
-
/* The card: a section of the shell (also one inside a wrapping element), or a CnSettingsCard of the page. */
|
|
451
|
+
/* The card: a section of the shell or of one of its tab panels (also one inside a wrapping element), or a CnSettingsCard of the page. */
|
|
452
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section,
|
|
449
453
|
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
|
|
450
454
|
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
|
|
455
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
|
|
451
456
|
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
|
|
452
457
|
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
|
|
453
458
|
.cn-look-board .cn-settings-page__sections:not(.cn-look-nextcloud *) > .cn-settings-card {
|
|
@@ -483,7 +488,7 @@
|
|
|
483
488
|
justify-content: flex-start;
|
|
484
489
|
text-align: start;
|
|
485
490
|
margin: 0;
|
|
486
|
-
font-size:
|
|
491
|
+
font-size: 17px;
|
|
487
492
|
font-weight: 700;
|
|
488
493
|
line-height: 1.3;
|
|
489
494
|
}
|
|
@@ -491,18 +496,83 @@
|
|
|
491
496
|
.cn-look-board .settings-section:not(.cn-look-nextcloud *) .settings-section__desc {
|
|
492
497
|
margin: 4px 0 0;
|
|
493
498
|
font-size: 14px;
|
|
494
|
-
line-height: 1.
|
|
499
|
+
line-height: 1.5;
|
|
495
500
|
color: var(--color-text-maxcontrast);
|
|
496
501
|
}
|
|
497
502
|
|
|
498
|
-
/* Section actions sit at the end of the title row.
|
|
503
|
+
/* Section actions sit at the end of the title row. The row is a grid, so a
|
|
504
|
+
long title wraps beside the buttons instead of running under them, and in a
|
|
505
|
+
narrow card the buttons drop under the title and description. */
|
|
506
|
+
.cn-look-board .settings-section:not(.cn-look-nextcloud *):has(> .cn-settings-section__actions) {
|
|
507
|
+
/* `!important`: the card rules above set `display: flex` at higher specificity for a section in a wrapping element. */
|
|
508
|
+
display: grid !important;
|
|
509
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
510
|
+
align-items: start;
|
|
511
|
+
column-gap: 16px;
|
|
512
|
+
container-type: inline-size;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
.cn-look-board .settings-section:not(.cn-look-nextcloud *):has(> .cn-settings-section__actions) > * {
|
|
516
|
+
grid-column: 1 / -1;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
.cn-look-board .settings-section:not(.cn-look-nextcloud *):has(> .cn-settings-section__actions) > .settings-section__name {
|
|
520
|
+
grid-row: 1;
|
|
521
|
+
grid-column: 1;
|
|
522
|
+
}
|
|
523
|
+
|
|
499
524
|
.cn-look-board .settings-section:not(.cn-look-nextcloud *) > .cn-settings-section__actions {
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
525
|
+
grid-row: 1;
|
|
526
|
+
grid-column: 2;
|
|
527
|
+
position: static;
|
|
528
|
+
flex-wrap: wrap;
|
|
529
|
+
justify-self: end;
|
|
503
530
|
float: none;
|
|
504
531
|
}
|
|
505
532
|
|
|
533
|
+
@container (max-width: 520px) {
|
|
534
|
+
.cn-look-board .settings-section:not(.cn-look-nextcloud *) > .cn-settings-section__actions {
|
|
535
|
+
grid-row: auto;
|
|
536
|
+
grid-column: 1 / -1;
|
|
537
|
+
justify-self: start;
|
|
538
|
+
justify-content: flex-start;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/* An admin settings card as the board draws it (PtBeheerinstellingen,
|
|
543
|
+
KqBeheerAlgemeen, HuInstellingen): 20px 22px padding, and the title and
|
|
544
|
+
description one group, 4px apart, spaced from the rest of the card by the
|
|
545
|
+
card's 14px gap. The description is a sibling of the title in that column,
|
|
546
|
+
so it pulls itself back up to 4px under the title. The gap spaces the
|
|
547
|
+
content, so a note card adds no margin of its own (NcNoteCard draws 16px
|
|
548
|
+
above and below). A CnSettingsPage card keeps 22px 24px. */
|
|
549
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section,
|
|
550
|
+
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
|
|
551
|
+
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section,
|
|
552
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
|
|
553
|
+
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section,
|
|
554
|
+
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section {
|
|
555
|
+
padding: 20px 22px;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section > .settings-section__desc,
|
|
559
|
+
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .settings-section__desc,
|
|
560
|
+
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .settings-section__desc,
|
|
561
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc,
|
|
562
|
+
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc,
|
|
563
|
+
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .settings-section__desc {
|
|
564
|
+
margin-top: -10px;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > .settings-section > .notecard,
|
|
568
|
+
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .notecard,
|
|
569
|
+
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .settings-section > .notecard,
|
|
570
|
+
.cn-look-board .cn-admin-settings-shell__panel:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .notecard,
|
|
571
|
+
.cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .notecard,
|
|
572
|
+
.cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > :not(.settings-section):has(> .settings-section) > .settings-section > .notecard {
|
|
573
|
+
margin-block: 0;
|
|
574
|
+
}
|
|
575
|
+
|
|
506
576
|
.cn-look-board .settings-section.cn-settings-section--wide:not(.cn-look-nextcloud *),
|
|
507
577
|
.cn-look-board .cn-settings-card:has(.cn-settings-section--wide):not(.cn-look-nextcloud *) {
|
|
508
578
|
grid-column: 1 / -1;
|
|
@@ -714,3 +784,22 @@
|
|
|
714
784
|
.cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-record-list__chevron {
|
|
715
785
|
display: none;
|
|
716
786
|
}
|
|
787
|
+
|
|
788
|
+
/* ---- Week strip (DqMijnWerk "Termijnen deze week") ---------------------- */
|
|
789
|
+
/* The days wrap inside the card instead of scrolling sideways: a row holds
|
|
790
|
+
as many days of at least 120px as the card fits, and the rest go to the
|
|
791
|
+
next row (dossiq at 1100 wide held 680px of days in a 494px card and
|
|
792
|
+
scrolled; now three days and two). 120px keeps a case title's words whole;
|
|
793
|
+
five 88px days fitted one row but broke "Bezwaar" mid-word. A card wide
|
|
794
|
+
enough for the week draws it as before, one row of equal columns. The
|
|
795
|
+
day's head wraps its "today" badge under the label when the day is
|
|
796
|
+
narrow.
|
|
797
|
+
@spec openspec/changes/board-week-strip-fits/specs/week-strip-board-look/spec.md#requirement-a-board-week-strip-fits-its-card */
|
|
798
|
+
.cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__days {
|
|
799
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 120px), 1fr));
|
|
800
|
+
min-width: 0;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
.cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__head {
|
|
804
|
+
flex-wrap: wrap;
|
|
805
|
+
}
|
package/src/index.js
CHANGED
|
@@ -542,6 +542,8 @@ export { currentTheme, useCurrentTheme } from './composables/useCurrentTheme.js'
|
|
|
542
542
|
export { ROADMAP_LABEL_BLOCKLIST } from './utils/roadmapLabelBlocklist.js'
|
|
543
543
|
// The words a person reads for a notification rule key (never the raw key).
|
|
544
544
|
export { humaniseRuleKey, notificationRuleLabel } from './utils/notificationRuleLabel.js'
|
|
545
|
+
// An identifier-shaped key made readable (`shortDescription` → "Short description").
|
|
546
|
+
export { humaniseKey } from './utils/humaniseKey.js'
|
|
545
547
|
|
|
546
548
|
// Shared field validators. These are UX affordances that run in the browser —
|
|
547
549
|
// they do NOT replace server-side validation, which stays authoritative at the
|
|
@@ -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.
|
|
6
|
+
"version": "2.99.0",
|
|
7
7
|
"type": "object",
|
|
8
8
|
"required": ["$schema", "version"],
|
|
9
9
|
"allOf": [
|
|
@@ -1116,7 +1116,12 @@
|
|
|
1116
1116
|
"additionalProperties": { "type": "string", "enum": ["default", "primary", "success", "warning", "error", "info", "purple", "teal"] }
|
|
1117
1117
|
},
|
|
1118
1118
|
"due": { "type": "string", "description": "The date field of the footer's due text, marked by `dueRule`." },
|
|
1119
|
-
"owner": { "type": "string", "description": "The field of the owner shown as an avatar (initials) at the footer's end." }
|
|
1119
|
+
"owner": { "type": "string", "description": "The field of the owner shown as an avatar (initials) at the footer's end." },
|
|
1120
|
+
"formatters": {
|
|
1121
|
+
"type": "object",
|
|
1122
|
+
"description": "screens-board-reference-columns (2.97.0): a card field (one of the role fields above) to the id of a formatter in the app's `cnFormatters` registry, the one table columns name in `formatter`. The card shows the formatted text, so a reference reads as its name (`{ \"caseType\": \"caseTypeName\" }`).",
|
|
1123
|
+
"additionalProperties": { "type": "string", "minLength": 1 }
|
|
1124
|
+
}
|
|
1120
1125
|
}
|
|
1121
1126
|
},
|
|
1122
1127
|
"colorField": {
|
|
@@ -1145,6 +1150,95 @@
|
|
|
1145
1150
|
"dueRule": {
|
|
1146
1151
|
"$ref": "#/$defs/dueRule",
|
|
1147
1152
|
"description": "Marks late cards. A card whose date is before today gets an error edge and the label 'Overdue'; one due within `soonDays` gets 'Due soon'. Omitted, no card is marked."
|
|
1153
|
+
},
|
|
1154
|
+
"columnFields": {
|
|
1155
|
+
"type": "array",
|
|
1156
|
+
"minItems": 1,
|
|
1157
|
+
"description": "screens-board-reference-columns (2.97.0): the fields the columns can come from, offered in a \"Columns:\" switch after the search when there are two or more (\"status | type | assignee\"). The entry on `statusField` is the default. An entry with a `source` takes its columns from the rows the field REFERENCES (a case's status pointing at statusType rows), fetched, not from the values on the cards; `kind: \"values\"` (a user id, which references no schema) takes the values present plus a column for no value. Without a `source` or `kind` the field's enum or lifecycle states are read as before. A drop writes the reference: through `moveHandler` when named, else a PATCH of the field on the row.",
|
|
1158
|
+
"items": {
|
|
1159
|
+
"type": "object",
|
|
1160
|
+
"additionalProperties": false,
|
|
1161
|
+
"required": ["field"],
|
|
1162
|
+
"properties": {
|
|
1163
|
+
"field": { "type": "string", "minLength": 1, "description": "The row field the columns come from." },
|
|
1164
|
+
"label": { "type": "string", "description": "Its name in the column switch (an i18n key). Defaults to the field." },
|
|
1165
|
+
"kind": { "type": "string", "enum": ["values"], "description": "`values`: the field references no schema (a Nextcloud user id); the columns are the values present on the rows, by `valueLabels` or the value itself, then one column for no value (`emptyLabel`)." },
|
|
1166
|
+
"valueLabels": { "type": "object", "additionalProperties": { "type": "string" }, "description": "`kind: values`: raw value to the column label." },
|
|
1167
|
+
"emptyLabel": { "type": "string", "description": "`kind: values`: the label of the column for no value (an i18n key). Defaults to \"Nobody\"." },
|
|
1168
|
+
"source": {
|
|
1169
|
+
"type": "object",
|
|
1170
|
+
"additionalProperties": false,
|
|
1171
|
+
"description": "The referenced rows that are the columns: one list request to `register`/`schema` (defaults: the page's register and the property's `$ref`).",
|
|
1172
|
+
"properties": {
|
|
1173
|
+
"register": { "type": "string", "minLength": 1 },
|
|
1174
|
+
"schema": { "type": "string", "minLength": 1 },
|
|
1175
|
+
"labelField": { "type": "string", "description": "The referenced row's field that names a column. Defaults to `name`, then `title`." },
|
|
1176
|
+
"orderField": { "type": "string", "description": "The referenced row's numeric field the columns are ordered by." },
|
|
1177
|
+
"colorField": { "type": "string", "description": "The referenced row's field that holds the column's dot colour (a badge variant or a CSS colour)." },
|
|
1178
|
+
"filter": { "type": "object", "description": "Equality filters on the referenced rows, e.g. `{ \"isFinal\": false }` to leave out end states.", "additionalProperties": { "type": ["string", "number", "boolean"] } },
|
|
1179
|
+
"mergeBy": { "type": "string", "description": "Merge referenced rows with the same value of this field into one column (statuses of every case type by `name`). A drop then writes the row of the card's own parent (`narrowBy`), and is refused when that parent has none." },
|
|
1180
|
+
"narrowBy": {
|
|
1181
|
+
"type": "object",
|
|
1182
|
+
"additionalProperties": false,
|
|
1183
|
+
"required": ["field", "rowField"],
|
|
1184
|
+
"description": "The parent link: the referenced row's `field` equals the card's `rowField` (statusType.caseType = case.caseType). While the page filters on `rowField` with one value, the columns are that parent's rows only.",
|
|
1185
|
+
"properties": {
|
|
1186
|
+
"field": { "type": "string", "minLength": 1 },
|
|
1187
|
+
"rowField": { "type": "string", "minLength": 1 }
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
},
|
|
1192
|
+
"readOnly": { "type": "boolean", "default": false, "description": "No drag and no Move to while the columns come from this field." },
|
|
1193
|
+
"moveHandler": { "type": "string", "minLength": 1, "description": "A handler in the app's registry that makes the move: it gets `{ card, toKey, field, value, target }` (value: the referenced id to write; target: its row) and returns a promise; a rejection shows its message as the refusal. Absent, the field is written with a PATCH." },
|
|
1194
|
+
"moveTargetsHandler": { "type": "string", "minLength": 1, "description": "A handler in the app's registry that answers where one card may go: it gets `{ card, field }` and returns the values (referenced ids) it can reach. Columns out of reach fade during a drag, read \"not allowed\" in the card menu, and refuse a drop." }
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
},
|
|
1198
|
+
"moveHandler": {
|
|
1199
|
+
"type": "string",
|
|
1200
|
+
"minLength": 1,
|
|
1201
|
+
"description": "screens-board-reference-columns (2.97.0): a handler in the app's registry that moves a card on `statusField` (the app's transition), with the `columnFields[].moveHandler` call shape. Lets a manifest-only page run the host's transition, which the `runTransition` prop could not."
|
|
1202
|
+
},
|
|
1203
|
+
"moveTargetsHandler": {
|
|
1204
|
+
"type": "string",
|
|
1205
|
+
"minLength": 1,
|
|
1206
|
+
"description": "screens-board-reference-columns (2.97.0): where a card on `statusField` may go, with the `columnFields[].moveTargetsHandler` call shape."
|
|
1207
|
+
},
|
|
1208
|
+
"narrow": {
|
|
1209
|
+
"type": "object",
|
|
1210
|
+
"additionalProperties": false,
|
|
1211
|
+
"required": ["field"],
|
|
1212
|
+
"description": "screens-board-reference-columns (2.97.0): a select after the search (\"Case type: All case types | Woo-verzoek | ...\") that sets the page filter on `field`. With a reference column's `narrowBy.rowField` on the same field, the columns narrow to that parent's rows.",
|
|
1213
|
+
"properties": {
|
|
1214
|
+
"field": { "type": "string", "minLength": 1, "description": "The row field the select filters on." },
|
|
1215
|
+
"label": { "type": "string", "description": "The select's label (an i18n key), shown with a colon. Defaults to the property's title." },
|
|
1216
|
+
"allLabel": { "type": "string", "description": "The option for no narrowing (an i18n key). Defaults to \"All\"." },
|
|
1217
|
+
"source": {
|
|
1218
|
+
"type": "object",
|
|
1219
|
+
"additionalProperties": false,
|
|
1220
|
+
"description": "Where the options come from (defaults: the page's register and the property's `$ref`).",
|
|
1221
|
+
"properties": {
|
|
1222
|
+
"register": { "type": "string", "minLength": 1 },
|
|
1223
|
+
"schema": { "type": "string", "minLength": 1 },
|
|
1224
|
+
"labelField": { "type": "string", "description": "The option row's label field. Defaults to `title`." },
|
|
1225
|
+
"filter": { "type": "object", "additionalProperties": { "type": ["string", "number", "boolean"] } }
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
},
|
|
1230
|
+
"columnSwitchLabel": {
|
|
1231
|
+
"type": "string",
|
|
1232
|
+
"description": "screens-board-reference-columns (2.97.0): the column switch's label (an i18n key), shown with a colon. Defaults to \"Columns\"."
|
|
1233
|
+
},
|
|
1234
|
+
"hint": {
|
|
1235
|
+
"type": "string",
|
|
1236
|
+
"description": "screens-board-reference-columns (2.97.0): one sentence after the board's controls, in the secondary colour (an i18n key), e.g. how a move works."
|
|
1237
|
+
},
|
|
1238
|
+
"wrap": {
|
|
1239
|
+
"type": "boolean",
|
|
1240
|
+
"default": false,
|
|
1241
|
+
"description": "screens-board-reference-columns (2.97.0): wrap the columns onto more rows, as many to a row as fit at 240px, instead of one row that scrolls sideways. For a board with more stages than fit."
|
|
1148
1242
|
}
|
|
1149
1243
|
}
|
|
1150
1244
|
},
|
|
@@ -3533,7 +3627,7 @@
|
|
|
3533
3627
|
},
|
|
3534
3628
|
"titleField": {
|
|
3535
3629
|
"type": "string",
|
|
3536
|
-
"description": "type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop."
|
|
3630
|
+
"description": "type='wiki': property on the article object holding the page title. Defaults to 'title'. Maps to CnWikiPage `titleField` prop. type='detail' (detail-title-field): the record field (a dotted path, for example `number`) the header names the record by, as an invoice page names the invoice number instead of the schema title; an empty value falls back to the display name, and the breadcrumb's current crumb and the type eyebrow follow. Maps to CnDetailPage `titleField`."
|
|
3537
3631
|
},
|
|
3538
3632
|
"idParam": {
|
|
3539
3633
|
"type": "string",
|
|
@@ -4177,8 +4271,19 @@
|
|
|
4177
4271
|
"description": "type='index': show the page header (icon, title, description) inline. Default false: the title renders visually hidden and the sidebar names the page. Maps to CnIndexPage `showTitle`."
|
|
4178
4272
|
},
|
|
4179
4273
|
"countSubtitle": {
|
|
4180
|
-
"
|
|
4181
|
-
|
|
4274
|
+
"anyOf": [
|
|
4275
|
+
{ "type": "string" },
|
|
4276
|
+
{
|
|
4277
|
+
"type": "object",
|
|
4278
|
+
"additionalProperties": false,
|
|
4279
|
+
"required": ["singular", "plural"],
|
|
4280
|
+
"properties": {
|
|
4281
|
+
"singular": { "type": "string", "minLength": 1, "description": "i18n key of the line for a total of one, e.g. \"{total} invoice\"." },
|
|
4282
|
+
"plural": { "type": "string", "minLength": 1, "description": "i18n key of the line for any other total, e.g. \"{total} invoices\"." }
|
|
4283
|
+
}
|
|
4284
|
+
}
|
|
4285
|
+
],
|
|
4286
|
+
"description": "type='index': an i18n key for the description line with `{total}` replaced by the collection's total, e.g. \"{total} open cases\" (zuiddrecht-pixel-gaps). Shown in place of `description` once a total is known. `{ singular, plural }` picks the form by the total through the app's plural translation (`translatePlural`), so \"1 factuur\" and \"12 facturen\" each read right (index-count-plural). Maps to CnIndexPage `countSubtitle`."
|
|
4182
4287
|
},
|
|
4183
4288
|
"showTitleIcon": {
|
|
4184
4289
|
"type": "boolean",
|
|
@@ -4531,6 +4636,11 @@
|
|
|
4531
4636
|
}
|
|
4532
4637
|
}
|
|
4533
4638
|
},
|
|
4639
|
+
{
|
|
4640
|
+
"description": "screens-board-reference-columns (2.97.0): config.board on an index page, the block CnPageRenderer hands to CnIndexPage's `board` prop, is typed by boardView like pages[].board.",
|
|
4641
|
+
"if": { "properties": { "type": { "const": "index" } }, "required": ["type"] },
|
|
4642
|
+
"then": { "properties": { "config": { "properties": { "board": { "$ref": "#/$defs/boardView" } } } } }
|
|
4643
|
+
},
|
|
4534
4644
|
{
|
|
4535
4645
|
"description": "index-calendar-view-mode: config.calendar on an index page is typed by calendarView.",
|
|
4536
4646
|
"if": { "properties": { "type": { "const": "index" } }, "required": ["type"] },
|
|
@@ -707,6 +707,8 @@ const baseActions = {
|
|
|
707
707
|
* @param {object} [params] Query parameters (_limit, _page, _search, _order, filters)
|
|
708
708
|
* @param {object} [options] Call options
|
|
709
709
|
* @param {{error?: object|null}} [options.outcome] Opt-in sink for THIS call's own result: `error` is set to the error it records on `errors[type]`, or `null` on success. Unlike `errors[type]`, which every call for the type shares, a later call cannot overwrite it.
|
|
710
|
+
* @param {boolean} [options.append] Add the fetched page after the rows already stored instead of replacing them. Dropped when the stored rows are no longer the page before it, or when `options.isCurrent()` returns false (the query changed meanwhile).
|
|
711
|
+
* @param {() => boolean} [options.isCurrent] With `append`: asked once the page arrives; false drops it.
|
|
710
712
|
* @return {Promise<Array>} The fetched collection (also stored in state)
|
|
711
713
|
*/
|
|
712
714
|
async fetchCollection(type, params = {}, options = {}) {
|
|
@@ -750,14 +752,26 @@ const baseActions = {
|
|
|
750
752
|
|
|
751
753
|
const data = await response.json()
|
|
752
754
|
const results = data.results || data
|
|
755
|
+
const append = options?.append === true
|
|
753
756
|
|
|
754
|
-
|
|
757
|
+
const stale = append && (
|
|
758
|
+
Number(this.pagination[type]?.page || 1) !== Number(params._page || 1) - 1
|
|
759
|
+
|| (typeof options.isCurrent === 'function' && !options.isCurrent())
|
|
760
|
+
)
|
|
761
|
+
if (stale) {
|
|
762
|
+
return []
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
this.collections = {
|
|
766
|
+
...this.collections,
|
|
767
|
+
[type]: append ? [...(this.collections[type] || []), ...results] : results,
|
|
768
|
+
}
|
|
755
769
|
// Why a personal lens came back empty, if it says (openregister#4514).
|
|
756
770
|
this.lenses = { ...this.lenses, [type]: readLensReports(data) }
|
|
757
771
|
this.pagination = {
|
|
758
772
|
...this.pagination,
|
|
759
773
|
[type]: {
|
|
760
|
-
total: data.total || results.length,
|
|
774
|
+
total: data.total || (append ? this.collections[type].length : results.length),
|
|
761
775
|
page: data.page || 1,
|
|
762
776
|
pages: data.pages || 1,
|
|
763
777
|
limit: params._limit || 20,
|
|
@@ -128,6 +128,10 @@ function labelFor(field, value) {
|
|
|
128
128
|
* @param {string} options.statusField - The property name on a row.
|
|
129
129
|
* @param {string} [options.offBoardLabel] - What to call the off-board column.
|
|
130
130
|
* @param {string} [options.colorField] - The key on a state that holds its dot colour.
|
|
131
|
+
* @param {?((row: object) => string)} [options.keyOf] - The column a row
|
|
132
|
+
* belongs in, for a field whose raw value is not the column key (a
|
|
133
|
+
* reference whose rows are merged by name). Absent, the row's
|
|
134
|
+
* `statusField` value is the key.
|
|
131
135
|
*
|
|
132
136
|
* @return {{columns: Array<object>, usable: boolean}} The columns, each
|
|
133
137
|
* `{ key, label, cards, count }`, and whether the field could back a board.
|
|
@@ -138,6 +142,7 @@ export function buildBoardColumns({
|
|
|
138
142
|
statusField = '',
|
|
139
143
|
offBoardLabel = 'Elsewhere',
|
|
140
144
|
colorField = '',
|
|
145
|
+
keyOf = null,
|
|
141
146
|
} = {}) {
|
|
142
147
|
const { stages, usable } = stagesOf(field, colorField)
|
|
143
148
|
if (usable === false) {
|
|
@@ -156,7 +161,9 @@ export function buildBoardColumns({
|
|
|
156
161
|
|
|
157
162
|
const offBoard = { key: OFF_BOARD_KEY, label: offBoardLabel, cards: [], count: 0 }
|
|
158
163
|
for (const row of rows) {
|
|
159
|
-
const value =
|
|
164
|
+
const value = typeof keyOf === 'function'
|
|
165
|
+
? String(keyOf(row) ?? '')
|
|
166
|
+
: String(row?.[statusField] ?? '')
|
|
160
167
|
const column = byKey.get(value) || offBoard
|
|
161
168
|
column.cards.push(row)
|
|
162
169
|
column.count += 1
|