@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.
Files changed (182) hide show
  1. package/components.js +2 -3
  2. package/concorde-core.bundle.js +37 -35
  3. package/concorde-core.es.js +5081 -4317
  4. package/core/_types/types.d.ts +26 -0
  5. package/core/_types/types.js +1 -0
  6. package/core/components/functional/date/date.d.ts +13 -5
  7. package/core/components/functional/date/date.js +48 -29
  8. package/core/components/functional/example/example.d.ts +1 -1
  9. package/core/components/functional/example/example.js +1 -1
  10. package/core/components/functional/fetch/fetch.d.ts +40 -3
  11. package/core/components/functional/fetch/fetch.js +2 -6
  12. package/core/components/functional/functional.d.ts +2 -0
  13. package/core/components/functional/functional.js +2 -0
  14. package/core/components/functional/if/if.d.ts +3 -0
  15. package/core/components/functional/if/if.js +6 -12
  16. package/core/components/functional/if/if.test.d.ts +1 -0
  17. package/core/components/functional/if/if.test.js +44 -0
  18. package/core/components/functional/list/list.d.ts +32 -8
  19. package/core/components/functional/list/list.js +33 -40
  20. package/core/components/functional/mix/mix.d.ts +22 -0
  21. package/core/components/functional/mix/mix.js +99 -0
  22. package/core/components/functional/queue/queue.d.ts +16 -3
  23. package/core/components/functional/queue/queue.js +71 -15
  24. package/core/components/functional/router/redirect.d.ts +10 -1
  25. package/core/components/functional/router/redirect.js +5 -6
  26. package/core/components/functional/router/router.d.ts +15 -1
  27. package/core/components/functional/router/router.js +1 -6
  28. package/core/components/functional/sdui/SDUIDescriptorTransformer.d.ts +1 -1
  29. package/core/components/functional/sdui/SDUIDescriptorTransformer.js +24 -12
  30. package/core/components/functional/sdui/default-library.json +108 -0
  31. package/core/components/functional/sdui/sdui-utils.d.ts +5 -0
  32. package/core/components/functional/sdui/sdui-utils.js +63 -0
  33. package/core/components/functional/sdui/sdui.d.ts +16 -9
  34. package/core/components/functional/sdui/sdui.js +52 -25
  35. package/core/components/functional/sdui/types.d.ts +4 -2
  36. package/core/components/functional/states/states.d.ts +19 -3
  37. package/core/components/functional/states/states.js +7 -12
  38. package/core/components/functional/submit/submit.d.ts +16 -1
  39. package/core/components/functional/submit/submit.js +87 -17
  40. package/core/components/functional/subscriber/subscriber.d.ts +4 -1
  41. package/core/components/functional/subscriber/subscriber.js +1 -6
  42. package/core/components/functional/value/value.d.ts +7 -0
  43. package/core/components/functional/value/value.js +26 -0
  44. package/core/components/ui/_css/scroll.js +6 -7
  45. package/core/components/ui/_css/size.d.ts +1 -0
  46. package/core/components/ui/_css/size.js +3 -1
  47. package/core/components/ui/alert/alert.d.ts +2 -2
  48. package/core/components/ui/alert/alert.js +11 -16
  49. package/core/components/ui/badge/badge.d.ts +3 -1
  50. package/core/components/ui/badge/badge.js +36 -22
  51. package/core/components/ui/button/button.d.ts +23 -20
  52. package/core/components/ui/button/button.js +59 -42
  53. package/core/components/ui/captcha/captcha.d.ts +14 -2
  54. package/core/components/ui/captcha/captcha.js +17 -12
  55. package/core/components/ui/card/card-footer.js +1 -8
  56. package/core/components/ui/card/card-header-descripton.js +3 -9
  57. package/core/components/ui/card/card-header.js +1 -6
  58. package/core/components/ui/card/card-main.js +0 -5
  59. package/core/components/ui/card/card.d.ts +1 -1
  60. package/core/components/ui/card/card.js +28 -12
  61. package/core/components/ui/divider/divider.d.ts +2 -0
  62. package/core/components/ui/divider/divider.js +43 -16
  63. package/core/components/ui/form/checkbox/checkbox.d.ts +53 -16
  64. package/core/components/ui/form/checkbox/checkbox.js +53 -28
  65. package/core/components/ui/form/css/form-control.d.ts +2 -0
  66. package/core/components/ui/form/css/form-control.js +145 -67
  67. package/core/components/ui/form/fieldset/fieldset.d.ts +8 -1
  68. package/core/components/ui/form/fieldset/fieldset.js +45 -8
  69. package/core/components/ui/form/fieldset/legend-description.js +0 -5
  70. package/core/components/ui/form/fieldset/legend.js +3 -6
  71. package/core/components/ui/form/form-actions/form-actions.d.ts +2 -0
  72. package/core/components/ui/form/form-actions/form-actions.js +26 -11
  73. package/core/components/ui/form/form-layout/form-layout.d.ts +5 -2
  74. package/core/components/ui/form/form-layout/form-layout.js +31 -9
  75. package/core/components/ui/form/input/input.d.ts +15 -18
  76. package/core/components/ui/form/input/input.js +87 -52
  77. package/core/components/ui/form/input/password-helper.d.ts +1 -1
  78. package/core/components/ui/form/input/password-helper.js +3 -2
  79. package/core/components/ui/form/input/same-value-helper.d.ts +1 -1
  80. package/core/components/ui/form/input/same-value-helper.js +1 -0
  81. package/core/components/ui/form/input-autocomplete/input-autocomplete.d.ts +2 -3
  82. package/core/components/ui/form/input-autocomplete/input-autocomplete.js +2 -6
  83. package/core/components/ui/form/radio/radio.d.ts +6 -0
  84. package/core/components/ui/form/radio/radio.js +7 -12
  85. package/core/components/ui/form/select/select.d.ts +23 -7
  86. package/core/components/ui/form/select/select.js +69 -38
  87. package/core/components/ui/form/textarea/textarea.d.ts +13 -13
  88. package/core/components/ui/form/textarea/textarea.js +29 -36
  89. package/core/components/ui/group/group.d.ts +11 -1
  90. package/core/components/ui/group/group.js +79 -17
  91. package/core/components/ui/icon/icon.d.ts +10 -3
  92. package/core/components/ui/icon/icon.js +16 -15
  93. package/core/components/ui/icon/icons.js +11 -8
  94. package/core/components/ui/icon/icons.json +1 -1
  95. package/core/components/ui/image/image.js +0 -5
  96. package/core/components/ui/link/link.d.ts +1 -1
  97. package/core/components/ui/link/link.js +2 -6
  98. package/core/components/ui/loader/loader.js +2 -8
  99. package/core/components/ui/menu/menu-item.js +4 -9
  100. package/core/components/ui/menu/menu.d.ts +9 -1
  101. package/core/components/ui/menu/menu.js +183 -27
  102. package/core/components/ui/modal/modal-actions.js +1 -6
  103. package/core/components/ui/modal/modal-close.d.ts +1 -0
  104. package/core/components/ui/modal/modal-close.js +14 -10
  105. package/core/components/ui/modal/modal-content.js +0 -5
  106. package/core/components/ui/modal/modal-subtitle.js +2 -6
  107. package/core/components/ui/modal/modal-title.js +0 -5
  108. package/core/components/ui/modal/modal.d.ts +7 -7
  109. package/core/components/ui/modal/modal.js +36 -36
  110. package/core/components/ui/pop/pop.d.ts +6 -5
  111. package/core/components/ui/pop/pop.js +44 -44
  112. package/core/components/ui/progress/progress.js +34 -32
  113. package/core/components/ui/table/table-caption.js +5 -10
  114. package/core/components/ui/table/table-tbody.js +10 -14
  115. package/core/components/ui/table/table-td.d.ts +2 -0
  116. package/core/components/ui/table/table-td.js +8 -5
  117. package/core/components/ui/table/table-tfoot.js +5 -7
  118. package/core/components/ui/table/table-th.d.ts +2 -0
  119. package/core/components/ui/table/table-th.js +12 -9
  120. package/core/components/ui/table/table-thead.js +1 -6
  121. package/core/components/ui/table/table-tr.js +4 -6
  122. package/core/components/ui/table/table.d.ts +0 -3
  123. package/core/components/ui/table/table.js +14 -31
  124. package/core/components/ui/taxonomy/taxonomy.d.ts +6 -3
  125. package/core/components/ui/taxonomy/taxonomy.js +9 -9
  126. package/core/components/ui/theme/theme-collection/core-variables.js +13 -11
  127. package/core/components/ui/theme/theme-collection/dark.js +1 -1
  128. package/core/components/ui/theme/theme.d.ts +1 -6
  129. package/core/components/ui/theme/theme.js +7 -36
  130. package/core/components/ui/toast/message-subscriber.d.ts +13 -7
  131. package/core/components/ui/toast/toast-item.js +1 -1
  132. package/core/components/ui/toast/toast.d.ts +2 -1
  133. package/core/components/ui/toast/toast.js +29 -14
  134. package/core/components/ui/tooltip/tooltip.d.ts +1 -0
  135. package/core/components/ui/tooltip/tooltip.js +35 -14
  136. package/core/components/ui/ui.js +0 -3
  137. package/core/core.js +5 -6
  138. package/core/mixins/Fetcher.d.ts +19 -10
  139. package/core/mixins/Fetcher.js +26 -10
  140. package/core/mixins/FormCheckable.d.ts +17 -8
  141. package/core/mixins/FormCheckable.js +177 -22
  142. package/core/mixins/FormElement.d.ts +12 -7
  143. package/core/mixins/FormElement.js +42 -26
  144. package/core/mixins/FormInput.d.ts +8 -4
  145. package/core/mixins/FormInput.js +4 -3
  146. package/core/mixins/Subscriber.d.ts +7 -5
  147. package/core/mixins/Subscriber.js +34 -32
  148. package/core/utils/Arrays.d.ts +15 -15
  149. package/core/utils/DataBindObserver.d.ts +16 -9
  150. package/core/utils/DataBindObserver.js +23 -28
  151. package/core/utils/Electron.d.ts +5 -1
  152. package/core/utils/Electron.js +4 -2
  153. package/core/utils/HTML.d.ts +9 -2
  154. package/core/utils/HTML.js +22 -3
  155. package/core/utils/LocationHandler.d.ts +6 -5
  156. package/core/utils/LocationHandler.js +19 -8
  157. package/core/utils/Objects.d.ts +7 -4
  158. package/core/utils/Objects.js +28 -6
  159. package/core/utils/{PublisherProxy.d.mts → PublisherProxy.d.ts} +40 -31
  160. package/core/utils/{PublisherProxy.mjs → PublisherProxy.js} +54 -28
  161. package/core/utils/Utils.d.ts +3 -0
  162. package/core/utils/Utils.js +18 -0
  163. package/core/utils/api.d.ts +39 -7
  164. package/core/utils/api.js +45 -32
  165. package/img/concorde-logo.svg +1 -0
  166. package/img/concorde.png +0 -0
  167. package/img/concorde_def.png +0 -0
  168. package/mixins.d.ts +36 -18
  169. package/mixins.js +3 -4
  170. package/package.json +45 -10
  171. package/svg/regular/plane.svg +1 -0
  172. package/svg/solid/plane.svg +1 -0
  173. package/test-utils/TestUtils.d.ts +4 -0
  174. package/test-utils/TestUtils.js +12 -0
  175. package/utils.d.ts +3 -1
  176. package/utils.js +7 -5
  177. package/core/components/functional/configuration/configuration.d.ts +0 -5
  178. package/core/components/functional/configuration/configuration.js +0 -22
  179. package/core/components/ui/tabs/tab.d.ts +0 -6
  180. package/core/components/ui/tabs/tab.js +0 -46
  181. package/core/components/ui/tabs/tabs.d.ts +0 -15
  182. 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, css, nothing } from "lit";
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 class="sonic-no-result-container">
66
- <sonic-icon name="emoji-puzzled" size="lg"></sonic-icon><span class="sonic-no-result-text">${this.props}</span>
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._sonic_http_response_ = response;
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
- let templateCount = this.templateList.length;
129
+ const templateCount = this.templateList.length;
122
130
  let counter = -1;
123
- let extractValues = this.hasAttribute("extractValues");
131
+ const extractValues = this.hasAttribute("extractValues");
132
+ const separator = this.templateParts["separator"];
133
+ const length = props.length;
124
134
  return html `
125
- ${repeat(props, (item, index) => item[this.idKey] || index, (item, index) => {
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.key : index;
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
- <sonic-subscriber
139
- debug=${ifDefined(this.defferedDebug)}
140
- .bindPublisher=${function () {
149
+ <sonic-subscriber
150
+ ?debug=${this.defferedDebug === true}
151
+ .bindPublisher=${function () {
141
152
  return pub;
142
153
  }}
143
- .propertyMap=${ifDefined(this.itemPropertyMap)}
144
- dataProvider="${this.dataProvider}/list-item/${index}"
145
- >
146
- ${hasCustomTemplate
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
- </sonic-subscriber>
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.mjs";
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: any;
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.mjs";
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.filterTimeoutId = undefined;
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
- this.props = [];
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
- this.props = [
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
- ?displayContents=${this.displayContents}
162
- .itemPropertyMap=${this.itemPropertyMap}
163
- debug=${ifDefined(this.defferedDebug)}
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
- unWrap(transformAction: SDUITransformAction, list: SDUITransformList): void;
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