@supersoniks/concorde 1.1.42 → 1.1.43
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/components.js +2 -3
- package/concorde-core.bundle.js +37 -35
- package/concorde-core.es.js +5081 -4317
- package/core/_types/types.d.ts +26 -0
- package/core/_types/types.js +1 -0
- package/core/components/functional/date/date.d.ts +13 -5
- package/core/components/functional/date/date.js +48 -29
- package/core/components/functional/example/example.d.ts +1 -1
- package/core/components/functional/example/example.js +1 -1
- package/core/components/functional/fetch/fetch.d.ts +40 -3
- package/core/components/functional/fetch/fetch.js +2 -6
- package/core/components/functional/functional.d.ts +2 -0
- package/core/components/functional/functional.js +2 -0
- package/core/components/functional/if/if.d.ts +3 -0
- package/core/components/functional/if/if.js +6 -12
- package/core/components/functional/if/if.test.d.ts +1 -0
- package/core/components/functional/if/if.test.js +44 -0
- package/core/components/functional/list/list.d.ts +32 -8
- package/core/components/functional/list/list.js +33 -40
- package/core/components/functional/mix/mix.d.ts +22 -0
- package/core/components/functional/mix/mix.js +99 -0
- package/core/components/functional/queue/queue.d.ts +16 -3
- package/core/components/functional/queue/queue.js +71 -15
- package/core/components/functional/router/redirect.d.ts +10 -1
- package/core/components/functional/router/redirect.js +5 -6
- package/core/components/functional/router/router.d.ts +15 -1
- package/core/components/functional/router/router.js +1 -6
- package/core/components/functional/sdui/SDUIDescriptorTransformer.d.ts +1 -1
- package/core/components/functional/sdui/SDUIDescriptorTransformer.js +24 -12
- package/core/components/functional/sdui/default-library.json +108 -0
- package/core/components/functional/sdui/sdui-utils.d.ts +5 -0
- package/core/components/functional/sdui/sdui-utils.js +63 -0
- package/core/components/functional/sdui/sdui.d.ts +16 -9
- package/core/components/functional/sdui/sdui.js +52 -25
- package/core/components/functional/sdui/types.d.ts +4 -2
- package/core/components/functional/states/states.d.ts +19 -3
- package/core/components/functional/states/states.js +7 -12
- package/core/components/functional/submit/submit.d.ts +16 -1
- package/core/components/functional/submit/submit.js +87 -17
- package/core/components/functional/subscriber/subscriber.d.ts +4 -1
- package/core/components/functional/subscriber/subscriber.js +1 -6
- package/core/components/functional/value/value.d.ts +7 -0
- package/core/components/functional/value/value.js +26 -0
- package/core/components/ui/_css/scroll.js +6 -7
- package/core/components/ui/_css/size.d.ts +1 -0
- package/core/components/ui/_css/size.js +3 -1
- package/core/components/ui/alert/alert.d.ts +2 -2
- package/core/components/ui/alert/alert.js +11 -16
- package/core/components/ui/badge/badge.d.ts +3 -1
- package/core/components/ui/badge/badge.js +36 -22
- package/core/components/ui/button/button.d.ts +23 -20
- package/core/components/ui/button/button.js +59 -42
- package/core/components/ui/captcha/captcha.d.ts +14 -2
- package/core/components/ui/captcha/captcha.js +17 -12
- package/core/components/ui/card/card-footer.js +1 -8
- package/core/components/ui/card/card-header-descripton.js +3 -9
- package/core/components/ui/card/card-header.js +1 -6
- package/core/components/ui/card/card-main.js +0 -5
- package/core/components/ui/card/card.d.ts +1 -1
- package/core/components/ui/card/card.js +28 -12
- package/core/components/ui/divider/divider.d.ts +2 -0
- package/core/components/ui/divider/divider.js +43 -16
- package/core/components/ui/form/checkbox/checkbox.d.ts +53 -16
- package/core/components/ui/form/checkbox/checkbox.js +53 -28
- package/core/components/ui/form/css/form-control.d.ts +2 -0
- package/core/components/ui/form/css/form-control.js +145 -67
- package/core/components/ui/form/fieldset/fieldset.d.ts +8 -1
- package/core/components/ui/form/fieldset/fieldset.js +45 -8
- package/core/components/ui/form/fieldset/legend-description.js +0 -5
- package/core/components/ui/form/fieldset/legend.js +3 -6
- package/core/components/ui/form/form-actions/form-actions.d.ts +2 -0
- package/core/components/ui/form/form-actions/form-actions.js +26 -11
- package/core/components/ui/form/form-layout/form-layout.d.ts +5 -2
- package/core/components/ui/form/form-layout/form-layout.js +31 -9
- package/core/components/ui/form/input/input.d.ts +15 -18
- package/core/components/ui/form/input/input.js +87 -52
- package/core/components/ui/form/input/password-helper.d.ts +1 -1
- package/core/components/ui/form/input/password-helper.js +3 -2
- package/core/components/ui/form/input/same-value-helper.d.ts +1 -1
- package/core/components/ui/form/input/same-value-helper.js +1 -0
- package/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +2 -3
- package/core/components/ui/form/input-autocomplete/input-autocomplete.js +2 -6
- package/core/components/ui/form/radio/radio.d.ts +6 -0
- package/core/components/ui/form/radio/radio.js +7 -12
- package/core/components/ui/form/select/select.d.ts +23 -7
- package/core/components/ui/form/select/select.js +69 -38
- package/core/components/ui/form/textarea/textarea.d.ts +13 -13
- package/core/components/ui/form/textarea/textarea.js +29 -36
- package/core/components/ui/group/group.d.ts +11 -1
- package/core/components/ui/group/group.js +79 -17
- package/core/components/ui/icon/icon.d.ts +10 -3
- package/core/components/ui/icon/icon.js +16 -15
- package/core/components/ui/icon/icons.js +11 -8
- package/core/components/ui/icon/icons.json +1 -1
- package/core/components/ui/image/image.js +0 -5
- package/core/components/ui/link/link.d.ts +1 -1
- package/core/components/ui/link/link.js +2 -6
- package/core/components/ui/loader/loader.js +2 -8
- package/core/components/ui/menu/menu-item.js +4 -9
- package/core/components/ui/menu/menu.d.ts +9 -1
- package/core/components/ui/menu/menu.js +183 -27
- package/core/components/ui/modal/modal-actions.js +1 -6
- package/core/components/ui/modal/modal-close.d.ts +1 -0
- package/core/components/ui/modal/modal-close.js +14 -10
- package/core/components/ui/modal/modal-content.js +0 -5
- package/core/components/ui/modal/modal-subtitle.js +2 -6
- package/core/components/ui/modal/modal-title.js +0 -5
- package/core/components/ui/modal/modal.d.ts +7 -7
- package/core/components/ui/modal/modal.js +36 -36
- package/core/components/ui/pop/pop.d.ts +6 -5
- package/core/components/ui/pop/pop.js +44 -44
- package/core/components/ui/progress/progress.js +34 -32
- package/core/components/ui/table/table-caption.js +5 -10
- package/core/components/ui/table/table-tbody.js +10 -14
- package/core/components/ui/table/table-td.d.ts +2 -0
- package/core/components/ui/table/table-td.js +8 -5
- package/core/components/ui/table/table-tfoot.js +5 -7
- package/core/components/ui/table/table-th.d.ts +2 -0
- package/core/components/ui/table/table-th.js +12 -9
- package/core/components/ui/table/table-thead.js +1 -6
- package/core/components/ui/table/table-tr.js +4 -6
- package/core/components/ui/table/table.d.ts +0 -3
- package/core/components/ui/table/table.js +14 -31
- package/core/components/ui/taxonomy/taxonomy.d.ts +6 -3
- package/core/components/ui/taxonomy/taxonomy.js +9 -9
- package/core/components/ui/theme/theme-collection/core-variables.js +13 -11
- package/core/components/ui/theme/theme-collection/dark.js +1 -1
- package/core/components/ui/theme/theme.d.ts +1 -6
- package/core/components/ui/theme/theme.js +7 -36
- package/core/components/ui/toast/message-subscriber.d.ts +13 -7
- package/core/components/ui/toast/toast-item.js +1 -1
- package/core/components/ui/toast/toast.d.ts +2 -1
- package/core/components/ui/toast/toast.js +29 -14
- package/core/components/ui/tooltip/tooltip.d.ts +1 -0
- package/core/components/ui/tooltip/tooltip.js +35 -14
- package/core/components/ui/ui.js +0 -3
- package/core/core.js +5 -6
- package/core/mixins/Fetcher.d.ts +19 -10
- package/core/mixins/Fetcher.js +26 -10
- package/core/mixins/FormCheckable.d.ts +17 -8
- package/core/mixins/FormCheckable.js +177 -22
- package/core/mixins/FormElement.d.ts +12 -7
- package/core/mixins/FormElement.js +42 -26
- package/core/mixins/FormInput.d.ts +8 -4
- package/core/mixins/FormInput.js +4 -3
- package/core/mixins/Subscriber.d.ts +7 -5
- package/core/mixins/Subscriber.js +34 -32
- package/core/utils/Arrays.d.ts +15 -15
- package/core/utils/DataBindObserver.d.ts +16 -9
- package/core/utils/DataBindObserver.js +23 -28
- package/core/utils/Electron.d.ts +5 -1
- package/core/utils/Electron.js +4 -2
- package/core/utils/HTML.d.ts +9 -2
- package/core/utils/HTML.js +22 -3
- package/core/utils/LocationHandler.d.ts +6 -5
- package/core/utils/LocationHandler.js +19 -8
- package/core/utils/Objects.d.ts +7 -4
- package/core/utils/Objects.js +28 -6
- package/core/utils/{PublisherProxy.d.mts → PublisherProxy.d.ts} +40 -31
- package/core/utils/{PublisherProxy.mjs → PublisherProxy.js} +54 -28
- package/core/utils/Utils.d.ts +3 -0
- package/core/utils/Utils.js +18 -0
- package/core/utils/api.d.ts +39 -7
- package/core/utils/api.js +45 -32
- package/img/concorde-logo.svg +1 -0
- package/img/concorde.png +0 -0
- package/img/concorde_def.png +0 -0
- package/mixins.d.ts +36 -18
- package/mixins.js +3 -4
- package/package.json +45 -10
- package/svg/regular/plane.svg +1 -0
- package/svg/solid/plane.svg +1 -0
- package/test-utils/TestUtils.d.ts +4 -0
- package/test-utils/TestUtils.js +12 -0
- package/utils.d.ts +3 -1
- package/utils.js +7 -5
- package/core/components/functional/configuration/configuration.d.ts +0 -5
- package/core/components/functional/configuration/configuration.js +0 -22
- package/core/components/ui/tabs/tab.d.ts +0 -6
- package/core/components/ui/tabs/tab.js +0 -46
- package/core/components/ui/tabs/tabs.d.ts +0 -15
- package/core/components/ui/tabs/tabs.js +0 -129
|
@@ -4,17 +4,16 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
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
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { html, LitElement,
|
|
7
|
+
import { html, LitElement, nothing } from "lit";
|
|
8
8
|
import { customElement, property } from "lit/decorators.js";
|
|
9
9
|
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
10
10
|
import Fetcher from "@supersoniks/concorde/core/mixins/Fetcher";
|
|
11
|
-
import { repeat } from "lit/directives/repeat.js";
|
|
12
11
|
import { templateContent } from "lit/directives/template-content.js";
|
|
13
12
|
import "@supersoniks/concorde/core/components/ui/loader/loader";
|
|
14
13
|
import "@supersoniks/concorde/core/components/functional/subscriber/subscriber";
|
|
15
14
|
import Objects from "@supersoniks/concorde/core/utils/Objects";
|
|
16
|
-
import { ifDefined } from "lit/directives/if-defined.js";
|
|
17
15
|
import TemplatesContainer from "@supersoniks/concorde/core/mixins/TemplatesContainer";
|
|
16
|
+
const tagName = "sonic-list";
|
|
18
17
|
/**
|
|
19
18
|
* ### 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
19
|
*
|
|
@@ -32,11 +31,9 @@ import TemplatesContainer from "@supersoniks/concorde/core/mixins/TemplatesConta
|
|
|
32
31
|
* * On peut appler la methode invalidate() sur son publishe pour declencher le rechargement des données
|
|
33
32
|
* *
|
|
34
33
|
*/
|
|
35
|
-
const tagName = "sonic-list";
|
|
36
34
|
let List = class List extends Fetcher(Subscriber(TemplatesContainer(LitElement))) {
|
|
37
35
|
constructor() {
|
|
38
36
|
super(...arguments);
|
|
39
|
-
this.itemPropertyMap = null;
|
|
40
37
|
/**
|
|
41
38
|
* 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.
|
|
42
39
|
* 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é.
|
|
@@ -62,8 +59,17 @@ let List = class List extends Fetcher(Subscriber(TemplatesContainer(LitElement))
|
|
|
62
59
|
: html `<sonic-loader mode="inline"></sonic-loader>`;
|
|
63
60
|
}
|
|
64
61
|
renderNoResultState() {
|
|
65
|
-
return html ` <div
|
|
66
|
-
|
|
62
|
+
return html ` <div
|
|
63
|
+
style="color: var(--sc-base-400);
|
|
64
|
+
font-size: 1.5em;
|
|
65
|
+
margin: 4rem 0;
|
|
66
|
+
display: flex;
|
|
67
|
+
gap: 0.5rem;"
|
|
68
|
+
>
|
|
69
|
+
<sonic-icon name="emoji-puzzled" size="lg"></sonic-icon
|
|
70
|
+
><span class="sonic-no-result-text"
|
|
71
|
+
>${typeof this.props === "string" && this.props == "" ? "Aucun résultat" : this.props}</span
|
|
72
|
+
>
|
|
67
73
|
</div>`;
|
|
68
74
|
}
|
|
69
75
|
formatProps() {
|
|
@@ -83,7 +89,9 @@ let List = class List extends Fetcher(Subscriber(TemplatesContainer(LitElement))
|
|
|
83
89
|
}
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
|
-
props
|
|
92
|
+
props = props.filter((e) => e != null);
|
|
93
|
+
if (response)
|
|
94
|
+
props._sonic_http_response_ = response;
|
|
87
95
|
return props;
|
|
88
96
|
}
|
|
89
97
|
render() {
|
|
@@ -118,54 +126,44 @@ let List = class List extends Fetcher(Subscriber(TemplatesContainer(LitElement))
|
|
|
118
126
|
/**
|
|
119
127
|
* Rendu des lignes
|
|
120
128
|
* */
|
|
121
|
-
|
|
129
|
+
const templateCount = this.templateList.length;
|
|
122
130
|
let counter = -1;
|
|
123
|
-
|
|
131
|
+
const extractValues = this.hasAttribute("extractValues");
|
|
132
|
+
const separator = this.templateParts["separator"];
|
|
133
|
+
const length = props.length;
|
|
124
134
|
return html `
|
|
125
|
-
${
|
|
135
|
+
${props.map((item, index) => {
|
|
126
136
|
let templatePartName = item[this.templateKey];
|
|
127
137
|
let hasCustomTemplate = templatePartName && this.templateParts[templatePartName];
|
|
128
|
-
let key = extractValues ? item.
|
|
138
|
+
let key = extractValues ? item === null || item === void 0 ? void 0 : item[this.idKey] : index;
|
|
129
139
|
if (key == "_sonic_http_response_")
|
|
130
140
|
return nothing;
|
|
131
141
|
let pub = this.publisher[key];
|
|
132
142
|
pub._key_ = key + "";
|
|
133
143
|
counter++;
|
|
144
|
+
const isNotLast = index < length - 1;
|
|
134
145
|
if (hasCustomTemplate)
|
|
135
146
|
counter = -1;
|
|
136
147
|
return (item &&
|
|
137
148
|
html `
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
149
|
+
<sonic-subscriber
|
|
150
|
+
?debug=${this.defferedDebug === true}
|
|
151
|
+
.bindPublisher=${function () {
|
|
141
152
|
return pub;
|
|
142
153
|
}}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
154
|
+
.propertyMap?=${this.itemPropertyMap}
|
|
155
|
+
dataProvider="${this.dataProvider}/list-item/${key}"
|
|
156
|
+
>
|
|
157
|
+
${hasCustomTemplate
|
|
147
158
|
? templateContent(this.templateParts[templatePartName])
|
|
148
159
|
: templateContent(this.templateList[counter % templateCount])}
|
|
149
|
-
|
|
150
|
-
|
|
160
|
+
</sonic-subscriber>
|
|
161
|
+
${separator && isNotLast ? templateContent(separator) : nothing}
|
|
162
|
+
`);
|
|
151
163
|
})}
|
|
152
164
|
`;
|
|
153
165
|
}
|
|
154
166
|
};
|
|
155
|
-
List.styles = [
|
|
156
|
-
css `
|
|
157
|
-
.sonic-no-result-container {
|
|
158
|
-
color: var(--sc-base-400);
|
|
159
|
-
font-size: 1.65rem;
|
|
160
|
-
}
|
|
161
|
-
sonic-icon {
|
|
162
|
-
margin-right: 0.25em;
|
|
163
|
-
}
|
|
164
|
-
span {
|
|
165
|
-
vertical-align: middle;
|
|
166
|
-
}
|
|
167
|
-
`,
|
|
168
|
-
];
|
|
169
167
|
__decorate([
|
|
170
168
|
property({ type: Object })
|
|
171
169
|
], List.prototype, "itemPropertyMap", void 0);
|
|
@@ -179,8 +177,3 @@ List = __decorate([
|
|
|
179
177
|
customElement(tagName)
|
|
180
178
|
], List);
|
|
181
179
|
export { List };
|
|
182
|
-
//Ajout pour custom-elements-manifest pour storybook notamment
|
|
183
|
-
try {
|
|
184
|
-
customElements.define(tagName, List);
|
|
185
|
-
}
|
|
186
|
-
catch (e) { }
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
import { PublisherInterface, PublisherContentType } from "@supersoniks/concorde/core/_types/types";
|
|
3
|
+
declare type Composition = Record<string, Object | string>;
|
|
4
|
+
declare type Listener = {
|
|
5
|
+
publisher: PublisherInterface;
|
|
6
|
+
subscriber: <T>(v: T) => void;
|
|
7
|
+
};
|
|
8
|
+
declare const SonicMix_base: (new (...args: any[]) => import("../../../mixins/Subscriber").SubscriberInterface<any>) & typeof LitElement;
|
|
9
|
+
export default class SonicMix extends SonicMix_base {
|
|
10
|
+
private _composition;
|
|
11
|
+
get composition(): Composition;
|
|
12
|
+
static styles: import("lit").CSSResult[];
|
|
13
|
+
set composition(value: Composition);
|
|
14
|
+
connectedCallback(): void;
|
|
15
|
+
disconnectedCallback(): void;
|
|
16
|
+
updateComposition(): void;
|
|
17
|
+
listeners: Listener[];
|
|
18
|
+
removePublisherListeners(): void;
|
|
19
|
+
parseComposition<T extends PublisherContentType = any>(composition: Composition, publisher: PublisherInterface<T>): void;
|
|
20
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,99 @@
|
|
|
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 { PublisherProxy } from "@supersoniks/concorde/core/utils/PublisherProxy";
|
|
8
|
+
import { Subscriber } from "@supersoniks/concorde/mixins";
|
|
9
|
+
import { Objects, PublisherManager } from "@supersoniks/concorde/utils";
|
|
10
|
+
import { LitElement, html, css } from "lit";
|
|
11
|
+
import { customElement, property } from "lit/decorators.js";
|
|
12
|
+
let SonicMix = class SonicMix extends Subscriber(LitElement) {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this._composition = {};
|
|
16
|
+
this.listeners = [];
|
|
17
|
+
}
|
|
18
|
+
get composition() {
|
|
19
|
+
return this._composition;
|
|
20
|
+
}
|
|
21
|
+
set composition(value) {
|
|
22
|
+
this._composition = value;
|
|
23
|
+
this.updateComposition();
|
|
24
|
+
}
|
|
25
|
+
connectedCallback() {
|
|
26
|
+
super.connectedCallback();
|
|
27
|
+
this.updateComposition();
|
|
28
|
+
}
|
|
29
|
+
disconnectedCallback() {
|
|
30
|
+
this.removePublisherListeners();
|
|
31
|
+
super.disconnectedCallback();
|
|
32
|
+
}
|
|
33
|
+
updateComposition() {
|
|
34
|
+
this.removePublisherListeners();
|
|
35
|
+
if (!this.publisher)
|
|
36
|
+
return;
|
|
37
|
+
this.publisher.set({});
|
|
38
|
+
this.parseComposition(this.composition, this.publisher);
|
|
39
|
+
}
|
|
40
|
+
removePublisherListeners() {
|
|
41
|
+
let listeners = this.listeners;
|
|
42
|
+
this.listeners = [];
|
|
43
|
+
listeners.forEach((listener) => {
|
|
44
|
+
this.publisher.offAssign(listener.subscriber);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
parseComposition(composition, publisher) {
|
|
48
|
+
if (!composition)
|
|
49
|
+
return;
|
|
50
|
+
for (let z in composition) {
|
|
51
|
+
let value = composition[z];
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
let split = value.split(".");
|
|
54
|
+
let publisherSource = PublisherManager.get(split.shift());
|
|
55
|
+
publisherSource = Objects.traverse(publisherSource, split);
|
|
56
|
+
let publisherSubscriber = {
|
|
57
|
+
publisher: publisherSource,
|
|
58
|
+
subscriber: (v) => {
|
|
59
|
+
publisher[z] = v;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
this.listeners.push(publisherSubscriber);
|
|
63
|
+
publisherSource.onAssign(publisherSubscriber.subscriber);
|
|
64
|
+
publisher._proxies_.set(z, publisherSource);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.publisher[z] = {};
|
|
68
|
+
let newPublisher = new PublisherProxy({}, publisher);
|
|
69
|
+
publisher._proxies_.set(z, newPublisher);
|
|
70
|
+
let publisherSubscriber = {
|
|
71
|
+
publisher: newPublisher,
|
|
72
|
+
subscriber: (v) => {
|
|
73
|
+
publisher[z] = v;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
this.listeners.push(publisherSubscriber);
|
|
77
|
+
newPublisher.onAssign(publisherSubscriber.subscriber);
|
|
78
|
+
this.parseComposition(value, newPublisher);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
render() {
|
|
83
|
+
return html `<slot></slot>`;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
SonicMix.styles = [
|
|
87
|
+
css `
|
|
88
|
+
:host {
|
|
89
|
+
display: contents;
|
|
90
|
+
}
|
|
91
|
+
`,
|
|
92
|
+
];
|
|
93
|
+
__decorate([
|
|
94
|
+
property({ type: Object })
|
|
95
|
+
], SonicMix.prototype, "composition", null);
|
|
96
|
+
SonicMix = __decorate([
|
|
97
|
+
customElement("sonic-mix")
|
|
98
|
+
], SonicMix);
|
|
99
|
+
export default SonicMix;
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { LitElement, nothing } from "lit";
|
|
2
2
|
import "@supersoniks/concorde/core/components/functional/list/list";
|
|
3
|
-
import { PublisherProxy } from "@supersoniks/concorde/core/utils/PublisherProxy
|
|
4
|
-
declare const Queue_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface) & typeof LitElement;
|
|
3
|
+
import { PublisherProxy } from "@supersoniks/concorde/core/utils/PublisherProxy";
|
|
4
|
+
declare const Queue_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface<any>) & 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
|
+
*/
|
|
5
13
|
export default class Queue extends Queue_base {
|
|
6
14
|
templates: Array<HTMLTemplateElement> | null;
|
|
7
15
|
lastRequestTime: number;
|
|
@@ -13,12 +21,16 @@ export default class Queue extends Queue_base {
|
|
|
13
21
|
targetRequestDuration: number;
|
|
14
22
|
limit: number;
|
|
15
23
|
offset: number;
|
|
24
|
+
resultCount: number;
|
|
16
25
|
filteredFields: string;
|
|
26
|
+
disconnectedCallback(): void;
|
|
17
27
|
static instanceCounter: number;
|
|
18
28
|
connectedCallback(): void;
|
|
19
29
|
filterPublisher: PublisherProxy | null;
|
|
20
30
|
configFilter(): void;
|
|
21
|
-
filterTimeoutId
|
|
31
|
+
filterTimeoutId?: ReturnType<typeof setTimeout>;
|
|
32
|
+
searchHash: string;
|
|
33
|
+
requestId: number;
|
|
22
34
|
updateFilteredContent(): void;
|
|
23
35
|
/**
|
|
24
36
|
* 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.
|
|
@@ -31,6 +43,7 @@ export default class Queue extends Queue_base {
|
|
|
31
43
|
currentScrollPosition: number | undefined;
|
|
32
44
|
resetDuration(): void;
|
|
33
45
|
listDataProviders: string[];
|
|
46
|
+
nextHadEvent: boolean;
|
|
34
47
|
next(e?: CustomEvent): void;
|
|
35
48
|
render(): import("lit-html").TemplateResult<1> | typeof nothing;
|
|
36
49
|
}
|
|
@@ -9,9 +9,10 @@ import { html, LitElement, nothing } from "lit";
|
|
|
9
9
|
import { customElement, property } from "lit/decorators.js";
|
|
10
10
|
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
11
11
|
import { repeat } from "lit/directives/repeat.js";
|
|
12
|
-
import { PublisherManager } from "@supersoniks/concorde/core/utils/PublisherProxy
|
|
13
|
-
import { ifDefined } from "lit/directives/if-defined.js";
|
|
12
|
+
import { PublisherManager } from "@supersoniks/concorde/core/utils/PublisherProxy";
|
|
14
13
|
import "@supersoniks/concorde/core/components/functional/list/list";
|
|
14
|
+
import { HTML } from "@supersoniks/concorde/utils";
|
|
15
|
+
const tagName = "sonic-queue";
|
|
15
16
|
/**
|
|
16
17
|
*### Une Queue charge du contenu par lot selon l'expression renseignée dans l'attribut *dataProviderExpression*.
|
|
17
18
|
* * 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
|
|
@@ -20,7 +21,6 @@ import "@supersoniks/concorde/core/components/functional/list/list";
|
|
|
20
21
|
* Les valeurs renseignées dans ce publisher sont ajoutées en get à chaque requête
|
|
21
22
|
* * la proriété *key* peut être utilisé pour cibler une propriété particulière du retour de l'api.
|
|
22
23
|
*/
|
|
23
|
-
const tagName = "sonic-queue";
|
|
24
24
|
let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -38,9 +38,11 @@ let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
|
38
38
|
*/
|
|
39
39
|
this.limit = 5;
|
|
40
40
|
this.offset = 0;
|
|
41
|
+
this.resultCount = 0;
|
|
41
42
|
this.filteredFields = "";
|
|
42
43
|
this.filterPublisher = null;
|
|
43
|
-
this.
|
|
44
|
+
this.searchHash = "";
|
|
45
|
+
this.requestId = 0;
|
|
44
46
|
/**
|
|
45
47
|
* 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.
|
|
46
48
|
* * l'expression *$offset* est alors remplacée par le numéro de l'élément à partir duquel démarrer
|
|
@@ -51,10 +53,22 @@ let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
|
51
53
|
this.idKey = "id";
|
|
52
54
|
this.currentScrollPosition = undefined;
|
|
53
55
|
this.listDataProviders = [];
|
|
56
|
+
this.nextHadEvent = false;
|
|
57
|
+
}
|
|
58
|
+
disconnectedCallback() {
|
|
59
|
+
for (let dataProvider of this.listDataProviders) {
|
|
60
|
+
PublisherManager.delete(dataProvider);
|
|
61
|
+
}
|
|
62
|
+
super.disconnectedCallback();
|
|
63
|
+
return;
|
|
54
64
|
}
|
|
55
65
|
connectedCallback() {
|
|
56
66
|
this.noShadowDom = "";
|
|
57
67
|
this.defferedDebug = this.hasAttribute("debug") || null;
|
|
68
|
+
/**Compat avec states et routing **/
|
|
69
|
+
if (!this.dataProviderExpression) {
|
|
70
|
+
this.dataProviderExpression = HTML.getAncestorAttributeValue(this.parentElement, "dataProvider") || "";
|
|
71
|
+
}
|
|
58
72
|
if (!this.dataProvider)
|
|
59
73
|
this.dataProvider = "sonic-queue-" + Queue_1.instanceCounter++;
|
|
60
74
|
this.configFilter();
|
|
@@ -79,13 +93,39 @@ let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
|
79
93
|
});
|
|
80
94
|
}
|
|
81
95
|
updateFilteredContent() {
|
|
96
|
+
var _a;
|
|
97
|
+
/**
|
|
98
|
+
* On ne lance la recherche que si le hash de recherche est différent
|
|
99
|
+
*/
|
|
100
|
+
let dataProvider = this.dataProviderExpression;
|
|
101
|
+
let split = dataProvider.split("?");
|
|
102
|
+
split.shift();
|
|
103
|
+
let searchParams = new URLSearchParams(split.join("?"));
|
|
104
|
+
let filterData = (_a = this.filterPublisher) === null || _a === void 0 ? void 0 : _a.get();
|
|
105
|
+
let filteredFieldsArray = this.filteredFields.split(" ");
|
|
106
|
+
for (let f in filterData) {
|
|
107
|
+
if ((this.filteredFields && !filteredFieldsArray.includes(f)) || filterData[f] == null)
|
|
108
|
+
continue;
|
|
109
|
+
searchParams.set(f, filterData[f]);
|
|
110
|
+
}
|
|
111
|
+
let searchHash = searchParams.toString();
|
|
112
|
+
if (searchHash == this.searchHash)
|
|
113
|
+
return;
|
|
114
|
+
this.searchHash = searchHash;
|
|
115
|
+
/**
|
|
116
|
+
* on reset les données avant de lancer la requète
|
|
117
|
+
*/
|
|
82
118
|
for (let dataProvider of this.listDataProviders) {
|
|
83
119
|
PublisherManager.delete(dataProvider);
|
|
84
120
|
}
|
|
85
121
|
this.listDataProviders = [];
|
|
86
122
|
clearTimeout(this.filterTimeoutId);
|
|
87
123
|
this.filterTimeoutId = setTimeout(() => {
|
|
124
|
+
let count = this.resultCount;
|
|
88
125
|
this.props = null;
|
|
126
|
+
//On garde le décompte au cas ou il n'y aurait pas rechargement
|
|
127
|
+
this.resultCount = count;
|
|
128
|
+
this.requestId++;
|
|
89
129
|
this.next();
|
|
90
130
|
}, 250);
|
|
91
131
|
}
|
|
@@ -97,13 +137,27 @@ let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
|
97
137
|
let offset = this.offset;
|
|
98
138
|
const newTime = new Date().getTime();
|
|
99
139
|
const requestDuration = newTime - this.lastRequestTime;
|
|
140
|
+
/**
|
|
141
|
+
* Le rechargement n'est pas garanti si pas de changement dans les filtres
|
|
142
|
+
* Un ne repasse donc à 0 qu'à partir du premier chargement.
|
|
143
|
+
* */
|
|
144
|
+
if (!this.nextHadEvent && e) {
|
|
145
|
+
this.resultCount = 0;
|
|
146
|
+
}
|
|
147
|
+
this.nextHadEvent = !!e;
|
|
100
148
|
if (e) {
|
|
149
|
+
if (e.detail.requestId != this.requestId)
|
|
150
|
+
return;
|
|
151
|
+
this.resultCount += e.detail.props.length;
|
|
101
152
|
if (!e.detail.isFirstLoad || !e.detail.props.length || this.dataProviderExpression.indexOf("$offset") == -1) {
|
|
153
|
+
this.publisher.resultCount = this.resultCount;
|
|
102
154
|
return;
|
|
103
155
|
}
|
|
104
156
|
}
|
|
105
157
|
if (!Array.isArray(this.props)) {
|
|
106
|
-
|
|
158
|
+
let newProps = [];
|
|
159
|
+
newProps.resultCount = this.resultCount;
|
|
160
|
+
this.props = newProps;
|
|
107
161
|
}
|
|
108
162
|
else {
|
|
109
163
|
const props = this.props;
|
|
@@ -123,14 +177,14 @@ let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
|
123
177
|
let filterData = (_a = this.filterPublisher) === null || _a === void 0 ? void 0 : _a.get();
|
|
124
178
|
let filteredFieldsArray = this.filteredFields.split(" ");
|
|
125
179
|
for (let f in filterData) {
|
|
126
|
-
if (this.filteredFields && !filteredFieldsArray.includes(f))
|
|
180
|
+
if ((this.filteredFields && !filteredFieldsArray.includes(f)) || filterData[f] == null)
|
|
127
181
|
continue;
|
|
128
182
|
searchParams.set(f, filterData[f]);
|
|
129
183
|
}
|
|
130
184
|
dataProvider = endpoint + "?" + searchParams.toString();
|
|
131
185
|
this.listDataProviders.push(dataProvider);
|
|
132
186
|
this.currentScrollPosition = (_b = document.scrollingElement) === null || _b === void 0 ? void 0 : _b.scrollTop;
|
|
133
|
-
|
|
187
|
+
let newProps = [
|
|
134
188
|
...this.props,
|
|
135
189
|
{
|
|
136
190
|
id: searchParams.toString() + "/" + this.props.length,
|
|
@@ -139,6 +193,8 @@ let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
|
139
193
|
limit: this.limit,
|
|
140
194
|
},
|
|
141
195
|
];
|
|
196
|
+
newProps.resultCount = this.resultCount;
|
|
197
|
+
this.props = newProps;
|
|
142
198
|
this.lastRequestTime = new Date().getTime();
|
|
143
199
|
}
|
|
144
200
|
render() {
|
|
@@ -158,9 +214,11 @@ let Queue = Queue_1 = class Queue extends Subscriber(LitElement) {
|
|
|
158
214
|
return html `
|
|
159
215
|
<sonic-list
|
|
160
216
|
fetch
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
217
|
+
displayContents
|
|
218
|
+
lazyload
|
|
219
|
+
requestId=${this.requestId}
|
|
220
|
+
?itemPropertyMap=${this.itemPropertyMap}
|
|
221
|
+
?debug=${this.defferedDebug === true}
|
|
164
222
|
@load=${this.next}
|
|
165
223
|
key=${this.key}
|
|
166
224
|
@loading=${this.resetDuration}
|
|
@@ -190,6 +248,9 @@ __decorate([
|
|
|
190
248
|
__decorate([
|
|
191
249
|
property()
|
|
192
250
|
], Queue.prototype, "offset", void 0);
|
|
251
|
+
__decorate([
|
|
252
|
+
property()
|
|
253
|
+
], Queue.prototype, "resultCount", void 0);
|
|
193
254
|
__decorate([
|
|
194
255
|
property()
|
|
195
256
|
], Queue.prototype, "filteredFields", void 0);
|
|
@@ -203,8 +264,3 @@ Queue = Queue_1 = __decorate([
|
|
|
203
264
|
customElement(tagName)
|
|
204
265
|
], Queue);
|
|
205
266
|
export default Queue;
|
|
206
|
-
//Ajout pour custom-elements-manifesy pour storybook notamment
|
|
207
|
-
try {
|
|
208
|
-
customElements.define(tagName, Queue);
|
|
209
|
-
}
|
|
210
|
-
catch (e) { }
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
declare const SonicRedirect_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface) & typeof LitElement;
|
|
2
|
+
declare const SonicRedirect_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface<any>) & 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
|
+
*/
|
|
3
12
|
export declare class SonicRedirect extends SonicRedirect_base {
|
|
4
13
|
udpateCallBack: () => void;
|
|
5
14
|
connectedCallback(): void;
|
|
@@ -9,6 +9,7 @@ import { customElement } from "lit/decorators.js";
|
|
|
9
9
|
import Subscriber from "@supersoniks/concorde/core/mixins/Subscriber";
|
|
10
10
|
import LocationHandler from "@supersoniks/concorde/core/utils/LocationHandler";
|
|
11
11
|
import Objects from "@supersoniks/concorde/core/utils/Objects";
|
|
12
|
+
const tagName = "sonic-redirect";
|
|
12
13
|
/**
|
|
13
14
|
* sonic-redirect permet d'effectuer une redirection.
|
|
14
15
|
* * L'URL de redirection fournie dans l'attribut *to*.
|
|
@@ -18,7 +19,6 @@ import Objects from "@supersoniks/concorde/core/utils/Objects";
|
|
|
18
19
|
* Par exemple : la données vaut {user:{id:2}} si onData="user.id"la redirection est effectuée.
|
|
19
20
|
* * 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
|
*/
|
|
21
|
-
const tagName = "sonic-redirect";
|
|
22
22
|
let SonicRedirect = class SonicRedirect extends Subscriber(LitElement) {
|
|
23
23
|
constructor() {
|
|
24
24
|
super(...arguments);
|
|
@@ -38,6 +38,10 @@ let SonicRedirect = class SonicRedirect extends Subscriber(LitElement) {
|
|
|
38
38
|
super.disconnectedCallback();
|
|
39
39
|
}
|
|
40
40
|
update() {
|
|
41
|
+
if (this.hasAttribute("onAdded")) {
|
|
42
|
+
LocationHandler.changeFromComponent(this);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
41
45
|
if (!this.props)
|
|
42
46
|
return;
|
|
43
47
|
let onDataPath = this.getAttribute("onData").split(".");
|
|
@@ -51,8 +55,3 @@ SonicRedirect = __decorate([
|
|
|
51
55
|
customElement(tagName)
|
|
52
56
|
], SonicRedirect);
|
|
53
57
|
export { SonicRedirect };
|
|
54
|
-
//Ajout pour la creation du cem notamment pour Storybook
|
|
55
|
-
try {
|
|
56
|
-
customElements.define(tagName, SonicRedirect);
|
|
57
|
-
}
|
|
58
|
-
catch (e) { }
|
|
@@ -1,5 +1,19 @@
|
|
|
1
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;
|
|
2
|
+
declare const SonicRouter_base: (new (...args: any[]) => import("@supersoniks/concorde/core/mixins/Subscriber").SubscriberInterface<any>) & (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
|
+
*/
|
|
3
17
|
export declare class SonicRouter extends SonicRouter_base {
|
|
4
18
|
templateValueAttribute: string;
|
|
5
19
|
connectedCallback(): void;
|
|
@@ -12,6 +12,7 @@ import LocationHandler from "@supersoniks/concorde/core/utils/LocationHandler";
|
|
|
12
12
|
import { repeat } from "lit/directives/repeat.js";
|
|
13
13
|
import UrlPattern from "url-pattern";
|
|
14
14
|
import TemplatesContainer from "@supersoniks/concorde/core/mixins/TemplatesContainer";
|
|
15
|
+
const tagName = "sonic-router";
|
|
15
16
|
/**
|
|
16
17
|
* ### Le router observe les modification document.location et met à jour sa vu de la manière suivante :
|
|
17
18
|
* * Il boucle sur ses template enfants et test si la regexp contenue dans l'attribut *data-route* match document.location
|
|
@@ -26,7 +27,6 @@ import TemplatesContainer from "@supersoniks/concorde/core/mixins/TemplatesConta
|
|
|
26
27
|
* * RegExp : data-route = /utilisateur/(\d+) et dataproviderExpression = /user/$1 l'attribut dataProvider vaudra "/user/2"
|
|
27
28
|
* * url-pattern : /*utilisateur/:id et dataproviderExpression = /user/:id l'attribut dataProvider vaudra "/user/2"
|
|
28
29
|
*/
|
|
29
|
-
const tagName = "sonic-router";
|
|
30
30
|
let SonicRouter = class SonicRouter extends Subscriber(TemplatesContainer(LitElement)) {
|
|
31
31
|
constructor() {
|
|
32
32
|
super(...arguments);
|
|
@@ -98,8 +98,3 @@ SonicRouter = __decorate([
|
|
|
98
98
|
customElement(tagName)
|
|
99
99
|
], SonicRouter);
|
|
100
100
|
export { SonicRouter };
|
|
101
|
-
//Ajout pour la creation du cem notamment pour Storybook
|
|
102
|
-
try {
|
|
103
|
-
customElements.define(tagName, SonicRouter);
|
|
104
|
-
}
|
|
105
|
-
catch (e) { }
|
|
@@ -32,7 +32,7 @@ export default class SDUIDescriptorTransformer {
|
|
|
32
32
|
/**
|
|
33
33
|
* Pour chaque élément de la liste, remplace l'élément par ses enfants
|
|
34
34
|
*/
|
|
35
|
-
|
|
35
|
+
unwrap(transformAction: SDUITransformAction, list: SDUITransformList): void;
|
|
36
36
|
/**
|
|
37
37
|
* Regroupe tous les éléments de la liste dans l'élément fourni via la prop `ui` de transformAction
|
|
38
38
|
* L'élément créé est inséré en lieu et place du premier élément de la liste
|