@acorex/components 7.5.1 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/badge/lib/badge.component.d.ts +3 -3
  2. package/button/lib/button-item.component.d.ts +3 -1
  3. package/calendar/lib/calendar.component.d.ts +6 -4
  4. package/chips/lib/chips.component.d.ts +1 -1
  5. package/collapse/lib/collapse.component.d.ts +15 -2
  6. package/collapse/lib/collapse.module.d.ts +2 -1
  7. package/common/index.d.ts +1 -0
  8. package/common/lib/classes/datalist.class.d.ts +0 -31
  9. package/common/lib/classes/datasource.class.d.ts +55 -0
  10. package/common/lib/classes/styles.class.d.ts +1 -1
  11. package/common/lib/components/interactive-component.class.d.ts +1 -7
  12. package/common/lib/components/selection-base.component.class.d.ts +4 -6
  13. package/common/lib/directives/ripple.directive.d.ts +2 -1
  14. package/datetime-box/lib/datetime-box.component.d.ts +2 -1
  15. package/datetime-input/lib/datetime-input.component.d.ts +2 -1
  16. package/esm2022/action-sheet/lib/action-sheet.component.mjs +2 -2
  17. package/esm2022/alert/lib/alert.component.mjs +4 -5
  18. package/esm2022/avatar/lib/avatar.component.mjs +4 -4
  19. package/esm2022/badge/lib/badge.component.mjs +6 -6
  20. package/esm2022/button/lib/button-item.component.mjs +12 -3
  21. package/esm2022/button/lib/button.component.mjs +2 -2
  22. package/esm2022/button-group/lib/button-group.component.mjs +2 -2
  23. package/esm2022/calendar/lib/calendar.class.mjs +1 -58
  24. package/esm2022/calendar/lib/calendar.component.mjs +27 -16
  25. package/esm2022/chips/lib/chips.component.mjs +4 -4
  26. package/esm2022/collapse/lib/collapse-group.component.mjs +8 -4
  27. package/esm2022/collapse/lib/collapse.component.mjs +63 -15
  28. package/esm2022/collapse/lib/collapse.module.mjs +5 -4
  29. package/esm2022/color-box/lib/color-box.module.mjs +1 -1
  30. package/esm2022/common/index.mjs +2 -1
  31. package/esm2022/common/lib/classes/datalist.class.mjs +2 -41
  32. package/esm2022/common/lib/classes/datasource.class.mjs +106 -0
  33. package/esm2022/common/lib/classes/styles.class.mjs +1 -1
  34. package/esm2022/common/lib/components/interactive-component.class.mjs +13 -13
  35. package/esm2022/common/lib/components/selection-base.component.class.mjs +55 -27
  36. package/esm2022/common/lib/directives/ripple.directive.mjs +14 -8
  37. package/esm2022/datetime-box/lib/datetime-box.component.mjs +6 -3
  38. package/esm2022/datetime-input/lib/datetime-input.component.mjs +11 -4
  39. package/esm2022/datetime-picker/lib/datetime-picker.component.mjs +3 -3
  40. package/esm2022/list/lib/list.component.mjs +34 -60
  41. package/esm2022/menu/index.mjs +1 -2
  42. package/esm2022/menu/lib/class/root-menu.class.mjs +1 -1
  43. package/esm2022/menu/lib/menu-item/menu-item.component.mjs +60 -18
  44. package/esm2022/menu/lib/menu.component.mjs +37 -342
  45. package/esm2022/menu/lib/menu.module.mjs +3 -4
  46. package/esm2022/notification/lib/notification.component.mjs +2 -2
  47. package/esm2022/otp/lib/otp.component.mjs +4 -3
  48. package/esm2022/otp/lib/otp.module.mjs +4 -3
  49. package/esm2022/picker/lib/picker.component.mjs +2 -2
  50. package/esm2022/progress-bar/lib/progress-bar.component.mjs +2 -2
  51. package/esm2022/range-slider/lib/range-slider.component.mjs +2 -2
  52. package/esm2022/routing-progress/lib/routing-progress.component.mjs +3 -3
  53. package/esm2022/search-box/lib/search-box.component.mjs +5 -4
  54. package/esm2022/select-box/index.mjs +2 -2
  55. package/esm2022/select-box/lib/select-box.component.mjs +168 -308
  56. package/esm2022/select-box/lib/select-box.module.mjs +5 -6
  57. package/esm2022/selection-list/lib/selection-list.component.mjs +11 -1
  58. package/esm2022/side-menu/acorex-components-side-menu.mjs +5 -0
  59. package/esm2022/side-menu/index.mjs +4 -0
  60. package/esm2022/side-menu/lib/side-menu-item/side-menu-item.compoent.mjs +116 -0
  61. package/esm2022/side-menu/lib/side-menu.component.mjs +15 -0
  62. package/esm2022/side-menu/lib/side-menu.module.mjs +23 -0
  63. package/esm2022/skeleton/acorex-components-skeleton.mjs +5 -0
  64. package/esm2022/skeleton/index.mjs +3 -0
  65. package/esm2022/skeleton/lib/skeleton.component.mjs +24 -0
  66. package/esm2022/skeleton/lib/skeleton.module.mjs +18 -0
  67. package/esm2022/tabs/lib/tab-item.component.mjs +9 -2
  68. package/esm2022/tag/lib/tag.component.mjs +6 -12
  69. package/esm2022/toast/lib/toast.component.mjs +3 -3
  70. package/fesm2022/acorex-components-action-sheet.mjs +2 -2
  71. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  72. package/fesm2022/acorex-components-alert.mjs +3 -4
  73. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  74. package/fesm2022/acorex-components-avatar.mjs +3 -3
  75. package/fesm2022/acorex-components-avatar.mjs.map +1 -1
  76. package/fesm2022/acorex-components-badge.mjs +5 -5
  77. package/fesm2022/acorex-components-badge.mjs.map +1 -1
  78. package/fesm2022/acorex-components-button-group.mjs +2 -2
  79. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  80. package/fesm2022/acorex-components-button.mjs +13 -4
  81. package/fesm2022/acorex-components-button.mjs.map +1 -1
  82. package/fesm2022/acorex-components-calendar.mjs +27 -73
  83. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  84. package/fesm2022/acorex-components-chips.mjs +3 -3
  85. package/fesm2022/acorex-components-chips.mjs.map +1 -1
  86. package/fesm2022/acorex-components-collapse.mjs +74 -21
  87. package/fesm2022/acorex-components-collapse.mjs.map +1 -1
  88. package/fesm2022/acorex-components-color-box.mjs.map +1 -1
  89. package/fesm2022/acorex-components-common.mjs +161 -62
  90. package/fesm2022/acorex-components-common.mjs.map +1 -1
  91. package/fesm2022/acorex-components-datetime-box.mjs +5 -2
  92. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  93. package/fesm2022/acorex-components-datetime-input.mjs +10 -3
  94. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  95. package/fesm2022/acorex-components-datetime-picker.mjs +2 -2
  96. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  97. package/fesm2022/acorex-components-list.mjs +33 -59
  98. package/fesm2022/acorex-components-list.mjs.map +1 -1
  99. package/fesm2022/acorex-components-menu.mjs +78 -381
  100. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  101. package/fesm2022/acorex-components-notification.mjs +2 -2
  102. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  103. package/fesm2022/acorex-components-otp.mjs +6 -4
  104. package/fesm2022/acorex-components-otp.mjs.map +1 -1
  105. package/fesm2022/acorex-components-picker.mjs +2 -2
  106. package/fesm2022/acorex-components-picker.mjs.map +1 -1
  107. package/fesm2022/acorex-components-progress-bar.mjs +2 -2
  108. package/fesm2022/acorex-components-progress-bar.mjs.map +1 -1
  109. package/fesm2022/acorex-components-range-slider.mjs +2 -2
  110. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  111. package/fesm2022/acorex-components-routing-progress.mjs +2 -2
  112. package/fesm2022/acorex-components-routing-progress.mjs.map +1 -1
  113. package/fesm2022/acorex-components-search-box.mjs +4 -4
  114. package/fesm2022/acorex-components-search-box.mjs.map +1 -1
  115. package/fesm2022/acorex-components-select-box.mjs +96 -417
  116. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  117. package/fesm2022/acorex-components-selection-list.mjs +10 -0
  118. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  119. package/fesm2022/acorex-components-side-menu.mjs +153 -0
  120. package/fesm2022/acorex-components-side-menu.mjs.map +1 -0
  121. package/fesm2022/acorex-components-skeleton.mjs +46 -0
  122. package/fesm2022/acorex-components-skeleton.mjs.map +1 -0
  123. package/fesm2022/acorex-components-tabs.mjs +8 -1
  124. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  125. package/fesm2022/acorex-components-tag.mjs +5 -11
  126. package/fesm2022/acorex-components-tag.mjs.map +1 -1
  127. package/fesm2022/acorex-components-toast.mjs +2 -2
  128. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  129. package/list/lib/list.component.d.ts +11 -23
  130. package/menu/index.d.ts +0 -1
  131. package/menu/lib/class/root-menu.class.d.ts +2 -0
  132. package/menu/lib/menu-item/menu-item.component.d.ts +19 -6
  133. package/menu/lib/menu.component.d.ts +10 -40
  134. package/menu/lib/menu.module.d.ts +7 -8
  135. package/mixin/lib/base-components.class.d.ts +2 -2
  136. package/mixin/lib/base-menu-mixin.class.d.ts +5 -5
  137. package/mixin/lib/button-mixin.class.d.ts +2 -2
  138. package/mixin/lib/clickable-mixin.class.d.ts +2 -2
  139. package/mixin/lib/color-look-mixing.class.d.ts +2 -2
  140. package/mixin/lib/datalist-component.class.d.ts +10 -10
  141. package/mixin/lib/dropdown-mixin.class.d.ts +2 -2
  142. package/mixin/lib/interactive-mixin.class.d.ts +4 -4
  143. package/mixin/lib/mixin.class.d.ts +61 -61
  144. package/mixin/lib/page-component.class.d.ts +2 -2
  145. package/mixin/lib/selection-component.class.d.ts +2 -2
  146. package/mixin/lib/sizable-mixin.class.d.ts +2 -2
  147. package/mixin/lib/textbox-mixin.class.d.ts +2 -2
  148. package/mixin/lib/value-mixin.class.d.ts +8 -8
  149. package/otp/lib/otp.module.d.ts +2 -1
  150. package/package.json +13 -7
  151. package/search-box/lib/search-box.component.d.ts +2 -1
  152. package/select-box/index.d.ts +1 -1
  153. package/select-box/lib/select-box.component.d.ts +37 -59
  154. package/select-box/lib/select-box.module.d.ts +14 -15
  155. package/selection-list/lib/selection-list.component.d.ts +3 -0
  156. package/side-menu/README.md +3 -0
  157. package/side-menu/index.d.ts +3 -0
  158. package/side-menu/lib/side-menu-item/side-menu-item.compoent.d.ts +37 -0
  159. package/side-menu/lib/side-menu.component.d.ts +8 -0
  160. package/side-menu/lib/side-menu.module.d.ts +10 -0
  161. package/skeleton/README.md +3 -0
  162. package/skeleton/index.d.ts +2 -0
  163. package/skeleton/lib/skeleton.component.d.ts +8 -0
  164. package/skeleton/lib/skeleton.module.d.ts +8 -0
  165. package/tabs/lib/tab-item.component.d.ts +2 -1
  166. package/tag/lib/tag.component.d.ts +3 -4
  167. package/context-menu/README.md +0 -3
  168. package/context-menu/index.d.ts +0 -2
  169. package/context-menu/lib/context-menu.component.d.ts +0 -34
  170. package/context-menu/lib/context-menu.module.d.ts +0 -13
  171. package/esm2022/context-menu/acorex-components-context-menu.mjs +0 -5
  172. package/esm2022/context-menu/index.mjs +0 -3
  173. package/esm2022/context-menu/lib/context-menu.component.mjs +0 -262
  174. package/esm2022/context-menu/lib/context-menu.module.mjs +0 -26
  175. package/esm2022/menu/lib/menu2.component.mjs +0 -45
  176. package/esm2022/select-box/lib/select-box2.component.mjs +0 -191
  177. package/fesm2022/acorex-components-context-menu.mjs +0 -290
  178. package/fesm2022/acorex-components-context-menu.mjs.map +0 -1
  179. package/menu/lib/menu2.component.d.ts +0 -12
  180. package/select-box/lib/select-box2.component.d.ts +0 -44
