@conduction/nextcloud-vue 2.120.0 → 2.121.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.
Files changed (72) hide show
  1. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +53 -1
  2. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  3. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +546 -523
  4. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  5. package/dist/esm/components/CnIndexPage/useNamedSource.js +9 -0
  6. package/dist/esm/components/CnIndexPage/useNamedSource.js.map +1 -1
  7. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js +9 -0
  8. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue.js.map +1 -0
  9. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js +214 -0
  10. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue2.js.map +1 -0
  11. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js +125 -0
  12. package/dist/esm/components/CnReadinessChecklist/CnReadinessChecklist.vue3.js.map +1 -0
  13. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js +9 -0
  14. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js.map +1 -0
  15. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js +163 -0
  16. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue2.js.map +1 -0
  17. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js +131 -0
  18. package/dist/esm/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue3.js.map +1 -0
  19. package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js +127 -0
  20. package/dist/esm/components/CnSchemaRulesWidget/schemaRules.js.map +1 -0
  21. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js +9 -0
  22. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue.js.map +1 -0
  23. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js +82 -0
  24. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue2.js.map +1 -0
  25. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js +61 -0
  26. package/dist/esm/components/CnSearchIndexStatus/CnSearchIndexStatus.vue3.js.map +1 -0
  27. package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js +60 -0
  28. package/dist/esm/components/CnSearchIndexStatus/searchIndexStatus.js.map +1 -0
  29. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js +10 -0
  30. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue.js.map +1 -0
  31. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js +226 -0
  32. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue2.js.map +1 -0
  33. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js +126 -0
  34. package/dist/esm/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue3.js.map +1 -0
  35. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +42 -32
  36. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  37. package/dist/esm/composables/indexSources.js +116 -16
  38. package/dist/esm/composables/indexSources.js.map +1 -1
  39. package/dist/esm/index.js +4 -0
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/l10n/en.json.js +42 -1
  42. package/dist/esm/l10n/en.json.js.map +1 -1
  43. package/dist/esm/l10n/nl.json.js +42 -1
  44. package/dist/esm/l10n/nl.json.js.map +1 -1
  45. package/dist/esm/library-style.js +1 -1
  46. package/dist/esm/nextcloud-vue.css +147 -0
  47. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  48. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  49. package/dist/nextcloud-vue.cjs.js +14135 -12578
  50. package/dist/nextcloud-vue.cjs.js.map +2 -2
  51. package/dist/nextcloud-vue.css +147 -0
  52. package/l10n/en.json +42 -1
  53. package/l10n/nl.json +42 -1
  54. package/package.json +1 -1
  55. package/src/components/CnIndexPage/CnIndexPage.vue +74 -3
  56. package/src/components/CnIndexPage/useNamedSource.js +9 -0
  57. package/src/components/CnReadinessChecklist/CnReadinessChecklist.vue +335 -0
  58. package/src/components/CnReadinessChecklist/index.js +9 -0
  59. package/src/components/CnSchemaRulesWidget/CnSchemaRulesWidget.vue +300 -0
  60. package/src/components/CnSchemaRulesWidget/index.js +10 -0
  61. package/src/components/CnSchemaRulesWidget/schemaRules.js +123 -0
  62. package/src/components/CnSearchIndexStatus/CnSearchIndexStatus.vue +160 -0
  63. package/src/components/CnSearchIndexStatus/index.js +10 -0
  64. package/src/components/CnSearchIndexStatus/searchIndexStatus.js +56 -0
  65. package/src/components/CnShippedConfigurationSection/CnShippedConfigurationSection.vue +328 -0
  66. package/src/components/CnShippedConfigurationSection/index.js +9 -0
  67. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +10 -0
  68. package/src/components/index.js +4 -0
  69. package/src/composables/indexSources.js +116 -16
  70. package/src/css/index-page.css +7 -0
  71. package/src/index.js +4 -0
  72. package/src/utils/libraryWidgetKeys.js +1 -0
@@ -1,12 +1,12 @@
1
- import __sfc_main$l from '../CnAiCompanion/CnAiChatWidget.vue.js';
1
+ import __sfc_main$m from '../CnAiCompanion/CnAiChatWidget.vue.js';
2
2
  import __sfc_main from '../CnChartWidget/CnChartWidget.vue.js';
