@sankhyalabs/core 5.20.0-dev.2 → 5.20.0-dev.20

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 (139) hide show
  1. package/.docs/README.md +3 -1
  2. package/.docs/classes/ApplicationContext.md +31 -32
  3. package/.docs/classes/ArrayUtils.md +95 -83
  4. package/.docs/classes/AuthorizedServiceCaller.md +25 -34
  5. package/.docs/classes/Change.md +59 -74
  6. package/.docs/classes/DataUnit.md +1031 -1078
  7. package/.docs/classes/DataUnitAction.md +25 -42
  8. package/.docs/classes/DataUnitStorage.md +40 -43
  9. package/.docs/classes/DateUtils.md +133 -126
  10. package/.docs/classes/ElementIDUtils.md +123 -122
  11. package/.docs/classes/ErrorException.md +67 -88
  12. package/.docs/classes/ErrorTracking.md +20 -23
  13. package/.docs/classes/FieldComparator.md +35 -39
  14. package/.docs/classes/FloatingManager.md +195 -198
  15. package/.docs/classes/HTMLBuilder.md +14 -20
  16. package/.docs/classes/HttpProvider.md +45 -41
  17. package/.docs/classes/IDBRepository.md +179 -196
  18. package/.docs/classes/JSUtils.md +65 -66
  19. package/.docs/classes/KeyboardManager.md +95 -87
  20. package/.docs/classes/{MaskFormatter-1.md → MaskFormatter.md} +81 -120
  21. package/.docs/classes/NumberUtils.md +163 -152
  22. package/.docs/classes/ObjectUtils.md +66 -71
  23. package/.docs/classes/OnboardingUtils.md +36 -51
  24. package/.docs/classes/OverflowWatcher.md +533 -0
  25. package/.docs/classes/PromiseSync.md +25 -42
  26. package/.docs/classes/ReadyUtil.md +31 -41
  27. package/.docs/classes/RequestMetadata.md +29 -30
  28. package/.docs/classes/SearchUtils.md +18 -20
  29. package/.docs/classes/SelectionInfo.md +59 -74
  30. package/.docs/classes/SkwHttpProvider.md +33 -45
  31. package/.docs/classes/StringUtils.md +297 -322
  32. package/.docs/classes/TimeFormatter.md +43 -44
  33. package/.docs/classes/UserAgentUtils.md +17 -20
  34. package/.docs/classes/VersionUtils.md +15 -18
  35. package/.docs/classes/WaitingChangeException.md +63 -84
  36. package/.docs/classes/WarningException.md +67 -88
  37. package/.docs/enumerations/Action.md +297 -0
  38. package/.docs/enumerations/ChangeOperation.md +47 -0
  39. package/.docs/enumerations/DataType.md +57 -0
  40. package/.docs/enumerations/DependencyType.md +37 -0
  41. package/.docs/enumerations/OverflowDirection.md +29 -0
  42. package/.docs/enumerations/SelectionMode.md +27 -0
  43. package/.docs/enumerations/SortMode.md +27 -0
  44. package/.docs/enumerations/UserInterface.md +177 -0
  45. package/.docs/functions/defaultDataLoader.md +25 -0
  46. package/.docs/{modules.md → globals.md} +26 -36
  47. package/.docs/interfaces/ChildDescriptor.md +12 -16
  48. package/.docs/interfaces/ChildLink.md +9 -12
  49. package/.docs/interfaces/DUActionInterceptor.md +10 -14
  50. package/.docs/interfaces/ExecutionContext.md +17 -32
  51. package/.docs/interfaces/FieldDescriptor.md +52 -66
  52. package/.docs/interfaces/Filter.md +13 -17
  53. package/.docs/interfaces/IElementIDInfo.md +11 -14
  54. package/.docs/interfaces/ILoadResult.md +11 -16
  55. package/.docs/interfaces/IRepository.md +88 -93
  56. package/.docs/interfaces/IRepositoryIndex.md +23 -30
  57. package/.docs/interfaces/LoadDataRequest.md +36 -45
  58. package/.docs/interfaces/LoadDataResponse.md +11 -14
  59. package/.docs/interfaces/OverFlowWatcherParams.md +67 -0
  60. package/.docs/interfaces/PageRequest.md +16 -20
  61. package/.docs/interfaces/PaginationInfo.md +24 -31
  62. package/.docs/interfaces/PromiseSyncCallback.md +13 -17
  63. package/.docs/interfaces/QuickFilter.md +17 -21
  64. package/.docs/interfaces/Record.md +26 -33
  65. package/.docs/interfaces/SavedRecord.md +33 -41
  66. package/.docs/interfaces/Sort.md +12 -16
  67. package/.docs/interfaces/SortingProvider.md +10 -13
  68. package/.docs/interfaces/UnitMetadata.md +16 -21
  69. package/.docs/interfaces/WaitingChange.md +16 -20
  70. package/.docs/namespaces/MaskFormatter/README.md +17 -0
  71. package/.docs/namespaces/MaskFormatter/type-aliases/MaskCharacter.md +13 -0
  72. package/.docs/namespaces/MaskFormatter/variables/MaskCharacter.md +13 -0
  73. package/.docs/type-aliases/DataUnitEventOptions.md +17 -0
  74. package/.docs/type-aliases/OnOverflowCallBack.md +25 -0
  75. package/.docs/variables/OVERFLOWED_CLASS_NAME.md +13 -0
  76. package/.releaserc +10 -10
  77. package/dist/dataunit/DataUnit.d.ts +28 -3
  78. package/dist/dataunit/DataUnit.js +55 -15
  79. package/dist/dataunit/DataUnit.js.map +1 -1
  80. package/dist/dataunit/formatting/PrettyFormatter.js +9 -5
  81. package/dist/dataunit/formatting/PrettyFormatter.js.map +1 -1
  82. package/dist/dataunit/metadata/DataType.js +10 -1
  83. package/dist/dataunit/metadata/DataType.js.map +1 -1
  84. package/dist/dataunit/state/action/DataUnitAction.d.ts +3 -1
  85. package/dist/dataunit/state/action/DataUnitAction.js +2 -0
  86. package/dist/dataunit/state/action/DataUnitAction.js.map +1 -1
  87. package/dist/dataunit/state/slice/ChangesSlice.js +12 -11
  88. package/dist/dataunit/state/slice/ChangesSlice.js.map +1 -1
  89. package/dist/dataunit/state/slice/InvalidFieldsSlice.js +2 -0
  90. package/dist/dataunit/state/slice/InvalidFieldsSlice.js.map +1 -1
  91. package/dist/dataunit/state/slice/LoadingProperties.d.ts +9 -0
  92. package/dist/dataunit/state/slice/LoadingProperties.js +31 -0
  93. package/dist/dataunit/state/slice/LoadingProperties.js.map +1 -0
  94. package/dist/dataunit/state/slice/SelectionSlice.js +3 -2
  95. package/dist/dataunit/state/slice/SelectionSlice.js.map +1 -1
  96. package/dist/index.d.ts +3 -2
  97. package/dist/index.js +2 -1
  98. package/dist/index.js.map +1 -1
  99. package/dist/utils/ElementUtils.d.ts +2 -0
  100. package/dist/utils/ElementUtils.js +9 -0
  101. package/dist/utils/ElementUtils.js.map +1 -0
  102. package/dist/utils/OverflowWatcher/index.d.ts +59 -0
  103. package/dist/utils/OverflowWatcher/index.js +188 -0
  104. package/dist/utils/OverflowWatcher/index.js.map +1 -0
  105. package/dist/utils/OverflowWatcher/types/overflow-callback.d.ts +6 -0
  106. package/dist/utils/OverflowWatcher/types/overflow-callback.js +2 -0
  107. package/dist/utils/OverflowWatcher/types/overflow-callback.js.map +1 -0
  108. package/dist/utils/OverflowWatcher/types/overflow-direction.d.ts +7 -0
  109. package/dist/utils/OverflowWatcher/types/overflow-direction.js +9 -0
  110. package/dist/utils/OverflowWatcher/types/overflow-direction.js.map +1 -0
  111. package/jest.config.ts +3 -1
  112. package/package.json +12 -4
  113. package/reports/test-report.xml +125 -0
  114. package/setupTests.js +1 -0
  115. package/sonar-project.properties +10 -0
  116. package/src/dataunit/DataUnit.ts +62 -17
  117. package/src/dataunit/formatting/PrettyFormatter.ts +8 -5
  118. package/src/dataunit/metadata/DataType.ts +10 -1
  119. package/src/dataunit/state/action/DataUnitAction.ts +3 -1
  120. package/src/dataunit/state/slice/ChangesSlice.ts +15 -14
  121. package/src/dataunit/state/slice/InvalidFieldsSlice.ts +2 -0
  122. package/src/dataunit/state/slice/LoadingProperties.ts +37 -0
  123. package/src/dataunit/state/slice/SelectionSlice.ts +3 -2
  124. package/src/index.ts +8 -1
  125. package/src/utils/ElementUtils.ts +10 -0
  126. package/src/utils/OverflowWatcher/index.ts +243 -0
  127. package/src/utils/OverflowWatcher/types/overflow-callback.ts +6 -0
  128. package/src/utils/OverflowWatcher/types/overflow-direction.ts +7 -0
  129. package/test/util/ElementUtils.spec.ts +34 -0
  130. package/test/util/OverflowWatcher.spec.ts +152 -0
  131. package/.docs/.nojekyll +0 -1
  132. package/.docs/enums/Action.md +0 -305
  133. package/.docs/enums/ChangeOperation.md +0 -52
  134. package/.docs/enums/DataType.md +0 -63
  135. package/.docs/enums/DependencyType.md +0 -41
  136. package/.docs/enums/SelectionMode.md +0 -30
  137. package/.docs/enums/SortMode.md +0 -30
  138. package/.docs/enums/UserInterface.md +0 -195
  139. package/.docs/modules/MaskFormatter.md +0 -37