@@ -1,7 +1,8 @@
1
1
  import { flatten, clone } from 'lodash-es';
2
2
  import * as i0 from '@angular/core';
3
3
  import { Injectable, Directive, Host, Self, Optional, Input, Inject, NgModule, inject, ChangeDetectorRef, ElementRef, ViewContainerRef, EventEmitter, Output } from '@angular/core';
4
- import { BehaviorSubject, fromEvent, noop, skip, distinctUntilChanged, debounceTime } from 'rxjs';
4
+ import _ from 'lodash';
5
+ import { Subject, fromEvent, noop, skip, distinctUntilChanged, debounceTime } from 'rxjs';
5
6
  import { DOCUMENT } from '@angular/common';
6
7
  import * as i1 from '@angular/platform-browser';
7
8
  import { Observable } from 'rxjs/internal/Observable';
@@ -328,41 +329,105 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.9", ngImpor
328
329
  }] });
329
330
 
330
331
  class AXDateSource {
332
+ get totalCount() {
333
+ return this._totalCount;
334
+ }
335
+ ;
336
+ get totalPages() {
337
+ return Math.floor(this.totalCount / this.config.pageSize);
338
+ }
339
+ ;
340
+ get cachedItems() {
341
+ return this._cachedItems;
342
+ }
331
343
  get items() {
332
344
  return this._items;
333
345
  }
346
+ get isLoading() {
347
+ return this._isLoading;
348
+ }
334
349
  constructor(config) {
335
- this.config = config;
336
350
  this._totalCount = 0;
337
- this._items = new Array(this.config.pageSize);
351
+ this._items = [];
338
352
  this.fetchedPages = new Set();
353
+ this._page = 0;
354
+ this.onChanged = new Subject();
355
+ this.onLoadingChanged = new Subject();
356
+ this._isLoading = false;
357
+ this.config = config;
358
+ this._cachedItems = new Array(this.config.pageSize);
359
+ this._items = new Array(0);
339
360
  this._query = { skip: 0, take: this.config.pageSize };
340
- this.loadingChanged = new BehaviorSubject(false);
341
- this.dataStream = new BehaviorSubject(this._items);
342
361
  }
343
- async fetchPage(page) {
362
+ load() {
363
+ const page = this._page;
344
364
  if (this.fetchedPages.has(page)) {
345
365
  return;
346
366
  }
347
- this.loadingChanged.next(true);
367
+ this.setLoadingState(true);
348
368
  this.fetchedPages.add(page);
349
369
  this._query.skip = page * this.config.pageSize;
350
- const result = await this.config.load(this._query);
351
- if (this._totalCount != result.total) {
352
- this._items = new Array(result.total);
353
- this._totalCount = result.total;
370
+ this.config.load({ ...this._query }).then(result => {
371
+ if (this._totalCount != result.total) {
372
+ this._cachedItems = new Array(result.total);
373
+ this._totalCount = result.total;
374
+ }
375
+ this._items = result.items;
376
+ this._cachedItems.splice(page * this.config.pageSize, this.config.pageSize, ...result.items);
377
+ const event = {
378
+ cachedItems: this.cachedItems,
379
+ items: this.items,
380
+ page: page,
381
+ totalCount: this.totalCount,
382
+ totalPages: this.totalPages
383
+ };
384
+ this.onChanged.next(event);
385
+ }).finally(() => {
386
+ this.setLoadingState(false);
387
+ });
388
+ }
389
+ setLoadingState(value) {
390
+ this._isLoading = value;
391
+ this.onLoadingChanged.next(this._isLoading);
392
+ }
393
+ setPage(page) {
394
+ if (this._page != page || this._items.length == 0) {
395
+ this._page = page;
396
+ this.load();
354
397
  }
355
- this._items.splice(page * this.config.pageSize, this.config.pageSize, ...result.items);
356
- this.dataStream.next(this.items);
357
- this.loadingChanged.next(false);
398
+ }
399
+ filter(predicate = null) {
400
+ this.reset();
401
+ this._query.predicate = predicate;
402
+ this.load();
403
+ }
404
+ reset() {
405
+ this._query.predicate = null;
406
+ this._query.skip = 0;
407
+ this._cachedItems = new Array(this.config.pageSize);
408
+ this.fetchedPages.clear();
409
+ this._page = 0;
410
+ this._totalCount = 0;
411
+ }
412
+ find(key) {
413
+ const fromCache = this.cachedItems.find(c => (!this.config.key && c == key) || (c && this.config.key && c[this.config.key] == key));
414
+ if (fromCache)
415
+ return fromCache;
416
+ return this.config.byKey ? this.config.byKey(key) : null;
358
417
  }
359
418
  }
360
- function convertArrayToDataSource(key, items) {
419
+ function convertArrayToDataSource(items, options = { key: 'id', pageSize: 20 }) {
361
420
  const config = {
362
- key,
363
- pageSize: items.length,
364
- load: (e) => Promise.resolve({ items, total: items.length }),
365
- byKey: (v) => Promise.resolve(items.find((c) => c[key] == v)),
421
+ key: options.key,
422
+ pageSize: options.pageSize,
423
+ load: (e) => {
424
+ const result = e.predicate ? _.filter(items, e.predicate) : items;
425
+ return Promise.resolve({
426
+ items: result.slice(e.skip, e.skip + e.take),
427
+ total: result.length
428
+ });
429
+ },
430
+ byKey: (v) => Promise.resolve(items.find(c => c[options.key] == v))
366
431
  };
367
432
  return new AXDateSource(config);
368
433
  }
@@ -640,12 +705,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.9", ngImpor
640
705
  class AXRippleDirective {
641
706
  constructor(el) {
642
707
  this.el = el;
643
- el.nativeElement.addEventListener('click', this.createRipple);
708
+ this.axRippleColor = 'rgb(0, 0, 0 , 0.1)';
709
+ el.nativeElement.addEventListener('click', this.createRipple.bind(this));
644
710
  }
645
711
  ngOnDestroy() {
646
- this.el.nativeElement.removeEventListener('click', this.createRipple);
712
+ this.el.nativeElement.removeEventListener('click', this.createRipple.bind(this));
647
713
  }
648
714
  createRipple(event) {
715
+ this.el.nativeElement.style.overflow = 'hidden';
649
716
  const element = event.currentTarget;
650
717
  const rect = element.getBoundingClientRect();
651
718
  const x = Math.floor(((event.clientX - rect.left) / (rect.right - rect.left)) * element.clientWidth);
@@ -656,22 +723,26 @@ class AXRippleDirective {
656
723
  circle.style.width = circle.style.height = `${diameter}px`;
657
724
  circle.style.left = `${x - radius}px`;
658
725
  circle.style.top = `${y - radius}px`;
659
- circle.classList.add('ripple');
660
- const ripple = element.getElementsByClassName('ripple')[0];
726
+ circle.style.backgroundColor = `${this.axRippleColor}`;
727
+ circle.classList.add('ax-ripple');
728
+ const ripple = element.getElementsByClassName('ax-ripple')[0];
661
729
  if (ripple) {
662
730
  ripple.remove();
731
+ // this.el.nativeElement.style.overflow = 'initial';
663
732
  }
664
733
  element.appendChild(circle);
665
734
  }
666
735
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.9", ngImport: i0, type: AXRippleDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
667
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.9", type: AXRippleDirective, selector: "[axRipple]", ngImport: i0 }); }
736
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.9", type: AXRippleDirective, selector: "[axRipple]", inputs: { axRippleColor: "axRippleColor" }, ngImport: i0 }); }
668
737
  }
669
738
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.9", ngImport: i0, type: AXRippleDirective, decorators: [{
670
739
  type: Directive,
671
740
  args: [{
672
741
  selector: '[axRipple]',
673
742
  }]
674
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });
743
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { axRippleColor: [{
744
+ type: Input
745
+ }] } });
675
746
 
