@conduction/nextcloud-vue 2.56.0-beta.6 → 2.56.0-beta.7
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/CnActionsMenu/CnActionsMenu.vue2.js +14 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +39 -0
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +46 -4
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +224 -9
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +79 -25
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js +42 -3
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js +39 -6
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +46 -0
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +11 -4
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js +10 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js.map +1 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +39 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +16 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -0
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +117 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +147 -89
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +10 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +259 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +131 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +10 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +116 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +24 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +503 -28
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +300 -142
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js +10 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js +237 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js +120 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js +10 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +77 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js +27 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +169 -12
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +15 -7
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js +37 -3
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js +44 -16
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +132 -3
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +6 -3
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js +10 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js +150 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js +106 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js +9 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +47 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js +17 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +49 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js +6 -0
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js +46 -0
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js +15 -3
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js.map +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +37 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +29 -13
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +50 -3
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js +10 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +186 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +46 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +11 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +298 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +77 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js +10 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js +169 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js +48 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js.map +1 -0
- package/dist/esm/components/CnTabs/CnTab.vue2.js +35 -0
- package/dist/esm/components/CnTabs/CnTab.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTab.vue3.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue2.js +120 -7
- package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue3.js +57 -5
- package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +59 -4
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +6 -2
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +10 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +484 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js +115 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js +10 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js +189 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js +74 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +82 -8
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +54 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +54 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +931 -4
- package/dist/esm/utils/dateVariant.js +124 -0
- package/dist/esm/utils/dateVariant.js.map +1 -0
- package/dist/esm/utils/detailActionModel.js +260 -0
- package/dist/esm/utils/detailActionModel.js.map +1 -0
- package/dist/esm/utils/dueRule.js +84 -0
- package/dist/esm/utils/dueRule.js.map +1 -0
- package/dist/esm/utils/fetchAggregate.js +37 -1
- package/dist/esm/utils/fetchAggregate.js.map +1 -1
- package/dist/esm/utils/fetchFilterCounts.js +186 -0
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +5 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/readPath.js +30 -0
- package/dist/esm/utils/readPath.js.map +1 -0
- 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 +14970 -8991
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +931 -4
- package/l10n/en.json +54 -1
- package/l10n/nl.json +54 -1
- package/package.json +1 -1
- package/scripts/.jsdoc-baselines.json +3 -0
- package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -1
- package/src/components/CnAppNav/CnAppNav.md +26 -0
- package/src/components/CnAppNav/CnAppNav.vue +104 -1
- package/src/components/CnBannerWidget/CnBannerWidget.vue +365 -10
- package/src/components/CnBannerWidgetForm/CnBannerWidgetForm.vue +65 -3
- package/src/components/CnBoardView/CnBoardView.vue +77 -0
- package/src/components/CnBrandStripe/CnBrandStripe.md +22 -0
- package/src/components/CnBrandStripe/CnBrandStripe.vue +100 -0
- package/src/components/CnBrandStripe/index.js +4 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +207 -1
- package/src/components/CnConversationThread/CnConversationThread.md +51 -0
- package/src/components/CnConversationThread/CnConversationThread.vue +457 -0
- package/src/components/CnConversationThread/CnConversationWidget.vue +144 -0
- package/src/components/CnConversationThread/index.js +4 -0
- package/src/components/CnDetailPage/CnDetailPage.md +16 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +683 -48
- package/src/components/CnDocumentReviewList/CnDocumentReviewList.md +55 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewList.vue +384 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +108 -0
- package/src/components/CnDocumentReviewList/index.js +4 -0
- package/src/components/CnHeaderWidget/CnHeaderWidget.vue +189 -14
- package/src/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue +53 -3
- package/src/components/CnIndexPage/CnIndexPage.vue +135 -3
- package/src/components/CnNextStepCard/CnNextStepCard.md +40 -0
- package/src/components/CnNextStepCard/CnNextStepCard.vue +319 -0
- package/src/components/CnNextStepCard/CnNextStepWidget.vue +59 -0
- package/src/components/CnNextStepCard/index.js +4 -0
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +49 -0
- package/src/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue +6 -0
- package/src/components/CnObjectKanban/CnObjectKanban.vue +86 -2
- package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +3 -0
- package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +60 -1
- package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +50 -3
- package/src/components/CnSegmentedControl/CnSegmentedControl.md +46 -0
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +291 -0
- package/src/components/CnSegmentedControl/index.js +4 -0
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.md +15 -0
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +414 -0
- package/src/components/CnStackedBarWidget/index.js +14 -0
- package/src/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue +224 -0
- package/src/components/CnStackedBarWidgetForm/index.js +4 -0
- package/src/components/CnTabs/CnTab.vue +35 -0
- package/src/components/CnTabs/CnTabs.vue +244 -10
- package/src/components/CnTabsWidget/CnTabsWidget.vue +63 -4
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.md +31 -0
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +668 -0
- package/src/components/CnWeekStripWidget/index.js +14 -0
- package/src/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue +265 -0
- package/src/components/CnWeekStripWidgetForm/index.js +4 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +74 -0
- package/src/components/index.js +11 -0
- package/src/css/detail-page.css +47 -0
- package/src/index.js +9 -0
- package/src/schemas/app-manifest-v2.schema.json +389 -1
- package/src/schemas/app-manifest.schema.json +2 -1
- package/src/utils/dateVariant.js +120 -0
- package/src/utils/detailActionModel.js +256 -0
- package/src/utils/dueRule.js +94 -0
- package/src/utils/fetchAggregate.js +36 -0
- package/src/utils/fetchFilterCounts.js +182 -0
- package/src/utils/index.js +1 -0
- package/src/utils/libraryWidgetKeys.js +5 -0
- package/src/utils/readPath.js +27 -0
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
- SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
3
|
+
- SPDX-License-Identifier: EUPL-1.2
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<div class="cn-week-strip-form">
|
|
8
|
+
<div class="cn-week-strip-form__row2">
|
|
9
|
+
<CnRegisterSchemaSelect
|
|
10
|
+
:register="source.register"
|
|
11
|
+
:schema="source.schema"
|
|
12
|
+
@update:register="updateSource('register', $event)"
|
|
13
|
+
@update:schema="updateSource('schema', $event)" />
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div class="cn-week-strip-form__row2">
|
|
17
|
+
<CnFieldPicker
|
|
18
|
+
:value="dateField"
|
|
19
|
+
:label="t('nextcloud-vue', 'Date field')"
|
|
20
|
+
:options="availableFields"
|
|
21
|
+
placeholder="deadline"
|
|
22
|
+
@update="updateField('dateField', $event)" />
|
|
23
|
+
<CnFieldPicker
|
|
24
|
+
:value="titleField"
|
|
25
|
+
:label="t('nextcloud-vue', 'Title field')"
|
|
26
|
+
:options="availableFields"
|
|
27
|
+
placeholder="title"
|
|
28
|
+
@update="updateField('titleField', $event)" />
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<NcTextField
|
|
32
|
+
:modelValue="metaFieldsText"
|
|
33
|
+
:label="t('nextcloud-vue', 'Extra fields under the title (comma separated)')"
|
|
34
|
+
placeholder="identifier, type"
|
|
35
|
+
@update:modelValue="updateField('metaFieldsText', $event)" />
|
|
36
|
+
|
|
37
|
+
<CnFilterRowsEditor :value="filterRows" :fields="availableFields" @input="onFilterRows" />
|
|
38
|
+
|
|
39
|
+
<div class="cn-week-strip-form__row2">
|
|
40
|
+
<NcSelect
|
|
41
|
+
:modelValue="days"
|
|
42
|
+
:options="dayOptions"
|
|
43
|
+
:inputLabel="t('nextcloud-vue', 'Days shown')"
|
|
44
|
+
:clearable="false"
|
|
45
|
+
@update:modelValue="updateField('days', $event)" />
|
|
46
|
+
<NcTextField
|
|
47
|
+
:modelValue="itemRoute"
|
|
48
|
+
:label="t('nextcloud-vue', 'Page an item opens (page id, optional)')"
|
|
49
|
+
@update:modelValue="updateField('itemRoute', $event)" />
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<NcTextField
|
|
53
|
+
:modelValue="emptyText"
|
|
54
|
+
:label="t('nextcloud-vue', 'Text for a day without items')"
|
|
55
|
+
@update:modelValue="updateField('emptyText', $event)" />
|
|
56
|
+
</div>
|
|
57
|
+
</template>
|
|
58
|
+
|
|
59
|
+
<script>
|
|
60
|
+
import { translate as t } from '@nextcloud/l10n'
|
|
61
|
+
import { NcSelect, NcTextField } from '@nextcloud/vue'
|
|
62
|
+
import CnFieldPicker from '../CnFieldPicker/CnFieldPicker.vue'
|
|
63
|
+
import CnFilterRowsEditor from '../CnFilterRowsEditor/CnFilterRowsEditor.vue'
|
|
64
|
+
import CnRegisterSchemaSelect from '../CnRegisterSchemaSelect/CnRegisterSchemaSelect.vue'
|
|
65
|
+
import { fetchSchemaProperties } from '../../utils/fetchSchemaProperties.js'
|
|
66
|
+
import { filterToRows, rowsToFilter } from '../CnFilterRowsEditor/filterRows.js'
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* CnWeekStripWidgetForm is the settings form of a `week-strip` widget. It
|
|
70
|
+
* edits the source (register, schema, filter), the date field the items are
|
|
71
|
+
* bucketed by, what each item shows, how many days render and the text of an
|
|
72
|
+
* empty day. Static `items` and the `lateWhen` rule are written in the
|
|
73
|
+
* manifest and pass through untouched. Emits `update:content` on every
|
|
74
|
+
* change; `validate()` asks for a register, a schema and a date field unless
|
|
75
|
+
* the widget has static items.
|
|
76
|
+
*/
|
|
77
|
+
export default {
|
|
78
|
+
name: 'CnWeekStripWidgetForm',
|
|
79
|
+
|
|
80
|
+
components: { NcSelect, NcTextField, CnFieldPicker, CnFilterRowsEditor, CnRegisterSchemaSelect },
|
|
81
|
+
|
|
82
|
+
props: {
|
|
83
|
+
/**
|
|
84
|
+
* The placement being edited (pre-fills from `editingWidget.content`), or null.
|
|
85
|
+
*
|
|
86
|
+
* @type {{content: object}|null}
|
|
87
|
+
*/
|
|
88
|
+
editingWidget: { type: Object, default: null },
|
|
89
|
+
/**
|
|
90
|
+
* Initial content values when not editing (registry defaults).
|
|
91
|
+
*
|
|
92
|
+
* @type {object}
|
|
93
|
+
*/
|
|
94
|
+
value: { type: Object, default: () => ({}) },
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
emits: [
|
|
98
|
+
/**
|
|
99
|
+
* Emitted with the assembled content blob on every field change.
|
|
100
|
+
*
|
|
101
|
+
* @event update:content
|
|
102
|
+
* @type {object}
|
|
103
|
+
*/
|
|
104
|
+
'update:content',
|
|
105
|
+
],
|
|
106
|
+
|
|
107
|
+
data() {
|
|
108
|
+
const initial = this.editingWidget?.content || this.value || {}
|
|
109
|
+
const src = initial.source || {}
|
|
110
|
+
return {
|
|
111
|
+
initial,
|
|
112
|
+
source: { register: src.register ?? '', schema: src.schema ?? '' },
|
|
113
|
+
limit: src.limit,
|
|
114
|
+
filterRows: filterToRows(src.filter || {}),
|
|
115
|
+
dateField: initial.dateField ?? '',
|
|
116
|
+
titleField: initial.titleField ?? '',
|
|
117
|
+
metaFieldsText: Array.isArray(initial.metaFields) ? initial.metaFields.join(', ') : '',
|
|
118
|
+
days: Number(initial.days) === 7 ? 7 : 5,
|
|
119
|
+
itemRoute: initial.itemRoute ?? '',
|
|
120
|
+
emptyText: initial.emptyText ?? '',
|
|
121
|
+
availableFields: [],
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
computed: {
|
|
126
|
+
/**
|
|
127
|
+
* The day counts on offer: working days or the whole week.
|
|
128
|
+
*
|
|
129
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
|
|
130
|
+
*/
|
|
131
|
+
dayOptions() {
|
|
132
|
+
return [5, 7]
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The assembled content blob. Keys the form does not edit (static
|
|
137
|
+
* items, the late rule) are carried over from the initial content.
|
|
138
|
+
*
|
|
139
|
+
* @return {object}
|
|
140
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
|
|
141
|
+
*/
|
|
142
|
+
assembledContent() {
|
|
143
|
+
const source = {
|
|
144
|
+
register: this.source.register,
|
|
145
|
+
schema: this.source.schema,
|
|
146
|
+
filter: rowsToFilter(this.filterRows),
|
|
147
|
+
}
|
|
148
|
+
if (this.limit !== undefined) {
|
|
149
|
+
source.limit = this.limit
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
...this.initial,
|
|
153
|
+
source,
|
|
154
|
+
dateField: this.dateField,
|
|
155
|
+
titleField: this.titleField,
|
|
156
|
+
metaFields: this.metaFieldsText.split(',').map((field) => field.trim()).filter((field) => field !== ''),
|
|
157
|
+
days: this.days,
|
|
158
|
+
itemRoute: this.itemRoute,
|
|
159
|
+
emptyText: this.emptyText,
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
watch: {
|
|
165
|
+
'source.register': 'loadFields',
|
|
166
|
+
'source.schema': 'loadFields',
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
mounted() {
|
|
170
|
+
this.loadFields()
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
methods: {
|
|
174
|
+
t,
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Load the schema's field names for the pickers.
|
|
178
|
+
*
|
|
179
|
+
* @return {Promise<void>}
|
|
180
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
|
|
181
|
+
*/
|
|
182
|
+
async loadFields() {
|
|
183
|
+
this.availableFields = await fetchSchemaProperties(this.source.register, this.source.schema)
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Set one field and emit the assembled content.
|
|
188
|
+
*
|
|
189
|
+
* @param {string} field The data key to write.
|
|
190
|
+
* @param {string|number} value The new value.
|
|
191
|
+
* @return {void}
|
|
192
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
|
|
193
|
+
*/
|
|
194
|
+
updateField(field, value) {
|
|
195
|
+
this[field] = value
|
|
196
|
+
this.$emit('update:content', this.assembledContent)
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Set the register or the schema and emit.
|
|
201
|
+
*
|
|
202
|
+
* @param {'register'|'schema'} field The source key to write.
|
|
203
|
+
* @param {string} value The chosen slug.
|
|
204
|
+
* @return {void}
|
|
205
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
|
|
206
|
+
*/
|
|
207
|
+
updateSource(field, value) {
|
|
208
|
+
this.source[field] = value
|
|
209
|
+
this.$emit('update:content', this.assembledContent)
|
|
210
|
+
},
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Take the filter editor's rows and emit.
|
|
214
|
+
*
|
|
215
|
+
* @param {Array<{key: string, op: string, value: string}>} rows The rows.
|
|
216
|
+
* @return {void}
|
|
217
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
|
|
218
|
+
*/
|
|
219
|
+
onFilterRows(rows) {
|
|
220
|
+
this.filterRows = rows
|
|
221
|
+
this.$emit('update:content', this.assembledContent)
|
|
222
|
+
},
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Validate the form; an empty array means valid.
|
|
226
|
+
*
|
|
227
|
+
* @return {string[]} The validation errors.
|
|
228
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
|
|
229
|
+
*/
|
|
230
|
+
validate() {
|
|
231
|
+
const hasStaticItems = Array.isArray(this.initial.items) && this.initial.items.length > 0
|
|
232
|
+
if (hasStaticItems && !this.source.register && !this.source.schema) {
|
|
233
|
+
return []
|
|
234
|
+
}
|
|
235
|
+
const errors = []
|
|
236
|
+
if (!this.source.register || !this.source.schema) {
|
|
237
|
+
errors.push(t('nextcloud-vue', 'A register and schema are required'))
|
|
238
|
+
}
|
|
239
|
+
if (!this.dateField) {
|
|
240
|
+
errors.push(t('nextcloud-vue', 'A date field is required'))
|
|
241
|
+
}
|
|
242
|
+
return errors
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
}
|
|
246
|
+
</script>
|
|
247
|
+
|
|
248
|
+
<style scoped>
|
|
249
|
+
.cn-week-strip-form {
|
|
250
|
+
display: flex;
|
|
251
|
+
flex-direction: column;
|
|
252
|
+
gap: 12px;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.cn-week-strip-form__row2 {
|
|
256
|
+
display: flex;
|
|
257
|
+
gap: 12px;
|
|
258
|
+
align-items: flex-end;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.cn-week-strip-form__row2 > * {
|
|
262
|
+
flex: 1;
|
|
263
|
+
min-width: 0;
|
|
264
|
+
}
|
|
265
|
+
</style>
|
|
@@ -17,20 +17,27 @@
|
|
|
17
17
|
|
|
18
18
|
import CnChartWidget from '../CnChartWidget/CnChartWidget.vue'
|
|
19
19
|
import CnChartWidgetForm from '../CnChartWidgetForm/CnChartWidgetForm.vue'
|
|
20
|
+
import CnConversationWidget from '../CnConversationThread/CnConversationWidget.vue'
|
|
20
21
|
import CnCountdownWidget from '../CnCountdownWidget/CnCountdownWidget.vue'
|
|
21
22
|
import CnCountdownWidgetForm from '../CnCountdownWidgetForm/CnCountdownWidgetForm.vue'
|
|
23
|
+
import CnDocumentReviewWidget from '../CnDocumentReviewList/CnDocumentReviewWidget.vue'
|
|
22
24
|
import CnMapWidget from '../CnMapWidget/CnMapWidget.vue'
|
|
23
25
|
import CnMapWidgetForm from '../CnMapWidgetForm/CnMapWidgetForm.vue'
|
|
26
|
+
import CnNextStepWidget from '../CnNextStepCard/CnNextStepWidget.vue'
|
|
24
27
|
import CnObjectListWidget2 from '../CnObjectListWidget/CnObjectListWidget.vue'
|
|
25
28
|
import CnObjectListWidgetForm2 from '../CnObjectListWidgetForm/CnObjectListWidgetForm.vue'
|
|
26
29
|
import CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'
|
|
27
30
|
import CnRelatedObjectsWidgetForm from '../CnRelatedObjectsWidgetForm/CnRelatedObjectsWidgetForm.vue'
|
|
31
|
+
import CnStackedBarWidget from '../CnStackedBarWidget/CnStackedBarWidget.vue'
|
|
32
|
+
import CnStackedBarWidgetForm from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue'
|
|
28
33
|
import CnStagesWidget from '../CnStagesWidget/CnStagesWidget.vue'
|
|
29
34
|
import CnStagesWidgetForm from '../CnStagesWidgetForm/CnStagesWidgetForm.vue'
|
|
30
35
|
import CnStatsBlockWidget from '../CnStatsBlockWidget/CnStatsBlockWidget.vue'
|
|
31
36
|
import CnStatsBlockWidgetForm from '../CnStatsBlockWidgetForm/CnStatsBlockWidgetForm.vue'
|
|
32
37
|
import CnTabsWidget from '../CnTabsWidget/CnTabsWidget.vue'
|
|
33
38
|
import CnTabsWidgetForm from '../CnTabsWidgetForm/CnTabsWidgetForm.vue'
|
|
39
|
+
import CnWeekStripWidget from '../CnWeekStripWidget/CnWeekStripWidget.vue'
|
|
40
|
+
import CnWeekStripWidgetForm from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue'
|
|
34
41
|
// Typed widgets registered with an explicit renderer + config FORM. chart /
|
|
35
42
|
// stats-block render through CnDashboardPage's own isChart()/isStatsBlock()
|
|
36
43
|
// branches and `related` through CnDetailPage's isRelatedWidget() branch — the
|
|
@@ -217,6 +224,41 @@ registerDashboardWidget('countdown', {
|
|
|
217
224
|
surfaces: ['detail-page'],
|
|
218
225
|
})
|
|
219
226
|
|
|
227
|
+
// The case surfaces (detail-action-model-and-case-surfaces). Each reads the
|
|
228
|
+
// BOUND RECORD, which only a detail page has, and none has a config form yet,
|
|
229
|
+
// so `form: null` keeps them out of the Add-widget picker: they are placed
|
|
230
|
+
// from the manifest. Registered inline for the same tree-shaking reason as
|
|
231
|
+
// `map` above.
|
|
232
|
+
registerDashboardWidget('next-step', {
|
|
233
|
+
renderer: CnNextStepWidget,
|
|
234
|
+
form: null,
|
|
235
|
+
defaultContent: { field: 'status', stages: {} },
|
|
236
|
+
displayName: 'Next step',
|
|
237
|
+
icon: 'CheckCircleOutline',
|
|
238
|
+
surfaces: ['detail-page'],
|
|
239
|
+
ownsTitle: true,
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
registerDashboardWidget('document-review', {
|
|
243
|
+
renderer: CnDocumentReviewWidget,
|
|
244
|
+
form: null,
|
|
245
|
+
defaultContent: { field: 'documents', statusField: 'reviewStatus', statuses: [] },
|
|
246
|
+
displayName: 'Document review',
|
|
247
|
+
icon: 'FileDocumentCheckOutline',
|
|
248
|
+
surfaces: ['detail-page'],
|
|
249
|
+
ownsTitle: true,
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
registerDashboardWidget('conversation', {
|
|
253
|
+
renderer: CnConversationWidget,
|
|
254
|
+
form: null,
|
|
255
|
+
defaultContent: { field: 'messages', endpoint: '' },
|
|
256
|
+
displayName: 'Conversation',
|
|
257
|
+
icon: 'ForumOutline',
|
|
258
|
+
surfaces: ['detail-page'],
|
|
259
|
+
ownsTitle: true,
|
|
260
|
+
})
|
|
261
|
+
|
|
220
262
|
// The record's stages, where clicking a stage moves the record there.
|
|
221
263
|
// Registered inline for the same tree-shaking reason as `map` above.
|
|
222
264
|
registerDashboardWidget('stages', {
|
|
@@ -258,6 +300,38 @@ registerDashboardWidget('tabs', {
|
|
|
258
300
|
surfaces: ['detail-page'],
|
|
259
301
|
})
|
|
260
302
|
|
|
303
|
+
// The current week as day columns, with the dated items under each day.
|
|
304
|
+
// Registered inline for the same tree-shaking reason as `map` above.
|
|
305
|
+
registerDashboardWidget('week-strip', {
|
|
306
|
+
renderer: CnWeekStripWidget,
|
|
307
|
+
form: CnWeekStripWidgetForm,
|
|
308
|
+
defaultContent: {
|
|
309
|
+
source: { register: '', schema: '', filter: {} },
|
|
310
|
+
dateField: '',
|
|
311
|
+
titleField: '',
|
|
312
|
+
metaFields: [],
|
|
313
|
+
days: 5,
|
|
314
|
+
itemRoute: '',
|
|
315
|
+
emptyText: '',
|
|
316
|
+
},
|
|
317
|
+
displayName: 'Week strip',
|
|
318
|
+
icon: 'Calendar',
|
|
319
|
+
})
|
|
320
|
+
|
|
321
|
+
// One segmented bar with a legend that carries the numbers.
|
|
322
|
+
registerDashboardWidget('stacked-bar', {
|
|
323
|
+
renderer: CnStackedBarWidget,
|
|
324
|
+
form: CnStackedBarWidgetForm,
|
|
325
|
+
defaultContent: {
|
|
326
|
+
source: { register: '', schema: '', groupBy: '', filter: {} },
|
|
327
|
+
order: [],
|
|
328
|
+
labels: {},
|
|
329
|
+
emptyText: '',
|
|
330
|
+
},
|
|
331
|
+
displayName: 'Stacked bar',
|
|
332
|
+
icon: 'ChartBar',
|
|
333
|
+
})
|
|
334
|
+
|
|
261
335
|
/**
|
|
262
336
|
* Explicit no-op that guarantees this module (and therefore every widget's
|
|
263
337
|
* self-registration side effect) is evaluated. Call it once at app bootstrap if
|
package/src/components/index.js
CHANGED
|
@@ -130,6 +130,9 @@ export { CnLeafMountHost } from './CnLeafMountHost/index.js'
|
|
|
130
130
|
export { CnDetailCard } from './CnDetailCard/index.js'
|
|
131
131
|
export { CnCard } from './CnCard/index.js'
|
|
132
132
|
export { CnChoiceCards } from './CnChoiceCards/index.js'
|
|
133
|
+
export { CnNextStepCard } from './CnNextStepCard/index.js'
|
|
134
|
+
export { CnDocumentReviewList } from './CnDocumentReviewList/index.js'
|
|
135
|
+
export { CnConversationThread } from './CnConversationThread/index.js'
|
|
133
136
|
export { CnStatsPanel } from './CnStatsPanel/index.js'
|
|
134
137
|
export { CnJsonViewer } from './CnJsonViewer/index.js'
|
|
135
138
|
export { CnColorPicker } from './CnColorPicker/index.js'
|
|
@@ -352,3 +355,11 @@ export { CnDetailWidgetHost } from './CnDetailWidgetHost/index.js'
|
|
|
352
355
|
|
|
353
356
|
// Guardian/parent portal surface pattern (nextcloud-vue:guardian-portal-surface-pattern).
|
|
354
357
|
export { CnGuardianHome } from './CnGuardianHome/index.js'
|
|
358
|
+
|
|
359
|
+
// Workplace dashboard primitives (openspec: workplace-dashboard-primitives).
|
|
360
|
+
export { CnWeekStripWidget } from './CnWeekStripWidget/index.js'
|
|
361
|
+
export { CnWeekStripWidgetForm } from './CnWeekStripWidgetForm/index.js'
|
|
362
|
+
export { CnStackedBarWidget } from './CnStackedBarWidget/index.js'
|
|
363
|
+
export { CnStackedBarWidgetForm } from './CnStackedBarWidgetForm/index.js'
|
|
364
|
+
export { CnSegmentedControl } from './CnSegmentedControl/index.js'
|
|
365
|
+
export { CnBrandStripe } from './CnBrandStripe/index.js'
|
package/src/css/detail-page.css
CHANGED
|
@@ -342,6 +342,53 @@
|
|
|
342
342
|
}
|
|
343
343
|
}
|
|
344
344
|
|
|
345
|
+
/* The action model and case surfaces (detail-action-model-and-case-surfaces) */
|
|
346
|
+
|
|
347
|
+
/* Type and status pills above the title. */
|
|
348
|
+
.cn-detail-page__pills {
|
|
349
|
+
align-items: center;
|
|
350
|
+
display: flex;
|
|
351
|
+
flex-wrap: wrap;
|
|
352
|
+
gap: calc(2 * var(--default-grid-baseline));
|
|
353
|
+
margin-bottom: calc(1.5 * var(--default-grid-baseline));
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.cn-detail-page__next-step {
|
|
357
|
+
margin-bottom: calc(5 * var(--default-grid-baseline));
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/* Side column. The page becomes a wrapping flex row in which every child
|
|
361
|
+
takes a full line, except the body and the side column: those two share a
|
|
362
|
+
line while there is room for both (520px + 300px) and the column drops
|
|
363
|
+
under the body when there is not. No breakpoint, so it also holds inside a
|
|
364
|
+
split pane or beside an open sidebar, where the viewport says nothing about
|
|
365
|
+
the room the page has. Pages without a side column never get this class. */
|
|
366
|
+
.cn-detail-page--with-side {
|
|
367
|
+
align-items: flex-start;
|
|
368
|
+
column-gap: calc(5 * var(--default-grid-baseline));
|
|
369
|
+
display: flex;
|
|
370
|
+
flex-wrap: wrap;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.cn-detail-page--with-side > * {
|
|
374
|
+
flex: 1 1 100%;
|
|
375
|
+
min-width: 0;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.cn-detail-page--with-side > .cn-detail-page__body {
|
|
379
|
+
flex: 999 1 520px;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.cn-detail-page--with-side > .cn-detail-page__side {
|
|
383
|
+
flex: 1 1 300px;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.cn-detail-page__side {
|
|
387
|
+
display: flex;
|
|
388
|
+
flex-direction: column;
|
|
389
|
+
gap: calc(5 * var(--default-grid-baseline));
|
|
390
|
+
}
|
|
391
|
+
|
|
345
392
|
/* The record as a place (case-page-and-list-as-a-place) */
|
|
346
393
|
|
|
347
394
|
/* A skip link that reaches the page's declared primary action. Off screen
|
package/src/index.js
CHANGED
|
@@ -65,6 +65,7 @@ export {
|
|
|
65
65
|
CnContainerWidget,
|
|
66
66
|
CnContainerWidgetForm,
|
|
67
67
|
CnContextMenu,
|
|
68
|
+
CnConversationThread,
|
|
68
69
|
CnCopyDialog,
|
|
69
70
|
CnCountdownWidget,
|
|
70
71
|
CnCountdownWidgetForm,
|
|
@@ -91,6 +92,7 @@ export {
|
|
|
91
92
|
CnDetailWidgetHost,
|
|
92
93
|
CnDividerWidget,
|
|
93
94
|
CnDividerWidgetForm,
|
|
95
|
+
CnDocumentReviewList,
|
|
94
96
|
CnEditActionsModal,
|
|
95
97
|
CnEditDataModal,
|
|
96
98
|
CnEditMenuModal,
|
|
@@ -180,6 +182,7 @@ export {
|
|
|
180
182
|
CnNcDashboardWidgetForm,
|
|
181
183
|
CnNcWidgetGridPicker,
|
|
182
184
|
CnNcWidgetWidget,
|
|
185
|
+
CnNextStepCard,
|
|
183
186
|
CnNoteCard,
|
|
184
187
|
CnNotesCard,
|
|
185
188
|
CnNotificationMatrix,
|
|
@@ -303,6 +306,11 @@ export {
|
|
|
303
306
|
// @deprecated Use `CnBuildiqEditButton`.
|
|
304
307
|
export { CnOpenBuildEditButton } from './components/index.js'
|
|
305
308
|
|
|
309
|
+
// Workplace dashboard primitives (openspec: workplace-dashboard-primitives):
|
|
310
|
+
// the week strip and stacked bar widgets with their forms, the segmented
|
|
311
|
+
// control, and the brand stripe.
|
|
312
|
+
export { CnBrandStripe, CnSegmentedControl, CnStackedBarWidget, CnStackedBarWidgetForm, CnWeekStripWidget, CnWeekStripWidgetForm } from './components/index.js'
|
|
313
|
+
|
|
306
314
|
// AI Chat Companion component family
|
|
307
315
|
export {
|
|
308
316
|
CnAiAgentPicker,
|
|
@@ -511,6 +519,7 @@ export { filterWidgetsByVisibility, getCurrentUserGroups, getCurrentUserId, isWi
|
|
|
511
519
|
export { safeHref, safeImageSrc, safeSvgPath } from './utils/index.js'
|
|
512
520
|
export { followLinkClick, isModifiedClick, isNewTabHandled, isRowMiddleClick, openRowTarget, resolveHref } from './utils/index.js'
|
|
513
521
|
export { resolveImageUrl } from './utils/index.js'
|
|
522
|
+
export { resolveDateVariant } from './utils/index.js'
|
|
514
523
|
export { actionLink, dispatchAction } from './utils/actionsDispatcher.js'
|
|
515
524
|
// Nested-modal stacking. `CnAppRoot` installs this itself; apps that do not
|
|
516
525
|
// mount `CnAppRoot` should call `installModalStack()` once from `main.js`, or
|