openyida 2026.9.21 → 2026.9.22-beta.2
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/README.md +14 -20
- package/bin/yida.js +6 -11
- package/lib/app/app-list.js +3 -7
- package/lib/app/canvas-compile.js +12 -22
- package/lib/app/check-prd-completeness.js +0 -7
- package/lib/app/create-app.js +1 -4
- package/lib/app/create-form/args.js +12 -37
- package/lib/app/create-form/batch.js +11 -86
- package/lib/app/create-form.js +86 -193
- package/lib/app/create-page.js +17 -84
- package/lib/app/custom-theme.js +0 -11
- package/lib/app/form-field-validator.js +41 -26
- package/lib/app/form-open-guard.js +10 -97
- package/lib/app/get-form-config.js +0 -1
- package/lib/app/inline-css-guard.js +31 -1
- package/lib/app/services/form-compiler.js +4 -2
- package/lib/app/theme-from-design.js +41 -144
- package/lib/app/theme-presets.js +1 -1
- package/lib/app/update-app.js +13 -63
- package/lib/asset/ai-image.js +9 -59
- package/lib/asset/asset-cmd.js +7 -18
- package/lib/asset/asset-plan.js +9 -102
- package/lib/asset/asset-resolve.js +10 -55
- package/lib/asset/asset-status.js +4 -5
- package/lib/asset/host-capabilities.js +2 -11
- package/lib/asset/url-verify.js +4 -19
- package/lib/auth/dws-sync.js +148 -0
- package/lib/auth/token-auth.js +73 -9
- package/lib/auth/token-store.js +50 -0
- package/lib/connector/connector-test.js +5 -19
- package/lib/connector/contract.js +1 -3
- package/lib/core/agent-capabilities.js +16 -19
- package/lib/core/command-manifest.js +40 -329
- package/lib/core/locales/en.js +17 -74
- package/lib/core/locales/zh.js +16 -73
- package/lib/core/redact.js +10 -15
- package/lib/core/sample.js +30 -72
- package/lib/core/utils.js +4 -0
- package/lib/design-plan/design-plan.js +4 -51
- package/lib/design-plan/init.js +26 -121
- package/lib/design-plan/materialize.js +348 -451
- package/lib/design-plan/normalize.js +29 -74
- package/lib/design-plan/parallel.js +16 -71
- package/lib/design-plan/patch.js +16 -63
- package/lib/design-plan/preview.js +8 -6
- package/lib/design-plan/validate.js +11 -71
- package/lib/process/create-process.js +50 -84
- package/lib/samples/openyida-scaffold/canvas-form-drawer.canvas.jsx +90 -20
- package/lib/samples/openyida-scaffold/canvas-nav/content.jsx +13 -93
- package/lib/samples/openyida-scaffold/canvas-nav/data.jsx +18 -100
- package/lib/samples/openyida-scaffold/canvas-nav/mixed.jsx +4 -6
- package/lib/samples/openyida-scaffold/canvas-nav/shared.jsx +5 -5
- package/lib/samples/openyida-scaffold/canvas-nav/side.jsx +2 -1
- package/lib/samples/openyida-scaffold/canvas-nav/sidebar.jsx +1 -1
- package/lib/samples/openyida-scaffold/canvas-nav/top.jsx +9 -15
- package/lib/samples/yida-canvas-table-form/table-form-batch-submit.canvas.jsx +83 -9
- package/lib/samples/yida-rechart/trend-combo.canvas.jsx +87 -14
- package/package.json +1 -3
- package/scripts/postinstall.js +3 -3
- package/yida-skills/SKILL.md +16 -19
- package/yida-skills/references/official-example-schema-patterns.md +1 -1
- package/yida-skills/references/yida-api.md +0 -4
- package/yida-skills/skills/yida-app/SKILL.md +23 -46
- package/yida-skills/skills/yida-app/workflow/parallel-work.md +6 -15
- package/yida-skills/skills/yida-app/workflow/plan/step-1-understand.md +1 -1
- package/yida-skills/skills/yida-app/workflow/plan/step-2-confirm.md +1 -1
- package/yida-skills/skills/yida-app/workflow/plan/step-4-deliver.md +15 -29
- package/yida-skills/skills/yida-app/workflow/plan/workflow.md +11 -29
- package/yida-skills/skills/yida-app/workflow/step-1-resource-context.md +2 -4
- package/yida-skills/skills/yida-app/workflow/step-2-design.md +9 -23
- package/yida-skills/skills/yida-app/workflow/step-3-create-or-reuse-app.md +4 -6
- package/yida-skills/skills/yida-app/workflow/step-4-forms-processes.md +4 -15
- package/yida-skills/skills/yida-app/workflow/step-6-main-page.md +4 -6
- package/yida-skills/skills/yida-app/workflow/step-7-page-code.md +9 -15
- package/yida-skills/skills/yida-app/workflow/step-8-publish-navigation.md +11 -25
- package/yida-skills/skills/yida-app/workflow/step-9-output-finish.md +28 -68
- package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +43 -42
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-style-implementation-guide.md +44 -60
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-theme-provider.md +50 -72
- package/yida-skills/skills/yida-canvas-custom-page/references/component-library-guide.md +1 -13
- package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +1 -140
- package/yida-skills/skills/yida-canvas-custom-page/references/navigation-and-entry-guide.md +72 -101
- package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +32 -35
- package/yida-skills/skills/yida-canvas-custom-page/scripts/build-canvas-theme.js +3 -29
- package/yida-skills/skills/yida-canvas-custom-page/scripts/canvas-theme-provider.template.jsx +6 -69
- package/yida-skills/skills/yida-canvas-data-binding/SKILL.md +0 -26
- package/yida-skills/skills/yida-create-app/SKILL.md +0 -2
- package/yida-skills/skills/yida-create-form-page/SKILL.md +58 -72
- package/yida-skills/skills/yida-create-form-page/references/advanced-form-modes.md +5 -5
- package/yida-skills/skills/yida-create-form-page/references/association-form-field.md +4 -4
- package/yida-skills/skills/yida-create-form-page/references/batch-forms.md +5 -6
- package/yida-skills/skills/yida-create-form-page/references/field-definition-guide.md +19 -7
- package/yida-skills/skills/yida-create-form-page/references/form-field-properties.md +44 -62
- package/yida-skills/skills/yida-create-page/SKILL.md +6 -14
- package/yida-skills/skills/yida-create-process/SKILL.md +2 -13
- package/yida-skills/skills/yida-custom-page/SKILL.md +0 -2
- package/yida-skills/skills/yida-custom-page/references/design-system.md +1 -1
- package/yida-skills/skills/yida-dashboard/SKILL.md +4 -5
- package/yida-skills/skills/yida-data-management/SKILL.md +2 -4
- package/yida-skills/skills/yida-data-management/references/data-format-guide.md +4 -4
- package/yida-skills/skills/yida-design/SKILL.md +14 -29
- package/yida-skills/skills/yida-design/references/app/blueprint.md +70 -0
- package/yida-skills/skills/yida-design/references/app/navigation-patterns.md +43 -0
- package/yida-skills/skills/yida-design/references/app/role-journey.md +30 -0
- package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +42 -67
- package/yida-skills/skills/yida-design/references/asset-workflow.md +2 -6
- package/yida-skills/skills/yida-design/references/design-mode.md +4 -4
- package/yida-skills/skills/yida-design/references/page-quality-gates.md +38 -26
- package/yida-skills/skills/yida-design/references/style-design-selection.md +137 -0
- package/yida-skills/skills/yida-design/references/style-designs/_design-md-template.md +185 -0
- package/yida-skills/skills/yida-design/references/style-designs/aqua-service-progress-dashboard.md +242 -0
- package/yida-skills/skills/yida-design/references/style-designs/blue-insight-operations-dashboard.md +243 -0
- package/yida-skills/skills/yida-design/references/style-designs/blue-productivity-insight-workbench.md +242 -0
- package/yida-skills/skills/yida-design/references/style-designs/command-filter-card-console.md +304 -0
- package/yida-skills/skills/yida-design/references/style-designs/contrast-command-analytics-workbench.md +261 -0
- package/yida-skills/skills/yida-design/references/style-designs/dark-stage-analytic-dashboard.md +369 -0
- package/yida-skills/skills/yida-design/references/style-designs/filterable-card-catalog.md +354 -0
- package/yida-skills/skills/yida-design/references/style-designs/green-timeline-progress-workbench.md +250 -0
- package/yida-skills/skills/yida-design/references/style-designs/registry.md +117 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-analytic-workbench.md +348 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-blue-grid-analytic-dashboard.md +658 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-bordered-analytic-workbench.md +385 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-curated-filter-gallery.md +300 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-modular-analytic-workbench.md +404 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-progress-analytics-workbench.md +382 -0
- package/yida-skills/skills/yida-design/references/style-designs/soft-timeline-analytics-workbench.md +367 -0
- package/yida-skills/skills/yida-design/references/style-designs/teal-rail-analytics-workbench.md +341 -0
- package/yida-skills/skills/yida-design/references/theme/app-custom-theme-template.css +432 -350
- package/yida-skills/skills/yida-design/references/visual-decision-engine.md +143 -19
- package/yida-skills/skills/yida-design/references/visual-scaffold-recipes.md +27 -15
- package/yida-skills/skills/yida-design/sub_skill/page-design/SKILL.md +0 -4
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/SKILL.md +8 -22
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/README.md +10 -14
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/build-plan-template.html +4 -9
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-compact-schema.md +27 -49
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-schema.md +154 -33
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-design.md +127 -48
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-theme-selection.md +51 -37
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py +48 -43
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/validate_design_themes.py +190 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/README.md +98 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-media-grid.md +339 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-modular-clarity.md +348 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-structured-clarity.md +344 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ambient-halo-layered.md +345 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-focus-layered.md +355 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-luminous-modular.md +377 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/deep-stage-duotone.md +352 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/hairline-runway-clarity.md +389 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/high-contrast-modular.md +364 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/index.json +329 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/interlocked-vivid-modules.md +348 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/matrix-grid-focus.md +345 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/media-rail-inspector.md +379 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mist-layered-signal.md +347 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/modular-rail-signal.md +352 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mono-grid-signal.md +386 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ribbon-ledger-lift.md +384 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/segmented-meter-clarity.md +388 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/split-rail-precision.md +341 -0
- package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/status-framed-media-grid.md +361 -0
- package/yida-skills/skills/yida-design/workflow/output-design.md +375 -117
- package/yida-skills/skills/yida-design/workflow/output-prd.md +185 -0
- package/yida-skills/skills/yida-design/workflow/step-1-read-brief.md +1 -1
- package/yida-skills/skills/yida-design/workflow/step-2-theme-system.md +29 -33
- package/yida-skills/skills/yida-design/workflow/step-4-wireframe-interaction.md +1 -3
- package/yida-skills/skills/yida-design/workflow/step-5-visual-states.md +106 -22
- package/yida-skills/skills/yida-design/workflow/step-6-handoff.md +22 -15
- package/yida-skills/skills/yida-form-permission/SKILL.md +0 -6
- package/yida-skills/skills/yida-image-assets/SKILL.md +50 -73
- package/yida-skills/skills/yida-image-assets/references/manifest-contract.md +52 -82
- package/yida-skills/skills/yida-image-assets/references/source-policy.md +15 -14
- package/yida-skills/skills/yida-integration/SKILL.md +0 -1
- package/yida-skills/skills/yida-login/SKILL.md +0 -2
- package/yida-skills/skills/yida-nav-group/SKILL.md +2 -4
- package/yida-skills/skills/yida-nav-shell/SKILL.md +12 -36
- package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +136 -79
- package/yida-skills/skills/yida-page-config/SKILL.md +4 -13
- package/yida-skills/skills/yida-prd/SKILL.md +3 -5
- package/yida-skills/skills/yida-prd/references/app/blueprint.md +4 -4
- package/yida-skills/skills/yida-prd/references/app/navigation-patterns.md +3 -6
- package/yida-skills/skills/yida-prd/references/app/role-journey.md +3 -5
- package/yida-skills/skills/yida-prd/references/plan-content.md +0 -4
- package/yida-skills/skills/yida-prd/workflow/output-prd.md +11 -18
- package/yida-skills/skills/yida-prd/workflow/plan-business.md +4 -4
- package/yida-skills/skills/yida-prd/workflow/step-2-information-architecture.md +8 -11
- package/yida-skills/skills/yida-publish-page/SKILL.md +1 -9
- package/yida-skills/skills/yida-requirement-analysis/SKILL.md +39 -10
- package/yida-skills/skills/yida-requirement-analysis/workflow/prepare-brief.md +71 -40
- package/yida-skills/skills-index.json +16 -36
- package/lib/app/application-entry-urls.js +0 -31
- package/lib/app/application-style.js +0 -69
- package/lib/app/canvas-icon-exports.json +0 -6160
- package/lib/app/canvas-icon-guard.js +0 -87
- package/lib/app/canvas-navigation-guard.js +0 -84
- package/lib/app/canvas-path-guard.js +0 -78
- package/lib/app/canvas-theme-guard.js +0 -184
- package/lib/app/form-data-response-guard.js +0 -57
- package/lib/asset/asset-execution.js +0 -79
- package/lib/core/css-structure.js +0 -37
- package/lib/design/check-design.js +0 -51
- package/lib/design/document.js +0 -458
- package/lib/design/icon-contrast.js +0 -85
- package/lib/design/page-content.js +0 -11
- package/lib/design-plan/artifact-updates.js +0 -117
- package/lib/design-plan/confirmation.js +0 -13
- package/lib/design-plan/entry-navigation.js +0 -97
- package/lib/design-plan/navigation-policy.js +0 -38
- package/lib/design-plan/rebase.js +0 -60
- package/lib/design-plan/themes.js +0 -101
- package/lib/design-plan/visual-policy.js +0 -42
- package/lib/samples/openyida-scaffold/canvas-admin-entry.jsx +0 -62
- package/lib/samples/openyida-scaffold/canvas-navigation.jsx +0 -56
- package/lib/samples/openyida-scaffold/canvas-view-state.jsx +0 -74
- package/yida-skills/skills/yida-app/references/entry-navigation.md +0 -193
- package/yida-skills/skills/yida-canvas-custom-page/references/view-state-recovery.md +0 -52
- package/yida-skills/skills/yida-canvas-data-binding/references/business-action-permissions.md +0 -31
- package/yida-skills/skills/yida-design/references/application-style-library.md +0 -93
- package/yida-skills/skills/yida-design/references/application-theme-consistency.md +0 -150
- package/yida-skills/skills/yida-design/references/native-form-styles.md +0 -208
- package/yida-skills/skills/yida-design/references/navigation-decision.md +0 -53
- package/yida-skills/skills/yida-design/references/page-continuity.md +0 -42
- package/yida-skills/skills/yida-design/references/theme/application-style-recipes.css +0 -58
- package/yida-skills/skills/yida-design/references/theme-selection.md +0 -67
- package/yida-skills/skills/yida-design/scripts/validate_design_themes.py +0 -302
- package/yida-skills/skills/yida-design/templates/application-styles.json +0 -398
- package/yida-skills/skills/yida-design/templates/design-themes/README.md +0 -73
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-amber/form-layout.json +0 -15
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-executive/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-finance/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-glass/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-line/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-neon/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/app_theme.css +0 -754
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/design.md +0 -279
- package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-paper/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-plum/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/app_theme.css +0 -758
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/design.md +0 -281
- package/yida-skills/skills/yida-design/templates/design-themes/app-pop/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-sage/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-teal/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/app_theme.css +0 -754
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/design.md +0 -279
- package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/app_theme.css +0 -752
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/design.md +0 -278
- package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/app_theme.css +0 -748
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/design.md +0 -274
- package/yida-skills/skills/yida-design/templates/design-themes/app-wire/form-layout.json +0 -14
- package/yida-skills/skills/yida-design/templates/design-themes/basic-tokens.json +0 -118
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/app_theme.css +0 -690
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/design.md +0 -382
- package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/design.md +0 -380
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/app_theme.css +0 -696
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/design.md +0 -378
- package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/app_theme.css +0 -689
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/design.md +0 -238
- package/yida-skills/skills/yida-design/templates/design-themes/free-creative/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/app_theme.css +0 -692
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/design.md +0 -375
- package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/design.md +0 -362
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/design.md +0 -409
- package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/index.json +0 -464
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/app_theme.css +0 -701
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/design.md +0 -379
- package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/design.md +0 -404
- package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/app_theme.css +0 -698
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/design.md +0 -389
- package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/app_theme.css +0 -691
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/design.md +0 -372
- package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/app_theme.css +0 -690
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/design.md +0 -455
- package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/app_theme.css +0 -698
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/design.md +0 -394
- package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/app_theme.css +0 -692
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/design.md +0 -391
- package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/app_theme.css +0 -711
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/design.md +0 -408
- package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/app_theme.css +0 -692
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/design.md +0 -383
- package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/form-layout.json +0 -13
- package/yida-skills/skills/yida-design/templates/navigation-styles.json +0 -769
- package/yida-skills/skills/yida-requirement-analysis/references/experience-groups.md +0 -79
- package/yida-skills/skills/yida-requirement-analysis/references/handoff.md +0 -68
package/lib/app/create-form.js
CHANGED
|
@@ -101,8 +101,6 @@ const { SMART_VALIDATION_BLOCK_END, SMART_VALIDATION_BLOCK_START } = require('./
|
|
|
101
101
|
const { createFieldNormalizers } = require('./create-form/field-normalizers');
|
|
102
102
|
const {
|
|
103
103
|
validateFormFieldDefinitions: collectFormFieldValidationDiagnostics,
|
|
104
|
-
DIVIDER_TYPES,
|
|
105
|
-
DEFAULT_DIVIDER_TYPE,
|
|
106
104
|
} = require('./form-field-validator');
|
|
107
105
|
|
|
108
106
|
function parseOpenOption(inputArgs) {
|
|
@@ -288,9 +286,28 @@ const FORM_PRESENTATION_TYPE_ALIAS = {
|
|
|
288
286
|
columnContainer: 'ColumnsLayout',
|
|
289
287
|
Column: 'Column',
|
|
290
288
|
column: 'Column',
|
|
289
|
+
GroupContainer: 'PageSection',
|
|
290
|
+
groupContainer: 'PageSection',
|
|
291
|
+
PageSection: 'PageSection',
|
|
292
|
+
pageSection: 'PageSection',
|
|
291
293
|
};
|
|
292
294
|
|
|
293
|
-
const FORM_PRESENTATION_COMPONENTS = ['Divider', 'ColumnsLayout', 'Column'];
|
|
295
|
+
const FORM_PRESENTATION_COMPONENTS = ['Divider', 'ColumnsLayout', 'Column', 'PageSection'];
|
|
296
|
+
const DIVIDER_TYPE_PRIORITY = [
|
|
297
|
+
'bold-with-thin',
|
|
298
|
+
'double-color-trapezoid',
|
|
299
|
+
'left-dot-title',
|
|
300
|
+
'solid',
|
|
301
|
+
'dashed',
|
|
302
|
+
'thick',
|
|
303
|
+
'dotted',
|
|
304
|
+
];
|
|
305
|
+
const DEFAULT_DIVIDER_TYPE = DIVIDER_TYPE_PRIORITY[0];
|
|
306
|
+
const LEGACY_STRONG_DIVIDER_TYPE = 'multi-parallelograms-end';
|
|
307
|
+
const ALLOWED_DIVIDER_TYPES = new Set([
|
|
308
|
+
...DIVIDER_TYPE_PRIORITY,
|
|
309
|
+
LEGACY_STRONG_DIVIDER_TYPE,
|
|
310
|
+
]);
|
|
294
311
|
|
|
295
312
|
const COMPONENT_ALIAS_META = Symbol('openyida.componentAlias');
|
|
296
313
|
|
|
@@ -517,6 +534,13 @@ function normalizeI18nValue(value, fallback) {
|
|
|
517
534
|
return i18n(text, text, text);
|
|
518
535
|
}
|
|
519
536
|
|
|
537
|
+
function normalizeStyleChoice(value, fallback) {
|
|
538
|
+
if (value && typeof value === 'object') {
|
|
539
|
+
return value;
|
|
540
|
+
}
|
|
541
|
+
return { value: value || fallback };
|
|
542
|
+
}
|
|
543
|
+
|
|
520
544
|
function buildSchemaNode(componentName, props, children, options) {
|
|
521
545
|
const node = {
|
|
522
546
|
componentName: componentName,
|
|
@@ -550,12 +574,7 @@ function normalizeDividerType(type) {
|
|
|
550
574
|
return DEFAULT_DIVIDER_TYPE;
|
|
551
575
|
}
|
|
552
576
|
const normalized = String(type).trim();
|
|
553
|
-
|
|
554
|
-
throwCreateFormError(t('create_form.divider_type_invalid', normalized, DIVIDER_TYPES.join(', ')), 'CREATE_FORM_INVALID_DIVIDER_TYPE', {
|
|
555
|
-
actual: type, expected: DIVIDER_TYPES,
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
return normalized;
|
|
577
|
+
return ALLOWED_DIVIDER_TYPES.has(normalized) ? normalized : DEFAULT_DIVIDER_TYPE;
|
|
559
578
|
}
|
|
560
579
|
|
|
561
580
|
function buildDividerComponent(field) {
|
|
@@ -585,6 +604,41 @@ function buildDividerComponent(field) {
|
|
|
585
604
|
return buildSchemaNode('Divider', props, undefined, { fieldId: props.fieldId || fieldId });
|
|
586
605
|
}
|
|
587
606
|
|
|
607
|
+
function buildPageSectionComponent(field) {
|
|
608
|
+
const fieldId = field.fieldId || field.id || generateFieldId('PageSection');
|
|
609
|
+
const props = mergeExtraProps({
|
|
610
|
+
fieldId,
|
|
611
|
+
behavior: field.behavior || 'NORMAL',
|
|
612
|
+
visibility: field.visibility || ['PC', 'MOBILE'],
|
|
613
|
+
showHeader: field.showHeader !== undefined ? !!field.showHeader : true,
|
|
614
|
+
title: normalizeI18nValue(field.title !== undefined ? field.title : field.label, '分组'),
|
|
615
|
+
tooltip: normalizeI18nValue(field.tooltip || field.tips, ''),
|
|
616
|
+
showHeadDivider: field.showHeadDivider !== undefined ? !!field.showHeadDivider : true,
|
|
617
|
+
sectionHeaderStyle: field.sectionHeaderStyle || 'origin',
|
|
618
|
+
sectionHeaderBgColor: field.sectionHeaderBgColor || '#0089ff',
|
|
619
|
+
sectionHeaderTitleColor: field.sectionHeaderTitleColor || '#171A1D',
|
|
620
|
+
pcStyle: normalizeStyleChoice(field.pcStyle, 'origin'),
|
|
621
|
+
showBorder: !!field.showBorder,
|
|
622
|
+
withMargin: !!field.withMargin,
|
|
623
|
+
withPadding: field.withPadding !== undefined ? !!field.withPadding : true,
|
|
624
|
+
mobileStyle: normalizeStyleChoice(field.mobileStyle, 'origin'),
|
|
625
|
+
showBorderMobile: !!field.showBorderMobile,
|
|
626
|
+
withMarginMobile: !!field.withMarginMobile,
|
|
627
|
+
withPaddingMobile: !!field.withPaddingMobile,
|
|
628
|
+
}, field);
|
|
629
|
+
|
|
630
|
+
if (field.newIcon !== undefined) {
|
|
631
|
+
props.newIcon = field.newIcon;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return buildSchemaNode(
|
|
635
|
+
'PageSection',
|
|
636
|
+
props,
|
|
637
|
+
buildFormNodeComponents(field.children || []),
|
|
638
|
+
{ fieldId: props.fieldId || fieldId }
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
|
|
588
642
|
function countLayoutColumns(layout) {
|
|
589
643
|
const parts = String(layout || '12').split(':').filter(Boolean);
|
|
590
644
|
return parts.length || 1;
|
|
@@ -638,6 +692,9 @@ function buildFormNodeComponent(field) {
|
|
|
638
692
|
if (componentName === 'Divider') {
|
|
639
693
|
return buildDividerComponent(field);
|
|
640
694
|
}
|
|
695
|
+
if (componentName === 'PageSection') {
|
|
696
|
+
return buildPageSectionComponent(field);
|
|
697
|
+
}
|
|
641
698
|
if (componentName === 'ColumnsLayout') {
|
|
642
699
|
return buildColumnsLayoutComponent(field);
|
|
643
700
|
}
|
|
@@ -1662,7 +1719,7 @@ function buildFormSchema(formTitle, fields, formUuid, corpId, appType, layout, t
|
|
|
1662
1719
|
id: nextNodeId(),
|
|
1663
1720
|
props: {
|
|
1664
1721
|
contentBgColor: 'white',
|
|
1665
|
-
pageStyle: { backgroundColor: '
|
|
1722
|
+
pageStyle: { backgroundColor: '#f2f3f5' },
|
|
1666
1723
|
contentMargin: '20',
|
|
1667
1724
|
contentPadding: '20',
|
|
1668
1725
|
showTitle: false,
|
|
@@ -1685,6 +1742,7 @@ function buildFormSchema(formTitle, fields, formUuid, corpId, appType, layout, t
|
|
|
1685
1742
|
labelWeightMobile: 'normal',
|
|
1686
1743
|
},
|
|
1687
1744
|
condition: true,
|
|
1745
|
+
css: 'body{background-color:#f2f3f5}',
|
|
1688
1746
|
methods: {
|
|
1689
1747
|
__initMethods__: {
|
|
1690
1748
|
type: 'js',
|
|
@@ -1883,7 +1941,7 @@ function buildEmptyFormSchema() {
|
|
|
1883
1941
|
id: nextNodeId(),
|
|
1884
1942
|
props: {
|
|
1885
1943
|
contentBgColor: 'white',
|
|
1886
|
-
pageStyle: { backgroundColor: '
|
|
1944
|
+
pageStyle: { backgroundColor: '#f2f3f5' },
|
|
1887
1945
|
contentMargin: '20',
|
|
1888
1946
|
contentPadding: '20',
|
|
1889
1947
|
showTitle: false,
|
|
@@ -1894,6 +1952,7 @@ function buildEmptyFormSchema() {
|
|
|
1894
1952
|
contentBgColorMobile: 'white',
|
|
1895
1953
|
},
|
|
1896
1954
|
condition: true,
|
|
1955
|
+
css: 'body{background-color:#f2f3f5}',
|
|
1897
1956
|
methods: {
|
|
1898
1957
|
__initMethods__: {
|
|
1899
1958
|
type: 'js',
|
|
@@ -2558,84 +2617,6 @@ function findFieldByIdOrLabelDeep(fields, identifier) {
|
|
|
2558
2617
|
return null;
|
|
2559
2618
|
}
|
|
2560
2619
|
|
|
2561
|
-
function normalizeFormInjectionKey(key) {
|
|
2562
|
-
return String(key || '').replace(/[^a-z0-9]/gi, '').toLowerCase();
|
|
2563
|
-
}
|
|
2564
|
-
|
|
2565
|
-
function isRawFormInjectionKey(key) {
|
|
2566
|
-
const normalized = normalizeFormInjectionKey(key);
|
|
2567
|
-
return normalized === 'srcdoc'
|
|
2568
|
-
|| normalized === 'stylesheet'
|
|
2569
|
-
|| normalized === 'stylesheets'
|
|
2570
|
-
|| normalized === 'styletext'
|
|
2571
|
-
|| normalized === 'styletag'
|
|
2572
|
-
|| normalized.includes('innerhtml')
|
|
2573
|
-
|| normalized.includes('outerhtml')
|
|
2574
|
-
|| normalized.includes('dangerouslysetinnerhtml')
|
|
2575
|
-
|| normalized.startsWith('css')
|
|
2576
|
-
|| normalized.endsWith('css')
|
|
2577
|
-
|| normalized.startsWith('html')
|
|
2578
|
-
|| normalized.endsWith('html');
|
|
2579
|
-
}
|
|
2580
|
-
|
|
2581
|
-
function isRawMarkupComponent(componentName) {
|
|
2582
|
-
return ['html', 'iframe'].includes(String(componentName || '').toLowerCase());
|
|
2583
|
-
}
|
|
2584
|
-
|
|
2585
|
-
function assertNoFormInjectionValue(value, location) {
|
|
2586
|
-
if (Array.isArray(value)) {
|
|
2587
|
-
value.forEach(function (item, index) {
|
|
2588
|
-
assertNoFormInjectionValue(item, location + '[' + index + ']');
|
|
2589
|
-
});
|
|
2590
|
-
return;
|
|
2591
|
-
}
|
|
2592
|
-
if (!value || typeof value !== 'object') {
|
|
2593
|
-
return;
|
|
2594
|
-
}
|
|
2595
|
-
Object.keys(value).forEach(function (key) {
|
|
2596
|
-
if (isRawFormInjectionKey(key)) {
|
|
2597
|
-
throw new Error('表单补丁不支持 CSS/HTML 注入: ' + location + '.' + key);
|
|
2598
|
-
}
|
|
2599
|
-
if (normalizeFormInjectionKey(key) === 'componentname' && isRawMarkupComponent(value[key])) {
|
|
2600
|
-
throw new Error('表单补丁不支持 CSS/HTML 注入组件: ' + value[key]);
|
|
2601
|
-
}
|
|
2602
|
-
assertNoFormInjectionValue(value[key], location + '.' + key);
|
|
2603
|
-
});
|
|
2604
|
-
}
|
|
2605
|
-
|
|
2606
|
-
function assertNoFormInjectionPath(pointer, value) {
|
|
2607
|
-
if (!pointer) {
|
|
2608
|
-
return;
|
|
2609
|
-
}
|
|
2610
|
-
const segments = splitJsonPointer(pointer);
|
|
2611
|
-
const blockedSegment = segments.find(isRawFormInjectionKey);
|
|
2612
|
-
if (blockedSegment) {
|
|
2613
|
-
throw new Error('表单补丁不支持 CSS/HTML 注入路径: ' + pointer);
|
|
2614
|
-
}
|
|
2615
|
-
const lastSegment = normalizeFormInjectionKey(segments[segments.length - 1]);
|
|
2616
|
-
if (lastSegment === 'componentname' && isRawMarkupComponent(value)) {
|
|
2617
|
-
throw new Error('表单补丁不支持 CSS/HTML 注入组件: ' + value);
|
|
2618
|
-
}
|
|
2619
|
-
}
|
|
2620
|
-
|
|
2621
|
-
function assertNoFormInjectionSource(source, location) {
|
|
2622
|
-
if (typeof source !== 'string' || source.length === 0) {
|
|
2623
|
-
return;
|
|
2624
|
-
}
|
|
2625
|
-
const forbiddenPatterns = [
|
|
2626
|
-
/\b(?:innerHTML|outerHTML|insertAdjacentHTML|dangerouslySetInnerHTML|srcdoc|cssText|insertRule|adoptedStyleSheets)\b/i,
|
|
2627
|
-
/\bdocument\s*\.\s*(?:write|writeln)\s*\(/i,
|
|
2628
|
-
/\bcreateElement\s*\(\s*['"`](?:style|script|iframe|link)['"`]\s*\)/i,
|
|
2629
|
-
/\bsetAttribute\s*\(\s*['"`](?:style|srcdoc)['"`]/i,
|
|
2630
|
-
/\.\s*style\s*(?:\.|\[)/i,
|
|
2631
|
-
/<\s*(?:style|script|iframe|html|body)\b/i,
|
|
2632
|
-
/openyida:theme|yida-global-theme/i,
|
|
2633
|
-
];
|
|
2634
|
-
if (forbiddenPatterns.some(function (pattern) { return pattern.test(source); })) {
|
|
2635
|
-
throw new Error('表单动作不支持 CSS/HTML 注入: ' + location);
|
|
2636
|
-
}
|
|
2637
|
-
}
|
|
2638
|
-
|
|
2639
2620
|
function resolveJsonPointerParent(target, pointer) {
|
|
2640
2621
|
const segments = splitJsonPointer(pointer);
|
|
2641
2622
|
if (segments.length === 0) {
|
|
@@ -2791,7 +2772,6 @@ function applyAtomicFieldAction(schema, formContainer, operation) {
|
|
|
2791
2772
|
const actions = ensureActionModule(schema);
|
|
2792
2773
|
const source = readOptionalSource(operation, 'source', 'sourceFile');
|
|
2793
2774
|
if (source !== undefined) {
|
|
2794
|
-
assertNoFormInjectionSource(source, 'field-action ' + actionName);
|
|
2795
2775
|
if (!extractExportedActionFunctionNames(source).includes(actionName)) {
|
|
2796
2776
|
throw createCreateFormError(
|
|
2797
2777
|
t('create_form.action_source_export_missing', actionName),
|
|
@@ -2807,14 +2787,12 @@ function applyAtomicFieldAction(schema, formContainer, operation) {
|
|
|
2807
2787
|
}
|
|
2808
2788
|
const blockStart = '/* openyida:field-action:start:' + actionName + ' */';
|
|
2809
2789
|
const blockEnd = '/* openyida:field-action:end:' + actionName + ' */';
|
|
2810
|
-
|
|
2790
|
+
actions.module.source = upsertGeneratedSourceBlockWithBounds(
|
|
2811
2791
|
actions.module.source || '',
|
|
2812
2792
|
source,
|
|
2813
2793
|
blockStart,
|
|
2814
2794
|
blockEnd
|
|
2815
2795
|
);
|
|
2816
|
-
assertNoFormInjectionSource(nextActionSource, 'field-action module');
|
|
2817
|
-
actions.module.source = nextActionSource;
|
|
2818
2796
|
actions.module.compiled = compileActionSource(actions.module.source);
|
|
2819
2797
|
actions.type = actions.type || 'FUNCTION';
|
|
2820
2798
|
} else if (!extractExportedActionFunctionNames(actions.module.source || '').includes(actionName)) {
|
|
@@ -2859,14 +2837,6 @@ function applySchemaPatchOperations(schema, operations) {
|
|
|
2859
2837
|
throw new Error('补丁[' + index + '] 缺少 action/op');
|
|
2860
2838
|
}
|
|
2861
2839
|
|
|
2862
|
-
assertNoFormInjectionPath(operation.path, operation.value);
|
|
2863
|
-
if (Object.prototype.hasOwnProperty.call(operation, 'value')) {
|
|
2864
|
-
assertNoFormInjectionValue(operation.value, '补丁[' + index + '].value');
|
|
2865
|
-
}
|
|
2866
|
-
if (operation.props !== undefined) {
|
|
2867
|
-
assertNoFormInjectionValue(operation.props, '补丁[' + index + '].props');
|
|
2868
|
-
}
|
|
2869
|
-
|
|
2870
2840
|
if (['add', 'replace', 'remove'].includes(action)) {
|
|
2871
2841
|
applyJsonPointerOperation(schema, operation);
|
|
2872
2842
|
applied.push({ action, path: operation.path });
|
|
@@ -2926,8 +2896,6 @@ function applySchemaPatchOperations(schema, operations) {
|
|
|
2926
2896
|
const source = readOptionalSource(operation, 'source', 'sourceFile');
|
|
2927
2897
|
const compiled = readOptionalSource(operation, 'compiled', 'compiledFile')
|
|
2928
2898
|
|| (source ? compileActionSource(source) : undefined);
|
|
2929
|
-
assertNoFormInjectionSource(source, 'actions-module source');
|
|
2930
|
-
assertNoFormInjectionSource(compiled, 'actions-module compiled');
|
|
2931
2899
|
if (source !== undefined) {
|
|
2932
2900
|
actions.module.source = source;
|
|
2933
2901
|
}
|
|
@@ -4391,6 +4359,10 @@ function applyFieldChanges(component, changes) {
|
|
|
4391
4359
|
props.tips = i18n(changes.tips);
|
|
4392
4360
|
}
|
|
4393
4361
|
|
|
4362
|
+
if (changes.tooltip !== undefined && component.componentName === 'PageSection') {
|
|
4363
|
+
props.tooltip = i18n(changes.tooltip);
|
|
4364
|
+
}
|
|
4365
|
+
|
|
4394
4366
|
// ── 特殊处理:required(操作 validation 数组)
|
|
4395
4367
|
if (changes.required !== undefined && !isFormPresentationComponent(component.componentName)) {
|
|
4396
4368
|
if (changes.required) {
|
|
@@ -4886,10 +4858,7 @@ async function saveFormSchema(authRef, appType, formUuid, schema, version, stepO
|
|
|
4886
4858
|
formUuid,
|
|
4887
4859
|
result: sanitizeFailureResult(saveResult),
|
|
4888
4860
|
});
|
|
4889
|
-
if (failureContext
|
|
4890
|
-
// Resume may safely resolve an HTTP 5xx by exact readback. Defer the
|
|
4891
|
-
// failure payload so a recovered command emits one authoritative result.
|
|
4892
|
-
} else if (failureContext) {
|
|
4861
|
+
if (failureContext) {
|
|
4893
4862
|
emitCreateFormPostCreateFailure(Object.assign({}, failureContext, {
|
|
4894
4863
|
stage: 'saveFormSchema',
|
|
4895
4864
|
error: saveError,
|
|
@@ -4910,13 +4879,6 @@ async function saveFormSchema(authRef, appType, formUuid, schema, version, stepO
|
|
|
4910
4879
|
|
|
4911
4880
|
// ── create 模式主流程 ─────────────────────────────────
|
|
4912
4881
|
|
|
4913
|
-
function buildFormDeliveryUrls(baseUrl, appType, formUuid) {
|
|
4914
|
-
return {
|
|
4915
|
-
appUrl: baseUrl + '/' + appType + '/workbench',
|
|
4916
|
-
formUrl: baseUrl + '/' + appType + '/workbench/' + formUuid,
|
|
4917
|
-
};
|
|
4918
|
-
}
|
|
4919
|
-
|
|
4920
4882
|
async function mainValidateFields(parsedArgs) {
|
|
4921
4883
|
const { fieldsJsonOrFile } = parsedArgs;
|
|
4922
4884
|
assertNoEmojiInDefinitionFileName(fieldsJsonOrFile);
|
|
@@ -5072,13 +5034,13 @@ async function mainCreate(parsedArgs, authRef) {
|
|
|
5072
5034
|
}
|
|
5073
5035
|
|
|
5074
5036
|
// 输出结果
|
|
5075
|
-
const
|
|
5037
|
+
const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
|
|
5076
5038
|
result(true, t('create_form.create_success'), [
|
|
5077
5039
|
['Form UUID', formUuid],
|
|
5078
5040
|
['URL', formUrl],
|
|
5079
5041
|
]);
|
|
5080
5042
|
console.log(JSON.stringify(withBrowserHandoff(
|
|
5081
|
-
{ success: true, formUuid, formTitle, appType, fieldCount, icon: formIcon, iconSource: iconResolution.source, url: formUrl
|
|
5043
|
+
{ success: true, formUuid, formTitle, appType, fieldCount, icon: formIcon, iconSource: iconResolution.source, url: formUrl },
|
|
5082
5044
|
formUrl,
|
|
5083
5045
|
{ stage: 'create_form_success', title: formTitle },
|
|
5084
5046
|
parsedArgs.browserOpenMode
|
|
@@ -5165,7 +5127,6 @@ async function createFormForLegacyProcessQuiet(context, input) {
|
|
|
5165
5127
|
}
|
|
5166
5128
|
const saveResult = await saveFormSchema(authRef, appType, formUuid, schema, serverRevision, 4);
|
|
5167
5129
|
const navIconResult = await updateCreatedFormNavigationIcon(authRef, appType, formUuid, formIcon);
|
|
5168
|
-
const { appUrl, formUrl } = buildFormDeliveryUrls(authRef.baseUrl, appType, formUuid);
|
|
5169
5130
|
return {
|
|
5170
5131
|
success: true,
|
|
5171
5132
|
appType,
|
|
@@ -5177,9 +5138,7 @@ async function createFormForLegacyProcessQuiet(context, input) {
|
|
|
5177
5138
|
navIconResult,
|
|
5178
5139
|
icon: formIcon,
|
|
5179
5140
|
iconSource: iconResolution.source,
|
|
5180
|
-
url:
|
|
5181
|
-
formUrl,
|
|
5182
|
-
appUrl,
|
|
5141
|
+
url: authRef.baseUrl + '/' + appType + '/workbench/' + formUuid,
|
|
5183
5142
|
};
|
|
5184
5143
|
}
|
|
5185
5144
|
|
|
@@ -5360,7 +5319,7 @@ async function mainAddOption(parsedArgs, authRef) {
|
|
|
5360
5319
|
// Step 4: 保存 Schema
|
|
5361
5320
|
await saveFormSchema(authRef, appType, formUuid, schema, version, 4);
|
|
5362
5321
|
|
|
5363
|
-
const
|
|
5322
|
+
const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
|
|
5364
5323
|
result(true, '选项追加成功', [
|
|
5365
5324
|
['Form UUID', formUuid],
|
|
5366
5325
|
['Field', fieldLabel],
|
|
@@ -5380,8 +5339,6 @@ async function mainAddOption(parsedArgs, authRef) {
|
|
|
5380
5339
|
skipped: skippedOptions,
|
|
5381
5340
|
totalOptions: existingDataSource.length,
|
|
5382
5341
|
url: formUrl,
|
|
5383
|
-
formUrl,
|
|
5384
|
-
appUrl,
|
|
5385
5342
|
}));
|
|
5386
5343
|
}
|
|
5387
5344
|
|
|
@@ -5481,7 +5438,7 @@ async function mainBindDataSource(parsedArgs, authRef) {
|
|
|
5481
5438
|
|
|
5482
5439
|
await saveFormSchema(authRef, appType, formUuid, schema, version, 4);
|
|
5483
5440
|
|
|
5484
|
-
const
|
|
5441
|
+
const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
|
|
5485
5442
|
result(true, '字段数据源保存成功', [
|
|
5486
5443
|
['Form UUID', formUuid],
|
|
5487
5444
|
['Field', fieldLabel],
|
|
@@ -5502,8 +5459,6 @@ async function mainBindDataSource(parsedArgs, authRef) {
|
|
|
5502
5459
|
options: normalized.options.length,
|
|
5503
5460
|
filterLocal: targetComponent.props.filterLocal,
|
|
5504
5461
|
pageUrl: formUrl,
|
|
5505
|
-
formUrl,
|
|
5506
|
-
appUrl,
|
|
5507
5462
|
},
|
|
5508
5463
|
formUrl,
|
|
5509
5464
|
{ stage: 'bind_datasource_success', title: formUuid },
|
|
@@ -6154,59 +6109,6 @@ async function readResumeSchema(authRef, appType, formUuid) {
|
|
|
6154
6109
|
return { schemaResult, schema, version: extractSchemaServerRevision(schemaResult) };
|
|
6155
6110
|
}
|
|
6156
6111
|
|
|
6157
|
-
function isRetryableResumeSaveServerFailure(errorObject) {
|
|
6158
|
-
const status = Number(errorObject?.details?.result?.__httpStatus);
|
|
6159
|
-
return errorObject?.code === 'CREATE_FORM_SAVE_SCHEMA_FAILED' &&
|
|
6160
|
-
Number.isInteger(status) && status >= 500 && status <= 599;
|
|
6161
|
-
}
|
|
6162
|
-
|
|
6163
|
-
async function saveResumeSchemaWithSafeRetry(authRef, appType, formUuid, schema, version, fields) {
|
|
6164
|
-
const save = (value, revision) => saveFormSchema(
|
|
6165
|
-
authRef, appType, formUuid, value, revision, 4, { deferFailureOutput: true }
|
|
6166
|
-
);
|
|
6167
|
-
try {
|
|
6168
|
-
await save(schema, version);
|
|
6169
|
-
return '';
|
|
6170
|
-
} catch (originalError) {
|
|
6171
|
-
if (!isRetryableResumeSaveServerFailure(originalError)) { throw originalError; }
|
|
6172
|
-
|
|
6173
|
-
let readback;
|
|
6174
|
-
try { readback = await readResumeSchema(authRef, appType, formUuid); } catch (_) { throw originalError; }
|
|
6175
|
-
const root = readback.schema.pages[0].componentsTree && readback.schema.pages[0].componentsTree[0];
|
|
6176
|
-
const container = root ? findFormContainer(root) : null;
|
|
6177
|
-
if (!container) { throw originalError; }
|
|
6178
|
-
const evidence = collectResumeFieldEvidence(container.children);
|
|
6179
|
-
const verified = buildResumeChanges(
|
|
6180
|
-
evidence,
|
|
6181
|
-
collectResumeDesiredFields(fields, { verifyNestedFields: true })
|
|
6182
|
-
);
|
|
6183
|
-
if (verified.conflicts.length > 0) { throw originalError; }
|
|
6184
|
-
if (verified.missing.length === 0) { return 'save_schema_recovered_by_readback'; }
|
|
6185
|
-
const retryPlan = buildResumeChanges(evidence, collectResumeDesiredFields(fields));
|
|
6186
|
-
if (retryPlan.conflicts.length > 0 || retryPlan.missing.length === 0) { throw originalError; }
|
|
6187
|
-
const applied = applyChangesToSchema(
|
|
6188
|
-
readback.schema,
|
|
6189
|
-
retryPlan.missing.map(function (field) { return { action: 'add', field }; }),
|
|
6190
|
-
{ verbose: true }
|
|
6191
|
-
);
|
|
6192
|
-
if ((applied.diagnostics || []).length > 0) { throw originalError; }
|
|
6193
|
-
const updatedContainer = findFormContainer(readback.schema.pages[0].componentsTree[0]);
|
|
6194
|
-
fillSerialNumberFormulas(updatedContainer.children, resolveCorpId(authRef.authData), appType, formUuid);
|
|
6195
|
-
|
|
6196
|
-
try {
|
|
6197
|
-
await save(readback.schema, readback.version);
|
|
6198
|
-
} catch (retryError) {
|
|
6199
|
-
originalError.details = Object.assign({}, originalError.details, {
|
|
6200
|
-
safeRetryAttempted: true,
|
|
6201
|
-
retryErrorCode: retryError?.code || 'CREATE_FORM_SAVE_SCHEMA_FAILED',
|
|
6202
|
-
retryResult: sanitizeFailureResult(retryError?.details?.result),
|
|
6203
|
-
});
|
|
6204
|
-
throw originalError;
|
|
6205
|
-
}
|
|
6206
|
-
return 'save_schema_retried';
|
|
6207
|
-
}
|
|
6208
|
-
}
|
|
6209
|
-
|
|
6210
6112
|
async function mainResume(parsedArgs, authRef) {
|
|
6211
6113
|
const { appType, formUuid, fieldsJsonOrFile } = parsedArgs;
|
|
6212
6114
|
assertNoEmojiInDefinitionFileName(fieldsJsonOrFile);
|
|
@@ -6237,11 +6139,8 @@ async function mainResume(parsedArgs, authRef) {
|
|
|
6237
6139
|
if (resumeValidationRules.length > 0) {
|
|
6238
6140
|
applySmartValidations(firstRead.schema, resumeValidationRules);
|
|
6239
6141
|
}
|
|
6240
|
-
|
|
6241
|
-
authRef, appType, formUuid, firstRead.schema, firstRead.version, fields
|
|
6242
|
-
);
|
|
6142
|
+
await saveFormSchema(authRef, appType, formUuid, firstRead.schema, firstRead.version, 4);
|
|
6243
6143
|
completedStages.push('rebuild_blank_schema', 'save_schema');
|
|
6244
|
-
if (saveRecoveryStage) { completedStages.push(saveRecoveryStage); }
|
|
6245
6144
|
recoveredBlankShell = true;
|
|
6246
6145
|
plan = {
|
|
6247
6146
|
existing: [],
|
|
@@ -6290,11 +6189,8 @@ async function mainResume(parsedArgs, authRef) {
|
|
|
6290
6189
|
const corpId = resolveCorpId(authRef.authData);
|
|
6291
6190
|
const updatedContainer = findFormContainer(firstRead.schema.pages[0].componentsTree[0]);
|
|
6292
6191
|
fillSerialNumberFormulas(updatedContainer.children, corpId, appType, formUuid);
|
|
6293
|
-
|
|
6294
|
-
authRef, appType, formUuid, firstRead.schema, firstRead.version, fields
|
|
6295
|
-
);
|
|
6192
|
+
await saveFormSchema(authRef, appType, formUuid, firstRead.schema, firstRead.version, 4);
|
|
6296
6193
|
completedStages.push('add_missing_fields', 'save_schema');
|
|
6297
|
-
if (saveRecoveryStage) { completedStages.push(saveRecoveryStage); }
|
|
6298
6194
|
}
|
|
6299
6195
|
|
|
6300
6196
|
const finalRead = await readResumeSchema(authRef, appType, formUuid);
|
|
@@ -6315,7 +6211,7 @@ async function mainResume(parsedArgs, authRef) {
|
|
|
6315
6211
|
});
|
|
6316
6212
|
}
|
|
6317
6213
|
completedStages.push('verify_final_schema');
|
|
6318
|
-
const
|
|
6214
|
+
const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
|
|
6319
6215
|
const output = {
|
|
6320
6216
|
success: true,
|
|
6321
6217
|
appType,
|
|
@@ -6327,8 +6223,6 @@ async function mainResume(parsedArgs, authRef) {
|
|
|
6327
6223
|
finalFieldCount: collectResumeFieldEvidence(finalContainer.children).length,
|
|
6328
6224
|
recoveredBlankShell,
|
|
6329
6225
|
url: formUrl,
|
|
6330
|
-
formUrl,
|
|
6331
|
-
appUrl,
|
|
6332
6226
|
};
|
|
6333
6227
|
console.log(JSON.stringify(withBrowserHandoff(
|
|
6334
6228
|
output,
|
|
@@ -6490,14 +6384,14 @@ async function mainUpdate(parsedArgs, authRef) {
|
|
|
6490
6384
|
await saveFormSchema(authRef, appType, formUuid, schema, version, 6);
|
|
6491
6385
|
|
|
6492
6386
|
// 输出结果
|
|
6493
|
-
const
|
|
6387
|
+
const formUrl = authRef.baseUrl + '/' + appType + '/workbench/' + formUuid;
|
|
6494
6388
|
result(true, t('create_form.update_success'), [
|
|
6495
6389
|
['Form UUID', formUuid],
|
|
6496
6390
|
['URL', formUrl],
|
|
6497
6391
|
['Changes', String(appliedChanges.length)],
|
|
6498
6392
|
]);
|
|
6499
6393
|
console.log(JSON.stringify(withBrowserHandoff(
|
|
6500
|
-
{ success: true, formUuid, appType, changesApplied: appliedChanges.length, changes: appliedChanges, url: formUrl
|
|
6394
|
+
{ success: true, formUuid, appType, changesApplied: appliedChanges.length, changes: appliedChanges, url: formUrl },
|
|
6501
6395
|
formUrl,
|
|
6502
6396
|
{ stage: 'update_form_success', title: formUuid },
|
|
6503
6397
|
parsedArgs.browserOpenMode
|
|
@@ -6554,7 +6448,6 @@ module.exports = {
|
|
|
6554
6448
|
parseArgs,
|
|
6555
6449
|
_private: {
|
|
6556
6450
|
buildFormSchema,
|
|
6557
|
-
buildEmptyFormSchema,
|
|
6558
6451
|
buildFormNodeComponent,
|
|
6559
6452
|
countDataFieldDefinitions,
|
|
6560
6453
|
collectComponentNames,
|
package/lib/app/create-page.js
CHANGED
|
@@ -19,7 +19,6 @@ const { buildYidaI18n, buildYidaTitleI18n, normalizeYidaLocale, resolveContentLo
|
|
|
19
19
|
const { parseOpenOption, withBrowserHandoff } = require('../core/browser-handoff');
|
|
20
20
|
const { throwCommandError } = require('../core/command-errors');
|
|
21
21
|
const { buildApiPath } = require('./create-form/api-path');
|
|
22
|
-
const { fetchFormSchemaInfo } = require('./get-form-config');
|
|
23
22
|
|
|
24
23
|
function parseArgs(args) {
|
|
25
24
|
const openOption = parseOpenOption(args);
|
|
@@ -92,13 +91,13 @@ function parseBooleanOption(value, optionName) {
|
|
|
92
91
|
throw new Error(`Invalid boolean value for ${optionName}: ${value}`);
|
|
93
92
|
}
|
|
94
93
|
|
|
95
|
-
function buildPageInfoPostData(formUuid, pageName, isRenderNav, csrfToken
|
|
94
|
+
function buildPageInfoPostData(formUuid, pageName, isRenderNav, csrfToken) {
|
|
96
95
|
const titleJson = JSON.stringify(buildYidaTitleI18n(pageName, {
|
|
97
96
|
en_US: pageName,
|
|
98
97
|
ja_JP: pageName,
|
|
99
98
|
}));
|
|
100
99
|
|
|
101
|
-
|
|
100
|
+
return querystring.stringify({
|
|
102
101
|
_api: 'Form.updateFormSchemaInfo',
|
|
103
102
|
_csrf_token: csrfToken,
|
|
104
103
|
_locale_time_zone_offset: '28800000',
|
|
@@ -126,64 +125,17 @@ function buildPageInfoPostData(formUuid, pageName, isRenderNav, csrfToken, curre
|
|
|
126
125
|
displayType: 'RE',
|
|
127
126
|
isRenderNav: isRenderNav ? 'true' : 'false',
|
|
128
127
|
manageCustomActionInfo: '[]',
|
|
129
|
-
};
|
|
130
|
-
// 与 update-form-config 一样,保留当前配置,只覆盖标题和导航。
|
|
131
|
-
for (const key of Object.keys(payload)) {
|
|
132
|
-
if (key.startsWith('_') || ['formUuid', 'title', 'isRenderNav'].includes(key)) {continue;}
|
|
133
|
-
const value = currentConfig?.[key];
|
|
134
|
-
if (value !== undefined && value !== null) {
|
|
135
|
-
payload[key] = typeof value === 'object' ? JSON.stringify(value) : value;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return querystring.stringify(payload);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function readRenderNav(config) {
|
|
142
|
-
const value = config && Object.prototype.hasOwnProperty.call(config, 'renderNav')
|
|
143
|
-
? config.renderNav : config?.isRenderNav;
|
|
144
|
-
if (value === false || value === 'false') {return false;}
|
|
145
|
-
if (value === true || value === 'true') {return true;}
|
|
146
|
-
return null;
|
|
128
|
+
});
|
|
147
129
|
}
|
|
148
130
|
|
|
149
131
|
async function configureNavigationVisibility(authRef, appType, pageId, pageName, isRenderNav) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
currentConfig = response.content || response.result || response.data || {};
|
|
158
|
-
verification.renderNav = readRenderNav(currentConfig);
|
|
159
|
-
};
|
|
160
|
-
try {
|
|
161
|
-
await readConfig();
|
|
162
|
-
for (let attempt = 0; attempt < 2; attempt++) {
|
|
163
|
-
verification.attempts++;
|
|
164
|
-
// 写入后旧读值不再证明当前状态;回读失败必须报告未知。
|
|
165
|
-
verification.renderNav = null;
|
|
166
|
-
const response = await requestWithAutoLogin((auth) => httpPost(
|
|
167
|
-
auth.baseUrl,
|
|
168
|
-
buildApiPath(appType, 'updateFormSchemaInfo'),
|
|
169
|
-
buildPageInfoPostData(pageId, pageName, isRenderNav, auth.csrfToken, currentConfig)
|
|
170
|
-
), authRef);
|
|
171
|
-
await readConfig();
|
|
172
|
-
if (verification.renderNav === isRenderNav) {
|
|
173
|
-
verification.verified = true;
|
|
174
|
-
return verification;
|
|
175
|
-
}
|
|
176
|
-
if (!response?.success || response.__needLogin || response.__csrfExpired) {
|
|
177
|
-
verification.error = response?.errorMsg || t('common.request_failed');
|
|
178
|
-
return verification;
|
|
179
|
-
}
|
|
180
|
-
// 只补写已创建页面的配置,不重试创建;未知状态也不能当作隐藏成功。
|
|
181
|
-
}
|
|
182
|
-
verification.error = t('create_page.navigation_unverified');
|
|
183
|
-
} catch (err) {
|
|
184
|
-
verification.error = err.message;
|
|
185
|
-
}
|
|
186
|
-
return verification;
|
|
132
|
+
return requestWithAutoLogin((auth) => {
|
|
133
|
+
return httpPost(
|
|
134
|
+
auth.baseUrl,
|
|
135
|
+
`/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
|
|
136
|
+
buildPageInfoPostData(pageId, pageName, isRenderNav, auth.csrfToken)
|
|
137
|
+
);
|
|
138
|
+
}, authRef);
|
|
187
139
|
}
|
|
188
140
|
|
|
189
141
|
async function run(args) {
|
|
@@ -261,49 +213,30 @@ async function run(args) {
|
|
|
261
213
|
const workbenchUrl = `${authRef.baseUrl}/${appType}/workbench/${pageId}`;
|
|
262
214
|
let pageUrl = workbenchUrl;
|
|
263
215
|
let dashboardConfigWarning = null;
|
|
264
|
-
let navigationVerification = null;
|
|
265
216
|
|
|
266
217
|
if (options.hideNav) {
|
|
267
218
|
step(3, t('create_page.step_dashboard_config'));
|
|
268
|
-
|
|
269
|
-
if (
|
|
219
|
+
const configResponse = await configureNavigationVisibility(authRef, appType, pageId, pageName, false);
|
|
220
|
+
if (configResponse && configResponse.success) {
|
|
270
221
|
chalkSuccess(t('create_page.dashboard_config_ok'));
|
|
271
222
|
pageUrl = `${authRef.baseUrl}/${appType}/custom/${pageId}?isRenderNav=false`;
|
|
272
223
|
} else {
|
|
273
|
-
dashboardConfigWarning =
|
|
224
|
+
dashboardConfigWarning = configResponse ? configResponse.errorMsg || t('common.unknown_error') : t('common.request_failed');
|
|
274
225
|
warn(t('create_page.dashboard_config_failed', dashboardConfigWarning));
|
|
275
226
|
}
|
|
276
227
|
}
|
|
277
228
|
|
|
278
|
-
|
|
279
|
-
const result = {
|
|
280
|
-
success: complete, pageCreated: true, pageId, pageName, appType, mode,
|
|
281
|
-
hideNavRequested: options.hideNav,
|
|
282
|
-
hideNav: options.hideNav ? (navigationVerification.renderNav === null ? null : !navigationVerification.renderNav) : false,
|
|
283
|
-
chromeless: options.hideNav && navigationVerification.verified,
|
|
284
|
-
navigationVerification, url: pageUrl, workbenchUrl, dashboardConfigWarning,
|
|
285
|
-
};
|
|
286
|
-
if (!complete) {
|
|
287
|
-
result.errorCode = 'CREATE_PAGE_NAVIGATION_NOT_VERIFIED';
|
|
288
|
-
result.recovery = {
|
|
289
|
-
command: 'update-form-config', args: [appType, pageId, 'false', pageName],
|
|
290
|
-
verifyCommand: 'get-form-config', verifyArgs: [appType, pageId, '--json'],
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
chalkResult(complete, complete ? t('create_page.success') : t('create_page.navigation_unverified'), [
|
|
229
|
+
chalkResult(true, t('create_page.success'), [
|
|
294
230
|
['Page ID', pageId],
|
|
295
231
|
['URL', `${c.cyan}${pageUrl}${c.reset}`],
|
|
296
232
|
]);
|
|
297
233
|
|
|
298
|
-
console.log(JSON.stringify(
|
|
299
|
-
|
|
234
|
+
console.log(JSON.stringify(withBrowserHandoff(
|
|
235
|
+
{ success: true, pageId, pageName, appType, mode, hideNav: options.hideNav, chromeless: options.hideNav && !dashboardConfigWarning, url: pageUrl, workbenchUrl, dashboardConfigWarning },
|
|
300
236
|
pageUrl,
|
|
301
237
|
{ stage: 'create_page_success', title: pageName },
|
|
302
238
|
options.openMode
|
|
303
|
-
)
|
|
304
|
-
if (!complete) {
|
|
305
|
-
throwCommandError(t('create_page.navigation_unverified'), { code: result.errorCode, details: result });
|
|
306
|
-
}
|
|
239
|
+
)));
|
|
307
240
|
} else {
|
|
308
241
|
const errorMsg = response ? response.errorMsg || response.error || t('common.unknown_error') : t('common.request_failed');
|
|
309
242
|
const errorCode = response && response.errorCode ? response.errorCode : 'CREATE_PAGE_FAILED';
|