@conduction/nextcloud-vue 2.97.0 → 2.99.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +12 -0
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +11 -2
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +17 -0
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue.js +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +106 -2
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +9 -0
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js +964 -0
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js +282 -0
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChecklistRunWidget/index.js +28 -0
- package/dist/esm/components/CnChecklistRunWidget/index.js.map +1 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +1 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +26 -8
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +188 -5
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue.js +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js +3 -3
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js +1 -1
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js +27 -0
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js.map +1 -1
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js +16 -2
- package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +43 -3
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js +9 -0
- package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js.map +1 -0
- package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js +239 -0
- package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js.map +1 -0
- package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js +182 -0
- package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js.map +1 -0
- package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +9 -0
- package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js.map +1 -0
- package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js +265 -0
- package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -0
- package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +191 -0
- package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -0
- package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue.js +9 -0
- package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue.js.map +1 -0
- package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue2.js +508 -0
- package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue2.js.map +1 -0
- package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue3.js +99 -0
- package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue3.js.map +1 -0
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +18 -70
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js +6 -44
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js +1 -1
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js +83 -9
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js +80 -11
- package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +2 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js +9 -0
- package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js.map +1 -0
- package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js +472 -0
- package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js +231 -0
- package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnWorkingCalendarWidget/index.js +27 -0
- package/dist/esm/components/CnWorkingCalendarWidget/index.js.map +1 -0
- package/dist/esm/composables/indexSources.js +238 -2
- package/dist/esm/composables/indexSources.js.map +1 -1
- package/dist/esm/composables/useFlowStore.js +2 -1
- package/dist/esm/composables/useFlowStore.js.map +1 -1
- package/dist/esm/composables/useOrganisationStore.js +115 -0
- package/dist/esm/composables/useOrganisationStore.js.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +109 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +138 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +1071 -274
- package/dist/esm/utils/builtInFormatters.js +34 -1
- package/dist/esm/utils/builtInFormatters.js.map +1 -1
- package/dist/esm/utils/libraryWidgetKeys.js +2 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/matrixCells.js +158 -0
- package/dist/esm/utils/matrixCells.js.map +1 -0
- package/dist/esm/utils/nextcloudDirectory.js +121 -0
- package/dist/esm/utils/nextcloudDirectory.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/workingCalendarMonth.js +85 -0
- package/dist/esm/utils/workingCalendarMonth.js.map +1 -0
- package/dist/nextcloud-vue.cjs.js +14888 -10014
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +1071 -274
- package/l10n/en.json +109 -1
- package/l10n/nl.json +138 -1
- package/package.json +2 -2
- package/scripts/merge-l10n.js +196 -0
- package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -1
- package/src/components/CnAppRoot/CnAppRoot.md +1 -0
- package/src/components/CnAppRoot/CnAppRoot.vue +17 -0
- package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +1 -0
- package/src/components/CnChartWidget/CnChartWidget.md +2 -1
- package/src/components/CnChartWidget/CnChartWidget.vue +106 -2
- package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +1269 -0
- package/src/components/CnChecklistRunWidget/index.js +27 -0
- package/src/components/CnDashboardPage/CnDashboardPage.vue +1 -0
- package/src/components/CnDataTable/CnDataTable.vue +26 -8
- package/src/components/CnDetailPage/CnDetailPage.md +48 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +189 -5
- package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +3 -3
- package/src/components/CnFeaturesBoard/CnFeaturesBoard.vue +38 -2
- package/src/components/CnIndexPage/CnIndexPage.md +28 -0
- package/src/components/CnIndexPage/CnIndexPage.vue +43 -3
- package/src/components/CnOrderedListField/CnOrderedListField.vue +458 -0
- package/src/components/CnOrderedListField/index.js +7 -0
- package/src/components/CnSettingsField/CnSettingsField.vue +449 -0
- package/src/components/CnSettingsField/index.js +4 -0
- package/src/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue +613 -0
- package/src/components/CnSettingsFieldsSection/index.js +4 -0
- package/src/components/CnSettingsPage/CnSettingsPage.vue +6 -86
- package/src/components/CnUserSettingsDialog/CnUserSettingsDialog.vue +139 -10
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +2 -0
- package/src/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue +725 -0
- package/src/components/CnWorkingCalendarWidget/index.js +26 -0
- package/src/components/index.js +5 -0
- package/src/composables/indexSources.js +237 -1
- package/src/composables/useFlowStore.js +2 -1
- package/src/composables/useOrganisationStore.js +111 -0
- package/src/css/badge.css +32 -16
- package/src/css/look-board-detail.css +80 -8
- package/src/css/look-board-index.css +52 -8
- package/src/css/look-board.css +219 -1
- package/src/index.js +5 -0
- package/src/schemas/app-manifest-v2.schema.json +33 -3
- package/src/utils/builtInFormatters.js +33 -0
- package/src/utils/libraryWidgetKeys.js +2 -0
- package/src/utils/matrixCells.js +154 -0
- package/src/utils/nextcloudDirectory.js +117 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/workingCalendarMonth.js +82 -0
package/l10n/en.json
CHANGED
|
@@ -1590,7 +1590,111 @@
|
|
|
1590
1590
|
"About {name}": "About {name}",
|
|
1591
1591
|
"Sent message": "Sent message",
|
|
1592
1592
|
"Received message": "Received message",
|
|
1593
|
-
"Loading messages…": "Loading messages…"
|
|
1593
|
+
"Loading messages…": "Loading messages…",
|
|
1594
|
+
"Move {item} up": "Move {item} up",
|
|
1595
|
+
"Move {item} down": "Move {item} down",
|
|
1596
|
+
"Remove {item}": "Remove {item}",
|
|
1597
|
+
"Nothing added yet.": "Nothing added yet.",
|
|
1598
|
+
"Ordered list": "Ordered list",
|
|
1599
|
+
"{item} moved to position {position} of {total}": "{item} moved to position {position} of {total}",
|
|
1600
|
+
"{item} removed": "{item} removed",
|
|
1601
|
+
"{item} added": "{item} added",
|
|
1602
|
+
"Organisations": "Organisations",
|
|
1603
|
+
"Provisioning": "Provisioning",
|
|
1604
|
+
"Suspended": "Suspended",
|
|
1605
|
+
"Deprovisioning": "Deprovisioning",
|
|
1606
|
+
"Archived": "Archived",
|
|
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}"
|
|
1594
1698
|
},
|
|
1595
1699
|
"plurals": {
|
|
1596
1700
|
"{count} selected": [
|
|
@@ -1684,6 +1788,10 @@
|
|
|
1684
1788
|
"And %n more type in this group.": [
|
|
1685
1789
|
"And %n more type in this group.",
|
|
1686
1790
|
"And %n more types in this group."
|
|
1791
|
+
],
|
|
1792
|
+
"Showing %n flow": [
|
|
1793
|
+
"Showing %n flow",
|
|
1794
|
+
"Showing %n flows"
|
|
1687
1795
|
]
|
|
1688
1796
|
}
|
|
1689
1797
|
}
|
package/l10n/nl.json
CHANGED
|
@@ -1776,7 +1776,140 @@
|
|
|
1776
1776
|
"About {name}": "Over {name}",
|
|
1777
1777
|
"Sent message": "Verstuurd bericht",
|
|
1778
1778
|
"Received message": "Ontvangen bericht",
|
|
1779
|
-
"Loading messages…": "Berichten laden…"
|
|
1779
|
+
"Loading messages…": "Berichten laden…",
|
|
1780
|
+
"Move {item} up": "{item} omhoog",
|
|
1781
|
+
"Move {item} down": "{item} omlaag",
|
|
1782
|
+
"Remove {item}": "{item} verwijderen",
|
|
1783
|
+
"Nothing added yet.": "Nog niets toegevoegd.",
|
|
1784
|
+
"Ordered list": "Lijst op volgorde",
|
|
1785
|
+
"{item} moved to position {position} of {total}": "{item} staat nu op plaats {position} van {total}",
|
|
1786
|
+
"{item} removed": "{item} verwijderd",
|
|
1787
|
+
"{item} added": "{item} toegevoegd",
|
|
1788
|
+
"Question {n} of {total}": "Vraag {n} van {total}",
|
|
1789
|
+
"Questions answered": "Beantwoorde vragen",
|
|
1790
|
+
"(required)": "(verplicht)",
|
|
1791
|
+
"Answer this question to go on.": "Beantwoord deze vraag om verder te gaan.",
|
|
1792
|
+
"Finish": "Afronden",
|
|
1793
|
+
"Take or add a photo": "Foto maken of toevoegen",
|
|
1794
|
+
"Another photo": "Nog een foto",
|
|
1795
|
+
"Photo for question {n}": "Foto bij vraag {n}",
|
|
1796
|
+
"This checklist has no questions.": "Deze checklist heeft geen vragen.",
|
|
1797
|
+
"The checklist could not be loaded.": "De checklist kon niet worden geladen.",
|
|
1798
|
+
"The answer could not be saved. Try again.": "Het antwoord kon niet worden opgeslagen. Probeer het opnieuw.",
|
|
1799
|
+
"Checklist finished.": "Checklist afgerond.",
|
|
1800
|
+
"Not applicable": "Niet van toepassing",
|
|
1801
|
+
"Answer with a photo.": "Beantwoord met een foto.",
|
|
1802
|
+
"This answer needs a photo. Add one to go on.": "Bij dit antwoord hoort een foto. Voeg er een toe om verder te gaan.",
|
|
1803
|
+
"Organisations": "Organisaties",
|
|
1804
|
+
"Provisioning": "Wordt ingericht",
|
|
1805
|
+
"Suspended": "Opgeschort",
|
|
1806
|
+
"Deprovisioning": "Wordt opgeheven",
|
|
1807
|
+
"Archived": "Gearchiveerd",
|
|
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 …"
|
|
1780
1913
|
},
|
|
1781
1914
|
"plurals": {
|
|
1782
1915
|
"{count} selected": [
|
|
@@ -1870,6 +2003,10 @@
|
|
|
1870
2003
|
"And %n more type in this group.": [
|
|
1871
2004
|
"En nog %n soort in deze groep.",
|
|
1872
2005
|
"En nog %n soorten in deze groep."
|
|
2006
|
+
],
|
|
2007
|
+
"Showing %n flow": [
|
|
2008
|
+
"%n flow",
|
|
2009
|
+
"%n flows"
|
|
1873
2010
|
]
|
|
1874
2011
|
}
|
|
1875
2012
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@conduction/nextcloud-vue",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.99.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": {
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"jsdoc-baselines:update": "node scripts/check-jsdoc.js --update",
|
|
87
87
|
"lint": "eslint src/ eslint/ testing/ tests/ e2e/",
|
|
88
88
|
"lint-fix": "npm run lint -- --fix",
|
|
89
|
-
"prepare": "husky || true",
|
|
89
|
+
"prepare": "husky || true; git config merge.l10n.name 'l10n catalogue key-wise merge' || true; git config merge.l10n.driver 'node scripts/merge-l10n.js %O %A %B %P' || true",
|
|
90
90
|
"prepublishOnly": "npm run build",
|
|
91
91
|
"smoke-baseline:update": "node scripts/update-smoke-baseline.js",
|
|
92
92
|
"styleguide": "cd styleguide && npm run server",
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
4
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
5
|
+
*
|
|
6
|
+
* Git merge driver for the l10n catalogues (`l10n/*.json`).
|
|
7
|
+
*
|
|
8
|
+
* Every branch that adds a library string appends to the end of `translations`
|
|
9
|
+
* (and sometimes `plurals`) in `l10n/en.json` and `l10n/nl.json`, so two
|
|
10
|
+
* branches always edit the same last lines and git calls it a conflict on
|
|
11
|
+
* every merge of development. A catalogue is a set of keys, not a sequence of
|
|
12
|
+
* lines, so this driver merges the three versions key by key: a key one side
|
|
13
|
+
* added is kept, a key one side removed is dropped, a key only one side
|
|
14
|
+
* changed takes that side's text, and only a key BOTH sides changed to
|
|
15
|
+
* different texts is a conflict.
|
|
16
|
+
*
|
|
17
|
+
* A conflict is written with `<<<<<<<` / `=======` / `>>>>>>>` markers around
|
|
18
|
+
* the two one-line entries and exit code 1, so git marks the path unmerged and
|
|
19
|
+
* the file does not parse until a person picks one. A side that does not
|
|
20
|
+
* parse is not guessed at: exit 1, our version untouched.
|
|
21
|
+
*
|
|
22
|
+
* Order: our keys in our order, then the keys only their side added, in
|
|
23
|
+
* theirs. Output is `JSON.stringify(doc, null, 2)` plus a newline, which is the
|
|
24
|
+
* shape every catalogue in this repo already has byte for byte.
|
|
25
|
+
*
|
|
26
|
+
* `merge=union` is not used on purpose: it concatenates both hunks, which on
|
|
27
|
+
* JSON drops a comma or doubles a brace, and a catalogue that does not parse
|
|
28
|
+
* turns every string back into its English key.
|
|
29
|
+
*
|
|
30
|
+
* Registration is local git config (git never runs a command a repository
|
|
31
|
+
* ships); `npm install` sets it through `prepare`, an existing clone runs:
|
|
32
|
+
*
|
|
33
|
+
* git config merge.l10n.driver 'node scripts/merge-l10n.js %O %A %B %P'
|
|
34
|
+
*
|
|
35
|
+
* Without it git falls back to its ordinary merge, as before.
|
|
36
|
+
*
|
|
37
|
+
* Usage (what git invokes): node scripts/merge-l10n.js %O %A %B %P
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
'use strict'
|
|
41
|
+
|
|
42
|
+
const fs = require('fs')
|
|
43
|
+
|
|
44
|
+
const MARKER_INDENT = ' '
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Whether two catalogue values are the same (a plural is an array of forms).
|
|
48
|
+
*
|
|
49
|
+
* @param {unknown} a One value, undefined for absent.
|
|
50
|
+
* @param {unknown} b The other.
|
|
51
|
+
* @return {boolean}
|
|
52
|
+
*/
|
|
53
|
+
function same(a, b) {
|
|
54
|
+
return a === b || (a !== undefined && b !== undefined && JSON.stringify(a) === JSON.stringify(b))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Three-way merge of one object of keys (a catalogue block).
|
|
59
|
+
*
|
|
60
|
+
* @param {object} base The ancestor's block.
|
|
61
|
+
* @param {object} ours Our block.
|
|
62
|
+
* @param {object} theirs Their block.
|
|
63
|
+
* @return {{merged: object, conflicts: Array<{key: string, ours: unknown, theirs: unknown}>}}
|
|
64
|
+
*/
|
|
65
|
+
function mergeBlock(base, ours, theirs) {
|
|
66
|
+
const merged = {}
|
|
67
|
+
const conflicts = []
|
|
68
|
+
const keys = [...Object.keys(ours), ...Object.keys(theirs).filter((key) => !Object.hasOwn(ours, key))]
|
|
69
|
+
for (const key of keys) {
|
|
70
|
+
const b = base[key]
|
|
71
|
+
const o = ours[key]
|
|
72
|
+
const t = theirs[key]
|
|
73
|
+
let value
|
|
74
|
+
if (same(o, t)) {
|
|
75
|
+
value = o
|
|
76
|
+
} else if (same(o, b)) {
|
|
77
|
+
value = t
|
|
78
|
+
} else if (same(t, b)) {
|
|
79
|
+
value = o
|
|
80
|
+
} else {
|
|
81
|
+
conflicts.push({ key, ours: o, theirs: t })
|
|
82
|
+
value = o === undefined ? t : o
|
|
83
|
+
}
|
|
84
|
+
if (value !== undefined) {
|
|
85
|
+
merged[key] = value
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { merged, conflicts }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Whether a value is a plain object (a catalogue block).
|
|
93
|
+
*
|
|
94
|
+
* @param {unknown} value The value.
|
|
95
|
+
* @return {boolean}
|
|
96
|
+
*/
|
|
97
|
+
function isBlock(value) {
|
|
98
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Merge three catalogue texts.
|
|
103
|
+
*
|
|
104
|
+
* @param {string} baseText The ancestor ('' when both sides added the file).
|
|
105
|
+
* @param {string} oursText Our version.
|
|
106
|
+
* @param {string} theirsText Their version.
|
|
107
|
+
* @return {{text: string|null, conflicts: number}} The merged text (null when a side does not parse) and the number of conflicting keys.
|
|
108
|
+
*/
|
|
109
|
+
function mergeCatalogues(baseText, oursText, theirsText) {
|
|
110
|
+
let base
|
|
111
|
+
let ours
|
|
112
|
+
let theirs
|
|
113
|
+
try {
|
|
114
|
+
base = baseText.trim() === '' ? {} : JSON.parse(baseText)
|
|
115
|
+
ours = JSON.parse(oursText)
|
|
116
|
+
theirs = JSON.parse(theirsText)
|
|
117
|
+
} catch {
|
|
118
|
+
return { text: null, conflicts: 0 }
|
|
119
|
+
}
|
|
120
|
+
if (!isBlock(base) || !isBlock(ours) || !isBlock(theirs)) {
|
|
121
|
+
return { text: null, conflicts: 0 }
|
|
122
|
+
}
|
|
123
|
+
const doc = {}
|
|
124
|
+
const conflicts = []
|
|
125
|
+
const topKeys = [...Object.keys(ours), ...Object.keys(theirs).filter((key) => !Object.hasOwn(ours, key))]
|
|
126
|
+
for (const key of topKeys) {
|
|
127
|
+
const [b, o, t] = [base[key], ours[key], theirs[key]]
|
|
128
|
+
if (isBlock(o) || isBlock(t)) {
|
|
129
|
+
const result = mergeBlock(isBlock(b) ? b : {}, isBlock(o) ? o : {}, isBlock(t) ? t : {})
|
|
130
|
+
doc[key] = result.merged
|
|
131
|
+
result.conflicts.forEach((conflict) => conflicts.push({ block: key, ...conflict }))
|
|
132
|
+
continue
|
|
133
|
+
}
|
|
134
|
+
const result = mergeBlock({ [key]: b }, o === undefined ? {} : { [key]: o }, t === undefined ? {} : { [key]: t })
|
|
135
|
+
if (Object.hasOwn(result.merged, key)) {
|
|
136
|
+
doc[key] = result.merged[key]
|
|
137
|
+
}
|
|
138
|
+
result.conflicts.forEach((conflict) => conflicts.push({ block: null, ...conflict }))
|
|
139
|
+
}
|
|
140
|
+
let text = JSON.stringify(doc, null, 2) + '\n'
|
|
141
|
+
for (const conflict of conflicts) {
|
|
142
|
+
text = markConflict(text, conflict)
|
|
143
|
+
}
|
|
144
|
+
return { text, conflicts: conflicts.length }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Put conflict markers around one key's entry, both sides on one line each.
|
|
149
|
+
*
|
|
150
|
+
* @param {string} text The serialised merge.
|
|
151
|
+
* @param {{block: string|null, key: string, ours: unknown, theirs: unknown}} conflict The conflict.
|
|
152
|
+
* @return {string} The text with markers.
|
|
153
|
+
*/
|
|
154
|
+
function markConflict(text, conflict) {
|
|
155
|
+
const indent = conflict.block ? MARKER_INDENT : ' '
|
|
156
|
+
const entry = (value) => (value === undefined ? `${indent}(removed)` : `${indent}${JSON.stringify(conflict.key)}: ${JSON.stringify(value)},`)
|
|
157
|
+
const lines = text.split('\n')
|
|
158
|
+
const start = lines.findIndex((line) => line.startsWith(`${indent}${JSON.stringify(conflict.key)}: `))
|
|
159
|
+
if (start < 0) {
|
|
160
|
+
return text
|
|
161
|
+
}
|
|
162
|
+
let end = start
|
|
163
|
+
if (/[[{]$/.test(lines[start])) {
|
|
164
|
+
const close = indent + (lines[start].endsWith('[') ? ']' : '}')
|
|
165
|
+
while (end < lines.length - 1 && !lines[end].startsWith(close)) {
|
|
166
|
+
end += 1
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const block = ['<<<<<<< ours', entry(conflict.ours), '=======', entry(conflict.theirs), '>>>>>>> theirs']
|
|
170
|
+
lines.splice(start, end - start + 1, ...block)
|
|
171
|
+
return lines.join('\n')
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
module.exports = { mergeCatalogues }
|
|
175
|
+
|
|
176
|
+
if (require.main === module) {
|
|
177
|
+
const [basePath, oursPath, theirsPath, label] = process.argv.slice(2)
|
|
178
|
+
const read = (file) => {
|
|
179
|
+
try {
|
|
180
|
+
return fs.readFileSync(file, 'utf8')
|
|
181
|
+
} catch {
|
|
182
|
+
return ''
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const { text, conflicts } = mergeCatalogues(read(basePath), read(oursPath), read(theirsPath))
|
|
186
|
+
if (text === null) {
|
|
187
|
+
process.stderr.write(`merge-l10n: ${label || oursPath} does not parse on one side; resolve it by hand.\n`)
|
|
188
|
+
process.exit(1)
|
|
189
|
+
}
|
|
190
|
+
fs.writeFileSync(oursPath, text)
|
|
191
|
+
if (conflicts > 0) {
|
|
192
|
+
process.stderr.write(`merge-l10n: ${conflicts} key(s) in ${label || oursPath} were translated differently on both sides.\n`)
|
|
193
|
+
process.exit(1)
|
|
194
|
+
}
|
|
195
|
+
process.exit(0)
|
|
196
|
+
}
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
:data-testid="`${testidBase}-actions`"
|
|
31
31
|
@update:open="menuOpen = $event">
|
|
32
32
|
<template #icon>
|
|
33
|
-
<
|
|
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,
|
|
@@ -87,6 +87,7 @@ With loading state, custom components, translate, permissions, and custom page t
|
|
|
87
87
|
| `userSettingsTitle` | String | No | `''` | Title shown at the top of the hosted `NcAppSettingsDialog`. Empty (the default) resolves to "User settings" from the library catalogue ("Persoonlijke instellingen" in Dutch), then the app's `translate`. Override per app to brand the modal (e.g. `'Decidiq preferences'`). |
|
|
88
88
|
| `userSettingsEyebrow` | String | No | `''` | Board look: the line above the user-settings title. Empty uses "Your account" ("Uw account"). Goes through the app's `translate`. |
|
|
89
89
|
| `userSettingsSubtitle` | String | No | `''` | Board look: the sentence under the user-settings title. Empty uses "Only for you. Colleagues keep their own settings." Goes through the app's `translate`. |
|
|
90
|
+
| `userSettingsNextcloudLinks` | Array | No | `[]` | Board look: Nextcloud's own personal settings, listed first in the user-settings navigation as links, `[{ label, section? \| href?, icon? }]`. With any, the app's sections sit under one entry named after the app. |
|
|
90
91
|
| `userSettingsSections` | Array | No | `null` | The user-settings sections to draw, in order: `app` (the app's slot content), `notifications`, `credentials`, `walkthrough`, `integrations`. A key left out is not drawn. `null` keeps the defaults: every section after `#user-settings-sections` content, or only the `#user-settings` content and the integrations section. |
|
|
91
92
|
| `adminSettingsTitle` | String | No | `''` | Title shown at the top of the admin-settings `NcAppSettingsDialog`. Empty (the default) resolves to `translate('Administration')`. Override per app (e.g. `'Pipelinq administration'`). |
|
|
92
93
|
| `requiresApps` | Array | No | `['openregister']` | App ids that MUST be installed for the host app to function. Checked against the OCS capabilities API on mount. When any required app is missing, CnAppRoot renders the empty state from the `or-missing` slot (default: `<NcEmptyContent>`) instead of the renderer. Pass `[]` to opt out (e.g. launchpad, the docs/styleguide app) — useful for any consumer that does not depend on OpenRegister. |
|
|
@@ -1687,6 +1687,20 @@ export default {
|
|
|
1687
1687
|
default: '',
|
|
1688
1688
|
},
|
|
1689
1689
|
|
|
1690
|
+
/**
|
|
1691
|
+
* Board look: Nextcloud's own personal settings, listed first in the
|
|
1692
|
+
* user-settings navigation as links, `[{ label, section? | href?, icon? }]`
|
|
1693
|
+
* (`section` is a personal settings section id). With any, the app's
|
|
1694
|
+
* sections sit under one entry named after the app. Labels go through
|
|
1695
|
+
* the app's `translate`.
|
|
1696
|
+
*
|
|
1697
|
+
* @type {Array<object>}
|
|
1698
|
+
*/
|
|
1699
|
+
userSettingsNextcloudLinks: {
|
|
1700
|
+
type: Array,
|
|
1701
|
+
default: () => [],
|
|
1702
|
+
},
|
|
1703
|
+
|
|
1690
1704
|
/**
|
|
1691
1705
|
* The sections of the user-settings modal, in the order they are
|
|
1692
1706
|
* drawn. Keys: `app` (the content of the `#user-settings-sections`
|
|
@@ -3143,6 +3157,9 @@ export default {
|
|
|
3143
3157
|
if (this.userSettingsSubtitle) {
|
|
3144
3158
|
props.subtitle = this.translate(this.userSettingsSubtitle)
|
|
3145
3159
|
}
|
|
3160
|
+
if (Array.isArray(this.userSettingsNextcloudLinks) && this.userSettingsNextcloudLinks.length > 0) {
|
|
3161
|
+
props.nextcloudLinks = this.userSettingsNextcloudLinks.map((link) => ({ ...link, label: this.translate(link?.label || '') }))
|
|
3162
|
+
}
|
|
3146
3163
|
return props
|
|
3147
3164
|
},
|
|
3148
3165
|
|
|
@@ -18,7 +18,7 @@ When `CnDashboardPage` resolves a widget definition with `type: "chart"`, it mou
|
|
|
18
18
|
}
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
Supported `props` keys forwarded by the dispatcher: `chartKind` (→ `type`), `series`, `categories`, `labels`, `options`, `colors`, `toolbar`, `legend`, `height`, `width`, `unavailableLabel`, plus the display passthrough `horizontal`, `legendPosition`, `valueAxisBaseline`, `valueFormat`, `colorMap`, `emptyLabel`, `views`, `endpointSource`, `barMax`, `footnote`, `highlight`. The `dataSource` field resolves declaratively: `aggregate: 'count'` / raw `graphql` via GraphQL, `bucket` / `groupBy` / the OBJECT-form `aggregate` (Wave 3: group-by + topN/Other + labelResolve) via OpenRegister's REST aggregation facets, with an optional sibling `drilldown: { route, filterParam }` that navigates on segment/bar click with the raw category key in the query.
|
|
21
|
+
Supported `props` keys forwarded by the dispatcher: `chartKind` (→ `type`), `series`, `categories`, `labels`, `options`, `colors`, `toolbar`, `legend`, `height`, `width`, `unavailableLabel`, plus the display passthrough `horizontal`, `legendPosition`, `valueAxisBaseline`, `valueFormat`, `colorMap`, `emptyLabel`, `views`, `endpointSource`, `barMax`, `footnote`, `highlight`, `cellSource`. The `dataSource` field resolves declaratively: `aggregate: 'count'` / raw `graphql` via GraphQL, `bucket` / `groupBy` / the OBJECT-form `aggregate` (Wave 3: group-by + topN/Other + labelResolve) via OpenRegister's REST aggregation facets, with an optional sibling `drilldown: { route, filterParam }` that navigates on segment/bar click with the raw category key in the query.
|
|
22
22
|
|
|
23
23
|
Area chart — time series data:
|
|
24
24
|
|
|
@@ -109,6 +109,7 @@ Fallback slot — shown when ApexCharts is not available:
|
|
|
109
109
|
| `barMax` | Number | `null` | `bar-list`: the value a full track stands for (100 for percentages); null takes the largest value |
|
|
110
110
|
| `footnote` | String | `''` | `bar-list` / `matrix`: a line under the rows, through the host's translate |
|
|
111
111
|
| `highlight` | Object | `null` | `matrix`: the cell to outline, `{ row, column, columnKeys? }`, tokens such as `@object.behaviour` resolved |
|
|
112
|
+
| `cellSource` | Object | `null` | `matrix`: read the cells from records that each hold one cell (`{ register, schema, filter?, rowField, columnField, valueField, … }`), or with `cellsPath` from the cells inside one record, see [Bar list and matrix](#bar-list-and-matrix) |
|
|
112
113
|
| `valueAxisBaseline` | String | `'auto'` | How the value axis picks its baseline, so a small difference cannot read as a dramatic one. `'auto'` anchors magnitude marks (bar/area) at zero and stops line charts zooming past a quarter of the data's magnitude; `'zero'` always anchors at zero; `'fit'` restores plain ApexCharts autoscaling — use it for series that live far from zero (a percentage hovering 95–99), where a zero baseline flattens the signal. Pie-family charts, negative series, empty data and stacked charts (`options.chart.stacked` — where the visible height is the per-category sum, not the largest datapoint) always autoscale; an explicit `options.yaxis.min`/`max` still wins. The ceiling rounds up to a nice number (7 → 8, 62 → 80). |
|
|
113
114
|
| `valueFormat` | String\|Object | `null` | Named value formatter for the value axis + tooltip: `'currency'`, `'currency-compact'`, `'percent'`, or `{ name, currency?, decimals? }` |
|
|
114
115
|
| `colorMap` | Object | `null` | Per-category colour map (`{ categoryLabel: cssColor }`) for pie-family slices and (distributed) bar categories |
|