@sap-ux/preview-middleware 0.16.8 → 0.16.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +7 -0
  2. package/dist/client/adp/api-handler.js +142 -142
  3. package/dist/client/adp/command-executor.js +58 -58
  4. package/dist/client/adp/control-utils.js +44 -44
  5. package/dist/client/adp/controllers/AddFragment.controller.js +219 -219
  6. package/dist/client/adp/controllers/BaseDialog.controller.js +105 -105
  7. package/dist/client/adp/controllers/ControllerExtension.controller.js +228 -228
  8. package/dist/client/adp/controllers/ExtensionPoint.controller.js +138 -138
  9. package/dist/client/adp/init-dialogs.js +138 -121
  10. package/dist/client/adp/init-dialogs.ts +39 -14
  11. package/dist/client/adp/init.js +1 -1
  12. package/dist/client/adp/init.ts +2 -1
  13. package/dist/client/adp/ui5-version-utils.js +63 -63
  14. package/dist/client/adp/utils.js +61 -61
  15. package/dist/client/cpe/changes/flex-change.js +51 -51
  16. package/dist/client/cpe/changes/index.js +10 -10
  17. package/dist/client/cpe/changes/validator.js +34 -34
  18. package/dist/client/cpe/documentation.js +164 -164
  19. package/dist/client/cpe/error-utils.js +19 -19
  20. package/dist/client/cpe/logger.js +30 -30
  21. package/dist/client/cpe/outline/index.js +11 -1
  22. package/dist/client/cpe/outline/index.ts +9 -4
  23. package/dist/client/cpe/outline/nodes.js +172 -151
  24. package/dist/client/cpe/outline/nodes.ts +40 -9
  25. package/dist/client/cpe/outline/utils.js +60 -37
  26. package/dist/client/cpe/outline/utils.ts +27 -0
  27. package/dist/client/cpe/types.js +4 -4
  28. package/dist/client/cpe/ui5-utils.js +49 -49
  29. package/dist/client/cpe/utils.js +48 -48
  30. package/dist/client/flp/WorkspaceConnector.js +84 -84
  31. package/dist/client/flp/common.js +28 -28
  32. package/dist/client/flp/enableFakeConnector.js +84 -84
  33. package/dist/client/flp/initConnectors.js +33 -33
  34. package/dist/client/flp/initRta.js +178 -178
  35. package/package.json +5 -5
