@supersoniks/concorde 1.0.6 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -8
- package/cli.js +69 -0
- package/core/components/functional/date/date.d.ts +34 -0
- package/core/components/functional/date/date.js +187 -0
- package/core/components/functional/example/example.d.ts +7 -0
- package/core/components/functional/example/example.js +25 -0
- package/core/components/functional/fetch/fetch.d.ts +49 -0
- package/core/components/functional/fetch/fetch.js +38 -0
- package/core/components/functional/functional.d.ts +11 -0
- package/core/components/functional/functional.js +11 -0
- package/core/components/functional/if/if.d.ts +12 -0
- package/core/components/functional/if/if.js +43 -0
- package/core/components/functional/list/list.d.ts +67 -0
- package/core/components/functional/list/list.js +132 -0
- package/core/components/functional/queue/queue.d.ts +42 -0
- package/core/components/functional/queue/queue.js +184 -0
- package/core/components/functional/router/redirect.d.ts +18 -0
- package/core/components/functional/router/redirect.js +57 -0
- package/core/components/functional/router/router.d.ts +26 -0
- package/core/components/functional/router/router.js +104 -0
- package/core/components/functional/states/states.d.ts +28 -0
- package/core/components/functional/states/states.js +139 -0
- package/core/components/functional/submit/submit.d.ts +24 -0
- package/core/components/functional/submit/submit.js +108 -0
- package/{types/core/components → core/components/functional/subscriber}/subscriber.d.ts +5 -1
- package/core/components/functional/subscriber/subscriber.js +30 -0
- package/core/components/ui/alert/alert.d.ts +20 -0
- package/core/components/ui/alert/alert.js +150 -0
- package/core/components/ui/badge/badge.d.ts +24 -0
- package/core/components/ui/badge/badge.js +177 -0
- package/core/components/ui/button/button.d.ts +125 -0
- package/core/components/ui/button/button.js +558 -0
- package/core/components/ui/divider/divider.d.ts +11 -0
- package/core/components/ui/divider/divider.js +144 -0
- package/core/components/ui/form/checkbox/checkbox.d.ts +120 -0
- package/core/components/ui/form/checkbox/checkbox.js +203 -0
- package/core/components/ui/form/css/form-control.d.ts +1 -0
- package/core/components/ui/form/css/form-control.js +219 -0
- package/core/components/ui/form/fieldset/fieldset.d.ts +15 -0
- package/core/components/ui/form/fieldset/fieldset.js +70 -0
- package/core/components/ui/form/fieldset/legend.d.ts +11 -0
- package/core/components/ui/form/fieldset/legend.js +92 -0
- package/core/components/ui/form/form-layout/form-actions.d.ts +6 -0
- package/core/components/ui/form/form-layout/form-actions.js +23 -0
- package/core/components/ui/form/form-layout/form-layout.d.ts +9 -0
- package/core/components/ui/form/form-layout/form-layout.js +58 -0
- package/core/components/ui/form/input/input.d.ts +84 -0
- package/core/components/ui/form/input/input.js +180 -0
- package/core/components/ui/form/radio/radio.d.ts +12 -0
- package/core/components/ui/form/radio/radio.js +55 -0
- package/core/components/ui/form/select/select.d.ts +39 -0
- package/core/components/ui/form/select/select.js +220 -0
- package/core/components/ui/form/textarea/textarea.d.ts +69 -0
- package/core/components/ui/form/textarea/textarea.js +150 -0
- package/core/components/ui/group/group.d.ts +6 -0
- package/core/components/ui/group/group.js +57 -0
- package/core/components/ui/icon/icon.d.ts +17 -0
- package/core/components/ui/icon/icon.js +93 -0
- package/core/components/ui/icon/icons.d.ts +13 -0
- package/core/components/ui/icon/icons.js +25 -0
- package/core/components/ui/icon/icons.json +1 -0
- package/core/components/ui/image/image.d.ts +14 -0
- package/core/components/ui/image/image.js +152 -0
- package/core/components/ui/link/link.d.ts +16 -0
- package/core/components/ui/link/link.js +70 -0
- package/core/components/ui/loader/loader.d.ts +20 -0
- package/core/components/ui/loader/loader.js +94 -0
- package/{types → core}/components/ui/loader/styles/fixed.d.ts +0 -0
- package/core/components/ui/loader/styles/fixed.js +57 -0
- package/{types → core}/components/ui/loader/styles/inline.d.ts +0 -0
- package/core/components/ui/loader/styles/inline.js +71 -0
- package/core/components/ui/menu/menu-item.d.ts +5 -0
- package/core/components/ui/menu/menu-item.js +37 -0
- package/core/components/ui/menu/menu.d.ts +26 -0
- package/core/components/ui/menu/menu.js +125 -0
- package/core/components/ui/modal/modal-actions.d.ts +7 -0
- package/core/components/ui/modal/modal-actions.js +46 -0
- package/core/components/ui/modal/modal-close.d.ts +6 -0
- package/core/components/ui/modal/modal-close.js +38 -0
- package/core/components/ui/modal/modal-content.d.ts +5 -0
- package/core/components/ui/modal/modal-content.js +29 -0
- package/core/components/ui/modal/modal-subtitle.d.ts +5 -0
- package/core/components/ui/modal/modal-subtitle.js +33 -0
- package/core/components/ui/modal/modal-title.d.ts +5 -0
- package/core/components/ui/modal/modal-title.js +33 -0
- package/core/components/ui/modal/modal.d.ts +36 -0
- package/core/components/ui/modal/modal.js +325 -0
- package/core/components/ui/pop/pop.d.ts +28 -0
- package/core/components/ui/pop/pop.js +223 -0
- package/core/components/ui/tabs/tab.d.ts +6 -0
- package/core/components/ui/tabs/tab.js +46 -0
- package/core/components/ui/tabs/tabs.d.ts +14 -0
- package/core/components/ui/tabs/tabs.js +127 -0
- package/core/components/ui/taxonomy/taxonomy.d.ts +41 -0
- package/core/components/ui/taxonomy/taxonomy.js +113 -0
- package/core/components/ui/theme/css/tailwind.css +3 -0
- package/core/components/ui/theme/css/tailwind.d.ts +2 -0
- package/core/components/ui/theme/theme-collection/core-variables.d.ts +1 -0
- package/core/components/ui/theme/theme-collection/core-variables.js +50 -0
- package/{types/components → core/components/ui}/theme/theme-collection/dark.d.ts +0 -0
- package/core/components/ui/theme/theme-collection/dark.js +41 -0
- package/{types/components → core/components/ui}/theme/theme-collection/light.d.ts +0 -0
- package/core/components/ui/theme/theme-collection/light.js +35 -0
- package/core/components/ui/theme/theme.d.ts +11 -0
- package/core/components/ui/theme/theme.js +105 -0
- package/core/components/ui/toast/message-subscriber.d.ts +17 -0
- package/core/components/ui/toast/message-subscriber.js +85 -0
- package/{types → core}/components/ui/toast/toast.d.ts +10 -8
- package/core/components/ui/toast/toast.js +260 -0
- package/core/components/ui/tooltip/tooltip.d.ts +7 -0
- package/core/components/ui/tooltip/tooltip.js +68 -0
- package/core/components/ui/ui.d.ts +27 -0
- package/core/components/ui/ui.js +34 -0
- package/core/core.d.ts +3 -0
- package/core/core.js +7 -0
- package/core/mixins/Fetcher.d.ts +69 -0
- package/core/mixins/Fetcher.js +147 -0
- package/core/mixins/FormCheckable.d.ts +72 -0
- package/core/mixins/FormCheckable.js +144 -0
- package/core/mixins/FormElement.d.ts +21 -0
- package/core/mixins/FormElement.js +229 -0
- package/core/mixins/FormInput.d.ts +49 -0
- package/core/mixins/FormInput.js +33 -0
- package/core/mixins/Subscriber.d.ts +30 -0
- package/core/mixins/Subscriber.js +379 -0
- package/core/mixins/TemplatesContainer.d.ts +12 -0
- package/core/mixins/TemplatesContainer.js +60 -0
- package/core/mixins/mixins.d.ts +6 -0
- package/core/mixins/mixins.js +6 -0
- package/core/utils/Arrays.d.ts +97 -0
- package/core/utils/Arrays.js +136 -0
- package/core/utils/DataBindObserver.d.ts +74 -0
- package/core/utils/DataBindObserver.js +252 -0
- package/core/utils/Format.d.ts +11 -0
- package/core/utils/Format.js +22 -0
- package/core/utils/HTML.d.ts +13 -0
- package/core/utils/HTML.js +26 -0
- package/core/utils/LocationHandler.d.ts +44 -0
- package/core/utils/LocationHandler.js +96 -0
- package/core/utils/Objects.d.ts +23 -0
- package/core/utils/Objects.js +63 -0
- package/core/utils/PublisherProxy.d.mts +110 -0
- package/core/utils/PublisherProxy.mjs +365 -0
- package/core/utils/api.d.ts +66 -0
- package/core/utils/api.js +145 -0
- package/package.json +159 -21
- package/LICENSE +0 -43
- package/dist/concorde.bundle.js +0 -3620
- package/types/components/event/event-card/event-card.d.ts +0 -10
- package/types/components/event/event-title/event-title.d.ts +0 -7
- package/types/components/event/event.d.ts +0 -8
- package/types/components/giftcards/giftcard/giftcard.d.ts +0 -15
- package/types/components/illustration/illustration.d.ts +0 -16
- package/types/components/product/prices-form/price-button/price-button.d.ts +0 -25
- package/types/components/product/prices-form/prices-form.d.ts +0 -23
- package/types/components/theme/theme-collection/bootstrap5.d.ts +0 -1
- package/types/components/theme/theme-collection/dracula.d.ts +0 -1
- package/types/components/theme/theme.d.ts +0 -8
- package/types/components/ui/button/button.d.ts +0 -13
- package/types/components/ui/loader/loader.d.ts +0 -15
- package/types/components/ui/modal/modal.d.ts +0 -17
- package/types/components/ui/tooltip/tooltip.d.ts +0 -9
- package/types/core/components/fetch.d.ts +0 -6
- package/types/core/components/list.d.ts +0 -9
- package/types/core/components/queue.d.ts +0 -15
- package/types/core/components/taxonomy.d.ts +0 -13
- package/types/core/components/text-formatted.d.ts +0 -15
- package/types/core/components/text.d.ts +0 -9
- package/types/core/core.d.ts +0 -7
- package/types/core/mixins/Fetcher.d.ts +0 -9
- package/types/core/mixins/Subscriber.d.ts +0 -13
- package/types/core/utils/api.d.ts +0 -16
- package/types/index.d.ts +0 -12
- package/types/styles/button/button.d.ts +0 -1
- package/types/styles/prose/prose.d.ts +0 -2
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { html, LitElement, css } from "lit";
|
|
8
|
+
import { customElement, property } from "lit/decorators.js";
|
|
9
|
+
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
10
|
+
import Fetcher from "@supersoniks/concorde/core/mixins/Fetcher";
|
|
11
|
+
import { repeat } from "lit/directives/repeat.js";
|
|
12
|
+
import { templateContent } from "lit/directives/template-content.js";
|
|
13
|
+
import "@supersoniks/concorde/core/components/ui/loader/loader";
|
|
14
|
+
import "../subscriber/subscriber";
|
|
15
|
+
import Objects from "@supersoniks/concorde/core/utils/Objects";
|
|
16
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
17
|
+
import TemplatesContainer from "@supersoniks/concorde/core/mixins/TemplatesContainer";
|
|
18
|
+
/**
|
|
19
|
+
* ### List boucle sur sa propriété "props" et crée des éléments a partir des données en bouclant également sur ses templates.
|
|
20
|
+
*
|
|
21
|
+
* * Si le composant possède un attribut *fetch* (quelque soit sa valeur), il charge un contenu via un appel d'api web comme le fait [fetch](./?path=/docs/core-components-functional-fetch--basic)
|
|
22
|
+
* Dans ce cas la proriété *key* (qui est issue du fetcher) peut être utilisé pour cibler une propriété particulière du retour de l'api.
|
|
23
|
+
*
|
|
24
|
+
* * Chaque élément créé est englobé dans un objet [Subscriber](./?path=/docs/miscallenous-🔔-subscriber--page)
|
|
25
|
+
* un dataProvider y est associé a l'adresse suivante *dataProvider-de-la-liste$/*index-e-la-ligne-courante*
|
|
26
|
+
* Les éléments contenus dans le template seront donc remplis par les données si ils sont eux même des subscriber et qu'il possèdent des propriétés réactives correspondantes
|
|
27
|
+
* * Lors du chargement un objet loader inline est affiché.
|
|
28
|
+
* * Si le résultat de la requête n'est pas une liste, mais est un objet, alors il est imbriqué dans un tableau pour garantir le fonctionnement.
|
|
29
|
+
* On paut aussi extraire directement toutes les valeurs dans un tableau pour le rendu en ajoutant l'attribut **extractValues**
|
|
30
|
+
*/
|
|
31
|
+
let List = class List extends Fetcher(Subscriber(TemplatesContainer(LitElement))) {
|
|
32
|
+
constructor() {
|
|
33
|
+
super(...arguments);
|
|
34
|
+
/**
|
|
35
|
+
* La propriété templateKey contient le nom de la propriété qui sera utilisé pour identifier le template à utiliser dans la donnée de la ligne.
|
|
36
|
+
* Par exemple si templateIdentifier = "name" et que la donnée de la ligne est {name: "myTemplate" ... }, alors le template possédant l'attribut data-value="myTemplate" sera utilisé.
|
|
37
|
+
*/
|
|
38
|
+
this.templateKey = "template";
|
|
39
|
+
/**
|
|
40
|
+
* La propriété idKey est utilisé repérer les lignes de manière unique si pour les item de la liste item[this.idKey] n'existe pas, alors l'index est utilisé
|
|
41
|
+
*/
|
|
42
|
+
this.idKey = "id";
|
|
43
|
+
}
|
|
44
|
+
connectedCallback() {
|
|
45
|
+
this.noShadowDom = "";
|
|
46
|
+
this.defferedDebug = this.hasAttribute("debug") || null;
|
|
47
|
+
this.isDefaultLoaderEnabled = false;
|
|
48
|
+
this.isFetchEnabled = this.hasAttribute("fetch");
|
|
49
|
+
super.connectedCallback();
|
|
50
|
+
}
|
|
51
|
+
render() {
|
|
52
|
+
if (this.isLoading && !Array.isArray(this.props))
|
|
53
|
+
return html `<sonic-loader mode="inline"></sonic-loader>`;
|
|
54
|
+
// si props est une string on considère qu'il n'y a pas de résultats
|
|
55
|
+
if (typeof this.props == "string") {
|
|
56
|
+
return html `<div class="sonic-no-result-container">
|
|
57
|
+
<sonic-icon prefix="iconoir" name="emoji-think-left" size="lg"></sonic-icon><span class="sonic-no-result-text">${this.props}</span>
|
|
58
|
+
</div>`;
|
|
59
|
+
}
|
|
60
|
+
// si props est un objet mais qu'il n'y a pas de contenu on retourn une div vide (nécessaire pour le lazyload)
|
|
61
|
+
if (!Objects.isObject(this.props) || Object.keys(this.props).length == 0) {
|
|
62
|
+
return html `<div></div>`;
|
|
63
|
+
}
|
|
64
|
+
let props = this.props;
|
|
65
|
+
let extractValues = this.hasAttribute("extractValues");
|
|
66
|
+
//si props n'est pas un tableau on l'adapte
|
|
67
|
+
if (!Array.isArray(props)) {
|
|
68
|
+
if (extractValues) {
|
|
69
|
+
props = Object.entries(props).map(([k, v]) => ({ key: k, value: v }));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
props = [props];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Resultats
|
|
76
|
+
let templateCount = this.templateList.length;
|
|
77
|
+
let counter = -1;
|
|
78
|
+
return html `
|
|
79
|
+
${repeat(props, (item, index) => item[this.idKey] || index, (item, index) => {
|
|
80
|
+
let templatePartName = item[this.templateKey];
|
|
81
|
+
let hasCustomTemplate = templatePartName && this.templateParts[templatePartName];
|
|
82
|
+
counter++;
|
|
83
|
+
if (hasCustomTemplate)
|
|
84
|
+
counter = -1;
|
|
85
|
+
let pub = this.publisher[extractValues ? item.key : index];
|
|
86
|
+
return (item &&
|
|
87
|
+
html `
|
|
88
|
+
<sonic-subscriber
|
|
89
|
+
debug=${ifDefined(this.defferedDebug)}
|
|
90
|
+
.bindPublisher=${function () {
|
|
91
|
+
return pub;
|
|
92
|
+
}}
|
|
93
|
+
dataProvider="${this.dataProvider}/list-item/${index}"
|
|
94
|
+
>
|
|
95
|
+
${hasCustomTemplate
|
|
96
|
+
? templateContent(this.templateParts[templatePartName])
|
|
97
|
+
: templateContent(this.templateList[counter % templateCount])}
|
|
98
|
+
</sonic-subscriber>
|
|
99
|
+
`);
|
|
100
|
+
})}
|
|
101
|
+
`;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
List.styles = [
|
|
105
|
+
css `
|
|
106
|
+
.sonic-no-result-container {
|
|
107
|
+
color: var(--sc-base-400);
|
|
108
|
+
font-size: 1.65rem;
|
|
109
|
+
}
|
|
110
|
+
sonic-icon {
|
|
111
|
+
margin-right: 0.25em;
|
|
112
|
+
}
|
|
113
|
+
span {
|
|
114
|
+
vertical-align: middle;
|
|
115
|
+
}
|
|
116
|
+
`,
|
|
117
|
+
];
|
|
118
|
+
__decorate([
|
|
119
|
+
property({ type: String })
|
|
120
|
+
], List.prototype, "templateKey", void 0);
|
|
121
|
+
__decorate([
|
|
122
|
+
property({ type: String })
|
|
123
|
+
], List.prototype, "idKey", void 0);
|
|
124
|
+
List = __decorate([
|
|
125
|
+
customElement("sonic-list")
|
|
126
|
+
], List);
|
|
127
|
+
export { List };
|
|
128
|
+
//Ajout pour custom-elements-manifest pour storybook notamment
|
|
129
|
+
try {
|
|
130
|
+
customElements.define("sonic-list", List);
|
|
131
|
+
}
|
|
132
|
+
catch (e) { }
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { LitElement, nothing } from "lit";
|
|
2
|
+
import '../list/list';
|
|
3
|
+
import { PublisherProxy } from "@supersoniks/concorde/core/utils/PublisherProxy.mjs";
|
|
4
|
+
declare const Queue_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface) & typeof LitElement;
|
|
5
|
+
/**
|
|
6
|
+
*### Une Queue charge du contenu par lot selon l'expression renseignée dans l'attribut *dataProviderExpression*.
|
|
7
|
+
* * Chaque lot est chargé par un composant [List](./?path=/docs/core-components-functional-list-list--basic) dont le dataProvider créé à partir de l'attribut dataProviderExpression
|
|
8
|
+
* * A l'initialisation elle regarde l'attribut dataFilterProvider qui donne l'adresse d'un [publisher](./?path=/docs/how-to-🥨-dialogue-inter-composant--page)
|
|
9
|
+
* Si cet attribut est touvé, Queue écoute le publisher fourni et se réinitialise à chaque modification du contenu de celui-ci.
|
|
10
|
+
* Les valeurs renseignées dans ce publisher sont ajoutées en get à chaque requête
|
|
11
|
+
* * la proriété *key* peut être utilisé pour cibler une propriété particulière du retour de l'api.
|
|
12
|
+
*/
|
|
13
|
+
export declare class Queue extends Queue_base {
|
|
14
|
+
templates: Array<HTMLTemplateElement> | null;
|
|
15
|
+
lastRequestTime: number;
|
|
16
|
+
key: String;
|
|
17
|
+
/**
|
|
18
|
+
* Durée cible en ms d'une requête pour afficher 1 lot.
|
|
19
|
+
*/
|
|
20
|
+
targetRequestDuration: number;
|
|
21
|
+
limit: number;
|
|
22
|
+
static instanceCounter: number;
|
|
23
|
+
connectedCallback(): void;
|
|
24
|
+
filterPublisher: PublisherProxy | null;
|
|
25
|
+
configFilter(): void;
|
|
26
|
+
filterTimeoutId: any;
|
|
27
|
+
updateFilteredContent(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Cette expression est utilisée comme modèle par le composant Queue pour renseigngner le dataProvider de la [liste](./?path=/docs/core-components-functional-list-list--basic) créée.
|
|
30
|
+
* * l'expression *$offset* est alors remplacée par le numéro de l'élément à partir duquel démarrer
|
|
31
|
+
* * l'expression *$limit* est remplacée par la valeur représentant le nombre d'éléments à charger
|
|
32
|
+
* * Si pas d'expression *$offset* le composant se comporte un peu comme une liste, il ne va pas essayer de charger les éléments suivants
|
|
33
|
+
*/
|
|
34
|
+
dataProviderExpression: string;
|
|
35
|
+
idKey: string;
|
|
36
|
+
currentScrollPosition: number | undefined;
|
|
37
|
+
resetDuration(): void;
|
|
38
|
+
listDataProviders: string[];
|
|
39
|
+
next(e?: CustomEvent): void;
|
|
40
|
+
render(): import("lit-html").TemplateResult<1> | typeof nothing;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var Queue_1;
|
|
8
|
+
import { html, LitElement, nothing } from "lit";
|
|
9
|
+
import { customElement, property } from "lit/decorators.js";
|
|
10
|
+
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
11
|
+
import { repeat } from 'lit/directives/repeat.js';
|
|
12
|
+
import { PublisherManager } from "@supersoniks/concorde/core/utils/PublisherProxy.mjs";
|
|
13
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
14
|
+
import '../list/list';
|
|
15
|
+
/**
|
|
16
|
+
*### Une Queue charge du contenu par lot selon l'expression renseignée dans l'attribut *dataProviderExpression*.
|
|
17
|
+
* * Chaque lot est chargé par un composant [List](./?path=/docs/core-components-functional-list-list--basic) dont le dataProvider créé à partir de l'attribut dataProviderExpression
|
|
18
|
+
* * A l'initialisation elle regarde l'attribut dataFilterProvider qui donne l'adresse d'un [publisher](./?path=/docs/how-to-🥨-dialogue-inter-composant--page)
|
|
19
|
+
* Si cet attribut est touvé, Queue écoute le publisher fourni et se réinitialise à chaque modification du contenu de celui-ci.
|
|
20
|
+
* Les valeurs renseignées dans ce publisher sont ajoutées en get à chaque requête
|
|
21
|
+
* * la proriété *key* peut être utilisé pour cibler une propriété particulière du retour de l'api.
|
|
22
|
+
*/
|
|
23
|
+
let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
this.templates = null;
|
|
27
|
+
this.lastRequestTime = 0;
|
|
28
|
+
this.key = "";
|
|
29
|
+
/**
|
|
30
|
+
* Durée cible en ms d'une requête pour afficher 1 lot.
|
|
31
|
+
*/
|
|
32
|
+
this.targetRequestDuration = 500;
|
|
33
|
+
/*
|
|
34
|
+
* Quantité d'éléments devant être chargés dans le premier lot.
|
|
35
|
+
* Cette valeur est mise à jour ensuite par Queue pour chauq lot pour se rapprocher tanque possible de *targetRequestDuration*
|
|
36
|
+
*/
|
|
37
|
+
this.limit = 5;
|
|
38
|
+
this.filterPublisher = null;
|
|
39
|
+
this.filterTimeoutId = undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Cette expression est utilisée comme modèle par le composant Queue pour renseigngner le dataProvider de la [liste](./?path=/docs/core-components-functional-list-list--basic) créée.
|
|
42
|
+
* * l'expression *$offset* est alors remplacée par le numéro de l'élément à partir duquel démarrer
|
|
43
|
+
* * l'expression *$limit* est remplacée par la valeur représentant le nombre d'éléments à charger
|
|
44
|
+
* * Si pas d'expression *$offset* le composant se comporte un peu comme une liste, il ne va pas essayer de charger les éléments suivants
|
|
45
|
+
*/
|
|
46
|
+
this.dataProviderExpression = "";
|
|
47
|
+
this.idKey = "id";
|
|
48
|
+
this.currentScrollPosition = undefined;
|
|
49
|
+
this.listDataProviders = [];
|
|
50
|
+
}
|
|
51
|
+
connectedCallback() {
|
|
52
|
+
this.noShadowDom = "";
|
|
53
|
+
this.defferedDebug = this.hasAttribute("debug") || null;
|
|
54
|
+
if (!this.dataProvider)
|
|
55
|
+
this.dataProvider = "sonic-queue-" + Queue_1.instanceCounter++;
|
|
56
|
+
this.configFilter();
|
|
57
|
+
super.connectedCallback();
|
|
58
|
+
this.key = this.getAttribute("key");
|
|
59
|
+
this.templates = [...this.querySelectorAll("template")];
|
|
60
|
+
this.lastRequestTime = new Date().getTime();
|
|
61
|
+
this.next();
|
|
62
|
+
}
|
|
63
|
+
configFilter() {
|
|
64
|
+
var _a;
|
|
65
|
+
let dataFilterProvider = this.getAncestorAttributeValue("dataFilterProvider");
|
|
66
|
+
if (!dataFilterProvider)
|
|
67
|
+
return;
|
|
68
|
+
this.filterPublisher = PublisherManager.getInstance().get(dataFilterProvider);
|
|
69
|
+
(_a = this.filterPublisher) === null || _a === void 0 ? void 0 : _a.onInternalMutation(() => {
|
|
70
|
+
var _a;
|
|
71
|
+
if (Object.keys((_a = this.filterPublisher) === null || _a === void 0 ? void 0 : _a.get()).length == 0)
|
|
72
|
+
return;
|
|
73
|
+
this.updateFilteredContent();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
updateFilteredContent() {
|
|
77
|
+
for (let dataProvider of this.listDataProviders) {
|
|
78
|
+
PublisherManager.delete(dataProvider);
|
|
79
|
+
}
|
|
80
|
+
this.listDataProviders = [];
|
|
81
|
+
clearTimeout(this.filterTimeoutId);
|
|
82
|
+
this.filterTimeoutId = setTimeout(() => {
|
|
83
|
+
this.props = null;
|
|
84
|
+
this.next();
|
|
85
|
+
}, 250);
|
|
86
|
+
}
|
|
87
|
+
resetDuration() {
|
|
88
|
+
this.lastRequestTime = new Date().getTime();
|
|
89
|
+
}
|
|
90
|
+
next(e) {
|
|
91
|
+
var _a, _b;
|
|
92
|
+
let offset = 0;
|
|
93
|
+
const newTime = new Date().getTime();
|
|
94
|
+
const requestDuration = newTime - this.lastRequestTime;
|
|
95
|
+
if (e) {
|
|
96
|
+
if (!e.detail.isFirstLoad || !e.detail.props.length || this.dataProviderExpression.indexOf("$offset") == -1) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!Array.isArray(this.props)) {
|
|
101
|
+
this.props = [];
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const props = Object.values(this.props);
|
|
105
|
+
const item = props[props.length - 1];
|
|
106
|
+
offset = parseInt(item.offset.toString()) + parseInt(item.limit.toString());
|
|
107
|
+
}
|
|
108
|
+
if (requestDuration > 0 && e)
|
|
109
|
+
this.limit = Math.round((this.limit / requestDuration) * this.targetRequestDuration);
|
|
110
|
+
if (this.limit < 1)
|
|
111
|
+
this.limit = 1;
|
|
112
|
+
if (this.limit > 15)
|
|
113
|
+
this.limit = 15;
|
|
114
|
+
let dataProvider = this.dataProviderExpression.replace("$offset", offset + "").replace("$limit", this.limit + "");
|
|
115
|
+
let split = dataProvider.split("?");
|
|
116
|
+
let endpoint = split.shift();
|
|
117
|
+
let searchParams = new URLSearchParams(split.join("?"));
|
|
118
|
+
let filterData = (_a = this.filterPublisher) === null || _a === void 0 ? void 0 : _a.get();
|
|
119
|
+
for (let f in filterData) {
|
|
120
|
+
searchParams.set(f, filterData[f]);
|
|
121
|
+
}
|
|
122
|
+
dataProvider = endpoint + "?" + searchParams.toString();
|
|
123
|
+
this.listDataProviders.push(dataProvider);
|
|
124
|
+
this.currentScrollPosition = (_b = document.scrollingElement) === null || _b === void 0 ? void 0 : _b.scrollTop;
|
|
125
|
+
this.props = [
|
|
126
|
+
...Object.values(this.props),
|
|
127
|
+
{
|
|
128
|
+
id: searchParams.toString() + "/" + this.props.length,
|
|
129
|
+
dataProvider: dataProvider,
|
|
130
|
+
offset: offset,
|
|
131
|
+
limit: this.limit,
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
this.lastRequestTime = new Date().getTime();
|
|
135
|
+
}
|
|
136
|
+
render() {
|
|
137
|
+
if (this.currentScrollPosition) {
|
|
138
|
+
window.requestAnimationFrame(() => {
|
|
139
|
+
if (document.scrollingElement)
|
|
140
|
+
document.scrollingElement.scrollTop = this.currentScrollPosition;
|
|
141
|
+
this.currentScrollPosition = undefined;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (!Array.isArray(this.props))
|
|
145
|
+
return nothing;
|
|
146
|
+
return html `
|
|
147
|
+
${repeat(this.props, (item) => item.id, (item) => html `
|
|
148
|
+
<sonic-list
|
|
149
|
+
fetch
|
|
150
|
+
debug=${ifDefined(this.defferedDebug)}
|
|
151
|
+
@load=${this.next}
|
|
152
|
+
key=${this.key}
|
|
153
|
+
@loading=${this.resetDuration}
|
|
154
|
+
dataProvider="${item.dataProvider}"
|
|
155
|
+
idKey=${this.idKey}
|
|
156
|
+
.templates=${this.templates}
|
|
157
|
+
>
|
|
158
|
+
</sonic-list>
|
|
159
|
+
`)}
|
|
160
|
+
`;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
Queue.instanceCounter = 0;
|
|
164
|
+
__decorate([
|
|
165
|
+
property()
|
|
166
|
+
], Queue.prototype, "targetRequestDuration", void 0);
|
|
167
|
+
__decorate([
|
|
168
|
+
property()
|
|
169
|
+
], Queue.prototype, "limit", void 0);
|
|
170
|
+
__decorate([
|
|
171
|
+
property({ type: String })
|
|
172
|
+
], Queue.prototype, "dataProviderExpression", void 0);
|
|
173
|
+
__decorate([
|
|
174
|
+
property({ type: String })
|
|
175
|
+
], Queue.prototype, "idKey", void 0);
|
|
176
|
+
Queue = Queue_1 = __decorate([
|
|
177
|
+
customElement("sonic-queue")
|
|
178
|
+
], Queue);
|
|
179
|
+
export { Queue };
|
|
180
|
+
//Ajout pour custom-elements-manifesy pour storybook notamment
|
|
181
|
+
try {
|
|
182
|
+
customElements.define("sonic-queue", Queue);
|
|
183
|
+
}
|
|
184
|
+
catch (e) { }
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
declare const SonicRedirect_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface) & typeof LitElement;
|
|
3
|
+
/**
|
|
4
|
+
* sonic-redirect permet d'effectuer une redirection.
|
|
5
|
+
* * L'URL de redirection fournie dans l'attribut *to*.
|
|
6
|
+
* * La redirection est effectuée en fonction de la disponibilité d'une donnée issue du publisher à l'adresse fournie par l'attribut dataProvider
|
|
7
|
+
* * La donnée a trouver est renseignées via l'attribut *onData* qui peur repésenter un chemin dans la donnée via la dot syntaxe
|
|
8
|
+
* * Si la données est trouvée et qu'elle peut être évaluée à true alors la redirection est effectuée
|
|
9
|
+
* Par exemple : la données vaut {user:{id:2}} si onData="user.id"la redirection est effectuée.
|
|
10
|
+
* * Si l'attribut pushState est défini, alors la redirection est effectuée via pushState, sinon c'est document.location qui est modifié.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SonicRedirect extends SonicRedirect_base {
|
|
13
|
+
udpateCallBack: () => void;
|
|
14
|
+
connectedCallback(): void;
|
|
15
|
+
disconnectedCallback(): void;
|
|
16
|
+
update(): void;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { LitElement } from "lit";
|
|
8
|
+
import { customElement } from "lit/decorators.js";
|
|
9
|
+
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
10
|
+
import LocationHandler from "@supersoniks/concorde/core/utils/LocationHandler";
|
|
11
|
+
import Objects from "@supersoniks/concorde/core/utils/Objects";
|
|
12
|
+
/**
|
|
13
|
+
* sonic-redirect permet d'effectuer une redirection.
|
|
14
|
+
* * L'URL de redirection fournie dans l'attribut *to*.
|
|
15
|
+
* * La redirection est effectuée en fonction de la disponibilité d'une donnée issue du publisher à l'adresse fournie par l'attribut dataProvider
|
|
16
|
+
* * La donnée a trouver est renseignées via l'attribut *onData* qui peur repésenter un chemin dans la donnée via la dot syntaxe
|
|
17
|
+
* * Si la données est trouvée et qu'elle peut être évaluée à true alors la redirection est effectuée
|
|
18
|
+
* Par exemple : la données vaut {user:{id:2}} si onData="user.id"la redirection est effectuée.
|
|
19
|
+
* * Si l'attribut pushState est défini, alors la redirection est effectuée via pushState, sinon c'est document.location qui est modifié.
|
|
20
|
+
*/
|
|
21
|
+
let SonicRedirect = class SonicRedirect extends Subscriber(LitElement) {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
this.udpateCallBack = () => { };
|
|
25
|
+
}
|
|
26
|
+
connectedCallback() {
|
|
27
|
+
this.noShadowDom = "";
|
|
28
|
+
this.style.display = "none";
|
|
29
|
+
super.connectedCallback();
|
|
30
|
+
this.udpateCallBack = () => this.update();
|
|
31
|
+
if (this.publisher)
|
|
32
|
+
this.publisher.onInternalMutation(this.udpateCallBack);
|
|
33
|
+
}
|
|
34
|
+
disconnectedCallback() {
|
|
35
|
+
if (this.publisher)
|
|
36
|
+
this.publisher.offInternalMutation(this.udpateCallBack);
|
|
37
|
+
super.disconnectedCallback();
|
|
38
|
+
}
|
|
39
|
+
update() {
|
|
40
|
+
if (!this.props)
|
|
41
|
+
return;
|
|
42
|
+
let onDataPath = this.getAttribute("onData").split(".");
|
|
43
|
+
let searchedData = Objects.traverse(this.props, onDataPath);
|
|
44
|
+
if (searchedData) {
|
|
45
|
+
LocationHandler.changeFromComponent(this);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
SonicRedirect = __decorate([
|
|
50
|
+
customElement("sonic-redirect")
|
|
51
|
+
], SonicRedirect);
|
|
52
|
+
export { SonicRedirect };
|
|
53
|
+
//Ajout pour la creation du cem notamment pour Storybook
|
|
54
|
+
try {
|
|
55
|
+
customElements.define("sonic-redirect", SonicRedirect);
|
|
56
|
+
}
|
|
57
|
+
catch (e) { }
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
declare const SonicRouter_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface) & (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/TemplatesContainer").TemplatesContainerInterface) & typeof LitElement;
|
|
3
|
+
/**
|
|
4
|
+
* ### Le router observe les modification document.location et met à jour sa vu de la manière suivante :
|
|
5
|
+
* * Il boucle sur ses template enfants et test si la regexp contenue dans l'attribut *data-route* match document.location
|
|
6
|
+
* * Si oui le contenu du template est affiché
|
|
7
|
+
* * Si l'attribut dataProviderExpression est fourni le contenu est entouré d'une div :
|
|
8
|
+
* * L'attribut "dataProvider" de cette div est le resultat de l'appel à la fonction replace sur la propriété location avec comme paramettres la regexpe et dataproviderExpression.
|
|
9
|
+
* * On peut également utiliser les des expressions du type url-pattern pour les paramètres de la route voir les exemples
|
|
10
|
+
* * les subscribers/fetch... du template ser réfèrerons à ce dataProvider
|
|
11
|
+
*
|
|
12
|
+
* **Exemples **
|
|
13
|
+
* Avec location = /youpla/utilisateur/2 :
|
|
14
|
+
* * RegExp : data-route = /utilisateur/(\d+) et dataproviderExpression = /user/$1 l'attribut dataProvider vaudra "/user/2"
|
|
15
|
+
* * url-pattern : /*utilisateur/:id et dataproviderExpression = /user/:id l'attribut dataProvider vaudra "/user/2"
|
|
16
|
+
*/
|
|
17
|
+
export declare class SonicRouter extends SonicRouter_base {
|
|
18
|
+
templateValueAttribute: string;
|
|
19
|
+
connectedCallback(): void;
|
|
20
|
+
disconnectedCallback(): void;
|
|
21
|
+
private _location;
|
|
22
|
+
set location(value: string);
|
|
23
|
+
get location(): string;
|
|
24
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { html, LitElement } from "lit";
|
|
8
|
+
import { customElement, property } from "lit/decorators.js";
|
|
9
|
+
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
10
|
+
import { templateContent } from "lit/directives/template-content.js";
|
|
11
|
+
import LocationHandler from "@supersoniks/concorde/core/utils/LocationHandler";
|
|
12
|
+
import { repeat } from "lit/directives/repeat.js";
|
|
13
|
+
import UrlPattern from "url-pattern";
|
|
14
|
+
import TemplatesContainer from "@supersoniks/concorde/core/mixins/TemplatesContainer";
|
|
15
|
+
/**
|
|
16
|
+
* ### Le router observe les modification document.location et met à jour sa vu de la manière suivante :
|
|
17
|
+
* * Il boucle sur ses template enfants et test si la regexp contenue dans l'attribut *data-route* match document.location
|
|
18
|
+
* * Si oui le contenu du template est affiché
|
|
19
|
+
* * Si l'attribut dataProviderExpression est fourni le contenu est entouré d'une div :
|
|
20
|
+
* * L'attribut "dataProvider" de cette div est le resultat de l'appel à la fonction replace sur la propriété location avec comme paramettres la regexpe et dataproviderExpression.
|
|
21
|
+
* * On peut également utiliser les des expressions du type url-pattern pour les paramètres de la route voir les exemples
|
|
22
|
+
* * les subscribers/fetch... du template ser réfèrerons à ce dataProvider
|
|
23
|
+
*
|
|
24
|
+
* **Exemples **
|
|
25
|
+
* Avec location = /youpla/utilisateur/2 :
|
|
26
|
+
* * RegExp : data-route = /utilisateur/(\d+) et dataproviderExpression = /user/$1 l'attribut dataProvider vaudra "/user/2"
|
|
27
|
+
* * url-pattern : /*utilisateur/:id et dataproviderExpression = /user/:id l'attribut dataProvider vaudra "/user/2"
|
|
28
|
+
*/
|
|
29
|
+
let SonicRouter = class SonicRouter extends Subscriber(TemplatesContainer(LitElement)) {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.templateValueAttribute = "data-route";
|
|
33
|
+
this._location = document.location.href.replace(document.location.origin, "");
|
|
34
|
+
}
|
|
35
|
+
connectedCallback() {
|
|
36
|
+
this.noShadowDom = "";
|
|
37
|
+
LocationHandler.onChange(this);
|
|
38
|
+
super.connectedCallback();
|
|
39
|
+
}
|
|
40
|
+
disconnectedCallback() {
|
|
41
|
+
LocationHandler.offChange(this);
|
|
42
|
+
super.disconnectedCallback();
|
|
43
|
+
}
|
|
44
|
+
set location(value) {
|
|
45
|
+
this._location = value;
|
|
46
|
+
this.requestUpdate();
|
|
47
|
+
}
|
|
48
|
+
get location() {
|
|
49
|
+
return this._location;
|
|
50
|
+
}
|
|
51
|
+
render() {
|
|
52
|
+
let templates = [];
|
|
53
|
+
for (let t of this.templatePartsList) {
|
|
54
|
+
let path = t.getAttribute(this.templateValueAttribute);
|
|
55
|
+
let regexp = new RegExp(path);
|
|
56
|
+
let urlPattern = new UrlPattern(path);
|
|
57
|
+
if (regexp.test(this.location)) {
|
|
58
|
+
templates.push(t);
|
|
59
|
+
}
|
|
60
|
+
else if (urlPattern.match(this.location)) {
|
|
61
|
+
t.setAttribute("mode", "patternMatching");
|
|
62
|
+
templates.push(t);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return html `${repeat(templates, (template, index) => {
|
|
66
|
+
template;
|
|
67
|
+
return index + new Date().getTime();
|
|
68
|
+
}, (template) => {
|
|
69
|
+
var _a;
|
|
70
|
+
if (template.title)
|
|
71
|
+
document.title = template.title;
|
|
72
|
+
if (template.hasAttribute("dataProviderExpression")) {
|
|
73
|
+
let dataProvider = "";
|
|
74
|
+
let dataProviderExpression = template.getAttribute("dataProviderExpression");
|
|
75
|
+
if (template.getAttribute("mode") == "patternMatching") {
|
|
76
|
+
const matcher = new UrlPattern(template.getAttribute(this.templateValueAttribute));
|
|
77
|
+
const filler = new UrlPattern(dataProviderExpression);
|
|
78
|
+
dataProvider = filler.stringify(matcher.match(this.location));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const regexp = new RegExp(template.getAttribute(this.templateValueAttribute));
|
|
82
|
+
let match = (this.location + "").match(regexp);
|
|
83
|
+
if (match) {
|
|
84
|
+
dataProvider = (_a = match.shift()) === null || _a === void 0 ? void 0 : _a.replace(regexp, dataProviderExpression);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return html `<div style="display:contents" dataProvider="${dataProvider}">${templateContent(template)}</div>`;
|
|
88
|
+
}
|
|
89
|
+
return templateContent(template);
|
|
90
|
+
})}`;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
__decorate([
|
|
94
|
+
property()
|
|
95
|
+
], SonicRouter.prototype, "location", null);
|
|
96
|
+
SonicRouter = __decorate([
|
|
97
|
+
customElement("sonic-router")
|
|
98
|
+
], SonicRouter);
|
|
99
|
+
export { SonicRouter };
|
|
100
|
+
//Ajout pour la creation du cem notamment pour Storybook
|
|
101
|
+
try {
|
|
102
|
+
customElements.define("sonic-router", SonicRouter);
|
|
103
|
+
}
|
|
104
|
+
catch (e) { }
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
declare const SonicStates_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface) & (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/TemplatesContainer").TemplatesContainerInterface) & typeof LitElement;
|
|
3
|
+
/**
|
|
4
|
+
* ### sonic-states affiche des états différents en fonction de la valeur d'une sous propriété de son dataProvider (attribut data-path en dot notation):
|
|
5
|
+
* * Il boucle sur ses template enfants et test si la regexp contenue dans l'attribut *data-value* match la valeur de la propriété
|
|
6
|
+
* * Si oui le contenu du template correspontant est affiché comme état.
|
|
7
|
+
* * Si l'attribut dataProviderExpression est fourni le contenu est entouré d'une div :
|
|
8
|
+
* * L'attribut "dataProvider" de cette div est le resultat de l'appel à la fonction replace sur valeur de la propriété avec comme paramettres la regexp et dataproviderExpression.
|
|
9
|
+
* * Les subscribers/fetch... du template se réfèrerons à ce dataProvider
|
|
10
|
+
* * On peut également utiliser les des expressions du type url-pattern pour les paramètres de la route voir les exemples
|
|
11
|
+
*
|
|
12
|
+
* **Exemples**
|
|
13
|
+
* Avec ma.propriete= 2 :
|
|
14
|
+
* * RegExp data-value = (\d+) et dataproviderExpression = /user/$1 l'attribut dataProvider vaudra "/user/2"
|
|
15
|
+
* * url-pattern data-value = :id et dataproviderExpression = /user/:id l'attribut dataProvider vaudra "/user/2"
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
export declare class SonicStates extends SonicStates_base {
|
|
19
|
+
state: string;
|
|
20
|
+
inverted: Boolean;
|
|
21
|
+
statePath: string;
|
|
22
|
+
onAssign: ((value: any) => void) | null;
|
|
23
|
+
statePublisher: any;
|
|
24
|
+
connectedCallback(): void;
|
|
25
|
+
disconnectedCallback(): void;
|
|
26
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
27
|
+
}
|
|
28
|
+
export {};
|