structra-ui 0.1.15 → 0.1.16

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 (149) hide show
  1. package/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
  2. package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
  3. package/esm2022/app/_utils/estados-br.data.mjs +37 -0
  4. package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
  5. package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
  6. package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +97 -0
  7. package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
  8. package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
  9. package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
  10. package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
  11. package/esm2022/app/app-shell/index.mjs +19 -0
  12. package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
  13. package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
  14. package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
  15. package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
  16. package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
  17. package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
  18. package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
  19. package/esm2022/app/buttons/index.mjs +2 -0
  20. package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
  21. package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
  22. package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
  23. package/esm2022/app/data-display/_models/index.mjs +2 -0
  24. package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
  25. package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
  26. package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
  27. package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
  28. package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
  29. package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
  30. package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
  31. package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
  32. package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
  33. package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
  34. package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
  35. package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
  36. package/esm2022/app/data-display/index.mjs +19 -0
  37. package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
  38. package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
  39. package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
  40. package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
  41. package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
  42. package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
  43. package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +22 -0
  44. package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
  45. package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +200 -0
  46. package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
  47. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
  48. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
  49. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +47 -0
  50. package/esm2022/app/dialogs/index.mjs +12 -0
  51. package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
  52. package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
  53. package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +38 -0
  54. package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
  55. package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
  56. package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
  57. package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
  58. package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
  59. package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
  60. package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
  61. package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
  62. package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
  63. package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
  64. package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
  65. package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
  66. package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
  67. package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
  68. package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
  69. package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
  70. package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
  71. package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
  72. package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
  73. package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
  74. package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
  75. package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
  76. package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
  77. package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
  78. package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
  79. package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
  80. package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
  81. package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
  82. package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
  83. package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
  84. package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
  85. package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
  86. package/esm2022/app/fields/input-fields/index.mjs +22 -0
  87. package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
  88. package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
  89. package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
  90. package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
  91. package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
  92. package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
  93. package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
  94. package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
  95. package/esm2022/app/form-layout/_models/index.mjs +2 -0
  96. package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
  97. package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
  98. package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
  99. package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
  100. package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
  101. package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
  102. package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
  103. package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
  104. package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
  105. package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
  106. package/esm2022/app/form-layout/index.mjs +14 -0
  107. package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
  108. package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +343 -0
  109. package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
  110. package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
  111. package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
  112. package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
  113. package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
  114. package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
  115. package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
  116. package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
  117. package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
  118. package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
  119. package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
  120. package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
  121. package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
  122. package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
  123. package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
  124. package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
  125. package/esm2022/app/menus/drawer/drawer.component.mjs +142 -0
  126. package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
  127. package/esm2022/app/menus/index.mjs +11 -0
  128. package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
  129. package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
  130. package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
  131. package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
  132. package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
  133. package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
  134. package/esm2022/app/overlay/index.mjs +21 -0
  135. package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
  136. package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
  137. package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
  138. package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
  139. package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
  140. package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
  141. package/esm2022/app/theme/app-theme.service.mjs +49 -0
  142. package/esm2022/app/theme/index.mjs +2 -0
  143. package/esm2022/structra-public-api.mjs +18 -0
  144. package/esm2022/structra-ui.mjs +5 -0
  145. package/esm2022/structra-version.mjs +3 -0
  146. package/fesm2022/structra-ui.mjs +8971 -0
  147. package/fesm2022/structra-ui.mjs.map +1 -0
  148. package/index.d.ts +5 -0
  149. package/package.json +15 -6
