@sap/ux-specification 1.144.1 → 1.144.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/documentation/v2/v2-AnalyticalListPage.html +2 -2
  3. package/dist/documentation/v2/v2-ApplicationV2.html +2 -2
  4. package/dist/documentation/v2/v2-ListReport.html +2 -2
  5. package/dist/documentation/v2/v2-ListReportNew.html +2 -2
  6. package/dist/documentation/v2/v2-ObjectPage.html +2 -2
  7. package/dist/documentation/v2/v2-OverviewPage.html +2 -2
  8. package/dist/documentation/v4/v4-ApplicationV4.html +2 -2
  9. package/dist/documentation/v4/v4-BuildingBlocks.html +2 -2
  10. package/dist/documentation/v4/v4-FreestylePage.html +2 -2
  11. package/dist/documentation/v4/v4-ListReport.html +2 -2
  12. package/dist/documentation/v4/v4-ObjectPage.html +2 -2
  13. package/dist/index-min.js +316 -311
  14. package/dist/index-min.js.map +4 -4
  15. package/dist/schemas/v2/ListReportNewConfig.json +208 -7
  16. package/dist/schemas/v2/OverviewPageConfig.json +18 -9
  17. package/dist/schemas/v4/ApplicationV4.json +20 -0
  18. package/dist/schemas/v4/BuildingBlocksConfig.json +597 -166
  19. package/dist/schemas/v4/ListReportConfig.json +74 -15
  20. package/dist/schemas/v4/ObjectPageConfig.json +117 -732
  21. package/dist/specification/package.json +8 -8
  22. package/dist/specification/scripts/generate-validity-report.js +1 -1
  23. package/dist/specification/scripts/generate-validity-report.js.map +1 -1
  24. package/dist/specification/scripts/macros/corrections.d.ts.map +1 -1
  25. package/dist/specification/scripts/macros/corrections.js +15 -0
  26. package/dist/specification/scripts/macros/corrections.js.map +1 -1
  27. package/dist/specification/scripts/macros/schema.d.ts.map +1 -1
  28. package/dist/specification/scripts/macros/schema.js +23 -10
  29. package/dist/specification/scripts/macros/schema.js.map +1 -1
  30. package/dist/specification/scripts/schema/to-json-schema.js +1 -1
  31. package/dist/specification/scripts/schema/to-json-schema.js.map +1 -1
  32. package/dist/specification/src/api.d.ts.map +1 -1
  33. package/dist/specification/src/api.js +39 -3
  34. package/dist/specification/src/api.js.map +1 -1
  35. package/dist/specification/src/ftfs/ftfs.d.ts +8 -0
  36. package/dist/specification/src/ftfs/ftfs.d.ts.map +1 -1
  37. package/dist/specification/src/ftfs/ftfs.js +1 -0
  38. package/dist/specification/src/ftfs/ftfs.js.map +1 -1
  39. package/dist/specification/src/ftfs/index.d.ts +1 -1
  40. package/dist/specification/src/ftfs/index.d.ts.map +1 -1
  41. package/dist/specification/src/ftfs/index.js +2 -1
  42. package/dist/specification/src/ftfs/index.js.map +1 -1
  43. package/dist/specification/src/ftfs/parser/model/TreeModel.d.ts.map +1 -1
  44. package/dist/specification/src/ftfs/parser/model/TreeModel.js +3 -1
  45. package/dist/specification/src/ftfs/parser/model/TreeModel.js.map +1 -1
  46. package/dist/specification/src/sync/common/decoration/Decorator.d.ts +91 -0
  47. package/dist/specification/src/sync/common/decoration/Decorator.d.ts.map +1 -0
  48. package/dist/specification/src/sync/common/decoration/Decorator.js +139 -0
  49. package/dist/specification/src/sync/common/decoration/Decorator.js.map +1 -0
  50. package/dist/specification/src/sync/common/decoration/condition-evaluator.d.ts +95 -0
  51. package/dist/specification/src/sync/common/decoration/condition-evaluator.d.ts.map +1 -0
  52. package/dist/specification/src/sync/common/decoration/condition-evaluator.js +210 -0
  53. package/dist/specification/src/sync/common/decoration/condition-evaluator.js.map +1 -0
  54. package/dist/specification/src/sync/common/decoration/decorator-paths.d.ts +71 -22
  55. package/dist/specification/src/sync/common/decoration/decorator-paths.d.ts.map +1 -1
  56. package/dist/specification/src/sync/common/decoration/decorator-paths.js +23 -1
  57. package/dist/specification/src/sync/common/decoration/decorator-paths.js.map +1 -1
  58. package/dist/specification/src/sync/common/decoration/decorators.d.ts +0 -8
  59. package/dist/specification/src/sync/common/decoration/decorators.d.ts.map +1 -1
  60. package/dist/specification/src/sync/common/decoration/decorators.js +0 -15
  61. package/dist/specification/src/sync/common/decoration/decorators.js.map +1 -1
  62. package/dist/specification/src/sync/common/decoration/index.d.ts +4 -0
  63. package/dist/specification/src/sync/common/decoration/index.d.ts.map +1 -1
  64. package/dist/specification/src/sync/common/decoration/index.js +4 -0
  65. package/dist/specification/src/sync/common/decoration/index.js.map +1 -1
  66. package/dist/specification/src/sync/common/decoration/interfaces.d.ts +38 -0
  67. package/dist/specification/src/sync/common/decoration/interfaces.d.ts.map +1 -0
  68. package/dist/specification/src/sync/common/decoration/interfaces.js +3 -0
  69. package/dist/specification/src/sync/common/decoration/interfaces.js.map +1 -0
  70. package/dist/specification/src/sync/common/decoration/steps/Enums.d.ts +18 -0
  71. package/dist/specification/src/sync/common/decoration/steps/Enums.d.ts.map +1 -0
  72. package/dist/specification/src/sync/common/decoration/steps/Enums.js +50 -0
  73. package/dist/specification/src/sync/common/decoration/steps/Enums.js.map +1 -0
  74. package/dist/specification/src/sync/common/decoration/steps/Hide.d.ts +18 -0
  75. package/dist/specification/src/sync/common/decoration/steps/Hide.d.ts.map +1 -0
  76. package/dist/specification/src/sync/common/decoration/steps/Hide.js +46 -0
  77. package/dist/specification/src/sync/common/decoration/steps/Hide.js.map +1 -0
  78. package/dist/specification/src/sync/common/decoration/steps/Message.d.ts +26 -0
  79. package/dist/specification/src/sync/common/decoration/steps/Message.d.ts.map +1 -0
  80. package/dist/specification/src/sync/common/decoration/steps/Message.js +77 -0
  81. package/dist/specification/src/sync/common/decoration/steps/Message.js.map +1 -0
  82. package/dist/specification/src/sync/common/decoration/steps/Readonly.d.ts +18 -0
  83. package/dist/specification/src/sync/common/decoration/steps/Readonly.d.ts.map +1 -0
  84. package/dist/specification/src/sync/common/decoration/steps/Readonly.js +43 -0
  85. package/dist/specification/src/sync/common/decoration/steps/Readonly.js.map +1 -0
  86. package/dist/specification/src/sync/common/decoration/steps/Validity.d.ts +18 -0
  87. package/dist/specification/src/sync/common/decoration/steps/Validity.d.ts.map +1 -0
  88. package/dist/specification/src/sync/common/decoration/steps/Validity.js +68 -0
  89. package/dist/specification/src/sync/common/decoration/steps/Validity.js.map +1 -0
  90. package/dist/specification/src/sync/common/decoration/steps/enum-utils.d.ts +19 -0
  91. package/dist/specification/src/sync/common/decoration/steps/enum-utils.d.ts.map +1 -0
  92. package/dist/specification/src/sync/common/decoration/steps/enum-utils.js +48 -0
  93. package/dist/specification/src/sync/common/decoration/steps/enum-utils.js.map +1 -0
  94. package/dist/specification/src/sync/common/decoration/steps/index.d.ts +6 -0
  95. package/dist/specification/src/sync/common/decoration/steps/index.d.ts.map +1 -0
  96. package/dist/specification/src/sync/common/decoration/steps/index.js +14 -0
  97. package/dist/specification/src/sync/common/decoration/steps/index.js.map +1 -0
  98. package/dist/specification/src/sync/common/i18n.json +29 -1
  99. package/dist/specification/src/sync/common/importProject.d.ts.map +1 -1
  100. package/dist/specification/src/sync/common/importProject.js +2 -0
  101. package/dist/specification/src/sync/common/importProject.js.map +1 -1
  102. package/dist/specification/src/sync/common/rules.d.ts +1 -1
  103. package/dist/specification/src/sync/common/rules.js +1 -1
  104. package/dist/specification/src/sync/v2/export/controls/Fragment.d.ts +4 -5
  105. package/dist/specification/src/sync/v2/export/controls/Fragment.d.ts.map +1 -1
  106. package/dist/specification/src/sync/v2/export/controls/Fragment.js +47 -26
  107. package/dist/specification/src/sync/v2/export/controls/Fragment.js.map +1 -1
  108. package/dist/specification/src/sync/v2/export/export.d.ts.map +1 -1
  109. package/dist/specification/src/sync/v2/export/export.js +3 -2
  110. package/dist/specification/src/sync/v2/export/export.js.map +1 -1
  111. package/dist/specification/src/sync/v2/export/exportPage.d.ts.map +1 -1
  112. package/dist/specification/src/sync/v2/export/exportPage.js +48 -19
  113. package/dist/specification/src/sync/v2/export/exportPage.js.map +1 -1
  114. package/dist/specification/src/sync/v2/export/exportPageGeneric.d.ts +2 -0
  115. package/dist/specification/src/sync/v2/export/exportPageGeneric.d.ts.map +1 -1
  116. package/dist/specification/src/sync/v2/export/exportPageGeneric.js +17 -6
  117. package/dist/specification/src/sync/v2/export/exportPageGeneric.js.map +1 -1
  118. package/dist/specification/src/sync/v2/export/view-controller-generator.d.ts +54 -6
  119. package/dist/specification/src/sync/v2/export/view-controller-generator.d.ts.map +1 -1
  120. package/dist/specification/src/sync/v2/export/view-controller-generator.js +106 -12
  121. package/dist/specification/src/sync/v2/export/view-controller-generator.js.map +1 -1
  122. package/dist/specification/src/sync/v2/generate/schemaAdaptation.d.ts +2 -0
  123. package/dist/specification/src/sync/v2/generate/schemaAdaptation.d.ts.map +1 -1
  124. package/dist/specification/src/sync/v2/generate/schemaAdaptation.js +3 -2
  125. package/dist/specification/src/sync/v2/generate/schemaAdaptation.js.map +1 -1
  126. package/dist/specification/src/sync/v2/generate/utils.d.ts +16 -1
  127. package/dist/specification/src/sync/v2/generate/utils.d.ts.map +1 -1
  128. package/dist/specification/src/sync/v2/generate/utils.js +33 -22
  129. package/dist/specification/src/sync/v2/generate/utils.js.map +1 -1
  130. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/FilterBar.js +4 -4
  131. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.d.ts +12 -0
  132. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.d.ts.map +1 -0
  133. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.js +167 -0
  134. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiEdit.js.map +1 -0
  135. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiTable.js +3 -3
  136. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/MultiTable.js.map +1 -1
  137. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.d.ts +60 -2
  138. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.d.ts.map +1 -1
  139. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.js +626 -11
  140. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/Table.js.map +1 -1
  141. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.d.ts +1 -0
  142. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.d.ts.map +1 -1
  143. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.js +1 -0
  144. package/dist/specification/src/sync/v2/genericSchemaHandling/controls/index.js.map +1 -1
  145. package/dist/specification/src/sync/v2/genericSchemaHandling/pages/pageAccess.d.ts.map +1 -1
  146. package/dist/specification/src/sync/v2/genericSchemaHandling/pages/pageAccess.js +30 -6
  147. package/dist/specification/src/sync/v2/genericSchemaHandling/pages/pageAccess.js.map +1 -1
  148. package/dist/specification/src/sync/v2/types.d.ts +2 -0
  149. package/dist/specification/src/sync/v2/types.d.ts.map +1 -1
  150. package/dist/specification/src/sync/v2/types.js.map +1 -1
  151. package/dist/specification/src/sync/v2/utils.d.ts +25 -0
  152. package/dist/specification/src/sync/v2/utils.d.ts.map +1 -1
  153. package/dist/specification/src/sync/v2/utils.js +28 -4
  154. package/dist/specification/src/sync/v2/utils.js.map +1 -1
  155. package/dist/specification/src/sync/v4/application.d.ts +2 -0
  156. package/dist/specification/src/sync/v4/application.d.ts.map +1 -1
  157. package/dist/specification/src/sync/v4/application.js +20 -0
  158. package/dist/specification/src/sync/v4/application.js.map +1 -1
  159. package/dist/specification/src/sync/v4/export/controls/FilterBar.d.ts +1 -2
  160. package/dist/specification/src/sync/v4/export/controls/FilterBar.d.ts.map +1 -1
  161. package/dist/specification/src/sync/v4/export/controls/FilterBar.js +1 -2
  162. package/dist/specification/src/sync/v4/export/controls/FilterBar.js.map +1 -1
  163. package/dist/specification/src/sync/v4/export/controls/Header.d.ts +3 -5
  164. package/dist/specification/src/sync/v4/export/controls/Header.d.ts.map +1 -1
  165. package/dist/specification/src/sync/v4/export/controls/Header.js +2 -7
  166. package/dist/specification/src/sync/v4/export/controls/Header.js.map +1 -1
  167. package/dist/specification/src/sync/v4/export/controls/HeaderAction.d.ts +9 -3
  168. package/dist/specification/src/sync/v4/export/controls/HeaderAction.d.ts.map +1 -1
  169. package/dist/specification/src/sync/v4/export/controls/HeaderAction.js +10 -6
  170. package/dist/specification/src/sync/v4/export/controls/HeaderAction.js.map +1 -1
  171. package/dist/specification/src/sync/v4/export/controls/InlineEdit.d.ts +38 -0
  172. package/dist/specification/src/sync/v4/export/controls/InlineEdit.d.ts.map +1 -0
  173. package/dist/specification/src/sync/v4/export/controls/InlineEdit.js +86 -0
  174. package/dist/specification/src/sync/v4/export/controls/InlineEdit.js.map +1 -0
  175. package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.d.ts +1 -2
  176. package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.d.ts.map +1 -1
  177. package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.js +1 -2
  178. package/dist/specification/src/sync/v4/export/controls/ObjectPageCustomSection.js.map +1 -1
  179. package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.d.ts +11 -51
  180. package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.d.ts.map +1 -1
  181. package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.js +95 -246
  182. package/dist/specification/src/sync/v4/export/controls/ObjectPageTable.js.map +1 -1
  183. package/dist/specification/src/sync/v4/export/controls/Table.d.ts +6 -27
  184. package/dist/specification/src/sync/v4/export/controls/Table.d.ts.map +1 -1
  185. package/dist/specification/src/sync/v4/export/controls/Table.js +14 -49
  186. package/dist/specification/src/sync/v4/export/controls/Table.js.map +1 -1
  187. package/dist/specification/src/sync/v4/export/controls/ToolBarAction.d.ts +1 -2
  188. package/dist/specification/src/sync/v4/export/controls/ToolBarAction.d.ts.map +1 -1
  189. package/dist/specification/src/sync/v4/export/controls/ToolBarAction.js +1 -2
  190. package/dist/specification/src/sync/v4/export/controls/ToolBarAction.js.map +1 -1
  191. package/dist/specification/src/sync/v4/export/controls/index.d.ts +1 -0
  192. package/dist/specification/src/sync/v4/export/controls/index.d.ts.map +1 -1
  193. package/dist/specification/src/sync/v4/export/controls/index.js +1 -0
  194. package/dist/specification/src/sync/v4/export/controls/index.js.map +1 -1
  195. package/dist/specification/src/sync/v4/export/factory.d.ts.map +1 -1
  196. package/dist/specification/src/sync/v4/export/factory.js +2 -4
  197. package/dist/specification/src/sync/v4/export/factory.js.map +1 -1
  198. package/dist/specification/src/sync/v4/export/fpmCustomPage.d.ts +1 -0
  199. package/dist/specification/src/sync/v4/export/fpmCustomPage.d.ts.map +1 -1
  200. package/dist/specification/src/sync/v4/export/fpmCustomPage.js +216 -46
  201. package/dist/specification/src/sync/v4/export/fpmCustomPage.js.map +1 -1
  202. package/dist/specification/src/sync/v4/export/pages/ListReport.d.ts +15 -2
  203. package/dist/specification/src/sync/v4/export/pages/ListReport.d.ts.map +1 -1
  204. package/dist/specification/src/sync/v4/export/pages/ListReport.js +33 -1
  205. package/dist/specification/src/sync/v4/export/pages/ListReport.js.map +1 -1
  206. package/dist/specification/src/sync/v4/generate/actions.js +4 -4
  207. package/dist/specification/src/sync/v4/generate/actions.js.map +1 -1
  208. package/dist/specification/src/sync/v4/generate/app.d.ts +11 -0
  209. package/dist/specification/src/sync/v4/generate/app.d.ts.map +1 -0
  210. package/dist/specification/src/sync/v4/generate/app.js +31 -0
  211. package/dist/specification/src/sync/v4/generate/app.js.map +1 -0
  212. package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.d.ts +13 -0
  213. package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.d.ts.map +1 -1
  214. package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.js +74 -2
  215. package/dist/specification/src/sync/v4/generate/fpm-custom-page/annotations.js.map +1 -1
  216. package/dist/specification/src/sync/v4/generate/fpm-custom-page/extensions.d.ts.map +1 -1
  217. package/dist/specification/src/sync/v4/generate/fpm-custom-page/extensions.js +4 -3
  218. package/dist/specification/src/sync/v4/generate/fpm-custom-page/extensions.js.map +1 -1
  219. package/dist/specification/src/sync/v4/generate/fpm-custom-page/generator.d.ts.map +1 -1
  220. package/dist/specification/src/sync/v4/generate/fpm-custom-page/generator.js +29 -27
  221. package/dist/specification/src/sync/v4/generate/fpm-custom-page/generator.js.map +1 -1
  222. package/dist/specification/src/sync/v4/generate/fpm-custom-page/utils.d.ts.map +1 -1
  223. package/dist/specification/src/sync/v4/generate/fpm-custom-page/utils.js +12 -3
  224. package/dist/specification/src/sync/v4/generate/fpm-custom-page/utils.js.map +1 -1
  225. package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.d.ts +32 -13
  226. package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.d.ts.map +1 -1
  227. package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.js +106 -79
  228. package/dist/specification/src/sync/v4/generate/list-report/ListReportUtils.js.map +1 -1
  229. package/dist/specification/src/sync/v4/generate/list-report/listReport.d.ts +16 -10
  230. package/dist/specification/src/sync/v4/generate/list-report/listReport.d.ts.map +1 -1
  231. package/dist/specification/src/sync/v4/generate/list-report/listReport.js +64 -32
  232. package/dist/specification/src/sync/v4/generate/list-report/listReport.js.map +1 -1
  233. package/dist/specification/src/sync/v4/generate/objectPage.d.ts +1 -2
  234. package/dist/specification/src/sync/v4/generate/objectPage.d.ts.map +1 -1
  235. package/dist/specification/src/sync/v4/generate/objectPage.js +136 -95
  236. package/dist/specification/src/sync/v4/generate/objectPage.js.map +1 -1
  237. package/dist/specification/src/sync/v4/generate/utils/inlineEdit.d.ts +18 -0
  238. package/dist/specification/src/sync/v4/generate/utils/inlineEdit.d.ts.map +1 -0
  239. package/dist/specification/src/sync/v4/generate/utils/inlineEdit.js +91 -0
  240. package/dist/specification/src/sync/v4/generate/utils/inlineEdit.js.map +1 -0
  241. package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.d.ts +156 -0
  242. package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.d.ts.map +1 -0
  243. package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.js +192 -0
  244. package/dist/specification/src/sync/v4/generate/utils/propertiesForEdit.js.map +1 -0
  245. package/dist/specification/src/sync/v4/import/pages/fpmCustomPage.d.ts.map +1 -1
  246. package/dist/specification/src/sync/v4/import/pages/fpmCustomPage.js +20 -0
  247. package/dist/specification/src/sync/v4/import/pages/fpmCustomPage.js.map +1 -1
  248. package/dist/specification/src/sync/v4/import/pages/listReport.d.ts.map +1 -1
  249. package/dist/specification/src/sync/v4/import/pages/listReport.js.map +1 -1
  250. package/dist/specification/src/sync/v4/import/pages/objectPage.d.ts.map +1 -1
  251. package/dist/specification/src/sync/v4/import/pages/objectPage.js +11 -50
  252. package/dist/specification/src/sync/v4/import/pages/objectPage.js.map +1 -1
  253. package/dist/specification/src/sync/v4/sync-rules/App.d.ts +2 -4
  254. package/dist/specification/src/sync/v4/sync-rules/App.d.ts.map +1 -1
  255. package/dist/specification/src/sync/v4/sync-rules/App.js +5 -1
  256. package/dist/specification/src/sync/v4/sync-rules/App.js.map +1 -1
  257. package/dist/specification/src/sync/v4/sync-rules/AppSchema.d.ts +2 -1
  258. package/dist/specification/src/sync/v4/sync-rules/AppSchema.d.ts.map +1 -1
  259. package/dist/specification/src/sync/v4/sync-rules/AppSchema.js +3 -1
  260. package/dist/specification/src/sync/v4/sync-rules/AppSchema.js.map +1 -1
  261. package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.d.ts +1 -294
  262. package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.d.ts.map +1 -1
  263. package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.js +0 -753
  264. package/dist/specification/src/sync/v4/sync-rules/DecoratorClass.js.map +1 -1
  265. package/dist/specification/src/sync/v4/sync-rules/Page.d.ts +2 -4
  266. package/dist/specification/src/sync/v4/sync-rules/Page.d.ts.map +1 -1
  267. package/dist/specification/src/sync/v4/sync-rules/Page.js.map +1 -1
  268. package/dist/specification/src/sync/v4/utils/StableIdHelper.d.ts.map +1 -1
  269. package/dist/specification/src/sync/v4/utils/StableIdHelper.js +10 -4
  270. package/dist/specification/src/sync/v4/utils/StableIdHelper.js.map +1 -1
  271. package/dist/specification/src/sync/v4/utils/macros.d.ts +19 -0
  272. package/dist/specification/src/sync/v4/utils/macros.d.ts.map +1 -1
  273. package/dist/specification/src/sync/v4/utils/macros.js +34 -0
  274. package/dist/specification/src/sync/v4/utils/macros.js.map +1 -1
  275. package/dist/specification/src/sync/v4/utils/utils.d.ts +31 -3
  276. package/dist/specification/src/sync/v4/utils/utils.d.ts.map +1 -1
  277. package/dist/specification/src/sync/v4/utils/utils.js +310 -58
  278. package/dist/specification/src/sync/v4/utils/utils.js.map +1 -1
  279. package/dist/specification/test/test-utils/utils.d.ts +1 -0
  280. package/dist/specification/test/test-utils/utils.d.ts.map +1 -1
  281. package/dist/specification/test/test-utils/utils.js +11 -0
  282. package/dist/specification/test/test-utils/utils.js.map +1 -1
  283. package/dist/specification/test/unit/decorators/validity-test-utils.d.ts +2 -2
  284. package/dist/specification/test/unit/decorators/validity-test-utils.d.ts.map +1 -1
  285. package/dist/specification/test/unit/decorators/validity-test-utils.js +6 -6
  286. package/dist/specification/test/unit/decorators/validity-test-utils.js.map +1 -1
  287. package/dist/templates/AnalyticalTableColumnsExtension.xml +3 -3
  288. package/dist/templates/GridTableColumnsExtension.xml +3 -3
  289. package/dist/templates/ResponsiveTableColumnsExtension.xml +2 -2
  290. package/dist/templates/TreeTableColumnsExtension.xml +4 -4
  291. package/dist/templates/fragment.xml +3 -3
  292. package/dist/templates/view.xml +3 -3
  293. package/dist/types/src/apiTypes.d.ts +44 -6
  294. package/dist/types/src/apiTypes.d.ts.map +1 -1
  295. package/dist/types/src/apiTypes.js +1 -0
  296. package/dist/types/src/apiTypes.js.map +1 -1
  297. package/dist/types/src/common/types.d.ts +13 -6
  298. package/dist/types/src/common/types.d.ts.map +1 -1
  299. package/dist/types/src/common/types.js +14 -7
  300. package/dist/types/src/common/types.js.map +1 -1
  301. package/dist/types/src/v4/application.d.ts +21 -0
  302. package/dist/types/src/v4/application.d.ts.map +1 -1
  303. package/dist/types/src/v4/application.js +10 -0
  304. package/dist/types/src/v4/application.js.map +1 -1
  305. package/dist/types/src/v4/controls/InlineEdit.d.ts +30 -0
  306. package/dist/types/src/v4/controls/InlineEdit.d.ts.map +1 -0
  307. package/dist/types/src/v4/controls/InlineEdit.js +3 -0
  308. package/dist/types/src/v4/controls/InlineEdit.js.map +1 -0
  309. package/dist/types/src/v4/controls/ObjectPageTable.d.ts +86 -252
  310. package/dist/types/src/v4/controls/ObjectPageTable.d.ts.map +1 -1
  311. package/dist/types/src/v4/controls/ObjectPageTable.js.map +1 -1
  312. package/dist/types/src/v4/controls/Table.d.ts +4 -4
  313. package/dist/types/src/v4/controls/index.d.ts +1 -0
  314. package/dist/types/src/v4/controls/index.d.ts.map +1 -1
  315. package/dist/types/src/v4/controls/index.js +1 -0
  316. package/dist/types/src/v4/controls/index.js.map +1 -1
  317. package/dist/types/src/v4/pages/ListReportConfigV4.d.ts +5 -1
  318. package/dist/types/src/v4/pages/ListReportConfigV4.d.ts.map +1 -1
  319. 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=false] - Flag indicating whether to force adding extensions even if proper anchor/placement is not found.
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=TemplatePropertyName.Template] -
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
- * @param {boolean} [ignoreAnnotationAnchors=false] - A flag to indicate whether extension anchors should be ignored.
535
+ * @param {boolean} [ignoreAnnotationAnchors] - 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
- // Skip regular entries(columns, actions, etc.)
443
- delete localExtensions[extensionId];
444
- continue;
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
- * Returns column names for enum.
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 lineItems - current lineItems definition, with all records.
470
- * @returns Column names.
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 key of Object.keys(lineItems)) {
475
- if (key.indexOf(exports.FIELD_SEPARATOR) > -1) {
476
- columnEnum.push(key.substring(key.indexOf(exports.FIELD_SEPARATOR) + 2));
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;
@@ -664,14 +812,28 @@ function addActionRecordToSchema(lineItemDefinitionParams, createRef = true, isI
664
812
  //no footer bar -> toolbar action
665
813
  const actionDefinitionName = determineActionDefinitionName(data, lineItemRecord, isInnerAction);
666
814
  const description = (0, common_1.getDataFieldDescription)(lineItemRecord, data.entityType);
667
- const prefix = lineItemRecord.$Type.split(`${ux_specification_types_1.UIVOCABULARY}.`)[1];
815
+ // Generate stable ID using strategy pattern to ensure correct key format for all action types.
816
+ // This is crucial for IBN actions, which need the full key including SemanticObject and RequiresContext
817
+ // (e.g., "DataFieldForIntentBasedNavigation::v4Freestyle::Inbound::RequiresContext")
818
+ // to be properly matched when referenced in manifest-based action menus.
819
+ const strategy = DataFieldStrategy_1.dataFieldStrategyContext.getStrategy(lineItemRecord.$Type);
820
+ const stableId = strategy.generateStableId(lineItemRecord);
821
+ // Extract Action property for keys generation (used by addTargetAndKeysOfAction).
822
+ // For IBN actions, this is just the action name (e.g., "Inbound").
823
+ // For bound actions, this may include namespace (e.g., "com.sap.Action/MyAction").
668
824
  const actionId = typeof lineItemRecord.Action === 'string' ? lineItemRecord.Action : lineItemRecord.Action['path'];
669
- const propertyKey = (0, StableIdHelper_1.replaceSpecialChars)(actionId);
670
- const actionDefinition = (actionsDefinition.properties[`${prefix}::${propertyKey}`] = {
825
+ // Remove type prefix from stable ID for use in $ref generation.
826
+ // This ensures getUniqueFacetDefinitionLink can properly detect duplicates based on full action identity,
827
+ // not just the Action property. For example, two IBN actions with different SemanticObjects but same Action
828
+ // should be treated as different actions, not duplicates.
829
+ const stableIdWithoutPrefix = stableId.split('::').slice(1).join('::');
830
+ // Create action definition with full stable ID as property key.
831
+ // This allows manifest-based menus to correctly reference actions by their complete identity.
832
+ const actionDefinition = (actionsDefinition.properties[stableId] = {
671
833
  description
672
834
  });
673
835
  if (createRef) {
674
- actionDefinition.$ref = (0, common_1.getUniqueFacetDefinitionLink)(actionDefinitionName, (0, common_1.prepareRef)(propertyKey), data.appSchema, lineItemPath);
836
+ actionDefinition.$ref = (0, common_1.getUniqueFacetDefinitionLink)(actionDefinitionName, (0, common_1.prepareRef)(stableIdWithoutPrefix), data.appSchema, lineItemPath);
675
837
  }
676
838
  else {
677
839
  actionDefinition.properties = {};
@@ -906,15 +1068,34 @@ function addEnumForActionAnchor(appSchema, definitionId, positionName = ux_speci
906
1068
  * @param {EntityType} [entityType] - Optional entity type for additional context when retrieving column definitions.
907
1069
  */
908
1070
  function addEnumForEnableMassEdit(appSchema, tableDefinitionName, columnsDefinitionName, entityType) {
1071
+ if (!entityType) {
1072
+ return;
1073
+ }
909
1074
  const FIELD_PROPERTIES = ['visibleFields', 'ignoredFields'];
910
- const columnsDefinitions = getNonNavigationColumnDefinitions(appSchema, columnsDefinitionName, entityType);
911
- const columnEnums = getColumnsEnum(columnsDefinitions);
912
- const enableMassEditDefinition = appSchema.definitions[tableDefinitionName].properties['enableMassEdit'];
913
- const enableMassEditFields = enableMassEditDefinition.anyOf.find((definition) => definition.type === 'object');
1075
+ const columnsDefinitions = appSchema.definitions?.[columnsDefinitionName];
1076
+ // Ignore check for hidden properties
1077
+ const filterOptions = {
1078
+ hidden: null
1079
+ };
1080
+ const fieldGroupsList = (0, propertiesForEdit_1.buildFieldGroupsList)(columnsDefinitions, entityType, filterOptions, 'single');
1081
+ const singleFieldList = (0, propertiesForEdit_1.buildSingleFieldList)(columnsDefinitions, entityType, filterOptions);
1082
+ const enableMassEditDefinition = (appSchema.definitions?.[tableDefinitionName]).properties?.['enableMassEdit'];
1083
+ const enableMassEditFields = enableMassEditDefinition.anyOf?.find((definition) => typeof definition === 'object' && definition && definition.type === 'object');
914
1084
  for (const propertyKey in enableMassEditFields.properties) {
915
1085
  if (FIELD_PROPERTIES.includes(propertyKey)) {
916
1086
  const property = enableMassEditFields.properties[propertyKey];
917
- property.items['enum'] = columnEnums;
1087
+ property.items = {
1088
+ type: 'string',
1089
+ // Indicate that items are tree structure
1090
+ uiType: 'tree',
1091
+ // Selection restricted within single group
1092
+ restrictGroups: true,
1093
+ // Only value from single group is allowed
1094
+ exclusiveGroups: ['FieldGroup'],
1095
+ // Allow annotation FieldGroup creation
1096
+ creation: 'FieldGroup',
1097
+ oneOf: [...fieldGroupsList, ...singleFieldList]
1098
+ };
918
1099
  property.uniqueItems = true;
919
1100
  }
920
1101
  }
@@ -955,14 +1136,25 @@ function getNonNavigationColumnDefinitions(appSchema, lineItemId, entityType) {
955
1136
  * @returns {string} The name of the newly created specific schema definition for the creation mode.
956
1137
  */
957
1138
  function initializeCreationModeSchema(appSchema, lineItemId, entityType, definitionName) {
1139
+ const definitions = appSchema.definitions;
958
1140
  const columnDefinitions = getNonNavigationColumnDefinitions(appSchema, lineItemId, entityType);
959
- const columnOneOfEnums = getCreationFieldOptions(columnDefinitions);
960
- const fieldGroups = getFieldGroupsFromEntityType(entityType);
1141
+ const fieldGroupsList = entityType
1142
+ ? (0, propertiesForEdit_1.buildFieldGroupsList)(columnDefinitions, entityType, undefined, 'single', false)
1143
+ : [];
1144
+ const singleFieldList = entityType ? (0, propertiesForEdit_1.buildSingleFieldList)(columnDefinitions, entityType) : [];
961
1145
  const specificCreationModeDefinitionName = (0, common_1.getFacetDefinitionKey)(definitionName, lineItemId);
962
- const specificCreationModeDefinition = (appSchema.definitions[specificCreationModeDefinitionName] = structuredClone(appSchema.definitions[definitionName]));
963
- const creationFieldsDefinition = specificCreationModeDefinition.properties[ux_specification_types_1.PropertyName.creationFields];
1146
+ const specificCreationModeDefinition = (definitions[specificCreationModeDefinitionName] = structuredClone(definitions[definitionName]));
1147
+ const creationFieldsDefinition = specificCreationModeDefinition.properties?.[ux_specification_types_1.PropertyName.creationFields];
964
1148
  const creationFieldsDefinitionItems = creationFieldsDefinition.items;
965
- creationFieldsDefinitionItems['oneOf'] = [...columnOneOfEnums, ...fieldGroups];
1149
+ creationFieldsDefinitionItems['oneOf'] = [...fieldGroupsList, ...singleFieldList];
1150
+ // Indicate that items are tree structure
1151
+ creationFieldsDefinitionItems['uiType'] = 'tree';
1152
+ // Allow annotation FieldGroup creation
1153
+ creationFieldsDefinitionItems['creation'] = 'FieldGroup';
1154
+ // Selection restricted within single group
1155
+ creationFieldsDefinitionItems['restrictGroups'] = true;
1156
+ // Only value from single group is allowed
1157
+ creationFieldsDefinitionItems['exclusiveGroups'] = ['FieldGroup'];
966
1158
  // Entries of one of are translatable using 'service' i18n bundle
967
1159
  creationFieldsDefinitionItems.i18nBundle = 'service';
968
1160
  creationFieldsDefinition.uniqueItems = true;
@@ -979,20 +1171,12 @@ function initializeCreationModeSchema(appSchema, lineItemId, entityType, definit
979
1171
  */
980
1172
  function addOneOfForCreationFields(appSchema, entityType, definitionName, lineItemId) {
981
1173
  const creationModeDefinitionName = initializeCreationModeSchema(appSchema, lineItemId, entityType, definitionName);
982
- // replace the generic creationMode definition with the specific one for all table types
983
- objectPage_1.OBJECT_PAGE_TABLE_DEFINITION_TYPES.forEach((type) => {
984
- const creationModeAnyOf = appSchema.definitions[`${type}<${lineItemId}>`]?.properties?.creationMode?.anyOf;
985
- if (creationModeAnyOf) {
986
- const updatedCreationModeAnyOf = creationModeAnyOf.map((definition) => {
987
- const { $ref } = definition;
988
- // replace generic creation mode definition with specific one
989
- // I don't check that $ref contains the definition name, the replacement should not work for other definitions
990
- const updatedRef = $ref.replace(definitionName, creationModeDefinitionName);
991
- return { ...definition, $ref: updatedRef };
992
- });
993
- appSchema.definitions[`${type}<${lineItemId}>`].properties.creationMode.anyOf = updatedCreationModeAnyOf;
994
- }
995
- });
1174
+ // Replace the generic creationMode definition reference with the facet-specific one
1175
+ const tableDefinition = appSchema.definitions[`${ux_specification_types_1.DefinitionName.ObjectPageTable}<${lineItemId}>`];
1176
+ const creationModeProperty = tableDefinition?.properties?.creationMode;
1177
+ if (creationModeProperty?.$ref) {
1178
+ creationModeProperty.$ref = creationModeProperty.$ref.replace(definitionName, creationModeDefinitionName);
1179
+ }
996
1180
  }
997
1181
  /**
998
1182
  * Find the relevant V4 page under the routing targets of manifest,json.
@@ -1169,7 +1353,7 @@ function addHeaderFooterCustomActionDefinition(appSchema, v4Page, logger, custom
1169
1353
  function addActionsToArray(params) {
1170
1354
  const { extensions, initialActionDetailsList, customActionDefinitionName, logger } = params;
1171
1355
  // Add custom actions
1172
- let actionDetailsList = addExtensionToArray(extensions, initialActionDetailsList, customActionDefinitionName, [ux_specification_types_1.TemplatePropertyName.Press, ux_specification_types_1.TemplatePropertyName.Menu], logger);
1356
+ let actionDetailsList = addExtensionToArray(extensions, initialActionDetailsList, customActionDefinitionName, [ux_specification_types_1.TemplatePropertyName.Press, ux_specification_types_1.TemplatePropertyName.Menu], logger, false, params.appSchema);
1173
1357
  const processActionMenusParams = {
1174
1358
  ...params,
1175
1359
  initialActionDetailsList: actionDetailsList
@@ -1229,20 +1413,31 @@ function getMenuEntryDefinitionLink($ref, actionMenuDefinitionName, appSchema) {
1229
1413
  menuEntryDefinition[originalDefinitionKey] = originalDefinition[originalDefinitionKey];
1230
1414
  }
1231
1415
  }
1232
- // some properties doesn't make sense for menu entries
1233
- delete menuEntryDefinition.properties[ux_specification_types_1.PropertyName.position];
1234
- delete menuEntryDefinition.properties[ux_specification_types_1.PropertyName.overflowGroup];
1235
- delete menuEntryDefinition.properties[ux_specification_types_1.PropertyName.priority];
1416
+ // some properties doesn't make sense for menu entries - hide them instead of deleting
1417
+ // NOTE: This is a necessary trade-off. When moving IBN actions in and out of menus,
1418
+ // we keep these properties visible in the manifest but hidden in the UI.
1419
+ // Unfortunately, this is required - otherwise, when renaming actions, we end up with
1420
+ // orphaned entries in the manifest.
1421
+ if (menuEntryDefinition.properties[ux_specification_types_1.PropertyName.position]) {
1422
+ menuEntryDefinition.properties[ux_specification_types_1.PropertyName.position][ux_specification_types_1.SchemaTag.hidden] = true;
1423
+ }
1424
+ if (menuEntryDefinition.properties[ux_specification_types_1.PropertyName.overflowGroup]) {
1425
+ menuEntryDefinition.properties[ux_specification_types_1.PropertyName.overflowGroup][ux_specification_types_1.SchemaTag.hidden] = true;
1426
+ }
1427
+ if (menuEntryDefinition.properties[ux_specification_types_1.PropertyName.priority]) {
1428
+ menuEntryDefinition.properties[ux_specification_types_1.PropertyName.priority][ux_specification_types_1.SchemaTag.hidden] = true;
1429
+ }
1236
1430
  }
1237
1431
  return menuEntryDefinitionLink;
1238
1432
  }
1239
1433
  /**
1240
- * Determines the appropriate action menu definition name based on a custom action definition name.
1434
+ * Determines the appropriate action definition names based on a custom action definition name.
1435
+ * Returns menu definition names and the action name for menu entries.
1241
1436
  *
1242
1437
  * @param {string} customActionDefinitionName - The custom action definition name to be parsed and matched.
1243
- * @returns {ActionMenuDefinitionName} The corresponding action menu definition name, or a default value if not found.
1438
+ * @returns {ActionMenuDefinitionName} The corresponding action definition names, or a default value if not found.
1244
1439
  */
1245
- function determineActionMenuDefinitionName(customActionDefinitionName) {
1440
+ function determineActionDefinitionNames(customActionDefinitionName) {
1246
1441
  const { baseDefinitionName } = parseDefinitionName(customActionDefinitionName);
1247
1442
  return actionMenuDefinitionNameMap.get(baseDefinitionName) ?? LR_ACTION_MENU_DEFINITION;
1248
1443
  }
@@ -1268,7 +1463,7 @@ function parseDefinitionName(definitionName = '') {
1268
1463
  * Updates the custom menu's default action to include a list of valid options based on the provided menu schema.
1269
1464
  *
1270
1465
  * @param {Definition} customMenuDefinition - The definition object for the custom menu, where the default action will be updated.
1271
- * @param {Record<string, SchemaDefinition>} [menu={}] - A mapping of menu items to their schema definitions, used to generate valid options for the default action.
1466
+ * @param {Record<string, SchemaDefinition>} [menu] - A mapping of menu items to their schema definitions, used to generate valid options for the default action.
1272
1467
  */
1273
1468
  function setCustomMenuDefaultAction(customMenuDefinition, menu = {}) {
1274
1469
  if (customMenuDefinition.properties[ux_specification_types_1.PropertyName.defaultAction]) {
@@ -1308,7 +1503,7 @@ function processActionMenu(params, extension, actionDefinition, initialDetailsLi
1308
1503
  }
1309
1504
  const { customActionDefinitionName, appSchema, lineItemId } = params;
1310
1505
  const detailsList = [...initialDetailsList];
1311
- const { actionMenuDefinitionName, actionMenuActionsDefinitionName } = determineActionMenuDefinitionName(customActionDefinitionName);
1506
+ const { actionMenuDefinitionName, actionMenuActionsDefinitionName } = determineActionDefinitionNames(customActionDefinitionName);
1312
1507
  // Prepare submenu entries to be processed
1313
1508
  const menu = extension[ux_specification_types_1.TemplatePropertyName.Menu] ?? [];
1314
1509
  const properties = {};
@@ -1641,8 +1836,8 @@ function importManifestBasedActionMenuSettingsOfReference(importActionParams, de
1641
1836
  /**
1642
1837
  * Determines the strategy type for action settings based on the provided data type and action type.
1643
1838
  *
1644
- * @param {string} [dataType=''] - The data type associated with the action settings. Defaults to an empty string.
1645
- * @param {string} [actionType=''] - The action type within the context of the action settings. Defaults to an empty string.
1839
+ * @param {string} [dataType] - The data type associated with the action settings. Defaults to an empty string.
1840
+ * @param {string} [actionType] - The action type within the context of the action settings. Defaults to an empty string.
1646
1841
  * @returns {DataFieldStrategyTypes} The corresponding strategy type for the given data type and action type.
1647
1842
  */
1648
1843
  function determineActionStrategyType(dataType = '', actionType = '') {
@@ -1711,6 +1906,63 @@ function addCustomFieldDefinition(appSchema, v4Page, fieldGroupInManifest, logge
1711
1906
  function addManifestPathsToProperties(appSchema, definitionName, definition, pathParams, handleRelative = false) {
1712
1907
  (0, utils_1.addManifestPathsToProperties)([v4controls, pages], appSchema, definitionName, definition, pathParams, undefined, handleRelative);
1713
1908
  }
1909
+ /**
1910
+ * Determines whether an entity set or navigation target is insertable based on its annotations.
1911
+ *
1912
+ * When navigationPath is provided:
1913
+ * 1. Checks NavigationRestrictions.RestrictedProperties on the source EntitySet
1914
+ * 2. Resolves the target EntitySet via navigationPropertyBinding
1915
+ * 3. Checks InsertRestrictions on the target EntitySet
1916
+ * 4. Both must allow insertion for the function to return true
1917
+ *
1918
+ * When navigationPath is not provided:
1919
+ * 1. Checks InsertRestrictions on the given EntitySet
1920
+ *
1921
+ * For Path-based (dynamic) Insertable values, always returns true (shows creationMode).
1922
+ *
1923
+ * @param entitySet - The source entity set (where navigation starts from, or the entity set being checked)
1924
+ * @param navigationPath - Optional navigation property path (e.g., "_Booking", "to_Items")
1925
+ * @returns A boolean indicating whether insertion is allowed. Returns true if the insertability is Path-based (dynamic) or undefined.
1926
+ */
1927
+ function getInsertableForEntitySet(entitySet, navigationPath) {
1928
+ // Check NavigationRestrictions if navigation path provided
1929
+ // Default: allow if not specified (Path-based values are also treated as true)
1930
+ let navigationInsertable = true;
1931
+ if (navigationPath) {
1932
+ const navRestrictions = entitySet?.annotations?.Capabilities?.NavigationRestrictions;
1933
+ if (navRestrictions?.RestrictedProperties) {
1934
+ const restriction = navRestrictions.RestrictedProperties.find((prop) => prop.NavigationProperty?.value === navigationPath);
1935
+ if (restriction?.InsertRestrictions?.Insertable !== undefined) {
1936
+ const navInsertable = restriction.InsertRestrictions.Insertable;
1937
+ if (typeof navInsertable === 'boolean') {
1938
+ navigationInsertable = navInsertable;
1939
+ }
1940
+ }
1941
+ }
1942
+ // Resolve target EntitySet via navigationPropertyBinding
1943
+ const targetEntitySet = entitySet?.navigationPropertyBinding?.[navigationPath];
1944
+ if (targetEntitySet && '_type' in targetEntitySet && targetEntitySet._type === 'EntitySet') {
1945
+ // Default: allow if not specified (Path-based values are also treated as true)
1946
+ let targetEntitySetInsertable = true;
1947
+ const targetRestriction = targetEntitySet.annotations?.Capabilities?.InsertRestrictions?.Insertable;
1948
+ if (typeof targetRestriction === 'boolean') {
1949
+ targetEntitySetInsertable = targetRestriction;
1950
+ }
1951
+ // Both Navigation and Target EntitySet must allow insertion
1952
+ return navigationInsertable && targetEntitySetInsertable;
1953
+ }
1954
+ // If no targetEntitySet found, only check navigation restrictions
1955
+ return navigationInsertable;
1956
+ }
1957
+ // No navigation path: check EntitySet-level InsertRestrictions
1958
+ // Default: allow if not specified (Path-based values are also treated as true)
1959
+ let entitySetInsertable = true;
1960
+ const entitySetRestriction = entitySet?.annotations?.Capabilities?.InsertRestrictions?.Insertable;
1961
+ if (typeof entitySetRestriction === 'boolean') {
1962
+ entitySetInsertable = entitySetRestriction;
1963
+ }
1964
+ return entitySetInsertable;
1965
+ }
1714
1966
  /**
1715
1967
  * Returns the manifest path for a given page based on the provided path parameters.
1716
1968
  *