@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.
Files changed (165) hide show
  1. package/AGENTS.md +25 -0
  2. package/README.md +46 -0
  3. package/ai/AGENTS.md +86 -0
  4. package/ai/README.md +44 -0
  5. package/ai/catalog.json +882 -0
  6. package/ai/components/geo-alert.md +56 -0
  7. package/ai/components/geo-back-button.md +54 -0
  8. package/ai/components/geo-breadcrumb.md +52 -0
  9. package/ai/components/geo-button.md +63 -0
  10. package/ai/components/geo-checkbox.md +54 -0
  11. package/ai/components/geo-column-picker.md +54 -0
  12. package/ai/components/geo-confirm-modal.md +70 -0
  13. package/ai/components/geo-date-picker.md +65 -0
  14. package/ai/components/geo-date-range-picker.md +64 -0
  15. package/ai/components/geo-file-picker.md +62 -0
  16. package/ai/components/geo-form-modal.md +88 -0
  17. package/ai/components/geo-icon.md +53 -0
  18. package/ai/components/geo-input.md +65 -0
  19. package/ai/components/geo-page-title.md +53 -0
  20. package/ai/components/geo-pagination.md +59 -0
  21. package/ai/components/geo-radio.md +67 -0
  22. package/ai/components/geo-row-actions.md +54 -0
  23. package/ai/components/geo-select.md +68 -0
  24. package/ai/components/geo-slider.md +56 -0
  25. package/ai/components/geo-status-tag.md +51 -0
  26. package/ai/components/geo-step-form-layout.md +81 -0
  27. package/ai/components/geo-stepper.md +63 -0
  28. package/ai/components/geo-table-filter.md +65 -0
  29. package/ai/components/geo-table-pagination.md +59 -0
  30. package/ai/components/geo-table-toolbar.md +64 -0
  31. package/ai/components/geo-table.md +98 -0
  32. package/ai/components/geo-tabs.md +62 -0
  33. package/ai/components/geo-textarea.md +59 -0
  34. package/ai/components/geo-toast.md +61 -0
  35. package/ai/components/geo-tree.md +58 -0
  36. package/ai/components/geo-typography.md +57 -0
  37. package/ai/components/geo-upload.md +78 -0
  38. package/ai/recipes.md +111 -0
  39. package/esm2022/geoit-ui.mjs +5 -0
  40. package/esm2022/lib/figma/geo-alert/geo-alert.component.mjs +58 -0
  41. package/esm2022/lib/figma/geo-alert/geo-alert.types.mjs +7 -0
  42. package/esm2022/lib/figma/geo-back-button/geo-back-button.component.mjs +48 -0
  43. package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.component.mjs +33 -0
  44. package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.types.mjs +2 -0
  45. package/esm2022/lib/figma/geo-button/geo-button.component.mjs +77 -0
  46. package/esm2022/lib/figma/geo-button/geo-button.types.mjs +2 -0
  47. package/esm2022/lib/figma/geo-checkbox/geo-checkbox.component.mjs +34 -0
  48. package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.component.mjs +76 -0
  49. package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.types.mjs +2 -0
  50. package/esm2022/lib/figma/geo-date-picker/geo-date-picker.component.mjs +119 -0
  51. package/esm2022/lib/figma/geo-date-picker/geo-date-picker.types.mjs +2 -0
  52. package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.component.mjs +116 -0
  53. package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.types.mjs +2 -0
  54. package/esm2022/lib/figma/geo-file-picker/geo-file-picker.component.mjs +145 -0
  55. package/esm2022/lib/figma/geo-file-picker/geo-file-picker.types.mjs +2 -0
  56. package/esm2022/lib/figma/geo-form-modal/geo-form-modal.component.mjs +153 -0
  57. package/esm2022/lib/figma/geo-icon/geo-icon.component.mjs +51 -0
  58. package/esm2022/lib/figma/geo-icon/geo-icon.types.mjs +8 -0
  59. package/esm2022/lib/figma/geo-input/geo-input.component.mjs +118 -0
  60. package/esm2022/lib/figma/geo-page-title/geo-page-title.component.mjs +51 -0
  61. package/esm2022/lib/figma/geo-pagination/geo-pagination.component.mjs +54 -0
  62. package/esm2022/lib/figma/geo-radio/geo-radio.component.mjs +95 -0
  63. package/esm2022/lib/figma/geo-radio/geo-radio.types.mjs +2 -0
  64. package/esm2022/lib/figma/geo-select/geo-select.component.mjs +113 -0
  65. package/esm2022/lib/figma/geo-select/geo-select.types.mjs +2 -0
  66. package/esm2022/lib/figma/geo-slider/geo-slider.component.mjs +43 -0
  67. package/esm2022/lib/figma/geo-status-tag/geo-status-tag.component.mjs +62 -0
  68. package/esm2022/lib/figma/geo-status-tag/geo-status-tag.types.mjs +30 -0
  69. package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.component.mjs +157 -0
  70. package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.types.mjs +2 -0
  71. package/esm2022/lib/figma/geo-stepper/geo-stepper.component.mjs +77 -0
  72. package/esm2022/lib/figma/geo-stepper/geo-stepper.types.mjs +2 -0
  73. package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.mjs +65 -0
  74. package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.storage.mjs +31 -0
  75. package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.types.mjs +2 -0
  76. package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.mjs +64 -0
  77. package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.types.mjs +24 -0
  78. package/esm2022/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.mjs +195 -0
  79. package/esm2022/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.mjs +118 -0
  80. package/esm2022/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.mjs +68 -0
  81. package/esm2022/lib/figma/geo-table/geo-table.component.mjs +381 -0
  82. package/esm2022/lib/figma/geo-table/geo-table.types.mjs +4 -0
  83. package/esm2022/lib/figma/geo-tabs/geo-tabs.component.mjs +94 -0
  84. package/esm2022/lib/figma/geo-tabs/geo-tabs.types.mjs +2 -0
  85. package/esm2022/lib/figma/geo-textarea/geo-textarea.component.mjs +85 -0
  86. package/esm2022/lib/figma/geo-toast/geo-toast.component.mjs +57 -0
  87. package/esm2022/lib/figma/geo-toast/geo-toast.service.mjs +116 -0
  88. package/esm2022/lib/figma/geo-toast/geo-toast.types.mjs +13 -0
  89. package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +52 -0
  90. package/esm2022/lib/figma/geo-tree/geo-tree.types.mjs +2 -0
  91. package/esm2022/lib/figma/geo-typography/geo-typography.component.mjs +112 -0
  92. package/esm2022/lib/figma/geo-typography/geo-typography.types.mjs +96 -0
  93. package/esm2022/lib/figma/geo-upload/geo-upload.component.mjs +218 -0
  94. package/esm2022/lib/figma/geo-upload/geo-upload.types.mjs +30 -0
  95. package/esm2022/lib/figma/index.mjs +56 -0
  96. package/esm2022/lib/ng-zorro/ng-zorro-antd.module.mjs +293 -0
  97. package/esm2022/lib/styles/tokens.mjs +144 -0
  98. package/esm2022/public-api.mjs +7 -0
  99. package/fesm2022/geoit-ui.mjs +3805 -0
  100. package/fesm2022/geoit-ui.mjs.map +1 -0
  101. package/index.d.ts +5 -0
  102. package/lib/figma/geo-alert/geo-alert.component.d.ts +17 -0
  103. package/lib/figma/geo-alert/geo-alert.types.d.ts +2 -0
  104. package/lib/figma/geo-back-button/geo-back-button.component.d.ts +18 -0
  105. package/lib/figma/geo-breadcrumb/geo-breadcrumb.component.d.ts +12 -0
  106. package/lib/figma/geo-breadcrumb/geo-breadcrumb.types.d.ts +10 -0
  107. package/lib/figma/geo-button/geo-button.component.d.ts +27 -0
  108. package/lib/figma/geo-button/geo-button.types.d.ts +4 -0
  109. package/lib/figma/geo-checkbox/geo-checkbox.component.d.ts +12 -0
  110. package/lib/figma/geo-confirm-modal/geo-confirm-modal.component.d.ts +24 -0
  111. package/lib/figma/geo-confirm-modal/geo-confirm-modal.types.d.ts +5 -0
  112. package/lib/figma/geo-date-picker/geo-date-picker.component.d.ts +35 -0
  113. package/lib/figma/geo-date-picker/geo-date-picker.types.d.ts +2 -0
  114. package/lib/figma/geo-date-range-picker/geo-date-range-picker.component.d.ts +34 -0
  115. package/lib/figma/geo-date-range-picker/geo-date-range-picker.types.d.ts +2 -0
  116. package/lib/figma/geo-file-picker/geo-file-picker.component.d.ts +39 -0
  117. package/lib/figma/geo-file-picker/geo-file-picker.types.d.ts +4 -0
  118. package/lib/figma/geo-form-modal/geo-form-modal.component.d.ts +57 -0
  119. package/lib/figma/geo-icon/geo-icon.component.d.ts +19 -0
  120. package/lib/figma/geo-icon/geo-icon.types.d.ts +3 -0
  121. package/lib/figma/geo-input/geo-input.component.d.ts +37 -0
  122. package/lib/figma/geo-page-title/geo-page-title.component.d.ts +22 -0
  123. package/lib/figma/geo-pagination/geo-pagination.component.d.ts +21 -0
  124. package/lib/figma/geo-radio/geo-radio.component.d.ts +31 -0
  125. package/lib/figma/geo-radio/geo-radio.types.d.ts +9 -0
  126. package/lib/figma/geo-select/geo-select.component.d.ts +33 -0
  127. package/lib/figma/geo-select/geo-select.types.d.ts +7 -0
  128. package/lib/figma/geo-slider/geo-slider.component.d.ts +17 -0
  129. package/lib/figma/geo-status-tag/geo-status-tag.component.d.ts +18 -0
  130. package/lib/figma/geo-status-tag/geo-status-tag.types.d.ts +13 -0
  131. package/lib/figma/geo-step-form-layout/geo-step-form-layout.component.d.ts +67 -0
  132. package/lib/figma/geo-step-form-layout/geo-step-form-layout.types.d.ts +9 -0
  133. package/lib/figma/geo-stepper/geo-stepper.component.d.ts +42 -0
  134. package/lib/figma/geo-stepper/geo-stepper.types.d.ts +9 -0
  135. package/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.d.ts +20 -0
  136. package/lib/figma/geo-table/geo-column-picker/geo-column-picker.storage.d.ts +5 -0
  137. package/lib/figma/geo-table/geo-column-picker/geo-column-picker.types.d.ts +17 -0
  138. package/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.d.ts +21 -0
  139. package/lib/figma/geo-table/geo-row-actions/geo-row-actions.types.d.ts +13 -0
  140. package/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.d.ts +75 -0
  141. package/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.d.ts +33 -0
  142. package/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.d.ts +24 -0
  143. package/lib/figma/geo-table/geo-table.component.d.ts +113 -0
  144. package/lib/figma/geo-table/geo-table.types.d.ts +47 -0
  145. package/lib/figma/geo-tabs/geo-tabs.component.d.ts +31 -0
  146. package/lib/figma/geo-tabs/geo-tabs.types.d.ts +7 -0
  147. package/lib/figma/geo-textarea/geo-textarea.component.d.ts +27 -0
  148. package/lib/figma/geo-toast/geo-toast.component.d.ts +23 -0
  149. package/lib/figma/geo-toast/geo-toast.service.d.ts +33 -0
  150. package/lib/figma/geo-toast/geo-toast.types.d.ts +45 -0
  151. package/lib/figma/geo-tree/geo-tree.component.d.ts +23 -0
  152. package/lib/figma/geo-tree/geo-tree.types.d.ts +12 -0
  153. package/lib/figma/geo-typography/geo-typography.component.d.ts +35 -0
  154. package/lib/figma/geo-typography/geo-typography.types.d.ts +12 -0
  155. package/lib/figma/geo-upload/geo-upload.component.d.ts +59 -0
  156. package/lib/figma/geo-upload/geo-upload.types.d.ts +13 -0
  157. package/lib/figma/index.d.ts +55 -0
  158. package/lib/ng-zorro/ng-zorro-antd.module.d.ts +76 -0
  159. package/lib/styles/tokens.d.ts +184 -0
  160. package/package.json +38 -0
  161. package/public-api.d.ts +3 -0
  162. package/src/lib/styles/design-tokens.scss +143 -0
  163. package/src/lib/styles/geo-toast-notification.scss +129 -0
  164. package/src/lib/styles/scrollbar.scss +38 -0
  165. 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\">&laquo;</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\">&lsaquo;</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\">&rsaquo;</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\">&raquo;</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\">&laquo;</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\">&lsaquo;</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\">&rsaquo;</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\">&raquo;</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==