676
747
  class AXCommonModule {
677
748
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.9", ngImport: i0, type: AXCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -863,11 +934,6 @@ class MXInteractiveComponent extends MXBaseComponent {
863
934
  * @event
864
935
  */
865
936
  this.onBlur = new EventEmitter();
866
- /**
867
- * Fires each time the user clicks the button.
868
- * @event
869
- */
870
- this.onClick = new EventEmitter();
871
937
  }
872
938
  registerOnTouched(fn) {
873
939
  this.onTouchedCallback = fn;
@@ -924,13 +990,18 @@ class MXInteractiveComponent extends MXBaseComponent {
924
990
  nativeEvent: e,
925
991
  });
926
992
  }
927
- emitOnClickEvent(e) {
928
- this.onClick.emit({
929
- component: this,
930
- htmlElement: this.getHostElement(),
931
- nativeEvent: e,
932
- });
933
- }
993
+ // /**
994
+ // * Fires each time the user clicks the button.
995
+ // * @event
996
+ // */
997
+ // onClick: EventEmitter<AXClickEvent> = new EventEmitter<AXClickEvent>();
998
+ // protected emitOnClickEvent(e: MouseEvent): void {
999
+ // this.onClick.emit({
1000
+ // component: this,
1001
+ // htmlElement: this.getHostElement(),
1002
+ // nativeEvent: e,
1003
+ // });
1004
+ // }
934
1005
  focus() {
935
1006
  AXHtmlUtil.focusElement(this.getHostElement());
936
1007
  }
