@agnos-ui/angular-headless 0.0.1-alpha.1
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/README.md +15 -0
- package/esm2022/agnos-ui-angular-headless.mjs +5 -0
- package/esm2022/lib/slot.directive.mjs +199 -0
- package/esm2022/lib/slotDefault.directive.mjs +20 -0
- package/esm2022/lib/use.directive.mjs +57 -0
- package/esm2022/lib/utils.mjs +127 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/agnos-ui-angular-headless.mjs +409 -0
- package/fesm2022/agnos-ui-angular-headless.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/slot.directive.d.ts +15 -0
- package/lib/slotDefault.directive.d.ts +14 -0
- package/lib/use.directive.d.ts +12 -0
- package/lib/utils.d.ts +95 -0
- package/package.json +47 -0
- package/public-api.d.ts +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# @agnos-ui/angular-headless
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@agnos-ui/angular-headless)
|
|
4
|
+
|
|
5
|
+
Headless widget library for [Angular](https://angular.io/).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @agnos-ui/angular-headless
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
Please check [our demo site](https://amadeusitgroup.github.io/AgnosUI/latest/) to see all the available widgets and how to use them.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdub3MtdWktYW5ndWxhci1oZWFkbGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2hlYWRsZXNzL3NyYy9hZ25vcy11aS1hbmd1bGFyLWhlYWRsZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { Directive, EnvironmentInjector, Input, TemplateRef, ViewContainerRef, createComponent, inject, reflectComponentType } from '@angular/core';
|
|
3
|
+
import { ComponentTemplate } from './utils';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
class SlotHandler {
|
|
6
|
+
constructor(viewContainerRef, document) {
|
|
7
|
+
this.viewContainerRef = viewContainerRef;
|
|
8
|
+
this.document = document;
|
|
9
|
+
}
|
|
10
|
+
slotChange(slot, props) { }
|
|
11
|
+
propsChange(slot, props) { }
|
|
12
|
+
destroy() { }
|
|
13
|
+
}
|
|
14
|
+
class StringSlotHandler extends SlotHandler {
|
|
15
|
+
#nodeRef;
|
|
16
|
+
#previousText = '';
|
|
17
|
+
slotChange(slot) {
|
|
18
|
+
if (slot === this.#previousText) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
this.#previousText = slot;
|
|
22
|
+
if (this.#nodeRef) {
|
|
23
|
+
this.#nodeRef.textContent = slot;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const viewContainerElement = this.viewContainerRef.element.nativeElement;
|
|
27
|
+
if (this.document && viewContainerElement?.parentNode) {
|
|
28
|
+
this.#nodeRef = viewContainerElement.parentNode.insertBefore(this.document.createTextNode(slot), viewContainerElement);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
destroy() {
|
|
33
|
+
this.#nodeRef?.parentNode?.removeChild(this.#nodeRef);
|
|
34
|
+
this.#nodeRef = undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
class FunctionSlotHandler extends SlotHandler {
|
|
38
|
+
#stringSlotHandler = new StringSlotHandler(this.viewContainerRef, this.document);
|
|
39
|
+
slotChange(slot, props) {
|
|
40
|
+
this.#stringSlotHandler.slotChange(slot(props));
|
|
41
|
+
}
|
|
42
|
+
propsChange(slot, props) {
|
|
43
|
+
this.#stringSlotHandler.slotChange(slot(props));
|
|
44
|
+
}
|
|
45
|
+
destroy() {
|
|
46
|
+
this.#stringSlotHandler.destroy();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class ComponentSlotHandler extends SlotHandler {
|
|
50
|
+
#componentRef;
|
|
51
|
+
#properties;
|
|
52
|
+
slotChange(slot, props) {
|
|
53
|
+
if (this.#componentRef) {
|
|
54
|
+
this.destroy();
|
|
55
|
+
}
|
|
56
|
+
this.#componentRef = this.viewContainerRef.createComponent(slot);
|
|
57
|
+
this.#applyProperties(props);
|
|
58
|
+
}
|
|
59
|
+
#applyProperties(props, oldProperties) {
|
|
60
|
+
const properties = Object.keys(props);
|
|
61
|
+
this.#properties = properties;
|
|
62
|
+
const componentRef = this.#componentRef;
|
|
63
|
+
for (const property of properties) {
|
|
64
|
+
componentRef.setInput(property, props[property]);
|
|
65
|
+
oldProperties?.delete(property);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
propsChange(slot, props) {
|
|
69
|
+
const oldProperties = new Set(this.#properties);
|
|
70
|
+
this.#applyProperties(props, oldProperties);
|
|
71
|
+
const componentRef = this.#componentRef;
|
|
72
|
+
for (const property of oldProperties) {
|
|
73
|
+
componentRef.setInput(property, undefined);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
destroy() {
|
|
77
|
+
this.viewContainerRef.clear();
|
|
78
|
+
this.#componentRef = undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
class TemplateRefSlotHandler extends SlotHandler {
|
|
82
|
+
#viewRef;
|
|
83
|
+
#props;
|
|
84
|
+
slotChange(slot, props) {
|
|
85
|
+
if (this.#viewRef) {
|
|
86
|
+
this.destroy();
|
|
87
|
+
}
|
|
88
|
+
props = { ...props };
|
|
89
|
+
this.#props = props;
|
|
90
|
+
this.#viewRef = this.viewContainerRef.createEmbeddedView(slot, props);
|
|
91
|
+
}
|
|
92
|
+
propsChange(slot, props) {
|
|
93
|
+
if (this.#viewRef) {
|
|
94
|
+
const templateProps = this.#props;
|
|
95
|
+
const oldProperties = new Set(Object.keys(templateProps));
|
|
96
|
+
for (const property of Object.keys(props)) {
|
|
97
|
+
templateProps[property] = props[property];
|
|
98
|
+
oldProperties.delete(property);
|
|
99
|
+
}
|
|
100
|
+
for (const oldProperty of oldProperties) {
|
|
101
|
+
delete templateProps[oldProperty];
|
|
102
|
+
}
|
|
103
|
+
this.#viewRef.markForCheck();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
destroy() {
|
|
107
|
+
this.viewContainerRef.clear();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
class ComponentTemplateSlotHandler extends SlotHandler {
|
|
111
|
+
#componentRef;
|
|
112
|
+
#templateSlotHandler = new TemplateRefSlotHandler(this.viewContainerRef, this.document);
|
|
113
|
+
#templateRef;
|
|
114
|
+
slotChange(slot, props) {
|
|
115
|
+
if (this.#componentRef) {
|
|
116
|
+
this.destroy();
|
|
117
|
+
}
|
|
118
|
+
this.#componentRef = createComponent(slot.component, {
|
|
119
|
+
elementInjector: this.viewContainerRef.injector,
|
|
120
|
+
environmentInjector: this.viewContainerRef.injector.get(EnvironmentInjector),
|
|
121
|
+
});
|
|
122
|
+
this.#templateRef = this.#componentRef.instance[slot.templateProp];
|
|
123
|
+
this.#templateSlotHandler.slotChange(this.#templateRef, props);
|
|
124
|
+
}
|
|
125
|
+
propsChange(slot, props) {
|
|
126
|
+
this.#templateSlotHandler.propsChange(this.#templateRef, props);
|
|
127
|
+
}
|
|
128
|
+
destroy() {
|
|
129
|
+
this.#templateSlotHandler.destroy();
|
|
130
|
+
this.#componentRef?.destroy();
|
|
131
|
+
this.#componentRef = undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const getSlotType = (value) => {
|
|
135
|
+
if (!value)
|
|
136
|
+
return undefined;
|
|
137
|
+
const type = typeof value;
|
|
138
|
+
switch (type) {
|
|
139
|
+
case 'string':
|
|
140
|
+
return StringSlotHandler;
|
|
141
|
+
case 'function':
|
|
142
|
+
if (reflectComponentType(value)) {
|
|
143
|
+
return ComponentSlotHandler;
|
|
144
|
+
}
|
|
145
|
+
return FunctionSlotHandler;
|
|
146
|
+
case 'object':
|
|
147
|
+
if (value instanceof TemplateRef) {
|
|
148
|
+
return TemplateRefSlotHandler;
|
|
149
|
+
}
|
|
150
|
+
if (value instanceof ComponentTemplate) {
|
|
151
|
+
return ComponentTemplateSlotHandler;
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
};
|
|
157
|
+
export class SlotDirective {
|
|
158
|
+
constructor() {
|
|
159
|
+
this._viewContainerRef = inject(ViewContainerRef);
|
|
160
|
+
this._document = inject(DOCUMENT);
|
|
161
|
+
}
|
|
162
|
+
ngOnChanges(changes) {
|
|
163
|
+
const slotChange = changes['slot'];
|
|
164
|
+
const propsChange = changes['props'];
|
|
165
|
+
const slot = this.slot;
|
|
166
|
+
if (slotChange) {
|
|
167
|
+
const newSlotType = getSlotType(slot);
|
|
168
|
+
if (newSlotType !== this._slotType) {
|
|
169
|
+
this._slotHandler?.destroy();
|
|
170
|
+
this._slotHandler = newSlotType ? new newSlotType(this._viewContainerRef, this._document) : undefined;
|
|
171
|
+
this._slotType = newSlotType;
|
|
172
|
+
}
|
|
173
|
+
this._slotHandler?.slotChange(slot, this.props);
|
|
174
|
+
}
|
|
175
|
+
else if (propsChange) {
|
|
176
|
+
this._slotHandler?.propsChange(slot, this.props);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
ngOnDestroy() {
|
|
180
|
+
this._slotHandler?.destroy();
|
|
181
|
+
this._slotHandler = undefined;
|
|
182
|
+
}
|
|
183
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
184
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: SlotDirective, isStandalone: true, selector: "[auSlot]", inputs: { slot: ["auSlot", "slot"], props: ["auSlotProps", "props"] }, usesOnChanges: true, ngImport: i0 }); }
|
|
185
|
+
}
|
|
186
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDirective, decorators: [{
|
|
187
|
+
type: Directive,
|
|
188
|
+
args: [{
|
|
189
|
+
selector: '[auSlot]',
|
|
190
|
+
standalone: true,
|
|
191
|
+
}]
|
|
192
|
+
}], propDecorators: { slot: [{
|
|
193
|
+
type: Input,
|
|
194
|
+
args: ['auSlot']
|
|
195
|
+
}], props: [{
|
|
196
|
+
type: Input,
|
|
197
|
+
args: ['auSlotProps']
|
|
198
|
+
}] } });
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xvdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9oZWFkbGVzcy9zcmMvbGliL3Nsb3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEVBQUMsU0FBUyxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVsSixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxTQUFTLENBQUM7O0FBRTFDLE1BQWUsV0FBVztJQUN6QixZQUFtQixnQkFBa0MsRUFBUyxRQUFrQjtRQUE3RCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUFHLENBQUM7SUFDcEYsVUFBVSxDQUFDLElBQVUsRUFBRSxLQUFZLElBQUcsQ0FBQztJQUN2QyxXQUFXLENBQUMsSUFBVSxFQUFFLEtBQVksSUFBRyxDQUFDO0lBQ3hDLE9BQU8sS0FBSSxDQUFDO0NBQ1o7QUFFRCxNQUFNLGlCQUFxRCxTQUFRLFdBQTBCO0lBQzVGLFFBQVEsQ0FBbUI7SUFDM0IsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUVWLFVBQVUsQ0FBQyxJQUFZO1FBQy9CLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsT0FBTztTQUNQO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUNqQzthQUFNO1lBQ04sTUFBTSxvQkFBb0IsR0FBd0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7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QVMsR0FBRyxXQUFXLENBQUM7YUFDN0I7WUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hEO2FBQU0sSUFBSSxXQUFXLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNqRDtJQUNGLENBQUM7SUFFRCxXQUFXO1FBQ1YsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDOzhHQTdCVyxhQUFhO2tHQUFiLGFBQWE7OzJGQUFiLGFBQWE7a0JBSnpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFVBQVUsRUFBRSxJQUFJO2lCQUNoQjs4QkFFaUIsSUFBSTtzQkFBcEIsS0FBSzt1QkFBQyxRQUFRO2dCQUNPLEtBQUs7c0JBQTFCLEtBQUs7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7Q29tcG9uZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGlyZWN0aXZlLCBFbnZpcm9ubWVudEluamVjdG9yLCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYsIGNyZWF0ZUNvbXBvbmVudCwgaW5qZWN0LCByZWZsZWN0Q29tcG9uZW50VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7U2xvdENvbnRlbnR9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtDb21wb25lbnRUZW1wbGF0ZX0gZnJvbSAnLi91dGlscyc7XG5cbmFic3RyYWN0IGNsYXNzIFNsb3RIYW5kbGVyPFByb3BzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgU2xvdCBleHRlbmRzIFNsb3RDb250ZW50PFByb3BzPiA9IFNsb3RDb250ZW50PFByb3BzPj4ge1xuXHRjb25zdHJ1Y3RvcihwdWJsaWMgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHVibGljIGRvY3VtZW50OiBEb2N1bWVudCkge31cblx0c2xvdENoYW5nZShzbG90OiBTbG90LCBwcm9wczogUHJvcHMpIHt9XG5cdHByb3BzQ2hhbmdlKHNsb3Q6IFNsb3QsIHByb3BzOiBQcm9wcykge31cblx0ZGVzdHJveSgpIHt9XG59XG5cbmNsYXNzIFN0cmluZ1Nsb3RIYW5kbGVyPFByb3BzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gZXh0ZW5kcyBTbG90SGFuZGxlcjxQcm9wcywgc3RyaW5nPiB7XG5cdCNub2RlUmVmOiBUZXh0IHwgdW5kZWZpbmVkO1xuXHQjcHJldmlvdXNUZXh0ID0gJyc7XG5cblx0b3ZlcnJpZGUgc2xvdENoYW5nZShzbG90OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAoc2xvdCA9PT0gdGhpcy4jcHJldmlvdXNUZXh0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuI3ByZXZpb3VzVGV4dCA9IHNsb3Q7XG5cdFx0aWYgKHRoaXMuI25vZGVSZWYpIHtcblx0XHRcdHRoaXMuI25vZGVSZWYudGV4dENvbnRlbnQgPSBzbG90O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCB2aWV3Q29udGFpbmVyRWxlbWVudDogQ29tbWVudCB8IHVuZGVmaW5lZCA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRpZiAodGhpcy5kb2N1bWVudCAmJiB2aWV3Q29udGFpbmVyRWxlbWVudD8ucGFyZW50Tm9kZSkge1xuXHRcdFx0XHR0aGlzLiNub2RlUmVmID0gdmlld0NvbnRhaW5lckVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzbG90KSwgdmlld0NvbnRhaW5lckVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdG92ZXJyaWRlIGRlc3Ryb3koKTogdm9pZCB7XG5cdFx0dGhpcy4jbm9kZVJlZj8ucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy4jbm9kZVJlZik7XG5cdFx0dGhpcy4jbm9kZVJlZiA9IHVuZGVmaW5lZDtcblx0fVxufVxuXG5jbGFzcyBGdW5jdGlvblNsb3RIYW5kbGVyPFByb3BzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gZXh0ZW5kcyBTbG90SGFuZGxlcjxQcm9wcywgKHByb3BzOiBQcm9wcykgPT4gc3RyaW5nPiB7XG5cdCNzdHJpbmdTbG90SGFuZGxlciA9IG5ldyBTdHJpbmdTbG90SGFuZGxlcih0aGlzLnZpZXdDb250YWluZXJSZWYsIHRoaXMuZG9jdW1lbnQpO1xuXG5cdG92ZXJyaWRlIHNsb3RDaGFuZ2Uoc2xvdDogKHByb3BzOiBQcm9wcykgPT4gc3RyaW5nLCBwcm9wczogUHJvcHMpOiB2b2lkIHtcblx0XHR0aGlzLiNzdHJpbmdTbG90SGFuZGxlci5zbG90Q2hhbmdlKHNsb3QocHJvcHMpKTtcblx0fVxuXG5cdG92ZXJyaWRlIHByb3BzQ2hhbmdlKHNsb3Q6IChwcm9wczogUHJvcHMpID0+IHN0cmluZywgcHJvcHM6IFByb3BzKTogdm9pZCB7XG5cdFx0dGhpcy4jc3RyaW5nU2xvdEhhbmRsZXIuc2xvdENoYW5nZShzbG90KHByb3BzKSk7XG5cdH1cblxuXHRvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMuI3N0cmluZ1Nsb3RIYW5kbGVyLmRlc3Ryb3koKTtcblx0fVxufVxuXG5jbGFzcyBDb21wb25lbnRTbG90SGFuZGxlcjxQcm9wcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IGV4dGVuZHMgU2xvdEhhbmRsZXI8UHJvcHMsIFR5cGU8dW5rbm93bj4+IHtcblx0I2NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cdCNwcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblxuXHRvdmVycmlkZSBzbG90Q2hhbmdlKHNsb3Q6IFR5cGU8dW5rbm93bj4sIHByb3BzOiBQcm9wcyk6IHZvaWQge1xuXHRcdGlmICh0aGlzLiNjb21wb25lbnRSZWYpIHtcblx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdH1cblx0XHR0aGlzLiNjb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KHNsb3QpO1xuXHRcdHRoaXMuI2FwcGx5UHJvcGVydGllcyhwcm9wcyk7XG5cdH1cblxuXHQjYXBwbHlQcm9wZXJ0aWVzKHByb3BzOiBQcm9wcywgb2xkUHJvcGVydGllcz86IFNldDxzdHJpbmc+KSB7XG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcblx0XHR0aGlzLiNwcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblx0XHRjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLiNjb21wb25lbnRSZWYhO1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuXHRcdFx0Y29tcG9uZW50UmVmLnNldElucHV0KHByb3BlcnR5LCBwcm9wc1twcm9wZXJ0eV0pO1xuXHRcdFx0b2xkUHJvcGVydGllcz8uZGVsZXRlKHByb3BlcnR5KTtcblx0XHR9XG5cdH1cblxuXHRvdmVycmlkZSBwcm9wc0NoYW5nZShzbG90OiBUeXBlPHVua25vd24+LCBwcm9wczogUHJvcHMpOiB2b2lkIHtcblx0XHRjb25zdCBvbGRQcm9wZXJ0aWVzID0gbmV3IFNldCh0aGlzLiNwcm9wZXJ0aWVzKTtcblx0XHR0aGlzLiNhcHBseVByb3BlcnRpZXMocHJvcHMsIG9sZFByb3BlcnRpZXMpO1xuXHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuI2NvbXBvbmVudFJlZiE7XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvbGRQcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb21wb25lbnRSZWYuc2V0SW5wdXQocHJvcGVydHksIHVuZGVmaW5lZCk7XG5cdFx0fVxuXHR9XG5cblx0b3ZlcnJpZGUgZGVzdHJveSgpOiB2b2lkIHtcblx0XHR0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcblx0XHR0aGlzLiNjb21wb25lbnRSZWYgPSB1bmRlZmluZWQ7XG5cdH1cbn1cblxuY2xhc3MgVGVtcGxhdGVSZWZTbG90SGFuZGxlcjxQcm9wcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IGV4dGVuZHMgU2xvdEhhbmRsZXI8UHJvcHMsIFRlbXBsYXRlUmVmPFByb3BzPj4ge1xuXHQjdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPFByb3BzPiB8IHVuZGVmaW5lZDtcblx0I3Byb3BzOiBQcm9wcztcblxuXHRvdmVycmlkZSBzbG90Q2hhbmdlKHNsb3Q6IFRlbXBsYXRlUmVmPFByb3BzPiwgcHJvcHM6IFByb3BzKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuI3ZpZXdSZWYpIHtcblx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRwcm9wcyA9IHsuLi5wcm9wc307XG5cdFx0dGhpcy4jcHJvcHMgPSBwcm9wcztcblx0XHR0aGlzLiN2aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhzbG90LCBwcm9wcyk7XG5cdH1cblxuXHRvdmVycmlkZSBwcm9wc0NoYW5nZShzbG90OiBUZW1wbGF0ZVJlZjxQcm9wcz4sIHByb3BzOiBQcm9wcyk6IHZvaWQge1xuXHRcdGlmICh0aGlzLiN2aWV3UmVmKSB7XG5cdFx0XHRjb25zdCB0ZW1wbGF0ZVByb3BzID0gdGhpcy4jcHJvcHM7XG5cdFx0XHRjb25zdCBvbGRQcm9wZXJ0aWVzID0gbmV3IFNldDxrZXlvZiBQcm9wcz4oT2JqZWN0LmtleXModGVtcGxhdGVQcm9wcykpO1xuXHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyhwcm9wcykgYXMgKGtleW9mIFByb3BzKVtdKSB7XG5cdFx0XHRcdHRlbXBsYXRlUHJvcHNbcHJvcGVydHldID0gcHJvcHNbcHJvcGVydHldO1xuXHRcdFx0XHRvbGRQcm9wZXJ0aWVzLmRlbGV0ZShwcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG9sZFByb3BlcnR5IG9mIG9sZFByb3BlcnRpZXMpIHtcblx0XHRcdFx0ZGVsZXRlIHRlbXBsYXRlUHJvcHNbb2xkUHJvcGVydHldO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy4jdmlld1JlZi5tYXJrRm9yQ2hlY2soKTtcblx0XHR9XG5cdH1cblxuXHRvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuXHR9XG59XG5cbmNsYXNzIENvbXBvbmVudFRlbXBsYXRlU2xvdEhhbmRsZXI8XG5cdFByb3BzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pixcblx0SyBleHRlbmRzIHN0cmluZyxcblx0VCBleHRlbmRzIHtba2V5IGluIEtdOiBUZW1wbGF0ZVJlZjxQcm9wcz59XG4+IGV4dGVuZHMgU2xvdEhhbmRsZXI8UHJvcHMsIENvbXBvbmVudFRlbXBsYXRlPFByb3BzLCBLLCBUPj4ge1xuXHQjY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8VD4gfCB1bmRlZmluZWQ7XG5cdCN0ZW1wbGF0ZVNsb3RIYW5kbGVyID0gbmV3IFRlbXBsYXRlUmVmU2xvdEhhbmRsZXIodGhpcy52aWV3Q29udGFpbmVyUmVmLCB0aGlzLmRvY3VtZW50KTtcblx0I3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxQcm9wcz4gfCB1bmRlZmluZWQ7XG5cblx0b3ZlcnJpZGUgc2xvdENoYW5nZShzbG90OiBDb21wb25lbnRUZW1wbGF0ZTxQcm9wcywgSywgVD4sIHByb3BzOiBQcm9wcyk6IHZvaWQge1xuXHRcdGlmICh0aGlzLiNjb21wb25lbnRSZWYpIHtcblx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdH1cblx0XHR0aGlzLiNjb21wb25lbnRSZWYgPSBjcmVhdGVDb21wb25lbnQoc2xvdC5jb21wb25lbnQsIHtcblx0XHRcdGVsZW1lbnRJbmplY3RvcjogdGhpcy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yLFxuXHRcdFx0ZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yLmdldChFbnZpcm9ubWVudEluamVjdG9yKSxcblx0XHR9KTtcblx0XHR0aGlzLiN0ZW1wbGF0ZVJlZiA9IHRoaXMuI2NvbXBvbmVudFJlZi5pbnN0YW5jZVtzbG90LnRlbXBsYXRlUHJvcF07XG5cdFx0dGhpcy4jdGVtcGxhdGVTbG90SGFuZGxlci5zbG90Q2hhbmdlKHRoaXMuI3RlbXBsYXRlUmVmLCBwcm9wcyk7XG5cdH1cblxuXHRvdmVycmlkZSBwcm9wc0NoYW5nZShzbG90OiBDb21wb25lbnRUZW1wbGF0ZTxQcm9wcywgSywgVD4sIHByb3BzOiBQcm9wcyk6IHZvaWQge1xuXHRcdHRoaXMuI3RlbXBsYXRlU2xvdEhhbmRsZXIucHJvcHNDaGFuZ2UodGhpcy4jdGVtcGxhdGVSZWYhLCBwcm9wcyk7XG5cdH1cblxuXHRvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMuI3RlbXBsYXRlU2xvdEhhbmRsZXIuZGVzdHJveSgpO1xuXHRcdHRoaXMuI2NvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xuXHRcdHRoaXMuI2NvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcblx0fVxufVxuXG5jb25zdCBnZXRTbG90VHlwZSA9ICh2YWx1ZTogYW55KTogdW5kZWZpbmVkIHwge25ldyAodmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgZG9jdW1lbnQ6IERvY3VtZW50KTogU2xvdEhhbmRsZXI8YW55Pn0gPT4ge1xuXHRpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdFx0cmV0dXJuIFN0cmluZ1Nsb3RIYW5kbGVyO1xuXHRcdGNhc2UgJ2Z1bmN0aW9uJzpcblx0XHRcdGlmIChyZWZsZWN0Q29tcG9uZW50VHlwZSh2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIENvbXBvbmVudFNsb3RIYW5kbGVyO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIEZ1bmN0aW9uU2xvdEhhbmRsZXI7XG5cdFx0Y2FzZSAnb2JqZWN0Jzpcblx0XHRcdGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZVJlZlNsb3RIYW5kbGVyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgQ29tcG9uZW50VGVtcGxhdGUpIHtcblx0XHRcdFx0cmV0dXJuIENvbXBvbmVudFRlbXBsYXRlU2xvdEhhbmRsZXI7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuQERpcmVjdGl2ZSh7XG5cdHNlbGVjdG9yOiAnW2F1U2xvdF0nLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBTbG90RGlyZWN0aXZlPFByb3BzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cdEBJbnB1dCgnYXVTbG90Jykgc2xvdDogU2xvdENvbnRlbnQ8UHJvcHM+O1xuXHRASW5wdXQoJ2F1U2xvdFByb3BzJykgcHJvcHM6IFByb3BzO1xuXG5cdHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cdHByaXZhdGUgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblx0cHJpdmF0ZSBfc2xvdFR5cGU6IFJldHVyblR5cGU8dHlwZW9mIGdldFNsb3RUeXBlPjtcblx0cHJpdmF0ZSBfc2xvdEhhbmRsZXI6IFNsb3RIYW5kbGVyPFByb3BzPiB8IHVuZGVmaW5lZDtcblxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG5cdFx0Y29uc3Qgc2xvdENoYW5nZSA9IGNoYW5nZXNbJ3Nsb3QnXTtcblx0XHRjb25zdCBwcm9wc0NoYW5nZSA9IGNoYW5nZXNbJ3Byb3BzJ107XG5cdFx0Y29uc3Qgc2xvdCA9IHRoaXMuc2xvdDtcblx0XHRpZiAoc2xvdENoYW5nZSkge1xuXHRcdFx0Y29uc3QgbmV3U2xvdFR5cGUgPSBnZXRTbG90VHlwZShzbG90KTtcblx0XHRcdGlmIChuZXdTbG90VHlwZSAhPT0gdGhpcy5fc2xvdFR5cGUpIHtcblx0XHRcdFx0dGhpcy5fc2xvdEhhbmRsZXI/LmRlc3Ryb3koKTtcblx0XHRcdFx0dGhpcy5fc2xvdEhhbmRsZXIgPSBuZXdTbG90VHlwZSA/IG5ldyBuZXdTbG90VHlwZSh0aGlzLl92aWV3Q29udGFpbmVyUmVmLCB0aGlzLl9kb2N1bWVudCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdHRoaXMuX3Nsb3RUeXBlID0gbmV3U2xvdFR5cGU7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zbG90SGFuZGxlcj8uc2xvdENoYW5nZShzbG90LCB0aGlzLnByb3BzKTtcblx0XHR9IGVsc2UgaWYgKHByb3BzQ2hhbmdlKSB7XG5cdFx0XHR0aGlzLl9zbG90SGFuZGxlcj8ucHJvcHNDaGFuZ2Uoc2xvdCwgdGhpcy5wcm9wcyk7XG5cdFx0fVxuXHR9XG5cblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cdFx0dGhpcy5fc2xvdEhhbmRsZXI/LmRlc3Ryb3koKTtcblx0XHR0aGlzLl9zbG90SGFuZGxlciA9IHVuZGVmaW5lZDtcblx0fVxufVxuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Directive, Input, TemplateRef, inject } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class SlotDefaultDirective {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.templateRef = inject((TemplateRef));
|
|
6
|
+
}
|
|
7
|
+
ngOnInit() {
|
|
8
|
+
this.auSlotDefault.update((value) => ({ ...value, slotDefault: this.templateRef }));
|
|
9
|
+
}
|
|
10
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDefaultDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
11
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: SlotDefaultDirective, isStandalone: true, selector: "[auSlotDefault]", inputs: { auSlotDefault: "auSlotDefault" }, ngImport: i0 }); }
|
|
12
|
+
}
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDefaultDirective, decorators: [{
|
|
14
|
+
type: Directive,
|
|
15
|
+
args: [{ selector: '[auSlotDefault]', standalone: true }]
|
|
16
|
+
}], propDecorators: { auSlotDefault: [{
|
|
17
|
+
type: Input,
|
|
18
|
+
args: ['auSlotDefault']
|
|
19
|
+
}] } });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xvdERlZmF1bHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vaGVhZGxlc3Mvc3JjL2xpYi9zbG90RGVmYXVsdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFJcEUsTUFBTSxPQUFPLG9CQUFvQjtJQURqQztRQUlDLGdCQUFXLEdBQUcsTUFBTSxDQUFDLENBQUEsV0FBYyxDQUFBLENBQUMsQ0FBQztLQUtyQztJQUhBLFFBQVE7UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7OEdBUFcsb0JBQW9CO2tHQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLFNBQVM7bUJBQUMsRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQzs4QkFFakMsYUFBYTtzQkFBcEMsS0FBSzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1dyaXRhYmxlU2lnbmFsfSBmcm9tICdAYW1hZGV1cy1pdC1ncm91cC90YW5zdSc7XG5pbXBvcnQgdHlwZSB7T25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGlyZWN0aXZlLCBJbnB1dCwgVGVtcGxhdGVSZWYsIGluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7U2xvdENvbnRlbnR9IGZyb20gJy4vdXRpbHMnO1xuXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1thdVNsb3REZWZhdWx0XScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFNsb3REZWZhdWx0RGlyZWN0aXZlPFQgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgT25Jbml0IHtcblx0QElucHV0KCdhdVNsb3REZWZhdWx0JykgYXVTbG90RGVmYXVsdDogV3JpdGFibGVTaWduYWw8e3Nsb3REZWZhdWx0PzogU2xvdENvbnRlbnQ8VD59PjtcblxuXHR0ZW1wbGF0ZVJlZiA9IGluamVjdChUZW1wbGF0ZVJlZjxUPik7XG5cblx0bmdPbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5hdVNsb3REZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7Li4udmFsdWUsIHNsb3REZWZhdWx0OiB0aGlzLnRlbXBsYXRlUmVmfSkpO1xuXHR9XG59XG4iXX0=
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Directive, ElementRef, inject, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
// All calls of the directive in this class are done asynchronously (with await 0)
|
|
4
|
+
// in order to avoid ExpressionChangedAfterItHasBeenCheckedError
|
|
5
|
+
// or the corresponding issue with signals (https://github.com/angular/angular/issues/50320)
|
|
6
|
+
// This is relevant especially if calling the directive changes variables used in a template.
|
|
7
|
+
export class UseDirective {
|
|
8
|
+
#ref = inject(ElementRef);
|
|
9
|
+
#directive;
|
|
10
|
+
#directiveInstance;
|
|
11
|
+
async #destroyDirectiveInstance() {
|
|
12
|
+
const directiveInstance = this.#directiveInstance;
|
|
13
|
+
this.#directiveInstance = undefined;
|
|
14
|
+
if (directiveInstance?.destroy) {
|
|
15
|
+
await 0;
|
|
16
|
+
directiveInstance.destroy?.();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async ngOnChanges(changes) {
|
|
20
|
+
if (this.use !== this.#directive) {
|
|
21
|
+
this.#destroyDirectiveInstance();
|
|
22
|
+
const directive = this.use;
|
|
23
|
+
this.#directive = directive;
|
|
24
|
+
if (directive) {
|
|
25
|
+
await 0;
|
|
26
|
+
// checks that the directive did not change while waiting:
|
|
27
|
+
if (directive === this.#directive && !this.#directiveInstance) {
|
|
28
|
+
this.#directiveInstance = directive(this.#ref.nativeElement, this.params);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (changes['params']) {
|
|
33
|
+
await 0;
|
|
34
|
+
this.#directiveInstance?.update?.(this.params);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
ngOnDestroy() {
|
|
38
|
+
this.#destroyDirectiveInstance();
|
|
39
|
+
this.#directive = undefined;
|
|
40
|
+
}
|
|
41
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: UseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
42
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: UseDirective, isStandalone: true, selector: "[auUse]", inputs: { use: ["auUse", "use"], params: ["auUseParams", "params"] }, usesOnChanges: true, ngImport: i0 }); }
|
|
43
|
+
}
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: UseDirective, decorators: [{
|
|
45
|
+
type: Directive,
|
|
46
|
+
args: [{
|
|
47
|
+
standalone: true,
|
|
48
|
+
selector: '[auUse]',
|
|
49
|
+
}]
|
|
50
|
+
}], propDecorators: { use: [{
|
|
51
|
+
type: Input,
|
|
52
|
+
args: ['auUse']
|
|
53
|
+
}], params: [{
|
|
54
|
+
type: Input,
|
|
55
|
+
args: ['auUseParams']
|
|
56
|
+
}] } });
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hlYWRsZXNzL3NyYy9saWIvdXNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUduRSxrRkFBa0Y7QUFDbEYsZ0VBQWdFO0FBQ2hFLDRGQUE0RjtBQUM1Riw2RkFBNkY7QUFNN0YsTUFBTSxPQUFPLFlBQVk7SUFPeEIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxQixVQUFVLENBQWtDO0lBQzVDLGtCQUFrQixDQUFtQztJQUVyRCxLQUFLLENBQUMseUJBQXlCO1FBQzlCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2xELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7UUFDcEMsSUFBSSxpQkFBaUIsRUFBRSxPQUFPLEVBQUU7WUFDL0IsTUFBTSxDQUFDLENBQUM7WUFDUixpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQzlCO0lBQ0YsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLFNBQVMsRUFBRTtnQkFDZCxNQUFNLENBQUMsQ0FBQztnQkFDUiwwREFBMEQ7Z0JBQzFELElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7b0JBQzlELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQVcsQ0FBQyxDQUFDO2lCQUMvRTthQUNEO1NBQ0Q7YUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM3QixNQUFNLENBQUMsQ0FBQztZQUNSLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBVyxDQUFDLENBQUM7U0FDcEQ7SUFDRixDQUFDO0lBRUQsV0FBVztRQUNWLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7OEdBMUNXLFlBQVk7a0dBQVosWUFBWTs7MkZBQVosWUFBWTtrQkFKeEIsU0FBUzttQkFBQztvQkFDVixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLFNBQVM7aUJBQ25COzhCQUdBLEdBQUc7c0JBREYsS0FBSzt1QkFBQyxPQUFPO2dCQUlkLE1BQU07c0JBREwsS0FBSzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge09uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGlyZWN0aXZlLCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtEaXJlY3RpdmUgYXMgQWdub3NVSURpcmVjdGl2ZX0gZnJvbSAnQGFnbm9zLXVpL2NvcmUnO1xuXG4vLyBBbGwgY2FsbHMgb2YgdGhlIGRpcmVjdGl2ZSBpbiB0aGlzIGNsYXNzIGFyZSBkb25lIGFzeW5jaHJvbm91c2x5ICh3aXRoIGF3YWl0IDApXG4vLyBpbiBvcmRlciB0byBhdm9pZCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4vLyBvciB0aGUgY29ycmVzcG9uZGluZyBpc3N1ZSB3aXRoIHNpZ25hbHMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzUwMzIwKVxuLy8gVGhpcyBpcyByZWxldmFudCBlc3BlY2lhbGx5IGlmIGNhbGxpbmcgdGhlIGRpcmVjdGl2ZSBjaGFuZ2VzIHZhcmlhYmxlcyB1c2VkIGluIGEgdGVtcGxhdGUuXG5cbkBEaXJlY3RpdmUoe1xuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRzZWxlY3RvcjogJ1thdVVzZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VEaXJlY3RpdmU8VD4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cdEBJbnB1dCgnYXVVc2UnKVxuXHR1c2U6IEFnbm9zVUlEaXJlY3RpdmU8VD4gfCB1bmRlZmluZWQ7XG5cblx0QElucHV0KCdhdVVzZVBhcmFtcycpXG5cdHBhcmFtczogVCB8IHVuZGVmaW5lZDtcblxuXHQjcmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG5cdCNkaXJlY3RpdmU6IEFnbm9zVUlEaXJlY3RpdmU8VD4gfCB1bmRlZmluZWQ7XG5cdCNkaXJlY3RpdmVJbnN0YW5jZT86IFJldHVyblR5cGU8QWdub3NVSURpcmVjdGl2ZTxUPj47XG5cblx0YXN5bmMgI2Rlc3Ryb3lEaXJlY3RpdmVJbnN0YW5jZSgpIHtcblx0XHRjb25zdCBkaXJlY3RpdmVJbnN0YW5jZSA9IHRoaXMuI2RpcmVjdGl2ZUluc3RhbmNlO1xuXHRcdHRoaXMuI2RpcmVjdGl2ZUluc3RhbmNlID0gdW5kZWZpbmVkO1xuXHRcdGlmIChkaXJlY3RpdmVJbnN0YW5jZT8uZGVzdHJveSkge1xuXHRcdFx0YXdhaXQgMDtcblx0XHRcdGRpcmVjdGl2ZUluc3RhbmNlLmRlc3Ryb3k/LigpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy51c2UgIT09IHRoaXMuI2RpcmVjdGl2ZSkge1xuXHRcdFx0dGhpcy4jZGVzdHJveURpcmVjdGl2ZUluc3RhbmNlKCk7XG5cdFx0XHRjb25zdCBkaXJlY3RpdmUgPSB0aGlzLnVzZTtcblx0XHRcdHRoaXMuI2RpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcblx0XHRcdGlmIChkaXJlY3RpdmUpIHtcblx0XHRcdFx0YXdhaXQgMDtcblx0XHRcdFx0Ly8gY2hlY2tzIHRoYXQgdGhlIGRpcmVjdGl2ZSBkaWQgbm90IGNoYW5nZSB3aGlsZSB3YWl0aW5nOlxuXHRcdFx0XHRpZiAoZGlyZWN0aXZlID09PSB0aGlzLiNkaXJlY3RpdmUgJiYgIXRoaXMuI2RpcmVjdGl2ZUluc3RhbmNlKSB7XG5cdFx0XHRcdFx0dGhpcy4jZGlyZWN0aXZlSW5zdGFuY2UgPSBkaXJlY3RpdmUodGhpcy4jcmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGFyYW1zIGFzIFQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChjaGFuZ2VzWydwYXJhbXMnXSkge1xuXHRcdFx0YXdhaXQgMDtcblx0XHRcdHRoaXMuI2RpcmVjdGl2ZUluc3RhbmNlPy51cGRhdGU/Lih0aGlzLnBhcmFtcyBhcyBUKTtcblx0XHR9XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHR0aGlzLiNkZXN0cm95RGlyZWN0aXZlSW5zdGFuY2UoKTtcblx0XHR0aGlzLiNkaXJlY3RpdmUgPSB1bmRlZmluZWQ7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { createWidgetsConfig } from '@agnos-ui/core';
|
|
2
|
+
import { computed, readable, writable } from '@amadeus-it-group/tansu';
|
|
3
|
+
import { InjectionToken, Injector, Optional, SkipSelf, inject, runInInjectionContext } from '@angular/core';
|
|
4
|
+
export class ComponentTemplate {
|
|
5
|
+
constructor(component, templateProp) {
|
|
6
|
+
this.component = component;
|
|
7
|
+
this.templateProp = templateProp;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Dependency Injection token which can be used to provide or inject the widgets default configuration store.
|
|
12
|
+
*/
|
|
13
|
+
export const widgetsConfigInjectionToken = new InjectionToken('widgetsConfig');
|
|
14
|
+
/**
|
|
15
|
+
* Creates a provider of widgets default configuration that inherits from any widgets default configuration already defined at an upper level
|
|
16
|
+
* in the Angular dependency injection system. It contains its own set of widgets configuration properties that override the same properties form
|
|
17
|
+
* the parent configuration.
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* The configuration is computed from the parent configuration in two steps:
|
|
21
|
+
* - first step: the parent configuration is transformed by the adaptParentConfig function (if specified).
|
|
22
|
+
* If adaptParentConfig is not specified, this step is skipped.
|
|
23
|
+
* - second step: the configuration from step 1 is merged (2-levels deep) with the own$ store. The own$ store initially contains
|
|
24
|
+
* an empty object (i.e. no property from the parent is overridden). It can be changed by calling set on the store returned by
|
|
25
|
+
* {@link injectWidgetsConfig}.
|
|
26
|
+
*
|
|
27
|
+
* @param adaptParentConfig - optional function that receives a 2-levels copy of the widgets default configuration
|
|
28
|
+
* defined at an upper level in the Angular dependency injection system (or an empty object if there is none) and returns the widgets
|
|
29
|
+
* default configuration to be used.
|
|
30
|
+
* It is called only if the configuration is needed, and was not yet computed for the current value of the parent configuration.
|
|
31
|
+
* It is called in a tansu reactive context, so it can use any tansu store and will be called again if those stores change.
|
|
32
|
+
* It is also called in an Angular injection context, so it can call the Angular inject function to get and use dependencies from the
|
|
33
|
+
* Angular dependency injection system.
|
|
34
|
+
|
|
35
|
+
* @returns DI provider to be included a list of `providers` (for example at a component level or
|
|
36
|
+
* any other level of the Angular dependency injection system)
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* @Component({
|
|
41
|
+
* // ...
|
|
42
|
+
* providers: [
|
|
43
|
+
* provideWidgetsConfig((parentConfig) => {
|
|
44
|
+
* // first step configuration: transforms the parent configuration
|
|
45
|
+
* parentConfig.rating = parentConfig.rating ?? {};
|
|
46
|
+
* parentConfig.rating.className = `${parentConfig.rating.className ?? ''} my-rating-extra-class`
|
|
47
|
+
* return parentConfig;
|
|
48
|
+
* })
|
|
49
|
+
* ]
|
|
50
|
+
* })
|
|
51
|
+
* class MyComponent {
|
|
52
|
+
* widgetsConfig = injectWidgetsConfig();
|
|
53
|
+
* constructor() {
|
|
54
|
+
* this.widgetsConfig.set({
|
|
55
|
+
* // second step configuration: overrides the parent configuration
|
|
56
|
+
* rating: {
|
|
57
|
+
* slotStar: MyCustomSlotStar
|
|
58
|
+
* }
|
|
59
|
+
* });
|
|
60
|
+
* }
|
|
61
|
+
* // ...
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export const provideWidgetsConfig = (adaptParentConfig) => ({
|
|
66
|
+
provide: widgetsConfigInjectionToken,
|
|
67
|
+
useFactory: (parent) => {
|
|
68
|
+
if (adaptParentConfig) {
|
|
69
|
+
const injector = inject(Injector);
|
|
70
|
+
const originalAdaptParentConfig = adaptParentConfig;
|
|
71
|
+
adaptParentConfig = (value) => runInInjectionContext(injector, () => originalAdaptParentConfig(value));
|
|
72
|
+
}
|
|
73
|
+
return createWidgetsConfig(parent ?? undefined, adaptParentConfig);
|
|
74
|
+
},
|
|
75
|
+
deps: [[new SkipSelf(), new Optional(), widgetsConfigInjectionToken]],
|
|
76
|
+
});
|
|
77
|
+
/**
|
|
78
|
+
* Returns the widgets default configuration store that was provided in the current injection context.
|
|
79
|
+
* Throws if the no widgets default configuration store was provided.
|
|
80
|
+
*
|
|
81
|
+
* @remarks
|
|
82
|
+
* This function must be called from an injection context, such as a constructor, a factory function, a field initializer or
|
|
83
|
+
* a function used with {@link https://angular.io/api/core/runInInjectionContext | runInInjectionContext}.
|
|
84
|
+
*
|
|
85
|
+
* @returns the widgets default configuration store.
|
|
86
|
+
*/
|
|
87
|
+
export const injectWidgetsConfig = () => inject(widgetsConfigInjectionToken);
|
|
88
|
+
const createPatchSlots = (set) => {
|
|
89
|
+
let lastValue = {};
|
|
90
|
+
return (object) => {
|
|
91
|
+
const newValue = {};
|
|
92
|
+
let hasChange = false;
|
|
93
|
+
for (const key of Object.keys(object)) {
|
|
94
|
+
const objectKey = object[key];
|
|
95
|
+
if (objectKey != null) {
|
|
96
|
+
// only use defined slots
|
|
97
|
+
newValue[key] = objectKey;
|
|
98
|
+
}
|
|
99
|
+
if (objectKey != lastValue[key]) {
|
|
100
|
+
hasChange = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (hasChange) {
|
|
104
|
+
lastValue = newValue;
|
|
105
|
+
set(newValue);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
export const callWidgetFactory = (factory, widgetName, defaultConfig = {}) => {
|
|
110
|
+
const defaultConfigStore = typeof defaultConfig !== 'function' ? readable(defaultConfig) : defaultConfig;
|
|
111
|
+
const slots$ = writable({});
|
|
112
|
+
const widgetsConfig = widgetName ? inject(widgetsConfigInjectionToken, { optional: true }) : undefined;
|
|
113
|
+
return {
|
|
114
|
+
...factory(computed(() => ({ ...defaultConfigStore(), ...(widgetName ? widgetsConfig?.()[widgetName] : undefined), ...slots$() }))),
|
|
115
|
+
patchSlots: createPatchSlots(slots$.set),
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export function patchSimpleChanges(patchFn, changes) {
|
|
119
|
+
const obj = {};
|
|
120
|
+
for (const [key, simpleChange] of Object.entries(changes)) {
|
|
121
|
+
if (simpleChange !== undefined) {
|
|
122
|
+
obj[key] = simpleChange.currentValue;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
patchFn(obj);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9oZWFkbGVzcy9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXJFLE9BQU8sRUFBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFHLE1BQU0sT0FBTyxpQkFBaUI7SUFDN0IsWUFBNEIsU0FBa0IsRUFBa0IsWUFBZTtRQUFuRCxjQUFTLEdBQVQsU0FBUyxDQUFTO1FBQWtCLGlCQUFZLEdBQVosWUFBWSxDQUFHO0lBQUcsQ0FBQztDQUNuRjtBQTRCRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLElBQUksY0FBYyxDQUFvQyxlQUFlLENBQUMsQ0FBQztBQUVsSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUNuQyxpQkFBNEYsRUFDMUUsRUFBRSxDQUFDLENBQUM7SUFDdEIsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxVQUFVLEVBQUUsQ0FBQyxNQUFnRCxFQUFFLEVBQUU7UUFDaEUsSUFBSSxpQkFBaUIsRUFBRTtZQUN0QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsTUFBTSx5QkFBeUIsR0FBRyxpQkFBaUIsQ0FBQztZQUNwRCxpQkFBaUIsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFD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bXBvcnQgdHlwZSB7XG5cdFNsb3RDb250ZW50IGFzIENvcmVTbG90Q29udGVudCxcblx0V2lkZ2V0c0NvbmZpZyBhcyBDb3JlV2lkZ2V0c0NvbmZpZyxcblx0UGFydGlhbDJMZXZlbHMsXG5cdFdpZGdldCxcblx0V2lkZ2V0RmFjdG9yeSxcblx0V2lkZ2V0UHJvcHMsXG5cdFdpZGdldFNsb3RDb250ZXh0LFxuXHRXaWRnZXRTdGF0ZSxcblx0V2lkZ2V0c0NvbmZpZ1N0b3JlLFxufSBmcm9tICdAYWdub3MtdWkvY29yZSc7XG5pbXBvcnQge2NyZWF0ZVdpZGdldHNDb25maWd9IGZyb20gJ0BhZ25vcy11aS9jb3JlJztcbmltcG9ydCB0eXBlIHtSZWFkYWJsZVNpZ25hbCwgU3Vic2NyaWJhYmxlU3RvcmV9IGZyb20gJ0BhbWFkZXVzLWl0LWdyb3VwL3RhbnN1JztcbmltcG9ydCB7Y29tcHV0ZWQsIHJlYWRhYmxlLCB3cml0YWJsZX0gZnJvbSAnQGFtYWRldXMtaXQtZ3JvdXAvdGFuc3UnO1xuaW1wb3J0IHR5cGUge0ZhY3RvcnlQcm92aWRlciwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFR5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IsIE9wdGlvbmFsLCBTa2lwU2VsZiwgaW5qZWN0LCBydW5JbkluamVjdGlvbkNvbnRleHR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50VGVtcGxhdGU8UHJvcHMsIEsgZXh0ZW5kcyBzdHJpbmcsIFQgZXh0ZW5kcyB7W2tleSBpbiBLXTogVGVtcGxhdGVSZWY8UHJvcHM+fT4ge1xuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50OiBUeXBlPFQ+LCBwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGVQcm9wOiBLKSB7fVxufVxuXG5leHBvcnQgdHlwZSBTbG90Q29udGVudDxQcm9wcyBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gPVxuXHR8IENvcmVTbG90Q29udGVudDxQcm9wcz5cblx0fCBUZW1wbGF0ZVJlZjxQcm9wcz5cblx0fCBUeXBlPHVua25vd24+XG5cdHwgQ29tcG9uZW50VGVtcGxhdGU8UHJvcHMsIGFueSwgYW55PjtcblxuZXhwb3J0IHR5cGUgQWRhcHRTbG90Q29udGVudFByb3BzPFByb3BzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBQcm9wcyBleHRlbmRzIFdpZGdldFNsb3RDb250ZXh0PGluZmVyIFU+XG5cdD8gV2lkZ2V0U2xvdENvbnRleHQ8QWRhcHRXaWRnZXRTbG90czxVPj4gJiBBZGFwdFByb3BzU2xvdHM8T21pdDxQcm9wcywga2V5b2YgV2lkZ2V0U2xvdENvbnRleHQ8YW55Pj4+XG5cdDogQWRhcHRQcm9wc1Nsb3RzPFByb3BzPjtcblxuZXhwb3J0IHR5cGUgQWRhcHRQcm9wc1Nsb3RzPFByb3BzPiA9IE9taXQ8UHJvcHMsIGBzbG90JHtzdHJpbmd9YD4gJiB7XG5cdFtLIGluIGtleW9mIFByb3BzICYgYHNsb3Qke3N0cmluZ31gXTogUHJvcHNbS10gZXh0ZW5kcyBDb3JlU2xvdENvbnRlbnQ8aW5mZXIgVT4gPyBTbG90Q29udGVudDxBZGFwdFNsb3RDb250ZW50UHJvcHM8VT4+IDogUHJvcHNbS107XG59O1xuXG5leHBvcnQgdHlwZSBBZGFwdFdpZGdldFNsb3RzPFcgZXh0ZW5kcyBXaWRnZXQ+ID0gV2lkZ2V0PFxuXHRBZGFwdFByb3BzU2xvdHM8V2lkZ2V0UHJvcHM8Vz4+LFxuXHRBZGFwdFByb3BzU2xvdHM8V2lkZ2V0U3RhdGU8Vz4+LFxuXHRXWydhcGknXSxcblx0V1snYWN0aW9ucyddLFxuXHRXWydkaXJlY3RpdmVzJ11cbj47XG5cbmV4cG9ydCB0eXBlIFdpZGdldHNDb25maWcgPSB7XG5cdFtXaWRnZXROYW1lIGluIGtleW9mIENvcmVXaWRnZXRzQ29uZmlnXTogQWRhcHRQcm9wc1Nsb3RzPENvcmVXaWRnZXRzQ29uZmlnW1dpZGdldE5hbWVdPjtcbn07XG5cbi8qKlxuICogRGVwZW5kZW5jeSBJbmplY3Rpb24gdG9rZW4gd2hpY2ggY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBvciBpbmplY3QgdGhlIHdpZGdldHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIHN0b3JlLlxuICovXG5leHBvcnQgY29uc3Qgd2lkZ2V0c0NvbmZpZ0luamVjdGlvblRva2VuID0gbmV3IEluamVjdGlvblRva2VuPFdpZGdldHNDb25maWdTdG9yZTxXaWRnZXRzQ29uZmlnPj4oJ3dpZGdldHNDb25maWcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJvdmlkZXIgb2Ygd2lkZ2V0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdGhhdCBpbmhlcml0cyBmcm9tIGFueSB3aWRnZXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbHJlYWR5IGRlZmluZWQgYXQgYW4gdXBwZXIgbGV2ZWxcbiAqIGluIHRoZSBBbmd1bGFyIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS4gSXQgY29udGFpbnMgaXRzIG93biBzZXQgb2Ygd2lkZ2V0cyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBvdmVycmlkZSB0aGUgc2FtZSBwcm9wZXJ0aWVzIGZvcm1cbiAqIHRoZSBwYXJlbnQgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhlIGNvbmZpZ3VyYXRpb24gaXMgY29tcHV0ZWQgZnJvbSB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24gaW4gdHdvIHN0ZXBzOlxuICogLSBmaXJzdCBzdGVwOiB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24gaXMgdHJhbnNmb3JtZWQgYnkgdGhlIGFkYXB0UGFyZW50Q29uZmlnIGZ1bmN0aW9uIChpZiBzcGVjaWZpZWQpLlxuICogSWYgYWRhcHRQYXJlbnRDb25maWcgaXMgbm90IHNwZWNpZmllZCwgdGhpcyBzdGVwIGlzIHNraXBwZWQuXG4gKiAtIHNlY29uZCBzdGVwOiB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHN0ZXAgMSBpcyBtZXJnZWQgKDItbGV2ZWxzIGRlZXApIHdpdGggdGhlIG93biQgc3RvcmUuIFRoZSBvd24kIHN0b3JlIGluaXRpYWxseSBjb250YWluc1xuICogYW4gZW1wdHkgb2JqZWN0IChpLmUuIG5vIHByb3BlcnR5IGZyb20gdGhlIHBhcmVudCBpcyBvdmVycmlkZGVuKS4gSXQgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZyBzZXQgb24gdGhlIHN0b3JlIHJldHVybmVkIGJ5XG4gKiB7QGxpbmsgaW5qZWN0V2lkZ2V0c0NvbmZpZ30uXG4gKlxuICogQHBhcmFtIGFkYXB0UGFyZW50Q29uZmlnIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIDItbGV2ZWxzIGNvcHkgb2YgdGhlIHdpZGdldHMgZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gKiBkZWZpbmVkIGF0IGFuIHVwcGVyIGxldmVsIGluIHRoZSBBbmd1bGFyIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbSAob3IgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZXJlIGlzIG5vbmUpIGFuZCByZXR1cm5zIHRoZSB3aWRnZXRzXG4gKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZC5cbiAqIEl0IGlzIGNhbGxlZCBvbmx5IGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIG5lZWRlZCwgYW5kIHdhcyBub3QgeWV0IGNvbXB1dGVkIGZvciB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24uXG4gKiBJdCBpcyBjYWxsZWQgaW4gYSB0YW5zdSByZWFjdGl2ZSBjb250ZXh0LCBzbyBpdCBjYW4gdXNlIGFueSB0YW5zdSBzdG9yZSBhbmQgd2lsbCBiZSBjYWxsZWQgYWdhaW4gaWYgdGhvc2Ugc3RvcmVzIGNoYW5nZS5cbiAqIEl0IGlzIGFsc28gY2FsbGVkIGluIGFuIEFuZ3VsYXIgaW5qZWN0aW9uIGNvbnRleHQsIHNvIGl0IGNhbiBjYWxsIHRoZSBBbmd1bGFyIGluamVjdCBmdW5jdGlvbiB0byBnZXQgYW5kIHVzZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGVcbiAqIEFuZ3VsYXIgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtLlxuXG4gKiBAcmV0dXJucyBESSBwcm92aWRlciB0byBiZSBpbmNsdWRlZCBhIGxpc3Qgb2YgYHByb3ZpZGVyc2AgKGZvciBleGFtcGxlIGF0IGEgY29tcG9uZW50IGxldmVsIG9yXG4gKiBhbnkgb3RoZXIgbGV2ZWwgb2YgdGhlIEFuZ3VsYXIgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtKVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgLy8gLi4uXG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIHByb3ZpZGVXaWRnZXRzQ29uZmlnKChwYXJlbnRDb25maWcpID0+IHtcbiAqICAgICAgIC8vIGZpcnN0IHN0ZXAgY29uZmlndXJhdGlvbjogdHJhbnNmb3JtcyB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb25cbiAqICAgICAgIHBhcmVudENvbmZpZy5yYXRpbmcgPSBwYXJlbnRDb25maWcucmF0aW5nID8/IHt9O1xuICogICAgICAgcGFyZW50Q29uZmlnLnJhdGluZy5jbGFzc05hbWUgPSBgJHtwYXJlbnRDb25maWcucmF0aW5nLmNsYXNzTmFtZSA/PyAnJ30gbXktcmF0aW5nLWV4dHJhLWNsYXNzYFxuICogICAgICAgcmV0dXJuIHBhcmVudENvbmZpZztcbiAqICAgICB9KVxuICogICBdXG4gKiB9KVxuICogY2xhc3MgTXlDb21wb25lbnQge1xuICogICB3aWRnZXRzQ29uZmlnID0gaW5qZWN0V2lkZ2V0c0NvbmZpZygpO1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICB0aGlzLndpZGdldHNDb25maWcuc2V0KHtcbiAqICAgICAgIC8vIHNlY29uZCBzdGVwIGNvbmZpZ3VyYXRpb246IG92ZXJyaWRlcyB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb25cbiAqICAgICAgIHJhdGluZzoge1xuICogICAgICAgICBzbG90U3RhcjogTXlDdXN0b21TbG90U3RhclxuICogICAgICAgfVxuICogICAgIH0pO1xuICogICB9XG4gKiAgIC8vIC4uLlxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBwcm92aWRlV2lkZ2V0c0NvbmZpZyA9IChcblx0YWRhcHRQYXJlbnRDb25maWc/OiAoY29uZmlnOiBQYXJ0aWFsMkxldmVsczxXaWRnZXRzQ29uZmlnPikgPT4gUGFydGlhbDJMZXZlbHM8V2lkZ2V0c0NvbmZpZz5cbik6IEZhY3RvcnlQcm92aWRlciA9PiAoe1xuXHRwcm92aWRlOiB3aWRnZXRzQ29uZmlnSW5qZWN0aW9uVG9rZW4sXG5cdHVzZUZhY3Rvcnk6IChwYXJlbnQ6IFdpZGdldHNDb25maWdTdG9yZTxXaWRnZXRzQ29uZmlnPiB8IG51bGwpID0+IHtcblx0XHRpZiAoYWRhcHRQYXJlbnRDb25maWcpIHtcblx0XHRcdGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblx0XHRcdGNvbnN0IG9yaWdpbmFsQWRhcHRQYXJlbnRDb25maWcgPSBhZGFwdFBhcmVudENvbmZpZztcblx0XHRcdGFkYXB0UGFyZW50Q29uZmlnID0gKHZhbHVlKSA9PiBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IG9yaWdpbmFsQWRhcHRQYXJlbnRDb25maWcodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNyZWF0ZVdpZGdldHNDb25maWcocGFyZW50ID8/IHVuZGVmaW5lZCwgYWRhcHRQYXJlbnRDb25maWcpO1xuXHR9LFxuXHRkZXBzOiBbW25ldyBTa2lwU2VsZigpLCBuZXcgT3B0aW9uYWwoKSwgd2lkZ2V0c0NvbmZpZ0luamVjdGlvblRva2VuXV0sXG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB3aWRnZXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzdG9yZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgY3VycmVudCBpbmplY3Rpb24gY29udGV4dC5cbiAqIFRocm93cyBpZiB0aGUgbm8gd2lkZ2V0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gc3RvcmUgd2FzIHByb3ZpZGVkLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZyb20gYW4gaW5qZWN0aW9uIGNvbnRleHQsIHN1Y2ggYXMgYSBjb25zdHJ1Y3RvciwgYSBmYWN0b3J5IGZ1bmN0aW9uLCBhIGZpZWxkIGluaXRpYWxpemVyIG9yXG4gKiBhIGZ1bmN0aW9uIHVzZWQgd2l0aCB7QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb3JlL3J1bkluSW5qZWN0aW9uQ29udGV4dCB8IHJ1bkluSW5qZWN0aW9uQ29udGV4dH0uXG4gKlxuICogQHJldHVybnMgdGhlIHdpZGdldHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIHN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0V2lkZ2V0c0NvbmZpZyA9ICgpID0+IGluamVjdCh3aWRnZXRzQ29uZmlnSW5qZWN0aW9uVG9rZW4pO1xuXG5jb25zdCBjcmVhdGVQYXRjaFNsb3RzID0gPFQgZXh0ZW5kcyBvYmplY3Q+KHNldDogKG9iamVjdDogUGFydGlhbDxUPikgPT4gdm9pZCkgPT4ge1xuXHRsZXQgbGFzdFZhbHVlOiBQYXJ0aWFsPFQ+ID0ge307XG5cdHJldHVybiAob2JqZWN0OiBUKSA9PiB7XG5cdFx0Y29uc3QgbmV3VmFsdWU6IFBhcnRpYWw8VD4gPSB7fTtcblx0XHRsZXQgaGFzQ2hhbmdlID0gZmFsc2U7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqZWN0KSBhcyAoc3RyaW5nICYga2V5b2YgVClbXSkge1xuXHRcdFx0Y29uc3Qgb2JqZWN0S2V5ID0gKG9iamVjdCBhcyBhbnkpW2tleV07XG5cdFx0XHRpZiAob2JqZWN0S2V5ICE9IG51bGwpIHtcblx0XHRcdFx0Ly8gb25seSB1c2UgZGVmaW5lZCBzbG90c1xuXHRcdFx0XHRuZXdWYWx1ZVtrZXldID0gb2JqZWN0S2V5O1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9iamVjdEtleSAhPSBsYXN0VmFsdWVba2V5XSkge1xuXHRcdFx0XHRoYXNDaGFuZ2UgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoaGFzQ2hhbmdlKSB7XG5cdFx0XHRsYXN0VmFsdWUgPSBuZXdWYWx1ZTtcblx0XHRcdHNldChuZXdWYWx1ZSk7XG5cdFx0fVxuXHR9O1xufTtcblxuZXhwb3J0IHR5cGUgV2l0aFBhdGNoU2xvdHM8VyBleHRlbmRzIFdpZGdldD4gPSBBZGFwdFdpZGdldFNsb3RzPFc+ICYge1xuXHRwYXRjaFNsb3RzKHNsb3RzOiB7XG5cdFx0W0sgaW4ga2V5b2YgV2lkZ2V0UHJvcHM8Vz4gJiBgc2xvdCR7c3RyaW5nfWBdOiBXaWRnZXRQcm9wczxXPltLXSBleHRlbmRzIENvcmVTbG90Q29udGVudDxpbmZlciBVPlxuXHRcdFx0PyBUZW1wbGF0ZVJlZjxBZGFwdFNsb3RDb250ZW50UHJvcHM8VT4+IHwgdW5kZWZpbmVkXG5cdFx0XHQ6IG5ldmVyO1xuXHR9KTogdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBjYWxsV2lkZ2V0RmFjdG9yeSA9IDxXIGV4dGVuZHMgV2lkZ2V0Pihcblx0ZmFjdG9yeTogV2lkZ2V0RmFjdG9yeTxXPixcblx0d2lkZ2V0TmFtZToga2V5b2YgV2lkZ2V0c0NvbmZpZyB8IG51bGwsXG5cdGRlZmF1bHRDb25maWc6IFBhcnRpYWw8QWRhcHRQcm9wc1Nsb3RzPFdpZGdldFByb3BzPFc+Pj4gfCBSZWFkYWJsZVNpZ25hbDxQYXJ0aWFsPEFkYXB0UHJvcHNTbG90czxXaWRnZXRQcm9wczxXPj4+PiA9IHt9XG4pOiBXaXRoUGF0Y2hTbG90czxXPiA9PiB7XG5cdGNvbnN0IGRlZmF1bHRDb25maWdTdG9yZSA9IHR5cGVvZiBkZWZhdWx0Q29uZmlnICE9PSAnZnVuY3Rpb24nID8gcmVhZGFibGUoZGVmYXVsdENvbmZpZykgOiBkZWZhdWx0Q29uZmlnO1xuXHRjb25zdCBzbG90cyQgPSB3cml0YWJsZSh7fSk7XG5cdGNvbnN0IHdpZGdldHNDb25maWcgPSB3aWRnZXROYW1lID8gaW5qZWN0KHdpZGdldHNDb25maWdJbmplY3Rpb25Ub2tlbiwge29wdGlvbmFsOiB0cnVlfSkgOiB1bmRlZmluZWQ7XG5cdHJldHVybiB7XG5cdFx0Li4uKGZhY3RvcnkoXG5cdFx0XHRjb21wdXRlZCgoKSA9PiAoey4uLihkZWZhdWx0Q29uZmlnU3RvcmUoKSBhcyBhbnkpLCAuLi4od2lkZ2V0TmFtZSA/IHdpZGdldHNDb25maWc/LigpW3dpZGdldE5hbWVdIDogdW5kZWZpbmVkKSwgLi4uc2xvdHMkKCl9KSlcblx0XHQpIGFzIGFueSksXG5cdFx0cGF0Y2hTbG90czogY3JlYXRlUGF0Y2hTbG90cyhzbG90cyQuc2V0KSxcblx0fTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFNpbXBsZUNoYW5nZXMocGF0Y2hGbjogKG9iajogYW55KSA9PiB2b2lkLCBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cdGNvbnN0IG9iajogYW55ID0ge307XG5cdGZvciAoY29uc3QgW2tleSwgc2ltcGxlQ2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuXHRcdGlmIChzaW1wbGVDaGFuZ2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b2JqW2tleV0gPSBzaW1wbGVDaGFuZ2UuY3VycmVudFZhbHVlO1xuXHRcdH1cblx0fVxuXHRwYXRjaEZuKG9iaik7XG59XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RTdG9yZVR5cGU8VD4gPSBUIGV4dGVuZHMgU3Vic2NyaWJhYmxlU3RvcmU8aW5mZXIgVT4gPyBVIDogbmV2ZXI7XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of @agnos-ui/angular-headless
|
|
3
|
+
*/
|
|
4
|
+
export * from '@agnos-ui/core';
|
|
5
|
+
export * from './lib/slot.directive';
|
|
6
|
+
export * from './lib/slotDefault.directive';
|
|
7
|
+
export * from './lib/use.directive';
|
|
8
|
+
export * from './lib/utils';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2hlYWRsZXNzL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQixjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgQGFnbm9zLXVpL2FuZ3VsYXItaGVhZGxlc3NcbiAqL1xuXG5leHBvcnQgKiBmcm9tICdAYWdub3MtdWkvY29yZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3Nsb3QuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Nsb3REZWZhdWx0LmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91c2UuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzJztcbmV4cG9ydCB0eXBlIHtTbG90Q29udGVudCwgV2lkZ2V0c0NvbmZpZ30gZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHR5cGUge1dpZGdldFByb3BzLCBXaWRnZXRTdGF0ZX0gZnJvbSAnQGFnbm9zLXVpL2NvcmUnO1xuaW1wb3J0IHR5cGUge0FkYXB0U2xvdENvbnRlbnRQcm9wcywgQWRhcHRXaWRnZXRTbG90c30gZnJvbSAnLi9saWIvdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBBY2NvcmRpb25XaWRnZXQgPSBBZGFwdFdpZGdldFNsb3RzPGltcG9ydCgnQGFnbm9zLXVpL2NvcmUnKS5BY2NvcmRpb25XaWRnZXQ+O1xuZXhwb3J0IHR5cGUgQWNjb3JkaW9uUHJvcHMgPSBXaWRnZXRQcm9wczxBY2NvcmRpb25XaWRnZXQ+O1xuZXhwb3J0IHR5cGUgQWNjb3JkaW9uU3RhdGUgPSBXaWRnZXRTdGF0ZTxBY2NvcmRpb25XaWRnZXQ+O1xuZXhwb3J0IHR5cGUgQWNjb3JkaW9uSXRlbVdpZGdldCA9IEFkYXB0V2lkZ2V0U2xvdHM8aW1wb3J0KCdAYWdub3MtdWkvY29yZScpLkFjY29yZGlvbkl0ZW1XaWRnZXQ+O1xuZXhwb3J0IHR5cGUgQWNjb3JkaW9uSXRlbVByb3BzID0gV2lkZ2V0UHJvcHM8QWNjb3JkaW9uSXRlbVdpZGdldD47XG5leHBvcnQgdHlwZSBBY2NvcmRpb25JdGVtU3RhdGUgPSBXaWRnZXRTdGF0ZTxBY2NvcmRpb25JdGVtV2lkZ2V0PjtcbmV4cG9ydCB0eXBlIEFjY29yZGlvbkl0ZW1Db250ZXh0ID0gQWRhcHRTbG90Q29udGVudFByb3BzPGltcG9ydCgnQGFnbm9zLXVpL2NvcmUnKS5BY2NvcmRpb25JdGVtQ29udGV4dD47XG5cbmV4cG9ydCB0eXBlIEFsZXJ0V2lkZ2V0ID0gQWRhcHRXaWRnZXRTbG90czxpbXBvcnQoJ0BhZ25vcy11aS9jb3JlJykuQWxlcnRXaWRnZXQ+O1xuZXhwb3J0IHR5cGUgQWxlcnRQcm9wcyA9IFdpZGdldFByb3BzPEFsZXJ0V2lkZ2V0PjtcbmV4cG9ydCB0eXBlIEFsZXJ0U3RhdGUgPSBXaWRnZXRTdGF0ZTxBbGVydFdpZGdldD47XG5leHBvcnQgdHlwZSBBbGVydENvbnRleHQgPSBBZGFwdFNsb3RDb250ZW50UHJvcHM8aW1wb3J0KCdAYWdub3MtdWkvY29yZScpLkFsZXJ0Q29udGV4dD47XG5cbmV4cG9ydCB0eXBlIE1vZGFsV2lkZ2V0ID0gQWRhcHRXaWRnZXRTbG90czxpbXBvcnQoJ0BhZ25vcy11aS9jb3JlJykuTW9kYWxXaWRnZXQ+O1xuZXhwb3J0IHR5cGUgTW9kYWxQcm9wcyA9IFdpZGdldFByb3BzPE1vZGFsV2lkZ2V0PjtcbmV4cG9ydCB0eXBlIE1vZGFsU3RhdGUgPSBXaWRnZXRTdGF0ZTxNb2RhbFdpZGdldD47XG5leHBvcnQgdHlwZSBNb2RhbENvbnRleHQgPSBBZGFwdFNsb3RDb250ZW50UHJvcHM8aW1wb3J0KCdAYWdub3MtdWkvY29yZScpLk1vZGFsQ29udGV4dD47XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRpb25XaWRnZXQgPSBBZGFwdFdpZGdldFNsb3RzPGltcG9ydCgnQGFnbm9zLXVpL2NvcmUnKS5QYWdpbmF0aW9uV2lkZ2V0PjtcbmV4cG9ydCB0eXBlIFBhZ2luYXRpb25Qcm9wcyA9IFdpZGdldFByb3BzPFBhZ2luYXRpb25XaWRnZXQ+O1xuZXhwb3J0IHR5cGUgUGFnaW5hdGlvblN0YXRlID0gV2lkZ2V0U3RhdGU8UGFnaW5hdGlvbldpZGdldD47XG5leHBvcnQgdHlwZSBQYWdpbmF0aW9uQ29udGV4dCA9IEFkYXB0U2xvdENvbnRlbnRQcm9wczxpbXBvcnQoJ0BhZ25vcy11aS9jb3JlJykuUGFnaW5hdGlvbkNvbnRleHQ+O1xuZXhwb3J0IHR5cGUgUGFnaW5hdGlvbk51bWJlckNvbnRleHQgPSBBZGFwdFNsb3RDb250ZW50UHJvcHM8aW1wb3J0KCdAYWdub3MtdWkvY29yZScpLlBhZ2luYXRpb25OdW1iZXJDb250ZXh0PjtcblxuZXhwb3J0IHR5cGUgUmF0aW5nV2lkZ2V0ID0gQWRhcHRXaWRnZXRTbG90czxpbXBvcnQoJ0BhZ25vcy11aS9jb3JlJykuUmF0aW5nV2lkZ2V0PjtcbmV4cG9ydCB0eXBlIFJhdGluZ1Byb3BzID0gV2lkZ2V0UHJvcHM8UmF0aW5nV2lkZ2V0PjtcbmV4cG9ydCB0eXBlIFJhdGluZ1N0YXRlID0gV2lkZ2V0U3RhdGU8UmF0aW5nV2lkZ2V0PjtcblxuZXhwb3J0IHR5cGUgU2VsZWN0V2lkZ2V0PEl0ZW0+ID0gQWRhcHRXaWRnZXRTbG90czxpbXBvcnQoJ0BhZ25vcy11aS9jb3JlJykuU2VsZWN0V2lkZ2V0PEl0ZW0+PjtcbmV4cG9ydCB0eXBlIFNlbGVjdFByb3BzPEl0ZW0+ID0gV2lkZ2V0UHJvcHM8U2VsZWN0V2lkZ2V0PEl0ZW0+PjtcbmV4cG9ydCB0eXBlIFNlbGVjdFN0YXRlPEl0ZW0+ID0gV2lkZ2V0U3RhdGU8U2VsZWN0V2lkZ2V0PEl0ZW0+PjtcbiJdfQ==
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { createWidgetsConfig } from '@agnos-ui/core';
|
|
2
|
+
export * from '@agnos-ui/core';
|
|
3
|
+
import { DOCUMENT } from '@angular/common';
|
|
4
|
+
import * as i0 from '@angular/core';
|
|
5
|
+
import { InjectionToken, inject, Injector, runInInjectionContext, SkipSelf, Optional, createComponent, EnvironmentInjector, TemplateRef, reflectComponentType, ViewContainerRef, Directive, Input, ElementRef } from '@angular/core';
|
|
6
|
+
import { readable, writable, computed } from '@amadeus-it-group/tansu';
|
|
7
|
+
|
|
8
|
+
class ComponentTemplate {
|
|
9
|
+
constructor(component, templateProp) {
|
|
10
|
+
this.component = component;
|
|
11
|
+
this.templateProp = templateProp;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Dependency Injection token which can be used to provide or inject the widgets default configuration store.
|
|
16
|
+
*/
|
|
17
|
+
const widgetsConfigInjectionToken = new InjectionToken('widgetsConfig');
|
|
18
|
+
/**
|
|
19
|
+
* Creates a provider of widgets default configuration that inherits from any widgets default configuration already defined at an upper level
|
|
20
|
+
* in the Angular dependency injection system. It contains its own set of widgets configuration properties that override the same properties form
|
|
21
|
+
* the parent configuration.
|
|
22
|
+
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* The configuration is computed from the parent configuration in two steps:
|
|
25
|
+
* - first step: the parent configuration is transformed by the adaptParentConfig function (if specified).
|
|
26
|
+
* If adaptParentConfig is not specified, this step is skipped.
|
|
27
|
+
* - second step: the configuration from step 1 is merged (2-levels deep) with the own$ store. The own$ store initially contains
|
|
28
|
+
* an empty object (i.e. no property from the parent is overridden). It can be changed by calling set on the store returned by
|
|
29
|
+
* {@link injectWidgetsConfig}.
|
|
30
|
+
*
|
|
31
|
+
* @param adaptParentConfig - optional function that receives a 2-levels copy of the widgets default configuration
|
|
32
|
+
* defined at an upper level in the Angular dependency injection system (or an empty object if there is none) and returns the widgets
|
|
33
|
+
* default configuration to be used.
|
|
34
|
+
* It is called only if the configuration is needed, and was not yet computed for the current value of the parent configuration.
|
|
35
|
+
* It is called in a tansu reactive context, so it can use any tansu store and will be called again if those stores change.
|
|
36
|
+
* It is also called in an Angular injection context, so it can call the Angular inject function to get and use dependencies from the
|
|
37
|
+
* Angular dependency injection system.
|
|
38
|
+
|
|
39
|
+
* @returns DI provider to be included a list of `providers` (for example at a component level or
|
|
40
|
+
* any other level of the Angular dependency injection system)
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* @Component({
|
|
45
|
+
* // ...
|
|
46
|
+
* providers: [
|
|
47
|
+
* provideWidgetsConfig((parentConfig) => {
|
|
48
|
+
* // first step configuration: transforms the parent configuration
|
|
49
|
+
* parentConfig.rating = parentConfig.rating ?? {};
|
|
50
|
+
* parentConfig.rating.className = `${parentConfig.rating.className ?? ''} my-rating-extra-class`
|
|
51
|
+
* return parentConfig;
|
|
52
|
+
* })
|
|
53
|
+
* ]
|
|
54
|
+
* })
|
|
55
|
+
* class MyComponent {
|
|
56
|
+
* widgetsConfig = injectWidgetsConfig();
|
|
57
|
+
* constructor() {
|
|
58
|
+
* this.widgetsConfig.set({
|
|
59
|
+
* // second step configuration: overrides the parent configuration
|
|
60
|
+
* rating: {
|
|
61
|
+
* slotStar: MyCustomSlotStar
|
|
62
|
+
* }
|
|
63
|
+
* });
|
|
64
|
+
* }
|
|
65
|
+
* // ...
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
const provideWidgetsConfig = (adaptParentConfig) => ({
|
|
70
|
+
provide: widgetsConfigInjectionToken,
|
|
71
|
+
useFactory: (parent) => {
|
|
72
|
+
if (adaptParentConfig) {
|
|
73
|
+
const injector = inject(Injector);
|
|
74
|
+
const originalAdaptParentConfig = adaptParentConfig;
|
|
75
|
+
adaptParentConfig = (value) => runInInjectionContext(injector, () => originalAdaptParentConfig(value));
|
|
76
|
+
}
|
|
77
|
+
return createWidgetsConfig(parent ?? undefined, adaptParentConfig);
|
|
78
|
+
},
|
|
79
|
+
deps: [[new SkipSelf(), new Optional(), widgetsConfigInjectionToken]],
|
|
80
|
+
});
|
|
81
|
+
/**
|
|
82
|
+
* Returns the widgets default configuration store that was provided in the current injection context.
|
|
83
|
+
* Throws if the no widgets default configuration store was provided.
|
|
84
|
+
*
|
|
85
|
+
* @remarks
|
|
86
|
+
* This function must be called from an injection context, such as a constructor, a factory function, a field initializer or
|
|
87
|
+
* a function used with {@link https://angular.io/api/core/runInInjectionContext | runInInjectionContext}.
|
|
88
|
+
*
|
|
89
|
+
* @returns the widgets default configuration store.
|
|
90
|
+
*/
|
|
91
|
+
const injectWidgetsConfig = () => inject(widgetsConfigInjectionToken);
|
|
92
|
+
const createPatchSlots = (set) => {
|
|
93
|
+
let lastValue = {};
|
|
94
|
+
return (object) => {
|
|
95
|
+
const newValue = {};
|
|
96
|
+
let hasChange = false;
|
|
97
|
+
for (const key of Object.keys(object)) {
|
|
98
|
+
const objectKey = object[key];
|
|
99
|
+
if (objectKey != null) {
|
|
100
|
+
// only use defined slots
|
|
101
|
+
newValue[key] = objectKey;
|
|
102
|
+
}
|
|
103
|
+
if (objectKey != lastValue[key]) {
|
|
104
|
+
hasChange = true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (hasChange) {
|
|
108
|
+
lastValue = newValue;
|
|
109
|
+
set(newValue);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
const callWidgetFactory = (factory, widgetName, defaultConfig = {}) => {
|
|
114
|
+
const defaultConfigStore = typeof defaultConfig !== 'function' ? readable(defaultConfig) : defaultConfig;
|
|
115
|
+
const slots$ = writable({});
|
|
116
|
+
const widgetsConfig = widgetName ? inject(widgetsConfigInjectionToken, { optional: true }) : undefined;
|
|
117
|
+
return {
|
|
118
|
+
...factory(computed(() => ({ ...defaultConfigStore(), ...(widgetName ? widgetsConfig?.()[widgetName] : undefined), ...slots$() }))),
|
|
119
|
+
patchSlots: createPatchSlots(slots$.set),
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
function patchSimpleChanges(patchFn, changes) {
|
|
123
|
+
const obj = {};
|
|
124
|
+
for (const [key, simpleChange] of Object.entries(changes)) {
|
|
125
|
+
if (simpleChange !== undefined) {
|
|
126
|
+
obj[key] = simpleChange.currentValue;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
patchFn(obj);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
class SlotHandler {
|
|
133
|
+
constructor(viewContainerRef, document) {
|
|
134
|
+
this.viewContainerRef = viewContainerRef;
|
|
135
|
+
this.document = document;
|
|
136
|
+
}
|
|
137
|
+
slotChange(slot, props) { }
|
|
138
|
+
propsChange(slot, props) { }
|
|
139
|
+
destroy() { }
|
|
140
|
+
}
|
|
141
|
+
class StringSlotHandler extends SlotHandler {
|
|
142
|
+
#nodeRef;
|
|
143
|
+
#previousText = '';
|
|
144
|
+
slotChange(slot) {
|
|
145
|
+
if (slot === this.#previousText) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
this.#previousText = slot;
|
|
149
|
+
if (this.#nodeRef) {
|
|
150
|
+
this.#nodeRef.textContent = slot;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const viewContainerElement = this.viewContainerRef.element.nativeElement;
|
|
154
|
+
if (this.document && viewContainerElement?.parentNode) {
|
|
155
|
+
this.#nodeRef = viewContainerElement.parentNode.insertBefore(this.document.createTextNode(slot), viewContainerElement);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
destroy() {
|
|
160
|
+
this.#nodeRef?.parentNode?.removeChild(this.#nodeRef);
|
|
161
|
+
this.#nodeRef = undefined;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
class FunctionSlotHandler extends SlotHandler {
|
|
165
|
+
#stringSlotHandler = new StringSlotHandler(this.viewContainerRef, this.document);
|
|
166
|
+
slotChange(slot, props) {
|
|
167
|
+
this.#stringSlotHandler.slotChange(slot(props));
|
|
168
|
+
}
|
|
169
|
+
propsChange(slot, props) {
|
|
170
|
+
this.#stringSlotHandler.slotChange(slot(props));
|
|
171
|
+
}
|
|
172
|
+
destroy() {
|
|
173
|
+
this.#stringSlotHandler.destroy();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
class ComponentSlotHandler extends SlotHandler {
|
|
177
|
+
#componentRef;
|
|
178
|
+
#properties;
|
|
179
|
+
slotChange(slot, props) {
|
|
180
|
+
if (this.#componentRef) {
|
|
181
|
+
this.destroy();
|
|
182
|
+
}
|
|
183
|
+
this.#componentRef = this.viewContainerRef.createComponent(slot);
|
|
184
|
+
this.#applyProperties(props);
|
|
185
|
+
}
|
|
186
|
+
#applyProperties(props, oldProperties) {
|
|
187
|
+
const properties = Object.keys(props);
|
|
188
|
+
this.#properties = properties;
|
|
189
|
+
const componentRef = this.#componentRef;
|
|
190
|
+
for (const property of properties) {
|
|
191
|
+
componentRef.setInput(property, props[property]);
|
|
192
|
+
oldProperties?.delete(property);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
propsChange(slot, props) {
|
|
196
|
+
const oldProperties = new Set(this.#properties);
|
|
197
|
+
this.#applyProperties(props, oldProperties);
|
|
198
|
+
const componentRef = this.#componentRef;
|
|
199
|
+
for (const property of oldProperties) {
|
|
200
|
+
componentRef.setInput(property, undefined);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
destroy() {
|
|
204
|
+
this.viewContainerRef.clear();
|
|
205
|
+
this.#componentRef = undefined;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
class TemplateRefSlotHandler extends SlotHandler {
|
|
209
|
+
#viewRef;
|
|
210
|
+
#props;
|
|
211
|
+
slotChange(slot, props) {
|
|
212
|
+
if (this.#viewRef) {
|
|
213
|
+
this.destroy();
|
|
214
|
+
}
|
|
215
|
+
props = { ...props };
|
|
216
|
+
this.#props = props;
|
|
217
|
+
this.#viewRef = this.viewContainerRef.createEmbeddedView(slot, props);
|
|
218
|
+
}
|
|
219
|
+
propsChange(slot, props) {
|
|
220
|
+
if (this.#viewRef) {
|
|
221
|
+
const templateProps = this.#props;
|
|
222
|
+
const oldProperties = new Set(Object.keys(templateProps));
|
|
223
|
+
for (const property of Object.keys(props)) {
|
|
224
|
+
templateProps[property] = props[property];
|
|
225
|
+
oldProperties.delete(property);
|
|
226
|
+
}
|
|
227
|
+
for (const oldProperty of oldProperties) {
|
|
228
|
+
delete templateProps[oldProperty];
|
|
229
|
+
}
|
|
230
|
+
this.#viewRef.markForCheck();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
destroy() {
|
|
234
|
+
this.viewContainerRef.clear();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
class ComponentTemplateSlotHandler extends SlotHandler {
|
|
238
|
+
#componentRef;
|
|
239
|
+
#templateSlotHandler = new TemplateRefSlotHandler(this.viewContainerRef, this.document);
|
|
240
|
+
#templateRef;
|
|
241
|
+
slotChange(slot, props) {
|
|
242
|
+
if (this.#componentRef) {
|
|
243
|
+
this.destroy();
|
|
244
|
+
}
|
|
245
|
+
this.#componentRef = createComponent(slot.component, {
|
|
246
|
+
elementInjector: this.viewContainerRef.injector,
|
|
247
|
+
environmentInjector: this.viewContainerRef.injector.get(EnvironmentInjector),
|
|
248
|
+
});
|
|
249
|
+
this.#templateRef = this.#componentRef.instance[slot.templateProp];
|
|
250
|
+
this.#templateSlotHandler.slotChange(this.#templateRef, props);
|
|
251
|
+
}
|
|
252
|
+
propsChange(slot, props) {
|
|
253
|
+
this.#templateSlotHandler.propsChange(this.#templateRef, props);
|
|
254
|
+
}
|
|
255
|
+
destroy() {
|
|
256
|
+
this.#templateSlotHandler.destroy();
|
|
257
|
+
this.#componentRef?.destroy();
|
|
258
|
+
this.#componentRef = undefined;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const getSlotType = (value) => {
|
|
262
|
+
if (!value)
|
|
263
|
+
return undefined;
|
|
264
|
+
const type = typeof value;
|
|
265
|
+
switch (type) {
|
|
266
|
+
case 'string':
|
|
267
|
+
return StringSlotHandler;
|
|
268
|
+
case 'function':
|
|
269
|
+
if (reflectComponentType(value)) {
|
|
270
|
+
return ComponentSlotHandler;
|
|
271
|
+
}
|
|
272
|
+
return FunctionSlotHandler;
|
|
273
|
+
case 'object':
|
|
274
|
+
if (value instanceof TemplateRef) {
|
|
275
|
+
return TemplateRefSlotHandler;
|
|
276
|
+
}
|
|
277
|
+
if (value instanceof ComponentTemplate) {
|
|
278
|
+
return ComponentTemplateSlotHandler;
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
return undefined;
|
|
283
|
+
};
|
|
284
|
+
class SlotDirective {
|
|
285
|
+
constructor() {
|
|
286
|
+
this._viewContainerRef = inject(ViewContainerRef);
|
|
287
|
+
this._document = inject(DOCUMENT);
|
|
288
|
+
}
|
|
289
|
+
ngOnChanges(changes) {
|
|
290
|
+
const slotChange = changes['slot'];
|
|
291
|
+
const propsChange = changes['props'];
|
|
292
|
+
const slot = this.slot;
|
|
293
|
+
if (slotChange) {
|
|
294
|
+
const newSlotType = getSlotType(slot);
|
|
295
|
+
if (newSlotType !== this._slotType) {
|
|
296
|
+
this._slotHandler?.destroy();
|
|
297
|
+
this._slotHandler = newSlotType ? new newSlotType(this._viewContainerRef, this._document) : undefined;
|
|
298
|
+
this._slotType = newSlotType;
|
|
299
|
+
}
|
|
300
|
+
this._slotHandler?.slotChange(slot, this.props);
|
|
301
|
+
}
|
|
302
|
+
else if (propsChange) {
|
|
303
|
+
this._slotHandler?.propsChange(slot, this.props);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
ngOnDestroy() {
|
|
307
|
+
this._slotHandler?.destroy();
|
|
308
|
+
this._slotHandler = undefined;
|
|
309
|
+
}
|
|
310
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
311
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: SlotDirective, isStandalone: true, selector: "[auSlot]", inputs: { slot: ["auSlot", "slot"], props: ["auSlotProps", "props"] }, usesOnChanges: true, ngImport: i0 }); }
|
|
312
|
+
}
|
|
313
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDirective, decorators: [{
|
|
314
|
+
type: Directive,
|
|
315
|
+
args: [{
|
|
316
|
+
selector: '[auSlot]',
|
|
317
|
+
standalone: true,
|
|
318
|
+
}]
|
|
319
|
+
}], propDecorators: { slot: [{
|
|
320
|
+
type: Input,
|
|
321
|
+
args: ['auSlot']
|
|
322
|
+
}], props: [{
|
|
323
|
+
type: Input,
|
|
324
|
+
args: ['auSlotProps']
|
|
325
|
+
}] } });
|
|
326
|
+
|
|
327
|
+
class SlotDefaultDirective {
|
|
328
|
+
constructor() {
|
|
329
|
+
this.templateRef = inject((TemplateRef));
|
|
330
|
+
}
|
|
331
|
+
ngOnInit() {
|
|
332
|
+
this.auSlotDefault.update((value) => ({ ...value, slotDefault: this.templateRef }));
|
|
333
|
+
}
|
|
334
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDefaultDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
335
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: SlotDefaultDirective, isStandalone: true, selector: "[auSlotDefault]", inputs: { auSlotDefault: "auSlotDefault" }, ngImport: i0 }); }
|
|
336
|
+
}
|
|
337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: SlotDefaultDirective, decorators: [{
|
|
338
|
+
type: Directive,
|
|
339
|
+
args: [{ selector: '[auSlotDefault]', standalone: true }]
|
|
340
|
+
}], propDecorators: { auSlotDefault: [{
|
|
341
|
+
type: Input,
|
|
342
|
+
args: ['auSlotDefault']
|
|
343
|
+
}] } });
|
|
344
|
+
|
|
345
|
+
// All calls of the directive in this class are done asynchronously (with await 0)
|
|
346
|
+
// in order to avoid ExpressionChangedAfterItHasBeenCheckedError
|
|
347
|
+
// or the corresponding issue with signals (https://github.com/angular/angular/issues/50320)
|
|
348
|
+
// This is relevant especially if calling the directive changes variables used in a template.
|
|
349
|
+
class UseDirective {
|
|
350
|
+
#ref = inject(ElementRef);
|
|
351
|
+
#directive;
|
|
352
|
+
#directiveInstance;
|
|
353
|
+
async #destroyDirectiveInstance() {
|
|
354
|
+
const directiveInstance = this.#directiveInstance;
|
|
355
|
+
this.#directiveInstance = undefined;
|
|
356
|
+
if (directiveInstance?.destroy) {
|
|
357
|
+
await 0;
|
|
358
|
+
directiveInstance.destroy?.();
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
async ngOnChanges(changes) {
|
|
362
|
+
if (this.use !== this.#directive) {
|
|
363
|
+
this.#destroyDirectiveInstance();
|
|
364
|
+
const directive = this.use;
|
|
365
|
+
this.#directive = directive;
|
|
366
|
+
if (directive) {
|
|
367
|
+
await 0;
|
|
368
|
+
// checks that the directive did not change while waiting:
|
|
369
|
+
if (directive === this.#directive && !this.#directiveInstance) {
|
|
370
|
+
this.#directiveInstance = directive(this.#ref.nativeElement, this.params);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else if (changes['params']) {
|
|
375
|
+
await 0;
|
|
376
|
+
this.#directiveInstance?.update?.(this.params);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
ngOnDestroy() {
|
|
380
|
+
this.#destroyDirectiveInstance();
|
|
381
|
+
this.#directive = undefined;
|
|
382
|
+
}
|
|
383
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: UseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
384
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: UseDirective, isStandalone: true, selector: "[auUse]", inputs: { use: ["auUse", "use"], params: ["auUseParams", "params"] }, usesOnChanges: true, ngImport: i0 }); }
|
|
385
|
+
}
|
|
386
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: UseDirective, decorators: [{
|
|
387
|
+
type: Directive,
|
|
388
|
+
args: [{
|
|
389
|
+
standalone: true,
|
|
390
|
+
selector: '[auUse]',
|
|
391
|
+
}]
|
|
392
|
+
}], propDecorators: { use: [{
|
|
393
|
+
type: Input,
|
|
394
|
+
args: ['auUse']
|
|
395
|
+
}], params: [{
|
|
396
|
+
type: Input,
|
|
397
|
+
args: ['auUseParams']
|
|
398
|
+
}] } });
|
|
399
|
+
|
|
400
|
+
/*
|
|
401
|
+
* Public API Surface of @agnos-ui/angular-headless
|
|
402
|
+
*/
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Generated bundle index. Do not edit.
|
|
406
|
+
*/
|
|
407
|
+
|
|
408
|
+
export { ComponentTemplate, SlotDefaultDirective, SlotDirective, UseDirective, callWidgetFactory, injectWidgetsConfig, patchSimpleChanges, provideWidgetsConfig, widgetsConfigInjectionToken };
|
|
409
|
+
//# sourceMappingURL=agnos-ui-angular-headless.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agnos-ui-angular-headless.mjs","sources":["../../../headless/src/lib/utils.ts","../../../headless/src/lib/slot.directive.ts","../../../headless/src/lib/slotDefault.directive.ts","../../../headless/src/lib/use.directive.ts","../../../headless/src/public-api.ts","../../../headless/src/agnos-ui-angular-headless.ts"],"sourcesContent":["import type {\n\tSlotContent as CoreSlotContent,\n\tWidgetsConfig as CoreWidgetsConfig,\n\tPartial2Levels,\n\tWidget,\n\tWidgetFactory,\n\tWidgetProps,\n\tWidgetSlotContext,\n\tWidgetState,\n\tWidgetsConfigStore,\n} from '@agnos-ui/core';\nimport {createWidgetsConfig} from '@agnos-ui/core';\nimport type {ReadableSignal, SubscribableStore} from '@amadeus-it-group/tansu';\nimport {computed, readable, writable} from '@amadeus-it-group/tansu';\nimport type {FactoryProvider, SimpleChanges, TemplateRef, Type} from '@angular/core';\nimport {InjectionToken, Injector, Optional, SkipSelf, inject, runInInjectionContext} from '@angular/core';\n\nexport class ComponentTemplate<Props, K extends string, T extends {[key in K]: TemplateRef<Props>}> {\n\tconstructor(public readonly component: Type<T>, public readonly templateProp: K) {}\n}\n\nexport type SlotContent<Props extends object = object> =\n\t| CoreSlotContent<Props>\n\t| TemplateRef<Props>\n\t| Type<unknown>\n\t| ComponentTemplate<Props, any, any>;\n\nexport type AdaptSlotContentProps<Props extends Record<string, any>> = Props extends WidgetSlotContext<infer U>\n\t? WidgetSlotContext<AdaptWidgetSlots<U>> & AdaptPropsSlots<Omit<Props, keyof WidgetSlotContext<any>>>\n\t: AdaptPropsSlots<Props>;\n\nexport type AdaptPropsSlots<Props> = Omit<Props, `slot${string}`> & {\n\t[K in keyof Props & `slot${string}`]: Props[K] extends CoreSlotContent<infer U> ? SlotContent<AdaptSlotContentProps<U>> : Props[K];\n};\n\nexport type AdaptWidgetSlots<W extends Widget> = Widget<\n\tAdaptPropsSlots<WidgetProps<W>>,\n\tAdaptPropsSlots<WidgetState<W>>,\n\tW['api'],\n\tW['actions'],\n\tW['directives']\n>;\n\nexport type WidgetsConfig = {\n\t[WidgetName in keyof CoreWidgetsConfig]: AdaptPropsSlots<CoreWidgetsConfig[WidgetName]>;\n};\n\n/**\n * Dependency Injection token which can be used to provide or inject the widgets default configuration store.\n */\nexport const widgetsConfigInjectionToken = new InjectionToken<WidgetsConfigStore<WidgetsConfig>>('widgetsConfig');\n\n/**\n * Creates a provider of widgets default configuration that inherits from any widgets default configuration already defined at an upper level\n * in the Angular dependency injection system. It contains its own set of widgets configuration properties that override the same properties form\n * the parent configuration.\n *\n * @remarks\n * The configuration is computed from the parent configuration in two steps:\n * - first step: the parent configuration is transformed by the adaptParentConfig function (if specified).\n * If adaptParentConfig is not specified, this step is skipped.\n * - second step: the configuration from step 1 is merged (2-levels deep) with the own$ store. The own$ store initially contains\n * an empty object (i.e. no property from the parent is overridden). It can be changed by calling set on the store returned by\n * {@link injectWidgetsConfig}.\n *\n * @param adaptParentConfig - optional function that receives a 2-levels copy of the widgets default configuration\n * defined at an upper level in the Angular dependency injection system (or an empty object if there is none) and returns the widgets\n * default configuration to be used.\n * It is called only if the configuration is needed, and was not yet computed for the current value of the parent configuration.\n * It is called in a tansu reactive context, so it can use any tansu store and will be called again if those stores change.\n * It is also called in an Angular injection context, so it can call the Angular inject function to get and use dependencies from the\n * Angular dependency injection system.\n\n * @returns DI provider to be included a list of `providers` (for example at a component level or\n * any other level of the Angular dependency injection system)\n *\n * @example\n * ```typescript\n * @Component({\n * // ...\n * providers: [\n * provideWidgetsConfig((parentConfig) => {\n * // first step configuration: transforms the parent configuration\n * parentConfig.rating = parentConfig.rating ?? {};\n * parentConfig.rating.className = `${parentConfig.rating.className ?? ''} my-rating-extra-class`\n * return parentConfig;\n * })\n * ]\n * })\n * class MyComponent {\n * widgetsConfig = injectWidgetsConfig();\n * constructor() {\n * this.widgetsConfig.set({\n * // second step configuration: overrides the parent configuration\n * rating: {\n * slotStar: MyCustomSlotStar\n * }\n * });\n * }\n * // ...\n * }\n * ```\n */\nexport const provideWidgetsConfig = (\n\tadaptParentConfig?: (config: Partial2Levels<WidgetsConfig>) => Partial2Levels<WidgetsConfig>\n): FactoryProvider => ({\n\tprovide: widgetsConfigInjectionToken,\n\tuseFactory: (parent: WidgetsConfigStore<WidgetsConfig> | null) => {\n\t\tif (adaptParentConfig) {\n\t\t\tconst injector = inject(Injector);\n\t\t\tconst originalAdaptParentConfig = adaptParentConfig;\n\t\t\tadaptParentConfig = (value) => runInInjectionContext(injector, () => originalAdaptParentConfig(value));\n\t\t}\n\t\treturn createWidgetsConfig(parent ?? undefined, adaptParentConfig);\n\t},\n\tdeps: [[new SkipSelf(), new Optional(), widgetsConfigInjectionToken]],\n});\n\n/**\n * Returns the widgets default configuration store that was provided in the current injection context.\n * Throws if the no widgets default configuration store was provided.\n *\n * @remarks\n * This function must be called from an injection context, such as a constructor, a factory function, a field initializer or\n * a function used with {@link https://angular.io/api/core/runInInjectionContext | runInInjectionContext}.\n *\n * @returns the widgets default configuration store.\n */\nexport const injectWidgetsConfig = () => inject(widgetsConfigInjectionToken);\n\nconst createPatchSlots = <T extends object>(set: (object: Partial<T>) => void) => {\n\tlet lastValue: Partial<T> = {};\n\treturn (object: T) => {\n\t\tconst newValue: Partial<T> = {};\n\t\tlet hasChange = false;\n\t\tfor (const key of Object.keys(object) as (string & keyof T)[]) {\n\t\t\tconst objectKey = (object as any)[key];\n\t\t\tif (objectKey != null) {\n\t\t\t\t// only use defined slots\n\t\t\t\tnewValue[key] = objectKey;\n\t\t\t}\n\t\t\tif (objectKey != lastValue[key]) {\n\t\t\t\thasChange = true;\n\t\t\t}\n\t\t}\n\t\tif (hasChange) {\n\t\t\tlastValue = newValue;\n\t\t\tset(newValue);\n\t\t}\n\t};\n};\n\nexport type WithPatchSlots<W extends Widget> = AdaptWidgetSlots<W> & {\n\tpatchSlots(slots: {\n\t\t[K in keyof WidgetProps<W> & `slot${string}`]: WidgetProps<W>[K] extends CoreSlotContent<infer U>\n\t\t\t? TemplateRef<AdaptSlotContentProps<U>> | undefined\n\t\t\t: never;\n\t}): void;\n};\n\nexport const callWidgetFactory = <W extends Widget>(\n\tfactory: WidgetFactory<W>,\n\twidgetName: keyof WidgetsConfig | null,\n\tdefaultConfig: Partial<AdaptPropsSlots<WidgetProps<W>>> | ReadableSignal<Partial<AdaptPropsSlots<WidgetProps<W>>>> = {}\n): WithPatchSlots<W> => {\n\tconst defaultConfigStore = typeof defaultConfig !== 'function' ? readable(defaultConfig) : defaultConfig;\n\tconst slots$ = writable({});\n\tconst widgetsConfig = widgetName ? inject(widgetsConfigInjectionToken, {optional: true}) : undefined;\n\treturn {\n\t\t...(factory(\n\t\t\tcomputed(() => ({...(defaultConfigStore() as any), ...(widgetName ? widgetsConfig?.()[widgetName] : undefined), ...slots$()}))\n\t\t) as any),\n\t\tpatchSlots: createPatchSlots(slots$.set),\n\t};\n};\n\nexport function patchSimpleChanges(patchFn: (obj: any) => void, changes: SimpleChanges) {\n\tconst obj: any = {};\n\tfor (const [key, simpleChange] of Object.entries(changes)) {\n\t\tif (simpleChange !== undefined) {\n\t\t\tobj[key] = simpleChange.currentValue;\n\t\t}\n\t}\n\tpatchFn(obj);\n}\n\nexport type ExtractStoreType<T> = T extends SubscribableStore<infer U> ? U : never;\n","import {DOCUMENT} from '@angular/common';\nimport type {ComponentRef, EmbeddedViewRef, OnChanges, OnDestroy, SimpleChanges, Type} from '@angular/core';\nimport {Directive, EnvironmentInjector, Input, TemplateRef, ViewContainerRef, createComponent, inject, reflectComponentType} from '@angular/core';\nimport type {SlotContent} from './utils';\nimport {ComponentTemplate} from './utils';\n\nabstract class SlotHandler<Props extends Record<string, any>, Slot extends SlotContent<Props> = SlotContent<Props>> {\n\tconstructor(public viewContainerRef: ViewContainerRef, public document: Document) {}\n\tslotChange(slot: Slot, props: Props) {}\n\tpropsChange(slot: Slot, props: Props) {}\n\tdestroy() {}\n}\n\nclass StringSlotHandler<Props extends Record<string, any>> extends SlotHandler<Props, string> {\n\t#nodeRef: Text | undefined;\n\t#previousText = '';\n\n\toverride slotChange(slot: string): void {\n\t\tif (slot === this.#previousText) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#previousText = slot;\n\t\tif (this.#nodeRef) {\n\t\t\tthis.#nodeRef.textContent = slot;\n\t\t} else {\n\t\t\tconst viewContainerElement: Comment | undefined = this.viewContainerRef.element.nativeElement;\n\t\t\tif (this.document && viewContainerElement?.parentNode) {\n\t\t\t\tthis.#nodeRef = viewContainerElement.parentNode.insertBefore(this.document.createTextNode(slot), viewContainerElement);\n\t\t\t}\n\t\t}\n\t}\n\n\toverride destroy(): void {\n\t\tthis.#nodeRef?.parentNode?.removeChild(this.#nodeRef);\n\t\tthis.#nodeRef = undefined;\n\t}\n}\n\nclass FunctionSlotHandler<Props extends Record<string, any>> extends SlotHandler<Props, (props: Props) => string> {\n\t#stringSlotHandler = new StringSlotHandler(this.viewContainerRef, this.document);\n\n\toverride slotChange(slot: (props: Props) => string, props: Props): void {\n\t\tthis.#stringSlotHandler.slotChange(slot(props));\n\t}\n\n\toverride propsChange(slot: (props: Props) => string, props: Props): void {\n\t\tthis.#stringSlotHandler.slotChange(slot(props));\n\t}\n\n\toverride destroy(): void {\n\t\tthis.#stringSlotHandler.destroy();\n\t}\n}\n\nclass ComponentSlotHandler<Props extends Record<string, any>> extends SlotHandler<Props, Type<unknown>> {\n\t#componentRef: ComponentRef<any> | undefined;\n\t#properties: string[];\n\n\toverride slotChange(slot: Type<unknown>, props: Props): void {\n\t\tif (this.#componentRef) {\n\t\t\tthis.destroy();\n\t\t}\n\t\tthis.#componentRef = this.viewContainerRef.createComponent(slot);\n\t\tthis.#applyProperties(props);\n\t}\n\n\t#applyProperties(props: Props, oldProperties?: Set<string>) {\n\t\tconst properties = Object.keys(props);\n\t\tthis.#properties = properties;\n\t\tconst componentRef = this.#componentRef!;\n\t\tfor (const property of properties) {\n\t\t\tcomponentRef.setInput(property, props[property]);\n\t\t\toldProperties?.delete(property);\n\t\t}\n\t}\n\n\toverride propsChange(slot: Type<unknown>, props: Props): void {\n\t\tconst oldProperties = new Set(this.#properties);\n\t\tthis.#applyProperties(props, oldProperties);\n\t\tconst componentRef = this.#componentRef!;\n\t\tfor (const property of oldProperties) {\n\t\t\tcomponentRef.setInput(property, undefined);\n\t\t}\n\t}\n\n\toverride destroy(): void {\n\t\tthis.viewContainerRef.clear();\n\t\tthis.#componentRef = undefined;\n\t}\n}\n\nclass TemplateRefSlotHandler<Props extends Record<string, any>> extends SlotHandler<Props, TemplateRef<Props>> {\n\t#viewRef: EmbeddedViewRef<Props> | undefined;\n\t#props: Props;\n\n\toverride slotChange(slot: TemplateRef<Props>, props: Props): void {\n\t\tif (this.#viewRef) {\n\t\t\tthis.destroy();\n\t\t}\n\t\tprops = {...props};\n\t\tthis.#props = props;\n\t\tthis.#viewRef = this.viewContainerRef.createEmbeddedView(slot, props);\n\t}\n\n\toverride propsChange(slot: TemplateRef<Props>, props: Props): void {\n\t\tif (this.#viewRef) {\n\t\t\tconst templateProps = this.#props;\n\t\t\tconst oldProperties = new Set<keyof Props>(Object.keys(templateProps));\n\t\t\tfor (const property of Object.keys(props) as (keyof Props)[]) {\n\t\t\t\ttemplateProps[property] = props[property];\n\t\t\t\toldProperties.delete(property);\n\t\t\t}\n\t\t\tfor (const oldProperty of oldProperties) {\n\t\t\t\tdelete templateProps[oldProperty];\n\t\t\t}\n\t\t\tthis.#viewRef.markForCheck();\n\t\t}\n\t}\n\n\toverride destroy(): void {\n\t\tthis.viewContainerRef.clear();\n\t}\n}\n\nclass ComponentTemplateSlotHandler<\n\tProps extends Record<string, any>,\n\tK extends string,\n\tT extends {[key in K]: TemplateRef<Props>}\n> extends SlotHandler<Props, ComponentTemplate<Props, K, T>> {\n\t#componentRef: ComponentRef<T> | undefined;\n\t#templateSlotHandler = new TemplateRefSlotHandler(this.viewContainerRef, this.document);\n\t#templateRef: TemplateRef<Props> | undefined;\n\n\toverride slotChange(slot: ComponentTemplate<Props, K, T>, props: Props): void {\n\t\tif (this.#componentRef) {\n\t\t\tthis.destroy();\n\t\t}\n\t\tthis.#componentRef = createComponent(slot.component, {\n\t\t\telementInjector: this.viewContainerRef.injector,\n\t\t\tenvironmentInjector: this.viewContainerRef.injector.get(EnvironmentInjector),\n\t\t});\n\t\tthis.#templateRef = this.#componentRef.instance[slot.templateProp];\n\t\tthis.#templateSlotHandler.slotChange(this.#templateRef, props);\n\t}\n\n\toverride propsChange(slot: ComponentTemplate<Props, K, T>, props: Props): void {\n\t\tthis.#templateSlotHandler.propsChange(this.#templateRef!, props);\n\t}\n\n\toverride destroy(): void {\n\t\tthis.#templateSlotHandler.destroy();\n\t\tthis.#componentRef?.destroy();\n\t\tthis.#componentRef = undefined;\n\t}\n}\n\nconst getSlotType = (value: any): undefined | {new (viewContainerRef: ViewContainerRef, document: Document): SlotHandler<any>} => {\n\tif (!value) return undefined;\n\tconst type = typeof value;\n\tswitch (type) {\n\t\tcase 'string':\n\t\t\treturn StringSlotHandler;\n\t\tcase 'function':\n\t\t\tif (reflectComponentType(value)) {\n\t\t\t\treturn ComponentSlotHandler;\n\t\t\t}\n\t\t\treturn FunctionSlotHandler;\n\t\tcase 'object':\n\t\t\tif (value instanceof TemplateRef) {\n\t\t\t\treturn TemplateRefSlotHandler;\n\t\t\t}\n\t\t\tif (value instanceof ComponentTemplate) {\n\t\t\t\treturn ComponentTemplateSlotHandler;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn undefined;\n};\n\n@Directive({\n\tselector: '[auSlot]',\n\tstandalone: true,\n})\nexport class SlotDirective<Props extends Record<string, any>> implements OnChanges, OnDestroy {\n\t@Input('auSlot') slot: SlotContent<Props>;\n\t@Input('auSlotProps') props: Props;\n\n\tprivate _viewContainerRef = inject(ViewContainerRef);\n\tprivate _document = inject(DOCUMENT);\n\tprivate _slotType: ReturnType<typeof getSlotType>;\n\tprivate _slotHandler: SlotHandler<Props> | undefined;\n\n\tngOnChanges(changes: SimpleChanges): void {\n\t\tconst slotChange = changes['slot'];\n\t\tconst propsChange = changes['props'];\n\t\tconst slot = this.slot;\n\t\tif (slotChange) {\n\t\t\tconst newSlotType = getSlotType(slot);\n\t\t\tif (newSlotType !== this._slotType) {\n\t\t\t\tthis._slotHandler?.destroy();\n\t\t\t\tthis._slotHandler = newSlotType ? new newSlotType(this._viewContainerRef, this._document) : undefined;\n\t\t\t\tthis._slotType = newSlotType;\n\t\t\t}\n\t\t\tthis._slotHandler?.slotChange(slot, this.props);\n\t\t} else if (propsChange) {\n\t\t\tthis._slotHandler?.propsChange(slot, this.props);\n\t\t}\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis._slotHandler?.destroy();\n\t\tthis._slotHandler = undefined;\n\t}\n}\n","import type {WritableSignal} from '@amadeus-it-group/tansu';\nimport type {OnInit} from '@angular/core';\nimport {Directive, Input, TemplateRef, inject} from '@angular/core';\nimport type {SlotContent} from './utils';\n\n@Directive({selector: '[auSlotDefault]', standalone: true})\nexport class SlotDefaultDirective<T extends object> implements OnInit {\n\t@Input('auSlotDefault') auSlotDefault: WritableSignal<{slotDefault?: SlotContent<T>}>;\n\n\ttemplateRef = inject(TemplateRef<T>);\n\n\tngOnInit(): void {\n\t\tthis.auSlotDefault.update((value) => ({...value, slotDefault: this.templateRef}));\n\t}\n}\n","import type {OnChanges, OnDestroy, SimpleChanges} from '@angular/core';\nimport {Directive, ElementRef, inject, Input} from '@angular/core';\nimport type {Directive as AgnosUIDirective} from '@agnos-ui/core';\n\n// All calls of the directive in this class are done asynchronously (with await 0)\n// in order to avoid ExpressionChangedAfterItHasBeenCheckedError\n// or the corresponding issue with signals (https://github.com/angular/angular/issues/50320)\n// This is relevant especially if calling the directive changes variables used in a template.\n\n@Directive({\n\tstandalone: true,\n\tselector: '[auUse]',\n})\nexport class UseDirective<T> implements OnChanges, OnDestroy {\n\t@Input('auUse')\n\tuse: AgnosUIDirective<T> | undefined;\n\n\t@Input('auUseParams')\n\tparams: T | undefined;\n\n\t#ref = inject(ElementRef);\n\n\t#directive: AgnosUIDirective<T> | undefined;\n\t#directiveInstance?: ReturnType<AgnosUIDirective<T>>;\n\n\tasync #destroyDirectiveInstance() {\n\t\tconst directiveInstance = this.#directiveInstance;\n\t\tthis.#directiveInstance = undefined;\n\t\tif (directiveInstance?.destroy) {\n\t\t\tawait 0;\n\t\t\tdirectiveInstance.destroy?.();\n\t\t}\n\t}\n\n\tasync ngOnChanges(changes: SimpleChanges): Promise<void> {\n\t\tif (this.use !== this.#directive) {\n\t\t\tthis.#destroyDirectiveInstance();\n\t\t\tconst directive = this.use;\n\t\t\tthis.#directive = directive;\n\t\t\tif (directive) {\n\t\t\t\tawait 0;\n\t\t\t\t// checks that the directive did not change while waiting:\n\t\t\t\tif (directive === this.#directive && !this.#directiveInstance) {\n\t\t\t\t\tthis.#directiveInstance = directive(this.#ref.nativeElement, this.params as T);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (changes['params']) {\n\t\t\tawait 0;\n\t\t\tthis.#directiveInstance?.update?.(this.params as T);\n\t\t}\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.#destroyDirectiveInstance();\n\t\tthis.#directive = undefined;\n\t}\n}\n","/*\n * Public API Surface of @agnos-ui/angular-headless\n */\n\nexport * from '@agnos-ui/core';\n\nexport * from './lib/slot.directive';\nexport * from './lib/slotDefault.directive';\nexport * from './lib/use.directive';\nexport * from './lib/utils';\nexport type {SlotContent, WidgetsConfig} from './lib/utils';\nimport type {WidgetProps, WidgetState} from '@agnos-ui/core';\nimport type {AdaptSlotContentProps, AdaptWidgetSlots} from './lib/utils';\n\nexport type AccordionWidget = AdaptWidgetSlots<import('@agnos-ui/core').AccordionWidget>;\nexport type AccordionProps = WidgetProps<AccordionWidget>;\nexport type AccordionState = WidgetState<AccordionWidget>;\nexport type AccordionItemWidget = AdaptWidgetSlots<import('@agnos-ui/core').AccordionItemWidget>;\nexport type AccordionItemProps = WidgetProps<AccordionItemWidget>;\nexport type AccordionItemState = WidgetState<AccordionItemWidget>;\nexport type AccordionItemContext = AdaptSlotContentProps<import('@agnos-ui/core').AccordionItemContext>;\n\nexport type AlertWidget = AdaptWidgetSlots<import('@agnos-ui/core').AlertWidget>;\nexport type AlertProps = WidgetProps<AlertWidget>;\nexport type AlertState = WidgetState<AlertWidget>;\nexport type AlertContext = AdaptSlotContentProps<import('@agnos-ui/core').AlertContext>;\n\nexport type ModalWidget = AdaptWidgetSlots<import('@agnos-ui/core').ModalWidget>;\nexport type ModalProps = WidgetProps<ModalWidget>;\nexport type ModalState = WidgetState<ModalWidget>;\nexport type ModalContext = AdaptSlotContentProps<import('@agnos-ui/core').ModalContext>;\n\nexport type PaginationWidget = AdaptWidgetSlots<import('@agnos-ui/core').PaginationWidget>;\nexport type PaginationProps = WidgetProps<PaginationWidget>;\nexport type PaginationState = WidgetState<PaginationWidget>;\nexport type PaginationContext = AdaptSlotContentProps<import('@agnos-ui/core').PaginationContext>;\nexport type PaginationNumberContext = AdaptSlotContentProps<import('@agnos-ui/core').PaginationNumberContext>;\n\nexport type RatingWidget = AdaptWidgetSlots<import('@agnos-ui/core').RatingWidget>;\nexport type RatingProps = WidgetProps<RatingWidget>;\nexport type RatingState = WidgetState<RatingWidget>;\n\nexport type SelectWidget<Item> = AdaptWidgetSlots<import('@agnos-ui/core').SelectWidget<Item>>;\nexport type SelectProps<Item> = WidgetProps<SelectWidget<Item>>;\nexport type SelectState<Item> = WidgetState<SelectWidget<Item>>;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAiBa,iBAAiB,CAAA;IAC7B,WAA4B,CAAA,SAAkB,EAAkB,YAAe,EAAA;QAAnD,IAAS,CAAA,SAAA,GAAT,SAAS,CAAS;QAAkB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAG;KAAI;AACnF,CAAA;AA4BD;;AAEG;MACU,2BAA2B,GAAG,IAAI,cAAc,CAAoC,eAAe,EAAE;AAElH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDG;MACU,oBAAoB,GAAG,CACnC,iBAA4F,MACtE;AACtB,IAAA,OAAO,EAAE,2BAA2B;AACpC,IAAA,UAAU,EAAE,CAAC,MAAgD,KAAI;AAChE,QAAA,IAAI,iBAAiB,EAAE;AACtB,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AACpD,YAAA,iBAAiB,GAAG,CAAC,KAAK,KAAK,qBAAqB,CAAC,QAAQ,EAAE,MAAM,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;AACvG,SAAA;QACD,OAAO,mBAAmB,CAAC,MAAM,IAAI,SAAS,EAAE,iBAAiB,CAAC,CAAC;KACnE;AACD,IAAA,IAAI,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,IAAI,QAAQ,EAAE,EAAE,2BAA2B,CAAC,CAAC;AACrE,CAAA,EAAE;AAEH;;;;;;;;;AASG;AACU,MAAA,mBAAmB,GAAG,MAAM,MAAM,CAAC,2BAA2B,EAAE;AAE7E,MAAM,gBAAgB,GAAG,CAAmB,GAAiC,KAAI;IAChF,IAAI,SAAS,GAAe,EAAE,CAAC;IAC/B,OAAO,CAAC,MAAS,KAAI;QACpB,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAyB,EAAE;AAC9D,YAAA,MAAM,SAAS,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,SAAS,IAAI,IAAI,EAAE;;AAEtB,gBAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AAC1B,aAAA;AACD,YAAA,IAAI,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;gBAChC,SAAS,GAAG,IAAI,CAAC;AACjB,aAAA;AACD,SAAA;AACD,QAAA,IAAI,SAAS,EAAE;YACd,SAAS,GAAG,QAAQ,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,CAAC;AACd,SAAA;AACF,KAAC,CAAC;AACH,CAAC,CAAC;AAUK,MAAM,iBAAiB,GAAG,CAChC,OAAyB,EACzB,UAAsC,EACtC,aAAA,GAAqH,EAAE,KACjG;AACtB,IAAA,MAAM,kBAAkB,GAAG,OAAO,aAAa,KAAK,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;AACzG,IAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC,2BAA2B,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,GAAG,SAAS,CAAC;IACrG,OAAO;AACN,QAAA,GAAI,OAAO,CACV,QAAQ,CAAC,OAAO,EAAC,GAAI,kBAAkB,EAAU,EAAE,IAAI,UAAU,GAAG,aAAa,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,EAAC,CAAC,CAAC,CACtH;AACT,QAAA,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;KACxC,CAAC;AACH,EAAE;AAEc,SAAA,kBAAkB,CAAC,OAA2B,EAAE,OAAsB,EAAA;IACrF,MAAM,GAAG,GAAQ,EAAE,CAAC;AACpB,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC1D,IAAI,YAAY,KAAK,SAAS,EAAE;AAC/B,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC;AACrC,SAAA;AACD,KAAA;IACD,OAAO,CAAC,GAAG,CAAC,CAAC;AACd;;AClLA,MAAe,WAAW,CAAA;IACzB,WAAmB,CAAA,gBAAkC,EAAS,QAAkB,EAAA;QAA7D,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAAS,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;KAAI;AACpF,IAAA,UAAU,CAAC,IAAU,EAAE,KAAY,KAAI;AACvC,IAAA,WAAW,CAAC,IAAU,EAAE,KAAY,KAAI;AACxC,IAAA,OAAO,MAAK;AACZ,CAAA;AAED,MAAM,iBAAqD,SAAQ,WAA0B,CAAA;AAC5F,IAAA,QAAQ,CAAmB;IAC3B,aAAa,GAAG,EAAE,CAAC;AAEV,IAAA,UAAU,CAAC,IAAY,EAAA;AAC/B,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,aAAa,EAAE;YAChC,OAAO;AACP,SAAA;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;AACjC,SAAA;AAAM,aAAA;YACN,MAAM,oBAAoB,GAAwB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC;AAC9F,YAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,oBAAoB,EAAE,UAAU,EAAE;gBACtD,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC;AACvH,aAAA;AACD,SAAA;KACD;IAEQ,OAAO,GAAA;QACf,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;KAC1B;AACD,CAAA;AAED,MAAM,mBAAuD,SAAQ,WAA4C,CAAA;AAChH,IAAA,kBAAkB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAExE,UAAU,CAAC,IAA8B,EAAE,KAAY,EAAA;QAC/D,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KAChD;IAEQ,WAAW,CAAC,IAA8B,EAAE,KAAY,EAAA;QAChE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KAChD;IAEQ,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;KAClC;AACD,CAAA;AAED,MAAM,oBAAwD,SAAQ,WAAiC,CAAA;AACtG,IAAA,aAAa,CAAgC;AAC7C,IAAA,WAAW,CAAW;IAEb,UAAU,CAAC,IAAmB,EAAE,KAAY,EAAA;QACpD,IAAI,IAAI,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,SAAA;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;KAC7B;IAED,gBAAgB,CAAC,KAAY,EAAE,aAA2B,EAAA;QACzD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;AAC9B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAc,CAAC;AACzC,QAAA,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;YAClC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,YAAA,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,SAAA;KACD;IAEQ,WAAW,CAAC,IAAmB,EAAE,KAAY,EAAA;QACrD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AAC5C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAc,CAAC;AACzC,QAAA,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;AACrC,YAAA,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC3C,SAAA;KACD;IAEQ,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;KAC/B;AACD,CAAA;AAED,MAAM,sBAA0D,SAAQ,WAAsC,CAAA;AAC7G,IAAA,QAAQ,CAAqC;AAC7C,IAAA,MAAM,CAAQ;IAEL,UAAU,CAAC,IAAwB,EAAE,KAAY,EAAA;QACzD,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,SAAA;AACD,QAAA,KAAK,GAAG,EAAC,GAAG,KAAK,EAAC,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACtE;IAEQ,WAAW,CAAC,IAAwB,EAAE,KAAY,EAAA;QAC1D,IAAI,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;AAClC,YAAA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAc,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvE,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAoB,EAAE;gBAC7D,aAAa,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC1C,gBAAA,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/B,aAAA;AACD,YAAA,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE;AACxC,gBAAA,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;AAClC,aAAA;AACD,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;AAC7B,SAAA;KACD;IAEQ,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;KAC9B;AACD,CAAA;AAED,MAAM,4BAIJ,SAAQ,WAAkD,CAAA;AAC3D,IAAA,aAAa,CAA8B;AAC3C,IAAA,oBAAoB,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxF,IAAA,YAAY,CAAiC;IAEpC,UAAU,CAAC,IAAoC,EAAE,KAAY,EAAA;QACrE,IAAI,IAAI,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,SAAA;QACD,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE;AACpD,YAAA,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ;YAC/C,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC5E,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KAC/D;IAEQ,WAAW,CAAC,IAAoC,EAAE,KAAY,EAAA;QACtE,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,YAAa,EAAE,KAAK,CAAC,CAAC;KACjE;IAEQ,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;KAC/B;AACD,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,KAAU,KAAkG;AAChI,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,SAAS,CAAC;AAC7B,IAAA,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;AAC1B,IAAA,QAAQ,IAAI;AACX,QAAA,KAAK,QAAQ;AACZ,YAAA,OAAO,iBAAiB,CAAC;AAC1B,QAAA,KAAK,UAAU;AACd,YAAA,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE;AAChC,gBAAA,OAAO,oBAAoB,CAAC;AAC5B,aAAA;AACD,YAAA,OAAO,mBAAmB,CAAC;AAC5B,QAAA,KAAK,QAAQ;YACZ,IAAI,KAAK,YAAY,WAAW,EAAE;AACjC,gBAAA,OAAO,sBAAsB,CAAC;AAC9B,aAAA;YACD,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACvC,gBAAA,OAAO,4BAA4B,CAAC;AACpC,aAAA;YACD,MAAM;AACP,KAAA;AACD,IAAA,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC;MAMW,aAAa,CAAA;AAJ1B,IAAA,WAAA,GAAA;AAQS,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAyBrC,KAAA;AArBA,IAAA,WAAW,CAAC,OAAsB,EAAA;AACjC,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACnC,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,UAAU,EAAE;AACf,YAAA,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AACtC,YAAA,IAAI,WAAW,KAAK,IAAI,CAAC,SAAS,EAAE;AACnC,gBAAA,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,YAAY,GAAG,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;AACtG,gBAAA,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;AAC7B,aAAA;YACD,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAChD,SAAA;AAAM,aAAA,IAAI,WAAW,EAAE;YACvB,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACjD,SAAA;KACD;IAED,WAAW,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;KAC9B;8GA7BW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAAA,KAAA,EAAA,CAAA,aAAA,EAAA,OAAA,CAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAJzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,UAAU,EAAE,IAAI;AAChB,iBAAA,CAAA;8BAEiB,IAAI,EAAA,CAAA;sBAApB,KAAK;uBAAC,QAAQ,CAAA;gBACO,KAAK,EAAA,CAAA;sBAA1B,KAAK;uBAAC,aAAa,CAAA;;;MCnLR,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;AAIC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,EAAC,WAAc,EAAC,CAAC;AAKrC,KAAA;IAHA,QAAQ,GAAA;QACP,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAC,GAAG,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAC,CAAC,CAAC,CAAC;KAClF;8GAPW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,EAAC,CAAA;8BAEjC,aAAa,EAAA,CAAA;sBAApC,KAAK;uBAAC,eAAe,CAAA;;;ACHvB;AACA;AACA;AACA;MAMa,YAAY,CAAA;AAOxB,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAE1B,IAAA,UAAU,CAAkC;AAC5C,IAAA,kBAAkB,CAAmC;AAErD,IAAA,MAAM,yBAAyB,GAAA;AAC9B,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAClD,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,iBAAiB,EAAE,OAAO,EAAE;AAC/B,YAAA,MAAM,CAAC,CAAC;AACR,YAAA,iBAAiB,CAAC,OAAO,IAAI,CAAC;AAC9B,SAAA;KACD;IAED,MAAM,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,EAAE;YACjC,IAAI,CAAC,yBAAyB,EAAE,CAAC;AACjC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;AAC3B,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;AAC5B,YAAA,IAAI,SAAS,EAAE;AACd,gBAAA,MAAM,CAAC,CAAC;;gBAER,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC9D,oBAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAW,CAAC,CAAC;AAC/E,iBAAA;AACD,aAAA;AACD,SAAA;AAAM,aAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC7B,YAAA,MAAM,CAAC,CAAC;YACR,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC,MAAW,CAAC,CAAC;AACpD,SAAA;KACD;IAED,WAAW,GAAA;QACV,IAAI,CAAC,yBAAyB,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;KAC5B;8GA1CW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,CAAA,OAAA,EAAA,KAAA,CAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAJxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,SAAS;AACnB,iBAAA,CAAA;8BAGA,GAAG,EAAA,CAAA;sBADF,KAAK;uBAAC,OAAO,CAAA;gBAId,MAAM,EAAA,CAAA;sBADL,KAAK;uBAAC,aAAa,CAAA;;;ACjBrB;;AAEG;;ACFH;;AAEG;;;;"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
|
|
2
|
+
import type { SlotContent } from './utils';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class SlotDirective<Props extends Record<string, any>> implements OnChanges, OnDestroy {
|
|
5
|
+
slot: SlotContent<Props>;
|
|
6
|
+
props: Props;
|
|
7
|
+
private _viewContainerRef;
|
|
8
|
+
private _document;
|
|
9
|
+
private _slotType;
|
|
10
|
+
private _slotHandler;
|
|
11
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
12
|
+
ngOnDestroy(): void;
|
|
13
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SlotDirective<any>, never>;
|
|
14
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SlotDirective<any>, "[auSlot]", never, { "slot": { "alias": "auSlot"; "required": false; }; "props": { "alias": "auSlotProps"; "required": false; }; }, {}, never, never, true, never>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { WritableSignal } from '@amadeus-it-group/tansu';
|
|
2
|
+
import type { OnInit } from '@angular/core';
|
|
3
|
+
import { TemplateRef } from '@angular/core';
|
|
4
|
+
import type { SlotContent } from './utils';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class SlotDefaultDirective<T extends object> implements OnInit {
|
|
7
|
+
auSlotDefault: WritableSignal<{
|
|
8
|
+
slotDefault?: SlotContent<T>;
|
|
9
|
+
}>;
|
|
10
|
+
templateRef: TemplateRef<any>;
|
|
11
|
+
ngOnInit(): void;
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SlotDefaultDirective<any>, never>;
|
|
13
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SlotDefaultDirective<any>, "[auSlotDefault]", never, { "auSlotDefault": { "alias": "auSlotDefault"; "required": false; }; }, {}, never, never, true, never>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
|
|
2
|
+
import type { Directive as AgnosUIDirective } from '@agnos-ui/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class UseDirective<T> implements OnChanges, OnDestroy {
|
|
5
|
+
#private;
|
|
6
|
+
use: AgnosUIDirective<T> | undefined;
|
|
7
|
+
params: T | undefined;
|
|
8
|
+
ngOnChanges(changes: SimpleChanges): Promise<void>;
|
|
9
|
+
ngOnDestroy(): void;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<UseDirective<any>, never>;
|
|
11
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<UseDirective<any>, "[auUse]", never, { "use": { "alias": "auUse"; "required": false; }; "params": { "alias": "auUseParams"; "required": false; }; }, {}, never, never, true, never>;
|
|
12
|
+
}
|
package/lib/utils.d.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { SlotContent as CoreSlotContent, WidgetsConfig as CoreWidgetsConfig, Partial2Levels, Widget, WidgetFactory, WidgetProps, WidgetSlotContext, WidgetState, WidgetsConfigStore } from '@agnos-ui/core';
|
|
2
|
+
import type { ReadableSignal, SubscribableStore } from '@amadeus-it-group/tansu';
|
|
3
|
+
import type { FactoryProvider, SimpleChanges, TemplateRef, Type } from '@angular/core';
|
|
4
|
+
import { InjectionToken } from '@angular/core';
|
|
5
|
+
export declare class ComponentTemplate<Props, K extends string, T extends {
|
|
6
|
+
[key in K]: TemplateRef<Props>;
|
|
7
|
+
}> {
|
|
8
|
+
readonly component: Type<T>;
|
|
9
|
+
readonly templateProp: K;
|
|
10
|
+
constructor(component: Type<T>, templateProp: K);
|
|
11
|
+
}
|
|
12
|
+
export type SlotContent<Props extends object = object> = CoreSlotContent<Props> | TemplateRef<Props> | Type<unknown> | ComponentTemplate<Props, any, any>;
|
|
13
|
+
export type AdaptSlotContentProps<Props extends Record<string, any>> = Props extends WidgetSlotContext<infer U> ? WidgetSlotContext<AdaptWidgetSlots<U>> & AdaptPropsSlots<Omit<Props, keyof WidgetSlotContext<any>>> : AdaptPropsSlots<Props>;
|
|
14
|
+
export type AdaptPropsSlots<Props> = Omit<Props, `slot${string}`> & {
|
|
15
|
+
[K in keyof Props & `slot${string}`]: Props[K] extends CoreSlotContent<infer U> ? SlotContent<AdaptSlotContentProps<U>> : Props[K];
|
|
16
|
+
};
|
|
17
|
+
export type AdaptWidgetSlots<W extends Widget> = Widget<AdaptPropsSlots<WidgetProps<W>>, AdaptPropsSlots<WidgetState<W>>, W['api'], W['actions'], W['directives']>;
|
|
18
|
+
export type WidgetsConfig = {
|
|
19
|
+
[WidgetName in keyof CoreWidgetsConfig]: AdaptPropsSlots<CoreWidgetsConfig[WidgetName]>;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Dependency Injection token which can be used to provide or inject the widgets default configuration store.
|
|
23
|
+
*/
|
|
24
|
+
export declare const widgetsConfigInjectionToken: InjectionToken<WidgetsConfigStore<WidgetsConfig>>;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a provider of widgets default configuration that inherits from any widgets default configuration already defined at an upper level
|
|
27
|
+
* in the Angular dependency injection system. It contains its own set of widgets configuration properties that override the same properties form
|
|
28
|
+
* the parent configuration.
|
|
29
|
+
*
|
|
30
|
+
* @remarks
|
|
31
|
+
* The configuration is computed from the parent configuration in two steps:
|
|
32
|
+
* - first step: the parent configuration is transformed by the adaptParentConfig function (if specified).
|
|
33
|
+
* If adaptParentConfig is not specified, this step is skipped.
|
|
34
|
+
* - second step: the configuration from step 1 is merged (2-levels deep) with the own$ store. The own$ store initially contains
|
|
35
|
+
* an empty object (i.e. no property from the parent is overridden). It can be changed by calling set on the store returned by
|
|
36
|
+
* {@link injectWidgetsConfig}.
|
|
37
|
+
*
|
|
38
|
+
* @param adaptParentConfig - optional function that receives a 2-levels copy of the widgets default configuration
|
|
39
|
+
* defined at an upper level in the Angular dependency injection system (or an empty object if there is none) and returns the widgets
|
|
40
|
+
* default configuration to be used.
|
|
41
|
+
* It is called only if the configuration is needed, and was not yet computed for the current value of the parent configuration.
|
|
42
|
+
* It is called in a tansu reactive context, so it can use any tansu store and will be called again if those stores change.
|
|
43
|
+
* It is also called in an Angular injection context, so it can call the Angular inject function to get and use dependencies from the
|
|
44
|
+
* Angular dependency injection system.
|
|
45
|
+
|
|
46
|
+
* @returns DI provider to be included a list of `providers` (for example at a component level or
|
|
47
|
+
* any other level of the Angular dependency injection system)
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* @Component({
|
|
52
|
+
* // ...
|
|
53
|
+
* providers: [
|
|
54
|
+
* provideWidgetsConfig((parentConfig) => {
|
|
55
|
+
* // first step configuration: transforms the parent configuration
|
|
56
|
+
* parentConfig.rating = parentConfig.rating ?? {};
|
|
57
|
+
* parentConfig.rating.className = `${parentConfig.rating.className ?? ''} my-rating-extra-class`
|
|
58
|
+
* return parentConfig;
|
|
59
|
+
* })
|
|
60
|
+
* ]
|
|
61
|
+
* })
|
|
62
|
+
* class MyComponent {
|
|
63
|
+
* widgetsConfig = injectWidgetsConfig();
|
|
64
|
+
* constructor() {
|
|
65
|
+
* this.widgetsConfig.set({
|
|
66
|
+
* // second step configuration: overrides the parent configuration
|
|
67
|
+
* rating: {
|
|
68
|
+
* slotStar: MyCustomSlotStar
|
|
69
|
+
* }
|
|
70
|
+
* });
|
|
71
|
+
* }
|
|
72
|
+
* // ...
|
|
73
|
+
* }
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare const provideWidgetsConfig: (adaptParentConfig?: ((config: Partial2Levels<WidgetsConfig>) => Partial2Levels<WidgetsConfig>) | undefined) => FactoryProvider;
|
|
77
|
+
/**
|
|
78
|
+
* Returns the widgets default configuration store that was provided in the current injection context.
|
|
79
|
+
* Throws if the no widgets default configuration store was provided.
|
|
80
|
+
*
|
|
81
|
+
* @remarks
|
|
82
|
+
* This function must be called from an injection context, such as a constructor, a factory function, a field initializer or
|
|
83
|
+
* a function used with {@link https://angular.io/api/core/runInInjectionContext | runInInjectionContext}.
|
|
84
|
+
*
|
|
85
|
+
* @returns the widgets default configuration store.
|
|
86
|
+
*/
|
|
87
|
+
export declare const injectWidgetsConfig: () => WidgetsConfigStore<WidgetsConfig>;
|
|
88
|
+
export type WithPatchSlots<W extends Widget> = AdaptWidgetSlots<W> & {
|
|
89
|
+
patchSlots(slots: {
|
|
90
|
+
[K in keyof WidgetProps<W> & `slot${string}`]: WidgetProps<W>[K] extends CoreSlotContent<infer U> ? TemplateRef<AdaptSlotContentProps<U>> | undefined : never;
|
|
91
|
+
}): void;
|
|
92
|
+
};
|
|
93
|
+
export declare const callWidgetFactory: <W extends Widget<object, object, object, object, object>>(factory: WidgetFactory<W>, widgetName: keyof WidgetsConfig | null, defaultConfig?: Partial<AdaptPropsSlots<WidgetProps<W>>> | ReadableSignal<Partial<AdaptPropsSlots<WidgetProps<W>>>>) => WithPatchSlots<W>;
|
|
94
|
+
export declare function patchSimpleChanges(patchFn: (obj: any) => void, changes: SimpleChanges): void;
|
|
95
|
+
export type ExtractStoreType<T> = T extends SubscribableStore<infer U> ? U : never;
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agnos-ui/angular-headless",
|
|
3
|
+
"description": "Headless widget library for Angular.",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "*",
|
|
6
|
+
"@angular/core": "*"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"@agnos-ui/core": "0.0.1-alpha.1",
|
|
10
|
+
"@amadeus-it-group/tansu": "0.0.22",
|
|
11
|
+
"tslib": "^2.6.2"
|
|
12
|
+
},
|
|
13
|
+
"sideEffects": false,
|
|
14
|
+
"version": "0.0.1-alpha.1",
|
|
15
|
+
"module": "fesm2022/agnos-ui-angular-headless.mjs",
|
|
16
|
+
"typings": "index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
"./package.json": {
|
|
19
|
+
"default": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./index.d.ts",
|
|
23
|
+
"esm2022": "./esm2022/agnos-ui-angular-headless.mjs",
|
|
24
|
+
"esm": "./esm2022/agnos-ui-angular-headless.mjs",
|
|
25
|
+
"default": "./fesm2022/agnos-ui-angular-headless.mjs"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://amadeusitgroup.github.io/AgnosUI/latest/",
|
|
29
|
+
"bugs": "https://github.com/AmadeusITGroup/AgnosUI/issues",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/AmadeusITGroup/AgnosUI.git",
|
|
34
|
+
"directory": "angular/headless"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"angular",
|
|
38
|
+
"headless",
|
|
39
|
+
"components",
|
|
40
|
+
"widgets",
|
|
41
|
+
"accordion",
|
|
42
|
+
"alert",
|
|
43
|
+
"modal",
|
|
44
|
+
"pagination",
|
|
45
|
+
"rating"
|
|
46
|
+
]
|
|
47
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export * from '@agnos-ui/core';
|
|
2
|
+
export * from './lib/slot.directive';
|
|
3
|
+
export * from './lib/slotDefault.directive';
|
|
4
|
+
export * from './lib/use.directive';
|
|
5
|
+
export * from './lib/utils';
|
|
6
|
+
export type { SlotContent, WidgetsConfig } from './lib/utils';
|
|
7
|
+
import type { WidgetProps, WidgetState } from '@agnos-ui/core';
|
|
8
|
+
import type { AdaptSlotContentProps, AdaptWidgetSlots } from './lib/utils';
|
|
9
|
+
export type AccordionWidget = AdaptWidgetSlots<import('@agnos-ui/core').AccordionWidget>;
|
|
10
|
+
export type AccordionProps = WidgetProps<AccordionWidget>;
|
|
11
|
+
export type AccordionState = WidgetState<AccordionWidget>;
|
|
12
|
+
export type AccordionItemWidget = AdaptWidgetSlots<import('@agnos-ui/core').AccordionItemWidget>;
|
|
13
|
+
export type AccordionItemProps = WidgetProps<AccordionItemWidget>;
|
|
14
|
+
export type AccordionItemState = WidgetState<AccordionItemWidget>;
|
|
15
|
+
export type AccordionItemContext = AdaptSlotContentProps<import('@agnos-ui/core').AccordionItemContext>;
|
|
16
|
+
export type AlertWidget = AdaptWidgetSlots<import('@agnos-ui/core').AlertWidget>;
|
|
17
|
+
export type AlertProps = WidgetProps<AlertWidget>;
|
|
18
|
+
export type AlertState = WidgetState<AlertWidget>;
|
|
19
|
+
export type AlertContext = AdaptSlotContentProps<import('@agnos-ui/core').AlertContext>;
|
|
20
|
+
export type ModalWidget = AdaptWidgetSlots<import('@agnos-ui/core').ModalWidget>;
|
|
21
|
+
export type ModalProps = WidgetProps<ModalWidget>;
|
|
22
|
+
export type ModalState = WidgetState<ModalWidget>;
|
|
23
|
+
export type ModalContext = AdaptSlotContentProps<import('@agnos-ui/core').ModalContext>;
|
|
24
|
+
export type PaginationWidget = AdaptWidgetSlots<import('@agnos-ui/core').PaginationWidget>;
|
|
25
|
+
export type PaginationProps = WidgetProps<PaginationWidget>;
|
|
26
|
+
export type PaginationState = WidgetState<PaginationWidget>;
|
|
27
|
+
export type PaginationContext = AdaptSlotContentProps<import('@agnos-ui/core').PaginationContext>;
|
|
28
|
+
export type PaginationNumberContext = AdaptSlotContentProps<import('@agnos-ui/core').PaginationNumberContext>;
|
|
29
|
+
export type RatingWidget = AdaptWidgetSlots<import('@agnos-ui/core').RatingWidget>;
|
|
30
|
+
export type RatingProps = WidgetProps<RatingWidget>;
|
|
31
|
+
export type RatingState = WidgetState<RatingWidget>;
|
|
32
|
+
export type SelectWidget<Item> = AdaptWidgetSlots<import('@agnos-ui/core').SelectWidget<Item>>;
|
|
33
|
+
export type SelectProps<Item> = WidgetProps<SelectWidget<Item>>;
|
|
34
|
+
export type SelectState<Item> = WidgetState<SelectWidget<Item>>;
|