@sap-ux/preview-middleware 0.11.19 → 0.11.21

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.
@@ -13,10 +13,10 @@ sap.ui.define(["sap/m/MessageToast", "sap/ui/model/json/JSONModel", "../api-hand
13
13
  * @namespace open.ux.preview.client.adp.controllers
14
14
  */
15
15
  const ExtensionPoint = BaseDialog.extend("open.ux.preview.client.adp.controllers.ExtensionPoint", {
16
- constructor: function _constructor(name, _overlays, _rta, extensionPointData) {
16
+ constructor: function _constructor(name, _overlays, _rta, data) {
17
17
  BaseDialog.prototype.constructor.call(this, name);
18
18
  this.model = new JSONModel();
19
- this.extensionPointData = extensionPointData;
19
+ this.data = data;
20
20
  },
21
21
  onInit: async function _onInit() {
22
22
  this.dialog = this.byId('addFragmentAtExtPointDialog');
@@ -32,8 +32,33 @@ sap.ui.define(["sap/m/MessageToast", "sap/ui/model/json/JSONModel", "../api-hand
32
32
  await this.createNewFragment(fragmentName);
33
33
  this.handleDialogClose();
34
34
  },
35
+ onExtensionPointHandler: function _onExtensionPointHandler(event) {
36
+ const source = event.getSource();
37
+ const selectedItem = source.getSelectedItem();
38
+ let extensionPointName = '';
39
+ if (selectedItem) {
40
+ extensionPointName = selectedItem.getText();
41
+ }
42
+ this.model.setProperty('/extensionPointName', extensionPointName);
43
+ },
35
44
  buildDialogData: async function _buildDialogData() {
36
- this.model.setProperty('/extensionPointName', this.extensionPointData?.name);
45
+ const name = this.data?.name;
46
+ if (name) {
47
+ const extensionPointList = [{
48
+ key: 0,
49
+ value: name
50
+ }];
51
+ this.updateModel(name, 0, extensionPointList, false);
52
+ } else {
53
+ const extensionPointList = this.data.info.map((v, idx) => {
54
+ return {
55
+ key: idx,
56
+ value: v.name
57
+ };
58
+ });
59
+ const enabled = extensionPointList.length > 1;
60
+ this.updateModel(extensionPointList[0].value, 0, extensionPointList, enabled);
61
+ }
37
62
  try {
38
63
  const {
39
64
  fragments
@@ -44,6 +69,12 @@ sap.ui.define(["sap/m/MessageToast", "sap/ui/model/json/JSONModel", "../api-hand
44
69
  throw new Error(e.message);
45
70
  }
46
71
  },
72
+ updateModel: function _updateModel(name, key, list, enabled) {
73
+ this.model.setProperty('/extensionPointName', name);
74
+ this.model.setProperty('/extensionPointKey', key);
75
+ this.model.setProperty('/extensionPointList', list);
76
+ this.model.setProperty('/extensionListEnabled', enabled);
77
+ },
47
78
  createNewFragment: async function _createNewFragment(fragmentName) {
48
79
  try {
49
80
  await writeFragment({
@@ -58,11 +89,12 @@ sap.ui.define(["sap/m/MessageToast", "sap/ui/model/json/JSONModel", "../api-hand
58
89
  await this.createExtensionPointFragmentChange(fragmentName);
59
90
  },
60
91
  createExtensionPointFragmentChange: async function _createExtensionPointFragmentChange(fragmentName) {
92
+ const extensionPointName = this.model.getProperty('/extensionPointName');
61
93
  const modifiedValue = {
62
94
  fragmentPath: `fragments/${fragmentName}.fragment.xml`,
63
- extensionPointName: this.extensionPointData.name
95
+ extensionPointName
64
96
  };
65
- this.extensionPointData.deffered.resolve(modifiedValue);
97
+ this.data.deferred.resolve(modifiedValue);
66
98
  }
67
99
  });
68
100
  return ExtensionPoint;
@@ -1,5 +1,6 @@
1
1
  /** sap.m */
2
- import Button from 'sap/m/Button';
2
+ import type Button from 'sap/m/Button';
3
+ import type Select from 'sap/m/Select';
3
4
  import type Dialog from 'sap/m/Dialog';
4
5
  import MessageToast from 'sap/m/MessageToast';
5
6
 
@@ -17,18 +18,18 @@ import type RuntimeAuthoring from 'sap/ui/rta/RuntimeAuthoring';
17
18
 
18
19
  import { getFragments, writeFragment } from '../api-handler';
19
20
  import BaseDialog from './BaseDialog.controller';
20
- import { ExtensionPointData } from '../extension-point';
21
+ import { ExtensionPointData, ExtensionPointInfo } from '../extension-point';
21
22
 
22
23
  /**
23
24
  * @namespace open.ux.preview.client.adp.controllers
24
25
  */
25
26
  export default class ExtensionPoint extends BaseDialog {
26
- public readonly extensionPointData: ExtensionPointData;
27
+ public readonly data: ExtensionPointData;
27
28
 
28
- constructor(name: string, _overlays: UI5Element, _rta: RuntimeAuthoring, extensionPointData: ExtensionPointData) {
29
+ constructor(name: string, _overlays: UI5Element, _rta: RuntimeAuthoring, data: ExtensionPointData) {
29
30
  super(name);
30
31
  this.model = new JSONModel();
31
- this.extensionPointData = extensionPointData;
32
+ this.data = data;
32
33
  }
33
34
 
34
35
  /**
@@ -51,7 +52,7 @@ export default class ExtensionPoint extends BaseDialog {
51
52
  *
52
53
  * @param event Event
53
54
  */
54
- async onCreateBtnPress(event: Event) {
55
+ async onCreateBtnPress(event: Event): Promise<void> {
55
56
  const source = event.getSource<Button>();
56
57
  source.setEnabled(false);
57
58
 
@@ -62,11 +63,42 @@ export default class ExtensionPoint extends BaseDialog {
62
63
  this.handleDialogClose();
63
64
  }
64
65
 
66
+ /**
67
+ * Handler for extension point select control
68
+ *
69
+ * @param event Select control change event
70
+ */
71
+ onExtensionPointHandler(event: Event): void {
72
+ const source = event.getSource<Select>();
73
+
74
+ const selectedItem = source.getSelectedItem();
75
+
76
+ let extensionPointName = '';
77
+ if (selectedItem) {
78
+ extensionPointName = selectedItem.getText();
79
+ }
80
+
81
+ this.model.setProperty('/extensionPointName', extensionPointName);
82
+ }
83
+
65
84
  /**
66
85
  * Builds data that is used in the dialog
67
86
  */
68
87
  async buildDialogData(): Promise<void> {
69
- this.model.setProperty('/extensionPointName', this.extensionPointData?.name);
88
+ const name = this.data?.name;
89
+ if (name) {
90
+ const extensionPointList = [{ key: 0, value: name }];
91
+ this.updateModel(name, 0, extensionPointList, false);
92
+ } else {
93
+ const extensionPointList = this.data.info.map((v: ExtensionPointInfo, idx: number) => {
94
+ return {
95
+ key: idx,
96
+ value: v.name
97
+ };
98
+ });
99
+ const enabled = extensionPointList.length > 1;
100
+ this.updateModel(extensionPointList[0].value, 0, extensionPointList, enabled);
101
+ }
70
102
 
71
103
  try {
72
104
  const { fragments } = await getFragments();
@@ -78,6 +110,21 @@ export default class ExtensionPoint extends BaseDialog {
78
110
  }
79
111
  }
80
112
 
113
+ /**
114
+ * Updates the Select control according to provided values
115
+ *
116
+ * @param name Extension point name
117
+ * @param key Selected extension point key
118
+ * @param list All of the extension points that are under a view
119
+ * @param enabled Enables the select control
120
+ */
121
+ private updateModel(name: string, key: number, list: { key: number; value: string }[], enabled: boolean): void {
122
+ this.model.setProperty('/extensionPointName', name);
123
+ this.model.setProperty('/extensionPointKey', key);
124
+ this.model.setProperty('/extensionPointList', list);
125
+ this.model.setProperty('/extensionListEnabled', enabled);
126
+ }
127
+
81
128
  /**
82
129
  * Creates a new fragment for the specified extension point
83
130
  *
@@ -102,11 +149,12 @@ export default class ExtensionPoint extends BaseDialog {
102
149
  * @param fragmentName Fragment name
103
150
  */
104
151
  private async createExtensionPointFragmentChange(fragmentName: string): Promise<void> {
152
+ const extensionPointName = this.model.getProperty('/extensionPointName');
105
153
  const modifiedValue = {
106
154
  fragmentPath: `fragments/${fragmentName}.fragment.xml`,
107
- extensionPointName: this.extensionPointData.name
155
+ extensionPointName
108
156
  };
109
157
 
110
- this.extensionPointData.deffered.resolve(modifiedValue);
158
+ this.data.deferred.resolve(modifiedValue);
111
159
  }
112
160
  }
@@ -21,9 +21,10 @@ sap.ui.define([
21
21
  subscribe(async action => {
22
22
  if (addExtensionPoint.match(action)) {
23
23
  try {
24
- const {controlId} = action.payload;
24
+ const {controlId, name} = action.payload;
25
25
  const service = await this.rta.getService('action');
26
26
  service.execute(controlId, this.actionId);
27
+ this.selectedExtensionPointName = name;
27
28
  } catch (e) {
28
29
  throw new Error(`Failed to execute service with actionId: ${ this.actionId }`);
29
30
  }
@@ -35,19 +36,22 @@ sap.ui.define([
35
36
  const commandFactory = new CommandFactory({ flexSettings });
36
37
  const plugin = new AddXMLAtExtensionPoint({
37
38
  commandFactory,
38
- fragmentHandler: async (overlay, info) => await this.fragmentHandler(overlay, info[0])
39
+ fragmentHandler: async (overlay, info) => await this.fragmentHandler(overlay, info)
39
40
  });
40
41
  const defaultPlugins = this.rta.getDefaultPlugins();
41
42
  defaultPlugins.addXMLAtExtensionPoint = plugin;
42
43
  this.rta.setPlugins(defaultPlugins);
43
44
  }
44
45
  async fragmentHandler(overlay, info) {
45
- let deffered = createDeferred();
46
+ let deferred = createDeferred();
47
+ const name = this.selectedExtensionPointName;
46
48
  await handler(overlay, this.rta, DialogNames.ADD_FRAGMENT_AT_EXTENSION_POINT, {
47
- name: info.name,
48
- deffered
49
+ name,
50
+ info,
51
+ deferred
49
52
  });
50
- return deffered.promise;
53
+ this.selectedExtensionPointName = '';
54
+ return deferred.promise;
51
55
  }
52
56
  }
53
57
  return ExtensionPointService;
@@ -20,9 +20,8 @@ type DeferredExtPointData = {
20
20
  extensionPointName: string | undefined;
21
21
  };
22
22
 
23
- export interface ExtensionPointData {
23
+ export interface ExtensionPointInfo {
24
24
  name: string;
25
- deffered: Deferred<DeferredExtPointData>;
26
25
  index?: number;
27
26
  view?: View;
28
27
  createdControls?: [];
@@ -33,8 +32,15 @@ export interface ExtensionPointData {
33
32
  targetControl?: UI5Element;
34
33
  }
35
34
 
35
+ export interface ExtensionPointData {
36
+ name: string;
37
+ deferred: Deferred<DeferredExtPointData>;
38
+ info: ExtensionPointInfo[];
39
+ }
40
+
36
41
  export default class ExtensionPointService {
37
42
  private readonly actionId = 'CTX_ADDXML_AT_EXTENSIONPOINT';
43
+ private selectedExtensionPointName: string;
38
44
 
39
45
  /**
40
46
  * @param rta Runtime Authoring
@@ -51,11 +57,12 @@ export default class ExtensionPointService {
51
57
  subscribe(async (action: ExternalAction): Promise<void> => {
52
58
  if (addExtensionPoint.match(action)) {
53
59
  try {
54
- const { controlId } = action.payload;
60
+ const { controlId, name } = action.payload;
55
61
 
56
62
  const service = await this.rta.getService<ActionService>('action');
57
63
 
58
64
  service.execute(controlId, this.actionId);
65
+ this.selectedExtensionPointName = name;
59
66
  } catch (e) {
60
67
  throw new Error(`Failed to execute service with actionId: ${this.actionId}`);
61
68
  }
@@ -75,7 +82,7 @@ export default class ExtensionPointService {
75
82
  const plugin = new AddXMLAtExtensionPoint({
76
83
  commandFactory,
77
84
  fragmentHandler: async (overlay: UI5Element, info: ExtensionPointData[]) =>
78
- await this.fragmentHandler(overlay, info[0])
85
+ await this.fragmentHandler(overlay, info)
79
86
  });
80
87
 
81
88
  const defaultPlugins = this.rta.getDefaultPlugins();
@@ -88,16 +95,19 @@ export default class ExtensionPointService {
88
95
  *
89
96
  * @param overlay UI5 Element overlay
90
97
  * @param info Extension point data from the plugin
91
- * @returns Deffered extension point data that is provided to the plugin
98
+ * @returns Deferred extension point data that is provided to the plugin
92
99
  */
93
- public async fragmentHandler(overlay: UI5Element, info: ExtensionPointData): Promise<DeferredExtPointData> {
94
- let deffered = createDeferred<DeferredExtPointData>();
100
+ public async fragmentHandler(overlay: UI5Element, info: ExtensionPointData[]): Promise<DeferredExtPointData> {
101
+ let deferred = createDeferred<DeferredExtPointData>();
102
+ const name = this.selectedExtensionPointName;
95
103
 
96
104
  await handler(overlay, this.rta, DialogNames.ADD_FRAGMENT_AT_EXTENSION_POINT, {
97
- name: info.name,
98
- deffered
105
+ name,
106
+ info,
107
+ deferred
99
108
  } as ExtensionPointData);
100
109
 
101
- return deffered.promise;
110
+ this.selectedExtensionPointName = '';
111
+ return deferred.promise;
102
112
  }
103
113
  }
@@ -11,7 +11,16 @@
11
11
  singleContainerFullSize="false">
12
12
  <f:content>
13
13
  <Label text="Extension Point" />
14
- <Text text="{/extensionPointName}" />
14
+ <Select
15
+ enabled="{/extensionListEnabled}"
16
+ change="onExtensionPointHandler"
17
+ selectedKey='{/extensionPointKey}'
18
+ items="{
19
+ path: '/extensionPointList',
20
+ sorter: { path: 'text' }
21
+ }">
22
+ <core:Item key="{key}" text="{value}" />
23
+ </Select>
15
24
  <Label text="Fragment Name" />
16
25
  <Input
17
26
  description=".fragment.xml"
@@ -94,7 +94,11 @@ sap.ui.define(["sap/base/Log", "sap/ui/core/IconPool", "sap/base/i18n/ResourceBu
94
94
  url = url + '&sap-client=' + sapClient;
95
95
  }
96
96
  const response = await fetch(url);
97
- registerModules(await response.json());
97
+ try {
98
+ registerModules(await response.json());
99
+ } catch (error) {
100
+ Log.error(`Registering of reuse libs failed. Error:${error}`);
101
+ }
98
102
  }
99
103
  }
100
104
 
@@ -134,7 +134,11 @@ export async function registerComponentDependencyPaths(appUrls: string[]): Promi
134
134
  url = url + '&sap-client=' + sapClient;
135
135
  }
136
136
  const response = await fetch(url);
137
- registerModules(await response.json());
137
+ try {
138
+ registerModules(await response.json());
139
+ } catch (error) {
140
+ Log.error(`Registering of reuse libs failed. Error:${error}`);
141
+ }
138
142
  }
139
143
  }
140
144
 
@@ -187,7 +191,7 @@ export async function init({ appUrls, flex }: { appUrls?: string | null; flex?:
187
191
  if (flex) {
188
192
  sap.ushell.Container.attachRendererCreatedEvent(async function () {
189
193
  const lifecycleService = await sap.ushell.Container.getServiceAsync<AppLifeCycle>('AppLifeCycle');
190
- lifecycleService.attachAppLoaded(event => {
194
+ lifecycleService.attachAppLoaded((event) => {
191
195
  const view = event.getParameter('componentInstance');
192
196
  const libs = ['sap/ui/rta/api/startAdaptation'];
193
197
  const flexSettings = JSON.parse(flex);
@@ -197,7 +201,7 @@ export async function init({ appUrls, flex }: { appUrls?: string | null; flex?:
197
201
  }
198
202
  sap.ui.require(libs, function (startAdaptation: StartAdaptation, pluginScript?: RTAPlugin) {
199
203
  const options = {
200
- rootControl:view,
204
+ rootControl: view,
201
205
  validateAppVersion: false,
202
206
  flexSettings
203
207
  };
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "bugs": {
10
10
  "url": "https://github.com/SAP/open-ux-tools/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3Apreview-middleware"
11
11
  },
12
- "version": "0.11.19",
12
+ "version": "0.11.21",
13
13
  "license": "Apache-2.0",
14
14
  "author": "@SAP/ux-tools-team",
15
15
  "main": "dist/index.js",
@@ -23,9 +23,9 @@
23
23
  ],
24
24
  "dependencies": {
25
25
  "ejs": "3.1.9",
26
- "@sap-ux/adp-tooling": "0.7.2",
27
26
  "@sap-ux/logger": "0.4.0",
28
- "@sap-ux/control-property-editor-sources": "npm:@sap-ux/control-property-editor@0.4.6"
27
+ "@sap-ux/adp-tooling": "0.7.2",
28
+ "@sap-ux/control-property-editor-sources": "npm:@sap-ux/control-property-editor@0.4.7"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/ejs": "3.1.2",
@@ -38,8 +38,8 @@
38
38
  "supertest": "6.3.3",
39
39
  "@sap-ux-private/playwright": "0.0.1",
40
40
  "dotenv": "16.3.1",
41
- "@private/preview-middleware-client": "npm:@sap-ux-private/preview-middleware-client@0.8.10",
42
- "@sap-ux/project-access": "1.16.1",
41
+ "@private/preview-middleware-client": "npm:@sap-ux-private/preview-middleware-client@0.8.12",
42
+ "@sap-ux/project-access": "1.16.2",
43
43
  "@sap-ux/store": "0.4.0"
44
44
  },
45
45
  "peerDependencies": {