@aquera/nile-elements 2.0.17 → 2.0.19

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 (89) hide show
  1. package/README.md +8 -0
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.esm.js +1 -1
  4. package/dist/index.js +629 -440
  5. package/dist/nile-breadcrumb/nile-breadcrumb.cjs.js +1 -1
  6. package/dist/nile-breadcrumb/nile-breadcrumb.cjs.js.map +1 -1
  7. package/dist/nile-breadcrumb/nile-breadcrumb.esm.js +2 -2
  8. package/dist/nile-breadcrumb-item/nile-breadcrumb-item.cjs.js +1 -1
  9. package/dist/nile-breadcrumb-item/nile-breadcrumb-item.cjs.js.map +1 -1
  10. package/dist/nile-breadcrumb-item/nile-breadcrumb-item.css.cjs.js +1 -1
  11. package/dist/nile-breadcrumb-item/nile-breadcrumb-item.css.cjs.js.map +1 -1
  12. package/dist/nile-breadcrumb-item/nile-breadcrumb-item.css.esm.js +14 -2
  13. package/dist/nile-breadcrumb-item/nile-breadcrumb-item.esm.js +4 -4
  14. package/dist/nile-minimap/index.cjs.js +2 -0
  15. package/dist/nile-minimap/index.cjs.js.map +1 -0
  16. package/dist/nile-minimap/index.esm.js +1 -0
  17. package/dist/nile-minimap/nile-minimap.cjs.js +2 -0
  18. package/dist/nile-minimap/nile-minimap.cjs.js.map +1 -0
  19. package/dist/nile-minimap/nile-minimap.css.cjs.js +2 -0
  20. package/dist/nile-minimap/nile-minimap.css.cjs.js.map +1 -0
  21. package/dist/nile-minimap/nile-minimap.css.esm.js +150 -0
  22. package/dist/nile-minimap/nile-minimap.esm.js +22 -0
  23. package/dist/nile-select/index.cjs.js +1 -1
  24. package/dist/nile-select/index.esm.js +1 -1
  25. package/dist/nile-select/nile-select.cjs.js +2 -2
  26. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  27. package/dist/nile-select/nile-select.esm.js +1 -1
  28. package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
  29. package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
  30. package/dist/nile-select/virtual-scroll-helper.esm.js +48 -47
  31. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +4 -4
  32. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  33. package/dist/nile-virtual-select/nile-virtual-select.esm.js +2 -2
  34. package/dist/src/index.d.ts +1 -0
  35. package/dist/src/index.js +1 -0
  36. package/dist/src/index.js.map +1 -1
  37. package/dist/src/nile-breadcrumb/nile-breadcrumb.d.ts +7 -0
  38. package/dist/src/nile-breadcrumb/nile-breadcrumb.js +24 -1
  39. package/dist/src/nile-breadcrumb/nile-breadcrumb.js.map +1 -1
  40. package/dist/src/nile-breadcrumb/nile-breadcrumb.test.js +51 -0
  41. package/dist/src/nile-breadcrumb/nile-breadcrumb.test.js.map +1 -1
  42. package/dist/src/nile-breadcrumb-item/nile-breadcrumb-item.css.js +12 -0
  43. package/dist/src/nile-breadcrumb-item/nile-breadcrumb-item.css.js.map +1 -1
  44. package/dist/src/nile-breadcrumb-item/nile-breadcrumb-item.d.ts +5 -0
  45. package/dist/src/nile-breadcrumb-item/nile-breadcrumb-item.js +9 -0
  46. package/dist/src/nile-breadcrumb-item/nile-breadcrumb-item.js.map +1 -1
  47. package/dist/src/nile-minimap/index.d.ts +1 -0
  48. package/dist/src/nile-minimap/index.js +2 -0
  49. package/dist/src/nile-minimap/index.js.map +1 -0
  50. package/dist/src/nile-minimap/nile-minimap.css.d.ts +12 -0
  51. package/dist/src/nile-minimap/nile-minimap.css.js +162 -0
  52. package/dist/src/nile-minimap/nile-minimap.css.js.map +1 -0
  53. package/dist/src/nile-minimap/nile-minimap.d.ts +131 -0
  54. package/dist/src/nile-minimap/nile-minimap.js +704 -0
  55. package/dist/src/nile-minimap/nile-minimap.js.map +1 -0
  56. package/dist/src/nile-minimap/nile-minimap.test.d.ts +1 -0
  57. package/dist/src/nile-minimap/nile-minimap.test.js +785 -0
  58. package/dist/src/nile-minimap/nile-minimap.test.js.map +1 -0
  59. package/dist/src/nile-select/nile-select.d.ts +1 -0
  60. package/dist/src/nile-select/nile-select.js +16 -1
  61. package/dist/src/nile-select/nile-select.js.map +1 -1
  62. package/dist/src/nile-select/nile-select.test.js +430 -5
  63. package/dist/src/nile-select/nile-select.test.js.map +1 -1
  64. package/dist/src/nile-select/virtual-scroll-helper.js +7 -4
  65. package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
  66. package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +3 -1
  67. package/dist/src/nile-virtual-select/nile-virtual-select.js +14 -6
  68. package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
  69. package/dist/src/nile-virtual-select/nile-virtual-select.test.js +115 -1
  70. package/dist/src/nile-virtual-select/nile-virtual-select.test.js.map +1 -1
  71. package/dist/src/version.js +1 -1
  72. package/dist/src/version.js.map +1 -1
  73. package/dist/tsconfig.tsbuildinfo +1 -1
  74. package/package.json +2 -1
  75. package/src/index.ts +1 -0
  76. package/src/nile-breadcrumb/nile-breadcrumb.test.ts +57 -0
  77. package/src/nile-breadcrumb/nile-breadcrumb.ts +19 -0
  78. package/src/nile-breadcrumb-item/nile-breadcrumb-item.css.ts +12 -0
  79. package/src/nile-breadcrumb-item/nile-breadcrumb-item.ts +7 -0
  80. package/src/nile-minimap/index.ts +1 -0
  81. package/src/nile-minimap/nile-minimap.css.ts +164 -0
  82. package/src/nile-minimap/nile-minimap.test.ts +924 -0
  83. package/src/nile-minimap/nile-minimap.ts +796 -0
  84. package/src/nile-select/nile-select.test.ts +560 -5
  85. package/src/nile-select/nile-select.ts +21 -1
  86. package/src/nile-select/virtual-scroll-helper.ts +7 -4
  87. package/src/nile-virtual-select/nile-virtual-select.test.ts +139 -1
  88. package/src/nile-virtual-select/nile-virtual-select.ts +17 -6
  89. package/vscode-html-custom-data.json +138 -36