@@ -0,0 +1,40 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DataCardComponent {
4
+ constructor() {
5
+ this.variant = 'default';
6
+ this.showActions = true;
7
+ this.edit = new EventEmitter();
8
+ this.remove = new EventEmitter();
9
+ }
10
+ onEditClick(ev) {
11
+ ev.stopPropagation();
12
+ this.edit.emit();
13
+ }
14
+ onRemoveClick(ev) {
15
+ ev.stopPropagation();
16
+ this.remove.emit();
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DataCardComponent, isStandalone: true, selector: "app-data-card", inputs: { title: "title", subtitle: "subtitle", avatarText: "avatarText", variant: "variant", showActions: "showActions" }, outputs: { edit: "edit", remove: "remove" }, ngImport: i0, template: "<article\r\n class=\"data-card\"\r\n [class.data-card--default]=\"variant === 'default'\"\r\n [attr.data-variant]=\"variant\"\r\n>\r\n <div class=\"data-card__row\">\r\n <div class=\"data-card__main\">\r\n @if (avatarText?.trim()) {\r\n <div class=\"data-card__avatar\" aria-hidden=\"true\">\r\n {{ avatarText!.trim().slice(0, 2) }}\r\n </div>\r\n }\r\n <div class=\"data-card__text\">\r\n <h4 class=\"data-card__title\">{{ title }}</h4>\r\n @if (subtitle?.trim()) {\r\n <p class=\"data-card__subtitle\">{{ subtitle }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"data-card__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"onEditClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn data-card__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"onRemoveClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</article>\r\n", styles: [":host{display:block;min-width:0}.data-card{box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .1));background:var(--app-color-surface, #fff);padding:.85rem 1rem;transition:border-color .15s ease,box-shadow .15s ease}.data-card--default:hover{border-color:var(--app-color-selected-border, rgba(43, 127, 217, .28));box-shadow:0 1px 0 var(--app-color-border-subtle, rgba(26, 47, 69, .04))}.data-card__row{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.data-card__main{display:flex;align-items:flex-start;gap:.65rem;min-width:0;flex:1}.data-card__avatar{flex-shrink:0;width:2.35rem;height:2.35rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.72rem;font-weight:700;letter-spacing:.02em;color:var(--app-color-text-primary, #2a4a66);background:linear-gradient(145deg,var(--app-color-avatar-gradient-start, rgba(43, 127, 217, .14)),var(--app-color-avatar-gradient-end, rgba(26, 47, 69, .06)));border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08));text-transform:uppercase}.data-card__text{min-width:0}.data-card__title{margin:0;font-size:.95rem;font-weight:600;line-height:1.3;color:var(--ui-field-float-input-text, #0f1b28);word-break:break-word}.data-card__subtitle{margin:.2rem 0 0;font-size:.8rem;line-height:1.35;color:var(--app-color-text-muted, #5a6e82)}.data-card__actions{display:flex;flex-shrink:0;align-items:center;gap:.35rem}.data-card__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;min-width:2rem;height:2rem;margin:0;padding:0;border:1px solid rgba(43,127,217,.45);border-radius:6px;background:#fff;color:var(--ui-field-float-border-focus, #2b7fd9);font-size:.95rem;line-height:1;cursor:pointer;transition:background .15s ease,border-color .15s ease}.data-card__icon-btn:hover{background:#2b7fd914}.data-card__icon-btn:focus-visible{outline:2px solid var(--ui-field-float-border-focus, #2b7fd9);outline-offset:2px}.data-card__icon-btn--danger{border-color:#b71c1c73;color:var(--ui-field-input-invalid-border, #b91c1c)}.data-card__icon-btn--danger:hover{background:#b71c1c0f}.data-card__icon-btn--danger:focus-visible{outline-color:var(--ui-field-input-invalid-border, #b91c1c)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataCardComponent, decorators: [{
22
+ type: Component,
23
+ args: [{ selector: 'app-data-card', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<article\r\n class=\"data-card\"\r\n [class.data-card--default]=\"variant === 'default'\"\r\n [attr.data-variant]=\"variant\"\r\n>\r\n <div class=\"data-card__row\">\r\n <div class=\"data-card__main\">\r\n @if (avatarText?.trim()) {\r\n <div class=\"data-card__avatar\" aria-hidden=\"true\">\r\n {{ avatarText!.trim().slice(0, 2) }}\r\n </div>\r\n }\r\n <div class=\"data-card__text\">\r\n <h4 class=\"data-card__title\">{{ title }}</h4>\r\n @if (subtitle?.trim()) {\r\n <p class=\"data-card__subtitle\">{{ subtitle }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"data-card__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"onEditClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn data-card__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"onRemoveClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</article>\r\n", styles: [":host{display:block;min-width:0}.data-card{box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .1));background:var(--app-color-surface, #fff);padding:.85rem 1rem;transition:border-color .15s ease,box-shadow .15s ease}.data-card--default:hover{border-color:var(--app-color-selected-border, rgba(43, 127, 217, .28));box-shadow:0 1px 0 var(--app-color-border-subtle, rgba(26, 47, 69, .04))}.data-card__row{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.data-card__main{display:flex;align-items:flex-start;gap:.65rem;min-width:0;flex:1}.data-card__avatar{flex-shrink:0;width:2.35rem;height:2.35rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.72rem;font-weight:700;letter-spacing:.02em;color:var(--app-color-text-primary, #2a4a66);background:linear-gradient(145deg,var(--app-color-avatar-gradient-start, rgba(43, 127, 217, .14)),var(--app-color-avatar-gradient-end, rgba(26, 47, 69, .06)));border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08));text-transform:uppercase}.data-card__text{min-width:0}.data-card__title{margin:0;font-size:.95rem;font-weight:600;line-height:1.3;color:var(--ui-field-float-input-text, #0f1b28);word-break:break-word}.data-card__subtitle{margin:.2rem 0 0;font-size:.8rem;line-height:1.35;color:var(--app-color-text-muted, #5a6e82)}.data-card__actions{display:flex;flex-shrink:0;align-items:center;gap:.35rem}.data-card__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;min-width:2rem;height:2rem;margin:0;padding:0;border:1px solid rgba(43,127,217,.45);border-radius:6px;background:#fff;color:var(--ui-field-float-border-focus, #2b7fd9);font-size:.95rem;line-height:1;cursor:pointer;transition:background .15s ease,border-color .15s ease}.data-card__icon-btn:hover{background:#2b7fd914}.data-card__icon-btn:focus-visible{outline:2px solid var(--ui-field-float-border-focus, #2b7fd9);outline-offset:2px}.data-card__icon-btn--danger{border-color:#b71c1c73;color:var(--ui-field-input-invalid-border, #b91c1c)}.data-card__icon-btn--danger:hover{background:#b71c1c0f}.data-card__icon-btn--danger:focus-visible{outline-color:var(--ui-field-input-invalid-border, #b91c1c)}\n"] }]
24
+ }], propDecorators: { title: [{
25
+ type: Input,
26
+ args: [{ required: true }]
27
+ }], subtitle: [{
28
+ type: Input
29
+ }], avatarText: [{
30
+ type: Input
31
+ }], variant: [{
32
+ type: Input
33
+ }], showActions: [{
34
+ type: Input
35
+ }], edit: [{
36
+ type: Output
37
+ }], remove: [{
38
+ type: Output
39
+ }] } });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L2RhdGEtY2FyZC9kYXRhLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvZGF0YS1jYXJkL2RhdGEtY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQzs7QUFTdkIsTUFBTSxPQUFPLGlCQUFpQjtJQVA5QjtRQVlXLFlBQU8sR0FBYyxTQUFTLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFVCxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNoQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQVd0RDtJQVRDLFdBQVcsQ0FBQyxFQUFTO1FBQ25CLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxhQUFhLENBQUMsRUFBUztRQUNyQixFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDOytHQW5CVSxpQkFBaUI7bUdBQWpCLGlCQUFpQixrUENmOUIsbTJDQTJDQTs7NEZENUJhLGlCQUFpQjtrQkFQN0IsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxtQkFHQyx1QkFBdUIsQ0FBQyxNQUFNOzhCQUdwQixLQUFLO3NCQUEvQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVhLElBQUk7c0JBQXRCLE1BQU07Z0JBQ1ksTUFBTTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1kYXRhLWNhcmQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtY2FyZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2RhdGEtY2FyZC5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhQ2FyZENvbXBvbmVudCB7XHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgdGl0bGUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3VidGl0bGU/OiBzdHJpbmc7XHJcbiAgLyoqIDHigJMyIGNhcmFjdGVyZXMgcGFyYSBvIGPDrXJjdWxvIGRlIGluaWNpYWlzLiAqL1xyXG4gIEBJbnB1dCgpIGF2YXRhclRleHQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdmFyaWFudDogJ2RlZmF1bHQnID0gJ2RlZmF1bHQnO1xyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25zID0gdHJ1ZTtcclxuXHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgb25FZGl0Q2xpY2soZXY6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZWRpdC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZUNsaWNrKGV2OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnJlbW92ZS5lbWl0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxhcnRpY2xlXHJcbiAgY2xhc3M9XCJkYXRhLWNhcmRcIlxyXG4gIFtjbGFzcy5kYXRhLWNhcmQtLWRlZmF1bHRdPVwidmFyaWFudCA9PT0gJ2RlZmF1bHQnXCJcclxuICBbYXR0ci5kYXRhLXZhcmlhbnRdPVwidmFyaWFudFwiXHJcbj5cclxuICA8ZGl2IGNsYXNzPVwiZGF0YS1jYXJkX19yb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYXRhLWNhcmRfX21haW5cIj5cclxuICAgICAgQGlmIChhdmF0YXJUZXh0Py50cmltKCkpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY2FyZF9fYXZhdGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAge3sgYXZhdGFyVGV4dCEudHJpbSgpLnNsaWNlKDAsIDIpIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLWNhcmRfX3RleHRcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJkYXRhLWNhcmRfX3RpdGxlXCI+e3sgdGl0bGUgfX08L2g0PlxyXG4gICAgICAgIEBpZiAoc3VidGl0bGU/LnRyaW0oKSkge1xyXG4gICAgICAgIDxwIGNsYXNzPVwiZGF0YS1jYXJkX19zdWJ0aXRsZVwiPnt7IHN1YnRpdGxlIH19PC9wPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIEBpZiAoc2hvd0FjdGlvbnMpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJkYXRhLWNhcmRfX2FjdGlvbnNcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiZGF0YS1jYXJkX19pY29uLWJ0blwiXHJcbiAgICAgICAgdGl0bGU9XCJFZGl0YXJcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0YXJcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkVkaXRDbGljaygkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmEtc29saWQgZmEtYXJyb3dzLXJvdGF0ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImRhdGEtY2FyZF9faWNvbi1idG4gZGF0YS1jYXJkX19pY29uLWJ0bi0tZGFuZ2VyXCJcclxuICAgICAgICB0aXRsZT1cIlJlbW92ZXJcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmVyXCJcclxuICAgICAgICAoY2xpY2spPVwib25SZW1vdmVDbGljaygkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmEtc29saWQgZmEtdHJhc2gtY2FuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L2FydGljbGU+XHJcbiJdfQ==
@@ -0,0 +1,41 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DataGridActionsCellRendererComponent {
4
+ agInit(params) {
5
+ this.params = params;
6
+ }
7
+ refresh() {
8
+ return false;
9
+ }
10
+ /** `params.context` nem sempre vem preenchido; o grid guarda o mesmo objeto em `gridOptions.context`. */
11
+ get actionsContext() {
12
+ const p = this.params;
13
+ if (p.context?.onEditRow && p.context?.onRemoveRow) {
14
+ return p.context;
15
+ }
16
+ const api = p.api;
17
+ const fromGrid = api?.getGridOption?.('context');
18
+ return fromGrid;
19
+ }
20
+ edit() {
21
+ const row = this.params.data;
22
+ const ctx = this.actionsContext;
23
+ if (row != null && ctx) {
24
+ ctx.onEditRow(row);
25
+ }
26
+ }
27
+ remove() {
28
+ const row = this.params.data;
29
+ const ctx = this.actionsContext;
30
+ if (row != null && ctx) {
31
+ ctx.onRemoveRow(row);
32
+ }
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataGridActionsCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DataGridActionsCellRendererComponent, isStandalone: true, selector: "app-data-grid-actions-cell-renderer", ngImport: i0, template: "<div class=\"data-grid-actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"edit()\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn data-grid-actions__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"remove()\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n</div>\r\n", styles: [".data-grid-actions{display:flex;flex-wrap:nowrap;align-items:center;justify-content:flex-start;gap:.35rem;padding:.1rem 0}.data-grid-actions__icon-btn{display:inline-flex;align-items:center;justify-content:center;margin:0;width:2rem;min-width:2rem;height:2rem;padding:0;border:1px solid rgba(43,127,217,.45);border-radius:6px;background:#fff;color:var(--ui-field-float-border-focus, #2b7fd9);font-size:.95rem;line-height:1;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,border-color .15s ease,color .15s ease}.data-grid-actions__icon-btn:hover{background:#2b7fd914}.data-grid-actions__icon-btn:focus-visible{outline:2px solid var(--ui-field-float-border-focus, #2b7fd9);outline-offset:2px}.data-grid-actions__icon-btn--danger{border-color:#b71c1c73;color:var(--ui-field-input-invalid-border, #b91c1c)}.data-grid-actions__icon-btn--danger:hover{background:#b71c1c0f}.data-grid-actions__icon-btn--danger:focus-visible{outline-color:var(--ui-field-input-invalid-border, #b91c1c)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataGridActionsCellRendererComponent, decorators: [{
38
+ type: Component,
39
+ args: [{ selector: 'app-data-grid-actions-cell-renderer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"data-grid-actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"edit()\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn data-grid-actions__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"remove()\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n</div>\r\n", styles: [".data-grid-actions{display:flex;flex-wrap:nowrap;align-items:center;justify-content:flex-start;gap:.35rem;padding:.1rem 0}.data-grid-actions__icon-btn{display:inline-flex;align-items:center;justify-content:center;margin:0;width:2rem;min-width:2rem;height:2rem;padding:0;border:1px solid rgba(43,127,217,.45);border-radius:6px;background:#fff;color:var(--ui-field-float-border-focus, #2b7fd9);font-size:.95rem;line-height:1;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,border-color .15s ease,color .15s ease}.data-grid-actions__icon-btn:hover{background:#2b7fd914}.data-grid-actions__icon-btn:focus-visible{outline:2px solid var(--ui-field-float-border-focus, #2b7fd9);outline-offset:2px}.data-grid-actions__icon-btn--danger{border-color:#b71c1c73;color:var(--ui-field-input-invalid-border, #b91c1c)}.data-grid-actions__icon-btn--danger:hover{background:#b71c1c0f}.data-grid-actions__icon-btn--danger:focus-visible{outline-color:var(--ui-field-input-invalid-border, #b91c1c)}\n"] }]
40
+ }] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLWFjdGlvbnMtY2VsbC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RhdGEtZGlzcGxheS9kYXRhLWdyaWQvZGF0YS1ncmlkLWFjdGlvbnMtY2VsbC1yZW5kZXJlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RhdGEtZGlzcGxheS9kYXRhLWdyaWQvZGF0YS1ncmlkLWFjdGlvbnMtY2VsbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWlCbkUsTUFBTSxPQUFPLG9DQUFvQztJQUsvQyxNQUFNLENBQUMsTUFBMkI7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUViLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlHQUF5RztJQUN6RyxJQUFZLGNBQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BRWQsQ0FBQztRQUNGLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNuRCxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUEwQixDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBRWxDLENBQUM7UUFDZCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSTtRQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDaEMsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7WUFDdkIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQzsrR0E1Q1Usb0NBQW9DO21HQUFwQyxvQ0FBb0MsK0ZDakJqRCw2bEJBb0JBOzs0RkRIYSxvQ0FBb0M7a0JBUGhELFNBQVM7K0JBQ0UscUNBQXFDLGNBQ25DLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHR5cGUgeyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xyXG5pbXBvcnQgdHlwZSB7IEdyaWRBcGksIElDZWxsUmVuZGVyZXJQYXJhbXMgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcblxyXG4vKiogQ29udGV4dG8gaW5qZXRhZG8gcGVsbyB7QGxpbmsgRGF0YUdyaWRDb21wb25lbnR9IChuw6NvIGV4cG9ydGFkbyBwYXJhIGNvbnN1bWlkb3JlcykuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUdyaWRBY3Rpb25zQ29udGV4dDxUID0gdW5rbm93bj4ge1xyXG4gIG9uRWRpdFJvdzogKHJvdzogVCkgPT4gdm9pZDtcclxuICBvblJlbW92ZVJvdzogKHJvdzogVCkgPT4gdm9pZDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZGF0YS1ncmlkLWFjdGlvbnMtY2VsbC1yZW5kZXJlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLWFjdGlvbnMtY2VsbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2RhdGEtZ3JpZC1hY3Rpb25zLWNlbGwtcmVuZGVyZXIuY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRBY3Rpb25zQ2VsbFJlbmRlcmVyQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXBcclxue1xyXG4gIHBhcmFtcyE6IElDZWxsUmVuZGVyZXJQYXJhbXMgJiB7IGNvbnRleHQ/OiBEYXRhR3JpZEFjdGlvbnNDb250ZXh0IH07XHJcblxyXG4gIGFnSW5pdChwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIGFzIElDZWxsUmVuZGVyZXJQYXJhbXMgJiB7XHJcbiAgICAgIGNvbnRleHQ/OiBEYXRhR3JpZEFjdGlvbnNDb250ZXh0O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogYHBhcmFtcy5jb250ZXh0YCBuZW0gc2VtcHJlIHZlbSBwcmVlbmNoaWRvOyBvIGdyaWQgZ3VhcmRhIG8gbWVzbW8gb2JqZXRvIGVtIGBncmlkT3B0aW9ucy5jb250ZXh0YC4gKi9cclxuICBwcml2YXRlIGdldCBhY3Rpb25zQ29udGV4dCgpOiBEYXRhR3JpZEFjdGlvbnNDb250ZXh0IHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IHAgPSB0aGlzLnBhcmFtcyBhcyBJQ2VsbFJlbmRlcmVyUGFyYW1zICYge1xyXG4gICAgICBjb250ZXh0PzogRGF0YUdyaWRBY3Rpb25zQ29udGV4dDtcclxuICAgIH07XHJcbiAgICBpZiAocC5jb250ZXh0Py5vbkVkaXRSb3cgJiYgcC5jb250ZXh0Py5vblJlbW92ZVJvdykge1xyXG4gICAgICByZXR1cm4gcC5jb250ZXh0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXBpID0gcC5hcGkgYXMgR3JpZEFwaSB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGZyb21HcmlkID0gYXBpPy5nZXRHcmlkT3B0aW9uPy4oJ2NvbnRleHQnKSBhc1xyXG4gICAgICB8IERhdGFHcmlkQWN0aW9uc0NvbnRleHRcclxuICAgICAgfCB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gZnJvbUdyaWQ7XHJcbiAgfVxyXG5cclxuICBlZGl0KCk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93ID0gdGhpcy5wYXJhbXMuZGF0YTtcclxuICAgIGNvbnN0IGN0eCA9IHRoaXMuYWN0aW9uc0NvbnRleHQ7XHJcbiAgICBpZiAocm93ICE9IG51bGwgJiYgY3R4KSB7XHJcbiAgICAgIGN0eC5vbkVkaXRSb3cocm93KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvdyA9IHRoaXMucGFyYW1zLmRhdGE7XHJcbiAgICBjb25zdCBjdHggPSB0aGlzLmFjdGlvbnNDb250ZXh0O1xyXG4gICAgaWYgKHJvdyAhPSBudWxsICYmIGN0eCkge1xyXG4gICAgICBjdHgub25SZW1vdmVSb3cocm93KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhdGEtZ3JpZC1hY3Rpb25zXCI+XHJcbiAgPGJ1dHRvblxyXG4gICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBjbGFzcz1cImRhdGEtZ3JpZC1hY3Rpb25zX19pY29uLWJ0blwiXHJcbiAgICB0aXRsZT1cIkVkaXRhclwiXHJcbiAgICBhcmlhLWxhYmVsPVwiRWRpdGFyXCJcclxuICAgIChjbGljayk9XCJlZGl0KClcIlxyXG4gID5cclxuICAgIDxzcGFuIGNsYXNzPVwiZmEtc29saWQgZmEtYXJyb3dzLXJvdGF0ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuICA8YnV0dG9uXHJcbiAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgIGNsYXNzPVwiZGF0YS1ncmlkLWFjdGlvbnNfX2ljb24tYnRuIGRhdGEtZ3JpZC1hY3Rpb25zX19pY29uLWJ0bi0tZGFuZ2VyXCJcclxuICAgIHRpdGxlPVwiUmVtb3ZlclwiXHJcbiAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlclwiXHJcbiAgICAoY2xpY2spPVwicmVtb3ZlKClcIlxyXG4gID5cclxuICAgIDxzcGFuIGNsYXNzPVwiZmEtc29saWQgZmEtdHJhc2gtY2FuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,253 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, NgZone, Output, numberAttribute, } from '@angular/core';
2
+ import { AgGridAngular } from 'ag-grid-angular';
3
+ import { buildEmptyStateOverlayHtml } from '../empty-state/empty-state-overlay.util';
4
+ import { DataGridActionsCellRendererComponent, } from './data-grid-actions-cell-renderer.component';
5
+ import { SkeletonTableComponent } from '../../loading/skeleton-loading';
6
+ import * as i0 from "@angular/core";
7
+ const ACTIONS_RENDERER_NAME = 'dataGridActions';
8
+ export class DataGridComponent {
9
+ constructor() {
10
+ this.ngZone = inject(NgZone);
11
+ this.gridApi = null;
12
+ this.pageSize = 15;
13
+ this.loading = false;
14
+ /**
15
+ * Após remontar a grade (ex.: skeleton), volta a esta página (0-based).
16
+ * Só aplicado em `gridReady` e quando o valor muda com a API já disponível.
17
+ */
18
+ this.initialPaginationPage = 0;
19
+ this.height = '420px';
20
+ this.emptyMessage = 'Sem registros para mostrar.';
21
+ this.pagination = true;
22
+ /** Se `false`, omite colunas com `type: 'actions'` (editar/remover). Por omissão `true`. */
23
+ this.showActionsColumn = true;
24
+ this.edit = new EventEmitter();
25
+ this.remove = new EventEmitter();
26
+ /** Reservado para evolução (seleção de linhas); não ligado na v1 para manter a UI minimal. */
27
+ this.selectionChange = new EventEmitter();
28
+ /** Paginação interna do ag-Grid: mudança de página ou de `pageSize`. */
29
+ this.paginationChanged = new EventEmitter();
30
+ this.frameworkComponents = {
31
+ [ACTIONS_RENDERER_NAME]: DataGridActionsCellRendererComponent,
32
+ };
33
+ this.paginationPageSizeChoices = [10, 15, 25, 50];
34
+ this.defaultColDef = {
35
+ sortable: true,
36
+ resizable: true,
37
+ flex: 1,
38
+ minWidth: 120,
39
+ };
40
+ /**
41
+ * O AG Grid corre muitos callbacks fora da `NgZone`; sem `run()`, o pai com `OnPush`
42
+ * não volta a renderizar e editar/remover parece “morto”.
43
+ */
44
+ this.actionsContext = {
45
+ onEditRow: (row) => this.ngZone.run(() => {
46
+ this.edit.emit(row);
47
+ }),
48
+ onRemoveRow: (row) => this.ngZone.run(() => {
49
+ this.remove.emit(row);
50
+ }),
51
+ };
52
+ this.agColumnDefs = [];
53
+ /**
54
+ * IDs estáveis por linha (evita `''` duplicado quando não existe `id` nos dados).
55
+ * Tenta `id`, depois `sku` (comum em grades de produto), senão impressão digital do objeto.
56
+ */
57
+ this.getRowId = (params) => {
58
+ const d = params.data;
59
+ if (!d) {
60
+ return '__no-row-data';
61
+ }
62
+ const idVal = d['id'];
63
+ if (idVal !== undefined && idVal !== null && String(idVal).trim() !== '') {
64
+ return String(idVal);
65
+ }
66
+ const skuVal = d['sku'];
67
+ if (skuVal !== undefined && skuVal !== null && String(skuVal).trim() !== '') {
68
+ return `sku:${String(skuVal)}`;
69
+ }
70
+ return `row:${this.stableRowFingerprint(d)}`;
71
+ };
72
+ }
73
+ /**
74
+ * O AG Grid avisa se `paginationPageSize` não está em `paginationPageSizeSelector`.
75
+ * Junta `pageSize` às opções base quando o consumidor usa um valor fora da lista (ex.: 8).
76
+ */
77
+ get effectivePaginationPageSizeSelector() {
78
+ const size = Number(this.pageSize);
79
+ const base = [...this.paginationPageSizeChoices];
80
+ if (Number.isFinite(size) && size > 0 && !base.includes(size)) {
81
+ base.push(size);
82
+ base.sort((a, b) => a - b);
83
+ }
84
+ return base;
85
+ }
86
+ get skeletonColumnCount() {
87
+ const n = this.columns?.length ?? 4;
88
+ return Math.min(8, Math.max(2, n));
89
+ }
90
+ get skeletonRowCount() {
91
+ return Math.min(14, Math.max(5, this.pageSize));
92
+ }
93
+ ngOnInit() {
94
+ if (this.columns?.length) {
95
+ this.agColumnDefs = this.mapColumnsToColDef(this.columns);
96
+ }
97
+ }
98
+ /** Identificador determinístico e curto para linhas sem chave explícita. */
99
+ stableRowFingerprint(d) {
100
+ const keys = Object.keys(d).sort();
101
+ const s = keys.map((k) => `${k}:${JSON.stringify(d[k])}`).join('|');
102
+ let h = 2166136261;
103
+ for (let i = 0; i < s.length; i++) {
104
+ h ^= s.charCodeAt(i);
105
+ h = Math.imul(h, 16777619);
106
+ }
107
+ return (h >>> 0).toString(36);
108
+ }
109
+ ngOnChanges(changes) {
110
+ if (changes['loading'] && this.loading) {
111
+ this.detachPaginationListenerIfLive();
112
+ this.gridApi = null;
113
+ }
114
+ if ((changes['columns'] || changes['showActionsColumn']) &&
115
+ this.columns?.length) {
116
+ this.agColumnDefs = this.mapColumnsToColDef(this.columns);
117
+ }
118
+ if (changes['emptyMessage'] &&
119
+ this.gridApi &&
120
+ !this.gridApi.isDestroyed() &&
121
+ changes['emptyMessage'].previousValue !==
122
+ changes['emptyMessage'].currentValue) {
123
+ this.gridApi.setGridOption('overlayNoRowsTemplate', this.emptyOverlayTemplate);
124
+ }
125
+ if (changes['initialPaginationPage'] &&
126
+ this.gridApi &&
127
+ !this.gridApi.isDestroyed() &&
128
+ !changes['initialPaginationPage'].firstChange) {
129
+ this.applyInitialPaginationPage(this.gridApi);
130
+ }
131
+ }
132
+ ngOnDestroy() {
133
+ this.detachPaginationListenerIfLive();
134
+ this.gridApi = null;
135
+ }
136
+ get emptyOverlayTemplate() {
137
+ return buildEmptyStateOverlayHtml(this.emptyMessage);
138
+ }
139
+ get hostHeight() {
140
+ return (this.height && this.height.trim()) || '420px';
141
+ }
142
+ onGridReady(ev) {
143
+ this.detachPaginationListenerIfLive();
144
+ this.gridApi = ev.api;
145
+ ev.api.setGridOption('context', this.actionsContext);
146
+ this.paginationChangedListener = (event) => {
147
+ const e = event;
148
+ if (!e?.newPage && !e?.newPageSize) {
149
+ return;
150
+ }
151
+ const currentPage = ev.api.paginationGetCurrentPage();
152
+ this.ngZone.run(() => {
153
+ this.paginationChanged.emit({
154
+ currentPage,
155
+ newPage: !!e.newPage,
156
+ newPageSize: !!e.newPageSize,
157
+ });
158
+ });
159
+ };
160
+ ev.api.addEventListener('paginationChanged', this.paginationChangedListener);
161
+ queueMicrotask(() => this.applyInitialPaginationPage(ev.api));
162
+ }
163
+ applyInitialPaginationPage(api) {
164
+ if (api.isDestroyed()) {
165
+ return;
166
+ }
167
+ const p = this.initialPaginationPage;
168
+ if (p > 0 && api.paginationGetTotalPages() > p) {
169
+ api.paginationGoToPage(p);
170
+ }
171
+ }
172
+ /** Evita `removeEventListener` na API depois do grid destruído (ex.: `@if (loading)` remove o DOM). */
173
+ detachPaginationListenerIfLive() {
174
+ const api = this.gridApi;
175
+ const fn = this.paginationChangedListener;
176
+ if (api && fn && !api.isDestroyed()) {
177
+ api.removeEventListener('paginationChanged', fn);
178
+ }
179
+ this.paginationChangedListener = undefined;
180
+ }
181
+ columnsForGrid(cols) {
182
+ if (this.showActionsColumn) {
183
+ return cols;
184
+ }
185
+ return cols.filter((c) => c.type !== 'actions');
186
+ }
187
+ mapColumnsToColDef(cols) {
188
+ return this.columnsForGrid(cols).map((c) => {
189
+ if (c.type === 'actions') {
190
+ return {
191
+ colId: String(c.key),
192
+ headerName: c.header,
193
+ sortable: false,
194
+ filter: false,
195
+ resizable: false,
196
+ suppressMovable: true,
197
+ cellRenderer: ACTIONS_RENDERER_NAME,
198
+ width: c.width ?? 168,
199
+ flex: c.flex,
200
+ pinned: 'left',
201
+ };
202
+ }
203
+ const field = String(c.key);
204
+ const def = {
205
+ field: field,
206
+ headerName: c.header,
207
+ sortable: c.sortable !== false,
208
+ width: c.width,
209
+ flex: c.flex,
210
+ };
211
+ if (c.type === 'number') {
212
+ def.type = 'numericColumn';
213
+ }
214
+ return def;
215
+ });
216
+ }
217
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
218
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DataGridComponent, isStandalone: true, selector: "app-data-grid", inputs: { rows: "rows", columns: "columns", pageSize: "pageSize", loading: "loading", initialPaginationPage: ["initialPaginationPage", "initialPaginationPage", numberAttribute], height: "height", emptyMessage: "emptyMessage", pagination: "pagination", showActionsColumn: "showActionsColumn" }, outputs: { edit: "edit", remove: "remove", selectionChange: "selectionChange", paginationChanged: "paginationChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"data-grid ag-theme-alpine\" [style.height]=\"hostHeight\">\n @if (loading) {\n <div class=\"data-grid__skeleton\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <span class=\"visually-hidden\">A carregar grid...</span>\n <app-skeleton-table [columnCount]=\"skeletonColumnCount\" [rowCount]=\"skeletonRowCount\" [showPager]=\"pagination\" />\n </div>\n } @else {\n <ag-grid-angular\n class=\"data-grid__ag\"\n [rowData]=\"rows\"\n [columnDefs]=\"agColumnDefs\"\n [components]=\"frameworkComponents\"\n [context]=\"actionsContext\"\n [defaultColDef]=\"defaultColDef\"\n [pagination]=\"pagination\"\n [paginationPageSize]=\"pageSize\"\n [paginationPageSizeSelector]=\"effectivePaginationPageSizeSelector\"\n [suppressCellFocus]=\"true\"\n [animateRows]=\"false\"\n [domLayout]=\"'normal'\"\n [overlayNoRowsTemplate]=\"emptyOverlayTemplate\"\n [getRowId]=\"getRowId\"\n (gridReady)=\"onGridReady($event)\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0;box-sizing:border-box}.data-grid{width:100%;min-width:0;min-height:200px;box-sizing:border-box;border-radius:10px;overflow:hidden;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));background:var(--app-color-surface, #fff)}.data-grid__ag{display:block;width:100%;height:100%}.data-grid__skeleton{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;box-sizing:border-box}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host ::ng-deep .data-grid.ag-theme-alpine{--ag-border-color: var(--app-color-border-subtle, rgba(26, 47, 69, .12));--ag-header-background-color: var(--app-color-tab-inactive-bg, #f3f6f9);--ag-odd-row-background-color: var(--app-color-background, #fafbfc);--ag-row-hover-color: var(--app-color-hover-bg, rgba(43, 127, 217, .06));--ag-font-size: .9rem;--ag-header-height: 40px;--ag-row-height: 40px;--ag-border-radius: 0;--ag-wrapper-border-radius: 10px;--ag-selected-row-background-color: var(--app-color-selected-bg, rgba(43, 127, 217, .1));--ag-checkbox-unchecked-color: var(--app-color-text-muted, rgba(26, 47, 69, .35));--ag-range-selection-border-color: var(--ui-field-float-border-focus, #2b7fd9);font-family:inherit;color:var(--ui-field-float-input-text, #0f1b28)}:host ::ng-deep .data-grid.ag-theme-alpine .ag-header-cell-label{font-weight:600;font-size:.85rem;color:var(--app-color-text-primary, #3d5266)}:host ::ng-deep .data-grid.ag-theme-alpine .ag-paging-panel{border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08));font-size:.85rem;color:var(--app-color-tab-inactive-text, #51667a)}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:5.5rem;padding:1.25rem 1rem;border-radius:10px;border:1px dashed var(--app-color-empty-border, rgba(26, 47, 69, .14));background:var(--app-color-empty-bg, rgba(243, 246, 249, .55));color:var(--app-color-tab-inactive-text, #51667a);font-size:.9rem;text-align:center;line-height:1.4}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state.empty-state--embed{min-height:4.5rem;padding:1rem .75rem}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state .empty-state__icon{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:50%;font-size:1rem;color:var(--app-color-text-secondary, rgba(61, 82, 102, .85));background:var(--app-color-skeleton-track, rgba(26, 47, 69, .06));border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08))}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state .empty-state__message{margin:0;max-width:28rem;font-size:.9rem;font-weight:500;color:var(--app-color-tab-inactive-text, #51667a)}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state .empty-state__description{margin:0;max-width:28rem;font-size:.8rem;color:var(--app-color-text-muted, #6b8299)}\n"], dependencies: [{ kind: "component", type: AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "excludeHiddenColumnsFromQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "advancedFilterModel", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "suppressChartToolPanelsButton", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDuration", "cellFlashDelay", "cellFadeDuration", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "suppressGroupMaintainValueType", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideInfiniteScroll", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "functionsPassive", "enableGroupEdit", "initialState", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "gridPreDestroyed", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: SkeletonTableComponent, selector: "app-skeleton-table", inputs: ["columnCount", "rowCount", "showPager", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
219
+ }
220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataGridComponent, decorators: [{
221
+ type: Component,
222
+ args: [{ selector: 'app-data-grid', standalone: true, imports: [AgGridAngular, SkeletonTableComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"data-grid ag-theme-alpine\" [style.height]=\"hostHeight\">\n @if (loading) {\n <div class=\"data-grid__skeleton\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <span class=\"visually-hidden\">A carregar grid...</span>\n <app-skeleton-table [columnCount]=\"skeletonColumnCount\" [rowCount]=\"skeletonRowCount\" [showPager]=\"pagination\" />\n </div>\n } @else {\n <ag-grid-angular\n class=\"data-grid__ag\"\n [rowData]=\"rows\"\n [columnDefs]=\"agColumnDefs\"\n [components]=\"frameworkComponents\"\n [context]=\"actionsContext\"\n [defaultColDef]=\"defaultColDef\"\n [pagination]=\"pagination\"\n [paginationPageSize]=\"pageSize\"\n [paginationPageSizeSelector]=\"effectivePaginationPageSizeSelector\"\n [suppressCellFocus]=\"true\"\n [animateRows]=\"false\"\n [domLayout]=\"'normal'\"\n [overlayNoRowsTemplate]=\"emptyOverlayTemplate\"\n [getRowId]=\"getRowId\"\n (gridReady)=\"onGridReady($event)\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0;box-sizing:border-box}.data-grid{width:100%;min-width:0;min-height:200px;box-sizing:border-box;border-radius:10px;overflow:hidden;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));background:var(--app-color-surface, #fff)}.data-grid__ag{display:block;width:100%;height:100%}.data-grid__skeleton{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;box-sizing:border-box}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:host ::ng-deep .data-grid.ag-theme-alpine{--ag-border-color: var(--app-color-border-subtle, rgba(26, 47, 69, .12));--ag-header-background-color: var(--app-color-tab-inactive-bg, #f3f6f9);--ag-odd-row-background-color: var(--app-color-background, #fafbfc);--ag-row-hover-color: var(--app-color-hover-bg, rgba(43, 127, 217, .06));--ag-font-size: .9rem;--ag-header-height: 40px;--ag-row-height: 40px;--ag-border-radius: 0;--ag-wrapper-border-radius: 10px;--ag-selected-row-background-color: var(--app-color-selected-bg, rgba(43, 127, 217, .1));--ag-checkbox-unchecked-color: var(--app-color-text-muted, rgba(26, 47, 69, .35));--ag-range-selection-border-color: var(--ui-field-float-border-focus, #2b7fd9);font-family:inherit;color:var(--ui-field-float-input-text, #0f1b28)}:host ::ng-deep .data-grid.ag-theme-alpine .ag-header-cell-label{font-weight:600;font-size:.85rem;color:var(--app-color-text-primary, #3d5266)}:host ::ng-deep .data-grid.ag-theme-alpine .ag-paging-panel{border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08));font-size:.85rem;color:var(--app-color-tab-inactive-text, #51667a)}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:5.5rem;padding:1.25rem 1rem;border-radius:10px;border:1px dashed var(--app-color-empty-border, rgba(26, 47, 69, .14));background:var(--app-color-empty-bg, rgba(243, 246, 249, .55));color:var(--app-color-tab-inactive-text, #51667a);font-size:.9rem;text-align:center;line-height:1.4}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state.empty-state--embed{min-height:4.5rem;padding:1rem .75rem}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state .empty-state__icon{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:50%;font-size:1rem;color:var(--app-color-text-secondary, rgba(61, 82, 102, .85));background:var(--app-color-skeleton-track, rgba(26, 47, 69, .06));border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08))}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state .empty-state__message{margin:0;max-width:28rem;font-size:.9rem;font-weight:500;color:var(--app-color-tab-inactive-text, #51667a)}:host ::ng-deep .data-grid.ag-theme-alpine .empty-state .empty-state__description{margin:0;max-width:28rem;font-size:.8rem;color:var(--app-color-text-muted, #6b8299)}\n"] }]
223
+ }], propDecorators: { rows: [{
224
+ type: Input,
225
+ args: [{ required: true }]
226
+ }], columns: [{
227
+ type: Input,
228
+ args: [{ required: true }]
229
+ }], pageSize: [{
230
+ type: Input
231
+ }], loading: [{
232
+ type: Input
233
+ }], initialPaginationPage: [{
234
+ type: Input,
235
+ args: [{ transform: numberAttribute }]
236
+ }], height: [{
237
+ type: Input
238
+ }], emptyMessage: [{
239
+ type: Input
240
+ }], pagination: [{
241
+ type: Input
242
+ }], showActionsColumn: [{
243
+ type: Input
244
+ }], edit: [{
245
+ type: Output
246
+ }], remove: [{
247
+ type: Output
248
+ }], selectionChange: [{
249
+ type: Output
250
+ }], paginationChanged: [{
251
+ type: Output
252
+ }] } });
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBSU4sTUFBTSxFQUVOLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBUWhELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxvQ0FBb0MsR0FFckMsTUFBTSw2Q0FBNkMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFFeEUsTUFBTSxxQkFBcUIsR0FBRyxpQkFBaUIsQ0FBQztBQWtCaEQsTUFBTSxPQUFPLGlCQUFpQjtJQVI5QjtRQVNtQixXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLFlBQU8sR0FBc0IsSUFBSSxDQUFDO1FBTWpDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3pCOzs7V0FHRztRQUNvQywwQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDeEQsV0FBTSxHQUFrQixPQUFPLENBQUM7UUFDaEMsaUJBQVksR0FBRyw2QkFBNkIsQ0FBQztRQUM3QyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLDRGQUE0RjtRQUNuRixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFZixTQUFJLEdB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QUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztZQUM3QixDQUFDO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBeFBVLGlCQUFpQjttR0FBakIsaUJBQWlCLGlOQWNSLGVBQWUsNlJDN0RyQyw2K0JBMEJBLDRoR0RnQlksYUFBYSxra1NBQUUsc0JBQXNCOzs0RkFLcEMsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBQ1AsQ0FBQyxhQUFhLEVBQUUsc0JBQXNCLENBQUMsbUJBRy9CLHVCQUF1QixDQUFDLE1BQU07OEJBT3BCLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNFLE9BQU87c0JBQWpDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVoQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFLaUMscUJBQXFCO3NCQUEzRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFDNUIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRWEsSUFBSTtzQkFBdEIsTUFBTTtnQkFDWSxNQUFNO3NCQUF4QixNQUFNO2dCQUVZLGVBQWU7c0JBQWpDLE1BQU07Z0JBR1ksaUJBQWlCO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgbnVtYmVyQXR0cmlidXRlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFnR3JpZEFuZ3VsYXIgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHR5cGUge1xuICBDb2xEZWYsXG4gIEdldFJvd0lkUGFyYW1zLFxuICBHcmlkQXBpLFxuICBHcmlkUmVhZHlFdmVudCxcbn0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHR5cGUgeyBEYXRhR3JpZENvbHVtbiB9IGZyb20gJy4uL19tb2RlbHMvZGF0YS1ncmlkLWNvbHVtbi5tb2RlbCc7XG5pbXBvcnQgeyBidWlsZEVtcHR5U3RhdGVPdmVybGF5SHRtbCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLW92ZXJsYXkudXRpbCc7XG5pbXBvcnQge1xuICBEYXRhR3JpZEFjdGlvbnNDZWxsUmVuZGVyZXJDb21wb25lbnQsXG4gIHR5cGUgRGF0YUdyaWRBY3Rpb25zQ29udGV4dCxcbn0gZnJvbSAnLi9kYXRhLWdyaWQtYWN0aW9ucy1jZWxsLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa2VsZXRvblRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbG9hZGluZy9za2VsZXRvbi1sb2FkaW5nJztcblxuY29uc3QgQUNUSU9OU19SRU5ERVJFUl9OQU1FID0gJ2RhdGFHcmlkQWN0aW9ucyc7XG5cbi8qKiBFbWl0aWRvIHF1YW5kbyBvIHVzdcOhcmlvIG11ZGEgZGUgcMOhZ2luYSBvdSB0YW1hbmhvIGRlIHDDoWdpbmEgbmEgZ3JhZGUgcGFnaW5hZGEuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFHcmlkUGFnaW5hdGlvbkNoYW5nZUV2ZW50IHtcbiAgLyoqIMONbmRpY2UgMC1iYXNlZCBkYSBww6FnaW5hIGF0dWFsIChBUEkgYWctR3JpZCkuICovXG4gIGN1cnJlbnRQYWdlOiBudW1iZXI7XG4gIG5ld1BhZ2U6IGJvb2xlYW47XG4gIG5ld1BhZ2VTaXplOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGF0YS1ncmlkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0FnR3JpZEFuZ3VsYXIsIFNrZWxldG9uVGFibGVDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhdGEtZ3JpZC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhR3JpZENvbXBvbmVudDxUID0gdW5rbm93bj4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBncmlkQXBpOiBHcmlkQXBpPFQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGFnaW5hdGlvbkNoYW5nZWRMaXN0ZW5lcj86IChldmVudDogdW5rbm93bikgPT4gdm9pZDtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSByb3dzITogVFtdO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBjb2x1bW5zITogRGF0YUdyaWRDb2x1bW48VD5bXTtcblxuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDE1O1xuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBBcMOzcyByZW1vbnRhciBhIGdyYWRlIChleC46IHNrZWxldG9uKSwgdm9sdGEgYSBlc3RhIHDDoWdpbmEgKDAtYmFzZWQpLlxuICAgKiBTw7MgYXBsaWNhZG8gZW0gYGdyaWRSZWFkeWAgZSBxdWFuZG8gbyB2YWxvciBtdWRhIGNvbSBhIEFQSSBqw6EgZGlzcG9uw612ZWwuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBpbml0aWFsUGFnaW5hdGlvblBhZ2UgPSAwO1xuICBASW5wdXQoKSBoZWlnaHQ6IHN0cmluZyB8IG51bGwgPSAnNDIwcHgnO1xuICBASW5wdXQoKSBlbXB0eU1lc3NhZ2UgPSAnU2VtIHJlZ2lzdHJvcyBwYXJhIG1vc3RyYXIuJztcbiAgQElucHV0KCkgcGFnaW5hdGlvbiA9IHRydWU7XG4gIC8qKiBTZSBgZmFsc2VgLCBvbWl0ZSBjb2x1bmFzIGNvbSBgdHlwZTogJ2FjdGlvbnMnYCAoZWRpdGFyL3JlbW92ZXIpLiBQb3Igb21pc3PDo28gYHRydWVgLiAqL1xuICBASW5wdXQoKSBzaG93QWN0aW9uc0NvbHVtbiA9IHRydWU7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSByZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIC8qKiBSZXNlcnZhZG8gcGFyYSBldm9sdcOnw6NvIChzZWxlw6fDo28gZGUgbGluaGFzKTsgbsOjbyBsaWdhZG8gbmEgdjEgcGFyYSBtYW50ZXIgYSBVSSBtaW5pbWFsLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgLyoqIFBhZ2luYcOnw6NvIGludGVybmEgZG8gYWctR3JpZDogbXVkYW7Dp2EgZGUgcMOhZ2luYSBvdSBkZSBgcGFnZVNpemVgLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcGFnaW5hdGlvbkNoYW5nZWQgPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RGF0YUdyaWRQYWdpbmF0aW9uQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgcmVhZG9ubHkgZnJhbWV3b3JrQ29tcG9uZW50cyA9IHtcbiAgICBbQUNUSU9OU19SRU5ERVJFUl9OQU1FXTogRGF0YUdyaWRBY3Rpb25zQ2VsbFJlbmRlcmVyQ29tcG9uZW50LFxuICB9O1xuXG4gIHJlYWRvbmx5IHBhZ2luYXRpb25QYWdlU2l6ZUNob2ljZXMgPSBbMTAsIDE1LCAyNSwgNTBdO1xuXG4gIC8qKlxuICAgKiBPIEFHIEdyaWQgYXZpc2Egc2UgYHBhZ2luYXRpb25QYWdlU2l6ZWAgbsOjbyBlc3TDoSBlbSBgcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JgLlxuICAgKiBKdW50YSBgcGFnZVNpemVgIMOgcyBvcMOnw7VlcyBiYXNlIHF1YW5kbyBvIGNvbnN1bWlkb3IgdXNhIHVtIHZhbG9yIGZvcmEgZGEgbGlzdGEgKGV4LjogOCkuXG4gICAqL1xuICBnZXQgZWZmZWN0aXZlUGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3IoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIodGhpcy5wYWdlU2l6ZSk7XG4gICAgY29uc3QgYmFzZSA9IFsuLi50aGlzLnBhZ2luYXRpb25QYWdlU2l6ZUNob2ljZXNdO1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoc2l6ZSkgJiYgc2l6ZSA+IDAgJiYgIWJhc2UuaW5jbHVkZXMoc2l6ZSkpIHtcbiAgICAgIGJhc2UucHVzaChzaXplKTtcbiAgICAgIGJhc2Uuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIGdldCBza2VsZXRvbkNvbHVtbkNvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgbiA9IHRoaXMuY29sdW1ucz8ubGVuZ3RoID8/IDQ7XG4gICAgcmV0dXJuIE1hdGgubWluKDgsIE1hdGgubWF4KDIsIG4pKTtcbiAgfVxuXG4gIGdldCBza2VsZXRvblJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWluKDE0LCBNYXRoLm1heCg1LCB0aGlzLnBhZ2VTaXplKSk7XG4gIH1cblxuICByZWFkb25seSBkZWZhdWx0Q29sRGVmOiBDb2xEZWY8VD4gPSB7XG4gICAgc29ydGFibGU6IHRydWUsXG4gICAgcmVzaXphYmxlOiB0cnVlLFxuICAgIGZsZXg6IDEsXG4gICAgbWluV2lkdGg6IDEyMCxcbiAgfTtcblxuICAvKipcbiAgICogTyBBRyBHcmlkIGNvcnJlIG11aXRvcyBjYWxsYmFja3MgZm9yYSBkYSBgTmdab25lYDsgc2VtIGBydW4oKWAsIG8gcGFpIGNvbSBgT25QdXNoYFxuICAgKiBuw6NvIHZvbHRhIGEgcmVuZGVyaXphciBlIGVkaXRhci9yZW1vdmVyIHBhcmVjZSDigJxtb3J0b+KAnS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbnNDb250ZXh0OiBEYXRhR3JpZEFjdGlvbnNDb250ZXh0PFQ+ID0ge1xuICAgIG9uRWRpdFJvdzogKHJvdzogVCkgPT5cbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdC5lbWl0KHJvdyk7XG4gICAgICB9KSxcbiAgICBvblJlbW92ZVJvdzogKHJvdzogVCkgPT5cbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlLmVtaXQocm93KTtcbiAgICAgIH0pLFxuICB9O1xuXG4gIGFnQ29sdW1uRGVmczogQ29sRGVmPFQ+W10gPSBbXTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWdDb2x1bW5EZWZzID0gdGhpcy5tYXBDb2x1bW5zVG9Db2xEZWYodGhpcy5jb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSURzIGVzdMOhdmVpcyBwb3IgbGluaGEgKGV2aXRhIGAnJ2AgZHVwbGljYWRvIHF1YW5kbyBuw6NvIGV4aXN0ZSBgaWRgIG5vcyBkYWRvcykuXG4gICAqIFRlbnRhIGBpZGAsIGRlcG9pcyBgc2t1YCAoY29tdW0gZW0gZ3JhZGVzIGRlIHByb2R1dG8pLCBzZW7Do28gaW1wcmVzc8OjbyBkaWdpdGFsIGRvIG9iamV0by5cbiAgICovXG4gIHJlYWRvbmx5IGdldFJvd0lkID0gKHBhcmFtczogR2V0Um93SWRQYXJhbXM8VD4pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGQgPSBwYXJhbXMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWQpIHtcbiAgICAgIHJldHVybiAnX19uby1yb3ctZGF0YSc7XG4gICAgfVxuICAgIGNvbnN0IGlkVmFsID0gZFsnaWQnXTtcbiAgICBpZiAoaWRWYWwgIT09IHVuZGVmaW5lZCAmJiBpZFZhbCAhPT0gbnVsbCAmJiBTdHJpbmcoaWRWYWwpLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaWRWYWwpO1xuICAgIH1cbiAgICBjb25zdCBza3VWYWwgPSBkWydza3UnXTtcbiAgICBpZiAoc2t1VmFsICE9PSB1bmRlZmluZWQgJiYgc2t1VmFsICE9PSBudWxsICYmIFN0cmluZyhza3VWYWwpLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIHJldHVybiBgc2t1OiR7U3RyaW5nKHNrdVZhbCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGByb3c6JHt0aGlzLnN0YWJsZVJvd0ZpbmdlcnByaW50KGQpfWA7XG4gIH07XG5cbiAgLyoqIElkZW50aWZpY2Fkb3IgZGV0ZXJtaW7DrXN0aWNvIGUgY3VydG8gcGFyYSBsaW5oYXMgc2VtIGNoYXZlIGV4cGzDrWNpdGEuICovXG4gIHByaXZhdGUgc3RhYmxlUm93RmluZ2VycHJpbnQoZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkKS5zb3J0KCk7XG4gICAgY29uc3QgcyA9IGtleXMubWFwKChrKSA9PiBgJHtrfToke0pTT04uc3RyaW5naWZ5KGRba10pfWApLmpvaW4oJ3wnKTtcbiAgICBsZXQgaCA9IDIxNjYxMzYyNjE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoIF49IHMuY2hhckNvZGVBdChpKTtcbiAgICAgIGggPSBNYXRoLmltdWwoaCwgMTY3Nzc2MTkpO1xuICAgIH1cbiAgICByZXR1cm4gKGggPj4+IDApLnRvU3RyaW5nKDM2KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbG9hZGluZyddICYmIHRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy5kZXRhY2hQYWdpbmF0aW9uTGlzdGVuZXJJZkxpdmUoKTtcbiAgICAgIHRoaXMuZ3JpZEFwaSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIChjaGFuZ2VzWydjb2x1bW5zJ10gfHwgY2hhbmdlc1snc2hvd0FjdGlvbnNDb2x1bW4nXSkgJiZcbiAgICAgIHRoaXMuY29sdW1ucz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLmFnQ29sdW1uRGVmcyA9IHRoaXMubWFwQ29sdW1uc1RvQ29sRGVmKHRoaXMuY29sdW1ucyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbJ2VtcHR5TWVzc2FnZSddICYmXG4gICAgICB0aGlzLmdyaWRBcGkgJiZcbiAgICAgICF0aGlzLmdyaWRBcGkuaXNEZXN0cm95ZWQoKSAmJlxuICAgICAgY2hhbmdlc1snZW1wdHlNZXNzYWdlJ10ucHJldmlvdXNWYWx1ZSAhPT1cbiAgICAgICAgY2hhbmdlc1snZW1wdHlNZXNzYWdlJ10uY3VycmVudFZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLmdyaWRBcGkuc2V0R3JpZE9wdGlvbihcbiAgICAgICAgJ292ZXJsYXlOb1Jvd3NUZW1wbGF0ZScsXG4gICAgICAgIHRoaXMuZW1wdHlPdmVybGF5VGVtcGxhdGUsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydpbml0aWFsUGFnaW5hdGlvblBhZ2UnXSAmJlxuICAgICAgdGhpcy5ncmlkQXBpICYmXG4gICAgICAhdGhpcy5ncmlkQXBpLmlzRGVzdHJveWVkKCkgJiZcbiAgICAgICFjaGFuZ2VzWydpbml0aWFsUGFnaW5hdGlvblBhZ2UnXS5maXJzdENoYW5nZVxuICAgICkge1xuICAgICAgdGhpcy5hcHBseUluaXRpYWxQYWdpbmF0aW9uUGFnZSh0aGlzLmdyaWRBcGkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoUGFnaW5hdGlvbkxpc3RlbmVySWZMaXZlKCk7XG4gICAgdGhpcy5ncmlkQXBpID0gbnVsbDtcbiAgfVxuXG4gIGdldCBlbXB0eU92ZXJsYXlUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZEVtcHR5U3RhdGVPdmVybGF5SHRtbCh0aGlzLmVtcHR5TWVzc2FnZSk7XG4gIH1cblxuICBnZXQgaG9zdEhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5oZWlnaHQgJiYgdGhpcy5oZWlnaHQudHJpbSgpKSB8fCAnNDIwcHgnO1xuICB9XG5cbiAgb25HcmlkUmVhZHkoZXY6IEdyaWRSZWFkeUV2ZW50PFQ+KTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hQYWdpbmF0aW9uTGlzdGVuZXJJZkxpdmUoKTtcblxuICAgIHRoaXMuZ3JpZEFwaSA9IGV2LmFwaTtcbiAgICBldi5hcGkuc2V0R3JpZE9wdGlvbignY29udGV4dCcsIHRoaXMuYWN0aW9uc0NvbnRleHQpO1xuXG4gICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlZExpc3RlbmVyID0gKGV2ZW50OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgeyBuZXdQYWdlPzogYm9vbGVhbjsgbmV3UGFnZVNpemU/OiBib29sZWFuIH07XG4gICAgICBpZiAoIWU/Lm5ld1BhZ2UgJiYgIWU/Lm5ld1BhZ2VTaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gZXYuYXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpO1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICBjdXJyZW50UGFnZSxcbiAgICAgICAgICBuZXdQYWdlOiAhIWUubmV3UGFnZSxcbiAgICAgICAgICBuZXdQYWdlU2l6ZTogISFlLm5ld1BhZ2VTaXplLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZXYuYXBpLmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2luYXRpb25DaGFuZ2VkJywgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlZExpc3RlbmVyKTtcblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuYXBwbHlJbml0aWFsUGFnaW5hdGlvblBhZ2UoZXYuYXBpKSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbFBhZ2luYXRpb25QYWdlKGFwaTogR3JpZEFwaTxUPik6IHZvaWQge1xuICAgIGlmIChhcGkuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwID0gdGhpcy5pbml0aWFsUGFnaW5hdGlvblBhZ2U7XG4gICAgaWYgKHAgPiAwICYmIGFwaS5wYWdpbmF0aW9uR2V0VG90YWxQYWdlcygpID4gcCkge1xuICAgICAgYXBpLnBhZ2luYXRpb25Hb1RvUGFnZShwKTtcbiAgICB9XG4gIH1cblxuICAvKiogRXZpdGEgYHJlbW92ZUV2ZW50TGlzdGVuZXJgIG5hIEFQSSBkZXBvaXMgZG8gZ3JpZCBkZXN0cnXDrWRvIChleC46IGBAaWYgKGxvYWRpbmcpYCByZW1vdmUgbyBET00pLiAqL1xuICBwcml2YXRlIGRldGFjaFBhZ2luYXRpb25MaXN0ZW5lcklmTGl2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBhcGkgPSB0aGlzLmdyaWRBcGk7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBhZ2luYXRpb25DaGFuZ2VkTGlzdGVuZXI7XG4gICAgaWYgKGFwaSAmJiBmbiAmJiAhYXBpLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgIGFwaS5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdpbmF0aW9uQ2hhbmdlZCcsIGZuKTtcbiAgICB9XG4gICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlZExpc3RlbmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2x1bW5zRm9yR3JpZChjb2xzOiBEYXRhR3JpZENvbHVtbjxUPltdKTogRGF0YUdyaWRDb2x1bW48VD5bXSB7XG4gICAgaWYgKHRoaXMuc2hvd0FjdGlvbnNDb2x1bW4pIHtcbiAgICAgIHJldHVybiBjb2xzO1xuICAgIH1cbiAgICByZXR1cm4gY29scy5maWx0ZXIoKGMpID0+IGMudHlwZSAhPT0gJ2FjdGlvbnMnKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQ29sdW1uc1RvQ29sRGVmKGNvbHM6IERhdGFHcmlkQ29sdW1uPFQ+W10pOiBDb2xEZWY8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uc0ZvckdyaWQoY29scykubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy50eXBlID09PSAnYWN0aW9ucycpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2xJZDogU3RyaW5nKGMua2V5KSxcbiAgICAgICAgICBoZWFkZXJOYW1lOiBjLmhlYWRlcixcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZmlsdGVyOiBmYWxzZSxcbiAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICAgIHN1cHByZXNzTW92YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjZWxsUmVuZGVyZXI6IEFDVElPTlNfUkVOREVSRVJfTkFNRSxcbiAgICAgICAgICB3aWR0aDogYy53aWR0aCA/PyAxNjgsXG4gICAgICAgICAgZmxleDogYy5mbGV4LFxuICAgICAgICAgIHBpbm5lZDogJ2xlZnQnLFxuICAgICAgICB9IGFzIENvbERlZjxUPjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkID0gU3RyaW5nKGMua2V5KTtcbiAgICAgIGNvbnN0IGRlZjogQ29sRGVmPFQ+ID0ge1xuICAgICAgICBmaWVsZDogZmllbGQgYXMgQ29sRGVmPFQ+WydmaWVsZCddLFxuICAgICAgICBoZWFkZXJOYW1lOiBjLmhlYWRlcixcbiAgICAgICAgc29ydGFibGU6IGMuc29ydGFibGUgIT09IGZhbHNlLFxuICAgICAgICB3aWR0aDogYy53aWR0aCxcbiAgICAgICAgZmxleDogYy5mbGV4LFxuICAgICAgfTtcbiAgICAgIGlmIChjLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRlZi50eXBlID0gJ251bWVyaWNDb2x1bW4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZjtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGEtZ3JpZCBhZy10aGVtZS1hbHBpbmVcIiBbc3R5bGUuaGVpZ2h0XT1cImhvc3RIZWlnaHRcIj5cbiAgQGlmIChsb2FkaW5nKSB7XG4gIDxkaXYgY2xhc3M9XCJkYXRhLWdyaWRfX3NrZWxldG9uXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYnVzeT1cInRydWVcIj5cbiAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkEgY2FycmVnYXIgZ3JpZC4uLjwvc3Bhbj5cbiAgICA8YXBwLXNrZWxldG9uLXRhYmxlIFtjb2x1bW5Db3VudF09XCJza2VsZXRvbkNvbHVtbkNvdW50XCIgW3Jvd0NvdW50XT1cInNrZWxldG9uUm93Q291bnRcIiBbc2hvd1BhZ2VyXT1cInBhZ2luYXRpb25cIiAvPlxuICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gIDxhZy1ncmlkLWFuZ3VsYXJcbiAgICBjbGFzcz1cImRhdGEtZ3JpZF9fYWdcIlxuICAgIFtyb3dEYXRhXT1cInJvd3NcIlxuICAgIFtjb2x1bW5EZWZzXT1cImFnQ29sdW1uRGVmc1wiXG4gICAgW2NvbXBvbmVudHNdPVwiZnJhbWV3b3JrQ29tcG9uZW50c1wiXG4gICAgW2NvbnRleHRdPVwiYWN0aW9uc0NvbnRleHRcIlxuICAgIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIlxuICAgIFtwYWdpbmF0aW9uXT1cInBhZ2luYXRpb25cIlxuICAgIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgIFtwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3Rvcl09XCJlZmZlY3RpdmVQYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvclwiXG4gICAgW3N1cHByZXNzQ2VsbEZvY3VzXT1cInRydWVcIlxuICAgIFthbmltYXRlUm93c109XCJmYWxzZVwiXG4gICAgW2RvbUxheW91dF09XCInbm9ybWFsJ1wiXG4gICAgW292ZXJsYXlOb1Jvd3NUZW1wbGF0ZV09XCJlbXB0eU92ZXJsYXlUZW1wbGF0ZVwiXG4gICAgW2dldFJvd0lkXT1cImdldFJvd0lkXCJcbiAgICAoZ3JpZFJlYWR5KT1cIm9uR3JpZFJlYWR5KCRldmVudClcIlxuICAvPlxuICB9XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,40 @@
1
+ import { ChangeDetectionStrategy, Component, Input, booleanAttribute } from '@angular/core';
2
+ import { SkeletonListComponent } from '../../loading/skeleton-loading';
3
+ import { EmptyStateComponent } from '../empty-state/empty-state.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Lista vertical de registros com estados de loading e vazio padronizados.
7
+ * O conteúdo de cada linha deve usar `app-list-item` (ou composição equivalente).
8
+ */
9
+ export class DataListComponent {
10
+ constructor() {
11
+ this.loading = false;
12
+ this.empty = false;
13
+ this.emptyTitle = 'Sem registros';
14
+ this.emptyDescription = '';
15
+ this.emptyIconClass = 'fa-solid fa-inbox';
16
+ /** Linhas de skeleton em modo loading. */
17
+ this.skeletonRows = 5;
18
+ }
19
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
20
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DataListComponent, isStandalone: true, selector: "app-data-list", inputs: { loading: ["loading", "loading", booleanAttribute], empty: ["empty", "empty", booleanAttribute], emptyTitle: "emptyTitle", emptyDescription: "emptyDescription", emptyIconClass: "emptyIconClass", skeletonRows: "skeletonRows" }, ngImport: i0, template: "<div class=\"data-list\" [attr.aria-busy]=\"loading ? true : null\">\r\n @if (loading) {\r\n <div class=\"data-list__loading\" role=\"status\" aria-live=\"polite\">\r\n <app-skeleton-list\r\n [rows]=\"skeletonRows\"\r\n [leading]=\"true\"\r\n rowGap=\"0.5rem\"\r\n lineHeight=\"0.85rem\"\r\n />\r\n </div>\r\n } @else if (empty) {\r\n <app-empty-state\r\n [message]=\"emptyTitle\"\r\n [description]=\"emptyDescription\"\r\n [iconClass]=\"emptyIconClass\"\r\n [embed]=\"true\"\r\n />\r\n } @else {\r\n <div class=\"data-list__items\" role=\"list\">\r\n <ng-content />\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;min-width:0}.data-list{width:100%;min-width:0;box-sizing:border-box}.data-list__loading{padding:.25rem 0}.data-list__items{display:flex;flex-direction:column;gap:.35rem;margin:0;padding:0;list-style:none}\n"], dependencies: [{ kind: "component", type: SkeletonListComponent, selector: "app-skeleton-list", inputs: ["rows", "leading", "rowGap", "lineHeight", "animate"] }, { kind: "component", type: EmptyStateComponent, selector: "app-empty-state", inputs: ["message", "description", "iconClass", "variant", "embed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataListComponent, decorators: [{
23
+ type: Component,
24
+ args: [{ selector: 'app-data-list', standalone: true, imports: [SkeletonListComponent, EmptyStateComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"data-list\" [attr.aria-busy]=\"loading ? true : null\">\r\n @if (loading) {\r\n <div class=\"data-list__loading\" role=\"status\" aria-live=\"polite\">\r\n <app-skeleton-list\r\n [rows]=\"skeletonRows\"\r\n [leading]=\"true\"\r\n rowGap=\"0.5rem\"\r\n lineHeight=\"0.85rem\"\r\n />\r\n </div>\r\n } @else if (empty) {\r\n <app-empty-state\r\n [message]=\"emptyTitle\"\r\n [description]=\"emptyDescription\"\r\n [iconClass]=\"emptyIconClass\"\r\n [embed]=\"true\"\r\n />\r\n } @else {\r\n <div class=\"data-list__items\" role=\"list\">\r\n <ng-content />\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;min-width:0}.data-list{width:100%;min-width:0;box-sizing:border-box}.data-list__loading{padding:.25rem 0}.data-list__items{display:flex;flex-direction:column;gap:.35rem;margin:0;padding:0;list-style:none}\n"] }]
25
+ }], propDecorators: { loading: [{
26
+ type: Input,
27
+ args: [{ transform: booleanAttribute }]
28
+ }], empty: [{
29
+ type: Input,
30
+ args: [{ transform: booleanAttribute }]
31
+ }], emptyTitle: [{
32
+ type: Input
33
+ }], emptyDescription: [{
34
+ type: Input
35
+ }], emptyIconClass: [{
36
+ type: Input
37
+ }], skeletonRows: [{
38
+ type: Input
39
+ }] } });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L2RhdGEtbGlzdC9kYXRhLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvZGF0YS1saXN0L2RhdGEtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFFM0U7OztHQUdHO0FBU0gsTUFBTSxPQUFPLGlCQUFpQjtJQVI5QjtRQVMwQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLFVBQUssR0FBRyxLQUFLLENBQUM7UUFFN0MsZUFBVSxHQUFHLGVBQWUsQ0FBQztRQUU3QixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFdEIsbUJBQWMsR0FBRyxtQkFBbUIsQ0FBQztRQUU5QywwQ0FBMEM7UUFDakMsaUJBQVksR0FBRyxDQUFDLENBQUM7S0FDM0I7K0dBYlksaUJBQWlCO21HQUFqQixpQkFBaUIsMkZBQ1IsZ0JBQWdCLDZCQUVoQixnQkFBZ0IsNkpDbkJ0Qyw0cUJBdUJBLHVTRFpZLHFCQUFxQiw4SEFBRSxtQkFBbUI7OzRGQUt6QyxpQkFBaUI7a0JBUjdCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUCxDQUFDLHFCQUFxQixFQUFFLG1CQUFtQixDQUFDLG1CQUdwQyx1QkFBdUIsQ0FBQyxNQUFNOzhCQUdQLE9BQU87c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRUUsS0FBSztzQkFBNUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFN0IsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIGJvb2xlYW5BdHRyaWJ1dGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNrZWxldG9uTGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2xvYWRpbmcvc2tlbGV0b24tbG9hZGluZyc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcblxuLyoqXG4gKiBMaXN0YSB2ZXJ0aWNhbCBkZSByZWdpc3Ryb3MgY29tIGVzdGFkb3MgZGUgbG9hZGluZyBlIHZhemlvIHBhZHJvbml6YWRvcy5cbiAqIE8gY29udGXDumRvIGRlIGNhZGEgbGluaGEgZGV2ZSB1c2FyIGBhcHAtbGlzdC1pdGVtYCAob3UgY29tcG9zacOnw6NvIGVxdWl2YWxlbnRlKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRhdGEtbGlzdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtTa2VsZXRvbkxpc3RDb21wb25lbnQsIEVtcHR5U3RhdGVDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhdGEtbGlzdC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhTGlzdENvbXBvbmVudCB7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBsb2FkaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVtcHR5ID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZW1wdHlUaXRsZSA9ICdTZW0gcmVnaXN0cm9zJztcblxuICBASW5wdXQoKSBlbXB0eURlc2NyaXB0aW9uID0gJyc7XG5cbiAgQElucHV0KCkgZW1wdHlJY29uQ2xhc3MgPSAnZmEtc29saWQgZmEtaW5ib3gnO1xuXG4gIC8qKiBMaW5oYXMgZGUgc2tlbGV0b24gZW0gbW9kbyBsb2FkaW5nLiAqL1xuICBASW5wdXQoKSBza2VsZXRvblJvd3MgPSA1O1xufVxuIiwiPGRpdiBjbGFzcz1cImRhdGEtbGlzdFwiIFthdHRyLmFyaWEtYnVzeV09XCJsb2FkaW5nID8gdHJ1ZSA6IG51bGxcIj5cclxuICBAaWYgKGxvYWRpbmcpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJkYXRhLWxpc3RfX2xvYWRpbmdcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XHJcbiAgICAgIDxhcHAtc2tlbGV0b24tbGlzdFxyXG4gICAgICAgIFtyb3dzXT1cInNrZWxldG9uUm93c1wiXHJcbiAgICAgICAgW2xlYWRpbmddPVwidHJ1ZVwiXHJcbiAgICAgICAgcm93R2FwPVwiMC41cmVtXCJcclxuICAgICAgICBsaW5lSGVpZ2h0PVwiMC44NXJlbVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICB9IEBlbHNlIGlmIChlbXB0eSkge1xyXG4gICAgPGFwcC1lbXB0eS1zdGF0ZVxyXG4gICAgICBbbWVzc2FnZV09XCJlbXB0eVRpdGxlXCJcclxuICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5RGVzY3JpcHRpb25cIlxyXG4gICAgICBbaWNvbkNsYXNzXT1cImVtcHR5SWNvbkNsYXNzXCJcclxuICAgICAgW2VtYmVkXT1cInRydWVcIlxyXG4gICAgLz5cclxuICB9IEBlbHNlIHtcclxuICAgIDxkaXYgY2xhc3M9XCJkYXRhLWxpc3RfX2l0ZW1zXCIgcm9sZT1cImxpc3RcIj5cclxuICAgICAgPG5nLWNvbnRlbnQgLz5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** Barra de consulta: pesquisa, filtros, ações e contador (slots `toolbar-start` / `toolbar-end`). */
4
+ export class DataToolbarComponent {
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DataToolbarComponent, isStandalone: true, selector: "app-data-toolbar", ngImport: i0, template: "<div class=\"data-toolbar\">\r\n <div class=\"data-toolbar__start\">\r\n <ng-content select=\"[toolbar-start]\"></ng-content>\r\n </div>\r\n <div class=\"data-toolbar__end\">\r\n <ng-content select=\"[toolbar-end]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0}.data-toolbar{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:flex-start;gap:.65rem .75rem;width:100%;min-width:0;box-sizing:border-box}.data-toolbar__start,.data-toolbar__end{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.5rem .75rem;min-width:0}.data-toolbar__start{flex:1 1 auto;min-width:0}.data-toolbar__end{flex:0 1 auto;justify-content:flex-end}.data-toolbar__end:not(:empty){margin-left:auto}@media (max-width: 39.98rem){.data-toolbar{flex-direction:column;align-items:stretch}.data-toolbar__end{justify-content:flex-start}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataToolbarComponent, decorators: [{
9
+ type: Component,
10
+ args: [{ selector: 'app-data-toolbar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"data-toolbar\">\r\n <div class=\"data-toolbar__start\">\r\n <ng-content select=\"[toolbar-start]\"></ng-content>\r\n </div>\r\n <div class=\"data-toolbar__end\">\r\n <ng-content select=\"[toolbar-end]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0}.data-toolbar{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:flex-start;gap:.65rem .75rem;width:100%;min-width:0;box-sizing:border-box}.data-toolbar__start,.data-toolbar__end{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.5rem .75rem;min-width:0}.data-toolbar__start{flex:1 1 auto;min-width:0}.data-toolbar__end{flex:0 1 auto;justify-content:flex-end}.data-toolbar__end:not(:empty){margin-left:auto}@media (max-width: 39.98rem){.data-toolbar{flex-direction:column;align-items:stretch}.data-toolbar__end{justify-content:flex-start}}\n"] }]
11
+ }] });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L2RhdGEtdG9vbGJhci9kYXRhLXRvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvZGF0YS10b29sYmFyL2RhdGEtdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUVuRSxzR0FBc0c7QUFRdEcsTUFBTSxPQUFPLG9CQUFvQjsrR0FBcEIsb0JBQW9CO21HQUFwQixvQkFBb0IsNEVDVmpDLDBRQVFBOzs0RkRFYSxvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKiBCYXJyYSBkZSBjb25zdWx0YTogcGVzcXVpc2EsIGZpbHRyb3MsIGHDp8O1ZXMgZSBjb250YWRvciAoc2xvdHMgYHRvb2xiYXItc3RhcnRgIC8gYHRvb2xiYXItZW5kYCkuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWRhdGEtdG9vbGJhcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZGF0YS10b29sYmFyLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUb29sYmFyQ29tcG9uZW50IHt9XHJcbiIsIjxkaXYgY2xhc3M9XCJkYXRhLXRvb2xiYXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiZGF0YS10b29sYmFyX19zdGFydFwiPlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3Rvb2xiYXItc3RhcnRdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkYXRhLXRvb2xiYXJfX2VuZFwiPlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3Rvb2xiYXItZW5kXVwiPjwvbmctY29udGVudD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Uma linha chave → valor para usar **dentro** de `app-details-view` (projeção).
5
+ * O host usa `display: contents` para manter `<dl>` > `<dt>`/`<dd>` válidos.
6
+ */
7
+ export class DetailsFieldComponent {
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailsFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DetailsFieldComponent, isStandalone: true, selector: "app-details-field", inputs: { label: "label" }, host: { styleAttribute: "display: contents", classAttribute: "details-field-host" }, ngImport: i0, template: "<dt class=\"details-field__label\">{{ label }}</dt>\r\n<dd class=\"details-field__value\">\r\n <ng-content />\r\n</dd>\r\n", styles: [".details-field__label{margin:0;padding:0;font-size:.78rem;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--app-color-text-muted, #6b8299);line-height:1.35}.details-field__value{margin:0;padding:0;font-size:.9rem;font-weight:500;color:var(--app-color-text-primary, #1a2f45);line-height:1.45;word-break:break-word;min-width:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailsFieldComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'app-details-field', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
14
+ class: 'details-field-host',
15
+ style: 'display: contents',
16
+ }, template: "<dt class=\"details-field__label\">{{ label }}</dt>\r\n<dd class=\"details-field__value\">\r\n <ng-content />\r\n</dd>\r\n", styles: [".details-field__label{margin:0;padding:0;font-size:.78rem;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--app-color-text-muted, #6b8299);line-height:1.35}.details-field__value{margin:0;padding:0;font-size:.9rem;font-weight:500;color:var(--app-color-text-primary, #1a2f45);line-height:1.45;word-break:break-word;min-width:0}\n"] }]
17
+ }], propDecorators: { label: [{
18
+ type: Input,
19
+ args: [{ required: true }]
20
+ }] } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlscy1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RhdGEtZGlzcGxheS9kZXRhaWxzLWZpZWxkL2RldGFpbHMtZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvZGV0YWlscy1maWVsZC9kZXRhaWxzLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUxRTs7O0dBR0c7QUFZSCxNQUFNLE9BQU8scUJBQXFCOytHQUFyQixxQkFBcUI7bUdBQXJCLHFCQUFxQiw4TENqQmxDLDZIQUlBOzs0RkRhYSxxQkFBcUI7a0JBWGpDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDSixLQUFLLEVBQUUsb0JBQW9CO3dCQUMzQixLQUFLLEVBQUUsbUJBQW1CO3FCQUMzQjs4QkFHMEIsS0FBSztzQkFBL0IsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIFVtYSBsaW5oYSBjaGF2ZSDihpIgdmFsb3IgcGFyYSB1c2FyICoqZGVudHJvKiogZGUgYGFwcC1kZXRhaWxzLXZpZXdgIChwcm9qZcOnw6NvKS5cclxuICogTyBob3N0IHVzYSBgZGlzcGxheTogY29udGVudHNgIHBhcmEgbWFudGVyIGA8ZGw+YCA+IGA8ZHQ+YC9gPGRkPmAgdsOhbGlkb3MuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1kZXRhaWxzLWZpZWxkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWxzLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZGV0YWlscy1maWVsZC5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6ICdkZXRhaWxzLWZpZWxkLWhvc3QnLFxyXG4gICAgc3R5bGU6ICdkaXNwbGF5OiBjb250ZW50cycsXHJcbiAgfSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERldGFpbHNGaWVsZENvbXBvbmVudCB7XHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbGFiZWwhOiBzdHJpbmc7XHJcbn1cclxuIiwiPGR0IGNsYXNzPVwiZGV0YWlscy1maWVsZF9fbGFiZWxcIj57eyBsYWJlbCB9fTwvZHQ+XHJcbjxkZCBjbGFzcz1cImRldGFpbHMtZmllbGRfX3ZhbHVlXCI+XHJcbiAgPG5nLWNvbnRlbnQgLz5cclxuPC9kZD5cclxuIl19