@conduction/nextcloud-vue 2.98.0 → 2.100.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 (141) hide show
  1. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +12 -0
  2. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +11 -2
  4. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  6. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +6 -1
  7. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +2 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  10. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue.js +1 -1
  11. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
  12. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +1 -1
  13. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
  14. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +25 -8
  15. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +7 -4
  17. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  19. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +11 -8
  20. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +13 -4
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  23. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  24. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +54 -3
  25. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  26. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +16 -2
  27. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  28. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue.js +1 -1
  29. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js +42 -7
  30. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js.map +1 -1
  31. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js +121 -57
  32. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js.map +1 -1
  33. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js +10 -0
  34. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js.map +1 -1
  35. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js +2 -1
  36. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js.map +1 -1
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +136 -7
  38. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  39. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  40. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js +1 -1
  41. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js +26 -7
  42. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js.map +1 -1
  43. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js +78 -17
  44. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js.map +1 -1
  45. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  46. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +68 -7
  47. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  48. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +256 -240
  49. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  50. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +9 -0
  51. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js.map +1 -0
  52. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js +265 -0
  53. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -0
  54. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +191 -0
  55. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -0
  56. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue.js +9 -0
  57. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue.js.map +1 -0
  58. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue2.js +537 -0
  59. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue2.js.map +1 -0
  60. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue3.js +99 -0
  61. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue3.js.map +1 -0
  62. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
  63. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +18 -70
  64. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
  65. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js +6 -44
  66. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
  67. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue.js +1 -1
  68. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +16 -2
  69. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  70. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +40 -25
  71. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  72. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  73. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  74. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue.js +1 -1
  75. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js +7 -7
  76. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js.map +1 -1
  77. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js.map +1 -1
  78. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js +9 -0
  79. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js.map +1 -0
  80. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js +472 -0
  81. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js.map +1 -0
  82. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js +231 -0
  83. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js.map +1 -0
  84. package/dist/esm/components/CnWorkingCalendarWidget/index.js +27 -0
  85. package/dist/esm/components/CnWorkingCalendarWidget/index.js.map +1 -0
  86. package/dist/esm/composables/useFlowStore.js +2 -1
  87. package/dist/esm/composables/useFlowStore.js.map +1 -1
  88. package/dist/esm/index.js +3 -0
  89. package/dist/esm/index.js.map +1 -1
  90. package/dist/esm/l10n/en.json.js +101 -1
  91. package/dist/esm/l10n/en.json.js.map +1 -1
  92. package/dist/esm/l10n/nl.json.js +115 -1
  93. package/dist/esm/l10n/nl.json.js.map +1 -1
  94. package/dist/esm/library-style.js +1 -1
  95. package/dist/esm/nextcloud-vue.css +999 -233
  96. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  97. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  98. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  99. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  100. package/dist/esm/utils/workingCalendarMonth.js +85 -0
  101. package/dist/esm/utils/workingCalendarMonth.js.map +1 -0
  102. package/dist/nextcloud-vue.cjs.js +10314 -7778
  103. package/dist/nextcloud-vue.cjs.js.map +2 -2
  104. package/dist/nextcloud-vue.css +999 -233
  105. package/l10n/en.json +101 -1
  106. package/l10n/nl.json +115 -1
  107. package/package.json +1 -1
  108. package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -1
  109. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +7 -1
  110. package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +1 -0
  111. package/src/components/CnDetailPage/CnDetailPage.vue +29 -9
  112. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +13 -4
  113. package/src/components/CnFactsWidget/CnFactsWidget.vue +65 -3
  114. package/src/components/CnFlowsPage/CnFlowBoard.vue +77 -2
  115. package/src/components/CnFlowsPage/CnFlowEditorPage.vue +11 -0
  116. package/src/components/CnIndexPage/CnIndexPage.vue +136 -7
  117. package/src/components/CnOrderedListField/CnOrderedListField.vue +81 -9
  118. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +114 -7
  119. package/src/components/CnSettingsField/CnSettingsField.vue +449 -0
  120. package/src/components/CnSettingsField/index.js +4 -0
  121. package/src/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue +642 -0
  122. package/src/components/CnSettingsFieldsSection/index.js +4 -0
  123. package/src/components/CnSettingsPage/CnSettingsPage.vue +6 -86
  124. package/src/components/CnSetupWizard/CnSetupWizard.vue +37 -3
  125. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  126. package/src/components/CnWizardDialog/CnWizardDialog.vue +7 -7
  127. package/src/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue +725 -0
  128. package/src/components/CnWorkingCalendarWidget/index.js +26 -0
  129. package/src/components/index.js +3 -0
  130. package/src/composables/useFlowStore.js +2 -1
  131. package/src/css/badge.css +32 -16
  132. package/src/css/detail-page.css +15 -0
  133. package/src/css/dialog.css +48 -0
  134. package/src/css/look-board-detail.css +80 -8
  135. package/src/css/look-board-index.css +52 -8
  136. package/src/css/look-board.css +301 -1
  137. package/src/index.js +3 -0
  138. package/src/schemas/app-manifest-v2.schema.json +25 -1
  139. package/src/utils/libraryWidgetKeys.js +1 -0
  140. package/src/utils/validateManifestV2.compiled.js +3 -3
  141. package/src/utils/workingCalendarMonth.js +82 -0
package/l10n/en.json CHANGED
@@ -1604,7 +1604,103 @@
1604
1604
  "Suspended": "Suspended",
1605
1605
  "Deprovisioning": "Deprovisioning",
1606
1606
  "Archived": "Archived",