@@ -1,140 +1,140 @@
1
- "use strict";
2
-
3
- sap.ui.define(["sap/ui/model/json/JSONModel", "../api-handler", "./BaseDialog.controller", "../utils"], function (JSONModel, ___api_handler, __BaseDialog, ___utils) {
4
- "use strict";
5
-
6
- function _interopRequireDefault(obj) {
7
- return obj && obj.__esModule && typeof obj.default !== "undefined" ? obj.default : obj;
8
- }
9
- const getFragments = ___api_handler["getFragments"];
10
- const BaseDialog = _interopRequireDefault(__BaseDialog);
11
- const notifyUser = ___utils["notifyUser"];
12
- /**
13
- * @namespace open.ux.preview.client.adp.controllers
14
- */
15
- const ExtensionPoint = BaseDialog.extend("open.ux.preview.client.adp.controllers.ExtensionPoint", {
16
- constructor: function _constructor(name, _overlays, rta, data) {
17
- BaseDialog.prototype.constructor.call(this, name);
18
- this.model = new JSONModel();
19
- this.data = data;
20
- this.rta = rta;
21
- },
22
- /**
23
- * Setups the Dialog and the JSON Model
24
- *
25
- * @param {Dialog} dialog - Dialog instance
26
- */
27
- setup: async function _setup(dialog) {
28
- this.dialog = dialog;
29
- this.setEscapeHandler();
30
- await this.buildDialogData();
31
- this.dialog.setModel(this.model);
32
- this.dialog.open();
33
- },
34
- /**
35
- * Handles create button press
36
- *
37
- * @param event Event
38
- */
39
- onCreateBtnPress: function _onCreateBtnPress(event) {
40
- const source = event.getSource();
41
- source.setEnabled(false);
42
- const fragmentName = this.model.getProperty('/newFragmentName');
43
- this.createExtensionPointFragmentChange(fragmentName);
44
- notifyUser(`Note: The '${fragmentName}.fragment.xml' fragment will be created once you save the change.`, 8000);
45
- this.handleDialogClose();
46
- },
47
- /**
48
- * Handler for extension point select control
49
- *
50
- * @param event Select control change event
51
- */
52
- onExtensionPointHandler: function _onExtensionPointHandler(event) {
53
- const source = event.getSource();
54
- const selectedItem = source.getSelectedItem();
55
- let extensionPointName = '';
56
- if (selectedItem) {
57
- extensionPointName = selectedItem.getText();
58
- }
59
- this.model.setProperty('/extensionPointName', extensionPointName);
60
- const hasDefaultContent = this.hasDefaultContentForName(extensionPointName);
61
- this.model.setProperty('/hasDefaultContent', hasDefaultContent);
62
- },
63
- /**
64
- * Determines whether there is default content associated with the given name.
65
- *
66
- * @param {string} name - The name to check for associated default content.
67
- * @returns {boolean} - True if there is non-empty default content associated with the name, false otherwise.
68
- */
69
- hasDefaultContentForName: function _hasDefaultContentForName(name) {
70
- const defaultContent = this.data?.info.find(v => v.name === name)?.defaultContent;
71
- return defaultContent ? defaultContent.length > 0 : false;
72
- },
73
- /**
74
- * Builds data that is used in the dialog
75
- */
76
- buildDialogData: async function _buildDialogData() {
77
- const name = this.data?.name;
78
- if (name) {
79
- const hasDefaultContent = this.hasDefaultContentForName(name);
80
- const extensionPointList = [{
81
- key: 0,
82
- value: name
83
- }];
84
- this.updateModel(name, 0, extensionPointList, false, hasDefaultContent);
85
- } else {
86
- // In this case we are selecting from the application. There can be many extension points under one control.
87
- const extensionPointList = this.data.info.map((v, idx) => {
88
- return {
89
- key: idx,
90
- value: v.name
91
- };
92
- });
93
- const firstElName = extensionPointList[0].value;
94
- const enabled = extensionPointList.length > 1;
95
- const hasDefaultContent = this.hasDefaultContentForName(firstElName);
96
- this.updateModel(firstElName, 0, extensionPointList, enabled, hasDefaultContent);
97
- }
98
- try {
99
- const {
100
- fragments
101
- } = await getFragments();
102
- this.model.setProperty('/fragmentList', fragments);
103
- } catch (e) {
104
- this.handleError(e);
105
- }
106
- },
107
- /**
108
- * Updates the Select control according to provided values
109
- *
110
- * @param name Extension point name
111
- * @param key Selected extension point key
112
- * @param list All of the extension points that are under a view
113
- * @param enabled Enables the select control
114
- * @param hasDefaultContent Whether there is default content associated with the extension name
115
- */
116
- updateModel: function _updateModel(name, key, list, enabled, hasDefaultContent) {
117
- this.model.setProperty('/extensionPointName', name);
118
- this.model.setProperty('/extensionPointKey', key);
119
- this.model.setProperty('/extensionPointList', list);
120
- this.model.setProperty('/extensionListEnabled', enabled);
121
- this.model.setProperty('/hasDefaultContent', hasDefaultContent);
122
- },
123
- /**
124
- * Creates add xml at extension point changes
125
- *
126
- * @param fragmentName Fragment name
127
- */
128
- createExtensionPointFragmentChange: function _createExtensionPointFragmentChange(fragmentName) {
129
- const extensionPointName = this.model.getProperty('/extensionPointName');
130
- const modifiedValue = {
131
- fragment: `<core:FragmentDefinition xmlns:core='sap.ui.core'></core:FragmentDefinition>`,
132
- fragmentPath: `fragments/${fragmentName}.fragment.xml`,
133
- extensionPointName
134
- };
135
- this.data.deferred.resolve(modifiedValue);
136
- }
137
- });
138
- return ExtensionPoint;
1
+ "use strict";
2
+
3
+ sap.ui.define(["sap/ui/model/json/JSONModel", "../api-handler", "./BaseDialog.controller", "../utils"], function (JSONModel, ___api_handler, __BaseDialog, ___utils) {
4
+ "use strict";
5
+
6
+ function _interopRequireDefault(obj) {
7
+ return obj && obj.__esModule && typeof obj.default !== "undefined" ? obj.default : obj;
8
+ }
9
+ const getFragments = ___api_handler["getFragments"];
10
+ const BaseDialog = _interopRequireDefault(__BaseDialog);
11
+ const notifyUser = ___utils["notifyUser"];
12
+ /**
13
+ * @namespace open.ux.preview.client.adp.controllers
14
+ */
15
+ const ExtensionPoint = BaseDialog.extend("open.ux.preview.client.adp.controllers.ExtensionPoint", {
16
+ constructor: function _constructor(name, _overlays, rta, data) {
17
+ BaseDialog.prototype.constructor.call(this, name);
18
+ this.model = new JSONModel();
19
+ this.data = data;
20
+ this.rta = rta;
21
+ },
22
+ /**
23
+ * Setups the Dialog and the JSON Model
24
+ *
25
+ * @param {Dialog} dialog - Dialog instance
26
+ */
27
+ setup: async function _setup(dialog) {
28
+ this.dialog = dialog;
29
+ this.setEscapeHandler();
30
+ await this.buildDialogData();
31
+ this.dialog.setModel(this.model);
32
+ this.dialog.open();
33
+ },
34
+ /**
35
+ * Handles create button press
36
+ *
37
+ * @param event Event
38
+ */
39
+ onCreateBtnPress: function _onCreateBtnPress(event) {
40
+ const source = event.getSource();
41
+ source.setEnabled(false);
42
+ const fragmentName = this.model.getProperty('/newFragmentName');
43
+ this.createExtensionPointFragmentChange(fragmentName);
44
+ notifyUser(`Note: The '${fragmentName}.fragment.xml' fragment will be created once you save the change.`, 8000);
45
+ this.handleDialogClose();
46
+ },
47
+ /**
48
+ * Handler for extension point select control
49
+ *
50
+ * @param event Select control change event
51
+ */
52
+ onExtensionPointHandler: function _onExtensionPointHandler(event) {
53
+ const source = event.getSource();
54
+ const selectedItem = source.getSelectedItem();
55
+ let extensionPointName = '';
56
+ if (selectedItem) {
57
+ extensionPointName = selectedItem.getText();
58
+ }
59
+ this.model.setProperty('/extensionPointName', extensionPointName);
60
+ const hasDefaultContent = this.hasDefaultContentForName(extensionPointName);
61
+ this.model.setProperty('/hasDefaultContent', hasDefaultContent);
62
+ },
63
+ /**
64
+ * Determines whether there is default content associated with the given name.
65
+ *
66
+ * @param {string} name - The name to check for associated default content.
67
+ * @returns {boolean} - True if there is non-empty default content associated with the name, false otherwise.
68
+ */
69
+ hasDefaultContentForName: function _hasDefaultContentForName(name) {
70
+ const defaultContent = this.data?.info.find(v => v.name === name)?.defaultContent;
71
+ return defaultContent ? defaultContent.length > 0 : false;
72
+ },
73
+ /**
74
+ * Builds data that is used in the dialog
75
+ */
76
+ buildDialogData: async function _buildDialogData() {
77
+ const name = this.data?.name;
78
+ if (name) {
79
+ const hasDefaultContent = this.hasDefaultContentForName(name);
80
+ const extensionPointList = [{
81
+ key: 0,
82
+ value: name
83
+ }];
84
+ this.updateModel(name, 0, extensionPointList, false, hasDefaultContent);
85
+ } else {
86
+ // In this case we are selecting from the application. There can be many extension points under one control.
87
+ const extensionPointList = this.data.info.map((v, idx) => {
88
+ return {
89
+ key: idx,
90
+ value: v.name
91
+ };
92
+ });
93
+ const firstElName = extensionPointList[0].value;
94
+ const enabled = extensionPointList.length > 1;
95
+ const hasDefaultContent = this.hasDefaultContentForName(firstElName);
96
+ this.updateModel(firstElName, 0, extensionPointList, enabled, hasDefaultContent);
97
+ }
98
+ try {
99
+ const {
100
+ fragments
101
+ } = await getFragments();
102
+ this.model.setProperty('/fragmentList', fragments);
103
+ } catch (e) {
104
+ this.handleError(e);
105
+ }
106
+ },
107
+ /**
108
+ * Updates the Select control according to provided values
109
+ *
110
+ * @param name Extension point name
111
+ * @param key Selected extension point key
112
+ * @param list All of the extension points that are under a view
113
+ * @param enabled Enables the select control
114
+ * @param hasDefaultContent Whether there is default content associated with the extension name
115
+ */
116
+ updateModel: function _updateModel(name, key, list, enabled, hasDefaultContent) {
117
+ this.model.setProperty('/extensionPointName', name);
118
+ this.model.setProperty('/extensionPointKey', key);
119
+ this.model.setProperty('/extensionPointList', list);
120
+ this.model.setProperty('/extensionListEnabled', enabled);
121
+ this.model.setProperty('/hasDefaultContent', hasDefaultContent);
122
+ },
123
+ /**
124
+ * Creates add xml at extension point changes
125
+ *
126
+ * @param fragmentName Fragment name
127
+ */
128
+ createExtensionPointFragmentChange: function _createExtensionPointFragmentChange(fragmentName) {
129
+ const extensionPointName = this.model.getProperty('/extensionPointName');
130
+ const modifiedValue = {
131
+ fragment: `<core:FragmentDefinition xmlns:core='sap.ui.core'></core:FragmentDefinition>`,
132
+ fragmentPath: `fragments/${fragmentName}.fragment.xml`,
133
+ extensionPointName
134
+ };
135
+ this.data.deferred.resolve(modifiedValue);
136
+ }
137
+ });
138
+ return ExtensionPoint;
139
139
  });
140
140
  //# sourceMappingURL=ExtensionPoint.controller.js.map
@@ -1,123 +1,140 @@
1
- "use strict";
2
-
3
- sap.ui.define(["sap/ui/core/Fragment", "sap/ui/fl/Utils", "./controllers/AddFragment.controller", "./controllers/ControllerExtension.controller", "./controllers/ExtensionPoint.controller"], function (Fragment, FlUtils, __AddFragment, __ControllerExtension, __ExtensionPoint) {
4
- "use strict";
5
-
6
- function _interopRequireDefault(obj) {
7
- return obj && obj.__esModule && typeof obj.default !== "undefined" ? obj.default : obj;
8
- }
9
- const AddFragment = _interopRequireDefault(__AddFragment);
10
- const ControllerExtension = _interopRequireDefault(__ControllerExtension);
11
- const ExtensionPoint = _interopRequireDefault(__ExtensionPoint);
12
- var DialogNames = /*#__PURE__*/function (DialogNames) {
13
- DialogNames["ADD_FRAGMENT"] = "AddFragment";
14
- DialogNames["CONTROLLER_EXTENSION"] = "ControllerExtension";
15
- DialogNames["ADD_FRAGMENT_AT_EXTENSION_POINT"] = "ExtensionPoint";
16
- return DialogNames;
17
- }(DialogNames || {});
18
- /**
19
- * Handler for enablement of Extend With Controller context menu entry
20
- *
21
- * @param overlays Control overlays
22
- * @param syncViewsIds Runtime Authoring
23
- *
24
- * @returns boolean
25
- */
26
- const isControllerExtensionEnabled = (overlays, syncViewsIds) => {
27
- const clickedControlId = FlUtils.getViewForControl(overlays[0].getElement()).getId();
28
- return overlays.length <= 1 && !syncViewsIds.includes(clickedControlId);
29
- };
30
-
31
- /**
32
- * Determines whether the fragment command should be enabled based on the provided overlays.
33
- *
34
- * @param {ElementOverlay[]} overlays - An array of ElementOverlay objects representing the UI overlays.
35
- * @returns {boolean} True if the fragment command is enabled, false otherwise.
36
- */
37
- const isFragmentCommandEnabled = overlays => {
38
- if (overlays.length === 0) {
39
- return false;
40
- }
41
- const control = overlays[0].getElement();
42
- const hasStableId = FlUtils.checkControlId(control);
43
- return hasStableId && overlays.length <= 1;
44
- };
45
-
46
- /**
47
- * Determines the text that should be displayed for the Add Fragment context menu item.
48
- *
49
- * @param {ElementOverlay} overlay - An ElementOverlay object representing the UI overlay.
50
- * @returns {string} The text of the Add Fragment context menu item.
51
- */
52
- const getAddFragmentItemText = overlay => {
53
- if (!isFragmentCommandEnabled([overlay])) {
54
- return 'Add: Fragment (Unavailable due to unstable ID of the control or its parent control)';
55
- }
56
- return 'Add: Fragment';
57
- };
58
-
59
- /**
60
- * Handler for new context menu entry
61
- *
62
- * @param overlay Control overlays
63
- * @param rta Runtime Authoring
64
- * @param dialogName Dialog name
65
- * @param extensionPointData Control ID
66
- */
67
- async function handler(overlay, rta, dialogName, extensionPointData) {
68
- let controller;
69
- switch (dialogName) {
70
- case DialogNames.ADD_FRAGMENT:
71
- controller = new AddFragment(`open.ux.preview.client.adp.controllers.${dialogName}`, overlay, rta);
72
- break;
73
- case DialogNames.CONTROLLER_EXTENSION:
74
- controller = new ControllerExtension(`open.ux.preview.client.adp.controllers.${dialogName}`, overlay, rta);
75
- break;
76
- case DialogNames.ADD_FRAGMENT_AT_EXTENSION_POINT:
77
- controller = new ExtensionPoint(`open.ux.preview.client.adp.controllers.${dialogName}`, overlay, rta, extensionPointData);
78
- break;
79
- }
80
- const id = dialogName === DialogNames.ADD_FRAGMENT_AT_EXTENSION_POINT ? `dialog--${dialogName}` : undefined;
81
- const dialog = await Fragment.load({
82
- name: `open.ux.preview.client.adp.ui.${dialogName}`,
83
- controller,
84
- id
85
- });
86
- await controller.setup(dialog);
87
- }
88
-
89
- /**
90
- * Adds a new item to the context menu
91
- *
92
- * @param rta Runtime Authoring
93
- * @param syncViewsIds Ids of all application sync views
94
- */
95
- const initDialogs = (rta, syncViewsIds) => {
96
- const contextMenu = rta.getDefaultPlugins().contextMenu;
97
- contextMenu.addMenuItem({
98
- id: 'ADD_FRAGMENT',
99
- text: getAddFragmentItemText,
100
- handler: async overlays => await handler(overlays[0], rta, DialogNames.ADD_FRAGMENT),
101
- enabled: isFragmentCommandEnabled,
102
- icon: 'sap-icon://attachment-html'
103
- });
104
- contextMenu.addMenuItem({
105
- id: 'EXTEND_CONTROLLER',
106
- text: 'Extend With Controller',
107
- handler: async overlays => await handler(overlays[0], rta, DialogNames.CONTROLLER_EXTENSION),
108
- icon: 'sap-icon://create-form',
109
- enabled: overlays => isControllerExtensionEnabled(overlays, syncViewsIds)
110
- });
111
- };
112
- var __exports = {
113
- __esModule: true
114
- };
115
- __exports.DialogNames = DialogNames;
116
- __exports.isControllerExtensionEnabled = isControllerExtensionEnabled;
117
- __exports.isFragmentCommandEnabled = isFragmentCommandEnabled;
118
- __exports.getAddFragmentItemText = getAddFragmentItemText;
119
- __exports.handler = handler;
120
- __exports.initDialogs = initDialogs;
121
- return __exports;
1
+ "use strict";
2
+
3
+ sap.ui.define(["sap/ui/core/Fragment", "sap/ui/fl/Utils", "./controllers/AddFragment.controller", "./controllers/ControllerExtension.controller", "./controllers/ExtensionPoint.controller", "../cpe/outline/utils"], function (Fragment, FlUtils, __AddFragment, __ControllerExtension, __ExtensionPoint, ___cpe_outline_utils) {
4
+ "use strict";
5
+
6
+ function _interopRequireDefault(obj) {
7
+ return obj && obj.__esModule && typeof obj.default !== "undefined" ? obj.default : obj;
8
+ }
9
+ const AddFragment = _interopRequireDefault(__AddFragment);
10
+ const ControllerExtension = _interopRequireDefault(__ControllerExtension);
11
+ const ExtensionPoint = _interopRequireDefault(__ExtensionPoint);
12
+ const isReuseComponent = ___cpe_outline_utils["isReuseComponent"];
13
+ var DialogNames = /*#__PURE__*/function (DialogNames) {
14
+ DialogNames["ADD_FRAGMENT"] = "AddFragment";
15
+ DialogNames["CONTROLLER_EXTENSION"] = "ControllerExtension";
16
+ DialogNames["ADD_FRAGMENT_AT_EXTENSION_POINT"] = "ExtensionPoint";
17
+ return DialogNames;
18
+ }(DialogNames || {});
19
+ /**
20
+ * Handler for enablement of Extend With Controller context menu entry
21
+ *
22
+ * @param overlays Control overlays
23
+ * @param syncViewsIds Runtime Authoring
24
+ * @param minorUI5Version minor UI5 version
25
+ *
26
+ * @returns boolean whether menu item is enabled or not
27
+ */
28
+ const isControllerExtensionEnabled = (overlays, syncViewsIds, minorUI5Version) => {
29
+ if (overlays.length === 0 || overlays.length > 1) {
30
+ return false;
31
+ }
32
+ const clickedControlId = FlUtils.getViewForControl(overlays[0].getElement()).getId();
33
+ const isClickedControlReuseComponent = isReuseComponent(clickedControlId, minorUI5Version);
34
+ return !syncViewsIds.includes(clickedControlId) && !isClickedControlReuseComponent;
35
+ };
36
+
37
+ /**
38
+ * Determines whether the fragment command should be enabled based on the provided overlays.
39
+ *
40
+ * @param {ElementOverlay[]} overlays - An array of ElementOverlay objects representing the UI overlays.
41
+ * @param minorUI5Version minor UI5 version
42
+ * @returns {boolean} True if the fragment command is enabled, false otherwise.
43
+ */
44
+ const isFragmentCommandEnabled = (overlays, minorUI5Version) => {
45
+ if (overlays.length === 0 || overlays.length > 1) {
46
+ return false;
47
+ }
48
+ const control = overlays[0].getElement();
49
+ return hasStableId(control) && !isReuseComponent(control.getId(), minorUI5Version);
50
+ };
51
+
52
+ /**
53
+ * Determines whether control has stable id
54
+ * @param {ManagedObject} control - ManagedObject object representing the UI control.
55
+ * @returns {boolean} True if control has stable Id, false otherwise
56
+ */
57
+ const hasStableId = control => {
58
+ return FlUtils.checkControlId(control);
59
+ };
60
+
61
+ /**
62
+ * Determines the text that should be displayed for the Add Fragment context menu item.
63
+ *
64
+ * @param {ElementOverlay} overlay - An ElementOverlay object representing the UI overlay.
65
+ * @returns {string} The text of the Add Fragment context menu item.
66
+ */
67
+ const getAddFragmentItemText = overlay => {
68
+ const control = overlay.getElement();
69
+ if (control && !hasStableId(control)) {
70
+ return 'Add: Fragment (Unavailable due to unstable ID of the control or its parent control)';
71
+ }
72
+ return 'Add: Fragment';
73
+ };
74
+
75
+ /**
76
+ * Handler for new context menu entry
77
+ *
78
+ * @param overlay Control overlays
79
+ * @param rta Runtime Authoring
80
+ * @param dialogName Dialog name
81
+ * @param extensionPointData Control ID
82
+ */
83
+ async function handler(overlay, rta, dialogName, extensionPointData) {
84
+ let controller;
85
+ switch (dialogName) {
86
+ case DialogNames.ADD_FRAGMENT:
87
+ controller = new AddFragment(`open.ux.preview.client.adp.controllers.${dialogName}`, overlay, rta);
88
+ break;
89
+ case DialogNames.CONTROLLER_EXTENSION:
90
+ controller = new ControllerExtension(`open.ux.preview.client.adp.controllers.${dialogName}`, overlay, rta);
91
+ break;
92
+ case DialogNames.ADD_FRAGMENT_AT_EXTENSION_POINT:
93
+ controller = new ExtensionPoint(`open.ux.preview.client.adp.controllers.${dialogName}`, overlay, rta, extensionPointData);
94
+ break;
95
+ }
96
+ const id = dialogName === DialogNames.ADD_FRAGMENT_AT_EXTENSION_POINT ? `dialog--${dialogName}` : undefined;
97
+ const dialog = await Fragment.load({
98
+ name: `open.ux.preview.client.adp.ui.${dialogName}`,
99
+ controller,
100
+ id
101
+ });
102
+ await controller.setup(dialog);
103
+ }
104
+
105
+ /**
106
+ * Adds a new item to the context menu
107
+ *
108
+ * @param rta Runtime Authoring
109
+ * @param syncViewsIds Ids of all application sync views
110
+ * @param minorUI5Version minor UI5 version
111
+ */
112
+ const initDialogs = (rta, syncViewsIds, minorUI5Version) => {
113
+ const contextMenu = rta.getDefaultPlugins().contextMenu;
114
+ contextMenu.addMenuItem({
115
+ id: 'ADD_FRAGMENT',
116
+ text: getAddFragmentItemText,
117
+ handler: async overlays => await handler(overlays[0], rta, DialogNames.ADD_FRAGMENT),
118
+ icon: 'sap-icon://attachment-html',
119
+ enabled: overlays => isFragmentCommandEnabled(overlays, minorUI5Version)
120
+ });
121
+ contextMenu.addMenuItem({
122
+ id: 'EXTEND_CONTROLLER',
123
+ text: 'Extend With Controller',
124
+ handler: async overlays => await handler(overlays[0], rta, DialogNames.CONTROLLER_EXTENSION),
125
+ icon: 'sap-icon://create-form',
126
+ enabled: overlays => isControllerExtensionEnabled(overlays, syncViewsIds, minorUI5Version)
127
+ });
128
+ };
129
+ var __exports = {
130
+ __esModule: true
131
+ };
132
+ __exports.DialogNames = DialogNames;
133
+ __exports.isControllerExtensionEnabled = isControllerExtensionEnabled;
134
+ __exports.isFragmentCommandEnabled = isFragmentCommandEnabled;
135
+ __exports.getAddFragmentItemText = getAddFragmentItemText;
136
+ __exports.handler = handler;
137
+ __exports.initDialogs = initDialogs;
138
+ return __exports;
122
139
  });
123
140
  //# sourceMappingURL=init-dialogs.js.map
@@ -18,6 +18,8 @@ import AddFragment from './controllers/AddFragment.controller';
18
18
  import ControllerExtension from './controllers/ControllerExtension.controller';
19
19
  import { ExtensionPointData } from './extension-point';
20
20
  import ExtensionPoint from './controllers/ExtensionPoint.controller';
21
+ import ManagedObject from 'sap/ui/base/ManagedObject';
22
+ import { isReuseComponent } from '../cpe/outline/utils';
21
23
 
22
24
  export const enum DialogNames {
23
25
  ADD_FRAGMENT = 'AddFragment',
@@ -27,33 +29,54 @@ export const enum DialogNames {
27
29
 
28
30
  type Controller = AddFragment | ControllerExtension | ExtensionPoint;
29
31
 
30
- /**
32
+ /**
31
33
  * Handler for enablement of Extend With Controller context menu entry
32
34
  *
33
35
  * @param overlays Control overlays
34
36
  * @param syncViewsIds Runtime Authoring
37
+ * @param minorUI5Version minor UI5 version
35
38
  *
36
- * @returns boolean
39
+ * @returns boolean whether menu item is enabled or not
37
40
  */
38
- export const isControllerExtensionEnabled = (overlays: ElementOverlay[], syncViewsIds: string[]): boolean => {
41
+ export const isControllerExtensionEnabled = (
42
+ overlays: ElementOverlay[],
43
+ syncViewsIds: string[],
44
+ minorUI5Version: number
45
+ ): boolean => {
46
+ if (overlays.length === 0 || overlays.length > 1) {
47
+ return false;
48
+ }
49
+
39
50
  const clickedControlId = FlUtils.getViewForControl(overlays[0].getElement()).getId();
51
+ const isClickedControlReuseComponent = isReuseComponent(clickedControlId, minorUI5Version);
40
52
 
41
- return overlays.length <= 1 && !syncViewsIds.includes(clickedControlId);
53
+ return !syncViewsIds.includes(clickedControlId) && !isClickedControlReuseComponent;
42
54
  };
43
55
 
44
56
  /**
45
57
  * Determines whether the fragment command should be enabled based on the provided overlays.
46
58
  *
47
59
  * @param {ElementOverlay[]} overlays - An array of ElementOverlay objects representing the UI overlays.
60
+ * @param minorUI5Version minor UI5 version
48
61
  * @returns {boolean} True if the fragment command is enabled, false otherwise.
49
62
  */
50
- export const isFragmentCommandEnabled = (overlays: ElementOverlay[]): boolean => {
51
- if (overlays.length === 0) {return false;}
63
+ export const isFragmentCommandEnabled = (overlays: ElementOverlay[], minorUI5Version: number): boolean => {
64
+ if (overlays.length === 0 || overlays.length > 1) {
65
+ return false;
66
+ }
52
67
 
53
68
  const control = overlays[0].getElement();
54
- const hasStableId = FlUtils.checkControlId(control);
55
69
 
56
- return hasStableId && overlays.length <= 1;
70
+ return hasStableId(control) && !isReuseComponent(control.getId(), minorUI5Version);
71
+ };
72
+
73
+ /**
74
+ * Determines whether control has stable id
75
+ * @param {ManagedObject} control - ManagedObject object representing the UI control.
76
+ * @returns {boolean} True if control has stable Id, false otherwise
77
+ */
78
+ const hasStableId = (control: ManagedObject): boolean => {
79
+ return FlUtils.checkControlId(control);
57
80
  };
58
81
 
59
82
  /**
@@ -63,7 +86,8 @@ export const isFragmentCommandEnabled = (overlays: ElementOverlay[]): boolean =>
63
86
  * @returns {string} The text of the Add Fragment context menu item.
64
87
  */
65
88
  export const getAddFragmentItemText = (overlay: ElementOverlay) => {
66
- if (!isFragmentCommandEnabled([overlay])) {
89
+ const control = overlay.getElement();
90
+ if (control && !hasStableId(control)) {
67
91
  return 'Add: Fragment (Unavailable due to unstable ID of the control or its parent control)';
68
92
  }
69
93
 
@@ -119,16 +143,17 @@ export async function handler(
119
143
  *
120
144
  * @param rta Runtime Authoring
121
145
  * @param syncViewsIds Ids of all application sync views
146
+ * @param minorUI5Version minor UI5 version
122
147
  */
123
- export const initDialogs = (rta: RuntimeAuthoring, syncViewsIds: string[]): void => {
148
+ export const initDialogs = (rta: RuntimeAuthoring, syncViewsIds: string[], minorUI5Version: number): void => {
124
149
  const contextMenu = rta.getDefaultPlugins().contextMenu;
125
150
 
126
151
  contextMenu.addMenuItem({
127
152
  id: 'ADD_FRAGMENT',
128
153
  text: getAddFragmentItemText,
129
154
  handler: async (overlays: UI5Element[]) => await handler(overlays[0], rta, DialogNames.ADD_FRAGMENT),
130
- enabled: isFragmentCommandEnabled,
131
- icon: 'sap-icon://attachment-html'
155
+ icon: 'sap-icon://attachment-html',
156
+ enabled: (overlays: ElementOverlay[]) => isFragmentCommandEnabled(overlays, minorUI5Version)
132
157
  });
133
158
 
134
159
  contextMenu.addMenuItem({
@@ -136,6 +161,6 @@ export const initDialogs = (rta: RuntimeAuthoring, syncViewsIds: string[]): void
136
161
  text: 'Extend With Controller',
137
162
  handler: async (overlays: UI5Element[]) => await handler(overlays[0], rta, DialogNames.CONTROLLER_EXTENSION),
138
163
  icon: 'sap-icon://create-form',
139
- enabled: (overlays: ElementOverlay[]) => isControllerExtensionEnabled(overlays, syncViewsIds)
164
+ enabled: (overlays: ElementOverlay[]) => isControllerExtensionEnabled(overlays, syncViewsIds, minorUI5Version)
140
165
  });
141
- };
166
+ };