@@ -1282,10 +1353,10 @@ class MXSelectionValueComponent extends MXValueComponent {
1282
1353
  super(...arguments);
1283
1354
  this._valueField = 'id';
1284
1355
  this._textField = 'text';
1285
- this._hintField = 'hint';
1286
1356
  this._disabledField = 'disabled';
1287
1357
  this._multiple = false;
1288
1358
  this._selectedItems = [];
1359
+ this._cacheList = [];
1289
1360
  }
1290
1361
  get valueField() {
1291
1362
  return this._valueField;
@@ -1305,15 +1376,6 @@ class MXSelectionValueComponent extends MXValueComponent {
1305
1376
  value: v,
1306
1377
  });
1307
1378
  }
1308
- get hintField() {
1309
- return this._hintField;
1310
- }
1311
- set hintField(v) {
1312
- this.setOption({
1313
- name: 'hintField',
1314
- value: v,
1315
- });
1316
- }
1317
1379
  get disabledField() {
1318
1380
  return this._disabledField;
1319
1381
  }
@@ -1336,41 +1398,78 @@ class MXSelectionValueComponent extends MXValueComponent {
1336
1398
  return this._selectedItems || [];
1337
1399
  }
1338
1400
  internalSetValue(value) {
1339
- const normalizedItems = Array.isArray(value)
1340
- ? this.normalizeItemsList(value)
1341
- : this.normalizeItemsList([value]);
1342
- return this.multiple ? normalizedItems : normalizedItems[0];
1401
+ const isArray = Array.isArray(value);
1402
+ if (value == null || (isArray && value.length == 0)) {
1403
+ return this.multiple ? [] : null;
1404
+ }
1405
+ const normalizedItems = isArray
1406
+ ? this.normalizeItemsList(value, true)
1407
+ : this.normalizeItemsList([value], true);
1408
+ if (normalizedItems.length == 0) {
1409
+ return this.multiple ? [] : null;
1410
+ }
1411
+ const result = this.multiple
1412
+ ? normalizedItems.map((c) => c[this.valueField])
1413
+ : normalizedItems[0][this.valueField];
1414
+ return result;
1343
1415
  }