3
3
  import __sfc_main$1 from '../CnChartWidgetForm/CnChartWidgetForm.vue.js';
4
- import __sfc_main$o from '../CnConversationThread/CnConversationWidget.vue.js';
4
+ import __sfc_main$p from '../CnConversationThread/CnConversationWidget.vue.js';
5
5
  import __sfc_main$e from '../CnCountdownWidget/CnCountdownWidget.vue.js';
6
6
  import __sfc_main$f from '../CnCountdownWidgetForm/CnCountdownWidgetForm.vue.js';
7
- import __sfc_main$k from '../CnDocumentReviewList/CnDocumentReviewWidget.vue.js';
8
- import __sfc_main$n from '../CnEventsCard/CnEventsCard.vue.js';
9
- import __sfc_main$m from '../CnMacrosWidget/CnMacrosWidget.vue.js';
7
+ import __sfc_main$l from '../CnDocumentReviewList/CnDocumentReviewWidget.vue.js';
8
+ import __sfc_main$o from '../CnEventsCard/CnEventsCard.vue.js';
9
+ import __sfc_main$n from '../CnMacrosWidget/CnMacrosWidget.vue.js';
10
10
  import __sfc_main$c from '../CnMapWidget/CnMapWidget.vue.js';
11
11
  import __sfc_main$d from '../CnMapWidgetForm/CnMapWidgetForm.vue.js';
12
12
  import __sfc_main$8 from '../CnMarkdownWidget/CnMarkdownWidget.vue.js';
@@ -14,24 +14,25 @@ import __sfc_main$9 from '../CnMarkdownWidgetForm/CnMarkdownWidgetForm.vue.js';
14
14
  import __sfc_main$g from '../CnNextStepCard/CnNextStepWidget.vue.js';
15
15
  import __sfc_main$4 from '../CnObjectListWidget/CnObjectListWidget.vue.js';
16
16
  import __sfc_main$5 from '../CnObjectListWidgetForm/CnObjectListWidgetForm.vue.js';
17
- import __sfc_main$i from '../CnPlanWidget/CnPlanWidget.vue.js';
17
+ import __sfc_main$j from '../CnPlanWidget/CnPlanWidget.vue.js';
18
18
  import __sfc_main$a from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue.js';
19
19
  import __sfc_main$b from '../CnRelatedObjectsWidgetForm/CnRelatedObjectsWidgetForm.vue.js';
20
20
  import __sfc_main$h from '../CnRetentionWidget/CnRetentionWidget.vue.js';
21
21
  import __sfc_main$6 from '../CnSavedViewWidget/CnSavedViewWidget.vue.js';
22
22
  import __sfc_main$7 from '../CnSavedViewWidgetForm/CnSavedViewWidgetForm.vue.js';
23
- import __sfc_main$v from '../CnStackedBarWidget/CnStackedBarWidget.vue.js';
24
- import __sfc_main$w from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js';
25
- import __sfc_main$p from '../CnStagesWidget/CnStagesWidget.vue.js';
26
- import __sfc_main$q from '../CnStagesWidgetForm/CnStagesWidgetForm.vue.js';
23
+ import __sfc_main$i from '../CnSchemaRulesWidget/CnSchemaRulesWidget.vue.js';
24
+ import __sfc_main$w from '../CnStackedBarWidget/CnStackedBarWidget.vue.js';
25
+ import __sfc_main$x from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js';
26
+ import __sfc_main$q from '../CnStagesWidget/CnStagesWidget.vue.js';
27
+ import __sfc_main$r from '../CnStagesWidgetForm/CnStagesWidgetForm.vue.js';
27
28
  import __sfc_main$2 from '../CnStatsBlockWidget/CnStatsBlockWidget.vue.js';
28
29
  import __sfc_main$3 from '../CnStatsBlockWidgetForm/CnStatsBlockWidgetForm.vue.js';
