@conduction/nextcloud-vue 2.56.0-beta.12 → 2.56.0-beta.14
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/CnActionsBar/CnActionsBar.vue2.js +19 -0
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +10 -3
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +101 -5
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +23 -7
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js +13 -0
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +2 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +125 -4
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +439 -381
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js +9 -3
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js +1 -1
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +4 -4
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +142 -26
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +195 -124
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js +3 -1
- package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +144 -4
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +84 -11
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +3 -2
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +31 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +335 -313
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +11 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +2 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +5 -11
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +22 -3
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +10 -3
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/composables/useDependencyCheck.js +44 -1
- package/dist/esm/composables/useDependencyCheck.js.map +1 -1
- package/dist/esm/composables/useListView.js +43 -1
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/composables/useSetupStatus.js +26 -3
- package/dist/esm/composables/useSetupStatus.js.map +1 -1
- package/dist/esm/l10n/en.json.js +7 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +7 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/mixins/pageViews.js +400 -0
- package/dist/esm/mixins/pageViews.js.map +1 -0
- package/dist/esm/nextcloud-vue.css +202 -2
- package/dist/esm/store/plugins/liveUpdates.js +19 -9
- package/dist/esm/store/plugins/liveUpdates.js.map +1 -1
- package/dist/esm/store/useObjectStore.js +138 -42
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/actionsDispatcher.js +25 -2
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/columnFilters.js +27 -3
- package/dist/esm/utils/columnFilters.js.map +1 -1
- package/dist/esm/utils/schema.js +40 -2
- package/dist/esm/utils/schema.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +2857 -1335
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +202 -2
- package/l10n/en.json +7 -1
- package/l10n/nl.json +7 -1
- package/package.json +1 -1
- package/src/components/CnActionsBar/CnActionsBar.md +2 -1
- package/src/components/CnActionsBar/CnActionsBar.vue +25 -1
- package/src/components/CnAppNav/CnAppNav.vue +150 -9
- package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +14 -0
- package/src/components/CnDashboardPage/CnDashboardPage.vue +194 -10
- package/src/components/CnDataTable/CnColumnFilterPopover.vue +11 -5
- package/src/components/CnDataTable/CnDataTable.md +1 -1
- package/src/components/CnDataTable/CnDataTable.vue +4 -4
- package/src/components/CnDetailPage/CnDetailPage.md +5 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +208 -11
- package/src/components/CnFkResolveCell/CnFkResolveCell.vue +3 -1
- package/src/components/CnFormDialog/CnFormDialog.vue +144 -4
- package/src/components/CnHeaderWidget/CnHeaderWidget.vue +100 -13
- package/src/components/CnIndexPage/CnIndexPage.md +2 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +47 -1
- package/src/components/CnSegmentedControl/CnSegmentedControl.md +1 -1
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +12 -0
- package/src/components/CnSetupWizard/CnSetupWizard.vue +5 -11
- package/src/components/CnStagesWidget/CnStagesWidget.vue +9 -0
- package/src/components/CnStatWidget/CnStatWidget.vue +33 -5
- package/src/composables/useDependencyCheck.js +43 -0
- package/src/composables/useListView.js +43 -1
- package/src/composables/useSetupStatus.js +26 -3
- package/src/css/actions-bar.css +20 -2
- package/src/css/detail-page.css +27 -0
- package/src/css/kpi-card.css +47 -0
- package/src/mixins/pageViews.js +396 -0
- package/src/schemas/app-manifest-v2.schema.json +53 -4
- package/src/schemas/app-manifest.schema.json +1 -1
- package/src/store/plugins/liveUpdates.js +19 -9
- package/src/store/useObjectStore.js +137 -41
- package/src/utils/actionsDispatcher.js +25 -2
- package/src/utils/columnFilters.js +29 -2
- package/src/utils/schema.js +40 -2
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/dist/nextcloud-vue.cjs.js.map
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 35372297 bytes
|
|
4
|
+
sha256: 7065df25e721d338e4612aac2ee75c58c87fb5e17477c811e7bcf66cee41783d
|
package/dist/nextcloud-vue.css
CHANGED
|
@@ -1283,6 +1283,53 @@
|
|
|
1283
1283
|
font-size: var(--cn-kpi-value-size-stacked, 2rem);
|
|
1284
1284
|
}
|
|
1285
1285
|
|
|
1286
|
+
/* Stacked: the board's tile (`content.layout: 'stacked'`). A plain muted
|
|
1287
|
+
label, the number at 34px/700 in the text colour, and the caption on a line
|
|
1288
|
+
of its own; CnStatWidget draws no icon circle in this layout. The padding
|
|
1289
|
+
adds up with a dashboard card-fit cell's 8px 14px to the board's 18px 20px.
|
|
1290
|
+
Every value is a token so a theme can move it. */
|
|
1291
|
+
.cn-kpi-card--stacked {
|
|
1292
|
+
flex-direction: column;
|
|
1293
|
+
align-items: stretch;
|
|
1294
|
+
justify-content: center;
|
|
1295
|
+
gap: 0;
|
|
1296
|
+
padding: var(--cn-kpi-stacked-padding, 10px 6px);
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
.cn-kpi-card--stacked .cn-kpi-card__body {
|
|
1300
|
+
gap: var(--cn-kpi-stacked-gap, 6px);
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
.cn-kpi-card--stacked .cn-kpi-card__title {
|
|
1304
|
+
font-size: var(--cn-kpi-stacked-title-size, 14px);
|
|
1305
|
+
font-weight: var(--cn-kpi-stacked-title-weight, 400);
|
|
1306
|
+
color: var(--color-text-maxcontrast);
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
.cn-kpi-card--stacked .cn-kpi-card__value {
|
|
1310
|
+
font-size: var(--cn-kpi-stacked-value-size, 34px);
|
|
1311
|
+
font-weight: var(--cn-kpi-value-weight, 700);
|
|
1312
|
+
line-height: 1;
|
|
1313
|
+
letter-spacing: -0.01em;
|
|
1314
|
+
color: var(--cn-kpi-stacked-value-color, var(--color-main-text));
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
.cn-kpi-card--stacked .cn-kpi-card__caption-line {
|
|
1318
|
+
flex: 0 0 auto;
|
|
1319
|
+
max-width: 100%;
|
|
1320
|
+
font-size: var(--cn-kpi-label-size, 13px);
|
|
1321
|
+
font-weight: 500;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
/* A linked stacked tile reads as a tile, not as underlined link text. The
|
|
1325
|
+
NL Design theme underlines every `a` with `!important`, so the opt-out
|
|
1326
|
+
needs it too; it only applies to this opt-in layout. */
|
|
1327
|
+
a.cn-kpi-card--stacked,
|
|
1328
|
+
a.cn-kpi-card--stacked:hover,
|
|
1329
|
+
a.cn-kpi-card--stacked:focus-visible {
|
|
1330
|
+
text-decoration: none !important;
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1286
1333
|
/* Filled: the card draws its own grey box, for a KPI that is NOT already
|
|
1287
1334
|
inside a wrapper that draws one. Opt-in via `content.flat: false`. */
|
|
1288
1335
|
.cn-kpi-card--filled {
|
|
@@ -1893,6 +1940,23 @@
|
|
|
1893
1940
|
color: var(--color-text-maxcontrast);
|
|
1894
1941
|
}
|
|
1895
1942
|
|
|
1943
|
+
/* Beside the inline search (`showCountWithSearch`): the search field shrinks
|
|
1944
|
+
first and the counter stays on one line. */
|
|
1945
|
+
.cn-actions-bar__count--beside-search {
|
|
1946
|
+
flex-shrink: 0;
|
|
1947
|
+
white-space: nowrap;
|
|
1948
|
+
}
|
|
1949
|
+
|
|
1950
|
+
/* Taken out of the flex row so it adds no gap, but kept in the accessibility
|
|
1951
|
+
tree so the live region exists before a total appears. */
|
|
1952
|
+
.cn-actions-bar__count--empty {
|
|
1953
|
+
position: absolute;
|
|
1954
|
+
width: 1px;
|
|
1955
|
+
height: 1px;
|
|
1956
|
+
overflow: hidden;
|
|
1957
|
+
clip-path: inset(50%);
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1896
1960
|
/* Inline search field */
|
|
1897
1961
|
.cn-actions-bar__search {
|
|
1898
1962
|
position: relative;
|
|
@@ -2152,8 +2216,9 @@
|
|
|
2152
2216
|
display: contents;
|
|
2153
2217
|
}
|
|
2154
2218
|
|
|
2155
|
-
/* #after-search filter buttons
|
|
2156
|
-
search field (DOM order — search first via its
|
|
2219
|
+
/* #after-search filter buttons, the beside-search counter and the view
|
|
2220
|
+
toggle ride beside the search field (DOM order — search first via its
|
|
2221
|
+
own order). */
|
|
2157
2222
|
.cn-actions-bar__info > * {
|
|
2158
2223
|
order: 1;
|
|
2159
2224
|
}
|
|
@@ -2790,6 +2855,28 @@
|
|
|
2790
2855
|
min-width: 0;
|
|
2791
2856
|
}
|
|
2792
2857
|
|
|
2858
|
+
/* A widget in the header (`config.headerWidget`) takes a row of its own under
|
|
2859
|
+
the title and the actions. */
|
|
2860
|
+
.cn-detail-page__header--with-widget {
|
|
2861
|
+
flex-wrap: wrap;
|
|
2862
|
+
row-gap: var(--cn-detail-header-row-gap, 22px);
|
|
2863
|
+
}
|
|
2864
|
+
|
|
2865
|
+
.cn-detail-page__header-widget {
|
|
2866
|
+
flex: 1 0 100%;
|
|
2867
|
+
min-width: 0;
|
|
2868
|
+
}
|
|
2869
|
+
|
|
2870
|
+
/* The header as a card (`config.headerCard`): the board's case header, a
|
|
2871
|
+
bordered box on the surface colour. The 56px inset that clears the
|
|
2872
|
+
navigation toggle is not needed inside a card that starts below it. */
|
|
2873
|
+
.cn-detail-page__header--card {
|
|
2874
|
+
padding: var(--cn-detail-header-card-padding, 22px 24px);
|
|
2875
|
+
border: 1px solid var(--color-border);
|
|
2876
|
+
border-radius: var(--cn-detail-header-card-radius, 12px);
|
|
2877
|
+
background: var(--color-main-background);
|
|
2878
|
+
}
|
|
2879
|
+
|
|
2793
2880
|
.cn-detail-page__header-left {
|
|
2794
2881
|
display: flex;
|
|
2795
2882
|
align-items: center;
|
|
@@ -3210,6 +3297,11 @@
|
|
|
3210
3297
|
font-size: 0.9em;
|
|
3211
3298
|
white-space: nowrap;
|
|
3212
3299
|
}
|
|
3300
|
+
|
|
3301
|
+
/* A page view the switch shows with nothing to draw (view-switch-containers). */
|
|
3302
|
+
.cn-detail-page .cn-page-view-region--empty {
|
|
3303
|
+
padding: 40px 20px;
|
|
3304
|
+
}
|
|
3213
3305
|
/* CnReferencePreview — a reference that shows what it points at. */
|
|
3214
3306
|
|
|
3215
3307
|
.cn-reference-preview {
|
|
@@ -16875,7 +16967,17 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
|
|
|
16875
16967
|
text-overflow: ellipsis;
|
|
16876
16968
|
white-space: nowrap;
|
|
16877
16969
|
}
|
|
16970
|
+
|
|
16971
|
+
/* A clickable label is a <button>, and Nextcloud's core stylesheet gives
|
|
16972
|
+
every `button:not(.button-vue)` a min-height of the clickable area (34 to
|
|
16973
|
+
44px) with the text centred in it. That pushed each reachable stage's label
|
|
16974
|
+
about 12px below the current one, which is a <span>. Zeroed here so all
|
|
16975
|
+
labels sit 8px under their bar, as the board draws them. The visually
|
|
16976
|
+
hidden "(current step)" is absolutely positioned and takes no space. */
|
|
16878
16977
|
button.cn-stages-widget__bar-label[data-v-358fde0f] {
|
|
16978
|
+
min-height: 0;
|
|
16979
|
+
height: auto;
|
|
16980
|
+
line-height: inherit;
|
|
16879
16981
|
cursor: pointer;
|
|
16880
16982
|
}
|
|
16881
16983
|
button.cn-stages-widget__bar-label[aria-disabled="true"][data-v-358fde0f] {
|
|
@@ -17310,6 +17412,53 @@ button.cn-stages-widget__bar-label[data-v-358fde0f]:focus-visible {
|
|
|
17310
17412
|
font-size: var(--cn-kpi-value-size-stacked, 2rem);
|
|
17311
17413
|
}
|
|
17312
17414
|
|
|
17415
|
+
/* Stacked: the board's tile (`content.layout: 'stacked'`). A plain muted
|
|
17416
|
+
label, the number at 34px/700 in the text colour, and the caption on a line
|
|
17417
|
+
of its own; CnStatWidget draws no icon circle in this layout. The padding
|
|
17418
|
+
adds up with a dashboard card-fit cell's 8px 14px to the board's 18px 20px.
|
|
17419
|
+
Every value is a token so a theme can move it. */
|
|
17420
|
+
.cn-kpi-card--stacked {
|
|
17421
|
+
flex-direction: column;
|
|
17422
|
+
align-items: stretch;
|
|
17423
|
+
justify-content: center;
|
|
17424
|
+
gap: 0;
|
|
17425
|
+
padding: var(--cn-kpi-stacked-padding, 10px 6px);
|
|
17426
|
+
}
|
|
17427
|
+
|
|
17428
|
+
.cn-kpi-card--stacked .cn-kpi-card__body {
|
|
17429
|
+
gap: var(--cn-kpi-stacked-gap, 6px);
|
|
17430
|
+
}
|
|
17431
|
+
|
|
17432
|
+
.cn-kpi-card--stacked .cn-kpi-card__title {
|
|
17433
|
+
font-size: var(--cn-kpi-stacked-title-size, 14px);
|
|
17434
|
+
font-weight: var(--cn-kpi-stacked-title-weight, 400);
|
|
17435
|
+
color: var(--color-text-maxcontrast);
|
|
17436
|
+
}
|
|
17437
|
+
|
|
17438
|
+
.cn-kpi-card--stacked .cn-kpi-card__value {
|
|
17439
|
+
font-size: var(--cn-kpi-stacked-value-size, 34px);
|
|
17440
|
+
font-weight: var(--cn-kpi-value-weight, 700);
|
|
17441
|
+
line-height: 1;
|
|
17442
|
+
letter-spacing: -0.01em;
|
|
17443
|
+
color: var(--cn-kpi-stacked-value-color, var(--color-main-text));
|
|
17444
|
+
}
|
|
17445
|
+
|
|
17446
|
+
.cn-kpi-card--stacked .cn-kpi-card__caption-line {
|
|
17447
|
+
flex: 0 0 auto;
|
|
17448
|
+
max-width: 100%;
|
|
17449
|
+
font-size: var(--cn-kpi-label-size, 13px);
|
|
17450
|
+
font-weight: 500;
|
|
17451
|
+
}
|
|
17452
|
+
|
|
17453
|
+
/* A linked stacked tile reads as a tile, not as underlined link text. The
|
|
17454
|
+
NL Design theme underlines every `a` with `!important`, so the opt-out
|
|
17455
|
+
needs it too; it only applies to this opt-in layout. */
|
|
17456
|
+
a.cn-kpi-card--stacked,
|
|
17457
|
+
a.cn-kpi-card--stacked:hover,
|
|
17458
|
+
a.cn-kpi-card--stacked:focus-visible {
|
|
17459
|
+
text-decoration: none !important;
|
|
17460
|
+
}
|
|
17461
|
+
|
|
17313
17462
|
/* Filled: the card draws its own grey box, for a KPI that is NOT already
|
|
17314
17463
|
inside a wrapper that draws one. Opt-in via `content.flat: false`. */
|
|
17315
17464
|
.cn-kpi-card--filled {
|
|
@@ -18262,6 +18411,16 @@ to { background-position: -200% 0;
|
|
|
18262
18411
|
flex: 0 0 auto;
|
|
18263
18412
|
padding: 16px;
|
|
18264
18413
|
}
|
|
18414
|
+
|
|
18415
|
+
/* On the page ground (`content.ground`): no card, so no inset around the
|
|
18416
|
+
view switch, and the heading at the board's 32px. */
|
|
18417
|
+
.cn-header-widget--ground .cn-header-widget__views[data-v-1b97430f] {
|
|
18418
|
+
padding: 0;
|
|
18419
|
+
}
|
|
18420
|
+
.cn-header-widget--ground .cn-header-widget__title[data-v-1b97430f] {
|
|
18421
|
+
font-size: var(--cn-header-ground-title-size, 32px);
|
|
18422
|
+
letter-spacing: -0.01em;
|
|
18423
|
+
}
|
|
18265
18424
|
.cn-header-widget__date[data-v-1b97430f] {
|
|
18266
18425
|
font-size: 14px;
|
|
18267
18426
|
line-height: 1.4;
|
|
@@ -30431,6 +30590,19 @@ to {
|
|
|
30431
30590
|
.cn-dashboard-page__empty[data-v-824052fe] {
|
|
30432
30591
|
padding: 60px 20px;
|
|
30433
30592
|
}
|
|
30593
|
+
|
|
30594
|
+
/* The page's view switch on a page without a header row: at the end of its
|
|
30595
|
+
own row, above the grids, where the header would have put it. */
|
|
30596
|
+
.cn-dashboard-page__view-switch[data-v-824052fe] {
|
|
30597
|
+
display: flex;
|
|
30598
|
+
justify-content: flex-end;
|
|
30599
|
+
margin-bottom: 12px;
|
|
30600
|
+
}
|
|
30601
|
+
|
|
30602
|
+
/* A view the switch shows with nothing to draw. */
|
|
30603
|
+
.cn-page-view-region--empty[data-v-824052fe] {
|
|
30604
|
+
padding: 40px 20px;
|
|
30605
|
+
}
|
|
30434
30606
|
.cn-dashboard-page__page-filters[data-v-824052fe] {
|
|
30435
30607
|
display: flex;
|
|
30436
30608
|
flex-wrap: wrap;
|
|
@@ -33247,6 +33419,21 @@ a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
|
|
|
33247
33419
|
padding: calc(var(--default-grid-baseline, 4px) * 2);
|
|
33248
33420
|
}
|
|
33249
33421
|
|
|
33422
|
+
/*
|
|
33423
|
+
* The primary action never shrinks out of sight. NcAppNavigation renders it in
|
|
33424
|
+
* `.app-navigation__body`, a flex child with `overflow-y: scroll` (so its
|
|
33425
|
+
* minimum height is 0) beside a list of `height: 100%` and the footer. With a
|
|
33426
|
+
* card and footer entries below the list, the column overflows and the body
|
|
33427
|
+
* gives up its share of the shrink: "New case" showed as a 24px sliver of a
|
|
33428
|
+
* 42px button. All three forms carry `.app-navigation-new` (the solid and
|
|
33429
|
+
* link wrappers mirror NcAppNavigationNew's class), and the rule is scoped to
|
|
33430
|
+
* this component's navigation, so a navigation without a primary action lays
|
|
33431
|
+
* out exactly as before.
|
|
33432
|
+
*/
|
|
33433
|
+
.app-navigation[data-testid="cn-nav"] .app-navigation__body:has(> .app-navigation-new) {
|
|
33434
|
+
flex-shrink: 0;
|
|
33435
|
+
}
|
|
33436
|
+
|
|
33250
33437
|
/*
|
|
33251
33438
|
* Footer-section items (section: "footer") render in NcAppNavigation's
|
|
33252
33439
|
* #footer slot, outside the scroll container, so they stay visible above
|
|
@@ -33270,6 +33457,19 @@ a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
|
|
|
33270
33457
|
overflow: visible !important;
|
|
33271
33458
|
}
|
|
33272
33459
|
|
|
33460
|
+
/*
|
|
33461
|
+
* A declared footer that names `settings` first (`nav.footer`) puts the
|
|
33462
|
+
* foldout above the footer list. The two are siblings in NcAppNavigation's
|
|
33463
|
+
* flex column, so `order` moves them without changing either's markup; the
|
|
33464
|
+
* card above keeps order 0 and stays first.
|
|
33465
|
+
*/
|
|
33466
|
+
.cn-app-nav__settings--first {
|
|
33467
|
+
order: 1;
|
|
33468
|
+
}
|
|
33469
|
+
.cn-app-nav__footer-list--after-settings {
|
|
33470
|
+
order: 2;
|
|
33471
|
+
}
|
|
33472
|
+
|
|
33273
33473
|
/*
|
|
33274
33474
|
* Align the settings foldout's items with the main/footer list items,
|
|
33275
33475
|
* whose icons sit at a 16px inset. The foldout's items live in a bare
|
package/l10n/en.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"translations": {
|
|
3
|
+
"Advanced": "Advanced",
|
|
3
4
|
"The item could not be created.": "The item could not be created.",
|
|
4
5
|
"Start over": "Start over",
|
|
5
6
|
"Continue where you left off": "Continue where you left off",
|
|
@@ -49,6 +50,7 @@
|
|
|
49
50
|
"This integration is not available.": "This integration is not available.",
|
|
50
51
|
"Integrations": "Integrations",
|
|
51
52
|
"View": "View",
|
|
53
|
+
"Views": "Views",
|
|
52
54
|
"current step": "current step",
|
|
53
55
|
"{app} not available": "{app} not available",
|
|
54
56
|
"{app} not configured": "{app} not configured",
|
|
@@ -408,6 +410,7 @@
|
|
|
408
410
|
"Any": "Any",
|
|
409
411
|
"To": "To",
|
|
410
412
|
"Equals": "Equals",
|
|
413
|
+
"Contains": "Contains",
|
|
411
414
|
"Clear": "Clear",
|
|
412
415
|
"Apply": "Apply",
|
|
413
416
|
"This column cannot list its objects.": "This column cannot list its objects.",
|
|
@@ -1088,6 +1091,7 @@
|
|
|
1088
1091
|
"The actions of an attention card are declared in the manifest.": "The actions of an attention card are declared in the manifest.",
|
|
1089
1092
|
"An attention card needs a title": "An attention card needs a title",
|
|
1090
1093
|
"Good morning, {name}": "Good morning, {name}",
|
|
1094
|
+
"This view has no widgets yet.": "This view has no widgets yet.",
|
|
1091
1095
|
"Good morning": "Good morning",
|
|
1092
1096
|
"Good afternoon, {name}": "Good afternoon, {name}",
|
|
1093
1097
|
"Good afternoon": "Good afternoon",
|
|
@@ -1097,7 +1101,9 @@
|
|
|
1097
1101
|
"Show the date of today above the heading": "Show the date of today above the heading",
|
|
1098
1102
|
"Plain header without a coloured background": "Plain header without a coloured background",
|
|
1099
1103
|
"Loading…": "Loading…",
|
|
1100
|
-
"A register and schema are required": "A register and schema are required"
|
|
1104
|
+
"A register and schema are required": "A register and schema are required",
|
|
1105
|
+
"Change the search or try again.": "Change the search or try again.",
|
|
1106
|
+
"Try again later.": "Try again later."
|
|
1101
1107
|
},
|
|
1102
1108
|
"plurals": {
|
|
1103
1109
|
"%n year": ["%n year", "%n years"],
|
package/l10n/nl.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"translations": {
|
|
3
|
+
"Advanced": "Geavanceerd",
|
|
3
4
|
"The item could not be created.": "Het item kon niet worden aangemaakt.",
|
|
4
5
|
"Start over": "Opnieuw beginnen",
|
|
5
6
|
"Continue where you left off": "Ga verder waar je was",
|
|
@@ -49,6 +50,7 @@
|
|
|
49
50
|
"This integration is not available.": "Deze integratie is niet beschikbaar.",
|
|
50
51
|
"Integrations": "Integraties",
|
|
51
52
|
"View": "Weergave",
|
|
53
|
+
"Views": "Weergaven",
|
|
52
54
|
"current step": "huidige stap",
|
|
53
55
|
"{app} not available": "{app} niet beschikbaar",
|
|
54
56
|
"{app} not configured": "{app} niet geconfigureerd",
|
|
@@ -408,6 +410,7 @@
|
|
|
408
410
|
"Any": "Alle",
|
|
409
411
|
"To": "Tot",
|
|
410
412
|
"Equals": "Is gelijk aan",
|
|
413
|
+
"Contains": "Bevat",
|
|
411
414
|
"Clear": "Wissen",
|
|
412
415
|
"Apply": "Toepassen",
|
|
413
416
|
"This column cannot list its objects.": "Deze kolom kan zijn objecten niet tonen.",
|
|
@@ -1132,6 +1135,7 @@
|
|
|
1132
1135
|
"The actions of an attention card are declared in the manifest.": "De acties van een aandachtskaart staan in het manifest.",
|
|
1133
1136
|
"An attention card needs a title": "Een aandachtskaart heeft een titel nodig",
|
|
1134
1137
|
"Good morning, {name}": "Goedemorgen, {name}",
|
|
1138
|
+
"This view has no widgets yet.": "Deze weergave heeft nog geen widgets.",
|
|
1135
1139
|
"Good morning": "Goedemorgen",
|
|
1136
1140
|
"Good afternoon, {name}": "Goedemiddag, {name}",
|
|
1137
1141
|
"Good afternoon": "Goedemiddag",
|
|
@@ -1141,7 +1145,9 @@
|
|
|
1141
1145
|
"Show the date of today above the heading": "Toon de datum van vandaag boven de kop",
|
|
1142
1146
|
"Plain header without a coloured background": "Eenvoudige kop zonder gekleurde achtergrond",
|
|
1143
1147
|
"Loading…": "Laden…",
|
|
1144
|
-
"A register and schema are required": "Een register en schema zijn verplicht"
|
|
1148
|
+
"A register and schema are required": "Een register en schema zijn verplicht",
|
|
1149
|
+
"Change the search or try again.": "Pas de zoekopdracht aan of probeer het opnieuw.",
|
|
1150
|
+
"Try again later.": "Probeer het later opnieuw."
|
|
1145
1151
|
},
|
|
1146
1152
|
"plurals": {
|
|
1147
1153
|
"%n year": ["%n jaar", "%n jaar"],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@conduction/nextcloud-vue",
|
|
3
|
-
"version": "2.56.0-beta.
|
|
3
|
+
"version": "2.56.0-beta.14",
|
|
4
4
|
"description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
|
|
5
5
|
"homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -152,9 +152,10 @@ Controlling the inline action button count — `inlineActionCount` sets how many
|
|
|
152
152
|
| `showMap` | `Boolean` | `false` | Whether to render the third "Map" view-toggle segment. Off by default so existing two-segment consumers are unchanged |
|
|
153
153
|
| `mapLabel` | `String` | `''` | Label for the map view-toggle option (defaults to "Map"). Only shown when `showMap` |
|
|
154
154
|
| `mapIcon` | `String` | `''` | MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via `CnIcon` |
|
|
155
|
-
| `showSearch` | `Boolean` | `false` | Whether to show the inline search field on the left of the bar |
|
|
155
|
+
| `showSearch` | `Boolean` | `false` | Whether to show the inline search field on the left of the bar. The field takes the place of the "Showing X of Y" counter unless `showCountWithSearch` is set |
|
|
156
156
|
| `searchValue` | `String` | `''` | Current value of the inline search field (controlled) |
|
|
157
157
|
| `searchPlaceholder` | `String` | `''` | Placeholder / accessible label for the inline search field |
|
|
158
|
+
| `showCountWithSearch` | `Boolean` | `false` | Keep the "Showing X of Y" counter visible beside the inline search field, after the search and any `#after-search` controls. No effect without `showSearch` |
|
|
158
159
|
| `headerActions` | `Array` | `[]` | Manifest-declared page-level actions rendered inside the overflow dropdown between the built-in Refresh and the `#action-items` slot. Each entry is `{ id, label, icon?, disabled? }` — the bar emits `@header-action({ action: id, id })` on click and the parent (e.g. `CnIndexPage`) dispatches the resolved handler. The `icon` field accepts EITHER an MDI Vue component name (e.g. `'History'`) — rendered via `CnIcon` — OR a Nextcloud core CSS icon class (e.g. `'icon-history'`) — rendered as a `<span>` carrying that class. An entry with `href` (URL) or `to` (vue-router location) renders as a real link, `linkTarget` as its `target`; it still emits `@header-action`, so the parent must not navigate for it again. |
|
|
159
160
|
|
|
160
161
|
## Manifest header actions example
|
|
@@ -12,11 +12,16 @@
|
|
|
12
12
|
:aria-label="searchPlaceholder || t('nextcloud-vue', 'Search')"
|
|
13
13
|
@input="onSearchInput">
|
|
14
14
|
</div>
|
|
15
|
-
<span v-else-if="
|
|
15
|
+
<span v-else-if="hasTotal" class="cn-actions-bar__count">
|
|
16
16
|
{{ countText }}
|
|
17
17
|
</span>
|
|
18
18
|
<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->
|
|
19
19
|
<slot name="after-search" />
|
|
20
|
+
<!-- Counter beside the search (`showCountWithSearch`): after the search and its #after-search controls. The live region stays mounted while there is no total, so results coming back after none are announced too. -->
|
|
21
|
+
<span v-if="showSearch && showCountWithSearch"
|
|
22
|
+
class="cn-actions-bar__count cn-actions-bar__count--beside-search"
|
|
23
|
+
:class="{ 'cn-actions-bar__count--empty': !hasTotal }"
|
|
24
|
+
aria-live="polite">{{ hasTotal ? countText : '' }}</span>
|
|
20
25
|
|
|
21
26
|
<!-- View mode toggle (Cards / Table / List) — segmented control with
|
|
22
27
|
a sliding thumb that animates between the N segments. Lives in
|
|
@@ -644,6 +649,16 @@ export default {
|
|
|
644
649
|
default: '',
|
|
645
650
|
},
|
|
646
651
|
|
|
652
|
+
/**
|
|
653
|
+
* Keep the "Showing X of Y" counter visible beside the inline search field,
|
|
654
|
+
* after any `#after-search` controls. By default the search field takes the
|
|
655
|
+
* counter's place. No effect without `showSearch`.
|
|
656
|
+
*/
|
|
657
|
+
showCountWithSearch: {
|
|
658
|
+
type: Boolean,
|
|
659
|
+
default: false,
|
|
660
|
+
},
|
|
661
|
+
|
|
647
662
|
/** Whether the refresh action is currently in progress */
|
|
648
663
|
refreshing: {
|
|
649
664
|
type: Boolean,
|
|
@@ -811,6 +826,15 @@ export default {
|
|
|
811
826
|
}))
|
|
812
827
|
},
|
|
813
828
|
|
|
829
|
+
/**
|
|
830
|
+
* Whether there is a non-empty total for the "Showing X of Y" counter.
|
|
831
|
+
*
|
|
832
|
+
* @return {boolean}
|
|
833
|
+
*/
|
|
834
|
+
hasTotal() {
|
|
835
|
+
return Boolean(this.pagination && this.pagination.total > 0)
|
|
836
|
+
},
|
|
837
|
+
|
|
814
838
|
countText() {
|
|
815
839
|
if (!this.pagination) {
|
|
816
840
|
return ''
|
|
@@ -246,7 +246,7 @@
|
|
|
246
246
|
</NcAppNavigationItem>
|
|
247
247
|
</template>
|
|
248
248
|
</template>
|
|
249
|
-
<template v-if="footerItems.length > 0 || showSettingsFoldout || resolvedCard ||
|
|
249
|
+
<template v-if="footerItems.length > 0 || showSettingsFoldout || resolvedCard || showsHelp" #footer>
|
|
250
250
|
<!--
|
|
251
251
|
@slot card
|
|
252
252
|
@description Replace the card above the footer entries
|
|
@@ -282,11 +282,15 @@
|
|
|
282
282
|
hover highlight are scoped to itself, so they survive being
|
|
283
283
|
slotted. The main list's inset comes from NcAppNavigation's
|
|
284
284
|
scope, which slot content does not carry. -->
|
|
285
|
-
<NcAppNavigationList
|
|
285
|
+
<NcAppNavigationList
|
|
286
|
+
v-if="footerItems.length > 0 || showsHelp"
|
|
287
|
+
class="cn-app-nav__footer-list"
|
|
288
|
+
:class="{ 'cn-app-nav__footer-list--after-settings': settingsFirst }">
|
|
286
289
|
<!-- The help entry (`nav.help`): a link to the app's own help
|
|
287
|
-
with a help icon, above the footer entries
|
|
290
|
+
with a help icon, above the footer entries (or after them,
|
|
291
|
+
when a declared `nav.footer` names it last). -->
|
|
288
292
|
<NcAppNavigationItem
|
|
289
|
-
v-if="
|
|
293
|
+
v-if="showsHelp && !helpAfterItems"
|
|
290
294
|
:name="resolvedHelp.label"
|
|
291
295
|
:to="resolvedHelp.to"
|
|
292
296
|
:href="resolvedHelp.href"
|
|
@@ -318,6 +322,17 @@
|
|
|
318
322
|
:active="isActive(item)" />
|
|
319
323
|
</template>
|
|
320
324
|
</NcAppNavigationItem>
|
|
325
|
+
<NcAppNavigationItem
|
|
326
|
+
v-if="showsHelp && helpAfterItems"
|
|
327
|
+
:name="resolvedHelp.label"
|
|
328
|
+
:to="resolvedHelp.to"
|
|
329
|
+
:href="resolvedHelp.href"
|
|
330
|
+
:target="resolvedHelp.href ? '_blank' : undefined"
|
|
331
|
+
data-testid="cn-nav-help">
|
|
332
|
+
<template #icon>
|
|
333
|
+
<HelpCircleOutline :size="20" />
|
|
334
|
+
</template>
|
|
335
|
+
</NcAppNavigationItem>
|
|
321
336
|
</NcAppNavigationList>
|
|
322
337
|
<!-- Settings foldout (section: "settings" items). NC-native
|
|
323
338
|
gear-icon button that slides open a panel; the first entry
|
|
@@ -326,6 +341,7 @@
|
|
|
326
341
|
<NcAppNavigationSettings
|
|
327
342
|
v-if="showSettingsFoldout"
|
|
328
343
|
:name="settingsFoldoutLabel"
|
|
344
|
+
:class="{ 'cn-app-nav__settings--first': settingsFirst }"
|
|
329
345
|
data-testid="cn-nav-settings">
|
|
330
346
|
<ul class="cn-app-nav__settings-list">
|
|
331
347
|
<NcAppNavigationItem
|
|
@@ -958,17 +974,113 @@ export default {
|
|
|
958
974
|
* Documentation, Features & Roadmap, About.
|
|
959
975
|
*/
|
|
960
976
|
footerItems() {
|
|
961
|
-
|
|
977
|
+
const footer = this.visibleItems.filter((item) => item.section === 'footer')
|
|
978
|
+
const declared = this.declaredFooter
|
|
979
|
+
if (declared === null) {
|
|
980
|
+
return footer
|
|
981
|
+
}
|
|
982
|
+
// A declared footer (`nav.footer`) keeps only the entries it names,
|
|
983
|
+
// in the order it names them.
|
|
984
|
+
return declared
|
|
985
|
+
.map((id) => footer.find((item) => item.id === id))
|
|
986
|
+
.filter(Boolean)
|
|
987
|
+
},
|
|
988
|
+
|
|
989
|
+
/**
|
|
990
|
+
* The footer the manifest declares (`nav.footer`): an ordered list of
|
|
991
|
+
* menu entry ids plus the reserved ids `help` (the `nav.help` entry)
|
|
992
|
+
* and `settings` (the settings foldout). Null when the manifest
|
|
993
|
+
* declares none, which keeps today's footer: the help entry, then
|
|
994
|
+
* every `section: "footer"` entry, then the foldout.
|
|
995
|
+
*
|
|
996
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-the-navigation-footer-can-be-declared
|
|
997
|
+
* @return {Array<string>|null}
|
|
998
|
+
*/
|
|
999
|
+
declaredFooter() {
|
|
1000
|
+
const declared = this.effectiveManifest?.nav?.footer
|
|
1001
|
+
if (!Array.isArray(declared)) {
|
|
1002
|
+
return null
|
|
1003
|
+
}
|
|
1004
|
+
return declared.filter((id) => typeof id === 'string' && id !== '')
|
|
1005
|
+
},
|
|
1006
|
+
|
|
1007
|
+
/**
|
|
1008
|
+
* Footer-section entries a declared footer leaves out. They move into
|
|
1009
|
+
* the settings foldout rather than disappearing, so a page such as
|
|
1010
|
+
* Store or Reports stays reachable. Empty without `nav.footer`.
|
|
1011
|
+
*
|
|
1012
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-the-navigation-footer-can-be-declared
|
|
1013
|
+
* @return {Array<object>}
|
|
1014
|
+
*/
|
|
1015
|
+
undeclaredFooterItems() {
|
|
1016
|
+
const declared = this.declaredFooter
|
|
1017
|
+
if (declared === null) {
|
|
1018
|
+
return []
|
|
1019
|
+
}
|
|
1020
|
+
return this.visibleItems.filter((item) => item.section === 'footer' && !declared.includes(item.id))
|
|
1021
|
+
},
|
|
1022
|
+
|
|
1023
|
+
/**
|
|
1024
|
+
* Whether the help entry renders: whenever it resolves, unless a
|
|
1025
|
+
* declared footer leaves `help` out.
|
|
1026
|
+
*
|
|
1027
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-the-navigation-footer-can-be-declared
|
|
1028
|
+
* @return {boolean}
|
|
1029
|
+
*/
|
|
1030
|
+
showsHelp() {
|
|
1031
|
+
if (!this.resolvedHelp) {
|
|
1032
|
+
return false
|
|
1033
|
+
}
|
|
1034
|
+
return this.declaredFooter === null || this.declaredFooter.includes('help')
|
|
1035
|
+
},
|
|
1036
|
+
|
|
1037
|
+
/**
|
|
1038
|
+
* Whether the help entry goes AFTER the footer entries. Only a declared
|
|
1039
|
+
* footer that names an entry before `help` puts it there; by default
|
|
1040
|
+
* it leads the list.
|
|
1041
|
+
*
|
|
1042
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-the-navigation-footer-can-be-declared
|
|
1043
|
+
* @return {boolean}
|
|
1044
|
+
*/
|
|
1045
|
+
helpAfterItems() {
|
|
1046
|
+
const declared = this.declaredFooter
|
|
1047
|
+
if (declared === null) {
|
|
1048
|
+
return false
|
|
1049
|
+
}
|
|
1050
|
+
const help = declared.indexOf('help')
|
|
1051
|
+
return this.footerItems.some((item) => declared.indexOf(item.id) < help)
|
|
1052
|
+
},
|
|
1053
|
+
|
|
1054
|
+
/**
|
|
1055
|
+
* Whether the settings foldout goes ABOVE the footer list: only when a
|
|
1056
|
+
* declared footer names `settings` before every other entry
|
|
1057
|
+
* (`["settings", "help"]`, the board's "Instellingen" then "Hulp en
|
|
1058
|
+
* uitleg"). Done with CSS `order` on the two siblings, so the markup
|
|
1059
|
+
* of both stays as it is.
|
|
1060
|
+
*
|
|
1061
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-the-navigation-footer-can-be-declared
|
|
1062
|
+
* @return {boolean}
|
|
1063
|
+
*/
|
|
1064
|
+
settingsFirst() {
|
|
1065
|
+
const declared = this.declaredFooter
|
|
1066
|
+
return declared !== null && declared.indexOf('settings') === 0
|
|
962
1067
|
},
|
|
963
1068
|
|
|
964
1069
|
/**
|
|
965
1070
|
* Items that render INSIDE the NcAppNavigationSettings foldout
|
|
966
1071
|
* (section: "settings"). The foldout is the NC-native gear-icon
|
|
967
1072
|
* button that slides a panel open; these entries are app-level
|
|
968
|
-
* configuration pages (Forms, Pipelines, Automations, …).
|
|
1073
|
+
* configuration pages (Forms, Pipelines, Automations, …). A declared
|
|
1074
|
+
* footer (`nav.footer`) adds the footer entries it leaves out.
|
|
1075
|
+
*
|
|
1076
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-the-navigation-footer-can-be-declared
|
|
1077
|
+
* @return {Array<object>}
|
|
969
1078
|
*/
|
|
970
1079
|
settingsItems() {
|
|
971
|
-
return
|
|
1080
|
+
return [
|
|
1081
|
+
...this.visibleItems.filter((item) => item.section === 'settings'),
|
|
1082
|
+
...this.undeclaredFooterItems,
|
|
1083
|
+
]
|
|
972
1084
|
},
|
|
973
1085
|
|
|
974
1086
|
/**
|
|
@@ -1001,7 +1113,7 @@ export default {
|
|
|
1001
1113
|
|
|
1002
1114
|
/**
|
|
1003
1115
|
* Label for the foldout's gear button. Manifest override:
|
|
1004
|
-
* `nav.settingsLabel`; defaults to "
|
|
1116
|
+
* `nav.settingsLabel`; defaults to "Advanced".
|
|
1005
1117
|
*
|
|
1006
1118
|
* @return {string}
|
|
1007
1119
|
*/
|
|
@@ -1010,7 +1122,7 @@ export default {
|
|
|
1010
1122
|
if (typeof custom === 'string' && custom.length > 0) {
|
|
1011
1123
|
return this.effectiveTranslate(custom)
|
|
1012
1124
|
}
|
|
1013
|
-
return t('nextcloud-vue', '
|
|
1125
|
+
return t('nextcloud-vue', 'Advanced')
|
|
1014
1126
|
},
|
|
1015
1127
|
|
|
1016
1128
|
/**
|
|
@@ -2294,6 +2406,21 @@ export default {
|
|
|
2294
2406
|
padding: calc(var(--default-grid-baseline, 4px) * 2);
|
|
2295
2407
|
}
|
|
2296
2408
|
|
|
2409
|
+
/*
|
|
2410
|
+
* The primary action never shrinks out of sight. NcAppNavigation renders it in
|
|
2411
|
+
* `.app-navigation__body`, a flex child with `overflow-y: scroll` (so its
|
|
2412
|
+
* minimum height is 0) beside a list of `height: 100%` and the footer. With a
|
|
2413
|
+
* card and footer entries below the list, the column overflows and the body
|
|
2414
|
+
* gives up its share of the shrink: "New case" showed as a 24px sliver of a
|
|
2415
|
+
* 42px button. All three forms carry `.app-navigation-new` (the solid and
|
|
2416
|
+
* link wrappers mirror NcAppNavigationNew's class), and the rule is scoped to
|
|
2417
|
+
* this component's navigation, so a navigation without a primary action lays
|
|
2418
|
+
* out exactly as before.
|
|
2419
|
+
*/
|
|
2420
|
+
.app-navigation[data-testid="cn-nav"] .app-navigation__body:has(> .app-navigation-new) {
|
|
2421
|
+
flex-shrink: 0;
|
|
2422
|
+
}
|
|
2423
|
+
|
|
2297
2424
|
/*
|
|
2298
2425
|
* Footer-section items (section: "footer") render in NcAppNavigation's
|
|
2299
2426
|
* #footer slot, outside the scroll container, so they stay visible above
|
|
@@ -2317,6 +2444,20 @@ export default {
|
|
|
2317
2444
|
overflow: visible !important;
|
|
2318
2445
|
}
|
|
2319
2446
|
|
|
2447
|
+
/*
|
|
2448
|
+
* A declared footer that names `settings` first (`nav.footer`) puts the
|
|
2449
|
+
* foldout above the footer list. The two are siblings in NcAppNavigation's
|
|
2450
|
+
* flex column, so `order` moves them without changing either's markup; the
|
|
2451
|
+
* card above keeps order 0 and stays first.
|
|
2452
|
+
*/
|
|
2453
|
+
.cn-app-nav__settings--first {
|
|
2454
|
+
order: 1;
|
|
2455
|
+
}
|
|
2456
|
+
|
|
2457
|
+
.cn-app-nav__footer-list--after-settings {
|
|
2458
|
+
order: 2;
|
|
2459
|
+
}
|
|
2460
|
+
|
|
2320
2461
|
/*
|
|
2321
2462
|
* Align the settings foldout's items with the main/footer list items,
|
|
2322
2463
|
* whose icons sit at a 16px inset. The foldout's items live in a bare
|