@telia-ace/widget-runtime-flamingo 1.1.2 → 1.1.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.
- package/component-platform-factory.d.ts +13 -0
- package/context/children.context.d.ts +4 -0
- package/context/component-node.context.d.ts +4 -0
- package/context/container.context.d.ts +4 -0
- package/context/context.context.d.ts +3 -0
- package/context/layout.context.d.ts +3 -0
- package/context/properties.context.d.ts +3 -0
- package/controllers/actions-controller.d.ts +14 -0
- package/core/create-lit-component.d.ts +11 -0
- package/core/get-render-state.d.ts +4 -0
- package/data-provider/data-provider.d.ts +24 -0
- package/data-provider/providers/guide-provider.plugin.d.ts +2 -0
- package/index-4be3f206.mjs +3409 -0
- package/index-5087564d.mjs +335 -0
- package/index-6dd00f59.js +1 -0
- package/index-e07bd0fb.js +206 -0
- package/{src/index.ts → index.d.ts} +1 -13
- package/index.js +1 -0
- package/index.mjs +17 -0
- package/mixins/widget-component.mixin.d.ts +24 -0
- package/package.json +1 -1
- package/render-049911af.mjs +458 -0
- package/render-f343a6c5.js +120 -0
- package/services.d.ts +5 -0
- package/ui/area.d.ts +9 -0
- package/ui/branding.d.ts +1 -0
- package/ui/get-css-props.d.ts +5 -0
- package/ui/get-layout-props.d.ts +9 -0
- package/ui/html-element-handlers.d.ts +14 -0
- package/ui/prepare-dom.d.ts +21 -0
- package/ui/render.d.ts +3 -0
- package/ui/trigger-component.d.ts +20 -0
- package/ui/view-outlet.d.ts +36 -0
- package/ui/wrapper.d.ts +21 -0
- package/widget.d.ts +54 -0
- package/.eslintrc.json +0 -30
- package/README.md +0 -11
- package/project.json +0 -48
- package/src/component-platform-factory.ts +0 -163
- package/src/context/children.context.ts +0 -4
- package/src/context/component-node.context.ts +0 -6
- package/src/context/container.context.ts +0 -6
- package/src/context/context.context.ts +0 -3
- package/src/context/layout.context.ts +0 -3
- package/src/context/properties.context.ts +0 -3
- package/src/controllers/actions-controller.ts +0 -55
- package/src/core/create-lit-component.ts +0 -31
- package/src/core/get-render-state.ts +0 -25
- package/src/data-provider/data-provider.ts +0 -87
- package/src/data-provider/providers/guide-provider.plugin.ts +0 -64
- package/src/declaration.d.ts +0 -2
- package/src/mixins/widget-component.mixin.ts +0 -231
- package/src/services.ts +0 -27
- package/src/ui/area.ts +0 -97
- package/src/ui/branding.ts +0 -25
- package/src/ui/get-css-props.ts +0 -23
- package/src/ui/get-layout-props.ts +0 -41
- package/src/ui/html-element-handlers.ts +0 -140
- package/src/ui/index.ts +0 -6
- package/src/ui/prepare-dom.ts +0 -164
- package/src/ui/render.ts +0 -19
- package/src/ui/trigger-component.ts +0 -200
- package/src/ui/view-outlet.ts +0 -172
- package/src/ui/wrapper.ts +0 -247
- package/src/vite.env.d.ts +0 -1
- package/src/widget.ts +0 -748
- package/tsconfig.json +0 -23
- package/tsconfig.lib.json +0 -10
- package/tsconfig.spec.json +0 -19
- package/vite.config.ts +0 -56
package/src/ui/prepare-dom.ts
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { ViewOutletOptions } from './view-outlet';
|
|
2
|
-
import { TriggerComponent } from './trigger-component';
|
|
3
|
-
import { Container } from '@webprovisions/platform';
|
|
4
|
-
|
|
5
|
-
enum ProvidedElements {
|
|
6
|
-
None = 'none',
|
|
7
|
-
WidgetDOM = 'widgetDOM',
|
|
8
|
-
TriggerDOM = 'triggerDOM',
|
|
9
|
-
Both = 'both',
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export enum TriggerType {
|
|
13
|
-
Inline = 'inline',
|
|
14
|
-
Link = 'link',
|
|
15
|
-
Badge = 'badge',
|
|
16
|
-
Unsupported = 'unsupported',
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const determineProvidedElements = (
|
|
20
|
-
widgetDOMElement?: HTMLElement,
|
|
21
|
-
triggerDOMElement?: HTMLElement
|
|
22
|
-
): ProvidedElements => {
|
|
23
|
-
if (widgetDOMElement && triggerDOMElement) {
|
|
24
|
-
return ProvidedElements.Both;
|
|
25
|
-
}
|
|
26
|
-
if (widgetDOMElement) {
|
|
27
|
-
return ProvidedElements.WidgetDOM;
|
|
28
|
-
}
|
|
29
|
-
if (triggerDOMElement) {
|
|
30
|
-
return ProvidedElements.TriggerDOM;
|
|
31
|
-
}
|
|
32
|
-
return ProvidedElements.None;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export const determineTriggerType = (triggerDefinition?: any) => {
|
|
36
|
-
if (!triggerDefinition) {
|
|
37
|
-
return TriggerType.Inline;
|
|
38
|
-
}
|
|
39
|
-
if (typeof triggerDefinition === 'boolean' && triggerDefinition) {
|
|
40
|
-
return TriggerType.Link;
|
|
41
|
-
}
|
|
42
|
-
if (
|
|
43
|
-
typeof triggerDefinition === 'object' &&
|
|
44
|
-
!Array.isArray(triggerDefinition)
|
|
45
|
-
) {
|
|
46
|
-
return TriggerType.Badge;
|
|
47
|
-
}
|
|
48
|
-
return TriggerType.Unsupported;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
type PrepareDOMElementsOutput = ViewOutletOptions & {
|
|
52
|
-
callback?: () => void;
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export const prepareDOMElements = async (
|
|
56
|
-
container: Container,
|
|
57
|
-
name: string,
|
|
58
|
-
providedWidgetElement?: HTMLElement,
|
|
59
|
-
providedTriggerElement?: HTMLElement,
|
|
60
|
-
triggerDefinition?: any,
|
|
61
|
-
waitWithReplace = false
|
|
62
|
-
): Promise<PrepareDOMElementsOutput> => {
|
|
63
|
-
const providedElements = determineProvidedElements(
|
|
64
|
-
providedWidgetElement,
|
|
65
|
-
providedTriggerElement
|
|
66
|
-
);
|
|
67
|
-
const triggerType = determineTriggerType(triggerDefinition);
|
|
68
|
-
|
|
69
|
-
const cachedOriginals = {
|
|
70
|
-
widgetDOMElement: providedWidgetElement
|
|
71
|
-
? providedWidgetElement.cloneNode(true)
|
|
72
|
-
: undefined,
|
|
73
|
-
triggerDOMElement: providedTriggerElement
|
|
74
|
-
? providedTriggerElement.cloneNode(true)
|
|
75
|
-
: undefined,
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const output: PrepareDOMElementsOutput = {
|
|
79
|
-
triggerType,
|
|
80
|
-
cachedOriginals,
|
|
81
|
-
widgetDOMElement: document.createElement('div'),
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
switch (providedElements) {
|
|
85
|
-
case ProvidedElements.Both: {
|
|
86
|
-
output.widgetDOMElement =
|
|
87
|
-
providedWidgetElement || document.createElement('div');
|
|
88
|
-
if (triggerType !== TriggerType.Inline) {
|
|
89
|
-
output.triggerDOMElement = providedTriggerElement;
|
|
90
|
-
}
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
case ProvidedElements.WidgetDOM: {
|
|
94
|
-
output.widgetDOMElement =
|
|
95
|
-
providedWidgetElement || document.createElement('div');
|
|
96
|
-
if (triggerType !== TriggerType.Inline) {
|
|
97
|
-
const triggerElement = document.body.appendChild(
|
|
98
|
-
document.createElement('a')
|
|
99
|
-
);
|
|
100
|
-
if (triggerType === TriggerType.Link) {
|
|
101
|
-
triggerElement.innerText = name;
|
|
102
|
-
}
|
|
103
|
-
output.triggerDOMElement = triggerElement;
|
|
104
|
-
}
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
case ProvidedElements.TriggerDOM: {
|
|
108
|
-
const widgetElement = document.createElement('div');
|
|
109
|
-
output.widgetDOMElement = widgetElement;
|
|
110
|
-
if (triggerType === TriggerType.Inline) {
|
|
111
|
-
// replace with widgetDOMElement in the DOM
|
|
112
|
-
widgetElement.id = providedTriggerElement?.id || '';
|
|
113
|
-
if (waitWithReplace) {
|
|
114
|
-
widgetElement.style.display = 'none';
|
|
115
|
-
providedTriggerElement?.parentNode?.appendChild(widgetElement);
|
|
116
|
-
|
|
117
|
-
output.callback = () => {
|
|
118
|
-
providedTriggerElement?.parentNode?.replaceChild(
|
|
119
|
-
widgetElement,
|
|
120
|
-
providedTriggerElement
|
|
121
|
-
);
|
|
122
|
-
widgetElement.style.display =
|
|
123
|
-
providedTriggerElement?.style.display || 'block';
|
|
124
|
-
};
|
|
125
|
-
} else {
|
|
126
|
-
providedTriggerElement?.parentNode?.replaceChild(
|
|
127
|
-
widgetElement,
|
|
128
|
-
providedTriggerElement
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
output.cachedOriginals.widgetDOMElement = providedTriggerElement;
|
|
132
|
-
output.cachedOriginals.triggerDOMElement = undefined;
|
|
133
|
-
} else {
|
|
134
|
-
output.widgetDOMElement = document.body.appendChild(widgetElement);
|
|
135
|
-
output.triggerDOMElement = providedTriggerElement;
|
|
136
|
-
}
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
case ProvidedElements.None: {
|
|
140
|
-
const widgetElement = document.body.appendChild(
|
|
141
|
-
document.createElement('div')
|
|
142
|
-
);
|
|
143
|
-
output.widgetDOMElement = widgetElement;
|
|
144
|
-
if (triggerType !== TriggerType.Inline) {
|
|
145
|
-
if (!customElements.get('ace-widget-trigger')) {
|
|
146
|
-
customElements.define('ace-widget-trigger', TriggerComponent);
|
|
147
|
-
}
|
|
148
|
-
const trigger: any = document.createElement('ace-widget-trigger');
|
|
149
|
-
trigger.symbol = triggerDefinition.symbol;
|
|
150
|
-
trigger.container = container;
|
|
151
|
-
|
|
152
|
-
document.body.appendChild(trigger);
|
|
153
|
-
console.log('Created trigger');
|
|
154
|
-
// if (triggerType === TriggerType.Link) {
|
|
155
|
-
// triggerElement.innerText = name;
|
|
156
|
-
// }
|
|
157
|
-
output.triggerDOMElement = trigger;
|
|
158
|
-
}
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return output;
|
|
164
|
-
};
|
package/src/ui/render.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Container } from '@webprovisions/platform';
|
|
2
|
-
import { WrapperComponent } from './wrapper';
|
|
3
|
-
import './area';
|
|
4
|
-
|
|
5
|
-
export default (container: Container, element: HTMLElement) => {
|
|
6
|
-
// element.addEventListener('request', (event: any) => {
|
|
7
|
-
// if (event.detail.type === 'container') {
|
|
8
|
-
// event.detail.instance = container;
|
|
9
|
-
// }
|
|
10
|
-
// });
|
|
11
|
-
|
|
12
|
-
// TODO: figure out why this tick is needed
|
|
13
|
-
setTimeout(() => {
|
|
14
|
-
const root = new WrapperComponent();
|
|
15
|
-
root.container = container.parent; // TODO: change back to just container?
|
|
16
|
-
|
|
17
|
-
element.appendChild(root);
|
|
18
|
-
}, 0);
|
|
19
|
-
};
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { Container } from '@webprovisions/platform';
|
|
2
|
-
import { LitElement, html, css, nothing } from 'lit';
|
|
3
|
-
import { property, state } from 'lit/decorators.js';
|
|
4
|
-
import { classMap } from 'lit/directives/class-map.js';
|
|
5
|
-
import { mapBranding } from './branding';
|
|
6
|
-
|
|
7
|
-
type SymbolType = {
|
|
8
|
-
type: 'Uri' | 'Svg' | 'FontAwesome' | 'Text' | string;
|
|
9
|
-
content: string;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
// @customElement('ace-widget-trigger')
|
|
13
|
-
export class TriggerComponent extends LitElement {
|
|
14
|
-
static override styles = [
|
|
15
|
-
css`
|
|
16
|
-
:host {
|
|
17
|
-
--voca-rem-multiplier: 0.625;
|
|
18
|
-
display: block;
|
|
19
|
-
box-sizing: border-box;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.trigger {
|
|
23
|
-
position: fixed;
|
|
24
|
-
transform: scale(0);
|
|
25
|
-
box-shadow: rgba(0, 0, 0, 0.16) 0px 5px 40px;
|
|
26
|
-
bottom: 20px;
|
|
27
|
-
right: 20px;
|
|
28
|
-
z-index: 5;
|
|
29
|
-
display: flex;
|
|
30
|
-
align-items: center;
|
|
31
|
-
justify-content: center;
|
|
32
|
-
border: none;
|
|
33
|
-
line-height: 55px;
|
|
34
|
-
height: 55px;
|
|
35
|
-
width: 55px;
|
|
36
|
-
border-radius: 55px;
|
|
37
|
-
cursor: pointer;
|
|
38
|
-
background-color: var(--trigger-bg, var(--primary-color));
|
|
39
|
-
font-family: Lato;
|
|
40
|
-
text-decoration: none;
|
|
41
|
-
border: 3px dashed transparent;
|
|
42
|
-
box-sizing: border-box;
|
|
43
|
-
transition: transform 200ms ease-out;
|
|
44
|
-
}
|
|
45
|
-
.trigger:hover {
|
|
46
|
-
transform: scale(1.1) !important;
|
|
47
|
-
}
|
|
48
|
-
.trigger.rendered {
|
|
49
|
-
transform: scale(1);
|
|
50
|
-
}
|
|
51
|
-
.trigger.active .trigger-icon {
|
|
52
|
-
opacity: 0;
|
|
53
|
-
transform: rotate(-180deg) scale(0);
|
|
54
|
-
}
|
|
55
|
-
.trigger.active .trigger-close {
|
|
56
|
-
opacity: 1;
|
|
57
|
-
transform: rotate(0deg) scale(1);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.trigger-icon {
|
|
61
|
-
display: inline-block;
|
|
62
|
-
line-height: inherit;
|
|
63
|
-
text-align: center;
|
|
64
|
-
opacity: 1;
|
|
65
|
-
transform: rotate(0deg) scale(1);
|
|
66
|
-
transition: opacity 200ms ease-out, transform 200ms ease-out;
|
|
67
|
-
color: var(--trigger-text-color, #fff);
|
|
68
|
-
}
|
|
69
|
-
.trigger-close {
|
|
70
|
-
opacity: 0;
|
|
71
|
-
transition: transform 200ms ease-out;
|
|
72
|
-
transform: rotate(180deg) scale(0);
|
|
73
|
-
position: absolute;
|
|
74
|
-
top: 0;
|
|
75
|
-
bottom: 0;
|
|
76
|
-
left: 0;
|
|
77
|
-
right: 0;
|
|
78
|
-
display: flex;
|
|
79
|
-
justify-content: center;
|
|
80
|
-
align-items: center;
|
|
81
|
-
fill: var(--trigger-text-color, #fff);
|
|
82
|
-
}
|
|
83
|
-
`,
|
|
84
|
-
];
|
|
85
|
-
|
|
86
|
-
@property({ attribute: false })
|
|
87
|
-
symbol?: SymbolType;
|
|
88
|
-
|
|
89
|
-
@property({ attribute: false })
|
|
90
|
-
container?: Container;
|
|
91
|
-
|
|
92
|
-
@state()
|
|
93
|
-
active = false;
|
|
94
|
-
|
|
95
|
-
@state()
|
|
96
|
-
loaded = false;
|
|
97
|
-
|
|
98
|
-
@state()
|
|
99
|
-
icon: any;
|
|
100
|
-
|
|
101
|
-
override async connectedCallback() {
|
|
102
|
-
super.connectedCallback();
|
|
103
|
-
|
|
104
|
-
this.icon = await this._renderSymbol(this.symbol);
|
|
105
|
-
this.loaded = true;
|
|
106
|
-
|
|
107
|
-
this._applyBranding();
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
_toggleActive() {
|
|
111
|
-
this.active = !this.active;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
_applyBranding() {
|
|
115
|
-
const settings = this.container?.get('$settings') ?? {};
|
|
116
|
-
|
|
117
|
-
const root = settings?.components[settings?.entry];
|
|
118
|
-
|
|
119
|
-
if (root) {
|
|
120
|
-
mapBranding(root.context, this);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
async _renderSymbol(symbol?: SymbolType) {
|
|
125
|
-
const importIcon = async (iconName: string) => {
|
|
126
|
-
const icon = await import('@teliads/icons').then(
|
|
127
|
-
(m: Record<string, unknown>) => {
|
|
128
|
-
return m[iconName];
|
|
129
|
-
}
|
|
130
|
-
);
|
|
131
|
-
return icon;
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
if (symbol) {
|
|
135
|
-
const { type, content } = symbol;
|
|
136
|
-
switch (type) {
|
|
137
|
-
case 'Telia': {
|
|
138
|
-
const icon: any = await importIcon(content);
|
|
139
|
-
if (icon) {
|
|
140
|
-
return html`<telia-icon
|
|
141
|
-
class="trigger-icon"
|
|
142
|
-
svg=${icon.svg}
|
|
143
|
-
size="lg"
|
|
144
|
-
></telia-icon>`;
|
|
145
|
-
}
|
|
146
|
-
return nothing;
|
|
147
|
-
}
|
|
148
|
-
case 'FontAwesome':
|
|
149
|
-
return html`<i class="trigger-fa-icon fa fa-${content}"></i>`;
|
|
150
|
-
case 'Uri':
|
|
151
|
-
return html`<i
|
|
152
|
-
class="trigger-custom-icon"
|
|
153
|
-
style="background: url(${content}) no-repeat center center;background-size: contain;"
|
|
154
|
-
></i>`;
|
|
155
|
-
default:
|
|
156
|
-
return nothing;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
override render() {
|
|
162
|
-
return html`<button
|
|
163
|
-
class=${classMap({
|
|
164
|
-
trigger: true,
|
|
165
|
-
active: this.active,
|
|
166
|
-
rendered: this.loaded,
|
|
167
|
-
})}
|
|
168
|
-
@click=${this._toggleActive}
|
|
169
|
-
>
|
|
170
|
-
${this.icon}
|
|
171
|
-
<span class="trigger-close">
|
|
172
|
-
<svg
|
|
173
|
-
width="18"
|
|
174
|
-
height="9"
|
|
175
|
-
viewBox="0 0 18 9"
|
|
176
|
-
fill="none"
|
|
177
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
178
|
-
>
|
|
179
|
-
<path
|
|
180
|
-
d="M9 9C8.81794 9.00045 8.63759 8.96634 8.46939 8.89965C8.3012 8.83295 8.14851 8.735 8.02015 8.61145L0.194523 1.12367C0.068294 0.99862 -0.00155266 0.831133 2.61958e-05 0.657285C0.00160506 0.483436 0.0744832 0.317136 0.202964 0.194202C0.331445 0.0712675 0.505249 0.00153576 0.686941 2.50649e-05C0.868634 -0.00148563 1.04368 0.0653456 1.17437 0.186125L9 7.6739L16.8256 0.186125C16.9563 0.0653456 17.1314 -0.00148563 17.3131 2.50649e-05C17.4948 0.00153576 17.6686 0.0712675 17.797 0.194202C17.9255 0.317136 17.9984 0.483436 18 0.657285C18.0016 0.831133 17.9317 0.99862 17.8055 1.12367L9.97985 8.61145C9.85149 8.735 9.6988 8.83295 9.53061 8.89965C9.36241 8.96634 9.18206 9.00045 9 9Z"
|
|
181
|
-
fill="white"
|
|
182
|
-
/>
|
|
183
|
-
</svg>
|
|
184
|
-
</span>
|
|
185
|
-
<span class="trigger-loader">
|
|
186
|
-
<svg viewBox="25 25 50 50">
|
|
187
|
-
<circle
|
|
188
|
-
cx="50"
|
|
189
|
-
cy="50"
|
|
190
|
-
r="20"
|
|
191
|
-
fill="none"
|
|
192
|
-
stroke="#000"
|
|
193
|
-
stroke-width="2"
|
|
194
|
-
stroke-miterlimit="10"
|
|
195
|
-
/>
|
|
196
|
-
</svg>
|
|
197
|
-
</span>
|
|
198
|
-
</button>`;
|
|
199
|
-
}
|
|
200
|
-
}
|
package/src/ui/view-outlet.ts
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import { readStorage, StorageMedium } from '@telia-ace/widget-services';
|
|
2
|
-
import { notifyDataLoaded } from '@telia-ace/widget-utilities';
|
|
3
|
-
import { Container, Widget } from '@webprovisions/platform';
|
|
4
|
-
import {
|
|
5
|
-
createTriggerElement,
|
|
6
|
-
setActive,
|
|
7
|
-
setLoading,
|
|
8
|
-
} from './html-element-handlers';
|
|
9
|
-
import { TriggerType } from './prepare-dom';
|
|
10
|
-
|
|
11
|
-
const MODALS_STORAGE_KEY = 'modals';
|
|
12
|
-
|
|
13
|
-
type SymbolType = {
|
|
14
|
-
type: 'Uri' | 'Svg' | 'FontAwesome' | 'Text' | string;
|
|
15
|
-
content: string;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export type BadgeOptions = {
|
|
19
|
-
symbol?: SymbolType;
|
|
20
|
-
label?: string;
|
|
21
|
-
ariaLabel?: string;
|
|
22
|
-
openTooltip?: string;
|
|
23
|
-
closedTooltip?: string;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export type ViewOutletOptions = {
|
|
27
|
-
widgetDOMElement: HTMLElement;
|
|
28
|
-
triggerDOMElement?: HTMLElement;
|
|
29
|
-
triggerOptions?: BadgeOptions | boolean;
|
|
30
|
-
triggerType: TriggerType;
|
|
31
|
-
cachedOriginals: {
|
|
32
|
-
widgetDOMElement?: Node;
|
|
33
|
-
triggerDOMElement?: Node;
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
type Modals = {
|
|
38
|
-
name: string;
|
|
39
|
-
ref?: HTMLElement;
|
|
40
|
-
selector?: string;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export class ViewOutlet {
|
|
44
|
-
container: Container;
|
|
45
|
-
private unsubscribe: (() => void)[] = [];
|
|
46
|
-
|
|
47
|
-
constructor(container: Container, public options: ViewOutletOptions) {
|
|
48
|
-
this.container = container.createChild(this);
|
|
49
|
-
this.container.register('widgetDOMElement', this.options.widgetDOMElement);
|
|
50
|
-
this.container.register(
|
|
51
|
-
'triggerDOMElement',
|
|
52
|
-
this.options.triggerDOMElement
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
const widget: Widget = this.container.get('$widget');
|
|
56
|
-
this.options.widgetDOMElement.classList.add('ace-widget');
|
|
57
|
-
this.options.widgetDOMElement.classList.add(`ace-widget_${widget.name}`);
|
|
58
|
-
|
|
59
|
-
const widgetDOMElements = container.get('widgetDOMElements') || [];
|
|
60
|
-
container.register('widgetDOMElements', [
|
|
61
|
-
...widgetDOMElements,
|
|
62
|
-
this.options.widgetDOMElement,
|
|
63
|
-
]);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Renders the view outlet to the DOM.
|
|
68
|
-
*/
|
|
69
|
-
render() {
|
|
70
|
-
const { widgetDOMElement, triggerDOMElement } = this.options;
|
|
71
|
-
|
|
72
|
-
const widget: Widget = this.container.get('$widget');
|
|
73
|
-
|
|
74
|
-
if (widgetDOMElement.getAttribute('data-rendered') === 'true') {
|
|
75
|
-
return Promise.resolve();
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (triggerDOMElement && this.options.triggerType === TriggerType.Badge) {
|
|
79
|
-
setLoading(triggerDOMElement);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return import('./render')
|
|
83
|
-
.then((module) => module.default(this.container, widgetDOMElement))
|
|
84
|
-
.then(() => {
|
|
85
|
-
widgetDOMElement.setAttribute('data-rendered', 'true');
|
|
86
|
-
|
|
87
|
-
if (
|
|
88
|
-
triggerDOMElement &&
|
|
89
|
-
this.options.triggerType === TriggerType.Badge
|
|
90
|
-
) {
|
|
91
|
-
const tooltip = (this.options.triggerOptions as BadgeOptions)
|
|
92
|
-
.openTooltip;
|
|
93
|
-
setActive(triggerDOMElement, tooltip);
|
|
94
|
-
}
|
|
95
|
-
notifyDataLoaded(this.container, widgetDOMElement);
|
|
96
|
-
|
|
97
|
-
const widgets = this.container.get('$environment').widgets.all();
|
|
98
|
-
|
|
99
|
-
readStorage<Modals[]>(
|
|
100
|
-
this.container,
|
|
101
|
-
MODALS_STORAGE_KEY,
|
|
102
|
-
StorageMedium.Session
|
|
103
|
-
).then((modals: any) => {
|
|
104
|
-
if (modals) {
|
|
105
|
-
modals.forEach((modal: any) => {
|
|
106
|
-
if (
|
|
107
|
-
widgets.find(
|
|
108
|
-
(w: Widget) =>
|
|
109
|
-
w.name === modal.name && w.state === 'activated'
|
|
110
|
-
)
|
|
111
|
-
) {
|
|
112
|
-
widget.events.dispatch('widget:modal-opened', modal);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
renderBadge(options: BadgeOptions) {
|
|
121
|
-
const { triggerDOMElement } = this.options;
|
|
122
|
-
|
|
123
|
-
if (!triggerDOMElement) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (!triggerDOMElement.getAttribute('role')) {
|
|
128
|
-
triggerDOMElement.setAttribute('role', 'button');
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const { name }: Widget = this.container.get('$widget');
|
|
132
|
-
|
|
133
|
-
const { label, symbol, ariaLabel, closedTooltip, openTooltip } = options;
|
|
134
|
-
|
|
135
|
-
const triggerOptions = { closedTooltip, openTooltip };
|
|
136
|
-
this.options.triggerOptions = triggerOptions;
|
|
137
|
-
|
|
138
|
-
const removeTriggerListeners = createTriggerElement(triggerDOMElement, {
|
|
139
|
-
label,
|
|
140
|
-
symbol,
|
|
141
|
-
ariaLabel,
|
|
142
|
-
widgetName: name,
|
|
143
|
-
tooltip: closedTooltip,
|
|
144
|
-
});
|
|
145
|
-
this.unsubscribe.push(removeTriggerListeners);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
async dispose() {
|
|
149
|
-
const { triggerDOMElement, widgetDOMElement } = this.options;
|
|
150
|
-
if (this.options.cachedOriginals.widgetDOMElement) {
|
|
151
|
-
if (widgetDOMElement) {
|
|
152
|
-
widgetDOMElement.parentNode?.replaceChild(
|
|
153
|
-
this.options.cachedOriginals.widgetDOMElement,
|
|
154
|
-
widgetDOMElement
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
if (this.options.cachedOriginals.triggerDOMElement) {
|
|
159
|
-
if (triggerDOMElement) {
|
|
160
|
-
triggerDOMElement.parentNode?.replaceChild(
|
|
161
|
-
this.options.cachedOriginals.triggerDOMElement,
|
|
162
|
-
triggerDOMElement
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
this.unsubscribe.forEach((unsubscribe) => {
|
|
167
|
-
unsubscribe();
|
|
168
|
-
});
|
|
169
|
-
widgetDOMElement.parentNode?.removeChild(widgetDOMElement);
|
|
170
|
-
triggerDOMElement?.parentNode?.removeChild(triggerDOMElement);
|
|
171
|
-
}
|
|
172
|
-
}
|