@sankhyalabs/ezui 3.0.4 → 3.1.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.
@@ -1,20 +1,231 @@
1
1
  import { h } from '@stencil/core';
2
- import { ElementIDUtils } from '@sankhyalabs/core';
2
+ import { ElementIDUtils, JSUtils } from '@sankhyalabs/core';
3
+ import { BreadcrumbItem } from './subcomponents/breadcrumb-item';
3
4
  export class EzBreadcrumb {
4
5
  constructor() {
6
+ this._ellipsesPositionedEnd = false;
7
+ this._renderSecond = false;
8
+ this.INDEX_ITEM_TO_REMOVE = 1; // sempre removemos o segundo item.
9
+ this.CHEVRON_SIZE = 28;
10
+ this.handleShowDropdown = (newState) => {
11
+ this.showDropdown = newState;
12
+ };
5
13
  this.items = [];
14
+ this.fillMode = "auto";
15
+ this.maxItems = 4;
16
+ this.positionEllipsis = 1;
17
+ this.visibleItems = undefined;
18
+ this.hiddenItems = [];
19
+ this.showDropdown = false;
20
+ this.collapseConfigPosition = -1;
21
+ }
22
+ watchPropHandler() {
23
+ this.fillMode === "auto" && this.handleResize();
24
+ }
25
+ watchPropHiddenItems() {
26
+ if (this.fillMode === 'auto') {
27
+ this.collapseConfigPosition = this.hiddenItems.length > 0 ? 1 : -1;
28
+ }
29
+ }
30
+ componentDidUpdate() {
31
+ this.positionDropdown();
32
+ this.setEvents();
33
+ }
34
+ componentWillLoad() {
35
+ this.visibleItems = [...this.items];
36
+ if (this.fillMode === 'regular') {
37
+ this.configModeRegular();
38
+ }
39
+ else if (this.fillMode === 'auto') {
40
+ this.startResize();
41
+ }
42
+ this.setEvents();
43
+ }
44
+ closeDropdown(evt) {
45
+ const target = evt === null || evt === void 0 ? void 0 : evt.target;
46
+ if (target == undefined) {
47
+ return;
48
+ }
49
+ if (target !== this._element.shadowRoot.querySelector(".ellipses__item")) {
50
+ this.showDropdown = false;
51
+ }
52
+ }
53
+ setEvents() {
54
+ document.removeEventListener("click", this.closeDropdown.bind(this));
55
+ document.addEventListener("click", this.closeDropdown.bind(this));
56
+ document.removeEventListener("scroll", this.positionDropdown.bind(this));
57
+ document.addEventListener("scroll", this.positionDropdown.bind(this));
6
58
  }
7
59
  componentDidLoad() {
8
60
  ElementIDUtils.addIDInfo(this._element);
9
61
  }
10
- handleItemClick(itemSelected) {
11
- this.ezClick.emit(itemSelected);
62
+ componentDidRender() {
63
+ if (this.fillMode === 'auto') {
64
+ this.configResize();
65
+ }
66
+ }
67
+ configResize() {
68
+ if (this._resizeObserver != undefined) {
69
+ this._resizeObserver.unobserve(this._element.parentElement);
70
+ }
71
+ this._resizeObserver = new ResizeObserver(JSUtils.debounce(this.handleResize.bind(this), 200));
72
+ this._resizeObserver.observe(this._element.parentElement);
73
+ }
74
+ handleResize() {
75
+ const ELLIPSIS_SIZE = 39;
76
+ if (!this._renderSecond) {
77
+ this._renderSecond = true;
78
+ return;
79
+ }
80
+ let { offsetWidth } = this._element.parentElement;
81
+ let sumVisibleItems = 0;
82
+ this.visibleItems.forEach(item => sumVisibleItems += item.width);
83
+ //Se existe o ellipsis, devemos cconsidera-lo no calculo
84
+ const offset = this.collapseConfigPosition > -1 ? ELLIPSIS_SIZE : 0;
85
+ if (offsetWidth < sumVisibleItems + offset) {
86
+ this.handleCollapse(offsetWidth, sumVisibleItems);
87
+ }
88
+ else if (offsetWidth >= sumVisibleItems + offset) {
89
+ this.handleExpand(offsetWidth);
90
+ }
91
+ }
92
+ handleCollapse(containerWidth, itemsWidth) {
93
+ const MIN_VISIBLE_ITEMS = 2;
94
+ if (this.visibleItems.length <= MIN_VISIBLE_ITEMS) {
95
+ return;
96
+ }
97
+ let tmpVisibleItems = [...this.visibleItems];
98
+ let tmpHiddenItems = [...this.hiddenItems];
99
+ let secondItem = tmpVisibleItems[this.INDEX_ITEM_TO_REMOVE];
100
+ let hasChange = false;
101
+ while (tmpVisibleItems.length > MIN_VISIBLE_ITEMS &&
102
+ secondItem != undefined &&
103
+ itemsWidth > containerWidth) {
104
+ hasChange = true;
105
+ tmpVisibleItems = tmpVisibleItems.filter((_, index) => index !== this.INDEX_ITEM_TO_REMOVE);
106
+ tmpHiddenItems = [...tmpHiddenItems, secondItem];
107
+ itemsWidth -= secondItem.width;
108
+ secondItem = tmpVisibleItems[this.INDEX_ITEM_TO_REMOVE];
109
+ }
110
+ if (hasChange) {
111
+ this.visibleItems = tmpVisibleItems;
112
+ this.hiddenItems = tmpHiddenItems;
113
+ this.showDropdown = false;
114
+ }
115
+ }
116
+ handleExpand(containerWidth) {
117
+ if (!this.hiddenItems.length) {
118
+ return;
119
+ }
120
+ let widthFreeZone = Math.abs(this._elBreadcrumbList.offsetWidth - containerWidth);
121
+ let tmpVisibleItems = [...this.visibleItems];
122
+ let tmpHiddenItems = [...this.hiddenItems];
123
+ let lastHiddenElement = tmpHiddenItems[tmpHiddenItems.length - 1];
124
+ let hasChange = false;
125
+ while (lastHiddenElement && widthFreeZone >= lastHiddenElement.width) {
126
+ widthFreeZone -= lastHiddenElement.width;
127
+ tmpHiddenItems.pop();
128
+ tmpVisibleItems.splice(this.INDEX_ITEM_TO_REMOVE, 0, lastHiddenElement);
129
+ lastHiddenElement = tmpHiddenItems[tmpHiddenItems.length - 1];
130
+ hasChange = true;
131
+ }
132
+ if (hasChange) {
133
+ this.visibleItems = tmpVisibleItems;
134
+ this.hiddenItems = tmpHiddenItems;
135
+ this.showDropdown = false;
136
+ }
137
+ }
138
+ configModeRegular() {
139
+ if (this.visibleItems.length > this.maxItems) {
140
+ const amountsItemsToHide = Math.abs(this.visibleItems.length - this.maxItems);
141
+ if (this.positionEllipsis === 0) {
142
+ const itemsToTransfer = this.visibleItems.slice(0, amountsItemsToHide);
143
+ this.hiddenItems.push(...itemsToTransfer);
144
+ this.visibleItems.splice(0, amountsItemsToHide);
145
+ }
146
+ else if (this.positionEllipsis >= this.maxItems) {
147
+ const itemsToTransfer = this.visibleItems.slice(this.maxItems);
148
+ this.hiddenItems.push(...itemsToTransfer);
149
+ this.visibleItems.splice(this.maxItems);
150
+ this._ellipsesPositionedEnd = true;
151
+ }
152
+ else {
153
+ const removedItems = this.visibleItems.splice(this.positionEllipsis, amountsItemsToHide);
154
+ this.hiddenItems.push(...removedItems);
155
+ }
156
+ this.collapseConfigPosition = this.positionEllipsis;
157
+ }
158
+ }
159
+ positionDropdown() {
160
+ var _a;
161
+ const bounding = (_a = this._element.shadowRoot.querySelector(".ellipses__item")) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
162
+ const elDropdown = this._element.shadowRoot.querySelector(".dropdown-ellipsis");
163
+ if (bounding == undefined || elDropdown == undefined) {
164
+ return;
165
+ }
166
+ elDropdown.style.top = (bounding.y + bounding.height + 5) + "px";
167
+ elDropdown.style.left = bounding.x + "px";
168
+ }
169
+ ;
170
+ async startResize() {
171
+ const areaAvailable = this._element.parentElement.offsetWidth;
172
+ const ELLIPSIS_SIZE = 10;
173
+ const measureItemSize = async (item, index) => {
174
+ item.width = await this.measureSizeHTMLElement(item);
175
+ /*
176
+ Se é o ultimo item, desconsideramos o icone CHEVRON
177
+ */
178
+ if (index === this.visibleItems.length - 1) {
179
+ item.width -= this.CHEVRON_SIZE;
180
+ }
181
+ return item;
182
+ };
183
+ const measuredItems = await Promise.all(this.visibleItems.map(measureItemSize));
184
+ const sizeBreadcrumb = measuredItems.reduce((total, item) => total + item.width, 0);
185
+ if (sizeBreadcrumb > areaAvailable) {
186
+ const tempItemsVisible = [];
187
+ const tempItemsHidden = [...measuredItems];
188
+ const firstItem = tempItemsHidden.shift();
189
+ const lastItem = tempItemsHidden.pop();
190
+ lastItem.width += ELLIPSIS_SIZE;
191
+ tempItemsVisible.push(firstItem, lastItem);
192
+ let sizeTempItemsHiddenResult = tempItemsVisible.reduce((total, item) => total + item.width, 0);
193
+ let newAreaAvailable = Math.abs(sizeTempItemsHiddenResult - areaAvailable);
194
+ tempItemsHidden.reverse().forEach((item) => {
195
+ if (item.width < newAreaAvailable) {
196
+ const firstItemForListHidden = tempItemsHidden.shift();
197
+ tempItemsVisible.splice(1, 0, firstItemForListHidden);
198
+ sizeTempItemsHiddenResult = tempItemsVisible.reduce((total, item) => total + item.width, 0);
199
+ newAreaAvailable = Math.abs(sizeTempItemsHiddenResult - areaAvailable);
200
+ }
201
+ });
202
+ this.visibleItems = [...tempItemsVisible];
203
+ this.hiddenItems = [...tempItemsHidden.reverse()];
204
+ }
205
+ }
206
+ measureSizeHTMLElement(item) {
207
+ return new Promise((resolve) => {
208
+ const ICON_SIZE = 19;
209
+ this.waitFontLoad().then(() => {
210
+ if (this._textMesurement === undefined) {
211
+ this._textMesurement = this._element.shadowRoot.ownerDocument.createElement("canvas");
212
+ }
213
+ const context = this._textMesurement.getContext("2d");
214
+ context.font = "14px Roboto, Algerian";
215
+ resolve((item.iconName ? ICON_SIZE : 0) + this.CHEVRON_SIZE + context.measureText(item.label).width);
216
+ });
217
+ });
218
+ }
219
+ waitFontLoad() {
220
+ return new Promise((resolve) => {
221
+ document.fonts.load("14px Roboto").then(() => resolve(), resolve());
222
+ });
223
+ }
224
+ getItemContent() {
225
+ return (h("nav", { class: "breadcrumb" }, h("ol", { class: "breadcrumb__list", ref: elem => this._elBreadcrumbList = elem }, h(BreadcrumbItem, { items: this.visibleItems, selectedItem: this.selectedItem, itemsHidden: this.hiddenItems, showDropdown: this.showDropdown, handleShowDropdown: this.handleShowDropdown, collapseConfigPosition: this.collapseConfigPosition, ellipsesPositionedEnd: this._ellipsesPositionedEnd }))));
12
226
  }
13
227
  render() {
14
- return (h("nav", { class: "breadcrumb" }, h("ol", { class: "breadcrumb__list" }, this.items.map((item, index) => {
15
- const isLastItem = index === (this.items.length - 1);
16
- return (h("li", Object.assign({ class: "breadcrumb__item", id: item.id }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`ezBreadcrumbItem_${item.id}`) }), item.iconName && h("ez-icon", Object.assign({ class: `breadcrumb__item--icon ${isLastItem ? 'active-icon' : ''}`, size: "small", iconName: item.iconName }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconItem${item.id}`)}` })), h("p", { class: `breadcrumb__item--label ${isLastItem ? 'active' : ''}`, onClick: !isLastItem ? () => this.handleItemClick(item) : undefined }, item.label), !isLastItem && h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` }))));
17
- }))));
228
+ return this.getItemContent();
18
229
  }
19
230
  static get is() { return "ez-breadcrumb"; }
20
231
  static get encapsulation() { return "shadow"; }
@@ -52,13 +263,75 @@ export class EzBreadcrumb {
52
263
  "text": "Lista de itens do breadcrumb."
53
264
  },
54
265
  "defaultValue": "[]"
266
+ },
267
+ "fillMode": {
268
+ "type": "string",
269
+ "mutable": true,
270
+ "complexType": {
271
+ "original": "\"auto\" | \"regular\"",
272
+ "resolved": "\"auto\" | \"regular\"",
273
+ "references": {}
274
+ },
275
+ "required": false,
276
+ "optional": false,
277
+ "docs": {
278
+ "tags": [],
279
+ "text": "Define o modo de uso do Breadcrumb."
280
+ },
281
+ "attribute": "fill-mode",
282
+ "reflect": false,
283
+ "defaultValue": "\"auto\""
284
+ },
285
+ "maxItems": {
286
+ "type": "number",
287
+ "mutable": true,
288
+ "complexType": {
289
+ "original": "number",
290
+ "resolved": "number",
291
+ "references": {}
292
+ },
293
+ "required": false,
294
+ "optional": false,
295
+ "docs": {
296
+ "tags": [],
297
+ "text": "Define o limite m\u00E1ximo de itens a serem renderizados."
298
+ },
299
+ "attribute": "max-items",
300
+ "reflect": false,
301
+ "defaultValue": "4"
302
+ },
303
+ "positionEllipsis": {
304
+ "type": "number",
305
+ "mutable": true,
306
+ "complexType": {
307
+ "original": "number",
308
+ "resolved": "number",
309
+ "references": {}
310
+ },
311
+ "required": false,
312
+ "optional": false,
313
+ "docs": {
314
+ "tags": [],
315
+ "text": "Define a posi\u00E7\u00E3o do Ellipsis nos itens vis\u00EDveis do Breadcrumb."
316
+ },
317
+ "attribute": "position-ellipsis",
318
+ "reflect": false,
319
+ "defaultValue": "1"
55
320
  }
56
321
  };
57
322
  }
323
+ static get states() {
324
+ return {
325
+ "visibleItems": {},
326
+ "hiddenItems": {},
327
+ "showDropdown": {},
328
+ "collapseConfigPosition": {}
329
+ };
330
+ }
58
331
  static get events() {
59
332
  return [{
60
- "method": "ezClick",
61
- "name": "ezClick",
333
+ "method": "selectedItem",
334
+ "name": "selectedItem",
62
335
  "bubbles": true,
63
336
  "cancelable": true,
64
337
  "composed": true,
@@ -78,4 +351,13 @@ export class EzBreadcrumb {
78
351
  }];
79
352
  }
80
353
  static get elementRef() { return "_element"; }
354
+ static get watchers() {
355
+ return [{
356
+ "propName": "items",
357
+ "methodName": "watchPropHandler"
358
+ }, {
359
+ "propName": "hiddenItems",
360
+ "methodName": "watchPropHiddenItems"
361
+ }];
362
+ }
81
363
  }
@@ -0,0 +1,31 @@
1
+ import { h } from "@stencil/core";
2
+ import { ElementIDUtils } from '@sankhyalabs/core';
3
+ export const BreadcrumbItem = (props) => {
4
+ const { items, selectedItem, itemsHidden, showDropdown, handleShowDropdown, collapseConfigPosition, ellipsesPositionedEnd } = props;
5
+ const formatDropdownItems = () => {
6
+ return itemsHidden.map((item) => ({
7
+ id: item.id,
8
+ label: item.label,
9
+ type: 'item',
10
+ children: null,
11
+ iconName: item.iconName || null,
12
+ subAction: null,
13
+ group: null
14
+ }));
15
+ };
16
+ const onClickEllipsis = (evt) => {
17
+ evt.stopPropagation();
18
+ handleShowDropdown(!showDropdown);
19
+ };
20
+ const createEllipsis = (item) => {
21
+ return (h("li", Object.assign({ class: "breadcrumb__item", onClick: evt => onClickEllipsis(evt) }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`ezBreadcrumbItem_ellipsis`) }), ellipsesPositionedEnd && h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` })), h("span", { class: "ellipses__item" }, "..."), ellipsesPositionedEnd || h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` })), showDropdown &&
22
+ h("ez-dropdown", Object.assign({ class: "dropdown-ellipsis", items: formatDropdownItems(), onEzClick: (evt) => {
23
+ const { id, label, iconName } = evt.detail;
24
+ selectedItem.emit({ id, label, iconName });
25
+ } }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo("dropdown")}` }))));
26
+ };
27
+ return (h("div", { class: "breadcrumb__items" }, items.map((item, index) => {
28
+ const isLastItem = index === (items.length - 1);
29
+ return (h("div", { class: "breadcrumb__group" }, collapseConfigPosition === index && createEllipsis(item), h("li", Object.assign({ class: "breadcrumb__item", id: item.id }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`ezBreadcrumb_item_${item.id}_${item.label}`) }), item.iconName && h("ez-icon", Object.assign({ class: `breadcrumb__item--icon ${(isLastItem && !ellipsesPositionedEnd) ? 'active-icon' : ''}`, size: "small", iconName: item.iconName }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconItem${item.id}`)}` })), h("p", { class: `breadcrumb__item--label ${(isLastItem && !ellipsesPositionedEnd) ? 'active' : ''}`, onClick: (ellipsesPositionedEnd || !isLastItem) ? () => selectedItem.emit(item) : undefined }, item.label), !isLastItem && h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` }))), (collapseConfigPosition - 1 === index && ellipsesPositionedEnd) && createEllipsis(item)));
30
+ })));
31
+ };
@@ -1,6 +1,6 @@
1
1
  import { HTMLElement as HTMLElement$1, createEvent, h, Host, forceUpdate, proxyCustomElement } from '@stencil/core/internal/client';
2
2
  export { setAssetPath, setPlatformOptions } from '@stencil/core/internal/client';
3
- import { FloatingManager, ElementIDUtils, StringUtils as StringUtils$1, DateUtils as DateUtils$1, TimeFormatter, ObjectUtils as ObjectUtils$1, Action, WaitingChangeException, ApplicationContext, UserInterface, DataUnitAction, DataUnit, NumberUtils as NumberUtils$1, DataType, SortMode, JSUtils, MaskFormatter } from '@sankhyalabs/core';
3
+ import { FloatingManager, ElementIDUtils, JSUtils, StringUtils as StringUtils$1, DateUtils as DateUtils$1, TimeFormatter, ObjectUtils as ObjectUtils$1, Action, WaitingChangeException, ApplicationContext, UserInterface, DataUnitAction, DataUnit, NumberUtils as NumberUtils$1, DataType, SortMode, MaskFormatter } from '@sankhyalabs/core';
4
4
 
5
5
  var DialogType;
6
6
  (function (DialogType) {
@@ -394,29 +394,283 @@ const EzApplication$1 = class extends HTMLElement$1 {
394
394
  static get style() { return ezApplicationCss; }
395
395
  };
396
396
 
397
- const ezBreadcrumbCss = ":host{--breadcrumb__item--label--color--title-primary:var(--color--title-primary, #2B3A54);--breadcrumb__item--label--color--active:var(--color--primary, '#008561');--breadcrumb__item--label--font-weight:var(--text-weight--large, 600);display:block;font-size:var(--text--medium, 14px);font-family:var(--font-pattern, \"Roboto\");font-weight:var(--text-weight--medium, 400)}.breadcrumb__list{list-style-type:none;display:inline-block;margin:0;padding:0}.breadcrumb__item{display:inline-flex;align-items:center;cursor:pointer}.breadcrumb__item--label{color:var(--breadcrumb__item--label--color--title-primary);margin:0px}.breadcrumb__item--icon{padding-right:3px;color:var(--breadcrumb__item--label--color--title-primary)}.breadcrumb__item--chevron{padding:0px 6px;cursor:default}.active{color:var(--breadcrumb__item--label--color--active);font-weight:var(--breadcrumb__item--label--font-weight);cursor:default}.active-icon{--icon--color:var(--breadcrumb__item--label--color--active);cursor:default}";
397
+ const BreadcrumbItem = (props) => {
398
+ const { items, selectedItem, itemsHidden, showDropdown, handleShowDropdown, collapseConfigPosition, ellipsesPositionedEnd } = props;
399
+ const formatDropdownItems = () => {
400
+ return itemsHidden.map((item) => ({
401
+ id: item.id,
402
+ label: item.label,
403
+ type: 'item',
404
+ children: null,
405
+ iconName: item.iconName || null,
406
+ subAction: null,
407
+ group: null
408
+ }));
409
+ };
410
+ const onClickEllipsis = (evt) => {
411
+ evt.stopPropagation();
412
+ handleShowDropdown(!showDropdown);
413
+ };
414
+ const createEllipsis = (item) => {
415
+ return (h("li", Object.assign({ class: "breadcrumb__item", onClick: evt => onClickEllipsis(evt) }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`ezBreadcrumbItem_ellipsis`) }),
416
+ ellipsesPositionedEnd && h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` })),
417
+ h("span", { class: "ellipses__item" }, "..."),
418
+ ellipsesPositionedEnd || h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` })),
419
+ showDropdown &&
420
+ h("ez-dropdown", Object.assign({ class: "dropdown-ellipsis", items: formatDropdownItems(), onEzClick: (evt) => {
421
+ const { id, label, iconName } = evt.detail;
422
+ selectedItem.emit({ id, label, iconName });
423
+ } }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo("dropdown")}` }))));
424
+ };
425
+ return (h("div", { class: "breadcrumb__items" }, items.map((item, index) => {
426
+ const isLastItem = index === (items.length - 1);
427
+ return (h("div", { class: "breadcrumb__group" },
428
+ collapseConfigPosition === index && createEllipsis(item),
429
+ h("li", Object.assign({ class: "breadcrumb__item", id: item.id }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`ezBreadcrumb_item_${item.id}_${item.label}`) }),
430
+ item.iconName && h("ez-icon", Object.assign({ class: `breadcrumb__item--icon ${(isLastItem && !ellipsesPositionedEnd) ? 'active-icon' : ''}`, size: "small", iconName: item.iconName }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconItem${item.id}`)}` })),
431
+ h("p", { class: `breadcrumb__item--label ${(isLastItem && !ellipsesPositionedEnd) ? 'active' : ''}`, onClick: (ellipsesPositionedEnd || !isLastItem) ? () => selectedItem.emit(item) : undefined }, item.label),
432
+ !isLastItem && h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` }))),
433
+ (collapseConfigPosition - 1 === index && ellipsesPositionedEnd) && createEllipsis(item)));
434
+ })));
435
+ };
436
+
437
+ const ezBreadcrumbCss = ":host{--breadcrumb__item--label--color--title-primary:var(--color--title-primary, #2B3A54);--breadcrumb__item--label--color--active:var(--color--primary, '#008561');--breadcrumb__item--label--font-weight:var(--text-weight--large, 600);display:block;font-size:var(--text--medium, 14px);font-family:var(--font-pattern, \"Roboto\");font-weight:var(--text-weight--medium, 400)}.breadcrumb__group{display:flex}.breadcrumb__list{list-style-type:none;display:inline-block;margin:0;padding:0;overflow:hidden;white-space:nowrap}.breadcrumb__item{display:inline-flex;align-items:center;cursor:pointer}.breadcrumb__item--label{color:var(--breadcrumb__item--label--color--title-primary);margin:0px}.breadcrumb__item--icon{padding-right:3px;color:var(--breadcrumb__item--label--color--title-primary)}.breadcrumb__item--chevron{padding:0px 6px;cursor:default}.active{color:var(--breadcrumb__item--label--color--active);font-weight:var(--breadcrumb__item--label--font-weight);cursor:default}.active-icon{--icon--color:var(--breadcrumb__item--label--color--active);cursor:default}.breadcrumb__items{display:flex}";
398
438
 
399
439
  const EzBreadcrumb$1 = class extends HTMLElement$1 {
400
440
  constructor() {
401
441
  super();
402
442
  this.__registerHost();
403
443
  this.__attachShadow();
404
- this.ezClick = createEvent(this, "ezClick", 7);
444
+ this.selectedItem = createEvent(this, "selectedItem", 7);
445
+ this._ellipsesPositionedEnd = false;
446
+ this._renderSecond = false;
447
+ this.INDEX_ITEM_TO_REMOVE = 1; // sempre removemos o segundo item.
448
+ this.CHEVRON_SIZE = 28;
449
+ this.handleShowDropdown = (newState) => {
450
+ this.showDropdown = newState;
451
+ };
405
452
  this.items = [];
453
+ this.fillMode = "auto";
454
+ this.maxItems = 4;
455
+ this.positionEllipsis = 1;
456
+ this.visibleItems = undefined;
457
+ this.hiddenItems = [];
458
+ this.showDropdown = false;
459
+ this.collapseConfigPosition = -1;
460
+ }
461
+ watchPropHandler() {
462
+ this.fillMode === "auto" && this.handleResize();
463
+ }
464
+ watchPropHiddenItems() {
465
+ if (this.fillMode === 'auto') {
466
+ this.collapseConfigPosition = this.hiddenItems.length > 0 ? 1 : -1;
467
+ }
468
+ }
469
+ componentDidUpdate() {
470
+ this.positionDropdown();
471
+ this.setEvents();
472
+ }
473
+ componentWillLoad() {
474
+ this.visibleItems = [...this.items];
475
+ if (this.fillMode === 'regular') {
476
+ this.configModeRegular();
477
+ }
478
+ else if (this.fillMode === 'auto') {
479
+ this.startResize();
480
+ }
481
+ this.setEvents();
482
+ }
483
+ closeDropdown(evt) {
484
+ const target = evt === null || evt === void 0 ? void 0 : evt.target;
485
+ if (target == undefined) {
486
+ return;
487
+ }
488
+ if (target !== this._element.shadowRoot.querySelector(".ellipses__item")) {
489
+ this.showDropdown = false;
490
+ }
491
+ }
492
+ setEvents() {
493
+ document.removeEventListener("click", this.closeDropdown.bind(this));
494
+ document.addEventListener("click", this.closeDropdown.bind(this));
495
+ document.removeEventListener("scroll", this.positionDropdown.bind(this));
496
+ document.addEventListener("scroll", this.positionDropdown.bind(this));
406
497
  }
407
498
  componentDidLoad() {
408
499
  ElementIDUtils.addIDInfo(this._element);
409
500
  }
410
- handleItemClick(itemSelected) {
411
- this.ezClick.emit(itemSelected);
501
+ componentDidRender() {
502
+ if (this.fillMode === 'auto') {
503
+ this.configResize();
504
+ }
505
+ }
506
+ configResize() {
507
+ if (this._resizeObserver != undefined) {
508
+ this._resizeObserver.unobserve(this._element.parentElement);
509
+ }
510
+ this._resizeObserver = new ResizeObserver(JSUtils.debounce(this.handleResize.bind(this), 200));
511
+ this._resizeObserver.observe(this._element.parentElement);
512
+ }
513
+ handleResize() {
514
+ const ELLIPSIS_SIZE = 39;
515
+ if (!this._renderSecond) {
516
+ this._renderSecond = true;
517
+ return;
518
+ }
519
+ let { offsetWidth } = this._element.parentElement;
520
+ let sumVisibleItems = 0;
521
+ this.visibleItems.forEach(item => sumVisibleItems += item.width);
522
+ //Se existe o ellipsis, devemos cconsidera-lo no calculo
523
+ const offset = this.collapseConfigPosition > -1 ? ELLIPSIS_SIZE : 0;
524
+ if (offsetWidth < sumVisibleItems + offset) {
525
+ this.handleCollapse(offsetWidth, sumVisibleItems);
526
+ }
527
+ else if (offsetWidth >= sumVisibleItems + offset) {
528
+ this.handleExpand(offsetWidth);
529
+ }
530
+ }
531
+ handleCollapse(containerWidth, itemsWidth) {
532
+ const MIN_VISIBLE_ITEMS = 2;
533
+ if (this.visibleItems.length <= MIN_VISIBLE_ITEMS) {
534
+ return;
535
+ }
536
+ let tmpVisibleItems = [...this.visibleItems];
537
+ let tmpHiddenItems = [...this.hiddenItems];
538
+ let secondItem = tmpVisibleItems[this.INDEX_ITEM_TO_REMOVE];
539
+ let hasChange = false;
540
+ while (tmpVisibleItems.length > MIN_VISIBLE_ITEMS &&
541
+ secondItem != undefined &&
542
+ itemsWidth > containerWidth) {
543
+ hasChange = true;
544
+ tmpVisibleItems = tmpVisibleItems.filter((_, index) => index !== this.INDEX_ITEM_TO_REMOVE);
545
+ tmpHiddenItems = [...tmpHiddenItems, secondItem];
546
+ itemsWidth -= secondItem.width;
547
+ secondItem = tmpVisibleItems[this.INDEX_ITEM_TO_REMOVE];
548
+ }
549
+ if (hasChange) {
550
+ this.visibleItems = tmpVisibleItems;
551
+ this.hiddenItems = tmpHiddenItems;
552
+ this.showDropdown = false;
553
+ }
554
+ }
555
+ handleExpand(containerWidth) {
556
+ if (!this.hiddenItems.length) {
557
+ return;
558
+ }
559
+ let widthFreeZone = Math.abs(this._elBreadcrumbList.offsetWidth - containerWidth);
560
+ let tmpVisibleItems = [...this.visibleItems];
561
+ let tmpHiddenItems = [...this.hiddenItems];
562
+ let lastHiddenElement = tmpHiddenItems[tmpHiddenItems.length - 1];
563
+ let hasChange = false;
564
+ while (lastHiddenElement && widthFreeZone >= lastHiddenElement.width) {
565
+ widthFreeZone -= lastHiddenElement.width;
566
+ tmpHiddenItems.pop();
567
+ tmpVisibleItems.splice(this.INDEX_ITEM_TO_REMOVE, 0, lastHiddenElement);
568
+ lastHiddenElement = tmpHiddenItems[tmpHiddenItems.length - 1];
569
+ hasChange = true;
570
+ }
571
+ if (hasChange) {
572
+ this.visibleItems = tmpVisibleItems;
573
+ this.hiddenItems = tmpHiddenItems;
574
+ this.showDropdown = false;
575
+ }
576
+ }
577
+ configModeRegular() {
578
+ if (this.visibleItems.length > this.maxItems) {
579
+ const amountsItemsToHide = Math.abs(this.visibleItems.length - this.maxItems);
580
+ if (this.positionEllipsis === 0) {
581
+ const itemsToTransfer = this.visibleItems.slice(0, amountsItemsToHide);
582
+ this.hiddenItems.push(...itemsToTransfer);
583
+ this.visibleItems.splice(0, amountsItemsToHide);
584
+ }
585
+ else if (this.positionEllipsis >= this.maxItems) {
586
+ const itemsToTransfer = this.visibleItems.slice(this.maxItems);
587
+ this.hiddenItems.push(...itemsToTransfer);
588
+ this.visibleItems.splice(this.maxItems);
589
+ this._ellipsesPositionedEnd = true;
590
+ }
591
+ else {
592
+ const removedItems = this.visibleItems.splice(this.positionEllipsis, amountsItemsToHide);
593
+ this.hiddenItems.push(...removedItems);
594
+ }
595
+ this.collapseConfigPosition = this.positionEllipsis;
596
+ }
597
+ }
598
+ positionDropdown() {
599
+ var _a;
600
+ const bounding = (_a = this._element.shadowRoot.querySelector(".ellipses__item")) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
601
+ const elDropdown = this._element.shadowRoot.querySelector(".dropdown-ellipsis");
602
+ if (bounding == undefined || elDropdown == undefined) {
603
+ return;
604
+ }
605
+ elDropdown.style.top = (bounding.y + bounding.height + 5) + "px";
606
+ elDropdown.style.left = bounding.x + "px";
607
+ }
608
+ ;
609
+ async startResize() {
610
+ const areaAvailable = this._element.parentElement.offsetWidth;
611
+ const ELLIPSIS_SIZE = 10;
612
+ const measureItemSize = async (item, index) => {
613
+ item.width = await this.measureSizeHTMLElement(item);
614
+ /*
615
+ Se é o ultimo item, desconsideramos o icone CHEVRON
616
+ */
617
+ if (index === this.visibleItems.length - 1) {
618
+ item.width -= this.CHEVRON_SIZE;
619
+ }
620
+ return item;
621
+ };
622
+ const measuredItems = await Promise.all(this.visibleItems.map(measureItemSize));
623
+ const sizeBreadcrumb = measuredItems.reduce((total, item) => total + item.width, 0);
624
+ if (sizeBreadcrumb > areaAvailable) {
625
+ const tempItemsVisible = [];
626
+ const tempItemsHidden = [...measuredItems];
627
+ const firstItem = tempItemsHidden.shift();
628
+ const lastItem = tempItemsHidden.pop();
629
+ lastItem.width += ELLIPSIS_SIZE;
630
+ tempItemsVisible.push(firstItem, lastItem);
631
+ let sizeTempItemsHiddenResult = tempItemsVisible.reduce((total, item) => total + item.width, 0);
632
+ let newAreaAvailable = Math.abs(sizeTempItemsHiddenResult - areaAvailable);
633
+ tempItemsHidden.reverse().forEach((item) => {
634
+ if (item.width < newAreaAvailable) {
635
+ const firstItemForListHidden = tempItemsHidden.shift();
636
+ tempItemsVisible.splice(1, 0, firstItemForListHidden);
637
+ sizeTempItemsHiddenResult = tempItemsVisible.reduce((total, item) => total + item.width, 0);
638
+ newAreaAvailable = Math.abs(sizeTempItemsHiddenResult - areaAvailable);
639
+ }
640
+ });
641
+ this.visibleItems = [...tempItemsVisible];
642
+ this.hiddenItems = [...tempItemsHidden.reverse()];
643
+ }
644
+ }
645
+ measureSizeHTMLElement(item) {
646
+ return new Promise((resolve) => {
647
+ const ICON_SIZE = 19;
648
+ this.waitFontLoad().then(() => {
649
+ if (this._textMesurement === undefined) {
650
+ this._textMesurement = this._element.shadowRoot.ownerDocument.createElement("canvas");
651
+ }
652
+ const context = this._textMesurement.getContext("2d");
653
+ context.font = "14px Roboto, Algerian";
654
+ resolve((item.iconName ? ICON_SIZE : 0) + this.CHEVRON_SIZE + context.measureText(item.label).width);
655
+ });
656
+ });
657
+ }
658
+ waitFontLoad() {
659
+ return new Promise((resolve) => {
660
+ document.fonts.load("14px Roboto").then(() => resolve(), resolve());
661
+ });
662
+ }
663
+ getItemContent() {
664
+ return (h("nav", { class: "breadcrumb" }, h("ol", { class: "breadcrumb__list", ref: elem => this._elBreadcrumbList = elem }, h(BreadcrumbItem, { items: this.visibleItems, selectedItem: this.selectedItem, itemsHidden: this.hiddenItems, showDropdown: this.showDropdown, handleShowDropdown: this.handleShowDropdown, collapseConfigPosition: this.collapseConfigPosition, ellipsesPositionedEnd: this._ellipsesPositionedEnd }))));
412
665
  }
413
666
  render() {
414
- return (h("nav", { class: "breadcrumb" }, h("ol", { class: "breadcrumb__list" }, this.items.map((item, index) => {
415
- const isLastItem = index === (this.items.length - 1);
416
- return (h("li", Object.assign({ class: "breadcrumb__item", id: item.id }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`ezBreadcrumbItem_${item.id}`) }), item.iconName && h("ez-icon", Object.assign({ class: `breadcrumb__item--icon ${isLastItem ? 'active-icon' : ''}`, size: "small", iconName: item.iconName }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconItem${item.id}`)}` })), h("p", { class: `breadcrumb__item--label ${isLastItem ? 'active' : ''}`, onClick: !isLastItem ? () => this.handleItemClick(item) : undefined }, item.label), !isLastItem && h("ez-icon", Object.assign({ class: "breadcrumb__item--chevron", size: "small", iconName: "chevron-right" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo(`iconPath${item.id}`)}` }))));
417
- }))));
667
+ return this.getItemContent();
418
668
  }
