@vc-shell/framework 1.1.54 → 1.1.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [1.1.55](https://github.com/VirtoCommerce/vc-shell/compare/v1.1.54...v1.1.55) (2025-07-07)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **vc-blade-toolbar:** adjust spacing in 'more' button for improved layout consistency ([2075e5b](https://github.com/VirtoCommerce/vc-shell/commit/2075e5b37b351a89d9aa1a7dde01dd939e76a212))
7
+
8
+
9
+ ### Features
10
+
11
+ * **widget-service:** add external widget registration functionality and enhance widget management ([cd35c9b](https://github.com/VirtoCommerce/vc-shell/commit/cd35c9b50bf44af8f466dc6a2d4ce29ad01e9514))
12
+
13
+
14
+
1
15
  ## [1.1.54](https://github.com/VirtoCommerce/vc-shell/compare/v1.1.53...v1.1.54) (2025-07-07)
2
16
 
3
17
 
@@ -1,5 +1,10 @@
1
1
  import { getCurrentInstance, inject, provide } from "vue";
2
- import { createWidgetService, IWidgetService, registerWidget } from "./../../services/widget-service";
2
+ import {
3
+ createWidgetService,
4
+ IWidgetService,
5
+ registerWidget,
6
+ registerExternalWidget,
7
+ } from "./../../services/widget-service";
3
8
  import { WidgetServiceKey } from "./../../../injection-keys";
4
9
 
5
10
  export function provideWidgetService(): IWidgetService {
@@ -17,4 +22,4 @@ export function useWidgets(): IWidgetService {
17
22
  return service;
18
23
  }
19
24
 
20
- export { registerWidget };
25
+ export { registerWidget, registerExternalWidget };
@@ -11,11 +11,23 @@ export interface IExposedWidget {
11
11
  [key: string]: unknown;
12
12
  }
13
13
 
14
+ export interface IWidgetConfig {
15
+ // Required data that the widget MUST receive
16
+ requiredData?: string[];
17
+ // Optional data that the widget can use if available
18
+ optionalData?: string[];
19
+ // Function to transform blade data into widget props
20
+ propsResolver?: (bladeData: Record<string, unknown>) => Record<string, unknown>;
21
+ // Field mapping (if names in blade and widget differ)
22
+ fieldMapping?: Record<string, string>;
23
+ }
24
+
14
25
  export interface IWidget {
15
26
  id: string;
16
27
  title?: string;
17
28
  component: Component;
18
29
  props?: Record<string, unknown>;
30
+ config?: IWidgetConfig;
19
31
  events?: Record<string, unknown>;
20
32
  isVisible?: boolean | ComputedRef<boolean> | Ref<boolean> | ((blade?: IBladeInstance) => boolean);
21
33
  updateFunctionName?: string;
@@ -26,6 +38,17 @@ export interface IWidgetRegistration {
26
38
  widget: IWidget;
27
39
  }
28
40
 
41
+ // Interface for global registration of external widgets
42
+ export interface IExternalWidgetRegistration {
43
+ id: string;
44
+ component: Component;
45
+ config: IWidgetConfig;
46
+ targetBlades?: string[]; // For which blades is the widget intended
47
+ isVisible?: boolean | ComputedRef<boolean> | Ref<boolean> | ((blade?: IBladeInstance) => boolean);
48
+ title?: string;
49
+ updateFunctionName?: string;
50
+ }
51
+
29
52
  export interface IWidgetService {
30
53
  registerWidget: (widget: IWidget, bladeId: string) => void;
31
54
  unregisterWidget: (widgetId: string, bladeId: string) => void;
@@ -37,12 +60,17 @@ export interface IWidgetService {
37
60
  updateActiveWidget: () => void;
38
61
  isWidgetRegistered: (id: string) => boolean;
39
62
  updateWidget: ({ id, bladeId, widget }: { id: string; bladeId: string; widget: Partial<IWidget> }) => void;
63
+ resolveWidgetProps: (widget: IWidget, bladeData: Record<string, unknown>) => Record<string, unknown>;
64
+ getExternalWidgetsForBlade: (bladeType: string) => IExternalWidgetRegistration[];
40
65
  }
41
66
 
42
67
  // Global state for pre-registering widgets
43
68
  const preregisteredWidgets: IWidgetRegistration[] = [];
44
69
  const preregisteredIds = new Set<string>();
45
70
 
71
+ // Global state for external widgets
72
+ const externalWidgets: IExternalWidgetRegistration[] = [];
73
+
46
74
  /**
47
75
  * Registers a widget before the service is initialized
48
76
  */
@@ -52,6 +80,20 @@ export function registerWidget(widget: IWidget, bladeId: string): void {
52
80
  preregisteredIds.add(widget.id);
53
81
  }
54
82
 
83
+ /**
84
+ * Registers an external widget for use across different blades
85
+ */
86
+ export function registerExternalWidget(widget: IExternalWidgetRegistration): void {
87
+ externalWidgets.push(widget);
88
+ }
89
+
90
+ /**
91
+ * Gets list of external widgets for a specific blade type
92
+ */
93
+ export function getExternalWidgetsForBlade(bladeType: string): IExternalWidgetRegistration[] {
94
+ return externalWidgets.filter((widget) => !widget.targetBlades || widget.targetBlades.includes(bladeType));
95
+ }
96
+
55
97
  export function createWidgetService(): IWidgetService {
56
98
  const widgetRegistry = reactive<Record<string, IWidget[]>>({});
57
99
  const registeredWidgets = reactive<IWidgetRegistration[]>([]);
@@ -73,6 +115,49 @@ export function createWidgetService(): IWidgetService {
73
115
  }
74
116
  };
75
117
 
118
+ // Add method to resolve props
119
+ const resolveWidgetProps = (widget: IWidget, bladeData: Record<string, unknown>): Record<string, unknown> => {
120
+ // If no configuration, return existing props or empty object
121
+ if (!widget.config) {
122
+ return widget.props || {};
123
+ }
124
+
125
+ let resolvedProps: Record<string, unknown> = { ...widget.props };
126
+
127
+ // If there is a custom resolver
128
+ if (widget.config.propsResolver) {
129
+ try {
130
+ const customProps = widget.config.propsResolver(bladeData);
131
+ resolvedProps = { ...resolvedProps, ...customProps };
132
+ } catch (error) {
133
+ console.error(`Error in propsResolver for widget '${widget.id}':`, error);
134
+ }
135
+ } else {
136
+ // Standard logic for resolving props
137
+ const { requiredData = [], optionalData = [], fieldMapping = {} } = widget.config;
138
+
139
+ // Add required data
140
+ requiredData.forEach((key) => {
141
+ const bladeKey = fieldMapping[key] || key;
142
+ if (bladeData[bladeKey] !== undefined) {
143
+ resolvedProps[key] = bladeData[bladeKey];
144
+ } else {
145
+ console.warn(`Required data '${key}' not found in blade data for widget '${widget.id}'`);
146
+ }
147
+ });
148
+
149
+ // Add optional data
150
+ optionalData.forEach((key) => {
151
+ const bladeKey = fieldMapping[key] || key;
152
+ if (bladeData[bladeKey] !== undefined) {
153
+ resolvedProps[key] = bladeData[bladeKey];
154
+ }
155
+ });
156
+ }
157
+
158
+ return resolvedProps;
159
+ };
160
+
76
161
  const updateWidget = ({ id, bladeId, widget }: { id: string; bladeId: string; widget: Partial<IWidget> }): void => {
77
162
  const normalizedBladeId = bladeId.toLowerCase();
78
163
 
@@ -170,6 +255,10 @@ export function createWidgetService(): IWidgetService {
170
255
  return activeWidget.value?.widgetId === id;
171
256
  };
172
257
 
258
+ const getExternalWidgetsForBladeLocal = (bladeType: string): IExternalWidgetRegistration[] => {
259
+ return getExternalWidgetsForBlade(bladeType);
260
+ };
261
+
173
262
  preregisteredWidgets.forEach((widget) => {
174
263
  try {
175
264
  registerWidget(widget.widget, widget.bladeId);
@@ -189,5 +278,7 @@ export function createWidgetService(): IWidgetService {
189
278
  updateActiveWidget,
190
279
  isWidgetRegistered,
191
280
  updateWidget,
281
+ resolveWidgetProps,
282
+ getExternalWidgetsForBlade: getExternalWidgetsForBladeLocal,
192
283
  };
193
284
  }
@@ -1,5 +1,5 @@
1
- import { IWidgetService, registerWidget } from "./../../services/widget-service";
1
+ import { IWidgetService, registerWidget, registerExternalWidget } from "./../../services/widget-service";
2
2
  export declare function provideWidgetService(): IWidgetService;
3
3
  export declare function useWidgets(): IWidgetService;
4
- export { registerWidget };
4
+ export { registerWidget, registerExternalWidget };
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useWidgets/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,cAAc,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtG,wBAAgB,oBAAoB,IAAI,cAAc,CAIrD;AAED,wBAAgB,UAAU,IAAI,cAAc,CAO3C;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/composables/useWidgets/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,cAAc,EACd,cAAc,EACd,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAGzC,wBAAgB,oBAAoB,IAAI,cAAc,CAIrD;AAED,wBAAgB,UAAU,IAAI,cAAc,CAO3C;AAED,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC"}
@@ -8,11 +8,18 @@ export interface IExposedWidget {
8
8
  id?: string;
9
9
  [key: string]: unknown;
10
10
  }
11
+ export interface IWidgetConfig {
12
+ requiredData?: string[];
13
+ optionalData?: string[];
14
+ propsResolver?: (bladeData: Record<string, unknown>) => Record<string, unknown>;
15
+ fieldMapping?: Record<string, string>;
16
+ }
11
17
  export interface IWidget {
12
18
  id: string;
13
19
  title?: string;
14
20
  component: Component;
15
21
  props?: Record<string, unknown>;
22
+ config?: IWidgetConfig;
16
23
  events?: Record<string, unknown>;
17
24
  isVisible?: boolean | ComputedRef<boolean> | Ref<boolean> | ((blade?: IBladeInstance) => boolean);
18
25
  updateFunctionName?: string;
@@ -21,6 +28,15 @@ export interface IWidgetRegistration {
21
28
  bladeId: string;
22
29
  widget: IWidget;
23
30
  }
31
+ export interface IExternalWidgetRegistration {
32
+ id: string;
33
+ component: Component;
34
+ config: IWidgetConfig;
35
+ targetBlades?: string[];
36
+ isVisible?: boolean | ComputedRef<boolean> | Ref<boolean> | ((blade?: IBladeInstance) => boolean);
37
+ title?: string;
38
+ updateFunctionName?: string;
39
+ }
24
40
  export interface IWidgetService {
25
41
  registerWidget: (widget: IWidget, bladeId: string) => void;
26
42
  unregisterWidget: (widgetId: string, bladeId: string) => void;
@@ -39,10 +55,20 @@ export interface IWidgetService {
39
55
  bladeId: string;
40
56
  widget: Partial<IWidget>;
41
57
  }) => void;
58
+ resolveWidgetProps: (widget: IWidget, bladeData: Record<string, unknown>) => Record<string, unknown>;
59
+ getExternalWidgetsForBlade: (bladeType: string) => IExternalWidgetRegistration[];
42
60
  }
43
61
  /**
44
62
  * Registers a widget before the service is initialized
45
63
  */
46
64
  export declare function registerWidget(widget: IWidget, bladeId: string): void;
65
+ /**
66
+ * Registers an external widget for use across different blades
67
+ */
68
+ export declare function registerExternalWidget(widget: IExternalWidgetRegistration): void;
69
+ /**
70
+ * Gets list of external widgets for a specific blade type
71
+ */
72
+ export declare function getExternalWidgetsForBlade(bladeType: string): IExternalWidgetRegistration[];
47
73
  export declare function createWidgetService(): IWidgetService;
48
74
  //# sourceMappingURL=widget-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget-service.d.ts","sourceRoot":"","sources":["../../../core/services/widget-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,yBAAyB,EAAE,WAAW,EAAE,GAAG,EAAsB,MAAM,KAAK,CAAC;AAChH,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAEhF,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC;CACxC;AACD,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC;IAClG,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;IAC3C,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,mBAAmB,EAAE,CAAC;IACzC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAAE,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtH,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5G;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED,wBAAgB,mBAAmB,IAAI,cAAc,CA0IpD"}
1
+ {"version":3,"file":"widget-service.d.ts","sourceRoot":"","sources":["../../../core/services/widget-service.ts"],"names":[],"mappings":"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"}