@@ -1,4 +1,5 @@
1
- import { html } from 'lit';
1
+ import { html, noChange, nothing } from 'lit';
2
+ import { guard } from 'lit/directives/guard.js';
2
3
  import type NileElement from '../internal/nile-element';
3
4
 
4
5
  /**
@@ -13,12 +14,14 @@ export class VirtualScrollHelper {
13
14
 
14
15
  renderVirtualizedContent(): any {
15
16
  const component = this.component as any;
17
+ const tooltipPath = !!component.showTooltip;
16
18
 
17
19
  return html`
18
20
  <div class="virtual-select">
19
21
  <nile-virtual-select
20
22
  .name=${component.name}
21
23
  .value=${component.value}
24
+ .maxOptionsVisible=${tooltipPath || !component.maxOptionsVisibleExplicit ? noChange : component.maxOptionsVisible}
22
25
  .autoResize=${component.autoResize}
23
26
  .showTooltip=${component.showTooltip}
24
27
  .chipMinWidth=${component.chipMinWidth}
@@ -51,7 +54,7 @@ export class VirtualScrollHelper {
51
54
  .blockValueChange=${component.blockValueChange}
52
55
  .noWidthSync=${component.noWidthSync}
53
56
  .enableTabClose=${component.enableTabClose}
54
- .data=${component.data}
57
+ .data=${tooltipPath ? guard([component.data], () => component.data) : component.data}
55
58
  .open=${component.open}
56
59
  .loading=${component.loading}
57
60
  .portal=${component.portal}
@@ -60,8 +63,8 @@ export class VirtualScrollHelper {
60
63
  .enableDescription=${component.enableDescription}
61
64
  .tickOnSelect=${component.tickOnSelect}
62
65
  .legacy=${component.legacy}
63
- @nile-input=${(e: CustomEvent) => component.syncValueFromVirtualSelect(e)}
64
- @nile-change=${(e: CustomEvent) => component.syncValueFromVirtualSelect(e)}
66
+ @nile-input=${tooltipPath ? (e: CustomEvent) => component.syncValueFromVirtualSelect(e) : nothing}
67
+ @nile-change=${tooltipPath ? (e: CustomEvent) => component.syncValueFromVirtualSelect(e) : nothing}
65
68
  exportparts="
66
69
  select-options,
67
70
  select-no-results,
@@ -1,4 +1,4 @@
1
- import { aTimeout, expect, fixture, html, nextFrame, waitUntil } from '@open-wc/testing';
1
+ import { aTimeout, expect, fixture, html, nextFrame, oneEvent, waitUntil } from '@open-wc/testing';
2
2
  import './nile-virtual-select';
3
3
  import '../nile-input/nile-input';
4
4
  import type { NileVirtualSelect } from './nile-virtual-select';
@@ -843,3 +843,141 @@ describe('NileVirtualSelect showtooltip tooltip on sub-pixel truncation', () =>
843
843
  }
844
844
  });
845
845
  });
846
+
847
+
848
+ describe('NileVirtualSelect external value while Selected is open', () => {
849
+ const OPTIONS = Array.from({ length: 200 }, (_, i) => ({ value: `option-${i + 1}`, label: `Option ${i + 1}` }));
850
+ let mounted: any;
851
+
852
+ // Let the dropdown finish hiding before the fixture is torn down, so the virtualizer is not still laying out
853
+ // a list that has already been detached.
854
+ afterEach(async () => {
855
+ if (mounted?.open) {
856
+ const hidden = oneEvent(mounted, 'nile-after-hide');
857
+ mounted.open = false;
858
+ await Promise.race([hidden, aTimeout(1500)]);
859
+ await nextFrame();
860
+ await nextFrame();
861
+ }
862
+ mounted = undefined;
863
+ });
864
+
865
+ // Known, pre-existing noise from @lit-labs/virtualizer (a "ResizeObserver loop" notice, and a detached-list error
866
+ // when the visible list swaps between a short and a long data set). The browser raises them as window errors,
867
+ // which would fail whichever test is running; the assertions below still decide pass or fail. The detached-list
868
+ // errors are matched on message AND a `virtualizer` frame in the stack, so the same message from anywhere else
869
+ // still fails the test. "ResizeObserver loop" is a browser notice with no stack.
870
+ const virtualizerErrors = ['ChildPart` has no `parentNode`', "reading 'insertBefore'"];
871
+ let previousOnError: OnErrorEventHandler;
872
+ before(() => {
873
+ previousOnError = window.onerror;
874
+ window.onerror = (message, source, lineno, colno, error) => {
875
+ if (typeof message === 'string') {
876
+ if (message.includes('ResizeObserver loop')) return true;
877
+ if (virtualizerErrors.some(known => message.includes(known)) && error?.stack?.toLowerCase().includes('virtualizer')) {
878
+ return true;
879
+ }
880
+ }
881
+ return previousOnError ? previousOnError.call(window, message, source, lineno, colno, error) : false;
882
+ };
883
+ });
884
+ after(() => {
885
+ window.onerror = previousOnError;
886
+ });
887
+
888
+ async function mount(showTooltip: boolean, value: string[] = ['option-1', 'option-2']) {
889
+ const el = await fixture<NileVirtualSelect>(html`<nile-virtual-select
890
+ multiple
891
+ ?showTooltip=${showTooltip}
892
+ .data=${OPTIONS}
893
+ .value=${value}
894
+ ></nile-virtual-select>`);
895
+ await el.updateComplete;
896
+ const shown = oneEvent(el, 'nile-after-show');
897
+ (el.shadowRoot!.querySelector('[part="combobox"]') as HTMLElement).dispatchEvent(
898
+ new MouseEvent('mousedown', { bubbles: true, composed: true, button: 0 })
899
+ );
900
+ await shown;
901
+ await aTimeout(50);
902
+ mounted = el;
903
+ return el as any;
904
+ }
905
+
906
+ async function toggleSelected(el: any) {
907
+ (el.shadowRoot.querySelector('.select__footer nile-checkbox') as HTMLElement).click();
908
+ await el.updateComplete;
909
+ await aTimeout(30);
910
+ }
911
+
912
+ // The standalone select has no sized container here, so its options are not laid out; drive the same
913
+ // selection handler the option click uses.
914
+ async function pick(el: any, value: string) {
915
+ el.handleOptionSelection({ value });
916
+ await el.updateComplete;
917
+ await aTimeout(30);
918
+ }
919
+
920
+ const values = (el: any) => el.data.map((item: any) => item.value);
921
+
922
+ it('E1. showtooltip: an external value replace recomputes the Selected list', async () => {
923
+ const el = await mount(true);
924
+ await toggleSelected(el);
925
+ expect(values(el)).to.deep.equal(['option-1', 'option-2']);
926
+
927
+ el.value = ['option-5'];
928
+ await el.updateComplete;
929
+ await aTimeout(30);
930
+
931
+ expect(el.showSelected).to.be.true;
932
+ expect(values(el)).to.deep.equal(['option-5']);
933
+ });
934
+
935
+ it('E2. showtooltip: an external value that adds or removes items follows the Selected list', async () => {
936
+ const el = await mount(true);
937
+ await toggleSelected(el);
938
+
939
+ el.value = ['option-1', 'option-2', 'option-7'];
940
+ await el.updateComplete;
941
+ await aTimeout(30);
942
+ expect(values(el)).to.deep.equal(['option-1', 'option-2', 'option-7']);
943
+
944
+ el.value = ['option-2'];
945
+ await el.updateComplete;
946
+ await aTimeout(30);
947
+ expect(values(el)).to.deep.equal(['option-2']);
948
+ });
949
+
950
+ it('E3. showtooltip: an external empty value leaves the Selected view', async () => {
951
+ const el = await mount(true);
952
+ await toggleSelected(el);
953
+
954
+ el.value = [];
955
+ await el.updateComplete;
956
+ await aTimeout(30);
957
+
958
+ expect(el.showSelected).to.be.false;
959
+ expect(el.data.length).to.equal(200);
960
+ });
961
+
962
+ it('E4. showtooltip: a normal uncheck in the Selected view is not treated as external', async () => {
963
+ const el = await mount(true);
964
+ await toggleSelected(el);
965
+
966
+ await pick(el, 'option-2');
967
+
968
+ expect(el.value).to.deep.equal(['option-1']);
969
+ expect(values(el)).to.deep.equal(['option-1', 'option-2']);
970
+ });
971
+
972
+ it('E5. without showtooltip an external value leaves the Selected list as it was (pre-2.0.9)', async () => {
973
+ const el = await mount(false);
974
+ await toggleSelected(el);
975
+
976
+ el.value = ['option-5'];
977
+ await el.updateComplete;
978
+ await aTimeout(30);
979
+
980
+ expect(el.showSelected).to.be.true;
981
+ expect(values(el)).to.deep.equal(['option-1', 'option-2']);
982
+ });
983
+ });
@@ -135,9 +135,10 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
135
135
  /** The name of the select, submitted as a name/value pair with form data. */