1607
- "Retained": "Retained"
1607
+ "Retained": "Retained",
1608
+ "A flow runs a series of steps when something happens — an object changes, a schedule fires, or you run it yourself.": "A flow runs a series of steps when something happens — an object changes, a schedule fires, or you run it yourself.",
1609
+ "Schedule": "Schedule",
1610
+ "Enabled, but has no owner — it will not start": "Enabled, but has no owner — it will not start",
1611
+ "Enabled": "Enabled",
1612
+ "{context}, step {step} of {total}": "{context}, step {step} of {total}",
1613
+ "completed": "completed",
1614
+ "Runs": "Runs",
1615
+ "Save the flow first — an unsaved flow has never run.": "Save the flow first — an unsaved flow has never run.",
1616
+ "This flow has never run.": "This flow has never run.",
1617
+ "Create draft version": "Create draft version",
1618
+ "Deprecate": "Deprecate",
1619
+ "Published": "Published",
1620
+ "Arrange steps automatically": "Arrange steps automatically",
1621
+ "Undo the last change": "Undo the last change",
1622
+ "Opening the run": "Opening the run",
1623
+ "Zoom out": "Zoom out",
1624
+ "Reset zoom": "Reset zoom",
1625
+ "Zoom in": "Zoom in",
1626
+ "Show the flow controls": "Show the flow controls",
1627
+ "A field this step asks for is no longer available in the schema.": "A field this step asks for is no longer available in the schema.",
1628
+ "Form out of date": "Form out of date",
1629
+ "The engine does not know this node type, so this step will fail when the flow runs.": "The engine does not know this node type, so this step will fail when the flow runs.",
1630
+ "Unknown step": "Unknown step",
1631
+ "No steps yet": "No steps yet",
1632
+ "Add a step from the sidebar to start building this flow.": "Add a step from the sidebar to start building this flow.",
1633
+ "Flow run": "Flow run",
1634
+ "Flow editor": "Flow editor",
1635
+ "Loading the flow": "Loading the flow",
1636
+ "Reading the run and the graph it used.": "Reading the run and the graph it used.",
1637
+ "Reading the steps of this flow.": "Reading the steps of this flow.",
1638
+ "You are looking at a stored version. Go back to the flow to edit and save it.": "You are looking at a stored version. Go back to the flow to edit and save it.",
1639
+ "A published flow cannot be edited. Create a draft to change it.": "A published flow cannot be edited. Create a draft to change it.",
1640
+ "This line is already drawn this way.": "This line is already drawn this way.",
1641
+ "Edit label": "Edit label",
1642
+ "Paste style": "Paste style",
1643
+ "This flow cannot run yet.": "This flow cannot run yet.",
1644
+ "This flow can run, with warnings.": "This flow can run, with warnings.",
1645
+ "This flow looks runnable.": "This flow looks runnable.",
1646
+ "The last action failed.": "The last action failed.",
1647
+ "This flow has no trigger and no end step, so it cannot start or finish.": "This flow has no trigger and no end step, so it cannot start or finish.",
1648
+ "This flow has no trigger, so nothing will start it.": "This flow has no trigger, so nothing will start it.",
1649
+ "This flow has no end step, so a run can never finish.": "This flow has no end step, so a run can never finish.",
1650
+ "This version is published and cannot be changed. Create a draft to make changes; the published version keeps running until you publish the draft.": "This version is published and cannot be changed. Create a draft to make changes; the published version keeps running until you publish the draft.",
1651
+ "Only a draft version can be published.": "Only a draft version can be published.",
1652
+ "Only a published version can be deprecated.": "Only a published version can be deprecated.",
1653
+ "This flow has no published version, so it cannot run. Publish a version first.": "This flow has no published version, so it cannot run. Publish a version first.",
1654
+ "This version cannot be published while a step has nowhere to send its work.": "This version cannot be published while a step has nowhere to send its work.",
1655
+ "This version cannot be removed while a run is still using it.": "This version cannot be removed while a run is still using it.",
1656
+ "That change was refused by the flow's current state.": "That change was refused by the flow's current state.",
1657
+ "This flow could not be found. It may have been deleted, or you may not have access to it.": "This flow could not be found. It may have been deleted, or you may not have access to it.",
1658
+ "This version is read-only. Create a draft to change its steps; the published version keeps running until you publish the draft.": "This version is read-only. Create a draft to change its steps; the published version keeps running until you publish the draft.",
1659
+ "The list of available steps could not be read, so no steps can be added. This does not mean the instance has none.": "The list of available steps could not be read, so no steps can be added. This does not mean the instance has none.",
1660
+ "This flow has no owner yet, so a trigger will not start it. Saving it makes you its owner.": "This flow has no owner yet, so a trigger will not start it. Saving it makes you its owner.",
1661
+ "This flow has unsaved changes.": "This flow has unsaved changes.",
1662
+ "This is version {version} of the flow, the graph this run used. Go back to the flow to edit it.": "This is version {version} of the flow, the graph this run used. Go back to the flow to edit it.",
1663
+ "This run used version {version} of the flow. You have unsaved changes, so it is replayed over your current graph instead. Save or undo your changes to see the graph it used.": "This run used version {version} of the flow. You have unsaved changes, so it is replayed over your current graph instead. Save or undo your changes to see the graph it used.",
1664
+ "Version {version} of this flow could not be read, so the run is replayed over the current graph. Read the run steps in the sidebar for what actually ran.": "Version {version} of this flow could not be read, so the run is replayed over the current graph. Read the run steps in the sidebar for what actually ran.",
1665
+ "Some steps of this run belong to nodes that are no longer on the canvas, so they were skipped: {nodes}": "Some steps of this run belong to nodes that are no longer on the canvas, so they were skipped: {nodes}",
1666
+ "The form of step \"{step}\" asks for fields the schema no longer offers: {fields}": "The form of step \"{step}\" asks for fields the schema no longer offers: {fields}",
1667
+ "is no longer in the schema": "is no longer in the schema",
1668
+ "is read-only in the schema": "is read-only in the schema",
1669
+ "is hidden in the schema": "is hidden in the schema",
1670
+ "not configured": "not configured",
1671
+ "Objects this run is about": "Objects this run is about",
1672
+ "Changed by this run": "Changed by this run",
1673
+ "at {node}": "at {node}",
1674
+ "The flows could not be loaded. This does not mean there are none.": "The flows could not be loaded. This does not mean there are none.",
1675
+ "No flows yet": "No flows yet",
1676
+ "App": "App",
1677
+ "Set up this app": "Set up this app",
1678
+ "Finish": "Finish",
1679
+ "Setup complete.": "Setup complete.",
1680
+ "Select \"{step}\" first.": "Select \"{step}\" first.",
1681
+ "Please make a selection to continue.": "Please make a selection to continue.",
1682
+ "Please run this step before continuing.": "Please run this step before continuing.",
1683
+ "Stored. Type a new value to replace it.": "Stored. Type a new value to replace it.",
1684
+ "Unsaved changes": "Unsaved changes",
1685
+ "The settings could not be loaded: {reason}": "The settings could not be loaded: {reason}",
1686
+ "{field} is required.": "{field} is required.",
1687
+ "{field} is not in the right form.": "{field} is not in the right form.",
1688
+ "{field} must be a number.": "{field} must be a number.",
1689
+ "{field} must be at least {min}.": "{field} must be at least {min}.",
1690
+ "{field} must be at most {max}.": "{field} must be at most {max}.",
1691
+ "Check the marked fields.": "Check the marked fields.",
1692
+ "The settings could not be saved: {reason}": "The settings could not be saved: {reason}",
1693
+ "This value could not be loaded: {reason}": "This value could not be loaded: {reason}",
1694
+ "{fields}: {reason}": "{fields}: {reason}",
1695
+ "Current {name}": "Current {name}",
1696
+ "Upload {name}": "Upload {name}",
1697
+ "The image could not be uploaded: {reason}": "The image could not be uploaded: {reason}",
1698
+ "The saved flow runs once with the record you pick as its subject.": "The saved flow runs once with the record you pick as its subject.",
1699
+ "Record": "Record",
1700
+ "Run test": "Run test",
1701
+ "Test with a record": "Test with a record",
1702
+ "admin": "admin",
1703
+ "Wizard": "Wizard"
1608
1704
  },