@@ -0,0 +1,243 @@
1
+ import { JSUtils } from "../JSUtils.js";
2
+ import { OverflowDirection } from "./types/overflow-direction.js"
3
+ import { OnOverflowCallBack } from "./types/overflow-callback.js"
4
+ import { calcMarginSize } from '../ElementUtils.js';
5
+
6
+ export * from "./types/overflow-direction.js";
7
+ export * from "./types/overflow-callback.js";
8
+
9
+ export const OVERFLOWED_CLASS_NAME = 'overflowed';
10
+
11
+ export default class OverflowWatcher {
12
+ private _onResize:OnOverflowCallBack;
13
+ private _resizeObserver:ResizeObserver;
14
+ private _lastContainerSize:number|undefined = undefined;
15
+ private _lastContainerInstance: HTMLElement | undefined = undefined;
16
+ private _scrollDirection = OverflowDirection.HORIZONTAL;
17
+ private _propSize:string;
18
+ private _hiddenItemsProps:Map<Element, SizeProps> = new Map();
19
+ private _notOverFlowPros:Map<string, SizeProps> = new Map();
20
+ private _deltaSize:number;
21
+ private _notOverFlow: string[] = [];
22
+
23
+ readonly DATA_ELEMENT_ID = 'data-element-id';
24
+
25
+ /**
26
+ * Cria uma instancia do OverflowWatcher
27
+ *
28
+ * @param element - Elemento HTML que o overflow será observado.
29
+ * @param callback - Função que sera chamada quando ocorrer overflow no elemento.
30
+ * @param overFlowDirection - Indica direção que o overflow será monitorado.
31
+ * @param deltaSize - Variação de tamanho que será considerada como overflow.
32
+ * @param debounce - Tempo até execução do callback em milissegundos.
33
+ * @param notOverFlow - Lista de ids ou data-element-ids dos elementos que não devem sofrer overFlow.
34
+ */
35
+ constructor({
36
+ element,
37
+ callback,
38
+ overFlowDirection = OverflowDirection.HORIZONTAL,
39
+ debounce = 200,
40
+ deltaSize = 0,
41
+ notOverFlow = []
42
+ }: OverFlowWatcherParams){
43
+ this._onResize = callback;
44
+ this._scrollDirection = overFlowDirection;
45
+ this._propSize = (OverflowDirection.HORIZONTAL === overFlowDirection) ? "width" : "height";
46
+ this._resizeObserver = new ResizeObserver(JSUtils.debounce((entries: ResizeObserverEntry[]) => this.handleResize(entries), debounce));
47
+ this._resizeObserver.observe(element);
48
+ this._deltaSize = deltaSize;
49
+ this._notOverFlow = notOverFlow;
50
+ }
51
+
52
+ public addNotOverFlowElement(elementId: string){
53
+ if(!this._notOverFlow.includes(elementId)){
54
+ this._notOverFlow.push(elementId);
55
+ }
56
+ }
57
+
58
+ public destroy(){
59
+ this._resizeObserver.disconnect();
60
+ }
61
+
62
+ public forceUpdate(){
63
+ if(this._lastContainerSize && this._lastContainerInstance){
64
+ this.updateOverFlowedItems(this._lastContainerInstance, this._lastContainerSize);
65
+ }
66
+ }
67
+
68
+ private handleResize(entries: ResizeObserverEntry[]){
69
+ if(!entries || entries.length === 0) return;
70
+
71
+ const container = entries[0];
72
+ const containerSize:number = (container.contentRect as any)[this._propSize];
73
+ if(!containerSize) return;
74
+
75
+ if(this.hasChangedSize(containerSize)){
76
+ this.updateOverFlowedItems(container.target as HTMLElement, containerSize);
77
+ }
78
+ }
79
+
80
+ private updateOverFlowedItems(container: HTMLElement, containerSize: number){
81
+ const children:Element[] = Array.from(container.children);
82
+ this.registerNotOverflowProps(children);
83
+ this.proccessElements(containerSize, children);
84
+ this._lastContainerSize = containerSize;
85
+ this._lastContainerInstance = container;
86
+ }
87
+
88
+ private registerNotOverflowProps(children: Element[]) {
89
+ children.forEach(childElement => {
90
+ const id = childElement.id || this.getDataElementId(childElement);
91
+ if (this.canNotRegisterNotOverFlow(id)) return;
92
+ this._notOverFlowPros.set(id, this.getElementSizeProps(childElement));
93
+ });
94
+ }
95
+
96
+ private canNotRegisterNotOverFlow(id: string) {
97
+ return !id || !this._notOverFlow.includes(id) || this._notOverFlowPros.has(id);
98
+ }
99
+
100
+ private hasChangedSize(elementSize: number):boolean{
101
+ if(!this._lastContainerSize) return true;
102
+ const variation = elementSize - this._lastContainerSize;
103
+
104
+ if(variation < 0){
105
+ const absoluteVariation = Math.abs(variation);
106
+ return (absoluteVariation > this._deltaSize);
107
+ }
108
+
109
+ return variation > 0;
110
+ }
111
+
112
+ private proccessElements(elementSize:number, children:Element[]){
113
+ if(children.length === 0) return;
114
+
115
+ const childrenSize = this.calcChildrenSize(children);
116
+ let diff = Number((elementSize - childrenSize).toFixed(4));
117
+
118
+ if(diff > 0){
119
+ this.clearOverFlow();
120
+ return;
121
+ }
122
+
123
+ this.proccessElementsOverFlow(children, elementSize);
124
+ }
125
+
126
+ private clearOverFlow(){
127
+ this._hiddenItemsProps = new Map();
128
+ this._onResize([]);
129
+ }
130
+
131
+ private proccessElementsOverFlow(allElements:Element[], avaliableSize:number){
132
+ const elementsThatFit: Element[] = [];
133
+ const avaliableSizeConsideringDelta = (avaliableSize - this._deltaSize);
134
+
135
+ let sumElementsSize = 0;
136
+ for (const element of allElements) {
137
+ sumElementsSize += this.calcElementSize(element);
138
+ if(this.exceedsAvaliableSize(sumElementsSize, elementsThatFit, avaliableSizeConsideringDelta)) break;
139
+ elementsThatFit.push(element);
140
+ }
141
+
142
+ const overFlowedElements = allElements.filter(element => this.isElementOverFlowing(elementsThatFit, element));
143
+
144
+ overFlowedElements.forEach(overFlowed => {
145
+ if(!this._hiddenItemsProps.has(overFlowed)){
146
+ this.registerElementSize(overFlowed);
147
+ }
148
+ });
149
+
150
+ this._onResize(overFlowedElements);
151
+ }
152
+
153
+ private isElementOverFlowing(elementsThatFit: Element[], element: Element) {
154
+ return !elementsThatFit.includes(element) && this.canOverFlowElement(element);
155
+ }
156
+
157
+ private canOverFlowElement(element: Element) {
158
+ return !this._notOverFlow.includes(element.id)
159
+ && !this._notOverFlow.includes(this.getDataElementId(element));
160
+ }
161
+
162
+ private getDataElementId(element: Element): string {
163
+ return (element as HTMLElement).getAttribute('data-element-id') ?? "";
164
+ }
165
+
166
+ private exceedsAvaliableSize(sumElementsSize: number, elements: Element[], avaliableSize: number): boolean {
167
+ if(!this._notOverFlow.length) return sumElementsSize > avaliableSize
168
+
169
+ const elementIdsToCalculate = this.canNotOverFlowNotIncludedIds(elements);
170
+ if(!elementIdsToCalculate.length) return sumElementsSize > avaliableSize
171
+
172
+ const variation = this.calculateVariation(elementIdsToCalculate);
173
+ const occupiedSize = sumElementsSize + variation;
174
+ return occupiedSize > avaliableSize;
175
+ }
176
+
177
+ private calculateVariation(elementIdsToCalculate: string[]) {
178
+ let variation = 0
179
+ elementIdsToCalculate.forEach(id => {
180
+ const sizeProps = this._notOverFlowPros.get(id);
181
+ variation += sizeProps?.size ?? 0;
182
+ variation += sizeProps?.margin ?? 0;
183
+ });
184
+ return variation;
185
+ }
186
+
187
+ private canNotOverFlowNotIncludedIds(elements: Element[]): string[]{
188
+ const elementsIdList = elements.map(el => el.id || this.getDataElementId(el)).filter(id => !!id);
189
+ return this._notOverFlow.filter(id => !elementsIdList.includes(id));
190
+ }
191
+
192
+ private registerElementSize(element: Element) {
193
+ const sizeProps = this.getElementSizeProps(element);
194
+ this._hiddenItemsProps.set(element, sizeProps);
195
+ }
196
+
197
+ private getElementSizeProps(element: Element) {
198
+ const sizeProps: SizeProps = {
199
+ size: (element.getBoundingClientRect() as any)[this._propSize],
200
+ margin: calcMarginSize(element, this._scrollDirection),
201
+ };
202
+ return sizeProps;
203
+ }
204
+
205
+ private calcChildrenSize(children:Element[]):number{
206
+ let sumChildren = 0;
207
+ sumChildren += this._deltaSize;
208
+ Array.from(children).forEach(el => sumChildren += this.calcElementSize(el));
209
+ return sumChildren;
210
+ }
211
+
212
+ private calcElementSize(el: Element) {
213
+ let size = 0
214
+ if (this.isOverFlowed(el)) {
215
+ const sizeProps = this._hiddenItemsProps.get(el);
216
+ size += sizeProps?.size ?? 0;
217
+ size += sizeProps?.margin ?? 0;
218
+ return size;
219
+ }
220
+
221
+ size += (el.getBoundingClientRect() as any)[this._propSize];
222
+ size += calcMarginSize(el, this._scrollDirection);
223
+ return size;
224
+ }
225
+
226
+ private isOverFlowed(el: Element) {
227
+ return el.classList.contains(OVERFLOWED_CLASS_NAME);
228
+ }
229
+ }
230
+
231
+ export interface OverFlowWatcherParams {
232
+ element:HTMLElement,
233
+ callback:OnOverflowCallBack,
234
+ overFlowDirection?:OverflowDirection,
235
+ deltaSize?:number,
236
+ debounce?: number,
237
+ notOverFlow?: string[]
238
+ }
239
+
240
+ interface SizeProps {
241
+ size: number,
242
+ margin: number,
243
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Callback que será chamado quando o overflow de um elemento for alterado.
3
+ *
4
+ * @param elementsOverFlow - Conjunto de elementos filhos que estão causando overflow no elemento pai.
5
+ */
6
+ export type OnOverflowCallBack = (elementsOverFlow:Array<Element>) => void;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Define em qual direção o overflow será observado
3
+ */
4
+ export enum OverflowDirection {
5
+ 'VERTICAL',
6
+ 'HORIZONTAL'
7
+ }
@@ -0,0 +1,34 @@
1
+ import { calcMarginSize } from '../../src/utils/ElementUtils';
2
+ import { OverflowDirection } from '../../src';
3
+
4
+ describe('calcMarginSize', () => {
5
+ it('should calculate correctly the size of horizontal margin', () => {
6
+ const element = document.createElement('div');
7
+ element.style.marginLeft = '10px';
8
+ element.style.marginRight = '15px';
9
+ document.body.appendChild(element);
10
+
11
+ const size = calcMarginSize(element, OverflowDirection.HORIZONTAL);
12
+ expect(size).toBe(25);
13
+ });
14
+
15
+ it('should calculate correctly the size of vertical margin', () => {
16
+ const element = document.createElement('div');
17
+ element.style.marginTop = '5px';
18
+ element.style.marginBottom = '20px';
19
+ document.body.appendChild(element);
20
+
21
+ const size = calcMarginSize(element, OverflowDirection.VERTICAL);
22
+ expect(size).toBe(25);
23
+ });
24
+
25
+ it('should threat values defined as zero', () => {
26
+ const element = document.createElement('div');
27
+ document.body.appendChild(element);
28
+
29
+ const horizontalSize = calcMarginSize(element, OverflowDirection.HORIZONTAL);
30
+ const verticalSize = calcMarginSize(element, OverflowDirection.VERTICAL);
31
+ expect(horizontalSize).toBe(0);
32
+ expect(verticalSize).toBe(0);
33
+ });
34
+ });
@@ -0,0 +1,152 @@
1
+ import OverflowWatcher, { OverFlowWatcherParams, OverflowDirection, OVERFLOWED_CLASS_NAME } from '../../src/utils/OverflowWatcher';
2
+
3
+ describe('OverflowWatcher', () => {
4
+ let mockElement: HTMLElement;
5
+ let mockCallback: jest.Mock;
6
+ let watcherInstance: OverflowWatcher;
7
+
8
+ beforeEach(() => {
9
+ mockElement = document.createElement('div');
10
+ Object.defineProperty(mockElement, 'clientWidth', { value: 90, configurable: true });
11
+ document.body.appendChild(mockElement);
12
+ mockCallback = jest.fn();
13
+
14
+ const params: OverFlowWatcherParams = {
15
+ element: mockElement,
16
+ callback: mockCallback,
17
+ overFlowDirection: OverflowDirection.HORIZONTAL,
18
+ debounce: 1,
19
+ deltaSize: 1,
20
+ notOverFlow: ['testId'],
21
+ };
22
+
23
+ watcherInstance = new OverflowWatcher(params);
24
+ mockElement.getBoundingClientRect = jest.fn().mockReturnValue(getMockedRectClientValue(200));
25
+ setPrivateField(watcherInstance, '_lastContainerSize', 100);
26
+ setPrivateField(watcherInstance, '_lastContainerInstance', mockElement);
27
+ });
28
+
29
+ afterEach(() => {
30
+ watcherInstance.destroy();
31
+ });
32
+
33
+ it('should initialize with provided parameters', () => {
34
+ expect(watcherInstance).toBeDefined();
35
+ });
36
+
37
+ it('should disconect ResizeObserver when destroy is called', () => {
38
+ const disconnectSpy = jest.spyOn(ResizeObserver.prototype, 'disconnect');
39
+ watcherInstance.destroy();
40
+ expect(disconnectSpy).toHaveBeenCalled();
41
+ });
42
+
43
+ it('Should call callback on forceUpdate', () => {
44
+ appendMockedChildren(mockElement);
45
+ watcherInstance.forceUpdate();
46
+ expect(mockCallback).toHaveBeenCalled();
47
+ });
48
+
49
+ it('Should call callback on forceUpdate with childSpan', () => {
50
+ appendMockedChildren(mockElement);
51
+ watcherInstance.forceUpdate();
52
+
53
+ const childSpan = mockElement.children[1];
54
+ expect(mockCallback).toHaveBeenCalledWith(expect.arrayContaining([childSpan]));
55
+ });
56
+
57
+ it('Should call callback on forceUpdate with childSpan when notOverFlow is empty', () => {
58
+ appendMockedChildren(mockElement);
59
+
60
+ const params: OverFlowWatcherParams = {
61
+ element: mockElement,
62
+ callback: mockCallback,
63
+ overFlowDirection: OverflowDirection.HORIZONTAL,
64
+ debounce: 1,
65
+ deltaSize: 1,
66
+ };
67
+
68
+ const withNoOverFlow = new OverflowWatcher(params);
69
+ setPrivateField(withNoOverFlow, '_lastContainerSize', 100);
70
+ setPrivateField(withNoOverFlow, '_lastContainerInstance', mockElement);
71
+
72
+ withNoOverFlow.forceUpdate();
73
+
74
+ const childSpan = mockElement.children[1];
75
+ expect(mockCallback).toHaveBeenCalledWith(expect.arrayContaining([childSpan]));
76
+ });
77
+
78
+ it('Should call callback on forceUpdate with childSpan considering overflowed elements', () => {
79
+ appendMockedChildren(mockElement);
80
+ const childButton = mockElement.children[0];
81
+ const childSpan = mockElement.children[1];
82
+ childSpan.classList.add(OVERFLOWED_CLASS_NAME);
83
+
84
+ const hiddemItemsMock: Map<Element, {size: number, margin: number}> = new Map();
85
+ hiddemItemsMock.set(childSpan, {size: 50, margin: 0});
86
+ hiddemItemsMock.set(childButton, {size: 0, margin: 50});
87
+ setPrivateField(watcherInstance, '_hiddenItemsProps', hiddemItemsMock);
88
+
89
+ watcherInstance.forceUpdate();
90
+
91
+ expect(mockCallback).toHaveBeenCalledWith(expect.arrayContaining([childSpan]));
92
+ });
93
+
94
+ it('Should call callback on forceUpdate with empty list', () => {
95
+ appendMockedChildren(mockElement);
96
+ setPrivateField(watcherInstance, '_lastContainerSize', 200);
97
+ watcherInstance.forceUpdate();
98
+ const childButton = mockElement.children[0];
99
+ const childSpan = mockElement.children[1];
100
+
101
+ expect(mockCallback).not.toHaveBeenCalledWith(expect.arrayContaining([childButton, childSpan]));
102
+ });
103
+
104
+ it('should ignore elements that can not overflow', () => {
105
+ appendMockedChildren(mockElement);
106
+
107
+ const notOverflowElement = document.createElement('div');
108
+ notOverflowElement.setAttribute('data-element-id', 'testId') ;
109
+ notOverflowElement.getBoundingClientRect = jest.fn().mockReturnValue(getMockedRectClientValue(50));
110
+
111
+ const notOverflowElement2 = document.createElement('div');
112
+ notOverflowElement2.setAttribute('data-element-id', 'testId2') ;
113
+ notOverflowElement2.getBoundingClientRect = jest.fn().mockReturnValue(getMockedRectClientValue(50));
114
+
115
+ mockElement.appendChild(notOverflowElement);
116
+ mockElement.appendChild(notOverflowElement2);
117
+
118
+ watcherInstance.addNotOverFlowElement('testId');
119
+ watcherInstance.addNotOverFlowElement('testId2');
120
+
121
+ watcherInstance.forceUpdate();
122
+
123
+ expect(mockCallback).not.toHaveBeenCalledWith(expect.arrayContaining([notOverflowElement]));
124
+ });
125
+
126
+ it('Should not call callback on forceUpdate', () => {
127
+ watcherInstance.forceUpdate();
128
+ expect(mockCallback).not.toHaveBeenCalled();
129
+ });
130
+
131
+ });
132
+
133
+ function appendMockedChildren(mockElement: HTMLElement) {
134
+ const chilldButton = document.createElement('button');
135
+ const childSpan = document.createElement('span');
136
+
137
+ chilldButton.getBoundingClientRect = jest.fn().mockReturnValue(getMockedRectClientValue(50));
138
+ childSpan.getBoundingClientRect = jest.fn().mockReturnValue(getMockedRectClientValue(50));
139
+
140
+ mockElement.appendChild(chilldButton);
141
+ mockElement.appendChild(childSpan);
142
+ }
143
+
144
+ function getMockedRectClientValue(size: number) {
145
+ return {
146
+ x: 0, y: 0, width: size, height: 10, top: 0, right: 0, bottom: 0, left: 0, toJSON: () => {}
147
+ };
148
+ }
149
+
150
+ function setPrivateField<T>(instance: T, fieldName: string, value: any): void {
151
+ (instance as any)[fieldName] = value;
152
+ }
package/.docs/.nojekyll DELETED
@@ -1 +0,0 @@
1
- TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false.