136
136
  @property() name = '';
137
137
 
138
- /** Array of all option items for virtual scrolling */
139
138
  @property({ type: Array }) data: any = [];
140
139
 
140
+ private lastSeenValue: string | string[] | undefined;
141
+
141
142
  /** Original unfiltered option items for search functionality */
142
143
  @state() private originalOptionItems: any = [];
143
144
 
@@ -658,6 +659,15 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
658
659
  event.preventDefault();
659
660
  }
660
661
 
662
+ /** Narrows `data` to the items that are currently selected (the "Selected" view). */
663
+ private applySelectedFilter(): void {
664
+ const selectedValues = Array.isArray(this.value) ? this.value : [this.value];
665
+ this.data = this.originalOptionItems.filter((item: any) => {
666
+ const itemValue = this.getItemValue(item);
667
+ return selectedValues.some(val => String(val) === String(itemValue));
668
+ });
669
+ }
670
+
661
671
  private toggleShowSelected(event: Event): void {
662
672
  event.stopPropagation();
663
673
  event.preventDefault();
@@ -668,11 +678,7 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
668
678
 
669
679
  if (this.showSelected) {
670
680
  this.searchValue = "";
671
- const selectedValues = Array.isArray(this.value) ? this.value : [this.value];
672
- this.data = this.originalOptionItems.filter((item: any) => {
673
- const itemValue = this.getItemValue(item);
674
- return selectedValues.some(val => String(val) === String(itemValue));
675
- });
681
+ this.applySelectedFilter();
676
682
  } else {
677
683
  this.data = [...this.originalOptionItems];
678
684
  }
@@ -859,6 +865,7 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
859
865
  }
860
866
 
861
867
  private selectionChanged(): void {
868
+ this.lastSeenValue = this.value;
862
869
  const itemsToSearch = this.originalOptionItems.length > 0 ? this.originalOptionItems : this.data;
863
870
  this.selectedOptions = VirtualSelectSelectionManager.createVirtualOptionsFromValues(
864
871
  this.value,
@@ -1018,7 +1025,11 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
1018
1025
 
1019
1026
  @watch('value', { waitUntilFirstUpdate: true })
1020
1027
  handleValueChange(): void {
1028
+ const externalValueChange = this.value !== this.lastSeenValue;
1021
1029
  this.selectionChanged();
1030
+ if (externalValueChange && this.showTooltip && this.showSelected) {
1031
+ this.applySelectedFilter();
1032
+ }
1022
1033
  this.requestUpdate();
1023
1034
 
1024
1035
  // Update body append content if it's active