@sankhyalabs/core 7.1.0-dev.6 → 7.1.0-dev.8

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.
@@ -14,6 +14,7 @@
14
14
  * | U | Qualquer letra. Transforma letras minúsculas em maiúsculas. |
15
15
  * | L | Qualquer letra. Transforma letras maiúsculas em minúsculas. |
16
16
  * | A | Qualquer letra ou número. |
17
+ * | Z | Qualquer letra ou número. Transforma letras minúsculas em maiúsculas. |
17
18
  * | ? | Qualquer letra. Preserva maiúsculas e minúsculas. |
18
19
  * | * | Qualquer caractere. |
19
20
  *
@@ -34,14 +35,14 @@
34
35
  * resultaria na string '123-____'.
35
36
  *
36
37
  * ##Veja mais alguns exemplos:
37
- * |Padrão |Máscara |Entrada |Saída |
38
- * |----------------|------------------|--------------|------------------|
39
- * |Telefone |(##) ####-#### |3432192515 |(34) 3219-2515 |
40
- * |CPF |###.###.###-## |12345678901 |123.456.789-01 |
41
- * |CNPJ |##.###.###/####-##|12345678901234|12.345.678/9012-34|
42
- * |CEP |##.###-### |12345678 |12.345-678 |
43
- * |PLACA (veículo) |UUU-#### |abc1234 |ABC-1234 |
44
- * |Cor RGB |'#AAAAAA |00000F0 |#0000F0 |
38
+ * |Padrão |Máscara |Entrada |Saída |
39
+ * |----------------|------------------|--------------|-------------------|
40
+ * |Telefone |(##) ####-#### |3432192515 |(34) 3219-2515 |
41
+ * |CPF |###.###.###-## |12345678901 |123.456.789-01 |
42
+ * |CNPJ |ZZ.ZZZ.ZZZ/ZZZZ-##|1a3B5c7D9e1F31|1A.3B5.C7D9/E1F3-31|
43
+ * |CEP |##.###-### |12345678 |12.345-678 |
44
+ * |PLACA (veículo) |UUU-#### |abc1234 |ABC-1234 |
45
+ * |Cor RGB |'#AAAAAA |00000F0 |#0000F0 |
45
46
  *
46
47
  */
47
48
  export class MaskFormatter {
@@ -51,11 +52,12 @@ export class MaskFormatter {
51
52
  private static UPPERCASE_KEY: string = "U";
52
53
  private static LOWERCASE_KEY: string = "L";
53
54
  private static ALPHA_NUMERIC_KEY: string = "A";
55
+ private static ALPHA_NUMERIC_UPPERCASE_KEY: string = "Z";
54
56
  private static CHARACTER_KEY: string = "?";
55
57
  private static ANYTHING_KEY: string = "*";
56
58
 
57
59
  public static DEFAULT_MASKS: any = {
58
- "cnpj": "##.###.###/####-##",
60
+ "cnpj": "ZZ.ZZZ.ZZZ/ZZZZ-##",
59
61
  "cpf": "###.###.###-##",
60
62
  "phone": "(##) ####-####",
61
63
  "phone_mobile": "(##) #####-####",
@@ -124,7 +126,7 @@ export class MaskFormatter {
124
126
  if (value === expectedFormattedValue) {
125
127
  return value;
126
128
  }
127
- const maskPlaceholders = this.mask.match(/[UAL#?*']/g) || [];
129
+ const maskPlaceholders = this.mask.match(/[UAZL#?*']/g) || [];
128
130
  const placeholderCount = maskPlaceholders.length;
129
131
 
130
132
  const validValue = value.split('').filter((char, index) => {
@@ -140,6 +142,8 @@ export class MaskFormatter {
140
142
  return /[a-zA-Z]/.test(char);
141
143
  case MaskFormatter.ALPHA_NUMERIC_KEY:
142
144
  return /[a-zA-Z0-9]/.test(char);
145
+ case MaskFormatter.ALPHA_NUMERIC_UPPERCASE_KEY:
146
+ return /[A-Z0-9]/.test(char);
143
147
  case MaskFormatter.CHARACTER_KEY:
144
148
  return /[a-zA-Z]/.test(char);
145
149
  case MaskFormatter.ANYTHING_KEY:
@@ -237,6 +241,9 @@ export class MaskFormatter {
237
241
  case MaskFormatter.ALPHA_NUMERIC_KEY:
238
242
  this._maskChars.push(new MaskFormatter.AlphaNumericCharacter(this, maskChar));
239
243
  break;
244
+ case MaskFormatter.ALPHA_NUMERIC_UPPERCASE_KEY:
245
+ this._maskChars.push(new MaskFormatter.AlphaNumericUpperCaseCharacter(this, maskChar));
246
+ break;
240
247
  case MaskFormatter.CHARACTER_KEY:
241
248
  this._maskChars.push(new MaskFormatter.CharCharacter(this, maskChar));
242
249
  break;
@@ -361,6 +368,7 @@ export class MaskFormatter {
361
368
  message = 'um número';
362
369
  break;
363
370
  case MaskFormatter.ALPHA_NUMERIC_KEY:
371
+ case MaskFormatter.ALPHA_NUMERIC_UPPERCASE_KEY:
364
372
  message = 'uma letra ou um número';
365
373
  break;
366
374
  default:
@@ -478,6 +486,24 @@ export class MaskFormatter {
478
486
  }
479
487
  }
480
488
 
489
+ private static AlphaNumericUpperCaseCharacter = class extends MaskFormatter.MaskCharacter {
490
+
491
+ /**
492
+ * Valida se a string é uma letra do alfabeto (A-Z) ou um numero entre zero e nove.
493
+ *
494
+ * @param aChar - String passada para validação.
495
+ * @returns - Verdadeiro se a string passada for uma letra do alfabeto ou um numeral (de 0 a 9).
496
+ */
497
+ public isValidCharacter(aChar: string): boolean {
498
+ //FIXME: talvez seja problema usar regex aqui... avaliar se existe forma mais barata.
499
+ return (/[a-zA-Z0-9]/.test(aChar)) && super.isValidCharacter(aChar);
500
+ }
501
+
502
+ public getChar(aChar: string): string {
503
+ return aChar.toLocaleUpperCase();
504
+ }
505
+ }
506
+
481
507
  private static CharCharacter = class extends MaskFormatter.MaskCharacter {
482
508
  /**
483
509
  * Valida se a string é uma letra do alfabeto (a-z).
@@ -9,236 +9,295 @@ export * from "./types/overflow-callback.js";
9
9
  export const OVERFLOWED_CLASS_NAME = 'overflowed';
10
10
 
11
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;
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);
50
55
  }
56
+ }
51
57
 
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
- }
58
+ public destroy(){
59
+ this._resizeObserver.disconnect();
60
+ }
61
61
 
62
- public forceUpdate(){
63
- if(this._lastContainerSize && this._lastContainerInstance){
64
- this.updateOverFlowedItems(this._lastContainerInstance, this._lastContainerSize);
65
- }
62
+ public forceUpdate(){
63
+ if(this._lastContainerSize && this._lastContainerInstance){
64
+ this.updateOverFlowedItems(this._lastContainerInstance, this._lastContainerSize);
66
65
  }
66
+ }
67
67
 
68
- private handleResize(entries: ResizeObserverEntry[]){
69
- if(!entries || entries.length === 0) return;
68
+ private handleResize(entries: ResizeObserverEntry[]){
69
+ if(!entries || entries.length === 0) return;
70
70
 
71
- const container = entries[0];
72
- const containerSize:number = (container.contentRect as any)[this._propSize];
73
- if(!containerSize) return;
71
+ const container = entries[0];
72
+ const containerSize:number = (container.contentRect as any)[this._propSize];
73
+ if(!containerSize) return;
74
74
 
75
- if(this.hasChangedSize(containerSize)){
76
- this.updateOverFlowedItems(container.target as HTMLElement, containerSize);
77
- }
75
+ if(this.hasChangedSize(containerSize)){
76
+ this.updateOverFlowedItems(container.target as HTMLElement, containerSize);
78
77
  }
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;
78
+ }
79
+
80
+ private updateOverFlowedItems(container: HTMLElement, containerSize: number){
81
+ const children:Element[] = this.getProcessableElements(container);
82
+ this.registerNotOverflowProps(children);
83
+ this.proccessElements(containerSize, children);
84
+ this._lastContainerSize = containerSize;
85
+ this._lastContainerInstance = container;
86
+ }
87
+
88
+ private getProcessableElements(container: HTMLElement): Element[] {
89
+ const directChildren = Array.from(container.children);
90
+ const processableElements: Element[] = [];
91
+
92
+ for (const child of directChildren) {
93
+ if (child.classList.contains('taskbar-group')) {
94
+ processableElements.push(...Array.from(child.children));
95
+ } else {
96
+ processableElements.push(child);
97
+ }
86
98
  }
87
99
 
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
- }
100
+ return processableElements;
101
+ }
95
102
 
96
- private canNotRegisterNotOverFlow(id: string) {
97
- return !id || !this._notOverFlow.includes(id);
98
- }
103
+ private registerNotOverflowProps(children: Element[]) {
104
+ children.forEach(childElement => {
105
+ const id = childElement.id || this.getDataElementId(childElement);
106
+ if (this.canNotRegisterNotOverFlow(id)) return;
107
+ this._notOverFlowPros.set(id, this.getElementSizeProps(childElement));
108
+ });
109
+ }
99
110
 
100
- private hasChangedSize(elementSize: number):boolean{
101
- if(!this._lastContainerSize) return true;
102
- const variation = elementSize - this._lastContainerSize;
111
+ private canNotRegisterNotOverFlow(id: string) {
112
+ return !id || !this._notOverFlow.includes(id);
113
+ }
103
114
 
104
- if(variation < 0){
105
- const absoluteVariation = Math.abs(variation);
106
- return (absoluteVariation > this._deltaSize);
107
- }
115
+ private hasChangedSize(elementSize: number):boolean{
116
+ if(!this._lastContainerSize) return true;
117
+ const variation = elementSize - this._lastContainerSize;
108
118
 
109
- return variation > 0;
119
+ if(variation < 0){
120
+ const absoluteVariation = Math.abs(variation);
121
+ return (absoluteVariation > this._deltaSize);
110
122
  }
111
123
 
112
- private proccessElements(elementSize:number, children:Element[]){
113
- if(children.length === 0) return;
124
+ return variation > 0;
125
+ }
114
126
 
115
- const childrenSize = this.calcChildrenSize(children);
116
- let diff = Number((elementSize - childrenSize).toFixed(4));
127
+ private proccessElements(elementSize:number, children:Element[]){
128
+ if(children.length === 0) return;
117
129
 
118
- if(diff > 0){
119
- this.clearOverFlow();
120
- return;
121
- }
130
+ const childrenSize = this.calcChildrenSize(children);
131
+ let diff = Number((elementSize - childrenSize).toFixed(4));
122
132
 
123
- this.proccessElementsOverFlow(children, elementSize);
133
+ if(diff > 0){
134
+ this.clearOverFlow();
135
+ return;
124
136
  }
125
137
 
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;
138
+ this.proccessElementsOverFlow(children, elementSize);
139
+ }
136
140
 
137
- for (const element of allElements) {
138
- sumElementsSize += this.calcElementSize(element);
139
- if(this.exceedsAvaliableSize(sumElementsSize, elementsThatFit, avaliableSizeConsideringDelta)) break;
140
- elementsThatFit.push(element);
141
- }
141
+ private clearOverFlow(){
142
+ this._hiddenItemsProps = new Map();
143
+ this._onResize([]);
144
+ }
142
145
 
143
- const overFlowedElements = allElements.filter(element => this.isElementOverFlowing(elementsThatFit, element));
146
+ private proccessElementsOverFlow(allElements:Element[], avaliableSize:number){
147
+ const elementsThatFit: Element[] = [];
148
+ const avaliableSizeConsideringDelta = (avaliableSize - this._deltaSize);
144
149
 
145
- overFlowedElements.forEach(overFlowed => {
146
- if(!this._hiddenItemsProps.has(overFlowed)){
147
- this.registerElementSize(overFlowed);
148
- }
149
- });
150
+ let sumElementsSize = 0;
150
151
 
151
- this._onResize(overFlowedElements);
152
+ for (const element of allElements) {
153
+ sumElementsSize += this.calcElementSize(element);
154
+ if(this.exceedsAvaliableSize(sumElementsSize, elementsThatFit, avaliableSizeConsideringDelta)) break;
155
+ elementsThatFit.push(element);
152
156
  }
153
157
 
154
- private isElementOverFlowing(elementsThatFit: Element[], element: Element) {
155
- return !elementsThatFit.includes(element) && this.canOverFlowElement(element);
158
+ const overFlowedElements = allElements.filter(element => this.isElementOverFlowing(elementsThatFit, element));
159
+
160
+ overFlowedElements.forEach(overFlowed => {
161
+ if(!this._hiddenItemsProps.has(overFlowed)){
162
+ this.registerElementSize(overFlowed);
163
+ }
164
+ });
165
+
166
+ this._onResize(overFlowedElements);
167
+ }
168
+
169
+ private isElementOverFlowing(elementsThatFit: Element[], element: Element) {
170
+ return !elementsThatFit.includes(element) && this.canOverFlowElement(element);
171
+ }
172
+
173
+ private canOverFlowElement(element: Element) {
174
+ return !this._notOverFlow.includes(element.id)
175
+ && !this._notOverFlow.includes(this.getDataElementId(element));
176
+ }
177
+
178
+ private getDataElementId(element: Element): string {
179
+ return (element as HTMLElement).getAttribute('data-element-id') ?? "";
180
+ }
181
+
182
+ private exceedsAvaliableSize(sumElementsSize: number, elements: Element[], avaliableSize: number): boolean {
183
+ if(!this._notOverFlow.length) return sumElementsSize > avaliableSize
184
+
185
+ const elementIdsToCalculate = this.canNotOverFlowNotIncludedIds(elements);
186
+ if(!elementIdsToCalculate.length) return sumElementsSize > avaliableSize
187
+
188
+ const variation = this.calculateVariation(elementIdsToCalculate);
189
+ const occupiedSize = sumElementsSize + variation;
190
+ return occupiedSize > avaliableSize;
191
+ }
192
+
193
+ private calculateVariation(elementIdsToCalculate: string[]) {
194
+ let variation = 0
195
+ elementIdsToCalculate.forEach(id => {
196
+ const sizeProps = this._notOverFlowPros.get(id);
197
+ variation += sizeProps?.size ?? 0;
198
+ variation += sizeProps?.margin ?? 0;
199
+ });
200
+ return variation;
201
+ }
202
+
203
+ private canNotOverFlowNotIncludedIds(elements: Element[]): string[]{
204
+ const elementsIdList = elements.map(el => el.id || this.getDataElementId(el)).filter(id => !!id);
205
+ return this._notOverFlow.filter(id => !elementsIdList.includes(id));
206
+ }
207
+
208
+ private registerElementSize(element: Element) {
209
+ const sizeProps = this.getElementSizeProps(element);
210
+ this._hiddenItemsProps.set(element, sizeProps);
211
+ }
212
+
213
+ private getElementSizeProps(element: Element) {
214
+ const sizeProps: SizeProps = {
215
+ size: (element.getBoundingClientRect() as any)[this._propSize],
216
+ margin: calcMarginSize(element, this._scrollDirection),
217
+ };
218
+ return sizeProps;
219
+ }
220
+
221
+ private calcChildrenSize(children:Element[]):number{
222
+ let sumChildren = 0;
223
+ sumChildren += this._deltaSize;
224
+
225
+ // Agrupa os elementos por container pai
226
+ const elementsByContainer = this.groupElementsByContainer(children);
227
+
228
+ // Calcula o tamanho considerando os containers
229
+ for (const [container, elements] of elementsByContainer) {
230
+ if (container && container.classList.contains('taskbar-group')) {
231
+ // Se é um grupo da taskbar, adiciona o tamanho do container mais os elementos
232
+ sumChildren += this.calcContainerSize(container);
233
+ elements.forEach(el => sumChildren += this.calcElementSize(el));
234
+ } else {
235
+ // Se não é um grupo, adiciona apenas o tamanho dos elementos
236
+ elements.forEach(el => sumChildren += this.calcElementSize(el));
237
+ }
156
238
  }
157
239
 
158
- private canOverFlowElement(element: Element) {
159
- return !this._notOverFlow.includes(element.id)
160
- && !this._notOverFlow.includes(this.getDataElementId(element));
161
- }
162
-
163
- private getDataElementId(element: Element): string {
164
- return (element as HTMLElement).getAttribute('data-element-id') ?? "";
165
- }
240
+ return sumChildren;
241
+ }
166
242
 
167
- private exceedsAvaliableSize(sumElementsSize: number, elements: Element[], avaliableSize: number): boolean {
168
- if(!this._notOverFlow.length) return sumElementsSize > avaliableSize
243
+ private groupElementsByContainer(elements: Element[]): Map<Element | null, Element[]> {
244
+ const grouped = new Map<Element | null, Element[]>();
169
245
 
170
- const elementIdsToCalculate = this.canNotOverFlowNotIncludedIds(elements);
171
- if(!elementIdsToCalculate.length) return sumElementsSize > avaliableSize
172
-
173
- const variation = this.calculateVariation(elementIdsToCalculate);
174
- const occupiedSize = sumElementsSize + variation;
175
- return occupiedSize > avaliableSize;
176
- }
177
-
178
- private calculateVariation(elementIdsToCalculate: string[]) {
179
- let variation = 0
180
- elementIdsToCalculate.forEach(id => {
181
- const sizeProps = this._notOverFlowPros.get(id);
182
- variation += sizeProps?.size ?? 0;
183
- variation += sizeProps?.margin ?? 0;
184
- });
185
- return variation;
246
+ for (const element of elements) {
247
+ const container = element.parentElement;
248
+ if (!grouped.has(container)) {
249
+ grouped.set(container, []);
250
+ }
251
+ grouped.get(container)!.push(element);
186
252
  }
187
253
 
188
- private canNotOverFlowNotIncludedIds(elements: Element[]): string[]{
189
- const elementsIdList = elements.map(el => el.id || this.getDataElementId(el)).filter(id => !!id);
190
- return this._notOverFlow.filter(id => !elementsIdList.includes(id));
254
+ return grouped;
255
+ }
256
+
257
+ private calcContainerSize(container: Element): number {
258
+ const rect = container.getBoundingClientRect();
259
+ const elementSize = rect[this._propSize as keyof DOMRect] as number;
260
+ const marginSize = calcMarginSize(container, this._scrollDirection);
261
+
262
+ // Subtrai o tamanho dos filhos para não contar em duplicidade
263
+ let childrenSize = 0;
264
+ Array.from(container.children).forEach(child => {
265
+ const childRect = child.getBoundingClientRect();
266
+ childrenSize += childRect[this._propSize as keyof DOMRect] as number;
267
+ });
268
+
269
+ return Math.max(0, elementSize - childrenSize) + marginSize;
270
+ }
271
+
272
+ private calcElementSize(el: Element) {
273
+ let size = 0
274
+ if (this.isOverFlowed(el)) {
275
+ const sizeProps = this._hiddenItemsProps.get(el);
276
+ size += sizeProps?.size ?? 0;
277
+ size += sizeProps?.margin ?? 0;
278
+ return size;
191
279
  }
192
280
 
193
- private registerElementSize(element: Element) {
194
- const sizeProps = this.getElementSizeProps(element);
195
- this._hiddenItemsProps.set(element, sizeProps);
196
- }
197
-
198
- private getElementSizeProps(element: Element) {
199
- const sizeProps: SizeProps = {
200
- size: (element.getBoundingClientRect() as any)[this._propSize],
201
- margin: calcMarginSize(element, this._scrollDirection),
202
- };
203
- return sizeProps;
204
- }
281
+ size += (el.getBoundingClientRect() as any)[this._propSize];
282
+ size += calcMarginSize(el, this._scrollDirection);
283
+ return size;
284
+ }
205
285
 
206
- private calcChildrenSize(children:Element[]):number{
207
- let sumChildren = 0;
208
- sumChildren += this._deltaSize;
209
- Array.from(children).forEach(el => sumChildren += this.calcElementSize(el));
210
- return sumChildren;
211
- }
212
-
213
- private calcElementSize(el: Element) {
214
- let size = 0
215
- if (this.isOverFlowed(el)) {
216
- const sizeProps = this._hiddenItemsProps.get(el);
217
- size += sizeProps?.size ?? 0;
218
- size += sizeProps?.margin ?? 0;
219
- return size;
220
- }
221
-
222
- size += (el.getBoundingClientRect() as any)[this._propSize];
223
- size += calcMarginSize(el, this._scrollDirection);
224
- return size;
225
- }
226
-
227
- private isOverFlowed(el: Element) {
228
- return el.classList.contains(OVERFLOWED_CLASS_NAME);
229
- }
286
+ private isOverFlowed(el: Element) {
287
+ return el.classList.contains(OVERFLOWED_CLASS_NAME);
288
+ }
230
289
  }
231
290
 
232
291
  export interface OverFlowWatcherParams {
233
- element:HTMLElement,
234
- callback:OnOverflowCallBack,
235
- overFlowDirection?:OverflowDirection,
236
- deltaSize?:number,
237
- debounce?: number,
238
- notOverFlow?: string[]
292
+ element:HTMLElement,
293
+ callback:OnOverflowCallBack,
294
+ overFlowDirection?:OverflowDirection,
295
+ deltaSize?:number,
296
+ debounce?: number,
297
+ notOverFlow?: string[]
239
298
  }
240
299
 
241
300
  interface SizeProps {
242
- size: number,
243
- margin: number,
301
+ size: number,
302
+ margin: number,
244
303
  }