419
669
  get _element() { return this; }
670
+ static get watchers() { return {
671
+ "items": ["watchPropHandler"],
672
+ "hiddenItems": ["watchPropHiddenItems"]
673
+ }; }
420
674
  static get style() { return ezBreadcrumbCss; }
421
675
  };
422
676
 
@@ -126970,7 +127224,7 @@ const EzViewStack$1 = class extends HTMLElement$1 {
126970
127224
  const EzActionsButton = /*@__PURE__*/proxyCustomElement(EzActionsButton$1, [1,"ez-actions-button",{"enabled":[516],"actions":[1040],"size":[513],"showLabel":[516,"show-label"],"displayIcon":[513,"display-icon"],"checkOption":[516,"check-option"],"value":[513],"isTransparent":[516,"is-transparent"],"arrowActive":[516,"arrow-active"],"_selectedAction":[32]}]);
126971
127225
  const EzAlert = /*@__PURE__*/proxyCustomElement(EzAlert$1, [1,"ez-alert",{"alertType":[513,"alert-type"]}]);
126972
127226
  const EzApplication = /*@__PURE__*/proxyCustomElement(EzApplication$1, [0,"ez-application"]);
126973
- const EzBreadcrumb = /*@__PURE__*/proxyCustomElement(EzBreadcrumb$1, [1,"ez-breadcrumb",{"items":[1040]}]);
127227
+ const EzBreadcrumb = /*@__PURE__*/proxyCustomElement(EzBreadcrumb$1, [1,"ez-breadcrumb",{"items":[1040],"fillMode":[1025,"fill-mode"],"maxItems":[1026,"max-items"],"positionEllipsis":[1026,"position-ellipsis"],"visibleItems":[32],"hiddenItems":[32],"showDropdown":[32],"collapseConfigPosition":[32]}]);
126974
127228
  const EzButton = /*@__PURE__*/proxyCustomElement(EzButton$1, [1,"ez-button",{"label":[513],"enabled":[516],"mode":[513],"image":[513],"iconName":[513,"icon-name"],"size":[513]}]);
126975
127229
  const EzCalendar = /*@__PURE__*/proxyCustomElement(EzCalendar$1, [1,"ez-calendar",{"value":[1040],"floating":[516],"time":[516],"showSeconds":[516,"show-seconds"]}]);
126976
127230
  const EzCardItem = /*@__PURE__*/proxyCustomElement(EzCardItem$1, [1,"ez-card-item",{"item":[16]}]);