1609
1705
  "plurals": {
1610
1706
  "{count} selected": [
@@ -1698,6 +1794,10 @@
1698
1794
  "And %n more type in this group.": [
1699
1795
  "And %n more type in this group.",
1700
1796
  "And %n more types in this group."
1797
+ ],
1798
+ "Showing %n flow": [
1799
+ "Showing %n flow",
1800
+ "Showing %n flows"
1701
1801
  ]
1702
1802
  }
1703
1803
  }
package/l10n/nl.json CHANGED
@@ -1805,7 +1805,117 @@
1805
1805
  "Suspended": "Opgeschort",
1806
1806
  "Deprovisioning": "Wordt opgeheven",
1807
1807
  "Archived": "Gearchiveerd",
1808
- "Retained": "Bewaard"
1808
+ "Retained": "Bewaard",
1809
+ "A flow runs a series of steps when something happens — an object changes, a schedule fires, or you run it yourself.": "Een flow voert een reeks stappen uit als er iets gebeurt: een object verandert, een schema gaat af of je start hem zelf.",
1810
+ "Schedule": "Schema",
1811
+ "Enabled, but has no owner — it will not start": "Aan, maar zonder eigenaar: hij start niet",
1812
+ "Enabled": "Aan",
1813
+ "{context}, step {step} of {total}": "{context}, stap {step} van {total}",
1814
+ "completed": "afgerond",
1815
+ "Runs": "Uitvoeringen",
1816
+ "Save the flow first — an unsaved flow has never run.": "Sla de flow eerst op. Een flow die niet is opgeslagen, heeft nooit gedraaid.",
1817
+ "This flow has never run.": "Deze flow heeft nog nooit gedraaid.",
1818
+ "Create draft version": "Conceptversie maken",
1819
+ "Deprecate": "Uitfaseren",
1820
+ "Published": "Gepubliceerd",
1821
+ "Arrange steps automatically": "Stappen automatisch ordenen",
1822
+ "Undo the last change": "Laatste wijziging ongedaan maken",
1823
+ "Opening the run": "De uitvoering openen",
1824
+ "Zoom out": "Uitzoomen",
1825
+ "Reset zoom": "Zoom herstellen",
1826
+ "Zoom in": "Inzoomen",
1827
+ "Show the flow controls": "Toon de knoppen van de flow",
1828
+ "A field this step asks for is no longer available in the schema.": "Een veld dat deze stap vraagt, staat niet meer in het schema.",
1829
+ "Form out of date": "Formulier verouderd",
1830
+ "The engine does not know this node type, so this step will fail when the flow runs.": "De engine kent dit soort stap niet. Deze stap mislukt dus als de flow draait.",
1831
+ "Unknown step": "Onbekende stap",
1832
+ "No steps yet": "Nog geen stappen",
1833
+ "Add a step from the sidebar to start building this flow.": "Voeg een stap toe vanuit de zijbalk om deze flow te bouwen.",
1834
+ "Flow run": "Uitvoering van de flow",
1835
+ "Flow editor": "Flow-editor",
1836
+ "Loading the flow": "De flow laden",
1837
+ "Reading the run and the graph it used.": "De uitvoering en de gebruikte stappen worden gelezen.",
1838
+ "Reading the steps of this flow.": "De stappen van deze flow worden gelezen.",
1839
+ "You are looking at a stored version. Go back to the flow to edit and save it.": "Je bekijkt een opgeslagen versie. Ga terug naar de flow om te wijzigen en op te slaan.",
1840
+ "A published flow cannot be edited. Create a draft to change it.": "Een gepubliceerde flow kun je niet wijzigen. Maak een concept om hem te veranderen.",
1841
+ "This line is already drawn this way.": "Deze lijn is al zo getekend.",
1842
+ "Edit label": "Label bewerken",
1843
+ "Paste style": "Stijl plakken",
1844
+ "This flow cannot run yet.": "Deze flow kan nog niet draaien.",
1845
+ "This flow can run, with warnings.": "Deze flow kan draaien, met waarschuwingen.",
1846
+ "This flow looks runnable.": "Deze flow lijkt klaar om te draaien.",
1847
+ "The last action failed.": "De laatste actie is mislukt.",
1848
+ "This flow has no trigger and no end step, so it cannot start or finish.": "Deze flow heeft geen start en geen eindstap. Hij kan dus niet beginnen of eindigen.",
1849
+ "This flow has no trigger, so nothing will start it.": "Deze flow heeft geen start, dus niets zet hem in gang.",
1850
+ "This flow has no end step, so a run can never finish.": "Deze flow heeft geen eindstap, dus een uitvoering wordt nooit afgerond.",
1851
+ "This version is published and cannot be changed. Create a draft to make changes; the published version keeps running until you publish the draft.": "Deze versie is gepubliceerd en kan niet veranderen. Maak een concept om te wijzigen. De gepubliceerde versie blijft draaien tot je het concept publiceert.",
1852
+ "Only a draft version can be published.": "Alleen een conceptversie kun je publiceren.",
1853
+ "Only a published version can be deprecated.": "Alleen een gepubliceerde versie kun je uitfaseren.",
1854
+ "This flow has no published version, so it cannot run. Publish a version first.": "Deze flow heeft geen gepubliceerde versie en kan dus niet draaien. Publiceer eerst een versie.",
1855
+ "This version cannot be published while a step has nowhere to send its work.": "Je kunt deze versie niet publiceren zolang een stap zijn werk nergens heen kan sturen.",
1856
+ "This version cannot be removed while a run is still using it.": "Je kunt deze versie niet verwijderen zolang een uitvoering hem nog gebruikt.",
1857
+ "That change was refused by the flow's current state.": "De flow staat die wijziging in zijn huidige toestand niet toe.",
1858
+ "This flow could not be found. It may have been deleted, or you may not have access to it.": "Deze flow is niet gevonden. Misschien is hij verwijderd, of heb je er geen toegang toe.",
1859
+ "This version is read-only. Create a draft to change its steps; the published version keeps running until you publish the draft.": "Deze versie is alleen-lezen. Maak een concept om de stappen te wijzigen. De gepubliceerde versie blijft draaien tot je het concept publiceert.",
1860
+ "The list of available steps could not be read, so no steps can be added. This does not mean the instance has none.": "De lijst met beschikbare stappen kon niet worden gelezen, dus je kunt geen stappen toevoegen. Dat betekent niet dat er geen zijn.",
1861
+ "This flow has no owner yet, so a trigger will not start it. Saving it makes you its owner.": "Deze flow heeft nog geen eigenaar, dus een start zet hem niet in gang. Als je hem opslaat, word jij de eigenaar.",
1862
+ "This flow has unsaved changes.": "Deze flow heeft wijzigingen die nog niet zijn opgeslagen.",
1863
+ "This is version {version} of the flow, the graph this run used. Go back to the flow to edit it.": "Dit is versie {version} van de flow, de stappen die deze uitvoering gebruikte. Ga terug naar de flow om hem te wijzigen.",
1864
+ "This run used version {version} of the flow. You have unsaved changes, so it is replayed over your current graph instead. Save or undo your changes to see the graph it used.": "Deze uitvoering gebruikte versie {version} van de flow. Je hebt wijzigingen die nog niet zijn opgeslagen. Daarom wordt hij over je huidige stappen afgespeeld. Sla je wijzigingen op of maak ze ongedaan om de gebruikte stappen te zien.",
1865
+ "Version {version} of this flow could not be read, so the run is replayed over the current graph. Read the run steps in the sidebar for what actually ran.": "Versie {version} van deze flow kon niet worden gelezen. Daarom wordt de uitvoering over de huidige stappen afgespeeld. Wat echt draaide, lees je in de stappen in de zijbalk.",
1866
+ "Some steps of this run belong to nodes that are no longer on the canvas, so they were skipped: {nodes}": "Sommige stappen van deze uitvoering horen bij stappen die niet meer op het canvas staan. Die zijn overgeslagen: {nodes}",
1867
+ "The form of step \"{step}\" asks for fields the schema no longer offers: {fields}": "Het formulier van stap \"{step}\" vraagt velden die niet meer in het schema staan: {fields}",
1868
+ "is no longer in the schema": "staat niet meer in het schema",
1869
+ "is read-only in the schema": "is alleen-lezen in het schema",
1870
+ "is hidden in the schema": "is verborgen in het schema",
1871
+ "not configured": "niet ingesteld",
1872
+ "Objects this run is about": "Objecten waar deze uitvoering over gaat",
1873
+ "Changed by this run": "Gewijzigd door deze uitvoering",
1874
+ "at {node}": "bij {node}",
1875
+ "The flows could not be loaded. This does not mean there are none.": "De flows konden niet worden geladen. Dat betekent niet dat er geen zijn.",
1876
+ "No flows yet": "Nog geen flows",
1877
+ "App": "App",
1878
+ "Set up this app": "Deze app instellen",
1879
+ "Setup complete.": "Instellen is klaar.",
1880
+ "Select \"{step}\" first.": "Kies eerst \"{step}\".",
1881
+ "Please make a selection to continue.": "Maak een keuze om verder te gaan.",
1882
+ "Please run this step before continuing.": "Voer deze stap uit voor je verdergaat.",
1883
+ "Stored. Type a new value to replace it.": "Opgeslagen. Typ een nieuwe waarde om die te vervangen.",
1884
+ "Unsaved changes": "Niet-opgeslagen wijzigingen",
1885
+ "The settings could not be loaded: {reason}": "De instellingen konden niet worden geladen: {reason}",
1886
+ "{field} is required.": "{field} is verplicht.",
1887
+ "{field} is not in the right form.": "{field} heeft niet de juiste vorm.",
1888
+ "{field} must be a number.": "{field} moet een getal zijn.",
1889
+ "{field} must be at least {min}.": "{field} moet minstens {min} zijn.",
1890
+ "{field} must be at most {max}.": "{field} mag hoogstens {max} zijn.",
1891
+ "Check the marked fields.": "Controleer de gemarkeerde velden.",
1892
+ "The settings could not be saved: {reason}": "De instellingen konden niet worden opgeslagen: {reason}",
1893
+ "This value could not be loaded: {reason}": "Deze waarde kon niet worden geladen: {reason}",
1894
+ "{fields}: {reason}": "{fields}: {reason}",
1895
+ "Current {name}": "Huidige {name}",
1896
+ "Upload {name}": "{name} uploaden",
1897
+ "The image could not be uploaded: {reason}": "De afbeelding kon niet worden geüpload: {reason}",
1898
+ "Previous month": "Vorige maand",
1899
+ "Next month": "Volgende maand",
1900
+ "Add day": "Dag toevoegen",
1901
+ "No working calendar found.": "Geen werkkalender gevonden.",
1902
+ "Holidays could not be read. Only the days added by hand are shown.": "De feestdagen konden niet worden gelezen. Alleen de met de hand toegevoegde dagen staan erin.",
1903
+ "The working calendar could not be loaded.": "De werkkalender kon niet worden geladen.",
1904
+ "{date}, closed: {name}": "{date}, gesloten: {name}",
1905
+ "{date}, closed": "{date}, gesloten",
1906
+ "{date}, working day": "{date}, werkdag",
1907
+ "{date}, not a working day": "{date}, geen werkdag",
1908
+ "Day added by hand": "Met de hand toegevoegde dag",
1909
+ "Day added.": "Dag toegevoegd.",
1910
+ "Only an administrator can change the working calendar.": "Alleen een beheerder kan de werkkalender wijzigen.",
1911
+ "The day could not be added. Try again.": "De dag kon niet worden toegevoegd. Probeer het opnieuw.",
1912
+ "Loading …": "Laden …",
1913
+ "The saved flow runs once with the record you pick as its subject.": "De opgeslagen flow draait één keer met het record dat u kiest als onderwerp.",
1914
+ "Record": "Record",
1915
+ "Run test": "Test uitvoeren",
1916
+ "Test with a record": "Testen met een record",
1917
+ "admin": "beheerder",
1918
+ "Wizard": "Assistent"
1809
1919
  },