29
- import __sfc_main$r from '../CnTabsWidget/CnTabsWidget.vue.js';
30
- import __sfc_main$s from '../CnTabsWidgetForm/CnTabsWidgetForm.vue.js';
31
- import __sfc_main$x from '../CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js';
32
- import __sfc_main$t from '../CnWeekStripWidget/CnWeekStripWidget.vue.js';
33
- import __sfc_main$u from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js';
34
- import __sfc_main$j from '../CnWorkQueue/CnWorkQueue.vue.js';
30
+ import __sfc_main$s from '../CnTabsWidget/CnTabsWidget.vue.js';
31
+ import __sfc_main$t from '../CnTabsWidgetForm/CnTabsWidgetForm.vue.js';
32
+ import __sfc_main$y from '../CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js';
33
+ import __sfc_main$u from '../CnWeekStripWidget/CnWeekStripWidget.vue.js';
34
+ import __sfc_main$v from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js';
35
+ import __sfc_main$k from '../CnWorkQueue/CnWorkQueue.vue.js';
35
36
  import { registerDashboardWidget } from './dashboardWidgetRegistry.js';
36
37
  import '../CnLabelWidget/index.js';
37
38
  import '../CnTextWidget/index.js';
@@ -304,9 +305,18 @@ registerDashboardWidget('retention', {
304
305
  ownsTitle: true,
305
306
  });
306
307
 
