structra-ui 0.1.15 → 0.1.17
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.
- package/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
- package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
- package/esm2022/app/_utils/estados-br.data.mjs +37 -0
- package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
- package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
- package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +97 -0
- package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
- package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
- package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
- package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
- package/esm2022/app/app-shell/index.mjs +19 -0
- package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
- package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
- package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
- package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
- package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
- package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
- package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
- package/esm2022/app/buttons/index.mjs +2 -0
- package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
- package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
- package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
- package/esm2022/app/data-display/_models/index.mjs +2 -0
- package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
- package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
- package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
- package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
- package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
- package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
- package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
- package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
- package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
- package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
- package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
- package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
- package/esm2022/app/data-display/index.mjs +19 -0
- package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
- package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
- package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
- package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
- package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
- package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
- package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +22 -0
- package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
- package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +200 -0
- package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +47 -0
- package/esm2022/app/dialogs/index.mjs +12 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +38 -0
- package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
- package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
- package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
- package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
- package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
- package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
- package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
- package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
- package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
- package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
- package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
- package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
- package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
- package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
- package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
- package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
- package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
- package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
- package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
- package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
- package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
- package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
- package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
- package/esm2022/app/fields/input-fields/index.mjs +22 -0
- package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
- package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
- package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
- package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
- package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
- package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
- package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
- package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
- package/esm2022/app/form-layout/_models/index.mjs +2 -0
- package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
- package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
- package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
- package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
- package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
- package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
- package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
- package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
- package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
- package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
- package/esm2022/app/form-layout/index.mjs +14 -0
- package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
- package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +343 -0
- package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
- package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
- package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
- package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
- package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
- package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
- package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
- package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
- package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
- package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
- package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
- package/esm2022/app/menus/drawer/drawer.component.mjs +142 -0
- package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
- package/esm2022/app/menus/index.mjs +11 -0
- package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
- package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
- package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
- package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
- package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
- package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
- package/esm2022/app/overlay/index.mjs +21 -0
- package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
- package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
- package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
- package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
- package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
- package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
- package/esm2022/app/theme/app-theme.service.mjs +49 -0
- package/esm2022/app/theme/index.mjs +2 -0
- package/esm2022/structra-public-api.mjs +18 -0
- package/esm2022/structra-ui.mjs +5 -0
- package/esm2022/structra-version.mjs +3 -0
- package/fesm2022/structra-ui.mjs +8971 -0
- package/fesm2022/structra-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +15 -6
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatação e normalização de data/hora no padrão pt-BR (lib ui-fields).
|
|
3
|
+
*/
|
|
4
|
+
function pad2(n) {
|
|
5
|
+
return n.toString().padStart(2, '0');
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Exibe data como dd/mm/aaaa; com `showTimeHours`, dd/mm/aaaa hh:mm:ss (24h).
|
|
9
|
+
*/
|
|
10
|
+
export function formatDateTimePtBr(date, showTimeHours) {
|
|
11
|
+
const d = pad2(date.getDate());
|
|
12
|
+
const m = pad2(date.getMonth() + 1);
|
|
13
|
+
const y = date.getFullYear();
|
|
14
|
+
if (!showTimeHours) {
|
|
15
|
+
return `${d}/${m}/${y}`;
|
|
16
|
+
}
|
|
17
|
+
return `${d}/${m}/${y} ${pad2(date.getHours())}:${pad2(date.getMinutes())}:${pad2(date.getSeconds())}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Interpreta valor vindo do formulário / API.
|
|
21
|
+
* Aceita data local sem fuso (`YYYY-MM-DD` ou `YYYY-MM-DDTHH:mm:ss`), `Date`, número ou ISO com `Z`.
|
|
22
|
+
*/
|
|
23
|
+
export function parseUiFieldDateValue(value) {
|
|
24
|
+
if (value == null || value === '') {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (value instanceof Date) {
|
|
28
|
+
return Number.isNaN(value.getTime()) ? null : value;
|
|
29
|
+
}
|
|
30
|
+
if (typeof value === 'number') {
|
|
31
|
+
const d = new Date(value);
|
|
32
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
33
|
+
}
|
|
34
|
+
if (typeof value !== 'string') {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const s = value.trim();
|
|
38
|
+
const localDateOnly = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
|
|
39
|
+
if (localDateOnly) {
|
|
40
|
+
const y = +localDateOnly[1];
|
|
41
|
+
const m = +localDateOnly[2] - 1;
|
|
42
|
+
const d = +localDateOnly[3];
|
|
43
|
+
const out = new Date(y, m, d, 0, 0, 0, 0);
|
|
44
|
+
return Number.isNaN(out.getTime()) ? null : out;
|
|
45
|
+
}
|
|
46
|
+
const localDt = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/.exec(s);
|
|
47
|
+
if (localDt) {
|
|
48
|
+
const out = new Date(+localDt[1], +localDt[2] - 1, +localDt[3], +localDt[4], +localDt[5], +localDt[6], 0);
|
|
49
|
+
return Number.isNaN(out.getTime()) ? null : out;
|
|
50
|
+
}
|
|
51
|
+
const d = new Date(s);
|
|
52
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Valor persistido no `FormControl`: horário de parede local, sem `Z`
|
|
56
|
+
* (evita 14:59 no input virar 17:59 no `JSON.stringify` de `Date`).
|
|
57
|
+
*/
|
|
58
|
+
export function formatUiFieldDateValue(d, showTimeHours) {
|
|
59
|
+
const y = d.getFullYear();
|
|
60
|
+
const mo = pad2(d.getMonth() + 1);
|
|
61
|
+
const day = pad2(d.getDate());
|
|
62
|
+
if (!showTimeHours) {
|
|
63
|
+
return `${y}-${mo}-${day}`;
|
|
64
|
+
}
|
|
65
|
+
return `${y}-${mo}-${day}T${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`;
|
|
66
|
+
}
|
|
67
|
+
/** @deprecated use {@link parseUiFieldDateValue} */
|
|
68
|
+
export function normalizeFormDateValue(value) {
|
|
69
|
+
return parseUiFieldDateValue(value);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Data escolhida no calendário: meia-noite local, ou com `showTimeHours` a hora completa
|
|
73
|
+
* (h, min, s, ms) do instante da seleção.
|
|
74
|
+
*/
|
|
75
|
+
export function applyPickedCalendarDate(picked, showTimeHours) {
|
|
76
|
+
if (!showTimeHours) {
|
|
77
|
+
return new Date(picked.getFullYear(), picked.getMonth(), picked.getDate(), 0, 0, 0, 0);
|
|
78
|
+
}
|
|
79
|
+
const now = new Date();
|
|
80
|
+
return new Date(picked.getFullYear(), picked.getMonth(), picked.getDate(), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1wdC1ici51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvX3V0aWxzL2RhdGUtcHQtYnIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxTQUFTLElBQUksQ0FBQyxDQUFTO0lBQ3JCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVUsRUFBRSxhQUFzQjtJQUNuRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN6RyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQWM7SUFDbEQsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7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byBkZSBkYXRhL2hvcmEgbm8gcGFkcsOjbyBwdC1CUiAobGliIHVpLWZpZWxkcykuXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gcGFkMihuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIHJldHVybiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEV4aWJlIGRhdGEgY29tbyBkZC9tbS9hYWFhOyBjb20gYHNob3dUaW1lSG91cnNgLCBkZC9tbS9hYWFhIGhoOm1tOnNzICgyNGgpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lUHRCcihkYXRlOiBEYXRlLCBzaG93VGltZUhvdXJzOiBib29sZWFuKTogc3RyaW5nIHtcclxuICBjb25zdCBkID0gcGFkMihkYXRlLmdldERhdGUoKSk7XHJcbiAgY29uc3QgbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSk7XHJcbiAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICBpZiAoIXNob3dUaW1lSG91cnMpIHtcclxuICAgIHJldHVybiBgJHtkfS8ke219LyR7eX1gO1xyXG4gIH1cclxuICByZXR1cm4gYCR7ZH0vJHttfS8ke3l9ICR7cGFkMihkYXRlLmdldEhvdXJzKCkpfToke3BhZDIoZGF0ZS5nZXRNaW51dGVzKCkpfToke3BhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcnByZXRhIHZhbG9yIHZpbmRvIGRvIGZvcm11bMOhcmlvIC8gQVBJLlxyXG4gKiBBY2VpdGEgZGF0YSBsb2NhbCBzZW0gZnVzbyAoYFlZWVktTU0tRERgIG91IGBZWVlZLU1NLUREVEhIOm1tOnNzYCksIGBEYXRlYCwgbsO6bWVybyBvdSBJU08gY29tIGBaYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVpRmllbGREYXRlVmFsdWUodmFsdWU6IHVua25vd24pOiBEYXRlIHwgbnVsbCB7XHJcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xyXG4gIH1cclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gbnVsbCA6IGQ7XHJcbiAgfVxyXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgY29uc3QgcyA9IHZhbHVlLnRyaW0oKTtcclxuICBjb25zdCBsb2NhbERhdGVPbmx5ID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvLmV4ZWMocyk7XHJcbiAgaWYgKGxvY2FsRGF0ZU9ubHkpIHtcclxuICAgIGNvbnN0IHkgPSArbG9jYWxEYXRlT25seVsxXTtcclxuICAgIGNvbnN0IG0gPSArbG9jYWxEYXRlT25seVsyXSAtIDE7XHJcbiAgICBjb25zdCBkID0gK2xvY2FsRGF0ZU9ubHlbM107XHJcbiAgICBjb25zdCBvdXQgPSBuZXcgRGF0ZSh5LCBtLCBkLCAwLCAwLCAwLCAwKTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ob3V0LmdldFRpbWUoKSkgPyBudWxsIDogb3V0O1xyXG4gIH1cclxuICBjb25zdCBsb2NhbER0ID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KVQoXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KSQvLmV4ZWMocyk7XHJcbiAgaWYgKGxvY2FsRHQpIHtcclxuICAgIGNvbnN0IG91dCA9IG5ldyBEYXRlKFxyXG4gICAgICArbG9jYWxEdFsxXSxcclxuICAgICAgK2xvY2FsRHRbMl0gLSAxLFxyXG4gICAgICArbG9jYWxEdFszXSxcclxuICAgICAgK2xvY2FsRHRbNF0sXHJcbiAgICAgICtsb2NhbER0WzVdLFxyXG4gICAgICArbG9jYWxEdFs2XSxcclxuICAgICAgMCxcclxuICAgICk7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG91dC5nZXRUaW1lKCkpID8gbnVsbCA6IG91dDtcclxuICB9XHJcbiAgY29uc3QgZCA9IG5ldyBEYXRlKHMpO1xyXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gbnVsbCA6IGQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWYWxvciBwZXJzaXN0aWRvIG5vIGBGb3JtQ29udHJvbGA6IGhvcsOhcmlvIGRlIHBhcmVkZSBsb2NhbCwgc2VtIGBaYFxyXG4gKiAoZXZpdGEgMTQ6NTkgbm8gaW5wdXQgdmlyYXIgMTc6NTkgbm8gYEpTT04uc3RyaW5naWZ5YCBkZSBgRGF0ZWApLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFVpRmllbGREYXRlVmFsdWUoZDogRGF0ZSwgc2hvd1RpbWVIb3VyczogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgY29uc3QgeSA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICBjb25zdCBtbyA9IHBhZDIoZC5nZXRNb250aCgpICsgMSk7XHJcbiAgY29uc3QgZGF5ID0gcGFkMihkLmdldERhdGUoKSk7XHJcbiAgaWYgKCFzaG93VGltZUhvdXJzKSB7XHJcbiAgICByZXR1cm4gYCR7eX0tJHttb30tJHtkYXl9YDtcclxuICB9XHJcbiAgcmV0dXJuIGAke3l9LSR7bW99LSR7ZGF5fVQke3BhZDIoZC5nZXRIb3VycygpKX06JHtwYWQyKGQuZ2V0TWludXRlcygpKX06JHtwYWQyKGQuZ2V0U2Vjb25kcygpKX1gO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBwYXJzZVVpRmllbGREYXRlVmFsdWV9ICovXHJcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGb3JtRGF0ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IG51bGwge1xyXG4gIHJldHVybiBwYXJzZVVpRmllbGREYXRlVmFsdWUodmFsdWUpO1xyXG59XHJcblxyXG4vKipcclxuICogRGF0YSBlc2NvbGhpZGEgbm8gY2FsZW5kw6FyaW86IG1laWEtbm9pdGUgbG9jYWwsIG91IGNvbSBgc2hvd1RpbWVIb3Vyc2AgYSBob3JhIGNvbXBsZXRhXHJcbiAqIChoLCBtaW4sIHMsIG1zKSBkbyBpbnN0YW50ZSBkYSBzZWxlw6fDo28uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQaWNrZWRDYWxlbmRhckRhdGUoXHJcbiAgcGlja2VkOiBEYXRlLFxyXG4gIHNob3dUaW1lSG91cnM6IGJvb2xlYW4sXHJcbik6IERhdGUge1xyXG4gIGlmICghc2hvd1RpbWVIb3Vycykge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKFxyXG4gICAgICBwaWNrZWQuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgcGlja2VkLmdldE1vbnRoKCksXHJcbiAgICAgIHBpY2tlZC5nZXREYXRlKCksXHJcbiAgICAgIDAsXHJcbiAgICAgIDAsXHJcbiAgICAgIDAsXHJcbiAgICAgIDAsXHJcbiAgICApO1xyXG4gIH1cclxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gIHJldHVybiBuZXcgRGF0ZShcclxuICAgIHBpY2tlZC5nZXRGdWxsWWVhcigpLFxyXG4gICAgcGlja2VkLmdldE1vbnRoKCksXHJcbiAgICBwaWNrZWQuZ2V0RGF0ZSgpLFxyXG4gICAgbm93LmdldEhvdXJzKCksXHJcbiAgICBub3cuZ2V0TWludXRlcygpLFxyXG4gICAgbm93LmdldFNlY29uZHMoKSxcclxuICAgIG5vdy5nZXRNaWxsaXNlY29uZHMoKSxcclxuICApO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilitários pt-BR fixo: vírgula decimal, ponto milhar, duas casas na formatação final.
|
|
3
|
+
*/
|
|
4
|
+
import { formatIntegerThousandsBr } from './integer-br.utils';
|
|
5
|
+
export { formatIntegerThousandsBr } from './integer-br.utils';
|
|
6
|
+
export function sanitizeDecimalBrInput(raw) {
|
|
7
|
+
return raw.replace(/[^\d,.]/g, '');
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Remove pontos e interpreta a última vírgula como separador decimal.
|
|
11
|
+
* Retorna apenas dígitos na parte inteira e até 2 na fracionária.
|
|
12
|
+
*/
|
|
13
|
+
export function extractDecimalBrParts(rawDisplay) {
|
|
14
|
+
const noDots = rawDisplay.replace(/\./g, '');
|
|
15
|
+
const lastComma = noDots.lastIndexOf(',');
|
|
16
|
+
if (lastComma === -1) {
|
|
17
|
+
return {
|
|
18
|
+
intDigits: noDots.replace(/\D/g, ''),
|
|
19
|
+
fracDigits: '',
|
|
20
|
+
hasComma: false,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const intDigits = noDots.slice(0, lastComma).replace(/\D/g, '');
|
|
24
|
+
const fracDigits = noDots
|
|
25
|
+
.slice(lastComma + 1)
|
|
26
|
+
.replace(/\D/g, '')
|
|
27
|
+
.slice(0, 2);
|
|
28
|
+
return { intDigits, fracDigits, hasComma: true };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Monta o texto exibido durante a digitação (milhares com ponto, vírgula decimal).
|
|
32
|
+
*/
|
|
33
|
+
export function buildDecimalBrDisplay(parts) {
|
|
34
|
+
const { intDigits, fracDigits, hasComma } = parts;
|
|
35
|
+
if (!hasComma) {
|
|
36
|
+
return formatIntegerThousandsBr(intDigits);
|
|
37
|
+
}
|
|
38
|
+
const intDisplay = intDigits === '' ? '0' : formatIntegerThousandsBr(intDigits);
|
|
39
|
+
return `${intDisplay},${fracDigits}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Posição semântica do cursor para remapear após reformatar.
|
|
43
|
+
*/
|
|
44
|
+
export function semanticCaretAt(value, caret) {
|
|
45
|
+
const left = value.slice(0, caret);
|
|
46
|
+
const noDots = left.replace(/\./g, '');
|
|
47
|
+
const commaIdx = noDots.indexOf(',');
|
|
48
|
+
if (commaIdx === -1) {
|
|
49
|
+
return {
|
|
50
|
+
intCount: noDots.replace(/\D/g, '').length,
|
|
51
|
+
afterComma: false,
|
|
52
|
+
fracCount: 0,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const before = noDots.slice(0, commaIdx).replace(/\D/g, '');
|
|
56
|
+
const after = noDots.slice(commaIdx + 1).replace(/\D/g, '');
|
|
57
|
+
return {
|
|
58
|
+
intCount: before.length,
|
|
59
|
+
afterComma: true,
|
|
60
|
+
fracCount: after.length,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Índice do caret no texto formatado a partir da posição semântica.
|
|
65
|
+
*/
|
|
66
|
+
export function caretIndexFromSemantic(display, target) {
|
|
67
|
+
let intCount = 0;
|
|
68
|
+
let afterComma = false;
|
|
69
|
+
let fracCount = 0;
|
|
70
|
+
for (let i = 0; i < display.length; i++) {
|
|
71
|
+
const ch = display[i];
|
|
72
|
+
if (ch === ',') {
|
|
73
|
+
if (!afterComma) {
|
|
74
|
+
afterComma = true;
|
|
75
|
+
if (target.afterComma &&
|
|
76
|
+
target.fracCount === 0 &&
|
|
77
|
+
target.intCount === intCount) {
|
|
78
|
+
return i + 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (ch === '.') {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (/\d/.test(ch)) {
|
|
87
|
+
if (!afterComma) {
|
|
88
|
+
intCount++;
|
|
89
|
+
if (!target.afterComma && intCount === target.intCount) {
|
|
90
|
+
return i + 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
fracCount++;
|
|
95
|
+
if (target.afterComma &&
|
|
96
|
+
fracCount === target.fracCount &&
|
|
97
|
+
intCount === target.intCount) {
|
|
98
|
+
return i + 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return display.length;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* String passível de parseDecimalBr a partir das partes editáveis.
|
|
107
|
+
*/
|
|
108
|
+
export function buildDecimalBrParseString(parts) {
|
|
109
|
+
if (!parts.hasComma) {
|
|
110
|
+
return parts.intDigits;
|
|
111
|
+
}
|
|
112
|
+
return `${parts.intDigits},${parts.fracDigits}`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Interpreta string já sanitizada e retorna número com até 2 casas decimais (arredondamento).
|
|
116
|
+
* Vazio → null. Vírgula como separador decimal; pontos são removidos da parte inteira.
|
|
117
|
+
*/
|
|
118
|
+
export function parseDecimalBr(sanitized) {
|
|
119
|
+
const t = sanitized.trim();
|
|
120
|
+
if (t === '') {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const lastComma = t.lastIndexOf(',');
|
|
124
|
+
let intRaw;
|
|
125
|
+
let fracRaw;
|
|
126
|
+
if (lastComma >= 0) {
|
|
127
|
+
intRaw = t.slice(0, lastComma).replace(/\./g, '');
|
|
128
|
+
fracRaw = t.slice(lastComma + 1).replace(/\./g, '');
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
intRaw = t.replace(/\./g, '');
|
|
132
|
+
fracRaw = '';
|
|
133
|
+
}
|
|
134
|
+
if (!/^\d*$/.test(intRaw) || !/^\d*$/.test(fracRaw)) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if (intRaw === '' && fracRaw === '') {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const intPart = intRaw === '' ? '0' : intRaw;
|
|
141
|
+
const fracPadded = (fracRaw + '00').slice(0, 2);
|
|
142
|
+
const n = Number(`${intPart}.${fracPadded}`);
|
|
143
|
+
if (!Number.isFinite(n)) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
return Math.round(n * 100) / 100;
|
|
147
|
+
}
|
|
148
|
+
export function formatDecimalBr(value) {
|
|
149
|
+
return new Intl.NumberFormat('pt-BR', {
|
|
150
|
+
minimumFractionDigits: 2,
|
|
151
|
+
maximumFractionDigits: 2,
|
|
152
|
+
}).format(value);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaW1hbC1ici51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvX3V0aWxzL2RlY2ltYWwtYnIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsR0FBVztJQUNoRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsVUFBa0I7SUFLdEQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLFVBQVUsRUFBRSxFQUFFO1lBQ2QsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLE1BQU07U0FDdEIsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDcEIsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7U0FDbEIsS0FBSyxDQUFDLENBQUMs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LENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYTtJQUMzQyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7UUFDcEMscUJBQXFCLEVBQUUsQ0FBQztRQUN4QixxQkFBcUIsRUFBRSxDQUFDO0tBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBVdGlsaXTDoXJpb3MgcHQtQlIgZml4bzogdsOtcmd1bGEgZGVjaW1hbCwgcG9udG8gbWlsaGFyLCBkdWFzIGNhc2FzIG5hIGZvcm1hdGHDp8OjbyBmaW5hbC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBmb3JtYXRJbnRlZ2VyVGhvdXNhbmRzQnIgfSBmcm9tICcuL2ludGVnZXItYnIudXRpbHMnO1xyXG5cclxuZXhwb3J0IHsgZm9ybWF0SW50ZWdlclRob3VzYW5kc0JyIH0gZnJvbSAnLi9pbnRlZ2VyLWJyLnV0aWxzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZURlY2ltYWxCcklucHV0KHJhdzogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gcmF3LnJlcGxhY2UoL1teXFxkLC5dL2csICcnKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSBwb250b3MgZSBpbnRlcnByZXRhIGEgw7psdGltYSB2w61yZ3VsYSBjb21vIHNlcGFyYWRvciBkZWNpbWFsLlxyXG4gKiBSZXRvcm5hIGFwZW5hcyBkw61naXRvcyBuYSBwYXJ0ZSBpbnRlaXJhIGUgYXTDqSAyIG5hIGZyYWNpb27DoXJpYS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVjaW1hbEJyUGFydHMocmF3RGlzcGxheTogc3RyaW5nKToge1xyXG4gIGludERpZ2l0czogc3RyaW5nO1xyXG4gIGZyYWNEaWdpdHM6IHN0cmluZztcclxuICBoYXNDb21tYTogYm9vbGVhbjtcclxufSB7XHJcbiAgY29uc3Qgbm9Eb3RzID0gcmF3RGlzcGxheS5yZXBsYWNlKC9cXC4vZywgJycpO1xyXG4gIGNvbnN0IGxhc3RDb21tYSA9IG5vRG90cy5sYXN0SW5kZXhPZignLCcpO1xyXG4gIGlmIChsYXN0Q29tbWEgPT09IC0xKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbnREaWdpdHM6IG5vRG90cy5yZXBsYWNlKC9cXEQvZywgJycpLFxyXG4gICAgICBmcmFjRGlnaXRzOiAnJyxcclxuICAgICAgaGFzQ29tbWE6IGZhbHNlLFxyXG4gICAgfTtcclxuICB9XHJcbiAgY29uc3QgaW50RGlnaXRzID0gbm9Eb3RzLnNsaWNlKDAsIGxhc3RDb21tYSkucmVwbGFjZSgvXFxEL2csICcnKTtcclxuICBjb25zdCBmcmFjRGlnaXRzID0gbm9Eb3RzXHJcbiAgICAuc2xpY2UobGFzdENvbW1hICsgMSlcclxuICAgIC5yZXBsYWNlKC9cXEQvZywgJycpXHJcbiAgICAuc2xpY2UoMCwgMik7XHJcbiAgcmV0dXJuIHsgaW50RGlnaXRzLCBmcmFjRGlnaXRzLCBoYXNDb21tYTogdHJ1ZSB9O1xyXG59XHJcblxyXG4vKipcclxuICogTW9udGEgbyB0ZXh0byBleGliaWRvIGR1cmFudGUgYSBkaWdpdGHDp8OjbyAobWlsaGFyZXMgY29tIHBvbnRvLCB2w61yZ3VsYSBkZWNpbWFsKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlY2ltYWxCckRpc3BsYXkocGFydHM6IHtcclxuICBpbnREaWdpdHM6IHN0cmluZztcclxuICBmcmFjRGlnaXRzOiBzdHJpbmc7XHJcbiAgaGFzQ29tbWE6IGJvb2xlYW47XHJcbn0pOiBzdHJpbmcge1xyXG4gIGNvbnN0IHsgaW50RGlnaXRzLCBmcmFjRGlnaXRzLCBoYXNDb21tYSB9ID0gcGFydHM7XHJcbiAgaWYgKCFoYXNDb21tYSkge1xyXG4gICAgcmV0dXJuIGZvcm1hdEludGVnZXJUaG91c2FuZHNCcihpbnREaWdpdHMpO1xyXG4gIH1cclxuICBjb25zdCBpbnREaXNwbGF5ID1cclxuICAgIGludERpZ2l0cyA9PT0gJycgPyAnMCcgOiBmb3JtYXRJbnRlZ2VyVGhvdXNhbmRzQnIoaW50RGlnaXRzKTtcclxuICByZXR1cm4gYCR7aW50RGlzcGxheX0sJHtmcmFjRGlnaXRzfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQb3Npw6fDo28gc2Vtw6JudGljYSBkbyBjdXJzb3IgcGFyYSByZW1hcGVhciBhcMOzcyByZWZvcm1hdGFyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNlbWFudGljQ2FyZXRBdChcclxuICB2YWx1ZTogc3RyaW5nLFxyXG4gIGNhcmV0OiBudW1iZXIsXHJcbik6IHsgaW50Q291bnQ6IG51bWJlcjsgYWZ0ZXJDb21tYTogYm9vbGVhbjsgZnJhY0NvdW50OiBudW1iZXIgfSB7XHJcbiAgY29uc3QgbGVmdCA9IHZhbHVlLnNsaWNlKDAsIGNhcmV0KTtcclxuICBjb25zdCBub0RvdHMgPSBsZWZ0LnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbiAgY29uc3QgY29tbWFJZHggPSBub0RvdHMuaW5kZXhPZignLCcpO1xyXG4gIGlmIChjb21tYUlkeCA9PT0gLTEpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGludENvdW50OiBub0RvdHMucmVwbGFjZSgvXFxEL2csICcnKS5sZW5ndGgsXHJcbiAgICAgIGFmdGVyQ29tbWE6IGZhbHNlLFxyXG4gICAgICBmcmFjQ291bnQ6IDAsXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCBiZWZvcmUgPSBub0RvdHMuc2xpY2UoMCwgY29tbWFJZHgpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XHJcbiAgY29uc3QgYWZ0ZXIgPSBub0RvdHMuc2xpY2UoY29tbWFJZHggKyAxKS5yZXBsYWNlKC9cXEQvZywgJycpO1xyXG4gIHJldHVybiB7XHJcbiAgICBpbnRDb3VudDogYmVmb3JlLmxlbmd0aCxcclxuICAgIGFmdGVyQ29tbWE6IHRydWUsXHJcbiAgICBmcmFjQ291bnQ6IGFmdGVyLmxlbmd0aCxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogw41uZGljZSBkbyBjYXJldCBubyB0ZXh0byBmb3JtYXRhZG8gYSBwYXJ0aXIgZGEgcG9zacOnw6NvIHNlbcOibnRpY2EuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2FyZXRJbmRleEZyb21TZW1hbnRpYyhcclxuICBkaXNwbGF5OiBzdHJpbmcsXHJcbiAgdGFyZ2V0OiB7IGludENvdW50OiBudW1iZXI7IGFmdGVyQ29tbWE6IGJvb2xlYW47IGZyYWNDb3VudDogbnVtYmVyIH0sXHJcbik6IG51bWJlciB7XHJcbiAgbGV0IGludENvdW50ID0gMDtcclxuICBsZXQgYWZ0ZXJDb21tYSA9IGZhbHNlO1xyXG4gIGxldCBmcmFjQ291bnQgPSAwO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXkubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGNoID0gZGlzcGxheVtpXTtcclxuICAgIGlmIChjaCA9PT0gJywnKSB7XHJcbiAgICAgIGlmICghYWZ0ZXJDb21tYSkge1xyXG4gICAgICAgIGFmdGVyQ29tbWEgPSB0cnVlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRhcmdldC5hZnRlckNvbW1hICYmXHJcbiAgICAgICAgICB0YXJnZXQuZnJhY0NvdW50ID09PSAwICYmXHJcbiAgICAgICAgICB0YXJnZXQuaW50Q291bnQgPT09IGludENvdW50XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gaSArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoID09PSAnLicpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAoL1xcZC8udGVzdChjaCkpIHtcclxuICAgICAgaWYgKCFhZnRlckNvbW1hKSB7XHJcbiAgICAgICAgaW50Q291bnQrKztcclxuICAgICAgICBpZiAoIXRhcmdldC5hZnRlckNvbW1hICYmIGludENvdW50ID09PSB0YXJnZXQuaW50Q291bnQpIHtcclxuICAgICAgICAgIHJldHVybiBpICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZnJhY0NvdW50Kys7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGFyZ2V0LmFmdGVyQ29tbWEgJiZcclxuICAgICAgICAgIGZyYWNDb3VudCA9PT0gdGFyZ2V0LmZyYWNDb3VudCAmJlxyXG4gICAgICAgICAgaW50Q291bnQgPT09IHRhcmdldC5pbnRDb3VudFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIGkgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gZGlzcGxheS5sZW5ndGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdHJpbmcgcGFzc8OtdmVsIGRlIHBhcnNlRGVjaW1hbEJyIGEgcGFydGlyIGRhcyBwYXJ0ZXMgZWRpdMOhdmVpcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlY2ltYWxCclBhcnNlU3RyaW5nKHBhcnRzOiB7XHJcbiAgaW50RGlnaXRzOiBzdHJpbmc7XHJcbiAgZnJhY0RpZ2l0czogc3RyaW5nO1xyXG4gIGhhc0NvbW1hOiBib29sZWFuO1xyXG59KTogc3RyaW5nIHtcclxuICBpZiAoIXBhcnRzLmhhc0NvbW1hKSB7XHJcbiAgICByZXR1cm4gcGFydHMuaW50RGlnaXRzO1xyXG4gIH1cclxuICByZXR1cm4gYCR7cGFydHMuaW50RGlnaXRzfSwke3BhcnRzLmZyYWNEaWdpdHN9YDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVycHJldGEgc3RyaW5nIGrDoSBzYW5pdGl6YWRhIGUgcmV0b3JuYSBuw7ptZXJvIGNvbSBhdMOpIDIgY2FzYXMgZGVjaW1haXMgKGFycmVkb25kYW1lbnRvKS5cclxuICogVmF6aW8g4oaSIG51bGwuIFbDrXJndWxhIGNvbW8gc2VwYXJhZG9yIGRlY2ltYWw7IHBvbnRvcyBzw6NvIHJlbW92aWRvcyBkYSBwYXJ0ZSBpbnRlaXJhLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVjaW1hbEJyKHNhbml0aXplZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgY29uc3QgdCA9IHNhbml0aXplZC50cmltKCk7XHJcbiAgaWYgKHQgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGxhc3RDb21tYSA9IHQubGFzdEluZGV4T2YoJywnKTtcclxuICBsZXQgaW50UmF3OiBzdHJpbmc7XHJcbiAgbGV0IGZyYWNSYXc6IHN0cmluZztcclxuXHJcbiAgaWYgKGxhc3RDb21tYSA+PSAwKSB7XHJcbiAgICBpbnRSYXcgPSB0LnNsaWNlKDAsIGxhc3RDb21tYSkucmVwbGFjZSgvXFwuL2csICcnKTtcclxuICAgIGZyYWNSYXcgPSB0LnNsaWNlKGxhc3RDb21tYSArIDEpLnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGludFJhdyA9IHQucmVwbGFjZSgvXFwuL2csICcnKTtcclxuICAgIGZyYWNSYXcgPSAnJztcclxuICB9XHJcblxyXG4gIGlmICghL15cXGQqJC8udGVzdChpbnRSYXcpIHx8ICEvXlxcZCokLy50ZXN0KGZyYWNSYXcpKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgaWYgKGludFJhdyA9PT0gJycgJiYgZnJhY1JhdyA9PT0gJycpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaW50UGFydCA9IGludFJhdyA9PT0gJycgPyAnMCcgOiBpbnRSYXc7XHJcbiAgY29uc3QgZnJhY1BhZGRlZCA9IChmcmFjUmF3ICsgJzAwJykuc2xpY2UoMCwgMik7XHJcbiAgY29uc3QgbiA9IE51bWJlcihgJHtpbnRQYXJ0fS4ke2ZyYWNQYWRkZWR9YCk7XHJcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobikpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICByZXR1cm4gTWF0aC5yb3VuZChuICogMTAwKSAvIDEwMDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxCcih2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHtcclxuICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMixcclxuICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMixcclxuICB9KS5mb3JtYXQodmFsdWUpO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Unidades federativas do Brasil (nome + sigla). Ordem alfabética por nome. */
|
|
2
|
+
export const BR_ESTADOS_NOME_SIGLA = [
|
|
3
|
+
{ nome: 'Acre', sigla: 'AC' },
|
|
4
|
+
{ nome: 'Alagoas', sigla: 'AL' },
|
|
5
|
+
{ nome: 'Amapá', sigla: 'AP' },
|
|
6
|
+
{ nome: 'Amazonas', sigla: 'AM' },
|
|
7
|
+
{ nome: 'Bahia', sigla: 'BA' },
|
|
8
|
+
{ nome: 'Ceará', sigla: 'CE' },
|
|
9
|
+
{ nome: 'Distrito Federal', sigla: 'DF' },
|
|
10
|
+
{ nome: 'Espírito Santo', sigla: 'ES' },
|
|
11
|
+
{ nome: 'Goiás', sigla: 'GO' },
|
|
12
|
+
{ nome: 'Maranhão', sigla: 'MA' },
|
|
13
|
+
{ nome: 'Mato Grosso', sigla: 'MT' },
|
|
14
|
+
{ nome: 'Mato Grosso do Sul', sigla: 'MS' },
|
|
15
|
+
{ nome: 'Minas Gerais', sigla: 'MG' },
|
|
16
|
+
{ nome: 'Pará', sigla: 'PA' },
|
|
17
|
+
{ nome: 'Paraíba', sigla: 'PB' },
|
|
18
|
+
{ nome: 'Paraná', sigla: 'PR' },
|
|
19
|
+
{ nome: 'Pernambuco', sigla: 'PE' },
|
|
20
|
+
{ nome: 'Piauí', sigla: 'PI' },
|
|
21
|
+
{ nome: 'Rio de Janeiro', sigla: 'RJ' },
|
|
22
|
+
{ nome: 'Rio Grande do Norte', sigla: 'RN' },
|
|
23
|
+
{ nome: 'Rio Grande do Sul', sigla: 'RS' },
|
|
24
|
+
{ nome: 'Rondônia', sigla: 'RO' },
|
|
25
|
+
{ nome: 'Roraima', sigla: 'RR' },
|
|
26
|
+
{ nome: 'Santa Catarina', sigla: 'SC' },
|
|
27
|
+
{ nome: 'São Paulo', sigla: 'SP' },
|
|
28
|
+
{ nome: 'Sergipe', sigla: 'SE' },
|
|
29
|
+
{ nome: 'Tocantins', sigla: 'TO' },
|
|
30
|
+
];
|
|
31
|
+
export function mapEstadosToOptions(slice) {
|
|
32
|
+
return slice.map((e) => ({
|
|
33
|
+
label: `${e.nome} (${e.sigla})`,
|
|
34
|
+
value: e.sigla,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXN0YWRvcy1ici5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9fdXRpbHMvZXN0YWRvcy1ici5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBbUQ7SUFDbkYsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDN0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDaEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDOUIsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDakMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDOUIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDOUIsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUN6QyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQ3ZDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQzlCLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQ2pDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQ3BDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDM0MsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDckMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDN0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDaEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDL0IsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDbkMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDOUIsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUN2QyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQzVDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDMUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDakMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDaEMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUN2QyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUNsQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUNoQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtDQUMxQixDQUFDO0FBRVgsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxLQUFxRDtJQUVyRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHO1FBQy9CLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztLQUNmLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVWlTZWxlY3RPcHRpb24gfSBmcm9tICcuLi9maWVsZHMvZHJvcGRvd24tZmllbGRzL19tb2RlbHMvc2VsZWN0LW9wdGlvbi5tb2RlbCc7XHJcblxyXG4vKiogVW5pZGFkZXMgZmVkZXJhdGl2YXMgZG8gQnJhc2lsIChub21lICsgc2lnbGEpLiBPcmRlbSBhbGZhYsOpdGljYSBwb3Igbm9tZS4gKi9cclxuZXhwb3J0IGNvbnN0IEJSX0VTVEFET1NfTk9NRV9TSUdMQTogUmVhZG9ubHlBcnJheTx7IG5vbWU6IHN0cmluZzsgc2lnbGE6IHN0cmluZyB9PiA9IFtcclxuICB7IG5vbWU6ICdBY3JlJywgc2lnbGE6ICdBQycgfSxcclxuICB7IG5vbWU6ICdBbGFnb2FzJywgc2lnbGE6ICdBTCcgfSxcclxuICB7IG5vbWU6ICdBbWFww6EnLCBzaWdsYTogJ0FQJyB9LFxyXG4gIHsgbm9tZTogJ0FtYXpvbmFzJywgc2lnbGE6ICdBTScgfSxcclxuICB7IG5vbWU6ICdCYWhpYScsIHNpZ2xhOiAnQkEnIH0sXHJcbiAgeyBub21lOiAnQ2VhcsOhJywgc2lnbGE6ICdDRScgfSxcclxuICB7IG5vbWU6ICdEaXN0cml0byBGZWRlcmFsJywgc2lnbGE6ICdERicgfSxcclxuICB7IG5vbWU6ICdFc3DDrXJpdG8gU2FudG8nLCBzaWdsYTogJ0VTJyB9LFxyXG4gIHsgbm9tZTogJ0dvacOhcycsIHNpZ2xhOiAnR08nIH0sXHJcbiAgeyBub21lOiAnTWFyYW5ow6NvJywgc2lnbGE6ICdNQScgfSxcclxuICB7IG5vbWU6ICdNYXRvIEdyb3NzbycsIHNpZ2xhOiAnTVQnIH0sXHJcbiAgeyBub21lOiAnTWF0byBHcm9zc28gZG8gU3VsJywgc2lnbGE6ICdNUycgfSxcclxuICB7IG5vbWU6ICdNaW5hcyBHZXJhaXMnLCBzaWdsYTogJ01HJyB9LFxyXG4gIHsgbm9tZTogJ1BhcsOhJywgc2lnbGE6ICdQQScgfSxcclxuICB7IG5vbWU6ICdQYXJhw61iYScsIHNpZ2xhOiAnUEInIH0sXHJcbiAgeyBub21lOiAnUGFyYW7DoScsIHNpZ2xhOiAnUFInIH0sXHJcbiAgeyBub21lOiAnUGVybmFtYnVjbycsIHNpZ2xhOiAnUEUnIH0sXHJcbiAgeyBub21lOiAnUGlhdcOtJywgc2lnbGE6ICdQSScgfSxcclxuICB7IG5vbWU6ICdSaW8gZGUgSmFuZWlybycsIHNpZ2xhOiAnUkonIH0sXHJcbiAgeyBub21lOiAnUmlvIEdyYW5kZSBkbyBOb3J0ZScsIHNpZ2xhOiAnUk4nIH0sXHJcbiAgeyBub21lOiAnUmlvIEdyYW5kZSBkbyBTdWwnLCBzaWdsYTogJ1JTJyB9LFxyXG4gIHsgbm9tZTogJ1JvbmTDtG5pYScsIHNpZ2xhOiAnUk8nIH0sXHJcbiAgeyBub21lOiAnUm9yYWltYScsIHNpZ2xhOiAnUlInIH0sXHJcbiAgeyBub21lOiAnU2FudGEgQ2F0YXJpbmEnLCBzaWdsYTogJ1NDJyB9LFxyXG4gIHsgbm9tZTogJ1PDo28gUGF1bG8nLCBzaWdsYTogJ1NQJyB9LFxyXG4gIHsgbm9tZTogJ1NlcmdpcGUnLCBzaWdsYTogJ1NFJyB9LFxyXG4gIHsgbm9tZTogJ1RvY2FudGlucycsIHNpZ2xhOiAnVE8nIH0sXHJcbl0gYXMgY29uc3Q7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFwRXN0YWRvc1RvT3B0aW9ucyhcclxuICBzbGljZTogUmVhZG9ubHlBcnJheTx7IG5vbWU6IHN0cmluZzsgc2lnbGE6IHN0cmluZyB9PixcclxuKTogVWlTZWxlY3RPcHRpb248c3RyaW5nPltdIHtcclxuICByZXR1cm4gc2xpY2UubWFwKChlKSA9PiAoe1xyXG4gICAgbGFiZWw6IGAke2Uubm9tZX0gKCR7ZS5zaWdsYX0pYCxcclxuICAgIHZhbHVlOiBlLnNpZ2xhLFxyXG4gIH0pKTtcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatação pt-BR para inteiros: apenas separador de milhar com ponto.
|
|
3
|
+
* Usado pelo campo inteiro e pela parte inteira do decimal.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Formata sequência de dígitos com pontos de milhar (ex.: 1234567 → 1.234.567).
|
|
7
|
+
* Aceita string vazia; não normaliza zeros à esquerda.
|
|
8
|
+
*/
|
|
9
|
+
export function formatIntegerThousandsBr(intDigits) {
|
|
10
|
+
if (intDigits === '') {
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
const reversed = intDigits.split('').reverse().join('');
|
|
14
|
+
const groups = reversed.match(/.{1,3}/g) ?? [];
|
|
15
|
+
return groups
|
|
16
|
+
.map((g) => g.split('').reverse().join(''))
|
|
17
|
+
.reverse()
|
|
18
|
+
.join('.');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Quantidade de dígitos à esquerda do caret na máscara (pontos ignorados).
|
|
22
|
+
*/
|
|
23
|
+
export function semanticIntegerDigitCountLeft(display, caret) {
|
|
24
|
+
return display.slice(0, caret).replace(/\D/g, '').length;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Índice do caret após o enésimo dígito na string formatada (fim se não houver tantos).
|
|
28
|
+
*/
|
|
29
|
+
export function caretIndexFromIntegerDigitCount(display, digitCount) {
|
|
30
|
+
if (digitCount <= 0) {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
let seen = 0;
|
|
34
|
+
for (let i = 0; i < display.length; i++) {
|
|
35
|
+
const ch = display[i];
|
|
36
|
+
if (ch === '.') {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (/\d/.test(ch)) {
|
|
40
|
+
seen++;
|
|
41
|
+
if (seen === digitCount) {
|
|
42
|
+
return i + 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return display.length;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdlci1ici51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvX3V0aWxzL2ludGVnZXItYnIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFNBQWlCO0lBQ3hELElBQUksU0FBUyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9DLE9BQU8sTUFBTTtTQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUMsT0FBTyxFQUFFO1NBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxPQUFlLEVBQ2YsS0FBYTtJQUViLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDM0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUM3QyxPQUFlLEVBQ2YsVUFBa0I7SUFFbEIsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDZixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xCLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEZvcm1hdGHDp8OjbyBwdC1CUiBwYXJhIGludGVpcm9zOiBhcGVuYXMgc2VwYXJhZG9yIGRlIG1pbGhhciBjb20gcG9udG8uXHJcbiAqIFVzYWRvIHBlbG8gY2FtcG8gaW50ZWlybyBlIHBlbGEgcGFydGUgaW50ZWlyYSBkbyBkZWNpbWFsLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBGb3JtYXRhIHNlcXXDqm5jaWEgZGUgZMOtZ2l0b3MgY29tIHBvbnRvcyBkZSBtaWxoYXIgKGV4LjogMTIzNDU2NyDihpIgMS4yMzQuNTY3KS5cclxuICogQWNlaXRhIHN0cmluZyB2YXppYTsgbsOjbyBub3JtYWxpemEgemVyb3Mgw6AgZXNxdWVyZGEuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SW50ZWdlclRob3VzYW5kc0JyKGludERpZ2l0czogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAoaW50RGlnaXRzID09PSAnJykge1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICBjb25zdCByZXZlcnNlZCA9IGludERpZ2l0cy5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xyXG4gIGNvbnN0IGdyb3VwcyA9IHJldmVyc2VkLm1hdGNoKC8uezEsM30vZykgPz8gW107XHJcbiAgcmV0dXJuIGdyb3Vwc1xyXG4gICAgLm1hcCgoZykgPT4gZy5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpKVxyXG4gICAgLnJldmVyc2UoKVxyXG4gICAgLmpvaW4oJy4nKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFF1YW50aWRhZGUgZGUgZMOtZ2l0b3Mgw6AgZXNxdWVyZGEgZG8gY2FyZXQgbmEgbcOhc2NhcmEgKHBvbnRvcyBpZ25vcmFkb3MpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNlbWFudGljSW50ZWdlckRpZ2l0Q291bnRMZWZ0KFxyXG4gIGRpc3BsYXk6IHN0cmluZyxcclxuICBjYXJldDogbnVtYmVyLFxyXG4pOiBudW1iZXIge1xyXG4gIHJldHVybiBkaXNwbGF5LnNsaWNlKDAsIGNhcmV0KS5yZXBsYWNlKC9cXEQvZywgJycpLmxlbmd0aDtcclxufVxyXG5cclxuLyoqXHJcbiAqIMONbmRpY2UgZG8gY2FyZXQgYXDDs3MgbyBlbsOpc2ltbyBkw61naXRvIG5hIHN0cmluZyBmb3JtYXRhZGEgKGZpbSBzZSBuw6NvIGhvdXZlciB0YW50b3MpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNhcmV0SW5kZXhGcm9tSW50ZWdlckRpZ2l0Q291bnQoXHJcbiAgZGlzcGxheTogc3RyaW5nLFxyXG4gIGRpZ2l0Q291bnQ6IG51bWJlcixcclxuKTogbnVtYmVyIHtcclxuICBpZiAoZGlnaXRDb3VudCA8PSAwKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgbGV0IHNlZW4gPSAwO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGxheS5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgY2ggPSBkaXNwbGF5W2ldO1xyXG4gICAgaWYgKGNoID09PSAnLicpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgICBpZiAoL1xcZC8udGVzdChjaCkpIHtcclxuICAgICAgc2VlbisrO1xyXG4gICAgICBpZiAoc2VlbiA9PT0gZGlnaXRDb3VudCkge1xyXG4gICAgICAgIHJldHVybiBpICsgMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gZGlzcGxheS5sZW5ndGg7XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const DIGITS_ONLY = /^\d*$/;
|
|
2
|
+
/**
|
|
3
|
+
* Mantém apenas dígitos (0–9). Primeira versão sem sinal negativo.
|
|
4
|
+
*/
|
|
5
|
+
export function sanitizeIntegerDigits(raw) {
|
|
6
|
+
return raw.replace(/\D/g, '');
|
|
7
|
+
}
|
|
8
|
+
export function parseIntegerString(digits) {
|
|
9
|
+
const t = digits.trim();
|
|
10
|
+
if (t === '') {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
if (!DIGITS_ONLY.test(t)) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const n = Number.parseInt(t, 10);
|
|
17
|
+
return Number.isFinite(n) ? n : null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdlci12YWx1ZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvX3V0aWxzL2ludGVnZXItdmFsdWUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBRTVCOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQVc7SUFDL0MsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDL0MsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKiQvO1xyXG5cclxuLyoqXHJcbiAqIE1hbnTDqW0gYXBlbmFzIGTDrWdpdG9zICgw4oCTOSkuIFByaW1laXJhIHZlcnPDo28gc2VtIHNpbmFsIG5lZ2F0aXZvLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSW50ZWdlckRpZ2l0cyhyYXc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIHJhdy5yZXBsYWNlKC9cXEQvZywgJycpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnRlZ2VyU3RyaW5nKGRpZ2l0czogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgY29uc3QgdCA9IGRpZ2l0cy50cmltKCk7XHJcbiAgaWYgKHQgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgaWYgKCFESUdJVFNfT05MWS50ZXN0KHQpKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgY29uc3QgbiA9IE51bWJlci5wYXJzZUludCh0LCAxMCk7XHJcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiBudWxsO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bloqueio de scroll global **alinhado ao CDK** (`BlockScrollStrategy`):
|
|
3
|
+
* classe `cdk-global-scrollblock` no `documentElement` + deslocamento `left`/`top`
|
|
4
|
+
* para congelar a posição de scroll.
|
|
5
|
+
*
|
|
6
|
+
* Também define `overflow: hidden` no `body` enquanto o lock está activo — o `html`
|
|
7
|
+
* **não** usa `overflow-y: scroll` (isso forçava barra no viewport sem necessidade).
|
|
8
|
+
*
|
|
9
|
+
* Requer regras CSS em `styles.scss` para `.cdk-global-scrollblock` e
|
|
10
|
+
* `[data-app-scroll-lock]`.
|
|
11
|
+
*/
|
|
12
|
+
/** Aplica o mesmo padrão visual do overlay CDK Dialog (confirm, etc.). */
|
|
13
|
+
export function lockPageScrollCdkStyle() {
|
|
14
|
+
const html = document.documentElement;
|
|
15
|
+
const body = document.body;
|
|
16
|
+
const scrollX = window.scrollX ?? html.scrollLeft;
|
|
17
|
+
const scrollY = window.scrollY ?? html.scrollTop;
|
|
18
|
+
const snapshot = {
|
|
19
|
+
htmlLeft: html.style.left,
|
|
20
|
+
htmlTop: html.style.top,
|
|
21
|
+
scrollX,
|
|
22
|
+
scrollY,
|
|
23
|
+
bodyOverflow: body.style.overflow,
|
|
24
|
+
bodyTouchAction: body.style.touchAction,
|
|
25
|
+
};
|
|
26
|
+
html.style.left = `${-scrollX}px`;
|
|
27
|
+
html.style.top = `${-scrollY}px`;
|
|
28
|
+
html.classList.add('cdk-global-scrollblock');
|
|
29
|
+
body.style.overflow = 'hidden';
|
|
30
|
+
body.style.touchAction = 'none';
|
|
31
|
+
return snapshot;
|
|
32
|
+
}
|
|
33
|
+
export function unlockPageScrollCdkStyle(s) {
|
|
34
|
+
const html = document.documentElement;
|
|
35
|
+
const body = document.body;
|
|
36
|
+
html.classList.remove('cdk-global-scrollblock');
|
|
37
|
+
html.style.left = s.htmlLeft;
|
|
38
|
+
html.style.top = s.htmlTop;
|
|
39
|
+
body.style.overflow = s.bodyOverflow;
|
|
40
|
+
body.style.touchAction = s.bodyTouchAction;
|
|
41
|
+
window.scroll(s.scrollX, s.scrollY);
|
|
42
|
+
}
|
|
43
|
+
let appDialogLightLockDepth = 0;
|
|
44
|
+
let appDialogLightLockSnapshot = null;
|
|
45
|
+
function applyAppDialogScrollLock() {
|
|
46
|
+
const html = document.documentElement;
|
|
47
|
+
const body = document.body;
|
|
48
|
+
const scrollX = window.scrollX ?? html.scrollLeft;
|
|
49
|
+
const scrollY = window.scrollY ?? html.scrollTop;
|
|
50
|
+
return {
|
|
51
|
+
scrollX,
|
|
52
|
+
scrollY,
|
|
53
|
+
htmlOverflow: html.style.overflow,
|
|
54
|
+
bodyOverflow: body.style.overflow,
|
|
55
|
+
bodyTouchAction: body.style.touchAction,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function installAppDialogScrollLockStyles(s) {
|
|
59
|
+
const html = document.documentElement;
|
|
60
|
+
const body = document.body;
|
|
61
|
+
html.classList.add('app-dialog-scroll-lock');
|
|
62
|
+
html.style.overflow = 'hidden';
|
|
63
|
+
body.style.overflow = 'hidden';
|
|
64
|
+
body.style.touchAction = 'none';
|
|
65
|
+
}
|
|
66
|
+
function restoreAppDialogScrollLock(s) {
|
|
67
|
+
const html = document.documentElement;
|
|
68
|
+
const body = document.body;
|
|
69
|
+
html.classList.remove('app-dialog-scroll-lock');
|
|
70
|
+
html.style.overflow = s.htmlOverflow;
|
|
71
|
+
body.style.overflow = s.bodyOverflow;
|
|
72
|
+
body.style.touchAction = s.bodyTouchAction;
|
|
73
|
+
window.scroll(s.scrollX, s.scrollY);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Incrementa um contador de aninhamento: o primeiro lock aplica o DOM; locks interiores
|
|
77
|
+
* (ex.: `app-dialog` + CDK Dialog) só incrementam a profundidade.
|
|
78
|
+
*/
|
|
79
|
+
export function lockPageScrollAppDialog() {
|
|
80
|
+
if (appDialogLightLockDepth === 0) {
|
|
81
|
+
appDialogLightLockSnapshot = applyAppDialogScrollLock();
|
|
82
|
+
installAppDialogScrollLockStyles(appDialogLightLockSnapshot);
|
|
83
|
+
}
|
|
84
|
+
appDialogLightLockDepth++;
|
|
85
|
+
return appDialogLightLockSnapshot;
|
|
86
|
+
}
|
|
87
|
+
/** Par com {@link lockPageScrollAppDialog}; o snapshot pode ser ignorado — usa-se a pilha interna. */
|
|
88
|
+
export function unlockPageScrollAppDialog(_s) {
|
|
89
|
+
if (appDialogLightLockDepth > 0) {
|
|
90
|
+
appDialogLightLockDepth--;
|
|
91
|
+
}
|
|
92
|
+
if (appDialogLightLockDepth === 0 && appDialogLightLockSnapshot !== null) {
|
|
93
|
+
restoreAppDialogScrollLock(appDialogLightLockSnapshot);
|
|
94
|
+
appDialogLightLockSnapshot = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS1zY3JvbGwtbG9jay51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9fdXRpbHMvc2Nyb2xsL2JvZHktc2Nyb2xsLWxvY2sudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBV0gsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDakQsTUFBTSxRQUFRLEdBQXVCO1FBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7UUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztRQUN2QixPQUFPO1FBQ1AsT0FBTztRQUNQLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7UUFDakMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztLQUN4QyxDQUFDO0lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFN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RSxDQUFDO1FBQ3hELGdDQUFnQyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELHVCQUF1QixFQUFFLENBQUM7SUFDMUIsT0FBTywwQkFBMkIsQ0FBQztBQUNyQyxDQUFDO0FBRUQsc0dBQXNHO0FBQ3RHLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxFQUErQjtJQUN2RSxJQUFJLHVCQUF1QixHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLHVCQUF1QixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQUksdUJBQXVCLEtBQUssQ0FBQyxJQUFJLDBCQUEwQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3pFLDBCQUEwQixDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDdkQsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEJsb3F1ZWlvIGRlIHNjcm9sbCBnbG9iYWwgKiphbGluaGFkbyBhbyBDREsqKiAoYEJsb2NrU2Nyb2xsU3RyYXRlZ3lgKTpcclxuICogY2xhc3NlIGBjZGstZ2xvYmFsLXNjcm9sbGJsb2NrYCBubyBgZG9jdW1lbnRFbGVtZW50YCArIGRlc2xvY2FtZW50byBgbGVmdGAvYHRvcGBcclxuICogcGFyYSBjb25nZWxhciBhIHBvc2nDp8OjbyBkZSBzY3JvbGwuXHJcbiAqXHJcbiAqIFRhbWLDqW0gZGVmaW5lIGBvdmVyZmxvdzogaGlkZGVuYCBubyBgYm9keWAgZW5xdWFudG8gbyBsb2NrIGVzdMOhIGFjdGl2byDigJQgbyBgaHRtbGBcclxuICogKipuw6NvKiogdXNhIGBvdmVyZmxvdy15OiBzY3JvbGxgIChpc3NvIGZvcsOnYXZhIGJhcnJhIG5vIHZpZXdwb3J0IHNlbSBuZWNlc3NpZGFkZSkuXHJcbiAqXHJcbiAqIFJlcXVlciByZWdyYXMgQ1NTIGVtIGBzdHlsZXMuc2Nzc2AgcGFyYSBgLmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tgIGVcclxuICogYFtkYXRhLWFwcC1zY3JvbGwtbG9ja11gLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsTG9ja1NuYXBzaG90IHtcclxuICByZWFkb25seSBodG1sTGVmdDogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGh0bWxUb3A6IHN0cmluZztcclxuICByZWFkb25seSBzY3JvbGxYOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgc2Nyb2xsWTogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IGJvZHlPdmVyZmxvdzogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGJvZHlUb3VjaEFjdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogQXBsaWNhIG8gbWVzbW8gcGFkcsOjbyB2aXN1YWwgZG8gb3ZlcmxheSBDREsgRGlhbG9nIChjb25maXJtLCBldGMuKS4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGUoKTogU2Nyb2xsTG9ja1NuYXBzaG90IHtcclxuICBjb25zdCBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG4gIGNvbnN0IHNjcm9sbFggPSB3aW5kb3cuc2Nyb2xsWCA/PyBodG1sLnNjcm9sbExlZnQ7XHJcbiAgY29uc3Qgc2Nyb2xsWSA9IHdpbmRvdy5zY3JvbGxZID8/IGh0bWwuc2Nyb2xsVG9wO1xyXG4gIGNvbnN0IHNuYXBzaG90OiBTY3JvbGxMb2NrU25hcHNob3QgPSB7XHJcbiAgICBodG1sTGVmdDogaHRtbC5zdHlsZS5sZWZ0LFxyXG4gICAgaHRtbFRvcDogaHRtbC5zdHlsZS50b3AsXHJcbiAgICBzY3JvbGxYLFxyXG4gICAgc2Nyb2xsWSxcclxuICAgIGJvZHlPdmVyZmxvdzogYm9keS5zdHlsZS5vdmVyZmxvdyxcclxuICAgIGJvZHlUb3VjaEFjdGlvbjogYm9keS5zdHlsZS50b3VjaEFjdGlvbixcclxuICB9O1xyXG4gIGh0bWwuc3R5bGUubGVmdCA9IGAkey1zY3JvbGxYfXB4YDtcclxuICBodG1sLnN0eWxlLnRvcCA9IGAkey1zY3JvbGxZfXB4YDtcclxuICBodG1sLmNsYXNzTGlzdC5hZGQoJ2Nkay1nbG9iYWwtc2Nyb2xsYmxvY2snKTtcclxuICBib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgYm9keS5zdHlsZS50b3VjaEFjdGlvbiA9ICdub25lJztcclxuICByZXR1cm4gc25hcHNob3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGUoczogU2Nyb2xsTG9ja1NuYXBzaG90KTogdm9pZCB7XHJcbiAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keTtcclxuICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2Nkay1nbG9iYWwtc2Nyb2xsYmxvY2snKTtcclxuICBodG1sLnN0eWxlLmxlZnQgPSBzLmh0bWxMZWZ0O1xyXG4gIGh0bWwuc3R5bGUudG9wID0gcy5odG1sVG9wO1xyXG4gIGJvZHkuc3R5bGUub3ZlcmZsb3cgPSBzLmJvZHlPdmVyZmxvdztcclxuICBib2R5LnN0eWxlLnRvdWNoQWN0aW9uID0gcy5ib2R5VG91Y2hBY3Rpb247XHJcbiAgd2luZG93LnNjcm9sbChzLnNjcm9sbFgsIHMuc2Nyb2xsWSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCbG9xdWVpbyBkZSBzY3JvbGwgcGFyYSBvIGBhcHAtZGlhbG9nYCBkZWNsYXJhdGl2bzogKipzZW0qKiBgcG9zaXRpb246IGZpeGVkYCBuZW0gYGxlZnRgL2B0b3BgXHJcbiAqIG5lZ2F0aXZvcyBubyBgZG9jdW1lbnRFbGVtZW50YCAocGFkcsOjbyBDREsgZW0ge0BsaW5rIGxvY2tQYWdlU2Nyb2xsQ2RrU3R5bGV9KS5cclxuICpcclxuICogQ29tIGVzc2UgcGFkcsOjbywgZW0gQ2hyb21pdW0vV2ViS2l0IG8gYHBvc2l0aW9uOiBmaXhlZGAgZG8gc2NyaW0gZGVpeGEgZGUgZmljYXIgYW5jb3JhZG8gYW9cclxuICogYGh0bWxgIGRlc2xvY2FkbyDigJQgZXZpdGEgZmFpeGEgZGUgY29udGXDumRvIHZpc8OtdmVsIG5vIHRvcG8gZSBzY3JpbSBicmFuY28vY2luemEgZXJyYWRvIGVtXHJcbiAqIGFwcHMgb25kZSBvIGBib2R5YCBmYXogc2Nyb2xsIChleC46IHNpdGUgZGUgZG9jdW1lbnRhw6fDo28pLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcHBEaWFsb2dTY3JvbGxMb2NrU25hcHNob3Qge1xyXG4gIHJlYWRvbmx5IHNjcm9sbFg6IG51bWJlcjtcclxuICByZWFkb25seSBzY3JvbGxZOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgaHRtbE92ZXJmbG93OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgYm9keU92ZXJmbG93OiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgYm9keVRvdWNoQWN0aW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmxldCBhcHBEaWFsb2dMaWdodExvY2tEZXB0aCA9IDA7XHJcbmxldCBhcHBEaWFsb2dMaWdodExvY2tTbmFwc2hvdDogQXBwRGlhbG9nU2Nyb2xsTG9ja1NuYXBzaG90IHwgbnVsbCA9IG51bGw7XHJcblxyXG5mdW5jdGlvbiBhcHBseUFwcERpYWxvZ1Njcm9sbExvY2soKTogQXBwRGlhbG9nU2Nyb2xsTG9ja1NuYXBzaG90IHtcclxuICBjb25zdCBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG4gIGNvbnN0IHNjcm9sbFggPSB3aW5kb3cuc2Nyb2xsWCA/PyBodG1sLnNjcm9sbExlZnQ7XHJcbiAgY29uc3Qgc2Nyb2xsWSA9IHdpbmRvdy5zY3JvbGxZID8/IGh0bWwuc2Nyb2xsVG9wO1xyXG4gIHJldHVybiB7XHJcbiAgICBzY3JvbGxYLFxyXG4gICAgc2Nyb2xsWSxcclxuICAgIGh0bWxPdmVyZmxvdzogaHRtbC5zdHlsZS5vdmVyZmxvdyxcclxuICAgIGJvZHlPdmVyZmxvdzogYm9keS5zdHlsZS5vdmVyZmxvdyxcclxuICAgIGJvZHlUb3VjaEFjdGlvbjogYm9keS5zdHlsZS50b3VjaEFjdGlvbixcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnN0YWxsQXBwRGlhbG9nU2Nyb2xsTG9ja1N0eWxlcyhzOiBBcHBEaWFsb2dTY3JvbGxMb2NrU25hcHNob3QpOiB2b2lkIHtcclxuICBjb25zdCBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG4gIGh0bWwuY2xhc3NMaXN0LmFkZCgnYXBwLWRpYWxvZy1zY3JvbGwtbG9jaycpO1xyXG4gIGh0bWwuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICBib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgYm9keS5zdHlsZS50b3VjaEFjdGlvbiA9ICdub25lJztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzdG9yZUFwcERpYWxvZ1Njcm9sbExvY2soczogQXBwRGlhbG9nU2Nyb2xsTG9ja1NuYXBzaG90KTogdm9pZCB7XHJcbiAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keTtcclxuICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2FwcC1kaWFsb2ctc2Nyb2xsLWxvY2snKTtcclxuICBodG1sLnN0eWxlLm92ZXJmbG93ID0gcy5odG1sT3ZlcmZsb3c7XHJcbiAgYm9keS5zdHlsZS5vdmVyZmxvdyA9IHMuYm9keU92ZXJmbG93O1xyXG4gIGJvZHkuc3R5bGUudG91Y2hBY3Rpb24gPSBzLmJvZHlUb3VjaEFjdGlvbjtcclxuICB3aW5kb3cuc2Nyb2xsKHMuc2Nyb2xsWCwgcy5zY3JvbGxZKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEluY3JlbWVudGEgdW0gY29udGFkb3IgZGUgYW5pbmhhbWVudG86IG8gcHJpbWVpcm8gbG9jayBhcGxpY2EgbyBET007IGxvY2tzIGludGVyaW9yZXNcclxuICogKGV4LjogYGFwcC1kaWFsb2dgICsgQ0RLIERpYWxvZykgc8OzIGluY3JlbWVudGFtIGEgcHJvZnVuZGlkYWRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvY2tQYWdlU2Nyb2xsQXBwRGlhbG9nKCk6IEFwcERpYWxvZ1Njcm9sbExvY2tTbmFwc2hvdCB7XHJcbiAgaWYgKGFwcERpYWxvZ0xpZ2h0TG9ja0RlcHRoID09PSAwKSB7XHJcbiAgICBhcHBEaWFsb2dMaWdodExvY2tTbmFwc2hvdCA9IGFwcGx5QXBwRGlhbG9nU2Nyb2xsTG9jaygpO1xyXG4gICAgaW5zdGFsbEFwcERpYWxvZ1Njcm9sbExvY2tTdHlsZXMoYXBwRGlhbG9nTGlnaHRMb2NrU25hcHNob3QpO1xyXG4gIH1cclxuICBhcHBEaWFsb2dMaWdodExvY2tEZXB0aCsrO1xyXG4gIHJldHVybiBhcHBEaWFsb2dMaWdodExvY2tTbmFwc2hvdCE7XHJcbn1cclxuXHJcbi8qKiBQYXIgY29tIHtAbGluayBsb2NrUGFnZVNjcm9sbEFwcERpYWxvZ307IG8gc25hcHNob3QgcG9kZSBzZXIgaWdub3JhZG8g4oCUIHVzYS1zZSBhIHBpbGhhIGludGVybmEuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tQYWdlU2Nyb2xsQXBwRGlhbG9nKF9zOiBBcHBEaWFsb2dTY3JvbGxMb2NrU25hcHNob3QpOiB2b2lkIHtcclxuICBpZiAoYXBwRGlhbG9nTGlnaHRMb2NrRGVwdGggPiAwKSB7XHJcbiAgICBhcHBEaWFsb2dMaWdodExvY2tEZXB0aC0tO1xyXG4gIH1cclxuICBpZiAoYXBwRGlhbG9nTGlnaHRMb2NrRGVwdGggPT09IDAgJiYgYXBwRGlhbG9nTGlnaHRMb2NrU25hcHNob3QgIT09IG51bGwpIHtcclxuICAgIHJlc3RvcmVBcHBEaWFsb2dTY3JvbGxMb2NrKGFwcERpYWxvZ0xpZ2h0TG9ja1NuYXBzaG90KTtcclxuICAgIGFwcERpYWxvZ0xpZ2h0TG9ja1NuYXBzaG90ID0gbnVsbDtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi1pdGVtLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hcHAtc2hlbGwvX21vZGVscy9icmVhZGNydW1iLWl0ZW0ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBTZWdtZW50byBkbyBmaWxvIGRlIG5hdmVnYcOnw6NvIChgYXBwLWJyZWFkY3J1bWJgKS5cclxuICogUHJpb3JpZGFkZSBkZSBuYXZlZ2HDp8Ojbzogc2UgYHJvdXRlYCBlc3RpdmVyIGRlZmluaWRvLCB1c2Etc2UgYFJvdXRlckxpbmtgOyBzZW7Do28sIGBocmVmYCAow6JuY29yYSBuYXRpdmEpLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBCcmVhZGNydW1iSXRlbSB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICAvKiogUm90YSBBbmd1bGFyIChgcm91dGVyTGlua2ApIHF1YW5kbyBvIHNlZ21lbnRvIMOpIG5hdmVnw6F2ZWwgZGVudHJvIGRhIGFwcC4gKi9cclxuICByb3V0ZT86IHN0cmluZyB8IHJlYWRvbmx5IHVua25vd25bXTtcclxuICAvKipcclxuICAgKiBVUkwgcXVhbmRvIG7Do28gc2UgdXNhIG8gcm91dGVyIChleC46IGxpbmsgZXh0ZXJubykuIElnbm9yYWRvIHNlIGByb3V0ZWAgZXN0aXZlciBkZWZpbmlkby5cclxuICAgKi9cclxuICBocmVmPzogc3RyaW5nO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Directive, TemplateRef, inject } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Marca o `ng-template` cuja instância é projectada na barra lateral (desktop) e no `app-drawer` (mobile).
|
|
5
|
+
*
|
|
6
|
+
* ```html
|
|
7
|
+
* <app-shell>
|
|
8
|
+
* <ng-template appShellSidebar>
|
|
9
|
+
* <app-sidebar ... />
|
|
10
|
+
* </ng-template>
|
|
11
|
+
* ...
|
|
12
|
+
* </app-shell>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export class AppShellSidebarTemplateDirective {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.templateRef = inject((TemplateRef));
|
|
18
|
+
}
|
|
19
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppShellSidebarTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
20
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AppShellSidebarTemplateDirective, isStandalone: true, selector: "ng-template[appShellSidebar]", ngImport: i0 }); }
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppShellSidebarTemplateDirective, decorators: [{
|
|
23
|
+
type: Directive,
|
|
24
|
+
args: [{
|
|
25
|
+
selector: 'ng-template[appShellSidebar]',
|
|
26
|
+
standalone: true,
|
|
27
|
+
}]
|
|
28
|
+
}] });
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXNoZWxsLXNpZGViYXItdGVtcGxhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hcHAtc2hlbGwvYXBwLXNoZWxsLXNpZGViYXItdGVtcGxhdGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFL0Q7Ozs7Ozs7Ozs7O0dBV0c7QUFLSCxNQUFNLE9BQU8sZ0NBQWdDO0lBSjdDO1FBS1csZ0JBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQSxXQUFvQixDQUFBLENBQUMsQ0FBQztLQUNyRDsrR0FGWSxnQ0FBZ0M7bUdBQWhDLGdDQUFnQzs7NEZBQWhDLGdDQUFnQztrQkFKNUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsOEJBQThCO29CQUN4QyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBNYXJjYSBvIGBuZy10ZW1wbGF0ZWAgY3VqYSBpbnN0w6JuY2lhIMOpIHByb2plY3RhZGEgbmEgYmFycmEgbGF0ZXJhbCAoZGVza3RvcCkgZSBubyBgYXBwLWRyYXdlcmAgKG1vYmlsZSkuXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGFwcC1zaGVsbD5cclxuICogICA8bmctdGVtcGxhdGUgYXBwU2hlbGxTaWRlYmFyPlxyXG4gKiAgICAgPGFwcC1zaWRlYmFyIC4uLiAvPlxyXG4gKiAgIDwvbmctdGVtcGxhdGU+XHJcbiAqICAgLi4uXHJcbiAqIDwvYXBwLXNoZWxsPlxyXG4gKiBgYGBcclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbYXBwU2hlbGxTaWRlYmFyXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFNoZWxsU2lkZWJhclRlbXBsYXRlRGlyZWN0aXZlIHtcclxuICByZWFkb25seSB0ZW1wbGF0ZVJlZiA9IGluamVjdChUZW1wbGF0ZVJlZjx1bmtub3duPik7XHJcbn1cclxuIl19
|