@sap/ux-specification 1.136.17 → 1.136.19
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/CHANGELOG.md +63 -0
- package/dist/documentation/v2/v2-AnalyticalListPage.html +2 -2
- package/dist/documentation/v2/v2-ApplicationV2.html +2 -2
- package/dist/documentation/v2/v2-ListReport.html +2 -2
- package/dist/documentation/v2/v2-ListReportNew.html +2 -2
- package/dist/documentation/v2/v2-ObjectPage.html +2 -2
- package/dist/documentation/v2/v2-OverviewPage.html +2 -2
- package/dist/documentation/v4/v4-ApplicationV4.html +2 -2
- package/dist/documentation/v4/v4-BuildingBlocks.html +2 -2
- package/dist/documentation/v4/v4-FreestylePage.html +2 -2
- package/dist/documentation/v4/v4-ListReport.html +2 -2
- package/dist/documentation/v4/v4-ObjectPage.html +2 -2
- package/dist/index-min.js +320 -315
- package/dist/index-min.js.map +4 -4
- package/dist/schemas/v2/ListReportNewConfig.json +202 -7
- package/dist/schemas/v2/OverviewPageConfig.json +18 -9
- package/dist/schemas/v4/ApplicationV4.json +14 -0
- package/dist/schemas/v4/BuildingBlocksConfig.json +50 -19
- package/dist/schemas/v4/ListReportConfig.json +74 -15
- package/dist/schemas/v4/ObjectPageConfig.json +117 -721
- package/dist/specification/package.json +8 -8
- package/dist/specification/scripts/generate-validity-report.js +1 -1
- package/dist/specification/scripts/generate-validity-report.js.map +1 -1
- package/dist/specification/scripts/macros/corrections.d.ts.map +1 -1
- package/dist/specification/scripts/macros/corrections.js +15 -0
- package/dist/specification/scripts/macros/corrections.js.map +1 -1
- package/dist/specification/scripts/macros/schema.d.ts.map +1 -1
- package/dist/specification/scripts/macros/schema.js +23 -10
- package/dist/specification/scripts/macros/schema.js.map +1 -1
- package/dist/specification/scripts/schema/to-json-schema.js +1 -1
- package/dist/specification/scripts/schema/to-json-schema.js.map +1 -1
- package/dist/specification/src/api.d.ts.map +1 -1
- package/dist/specification/src/api.js +39 -3
- package/dist/specification/src/api.js.map +1 -1
- package/dist/specification/src/ftfs/ftfs.d.ts +8 -0
- package/dist/specification/src/ftfs/ftfs.d.ts.map +1 -1
- package/dist/specification/src/ftfs/ftfs.js +1 -0
- package/dist/specification/src/ftfs/ftfs.js.map +1 -1
- package/dist/specification/src/ftfs/index.d.ts +1 -1
- package/dist/specification/src/ftfs/index.d.ts.map +1 -1
- package/dist/specification/src/ftfs/index.js +2 -1
- package/dist/specification/src/ftfs/index.js.map +1 -1
- package/dist/specification/src/ftfs/parser/model/TreeModel.d.ts.map +1 -1
- package/dist/specification/src/ftfs/parser/model/TreeModel.js +3 -1
- package/dist/specification/src/ftfs/parser/model/TreeModel.js.map +1 -1
- package/dist/specification/src/sync/common/decoration/Decorator.d.ts +91 -0
- package/dist/specification/src/sync/common/decoration/Decorator.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/Decorator.js +139 -0
- package/dist/specification/src/sync/common/decoration/Decorator.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/condition-evaluator.d.ts +95 -0
- package/dist/specification/src/sync/common/decoration/condition-evaluator.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/condition-evaluator.js +210 -0
- package/dist/specification/src/sync/common/decoration/condition-evaluator.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/decorator-paths.d.ts +71 -22
- package/dist/specification/src/sync/common/decoration/decorator-paths.d.ts.map +1 -1
- package/dist/specification/src/sync/common/decoration/decorator-paths.js +23 -1
- package/dist/specification/src/sync/common/decoration/decorator-paths.js.map +1 -1
- package/dist/specification/src/sync/common/decoration/decorators.d.ts +0 -8
- package/dist/specification/src/sync/common/decoration/decorators.d.ts.map +1 -1
- package/dist/specification/src/sync/common/decoration/decorators.js +0 -15
- package/dist/specification/src/sync/common/decoration/decorators.js.map +1 -1
- package/dist/specification/src/sync/common/decoration/index.d.ts +4 -0
- package/dist/specification/src/sync/common/decoration/index.d.ts.map +1 -1
- package/dist/specification/src/sync/common/decoration/index.js +4 -0
- package/dist/specification/src/sync/common/decoration/index.js.map +1 -1
- package/dist/specification/src/sync/common/decoration/interfaces.d.ts +38 -0
- package/dist/specification/src/sync/common/decoration/interfaces.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/interfaces.js +3 -0
- package/dist/specification/src/sync/common/decoration/interfaces.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Enums.d.ts +18 -0
- package/dist/specification/src/sync/common/decoration/steps/Enums.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Enums.js +50 -0
- package/dist/specification/src/sync/common/decoration/steps/Enums.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Hide.d.ts +18 -0
- package/dist/specification/src/sync/common/decoration/steps/Hide.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Hide.js +46 -0
- package/dist/specification/src/sync/common/decoration/steps/Hide.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Message.d.ts +26 -0
- package/dist/specification/src/sync/common/decoration/steps/Message.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Message.js +77 -0
- package/dist/specification/src/sync/common/decoration/steps/Message.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Readonly.d.ts +18 -0
- package/dist/specification/src/sync/common/decoration/steps/Readonly.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Readonly.js +43 -0
- package/dist/specification/src/sync/common/decoration/steps/Readonly.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Validity.d.ts +18 -0
- package/dist/specification/src/sync/common/decoration/steps/Validity.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/Validity.js +68 -0
- package/dist/specification/src/sync/common/decoration/steps/Validity.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/enum-utils.d.ts +19 -0
- package/dist/specification/src/sync/common/decoration/steps/enum-utils.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/enum-utils.js +48 -0
- package/dist/specification/src/sync/common/decoration/steps/enum-utils.js.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/index.d.ts +6 -0
- package/dist/specification/src/sync/common/decoration/steps/index.d.ts.map +1 -0
- package/dist/specification/src/sync/common/decoration/steps/index.js +14 -0
- package/dist/specification/src/sync/common/decoration/steps/index.js.map +1 -0
- package/dist/specification/src/sync/common/i18n.json +32 -0
- package/dist/specification/src/sync/common/importProject.d.ts.map +1 -1
- package/dist/specification/src/sync/common/importProject.js +2 -0
- package/dist/specification/src/sync/common/importProject.js.map +1 -1
- package/dist/specification/src/sync/common/rules.d.ts +1 -1
- package/dist/specification/src/sync/common/rules.js +1 -1
- package/dist/specification/src/sync/v2/export/controls/Fragment.d.ts +4 -5
- package/dist/specification/src/sync/v2/export/controls/Fragment.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/export/controls/Fragment.js +47 -26
- package/dist/specification/src/sync/v2/export/controls/Fragment.js.map +1 -1
- package/dist/specification/src/sync/v2/export/export.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/export/export.js +3 -2
- package/dist/specification/src/sync/v2/export/export.js.map +1 -1
- package/dist/specification/src/sync/v2/export/exportPage.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/export/exportPage.js +48 -19
- package/dist/specification/src/sync/v2/export/exportPage.js.map +1 -1
- package/dist/specification/src/sync/v2/export/exportPageGeneric.d.ts +2 -0
- package/dist/specification/src/sync/v2/export/exportPageGeneric.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/export/exportPageGeneric.js +17 -6
- package/dist/specification/src/sync/v2/export/exportPageGeneric.js.map +1 -1
- package/dist/specification/src/sync/v2/export/view-controller-generator.d.ts +54 -6
- package/dist/specification/src/sync/v2/export/view-controller-generator.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/export/view-controller-generator.js +106 -12
- package/dist/specification/src/sync/v2/export/view-controller-generator.js.map +1 -1
- package/dist/specification/src/sync/v2/generate/schemaAdaptation.js +2 -2
- package/dist/specification/src/sync/v2/generate/schemaAdaptation.js.map +1 -1
- package/dist/specification/src/sync/v2/generate/utils.js +3 -4
- package/dist/specification/src/sync/v2/generate/utils.js.map +1 -1
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/FilterBar.js +4 -4
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.d.ts +12 -0
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.d.ts.map +1 -0
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.js +167 -0
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.js.map +1 -0
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiTable.js +3 -3
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiTable.js.map +1 -1
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.d.ts +59 -2
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.js +582 -7
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.js.map +1 -1
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.d.ts +1 -0
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.js +1 -0
- package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.js.map +1 -1
- package/dist/specification/src/sync/v2/genericSchemaHandling/pages/pageAccess.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/genericSchemaHandling/pages/pageAccess.js +29 -6
- package/dist/specification/src/sync/v2/genericSchemaHandling/pages/pageAccess.js.map +1 -1
- package/dist/specification/src/sync/v2/types.d.ts +2 -0
- package/dist/specification/src/sync/v2/types.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/types.js.map +1 -1
- package/dist/specification/src/sync/v2/utils.d.ts +25 -0
- package/dist/specification/src/sync/v2/utils.d.ts.map +1 -1
- package/dist/specification/src/sync/v2/utils.js +28 -4
- package/dist/specification/src/sync/v2/utils.js.map +1 -1
- package/dist/specification/src/sync/v4/application.d.ts +1 -0
- package/dist/specification/src/sync/v4/application.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/application.js +10 -0
- package/dist/specification/src/sync/v4/application.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/FilterBar.d.ts +1 -2
- package/dist/specification/src/sync/v4/export/controls/FilterBar.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/FilterBar.js +1 -2
- package/dist/specification/src/sync/v4/export/controls/FilterBar.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/Header.d.ts +3 -5
- package/dist/specification/src/sync/v4/export/controls/Header.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/Header.js +2 -7
- package/dist/specification/src/sync/v4/export/controls/Header.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/HeaderAction.d.ts +9 -3
- package/dist/specification/src/sync/v4/export/controls/HeaderAction.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/HeaderAction.js +10 -6
- package/dist/specification/src/sync/v4/export/controls/HeaderAction.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/InlineEdit.d.ts +38 -0
- package/dist/specification/src/sync/v4/export/controls/InlineEdit.d.ts.map +1 -0
- package/dist/specification/src/sync/v4/export/controls/InlineEdit.js +86 -0
- package/dist/specification/src/sync/v4/export/controls/InlineEdit.js.map +1 -0
- package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.d.ts +1 -2
- package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.js +1 -2
- package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.d.ts +13 -51
- package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.js +97 -238
- package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/Table.d.ts +6 -27
- package/dist/specification/src/sync/v4/export/controls/Table.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/Table.js +14 -49
- package/dist/specification/src/sync/v4/export/controls/Table.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/ToolBarAction.d.ts +3 -1
- package/dist/specification/src/sync/v4/export/controls/ToolBarAction.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/ToolBarAction.js +8 -5
- package/dist/specification/src/sync/v4/export/controls/ToolBarAction.js.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/index.d.ts +1 -0
- package/dist/specification/src/sync/v4/export/controls/index.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/controls/index.js +1 -0
- package/dist/specification/src/sync/v4/export/controls/index.js.map +1 -1
- package/dist/specification/src/sync/v4/export/factory.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/factory.js +2 -4
- package/dist/specification/src/sync/v4/export/factory.js.map +1 -1
- package/dist/specification/src/sync/v4/export/fpmCustomPage.d.ts +1 -0
- package/dist/specification/src/sync/v4/export/fpmCustomPage.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/fpmCustomPage.js +216 -46
- package/dist/specification/src/sync/v4/export/fpmCustomPage.js.map +1 -1
- package/dist/specification/src/sync/v4/export/pages/ListReport.d.ts +15 -2
- package/dist/specification/src/sync/v4/export/pages/ListReport.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/export/pages/ListReport.js +33 -1
- package/dist/specification/src/sync/v4/export/pages/ListReport.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/actions.js +4 -4
- package/dist/specification/src/sync/v4/generate/actions.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/app.d.ts +11 -0
- package/dist/specification/src/sync/v4/generate/app.d.ts.map +1 -0
- package/dist/specification/src/sync/v4/generate/app.js +31 -0
- package/dist/specification/src/sync/v4/generate/app.js.map +1 -0
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.d.ts +13 -0
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.js +74 -2
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/extensions.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/extensions.js +4 -3
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/extensions.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/generator.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/generator.js +29 -27
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/generator.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/utils.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/utils.js +12 -3
- package/dist/specification/src/sync/v4/generate/fpm-custom-page/utils.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.d.ts +32 -13
- package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.js +106 -79
- package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/list-report/listReport.d.ts +16 -10
- package/dist/specification/src/sync/v4/generate/list-report/listReport.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/generate/list-report/listReport.js +64 -30
- package/dist/specification/src/sync/v4/generate/list-report/listReport.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/objectPage.d.ts +1 -2
- package/dist/specification/src/sync/v4/generate/objectPage.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/generate/objectPage.js +136 -95
- package/dist/specification/src/sync/v4/generate/objectPage.js.map +1 -1
- package/dist/specification/src/sync/v4/generate/utils/inlineEdit.d.ts +18 -0
- package/dist/specification/src/sync/v4/generate/utils/inlineEdit.d.ts.map +1 -0
- package/dist/specification/src/sync/v4/generate/utils/inlineEdit.js +91 -0
- package/dist/specification/src/sync/v4/generate/utils/inlineEdit.js.map +1 -0
- package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.d.ts +156 -0
- package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.d.ts.map +1 -0
- package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.js +192 -0
- package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.js.map +1 -0
- package/dist/specification/src/sync/v4/import/pages/fpmCustomPage.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/import/pages/fpmCustomPage.js +20 -0
- package/dist/specification/src/sync/v4/import/pages/fpmCustomPage.js.map +1 -1
- package/dist/specification/src/sync/v4/import/pages/listReport.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/import/pages/listReport.js.map +1 -1
- package/dist/specification/src/sync/v4/import/pages/objectPage.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/import/pages/objectPage.js +4 -23
- package/dist/specification/src/sync/v4/import/pages/objectPage.js.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/App.d.ts +2 -4
- package/dist/specification/src/sync/v4/sync-rules/App.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/App.js +5 -1
- package/dist/specification/src/sync/v4/sync-rules/App.js.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/AppSchema.d.ts +2 -1
- package/dist/specification/src/sync/v4/sync-rules/AppSchema.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/AppSchema.js +3 -1
- package/dist/specification/src/sync/v4/sync-rules/AppSchema.js.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.d.ts +1 -294
- package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.js +0 -753
- package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.js.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/Page.d.ts +2 -4
- package/dist/specification/src/sync/v4/sync-rules/Page.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/sync-rules/Page.js.map +1 -1
- package/dist/specification/src/sync/v4/utils/StableIdHelper.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/utils/StableIdHelper.js +10 -4
- package/dist/specification/src/sync/v4/utils/StableIdHelper.js.map +1 -1
- package/dist/specification/src/sync/v4/utils/macros.d.ts +19 -0
- package/dist/specification/src/sync/v4/utils/macros.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/utils/macros.js +34 -0
- package/dist/specification/src/sync/v4/utils/macros.js.map +1 -1
- package/dist/specification/src/sync/v4/utils/utils.d.ts +30 -2
- package/dist/specification/src/sync/v4/utils/utils.d.ts.map +1 -1
- package/dist/specification/src/sync/v4/utils/utils.js +310 -57
- package/dist/specification/src/sync/v4/utils/utils.js.map +1 -1
- package/dist/specification/test/test-utils/utils.d.ts +1 -0
- package/dist/specification/test/test-utils/utils.d.ts.map +1 -1
- package/dist/specification/test/test-utils/utils.js +11 -0
- package/dist/specification/test/test-utils/utils.js.map +1 -1
- package/dist/specification/test/unit/decorators/validity-test-utils.d.ts +2 -2
- package/dist/specification/test/unit/decorators/validity-test-utils.d.ts.map +1 -1
- package/dist/specification/test/unit/decorators/validity-test-utils.js +6 -6
- package/dist/specification/test/unit/decorators/validity-test-utils.js.map +1 -1
- package/dist/templates/AnalyticalTableColumnsExtension.xml +3 -3
- package/dist/templates/GridTableColumnsExtension.xml +3 -3
- package/dist/templates/ResponsiveTableColumnsExtension.xml +2 -2
- package/dist/templates/TreeTableColumnsExtension.xml +4 -4
- package/dist/templates/fragment.xml +3 -3
- package/dist/templates/view.xml +3 -3
- package/dist/types/src/apiTypes.d.ts +44 -6
- package/dist/types/src/apiTypes.d.ts.map +1 -1
- package/dist/types/src/apiTypes.js +1 -0
- package/dist/types/src/apiTypes.js.map +1 -1
- package/dist/types/src/common/types.d.ts +27 -11
- package/dist/types/src/common/types.d.ts.map +1 -1
- package/dist/types/src/common/types.js +19 -10
- package/dist/types/src/common/types.js.map +1 -1
- package/dist/types/src/v4/application.d.ts +15 -0
- package/dist/types/src/v4/application.d.ts.map +1 -1
- package/dist/types/src/v4/application.js +10 -0
- package/dist/types/src/v4/application.js.map +1 -1
- package/dist/types/src/v4/controls/InlineEdit.d.ts +30 -0
- package/dist/types/src/v4/controls/InlineEdit.d.ts.map +1 -0
- package/dist/types/src/v4/controls/InlineEdit.js +3 -0
- package/dist/types/src/v4/controls/InlineEdit.js.map +1 -0
- package/dist/types/src/v4/controls/ObjectPageTable.d.ts +91 -250
- package/dist/types/src/v4/controls/ObjectPageTable.d.ts.map +1 -1
- package/dist/types/src/v4/controls/ObjectPageTable.js.map +1 -1
- package/dist/types/src/v4/controls/Table.d.ts +4 -4
- package/dist/types/src/v4/controls/index.d.ts +1 -0
- package/dist/types/src/v4/controls/index.d.ts.map +1 -1
- package/dist/types/src/v4/controls/index.js +1 -0
- package/dist/types/src/v4/controls/index.js.map +1 -1
- package/dist/types/src/v4/pages/ListReportConfigV4.d.ts +5 -1
- package/dist/types/src/v4/pages/ListReportConfigV4.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -38,6 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.QUALIFIER_SEPARATOR = exports.FIELD_SEPARATOR = exports.DATA_FIELD_FOR_ACTION_GROUP = void 0;
|
|
40
40
|
exports.addExtensionToArray = addExtensionToArray;
|
|
41
|
+
exports.getColumnsEnum = getColumnsEnum;
|
|
41
42
|
exports.addEnumForProperties = addEnumForProperties;
|
|
42
43
|
exports.addCustomColumnDefinition = addCustomColumnDefinition;
|
|
43
44
|
exports.addActionRecordToSchema = addActionRecordToSchema;
|
|
@@ -67,6 +68,7 @@ exports.importManifestBasedActionMenuSettingsOfReference = importManifestBasedAc
|
|
|
67
68
|
exports.importActionSettingsOfReference = importActionSettingsOfReference;
|
|
68
69
|
exports.addCustomFieldDefinition = addCustomFieldDefinition;
|
|
69
70
|
exports.addManifestPathsToProperties = addManifestPathsToProperties;
|
|
71
|
+
exports.getInsertableForEntitySet = getInsertableForEntitySet;
|
|
70
72
|
exports.getPageManifestPath = getPageManifestPath;
|
|
71
73
|
const utils_1 = require("../../common/utils");
|
|
72
74
|
const StableIdHelper_1 = require("./StableIdHelper");
|
|
@@ -78,14 +80,20 @@ const path_1 = require("path");
|
|
|
78
80
|
const DataFieldStrategy_1 = require("../../common/DataFieldStrategy");
|
|
79
81
|
const utils_2 = require("../import/utils");
|
|
80
82
|
const src_1 = require("@sap/ux-specification-types/src");
|
|
81
|
-
const objectPage_1 = require("../generate/objectPage");
|
|
82
83
|
const v4controls = __importStar(require("../export/controls"));
|
|
83
84
|
const pages = __importStar(require("../export/pages"));
|
|
84
85
|
const application_1 = require("../application");
|
|
86
|
+
const propertiesForEdit_1 = require("../generate/utils/propertiesForEdit");
|
|
85
87
|
exports.DATA_FIELD_FOR_ACTION_GROUP = 'DataFieldForActionGroup';
|
|
86
88
|
const UI_ANNOTATION_KEY = 'UI';
|
|
87
89
|
exports.FIELD_SEPARATOR = '::';
|
|
88
90
|
exports.QUALIFIER_SEPARATOR = '#';
|
|
91
|
+
/**
|
|
92
|
+
* List of annotation-based action prefixes that should be included in the schema
|
|
93
|
+
* even if they lack custom action properties (press, menu), so they can be validated
|
|
94
|
+
* and removed during export if they don't match the config.
|
|
95
|
+
*/
|
|
96
|
+
const ANNOTATION_BASED_ACTION_PREFIXES = [`${ux_specification_types_1.DataFieldActionType.DataFieldForIntentBasedNavigation}${exports.FIELD_SEPARATOR}`];
|
|
89
97
|
const ACTION_TYPE = 'actionType';
|
|
90
98
|
const strategyTypeMap = new Map([
|
|
91
99
|
['', "com.sap.vocabularies.UI.v1.DataFieldForAction" /* UIAnnotationTypes.DataFieldForAction */],
|
|
@@ -95,19 +103,23 @@ const strategyTypeMap = new Map([
|
|
|
95
103
|
]);
|
|
96
104
|
const OP_ACTION_MENU_DEFINITION = {
|
|
97
105
|
actionMenuDefinitionName: ux_specification_types_1.DefinitionName.ObjectPageCustomActionMenu,
|
|
98
|
-
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.ObjectPageCustomActionMenuActions
|
|
106
|
+
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.ObjectPageCustomActionMenuActions,
|
|
107
|
+
actionName: ux_specification_types_1.DefinitionName.ObjectPageToolBarAction
|
|
99
108
|
};
|
|
100
109
|
const OP_HEADER_ACTION_MENU_DEFINITION = {
|
|
101
110
|
actionMenuDefinitionName: ux_specification_types_1.DefinitionName.ObjectPageHeaderCustomActionMenu,
|
|
102
|
-
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.ObjectPageHeaderCustomActionMenuActions
|
|
111
|
+
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.ObjectPageHeaderCustomActionMenuActions,
|
|
112
|
+
actionName: ux_specification_types_1.DefinitionName.ObjectPageHeaderAction
|
|
103
113
|
};
|
|
104
114
|
const LR_ACTION_MENU_DEFINITION = {
|
|
105
115
|
actionMenuDefinitionName: ux_specification_types_1.DefinitionName.CustomActionMenu,
|
|
106
|
-
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.CustomActionMenuActions
|
|
116
|
+
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.CustomActionMenuActions,
|
|
117
|
+
actionName: ux_specification_types_1.DefinitionName.ToolBarAction
|
|
107
118
|
};
|
|
108
119
|
const LR_ACTION_VIEW_MENU_DEFINITION = {
|
|
109
120
|
actionMenuDefinitionName: ux_specification_types_1.DefinitionName.ViewCustomActionMenu,
|
|
110
|
-
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.ViewCustomActionMenuActions
|
|
121
|
+
actionMenuActionsDefinitionName: ux_specification_types_1.DefinitionName.ViewCustomActionMenuActions,
|
|
122
|
+
actionName: ux_specification_types_1.DefinitionName.ViewToolBarAction
|
|
111
123
|
};
|
|
112
124
|
const actionMenuDefinitionNameMap = new Map([
|
|
113
125
|
[ux_specification_types_1.DefinitionName.CustomTableActionOP, OP_ACTION_MENU_DEFINITION],
|
|
@@ -234,7 +246,7 @@ function getExtensionDetails(extension, extensionDefinitionName, extId, actionTy
|
|
|
234
246
|
* @param {string} extensionDefinitionName - The name of the extension definition to refer to.
|
|
235
247
|
* @param {[string, unknown][]} sortedExtArray - A sorted array of existing extensions represented as key-value pairs.
|
|
236
248
|
* @param {ExtensionLogger} logger - The logger used for logging errors and warnings during the adjustment process.
|
|
237
|
-
* @param {boolean} [forceAdd
|
|
249
|
+
* @param {boolean} [forceAdd] - Flag indicating whether to force adding extensions even if proper anchor/placement is not found.
|
|
238
250
|
*/
|
|
239
251
|
function adjustCustomExtReferringToCustomExt(remainingExtensions, extensionDefinitionName, sortedExtArray, logger, forceAdd = false) {
|
|
240
252
|
const initialRemaining = Object.entries(remainingExtensions).length;
|
|
@@ -406,6 +418,110 @@ function handleInvalidExtension(logger, extensionId, sortedExtensionsArray, newE
|
|
|
406
418
|
sortedExtensionsArray.push([extensionId, newExtensionReference]);
|
|
407
419
|
delete localExtensions[extensionId];
|
|
408
420
|
}
|
|
421
|
+
/**
|
|
422
|
+
* Checks if an extension ID represents an annotation-based action.
|
|
423
|
+
* Annotation-based actions should be included in the schema even if they lack custom action
|
|
424
|
+
* properties (press, menu), so they can be validated and removed during export if they don't match the config.
|
|
425
|
+
*
|
|
426
|
+
* @param {string} extensionId - The extension ID to check.
|
|
427
|
+
* @returns {boolean} True if the extension is an annotation-based action, false otherwise.
|
|
428
|
+
*/
|
|
429
|
+
function isAnnotationBasedAction(extensionId) {
|
|
430
|
+
return ANNOTATION_BASED_ACTION_PREFIXES.some((prefix) => extensionId.startsWith(prefix));
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Handles orphaned annotation-based actions that exist in manifest but not in annotations.
|
|
434
|
+
* These actions must be added to the schema to enable cleanup during export.
|
|
435
|
+
*
|
|
436
|
+
* @param {string} extensionId - The extension ID.
|
|
437
|
+
* @param {any} extension - The extension object.
|
|
438
|
+
* @param {string} extensionDefinitionName - The definition name associated with the extensions.
|
|
439
|
+
* @param {Definition} [appSchema] - Optional application schema for creating specific definitions.
|
|
440
|
+
* @param {ActionDetails[]} sortedExtensionsArray - The array to add the action to.
|
|
441
|
+
*/
|
|
442
|
+
function handleOrphanedAnnotationAction(extensionId, extension, extensionDefinitionName, appSchema, sortedExtensionsArray) {
|
|
443
|
+
// This is an annotation-based action from manifest that doesn't exist in annotations.
|
|
444
|
+
// IMPORTANT: We must add these orphaned actions to the schema to enable cleanup.
|
|
445
|
+
//
|
|
446
|
+
// When an action is renamed (e.g., IBN action's semantic object changes), the old
|
|
447
|
+
// action key remains in the manifest but disappears from the config (annotations).
|
|
448
|
+
// By adding it to the schema, the export process can detect this mismatch and remove
|
|
449
|
+
// the orphaned entry from the manifest. If we don't add it to the schema, it will be
|
|
450
|
+
// ignored and remain as garbage in the manifest forever.
|
|
451
|
+
//
|
|
452
|
+
// Process:
|
|
453
|
+
// 1. Add orphaned action to schema with Standard action type
|
|
454
|
+
// 2. During export: compare schema with config
|
|
455
|
+
// 3. Action in schema but NOT in config → remove from manifest
|
|
456
|
+
// 4. Action in schema AND in config → keep in manifest
|
|
457
|
+
if (appSchema) {
|
|
458
|
+
// Create specific definition name and schema like "ToolBarActionGroup<DataFieldForActionGroup::AnnoActionMenu>"
|
|
459
|
+
const { actionName } = determineActionDefinitionNames(extensionDefinitionName);
|
|
460
|
+
const preparedRef = (0, common_1.prepareRef)(extensionId);
|
|
461
|
+
const specificDefinitionName = (0, common_1.getFacetDefinitionKey)(actionName, preparedRef);
|
|
462
|
+
// Create the schema definition for this action
|
|
463
|
+
(0, common_1.parseSchemaDefinition)(actionName, preparedRef, appSchema);
|
|
464
|
+
const correctedExtensionReference = getExtensionDetails(extension, specificDefinitionName, extensionId, ux_specification_types_1.ActionType.Standard);
|
|
465
|
+
sortedExtensionsArray.push([extensionId, correctedExtensionReference]);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
// Fallback if no appSchema provided
|
|
469
|
+
const correctedExtensionReference = getExtensionDetails(extension, extensionDefinitionName, extensionId, ux_specification_types_1.ActionType.Standard);
|
|
470
|
+
sortedExtensionsArray.push([extensionId, correctedExtensionReference]);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Recursively checks if an action exists in annotation entries, including nested actions within action groups.
|
|
475
|
+
*
|
|
476
|
+
* @param {string} extensionId - The unique identifier for the extension to search for.
|
|
477
|
+
* @param {ActionDetails[]} annotationEntries - Array of actions to search through.
|
|
478
|
+
* @param {Definition | undefined} appSchema - Optional application schema to look up action group definitions.
|
|
479
|
+
* @returns {boolean} True if the action exists at any level (top-level or nested in groups).
|
|
480
|
+
*/
|
|
481
|
+
function actionExistsInAnnotations(extensionId, annotationEntries, appSchema) {
|
|
482
|
+
for (const [id, actionDef] of annotationEntries) {
|
|
483
|
+
// Check top-level match
|
|
484
|
+
if (id === extensionId) {
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
// Check if this is an action group with nested actions
|
|
488
|
+
const actionDefinition = actionDef;
|
|
489
|
+
if (appSchema && actionDefinition.$ref) {
|
|
490
|
+
const defKey = actionDefinition.$ref.replace('#/definitions/', '');
|
|
491
|
+
const definition = appSchema.definitions?.[defKey];
|
|
492
|
+
// If it's an action group, check its nested actions (properties)
|
|
493
|
+
if (definition && definition.properties) {
|
|
494
|
+
const nestedActions = Object.entries(definition.properties).map(([nestedId, nestedDef]) => [nestedId, nestedDef]);
|
|
495
|
+
// Recursively search nested actions
|
|
496
|
+
if (actionExistsInAnnotations(extensionId, nestedActions, appSchema)) {
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Processes annotation-based actions with unsupported extension types.
|
|
506
|
+
* Either skips duplicates or handles orphaned actions.
|
|
507
|
+
*
|
|
508
|
+
* @param {string} extensionId - The extension ID.
|
|
509
|
+
* @param {any} extension - The extension object.
|
|
510
|
+
* @param {string} extensionDefinitionName - The definition name.
|
|
511
|
+
* @param {Definition} [appSchema] - Optional application schema.
|
|
512
|
+
* @param {ActionDetails[]} annotationEntries - Array of annotation entries.
|
|
513
|
+
* @param {ActionDetails[]} sortedExtensionsArray - The sorted extensions array.
|
|
514
|
+
*/
|
|
515
|
+
function processAnnotationBasedAction(extensionId, extension, extensionDefinitionName, appSchema, annotationEntries, sortedExtensionsArray) {
|
|
516
|
+
// Check if this annotation-based action exists in annotationEntries (including nested in action groups)
|
|
517
|
+
const existsInAnnotations = actionExistsInAnnotations(extensionId, annotationEntries, appSchema);
|
|
518
|
+
if (existsInAnnotations) {
|
|
519
|
+
// Action already exists from annotations - skip it to avoid duplicates
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
// Handle orphaned annotation-based action
|
|
523
|
+
handleOrphanedAnnotationAction(extensionId, extension, extensionDefinitionName, appSchema, sortedExtensionsArray);
|
|
524
|
+
}
|
|
409
525
|
/**
|
|
410
526
|
* Adds extension entries to a sorted array of extensions based on specific rules,
|
|
411
527
|
* including using anchors, callbacks, and custom templates.
|
|
@@ -413,13 +529,14 @@ function handleInvalidExtension(logger, extensionId, sortedExtensionsArray, newE
|
|
|
413
529
|
* @param {CustomExtensions} extensions - The object containing custom extensions to be added to the array.
|
|
414
530
|
* @param {ActionDetails[]} sortedExtensionsArray - The array of sorted extensions to which new extensions will be added.
|
|
415
531
|
* @param {string} extensionDefinitionName - The definition name associated with the extensions being added.
|
|
416
|
-
* @param {TemplatePropertyName | TemplatePropertyName[]} [templatePropertyName
|
|
532
|
+
* @param {TemplatePropertyName | TemplatePropertyName[]} [templatePropertyName] -
|
|
417
533
|
* The property name(s) to check for existence in an extension; used to determine compatibility.
|
|
418
534
|
* @param {ExtensionLogger} [logger] - An optional logger to handle logging of invalid extensions or other events.
|
|
419
535
|
* @param {boolean} [ignoreAnnotationAnchors=false] - A flag to indicate whether extension anchors should be ignored.
|
|
536
|
+
* @param {Definition} [appSchema] - Optional application schema for creating specific definitions for annotation-based actions.
|
|
420
537
|
* @returns {ActionDetails[]} The updated sorted extensions array, including newly added and valid extensions.
|
|
421
538
|
*/
|
|
422
|
-
function addExtensionToArray(extensions, sortedExtensionsArray, extensionDefinitionName, templatePropertyName = ux_specification_types_1.TemplatePropertyName.Template, logger, ignoreAnnotationAnchors = false) {
|
|
539
|
+
function addExtensionToArray(extensions, sortedExtensionsArray, extensionDefinitionName, templatePropertyName = ux_specification_types_1.TemplatePropertyName.Template, logger, ignoreAnnotationAnchors = false, appSchema) {
|
|
423
540
|
templatePropertyName = Array.isArray(templatePropertyName) ? templatePropertyName : [templatePropertyName];
|
|
424
541
|
const annotationEntries = [...sortedExtensionsArray];
|
|
425
542
|
const localExtensions = { ...extensions };
|
|
@@ -439,9 +556,17 @@ function addExtensionToArray(extensions, sortedExtensionsArray, extensionDefinit
|
|
|
439
556
|
}
|
|
440
557
|
const hasUnsupportedExtensionType = templatePropertyName.every((propertyName) => !(propertyName in extension));
|
|
441
558
|
if (hasUnsupportedExtensionType) {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
559
|
+
const isAnnotationBased = isAnnotationBasedAction(extensionId);
|
|
560
|
+
if (isAnnotationBased) {
|
|
561
|
+
processAnnotationBasedAction(extensionId, extension, extensionDefinitionName, appSchema, annotationEntries, sortedExtensionsArray);
|
|
562
|
+
delete localExtensions[extensionId];
|
|
563
|
+
continue;
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
// Skip regular entries (columns, actions, etc.) that don't have required properties
|
|
567
|
+
delete localExtensions[extensionId];
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
445
570
|
}
|
|
446
571
|
const anchor = getExtensionAnchor(extension, annotationEntries);
|
|
447
572
|
if (anchor) {
|
|
@@ -464,16 +589,39 @@ function addExtensionToArray(extensions, sortedExtensionsArray, extensionDefinit
|
|
|
464
589
|
return sortedExtensionsArray;
|
|
465
590
|
}
|
|
466
591
|
/**
|
|
467
|
-
*
|
|
592
|
+
* Extracts the column name from the keys metadata of a column definition.
|
|
593
|
+
* Returns the value from 'Target' or 'Value' key, with UI namespace stripped.
|
|
468
594
|
*
|
|
469
|
-
* @param
|
|
470
|
-
* @returns
|
|
595
|
+
* @param keys - Array of schema definition keys from the column definition.
|
|
596
|
+
* @returns The column name with proper separators, or undefined if not found.
|
|
597
|
+
*/
|
|
598
|
+
function getColumnNameFromKeys(keys) {
|
|
599
|
+
if (!keys?.length) {
|
|
600
|
+
return undefined;
|
|
601
|
+
}
|
|
602
|
+
const keyEntry = keys.find((k) => k.name === ux_specification_types_1.SchemaKeyName.target || k.name === ux_specification_types_1.SchemaKeyName.value);
|
|
603
|
+
if (!keyEntry?.value) {
|
|
604
|
+
return undefined;
|
|
605
|
+
}
|
|
606
|
+
// Strip UI. namespace prefix (e.g., "UI.FieldGroup#qual" -> "FieldGroup#qual")
|
|
607
|
+
return keyEntry.value.replace(/\bUI\./g, '');
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Returns column names for enum, extracted from the keys metadata of each column.
|
|
611
|
+
* Only columns with 'Target' or 'Value' keys are included (excludes actions).
|
|
612
|
+
*
|
|
613
|
+
* @param lineItems - Current lineItems definition, with all records.
|
|
614
|
+
* @returns Column names with proper separators (/ for navigation, # for qualifiers).
|
|
471
615
|
*/
|
|
472
616
|
function getColumnsEnum(lineItems) {
|
|
617
|
+
if (typeof lineItems === 'boolean') {
|
|
618
|
+
return [];
|
|
619
|
+
}
|
|
473
620
|
const columnEnum = [];
|
|
474
|
-
for (const
|
|
475
|
-
|
|
476
|
-
|
|
621
|
+
for (const definition of Object.values(lineItems)) {
|
|
622
|
+
const columnName = getColumnNameFromKeys(definition?.[ux_specification_types_1.SchemaTag.keys]);
|
|
623
|
+
if (columnName) {
|
|
624
|
+
columnEnum.push(columnName);
|
|
477
625
|
}
|
|
478
626
|
}
|
|
479
627
|
return columnEnum;
|
|
@@ -492,7 +640,7 @@ function removeDataFieldPrefix(key) {
|
|
|
492
640
|
* Extracts and processes the columns defined in the given lineItems or Definition object,
|
|
493
641
|
* returning an array of CreationFieldOneOfOption.
|
|
494
642
|
*
|
|
495
|
-
* @param {Definition} [columns
|
|
643
|
+
* @param {Definition} [columns] - An object containing column definitions where keys represent field identifiers
|
|
496
644
|
* and values are field metadata.
|
|
497
645
|
* @returns {CreationFieldOneOfOption[]} An array of field options, each containing field-specific metadata.
|
|
498
646
|
*/
|
|
@@ -653,14 +801,28 @@ function addActionRecordToSchema(lineItemDefinitionParams, createRef = true) {
|
|
|
653
801
|
//no footer bar -> toolbar action
|
|
654
802
|
const actionDefinitionName = determineActionDefinitionName(data, lineItemRecord);
|
|
655
803
|
const description = (0, common_1.getDataFieldDescription)(lineItemRecord, data.entityType);
|
|
656
|
-
|
|
804
|
+
// Generate stable ID using strategy pattern to ensure correct key format for all action types.
|
|
805
|
+
// This is crucial for IBN actions, which need the full key including SemanticObject and RequiresContext
|
|
806
|
+
// (e.g., "DataFieldForIntentBasedNavigation::v4Freestyle::Inbound::RequiresContext")
|
|
807
|
+
// to be properly matched when referenced in manifest-based action menus.
|
|
808
|
+
const strategy = DataFieldStrategy_1.dataFieldStrategyContext.getStrategy(lineItemRecord.$Type);
|
|
809
|
+
const stableId = strategy.generateStableId(lineItemRecord);
|
|
810
|
+
// Extract Action property for keys generation (used by addTargetAndKeysOfAction).
|
|
811
|
+
// For IBN actions, this is just the action name (e.g., "Inbound").
|
|
812
|
+
// For bound actions, this may include namespace (e.g., "com.sap.Action/MyAction").
|
|
657
813
|
const actionId = typeof lineItemRecord.Action === 'string' ? lineItemRecord.Action : lineItemRecord.Action['path'];
|
|
658
|
-
|
|
659
|
-
|
|
814
|
+
// Remove type prefix from stable ID for use in $ref generation.
|
|
815
|
+
// This ensures getUniqueFacetDefinitionLink can properly detect duplicates based on full action identity,
|
|
816
|
+
// not just the Action property. For example, two IBN actions with different SemanticObjects but same Action
|
|
817
|
+
// should be treated as different actions, not duplicates.
|
|
818
|
+
const stableIdWithoutPrefix = stableId.split('::').slice(1).join('::');
|
|
819
|
+
// Create action definition with full stable ID as property key.
|
|
820
|
+
// This allows manifest-based menus to correctly reference actions by their complete identity.
|
|
821
|
+
const actionDefinition = (actionsDefinition.properties[stableId] = {
|
|
660
822
|
description
|
|
661
823
|
});
|
|
662
824
|
if (createRef) {
|
|
663
|
-
actionDefinition.$ref = (0, common_1.getUniqueFacetDefinitionLink)(actionDefinitionName, (0, common_1.prepareRef)(
|
|
825
|
+
actionDefinition.$ref = (0, common_1.getUniqueFacetDefinitionLink)(actionDefinitionName, (0, common_1.prepareRef)(stableIdWithoutPrefix), data.appSchema, lineItemPath);
|
|
664
826
|
}
|
|
665
827
|
else {
|
|
666
828
|
actionDefinition.properties = {};
|
|
@@ -893,15 +1055,34 @@ function addEnumForActionAnchor(appSchema, definitionId, positionName = ux_speci
|
|
|
893
1055
|
* @param {EntityType} [entityType] - Optional entity type for additional context when retrieving column definitions.
|
|
894
1056
|
*/
|
|
895
1057
|
function addEnumForEnableMassEdit(appSchema, tableDefinitionName, columnsDefinitionName, entityType) {
|
|
1058
|
+
if (!entityType) {
|
|
1059
|
+
return;
|
|
1060
|
+
}
|
|
896
1061
|
const FIELD_PROPERTIES = ['visibleFields', 'ignoredFields'];
|
|
897
|
-
const columnsDefinitions =
|
|
898
|
-
|
|
899
|
-
const
|
|
900
|
-
|
|
1062
|
+
const columnsDefinitions = appSchema.definitions?.[columnsDefinitionName];
|
|
1063
|
+
// Ignore check for hidden properties
|
|
1064
|
+
const filterOptions = {
|
|
1065
|
+
hidden: null
|
|
1066
|
+
};
|
|
1067
|
+
const fieldGroupsList = (0, propertiesForEdit_1.buildFieldGroupsList)(columnsDefinitions, entityType, filterOptions, 'single');
|
|
1068
|
+
const singleFieldList = (0, propertiesForEdit_1.buildSingleFieldList)(columnsDefinitions, entityType, filterOptions);
|
|
1069
|
+
const enableMassEditDefinition = (appSchema.definitions?.[tableDefinitionName]).properties?.['enableMassEdit'];
|
|
1070
|
+
const enableMassEditFields = enableMassEditDefinition.anyOf?.find((definition) => typeof definition === 'object' && definition && definition.type === 'object');
|
|
901
1071
|
for (const propertyKey in enableMassEditFields.properties) {
|
|
902
1072
|
if (FIELD_PROPERTIES.includes(propertyKey)) {
|
|
903
1073
|
const property = enableMassEditFields.properties[propertyKey];
|
|
904
|
-
property.items
|
|
1074
|
+
property.items = {
|
|
1075
|
+
type: 'string',
|
|
1076
|
+
// Indicate that items are tree structure
|
|
1077
|
+
uiType: 'tree',
|
|
1078
|
+
// Selection restricted within single group
|
|
1079
|
+
restrictGroups: true,
|
|
1080
|
+
// Only value from single group is allowed
|
|
1081
|
+
exclusiveGroups: ['FieldGroup'],
|
|
1082
|
+
// Allow annotation FieldGroup creation
|
|
1083
|
+
creation: 'FieldGroup',
|
|
1084
|
+
oneOf: [...fieldGroupsList, ...singleFieldList]
|
|
1085
|
+
};
|
|
905
1086
|
property.uniqueItems = true;
|
|
906
1087
|
}
|
|
907
1088
|
}
|
|
@@ -942,14 +1123,25 @@ function getNonNavigationColumnDefinitions(appSchema, lineItemId, entityType) {
|
|
|
942
1123
|
* @returns {string} The name of the newly created specific schema definition for the creation mode.
|
|
943
1124
|
*/
|
|
944
1125
|
function initializeCreationModeSchema(appSchema, lineItemId, entityType, definitionName) {
|
|
1126
|
+
const definitions = appSchema.definitions;
|
|
945
1127
|
const columnDefinitions = getNonNavigationColumnDefinitions(appSchema, lineItemId, entityType);
|
|
946
|
-
const
|
|
947
|
-
|
|
1128
|
+
const fieldGroupsList = entityType
|
|
1129
|
+
? (0, propertiesForEdit_1.buildFieldGroupsList)(columnDefinitions, entityType, undefined, 'single', false)
|
|
1130
|
+
: [];
|
|
1131
|
+
const singleFieldList = entityType ? (0, propertiesForEdit_1.buildSingleFieldList)(columnDefinitions, entityType) : [];
|
|
948
1132
|
const specificCreationModeDefinitionName = (0, common_1.getFacetDefinitionKey)(definitionName, lineItemId);
|
|
949
|
-
const specificCreationModeDefinition = (
|
|
950
|
-
const creationFieldsDefinition = specificCreationModeDefinition.properties[ux_specification_types_1.PropertyName.creationFields];
|
|
1133
|
+
const specificCreationModeDefinition = (definitions[specificCreationModeDefinitionName] = structuredClone(definitions[definitionName]));
|
|
1134
|
+
const creationFieldsDefinition = specificCreationModeDefinition.properties?.[ux_specification_types_1.PropertyName.creationFields];
|
|
951
1135
|
const creationFieldsDefinitionItems = creationFieldsDefinition.items;
|
|
952
|
-
creationFieldsDefinitionItems['oneOf'] = [...
|
|
1136
|
+
creationFieldsDefinitionItems['oneOf'] = [...fieldGroupsList, ...singleFieldList];
|
|
1137
|
+
// Indicate that items are tree structure
|
|
1138
|
+
creationFieldsDefinitionItems['uiType'] = 'tree';
|
|
1139
|
+
// Allow annotation FieldGroup creation
|
|
1140
|
+
creationFieldsDefinitionItems['creation'] = 'FieldGroup';
|
|
1141
|
+
// Selection restricted within single group
|
|
1142
|
+
creationFieldsDefinitionItems['restrictGroups'] = true;
|
|
1143
|
+
// Only value from single group is allowed
|
|
1144
|
+
creationFieldsDefinitionItems['exclusiveGroups'] = ['FieldGroup'];
|
|
953
1145
|
// Entries of one of are translatable using 'service' i18n bundle
|
|
954
1146
|
creationFieldsDefinitionItems.i18nBundle = 'service';
|
|
955
1147
|
creationFieldsDefinition.uniqueItems = true;
|
|
@@ -966,20 +1158,12 @@ function initializeCreationModeSchema(appSchema, lineItemId, entityType, definit
|
|
|
966
1158
|
*/
|
|
967
1159
|
function addOneOfForCreationFields(appSchema, entityType, definitionName, lineItemId) {
|
|
968
1160
|
const creationModeDefinitionName = initializeCreationModeSchema(appSchema, lineItemId, entityType, definitionName);
|
|
969
|
-
//
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
// replace generic creation mode definition with specific one
|
|
976
|
-
// I don't check that $ref contains the definition name, the replacement should not work for other definitions
|
|
977
|
-
const updatedRef = $ref.replace(definitionName, creationModeDefinitionName);
|
|
978
|
-
return { ...definition, $ref: updatedRef };
|
|
979
|
-
});
|
|
980
|
-
appSchema.definitions[`${type}<${lineItemId}>`].properties.creationMode.anyOf = updatedCreationModeAnyOf;
|
|
981
|
-
}
|
|
982
|
-
});
|
|
1161
|
+
// Replace the generic creationMode definition reference with the facet-specific one
|
|
1162
|
+
const tableDefinition = appSchema.definitions[`${ux_specification_types_1.DefinitionName.ObjectPageTable}<${lineItemId}>`];
|
|
1163
|
+
const creationModeProperty = tableDefinition?.properties?.creationMode;
|
|
1164
|
+
if (creationModeProperty?.$ref) {
|
|
1165
|
+
creationModeProperty.$ref = creationModeProperty.$ref.replace(definitionName, creationModeDefinitionName);
|
|
1166
|
+
}
|
|
983
1167
|
}
|
|
984
1168
|
/**
|
|
985
1169
|
* Find the relevant V4 page under the routing targets of manifest,json.
|
|
@@ -1156,7 +1340,7 @@ function addHeaderFooterCustomActionDefinition(appSchema, v4Page, logger, custom
|
|
|
1156
1340
|
function addActionsToArray(params) {
|
|
1157
1341
|
const { extensions, initialActionDetailsList, customActionDefinitionName, logger } = params;
|
|
1158
1342
|
// Add custom actions
|
|
1159
|
-
let actionDetailsList = addExtensionToArray(extensions, initialActionDetailsList, customActionDefinitionName, [ux_specification_types_1.TemplatePropertyName.Press, ux_specification_types_1.TemplatePropertyName.Menu], logger);
|
|
1343
|
+
let actionDetailsList = addExtensionToArray(extensions, initialActionDetailsList, customActionDefinitionName, [ux_specification_types_1.TemplatePropertyName.Press, ux_specification_types_1.TemplatePropertyName.Menu], logger, false, params.appSchema);
|
|
1160
1344
|
const processActionMenusParams = {
|
|
1161
1345
|
...params,
|
|
1162
1346
|
initialActionDetailsList: actionDetailsList
|
|
@@ -1216,19 +1400,31 @@ function getMenuEntryDefinitionLink($ref, actionMenuDefinitionName, appSchema) {
|
|
|
1216
1400
|
menuEntryDefinition[originalDefinitionKey] = originalDefinition[originalDefinitionKey];
|
|
1217
1401
|
}
|
|
1218
1402
|
}
|
|
1219
|
-
// some properties doesn't make sense for menu entries
|
|
1220
|
-
|
|
1221
|
-
|
|
1403
|
+
// some properties doesn't make sense for menu entries - hide them instead of deleting
|
|
1404
|
+
// NOTE: This is a necessary trade-off. When moving IBN actions in and out of menus,
|
|
1405
|
+
// we keep these properties visible in the manifest but hidden in the UI.
|
|
1406
|
+
// Unfortunately, this is required - otherwise, when renaming actions, we end up with
|
|
1407
|
+
// orphaned entries in the manifest.
|
|
1408
|
+
if (menuEntryDefinition.properties[ux_specification_types_1.PropertyName.position]) {
|
|
1409
|
+
menuEntryDefinition.properties[ux_specification_types_1.PropertyName.position][ux_specification_types_1.SchemaTag.hidden] = true;
|
|
1410
|
+
}
|
|
1411
|
+
if (menuEntryDefinition.properties[ux_specification_types_1.PropertyName.overflowGroup]) {
|
|
1412
|
+
menuEntryDefinition.properties[ux_specification_types_1.PropertyName.overflowGroup][ux_specification_types_1.SchemaTag.hidden] = true;
|
|
1413
|
+
}
|
|
1414
|
+
if (menuEntryDefinition.properties[ux_specification_types_1.PropertyName.priority]) {
|
|
1415
|
+
menuEntryDefinition.properties[ux_specification_types_1.PropertyName.priority][ux_specification_types_1.SchemaTag.hidden] = true;
|
|
1416
|
+
}
|
|
1222
1417
|
}
|
|
1223
1418
|
return menuEntryDefinitionLink;
|
|
1224
1419
|
}
|
|
1225
1420
|
/**
|
|
1226
|
-
* Determines the appropriate action
|
|
1421
|
+
* Determines the appropriate action definition names based on a custom action definition name.
|
|
1422
|
+
* Returns menu definition names and the action name for menu entries.
|
|
1227
1423
|
*
|
|
1228
1424
|
* @param {string} customActionDefinitionName - The custom action definition name to be parsed and matched.
|
|
1229
|
-
* @returns {ActionMenuDefinitionName} The corresponding action
|
|
1425
|
+
* @returns {ActionMenuDefinitionName} The corresponding action definition names, or a default value if not found.
|
|
1230
1426
|
*/
|
|
1231
|
-
function
|
|
1427
|
+
function determineActionDefinitionNames(customActionDefinitionName) {
|
|
1232
1428
|
const { baseDefinitionName } = parseDefinitionName(customActionDefinitionName);
|
|
1233
1429
|
return actionMenuDefinitionNameMap.get(baseDefinitionName) ?? LR_ACTION_MENU_DEFINITION;
|
|
1234
1430
|
}
|
|
@@ -1254,7 +1450,7 @@ function parseDefinitionName(definitionName = '') {
|
|
|
1254
1450
|
* Updates the custom menu's default action to include a list of valid options based on the provided menu schema.
|
|
1255
1451
|
*
|
|
1256
1452
|
* @param {Definition} customMenuDefinition - The definition object for the custom menu, where the default action will be updated.
|
|
1257
|
-
* @param {Record<string, SchemaDefinition>} [menu
|
|
1453
|
+
* @param {Record<string, SchemaDefinition>} [menu] - A mapping of menu items to their schema definitions, used to generate valid options for the default action.
|
|
1258
1454
|
*/
|
|
1259
1455
|
function setCustomMenuDefaultAction(customMenuDefinition, menu = {}) {
|
|
1260
1456
|
if (customMenuDefinition.properties[ux_specification_types_1.PropertyName.defaultAction]) {
|
|
@@ -1294,7 +1490,7 @@ function processActionMenu(params, extension, actionDefinition, initialDetailsLi
|
|
|
1294
1490
|
}
|
|
1295
1491
|
const { customActionDefinitionName, appSchema, lineItemId } = params;
|
|
1296
1492
|
const detailsList = [...initialDetailsList];
|
|
1297
|
-
const { actionMenuDefinitionName, actionMenuActionsDefinitionName } =
|
|
1493
|
+
const { actionMenuDefinitionName, actionMenuActionsDefinitionName } = determineActionDefinitionNames(customActionDefinitionName);
|
|
1298
1494
|
// Prepare submenu entries to be processed
|
|
1299
1495
|
const menu = extension[ux_specification_types_1.TemplatePropertyName.Menu] ?? [];
|
|
1300
1496
|
const properties = {};
|
|
@@ -1627,8 +1823,8 @@ function importManifestBasedActionMenuSettingsOfReference(importActionParams, de
|
|
|
1627
1823
|
/**
|
|
1628
1824
|
* Determines the strategy type for action settings based on the provided data type and action type.
|
|
1629
1825
|
*
|
|
1630
|
-
* @param {string} [dataType
|
|
1631
|
-
* @param {string} [actionType
|
|
1826
|
+
* @param {string} [dataType] - The data type associated with the action settings. Defaults to an empty string.
|
|
1827
|
+
* @param {string} [actionType] - The action type within the context of the action settings. Defaults to an empty string.
|
|
1632
1828
|
* @returns {DataFieldStrategyTypes} The corresponding strategy type for the given data type and action type.
|
|
1633
1829
|
*/
|
|
1634
1830
|
function determineActionStrategyType(dataType = '', actionType = '') {
|
|
@@ -1712,6 +1908,63 @@ function addCustomFieldDefinition(appSchema, v4Page, fieldGroupInManifest, logge
|
|
|
1712
1908
|
function addManifestPathsToProperties(appSchema, definitionName, definition, pathParams, handleRelative = false) {
|
|
1713
1909
|
(0, utils_1.addManifestPathsToProperties)([v4controls, pages], appSchema, definitionName, definition, pathParams, undefined, handleRelative);
|
|
1714
1910
|
}
|
|
1911
|
+
/**
|
|
1912
|
+
* Determines whether an entity set or navigation target is insertable based on its annotations.
|
|
1913
|
+
*
|
|
1914
|
+
* When navigationPath is provided:
|
|
1915
|
+
* 1. Checks NavigationRestrictions.RestrictedProperties on the source EntitySet
|
|
1916
|
+
* 2. Resolves the target EntitySet via navigationPropertyBinding
|
|
1917
|
+
* 3. Checks InsertRestrictions on the target EntitySet
|
|
1918
|
+
* 4. Both must allow insertion for the function to return true
|
|
1919
|
+
*
|
|
1920
|
+
* When navigationPath is not provided:
|
|
1921
|
+
* 1. Checks InsertRestrictions on the given EntitySet
|
|
1922
|
+
*
|
|
1923
|
+
* For Path-based (dynamic) Insertable values, always returns true (shows creationMode).
|
|
1924
|
+
*
|
|
1925
|
+
* @param entitySet - The source entity set (where navigation starts from, or the entity set being checked)
|
|
1926
|
+
* @param navigationPath - Optional navigation property path (e.g., "_Booking", "to_Items")
|
|
1927
|
+
* @returns A boolean indicating whether insertion is allowed. Returns true if the insertability is Path-based (dynamic) or undefined.
|
|
1928
|
+
*/
|
|
1929
|
+
function getInsertableForEntitySet(entitySet, navigationPath) {
|
|
1930
|
+
// Check NavigationRestrictions if navigation path provided
|
|
1931
|
+
// Default: allow if not specified (Path-based values are also treated as true)
|
|
1932
|
+
let navigationInsertable = true;
|
|
1933
|
+
if (navigationPath) {
|
|
1934
|
+
const navRestrictions = entitySet?.annotations?.Capabilities?.NavigationRestrictions;
|
|
1935
|
+
if (navRestrictions?.RestrictedProperties) {
|
|
1936
|
+
const restriction = navRestrictions.RestrictedProperties.find((prop) => prop.NavigationProperty?.value === navigationPath);
|
|
1937
|
+
if (restriction?.InsertRestrictions?.Insertable !== undefined) {
|
|
1938
|
+
const navInsertable = restriction.InsertRestrictions.Insertable;
|
|
1939
|
+
if (typeof navInsertable === 'boolean') {
|
|
1940
|
+
navigationInsertable = navInsertable;
|
|
1941
|
+
}
|
|
1942
|
+
}
|
|
1943
|
+
}
|
|
1944
|
+
// Resolve target EntitySet via navigationPropertyBinding
|
|
1945
|
+
const targetEntitySet = entitySet?.navigationPropertyBinding?.[navigationPath];
|
|
1946
|
+
if (targetEntitySet && '_type' in targetEntitySet && targetEntitySet._type === 'EntitySet') {
|
|
1947
|
+
// Default: allow if not specified (Path-based values are also treated as true)
|
|
1948
|
+
let targetEntitySetInsertable = true;
|
|
1949
|
+
const targetRestriction = targetEntitySet.annotations?.Capabilities?.InsertRestrictions?.Insertable;
|
|
1950
|
+
if (typeof targetRestriction === 'boolean') {
|
|
1951
|
+
targetEntitySetInsertable = targetRestriction;
|
|
1952
|
+
}
|
|
1953
|
+
// Both Navigation and Target EntitySet must allow insertion
|
|
1954
|
+
return navigationInsertable && targetEntitySetInsertable;
|
|
1955
|
+
}
|
|
1956
|
+
// If no targetEntitySet found, only check navigation restrictions
|
|
1957
|
+
return navigationInsertable;
|
|
1958
|
+
}
|
|
1959
|
+
// No navigation path: check EntitySet-level InsertRestrictions
|
|
1960
|
+
// Default: allow if not specified (Path-based values are also treated as true)
|
|
1961
|
+
let entitySetInsertable = true;
|
|
1962
|
+
const entitySetRestriction = entitySet?.annotations?.Capabilities?.InsertRestrictions?.Insertable;
|
|
1963
|
+
if (typeof entitySetRestriction === 'boolean') {
|
|
1964
|
+
entitySetInsertable = entitySetRestriction;
|
|
1965
|
+
}
|
|
1966
|
+
return entitySetInsertable;
|
|
1967
|
+
}
|
|
1715
1968
|
/**
|
|
1716
1969
|
* Returns the manifest path for a given page based on the provided path parameters.
|
|
1717
1970
|
*
|