@supersoniks/concorde 1.0.7 → 1.0.8
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 +179 -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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gestionnaire d'écoute des modifications sur l'url courante.
|
|
3
|
+
* On peut s'y abonner via la methode statique onChange()
|
|
4
|
+
* Utilisé par sonic-bouton pour lm'affichage de l'état actif et par le router.
|
|
5
|
+
*/
|
|
6
|
+
export default class LocationHandler {
|
|
7
|
+
static listen() {
|
|
8
|
+
if (!LocationHandler.listening) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
let newURL = document.location.href.replace(document.location.origin, "");
|
|
12
|
+
if (LocationHandler.prevURL && LocationHandler.prevURL != newURL) {
|
|
13
|
+
LocationHandler.prevURL = newURL;
|
|
14
|
+
LocationHandler.listeners.forEach((listener) => {
|
|
15
|
+
listener.location = newURL;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
window.requestAnimationFrame(LocationHandler.listen);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Arrête l'écoute des changements de location pour le listener fournit
|
|
22
|
+
*/
|
|
23
|
+
static offChange(listener) {
|
|
24
|
+
let idx = LocationHandler.listeners.indexOf(listener);
|
|
25
|
+
if (idx == -1)
|
|
26
|
+
return;
|
|
27
|
+
LocationHandler.listeners.splice(idx, 1);
|
|
28
|
+
if (LocationHandler.listeners.length == 0)
|
|
29
|
+
LocationHandler.listening = false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Ecoute les changements de location et l'assigne à la propriété location de chaque listener
|
|
33
|
+
*/
|
|
34
|
+
static onChange(listener) {
|
|
35
|
+
if (!LocationHandler.listening) {
|
|
36
|
+
LocationHandler.listening = true;
|
|
37
|
+
LocationHandler.listen();
|
|
38
|
+
}
|
|
39
|
+
LocationHandler.listeners.push(listener);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
* @param component HTMLElement
|
|
44
|
+
* Recupère la proprité to ou href de l'élément et lance la navigation
|
|
45
|
+
* Si l'attribut pushState est présent la naviguation se fait via un pushState
|
|
46
|
+
* Si l'attribut replaceState est présent la naviguation se fait via un replaceState
|
|
47
|
+
* Voir link et button pour les exemples d'implémentation
|
|
48
|
+
**/
|
|
49
|
+
static changeFromComponent(component) {
|
|
50
|
+
let to = component.getAttribute("to");
|
|
51
|
+
if (!to)
|
|
52
|
+
to = component.href;
|
|
53
|
+
if (!to)
|
|
54
|
+
return;
|
|
55
|
+
if (to.indexOf("#") == 0) {
|
|
56
|
+
document.location.hash = to.substring(1);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
let url = new URL(to, document.location.href);
|
|
60
|
+
let split = url.pathname.split("/");
|
|
61
|
+
let newPathName = [];
|
|
62
|
+
let prevSp = "";
|
|
63
|
+
for (let sp of split) {
|
|
64
|
+
if (sp != prevSp)
|
|
65
|
+
newPathName.push(sp);
|
|
66
|
+
prevSp = sp;
|
|
67
|
+
}
|
|
68
|
+
to = "/" + newPathName.join("/") + url.search + (url.hash ? +url.hash : "");
|
|
69
|
+
if (component.hasAttribute("pushState")) {
|
|
70
|
+
history.pushState(null, "", to);
|
|
71
|
+
}
|
|
72
|
+
else if (component.hasAttribute("replaceState")) {
|
|
73
|
+
history.replaceState(null, "", to);
|
|
74
|
+
}
|
|
75
|
+
else
|
|
76
|
+
document.location.href = to;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
*
|
|
80
|
+
* @param component ActivableLink
|
|
81
|
+
* Ajoute l'attribut "active" à l'élément si l'url correspond à la location
|
|
82
|
+
*/
|
|
83
|
+
static updateComponentActiveState(component) {
|
|
84
|
+
if (component.href && component.href.indexOf("http") != 0) {
|
|
85
|
+
let url1 = new URL(component.href, document.location.href);
|
|
86
|
+
let url2 = new URL(component.location, document.location.origin);
|
|
87
|
+
if (url1.pathname == url2.pathname && url1.hash == url2.hash && url1.search == url2.search)
|
|
88
|
+
component.setAttribute("active", "true");
|
|
89
|
+
else
|
|
90
|
+
component.removeAttribute("active");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
LocationHandler.listeners = [];
|
|
95
|
+
LocationHandler.listening = false;
|
|
96
|
+
LocationHandler.prevURL = document.location.href.replace(document.location.origin, "");
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
declare class Objects {
|
|
2
|
+
/**
|
|
3
|
+
* Effectue une comparaison d'égalité non profonde entre deux objets.
|
|
4
|
+
*/
|
|
5
|
+
static shallowEqual(object1: any, object2: any): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Effectue une comparaison d'égalité profonde entre deux objets.
|
|
8
|
+
*/
|
|
9
|
+
static deepEqual(object1: any, object2: any): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* @returns true si l'objet est un objet ou un tableau (qui est un objet). mais false si null (car sinon typeof null "object")
|
|
12
|
+
*/
|
|
13
|
+
static isObject(object: any): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* @returns true si l'argument est null ou undefined
|
|
16
|
+
*/
|
|
17
|
+
static isUndefindOrNull(object: any): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* traverse l'objet pour obtenir la valeur a l'adresse donnée via le tableau de clés pathArray.
|
|
20
|
+
*/
|
|
21
|
+
static traverse(obj: any, pathArray: string[]): any;
|
|
22
|
+
}
|
|
23
|
+
export default Objects;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
class Objects {
|
|
2
|
+
/**
|
|
3
|
+
* Effectue une comparaison d'égalité non profonde entre deux objets.
|
|
4
|
+
*/
|
|
5
|
+
static shallowEqual(object1, object2) {
|
|
6
|
+
const keys1 = Object.keys(object1);
|
|
7
|
+
const keys2 = Object.keys(object2);
|
|
8
|
+
if (keys1.length !== keys2.length) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
for (let key of keys1) {
|
|
12
|
+
if (object1[key] !== object2[key]) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Effectue une comparaison d'égalité profonde entre deux objets.
|
|
20
|
+
*/
|
|
21
|
+
static deepEqual(object1, object2) {
|
|
22
|
+
const keys1 = Object.keys(object1);
|
|
23
|
+
const keys2 = Object.keys(object2);
|
|
24
|
+
if (keys1.length !== keys2.length) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
for (const key of keys1) {
|
|
28
|
+
const val1 = object1[key];
|
|
29
|
+
const val2 = object2[key];
|
|
30
|
+
const areObjects = Objects.isObject(val1) && Objects.isObject(val2);
|
|
31
|
+
if ((areObjects && !Objects.deepEqual(val1, val2)) || (!areObjects && val1 !== val2)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @returns true si l'objet est un objet ou un tableau (qui est un objet). mais false si null (car sinon typeof null "object")
|
|
39
|
+
*/
|
|
40
|
+
static isObject(object) {
|
|
41
|
+
return object != null && typeof object === "object";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @returns true si l'argument est null ou undefined
|
|
45
|
+
*/
|
|
46
|
+
static isUndefindOrNull(object) {
|
|
47
|
+
return object === null || object === undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* traverse l'objet pour obtenir la valeur a l'adresse donnée via le tableau de clés pathArray.
|
|
51
|
+
*/
|
|
52
|
+
static traverse(obj, pathArray) {
|
|
53
|
+
for (let key of pathArray) {
|
|
54
|
+
let newObj = obj[key];
|
|
55
|
+
if (newObj === undefined) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
obj = obj[key];
|
|
59
|
+
}
|
|
60
|
+
return obj;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export default Objects;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Proxy contient les méthodes des publishers retournés par PublisherManager.get(publisherId) qui seront utilisées couramment
|
|
3
|
+
*/
|
|
4
|
+
export class PublisherProxy {
|
|
5
|
+
constructor(target: any, parentProxPub?: null);
|
|
6
|
+
_proxies_: Map<any, any>;
|
|
7
|
+
_value_: any;
|
|
8
|
+
_assignListeners_: Set<any>;
|
|
9
|
+
_mutationListeners_: Set<any>;
|
|
10
|
+
_fillListeners_: Set<any>;
|
|
11
|
+
_templateFillListeners_: Set<any>;
|
|
12
|
+
_lockInternalMutationPublishing_: boolean;
|
|
13
|
+
parent: any;
|
|
14
|
+
root: any;
|
|
15
|
+
/**
|
|
16
|
+
* Supprime le proxy et ses sous proxy
|
|
17
|
+
* Supprime les écouteurs associés
|
|
18
|
+
*/
|
|
19
|
+
delete(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Utile pour savoir si quelque chose est en écoute d'une modification sur le proxy via une des methodes associées
|
|
22
|
+
*/
|
|
23
|
+
hasListener(): boolean;
|
|
24
|
+
_publishInternalMutation_(lockInternalMutationsTransmission?: boolean): void;
|
|
25
|
+
_publishAssignement_(lockInternalMutationsTransmission?: boolean): void;
|
|
26
|
+
_publishDynamicFilling_(key: any, value: any): void;
|
|
27
|
+
_publishTemplateFilling_(key: any, value: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Appel la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
|
|
30
|
+
* hanlder reçois alors la nouvelle valeur interne du proxy en paramètre
|
|
31
|
+
*/
|
|
32
|
+
onAssign(handler: any): void;
|
|
33
|
+
/**
|
|
34
|
+
* Stop les appels de la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
|
|
35
|
+
*/
|
|
36
|
+
offAssign(handler: any): void;
|
|
37
|
+
/**
|
|
38
|
+
* Appel la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
onInternalMutation(handler: any): void;
|
|
42
|
+
/**
|
|
43
|
+
* Stop les Appels de la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
|
|
44
|
+
*/
|
|
45
|
+
offInternalMutation(handler: any): void;
|
|
46
|
+
/**
|
|
47
|
+
* Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
|
|
48
|
+
* Remplit uniquement les valeurs déjà présentes dans l'objet / tableau passé en paramètre
|
|
49
|
+
*/
|
|
50
|
+
startTemplateFilling(handler: any): void;
|
|
51
|
+
/**
|
|
52
|
+
* Arrête de maintenir le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
|
|
53
|
+
*/
|
|
54
|
+
stopTemplateFilling(handler: any): void;
|
|
55
|
+
/**
|
|
56
|
+
* Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
|
|
57
|
+
* Remplit toute valeur qu'elle soit présente ou pas initialement dans l'objet
|
|
58
|
+
*/
|
|
59
|
+
startDynamicFilling(handler: any): void;
|
|
60
|
+
stopDynamicFilling(handler: any): void;
|
|
61
|
+
/**
|
|
62
|
+
* Assigne une nouvelle valeur au proxy ce qui déclenche la transmission de la donnée en fonction des "écouteurs" associés
|
|
63
|
+
*/
|
|
64
|
+
set(newValue: any, lockInternalMutationsTransmission?: boolean): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Extraire la valeur actuelle du proxy
|
|
67
|
+
*/
|
|
68
|
+
get(): any;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Utilitaires de gestion des Publisher
|
|
72
|
+
* Obtenir, replacer ou supprimer un Publisher
|
|
73
|
+
*
|
|
74
|
+
*/
|
|
75
|
+
export class PublisherManager {
|
|
76
|
+
static instance: null;
|
|
77
|
+
/**
|
|
78
|
+
* PublisherManager est un singleton
|
|
79
|
+
*/
|
|
80
|
+
static getInstance(): PublisherManager;
|
|
81
|
+
/**
|
|
82
|
+
* shortcut static pour obtenir un publisher vias sont id/adresse sans taper getInstance.
|
|
83
|
+
* Si le publisher n'existe pas, il est créé.
|
|
84
|
+
*/
|
|
85
|
+
static get(id: any): any;
|
|
86
|
+
/**
|
|
87
|
+
* shortcut static pour supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
|
|
88
|
+
*/
|
|
89
|
+
static delete(id: any): false | undefined;
|
|
90
|
+
publishers: Map<any, any>;
|
|
91
|
+
/**
|
|
92
|
+
* Obtenir un publisher vias sont id/adresse
|
|
93
|
+
* Si le publisher n'existe pas, il est créé.
|
|
94
|
+
*/
|
|
95
|
+
get(id: any): any;
|
|
96
|
+
/**
|
|
97
|
+
* Remplace un publisher pour l'id fourni par un autre.
|
|
98
|
+
* L'autre publisher n'est pas supprimé.
|
|
99
|
+
*/
|
|
100
|
+
set(id: any, publisher: any): void;
|
|
101
|
+
/**
|
|
102
|
+
* supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
|
|
103
|
+
*/
|
|
104
|
+
delete(id: any): false | undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Le Proxy Javascript
|
|
108
|
+
*/
|
|
109
|
+
export default class Publisher extends PublisherProxy {
|
|
110
|
+
}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
3
|
+
* Merci de laisser ce fichier sans la moindre dépendance.
|
|
4
|
+
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
5
|
+
* **/
|
|
6
|
+
function isComplex(value) {
|
|
7
|
+
return typeof value === "object" && value != null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Custom Proxy contient les méthodes des publishers retournés par PublisherManager.get(publisherId) qui seront utilisées couramment
|
|
11
|
+
*/
|
|
12
|
+
export class PublisherProxy {
|
|
13
|
+
constructor(target, parentProxPub = null) {
|
|
14
|
+
this._proxies_ = new Map();
|
|
15
|
+
this._value_ = target;
|
|
16
|
+
this._assignListeners_ = new Set();
|
|
17
|
+
this._mutationListeners_ = new Set();
|
|
18
|
+
this._fillListeners_ = new Set();
|
|
19
|
+
this._templateFillListeners_ = new Set();
|
|
20
|
+
this._lockInternalMutationPublishing_ = false;
|
|
21
|
+
this.parent = parentProxPub;
|
|
22
|
+
this.root = this;
|
|
23
|
+
while (this.root.parent) {
|
|
24
|
+
this.root = this.root.parent;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Supprime le proxy et ses sous proxy
|
|
29
|
+
* Supprime les écouteurs associés
|
|
30
|
+
*/
|
|
31
|
+
delete() {
|
|
32
|
+
for (let proxy of this._proxies_.values()) {
|
|
33
|
+
proxy.delete();
|
|
34
|
+
}
|
|
35
|
+
this._assignListeners_.clear();
|
|
36
|
+
this._mutationListeners_.clear();
|
|
37
|
+
this._fillListeners_.clear();
|
|
38
|
+
this._templateFillListeners_.clear();
|
|
39
|
+
this._proxies_.clear();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Utile pour savoir si quelque chose est en écoute d'une modification sur le proxy via une des methodes associées
|
|
43
|
+
*/
|
|
44
|
+
hasListener() {
|
|
45
|
+
return (this._templateFillListeners_.size > 0 ||
|
|
46
|
+
this._assignListeners_.size > 0 ||
|
|
47
|
+
this._mutationListeners_.size > 0 ||
|
|
48
|
+
this._fillListeners_.size > 0);
|
|
49
|
+
}
|
|
50
|
+
_publishInternalMutation_(lockInternalMutationsTransmission = false) {
|
|
51
|
+
this._mutationListeners_.forEach((handler) => handler());
|
|
52
|
+
if (lockInternalMutationsTransmission)
|
|
53
|
+
return;
|
|
54
|
+
if (this.parent) {
|
|
55
|
+
this.parent._publishInternalMutation_();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
_publishAssignement_(lockInternalMutationsTransmission = false) {
|
|
59
|
+
this._assignListeners_.forEach((handler) => handler(this._value_.__value ? this._value_.__value : this._value_));
|
|
60
|
+
this._publishInternalMutation_(lockInternalMutationsTransmission);
|
|
61
|
+
}
|
|
62
|
+
_publishDynamicFilling_(key, value) {
|
|
63
|
+
this._fillListeners_.forEach((handler) => {
|
|
64
|
+
if (handler[key] !== value)
|
|
65
|
+
handler[key] = value;
|
|
66
|
+
});
|
|
67
|
+
this._publishTemplateFilling_(key, value);
|
|
68
|
+
}
|
|
69
|
+
_publishTemplateFilling_(key, value) {
|
|
70
|
+
this._templateFillListeners_.forEach((handler) => {
|
|
71
|
+
if (typeof handler[key] != "undefined" && handler[key] !== value) {
|
|
72
|
+
handler[key] = value;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Appel la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
|
|
78
|
+
* hanlder reçois alors la nouvelle valeur interne du proxy en paramètre
|
|
79
|
+
*/
|
|
80
|
+
onAssign(handler) {
|
|
81
|
+
if (typeof handler != "function")
|
|
82
|
+
return;
|
|
83
|
+
this._assignListeners_.add(handler);
|
|
84
|
+
handler(this._value_.__value ? this._value_.__value : this._value_);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Stop les appels de la fonction "handler" (passée en paramettre) lorsque la valeur gérée par le proxy change par assignation
|
|
88
|
+
*/
|
|
89
|
+
offAssign(handler) {
|
|
90
|
+
this._assignListeners_.delete(handler);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Appel la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
|
|
94
|
+
*
|
|
95
|
+
*/
|
|
96
|
+
onInternalMutation(handler) {
|
|
97
|
+
if (typeof handler != "function")
|
|
98
|
+
return;
|
|
99
|
+
this._mutationListeners_.add(handler);
|
|
100
|
+
handler();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Stop les Appels de la fonction "handler" (passée en paramettre) lorsque quelque chose change la valeur gérée par le proxy quelque soit la profondeur de la donnée
|
|
104
|
+
*/
|
|
105
|
+
offInternalMutation(handler) {
|
|
106
|
+
this._mutationListeners_.delete(handler);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
|
|
110
|
+
* Remplit uniquement les valeurs déjà présentes dans l'objet / tableau passé en paramètre
|
|
111
|
+
*/
|
|
112
|
+
startTemplateFilling(handler) {
|
|
113
|
+
this._templateFillListeners_.add(handler);
|
|
114
|
+
for (var z in this._value_) {
|
|
115
|
+
const value = this._value_[z];
|
|
116
|
+
if (typeof handler[z] != "undefined" && handler[z] !== value) {
|
|
117
|
+
handler[z] = value;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Arrête de maintenir le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
|
|
123
|
+
*/
|
|
124
|
+
stopTemplateFilling(handler) {
|
|
125
|
+
this._templateFillListeners_.delete(handler);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Maintient le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
|
|
129
|
+
* Remplit toute valeur qu'elle soit présente ou pas initialement dans l'objet
|
|
130
|
+
*/
|
|
131
|
+
startDynamicFilling(handler) {
|
|
132
|
+
this._fillListeners_.add(handler);
|
|
133
|
+
for (var z in this._value_) {
|
|
134
|
+
const value = this._value_[z];
|
|
135
|
+
if (handler[z] !== value)
|
|
136
|
+
handler[z] = value;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/*
|
|
140
|
+
* Arrête de maintenir le remplissage de l'objet / tableau "handler" passé en paramètre avec les valeurs du proxy
|
|
141
|
+
*/
|
|
142
|
+
stopDynamicFilling(handler) {
|
|
143
|
+
this._fillListeners_.delete(handler);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Assigne une nouvelle valeur au proxy ce qui déclenche la transmission de la donnée en fonction des "écouteurs" associés
|
|
147
|
+
*/
|
|
148
|
+
set(newValue, lockInternalMutationsTransmission = false) {
|
|
149
|
+
if (this._value_ === newValue)
|
|
150
|
+
return true;
|
|
151
|
+
if (this._value_.hasOwnProperty("__value") &&
|
|
152
|
+
newValue.hasOwnProperty("__value") &&
|
|
153
|
+
this._value_.__value === newValue.__value) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
this._value_ = newValue;
|
|
157
|
+
if (this._value_.hasOwnProperty("__value")) {
|
|
158
|
+
this._publishAssignement_(lockInternalMutationsTransmission);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
Array.from(this._proxies_.keys()).forEach((key) => {
|
|
162
|
+
// delete this._value_[key];
|
|
163
|
+
if (!this._value_[key] && this._proxies_.has(key) && !this._proxies_.get(key).hasListener()) {
|
|
164
|
+
this._proxies_.delete(key);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
if (isComplex(this._value_)) {
|
|
168
|
+
for (let key in this._value_) {
|
|
169
|
+
let v = newValue[key];
|
|
170
|
+
let isVComplex = isComplex(v);
|
|
171
|
+
let valueV = isVComplex ? v : { __value: v };
|
|
172
|
+
if (!this._proxies_.has(key)) {
|
|
173
|
+
let newPublisher = new Publisher(valueV, this);
|
|
174
|
+
this._proxies_.set(key, newPublisher, true);
|
|
175
|
+
newPublisher._proxies_.set("_parent_", this);
|
|
176
|
+
}
|
|
177
|
+
this._proxies_.get(key).set(valueV, true);
|
|
178
|
+
this._publishDynamicFilling_(key, v);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
this._publishAssignement_();
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Extraire la valeur actuelle du proxy
|
|
186
|
+
*/
|
|
187
|
+
get() {
|
|
188
|
+
if (this._value_.__value)
|
|
189
|
+
return this._value_.__value;
|
|
190
|
+
return this._value_;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Utilitaires de gestion des Publisher
|
|
195
|
+
* Obtenir, replacer ou supprimer un Publisher
|
|
196
|
+
*
|
|
197
|
+
*/
|
|
198
|
+
export class PublisherManager {
|
|
199
|
+
constructor() {
|
|
200
|
+
if (PublisherManager.instance != null)
|
|
201
|
+
throw "Singleton / use getInstance";
|
|
202
|
+
PublisherManager.instance = this;
|
|
203
|
+
this.publishers = new Map();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* PublisherManager est un singleton
|
|
207
|
+
*/
|
|
208
|
+
static getInstance() {
|
|
209
|
+
if (PublisherManager.instance == null)
|
|
210
|
+
return new PublisherManager();
|
|
211
|
+
return PublisherManager.instance;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* shortcut static pour obtenir un publisher vias sont id/adresse sans taper getInstance.
|
|
215
|
+
* Si le publisher n'existe pas, il est créé.
|
|
216
|
+
*/
|
|
217
|
+
static get(id) {
|
|
218
|
+
return PublisherManager.getInstance().get(id);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* shortcut static pour supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
|
|
222
|
+
*/
|
|
223
|
+
static delete(id) {
|
|
224
|
+
return PublisherManager.getInstance().delete(id);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Obtenir un publisher vias sont id/adresse
|
|
228
|
+
* Si le publisher n'existe pas, il est créé.
|
|
229
|
+
*/
|
|
230
|
+
get(id) {
|
|
231
|
+
if (!this.publishers.has(id))
|
|
232
|
+
this.publishers.set(id, new Publisher({}));
|
|
233
|
+
return this.publishers.get(id);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Remplace un publisher pour l'id fourni par un autre.
|
|
237
|
+
* L'autre publisher n'est pas supprimé.
|
|
238
|
+
*/
|
|
239
|
+
set(id, publisher) {
|
|
240
|
+
this.publishers.set(id, publisher);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* supprimer un publisher de la liste et appel également delete sur le publisher ce qui le supprime, de même que ses sous publishers
|
|
244
|
+
*/
|
|
245
|
+
delete(id) {
|
|
246
|
+
if (!this.publishers.has(id))
|
|
247
|
+
return false;
|
|
248
|
+
const publisher = this.publishers.get(id);
|
|
249
|
+
this.publishers.delete(id);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
PublisherManager.instance = null;
|
|
253
|
+
/**
|
|
254
|
+
* Le Proxy Javascript
|
|
255
|
+
*/
|
|
256
|
+
export default class Publisher extends PublisherProxy {
|
|
257
|
+
constructor(target, parentProxPub = null) {
|
|
258
|
+
super(target, parentProxPub);
|
|
259
|
+
let that = this;
|
|
260
|
+
let thisProxy = new Proxy(this, {
|
|
261
|
+
/**
|
|
262
|
+
* Lorsque l'on écrit monConteneur = publisher.maClef ou monConteneur = publisher["maClef"] monConteneur contient :
|
|
263
|
+
* Les methodes de PublisherProxy (onAssign... : voir liste dans kle tableaus si dessous), si la clef est une méthode de PublisherProxy,,
|
|
264
|
+
* Sinon un autre proxy qui a comme valeur interne la valeur corespondante à la clef dans l'objet.
|
|
265
|
+
*/
|
|
266
|
+
get: function (oTarget, sKey) {
|
|
267
|
+
if ([
|
|
268
|
+
"onAssign",
|
|
269
|
+
"offAssign",
|
|
270
|
+
"startDynamicFilling",
|
|
271
|
+
"stopDynamicFilling",
|
|
272
|
+
"startTemplateFilling",
|
|
273
|
+
"stopTemplateFilling",
|
|
274
|
+
"onInternalMutation",
|
|
275
|
+
"offInternalMutation",
|
|
276
|
+
"set",
|
|
277
|
+
"get",
|
|
278
|
+
"_templateFillListeners_",
|
|
279
|
+
"_fillListeners_",
|
|
280
|
+
"_assignListeners_",
|
|
281
|
+
"_publishInternalMutation_",
|
|
282
|
+
"hasListener",
|
|
283
|
+
"delete",
|
|
284
|
+
"_mutationListeners_",
|
|
285
|
+
"_publishDynamicFilling_",
|
|
286
|
+
"_publishTemplateFilling_",
|
|
287
|
+
"_publishAssignement_",
|
|
288
|
+
"_proxies_",
|
|
289
|
+
"parent",
|
|
290
|
+
"_value_",
|
|
291
|
+
"_lockInternalMutationPublishing_",
|
|
292
|
+
].includes(sKey))
|
|
293
|
+
return that[sKey];
|
|
294
|
+
if (!that._proxies_.has(sKey)) {
|
|
295
|
+
let vValue = that._value_[sKey];
|
|
296
|
+
let newPublisher = new Publisher(isComplex(vValue) ? vValue : { __value: vValue }, that);
|
|
297
|
+
newPublisher._proxies_.set("_parent_", thisProxy);
|
|
298
|
+
that._proxies_.set(sKey, newPublisher);
|
|
299
|
+
}
|
|
300
|
+
return that._proxies_.get(sKey);
|
|
301
|
+
},
|
|
302
|
+
/**
|
|
303
|
+
* Lorsque l'on écrit publisher.maClef = value ou publisher["maClef"] = value, on assigne la valeur à la clef dans l'objet interne.
|
|
304
|
+
* Les gestionnairs associés sopnt déclenchés en conséquence de manière profonde et remontante si nécessaire.
|
|
305
|
+
*/
|
|
306
|
+
set: function (oTarget, sKey, vValue) {
|
|
307
|
+
if (sKey == "_value_") {
|
|
308
|
+
oTarget._value_ = vValue;
|
|
309
|
+
return oTarget._value_;
|
|
310
|
+
}
|
|
311
|
+
const isValueComplex = isComplex(vValue);
|
|
312
|
+
if (!that._proxies_.has(sKey)) {
|
|
313
|
+
let newPublisher = new Publisher(isValueComplex ? vValue : { __value: vValue }, that);
|
|
314
|
+
newPublisher._proxies_.set("_parent_", thisProxy);
|
|
315
|
+
that._proxies_.set(sKey, newPublisher);
|
|
316
|
+
}
|
|
317
|
+
if (that._value_[sKey] === vValue && isValueComplex)
|
|
318
|
+
return vValue;
|
|
319
|
+
const prevValue = that._value_[sKey];
|
|
320
|
+
if (prevValue !== vValue) {
|
|
321
|
+
that._value_[sKey] = vValue;
|
|
322
|
+
that._publishDynamicFilling_(sKey, vValue);
|
|
323
|
+
}
|
|
324
|
+
that._proxies_.get(sKey).set(isComplex(vValue) ? vValue : { __value: vValue });
|
|
325
|
+
return that._proxies_.get(sKey);
|
|
326
|
+
},
|
|
327
|
+
/**
|
|
328
|
+
* Autres propriétés classiques d'un objet implémentées par le proxy
|
|
329
|
+
*/
|
|
330
|
+
deleteProperty: function (oTarget, sKey) {
|
|
331
|
+
that._proxies_.get(sKey).set(null);
|
|
332
|
+
that._publishDynamicFilling_(sKey, null);
|
|
333
|
+
that._proxies_.delete(sKey);
|
|
334
|
+
return delete that._value_[sKey];
|
|
335
|
+
},
|
|
336
|
+
enumerate: function (oTarget, sKey) {
|
|
337
|
+
return that._value_.keys();
|
|
338
|
+
},
|
|
339
|
+
has: function (oTarget, sKey) {
|
|
340
|
+
return sKey in that._value_ && sKey != "_lockInternalMutationPublishing_";
|
|
341
|
+
},
|
|
342
|
+
defineProperty: function (oTarget, sKey, oDesc) {
|
|
343
|
+
if (oDesc && "value" in oDesc) {
|
|
344
|
+
that._value_[sKey] = oDesc.value;
|
|
345
|
+
}
|
|
346
|
+
return that._value_;
|
|
347
|
+
},
|
|
348
|
+
getOwnPropertyDescriptor: function (oTarget, sKey) {
|
|
349
|
+
var vValue = that._value_[sKey];
|
|
350
|
+
return {
|
|
351
|
+
enumerable: true,
|
|
352
|
+
configurable: true,
|
|
353
|
+
};
|
|
354
|
+
},
|
|
355
|
+
ownKeys: function (target) {
|
|
356
|
+
if (that._value_.__value)
|
|
357
|
+
return Object.keys(this._value_.__value);
|
|
358
|
+
return Object.keys(that._value_);
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
return thisProxy;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (typeof module != "undefined")
|
|
365
|
+
module.exports = { Publisher: Publisher, PublisherManager: PublisherManager };
|