@telia-ace/widget-types-grid 1.0.0

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 (91) hide show
  1. package/LICENSE.txt +6 -0
  2. package/README.md +3 -0
  3. package/lib/component-platform-factory.d.ts +13 -0
  4. package/lib/component-platform-factory.js +105 -0
  5. package/lib/index.d.ts +4 -0
  6. package/lib/index.js +16 -0
  7. package/lib/services.d.ts +7 -0
  8. package/lib/services.js +99 -0
  9. package/lib/site-provider.d.ts +5 -0
  10. package/lib/site-provider.js +18 -0
  11. package/lib/ui/animated-view.d.ts +6 -0
  12. package/lib/ui/animated-view.js +142 -0
  13. package/lib/ui/component.d.ts +18 -0
  14. package/lib/ui/component.js +179 -0
  15. package/lib/ui/detached-component.d.ts +7 -0
  16. package/lib/ui/detached-component.js +73 -0
  17. package/lib/ui/determine-slide-direction.d.ts +26 -0
  18. package/lib/ui/determine-slide-direction.js +51 -0
  19. package/lib/ui/html-element-handlers.d.ts +18 -0
  20. package/lib/ui/html-element-handlers.js +128 -0
  21. package/lib/ui/index.d.ts +6 -0
  22. package/lib/ui/index.js +19 -0
  23. package/lib/ui/not-found.d.ts +6 -0
  24. package/lib/ui/not-found.js +83 -0
  25. package/lib/ui/prepare-dom.d.ts +20 -0
  26. package/lib/ui/prepare-dom.js +122 -0
  27. package/lib/ui/render.d.ts +3 -0
  28. package/lib/ui/render.js +11 -0
  29. package/lib/ui/resolvable-component.d.ts +7 -0
  30. package/lib/ui/resolvable-component.js +87 -0
  31. package/lib/ui/switch.d.ts +11 -0
  32. package/lib/ui/switch.js +58 -0
  33. package/lib/ui/unmount.d.ts +2 -0
  34. package/lib/ui/unmount.js +4 -0
  35. package/lib/ui/use-component-node-properties.d.ts +3 -0
  36. package/lib/ui/use-component-node-properties.js +44 -0
  37. package/lib/ui/use-router.d.ts +4 -0
  38. package/lib/ui/use-router.js +32 -0
  39. package/lib/ui/view-outlet.d.ts +32 -0
  40. package/lib/ui/view-outlet.js +151 -0
  41. package/lib/ui/view.d.ts +6 -0
  42. package/lib/ui/view.js +75 -0
  43. package/lib/ui/wrapper.d.ts +7 -0
  44. package/lib/ui/wrapper.js +108 -0
  45. package/lib/widget.d.ts +54 -0
  46. package/lib/widget.js +554 -0
  47. package/lib-esm/component-platform-factory.d.ts +13 -0
  48. package/lib-esm/component-platform-factory.js +101 -0
  49. package/lib-esm/index.d.ts +4 -0
  50. package/lib-esm/index.js +4 -0
  51. package/lib-esm/services.d.ts +7 -0
  52. package/lib-esm/services.js +67 -0
  53. package/lib-esm/site-provider.d.ts +5 -0
  54. package/lib-esm/site-provider.js +14 -0
  55. package/lib-esm/ui/animated-view.d.ts +6 -0
  56. package/lib-esm/ui/animated-view.js +114 -0
  57. package/lib-esm/ui/component.d.ts +18 -0
  58. package/lib-esm/ui/component.js +150 -0
  59. package/lib-esm/ui/detached-component.d.ts +7 -0
  60. package/lib-esm/ui/detached-component.js +45 -0
  61. package/lib-esm/ui/determine-slide-direction.d.ts +26 -0
  62. package/lib-esm/ui/determine-slide-direction.js +46 -0
  63. package/lib-esm/ui/html-element-handlers.d.ts +18 -0
  64. package/lib-esm/ui/html-element-handlers.js +120 -0
  65. package/lib-esm/ui/index.d.ts +6 -0
  66. package/lib-esm/ui/index.js +6 -0
  67. package/lib-esm/ui/not-found.d.ts +6 -0
  68. package/lib-esm/ui/not-found.js +58 -0
  69. package/lib-esm/ui/prepare-dom.d.ts +20 -0
  70. package/lib-esm/ui/prepare-dom.js +116 -0
  71. package/lib-esm/ui/render.d.ts +3 -0
  72. package/lib-esm/ui/render.js +6 -0
  73. package/lib-esm/ui/resolvable-component.d.ts +7 -0
  74. package/lib-esm/ui/resolvable-component.js +62 -0
  75. package/lib-esm/ui/switch.d.ts +11 -0
  76. package/lib-esm/ui/switch.js +53 -0
  77. package/lib-esm/ui/unmount.d.ts +2 -0
  78. package/lib-esm/ui/unmount.js +2 -0
  79. package/lib-esm/ui/use-component-node-properties.d.ts +3 -0
  80. package/lib-esm/ui/use-component-node-properties.js +42 -0
  81. package/lib-esm/ui/use-router.d.ts +4 -0
  82. package/lib-esm/ui/use-router.js +30 -0
  83. package/lib-esm/ui/view-outlet.d.ts +32 -0
  84. package/lib-esm/ui/view-outlet.js +126 -0
  85. package/lib-esm/ui/view.d.ts +6 -0
  86. package/lib-esm/ui/view.js +70 -0
  87. package/lib-esm/ui/wrapper.d.ts +7 -0
  88. package/lib-esm/ui/wrapper.js +80 -0
  89. package/lib-esm/widget.d.ts +54 -0
  90. package/lib-esm/widget.js +551 -0
  91. package/package.json +52 -0