1344
1416
  emitOnValueChangedEvent(oldValue, newValue) {
1345
1417
  this._normalizeSelectedItems();
1346
1418
  super.emitOnValueChangedEvent(oldValue, newValue);
1347
1419
  }
1348
- normalizeItemsList(items) {
1420
+ normalizeItemsList(items, findBykey = false) {
1349
1421
  if (items == null)
1350
1422
  return [];
1351
- return items.filter((c) => c != null).map((i) => this.normalizeItem(i));
1423
+ return items.filter((c) => c != null).map((i) => this.normalizeItem(i, findBykey));
1352
1424
  }
1353
- normalizeItem(item) {
1425
+ normalizeItem(item, findBykey = false) {
1426
+ const complex = typeof item == 'object';
1427
+ const key = complex ? item[this.valueField] : `${item}`;
1428
+ const cacheKey = `k-${key}`;
1429
+ const hasText = !complex || item[this.textField] != null;
1430
+ //
1431
+ if (this._cacheList[cacheKey])
1432
+ return this._cacheList[cacheKey];
1433
+ //
1354
1434
  const obj = {};
1355
- if (typeof item == 'object') {
1435
+ if (complex && hasText) {
1356
1436
  Object.assign(obj, item);
1357
1437
  }
1358
- else if (typeof item != 'function') {
1359
- const existsItem = this.getItemByKey(item);
1360
- if (existsItem)
1361
- Object.assign(obj, existsItem);
1438
+ else {
1439
+ const existsItem = findBykey ? this.getItemByKey(key) : null;
1440
+ if (existsItem && existsItem instanceof Promise) {
1441
+ obj[this.valueField] = key;
1442
+ obj[this.textField] = key;
1443
+ obj['isLoading'] = true;
1444
+ //
1445
+ existsItem.then((r) => {
1446
+ if (typeof r === 'object') {
1447
+ obj[this.valueField] = r[this.valueField];
1448
+ obj[this.textField] = r[this.textField];
1449
+ }
1450
+ else {
1451
+ obj[this.valueField] = obj[this.textField] = r || key;
1452
+ }
1453
+ }).finally(() => {
1454
+ obj['isLoading'] = false;
1455
+ this.cdr.markForCheck();
1456
+ });
1457
+ }
1458
+ else if (existsItem) {
1459
+ obj[this.valueField] = existsItem;
1460
+ }
1362
1461
  else {
1363
1462
  obj[this.valueField] = item;
1364
- obj[this.textField] = item.toString();
1365
1463
  }
1366
1464
  }
1367
1465
  if (!obj[this.textField]) {
1368
1466
  obj[this.textField] = obj[this.valueField];
1369
1467
  }
1468
+ this._cacheList[cacheKey] = obj;
1370
1469
  return obj;
1371
1470
  }
1372
1471
  _normalizeSelectedItems() {
1373
- const values = Array.isArray(this.value) ? this.value : this.value ? [this.value] : [];
1472
+ const values = Array.isArray(this.value) ? this.value : this.value != null ? [this.value] : [];
1374
1473
  this._selectedItems = values.map((v) => this.normalizeItem(v));
1375
1474
  }
1376
1475
  unselectItems(...items) {
@@ -1419,7 +1518,7 @@ class MXSelectionValueComponent extends MXValueComponent {
1419
1518
  }
1420
1519
  getDisplayText(item) {
1421
1520
  const normalizeItem = this.normalizeItem(item);
1422
- return normalizeItem[this.textField];
1521
+ return normalizeItem['isLoading'] ? 'Loading...' : normalizeItem[this.textField];
1423
1522
  }
1424
1523
  getValue(item) {
1425
1524
  const normalizeItem = this.normalizeItem(item);