307
- registerDashboardWidget('plan', {
308
+ registerDashboardWidget('schema-rules', {
308
309
  renderer: __sfc_main$i,
309
310
  form: null,
311
+ defaultContent: { register: '', schema: '', objectId: '' },
312
+ displayName: 'Schema rules',
313
+ icon: 'ScaleBalance',
314
+ surfaces: ['detail-page'],
315
+ });
316
+
317
+ registerDashboardWidget('plan', {
318
+ renderer: __sfc_main$j,
319
+ form: null,
310
320
  defaultContent: { emptyText: '' },
311
321
  displayName: 'Plan',
312
322
  icon: 'FormatListChecks',
@@ -315,7 +325,7 @@ registerDashboardWidget('plan', {
315
325
  });
316
326
 
317
327
  registerDashboardWidget('work-queue', {
318
- renderer: __sfc_main$j,
328
+ renderer: __sfc_main$k,
319
329
  form: null,
320
330
  defaultContent: { source: null },
321
331
  displayName: 'Work queue',
@@ -323,7 +333,7 @@ registerDashboardWidget('work-queue', {
323
333
  });
324
334
 
325
335
  registerDashboardWidget('document-review', {
326
- renderer: __sfc_main$k,
336
+ renderer: __sfc_main$l,
327
337
  form: null,
328
338
  defaultContent: { field: 'documents', statusField: 'reviewStatus', statuses: [] },
329
339
  displayName: 'Document review',
@@ -335,7 +345,7 @@ registerDashboardWidget('document-review', {
335
345
  // The AI Chat Companion embedded in the page: the assistant as a tab or card
336
346
  // rather than the launcher's floating window (DqZaakAssistent).
337
347
  registerDashboardWidget('ai-chat', {
338
- renderer: __sfc_main$l,
348
+ renderer: __sfc_main$m,
339
349
  form: null,
340
350
  defaultContent: { chatAppId: '' },
341
351
  displayName: 'Assistant',
@@ -347,7 +357,7 @@ registerDashboardWidget('ai-chat', {
347
357
  // The macros the record's schema declares, each run by a button
348
358
  // (DqZaakAssistent "Macro's").
349
359
  registerDashboardWidget('macros', {
350
- renderer: __sfc_main$m,
360
+ renderer: __sfc_main$n,
351
361
  form: null,
352
362
  defaultContent: { description: '', emptyText: '' },
353
363
  displayName: 'Macros',
@@ -358,7 +368,7 @@ registerDashboardWidget('macros', {
358
368
  // The appointments booked on a record that is not an object (a flow task),
359
369
  // read from a source or an endpoint.
360
370
  registerDashboardWidget('events', {
361
- renderer: __sfc_main$n,
371
+ renderer: __sfc_main$o,
362
372
  form: null,
363
373
  defaultContent: { source: null, endpoint: '', emptyText: '' },
364
374
  displayName: 'Appointments',
@@ -367,7 +377,7 @@ registerDashboardWidget('events', {
367
377
  });
368
378
 
369
379
  registerDashboardWidget('conversation', {
370
- renderer: __sfc_main$o,
380
+ renderer: __sfc_main$p,
371
381
  form: null,
372
382
  defaultContent: { field: 'messages', endpoint: '' },
373
383
  displayName: 'Conversation',
@@ -379,8 +389,8 @@ registerDashboardWidget('conversation', {
379
389
  // The record's stages, where clicking a stage moves the record there.
380
390
  // Registered inline for the same tree-shaking reason as `map` above.
381
391
  registerDashboardWidget('stages', {
382
- renderer: __sfc_main$p,
383
- form: __sfc_main$q,
392
+ renderer: __sfc_main$q,
393
+ form: __sfc_main$r,
384
394
  defaultContent: {
385
395
  currentField: 'status',
386
396
  orientation: 'horizontal',
@@ -400,8 +410,8 @@ registerDashboardWidget('stages', {
400
410
  });
401
411
 
402
412
  registerDashboardWidget('tabs', {
403
- renderer: __sfc_main$r,
404
- form: __sfc_main$s,
413
+ renderer: __sfc_main$s,
414
+ form: __sfc_main$t,
405
415
  defaultContent: {
406
416
  tabs: [],
407
417
  ariaLabel: '',
@@ -420,8 +430,8 @@ registerDashboardWidget('tabs', {
420
430
  // The current week as day columns, with the dated items under each day.
421
431
  // Registered inline for the same tree-shaking reason as `map` above.
422
432
  registerDashboardWidget('week-strip', {
423
- renderer: __sfc_main$t,
424
- form: __sfc_main$u,
433
+ renderer: __sfc_main$u,
434
+ form: __sfc_main$v,
425
435
  defaultContent: {
426
436
  source: { register: '', schema: '', filter: {} },
427
437
  dateField: '',
@@ -437,8 +447,8 @@ registerDashboardWidget('week-strip', {
437
447
 
438
448
  // One segmented bar with a legend that carries the numbers.
439
449
  registerDashboardWidget('stacked-bar', {
440
- renderer: __sfc_main$v,
441
- form: __sfc_main$w,
450
+ renderer: __sfc_main$w,
451
+ form: __sfc_main$x,
442
452
  defaultContent: {
443
453
  source: { register: '', schema: '', groupBy: '', filter: {} },
444
454
  order: [],
@@ -453,7 +463,7 @@ registerDashboardWidget('stacked-bar', {
453
463
  // person's open count from the app (DqTeamwachtrij "Team vandaag"). Placed
454
464
  // from the manifest: there is no config form yet.
455
465
  registerDashboardWidget('team-workload', {
456
- renderer: __sfc_main$x,
466
+ renderer: __sfc_main$y,
457
467
  form: null,
458
468
  defaultContent: { source: { url: '', responsePath: '', userField: 'userId', nameField: 'displayName', countField: 'count' } },
459
469
  displayName: 'Team workload',
@@ -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 CnAiChatWidget from '../CnAiCompanion/CnAiChatWidget.vue'\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 CnEventsCard from '../CnEventsCard/CnEventsCard.vue'\nimport CnMacrosWidget from '../CnMacrosWidget/CnMacrosWidget.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 '../CnLinkedWidget/index.js'\nimport '../CnDeviceFramesWidget/index.js'\nimport '../CnGroupedCardsWidget/index.js'\nimport '../CnChecklistRunWidget/index.js'\nimport '../CnChecklistWidget/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 '../CnAttentionFlagWidget/index.js'\nimport '../CnStatusExplainerWidget/index.js'\nimport '../CnObjectPartiesWidget/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\n// The AI Chat Companion embedded in the page: the assistant as a tab or card\n// rather than the launcher's floating window (DqZaakAssistent).\nregisterDashboardWidget('ai-chat', {\n\trenderer: CnAiChatWidget,\n\tform: null,\n\tdefaultContent: { chatAppId: '' },\n\tdisplayName: 'Assistant',\n\ticon: 'Creation',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// The macros the record's schema declares, each run by a button\n// (DqZaakAssistent \"Macro's\").\nregisterDashboardWidget('macros', {\n\trenderer: CnMacrosWidget,\n\tform: null,\n\tdefaultContent: { description: '', emptyText: '' },\n\tdisplayName: 'Macros',\n\ticon: 'PlayBoxMultipleOutline',\n\tsurfaces: ['detail-page'],\n})\n\n// The appointments booked on a record that is not an object (a flow task),\n// read from a source or an endpoint.\nregisterDashboardWidget('events', {\n\trenderer: CnEventsCard,\n\tform: null,\n\tdefaultContent: { source: null, endpoint: '', emptyText: '' },\n\tdisplayName: 'Appointments',\n\ticon: 'CalendarClock',\n\tsurfaces: ['detail-page'],\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","CnAiChatWidget","CnMacrosWidget","CnEventsCard","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 CnAiChatWidget from '../CnAiCompanion/CnAiChatWidget.vue'\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 CnEventsCard from '../CnEventsCard/CnEventsCard.vue'\nimport CnMacrosWidget from '../CnMacrosWidget/CnMacrosWidget.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 CnSchemaRulesWidget from '../CnSchemaRulesWidget/CnSchemaRulesWidget.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 '../CnLinkedWidget/index.js'\nimport '../CnDeviceFramesWidget/index.js'\nimport '../CnGroupedCardsWidget/index.js'\nimport '../CnChecklistRunWidget/index.js'\nimport '../CnChecklistWidget/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 '../CnAttentionFlagWidget/index.js'\nimport '../CnStatusExplainerWidget/index.js'\nimport '../CnObjectPartiesWidget/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('schema-rules', {\n\trenderer: CnSchemaRulesWidget,\n\tform: null,\n\tdefaultContent: { register: '', schema: '', objectId: '' },\n\tdisplayName: 'Schema rules',\n\ticon: 'ScaleBalance',\n\tsurfaces: ['detail-page'],\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\n// The AI Chat Companion embedded in the page: the assistant as a tab or card\n// rather than the launcher's floating window (DqZaakAssistent).\nregisterDashboardWidget('ai-chat', {\n\trenderer: CnAiChatWidget,\n\tform: null,\n\tdefaultContent: { chatAppId: '' },\n\tdisplayName: 'Assistant',\n\ticon: 'Creation',\n\tsurfaces: ['detail-page'],\n\townsTitle: true,\n})\n\n// The macros the record's schema declares, each run by a button\n// (DqZaakAssistent \"Macro's\").\nregisterDashboardWidget('macros', {\n\trenderer: CnMacrosWidget,\n\tform: null,\n\tdefaultContent: { description: '', emptyText: '' },\n\tdisplayName: 'Macros',\n\ticon: 'PlayBoxMultipleOutline',\n\tsurfaces: ['detail-page'],\n})\n\n// The appointments booked on a record that is not an object (a flow task),\n// read from a source or an endpoint.\nregisterDashboardWidget('events', {\n\trenderer: CnEventsCard,\n\tform: null,\n\tdefaultContent: { source: null, endpoint: '', emptyText: '' },\n\tdisplayName: 'Appointments',\n\ticon: 'CalendarClock',\n\tsurfaces: ['detail-page'],\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","CnSchemaRulesWidget","CnPlanWidget","CnWorkQueue","CnDocumentReviewWidget","CnAiChatWidget","CnMacrosWidget","CnEventsCard","CnConversationWidget","CnStagesWidget","CnStagesWidgetForm","CnTabsWidget","CnTabsWidgetForm","CnWeekStripWidget","CnWeekStripWidgetForm","CnStackedBarWidget","CnStackedBarWidgetForm","CnTeamWorkloadWidget"],"mappings":"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"}
@@ -738,6 +738,14 @@ function readRowsPath(body, path) {
738
738
  return String(path).split('.').reduce((value, key) => (value && typeof value === 'object' ? value[key] : undefined), body)
739
739
  }
740
740
 
741
+ /**
742
+ * The `sourceConfig` keys the endpoint source reads itself; every other key
743
+ * goes along as a query parameter.
744
+ *
745
+ * @type {Array<string>}
746
+ */
747
+ const ENDPOINT_SOURCE_KEYS = ['url', 'rowsPath', 'totalPath', 'searchParam', 'searchFields', 'notePath', 'noteText', 'refusedText'];
748
+
741
749
  /**
742
750
  * The endpoint source: rows from an app's own endpoint
743
751
  * (`entitySource: "endpoint"`), for a list that is not OpenRegister objects,
@@ -760,25 +768,46 @@ function readRowsPath(body, path) {
760
768
  * request with that tab's filter, its total read at `sourceConfig.totalPath`
761
769
  * (`total` by default), else the number of rows the answer holds.
762
770
  *
771
+ * Three more keys shape what the page says around the rows:
772
+ * - `searchParam`: the page's search box sends its term as this parameter
773
+ * (`sender`), so the endpoint does the searching.
774
+ * - `notePath` and `noteText`: a value read off the answer (`filterOrder`) and
775
+ * the sentence it is said in ("Filters run in this order: {order}", its one
776
+ * placeholder taking the value); a list
777
+ * is joined with commas. Shown above the rows.
778
+ * - `refusedText`: what a refused load (403) says when the endpoint gave no
779
+ * `message` of its own. A refusal is not an empty list, so the page shows it
780
+ * instead of the rows, and a failed load is not one either.
781
+ * - `searchFields`: the filters the endpoint takes, in the same shape a
782
+ * registered source declares them (`{ status: { param: 'status', single:
783
+ * true } }`), so a filter strip or sidebar on the page narrows the
784
+ * endpoint's query.
785
+ *
786
+ * @param {object} [declared] The page's `sourceConfig`, for `searchParam` and `searchFields`.
787
+ * @param {object} [context] The page's helpers; `translate` is the app's catalogue.
763
788
  * @return {object} The source adapter.
764
789
  * @spec openspec/changes/index-endpoint-source/specs/index-page/spec.md#requirement-an-index-page-can-list-rows-from-an-app-endpoint
765
790
  */
766
- function endpointSource() {
767
- const state = reactive({ rows: [], loading: false });
791
+ function endpointSource(declared = {}, context = {}) {
792
+ const state = reactive({ rows: [], loading: false, refusal: '', failed: false, note: '' });
793
+ const translate$1 = typeof context.translate === 'function' ? context.translate : (text) => text;
794
+ const searchParam = typeof declared.searchParam === 'string' && declared.searchParam !== '' ? declared.searchParam : null;
795
+ const searchFields = declared.searchFields && typeof declared.searchFields === 'object' && !Array.isArray(declared.searchFields) ? declared.searchFields : null;
768
796
  let seq = 0;
769
797
  let warned = false;
770
798
 
771
799
  /**
772
- * The query parameters for a config: every key but the url and the paths,
773
- * empty values left out, a list joined by commas.
800
+ * The query parameters for a config: every key but the source's own
801
+ * (`url`, the paths, the texts), empty values left out, a list joined by
802
+ * commas.
774
803
  *
775
- * @param {object} rest The config without `url`, `rowsPath` and `totalPath`.
804
+ * @param {object} config The config.
776
805
  * @return {object} The parameters.
777
806
  */
778
- const paramsOf = (rest) => {
807
+ const paramsOf = (config) => {
779
808
  const params = {};
780
- for (const [key, value] of Object.entries(rest)) {
781
- if (value === undefined || value === null || value === '') {
809
+ for (const [key, value] of Object.entries(config)) {
810
+ if (ENDPOINT_SOURCE_KEYS.includes(key) || value === undefined || value === null || value === '') {
782
811
  continue
783
812
  }
784
813
  params[key] = Array.isArray(value) ? value.join(',') : (typeof value === 'object' ? JSON.stringify(value) : value);
@@ -798,15 +827,61 @@ function endpointSource() {
798
827
  return typeof url === 'string' && url !== '' && !Object.hasOwn(config, 'entitySource')
799
828
  };
800
829
 
830
+ /**
831
+ * The note read off an answer, in the page's sentence.
832
+ *
833
+ * @param {object} body The response body.
834
+ * @param {string} [path] Where the value sits.
835
+ * @param {string} [text] The sentence, with one `{placeholder}` where the value goes.
836
+ * @return {string} The note, or '' when there is nothing to say.
837
+ */
838
+ const noteOf = (body, path, text) => {
839
+ if (!path || !body || typeof body !== 'object' || Array.isArray(body)) {
840
+ return ''
841
+ }
842
+ const raw = readRowsPath(body, path);
843
+ const value = Array.isArray(raw) ? raw.filter((v) => v !== null && v !== undefined && v !== '').join(', ') : (raw === null || raw === undefined ? '' : String(raw));
844
+ if (value === '') {
845
+ return ''
846
+ }
847
+ return text ? translate$1(text).replace(/\{\w+\}/, value) : value
848
+ };
849
+
850
+ /**
851
+ * The sentence a refused load is said in: the endpoint's own, else the
852
+ * page's, else the library's.
853
+ *
854
+ * @param {object} body The refusal's body.
855
+ * @param {string} [text] The page's `refusedText`.
856
+ * @return {string} The sentence.
857
+ */
858
+ const refusalOf = (body, text) => {
859
+ if (body && typeof body.message === 'string' && body.message.trim() !== '') {
860
+ return body.message
861
+ }
862
+ return text ? translate$1(text) : translate('nextcloud-vue', 'You may not read this list.')
863
+ };
864
+
801
865
  return {
866
+ /**
867
+ * The parameter the page's search term is sent as, or null when this
868
+ * endpoint takes no search.
869
+ */
870
+ searchParam,
871
+
872
+ /**
873
+ * The page filters this endpoint takes, and the parameter each becomes.
874
+ */
875
+ searchFields,
876
+
802
877
  /**
803
878
  * Fetch the rows.
804
879
  *
805
880
  * @param {object} config The page's source config with the tab filter merged in.
806
- * @return {Promise<void>} Resolves when loaded; a failed request leaves no rows and rethrows.
881
+ * @return {Promise<void>} Resolves when loaded or refused; a failed request leaves no rows and rethrows.
807
882
  */
808
883
  load: async (config) => {
809
- const { url, rowsPath, totalPath, ...rest } = config || {};
884
+ const { url, rowsPath, notePath, noteText, refusedText } = config || {};
810
885
  const mine = ++seq;
811
886
  if (!requestable(config)) {
812
887
  state.rows = [];
@@ -818,7 +893,7 @@ function endpointSource() {
818
893
  }
819
894
  return
820
895
  }
821
- const params = paramsOf(rest);
896
+ const params = paramsOf(config);
822
897
  state.loading = true;
823
898
  try {
824
899
  const { default: axios } = await import('@nextcloud/axios');
@@ -827,12 +902,22 @@ function endpointSource() {
827
902
  const rows = Array.isArray(body) ? body : readRowsPath(body, rowsPath || 'results');
828
903
  if (mine === seq) {
829
904
  state.rows = Array.isArray(rows) ? rows : [];
905
+ state.refusal = '';
906
+ state.failed = false;
907
+ state.note = noteOf(body, notePath, noteText);
830
908
  }
831
909
  } catch (error) {
832
- if (mine === seq) {
833
- state.rows = [];
910
+ if (mine !== seq) {
911
+ return
912
+ }
913
+ state.rows = [];
914
+ state.note = '';
915
+ const refused = error && error.response && error.response.status === 403;
916
+ state.refusal = refused ? refusalOf(error.response.data, refusedText) : '';
917
+ state.failed = !refused;
918
+ if (!refused) {
919
+ throw error
834
920
  }
835
- throw error
836
921
  } finally {
837
922
  if (mine === seq) {
838
923
  state.loading = false;
@@ -851,9 +936,9 @@ function endpointSource() {
851
936
  if (!requestable(config)) {
852
937
  return Number.NaN
853
938
  }
854
- const { url, rowsPath, totalPath, ...rest } = config;
939
+ const { url, rowsPath, totalPath } = config;
855
940
  const { default: axios } = await import('@nextcloud/axios');
856
- const res = await axios.get(generateUrl(url), { params: paramsOf(rest) });
941
+ const res = await axios.get(generateUrl(url), { params: paramsOf(config) });
857
942
  const body = res ? res.data : null;
858
943
  const total = body && typeof body === 'object' && !Array.isArray(body) ? readRowsPath(body, totalPath || 'total') : undefined;
859
944
  if (typeof total === 'number' && Number.isFinite(total)) {
@@ -872,6 +957,21 @@ function endpointSource() {
872
957
  * @return {boolean} Whether a load is in flight.
873
958
  */
874
959
  loading: () => state.loading,
960
+
961
+ /**
962
+ * @return {string} The sentence the last load was refused with, or ''.
963
+ */
964
+ refusal: () => state.refusal,
965
+
966
+ /**
967
+ * @return {boolean} Whether the last load failed for another reason than a refusal.
968
+ */
969
+ failed: () => state.failed,
970
+
971
+ /**
972
+ * @return {string} The note read off the last answer, or ''.
973
+ */
974
+ note: () => state.note,
875
975
  }
876
976
  }
877
977