1810
1920
  "plurals": {
1811
1921
  "{count} selected": [
@@ -1899,6 +2009,10 @@
1899
2009
  "And %n more type in this group.": [
1900
2010
  "En nog %n soort in deze groep.",
1901
2011
  "En nog %n soorten in deze groep."
2012
+ ],
2013
+ "Showing %n flow": [
2014
+ "%n flow",
2015
+ "%n flows"
1902
2016
  ]
1903
2017
  }
1904
2018
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.98.0",
3
+ "version": "2.100.0",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -30,7 +30,8 @@
30
30
  :data-testid="`${testidBase}-actions`"
31
31
  @update:open="menuOpen = $event">
32
32
  <template #icon>
33
- <DotsHorizontal :size="20" />
33
+ <ChevronDown v-if="trailingChevron" :size="14" />
34
+ <DotsHorizontal v-else :size="20" />
34
35
  </template>
35
36
  <!-- @slot lead-items Items rendered at the very top of the menu, above Refresh: the tabs a board strip lists here instead of drawing them (CnTabsWidget). The caller owns any separator after them. -->
36
37
  <slot name="lead-items" />
@@ -127,6 +128,7 @@ import { translate as t } from '@nextcloud/l10n'
127
128
  import { NcActionButton, NcActionLink, NcActions, NcLoadingIcon } from '@nextcloud/vue'
128
129
  import BookOpenVariant from 'vue-material-design-icons/BookOpenVariant.vue'
129
130
  import BugOutline from 'vue-material-design-icons/BugOutline.vue'
131
+ import ChevronDown from 'vue-material-design-icons/ChevronDown.vue'
130
132
  import DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue'
131
133
  import LightbulbOutline from 'vue-material-design-icons/LightbulbOutline.vue'
132
134
  import Refresh from 'vue-material-design-icons/Refresh.vue'
@@ -248,6 +250,7 @@ export default {
248
250
  NcActionButton,
249
251
  NcActionLink,
250
252
  NcLoadingIcon,
253
+ ChevronDown,
251
254
  DotsHorizontal,
252
255
  Refresh,
253
256
  LightbulbOutline,
@@ -487,6 +490,16 @@ export default {
487
490
  default: () => t('nextcloud-vue', 'Request a feature'),
488
491
  },
489
492
 
493
+ /**
494
+ * Draw a 14px chevron after the label instead of the dots before it:
495
+ * the board's "Meer" menu in a detail header (DqZaak). The board look
496
+ * puts the icon after the label; the Nextcloud look keeps it first.
497
+ */
498
+ trailingChevron: {
499
+ type: Boolean,
500
+ default: false,
501
+ },
502
+
490
503
  /** Pre-translated aria-label / tooltip for the overflow trigger. */
491
504
  actionsMenuLabel: {
492
505
  type: String,
@@ -218,6 +218,7 @@
218
218
  <CnSetupWizard
219
219
  v-if="showSetup && setupWizardOpen"
220
220
  :appId="appId"
221
+ :appName="appName"
221
222
  :steps="setupSteps"
222
223
  @complete="setupWizardOpen = false"
223
224
  @close="setupWizardOpen = false" />
@@ -231,7 +232,7 @@ import { loadState } from '@nextcloud/initial-state'
231
232
  import { translate as t } from '@nextcloud/l10n'
232
233
  import { generateUrl } from '@nextcloud/router'
233
234
  import { NcButton, NcLoadingIcon, NcSettingsSection } from '@nextcloud/vue'
234
- import { computed, provide } from 'vue'
235
+ import { computed, inject, provide } from 'vue'
235
236
  import AutoFix from 'vue-material-design-icons/AutoFix.vue'
236
237
  import BookOpenVariant from 'vue-material-design-icons/BookOpenVariant.vue'
237
238
  import HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue'
@@ -772,6 +773,11 @@ export default {
772
773
  // Everything inside the shell, its own version card and the app's
773
774
  // sections alike, follows the shell's look without the app providing it.
774
775
  provide('cnLook', look)
776
+ // The setup wizard translates its step titles and bodies through
777
+ // `cnTranslate`. On an admin page no CnAppRoot provides it, so the
778
+ // shell hands down the app's own catalog, keyed by its app id.
779
+ const hostTranslate = inject('cnTranslate', null)
780
+ provide('cnTranslate', hostTranslate || ((text, vars) => t(props.appId, text, vars)))
775
781
  return { environmentName, isBoard, ownLookClass }
776
782
  },
777
783
 
@@ -19,6 +19,7 @@
19
19
  v-if="crumbs.length > 0"
20
20
  :aria-label="ariaLabel"
21
21
  :rootIcon="rootText ? '' : undefined"
22
+ class="cn-breadcrumbs"
22
23
  :class="{ 'cn-breadcrumbs--text-separator': separator !== '' }"
23
24
  :style="separatorStyle"
24
25
  data-testid="cn-breadcrumbs">
@@ -379,6 +379,7 @@
379
379
  :showDocumentation="showDocumentation && menuShowsHelpLinks"
380
380
  :actionsMenuLabel="boardMenuLabel"
381
381
  :variant="isBoard ? 'secondary' : undefined"
382
+ :trailingChevron="isBoard"
382
383
  :hasPrimaryItems="headerMenuGroups.length > 0 || showMarkUnread || showOpenSidebar"
383
384
  :documentationUrl="documentationUrl"
384
385
  :docsAnchor="resolvedPageId"
@@ -413,7 +414,8 @@
413
414
  :key="`${entry.id}-link`"
414
415
  :href="entry.href"
415
416
  :target="entry.linkTarget || undefined"
416
- :data-testid="entry.testid">
417
+ :data-testid="entry.testid"
418
+ :data-cn-admin-tag="adminTagFor(group)">
417
419
  <template v-if="entry.iconName || entry.iconClass" #icon>
418
420
  <CnIcon v-if="entry.iconName" :name="entry.iconName" :size="20" />
419
421
  <span v-else :class="entry.iconClass" />
@@ -427,6 +429,7 @@
427
429
  :disabled="entry.disabled"
428
430
  :aria-pressed="entry.pressed === null ? null : String(entry.pressed)"
429
431
  :closeAfterClick="true"
432
+ :data-cn-admin-tag="adminTagFor(group)"
430
433
  @click="entry.run()">
431
434
  <template v-if="entry.iconName || entry.iconClass" #icon>
432
435
  <CnIcon v-if="entry.iconName" :name="entry.iconName" :size="20" />
@@ -2442,13 +2445,15 @@ export default {
2442
2445
 
2443
2446
  /**
2444
2447
  * What the Actions menu itself shows (manifest `config.actionsMenu`):
2445
- * `{ showRefresh?, showHelpLinks?, label? }`. `showRefresh: false`
2446
- * removes Refresh. `showHelpLinks: false` removes Request a feature,
2447
- * Report a bug and Documentation, for an app that offers them in its
2448
- * own help menu. `label` names the menu, for example "More". `null`
2449
- * (the default) changes nothing.
2448
+ * `{ showRefresh?, showHelpLinks?, showMarkUnread?, showOpenSidebar?, label? }`.
2449
+ * `showRefresh: false` removes Refresh. `showHelpLinks: false` removes
2450
+ * Request a feature, Report a bug and Documentation, for an app that
2451
+ * offers them in its own help menu. `showMarkUnread: false` and
2452
+ * `showOpenSidebar: false` remove those two built-in entries, for a
2453
+ * menu the board draws without them (DqZaakMeer). `label` names the
2454
+ * menu, for example "More". `null` (the default) changes nothing.
2450
2455
  *
2451
- * @type {{showRefresh?: boolean, showHelpLinks?: boolean, label?: string}|null}
2456
+ * @type {{showRefresh?: boolean, showHelpLinks?: boolean, showMarkUnread?: boolean, showOpenSidebar?: boolean, label?: string}|null}
2452
2457
  */
2453
2458
  actionsMenu: {
2454
2459
  type: Object,
@@ -4172,7 +4177,8 @@ export default {
4172
4177
  * @spec openspec/changes/record-unread-markers/tasks.md#task-2
4173
4178
  */
4174
4179
  showMarkUnread() {
4175
- return typeof this.resolvedSelf.unread === 'boolean'
4180
+ return this.actionsMenu?.showMarkUnread !== false
4181
+ && typeof this.resolvedSelf.unread === 'boolean'
4176
4182
  && this.register !== '' && this.schema !== '' && this.objectId !== ''
4177
4183
  },
4178
4184
 
@@ -4184,7 +4190,8 @@ export default {
4184
4190
  * @return {boolean}
4185
4191
  */
4186
4192
  showOpenSidebar() {
4187
- return this.isBoard && this.hasExternalSidebar && this.sidebarActive && this.objectSidebarState.open !== true
4193
+ return this.actionsMenu?.showOpenSidebar !== false
4194
+ && this.isBoard && this.hasExternalSidebar && this.sidebarActive && this.objectSidebarState.open !== true
4188
4195
  },
4189
4196
 
4190
4197
  /** @return {string} Label of the Open sidebar entry. */
@@ -4932,6 +4939,19 @@ export default {
4932
4939
  },
4933
4940
 
4934
4941
  methods: {
4942
+ /**
4943
+ * The tag after an admin-only entry in the board look ("beheerder",
4944
+ * DqZaakMeer), or null for any other entry or look. It is drawn by
4945
+ * detail-page.css from the attribute, since the menu renders its
4946
+ * entries' text as plain text.
4947
+ *
4948
+ * @param {{key: string}} group The menu group the entry is in.
4949
+ * @return {string|null} The tag, or null.
4950
+ */
4951
+ adminTagFor(group) {
4952
+ return this.isBoard && group && group.key === 'cn-admin' ? t('nextcloud-vue', 'admin') : null
4953
+ },
4954
+
4935
4955
  /**
4936
4956
  * Open the object sidebar through the shared channel.
4937
4957
  *
@@ -184,8 +184,14 @@
184
184
  <CnIcon :name="widget.icon" :size="20" />
185
185
  </template>
186
186
  <!-- A renderer that reports its own header (`header` event:
187
- `{ link, note }`, e.g. record-list's "3 in totaal"). -->
188
- <template v-if="rendererHeader.note || rendererHeader.action" #actions>
187
+ `{ link, note, action, pill }`, e.g. record-list's "3 in totaal",
188
+ a facts card's status pill). -->
189
+ <template v-if="rendererHeader.note || rendererHeader.action || rendererHeader.pill" #actions>
190
+ <CnStatusBadge
191
+ v-if="rendererHeader.pill"
192
+ :label="rendererHeader.pill.label"
193
+ :variant="rendererHeader.pill.variant"
194
+ data-testid="cn-detail-widget-header-pill" />
189
195
  <span
190
196
  v-if="rendererHeader.note"
191
197
  class="cn-detail-page__catalog-note"
@@ -298,6 +304,7 @@ import CnObjectDataWidget from '../CnObjectDataWidget/CnObjectDataWidget.vue'
298
304
  import CnObjectFilesWidget from '../CnObjectFilesWidget/CnObjectFilesWidget.vue'
299
305
  import CnObjectGeoWidget from '../CnObjectGeoWidget/CnObjectGeoWidget.vue'
300
306
  import CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'
307
+ import CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'
301
308
  import { useIntegrationRegistry } from '../../composables/useIntegrationRegistry.js'
302
309
  import { normalizeLook } from '../../composables/useLook.js'
303
310
  import { isAppInstalled } from '../../utils/appInstalled.js'
@@ -376,6 +383,7 @@ export default {
376
383
  CnObjectDataWidget,
377
384
  CnObjectGeoWidget,
378
385
  CnRelatedObjectsWidget,
386
+ CnStatusBadge,
379
387
  CnWidgetWrapper,
380
388
  NcActionButton,
381
389
  CnEmptyContent,
@@ -631,7 +639,7 @@ export default {
631
639
  * `header` event (screens-relation-pages): a link and a note,
632
640
  * with the list's total already filled in.
633
641
  */
634
- rendererHeader: { link: null, note: '', action: null },
642
+ rendererHeader: { link: null, note: '', action: null, pill: null },
635
643
  }
636
644
  },
637
645
 
@@ -1218,7 +1226,8 @@ export default {
1218
1226
  const link = header && header.link && typeof header.link === 'object' ? header.link : null
1219
1227
  const note = header && typeof header.note === 'string' ? header.note : ''
1220
1228
  const action = header && header.action && typeof header.action.run === 'function' && header.action.label ? header.action : null
1221
- this.rendererHeader = { link, note, action }
1229
+ const pill = header && header.pill && typeof header.pill.label === 'string' && header.pill.label !== '' ? header.pill : null
1230
+ this.rendererHeader = { link, note, action, pill }
1222
1231
  },
1223
1232
 
1224
1233
  /**
@@ -132,6 +132,13 @@
132
132
  </div>
133
133
  </template>
134
134
  </template>
135
+ <NcNoteCard
136
+ v-if="notice && record"
137
+ :type="notice.type"
138
+ class="cn-facts-widget__notice"
139
+ data-testid="cn-facts-notice">
140
+ {{ notice.text }}
141
+ </NcNoteCard>
135
142
  <component
136
143
  :is="link.to ? 'router-link' : 'a'"
137
144
  v-if="link && record"
@@ -157,7 +164,7 @@
157
164
  import { emit } from '@nextcloud/event-bus'
158
165
  import { formatFileSize } from '@nextcloud/files'
159
166
  import { translate as t } from '@nextcloud/l10n'
160
- import { NcLoadingIcon } from '@nextcloud/vue'
167
+ import { NcLoadingIcon, NcNoteCard } from '@nextcloud/vue'
161
168
  import Check from 'vue-material-design-icons/Check.vue'
162
169
  import ContentCopy from 'vue-material-design-icons/ContentCopy.vue'
163
170
  import EyeOutline from 'vue-material-design-icons/EyeOutline.vue'
@@ -266,7 +273,7 @@ export const FACTS_REVEAL_CHANNEL = 'cn:facts:reveal'
266
273
  export default {
267
274
  name: 'CnFactsWidget',
268
275
 
269
- components: { Check, CnIcon, CnStatusBadge, ContentCopy, EyeOutline, NcLoadingIcon },
276
+ components: { Check, CnIcon, CnStatusBadge, ContentCopy, EyeOutline, NcLoadingIcon, NcNoteCard },
270
277
 
271
278
  inject: {
272
279
  cnTranslate: { default: () => (key) => key },
@@ -290,6 +297,8 @@ export default {
290
297
  * `resolve: { register, schema, labelField? }` on an entry or a part turns a value that is a reference (an id, or a list of ids) into the label of the referenced object (`labelField`, else `title`, then `name`): the case type or status of a task shows its name, not its uuid. The ids are fetched once per register and schema through the object store and shared by every facts widget on the page; the entry stays empty until its label is known, and when no label can be read. A resolved value works as a pill too: `map` is applied to the resolved label, and `variantMap` / `colorMap` look the tone up by the value of `resolve.toneField` on the referenced object when that is set (a status named by its `name`, coloured by its `state`), then by the resolved label, then by the stored value.
291
298
  * `format: 'user'` shows a Nextcloud user id as the user's display name, read once per id; the entry stays empty until the name is known.
292
299
  * - `action` — an action drawn as a button under the facts; `headerAction` — one drawn in the card header (reported through the `header` event).
300
+ * - `headerPill` — a status pill in the card header (reported through the `header` event): `{ path?, text?, map?, variant?, variantMap?, colorMap? }`, read from the record like a `pill` entry (DqBezwaar "Advies ontvangen"); nothing shows while the value is empty.
301
+ * - `notice` — `{ text, variant? }`, a note band inside the card under the facts (`info` by default; `success`, `warning` or `error`); the text is translated.
293
302
  * `format` is `text` (default), `date` (board short date), `date-long` (always with the year), `list` (an array joined by ", ", each item read at `itemPath`), `bytes` (a size, "1.5 MB") or `currency` (a money amount in the reader's language, "€ 1.234,50": the code in `currency`, else the record's `currencyField`, else the app's reporting currency, else EUR; `decimals` defaults to 2).
294
303
  * `map` turns a raw value into a label (translated). `parts` (on a `line`) lists paths, or `{ path, label?, format? }`, joined by `separator` (default " · "); empty parts are dropped.
295
304
  * - `source` — `{ register, schema, id }` or `{ url }`; omitted = the current object. An entry with `from: "object"` reads the current object even then (a client card that also shows the ticket's channel).
@@ -508,6 +517,47 @@ export default {
508
517
  return this.actionView(this.content?.headerAction)
509
518
  },
510
519
 
520
+ /**
521
+ * The card header's status pill, read from the record like a `pill`
522
+ * entry, or null when it has no text.
523
+ *
524
+ * @return {{label: string, variant: string}|null}
525
+ */
526
+ headerPill() {
527
+ const pill = this.content?.headerPill
528
+ if (!pill || typeof pill !== 'object' || !this.record) {
529
+ return null
530
+ }
531
+ const raw = typeof pill.path === 'string' && pill.path !== '' ? readPath(this.record, pill.path) : undefined
532
+ const mapped = pill.map && (typeof raw === 'string' || typeof raw === 'number') && Object.hasOwn(pill.map, raw) ? pill.map[raw] : undefined
533
+ const text = mapped ?? pill.text ?? raw
534
+ if (typeof text !== 'string' && typeof text !== 'number') {
535
+ return null
536
+ }
537
+ const label = this.tr(String(text))
538
+ if (label === '') {
539
+ return null
540
+ }
541
+ const colours = pill.variantMap || pill.colorMap
542
+ const hit = colours && (typeof raw === 'string' || typeof raw === 'number') && Object.hasOwn(colours, raw) ? colours[raw] : pill.variant
543
+ return { label, variant: isBadgeVariant(hit) ? hit : 'default' }
544
+ },
545
+
546
+ /**
547
+ * The note band under the facts: its text translated, its NcNoteCard
548
+ * type from `variant` (info by default), or null without text.
549
+ *
550
+ * @return {{text: string, type: string}|null}
551
+ */
552
+ notice() {
553
+ const notice = this.content?.notice
554
+ const text = notice && typeof notice.text === 'string' ? this.tr(notice.text) : ''
555
+ if (text === '') {
556
+ return null
557
+ }
558
+ return { text, type: ['success', 'warning', 'error'].includes(notice.variant) ? notice.variant : 'info' }
559
+ },
560
+
511
561
  /** @return {string} The reveal button's text. */
512
562
  showLabel() {
513
563
  return t('nextcloud-vue', 'Show')
@@ -544,6 +594,13 @@ export default {
544
594
  this.emitHeader()
545
595
  },
546
596
  },
597
+
598
+ headerPill: {
599
+ deep: true,
600
+ handler() {
601
+ this.emitHeader()
602
+ },
603
+ },
547
604
  },
548
605
 
549
606
  methods: {
@@ -803,12 +860,13 @@ export default {
803
860
  const view = this.headerAction
804
861
  /**
805
862
  * @event header Emitted with the card header's parts: the header action, if any.
806
- * @type {{link: null, note: string, action: (object|null)}} `action` is `{ label, icon, run }`.
863
+ * @type {{link: null, note: string, action: (object|null), pill: (object|null)}} `action` is `{ label, icon, run }`, `pill` is `{ label, variant }`.
807
864
  */
808
865
  this.$emit('header', {
809
866
  link: null,
810
867
  note: '',
811
868
  action: view ? { ...view, run: () => this.runAction(this.content.headerAction) } : null,
869
+ pill: this.headerPill,
812
870
  })
813
871
  },
814
872
 
@@ -1368,6 +1426,10 @@ export default {
1368
1426
  background: var(--color-primary-element-light-hover, var(--color-primary-element-light));
1369
1427
  }
1370
1428
 
1429
+ .cn-facts-widget__notice {
1430
+ margin: 4px 0 0;
1431
+ }
1432
+
1371
1433
  .cn-facts-widget__link {
1372
1434
  font-size: 14px;
1373
1435
  font-weight: 600;