@geoit/ui 0.0.2
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/AGENTS.md +25 -0
- package/README.md +46 -0
- package/ai/AGENTS.md +86 -0
- package/ai/README.md +44 -0
- package/ai/catalog.json +882 -0
- package/ai/components/geo-alert.md +56 -0
- package/ai/components/geo-back-button.md +54 -0
- package/ai/components/geo-breadcrumb.md +52 -0
- package/ai/components/geo-button.md +63 -0
- package/ai/components/geo-checkbox.md +54 -0
- package/ai/components/geo-column-picker.md +54 -0
- package/ai/components/geo-confirm-modal.md +70 -0
- package/ai/components/geo-date-picker.md +65 -0
- package/ai/components/geo-date-range-picker.md +64 -0
- package/ai/components/geo-file-picker.md +62 -0
- package/ai/components/geo-form-modal.md +88 -0
- package/ai/components/geo-icon.md +53 -0
- package/ai/components/geo-input.md +65 -0
- package/ai/components/geo-page-title.md +53 -0
- package/ai/components/geo-pagination.md +59 -0
- package/ai/components/geo-radio.md +67 -0
- package/ai/components/geo-row-actions.md +54 -0
- package/ai/components/geo-select.md +68 -0
- package/ai/components/geo-slider.md +56 -0
- package/ai/components/geo-status-tag.md +51 -0
- package/ai/components/geo-step-form-layout.md +81 -0
- package/ai/components/geo-stepper.md +63 -0
- package/ai/components/geo-table-filter.md +65 -0
- package/ai/components/geo-table-pagination.md +59 -0
- package/ai/components/geo-table-toolbar.md +64 -0
- package/ai/components/geo-table.md +98 -0
- package/ai/components/geo-tabs.md +62 -0
- package/ai/components/geo-textarea.md +59 -0
- package/ai/components/geo-toast.md +61 -0
- package/ai/components/geo-tree.md +58 -0
- package/ai/components/geo-typography.md +57 -0
- package/ai/components/geo-upload.md +78 -0
- package/ai/recipes.md +111 -0
- package/esm2022/geoit-ui.mjs +5 -0
- package/esm2022/lib/figma/geo-alert/geo-alert.component.mjs +58 -0
- package/esm2022/lib/figma/geo-alert/geo-alert.types.mjs +7 -0
- package/esm2022/lib/figma/geo-back-button/geo-back-button.component.mjs +48 -0
- package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.component.mjs +33 -0
- package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.types.mjs +2 -0
- package/esm2022/lib/figma/geo-button/geo-button.component.mjs +77 -0
- package/esm2022/lib/figma/geo-button/geo-button.types.mjs +2 -0
- package/esm2022/lib/figma/geo-checkbox/geo-checkbox.component.mjs +34 -0
- package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.component.mjs +76 -0
- package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.types.mjs +2 -0
- package/esm2022/lib/figma/geo-date-picker/geo-date-picker.component.mjs +119 -0
- package/esm2022/lib/figma/geo-date-picker/geo-date-picker.types.mjs +2 -0
- package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.component.mjs +116 -0
- package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.types.mjs +2 -0
- package/esm2022/lib/figma/geo-file-picker/geo-file-picker.component.mjs +145 -0
- package/esm2022/lib/figma/geo-file-picker/geo-file-picker.types.mjs +2 -0
- package/esm2022/lib/figma/geo-form-modal/geo-form-modal.component.mjs +153 -0
- package/esm2022/lib/figma/geo-icon/geo-icon.component.mjs +51 -0
- package/esm2022/lib/figma/geo-icon/geo-icon.types.mjs +8 -0
- package/esm2022/lib/figma/geo-input/geo-input.component.mjs +118 -0
- package/esm2022/lib/figma/geo-page-title/geo-page-title.component.mjs +51 -0
- package/esm2022/lib/figma/geo-pagination/geo-pagination.component.mjs +54 -0
- package/esm2022/lib/figma/geo-radio/geo-radio.component.mjs +95 -0
- package/esm2022/lib/figma/geo-radio/geo-radio.types.mjs +2 -0
- package/esm2022/lib/figma/geo-select/geo-select.component.mjs +113 -0
- package/esm2022/lib/figma/geo-select/geo-select.types.mjs +2 -0
- package/esm2022/lib/figma/geo-slider/geo-slider.component.mjs +43 -0
- package/esm2022/lib/figma/geo-status-tag/geo-status-tag.component.mjs +62 -0
- package/esm2022/lib/figma/geo-status-tag/geo-status-tag.types.mjs +30 -0
- package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.component.mjs +157 -0
- package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.types.mjs +2 -0
- package/esm2022/lib/figma/geo-stepper/geo-stepper.component.mjs +77 -0
- package/esm2022/lib/figma/geo-stepper/geo-stepper.types.mjs +2 -0
- package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.mjs +65 -0
- package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.storage.mjs +31 -0
- package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.types.mjs +2 -0
- package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.mjs +64 -0
- package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.types.mjs +24 -0
- package/esm2022/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.mjs +195 -0
- package/esm2022/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.mjs +118 -0
- package/esm2022/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.mjs +68 -0
- package/esm2022/lib/figma/geo-table/geo-table.component.mjs +381 -0
- package/esm2022/lib/figma/geo-table/geo-table.types.mjs +4 -0
- package/esm2022/lib/figma/geo-tabs/geo-tabs.component.mjs +94 -0
- package/esm2022/lib/figma/geo-tabs/geo-tabs.types.mjs +2 -0
- package/esm2022/lib/figma/geo-textarea/geo-textarea.component.mjs +85 -0
- package/esm2022/lib/figma/geo-toast/geo-toast.component.mjs +57 -0
- package/esm2022/lib/figma/geo-toast/geo-toast.service.mjs +116 -0
- package/esm2022/lib/figma/geo-toast/geo-toast.types.mjs +13 -0
- package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +52 -0
- package/esm2022/lib/figma/geo-tree/geo-tree.types.mjs +2 -0
- package/esm2022/lib/figma/geo-typography/geo-typography.component.mjs +112 -0
- package/esm2022/lib/figma/geo-typography/geo-typography.types.mjs +96 -0
- package/esm2022/lib/figma/geo-upload/geo-upload.component.mjs +218 -0
- package/esm2022/lib/figma/geo-upload/geo-upload.types.mjs +30 -0
- package/esm2022/lib/figma/index.mjs +56 -0
- package/esm2022/lib/ng-zorro/ng-zorro-antd.module.mjs +293 -0
- package/esm2022/lib/styles/tokens.mjs +144 -0
- package/esm2022/public-api.mjs +7 -0
- package/fesm2022/geoit-ui.mjs +3805 -0
- package/fesm2022/geoit-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/figma/geo-alert/geo-alert.component.d.ts +17 -0
- package/lib/figma/geo-alert/geo-alert.types.d.ts +2 -0
- package/lib/figma/geo-back-button/geo-back-button.component.d.ts +18 -0
- package/lib/figma/geo-breadcrumb/geo-breadcrumb.component.d.ts +12 -0
- package/lib/figma/geo-breadcrumb/geo-breadcrumb.types.d.ts +10 -0
- package/lib/figma/geo-button/geo-button.component.d.ts +27 -0
- package/lib/figma/geo-button/geo-button.types.d.ts +4 -0
- package/lib/figma/geo-checkbox/geo-checkbox.component.d.ts +12 -0
- package/lib/figma/geo-confirm-modal/geo-confirm-modal.component.d.ts +24 -0
- package/lib/figma/geo-confirm-modal/geo-confirm-modal.types.d.ts +5 -0
- package/lib/figma/geo-date-picker/geo-date-picker.component.d.ts +35 -0
- package/lib/figma/geo-date-picker/geo-date-picker.types.d.ts +2 -0
- package/lib/figma/geo-date-range-picker/geo-date-range-picker.component.d.ts +34 -0
- package/lib/figma/geo-date-range-picker/geo-date-range-picker.types.d.ts +2 -0
- package/lib/figma/geo-file-picker/geo-file-picker.component.d.ts +39 -0
- package/lib/figma/geo-file-picker/geo-file-picker.types.d.ts +4 -0
- package/lib/figma/geo-form-modal/geo-form-modal.component.d.ts +57 -0
- package/lib/figma/geo-icon/geo-icon.component.d.ts +19 -0
- package/lib/figma/geo-icon/geo-icon.types.d.ts +3 -0
- package/lib/figma/geo-input/geo-input.component.d.ts +37 -0
- package/lib/figma/geo-page-title/geo-page-title.component.d.ts +22 -0
- package/lib/figma/geo-pagination/geo-pagination.component.d.ts +21 -0
- package/lib/figma/geo-radio/geo-radio.component.d.ts +31 -0
- package/lib/figma/geo-radio/geo-radio.types.d.ts +9 -0
- package/lib/figma/geo-select/geo-select.component.d.ts +33 -0
- package/lib/figma/geo-select/geo-select.types.d.ts +7 -0
- package/lib/figma/geo-slider/geo-slider.component.d.ts +17 -0
- package/lib/figma/geo-status-tag/geo-status-tag.component.d.ts +18 -0
- package/lib/figma/geo-status-tag/geo-status-tag.types.d.ts +13 -0
- package/lib/figma/geo-step-form-layout/geo-step-form-layout.component.d.ts +67 -0
- package/lib/figma/geo-step-form-layout/geo-step-form-layout.types.d.ts +9 -0
- package/lib/figma/geo-stepper/geo-stepper.component.d.ts +42 -0
- package/lib/figma/geo-stepper/geo-stepper.types.d.ts +9 -0
- package/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.d.ts +20 -0
- package/lib/figma/geo-table/geo-column-picker/geo-column-picker.storage.d.ts +5 -0
- package/lib/figma/geo-table/geo-column-picker/geo-column-picker.types.d.ts +17 -0
- package/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.d.ts +21 -0
- package/lib/figma/geo-table/geo-row-actions/geo-row-actions.types.d.ts +13 -0
- package/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.d.ts +75 -0
- package/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.d.ts +33 -0
- package/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.d.ts +24 -0
- package/lib/figma/geo-table/geo-table.component.d.ts +113 -0
- package/lib/figma/geo-table/geo-table.types.d.ts +47 -0
- package/lib/figma/geo-tabs/geo-tabs.component.d.ts +31 -0
- package/lib/figma/geo-tabs/geo-tabs.types.d.ts +7 -0
- package/lib/figma/geo-textarea/geo-textarea.component.d.ts +27 -0
- package/lib/figma/geo-toast/geo-toast.component.d.ts +23 -0
- package/lib/figma/geo-toast/geo-toast.service.d.ts +33 -0
- package/lib/figma/geo-toast/geo-toast.types.d.ts +45 -0
- package/lib/figma/geo-tree/geo-tree.component.d.ts +23 -0
- package/lib/figma/geo-tree/geo-tree.types.d.ts +12 -0
- package/lib/figma/geo-typography/geo-typography.component.d.ts +35 -0
- package/lib/figma/geo-typography/geo-typography.types.d.ts +12 -0
- package/lib/figma/geo-upload/geo-upload.component.d.ts +59 -0
- package/lib/figma/geo-upload/geo-upload.types.d.ts +13 -0
- package/lib/figma/index.d.ts +55 -0
- package/lib/ng-zorro/ng-zorro-antd.module.d.ts +76 -0
- package/lib/styles/tokens.d.ts +184 -0
- package/package.json +38 -0
- package/public-api.d.ts +3 -0
- package/src/lib/styles/design-tokens.scss +143 -0
- package/src/lib/styles/geo-toast-notification.scss +129 -0
- package/src/lib/styles/scrollbar.scss +38 -0
- package/src/lib/styles/theme.scss +153 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const DEFAULT_UI_ROW_ACTIONS = [
|
|
2
|
+
{ key: 'edit', icon: 'edit', title: 'Chỉnh sửa' },
|
|
3
|
+
{ key: 'more', icon: 'more', title: 'Thêm thao tác' },
|
|
4
|
+
];
|
|
5
|
+
/** ≤2: hiện hết; >2: primary + danger (vd. Sửa + Xóa), còn lại vào menu. */
|
|
6
|
+
export function pickInlineRowActions(actions, primaryActionKey = 'edit') {
|
|
7
|
+
const list = actions.filter((action) => !action.disabled);
|
|
8
|
+
if (list.length <= 2) {
|
|
9
|
+
return list;
|
|
10
|
+
}
|
|
11
|
+
const primary = list.find((action) => action.key === primaryActionKey) ?? list[0];
|
|
12
|
+
const secondary = list.find((action) => action.key !== primary.key && action.danger) ??
|
|
13
|
+
list.find((action) => action.key !== primary.key);
|
|
14
|
+
return secondary ? [primary, secondary] : [primary];
|
|
15
|
+
}
|
|
16
|
+
export function pickOverflowRowActions(actions, primaryActionKey = 'edit') {
|
|
17
|
+
const list = actions.filter((action) => !action.disabled);
|
|
18
|
+
if (list.length <= 2) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
const inlineKeys = new Set(pickInlineRowActions(list, primaryActionKey).map((action) => action.key));
|
|
22
|
+
return list.filter((action) => !inlineKeys.has(action.key));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXJvdy1hY3Rpb25zLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLXRhYmxlL2dlby1yb3ctYWN0aW9ucy9nZW8tcm93LWFjdGlvbnMudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW1CO0lBQ3BELEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7SUFDakQsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtDQUN0RCxDQUFDO0FBRUYsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBdUIsRUFDdkIsZ0JBQWdCLEdBQUcsTUFBTTtJQUV6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVwRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsT0FBdUIsRUFDdkIsZ0JBQWdCLEdBQUcsTUFBTTtJQUV6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQ3hCLG9CQUFvQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUN6RSxDQUFDO0lBQ0YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgR2VvUm93QWN0aW9uIHtcbiAga2V5OiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBpY29uVGhlbWU/OiAnb3V0bGluZScgfCAnZmlsbCcgfCAndHdvdG9uZSc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgZGFuZ2VyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVUlfUk9XX0FDVElPTlM6IEdlb1Jvd0FjdGlvbltdID0gW1xuICB7IGtleTogJ2VkaXQnLCBpY29uOiAnZWRpdCcsIHRpdGxlOiAnQ2jhu4luaCBz4butYScgfSxcbiAgeyBrZXk6ICdtb3JlJywgaWNvbjogJ21vcmUnLCB0aXRsZTogJ1Row6ptIHRoYW8gdMOhYycgfSxcbl07XG5cbi8qKiDiiaQyOiBoaeG7h24gaOG6v3Q7ID4yOiBwcmltYXJ5ICsgZGFuZ2VyICh2ZC4gU+G7rWEgKyBYw7NhKSwgY8OybiBs4bqhaSB2w6BvIG1lbnUuICovXG5leHBvcnQgZnVuY3Rpb24gcGlja0lubGluZVJvd0FjdGlvbnMoXG4gIGFjdGlvbnM6IEdlb1Jvd0FjdGlvbltdLFxuICBwcmltYXJ5QWN0aW9uS2V5ID0gJ2VkaXQnXG4pOiBHZW9Sb3dBY3Rpb25bXSB7XG4gIGNvbnN0IGxpc3QgPSBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiAhYWN0aW9uLmRpc2FibGVkKTtcbiAgaWYgKGxpc3QubGVuZ3RoIDw9IDIpIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGNvbnN0IHByaW1hcnkgPVxuICAgIGxpc3QuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24ua2V5ID09PSBwcmltYXJ5QWN0aW9uS2V5KSA/PyBsaXN0WzBdO1xuICBjb25zdCBzZWNvbmRhcnkgPVxuICAgIGxpc3QuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24ua2V5ICE9PSBwcmltYXJ5LmtleSAmJiBhY3Rpb24uZGFuZ2VyKSA/P1xuICAgIGxpc3QuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24ua2V5ICE9PSBwcmltYXJ5LmtleSk7XG5cbiAgcmV0dXJuIHNlY29uZGFyeSA/IFtwcmltYXJ5LCBzZWNvbmRhcnldIDogW3ByaW1hcnldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGlja092ZXJmbG93Um93QWN0aW9ucyhcbiAgYWN0aW9uczogR2VvUm93QWN0aW9uW10sXG4gIHByaW1hcnlBY3Rpb25LZXkgPSAnZWRpdCdcbik6IEdlb1Jvd0FjdGlvbltdIHtcbiAgY29uc3QgbGlzdCA9IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+ICFhY3Rpb24uZGlzYWJsZWQpO1xuICBpZiAobGlzdC5sZW5ndGggPD0gMikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGlubGluZUtleXMgPSBuZXcgU2V0KFxuICAgIHBpY2tJbmxpbmVSb3dBY3Rpb25zKGxpc3QsIHByaW1hcnlBY3Rpb25LZXkpLm1hcCgoYWN0aW9uKSA9PiBhY3Rpb24ua2V5KVxuICApO1xuICByZXR1cm4gbGlzdC5maWx0ZXIoKGFjdGlvbikgPT4gIWlubGluZUtleXMuaGFzKGFjdGlvbi5rZXkpKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, NgZone, Output, inject, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { GeoButtonComponent } from '../../geo-button/geo-button.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/** Breakpoint (px) → số cột tối đa khi `responsiveColumns` bật. */
|
|
6
|
+
const COL_BREAKPOINTS = [
|
|
7
|
+
{ minWidth: 1400, cols: 4 },
|
|
8
|
+
{ minWidth: 1200, cols: 4 },
|
|
9
|
+
{ minWidth: 1024, cols: 3 },
|
|
10
|
+
{ minWidth: 768, cols: 2 },
|
|
11
|
+
{ minWidth: 0, cols: 1 },
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Thanh lọc phía trên bảng: field chính + actions (Tìm kiếm / Bộ lọc nâng cao / Reset).
|
|
15
|
+
*
|
|
16
|
+
* ## Số cột hiển thị
|
|
17
|
+
* - `[columns]="4"` — 4 cột field + 1 cột actions = grid 5 cột đều.
|
|
18
|
+
* - `[responsiveColumns]="false"` — giữ đúng `columns`, không giảm theo breakpoint.
|
|
19
|
+
*
|
|
20
|
+
* ## Layout
|
|
21
|
+
* - Grid đều `columns + 1`: field cột 1..N, actions cột cuối.
|
|
22
|
+
* - Advanced span full width (`1 / -1`) với cùng `columns + 1` cột → phủ cả cột button.
|
|
23
|
+
* - Stacked (màn hẹp): actions → fields → advanced.
|
|
24
|
+
*
|
|
25
|
+
* ## Content projection
|
|
26
|
+
* - Default: luôn hiện. Slot `[advanced]`: chỉ hiện khi `advancedExpanded`.
|
|
27
|
+
*/
|
|
28
|
+
export class GeoTableFilterComponent {
|
|
29
|
+
host = inject((ElementRef));
|
|
30
|
+
ngZone = inject(NgZone);
|
|
31
|
+
cdr = inject(ChangeDetectorRef);
|
|
32
|
+
/**
|
|
33
|
+
* Số cột field mỗi hàng (mặc định 4 → tổng 5 cột gồm actions).
|
|
34
|
+
* Ví dụ: 4 field + columns=2 → 2 hàng × 2 cột field (+ 1 cột actions).
|
|
35
|
+
*/
|
|
36
|
+
columns = 4;
|
|
37
|
+
/**
|
|
38
|
+
* Khi `true` (mặc định): số cột thực tế ≤ `columns` theo breakpoint.
|
|
39
|
+
* Khi `false`: luôn dùng đúng `columns`.
|
|
40
|
+
*/
|
|
41
|
+
responsiveColumns = true;
|
|
42
|
+
/** Đưa actions lên hàng đầu khi màn hẹp (stacked). */
|
|
43
|
+
responsiveCollapse = true;
|
|
44
|
+
/** Breakpoint chuyển layout stacked (px). */
|
|
45
|
+
mobileBreakpoint = 1024;
|
|
46
|
+
/** Khoảng cách grid (px). */
|
|
47
|
+
gap = 15;
|
|
48
|
+
searchLabel = 'Tìm kiếm';
|
|
49
|
+
searchLoading = false;
|
|
50
|
+
/** Hiện nút mở/đóng slot `[advanced]`. */
|
|
51
|
+
showAdvancedToggle = true;
|
|
52
|
+
showReset = true;
|
|
53
|
+
/** Mở panel field nâng cao (`[advanced]`). */
|
|
54
|
+
advancedExpanded = false;
|
|
55
|
+
/**
|
|
56
|
+
* Số field advanced đang có giá trị — hiện badge trên nút expand.
|
|
57
|
+
* Parent tự tính (vd. `countFilledFilters(query, ADVANCED_KEYS)`).
|
|
58
|
+
*/
|
|
59
|
+
advancedFilterCount = 0;
|
|
60
|
+
filterToggleTitle = 'Bộ lọc nâng cao';
|
|
61
|
+
resetTitle = 'Xóa bộ lọc';
|
|
62
|
+
search = new EventEmitter();
|
|
63
|
+
reset = new EventEmitter();
|
|
64
|
+
advancedExpandedChange = new EventEmitter();
|
|
65
|
+
effectiveCols = 4;
|
|
66
|
+
stackedLayout = false;
|
|
67
|
+
resizeObserver;
|
|
68
|
+
layoutFrame;
|
|
69
|
+
get hostColumns() {
|
|
70
|
+
return this.effectiveCols;
|
|
71
|
+
}
|
|
72
|
+
/** Tổng cột grid = field cols + 1 cột actions. */
|
|
73
|
+
get hostTotalColumns() {
|
|
74
|
+
return this.effectiveCols + 1;
|
|
75
|
+
}
|
|
76
|
+
get hostGap() {
|
|
77
|
+
return this.gap;
|
|
78
|
+
}
|
|
79
|
+
get stackedLayoutClass() {
|
|
80
|
+
return this.stackedLayout;
|
|
81
|
+
}
|
|
82
|
+
ngOnChanges(changes) {
|
|
83
|
+
if (changes['columns'] ||
|
|
84
|
+
changes['responsiveColumns'] ||
|
|
85
|
+
changes['responsiveCollapse'] ||
|
|
86
|
+
changes['mobileBreakpoint']) {
|
|
87
|
+
this.scheduleLayout();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
ngAfterViewInit() {
|
|
91
|
+
this.ngZone.runOutsideAngular(() => {
|
|
92
|
+
this.resizeObserver = new ResizeObserver(() => this.scheduleLayout());
|
|
93
|
+
this.resizeObserver.observe(this.host.nativeElement);
|
|
94
|
+
});
|
|
95
|
+
this.scheduleLayout();
|
|
96
|
+
}
|
|
97
|
+
ngOnDestroy() {
|
|
98
|
+
this.resizeObserver?.disconnect();
|
|
99
|
+
if (this.layoutFrame) {
|
|
100
|
+
cancelAnimationFrame(this.layoutFrame);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
toggleAdvanced() {
|
|
104
|
+
const next = !this.advancedExpanded;
|
|
105
|
+
this.advancedExpanded = next;
|
|
106
|
+
this.advancedExpandedChange.emit(next);
|
|
107
|
+
}
|
|
108
|
+
onSearch() {
|
|
109
|
+
this.search.emit();
|
|
110
|
+
}
|
|
111
|
+
onReset() {
|
|
112
|
+
this.reset.emit();
|
|
113
|
+
}
|
|
114
|
+
scheduleLayout() {
|
|
115
|
+
if (this.layoutFrame) {
|
|
116
|
+
cancelAnimationFrame(this.layoutFrame);
|
|
117
|
+
}
|
|
118
|
+
this.layoutFrame = requestAnimationFrame(() => {
|
|
119
|
+
this.ngZone.run(() => {
|
|
120
|
+
this.updateResponsiveLayout();
|
|
121
|
+
this.cdr.markForCheck();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
updateResponsiveLayout() {
|
|
126
|
+
const hostWidth = this.host.nativeElement.clientWidth || 0;
|
|
127
|
+
this.effectiveCols = this.getEffectiveCols(hostWidth);
|
|
128
|
+
// 1 cột / dưới breakpoint: stacked — actions lên hàng đầu.
|
|
129
|
+
this.stackedLayout =
|
|
130
|
+
this.effectiveCols === 1 ||
|
|
131
|
+
(this.responsiveCollapse && hostWidth > 0 && hostWidth < this.mobileBreakpoint);
|
|
132
|
+
}
|
|
133
|
+
getEffectiveCols(width) {
|
|
134
|
+
const requested = Math.max(1, Math.floor(this.columns) || 1);
|
|
135
|
+
if (!this.responsiveColumns) {
|
|
136
|
+
return requested;
|
|
137
|
+
}
|
|
138
|
+
if (width <= 0) {
|
|
139
|
+
return requested;
|
|
140
|
+
}
|
|
141
|
+
const preset = COL_BREAKPOINTS.find((bp) => width >= bp.minWidth)?.cols ?? 1;
|
|
142
|
+
return Math.min(requested, preset);
|
|
143
|
+
}
|
|
144
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTableFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
145
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoTableFilterComponent, isStandalone: true, selector: "geo-table-filter", inputs: { columns: "columns", responsiveColumns: "responsiveColumns", responsiveCollapse: "responsiveCollapse", mobileBreakpoint: "mobileBreakpoint", gap: "gap", searchLabel: "searchLabel", searchLoading: "searchLoading", showAdvancedToggle: "showAdvancedToggle", showReset: "showReset", advancedExpanded: "advancedExpanded", advancedFilterCount: "advancedFilterCount", filterToggleTitle: "filterToggleTitle", resetTitle: "resetTitle" }, outputs: { search: "search", reset: "reset", advancedExpandedChange: "advancedExpandedChange" }, host: { properties: { "style.--geo-table-filter-cols": "this.hostColumns", "style.--geo-table-filter-total-cols": "this.hostTotalColumns", "style.--geo-table-filter-gap.px": "this.hostGap", "class.geo-table-filter--stacked": "this.stackedLayoutClass" } }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"geo-table-filter\"\n [class.geo-table-filter--expanded]=\"advancedExpanded\"\n [class.geo-table-filter--no-desktop-toggle]=\"!showAdvancedToggle\"\n>\n <div class=\"geo-table-filter__layout\">\n <div class=\"geo-table-filter__fields\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"geo-table-filter__actions\">\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n icon=\"search\"\n [disabled]=\"searchLoading\"\n (clicked)=\"onSearch()\"\n >\n {{ searchLabel }}\n </geo-button>\n\n @if (showAdvancedToggle) {\n <span\n class=\"geo-table-filter__toggle\"\n [class.geo-table-filter__toggle--active]=\"advancedExpanded\"\n [class.geo-table-filter__toggle--has-count]=\"advancedFilterCount > 0\"\n >\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"filter\"\n [iconOnly]=\"true\"\n [title]=\"filterToggleTitle\"\n [attr.aria-expanded]=\"advancedExpanded\"\n (clicked)=\"toggleAdvanced()\"\n ></geo-button>\n @if (advancedFilterCount > 0) {\n <span class=\"geo-table-filter__toggle-badge\" aria-hidden=\"true\">\n {{ advancedFilterCount > 99 ? '99+' : advancedFilterCount }}\n </span>\n }\n </span>\n }\n\n @if (showReset) {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"reload\"\n [iconOnly]=\"true\"\n [title]=\"resetTitle\"\n (clicked)=\"onReset()\"\n ></geo-button>\n }\n </div>\n\n <div\n class=\"geo-table-filter__advanced\"\n [class.geo-table-filter__advanced--visible]=\"advancedExpanded\"\n >\n <ng-content select=\"[advanced]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;--geo-table-filter-cols: 4;--geo-table-filter-total-cols: 5;--geo-table-filter-gap: 15px}.geo-table-filter{display:block}.geo-table-filter__layout{display:grid;grid-template-columns:repeat(var(--geo-table-filter-total-cols),minmax(0,1fr));grid-template-rows:auto auto;gap:var(--geo-table-filter-gap);align-items:start}.geo-table-filter__fields{grid-column:1/-2;grid-row:1;display:grid;grid-template-columns:repeat(var(--geo-table-filter-cols),minmax(0,1fr));gap:var(--geo-table-filter-gap);align-items:end;min-width:0}.geo-table-filter__fields>*{min-width:0;width:100%;max-width:100%;box-sizing:border-box}.geo-table-filter__actions{grid-column:-2/-1;grid-row:1;display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;align-self:start;gap:8px;min-width:0;width:100%;padding-top:22px;box-sizing:border-box}.geo-table-filter__advanced{grid-column:1/-1;grid-row:2;display:none;grid-template-columns:repeat(var(--geo-table-filter-total-cols),minmax(0,1fr));gap:var(--geo-table-filter-gap);align-items:end;min-width:0}.geo-table-filter__advanced>*{min-width:0;width:100%;max-width:100%;box-sizing:border-box}.geo-table-filter__advanced--visible{display:grid}.geo-table-filter--no-desktop-toggle .geo-table-filter__toggle{display:none}.geo-table-filter__toggle{position:relative;display:inline-flex;flex-shrink:0}.geo-table-filter__toggle--active ::ng-deep .geo-button.geo-button--secondary{background:var(--geo-color-primary-default);border-color:var(--geo-color-primary-default);color:var(--geo-color-neutral-white)}.geo-table-filter__toggle--active ::ng-deep .geo-button.geo-button--secondary:hover:not(:disabled){background:var(--geo-color-primary-hover);border-color:var(--geo-color-primary-hover);color:var(--geo-color-neutral-white)}.geo-table-filter__toggle--has-count:not(.geo-table-filter__toggle--active) ::ng-deep .geo-button.geo-button--secondary{background:var(--geo-color-primary-surface-light)}.geo-table-filter__toggle-badge{position:absolute;top:-6px;right:-6px;z-index:1;display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--geo-color-primary-default);color:var(--geo-color-neutral-white);font-size:11px;font-weight:600;line-height:1;box-sizing:border-box;pointer-events:none}.geo-table-filter__toggle--active .geo-table-filter__toggle-badge{background:var(--geo-color-neutral-white);color:var(--geo-color-primary-default);border:1px solid rgba(255,255,255,.35)}@media (max-width: 1023px){:host{--geo-table-filter-gap: 12px}}:host(.geo-table-filter--stacked) .geo-table-filter__layout{display:flex;flex-direction:column;gap:var(--geo-table-filter-gap)}:host(.geo-table-filter--stacked) .geo-table-filter__actions{order:1;width:100%;justify-content:flex-end;align-self:stretch;padding-top:0}:host(.geo-table-filter--stacked) .geo-table-filter__fields{order:2;width:100%}:host(.geo-table-filter--stacked) .geo-table-filter__advanced{order:3;width:100%}@media (max-width: 479px){:host{--geo-table-filter-gap: 10px}:host(.geo-table-filter--stacked) .geo-table-filter__actions{flex-wrap:wrap}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
146
|
+
}
|
|
147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTableFilterComponent, decorators: [{
|
|
148
|
+
type: Component,
|
|
149
|
+
args: [{ selector: 'geo-table-filter', standalone: true, imports: [CommonModule, GeoButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"geo-table-filter\"\n [class.geo-table-filter--expanded]=\"advancedExpanded\"\n [class.geo-table-filter--no-desktop-toggle]=\"!showAdvancedToggle\"\n>\n <div class=\"geo-table-filter__layout\">\n <div class=\"geo-table-filter__fields\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"geo-table-filter__actions\">\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n icon=\"search\"\n [disabled]=\"searchLoading\"\n (clicked)=\"onSearch()\"\n >\n {{ searchLabel }}\n </geo-button>\n\n @if (showAdvancedToggle) {\n <span\n class=\"geo-table-filter__toggle\"\n [class.geo-table-filter__toggle--active]=\"advancedExpanded\"\n [class.geo-table-filter__toggle--has-count]=\"advancedFilterCount > 0\"\n >\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"filter\"\n [iconOnly]=\"true\"\n [title]=\"filterToggleTitle\"\n [attr.aria-expanded]=\"advancedExpanded\"\n (clicked)=\"toggleAdvanced()\"\n ></geo-button>\n @if (advancedFilterCount > 0) {\n <span class=\"geo-table-filter__toggle-badge\" aria-hidden=\"true\">\n {{ advancedFilterCount > 99 ? '99+' : advancedFilterCount }}\n </span>\n }\n </span>\n }\n\n @if (showReset) {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"reload\"\n [iconOnly]=\"true\"\n [title]=\"resetTitle\"\n (clicked)=\"onReset()\"\n ></geo-button>\n }\n </div>\n\n <div\n class=\"geo-table-filter__advanced\"\n [class.geo-table-filter__advanced--visible]=\"advancedExpanded\"\n >\n <ng-content select=\"[advanced]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;--geo-table-filter-cols: 4;--geo-table-filter-total-cols: 5;--geo-table-filter-gap: 15px}.geo-table-filter{display:block}.geo-table-filter__layout{display:grid;grid-template-columns:repeat(var(--geo-table-filter-total-cols),minmax(0,1fr));grid-template-rows:auto auto;gap:var(--geo-table-filter-gap);align-items:start}.geo-table-filter__fields{grid-column:1/-2;grid-row:1;display:grid;grid-template-columns:repeat(var(--geo-table-filter-cols),minmax(0,1fr));gap:var(--geo-table-filter-gap);align-items:end;min-width:0}.geo-table-filter__fields>*{min-width:0;width:100%;max-width:100%;box-sizing:border-box}.geo-table-filter__actions{grid-column:-2/-1;grid-row:1;display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;align-self:start;gap:8px;min-width:0;width:100%;padding-top:22px;box-sizing:border-box}.geo-table-filter__advanced{grid-column:1/-1;grid-row:2;display:none;grid-template-columns:repeat(var(--geo-table-filter-total-cols),minmax(0,1fr));gap:var(--geo-table-filter-gap);align-items:end;min-width:0}.geo-table-filter__advanced>*{min-width:0;width:100%;max-width:100%;box-sizing:border-box}.geo-table-filter__advanced--visible{display:grid}.geo-table-filter--no-desktop-toggle .geo-table-filter__toggle{display:none}.geo-table-filter__toggle{position:relative;display:inline-flex;flex-shrink:0}.geo-table-filter__toggle--active ::ng-deep .geo-button.geo-button--secondary{background:var(--geo-color-primary-default);border-color:var(--geo-color-primary-default);color:var(--geo-color-neutral-white)}.geo-table-filter__toggle--active ::ng-deep .geo-button.geo-button--secondary:hover:not(:disabled){background:var(--geo-color-primary-hover);border-color:var(--geo-color-primary-hover);color:var(--geo-color-neutral-white)}.geo-table-filter__toggle--has-count:not(.geo-table-filter__toggle--active) ::ng-deep .geo-button.geo-button--secondary{background:var(--geo-color-primary-surface-light)}.geo-table-filter__toggle-badge{position:absolute;top:-6px;right:-6px;z-index:1;display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--geo-color-primary-default);color:var(--geo-color-neutral-white);font-size:11px;font-weight:600;line-height:1;box-sizing:border-box;pointer-events:none}.geo-table-filter__toggle--active .geo-table-filter__toggle-badge{background:var(--geo-color-neutral-white);color:var(--geo-color-primary-default);border:1px solid rgba(255,255,255,.35)}@media (max-width: 1023px){:host{--geo-table-filter-gap: 12px}}:host(.geo-table-filter--stacked) .geo-table-filter__layout{display:flex;flex-direction:column;gap:var(--geo-table-filter-gap)}:host(.geo-table-filter--stacked) .geo-table-filter__actions{order:1;width:100%;justify-content:flex-end;align-self:stretch;padding-top:0}:host(.geo-table-filter--stacked) .geo-table-filter__fields{order:2;width:100%}:host(.geo-table-filter--stacked) .geo-table-filter__advanced{order:3;width:100%}@media (max-width: 479px){:host{--geo-table-filter-gap: 10px}:host(.geo-table-filter--stacked) .geo-table-filter__actions{flex-wrap:wrap}}\n"] }]
|
|
150
|
+
}], propDecorators: { columns: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], responsiveColumns: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], responsiveCollapse: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], mobileBreakpoint: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], gap: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], searchLabel: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], searchLoading: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], showAdvancedToggle: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], showReset: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], advancedExpanded: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], advancedFilterCount: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], filterToggleTitle: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], resetTitle: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], search: [{
|
|
177
|
+
type: Output
|
|
178
|
+
}], reset: [{
|
|
179
|
+
type: Output
|
|
180
|
+
}], advancedExpandedChange: [{
|
|
181
|
+
type: Output
|
|
182
|
+
}], hostColumns: [{
|
|
183
|
+
type: HostBinding,
|
|
184
|
+
args: ['style.--geo-table-filter-cols']
|
|
185
|
+
}], hostTotalColumns: [{
|
|
186
|
+
type: HostBinding,
|
|
187
|
+
args: ['style.--geo-table-filter-total-cols']
|
|
188
|
+
}], hostGap: [{
|
|
189
|
+
type: HostBinding,
|
|
190
|
+
args: ['style.--geo-table-filter-gap.px']
|
|
191
|
+
}], stackedLayoutClass: [{
|
|
192
|
+
type: HostBinding,
|
|
193
|
+
args: ['class.geo-table-filter--stacked']
|
|
194
|
+
}] } });
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXRhYmxlLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nZW8tdWkvc3JjL2xpYi9maWdtYS9nZW8tdGFibGUvZ2VvLXRhYmxlLWZpbHRlci9nZW8tdGFibGUtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dlby11aS9zcmMvbGliL2ZpZ21hL2dlby10YWJsZS9nZW8tdGFibGUtZmlsdGVyL2dlby10YWJsZS1maWx0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUVOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7O0FBRTNFLG1FQUFtRTtBQUNuRSxNQUFNLGVBQWUsR0FBa0Q7SUFDckUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDM0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDM0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDM0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDMUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7Q0FDekIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBU0gsTUFBTSxPQUFPLHVCQUF1QjtJQUNq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QVc7c0JBRGQsV0FBVzt1QkFBQywrQkFBK0I7Z0JBT3hDLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxxQ0FBcUM7Z0JBTTlDLE9BQU87c0JBRFYsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBTTFDLGtCQUFrQjtzQkFEckIsV0FBVzt1QkFBQyxpQ0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBHZW9CdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9nZW8tYnV0dG9uL2dlby1idXR0b24uY29tcG9uZW50JztcblxuLyoqIEJyZWFrcG9pbnQgKHB4KSDihpIgc+G7kSBj4buZdCB04buRaSDEkWEga2hpIGByZXNwb25zaXZlQ29sdW1uc2AgYuG6rXQuICovXG5jb25zdCBDT0xfQlJFQUtQT0lOVFM6IHJlYWRvbmx5IHsgbWluV2lkdGg6IG51bWJlcjsgY29sczogbnVtYmVyIH1bXSA9IFtcbiAgeyBtaW5XaWR0aDogMTQwMCwgY29sczogNCB9LFxuICB7IG1pbldpZHRoOiAxMjAwLCBjb2xzOiA0IH0sXG4gIHsgbWluV2lkdGg6IDEwMjQsIGNvbHM6IDMgfSxcbiAgeyBtaW5XaWR0aDogNzY4LCBjb2xzOiAyIH0sXG4gIHsgbWluV2lkdGg6IDAsIGNvbHM6IDEgfSxcbl07XG5cbi8qKlxuICogVGhhbmggbOG7jWMgcGjDrWEgdHLDqm4gYuG6o25nOiBmaWVsZCBjaMOtbmggKyBhY3Rpb25zIChUw6xtIGtp4bq/bSAvIELhu5kgbOG7jWMgbsOibmcgY2FvIC8gUmVzZXQpLlxuICpcbiAqICMjIFPhu5EgY+G7mXQgaGnhu4NuIHRo4buLXG4gKiAtIGBbY29sdW1uc109XCI0XCJgIOKAlCA0IGPhu5l0IGZpZWxkICsgMSBj4buZdCBhY3Rpb25zID0gZ3JpZCA1IGPhu5l0IMSR4buBdS5cbiAqIC0gYFtyZXNwb25zaXZlQ29sdW1uc109XCJmYWxzZVwiYCDigJQgZ2nhu68gxJHDum5nIGBjb2x1bW5zYCwga2jDtG5nIGdp4bqjbSB0aGVvIGJyZWFrcG9pbnQuXG4gKlxuICogIyMgTGF5b3V0XG4gKiAtIEdyaWQgxJHhu4F1IGBjb2x1bW5zICsgMWA6IGZpZWxkIGPhu5l0IDEuLk4sIGFjdGlvbnMgY+G7mXQgY3Xhu5FpLlxuICogLSBBZHZhbmNlZCBzcGFuIGZ1bGwgd2lkdGggKGAxIC8gLTFgKSB24bubaSBjw7luZyBgY29sdW1ucyArIDFgIGPhu5l0IOKGkiBwaOG7pyBj4bqjIGPhu5l0IGJ1dHRvbi5cbiAqIC0gU3RhY2tlZCAobcOgbiBo4bq5cCk6IGFjdGlvbnMg4oaSIGZpZWxkcyDihpIgYWR2YW5jZWQuXG4gKlxuICogIyMgQ29udGVudCBwcm9qZWN0aW9uXG4gKiAtIERlZmF1bHQ6IGx1w7RuIGhp4buHbi4gU2xvdCBgW2FkdmFuY2VkXWA6IGNo4buJIGhp4buHbiBraGkgYGFkdmFuY2VkRXhwYW5kZWRgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnZW8tdGFibGUtZmlsdGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgR2VvQnV0dG9uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby10YWJsZS1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VvLXRhYmxlLWZpbHRlci5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBHZW9UYWJsZUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0ID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBT4buRIGPhu5l0IGZpZWxkIG3hu5dpIGjDoG5nICht4bq3YyDEkeG7i25oIDQg4oaSIHThu5VuZyA1IGPhu5l0IGfhu5NtIGFjdGlvbnMpLlxuICAgKiBWw60gZOG7pTogNCBmaWVsZCArIGNvbHVtbnM9MiDihpIgMiBow6BuZyDDlyAyIGPhu5l0IGZpZWxkICgrIDEgY+G7mXQgYWN0aW9ucykuXG4gICAqL1xuICBASW5wdXQoKSBjb2x1bW5zID0gNDtcbiAgLyoqXG4gICAqIEtoaSBgdHJ1ZWAgKG3hurdjIMSR4buLbmgpOiBz4buRIGPhu5l0IHRo4buxYyB04bq/IOKJpCBgY29sdW1uc2AgdGhlbyBicmVha3BvaW50LlxuICAgKiBLaGkgYGZhbHNlYDogbHXDtG4gZMO5bmcgxJHDum5nIGBjb2x1bW5zYC5cbiAgICovXG4gIEBJbnB1dCgpIHJlc3BvbnNpdmVDb2x1bW5zID0gdHJ1ZTtcbiAgLyoqIMSQxrBhIGFjdGlvbnMgbMOqbiBow6BuZyDEkeG6p3Uga2hpIG3DoG4gaOG6uXAgKHN0YWNrZWQpLiAqL1xuICBASW5wdXQoKSByZXNwb25zaXZlQ29sbGFwc2UgPSB0cnVlO1xuICAvKiogQnJlYWtwb2ludCBjaHV54buDbiBsYXlvdXQgc3RhY2tlZCAocHgpLiAqL1xuICBASW5wdXQoKSBtb2JpbGVCcmVha3BvaW50ID0gMTAyNDtcbiAgLyoqIEtob+G6o25nIGPDoWNoIGdyaWQgKHB4KS4gKi9cbiAgQElucHV0KCkgZ2FwID0gMTU7XG5cbiAgQElucHV0KCkgc2VhcmNoTGFiZWwgPSAnVMOsbSBraeG6v20nO1xuICBASW5wdXQoKSBzZWFyY2hMb2FkaW5nID0gZmFsc2U7XG4gIC8qKiBIaeG7h24gbsO6dCBt4bufL8SRw7NuZyBzbG90IGBbYWR2YW5jZWRdYC4gKi9cbiAgQElucHV0KCkgc2hvd0FkdmFuY2VkVG9nZ2xlID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd1Jlc2V0ID0gdHJ1ZTtcbiAgLyoqIE3hu58gcGFuZWwgZmllbGQgbsOibmcgY2FvIChgW2FkdmFuY2VkXWApLiAqL1xuICBASW5wdXQoKSBhZHZhbmNlZEV4cGFuZGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBT4buRIGZpZWxkIGFkdmFuY2VkIMSRYW5nIGPDsyBnacOhIHRy4buLIOKAlCBoaeG7h24gYmFkZ2UgdHLDqm4gbsO6dCBleHBhbmQuXG4gICAqIFBhcmVudCB04buxIHTDrW5oICh2ZC4gYGNvdW50RmlsbGVkRmlsdGVycyhxdWVyeSwgQURWQU5DRURfS0VZUylgKS5cbiAgICovXG4gIEBJbnB1dCgpIGFkdmFuY2VkRmlsdGVyQ291bnQgPSAwO1xuICBASW5wdXQoKSBmaWx0ZXJUb2dnbGVUaXRsZSA9ICdC4buZIGzhu41jIG7Dom5nIGNhbyc7XG4gIEBJbnB1dCgpIHJlc2V0VGl0bGUgPSAnWMOzYSBi4buZIGzhu41jJztcblxuICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBhZHZhbmNlZEV4cGFuZGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGVmZmVjdGl2ZUNvbHMgPSA0O1xuICBzdGFja2VkTGF5b3V0ID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIGxheW91dEZyYW1lPzogbnVtYmVyO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuLS1nZW8tdGFibGUtZmlsdGVyLWNvbHMnKVxuICBnZXQgaG9zdENvbHVtbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3RpdmVDb2xzO1xuICB9XG5cbiAgLyoqIFThu5VuZyBj4buZdCBncmlkID0gZmllbGQgY29scyArIDEgY+G7mXQgYWN0aW9ucy4gKi9cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS4tLWdlby10YWJsZS1maWx0ZXItdG90YWwtY29scycpXG4gIGdldCBob3N0VG90YWxDb2x1bW5zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0aXZlQ29scyArIDE7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tZ2VvLXRhYmxlLWZpbHRlci1nYXAucHgnKVxuICBnZXQgaG9zdEdhcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdhcDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZ2VvLXRhYmxlLWZpbHRlci0tc3RhY2tlZCcpXG4gIGdldCBzdGFja2VkTGF5b3V0Q2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tlZExheW91dDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydjb2x1bW5zJ10gfHxcbiAgICAgIGNoYW5nZXNbJ3Jlc3BvbnNpdmVDb2x1bW5zJ10gfHxcbiAgICAgIGNoYW5nZXNbJ3Jlc3BvbnNpdmVDb2xsYXBzZSddIHx8XG4gICAgICBjaGFuZ2VzWydtb2JpbGVCcmVha3BvaW50J11cbiAgICApIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVMYXlvdXQoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLnNjaGVkdWxlTGF5b3V0KCkpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50KTtcbiAgICB9KTtcbiAgICB0aGlzLnNjaGVkdWxlTGF5b3V0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMubGF5b3V0RnJhbWUpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubGF5b3V0RnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5hZHZhbmNlZEV4cGFuZGVkO1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9IG5leHQ7XG4gICAgdGhpcy5hZHZhbmNlZEV4cGFuZGVkQ2hhbmdlLmVtaXQobmV4dCk7XG4gIH1cblxuICBvblNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaC5lbWl0KCk7XG4gIH1cblxuICBvblJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXQuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZUxheW91dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYXlvdXRGcmFtZSkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5sYXlvdXRGcmFtZSk7XG4gICAgfVxuICAgIHRoaXMubGF5b3V0RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zaXZlTGF5b3V0KCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJlc3BvbnNpdmVMYXlvdXQoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdFdpZHRoID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggfHwgMDtcbiAgICB0aGlzLmVmZmVjdGl2ZUNvbHMgPSB0aGlzLmdldEVmZmVjdGl2ZUNvbHMoaG9zdFdpZHRoKTtcbiAgICAvLyAxIGPhu5l0IC8gZMaw4bubaSBicmVha3BvaW50OiBzdGFja2VkIOKAlCBhY3Rpb25zIGzDqm4gaMOgbmcgxJHhuqd1LlxuICAgIHRoaXMuc3RhY2tlZExheW91dCA9XG4gICAgICB0aGlzLmVmZmVjdGl2ZUNvbHMgPT09IDEgfHxcbiAgICAgICh0aGlzLnJlc3BvbnNpdmVDb2xsYXBzZSAmJiBob3N0V2lkdGggPiAwICYmIGhvc3RXaWR0aCA8IHRoaXMubW9iaWxlQnJlYWtwb2ludCk7XG4gIH1cblxuICBwcml2YXRlIGdldEVmZmVjdGl2ZUNvbHMod2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih0aGlzLmNvbHVtbnMpIHx8IDEpO1xuICAgIGlmICghdGhpcy5yZXNwb25zaXZlQ29sdW1ucykge1xuICAgICAgcmV0dXJuIHJlcXVlc3RlZDtcbiAgICB9XG4gICAgaWYgKHdpZHRoIDw9IDApIHtcbiAgICAgIHJldHVybiByZXF1ZXN0ZWQ7XG4gICAgfVxuICAgIGNvbnN0IHByZXNldCA9IENPTF9CUkVBS1BPSU5UUy5maW5kKChicCkgPT4gd2lkdGggPj0gYnAubWluV2lkdGgpPy5jb2xzID8/IDE7XG4gICAgcmV0dXJuIE1hdGgubWluKHJlcXVlc3RlZCwgcHJlc2V0KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImdlby10YWJsZS1maWx0ZXJcIlxuICBbY2xhc3MuZ2VvLXRhYmxlLWZpbHRlci0tZXhwYW5kZWRdPVwiYWR2YW5jZWRFeHBhbmRlZFwiXG4gIFtjbGFzcy5nZW8tdGFibGUtZmlsdGVyLS1uby1kZXNrdG9wLXRvZ2dsZV09XCIhc2hvd0FkdmFuY2VkVG9nZ2xlXCJcbj5cbiAgPGRpdiBjbGFzcz1cImdlby10YWJsZS1maWx0ZXJfX2xheW91dFwiPlxuICAgIDxkaXYgY2xhc3M9XCJnZW8tdGFibGUtZmlsdGVyX19maWVsZHNcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJnZW8tdGFibGUtZmlsdGVyX19hY3Rpb25zXCI+XG4gICAgICA8Z2VvLWJ1dHRvblxuICAgICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXG4gICAgICAgIGNvbG9yPVwiYnJhbmRcIlxuICAgICAgICBpY29uPVwic2VhcmNoXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInNlYXJjaExvYWRpbmdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblNlYXJjaCgpXCJcbiAgICAgID5cbiAgICAgICAge3sgc2VhcmNoTGFiZWwgfX1cbiAgICAgIDwvZ2VvLWJ1dHRvbj5cblxuICAgICAgQGlmIChzaG93QWR2YW5jZWRUb2dnbGUpIHtcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImdlby10YWJsZS1maWx0ZXJfX3RvZ2dsZVwiXG4gICAgICAgICAgW2NsYXNzLmdlby10YWJsZS1maWx0ZXJfX3RvZ2dsZS0tYWN0aXZlXT1cImFkdmFuY2VkRXhwYW5kZWRcIlxuICAgICAgICAgIFtjbGFzcy5nZW8tdGFibGUtZmlsdGVyX190b2dnbGUtLWhhcy1jb3VudF09XCJhZHZhbmNlZEZpbHRlckNvdW50ID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8Z2VvLWJ1dHRvblxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICBjb2xvcj1cImJyYW5kXCJcbiAgICAgICAgICAgIGljb249XCJmaWx0ZXJcIlxuICAgICAgICAgICAgW2ljb25Pbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImZpbHRlclRvZ2dsZVRpdGxlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiYWR2YW5jZWRFeHBhbmRlZFwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVBZHZhbmNlZCgpXCJcbiAgICAgICAgICA+PC9nZW8tYnV0dG9uPlxuICAgICAgICAgIEBpZiAoYWR2YW5jZWRGaWx0ZXJDb3VudCA+IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2VvLXRhYmxlLWZpbHRlcl9fdG9nZ2xlLWJhZGdlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIHt7IGFkdmFuY2VkRmlsdGVyQ291bnQgPiA5OSA/ICc5OSsnIDogYWR2YW5jZWRGaWx0ZXJDb3VudCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dSZXNldCkge1xuICAgICAgICA8Z2VvLWJ1dHRvblxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIGNvbG9yPVwiYnJhbmRcIlxuICAgICAgICAgIGljb249XCJyZWxvYWRcIlxuICAgICAgICAgIFtpY29uT25seV09XCJ0cnVlXCJcbiAgICAgICAgICBbdGl0bGVdPVwicmVzZXRUaXRsZVwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwib25SZXNldCgpXCJcbiAgICAgICAgPjwvZ2VvLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZ2VvLXRhYmxlLWZpbHRlcl9fYWR2YW5jZWRcIlxuICAgICAgW2NsYXNzLmdlby10YWJsZS1maWx0ZXJfX2FkdmFuY2VkLS12aXNpYmxlXT1cImFkdmFuY2VkRXhwYW5kZWRcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthZHZhbmNlZF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { NgZorroAntdModule } from '../../../ng-zorro/ng-zorro-antd.module';
|
|
5
|
+
import { GeoSelectComponent } from '../../geo-select/geo-select.component';
|
|
6
|
+
import { DEFAULT_UI_TABLE_PAGE_SIZE_OPTIONS } from '../geo-table.types';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/forms";
|
|
9
|
+
export class GeoTablePaginationComponent {
|
|
10
|
+
pageIndex = 1;
|
|
11
|
+
pageSize = 10;
|
|
12
|
+
total = 0;
|
|
13
|
+
pageSizeOptions = DEFAULT_UI_TABLE_PAGE_SIZE_OPTIONS;
|
|
14
|
+
showSizeChanger = true;
|
|
15
|
+
hideOnSinglePage = false;
|
|
16
|
+
showTotalRange = true;
|
|
17
|
+
sizeLabel = 'Hiển thị';
|
|
18
|
+
pageIndexChange = new EventEmitter();
|
|
19
|
+
pageSizeChange = new EventEmitter();
|
|
20
|
+
get rangeStart() {
|
|
21
|
+
if (this.total === 0) {
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
return (this.pageIndex - 1) * this.pageSize + 1;
|
|
25
|
+
}
|
|
26
|
+
get rangeEnd() {
|
|
27
|
+
if (this.total === 0) {
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
return Math.min(this.pageIndex * this.pageSize, this.total);
|
|
31
|
+
}
|
|
32
|
+
get totalPages() {
|
|
33
|
+
return Math.max(1, Math.ceil(this.total / this.pageSize));
|
|
34
|
+
}
|
|
35
|
+
get sizeOptions() {
|
|
36
|
+
return this.pageSizeOptions.map((size) => ({
|
|
37
|
+
label: size.toString(),
|
|
38
|
+
value: size,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
get visible() {
|
|
42
|
+
if (this.hideOnSinglePage && this.total <= this.pageSize) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return this.total > 0;
|
|
46
|
+
}
|
|
47
|
+
get pages() {
|
|
48
|
+
return this.buildPageList(this.pageIndex, this.totalPages);
|
|
49
|
+
}
|
|
50
|
+
get isFirstPage() {
|
|
51
|
+
return this.pageIndex <= 1;
|
|
52
|
+
}
|
|
53
|
+
get isLastPage() {
|
|
54
|
+
return this.pageIndex >= this.totalPages;
|
|
55
|
+
}
|
|
56
|
+
onPageSizeChange(value) {
|
|
57
|
+
if (typeof value === 'number') {
|
|
58
|
+
this.pageSizeChange.emit(value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
goToFirst() {
|
|
62
|
+
this.goToPage(1);
|
|
63
|
+
}
|
|
64
|
+
goToPrev() {
|
|
65
|
+
this.goToPage(this.pageIndex - 1);
|
|
66
|
+
}
|
|
67
|
+
goToNext() {
|
|
68
|
+
this.goToPage(this.pageIndex + 1);
|
|
69
|
+
}
|
|
70
|
+
goToLast() {
|
|
71
|
+
this.goToPage(this.totalPages);
|
|
72
|
+
}
|
|
73
|
+
goToPage(page) {
|
|
74
|
+
const next = Math.min(Math.max(page, 1), this.totalPages);
|
|
75
|
+
if (next !== this.pageIndex) {
|
|
76
|
+
this.pageIndexChange.emit(next);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
buildPageList(current, total) {
|
|
80
|
+
if (total <= 5) {
|
|
81
|
+
return Array.from({ length: total }, (_, index) => index + 1);
|
|
82
|
+
}
|
|
83
|
+
if (current <= 3) {
|
|
84
|
+
return [1, 2, 3, 'ellipsis', total];
|
|
85
|
+
}
|
|
86
|
+
if (current >= total - 2) {
|
|
87
|
+
return [1, 'ellipsis', total - 2, total - 1, total];
|
|
88
|
+
}
|
|
89
|
+
return [1, 'ellipsis', current - 1, current, current + 1, 'ellipsis', total];
|
|
90
|
+
}
|
|
91
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTablePaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
92
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoTablePaginationComponent, isStandalone: true, selector: "geo-table-pagination", inputs: { pageIndex: "pageIndex", pageSize: "pageSize", total: "total", pageSizeOptions: "pageSizeOptions", showSizeChanger: "showSizeChanger", hideOnSinglePage: "hideOnSinglePage", showTotalRange: "showTotalRange", sizeLabel: "sizeLabel" }, outputs: { pageIndexChange: "pageIndexChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "@if (visible) {\n <div class=\"geo-table-pagination\">\n <div class=\"geo-table-pagination__left\">\n @if (showTotalRange) {\n <p class=\"geo-table-pagination__total\">\n <strong>{{ rangeStart }}-{{ rangeEnd }}</strong> tr\u00EAn t\u1ED5ng <strong>{{ total }}</strong>\n </p>\n }\n\n @if (showSizeChanger) {\n <div class=\"geo-table-pagination__size\">\n <span class=\"geo-table-pagination__size-label\">{{ sizeLabel }}</span>\n <geo-select\n class=\"geo-table-pagination__size-select\"\n size=\"small\"\n [options]=\"sizeOptions\"\n [allowClear]=\"false\"\n [ngModel]=\"pageSize\"\n (valueChange)=\"onPageSizeChange($event)\"\n ></geo-select>\n </div>\n }\n </div>\n\n <div class=\"geo-table-pagination__nav\" role=\"navigation\" aria-label=\"Ph\u00E2n trang\">\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang \u0111\u1EA7u\"\n [disabled]=\"isFirstPage\"\n (click)=\"goToFirst()\"\n >\n <span aria-hidden=\"true\">«</span>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang tr\u01B0\u1EDBc\"\n [disabled]=\"isFirstPage\"\n (click)=\"goToPrev()\"\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n\n @for (page of pages; track $index) {\n @if (page === 'ellipsis') {\n <span class=\"geo-table-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n } @else {\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn geo-table-pagination__btn--page\"\n [class.geo-table-pagination__btn--active]=\"page === pageIndex\"\n [attr.aria-current]=\"page === pageIndex ? 'page' : null\"\n [attr.aria-label]=\"'Trang ' + page\"\n (click)=\"goToPage(page)\"\n >\n {{ page }}\n </button>\n }\n }\n\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang k\u1EBF\"\n [disabled]=\"isLastPage\"\n (click)=\"goToNext()\"\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang cu\u1ED1i\"\n [disabled]=\"isLastPage\"\n (click)=\"goToLast()\"\n >\n <span aria-hidden=\"true\">»</span>\n </button>\n </div>\n </div>\n}\n", styles: [":host{display:block}.geo-table-pagination{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:16px;flex-wrap:wrap}.geo-table-pagination__left{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.geo-table-pagination__total{margin:0;font-size:14px;line-height:20px;color:var(--geo-color-neutral-700);white-space:nowrap}.geo-table-pagination__total strong{color:var(--geo-color-neutral-900);font-weight:600}.geo-table-pagination__size{display:inline-flex;align-items:center;gap:8px}.geo-table-pagination__size-label{font-size:14px;line-height:20px;color:var(--geo-color-neutral-700);white-space:nowrap}.geo-table-pagination__size-select{width:72px}.geo-table-pagination__nav{display:inline-flex;align-items:center;gap:8px;margin-left:auto}.geo-table-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;padding:0 8px;border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius);background:var(--geo-color-neutral-white);color:var(--geo-color-neutral-900);font-size:14px;line-height:1;cursor:pointer;transition:border-color .15s ease,color .15s ease}.geo-table-pagination__btn:hover:not(:disabled){border-color:var(--geo-color-primary-default);color:var(--geo-color-primary-default)}.geo-table-pagination__btn:disabled{cursor:not-allowed;color:var(--geo-color-neutral-300);border-color:var(--geo-color-primary-border);background:var(--geo-color-neutral-white)}.geo-table-pagination__btn--page{min-width:32px;padding:0;font-weight:400}.geo-table-pagination__btn--active{border-color:var(--geo-color-primary-default)!important;color:var(--geo-color-primary-default)!important;background:var(--geo-color-neutral-white);font-weight:500}.geo-table-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;color:var(--geo-color-neutral-900);font-size:14px;letter-spacing:1px;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: GeoSelectComponent, selector: "geo-select", inputs: ["options", "label", "placeholder", "size", "mode", "disabled", "required", "error", "errorMessage", "allowClear", "showSearch", "block", "width"], outputs: ["valueChange"] }] });
|
|
93
|
+
}
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTablePaginationComponent, decorators: [{
|
|
95
|
+
type: Component,
|
|
96
|
+
args: [{ selector: 'geo-table-pagination', standalone: true, imports: [CommonModule, FormsModule, NgZorroAntdModule, GeoSelectComponent], template: "@if (visible) {\n <div class=\"geo-table-pagination\">\n <div class=\"geo-table-pagination__left\">\n @if (showTotalRange) {\n <p class=\"geo-table-pagination__total\">\n <strong>{{ rangeStart }}-{{ rangeEnd }}</strong> tr\u00EAn t\u1ED5ng <strong>{{ total }}</strong>\n </p>\n }\n\n @if (showSizeChanger) {\n <div class=\"geo-table-pagination__size\">\n <span class=\"geo-table-pagination__size-label\">{{ sizeLabel }}</span>\n <geo-select\n class=\"geo-table-pagination__size-select\"\n size=\"small\"\n [options]=\"sizeOptions\"\n [allowClear]=\"false\"\n [ngModel]=\"pageSize\"\n (valueChange)=\"onPageSizeChange($event)\"\n ></geo-select>\n </div>\n }\n </div>\n\n <div class=\"geo-table-pagination__nav\" role=\"navigation\" aria-label=\"Ph\u00E2n trang\">\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang \u0111\u1EA7u\"\n [disabled]=\"isFirstPage\"\n (click)=\"goToFirst()\"\n >\n <span aria-hidden=\"true\">«</span>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang tr\u01B0\u1EDBc\"\n [disabled]=\"isFirstPage\"\n (click)=\"goToPrev()\"\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n\n @for (page of pages; track $index) {\n @if (page === 'ellipsis') {\n <span class=\"geo-table-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n } @else {\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn geo-table-pagination__btn--page\"\n [class.geo-table-pagination__btn--active]=\"page === pageIndex\"\n [attr.aria-current]=\"page === pageIndex ? 'page' : null\"\n [attr.aria-label]=\"'Trang ' + page\"\n (click)=\"goToPage(page)\"\n >\n {{ page }}\n </button>\n }\n }\n\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang k\u1EBF\"\n [disabled]=\"isLastPage\"\n (click)=\"goToNext()\"\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n\n <button\n type=\"button\"\n class=\"geo-table-pagination__btn\"\n title=\"Trang cu\u1ED1i\"\n [disabled]=\"isLastPage\"\n (click)=\"goToLast()\"\n >\n <span aria-hidden=\"true\">»</span>\n </button>\n </div>\n </div>\n}\n", styles: [":host{display:block}.geo-table-pagination{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:16px;flex-wrap:wrap}.geo-table-pagination__left{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.geo-table-pagination__total{margin:0;font-size:14px;line-height:20px;color:var(--geo-color-neutral-700);white-space:nowrap}.geo-table-pagination__total strong{color:var(--geo-color-neutral-900);font-weight:600}.geo-table-pagination__size{display:inline-flex;align-items:center;gap:8px}.geo-table-pagination__size-label{font-size:14px;line-height:20px;color:var(--geo-color-neutral-700);white-space:nowrap}.geo-table-pagination__size-select{width:72px}.geo-table-pagination__nav{display:inline-flex;align-items:center;gap:8px;margin-left:auto}.geo-table-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;padding:0 8px;border:1px solid var(--geo-color-primary-border);border-radius:var(--geo-radius);background:var(--geo-color-neutral-white);color:var(--geo-color-neutral-900);font-size:14px;line-height:1;cursor:pointer;transition:border-color .15s ease,color .15s ease}.geo-table-pagination__btn:hover:not(:disabled){border-color:var(--geo-color-primary-default);color:var(--geo-color-primary-default)}.geo-table-pagination__btn:disabled{cursor:not-allowed;color:var(--geo-color-neutral-300);border-color:var(--geo-color-primary-border);background:var(--geo-color-neutral-white)}.geo-table-pagination__btn--page{min-width:32px;padding:0;font-weight:400}.geo-table-pagination__btn--active{border-color:var(--geo-color-primary-default)!important;color:var(--geo-color-primary-default)!important;background:var(--geo-color-neutral-white);font-weight:500}.geo-table-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;color:var(--geo-color-neutral-900);font-size:14px;letter-spacing:1px;-webkit-user-select:none;user-select:none}\n"] }]
|
|
97
|
+
}], propDecorators: { pageIndex: [{
|
|
98
|
+
type: Input
|
|
99
|
+
}], pageSize: [{
|
|
100
|
+
type: Input
|
|
101
|
+
}], total: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], pageSizeOptions: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], showSizeChanger: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], hideOnSinglePage: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], showTotalRange: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}], sizeLabel: [{
|
|
112
|
+
type: Input
|
|
113
|
+
}], pageIndexChange: [{
|
|
114
|
+
type: Output
|
|
115
|
+
}], pageSizeChange: [{
|
|
116
|
+
type: Output
|
|
117
|
+
}] } });
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXRhYmxlLXBhZ2luYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLXRhYmxlL2dlby10YWJsZS1wYWdpbmF0aW9uL2dlby10YWJsZS1wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dlby11aS9zcmMvbGliL2ZpZ21hL2dlby10YWJsZS9nZW8tdGFibGUtcGFnaW5hdGlvbi9nZW8tdGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQVd4RSxNQUFNLE9BQU8sMkJBQTJCO0lBQzdCLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDZCxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNWLGVBQWUsR0FBYSxrQ0FBa0MsQ0FBQztJQUMvRCxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLFNBQVMsR0FBRyxVQUFVLENBQUM7SUFFdEIsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFV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QkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5nWm9ycm9BbnRkTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vbmctem9ycm8vbmctem9ycm8tYW50ZC5tb2R1bGUnO1xuaW1wb3J0IHsgR2VvU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZ2VvLXNlbGVjdC9nZW8tc2VsZWN0LnR5cGVzJztcbmltcG9ydCB7IEdlb1NlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2dlby1zZWxlY3QvZ2VvLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgREVGQVVMVF9VSV9UQUJMRV9QQUdFX1NJWkVfT1BUSU9OUyB9IGZyb20gJy4uL2dlby10YWJsZS50eXBlcyc7XG5cbmV4cG9ydCB0eXBlIEdlb1RhYmxlUGFnaW5hdGlvblBhZ2VJdGVtID0gbnVtYmVyIHwgJ2VsbGlwc2lzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ2VvLXRhYmxlLXBhZ2luYXRpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTmdab3Jyb0FudGRNb2R1bGUsIEdlb1NlbGVjdENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9nZW8tdGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9nZW8tdGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEdlb1RhYmxlUGFnaW5hdGlvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHBhZ2VJbmRleCA9IDE7XG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gMTA7XG4gIEBJbnB1dCgpIHRvdGFsID0gMDtcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IERFRkFVTFRfVUlfVEFCTEVfUEFHRV9TSVpFX09QVElPTlM7XG4gIEBJbnB1dCgpIHNob3dTaXplQ2hhbmdlciA9IHRydWU7XG4gIEBJbnB1dCgpIGhpZGVPblNpbmdsZVBhZ2UgPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd1RvdGFsUmFuZ2UgPSB0cnVlO1xuICBASW5wdXQoKSBzaXplTGFiZWwgPSAnSGnhu4NuIHRo4buLJztcblxuICBAT3V0cHV0KCkgcGFnZUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIGdldCByYW5nZVN0YXJ0KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudG90YWwgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5wYWdlSW5kZXggLSAxKSAqIHRoaXMucGFnZVNpemUgKyAxO1xuICB9XG5cbiAgZ2V0IHJhbmdlRW5kKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudG90YWwgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemUsIHRoaXMudG90YWwpO1xuICB9XG5cbiAgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnBhZ2VTaXplKSk7XG4gIH1cblxuICBnZXQgc2l6ZU9wdGlvbnMoKTogR2VvU2VsZWN0T3B0aW9uPG51bWJlcj5bXSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZVNpemVPcHRpb25zLm1hcCgoc2l6ZSkgPT4gKHtcbiAgICAgIGxhYmVsOiBzaXplLnRvU3RyaW5nKCksXG4gICAgICB2YWx1ZTogc2l6ZSxcbiAgICB9KSk7XG4gIH1cblxuICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oaWRlT25TaW5nbGVQYWdlICYmIHRoaXMudG90YWwgPD0gdGhpcy5wYWdlU2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvdGFsID4gMDtcbiAgfVxuXG4gIGdldCBwYWdlcygpOiBHZW9UYWJsZVBhZ2luYXRpb25QYWdlSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFBhZ2VMaXN0KHRoaXMucGFnZUluZGV4LCB0aGlzLnRvdGFsUGFnZXMpO1xuICB9XG5cbiAgZ2V0IGlzRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VJbmRleCA8PSAxO1xuICB9XG5cbiAgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUluZGV4ID49IHRoaXMudG90YWxQYWdlcztcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ29Ub0ZpcnN0KCk6IHZvaWQge1xuICAgIHRoaXMuZ29Ub1BhZ2UoMSk7XG4gIH1cblxuICBnb1RvUHJldigpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9QYWdlKHRoaXMucGFnZUluZGV4IC0gMSk7XG4gIH1cblxuICBnb1RvTmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9QYWdlKHRoaXMucGFnZUluZGV4ICsgMSk7XG4gIH1cblxuICBnb1RvTGFzdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9QYWdlKHRoaXMudG90YWxQYWdlcyk7XG4gIH1cblxuICBnb1RvUGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gTWF0aC5taW4oTWF0aC5tYXgocGFnZSwgMSksIHRoaXMudG90YWxQYWdlcyk7XG4gICAgaWYgKG5leHQgIT09IHRoaXMucGFnZUluZGV4KSB7XG4gICAgICB0aGlzLnBhZ2VJbmRleENoYW5nZS5lbWl0KG5leHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQYWdlTGlzdChjdXJyZW50OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpOiBHZW9UYWJsZVBhZ2luYXRpb25QYWdlSXRlbVtdIHtcbiAgICBpZiAodG90YWwgPD0gNSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvdGFsIH0sIChfLCBpbmRleCkgPT4gaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCA8PSAzKSB7XG4gICAgICByZXR1cm4gWzEsIDIsIDMsICdlbGxpcHNpcycsIHRvdGFsXTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCA+PSB0b3RhbCAtIDIpIHtcbiAgICAgIHJldHVybiBbMSwgJ2VsbGlwc2lzJywgdG90YWwgLSAyLCB0b3RhbCAtIDEsIHRvdGFsXTtcbiAgICB9XG5cbiAgICByZXR1cm4gWzEsICdlbGxpcHNpcycsIGN1cnJlbnQgLSAxLCBjdXJyZW50LCBjdXJyZW50ICsgMSwgJ2VsbGlwc2lzJywgdG90YWxdO1xuICB9XG59XG4iLCJAaWYgKHZpc2libGUpIHtcbiAgPGRpdiBjbGFzcz1cImdlby10YWJsZS1wYWdpbmF0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cImdlby10YWJsZS1wYWdpbmF0aW9uX19sZWZ0XCI+XG4gICAgICBAaWYgKHNob3dUb3RhbFJhbmdlKSB7XG4gICAgICAgIDxwIGNsYXNzPVwiZ2VvLXRhYmxlLXBhZ2luYXRpb25fX3RvdGFsXCI+XG4gICAgICAgICAgPHN0cm9uZz57eyByYW5nZVN0YXJ0IH19LXt7IHJhbmdlRW5kIH19PC9zdHJvbmc+IHRyw6puIHThu5VuZyA8c3Ryb25nPnt7IHRvdGFsIH19PC9zdHJvbmc+XG4gICAgICAgIDwvcD5cbiAgICAgIH1cblxuICAgICAgQGlmIChzaG93U2l6ZUNoYW5nZXIpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImdlby10YWJsZS1wYWdpbmF0aW9uX19zaXplXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJnZW8tdGFibGUtcGFnaW5hdGlvbl9fc2l6ZS1sYWJlbFwiPnt7IHNpemVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8Z2VvLXNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJnZW8tdGFibGUtcGFnaW5hdGlvbl9fc2l6ZS1zZWxlY3RcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNpemVPcHRpb25zXCJcbiAgICAgICAgICAgIFthbGxvd0NsZWFyXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L2dlby1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImdlby10YWJsZS1wYWdpbmF0aW9uX19uYXZcIiByb2xlPVwibmF2aWdhdGlvblwiIGFyaWEtbGFiZWw9XCJQaMOibiB0cmFuZ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJnZW8tdGFibGUtcGFnaW5hdGlvbl9fYnRuXCJcbiAgICAgICAgdGl0bGU9XCJUcmFuZyDEkeG6p3VcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNGaXJzdFBhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiZ29Ub0ZpcnN0KClcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mbGFxdW87PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiZ2VvLXRhYmxlLXBhZ2luYXRpb25fX2J0blwiXG4gICAgICAgIHRpdGxlPVwiVHJhbmcgdHLGsOG7m2NcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNGaXJzdFBhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiZ29Ub1ByZXYoKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZsc2FxdW87PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIEBmb3IgKHBhZ2Ugb2YgcGFnZXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICBAaWYgKHBhZ2UgPT09ICdlbGxpcHNpcycpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdlby10YWJsZS1wYWdpbmF0aW9uX19lbGxpcHNpc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPi4uLjwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImdlby10YWJsZS1wYWdpbmF0aW9uX19idG4gZ2VvLXRhYmxlLXBhZ2luYXRpb25fX2J0bi0tcGFnZVwiXG4gICAgICAgICAgICBbY2xhc3MuZ2VvLXRhYmxlLXBhZ2luYXRpb25fX2J0bi0tYWN0aXZlXT1cInBhZ2UgPT09IHBhZ2VJbmRleFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwicGFnZSA9PT0gcGFnZUluZGV4ID8gJ3BhZ2UnIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUcmFuZyAnICsgcGFnZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UocGFnZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHBhZ2UgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImdlby10YWJsZS1wYWdpbmF0aW9uX19idG5cIlxuICAgICAgICB0aXRsZT1cIlRyYW5nIGvhur9cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNMYXN0UGFnZVwiXG4gICAgICAgIChjbGljayk9XCJnb1RvTmV4dCgpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnJzYXF1bzs8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJnZW8tdGFibGUtcGFnaW5hdGlvbl9fYnRuXCJcbiAgICAgICAgdGl0bGU9XCJUcmFuZyBjdeG7kWlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNMYXN0UGFnZVwiXG4gICAgICAgIChjbGljayk9XCJnb1RvTGFzdCgpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnJhcXVvOzwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { NgZorroAntdModule } from '../../../ng-zorro/ng-zorro-antd.module';
|
|
4
|
+
import { GeoButtonComponent } from '../../geo-button/geo-button.component';
|
|
5
|
+
import { GeoColumnPickerComponent } from '../geo-column-picker/geo-column-picker.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class GeoTableToolbarComponent {
|
|
8
|
+
resultLabel = '';
|
|
9
|
+
resultCount = null;
|
|
10
|
+
selectedCount = 0;
|
|
11
|
+
showDelete = true;
|
|
12
|
+
showExport = true;
|
|
13
|
+
showColumnToggle = true;
|
|
14
|
+
showAdd = true;
|
|
15
|
+
addLabel = 'Thêm mới';
|
|
16
|
+
columnItems = [];
|
|
17
|
+
/** Key lưu trạng thái ẩn/hiện cột trong sessionStorage */
|
|
18
|
+
columnStorageKey;
|
|
19
|
+
deleteClick = new EventEmitter();
|
|
20
|
+
exportClick = new EventEmitter();
|
|
21
|
+
toggleColumns = new EventEmitter();
|
|
22
|
+
columnApply = new EventEmitter();
|
|
23
|
+
addClick = new EventEmitter();
|
|
24
|
+
get displayResultLabel() {
|
|
25
|
+
if (this.resultLabel) {
|
|
26
|
+
return this.resultLabel;
|
|
27
|
+
}
|
|
28
|
+
const count = this.resultCount ?? 0;
|
|
29
|
+
return `Kết quả tìm kiếm (${count} kết quả)`;
|
|
30
|
+
}
|
|
31
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTableToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
32
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoTableToolbarComponent, isStandalone: true, selector: "geo-table-toolbar", inputs: { resultLabel: "resultLabel", resultCount: "resultCount", selectedCount: "selectedCount", showDelete: "showDelete", showExport: "showExport", showColumnToggle: "showColumnToggle", showAdd: "showAdd", addLabel: "addLabel", columnItems: "columnItems", columnStorageKey: "columnStorageKey" }, outputs: { deleteClick: "deleteClick", exportClick: "exportClick", toggleColumns: "toggleColumns", columnApply: "columnApply", addClick: "addClick" }, ngImport: i0, template: "<div class=\"geo-table-toolbar\">\n <div class=\"geo-table-toolbar__info\">{{ displayResultLabel }}</div>\n\n <div class=\"geo-table-toolbar__actions\">\n @if (showDelete && selectedCount > 0) {\n <geo-button\n appearance=\"secondary\"\n color=\"danger\"\n icon=\"delete\"\n title=\"X\u00F3a\"\n (clicked)=\"deleteClick.emit()\"\n >\n X\u00F3a ({{ selectedCount }})\n </geo-button>\n }\n\n @if (showExport) {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"download\"\n title=\"Xu\u1EA5t d\u1EEF li\u1EC7u\"\n (clicked)=\"exportClick.emit()\"\n >\n Xu\u1EA5t d\u1EEF li\u1EC7u\n </geo-button>\n }\n\n @if (showColumnToggle) {\n @if (columnItems.length) {\n <geo-column-picker\n [items]=\"columnItems\"\n [storageKey]=\"columnStorageKey\"\n (apply)=\"columnApply.emit($event)\"\n ></geo-column-picker>\n } @else {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"eye-invisible\"\n title=\"\u1EA8n hi\u1EC7n c\u1ED9t\"\n (clicked)=\"toggleColumns.emit()\"\n >\n \u1EA8n hi\u1EC7n c\u1ED9t\n </geo-button>\n }\n }\n\n @if (showAdd) {\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n icon=\"plus\"\n [title]=\"addLabel\"\n (clicked)=\"addClick.emit()\"\n >\n {{ addLabel }}\n </geo-button>\n }\n </div>\n</div>\n", styles: [":host{display:block}.geo-table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.geo-table-toolbar__info{font-size:16px;font-weight:600;line-height:24px;color:var(--geo-color-neutral-900)}.geo-table-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex-wrap:wrap;margin-left:auto}@media (max-width: 767px){.geo-table-toolbar{flex-direction:column;align-items:stretch}.geo-table-toolbar__actions{margin-left:0;justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgZorroAntdModule }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoColumnPickerComponent, selector: "geo-column-picker", inputs: ["triggerLabel", "hint", "items", "storageKey"], outputs: ["apply"] }] });
|
|
33
|
+
}
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoTableToolbarComponent, decorators: [{
|
|
35
|
+
type: Component,
|
|
36
|
+
args: [{ selector: 'geo-table-toolbar', standalone: true, imports: [CommonModule, NgZorroAntdModule, GeoButtonComponent, GeoColumnPickerComponent], template: "<div class=\"geo-table-toolbar\">\n <div class=\"geo-table-toolbar__info\">{{ displayResultLabel }}</div>\n\n <div class=\"geo-table-toolbar__actions\">\n @if (showDelete && selectedCount > 0) {\n <geo-button\n appearance=\"secondary\"\n color=\"danger\"\n icon=\"delete\"\n title=\"X\u00F3a\"\n (clicked)=\"deleteClick.emit()\"\n >\n X\u00F3a ({{ selectedCount }})\n </geo-button>\n }\n\n @if (showExport) {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"download\"\n title=\"Xu\u1EA5t d\u1EEF li\u1EC7u\"\n (clicked)=\"exportClick.emit()\"\n >\n Xu\u1EA5t d\u1EEF li\u1EC7u\n </geo-button>\n }\n\n @if (showColumnToggle) {\n @if (columnItems.length) {\n <geo-column-picker\n [items]=\"columnItems\"\n [storageKey]=\"columnStorageKey\"\n (apply)=\"columnApply.emit($event)\"\n ></geo-column-picker>\n } @else {\n <geo-button\n appearance=\"secondary\"\n color=\"brand\"\n icon=\"eye-invisible\"\n title=\"\u1EA8n hi\u1EC7n c\u1ED9t\"\n (clicked)=\"toggleColumns.emit()\"\n >\n \u1EA8n hi\u1EC7n c\u1ED9t\n </geo-button>\n }\n }\n\n @if (showAdd) {\n <geo-button\n appearance=\"primary\"\n color=\"brand\"\n icon=\"plus\"\n [title]=\"addLabel\"\n (clicked)=\"addClick.emit()\"\n >\n {{ addLabel }}\n </geo-button>\n }\n </div>\n</div>\n", styles: [":host{display:block}.geo-table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.geo-table-toolbar__info{font-size:16px;font-weight:600;line-height:24px;color:var(--geo-color-neutral-900)}.geo-table-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex-wrap:wrap;margin-left:auto}@media (max-width: 767px){.geo-table-toolbar{flex-direction:column;align-items:stretch}.geo-table-toolbar__actions{margin-left:0;justify-content:flex-start}}\n"] }]
|
|
37
|
+
}], propDecorators: { resultLabel: [{
|
|
38
|
+
type: Input
|
|
39
|
+
}], resultCount: [{
|
|
40
|
+
type: Input
|
|
41
|
+
}], selectedCount: [{
|
|
42
|
+
type: Input
|
|
43
|
+
}], showDelete: [{
|
|
44
|
+
type: Input
|
|
45
|
+
}], showExport: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}], showColumnToggle: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}], showAdd: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], addLabel: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}], columnItems: [{
|
|
54
|
+
type: Input
|
|
55
|
+
}], columnStorageKey: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], deleteClick: [{
|
|
58
|
+
type: Output
|
|
59
|
+
}], exportClick: [{
|
|
60
|
+
type: Output
|
|
61
|
+
}], toggleColumns: [{
|
|
62
|
+
type: Output
|
|
63
|
+
}], columnApply: [{
|
|
64
|
+
type: Output
|
|
65
|
+
}], addClick: [{
|
|
66
|
+
type: Output
|
|
67
|
+
}] } });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXRhYmxlLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLXRhYmxlL2dlby10YWJsZS10b29sYmFyL2dlby10YWJsZS10b29sYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dlby11aS9zcmMvbGliL2ZpZ21hL2dlby10YWJsZS9nZW8tdGFibGUtdG9vbGJhci9nZW8tdGFibGUtdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7QUFVNUYsTUFBTSxPQUFPLHdCQUF3QjtJQUMxQixXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0lBQ2xDLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDbEIsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNsQixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUN4QixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUN0QixXQUFXLEdBQTBCLEVBQUUsQ0FBQztJQUNqRCwwREFBMEQ7SUFDakQsZ0JBQWdCLENBQVU7SUFFekIsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDdkMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDdkMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDekMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO0lBQzlELFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRTlDLElBQUksa0JBQWtCO1FBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDcEMsT0FBTyxxQkFBcUIsS0FBSyxXQUFXLENBQUM7SUFDL0MsQ0FBQzt3R0ExQlUsd0JBQXdCOzRGQUF4Qix3QkFBd0IsOGdCQ2RyQyxvakRBNkRBLCtqQkRuRFksWUFBWSw4QkFBRSxpQkFBaUIsK0JBQUUsa0JBQWtCLHNPQUFFLHdCQUF3Qjs7NEZBSTVFLHdCQUF3QjtrQkFQcEMsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixDQUFDOzhCQUsvRSxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdab3Jyb0FudGRNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9uZy16b3Jyby9uZy16b3Jyby1hbnRkLm1vZHVsZSc7XG5pbXBvcnQgeyBHZW9CdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9nZW8tYnV0dG9uL2dlby1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEdlb0NvbHVtblBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1jb2x1bW4tcGlja2VyL2dlby1jb2x1bW4tcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9Db2x1bW5QaWNrZXJBcHBseVBheWxvYWQsIEdlb0NvbHVtblBpY2tlckl0ZW0gfSBmcm9tICcuLi9nZW8tY29sdW1uLXBpY2tlci9nZW8tY29sdW1uLXBpY2tlci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dlby10YWJsZS10b29sYmFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTmdab3Jyb0FudGRNb2R1bGUsIEdlb0J1dHRvbkNvbXBvbmVudCwgR2VvQ29sdW1uUGlja2VyQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby10YWJsZS10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2dlby10YWJsZS10b29sYmFyLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgR2VvVGFibGVUb29sYmFyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcmVzdWx0TGFiZWwgPSAnJztcbiAgQElucHV0KCkgcmVzdWx0Q291bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzZWxlY3RlZENvdW50ID0gMDtcbiAgQElucHV0KCkgc2hvd0RlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dFeHBvcnQgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q29sdW1uVG9nZ2xlID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0FkZCA9IHRydWU7XG4gIEBJbnB1dCgpIGFkZExhYmVsID0gJ1Row6ptIG3hu5tpJztcbiAgQElucHV0KCkgY29sdW1uSXRlbXM6IEdlb0NvbHVtblBpY2tlckl0ZW1bXSA9IFtdO1xuICAvKiogS2V5IGzGsHUgdHLhuqFuZyB0aMOhaSDhuqluL2hp4buHbiBj4buZdCB0cm9uZyBzZXNzaW9uU3RvcmFnZSAqL1xuICBASW5wdXQoKSBjb2x1bW5TdG9yYWdlS2V5Pzogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSBkZWxldGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGV4cG9ydENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdG9nZ2xlQ29sdW1ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtbkFwcGx5ID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9Db2x1bW5QaWNrZXJBcHBseVBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBhZGRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBnZXQgZGlzcGxheVJlc3VsdExhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucmVzdWx0TGFiZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdExhYmVsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yZXN1bHRDb3VudCA/PyAwO1xuICAgIHJldHVybiBgS+G6v3QgcXXhuqMgdMOsbSBraeG6v20gKCR7Y291bnR9IGvhur90IHF14bqjKWA7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnZW8tdGFibGUtdG9vbGJhclwiPlxuICA8ZGl2IGNsYXNzPVwiZ2VvLXRhYmxlLXRvb2xiYXJfX2luZm9cIj57eyBkaXNwbGF5UmVzdWx0TGFiZWwgfX08L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZ2VvLXRhYmxlLXRvb2xiYXJfX2FjdGlvbnNcIj5cbiAgICBAaWYgKHNob3dEZWxldGUgJiYgc2VsZWN0ZWRDb3VudCA+IDApIHtcbiAgICAgIDxnZW8tYnV0dG9uXG4gICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICB0aXRsZT1cIljDs2FcIlxuICAgICAgICAoY2xpY2tlZCk9XCJkZWxldGVDbGljay5lbWl0KClcIlxuICAgICAgPlxuICAgICAgICBYw7NhICh7eyBzZWxlY3RlZENvdW50IH19KVxuICAgICAgPC9nZW8tYnV0dG9uPlxuICAgIH1cblxuICAgIEBpZiAoc2hvd0V4cG9ydCkge1xuICAgICAgPGdlby1idXR0b25cbiAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgIGNvbG9yPVwiYnJhbmRcIlxuICAgICAgICBpY29uPVwiZG93bmxvYWRcIlxuICAgICAgICB0aXRsZT1cIlh14bqldCBk4buvIGxp4buHdVwiXG4gICAgICAgIChjbGlja2VkKT1cImV4cG9ydENsaWNrLmVtaXQoKVwiXG4gICAgICA+XG4gICAgICAgIFh14bqldCBk4buvIGxp4buHdVxuICAgICAgPC9nZW8tYnV0dG9uPlxuICAgIH1cblxuICAgIEBpZiAoc2hvd0NvbHVtblRvZ2dsZSkge1xuICAgICAgQGlmIChjb2x1bW5JdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgPGdlby1jb2x1bW4tcGlja2VyXG4gICAgICAgICAgW2l0ZW1zXT1cImNvbHVtbkl0ZW1zXCJcbiAgICAgICAgICBbc3RvcmFnZUtleV09XCJjb2x1bW5TdG9yYWdlS2V5XCJcbiAgICAgICAgICAoYXBwbHkpPVwiY29sdW1uQXBwbHkuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgPjwvZ2VvLWNvbHVtbi1waWNrZXI+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGdlby1idXR0b25cbiAgICAgICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICBjb2xvcj1cImJyYW5kXCJcbiAgICAgICAgICBpY29uPVwiZXllLWludmlzaWJsZVwiXG4gICAgICAgICAgdGl0bGU9XCLhuqhuIGhp4buHbiBj4buZdFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlQ29sdW1ucy5lbWl0KClcIlxuICAgICAgICA+XG4gICAgICAgICAg4bqobiBoaeG7h24gY+G7mXRcbiAgICAgICAgPC9nZW8tYnV0dG9uPlxuICAgICAgfVxuICAgIH1cblxuICAgIEBpZiAoc2hvd0FkZCkge1xuICAgICAgPGdlby1idXR0b25cbiAgICAgICAgYXBwZWFyYW5jZT1cInByaW1hcnlcIlxuICAgICAgICBjb2xvcj1cImJyYW5kXCJcbiAgICAgICAgaWNvbj1cInBsdXNcIlxuICAgICAgICBbdGl0bGVdPVwiYWRkTGFiZWxcIlxuICAgICAgICAoY2xpY2tlZCk9XCJhZGRDbGljay5lbWl0KClcIlxuICAgICAgPlxuICAgICAgICB7eyBhZGRMYWJlbCB9fVxuICAgICAgPC9nZW8tYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|