@@ -0,0 +1,54 @@
1
+ import { WidgetRenderState, WidgetSettings } from '@telia-ace/widget-core';
2
+ import { BootstrappingActivationData } from '@webprovisions/bootstrapping';
3
+ import { Container, EventSubscriptionCancellation, WidgetType } from '@webprovisions/platform';
4
+ import { ViewOutlet } from '././ui/view-outlet';
5
+ export declare enum InitialRenderState {
6
+ Open = "open",
7
+ Closed = "closed",
8
+ Hidden = "hidden",
9
+ Storage = "storage"
10
+ }
11
+ export declare type RenderData = {
12
+ widgetDOMElement?: HTMLElement;
13
+ triggerDOMElement?: HTMLElement;
14
+ key?: string;
15
+ open?: boolean;
16
+ withRenderState?: InitialRenderState;
17
+ };
18
+ export declare type AttachData = {
19
+ widgetDOMElement?: HTMLElement;
20
+ triggerDOMElement?: HTMLElement;
21
+ key?: string;
22
+ withRenderState?: InitialRenderState;
23
+ };
24
+ export default class Widget extends WidgetType {
25
+ outlets: Map<string, ViewOutlet>;
26
+ activated: Promise<void> | undefined;
27
+ subs: EventSubscriptionCancellation[];
28
+ constructor(container: Container);
29
+ handleBootstrapping: (activationData: BootstrappingActivationData) => void;
30
+ initialize(): Promise<void>;
31
+ attach(attachData?: AttachData): any;
32
+ detach(key?: string): void;
33
+ private triggerStateIfApplicable;
34
+ private getOrCreateViewOutlet;
35
+ render(renderData?: RenderData): any;
36
+ activate(data?: any): void;
37
+ setSettings(fn: (settings: WidgetSettings) => Promise<Partial<WidgetSettings>>): Promise<WidgetSettings>;
38
+ clearSettings(): Promise<void>;
39
+ action({ action, value }: {
40
+ action: string;
41
+ value?: any;
42
+ }): Promise<void>;
43
+ renderState(): Promise<WidgetRenderState>;
44
+ hide(): Promise<void>;
45
+ open(): Promise<void>;
46
+ close(): Promise<void>;
47
+ show(): Promise<void>;
48
+ private onAction;
49
+ private setRenderState;
50
+ private onOpen;
51
+ private onClose;
52
+ private setTriggerState;
53
+ deactivate(): Promise<void[]>;
54
+ }
package/lib/widget.js ADDED
@@ -0,0 +1,554 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __read = (this && this.__read) || function (o, n) {
29
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
30
+ if (!m) return o;
31
+ var i = m.call(o), r, ar = [], e;
32
+ try {
33
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
34
+ }
35
+ catch (error) { e = { error: error }; }
36
+ finally {
37
+ try {
38
+ if (r && !r.done && (m = i["return"])) m.call(i);
39
+ }
40
+ finally { if (e) throw e.error; }
41
+ }
42
+ return ar;
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.InitialRenderState = void 0;
46
+ var widget_core_1 = require("@telia-ace/widget-core");
47
+ var widget_routing_1 = require("@telia-ace/widget-routing");
48
+ var widget_services_1 = require("@telia-ace/widget-services");
49
+ var widget_utilities_1 = require("@telia-ace/widget-utilities");
50
+ var bootstrapping_1 = require("@webprovisions/bootstrapping");
51
+ var platform_1 = require("@webprovisions/platform");
52
+ var view_outlet_1 = require("././ui/view-outlet");
53
+ var services_1 = require("./services");
54
+ var html_element_handlers_1 = require("./ui/html-element-handlers");
55
+ var prepare_dom_1 = require("./ui/prepare-dom");
56
+ var SETTINGS_STORAGE_KEY = '$settings';
57
+ var OPEN_STORAGE_KEY = 'open';
58
+ var STICKY_WIDGET_STORAGE_KEY = 'activeStickyWidget';
59
+ var InitialRenderState;
60
+ (function (InitialRenderState) {
61
+ InitialRenderState["Open"] = "open";
62
+ InitialRenderState["Closed"] = "closed";
63
+ InitialRenderState["Hidden"] = "hidden";
64
+ InitialRenderState["Storage"] = "storage";
65
+ })(InitialRenderState = exports.InitialRenderState || (exports.InitialRenderState = {}));
66
+ var Widget = /** @class */ (function (_super) {
67
+ __extends(Widget, _super);
68
+ function Widget(container) {
69
+ var _this = _super.call(this, container) || this;
70
+ _this.outlets = new Map();
71
+ _this.activated = undefined;
72
+ _this.subs = [];
73
+ _this.handleBootstrapping = function (activationData) {
74
+ var options = {
75
+ triggerDOMElement: activationData.sourceDOMElement,
76
+ withRenderState: InitialRenderState.Storage,
77
+ };
78
+ _this.container.get('settings').then(function (settings) {
79
+ var activate = settings.activate;
80
+ var shouldActivate = typeof activate === 'undefined' || activate === null || activate === true;
81
+ if (shouldActivate) {
82
+ _this.activated = (_this.activated || _this.widget.activate()).then(function () {
83
+ return _this.attach(options);
84
+ });
85
+ }
86
+ });
87
+ };
88
+ _this.container.registerAsync('storage', function () { return (0, services_1.createStorageService)(_this.container); });
89
+ _this.container.registerFactory('settings', function () {
90
+ return (0, widget_services_1.readStorage)(_this.container, SETTINGS_STORAGE_KEY, widget_services_1.StorageMedium.Local).then(function (settings) {
91
+ if (settings === void 0) { settings = {}; }
92
+ return __assign(__assign({}, _this.container.get('$settings')), settings);
93
+ });
94
+ });
95
+ (0, bootstrapping_1.supportBootstrapping)(_this, 'load', _this.handleBootstrapping);
96
+ _this.container.registerAsync('componentResolver', function () {
97
+ return (0, services_1.createComponentResolver)(_this.container);
98
+ });
99
+ _this.container.registerAsync('matchingClient', function () { return (0, services_1.createServiceClient)(_this.container); });
100
+ _this.container.registerAsync('router', function () { return (0, services_1.createRoutingService)(_this.container); });
101
+ _this.container.registerAsync('actionResolver', function () { return (0, services_1.createActionResolver)(_this.container); });
102
+ _this.container.register('matchMedia', window.matchMedia);
103
+ _this.container.registerAsync('components', function () { return (0, services_1.createComponentPlatform)(_this.container); });
104
+ return _this;
105
+ }
106
+ Widget.prototype.initialize = function () {
107
+ var _this = this;
108
+ var promises = this.container.getManyAsync('actionResolver', 'router', 'components');
109
+ return Promise.all([promises, this.container.get('settings')]).then(function (_a) {
110
+ var _b;
111
+ var _c = __read(_a, 2), _d = _c[0], actionResolver = _d.actionResolver, router = _d.router, components = _d.components, settings = _c[1];
112
+ actionResolver.subscribe(_this.widget.name, function (origin, action, value) {
113
+ return _this.onAction(action, value);
114
+ });
115
+ var switchViewNodes = function (routeName) {
116
+ components.nodes.query({ type: 'view' }).forEach(function (viewNode) {
117
+ components.setSwitch(viewNode, routeName);
118
+ });
119
+ };
120
+ var initialRoute = ((_b = router.getInitialRoute()) === null || _b === void 0 ? void 0 : _b.name) || 'index';
121
+ switchViewNodes(initialRoute);
122
+ _this.events.subscribe('widget:data-loaded', function (e, _a) {
123
+ var element = _a.element;
124
+ if (_this.widget.container.get('seoConfiguration')) {
125
+ _this.events.dispatch('widget:preloaded-replaced', {
126
+ element: element,
127
+ });
128
+ }
129
+ });
130
+ _this.events.subscribe('router:change', function (e, _a) {
131
+ var _b = _a.previous, previous = _b === void 0 ? { routeData: {} } : _b, _c = _a.next, next = _c === void 0 ? { routeData: {} } : _c;
132
+ var prevData = previous.routeData;
133
+ var nextData = next.routeData;
134
+ var notFoundView = Object.keys(settings.views).reduce(function (acc, key) {
135
+ var view = settings.views[key];
136
+ if (typeof view.path === 'undefined') {
137
+ return key;
138
+ }
139
+ return acc;
140
+ }, '');
141
+ // route not found
142
+ if (!nextData.name && notFoundView) {
143
+ switchViewNodes(notFoundView);
144
+ }
145
+ else {
146
+ switchViewNodes(nextData.name);
147
+ }
148
+ (0, widget_utilities_1.removeNullAndUndefinedValues)(prevData && prevData.params);
149
+ (0, widget_utilities_1.removeNullAndUndefinedValues)(nextData && nextData.params);
150
+ _this.container
151
+ .getAsync('actionResolver')
152
+ .then(function (actionResolver) {
153
+ actionResolver.action(_this.widget.name, 'routeChange', {
154
+ next: nextData,
155
+ previous: prevData,
156
+ });
157
+ });
158
+ });
159
+ return router.initialize();
160
+ });
161
+ };
162
+ Widget.prototype.attach = function (attachData) {
163
+ var _this = this;
164
+ if (attachData === void 0) { attachData = {}; }
165
+ return this.container.get('settings').then(function (_a) {
166
+ var _b, _c;
167
+ var trigger = _a.trigger;
168
+ var widgetDOMElement = attachData.widgetDOMElement, _d = attachData.key, key = _d === void 0 ? (0, widget_utilities_1.uuid)() : _d, triggerDOMElement = attachData.triggerDOMElement, withRenderState = attachData.withRenderState;
169
+ var triggerType = (0, prepare_dom_1.determineTriggerType)(trigger);
170
+ // This could probably be defined already when bootstrapping occurs,
171
+ // Webprovisions knows when a widget is prerendered,
172
+ // see "queryPrerenderedTargets in @webprovisions/bootstrapping"
173
+ var waitWithReplace = triggerType === prepare_dom_1.TriggerType.Inline &&
174
+ ((triggerDOMElement === null || triggerDOMElement === void 0 ? void 0 : triggerDOMElement.childElementCount) || 0) > 0;
175
+ var outletOptions = (0, prepare_dom_1.prepareDOMElements)(_this.widget.name, widgetDOMElement, triggerDOMElement, trigger, waitWithReplace);
176
+ if (_this.outlets.size < 1 && !withRenderState) {
177
+ _this.setRenderState('unset');
178
+ }
179
+ var swap = function () {
180
+ var isReady = function () {
181
+ return widgetDOMElement.querySelectorAll('[data-loading=true]').length === 0;
182
+ };
183
+ var _a = __read(_this.widget.container.get('widgetDOMElements'), 1), widgetDOMElement = _a[0];
184
+ var watcher = function (mutations, observer) {
185
+ if (isReady()) {
186
+ if (outletOptions.callback) {
187
+ outletOptions.callback();
188
+ }
189
+ observer.disconnect();
190
+ }
191
+ };
192
+ var options = {
193
+ attributes: true,
194
+ subtree: true,
195
+ };
196
+ if (isReady()) {
197
+ outletOptions.callback && outletOptions.callback();
198
+ }
199
+ var observer = new MutationObserver(watcher);
200
+ observer.observe(widgetDOMElement, options);
201
+ };
202
+ if (waitWithReplace) {
203
+ _this.widget.container.getAsync('dataClient').then(function (_a) {
204
+ var events = _a.events;
205
+ events.subscribe('data-client:fetched', function (event, data) {
206
+ if (data.unresolvedQueries === 0) {
207
+ swap();
208
+ }
209
+ });
210
+ });
211
+ }
212
+ var outlet = _this.getOrCreateViewOutlet(key, outletOptions);
213
+ _this.outlets.set(key, outlet);
214
+ _this.widget.events.dispatch('widget:attached', {}, { bubbles: true });
215
+ if (outletOptions.triggerType === prepare_dom_1.TriggerType.Badge && trigger) {
216
+ (_b = outletOptions.triggerDOMElement) === null || _b === void 0 ? void 0 : _b.setAttribute('aria-expanded', 'false');
217
+ outlet === null || outlet === void 0 ? void 0 : outlet.renderBadge(trigger);
218
+ }
219
+ if (outletOptions.triggerType !== prepare_dom_1.TriggerType.Inline) {
220
+ (_c = outletOptions.triggerDOMElement) === null || _c === void 0 ? void 0 : _c.addEventListener('click', function (event) {
221
+ event.preventDefault();
222
+ _this.container
223
+ .get('settings')
224
+ .then(function (_a) {
225
+ var updatedTrigger = _a.trigger;
226
+ outlet
227
+ .render()
228
+ .then(function () { return _this.renderState(); })
229
+ .then(function (renderState) {
230
+ if (updatedTrigger &&
231
+ updatedTrigger.action &&
232
+ updatedTrigger.action === 'hide') {
233
+ return renderState === widget_core_1.WidgetRenderState.open
234
+ ? _this.hide()
235
+ : _this.open();
236
+ }
237
+ return renderState === widget_core_1.WidgetRenderState.open
238
+ ? _this.close()
239
+ : _this.open();
240
+ });
241
+ });
242
+ });
243
+ }
244
+ if (_this.outlets.size > 1) {
245
+ return _this.renderState().then(function (state) {
246
+ // new outlets should have the same state as existing ones
247
+ _this.triggerStateIfApplicable(state);
248
+ });
249
+ }
250
+ if (withRenderState) {
251
+ if (withRenderState === InitialRenderState.Storage) {
252
+ return _this.renderState().then(function (state) {
253
+ if (outletOptions.triggerType === prepare_dom_1.TriggerType.Inline) {
254
+ _this.triggerStateIfApplicable('open');
255
+ return;
256
+ }
257
+ _this.triggerStateIfApplicable(state);
258
+ });
259
+ }
260
+ return _this.triggerStateIfApplicable(withRenderState);
261
+ }
262
+ });
263
+ };
264
+ Widget.prototype.detach = function (key) {
265
+ if (key) {
266
+ if (this.outlets.has(key)) {
267
+ var outlet = this.outlets.get(key);
268
+ outlet === null || outlet === void 0 ? void 0 : outlet.dispose();
269
+ this.outlets.delete(key);
270
+ return;
271
+ }
272
+ if (process.env.NODE_ENV !== 'production') {
273
+ console.warn("detach(): Could not find View Outlet with key ".concat(key));
274
+ }
275
+ return;
276
+ }
277
+ this.outlets.forEach(function (outlet) {
278
+ outlet.dispose();
279
+ });
280
+ this.outlets.clear();
281
+ };
282
+ Widget.prototype.triggerStateIfApplicable = function (input) {
283
+ var _this = this;
284
+ return this.container.getAsync('router').then(function (router) {
285
+ switch (input) {
286
+ case 'closed':
287
+ _this.close();
288
+ break;
289
+ case 'open':
290
+ _this.open();
291
+ break;
292
+ case 'hidden':
293
+ _this.hide();
294
+ router.start();
295
+ break;
296
+ default:
297
+ return;
298
+ }
299
+ });
300
+ };
301
+ Widget.prototype.getOrCreateViewOutlet = function (key, options) {
302
+ return (this.outlets.has(key) ? this.outlets.get(key) : new view_outlet_1.ViewOutlet(this.container, options));
303
+ };
304
+ Widget.prototype.render = function (renderData) {
305
+ if (renderData === void 0) { renderData = {}; }
306
+ if (process.env.NODE_ENV !== 'production') {
307
+ console.warn('widget.render() is deprecated. Use widget.attach() instead.');
308
+ }
309
+ if (renderData.open) {
310
+ var options = __assign(__assign({}, renderData), { withRenderState: InitialRenderState.Open });
311
+ return this.attach(options);
312
+ }
313
+ return this.attach(renderData);
314
+ };
315
+ Widget.prototype.activate = function (data) {
316
+ if (data === null || data === void 0 ? void 0 : data.override) {
317
+ this.setSettings(function () { return data.override; });
318
+ }
319
+ // TODO: this is considered a hack, remove apiNotificationPriorityBy
320
+ // when there is a better way to get notifications from backend
321
+ if (data === null || data === void 0 ? void 0 : data.apiNotificationPriorityBy) {
322
+ this.container.register('apiNotificationPriorityBy', data.apiNotificationPriorityBy);
323
+ }
324
+ };
325
+ Widget.prototype.setSettings = function (fn) {
326
+ var _this = this;
327
+ return Promise.all([
328
+ this.container.get('settings'),
329
+ (0, widget_services_1.createStorageWriter)(this.container, SETTINGS_STORAGE_KEY, widget_services_1.StorageCategory.Necessary, {
330
+ medium: widget_services_1.StorageMedium.Local,
331
+ }),
332
+ ]).then(function (_a) {
333
+ var _b = __read(_a, 2), settings = _b[0], write = _b[1];
334
+ return Promise.resolve(fn(settings)).then(function (override) {
335
+ return write(override).then(function () {
336
+ var updated = __assign(__assign({}, settings), override);
337
+ _this.widget.events.dispatch('widget:settings-updated', updated);
338
+ return updated;
339
+ });
340
+ });
341
+ });
342
+ };
343
+ Widget.prototype.clearSettings = function () {
344
+ var _this = this;
345
+ return (0, widget_services_1.createStorageWriter)(this.container, SETTINGS_STORAGE_KEY, widget_services_1.StorageCategory.Necessary, { medium: widget_services_1.StorageMedium.Local })
346
+ .then(function (write) { return write(); })
347
+ .then(function () { return _this.container.get('settings'); })
348
+ .then(function (settings) {
349
+ _this.widget.events.dispatch('widget:settings-updated', settings);
350
+ });
351
+ };
352
+ Widget.prototype.action = function (_a) {
353
+ var _this = this;
354
+ var action = _a.action, value = _a.value;
355
+ return this.container.getAsync('actionResolver').then(function (actionResolver) {
356
+ actionResolver.action(_this.widget.name, action, value);
357
+ });
358
+ };
359
+ Widget.prototype.renderState = function () {
360
+ var _this = this;
361
+ if ((0, widget_routing_1.onWidgetUrl)(this.container)) {
362
+ return Promise.resolve(widget_core_1.WidgetRenderState.open);
363
+ }
364
+ var readSessionOpen = function () {
365
+ return (0, widget_services_1.readStorage)(_this.container, OPEN_STORAGE_KEY, widget_services_1.StorageMedium.Session).then(function (value) {
366
+ if (value === void 0) { value = widget_core_1.WidgetRenderState.closed; }
367
+ return value;
368
+ });
369
+ };
370
+ var readLocalOpen = function () {
371
+ return (0, widget_services_1.readStorage)(_this.container, OPEN_STORAGE_KEY, widget_services_1.StorageMedium.Session).then(function (value) {
372
+ if (value === void 0) { value = widget_core_1.WidgetRenderState.closed; }
373
+ return value;
374
+ });
375
+ };
376
+ return this.container.getAsync('router').then(function (routing) {
377
+ if (routing.isSticky()) {
378
+ return readLocalOpen().then(function (localOpen) {
379
+ return localOpen === widget_core_1.WidgetRenderState.open ? localOpen : readSessionOpen();
380
+ });
381
+ }
382
+ return readSessionOpen();
383
+ });
384
+ };
385
+ Widget.prototype.hide = function () {
386
+ var _this = this;
387
+ if (this.outlets.size < 1) {
388
+ if (process.env.NODE_ENV !== 'production') {
389
+ console.warn('hide(): No-op as no view outlets are registered. Invoke the attach() command first.');
390
+ }
391
+ return Promise.resolve();
392
+ }
393
+ this.outlets.forEach(function (outlet) { return outlet.render(); });
394
+ return this.action({ action: 'hide' }).then(function () {
395
+ _this.setTriggerState(false);
396
+ });
397
+ };
398
+ Widget.prototype.open = function () {
399
+ var _this = this;
400
+ if (this.outlets.size < 1) {
401
+ if (process.env.NODE_ENV !== 'production') {
402
+ console.warn('open(): No-op as no view outlets are registered. Invoke the attach() command first.');
403
+ }
404
+ return Promise.resolve();
405
+ }
406
+ this.outlets.forEach(function (outlet) { return outlet.render(); });
407
+ return this.action({ action: 'open' }).then(function () {
408
+ _this.widget.events.dispatch('tracking:widget-rendered', {});
409
+ return _this.onOpen();
410
+ });
411
+ };
412
+ Widget.prototype.close = function () {
413
+ var _this = this;
414
+ if (this.outlets.size < 1) {
415
+ if (process.env.NODE_ENV !== 'production') {
416
+ console.warn('close(): No-op as no view outlets are registered. Invoke the attach() command first.');
417
+ }
418
+ return Promise.resolve();
419
+ }
420
+ return this.action({ action: 'close' }).then(function () { return _this.onClose(); });
421
+ };
422
+ Widget.prototype.show = function () {
423
+ if (process.env.NODE_ENV !== 'production') {
424
+ console.warn('show(): Command is deprecated and will be removed in the future. Use open() instead.');
425
+ }
426
+ return this.open();
427
+ };
428
+ Widget.prototype.onAction = function (action, value) {
429
+ var _this = this;
430
+ switch (action) {
431
+ case 'close':
432
+ case 'open':
433
+ case 'hide':
434
+ var newState_1 = action === 'open'
435
+ ? widget_core_1.WidgetRenderState.open
436
+ : action === 'close'
437
+ ? widget_core_1.WidgetRenderState.closed
438
+ : widget_core_1.WidgetRenderState.hidden;
439
+ return this.setRenderState(newState_1).then(function () {
440
+ _this.setTriggerState(newState_1 === widget_core_1.WidgetRenderState.open);
441
+ if (newState_1 !== widget_core_1.WidgetRenderState.hidden) {
442
+ newState_1 === widget_core_1.WidgetRenderState.open ? _this.onOpen() : _this.onClose();
443
+ }
444
+ else {
445
+ _this.outlets.forEach(function (outlet) { var _a; return (_a = outlet.options.triggerDOMElement) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'false'); });
446
+ }
447
+ });
448
+ }
449
+ };
450
+ Widget.prototype.setRenderState = function (newState) {
451
+ var _a = this.container.get('$widget'), invoke = _a.invoke, events = _a.events;
452
+ return Promise.all([
453
+ (0, widget_services_1.createStorageWriter)(this.container, OPEN_STORAGE_KEY, widget_services_1.StorageCategory.Necessary, {
454
+ medium: widget_services_1.StorageMedium.Session,
455
+ }),
456
+ (0, widget_services_1.createStorageWriter)(this.container, OPEN_STORAGE_KEY, widget_services_1.StorageCategory.Necessary, {
457
+ medium: widget_services_1.StorageMedium.Local,
458
+ duration: { minutes: 5 },
459
+ }),
460
+ this.container.getAsync('router'),
461
+ invoke('renderState'),
462
+ ]).then(function (_a) {
463
+ var _b = __read(_a, 4), writeSessionOpen = _b[0], writeLocalOpen = _b[1], routing = _b[2], previousRenderState = _b[3];
464
+ if (newState === 'unset' || !newState) {
465
+ writeLocalOpen();
466
+ writeSessionOpen();
467
+ }
468
+ else {
469
+ if (routing.isSticky()) {
470
+ writeLocalOpen(newState);
471
+ }
472
+ writeSessionOpen(newState);
473
+ }
474
+ events.dispatch('widget:render-state-changed', {
475
+ previous: previousRenderState,
476
+ next: newState,
477
+ });
478
+ });
479
+ };
480
+ Widget.prototype.onOpen = function () {
481
+ var _this = this;
482
+ return this.container.getAsync('router').then(function (router) {
483
+ _this.outlets.forEach(function (outlet) { var _a; return (_a = outlet.options.triggerDOMElement) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'true'); });
484
+ return router.start();
485
+ });
486
+ };
487
+ Widget.prototype.onClose = function () {
488
+ var _this = this;
489
+ var services = this.container.getManyAsync('router', 'components');
490
+ var resetActivateProp = function () {
491
+ return _this.container.get('settings').then(function (widgetSettings) {
492
+ var activate = _this.container.get('$settings').activate;
493
+ if (widgetSettings.activate !== activate) {
494
+ return _this.setSettings(function () { return Promise.resolve({ activate: activate }); });
495
+ }
496
+ return Promise.resolve();
497
+ });
498
+ };
499
+ return resetActivateProp()
500
+ .then(function () {
501
+ return services;
502
+ })
503
+ .then(function (_a) {
504
+ var router = _a.router, components = _a.components;
505
+ var visibleNodes = components.nodes.visible;
506
+ _this.outlets.forEach(function (outlet) { var _a; return (_a = outlet.options.triggerDOMElement) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-expanded', 'false'); });
507
+ if (visibleNodes.filter(function (c) {
508
+ return c.attributes.properties.animation &&
509
+ c.attributes.properties.animation !== 'none';
510
+ }).length) {
511
+ return new Promise(function (resolve) {
512
+ setTimeout(function () {
513
+ resolve(router);
514
+ }, 200);
515
+ });
516
+ }
517
+ return Promise.resolve(router);
518
+ })
519
+ .then(function (router) { return router.stop(); });
520
+ };
521
+ Widget.prototype.setTriggerState = function (open) {
522
+ this.outlets.forEach(function (outlet) {
523
+ var _a = outlet.options, triggerDOMElement = _a.triggerDOMElement, triggerOptions = _a.triggerOptions;
524
+ var _b = triggerOptions || {}, openTooltip = _b.openTooltip, closedTooltip = _b.closedTooltip;
525
+ if (triggerDOMElement) {
526
+ open
527
+ ? (0, html_element_handlers_1.setActive)(triggerDOMElement, openTooltip)
528
+ : (0, html_element_handlers_1.setInactive)(triggerDOMElement, closedTooltip);
529
+ }
530
+ });
531
+ };
532
+ Widget.prototype.deactivate = function () {
533
+ var _this = this;
534
+ this.subs.forEach(function (s) { return s(); });
535
+ var promises = [];
536
+ this.outlets.forEach(function (outlet) { return promises.push(outlet.dispose()); });
537
+ return (0, widget_services_1.readStorage)(this.container, STICKY_WIDGET_STORAGE_KEY, widget_services_1.StorageMedium.Local).then(function (value) {
538
+ /**
539
+ * Remove stored sticky widget from implementation's localStorage if applicable
540
+ */
541
+ if (value === _this.widget.name) {
542
+ return (0, widget_services_1.createStorageWriter)(_this.container, STICKY_WIDGET_STORAGE_KEY, widget_services_1.StorageCategory.Necessary, {
543
+ medium: widget_services_1.StorageMedium.Local,
544
+ scope: widget_services_1.StorageScope.Implementation,
545
+ })
546
+ .then(function (write) { return write(); })
547
+ .then(function () { return Promise.all(promises); });
548
+ }
549
+ return Promise.all(promises);
550
+ });
551
+ };
552
+ return Widget;
553
+ }(platform_1.WidgetType));
554
+ exports.default = Widget;
@@ -0,0 +1,13 @@
1
+ import { ChangesetOptions, ChangesetProvider, ComponentNodeSettings, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';
2
+ import { StorageWriter } from '@telia-ace/widget-services';
3
+ import { Container, Widget } from '@webprovisions/platform';
4
+ export declare class LocalStorageChangesetProvider implements ChangesetProvider {
5
+ private container;
6
+ private storageWriter;
7
+ constructor(container: Container, storageWriter: StorageWriter);
8
+ static create(container: Container): Promise<LocalStorageChangesetProvider>;
9
+ write(key: string, target: ComponentQuery, attributes: Partial<ComponentNodeSettings>, options: ChangesetOptions): Promise<any>;
10
+ remove(key: string): Promise<any>;
11
+ load(platform: ComponentPlatform): Promise<any>;
12
+ }
13
+ export declare const createPlatform: (widget: Widget) => Promise<ComponentPlatform>;