@conduction/nextcloud-vue 2.108.0 → 2.109.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/CnAddressSearch/CnAddressSearch.vue.js +10 -0
- package/dist/esm/components/CnAddressSearch/CnAddressSearch.vue.js.map +1 -0
- package/dist/esm/components/CnAddressSearch/CnAddressSearch.vue2.js +305 -0
- package/dist/esm/components/CnAddressSearch/CnAddressSearch.vue2.js.map +1 -0
- package/dist/esm/components/CnAddressSearch/CnAddressSearch.vue3.js +38 -0
- package/dist/esm/components/CnAddressSearch/CnAddressSearch.vue3.js.map +1 -0
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue.js +10 -0
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue.js.map +1 -0
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js +398 -0
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js.map +1 -0
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue3.js +155 -0
- package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue3.js.map +1 -0
- package/dist/esm/components/CnDecisionListWidget/CnDecisionListWidget.vue.js +9 -0
- package/dist/esm/components/CnDecisionListWidget/CnDecisionListWidget.vue.js.map +1 -0
- package/dist/esm/components/CnDecisionListWidget/CnDecisionListWidget.vue2.js +281 -0
- package/dist/esm/components/CnDecisionListWidget/CnDecisionListWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnDecisionListWidget/CnDecisionListWidget.vue3.js +137 -0
- package/dist/esm/components/CnDecisionListWidget/CnDecisionListWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue.js +9 -0
- package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue.js.map +1 -0
- package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue2.js +225 -0
- package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue2.js.map +1 -0
- package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue3.js +110 -0
- package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue3.js.map +1 -0
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue.js +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +19 -3
- 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/CnIndexPage/CnIndexPage.vue2.js +30 -0
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +513 -481
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue.js +9 -0
- package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue.js.map +1 -0
- package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue2.js +181 -0
- package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue2.js.map +1 -0
- package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue3.js +50 -0
- package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue3.js.map +1 -0
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +102 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -6
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnPlanWidget/CnPlanWidget.vue.js +9 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidget.vue.js.map +1 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidget.vue2.js +190 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidget.vue3.js +91 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidgetRow.vue.js +9 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidgetRow.vue.js.map +1 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidgetRow.vue2.js +64 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidgetRow.vue2.js.map +1 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidgetRow.vue3.js +49 -0
- package/dist/esm/components/CnPlanWidget/CnPlanWidgetRow.vue3.js.map +1 -0
- package/dist/esm/components/CnRedactionEditor/CnRedactionEditor.vue.js +9 -0
- package/dist/esm/components/CnRedactionEditor/CnRedactionEditor.vue.js.map +1 -0
- package/dist/esm/components/CnRedactionEditor/CnRedactionEditor.vue2.js +382 -0
- package/dist/esm/components/CnRedactionEditor/CnRedactionEditor.vue2.js.map +1 -0
- package/dist/esm/components/CnRedactionEditor/CnRedactionEditor.vue3.js +285 -0
- package/dist/esm/components/CnRedactionEditor/CnRedactionEditor.vue3.js.map +1 -0
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +9 -0
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js.map +1 -0
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js +277 -0
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js +183 -0
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +16 -14
- package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +53 -22
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/components/CnWorkQueue/CnWorkQueue.vue.js +9 -0
- package/dist/esm/components/CnWorkQueue/CnWorkQueue.vue.js.map +1 -0
- package/dist/esm/components/CnWorkQueue/CnWorkQueue.vue2.js +246 -0
- package/dist/esm/components/CnWorkQueue/CnWorkQueue.vue2.js.map +1 -0
- package/dist/esm/components/CnWorkQueue/CnWorkQueue.vue3.js +197 -0
- package/dist/esm/components/CnWorkQueue/CnWorkQueue.vue3.js.map +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +106 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +105 -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 +495 -61
- package/dist/esm/utils/actionsDispatcher.js +6 -1
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/builtInModals.js +3 -1
- package/dist/esm/utils/builtInModals.js.map +1 -1
- package/dist/esm/utils/duplicateWarning.js +62 -0
- package/dist/esm/utils/duplicateWarning.js.map +1 -0
- package/dist/esm/utils/errors.js +4 -0
- package/dist/esm/utils/errors.js.map +1 -1
- package/dist/esm/utils/libraryWidgetKeys.js +4 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/openDuplicateWarning.js +39 -0
- package/dist/esm/utils/openDuplicateWarning.js.map +1 -0
- package/dist/esm/utils/optionsFrom.js +69 -2
- package/dist/esm/utils/optionsFrom.js.map +1 -1
- package/dist/esm/utils/planTree.js +57 -0
- package/dist/esm/utils/planTree.js.map +1 -0
- package/dist/esm/utils/redactionSegments.js +53 -0
- package/dist/esm/utils/redactionSegments.js.map +1 -0
- package/dist/esm/utils/registerNcDashboardWidgets.js +61 -0
- package/dist/esm/utils/registerNcDashboardWidgets.js.map +1 -0
- package/dist/esm/utils/searchRefusal.js +62 -0
- package/dist/esm/utils/searchRefusal.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +17409 -12832
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +495 -61
- package/l10n/en.json +106 -1
- package/l10n/nl.json +105 -1
- package/package.json +1 -1
- package/src/components/CnAddressSearch/CnAddressSearch.vue +343 -0
- package/src/components/CnAddressSearch/index.js +12 -0
- package/src/components/CnAssignDialog/CnAssignDialog.vue +525 -0
- package/src/components/CnAssignDialog/index.js +12 -0
- package/src/components/CnDecisionListWidget/CnDecisionListWidget.vue +388 -0
- package/src/components/CnDecisionListWidget/index.js +12 -0
- package/src/components/CnDuplicateWarning/CnDuplicateWarning.vue +318 -0
- package/src/components/CnDuplicateWarning/index.js +12 -0
- package/src/components/CnFormDialog/CnFormDialog.vue +19 -3
- package/src/components/CnIndexPage/CnIndexPage.vue +52 -0
- package/src/components/CnNcDashboardList/CnNcDashboardList.vue +218 -0
- package/src/components/CnNcDashboardList/index.js +12 -0
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +107 -6
- package/src/components/CnPlanWidget/CnPlanWidget.vue +246 -0
- package/src/components/CnPlanWidget/CnPlanWidgetRow.vue +117 -0
- package/src/components/CnPlanWidget/index.js +12 -0
- package/src/components/CnRedactionEditor/CnRedactionEditor.vue +655 -0
- package/src/components/CnRedactionEditor/index.js +13 -0
- package/src/components/CnRetentionWidget/CnRetentionWidget.vue +413 -0
- package/src/components/CnRetentionWidget/index.js +12 -0
- package/src/components/CnWidgetGrid/builtInWidgets.js +2 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +31 -0
- package/src/components/CnWorkQueue/CnWorkQueue.vue +456 -0
- package/src/components/CnWorkQueue/index.js +12 -0
- package/src/components/index.js +9 -0
- package/src/css/index-page.css +24 -0
- package/src/index.js +12 -0
- package/src/schemas/app-manifest-v2.schema.json +119 -3
- package/src/utils/actionsDispatcher.js +6 -1
- package/src/utils/builtInModals.js +3 -1
- package/src/utils/duplicateWarning.js +59 -0
- package/src/utils/errors.js +4 -0
- package/src/utils/libraryWidgetKeys.js +4 -0
- package/src/utils/openDuplicateWarning.js +35 -0
- package/src/utils/optionsFrom.js +68 -1
- package/src/utils/planTree.js +54 -0
- package/src/utils/redactionSegments.js +50 -0
- package/src/utils/registerNcDashboardWidgets.js +57 -0
- package/src/utils/searchRefusal.js +59 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerDashboardWidgets.js","sources":["../../../../src/components/CnWidgetGrid/registerDashboardWidgets.js"],"sourcesContent":["/**\n * Side-effect aggregator for the cn-widget-library dashboard widget catalog.\n *\n * Importing this module imports every migrated widget's `index.js`, each of\n * which self-registers its `{ renderer, form, defaultContent, displayName,\n * icon }` into `dashboardWidgetRegistry` at load time. The library barrel\n * imports this module so the catalog is populated whenever a consuming app\n * imports `@conduction/nextcloud-vue`; `CnWidgetGrid` then resolves widgets by\n * type key and `CnAddWidgetModal` lists the addable types.\n *\n * The individual widget components are intentionally NOT public exports — they\n * are resolved by their registry type key (the whole point of the registry),\n * so consumers reference them via the manifest `widgetKey`, not by import.\n *\n * @module components/CnWidgetGrid/registerDashboardWidgets\n */\n\nimport CnChartWidget from '../CnChartWidget/CnChartWidget.vue'\nimport CnChartWidgetForm from '../CnChartWidgetForm/CnChartWidgetForm.vue'\nimport CnConversationWidget from '../CnConversationThread/CnConversationWidget.vue'\nimport CnCountdownWidget from '../CnCountdownWidget/CnCountdownWidget.vue'\nimport CnCountdownWidgetForm from '../CnCountdownWidgetForm/CnCountdownWidgetForm.vue'\nimport CnDocumentReviewWidget from '../CnDocumentReviewList/CnDocumentReviewWidget.vue'\nimport CnMapWidget from '../CnMapWidget/CnMapWidget.vue'\nimport CnMapWidgetForm from '../CnMapWidgetForm/CnMapWidgetForm.vue'\nimport CnMarkdownWidget2 from '../CnMarkdownWidget/CnMarkdownWidget.vue'\nimport CnMarkdownWidgetForm2 from '../CnMarkdownWidgetForm/CnMarkdownWidgetForm.vue'\nimport CnNextStepWidget from '../CnNextStepCard/CnNextStepWidget.vue'\nimport CnObjectListWidget2 from '../CnObjectListWidget/CnObjectListWidget.vue'\nimport CnObjectListWidgetForm2 from '../CnObjectListWidgetForm/CnObjectListWidgetForm.vue'\nimport CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'\nimport CnRelatedObjectsWidgetForm from '../CnRelatedObjectsWidgetForm/CnRelatedObjectsWidgetForm.vue'\nimport CnSavedViewWidget2 from '../CnSavedViewWidget/CnSavedViewWidget.vue'\nimport CnSavedViewWidgetForm2 from '../CnSavedViewWidgetForm/CnSavedViewWidgetForm.vue'\nimport CnStackedBarWidget from '../CnStackedBarWidget/CnStackedBarWidget.vue'\nimport CnStackedBarWidgetForm from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue'\nimport CnStagesWidget from '../CnStagesWidget/CnStagesWidget.vue'\nimport CnStagesWidgetForm from '../CnStagesWidgetForm/CnStagesWidgetForm.vue'\nimport CnStatsBlockWidget from '../CnStatsBlockWidget/CnStatsBlockWidget.vue'\nimport CnStatsBlockWidgetForm from '../CnStatsBlockWidgetForm/CnStatsBlockWidgetForm.vue'\nimport CnTabsWidget from '../CnTabsWidget/CnTabsWidget.vue'\nimport CnTabsWidgetForm from '../CnTabsWidgetForm/CnTabsWidgetForm.vue'\nimport CnTeamWorkloadWidget from '../CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue'\nimport CnWeekStripWidget from '../CnWeekStripWidget/CnWeekStripWidget.vue'\nimport CnWeekStripWidgetForm from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue'\n// Typed widgets registered with an explicit renderer + config FORM. chart /\n// stats-block render through CnDashboardPage's own isChart()/isStatsBlock()\n// branches and `related` through CnDetailPage's isRelatedWidget() branch — the\n// registry entry exists so the cog editor + Add-widget picker get a form (and,\n// for `related`, the detail-page surface). `table` aliases the object-list\n// renderer/form for legacy manifests using type:'table'.\nimport { registerDashboardWidget } from './dashboardWidgetRegistry.js'\n\nimport '../CnLabelWidget/index.js'\nimport '../CnTextWidget/index.js'\nimport '../CnImageWidget/index.js'\nimport '../CnLinkButtonWidget/index.js'\nimport '../CnDividerWidget/index.js'\nimport '../CnHeaderWidget/index.js'\nimport '../CnQuicklinksWidget/index.js'\nimport '../CnVideoWidget/index.js'\nimport '../CnDashTileWidget/index.js'\nimport '../CnLinksWidget/index.js'\nimport '../CnMenuWidget/index.js'\nimport '../CnContainerWidget/index.js'\nimport '../CnFilesWidget/index.js'\nimport '../CnPeopleWidget/index.js'\nimport '../CnCalendarWidget/index.js'\nimport '../CnNcWidgetWidget/index.js'\nimport '../CnSpendAnalyticsWidget/index.js'\nimport '../CnStatWidget/index.js'\nimport '../CnDeltaWidget/index.js'\nimport '../CnGaugeWidget/index.js'\nimport '../CnFlowRunsWidget/index.js'\nimport '../CnTasksWidget/index.js'\nimport '../CnSectionsWidget/index.js'\nimport '../CnFactsWidget/index.js'\nimport '../CnDeviceFramesWidget/index.js'\nimport '../CnGroupedCardsWidget/index.js'\nimport '../CnChecklistRunWidget/index.js'\nimport '../CnMailTab/index.js'\nimport '../CnWorkingCalendarWidget/index.js'\nimport '../CnPartyActionsWidget/index.js'\nimport '../CnFieldListWidget/index.js'\nimport '../CnSettingsFormWidget/index.js'\nimport '../CnSwitchRowsWidget/index.js'\nimport '../CnRadioCardsWidget/index.js'\nimport '../CnChipsFieldWidget/index.js'\nimport '../CnToggleTableWidget/index.js'\nimport '../CnChoicePickerWidget/index.js'\nimport '../CnRecordListWidget/index.js'\nimport '../CnSavedViewsWidget/index.js'\nimport '../CnNotepadWidget/index.js'\nimport '../CnObjectDataWidget/dashboardRegistration.js'\nimport '../CnObjectGeoWidget/dashboardRegistration.js'\nimport '../CnWidgetObjectTable/dashboardRegistration.js'\nimport '../CnAuditTrailWidget/dashboardRegistration.js'\nimport '../CnTimelineWidget/dashboardRegistration.js'\nimport '../CnKbSearchWidget/index.js'\nimport '../CnInteractionFormWidget/index.js'\nimport '../CnBannerWidget/index.js'\nimport '../CnWorkspaceFilterWidget/index.js'\n\nregisterDashboardWidget('chart', {\n\trenderer: CnChartWidget,\n\tform: CnChartWidgetForm,\n\tdefaultContent: {\n\t\tchartKind: 'area',\n\t\tdataSource: { register: '', schema: '', filter: {}, bucket: { field: '', interval: 'month', metric: 'count', metricField: '' } },\n\t},\n\tdisplayName: 'Chart',\n\ticon: 'ChartLine',\n})\n\nregisterDashboardWidget('stats-block', {\n\trenderer: CnStatsBlockWidget,\n\tform: CnStatsBlockWidgetForm,\n\tdefaultContent: {\n\t\ttitle: '',\n\t\tprops: { countLabel: '', variant: 'default', iconClass: '' },\n\t\tdataSource: { register: '', schema: '', metric: 'count', field: '', filter: {} },\n\t},\n\tdisplayName: 'Statistic card',\n\ticon: 'ChartBar',\n\t// Card family (docs/architecture/cards-and-widgets.md), like `stat` and\n\t// `delta`: the tile headlines itself with its own title, so the wrapper\n\t// renders no header of its own and would otherwise show the title twice.\n\tcard: true,\n})\n\n// `table` and `object-list` (below) are legacy aliases of `object-table` — same\n// config form (CnObjectListWidgetForm), same job. They stay registered so\n// existing placements keep rendering, but are hidden from every Add-widget\n// picker via a sentinel surface no picker queries (see widgetTypeAllowsSurface):\n// `object-table` is the one to add now. Rendering resolves through\n// getWidgetTypeEntry, which ignores `surfaces`, so hidden ≠ broken.\nregisterDashboardWidget('table', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 10,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Table',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `object-list` is registered HERE and only here. Registering it from\n// CnObjectListWidget/index.js instead is not enough: package.json declares\n// `sideEffects: [\"**/*.css\"]` (ADR-061 tree-shaking), which lets\n// rollup/webpack legally DROP bare imports of side-effect-free JS modules —\n// the dist bundle shipped without the object-list registration and every\n// manifest `type:\"object-list\"` widget rendered blank. Inline calls in this\n// module survive because consumers import live bindings from the registry.\n//\n// That index.js ALSO self-registered, with a divergent entry (limit 5, no\n// `surfaces`), so both ran in a consumer's build — components/index.js\n// re-exports it, so it was never tree-shaken — and last-registration-wins\n// decided whether this legacy alias stayed hidden from the Add-widget picker.\n// The self-registration is gone; this entry is the one that already won.\nregisterDashboardWidget('object-list', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 25,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Object list',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `saved-view`: a list driven by one of the reader's saved views. The only data\n// widget a user may add themselves, because the view carries the register and\n// schema a user would otherwise have to name. Registered inline for the same\n// tree-shaking reason as `object-list` above.\n// @spec openspec/changes/a-saved-view-drives-a-widget/tasks.md#task-1.1\nregisterDashboardWidget('saved-view', {\n\trenderer: CnSavedViewWidget2,\n\tform: CnSavedViewWidgetForm2,\n\tdefaultContent: { viewId: '', limit: 10 },\n\tdisplayName: 'Saved view',\n\ticon: 'ClipboardList',\n\tuserAddable: true,\n})\n\n// `markdown`: prose inside a grid page, through the one shared renderer. The\n// only catalog widget a PUBLIC host may mount so far: every other entry is\n// `public: false` until its author opts in deliberately.\n// @spec openspec/changes/widget-registry-public-flag/tasks.md#task-4\nregisterDashboardWidget('markdown', {\n\trenderer: CnMarkdownWidget2,\n\tform: CnMarkdownWidgetForm2,\n\tdefaultContent: { markdown: '' },\n\tdisplayName: 'Markdown',\n\ticon: 'FormatTitle',\n\tpublic: true,\n})\n\nregisterDashboardWidget('related', {\n\trenderer: CnRelatedObjectsWidget,\n\tform: CnRelatedObjectsWidgetForm,\n\tdefaultContent: { title: '', groups: [], hideSingleTabTitle: true, showTotalCount: true },\n\tdisplayName: 'Object relations',\n\ticon: 'FileTreeOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// `map` is registered here for the same tree-shaking reason as `object-list`\n// above — a bare `import '../CnMapWidget/index.js'` is a side-effect-free JS module\n// as far as the bundler is concerned, so it may legally be dropped and the widget\n// would silently never appear in Add Widget. CnMapWidget/index.js carried a\n// byte-identical copy of this entry, which only produced a duplicate-registration\n// warning on every consumer's boot; it no longer registers.\nregisterDashboardWidget('map', {\n\trenderer: CnMapWidget,\n\tform: CnMapWidgetForm,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\t// The Netherlands, roughly — only visible until autoFit frames the objects.\n\t\tcenter: [52.13, 5.29],\n\t\tzoom: 7,\n\t\theight: '400px',\n\t\tpopupField: '',\n\t\tclustering: false,\n\t\tautoFit: true,\n\t\t// A map with no tile layer renders as a grey box. `basemaps` is opt-in and\n\t\t// empty by default (so consumers declaring a `tile` entry in `layers` are\n\t\t// unaffected), which meant a freshly-placed Map widget had NO background at\n\t\t// all. Ship OpenStreetMap — the Nextcloud CSP already allows *.tile.openstreetmap.org.\n\t\tbasemaps: [\n\t\t\t{\n\t\t\t\tname: 'OpenStreetMap',\n\t\t\t\turl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n\t\t\t\tattribution: '© OpenStreetMap contributors',\n\t\t\t\toptions: { maxZoom: 19 },\n\t\t\t},\n\t\t],\n\t\tmarkers: {\n\t\t\tdataSource: { register: '', schema: '' },\n\t\t\tpopupField: '',\n\t\t\tclustering: false,\n\t\t},\n\t},\n\tdisplayName: 'Map',\n\ticon: 'Map',\n})\n\nregisterDashboardWidget('countdown', {\n\trenderer: CnCountdownWidget,\n\tform: CnCountdownWidgetForm,\n\tdefaultContent: {\n\t\tlabel: '',\n\t\tfield: '',\n\t\ticon: 'ClockOutline',\n\t\tthresholds: {},\n\t\tshowDate: true,\n\t},\n\tdisplayName: 'Countdown',\n\ticon: 'ClockOutline',\n\t// Card family: the tile headlines itself, so the wrapper draws no header.\n\tcard: true,\n\t// It reads a date off the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\n// The case surfaces (detail-action-model-and-case-surfaces). Each reads the\n// BOUND RECORD, which only a detail page has, and none has a config form yet,\n// so `form: null` keeps them out of the Add-widget picker: they are placed\n// from the manifest. Registered inline for the same tree-shaking reason as\n// `map` above.\nregisterDashboardWidget('next-step', {\n\trenderer: CnNextStepWidget,\n\tform: null,\n\tdefaultContent: { field: 'status', stages: {} },\n\tdisplayName: 'Next step',\n\ticon: 'CheckCircleOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('document-review', {\n\trenderer: CnDocumentReviewWidget,\n\tform: null,\n\tdefaultContent: { field: 'documents', statusField: 'reviewStatus', statuses: [] },\n\tdisplayName: 'Document review',\n\ticon: 'FileDocumentCheckOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('conversation', {\n\trenderer: CnConversationWidget,\n\tform: null,\n\tdefaultContent: { field: 'messages', endpoint: '' },\n\tdisplayName: 'Conversation',\n\ticon: 'ForumOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// The record's stages, where clicking a stage moves the record there.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('stages', {\n\trenderer: CnStagesWidget,\n\tform: CnStagesWidgetForm,\n\tdefaultContent: {\n\t\tcurrentField: 'status',\n\t\torientation: 'horizontal',\n\t\tsize: 'medium',\n\t\tstagesEndpoint: { url: '', path: '' },\n\t\t// The LIFECYCLE, not a record write. OpenRegister decides what is\n\t\t// reachable and re-validates the move; a field write has neither.\n\t\ttransition: { kind: 'lifecycle' },\n\t},\n\tdisplayName: 'Stages',\n\ticon: 'Timeline',\n\t// Card family on the detail grid: a titled wrapper around a self-contained\n\t// strip, like the KPI tiles it usually sits beside.\n\tcard: true,\n\t// It reads and moves the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\nregisterDashboardWidget('tabs', {\n\trenderer: CnTabsWidget,\n\tform: CnTabsWidgetForm,\n\tdefaultContent: {\n\t\ttabs: [],\n\t\tariaLabel: '',\n\t},\n\tdisplayName: 'Tabs',\n\ticon: 'TabPlus',\n\t// Renders OTHER widgets, so CnDetailWidgetHost hands it the surface's\n\t// sibling definitions and the context its children will need.\n\tcontainer: true,\n\t// The strip's labels ARE the titles, so a card header above them would name\n\t// the group twice.\n\townsTitle: true,\n\tsurfaces: ['detail-page'],\n})\n\n// The current week as day columns, with the dated items under each day.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('week-strip', {\n\trenderer: CnWeekStripWidget,\n\tform: CnWeekStripWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', filter: {} },\n\t\tdateField: '',\n\t\ttitleField: '',\n\t\tmetaFields: [],\n\t\tdays: 5,\n\t\titemRoute: '',\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Week strip',\n\ticon: 'Calendar',\n})\n\n// One segmented bar with a legend that carries the numbers.\nregisterDashboardWidget('stacked-bar', {\n\trenderer: CnStackedBarWidget,\n\tform: CnStackedBarWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', groupBy: '', filter: {} },\n\t\torder: [],\n\t\tlabels: {},\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Stacked bar',\n\ticon: 'ChartBar',\n})\n\n// The team today: availability from the Nextcloud user status and each\n// person's open count from the app (DqTeamwachtrij \"Team vandaag\"). Placed\n// from the manifest: there is no config form yet.\nregisterDashboardWidget('team-workload', {\n\trenderer: CnTeamWorkloadWidget,\n\tform: null,\n\tdefaultContent: { source: { url: '', responsePath: '', userField: 'userId', nameField: 'displayName', countField: 'count' } },\n\tdisplayName: 'Team workload',\n\ticon: 'AccountGroup',\n})\n\n/**\n * Explicit no-op that guarantees this module (and therefore every widget's\n * self-registration side effect) is evaluated. Now optional: `CnDashboardPage`\n * and `CnDetailPage` import this module themselves, and a second call changes\n * nothing because the module body runs once.\n *\n * @return {void}\n */\nexport function registerBuiltinDashboardWidgets() {}\n"],"names":["CnChartWidget","CnChartWidgetForm","CnStatsBlockWidget","CnStatsBlockWidgetForm","CnObjectListWidget2","CnObjectListWidgetForm2","CnSavedViewWidget2","CnSavedViewWidgetForm2","CnMarkdownWidget2","CnMarkdownWidgetForm2","CnRelatedObjectsWidget","CnRelatedObjectsWidgetForm","CnMapWidget","CnMapWidgetForm","CnCountdownWidget","CnCountdownWidgetForm","CnNextStepWidget","CnDocumentReviewWidget","CnConversationWidget","CnStagesWidget","CnStagesWidgetForm","CnTabsWidget","CnTabsWidgetForm","CnWeekStripWidget","CnWeekStripWidgetForm","CnStackedBarWidget","CnStackedBarWidgetForm","CnTeamWorkloadWidget"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registerDashboardWidgets.js","sources":["../../../../src/components/CnWidgetGrid/registerDashboardWidgets.js"],"sourcesContent":["/**\n * Side-effect aggregator for the cn-widget-library dashboard widget catalog.\n *\n * Importing this module imports every migrated widget's `index.js`, each of\n * which self-registers its `{ renderer, form, defaultContent, displayName,\n * icon }` into `dashboardWidgetRegistry` at load time. The library barrel\n * imports this module so the catalog is populated whenever a consuming app\n * imports `@conduction/nextcloud-vue`; `CnWidgetGrid` then resolves widgets by\n * type key and `CnAddWidgetModal` lists the addable types.\n *\n * The individual widget components are intentionally NOT public exports — they\n * are resolved by their registry type key (the whole point of the registry),\n * so consumers reference them via the manifest `widgetKey`, not by import.\n *\n * @module components/CnWidgetGrid/registerDashboardWidgets\n */\n\nimport CnChartWidget from '../CnChartWidget/CnChartWidget.vue'\nimport CnChartWidgetForm from '../CnChartWidgetForm/CnChartWidgetForm.vue'\nimport CnConversationWidget from '../CnConversationThread/CnConversationWidget.vue'\nimport CnCountdownWidget from '../CnCountdownWidget/CnCountdownWidget.vue'\nimport CnCountdownWidgetForm from '../CnCountdownWidgetForm/CnCountdownWidgetForm.vue'\nimport CnDocumentReviewWidget from '../CnDocumentReviewList/CnDocumentReviewWidget.vue'\nimport CnMapWidget from '../CnMapWidget/CnMapWidget.vue'\nimport CnMapWidgetForm from '../CnMapWidgetForm/CnMapWidgetForm.vue'\nimport CnMarkdownWidget2 from '../CnMarkdownWidget/CnMarkdownWidget.vue'\nimport CnMarkdownWidgetForm2 from '../CnMarkdownWidgetForm/CnMarkdownWidgetForm.vue'\nimport CnNextStepWidget from '../CnNextStepCard/CnNextStepWidget.vue'\nimport CnObjectListWidget2 from '../CnObjectListWidget/CnObjectListWidget.vue'\nimport CnObjectListWidgetForm2 from '../CnObjectListWidgetForm/CnObjectListWidgetForm.vue'\nimport CnPlanWidget from '../CnPlanWidget/CnPlanWidget.vue'\nimport CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'\nimport CnRelatedObjectsWidgetForm from '../CnRelatedObjectsWidgetForm/CnRelatedObjectsWidgetForm.vue'\nimport CnRetentionWidget from '../CnRetentionWidget/CnRetentionWidget.vue'\nimport CnSavedViewWidget2 from '../CnSavedViewWidget/CnSavedViewWidget.vue'\nimport CnSavedViewWidgetForm2 from '../CnSavedViewWidgetForm/CnSavedViewWidgetForm.vue'\nimport CnStackedBarWidget from '../CnStackedBarWidget/CnStackedBarWidget.vue'\nimport CnStackedBarWidgetForm from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue'\nimport CnStagesWidget from '../CnStagesWidget/CnStagesWidget.vue'\nimport CnStagesWidgetForm from '../CnStagesWidgetForm/CnStagesWidgetForm.vue'\nimport CnStatsBlockWidget from '../CnStatsBlockWidget/CnStatsBlockWidget.vue'\nimport CnStatsBlockWidgetForm from '../CnStatsBlockWidgetForm/CnStatsBlockWidgetForm.vue'\nimport CnTabsWidget from '../CnTabsWidget/CnTabsWidget.vue'\nimport CnTabsWidgetForm from '../CnTabsWidgetForm/CnTabsWidgetForm.vue'\nimport CnTeamWorkloadWidget from '../CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue'\nimport CnWeekStripWidget from '../CnWeekStripWidget/CnWeekStripWidget.vue'\nimport CnWeekStripWidgetForm from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue'\nimport CnWorkQueue from '../CnWorkQueue/CnWorkQueue.vue'\n// Typed widgets registered with an explicit renderer + config FORM. chart /\n// stats-block render through CnDashboardPage's own isChart()/isStatsBlock()\n// branches and `related` through CnDetailPage's isRelatedWidget() branch — the\n// registry entry exists so the cog editor + Add-widget picker get a form (and,\n// for `related`, the detail-page surface). `table` aliases the object-list\n// renderer/form for legacy manifests using type:'table'.\nimport { registerDashboardWidget } from './dashboardWidgetRegistry.js'\n\nimport '../CnLabelWidget/index.js'\nimport '../CnTextWidget/index.js'\nimport '../CnImageWidget/index.js'\nimport '../CnLinkButtonWidget/index.js'\nimport '../CnDividerWidget/index.js'\nimport '../CnHeaderWidget/index.js'\nimport '../CnQuicklinksWidget/index.js'\nimport '../CnVideoWidget/index.js'\nimport '../CnDashTileWidget/index.js'\nimport '../CnLinksWidget/index.js'\nimport '../CnMenuWidget/index.js'\nimport '../CnContainerWidget/index.js'\nimport '../CnFilesWidget/index.js'\nimport '../CnPeopleWidget/index.js'\nimport '../CnCalendarWidget/index.js'\nimport '../CnNcWidgetWidget/index.js'\nimport '../CnSpendAnalyticsWidget/index.js'\nimport '../CnStatWidget/index.js'\nimport '../CnDeltaWidget/index.js'\nimport '../CnGaugeWidget/index.js'\nimport '../CnFlowRunsWidget/index.js'\nimport '../CnTasksWidget/index.js'\nimport '../CnSectionsWidget/index.js'\nimport '../CnFactsWidget/index.js'\nimport '../CnDeviceFramesWidget/index.js'\nimport '../CnGroupedCardsWidget/index.js'\nimport '../CnChecklistRunWidget/index.js'\nimport '../CnMailTab/index.js'\nimport '../CnWorkingCalendarWidget/index.js'\nimport '../CnPartyActionsWidget/index.js'\nimport '../CnFieldListWidget/index.js'\nimport '../CnSettingsFormWidget/index.js'\nimport '../CnSwitchRowsWidget/index.js'\nimport '../CnRadioCardsWidget/index.js'\nimport '../CnChipsFieldWidget/index.js'\nimport '../CnToggleTableWidget/index.js'\nimport '../CnChoicePickerWidget/index.js'\nimport '../CnRecordListWidget/index.js'\nimport '../CnSavedViewsWidget/index.js'\nimport '../CnNotepadWidget/index.js'\nimport '../CnObjectDataWidget/dashboardRegistration.js'\nimport '../CnObjectGeoWidget/dashboardRegistration.js'\nimport '../CnWidgetObjectTable/dashboardRegistration.js'\nimport '../CnAuditTrailWidget/dashboardRegistration.js'\nimport '../CnTimelineWidget/dashboardRegistration.js'\nimport '../CnKbSearchWidget/index.js'\nimport '../CnInteractionFormWidget/index.js'\nimport '../CnBannerWidget/index.js'\nimport '../CnWorkspaceFilterWidget/index.js'\n\nregisterDashboardWidget('chart', {\n\trenderer: CnChartWidget,\n\tform: CnChartWidgetForm,\n\tdefaultContent: {\n\t\tchartKind: 'area',\n\t\tdataSource: { register: '', schema: '', filter: {}, bucket: { field: '', interval: 'month', metric: 'count', metricField: '' } },\n\t},\n\tdisplayName: 'Chart',\n\ticon: 'ChartLine',\n})\n\nregisterDashboardWidget('stats-block', {\n\trenderer: CnStatsBlockWidget,\n\tform: CnStatsBlockWidgetForm,\n\tdefaultContent: {\n\t\ttitle: '',\n\t\tprops: { countLabel: '', variant: 'default', iconClass: '' },\n\t\tdataSource: { register: '', schema: '', metric: 'count', field: '', filter: {} },\n\t},\n\tdisplayName: 'Statistic card',\n\ticon: 'ChartBar',\n\t// Card family (docs/architecture/cards-and-widgets.md), like `stat` and\n\t// `delta`: the tile headlines itself with its own title, so the wrapper\n\t// renders no header of its own and would otherwise show the title twice.\n\tcard: true,\n})\n\n// `table` and `object-list` (below) are legacy aliases of `object-table` — same\n// config form (CnObjectListWidgetForm), same job. They stay registered so\n// existing placements keep rendering, but are hidden from every Add-widget\n// picker via a sentinel surface no picker queries (see widgetTypeAllowsSurface):\n// `object-table` is the one to add now. Rendering resolves through\n// getWidgetTypeEntry, which ignores `surfaces`, so hidden ≠ broken.\nregisterDashboardWidget('table', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 10,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Table',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `object-list` is registered HERE and only here. Registering it from\n// CnObjectListWidget/index.js instead is not enough: package.json declares\n// `sideEffects: [\"**/*.css\"]` (ADR-061 tree-shaking), which lets\n// rollup/webpack legally DROP bare imports of side-effect-free JS modules —\n// the dist bundle shipped without the object-list registration and every\n// manifest `type:\"object-list\"` widget rendered blank. Inline calls in this\n// module survive because consumers import live bindings from the registry.\n//\n// That index.js ALSO self-registered, with a divergent entry (limit 5, no\n// `surfaces`), so both ran in a consumer's build — components/index.js\n// re-exports it, so it was never tree-shaken — and last-registration-wins\n// decided whether this legacy alias stayed hidden from the Add-widget picker.\n// The self-registration is gone; this entry is the one that already won.\nregisterDashboardWidget('object-list', {\n\trenderer: CnObjectListWidget2,\n\tform: CnObjectListWidgetForm2,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\tfilter: {},\n\t\tsort: { field: '', dir: 'asc' },\n\t\tlimit: 25,\n\t\tcolumns: [],\n\t},\n\tdisplayName: 'Object list',\n\ticon: 'ClipboardList',\n\tsurfaces: ['legacy'],\n})\n\n// `saved-view`: a list driven by one of the reader's saved views. The only data\n// widget a user may add themselves, because the view carries the register and\n// schema a user would otherwise have to name. Registered inline for the same\n// tree-shaking reason as `object-list` above.\n// @spec openspec/changes/a-saved-view-drives-a-widget/tasks.md#task-1.1\nregisterDashboardWidget('saved-view', {\n\trenderer: CnSavedViewWidget2,\n\tform: CnSavedViewWidgetForm2,\n\tdefaultContent: { viewId: '', limit: 10 },\n\tdisplayName: 'Saved view',\n\ticon: 'ClipboardList',\n\tuserAddable: true,\n})\n\n// `markdown`: prose inside a grid page, through the one shared renderer. The\n// only catalog widget a PUBLIC host may mount so far: every other entry is\n// `public: false` until its author opts in deliberately.\n// @spec openspec/changes/widget-registry-public-flag/tasks.md#task-4\nregisterDashboardWidget('markdown', {\n\trenderer: CnMarkdownWidget2,\n\tform: CnMarkdownWidgetForm2,\n\tdefaultContent: { markdown: '' },\n\tdisplayName: 'Markdown',\n\ticon: 'FormatTitle',\n\tpublic: true,\n})\n\nregisterDashboardWidget('related', {\n\trenderer: CnRelatedObjectsWidget,\n\tform: CnRelatedObjectsWidgetForm,\n\tdefaultContent: { title: '', groups: [], hideSingleTabTitle: true, showTotalCount: true },\n\tdisplayName: 'Object relations',\n\ticon: 'FileTreeOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// `map` is registered here for the same tree-shaking reason as `object-list`\n// above — a bare `import '../CnMapWidget/index.js'` is a side-effect-free JS module\n// as far as the bundler is concerned, so it may legally be dropped and the widget\n// would silently never appear in Add Widget. CnMapWidget/index.js carried a\n// byte-identical copy of this entry, which only produced a duplicate-registration\n// warning on every consumer's boot; it no longer registers.\nregisterDashboardWidget('map', {\n\trenderer: CnMapWidget,\n\tform: CnMapWidgetForm,\n\tdefaultContent: {\n\t\tregister: '',\n\t\tschema: '',\n\t\t// The Netherlands, roughly — only visible until autoFit frames the objects.\n\t\tcenter: [52.13, 5.29],\n\t\tzoom: 7,\n\t\theight: '400px',\n\t\tpopupField: '',\n\t\tclustering: false,\n\t\tautoFit: true,\n\t\t// A map with no tile layer renders as a grey box. `basemaps` is opt-in and\n\t\t// empty by default (so consumers declaring a `tile` entry in `layers` are\n\t\t// unaffected), which meant a freshly-placed Map widget had NO background at\n\t\t// all. Ship OpenStreetMap — the Nextcloud CSP already allows *.tile.openstreetmap.org.\n\t\tbasemaps: [\n\t\t\t{\n\t\t\t\tname: 'OpenStreetMap',\n\t\t\t\turl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n\t\t\t\tattribution: '© OpenStreetMap contributors',\n\t\t\t\toptions: { maxZoom: 19 },\n\t\t\t},\n\t\t],\n\t\tmarkers: {\n\t\t\tdataSource: { register: '', schema: '' },\n\t\t\tpopupField: '',\n\t\t\tclustering: false,\n\t\t},\n\t},\n\tdisplayName: 'Map',\n\ticon: 'Map',\n})\n\nregisterDashboardWidget('countdown', {\n\trenderer: CnCountdownWidget,\n\tform: CnCountdownWidgetForm,\n\tdefaultContent: {\n\t\tlabel: '',\n\t\tfield: '',\n\t\ticon: 'ClockOutline',\n\t\tthresholds: {},\n\t\tshowDate: true,\n\t},\n\tdisplayName: 'Countdown',\n\ticon: 'ClockOutline',\n\t// Card family: the tile headlines itself, so the wrapper draws no header.\n\tcard: true,\n\t// It reads a date off the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\n// The case surfaces (detail-action-model-and-case-surfaces). Each reads the\n// BOUND RECORD, which only a detail page has, and none has a config form yet,\n// so `form: null` keeps them out of the Add-widget picker: they are placed\n// from the manifest. Registered inline for the same tree-shaking reason as\n// `map` above.\nregisterDashboardWidget('next-step', {\n\trenderer: CnNextStepWidget,\n\tform: null,\n\tdefaultContent: { field: 'status', stages: {} },\n\tdisplayName: 'Next step',\n\ticon: 'CheckCircleOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('retention', {\n\trenderer: CnRetentionWidget,\n\tform: null,\n\tdefaultContent: { statusField: '', archivedValues: [], archivistGroups: ['archivaris'] },\n\tdisplayName: 'Retention',\n\ticon: 'ArchiveOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('plan', {\n\trenderer: CnPlanWidget,\n\tform: null,\n\tdefaultContent: { emptyText: '' },\n\tdisplayName: 'Plan',\n\ticon: 'FormatListChecks',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('work-queue', {\n\trenderer: CnWorkQueue,\n\tform: null,\n\tdefaultContent: { source: null },\n\tdisplayName: 'Work queue',\n\ticon: 'TrayFull',\n})\n\nregisterDashboardWidget('document-review', {\n\trenderer: CnDocumentReviewWidget,\n\tform: null,\n\tdefaultContent: { field: 'documents', statusField: 'reviewStatus', statuses: [] },\n\tdisplayName: 'Document review',\n\ticon: 'FileDocumentCheckOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\nregisterDashboardWidget('conversation', {\n\trenderer: CnConversationWidget,\n\tform: null,\n\tdefaultContent: { field: 'messages', endpoint: '' },\n\tdisplayName: 'Conversation',\n\ticon: 'ForumOutline',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// The record's stages, where clicking a stage moves the record there.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('stages', {\n\trenderer: CnStagesWidget,\n\tform: CnStagesWidgetForm,\n\tdefaultContent: {\n\t\tcurrentField: 'status',\n\t\torientation: 'horizontal',\n\t\tsize: 'medium',\n\t\tstagesEndpoint: { url: '', path: '' },\n\t\t// The LIFECYCLE, not a record write. OpenRegister decides what is\n\t\t// reachable and re-validates the move; a field write has neither.\n\t\ttransition: { kind: 'lifecycle' },\n\t},\n\tdisplayName: 'Stages',\n\ticon: 'Timeline',\n\t// Card family on the detail grid: a titled wrapper around a self-contained\n\t// strip, like the KPI tiles it usually sits beside.\n\tcard: true,\n\t// It reads and moves the BOUND RECORD, which only a detail page has.\n\tsurfaces: ['detail-page'],\n})\n\nregisterDashboardWidget('tabs', {\n\trenderer: CnTabsWidget,\n\tform: CnTabsWidgetForm,\n\tdefaultContent: {\n\t\ttabs: [],\n\t\tariaLabel: '',\n\t},\n\tdisplayName: 'Tabs',\n\ticon: 'TabPlus',\n\t// Renders OTHER widgets, so CnDetailWidgetHost hands it the surface's\n\t// sibling definitions and the context its children will need.\n\tcontainer: true,\n\t// The strip's labels ARE the titles, so a card header above them would name\n\t// the group twice.\n\townsTitle: true,\n\tsurfaces: ['detail-page'],\n})\n\n// The current week as day columns, with the dated items under each day.\n// Registered inline for the same tree-shaking reason as `map` above.\nregisterDashboardWidget('week-strip', {\n\trenderer: CnWeekStripWidget,\n\tform: CnWeekStripWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', filter: {} },\n\t\tdateField: '',\n\t\ttitleField: '',\n\t\tmetaFields: [],\n\t\tdays: 5,\n\t\titemRoute: '',\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Week strip',\n\ticon: 'Calendar',\n})\n\n// One segmented bar with a legend that carries the numbers.\nregisterDashboardWidget('stacked-bar', {\n\trenderer: CnStackedBarWidget,\n\tform: CnStackedBarWidgetForm,\n\tdefaultContent: {\n\t\tsource: { register: '', schema: '', groupBy: '', filter: {} },\n\t\torder: [],\n\t\tlabels: {},\n\t\temptyText: '',\n\t},\n\tdisplayName: 'Stacked bar',\n\ticon: 'ChartBar',\n})\n\n// The team today: availability from the Nextcloud user status and each\n// person's open count from the app (DqTeamwachtrij \"Team vandaag\"). Placed\n// from the manifest: there is no config form yet.\nregisterDashboardWidget('team-workload', {\n\trenderer: CnTeamWorkloadWidget,\n\tform: null,\n\tdefaultContent: { source: { url: '', responsePath: '', userField: 'userId', nameField: 'displayName', countField: 'count' } },\n\tdisplayName: 'Team workload',\n\ticon: 'AccountGroup',\n})\n\n/**\n * Explicit no-op that guarantees this module (and therefore every widget's\n * self-registration side effect) is evaluated. Now optional: `CnDashboardPage`\n * and `CnDetailPage` import this module themselves, and a second call changes\n * nothing because the module body runs once.\n *\n * @return {void}\n */\nexport function registerBuiltinDashboardWidgets() {}\n"],"names":["CnChartWidget","CnChartWidgetForm","CnStatsBlockWidget","CnStatsBlockWidgetForm","CnObjectListWidget2","CnObjectListWidgetForm2","CnSavedViewWidget2","CnSavedViewWidgetForm2","CnMarkdownWidget2","CnMarkdownWidgetForm2","CnRelatedObjectsWidget","CnRelatedObjectsWidgetForm","CnMapWidget","CnMapWidgetForm","CnCountdownWidget","CnCountdownWidgetForm","CnNextStepWidget","CnRetentionWidget","CnPlanWidget","CnWorkQueue","CnDocumentReviewWidget","CnConversationWidget","CnStagesWidget","CnStagesWidgetForm","CnTabsWidget","CnTabsWidgetForm","CnWeekStripWidget","CnWeekStripWidgetForm","CnStackedBarWidget","CnStackedBarWidgetForm","CnTeamWorkloadWidget"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import script from './CnWorkQueue.vue2.js';
|
|
2
|
+
import { render } from './CnWorkQueue.vue3.js';
|
|
3
|
+
|
|
4
|
+
script.render = render;
|
|
5
|
+
script.__scopeId = "data-v-793630f4";
|
|
6
|
+
const __sfc_main = script;
|
|
7
|
+
|
|
8
|
+
export { __sfc_main as default };
|
|
9
|
+
//# sourceMappingURL=CnWorkQueue.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnWorkQueue.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import axios__default from '@nextcloud/axios';
|
|
2
|
+
import { translate } from '@nextcloud/l10n';
|
|
3
|
+
import { generateUrl } from '@nextcloud/router';
|
|
4
|
+
import { NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard } from '@nextcloud/vue';
|
|
5
|
+
import { fetchEndpointSource } from '../../composables/useEndpointSource.js';
|
|
6
|
+
import { fillTemplate } from '../../utils/fillTemplate.js';
|
|
7
|
+
import { openRowTarget } from '../../utils/linkNavigation.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* CnWorkQueue — one list of everything waiting on the reader: tasks,
|
|
11
|
+
* consultations, mentions, calendar items, work they cover for a colleague,
|
|
12
|
+
* from as many sources as the server declares. The component names no
|
|
13
|
+
* source: the server answers the groups (`key`, `label`, `closesWhen`,
|
|
14
|
+
* `items`), so a new kind of work needs no change here. A source that could
|
|
15
|
+
* not be read is named at the top rather than folded into "nothing is
|
|
16
|
+
* waiting". A group can be hidden until tomorrow, through the server, so the
|
|
17
|
+
* choice follows the reader to another device. dossiq's personal queue is
|
|
18
|
+
* the first; pipelinq's queue has the same shape.
|
|
19
|
+
*
|
|
20
|
+
* `content`:
|
|
21
|
+
* - `source`: an endpointSource answering `{ groups, hiddenGroups?, unavailable? }`.
|
|
22
|
+
* An item is `{ id, title, dueAt?, deadlineTier?, covered?, coveredFor?,
|
|
23
|
+
* waiting?: { on, days, chases }, route?, href? }`.
|
|
24
|
+
* - `hide`, `show`: url templates with `{group}` that hide a group until
|
|
25
|
+
* tomorrow and show it again, each answering `{ hiddenGroups }`; without
|
|
26
|
+
* `hide` no group can be hidden.
|
|
27
|
+
* - `itemHref`: a template filled from an item, when items carry no `route`/`href`.
|
|
28
|
+
* - `waitingParties`: words for `waiting.on` (`{ applicant: "the applicant" }`).
|
|
29
|
+
* - `emptyText`: through the host translate.
|
|
30
|
+
*/
|
|
31
|
+
var script = {
|
|
32
|
+
name: 'CnWorkQueue',
|
|
33
|
+
|
|
34
|
+
components: { NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard },
|
|
35
|
+
|
|
36
|
+
inject: {
|
|
37
|
+
/** The host app's translate (CnAppRoot `cnTranslate`). */
|
|
38
|
+
cnTranslate: { default: () => (key) => key },
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
props: {
|
|
42
|
+
/**
|
|
43
|
+
* The queue's configuration (see the component docs).
|
|
44
|
+
*
|
|
45
|
+
* @type {object}
|
|
46
|
+
*/
|
|
47
|
+
content: {
|
|
48
|
+
type: Object,
|
|
49
|
+
default: () => ({}),
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
/** The heading above the queue; none when empty. */
|
|
53
|
+
title: {
|
|
54
|
+
type: String,
|
|
55
|
+
default: '',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
emits: ['open'],
|
|
60
|
+
|
|
61
|
+
data() {
|
|
62
|
+
return {
|
|
63
|
+
loading: true,
|
|
64
|
+
error: '',
|
|
65
|
+
groups: [],
|
|
66
|
+
hidden: [],
|
|
67
|
+
unavailable: [],
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
computed: {
|
|
72
|
+
/**
|
|
73
|
+
* The groups not hidden today.
|
|
74
|
+
*
|
|
75
|
+
* @spec openspec/changes/work-queue/specs/work-queue/spec.md#requirement-one-queue-over-every-source
|
|
76
|
+
* @return {Array<object>}
|
|
77
|
+
*/
|
|
78
|
+
shownGroups() {
|
|
79
|
+
const hidden = new Set(this.hidden.map(String));
|
|
80
|
+
return this.groups.filter((group) => !hidden.has(String(group.key)))
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
mounted() {
|
|
85
|
+
this.load();
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
methods: {
|
|
89
|
+
t: translate,
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* A config text through the host translate.
|
|
93
|
+
*
|
|
94
|
+
* @param {unknown} value The text.
|
|
95
|
+
* @return {string}
|
|
96
|
+
*/
|
|
97
|
+
text(value) {
|
|
98
|
+
return typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Read the queue; a failed read is an error with a retry.
|
|
103
|
+
*
|
|
104
|
+
* @spec openspec/changes/work-queue/specs/work-queue/spec.md#requirement-one-queue-over-every-source
|
|
105
|
+
* @return {Promise<void>}
|
|
106
|
+
*/
|
|
107
|
+
async load() {
|
|
108
|
+
this.loading = true;
|
|
109
|
+
this.error = '';
|
|
110
|
+
try {
|
|
111
|
+
const data = (await fetchEndpointSource(this.content.source, {}, { fresh: true })) || {};
|
|
112
|
+
this.groups = (Array.isArray(data.groups) ? data.groups : [])
|
|
113
|
+
.filter((g) => g && g.key !== undefined)
|
|
114
|
+
.map((g) => ({ ...g, items: Array.isArray(g.items) ? g.items : [] }));
|
|
115
|
+
this.hidden = Array.isArray(data.hiddenGroups) ? data.hiddenGroups.map(String) : [];
|
|
116
|
+
this.unavailable = Array.isArray(data.unavailable) ? data.unavailable.filter((s) => s && s.source) : [];
|
|
117
|
+
} catch (failure) {
|
|
118
|
+
const body = failure && failure.response && failure.response.data;
|
|
119
|
+
this.error = String((body && (body.message || body.error)) || (failure && failure.message) || failure);
|
|
120
|
+
} finally {
|
|
121
|
+
this.loading = false;
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Hide a group until tomorrow, or show it again, through the server.
|
|
127
|
+
*
|
|
128
|
+
* @spec openspec/changes/work-queue/specs/work-queue/spec.md#requirement-one-queue-over-every-source
|
|
129
|
+
* @param {string} key The group key.
|
|
130
|
+
* @param {boolean} hide Hide (true) or show (false).
|
|
131
|
+
* @return {Promise<void>}
|
|
132
|
+
*/
|
|
133
|
+
async setHidden(key, hide) {
|
|
134
|
+
const template = hide ? this.content.hide : this.content.show;
|
|
135
|
+
if (!template) {
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const { data } = await axios__default.post(generateUrl(fillTemplate(template, { group: encodeURIComponent(key) })), {});
|
|
140
|
+
this.hidden = Array.isArray(data && data.hiddenGroups) ? data.hiddenGroups.map(String) : this.hidden;
|
|
141
|
+
} catch {
|
|
142
|
+
// The group stays as it was; the server decides.
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* A group's label by key, for a hidden group.
|
|
148
|
+
*
|
|
149
|
+
* @param {string} key The key.
|
|
150
|
+
* @return {string}
|
|
151
|
+
*/
|
|
152
|
+
labelOf(key) {
|
|
153
|
+
const group = this.groups.find((g) => String(g.key) === String(key));
|
|
154
|
+
return group && group.label ? group.label : String(key)
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* An item's page as an href.
|
|
159
|
+
*
|
|
160
|
+
* @param {object} item The item.
|
|
161
|
+
* @return {string}
|
|
162
|
+
*/
|
|
163
|
+
hrefOf(item) {
|
|
164
|
+
if (item.route && this.$router) {
|
|
165
|
+
try {
|
|
166
|
+
return this.$router.resolve(item.route).href
|
|
167
|
+
} catch {
|
|
168
|
+
return ''
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (item.href) {
|
|
172
|
+
return String(item.href)
|
|
173
|
+
}
|
|
174
|
+
return this.content.itemHref ? generateUrl(fillTemplate(this.content.itemHref, item)) : ''
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Open an item: its route through the router, else its href like a link, else tell the host.
|
|
179
|
+
*
|
|
180
|
+
* @param {object} item The item.
|
|
181
|
+
* @param {MouseEvent} event The click.
|
|
182
|
+
*/
|
|
183
|
+
onOpen(item, event) {
|
|
184
|
+
if (item.route && this.$router && event && !(event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1)) {
|
|
185
|
+
event.preventDefault();
|
|
186
|
+
this.$router.push(item.route).catch(() => {});
|
|
187
|
+
return
|
|
188
|
+
}
|
|
189
|
+
const href = this.hrefOf(item);
|
|
190
|
+
if (href) {
|
|
191
|
+
if (event) {
|
|
192
|
+
event.preventDefault();
|
|
193
|
+
}
|
|
194
|
+
openRowTarget(event, href);
|
|
195
|
+
return
|
|
196
|
+
}
|
|
197
|
+
if (event) {
|
|
198
|
+
event.preventDefault();
|
|
199
|
+
}
|
|
200
|
+
/** @event open An item without a route or href was opened. Payload: the item. */
|
|
201
|
+
this.$emit('open', item);
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Who the item waits on, for how long and how often chased.
|
|
206
|
+
*
|
|
207
|
+
* @param {object} item The item.
|
|
208
|
+
* @return {string}
|
|
209
|
+
*/
|
|
210
|
+
waitingText(item) {
|
|
211
|
+
const waiting = item && item.waiting;
|
|
212
|
+
if (!waiting || typeof waiting !== 'object' || !waiting.on) {
|
|
213
|
+
return ''
|
|
214
|
+
}
|
|
215
|
+
const parties = {
|
|
216
|
+
applicant: translate('nextcloud-vue', 'the applicant'),
|
|
217
|
+
thirdParty: translate('nextcloud-vue', 'a third party'),
|
|
218
|
+
us: translate('nextcloud-vue', 'us'),
|
|
219
|
+
};
|
|
220
|
+
const own = this.content.waitingParties && this.content.waitingParties[waiting.on];
|
|
221
|
+
const party = own ? this.cnTranslate(own) : (parties[waiting.on] || String(waiting.on));
|
|
222
|
+
const days = Number.isFinite(waiting.days) ? waiting.days : 0;
|
|
223
|
+
const chases = Number.isFinite(waiting.chases) ? waiting.chases : 0;
|
|
224
|
+
if (chases === 0) {
|
|
225
|
+
return translate('nextcloud-vue', 'Waiting on {party} for {days} days', { party, days })
|
|
226
|
+
}
|
|
227
|
+
if (chases === 1) {
|
|
228
|
+
return translate('nextcloud-vue', 'Waiting on {party} for {days} days, chased once', { party, days })
|
|
229
|
+
}
|
|
230
|
+
return translate('nextcloud-vue', 'Waiting on {party} for {days} days, chased {chases} times', { party, days, chases })
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Up to two initials of a title.
|
|
235
|
+
*
|
|
236
|
+
* @param {string} title The title.
|
|
237
|
+
* @return {string}
|
|
238
|
+
*/
|
|
239
|
+
initials(title) {
|
|
240
|
+
return String(title ?? '').trim().split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0]).join('').toUpperCase()
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
export { script as default };
|
|
246
|
+
//# sourceMappingURL=CnWorkQueue.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnWorkQueue.vue2.js","sources":["../../../../src/components/CnWorkQueue/CnWorkQueue.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-work-queue\" data-testid=\"cn-work-queue\">\n\t\t<div v-if=\"title || $slots.actions\" class=\"cn-work-queue__head\">\n\t\t\t<h2 v-if=\"title\" class=\"cn-work-queue__title\">\n\t\t\t\t{{ title }}\n\t\t\t</h2>\n\t\t\t<div class=\"cn-work-queue__actions\">\n\t\t\t\t<!-- @slot Buttons beside the title (\"Plan an item\"). -->\n\t\t\t\t<slot name=\"actions\" />\n\t\t\t</div>\n\t\t</div>\n\n\t\t<NcNoteCard v-for=\"source in unavailable\"\n\t\t\t:key=\"source.source\"\n\t\t\ttype=\"warning\"\n\t\t\t:data-testid=\"`cn-work-queue-unavailable-${source.source}`\">\n\t\t\t{{ t('nextcloud-vue', '{source} could not be read, so this list is incomplete.', { source: source.label || source.source }) }}\n\t\t</NcNoteCard>\n\n\t\t<NcLoadingIcon v-if=\"loading\" :size=\"32\" />\n\t\t<NcEmptyContent v-else-if=\"error\"\n\t\t\t:name=\"t('nextcloud-vue', 'This queue could not be read')\"\n\t\t\t:description=\"error\"\n\t\t\tdata-testid=\"cn-work-queue-error\">\n\t\t\t<template #action>\n\t\t\t\t<NcButton @click=\"load\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Try again') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\t\t<template v-else>\n\t\t\t<p v-if=\"shownGroups.length === 0\" class=\"cn-work-queue__muted\" data-testid=\"cn-work-queue-empty\">\n\t\t\t\t{{ text(content.emptyText) || t('nextcloud-vue', 'Nothing is waiting on you.') }}\n\t\t\t</p>\n\t\t\t<section v-for=\"group in shownGroups\"\n\t\t\t\t:key=\"group.key\"\n\t\t\t\tclass=\"cn-work-queue__group\"\n\t\t\t\t:data-testid=\"`cn-work-queue-group-${group.key}`\">\n\t\t\t\t<div class=\"cn-work-queue__group-head\">\n\t\t\t\t\t<h3 class=\"cn-work-queue__group-title\">\n\t\t\t\t\t\t{{ group.label }}\n\t\t\t\t\t\t<span class=\"cn-work-queue__count\">{{ group.items.length }}</span>\n\t\t\t\t\t</h3>\n\t\t\t\t\t<NcButton v-if=\"content.hide\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Hide this group until tomorrow')\"\n\t\t\t\t\t\t:data-testid=\"`cn-work-queue-hide-${group.key}`\"\n\t\t\t\t\t\t@click=\"setHidden(group.key, true)\">\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Hide until tomorrow') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t\t<p v-if=\"group.closesWhen\" class=\"cn-work-queue__muted\">\n\t\t\t\t\t{{ group.closesWhen }}\n\t\t\t\t</p>\n\t\t\t\t<ul class=\"cn-work-queue__items\">\n\t\t\t\t\t<li v-for=\"item in group.items\"\n\t\t\t\t\t\t:key=\"item.id\"\n\t\t\t\t\t\tclass=\"cn-work-queue__item\"\n\t\t\t\t\t\t:class=\"{ 'cn-work-queue__item--late': item.deadlineTier === 'overdue' }\"\n\t\t\t\t\t\t:data-testid=\"`cn-work-queue-item-${item.id}`\">\n\t\t\t\t\t\t<span class=\"cn-work-queue__avatar\" aria-hidden=\"true\">{{ initials(item.title) }}</span>\n\t\t\t\t\t\t<span class=\"cn-work-queue__body\">\n\t\t\t\t\t\t\t<a :href=\"hrefOf(item) || '#'\" class=\"cn-work-queue__link\" @click=\"onOpen(item, $event)\">{{ item.title }}</a>\n\t\t\t\t\t\t\t<span v-if=\"item.covered || waitingText(item)\" class=\"cn-work-queue__sub\">\n\t\t\t\t\t\t\t\t<span v-if=\"item.covered\">{{ t('nextcloud-vue', 'Covering for {person}', { person: String(item.coveredFor || '') }) }}</span>\n\t\t\t\t\t\t\t\t<span v-if=\"waitingText(item)\" :data-testid=\"`cn-work-queue-waiting-${item.id}`\">{{ waitingText(item) }}</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span v-if=\"item.dueAt\" class=\"cn-work-queue__muted\">{{ item.dueAt }}</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\t\t</template>\n\n\t\t<section v-if=\"content.hide && hidden.length\" class=\"cn-work-queue__group\" data-testid=\"cn-work-queue-hidden\">\n\t\t\t<h3 class=\"cn-work-queue__group-title\">\n\t\t\t\t{{ t('nextcloud-vue', 'Hidden until tomorrow') }}\n\t\t\t</h3>\n\t\t\t<NcButton v-for=\"key in hidden\"\n\t\t\t\t:key=\"key\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:data-testid=\"`cn-work-queue-show-${key}`\"\n\t\t\t\t@click=\"setHidden(key, false)\">\n\t\t\t\t{{ t('nextcloud-vue', 'Show {group} again', { group: labelOf(key) }) }}\n\t\t\t</NcButton>\n\t\t</section>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard } from '@nextcloud/vue'\nimport { fetchEndpointSource } from '../../composables/useEndpointSource.js'\nimport { fillTemplate } from '../../utils/fillTemplate.js'\nimport { openRowTarget } from '../../utils/linkNavigation.js'\n\n/**\n * CnWorkQueue — one list of everything waiting on the reader: tasks,\n * consultations, mentions, calendar items, work they cover for a colleague,\n * from as many sources as the server declares. The component names no\n * source: the server answers the groups (`key`, `label`, `closesWhen`,\n * `items`), so a new kind of work needs no change here. A source that could\n * not be read is named at the top rather than folded into \"nothing is\n * waiting\". A group can be hidden until tomorrow, through the server, so the\n * choice follows the reader to another device. dossiq's personal queue is\n * the first; pipelinq's queue has the same shape.\n *\n * `content`:\n * - `source`: an endpointSource answering `{ groups, hiddenGroups?, unavailable? }`.\n * An item is `{ id, title, dueAt?, deadlineTier?, covered?, coveredFor?,\n * waiting?: { on, days, chases }, route?, href? }`.\n * - `hide`, `show`: url templates with `{group}` that hide a group until\n * tomorrow and show it again, each answering `{ hiddenGroups }`; without\n * `hide` no group can be hidden.\n * - `itemHref`: a template filled from an item, when items carry no `route`/`href`.\n * - `waitingParties`: words for `waiting.on` (`{ applicant: \"the applicant\" }`).\n * - `emptyText`: through the host translate.\n */\nexport default {\n\tname: 'CnWorkQueue',\n\n\tcomponents: { NcButton, NcEmptyContent, NcLoadingIcon, NcNoteCard },\n\n\tinject: {\n\t\t/** The host app's translate (CnAppRoot `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The queue's configuration (see the component docs).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The heading above the queue; none when empty. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['open'],\n\n\tdata() {\n\t\treturn {\n\t\t\tloading: true,\n\t\t\terror: '',\n\t\t\tgroups: [],\n\t\t\thidden: [],\n\t\t\tunavailable: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The groups not hidden today.\n\t\t *\n\t\t * @spec openspec/changes/work-queue/specs/work-queue/spec.md#requirement-one-queue-over-every-source\n\t\t * @return {Array<object>}\n\t\t */\n\t\tshownGroups() {\n\t\t\tconst hidden = new Set(this.hidden.map(String))\n\t\t\treturn this.groups.filter((group) => !hidden.has(String(group.key)))\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.load()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A config text through the host translate.\n\t\t *\n\t\t * @param {unknown} value The text.\n\t\t * @return {string}\n\t\t */\n\t\ttext(value) {\n\t\t\treturn typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''\n\t\t},\n\n\t\t/**\n\t\t * Read the queue; a failed read is an error with a retry.\n\t\t *\n\t\t * @spec openspec/changes/work-queue/specs/work-queue/spec.md#requirement-one-queue-over-every-source\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync load() {\n\t\t\tthis.loading = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tconst data = (await fetchEndpointSource(this.content.source, {}, { fresh: true })) || {}\n\t\t\t\tthis.groups = (Array.isArray(data.groups) ? data.groups : [])\n\t\t\t\t\t.filter((g) => g && g.key !== undefined)\n\t\t\t\t\t.map((g) => ({ ...g, items: Array.isArray(g.items) ? g.items : [] }))\n\t\t\t\tthis.hidden = Array.isArray(data.hiddenGroups) ? data.hiddenGroups.map(String) : []\n\t\t\t\tthis.unavailable = Array.isArray(data.unavailable) ? data.unavailable.filter((s) => s && s.source) : []\n\t\t\t} catch (failure) {\n\t\t\t\tconst body = failure && failure.response && failure.response.data\n\t\t\t\tthis.error = String((body && (body.message || body.error)) || (failure && failure.message) || failure)\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Hide a group until tomorrow, or show it again, through the server.\n\t\t *\n\t\t * @spec openspec/changes/work-queue/specs/work-queue/spec.md#requirement-one-queue-over-every-source\n\t\t * @param {string} key The group key.\n\t\t * @param {boolean} hide Hide (true) or show (false).\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync setHidden(key, hide) {\n\t\t\tconst template = hide ? this.content.hide : this.content.show\n\t\t\tif (!template) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst { data } = await axios.post(generateUrl(fillTemplate(template, { group: encodeURIComponent(key) })), {})\n\t\t\t\tthis.hidden = Array.isArray(data && data.hiddenGroups) ? data.hiddenGroups.map(String) : this.hidden\n\t\t\t} catch {\n\t\t\t\t// The group stays as it was; the server decides.\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A group's label by key, for a hidden group.\n\t\t *\n\t\t * @param {string} key The key.\n\t\t * @return {string}\n\t\t */\n\t\tlabelOf(key) {\n\t\t\tconst group = this.groups.find((g) => String(g.key) === String(key))\n\t\t\treturn group && group.label ? group.label : String(key)\n\t\t},\n\n\t\t/**\n\t\t * An item's page as an href.\n\t\t *\n\t\t * @param {object} item The item.\n\t\t * @return {string}\n\t\t */\n\t\threfOf(item) {\n\t\t\tif (item.route && this.$router) {\n\t\t\t\ttry {\n\t\t\t\t\treturn this.$router.resolve(item.route).href\n\t\t\t\t} catch {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (item.href) {\n\t\t\t\treturn String(item.href)\n\t\t\t}\n\t\t\treturn this.content.itemHref ? generateUrl(fillTemplate(this.content.itemHref, item)) : ''\n\t\t},\n\n\t\t/**\n\t\t * Open an item: its route through the router, else its href like a link, else tell the host.\n\t\t *\n\t\t * @param {object} item The item.\n\t\t * @param {MouseEvent} event The click.\n\t\t */\n\t\tonOpen(item, event) {\n\t\t\tif (item.route && this.$router && event && !(event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1)) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.$router.push(item.route).catch(() => {})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst href = this.hrefOf(item)\n\t\t\tif (href) {\n\t\t\t\tif (event) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\t\t\t\topenRowTarget(event, href)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (event) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\t\t\t/** @event open An item without a route or href was opened. Payload: the item. */\n\t\t\tthis.$emit('open', item)\n\t\t},\n\n\t\t/**\n\t\t * Who the item waits on, for how long and how often chased.\n\t\t *\n\t\t * @param {object} item The item.\n\t\t * @return {string}\n\t\t */\n\t\twaitingText(item) {\n\t\t\tconst waiting = item && item.waiting\n\t\t\tif (!waiting || typeof waiting !== 'object' || !waiting.on) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst parties = {\n\t\t\t\tapplicant: t('nextcloud-vue', 'the applicant'),\n\t\t\t\tthirdParty: t('nextcloud-vue', 'a third party'),\n\t\t\t\tus: t('nextcloud-vue', 'us'),\n\t\t\t}\n\t\t\tconst own = this.content.waitingParties && this.content.waitingParties[waiting.on]\n\t\t\tconst party = own ? this.cnTranslate(own) : (parties[waiting.on] || String(waiting.on))\n\t\t\tconst days = Number.isFinite(waiting.days) ? waiting.days : 0\n\t\t\tconst chases = Number.isFinite(waiting.chases) ? waiting.chases : 0\n\t\t\tif (chases === 0) {\n\t\t\t\treturn t('nextcloud-vue', 'Waiting on {party} for {days} days', { party, days })\n\t\t\t}\n\t\t\tif (chases === 1) {\n\t\t\t\treturn t('nextcloud-vue', 'Waiting on {party} for {days} days, chased once', { party, days })\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Waiting on {party} for {days} days, chased {chases} times', { party, days, chases })\n\t\t},\n\n\t\t/**\n\t\t * Up to two initials of a title.\n\t\t *\n\t\t * @param {string} title The title.\n\t\t * @return {string}\n\t\t */\n\t\tinitials(title) {\n\t\t\treturn String(title ?? '').trim().split(/\\s+/).filter(Boolean).slice(0, 2).map((w) => w[0]).join('').toUpperCase()\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-work-queue {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 24px;\n}\n\n.cn-work-queue__head,\n.cn-work-queue__group-head {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n}\n\n.cn-work-queue__title {\n\tmargin: 0;\n\tfont-size: 28px;\n\tfont-weight: 700;\n}\n\n.cn-work-queue__actions {\n\tdisplay: flex;\n\tgap: 8px;\n}\n\n.cn-work-queue__group {\n\tpadding: 20px 24px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tbackground: var(--color-main-background);\n}\n\n.cn-work-queue__group-title {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tmargin: 0;\n\tfont-size: 18px;\n\tfont-weight: 700;\n}\n\n.cn-work-queue__count {\n\tpadding: 0 8px;\n\tborder-radius: 10px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 12px;\n\tfont-weight: 600;\n}\n\n.cn-work-queue__muted {\n\tmargin: 4px 0 8px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-work-queue__items {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-work-queue__item {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 16px;\n\tpadding: 12px 0;\n\tborder-block-end: 1px solid var(--color-border);\n}\n\n.cn-work-queue__item:last-child {\n\tborder-block-end: none;\n}\n\n.cn-work-queue__avatar {\n\tdisplay: inline-flex;\n\tflex: none;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder-radius: 50%;\n\tbackground: var(--color-background-dark);\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 12px;\n\tfont-weight: 700;\n}\n\n.cn-work-queue__body {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tmin-width: 0;\n}\n\n.cn-work-queue__link {\n\tcolor: var(--color-main-text);\n\tfont-weight: 700;\n\ttext-decoration: none;\n}\n\n.cn-work-queue__link:hover {\n\ttext-decoration: underline;\n}\n\n.cn-work-queue__item--late .cn-work-queue__link {\n\tcolor: var(--color-error);\n}\n\n.cn-work-queue__sub {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 12px;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n}\n</style>\n"],"names":["t","axios"],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, toDisplayString, createCommentVNode, createElementVNode, renderSlot, Fragment, renderList, createBlock, withCtx, createTextVNode, createVNode, normalizeClass } from 'vue';
|
|
2
|
+
|
|
3
|
+
const _hoisted_1 = {
|
|
4
|
+
class: "cn-work-queue",
|
|
5
|
+
"data-testid": "cn-work-queue"
|
|
6
|
+
};
|
|
7
|
+
const _hoisted_2 = {
|
|
8
|
+
key: 0,
|
|
9
|
+
class: "cn-work-queue__head"
|
|
10
|
+
};
|
|
11
|
+
const _hoisted_3 = {
|
|
12
|
+
key: 0,
|
|
13
|
+
class: "cn-work-queue__title"
|
|
14
|
+
};
|
|
15
|
+
const _hoisted_4 = { class: "cn-work-queue__actions" };
|
|
16
|
+
const _hoisted_5 = {
|
|
17
|
+
key: 0,
|
|
18
|
+
class: "cn-work-queue__muted",
|
|
19
|
+
"data-testid": "cn-work-queue-empty"
|
|
20
|
+
};
|
|
21
|
+
const _hoisted_6 = ["data-testid"];
|
|
22
|
+
const _hoisted_7 = { class: "cn-work-queue__group-head" };
|
|
23
|
+
const _hoisted_8 = { class: "cn-work-queue__group-title" };
|
|
24
|
+
const _hoisted_9 = { class: "cn-work-queue__count" };
|
|
25
|
+
const _hoisted_10 = {
|
|
26
|
+
key: 0,
|
|
27
|
+
class: "cn-work-queue__muted"
|
|
28
|
+
};
|
|
29
|
+
const _hoisted_11 = { class: "cn-work-queue__items" };
|
|
30
|
+
const _hoisted_12 = ["data-testid"];
|
|
31
|
+
const _hoisted_13 = {
|
|
32
|
+
class: "cn-work-queue__avatar",
|
|
33
|
+
"aria-hidden": "true"
|
|
34
|
+
};
|
|
35
|
+
const _hoisted_14 = { class: "cn-work-queue__body" };
|
|
36
|
+
const _hoisted_15 = ["href", "onClick"];
|
|
37
|
+
const _hoisted_16 = {
|
|
38
|
+
key: 0,
|
|
39
|
+
class: "cn-work-queue__sub"
|
|
40
|
+
};
|
|
41
|
+
const _hoisted_17 = { key: 0 };
|
|
42
|
+
const _hoisted_18 = ["data-testid"];
|
|
43
|
+
const _hoisted_19 = {
|
|
44
|
+
key: 0,
|
|
45
|
+
class: "cn-work-queue__muted"
|
|
46
|
+
};
|
|
47
|
+
const _hoisted_20 = {
|
|
48
|
+
key: 4,
|
|
49
|
+
class: "cn-work-queue__group",
|
|
50
|
+
"data-testid": "cn-work-queue-hidden"
|
|
51
|
+
};
|
|
52
|
+
const _hoisted_21 = { class: "cn-work-queue__group-title" };
|
|
53
|
+
|
|
54
|
+
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
55
|
+
const _component_NcNoteCard = resolveComponent("NcNoteCard");
|
|
56
|
+
const _component_NcLoadingIcon = resolveComponent("NcLoadingIcon");
|
|
57
|
+
const _component_NcButton = resolveComponent("NcButton");
|
|
58
|
+
const _component_NcEmptyContent = resolveComponent("NcEmptyContent");
|
|
59
|
+
|
|
60
|
+
return (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
61
|
+
($props.title || _ctx.$slots.actions)
|
|
62
|
+
? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
63
|
+
($props.title)
|
|
64
|
+
? (openBlock(), createElementBlock("h2", _hoisted_3, toDisplayString($props.title), 1 /* TEXT */))
|
|
65
|
+
: createCommentVNode("v-if", true),
|
|
66
|
+
createElementVNode("div", _hoisted_4, [
|
|
67
|
+
renderSlot(_ctx.$slots, "actions")
|
|
68
|
+
])
|
|
69
|
+
]))
|
|
70
|
+
: createCommentVNode("v-if", true),
|
|
71
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($data.unavailable, (source) => {
|
|
72
|
+
return (openBlock(), createBlock(_component_NcNoteCard, {
|
|
73
|
+
key: source.source,
|
|
74
|
+
type: "warning",
|
|
75
|
+
"data-testid": `cn-work-queue-unavailable-${source.source}`
|
|
76
|
+
}, {
|
|
77
|
+
default: withCtx(() => [
|
|
78
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', '{source} could not be read, so this list is incomplete.', { source: source.label || source.source })), 1 /* TEXT */)
|
|
79
|
+
]),
|
|
80
|
+
_: 2 /* DYNAMIC */
|
|
81
|
+
}, 1032 /* PROPS, DYNAMIC_SLOTS */, ["data-testid"]))
|
|
82
|
+
}), 128 /* KEYED_FRAGMENT */)),
|
|
83
|
+
($data.loading)
|
|
84
|
+
? (openBlock(), createBlock(_component_NcLoadingIcon, {
|
|
85
|
+
key: 1,
|
|
86
|
+
size: 32
|
|
87
|
+
}))
|
|
88
|
+
: ($data.error)
|
|
89
|
+
? (openBlock(), createBlock(_component_NcEmptyContent, {
|
|
90
|
+
key: 2,
|
|
91
|
+
name: $options.t('nextcloud-vue', 'This queue could not be read'),
|
|
92
|
+
description: $data.error,
|
|
93
|
+
"data-testid": "cn-work-queue-error"
|
|
94
|
+
}, {
|
|
95
|
+
action: withCtx(() => [
|
|
96
|
+
createVNode(_component_NcButton, { onClick: $options.load }, {
|
|
97
|
+
default: withCtx(() => [
|
|
98
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Try again')), 1 /* TEXT */)
|
|
99
|
+
]),
|
|
100
|
+
_: 1 /* STABLE */
|
|
101
|
+
}, 8 /* PROPS */, ["onClick"])
|
|
102
|
+
]),
|
|
103
|
+
_: 1 /* STABLE */
|
|
104
|
+
}, 8 /* PROPS */, ["name", "description"]))
|
|
105
|
+
: (openBlock(), createElementBlock(Fragment, { key: 3 }, [
|
|
106
|
+
($options.shownGroups.length === 0)
|
|
107
|
+
? (openBlock(), createElementBlock("p", _hoisted_5, toDisplayString($options.text($props.content.emptyText) || $options.t('nextcloud-vue', 'Nothing is waiting on you.')), 1 /* TEXT */))
|
|
108
|
+
: createCommentVNode("v-if", true),
|
|
109
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.shownGroups, (group) => {
|
|
110
|
+
return (openBlock(), createElementBlock("section", {
|
|
111
|
+
key: group.key,
|
|
112
|
+
class: "cn-work-queue__group",
|
|
113
|
+
"data-testid": `cn-work-queue-group-${group.key}`
|
|
114
|
+
}, [
|
|
115
|
+
createElementVNode("div", _hoisted_7, [
|
|
116
|
+
createElementVNode("h3", _hoisted_8, [
|
|
117
|
+
createTextVNode(toDisplayString(group.label) + " ", 1 /* TEXT */),
|
|
118
|
+
createElementVNode("span", _hoisted_9, toDisplayString(group.items.length), 1 /* TEXT */)
|
|
119
|
+
]),
|
|
120
|
+
($props.content.hide)
|
|
121
|
+
? (openBlock(), createBlock(_component_NcButton, {
|
|
122
|
+
key: 0,
|
|
123
|
+
variant: "secondary",
|
|
124
|
+
"aria-label": $options.t('nextcloud-vue', 'Hide this group until tomorrow'),
|
|
125
|
+
"data-testid": `cn-work-queue-hide-${group.key}`,
|
|
126
|
+
onClick: $event => ($options.setHidden(group.key, true))
|
|
127
|
+
}, {
|
|
128
|
+
default: withCtx(() => [
|
|
129
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Hide until tomorrow')), 1 /* TEXT */)
|
|
130
|
+
]),
|
|
131
|
+
_: 1 /* STABLE */
|
|
132
|
+
}, 8 /* PROPS */, ["aria-label", "data-testid", "onClick"]))
|
|
133
|
+
: createCommentVNode("v-if", true)
|
|
134
|
+
]),
|
|
135
|
+
(group.closesWhen)
|
|
136
|
+
? (openBlock(), createElementBlock("p", _hoisted_10, toDisplayString(group.closesWhen), 1 /* TEXT */))
|
|
137
|
+
: createCommentVNode("v-if", true),
|
|
138
|
+
createElementVNode("ul", _hoisted_11, [
|
|
139
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(group.items, (item) => {
|
|
140
|
+
return (openBlock(), createElementBlock("li", {
|
|
141
|
+
key: item.id,
|
|
142
|
+
class: normalizeClass(["cn-work-queue__item", { 'cn-work-queue__item--late': item.deadlineTier === 'overdue' }]),
|
|
143
|
+
"data-testid": `cn-work-queue-item-${item.id}`
|
|
144
|
+
}, [
|
|
145
|
+
createElementVNode("span", _hoisted_13, toDisplayString($options.initials(item.title)), 1 /* TEXT */),
|
|
146
|
+
createElementVNode("span", _hoisted_14, [
|
|
147
|
+
createElementVNode("a", {
|
|
148
|
+
href: $options.hrefOf(item) || '#',
|
|
149
|
+
class: "cn-work-queue__link",
|
|
150
|
+
onClick: $event => ($options.onOpen(item, $event))
|
|
151
|
+
}, toDisplayString(item.title), 9 /* TEXT, PROPS */, _hoisted_15),
|
|
152
|
+
(item.covered || $options.waitingText(item))
|
|
153
|
+
? (openBlock(), createElementBlock("span", _hoisted_16, [
|
|
154
|
+
(item.covered)
|
|
155
|
+
? (openBlock(), createElementBlock("span", _hoisted_17, toDisplayString($options.t('nextcloud-vue', 'Covering for {person}', { person: String(item.coveredFor || '') })), 1 /* TEXT */))
|
|
156
|
+
: createCommentVNode("v-if", true),
|
|
157
|
+
($options.waitingText(item))
|
|
158
|
+
? (openBlock(), createElementBlock("span", {
|
|
159
|
+
key: 1,
|
|
160
|
+
"data-testid": `cn-work-queue-waiting-${item.id}`
|
|
161
|
+
}, toDisplayString($options.waitingText(item)), 9 /* TEXT, PROPS */, _hoisted_18))
|
|
162
|
+
: createCommentVNode("v-if", true)
|
|
163
|
+
]))
|
|
164
|
+
: createCommentVNode("v-if", true)
|
|
165
|
+
]),
|
|
166
|
+
(item.dueAt)
|
|
167
|
+
? (openBlock(), createElementBlock("span", _hoisted_19, toDisplayString(item.dueAt), 1 /* TEXT */))
|
|
168
|
+
: createCommentVNode("v-if", true)
|
|
169
|
+
], 10 /* CLASS, PROPS */, _hoisted_12))
|
|
170
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
171
|
+
])
|
|
172
|
+
], 8 /* PROPS */, _hoisted_6))
|
|
173
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
174
|
+
], 64 /* STABLE_FRAGMENT */)),
|
|
175
|
+
($props.content.hide && $data.hidden.length)
|
|
176
|
+
? (openBlock(), createElementBlock("section", _hoisted_20, [
|
|
177
|
+
createElementVNode("h3", _hoisted_21, toDisplayString($options.t('nextcloud-vue', 'Hidden until tomorrow')), 1 /* TEXT */),
|
|
178
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($data.hidden, (key) => {
|
|
179
|
+
return (openBlock(), createBlock(_component_NcButton, {
|
|
180
|
+
key: key,
|
|
181
|
+
variant: "tertiary",
|
|
182
|
+
"data-testid": `cn-work-queue-show-${key}`,
|
|
183
|
+
onClick: $event => ($options.setHidden(key, false))
|
|
184
|
+
}, {
|
|
185
|
+
default: withCtx(() => [
|
|
186
|
+
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Show {group} again', { group: $options.labelOf(key) })), 1 /* TEXT */)
|
|
187
|
+
]),
|
|
188
|
+
_: 2 /* DYNAMIC */
|
|
189
|
+
}, 1032 /* PROPS, DYNAMIC_SLOTS */, ["data-testid", "onClick"]))
|
|
190
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
191
|
+
]))
|
|
192
|
+
: createCommentVNode("v-if", true)
|
|
193
|
+
]))
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export { render };
|
|
197
|
+
//# sourceMappingURL=CnWorkQueue.vue3.js.map
|