@nocobase/plugin-flow-engine 2.2.0-alpha.1 → 2.2.0-alpha.11
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/ai/ai-employees/nathan/prompt.md +2 -0
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/SKILLS.md +1 -0
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/getContextApis.js +2 -2
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/getContextEnvs.js +2 -2
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/getContextVars.js +2 -2
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/lintAndTestJS.js +2 -2
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/patchJSCode.js +4 -4
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/readJSCode.js +2 -2
- package/dist/ai/ai-employees/nathan/skills/frontend-developer/tools/writeJSCode.js +2 -2
- package/dist/ai/docs/runjs/context/ai.md +206 -0
- package/dist/client/index.js +1 -1
- package/dist/externalVersion.js +9 -9
- package/dist/locale/en-US.json +3 -0
- package/dist/locale/index.d.ts +6 -0
- package/dist/locale/zh-CN.json +3 -0
- package/dist/node_modules/@ant-design/icons-svg/package.json +1 -1
- package/dist/node_modules/acorn/package.json +1 -1
- package/dist/node_modules/acorn-jsx/package.json +1 -1
- package/dist/node_modules/acorn-walk/package.json +1 -1
- package/dist/node_modules/ses/package.json +1 -1
- package/dist/node_modules/zod/package.json +1 -1
- package/dist/server/flow-surfaces/{runjs-authoring/blocked-global-stop/index.d.ts → approval/authoring-validation.d.ts} +1 -2
- package/dist/server/flow-surfaces/approval/authoring-validation.js +1151 -0
- package/dist/server/flow-surfaces/approval/blueprint-service.js +2 -0
- package/dist/server/flow-surfaces/authoring-validation.d.ts +3 -1
- package/dist/server/flow-surfaces/authoring-validation.js +645 -59
- package/dist/server/flow-surfaces/blueprint/compile-blocks.js +7 -3
- package/dist/server/flow-surfaces/blueprint/compile-plan.js +23 -15
- package/dist/server/flow-surfaces/blueprint/export-document.d.ts +50 -0
- package/dist/server/flow-surfaces/blueprint/export-document.js +2510 -0
- package/dist/server/flow-surfaces/blueprint/normalize-document.js +18 -1
- package/dist/server/flow-surfaces/blueprint/public-types.d.ts +2 -0
- package/dist/server/flow-surfaces/builder.js +43 -5
- package/dist/server/flow-surfaces/catalog.js +13 -2
- package/dist/server/flow-surfaces/configure-options.js +5 -3
- package/dist/server/flow-surfaces/constants.d.ts +16 -2
- package/dist/server/flow-surfaces/constants.js +2 -0
- package/dist/server/flow-surfaces/contract-guard.js +37 -5
- package/dist/server/flow-surfaces/default-action-popup.d.ts +2 -0
- package/dist/server/flow-surfaces/default-action-popup.js +27 -13
- package/dist/server/flow-surfaces/errors.d.ts +2 -2
- package/dist/server/flow-surfaces/errors.js +4 -4
- package/dist/server/flow-surfaces/filter-group.d.ts +19 -2
- package/dist/server/flow-surfaces/filter-group.js +232 -3
- package/dist/server/flow-surfaces/navigation-targets.d.ts +73 -0
- package/dist/server/flow-surfaces/navigation-targets.js +439 -0
- package/dist/server/flow-surfaces/planning/compiler.d.ts +1 -0
- package/dist/server/flow-surfaces/planning/compiler.js +205 -82
- package/dist/server/flow-surfaces/planning/key-registry.d.ts +1 -1
- package/dist/server/flow-surfaces/planning/runtime.js +1 -0
- package/dist/server/flow-surfaces/planning/step-link.d.ts +1 -1
- package/dist/server/flow-surfaces/planning/step-link.js +22 -3
- package/dist/server/flow-surfaces/public-data-surface-default-filter.js +0 -9
- package/dist/server/flow-surfaces/reaction/field-value.d.ts +9 -0
- package/dist/server/flow-surfaces/reaction/field-value.js +51 -2
- package/dist/server/flow-surfaces/reaction/linkage.d.ts +6 -1
- package/dist/server/flow-surfaces/reaction/linkage.js +18 -3
- package/dist/server/flow-surfaces/reaction/meta.js +19 -1
- package/dist/server/flow-surfaces/reaction/types.d.ts +19 -0
- package/dist/server/flow-surfaces/relation-backing-foreign-key.d.ts +10 -0
- package/dist/server/flow-surfaces/relation-backing-foreign-key.js +79 -0
- package/dist/server/flow-surfaces/runjs-authoring/ast/source.d.ts +1 -0
- package/dist/server/flow-surfaces/runjs-authoring/ast/source.js +20 -0
- package/dist/server/flow-surfaces/runjs-authoring/rules.js +0 -2
- package/dist/server/flow-surfaces/runjs-authoring/runtime/constants.d.ts +0 -1
- package/dist/server/flow-surfaces/runjs-authoring/runtime/constants.js +12 -19
- package/dist/server/flow-surfaces/runjs-authoring/runtime/types.d.ts +0 -12
- package/dist/server/flow-surfaces/runjs-authoring/scan/filter.js +12 -2
- package/dist/server/flow-surfaces/runjs-authoring/scan/index.d.ts +0 -14
- package/dist/server/flow-surfaces/runjs-authoring/scan/index.js +10 -8
- package/dist/server/flow-surfaces/runjs-authoring/scan/source-patterns.d.ts +0 -14
- package/dist/server/flow-surfaces/runjs-authoring/scan/source-patterns.js +18 -73
- package/dist/server/flow-surfaces/runjs-authoring/types.d.ts +1 -1
- package/dist/server/flow-surfaces/runjs-authoring/validators/index.js +9 -53
- package/dist/server/flow-surfaces/service.d.ts +65 -0
- package/dist/server/flow-surfaces/service.js +1372 -148
- package/dist/server/flow-surfaces/types.d.ts +2 -1
- package/dist/server/variables/records.js +7 -2
- package/dist/server/variables/registry.js +3 -0
- package/dist/swagger/flow-surfaces.d.ts +289 -0
- package/dist/swagger/flow-surfaces.examples.d.ts +11 -0
- package/dist/swagger/flow-surfaces.examples.js +11 -0
- package/dist/swagger/flow-surfaces.js +261 -11
- package/dist/swagger/index.d.ts +289 -0
- package/package.json +2 -2
- package/dist/server/flow-surfaces/runjs-authoring/blocked-global-stop/index.js +0 -40
|
@@ -141,7 +141,11 @@ const APPLY_BLUEPRINT_BLOCK_TYPE_ENUM = [
|
|
|
141
141
|
"jsBlock",
|
|
142
142
|
"tree"
|
|
143
143
|
];
|
|
144
|
-
const
|
|
144
|
+
const APPROVAL_BLUEPRINT_GENERIC_BLOCK_TYPE_ENUM = ["markdown", "jsBlock"];
|
|
145
|
+
const APPROVAL_BLUEPRINT_BLOCK_TYPE_ENUM = [
|
|
146
|
+
...import_catalog_specs.APPROVAL_BLOCK_PUBLIC_KEYS,
|
|
147
|
+
...APPROVAL_BLUEPRINT_GENERIC_BLOCK_TYPE_ENUM
|
|
148
|
+
];
|
|
145
149
|
const COMPOSE_BLOCK_TYPE_ENUM = [...APPLY_BLUEPRINT_BLOCK_TYPE_ENUM, ...import_catalog_specs.APPROVAL_BLOCK_PUBLIC_KEYS];
|
|
146
150
|
const RELATION_FIELD_TYPE_ENUM = [
|
|
147
151
|
"text",
|
|
@@ -496,7 +500,7 @@ function buildReactionCapabilitySchema(kind, ruleSchemaName, extraProperties = {
|
|
|
496
500
|
additionalProperties: false
|
|
497
501
|
};
|
|
498
502
|
}
|
|
499
|
-
const FLOW_SURFACES_READ_ACL_NOTE = "Read actions (`get` / `describeSurface` / `catalog` / `context` / `getReactionMeta` / `getEventFlowMeta` / `listTemplates` / `getTemplate`) are open to `loggedIn` by default. Write actions still require the `ui.flowSurfaces` snippet.";
|
|
503
|
+
const FLOW_SURFACES_READ_ACL_NOTE = "Read actions (`get` / `describeSurface` / `exportBlueprint` / `listNavigationTargets` / `catalog` / `context` / `getReactionMeta` / `getEventFlowMeta` / `listTemplates` / `getTemplate`) are open to `loggedIn` by default. Write actions still require the `ui.flowSurfaces` snippet.";
|
|
500
504
|
const templateActionDocs = (0, import_flow_surfaces2.createFlowSurfaceTemplateActionDocs)({
|
|
501
505
|
tag: FLOW_SURFACES_TAG,
|
|
502
506
|
readAclNote: FLOW_SURFACES_READ_ACL_NOTE,
|
|
@@ -606,11 +610,29 @@ const actionDocs = {
|
|
|
606
610
|
requestBody: requestBody("FlowSurfaceDescribeSurfaceRequest", import_flow_surfaces.flowSurfaceExamples.describeSurface),
|
|
607
611
|
responses: responses("FlowSurfaceDescribeSurfaceResponse")
|
|
608
612
|
},
|
|
613
|
+
exportBlueprint: {
|
|
614
|
+
tags: [FLOW_SURFACES_TAG],
|
|
615
|
+
summary: "Export one root Modern page as an applyBlueprint replace document",
|
|
616
|
+
description: valuesCompatibilityNote(
|
|
617
|
+
`Exports an existing root flow page into a v1 \`FlowSurfaceApplyBlueprintDocument\` that can be sent back to \`flowSurfaces:applyBlueprint\` for same-instance \`replace\`. The request body uses \`{ target, options }\` and does not change the \`flowSurfaces:get\` GET query-locator contract. v1 only supports root page export; block, field, action, tab, and \`tabSchemaUid\` subtree targets return HTTP 400. The exported document intentionally omits \`navigation\` and does not expose raw \`tree\`, \`nodeMap\`, node uid, internal refs, or internal metadata. \`document.target.pageSchemaUid\` is retained for same-instance replace. ${FLOW_SURFACES_READ_ACL_NOTE}`
|
|
618
|
+
),
|
|
619
|
+
requestBody: requestBody("FlowSurfaceExportBlueprintRequest", import_flow_surfaces.flowSurfaceExamples.exportBlueprint),
|
|
620
|
+
responses: responses("FlowSurfaceExportBlueprintResponse")
|
|
621
|
+
},
|
|
622
|
+
listNavigationTargets: {
|
|
623
|
+
tags: [FLOW_SURFACES_TAG],
|
|
624
|
+
summary: "List available UI layouts and role-accessible Multi-portal entries",
|
|
625
|
+
description: valuesCompatibilityNote(
|
|
626
|
+
`Returns the default Admin target, enabled UI layouts, and enabled custom Multi-portal targets visible to the current roles. capabilities.multiPortal=false and an empty custom-portal set are normal when the commercial Multi-portal capability is not installed. Reserved default portal records are never returned as custom workspaces; Admin and Mobile use their ordinary layout uids. Call this action only when the user explicitly names a workspace or asks to discover navigation targets. ${FLOW_SURFACES_READ_ACL_NOTE}`
|
|
627
|
+
),
|
|
628
|
+
requestBody: requestBody("FlowSurfaceListNavigationTargetsRequest", {}),
|
|
629
|
+
responses: responses("FlowSurfaceListNavigationTargetsResult")
|
|
630
|
+
},
|
|
609
631
|
applyBlueprint: {
|
|
610
632
|
tags: [FLOW_SURFACES_TAG],
|
|
611
633
|
summary: "Apply a page blueprint to create or replace one Modern page",
|
|
612
634
|
description: valuesCompatibilityNote(
|
|
613
|
-
`Accepts one simplified JSON page blueprint and compiles it to internal flow-surface operations. The public blueprint describes page structure (\`create\` or \`replace\`, page metadata, ordered tabs, blocks, fields, actions, inline popups, optional reusable assets) and optional top-level \`reaction.items[]\` for whole-page interaction authoring. Each reaction item targets an explicit local key / bind key produced by the same blueprint run. Only explicitly listed reaction items are written. \`rules: []\` clears the targeted slot. Repeating the same \`(type, target)\` reaction slot in one blueprint is invalid. In \`replace\`, reaction targets always bind to the newly produced blueprint result, not historical nodes from the previous page version; if a slot must exist in the resulting surface, include it explicitly instead of relying on omission. Localized reaction edits on an existing surface should use \`getReactionMeta\` + \`set*Rules\` instead of applying a whole page blueprint again. The request body is that page-document JSON object itself and must not be JSON-stringified. Wrong: \`{ "requestBody": "{\\"version\\":\\"1\\"}" }\`. Internal planning details stay hidden. In \`create\`, \`navigation.group.routeId\` has the highest priority when targeting an existing menu group. If \`routeId\` is present, applyBlueprint ignores \`title\`, \`icon\`, \`tooltip\`, and \`hideInMenu\` on \`navigation.group\`; applyBlueprint create mode does not mutate existing group metadata, so callers should use \`updateMenu\` separately when that is required. When \`routeId\` is omitted and \`navigation.group.title\` is provided, applyBlueprint reuses one existing same-title group when it is unique, creates a new group when none exists, and rejects ambiguous multi-match cases. Metadata such as \`icon\`, \`tooltip\`, and \`hideInMenu\` is used only when a new group is created and is ignored when an existing group is reused. \`replace\` uses \`target.pageSchemaUid\`, updates only the explicit page-level fields provided in \`page\`, maps blueprint tabs to existing route-backed tab slots by index, rewrites each slot in order, removes trailing old tabs, and appends extra new tabs when needed. Tab and block keys are optional in the public blueprint; omit them unless custom layout or cross-block targeting needs a stable in-document identifier. \`layout\` is only allowed on tabs and inline popup documents; blocks themselves do not accept a \`layout\` property. Public applyBlueprint blocks do not support generic \`form\`; use \`editForm\` or \`createForm\`. AI employee actions use \`type: "aiEmployee"\` plus public \`settings.username\`, \`workContext\`, \`tasks\`, \`auto\`, and \`style\`; work context may target \`self\` or a same-blueprint block key and is persisted as real Flow Model \`uid\` values. For JS blocks/fields/actions, \`script\` is a non-empty string asset key into \`assets.scripts\`; put inline JS in \`settings.code\` and \`settings.version\`. Direct \`table\` / \`list\` / \`gridCard\` / \`calendar\` / \`kanban\` blocks may omit \`defaultFilter\`; the backend generates one from live metadata with up to 4 scalar/filterable fields. Explicit values must contain at least the smaller of 3 and the collection eligible-field count, and values with more than 4 fields are truncated before persistence. A valid explicit or generated block-level value backfills the default \`filter\` action \`settings.defaultFilter\`; explicit filter-action \`settings.defaultFilter\` still wins. ${TREE_TABLE_RECORD_ACTION_DEFAULTS_NOTE} ${APPLY_BLUEPRINT_TREE_TABLE_TITLE_FIELD_NOTE} Inline popup documents may set \`popup.tryTemplate=true\` to ask the backend for the best compatible popup template before falling back to local popup content. Inline popup documents may also combine \`popup.tryTemplate\` with \`popup.saveAsTemplate={ name, description, local? }\`: a hit binds the matched template immediately and lets later inline popups in the same blueprint reuse that final bound template through \`popup.template={ local, mode }\`, while a miss requires explicit local \`popup.blocks\` so the fallback popup can be saved and reused. Custom \`edit\` popups that provide \`popup.blocks\` must include exactly one \`editForm\` block; that \`editForm\` may omit \`resource\` and then inherits the opener's current-record context. When layout is omitted, applyBlueprint auto-generates a simple top-to-bottom layout. When a \`replace\` run expands a page to multiple tabs while the current page still has \`enableTabs=false\`, callers must set \`page.enableTabs=true\` explicitly. The response hides execution internals and returns only the resolved page target and final surface readback.`
|
|
635
|
+
`In create mode, \`navigation.portalUid\` targets one enabled, role-accessible Multi-portal entry and is mutually exclusive with \`navigation.layoutUid\`. Portal-backed mobile layouts ignore \`navigation.group\`, while desktop-backed portals scope group reuse and duplicate-page identity to that portal. If Multi-portal is unavailable, ordinary requests without \`portalUid\` keep their existing Admin behavior. Accepts one simplified JSON page blueprint and compiles it to internal flow-surface operations. The public blueprint describes page structure (\`create\` or \`replace\`, page metadata, ordered tabs, blocks, fields, actions, inline popups, optional reusable assets) and optional top-level \`reaction.items[]\` for whole-page interaction authoring. Each reaction item targets an explicit local key / bind key produced by the same blueprint run. Only explicitly listed reaction items are written. \`rules: []\` clears the targeted slot. Repeating the same \`(type, target)\` reaction slot in one blueprint is invalid. In \`replace\`, reaction targets always bind to the newly produced blueprint result, not historical nodes from the previous page version; if a slot must exist in the resulting surface, include it explicitly instead of relying on omission. Localized reaction edits on an existing surface should use \`getReactionMeta\` + \`set*Rules\` instead of applying a whole page blueprint again. The request body is that page-document JSON object itself and must not be JSON-stringified. Wrong: \`{ "requestBody": "{\\"version\\":\\"1\\"}" }\`. Internal planning details stay hidden. In \`create\`, \`navigation.layoutUid\` optionally scopes menu group reuse, duplicate page identity checks, and newly created routes to an enabled UI layout such as \`admin-layout-model\` or \`mobile-layout-model\`; when the target layout type is mobile, applyBlueprint ignores \`navigation.group\` and creates a root-level mobile tab page. When \`layoutUid\` is omitted, routes keep the existing admin/default inheritance behavior. In non-mobile \`create\`, \`navigation.group.routeId\` has the highest priority when targeting an existing menu group. If \`routeId\` is present, applyBlueprint ignores \`title\`, \`icon\`, \`tooltip\`, and \`hideInMenu\` on \`navigation.group\`; applyBlueprint create mode does not mutate existing group metadata, so callers should use \`updateMenu\` separately when that is required. When \`routeId\` is omitted and \`navigation.group.title\` is provided, applyBlueprint reuses one existing same-title group in the target layout when it is unique, creates a new group when none exists, and rejects ambiguous multi-match cases. Metadata such as \`icon\`, \`tooltip\`, and \`hideInMenu\` is used only when a new group is created and is ignored when an existing group is reused. \`replace\` uses \`target.pageSchemaUid\`, updates only the explicit page-level fields provided in \`page\`, maps blueprint tabs to existing route-backed tab slots by index, rewrites each slot in order, removes trailing old tabs, and appends extra new tabs when needed. Tab and block keys are optional in the public blueprint; omit them unless custom layout or cross-block targeting needs a stable in-document identifier. \`layout\` is only allowed on tabs and inline popup documents; blocks themselves do not accept a \`layout\` property. Public applyBlueprint blocks do not support generic \`form\`; use \`editForm\` or \`createForm\`. AI employee actions use \`type: "aiEmployee"\` plus public \`settings.username\`, \`workContext\`, \`tasks\`, \`auto\`, and \`style\`; work context may target \`self\` or a same-blueprint block key and is persisted as real Flow Model \`uid\` values. For JS blocks/fields/actions, \`script\` is a non-empty string asset key into \`assets.scripts\`; put inline JS in \`settings.code\` and \`settings.version\`. Direct \`table\` / \`list\` / \`gridCard\` / \`calendar\` / \`kanban\` blocks may omit \`defaultFilter\`; the backend generates one from live metadata with up to 4 scalar/filterable fields. Explicit values must contain at least the smaller of 3 and the collection eligible-field count, and values with more than 4 fields are truncated before persistence. A valid explicit or generated block-level value backfills the default \`filter\` action \`settings.defaultFilter\`; explicit filter-action \`settings.defaultFilter\` still wins. ${TREE_TABLE_RECORD_ACTION_DEFAULTS_NOTE} ${APPLY_BLUEPRINT_TREE_TABLE_TITLE_FIELD_NOTE} Inline popup documents may set \`popup.tryTemplate=true\` to ask the backend for the best compatible popup template before falling back to local popup content. Inline popup documents may also combine \`popup.tryTemplate\` with \`popup.saveAsTemplate={ name, description, local? }\`: a hit binds the matched template immediately and lets later inline popups in the same blueprint reuse that final bound template through \`popup.template={ local, mode }\`, while a miss requires explicit local \`popup.blocks\` so the fallback popup can be saved and reused. Custom \`edit\` popups that provide \`popup.blocks\` must include exactly one \`editForm\` block; that \`editForm\` may omit \`resource\` and then inherits the opener's current-record context. When layout is omitted, applyBlueprint auto-generates a simple top-to-bottom layout. When a \`replace\` run expands a page to multiple tabs while the current page still has \`enableTabs=false\`, callers must set \`page.enableTabs=true\` explicitly. The response hides execution internals and returns only the resolved page target and final surface readback.`
|
|
614
636
|
),
|
|
615
637
|
requestBody: {
|
|
616
638
|
required: true,
|
|
@@ -641,7 +663,7 @@ const actionDocs = {
|
|
|
641
663
|
tags: [FLOW_SURFACES_TAG],
|
|
642
664
|
summary: "Apply an approval blueprint to initiator, approver, or task-card surfaces",
|
|
643
665
|
description: valuesCompatibilityNote(
|
|
644
|
-
"Builds workflow-approval configuration surfaces through the existing flowSurfaces orchestration layer instead of a separate approval resource. This is the preferred whole-surface bootstrap / replace entry for approval initiator, approver, and task-card UIs. Unlike route-backed `applyBlueprint`, this action targets approval-bound FlowModel roots stored on approval workflow trigger config (`workflow.config.approvalUid` / `workflow.config.taskCardUid`) or approval node config (`node.config.approvalUid` / `node.config.taskCardUid`). The backend creates or reuses the correct approval root automatically, rewrites the binding uid, applies a `replace` blueprint to that root, and reconciles approval runtime config derived from approval actions such as withdraw / approve / reject / return / delegate / add-assignee. `surface='initiator'` requires `workflowId` and writes page-like `blocks + layout` into `TriggerChildPageModel -> TriggerChildPageTabModel -> TriggerBlockGridModel`. `surface='approver'` requires `nodeId` and writes page-like `blocks + layout` into `ApprovalChildPageModel -> ApprovalChildPageTabModel -> ApprovalBlockGridModel`. Page-like `blocks[]` may
|
|
666
|
+
"Builds workflow-approval configuration surfaces through the existing flowSurfaces orchestration layer instead of a separate approval resource. This is the preferred whole-surface bootstrap / replace entry for approval initiator, approver, and task-card UIs. Unlike route-backed `applyBlueprint`, this action targets approval-bound FlowModel roots stored on approval workflow trigger config (`workflow.config.approvalUid` / `workflow.config.taskCardUid`) or approval node config (`node.config.approvalUid` / `node.config.taskCardUid`). The backend creates or reuses the correct approval root automatically, rewrites the binding uid, applies a `replace` blueprint to that root, and reconciles approval runtime config derived from approval actions such as withdraw / approve / reject / return / delegate / add-assignee. `surface='initiator'` requires `workflowId` and writes page-like `blocks + layout` into `TriggerChildPageModel -> TriggerChildPageTabModel -> TriggerBlockGridModel`. `approvalInitiator` creates `approvalSubmit` by default; do not include `approvalSubmit` in `blocks[].actions`, otherwise authoring validation returns aggregate `errors[]` and the same write must be retried after removing it. `surface='approver'` requires `nodeId` and writes page-like `blocks + layout` into `ApprovalChildPageModel -> ApprovalChildPageTabModel -> ApprovalBlockGridModel`. Page-like `blocks[]` may declare approval-specific block types, fixed generic block types (`markdown`, `jsBlock`), or reuse a saved block template through `template: { uid, mode }`. `surface='taskCard'` requires exactly one of `workflowId` or `nodeId` and writes `fields + layout` into `ApplyTaskCardDetailsModel` or `ApprovalTaskCardDetailsModel`. This v1 action does not cover legacy schema-config wiring; it focuses on approval FlowModel construction, binding persistence, and approval runtime-config synchronization. When `layout` is omitted, the backend generates a simple top-to-bottom layout for the resulting blocks or fields."
|
|
645
667
|
),
|
|
646
668
|
requestBody: {
|
|
647
669
|
required: true,
|
|
@@ -796,7 +818,7 @@ const actionDocs = {
|
|
|
796
818
|
tags: [FLOW_SURFACES_TAG],
|
|
797
819
|
summary: "Create a group menu or a bindable V2 menu item",
|
|
798
820
|
description: valuesCompatibilityNote(
|
|
799
|
-
'Creates a FlowSurfaces menu node. `type="group"` creates a menu group. `type="item"` creates a menu item that can be bound to a modern page (v2), and automatically fills in the flowPage route, the default hidden tab route, and the RootPageModel anchor.'
|
|
821
|
+
'Creates a FlowSurfaces menu node. `type="group"` creates a menu group. `type="item"` creates a menu item that can be bound to a modern page (v2), and automatically fills in the flowPage route, the default hidden tab route, and the RootPageModel anchor. Optional `layoutUid` scopes the route to an enabled UI layout. Optional `portalUid` scopes it to one enabled, role-accessible Multi-portal entry and is mutually exclusive with `layoutUid`. Omitted values keep the existing parent/default admin inheritance.'
|
|
800
822
|
),
|
|
801
823
|
requestBody: requestBody("FlowSurfaceCreateMenuRequest", import_flow_surfaces.flowSurfaceExamples.createMenu),
|
|
802
824
|
responses: responses("FlowSurfaceCreateMenuResult")
|
|
@@ -805,7 +827,7 @@ const actionDocs = {
|
|
|
805
827
|
tags: [FLOW_SURFACES_TAG],
|
|
806
828
|
summary: "Update menu title/icon/tooltip or move it under another group",
|
|
807
829
|
description: valuesCompatibilityNote(
|
|
808
|
-
"Updates menu display information, or moves a group / item to the top level or under another group. Only `group` and `flowPage` menu nodes are supported."
|
|
830
|
+
"Updates menu display information, or moves a group / item to the top level or under another group. Only `group` and `flowPage` menu nodes are supported. Pass `portalUid` when explicitly targeting a Multi-portal entry; the route and new parent must already belong to that portal."
|
|
809
831
|
),
|
|
810
832
|
requestBody: requestBody("FlowSurfaceUpdateMenuRequest", import_flow_surfaces.flowSurfaceExamples.updateMenu),
|
|
811
833
|
responses: responses("FlowSurfaceUpdateMenuResult")
|
|
@@ -814,7 +836,7 @@ const actionDocs = {
|
|
|
814
836
|
tags: [FLOW_SURFACES_TAG],
|
|
815
837
|
summary: "Initialize a modern page for an existing bindable menu item",
|
|
816
838
|
description: valuesCompatibilityNote(
|
|
817
|
-
"Initializes a modern page (v2) for an existing bindable menu item through `menuRouteId` first, and fills in the default BlockGridModel. In compatibility mode, if `menuRouteId` is omitted, the old behavior still applies and a top-level menu plus page will be created automatically. Before initialization, do not call page/tab lifecycle actions such as `addTab`, `updateTab`, `moveTab`, `removeTab`, or `destroyPage`."
|
|
839
|
+
"Initializes a modern page (v2) for an existing bindable menu item through `menuRouteId` first, and fills in the default BlockGridModel. Optional `layoutUid` asserts that the existing menu route belongs to the target UI layout. Optional `portalUid` asserts that it belongs to one enabled, role-accessible Multi-portal entry and is mutually exclusive with `layoutUid`. Omitted values preserve the route scope and keep default admin compatibility. In compatibility mode, if `menuRouteId` is omitted, the old behavior still applies and a top-level menu plus page will be created automatically. Before initialization, do not call page/tab lifecycle actions such as `addTab`, `updateTab`, `moveTab`, `removeTab`, or `destroyPage`."
|
|
818
840
|
),
|
|
819
841
|
requestBody: requestBody("FlowSurfaceCreatePageRequest", import_flow_surfaces.flowSurfaceExamples.createPage),
|
|
820
842
|
responses: responses("FlowSurfaceCreatePageResult")
|
|
@@ -1345,6 +1367,149 @@ const schemas = {
|
|
|
1345
1367
|
},
|
|
1346
1368
|
additionalProperties: false
|
|
1347
1369
|
},
|
|
1370
|
+
FlowSurfaceExportBlueprintUnsupportedPolicy: {
|
|
1371
|
+
type: "string",
|
|
1372
|
+
enum: ["error", "warn"],
|
|
1373
|
+
description: "`error` rejects visible nodes the v1 mapper cannot express. `warn` skips them and reports warnings/unsupported items."
|
|
1374
|
+
},
|
|
1375
|
+
FlowSurfaceExportBlueprintUnsupportedItem: {
|
|
1376
|
+
type: "object",
|
|
1377
|
+
required: ["kind", "path", "reasonCode", "manualAction"],
|
|
1378
|
+
properties: {
|
|
1379
|
+
kind: {
|
|
1380
|
+
type: "string",
|
|
1381
|
+
enum: ["page", "tab", "block", "field", "action", "recordAction", "reaction", "layout", "popup"]
|
|
1382
|
+
},
|
|
1383
|
+
use: {
|
|
1384
|
+
type: "string",
|
|
1385
|
+
example: "UnknownModel"
|
|
1386
|
+
},
|
|
1387
|
+
type: {
|
|
1388
|
+
type: "string",
|
|
1389
|
+
example: "unknown"
|
|
1390
|
+
},
|
|
1391
|
+
path: {
|
|
1392
|
+
type: "string",
|
|
1393
|
+
example: "$.tabs[0].blocks[2]"
|
|
1394
|
+
},
|
|
1395
|
+
reasonCode: {
|
|
1396
|
+
type: "string",
|
|
1397
|
+
example: "unsupported-node"
|
|
1398
|
+
},
|
|
1399
|
+
manualAction: {
|
|
1400
|
+
type: "string",
|
|
1401
|
+
example: "Recreate this block manually or add mapper support."
|
|
1402
|
+
}
|
|
1403
|
+
},
|
|
1404
|
+
additionalProperties: false
|
|
1405
|
+
},
|
|
1406
|
+
FlowSurfaceExportBlueprintTarget: {
|
|
1407
|
+
oneOf: [
|
|
1408
|
+
{
|
|
1409
|
+
type: "object",
|
|
1410
|
+
required: ["uid"],
|
|
1411
|
+
properties: {
|
|
1412
|
+
uid: { type: "string" }
|
|
1413
|
+
},
|
|
1414
|
+
additionalProperties: false
|
|
1415
|
+
},
|
|
1416
|
+
{
|
|
1417
|
+
type: "object",
|
|
1418
|
+
required: ["pageSchemaUid"],
|
|
1419
|
+
properties: {
|
|
1420
|
+
pageSchemaUid: { type: "string" }
|
|
1421
|
+
},
|
|
1422
|
+
additionalProperties: false
|
|
1423
|
+
},
|
|
1424
|
+
{
|
|
1425
|
+
type: "object",
|
|
1426
|
+
required: ["tabSchemaUid"],
|
|
1427
|
+
properties: {
|
|
1428
|
+
tabSchemaUid: { type: "string" }
|
|
1429
|
+
},
|
|
1430
|
+
additionalProperties: false
|
|
1431
|
+
},
|
|
1432
|
+
{
|
|
1433
|
+
type: "object",
|
|
1434
|
+
required: ["routeId"],
|
|
1435
|
+
properties: {
|
|
1436
|
+
routeId: { type: "string" }
|
|
1437
|
+
},
|
|
1438
|
+
additionalProperties: false
|
|
1439
|
+
}
|
|
1440
|
+
],
|
|
1441
|
+
description: "Exactly one root locator. v1 accepts pageSchemaUid, routeId, or a uid that resolves to the root page. tabSchemaUid and non-root uid targets return HTTP 400."
|
|
1442
|
+
},
|
|
1443
|
+
FlowSurfaceExportBlueprintRequest: {
|
|
1444
|
+
type: "object",
|
|
1445
|
+
required: ["target"],
|
|
1446
|
+
properties: {
|
|
1447
|
+
target: ref("FlowSurfaceExportBlueprintTarget"),
|
|
1448
|
+
options: {
|
|
1449
|
+
type: "object",
|
|
1450
|
+
properties: {
|
|
1451
|
+
unsupported: ref("FlowSurfaceExportBlueprintUnsupportedPolicy")
|
|
1452
|
+
},
|
|
1453
|
+
additionalProperties: false
|
|
1454
|
+
}
|
|
1455
|
+
},
|
|
1456
|
+
additionalProperties: false
|
|
1457
|
+
},
|
|
1458
|
+
FlowSurfaceExportBlueprintSource: {
|
|
1459
|
+
type: "object",
|
|
1460
|
+
required: ["target"],
|
|
1461
|
+
properties: {
|
|
1462
|
+
target: ref("FlowSurfaceApplyBlueprintTarget"),
|
|
1463
|
+
pageTitle: {
|
|
1464
|
+
type: "string"
|
|
1465
|
+
}
|
|
1466
|
+
},
|
|
1467
|
+
additionalProperties: false
|
|
1468
|
+
},
|
|
1469
|
+
FlowSurfaceExportBlueprintDocument: {
|
|
1470
|
+
type: "object",
|
|
1471
|
+
required: ["version", "mode", "target", "tabs", "assets"],
|
|
1472
|
+
description: "Prepared v1 applyBlueprint document in replace mode. It intentionally omits navigation and retains target.pageSchemaUid for same-instance replace.",
|
|
1473
|
+
properties: {
|
|
1474
|
+
version: {
|
|
1475
|
+
type: "string",
|
|
1476
|
+
enum: ["1"]
|
|
1477
|
+
},
|
|
1478
|
+
mode: {
|
|
1479
|
+
type: "string",
|
|
1480
|
+
enum: ["replace"]
|
|
1481
|
+
},
|
|
1482
|
+
target: ref("FlowSurfaceApplyBlueprintTarget"),
|
|
1483
|
+
page: ref("FlowSurfaceApplyBlueprintPage"),
|
|
1484
|
+
tabs: {
|
|
1485
|
+
type: "array",
|
|
1486
|
+
minItems: 1,
|
|
1487
|
+
items: ref("FlowSurfaceApplyBlueprintTab")
|
|
1488
|
+
},
|
|
1489
|
+
assets: ref("FlowSurfaceApplyBlueprintAssets"),
|
|
1490
|
+
reaction: ref("FlowSurfaceApplyBlueprintReaction")
|
|
1491
|
+
},
|
|
1492
|
+
additionalProperties: false
|
|
1493
|
+
},
|
|
1494
|
+
FlowSurfaceExportBlueprintResponse: {
|
|
1495
|
+
type: "object",
|
|
1496
|
+
required: ["document", "source", "warnings", "unsupported"],
|
|
1497
|
+
properties: {
|
|
1498
|
+
document: ref("FlowSurfaceExportBlueprintDocument"),
|
|
1499
|
+
source: ref("FlowSurfaceExportBlueprintSource"),
|
|
1500
|
+
warnings: {
|
|
1501
|
+
type: "array",
|
|
1502
|
+
items: {
|
|
1503
|
+
type: "string"
|
|
1504
|
+
}
|
|
1505
|
+
},
|
|
1506
|
+
unsupported: {
|
|
1507
|
+
type: "array",
|
|
1508
|
+
items: ref("FlowSurfaceExportBlueprintUnsupportedItem")
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
additionalProperties: false
|
|
1512
|
+
},
|
|
1348
1513
|
FlowSurfaceMutateWriteTarget: {
|
|
1349
1514
|
type: "object",
|
|
1350
1515
|
required: ["uid"],
|
|
@@ -1486,6 +1651,7 @@ const schemas = {
|
|
|
1486
1651
|
}
|
|
1487
1652
|
},
|
|
1488
1653
|
example: {},
|
|
1654
|
+
default: {},
|
|
1489
1655
|
supportsFlowContext: {
|
|
1490
1656
|
type: "boolean"
|
|
1491
1657
|
}
|
|
@@ -4005,16 +4171,72 @@ const schemas = {
|
|
|
4005
4171
|
},
|
|
4006
4172
|
additionalProperties: false
|
|
4007
4173
|
},
|
|
4174
|
+
FlowSurfaceListNavigationTargetsRequest: {
|
|
4175
|
+
type: "object",
|
|
4176
|
+
properties: {},
|
|
4177
|
+
additionalProperties: false
|
|
4178
|
+
},
|
|
4179
|
+
FlowSurfaceNavigationTargetCapabilities: {
|
|
4180
|
+
type: "object",
|
|
4181
|
+
required: ["multiPortal"],
|
|
4182
|
+
properties: {
|
|
4183
|
+
multiPortal: {
|
|
4184
|
+
type: "boolean",
|
|
4185
|
+
description: "Whether the optional Multi-portal collections and desktop-route relation are available."
|
|
4186
|
+
}
|
|
4187
|
+
},
|
|
4188
|
+
additionalProperties: false
|
|
4189
|
+
},
|
|
4190
|
+
FlowSurfaceNavigationTarget: {
|
|
4191
|
+
type: "object",
|
|
4192
|
+
required: ["kind", "uid", "title", "layoutUid"],
|
|
4193
|
+
properties: {
|
|
4194
|
+
kind: {
|
|
4195
|
+
type: "string",
|
|
4196
|
+
enum: ["layout", "portal"]
|
|
4197
|
+
},
|
|
4198
|
+
uid: {
|
|
4199
|
+
type: "string",
|
|
4200
|
+
description: "Stable target uid used for exact matching. Portal targets use their portal uid."
|
|
4201
|
+
},
|
|
4202
|
+
title: { type: "string" },
|
|
4203
|
+
icon: { type: "string", nullable: true },
|
|
4204
|
+
layoutUid: { type: "string" },
|
|
4205
|
+
layoutType: { type: "string" },
|
|
4206
|
+
routeName: { type: "string" },
|
|
4207
|
+
routePath: { type: "string" },
|
|
4208
|
+
authCheck: { type: "boolean" },
|
|
4209
|
+
default: { type: "boolean" },
|
|
4210
|
+
portalUid: {
|
|
4211
|
+
type: "string",
|
|
4212
|
+
description: "Present only for a custom Multi-portal target."
|
|
4213
|
+
}
|
|
4214
|
+
},
|
|
4215
|
+
additionalProperties: false
|
|
4216
|
+
},
|
|
4217
|
+
FlowSurfaceListNavigationTargetsResult: {
|
|
4218
|
+
type: "object",
|
|
4219
|
+
required: ["version", "capabilities", "targets"],
|
|
4220
|
+
properties: {
|
|
4221
|
+
version: { type: "string", enum: ["1"] },
|
|
4222
|
+
capabilities: ref("FlowSurfaceNavigationTargetCapabilities"),
|
|
4223
|
+
targets: {
|
|
4224
|
+
type: "array",
|
|
4225
|
+
items: ref("FlowSurfaceNavigationTarget")
|
|
4226
|
+
}
|
|
4227
|
+
},
|
|
4228
|
+
additionalProperties: false
|
|
4229
|
+
},
|
|
4008
4230
|
FlowSurfaceApplyBlueprintNavigationGroup: {
|
|
4009
4231
|
type: "object",
|
|
4010
4232
|
properties: {
|
|
4011
4233
|
routeId: {
|
|
4012
4234
|
...STRING_OR_INTEGER_SCHEMA,
|
|
4013
|
-
description: "Preferred existing menu-group route id. When present, routeId has the highest priority and title/icon/tooltip/hideInMenu are ignored. applyBlueprint create mode does not mutate existing group metadata; use low-level updateMenu separately when needed."
|
|
4235
|
+
description: "Preferred existing menu-group route id for non-mobile create mode. When present, routeId has the highest priority and title/icon/tooltip/hideInMenu are ignored. Ignored when navigation.layoutUid targets a mobile layout or navigation.portalUid resolves to a mobile-backed portal because mobile pages are created as root tabs. applyBlueprint create mode does not mutate existing group metadata; use low-level updateMenu separately when needed."
|
|
4014
4236
|
},
|
|
4015
4237
|
title: {
|
|
4016
4238
|
type: "string",
|
|
4017
|
-
description: "Group title for create mode. When `routeId` is omitted, applyBlueprint reuses a same-title group if the match is unique, creates one when no group exists, and rejects ambiguous multi-match cases. If an existing group is reused, group metadata is ignored; use low-level updateMenu to change existing group metadata."
|
|
4239
|
+
description: "Group title for non-mobile create mode. When `routeId` is omitted, applyBlueprint reuses a same-title group if the match is unique, creates one when no group exists, and rejects ambiguous multi-match cases. Ignored when navigation.layoutUid targets a mobile layout or navigation.portalUid resolves to a mobile-backed portal because mobile pages are created as root tabs. If an existing group is reused, group metadata is ignored; use low-level updateMenu to change existing group metadata."
|
|
4018
4240
|
},
|
|
4019
4241
|
icon: {
|
|
4020
4242
|
type: "string",
|
|
@@ -4034,6 +4256,14 @@ const schemas = {
|
|
|
4034
4256
|
FlowSurfaceApplyBlueprintNavigation: {
|
|
4035
4257
|
type: "object",
|
|
4036
4258
|
properties: {
|
|
4259
|
+
layoutUid: {
|
|
4260
|
+
type: "string",
|
|
4261
|
+
description: "Optional enabled UI layout uid that scopes create-mode route lookup and newly created routes. Use `mobile-layout-model` for mobile pages; mobile layouts ignore navigation.group and create a root-level tab page. When omitted, the server preserves the existing parent/default admin layout behavior."
|
|
4262
|
+
},
|
|
4263
|
+
portalUid: {
|
|
4264
|
+
type: "string",
|
|
4265
|
+
description: "Optional enabled, role-accessible custom Multi-portal uid. Mutually exclusive with layoutUid. The portal backing layout decides desktop vs mobile behavior, and route lookup plus duplicate-page identity are scoped to the portal."
|
|
4266
|
+
},
|
|
4037
4267
|
group: ref("FlowSurfaceApplyBlueprintNavigationGroup"),
|
|
4038
4268
|
item: {
|
|
4039
4269
|
type: "object",
|
|
@@ -4249,7 +4479,7 @@ const schemas = {
|
|
|
4249
4479
|
FlowSurfaceApplyBlueprintRequest: {
|
|
4250
4480
|
type: "object",
|
|
4251
4481
|
required: ["mode", "tabs"],
|
|
4252
|
-
description: `Simplified page-structure request object for applyBlueprint. \`version\` may be omitted and defaults to '1'. Runtime validation enforces mode-specific rules: create does not accept target, while replace requires target.pageSchemaUid and does not use navigation. For JS blocks/fields/actions, \`script\` is a non-empty string asset key into \`assets.scripts\`, and referenced script assets must provide non-empty \`code\`; put inline JS in \`settings.code\` and \`settings.version\`. ${TREE_TABLE_RECORD_ACTION_DEFAULTS_NOTE} ${APPLY_BLUEPRINT_TREE_TABLE_TITLE_FIELD_NOTE} \`defaults.collections\` may provide main data-source collection-level fieldGroups, popup metadata with required \`name\` and \`description\`, and formBehavior for generated default add/edit popup forms; use \`defaults.dataSources.<dataSourceKey>.collections\` for external data sources. v1 does not support \`defaults.blocks\`.`,
|
|
4482
|
+
description: `Simplified page-structure request object for applyBlueprint. \`version\` may be omitted and defaults to '1'. Runtime validation enforces mode-specific rules: create does not accept target, while replace requires target.pageSchemaUid and does not use navigation. In create mode, \`navigation.layoutUid\` scopes menu group reuse, duplicate page identity, and newly created routes to the target layout; use \`mobile-layout-model\` for mobile pages, where \`navigation.group\` is ignored and the page is created as a root tab, and omit it for default admin behavior. For JS blocks/fields/actions, \`script\` is a non-empty string asset key into \`assets.scripts\`, and referenced script assets must provide non-empty \`code\`; put inline JS in \`settings.code\` and \`settings.version\`. ${TREE_TABLE_RECORD_ACTION_DEFAULTS_NOTE} ${APPLY_BLUEPRINT_TREE_TABLE_TITLE_FIELD_NOTE} \`defaults.collections\` may provide main data-source collection-level fieldGroups, popup metadata with required \`name\` and \`description\`, and formBehavior for generated default add/edit popup forms; use \`defaults.dataSources.<dataSourceKey>.collections\` for external data sources. v1 does not support \`defaults.blocks\`.`,
|
|
4253
4483
|
properties: {
|
|
4254
4484
|
version: {
|
|
4255
4485
|
type: "string",
|
|
@@ -4336,7 +4566,7 @@ const schemas = {
|
|
|
4336
4566
|
FlowSurfaceApplyApprovalBlueprintRequest: {
|
|
4337
4567
|
type: "object",
|
|
4338
4568
|
required: ["surface"],
|
|
4339
|
-
description: "Simplified approval-surface blueprint request for workflow approval UIs. This is the preferred bootstrap / replace route for approval initiator, approver, and task-card surfaces. `version` may be omitted and defaults to '1'. `mode` may be omitted and defaults to `replace`; v1 only supports `replace`. Runtime validation enforces binding rules: `initiator` requires `workflowId`, `approver` requires `nodeId`, and `taskCard` requires exactly one of `workflowId` or `nodeId`. Page-like surfaces (`initiator`, `approver`) accept `blocks + layout`; each block may declare `
|
|
4569
|
+
description: "Simplified approval-surface blueprint request for workflow approval UIs. This is the preferred bootstrap / replace route for approval initiator, approver, and task-card surfaces. `version` may be omitted and defaults to '1'. `mode` may be omitted and defaults to `replace`; v1 only supports `replace`. Runtime validation enforces binding rules: `initiator` requires `workflowId`, `approver` requires `nodeId`, and `taskCard` requires exactly one of `workflowId` or `nodeId`. Page-like surfaces (`initiator`, `approver`) accept `blocks + layout`; each block may declare approval-specific types, fixed generic types (`markdown`, `jsBlock`), or reuse `template: { uid, mode }`. `approvalInitiator` creates `approvalSubmit` by default, so callers should only add optional initiator actions such as `approvalSaveDraft` or `approvalWithdraw`. `taskCard` accepts `fields + layout`. This route does not perform schema wiring, but it does persist binding fields and reconcile approval runtime config from approval actions. Authoring validation failures use the same aggregate `errors[]` retry contract as `applyBlueprint`.",
|
|
4340
4570
|
properties: {
|
|
4341
4571
|
version: {
|
|
4342
4572
|
type: "string",
|
|
@@ -4421,6 +4651,14 @@ const schemas = {
|
|
|
4421
4651
|
type: "object",
|
|
4422
4652
|
required: ["title"],
|
|
4423
4653
|
properties: {
|
|
4654
|
+
layoutUid: {
|
|
4655
|
+
type: "string",
|
|
4656
|
+
description: "Optional enabled UI layout uid for the created menu route, for example `mobile-layout-model`. When omitted, the route inherits its parent layout or the default admin layout."
|
|
4657
|
+
},
|
|
4658
|
+
portalUid: {
|
|
4659
|
+
type: "string",
|
|
4660
|
+
description: "Optional enabled, role-accessible custom Multi-portal uid. Mutually exclusive with layoutUid. When omitted, a portal parent is inherited and root creates keep default Admin behavior."
|
|
4661
|
+
},
|
|
4424
4662
|
title: {
|
|
4425
4663
|
type: "string"
|
|
4426
4664
|
},
|
|
@@ -4478,6 +4716,10 @@ const schemas = {
|
|
|
4478
4716
|
required: ["menuRouteId"],
|
|
4479
4717
|
properties: {
|
|
4480
4718
|
menuRouteId: STRING_OR_INTEGER_SCHEMA,
|
|
4719
|
+
portalUid: {
|
|
4720
|
+
type: "string",
|
|
4721
|
+
description: "Optional custom Multi-portal uid used to assert the route and any new parent are in the same accessible workspace."
|
|
4722
|
+
},
|
|
4481
4723
|
title: {
|
|
4482
4724
|
type: "string"
|
|
4483
4725
|
},
|
|
@@ -4517,6 +4759,14 @@ const schemas = {
|
|
|
4517
4759
|
FlowSurfaceCreatePageRequest: {
|
|
4518
4760
|
type: "object",
|
|
4519
4761
|
properties: {
|
|
4762
|
+
layoutUid: {
|
|
4763
|
+
type: "string",
|
|
4764
|
+
description: "Optional enabled UI layout uid. With `menuRouteId`, the existing route must already belong to this layout. Without `menuRouteId`, the compatibility create-menu fallback creates the route in this layout."
|
|
4765
|
+
},
|
|
4766
|
+
portalUid: {
|
|
4767
|
+
type: "string",
|
|
4768
|
+
description: "Optional enabled, role-accessible custom Multi-portal uid. Mutually exclusive with layoutUid. With menuRouteId, the route must already belong to this portal."
|
|
4769
|
+
},
|
|
4520
4770
|
menuRouteId: STRING_OR_INTEGER_SCHEMA,
|
|
4521
4771
|
pageSchemaUid: {
|
|
4522
4772
|
type: "string"
|