@es.framework/ng.ui.core 2.0.58

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 (246) hide show
  1. package/README.md +3 -0
  2. package/attachments/README.md +3 -0
  3. package/base-crud/README.md +3 -0
  4. package/breadcrumb/README.md +3 -0
  5. package/checkbox/README.md +3 -0
  6. package/collapsible/README.md +3 -0
  7. package/color-picker/README.md +3 -0
  8. package/column-settings-popover/README.md +3 -0
  9. package/custom-switch/README.md +3 -0
  10. package/datepicker/README.md +3 -0
  11. package/deactivation-reason/README.md +3 -0
  12. package/excel-import/README.md +3 -0
  13. package/fesm2022/es.framework-ng.ui.core-attachments.mjs +217 -0
  14. package/fesm2022/es.framework-ng.ui.core-attachments.mjs.map +1 -0
  15. package/fesm2022/es.framework-ng.ui.core-base-crud.mjs +370 -0
  16. package/fesm2022/es.framework-ng.ui.core-base-crud.mjs.map +1 -0
  17. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs +145 -0
  18. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs.map +1 -0
  19. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs +131 -0
  20. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs.map +1 -0
  21. package/fesm2022/es.framework-ng.ui.core-collapsible.mjs +90 -0
  22. package/fesm2022/es.framework-ng.ui.core-collapsible.mjs.map +1 -0
  23. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs +87 -0
  24. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs.map +1 -0
  25. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs +183 -0
  26. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs.map +1 -0
  27. package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs +119 -0
  28. package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs.map +1 -0
  29. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs +519 -0
  30. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs.map +1 -0
  31. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs +144 -0
  32. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs.map +1 -0
  33. package/fesm2022/es.framework-ng.ui.core-excel-import.mjs +566 -0
  34. package/fesm2022/es.framework-ng.ui.core-excel-import.mjs.map +1 -0
  35. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs +386 -0
  36. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs.map +1 -0
  37. package/fesm2022/es.framework-ng.ui.core-form-button.mjs +62 -0
  38. package/fesm2022/es.framework-ng.ui.core-form-button.mjs.map +1 -0
  39. package/fesm2022/es.framework-ng.ui.core-form-field.mjs +155 -0
  40. package/fesm2022/es.framework-ng.ui.core-form-field.mjs.map +1 -0
  41. package/fesm2022/es.framework-ng.ui.core-form-template.mjs +37 -0
  42. package/fesm2022/es.framework-ng.ui.core-form-template.mjs.map +1 -0
  43. package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs +132 -0
  44. package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs.map +1 -0
  45. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs +89 -0
  46. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs.map +1 -0
  47. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs +195 -0
  48. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs.map +1 -0
  49. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs +73 -0
  50. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs.map +1 -0
  51. package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs +201 -0
  52. package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs.map +1 -0
  53. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs +542 -0
  54. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs.map +1 -0
  55. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs +62 -0
  56. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs.map +1 -0
  57. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs +422 -0
  58. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs.map +1 -0
  59. package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs +48 -0
  60. package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs.map +1 -0
  61. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs +85 -0
  62. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs.map +1 -0
  63. package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs +22 -0
  64. package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs.map +1 -0
  65. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs +173 -0
  66. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs.map +1 -0
  67. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs +150 -0
  68. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs.map +1 -0
  69. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs +218 -0
  70. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs.map +1 -0
  71. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs +929 -0
  72. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs.map +1 -0
  73. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs +321 -0
  74. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs.map +1 -0
  75. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs +35 -0
  76. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs.map +1 -0
  77. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs +63 -0
  78. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs.map +1 -0
  79. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs +34 -0
  80. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs.map +1 -0
  81. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs +196 -0
  82. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs.map +1 -0
  83. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs +556 -0
  84. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs.map +1 -0
  85. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs +2995 -0
  86. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs.map +1 -0
  87. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs +103 -0
  88. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs.map +1 -0
  89. package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs +684 -0
  90. package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs.map +1 -0
  91. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs +388 -0
  92. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs.map +1 -0
  93. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs +465 -0
  94. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs.map +1 -0
  95. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs +31 -0
  96. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs.map +1 -0
  97. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs +205 -0
  98. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs.map +1 -0
  99. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs +102 -0
  100. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs.map +1 -0
  101. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs +67 -0
  102. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs.map +1 -0
  103. package/fesm2022/es.framework-ng.ui.core-input.mjs +250 -0
  104. package/fesm2022/es.framework-ng.ui.core-input.mjs.map +1 -0
  105. package/fesm2022/es.framework-ng.ui.core-label-type.mjs +184 -0
  106. package/fesm2022/es.framework-ng.ui.core-label-type.mjs.map +1 -0
  107. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs +66 -0
  108. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs.map +1 -0
  109. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs +307 -0
  110. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs.map +1 -0
  111. package/fesm2022/es.framework-ng.ui.core-query-type.mjs +162 -0
  112. package/fesm2022/es.framework-ng.ui.core-query-type.mjs.map +1 -0
  113. package/fesm2022/es.framework-ng.ui.core-radio.mjs +120 -0
  114. package/fesm2022/es.framework-ng.ui.core-radio.mjs.map +1 -0
  115. package/fesm2022/es.framework-ng.ui.core-repeat.mjs +290 -0
  116. package/fesm2022/es.framework-ng.ui.core-repeat.mjs.map +1 -0
  117. package/fesm2022/es.framework-ng.ui.core-select.mjs +179 -0
  118. package/fesm2022/es.framework-ng.ui.core-select.mjs.map +1 -0
  119. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs +52 -0
  120. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs.map +1 -0
  121. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs +53 -0
  122. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs.map +1 -0
  123. package/fesm2022/es.framework-ng.ui.core-tabs.mjs +57 -0
  124. package/fesm2022/es.framework-ng.ui.core-tabs.mjs.map +1 -0
  125. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs +209 -0
  126. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs.map +1 -0
  127. package/fesm2022/es.framework-ng.ui.core-text-editor.mjs +58 -0
  128. package/fesm2022/es.framework-ng.ui.core-text-editor.mjs.map +1 -0
  129. package/fesm2022/es.framework-ng.ui.core-textarea.mjs +93 -0
  130. package/fesm2022/es.framework-ng.ui.core-textarea.mjs.map +1 -0
  131. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs +245 -0
  132. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs.map +1 -0
  133. package/fesm2022/es.framework-ng.ui.core.mjs +20 -0
  134. package/fesm2022/es.framework-ng.ui.core.mjs.map +1 -0
  135. package/filter-templates/README.md +3 -0
  136. package/form-button/README.md +3 -0
  137. package/form-field/README.md +3 -0
  138. package/form-template/README.md +3 -0
  139. package/formly-avatar-image/README.md +3 -0
  140. package/formly-avatar-label/README.md +3 -0
  141. package/formly-button/README.md +3 -0
  142. package/formly-button-selector/README.md +3 -0
  143. package/formly-presets/README.md +3 -0
  144. package/formly-prime-icon-picker/README.md +3 -0
  145. package/formly-split-button/README.md +3 -0
  146. package/formly-ui/README.md +3 -0
  147. package/formly-ui-all/README.md +3 -0
  148. package/formly-username-with-domain/README.md +3 -0
  149. package/generic-assets/README.md +3 -0
  150. package/generic-autocomplete/README.md +3 -0
  151. package/generic-button/README.md +3 -0
  152. package/generic-card/README.md +3 -0
  153. package/generic-crud-table/README.md +3 -0
  154. package/generic-dialog/README.md +3 -0
  155. package/generic-errormessage/README.md +3 -0
  156. package/generic-formly-fields/README.md +3 -0
  157. package/generic-loadingspinner/README.md +3 -0
  158. package/generic-report/README.md +3 -0
  159. package/generic-report-tabs/README.md +0 -0
  160. package/generic-search/README.md +3 -0
  161. package/generic-search-advanced/README.md +3 -0
  162. package/generic-selector/README.md +3 -0
  163. package/generic-table/README.md +3 -0
  164. package/generic-view/README.md +3 -0
  165. package/header-wrapper/README.md +3 -0
  166. package/icon-picker/README.md +3 -0
  167. package/input/README.md +3 -0
  168. package/input-switch/README.md +3 -0
  169. package/input-with-icon/README.md +3 -0
  170. package/label-type/README.md +3 -0
  171. package/loading-skeletons/README.md +3 -0
  172. package/odata-query-builder/README.md +3 -0
  173. package/package.json +264 -0
  174. package/query-type/README.md +3 -0
  175. package/radio/README.md +3 -0
  176. package/repeat/README.md +3 -0
  177. package/select/README.md +3 -0
  178. package/sidebar-cards/README.md +3 -0
  179. package/sidebar-toggles/README.md +3 -0
  180. package/styles.css +2 -0
  181. package/tabs/README.md +3 -0
  182. package/tag-type/README.md +3 -0
  183. package/text-editor/README.md +3 -0
  184. package/textarea/README.md +3 -0
  185. package/types/es.framework-ng.ui.core-attachments.d.ts +38 -0
  186. package/types/es.framework-ng.ui.core-base-crud.d.ts +74 -0
  187. package/types/es.framework-ng.ui.core-breadcrumb.d.ts +17 -0
  188. package/types/es.framework-ng.ui.core-checkbox.d.ts +33 -0
  189. package/types/es.framework-ng.ui.core-collapsible.d.ts +18 -0
  190. package/types/es.framework-ng.ui.core-color-picker.d.ts +16 -0
  191. package/types/es.framework-ng.ui.core-column-settings-popover.d.ts +46 -0
  192. package/types/es.framework-ng.ui.core-custom-switch.d.ts +19 -0
  193. package/types/es.framework-ng.ui.core-datepicker.d.ts +23 -0
  194. package/types/es.framework-ng.ui.core-deactivation-reason.d.ts +32 -0
  195. package/types/es.framework-ng.ui.core-excel-import.d.ts +69 -0
  196. package/types/es.framework-ng.ui.core-filter-templates.d.ts +57 -0
  197. package/types/es.framework-ng.ui.core-form-button.d.ts +17 -0
  198. package/types/es.framework-ng.ui.core-form-field.d.ts +30 -0
  199. package/types/es.framework-ng.ui.core-form-template.d.ts +16 -0
  200. package/types/es.framework-ng.ui.core-formly-avatar-image.d.ts +18 -0
  201. package/types/es.framework-ng.ui.core-formly-avatar-label.d.ts +36 -0
  202. package/types/es.framework-ng.ui.core-formly-button-selector.d.ts +35 -0
  203. package/types/es.framework-ng.ui.core-formly-button.d.ts +20 -0
  204. package/types/es.framework-ng.ui.core-formly-presets.d.ts +37 -0
  205. package/types/es.framework-ng.ui.core-formly-prime-icon-picker.d.ts +45 -0
  206. package/types/es.framework-ng.ui.core-formly-split-button.d.ts +23 -0
  207. package/types/es.framework-ng.ui.core-formly-ui-all.d.ts +40 -0
  208. package/types/es.framework-ng.ui.core-formly-ui.d.ts +13 -0
  209. package/types/es.framework-ng.ui.core-formly-username-with-domain.d.ts +19 -0
  210. package/types/es.framework-ng.ui.core-generic-assets.d.ts +10 -0
  211. package/types/es.framework-ng.ui.core-generic-autocomplete.d.ts +41 -0
  212. package/types/es.framework-ng.ui.core-generic-button.d.ts +39 -0
  213. package/types/es.framework-ng.ui.core-generic-card.d.ts +93 -0
  214. package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +293 -0
  215. package/types/es.framework-ng.ui.core-generic-dialog.d.ts +93 -0
  216. package/types/es.framework-ng.ui.core-generic-errormessage.d.ts +17 -0
  217. package/types/es.framework-ng.ui.core-generic-formly-fields.d.ts +26 -0
  218. package/types/es.framework-ng.ui.core-generic-loadingspinner.d.ts +16 -0
  219. package/types/es.framework-ng.ui.core-generic-report-tabs.d.ts +21 -0
  220. package/types/es.framework-ng.ui.core-generic-report.d.ts +121 -0
  221. package/types/es.framework-ng.ui.core-generic-search-advanced.d.ts +305 -0
  222. package/types/es.framework-ng.ui.core-generic-search.d.ts +36 -0
  223. package/types/es.framework-ng.ui.core-generic-selector.d.ts +99 -0
  224. package/types/es.framework-ng.ui.core-generic-table.d.ts +84 -0
  225. package/types/es.framework-ng.ui.core-generic-view.d.ts +97 -0
  226. package/types/es.framework-ng.ui.core-header-wrapper.d.ts +15 -0
  227. package/types/es.framework-ng.ui.core-icon-picker.d.ts +30 -0
  228. package/types/es.framework-ng.ui.core-input-switch.d.ts +16 -0
  229. package/types/es.framework-ng.ui.core-input-with-icon.d.ts +17 -0
  230. package/types/es.framework-ng.ui.core-input.d.ts +47 -0
  231. package/types/es.framework-ng.ui.core-label-type.d.ts +38 -0
  232. package/types/es.framework-ng.ui.core-loading-skeletons.d.ts +17 -0
  233. package/types/es.framework-ng.ui.core-odata-query-builder.d.ts +87 -0
  234. package/types/es.framework-ng.ui.core-query-type.d.ts +37 -0
  235. package/types/es.framework-ng.ui.core-radio.d.ts +38 -0
  236. package/types/es.framework-ng.ui.core-repeat.d.ts +31 -0
  237. package/types/es.framework-ng.ui.core-select.d.ts +42 -0
  238. package/types/es.framework-ng.ui.core-sidebar-cards.d.ts +25 -0
  239. package/types/es.framework-ng.ui.core-sidebar-toggles.d.ts +25 -0
  240. package/types/es.framework-ng.ui.core-tabs.d.ts +17 -0
  241. package/types/es.framework-ng.ui.core-tag-type.d.ts +34 -0
  242. package/types/es.framework-ng.ui.core-text-editor.d.ts +16 -0
  243. package/types/es.framework-ng.ui.core-textarea.d.ts +36 -0
  244. package/types/es.framework-ng.ui.core-wrappers.d.ts +36 -0
  245. package/types/es.framework-ng.ui.core.d.ts +8 -0
  246. package/wrappers/README.md +3 -0
@@ -0,0 +1,556 @@
1
+ import * as i0 from '@angular/core';
2
+ import { NgModule, inject, Component, Input, ViewChild } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormsModule, FormGroup, ReactiveFormsModule } from '@angular/forms';
6
+ import { FormlyForm } from '@ngx-formly/core';
7
+ import { TranslatePipe } from '@es.framework/ng.core/pipes';
8
+ import * as i2 from 'primeng/button';
9
+ import { ButtonModule } from 'primeng/button';
10
+ import { DialogModule } from 'primeng/dialog';
11
+ import * as i3 from 'primeng/inputtext';
12
+ import { InputTextModule } from 'primeng/inputtext';
13
+ import { RadioButtonModule } from 'primeng/radiobutton';
14
+ import { CheckboxModule } from 'primeng/checkbox';
15
+ import * as i1$1 from 'primeng/dynamicdialog';
16
+ import { DynamicDialogRef, DynamicDialogConfig, DialogService } from 'primeng/dynamicdialog';
17
+ import { LocalizationService, RestService } from '@es.framework/ng.core/services';
18
+ import { Subject, takeUntil } from 'rxjs';
19
+ import * as i5 from 'primeng/drawer';
20
+ import { DrawerModule } from 'primeng/drawer';
21
+ import { TableModule } from 'primeng/table';
22
+ import * as i6 from 'primeng/splitbutton';
23
+ import { SplitButtonModule } from 'primeng/splitbutton';
24
+ import * as i7 from 'primeng/tooltip';
25
+ import { TooltipModule } from 'primeng/tooltip';
26
+ import { DomSanitizer } from '@angular/platform-browser';
27
+ import { QueryBuilderService } from '@es.framework/ng.ui.core/generic-search-advanced';
28
+ import * as i4 from 'primeng/api';
29
+
30
+ class GenericReportModule {
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericReportModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
32
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: GenericReportModule, imports: [CommonModule] });
33
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericReportModule, imports: [CommonModule] });
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericReportModule, decorators: [{
36
+ type: NgModule,
37
+ args: [{
38
+ imports: [CommonModule],
39
+ }]
40
+ }] });
41
+
42
+ // report-name-dialog.component.ts
43
+ class ReportNameDialogComponent {
44
+ fileName = '';
45
+ ref = inject(DynamicDialogRef);
46
+ config = inject(DynamicDialogConfig);
47
+ translate = inject(LocalizationService);
48
+ ngOnInit() {
49
+ this.fileName = this.config.data?.fileName || '';
50
+ }
51
+ save() {
52
+ if (this.fileName?.trim()) {
53
+ this.ref.close(this.fileName.trim());
54
+ }
55
+ }
56
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ReportNameDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
57
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ReportNameDialogComponent, isStandalone: true, selector: "app-report-name-dialog", ngImport: i0, template: `
58
+ <div class="p-fluid">
59
+ <div class="field">
60
+ <label for="fileName" class="block text-sm font-medium mb-2">
61
+ {{ 'REPORT_NAME' | translate }}
62
+ </label>
63
+ <input
64
+ id="fileName"
65
+ type="text"
66
+ [(ngModel)]="fileName"
67
+ pInputText
68
+ class="w-full"
69
+ [placeholder]="'ENTER_REPORT_NAME' | translate"
70
+ autofocus>
71
+ </div>
72
+ </div>
73
+
74
+ <div class="flex justify-end gap-2 mt-4">
75
+ <button
76
+ type="button"
77
+ pButton
78
+ class="p-button-text"
79
+ (click)="ref.close()"
80
+ [label]="'CANCEL' | translate">
81
+ </button>
82
+ <button
83
+ type="button"
84
+ pButton
85
+ (click)="save()"
86
+ [label]="'SAVE' | translate">
87
+ </button>
88
+ </div>
89
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ReportNameDialogComponent, decorators: [{
92
+ type: Component,
93
+ args: [{
94
+ selector: 'app-report-name-dialog',
95
+ standalone: true,
96
+ imports: [
97
+ FormsModule,
98
+ TranslatePipe,
99
+ ButtonModule,
100
+ InputTextModule
101
+ ],
102
+ template: `
103
+ <div class="p-fluid">
104
+ <div class="field">
105
+ <label for="fileName" class="block text-sm font-medium mb-2">
106
+ {{ 'REPORT_NAME' | translate }}
107
+ </label>
108
+ <input
109
+ id="fileName"
110
+ type="text"
111
+ [(ngModel)]="fileName"
112
+ pInputText
113
+ class="w-full"
114
+ [placeholder]="'ENTER_REPORT_NAME' | translate"
115
+ autofocus>
116
+ </div>
117
+ </div>
118
+
119
+ <div class="flex justify-end gap-2 mt-4">
120
+ <button
121
+ type="button"
122
+ pButton
123
+ class="p-button-text"
124
+ (click)="ref.close()"
125
+ [label]="'CANCEL' | translate">
126
+ </button>
127
+ <button
128
+ type="button"
129
+ pButton
130
+ (click)="save()"
131
+ [label]="'SAVE' | translate">
132
+ </button>
133
+ </div>
134
+ `
135
+ }]
136
+ }] });
137
+
138
+ var ExportType;
139
+ (function (ExportType) {
140
+ ExportType[ExportType["LIST"] = 0] = "LIST";
141
+ ExportType[ExportType["HTML"] = 1] = "HTML";
142
+ ExportType[ExportType["PDF"] = 2] = "PDF";
143
+ ExportType[ExportType["EXCEL"] = 3] = "EXCEL";
144
+ ExportType[ExportType["PRINT"] = 4] = "PRINT";
145
+ })(ExportType || (ExportType = {}));
146
+ class GenericReportComponent {
147
+ ref;
148
+ config;
149
+ previewContainer;
150
+ filterFields = [];
151
+ fields_ = [];
152
+ exportType = ExportType.PDF;
153
+ fileName = '';
154
+ showFilters = false;
155
+ loading = false;
156
+ currentDate = new Date();
157
+ previewData = [];
158
+ htmlExportContent = '';
159
+ showHtmlInIframe = false;
160
+ previewColumns = [];
161
+ options = {};
162
+ enableQueryBuilder = true;
163
+ localExport = false;
164
+ queryString = '';
165
+ apiName = '';
166
+ moduleName = '';
167
+ model = {};
168
+ form = new FormGroup({});
169
+ exportConfig;
170
+ exportTypes = [
171
+ { value: ExportType.EXCEL, label: 'EXCEL', icon: 'pi pi-file-excel' },
172
+ { value: ExportType.PDF, label: 'PDF', icon: 'pi pi-file-pdf' },
173
+ { value: ExportType.HTML, label: 'HTML', icon: 'pi pi-code' },
174
+ { value: ExportType.PRINT, label: 'PRINT', icon: 'pi pi-print' }
175
+ ];
176
+ exportMenuItems = [];
177
+ destroy$ = new Subject();
178
+ dialogService = inject(DialogService);
179
+ translate = inject(LocalizationService);
180
+ restService = inject(RestService);
181
+ queryBuilder = inject(QueryBuilderService);
182
+ sanitizer = inject(DomSanitizer);
183
+ constructor(ref, config) {
184
+ this.ref = ref;
185
+ this.config = config;
186
+ }
187
+ ngOnDestroy() {
188
+ this.destroy$.next();
189
+ this.destroy$.complete();
190
+ if (this.ref) {
191
+ try {
192
+ this.ref.close();
193
+ }
194
+ catch (e) {
195
+ // Ignore errors during cleanup
196
+ }
197
+ }
198
+ }
199
+ ngOnInit() {
200
+ this.filterFields = this.config.data?.filterFields || [];
201
+ this.buildQueryUIFields();
202
+ this.initializeComponent();
203
+ this.initializeExportConfig();
204
+ this.initializeExportMenu();
205
+ }
206
+ get filterCount() {
207
+ return this.queryBuilder.getAppliedFiltersCount(this.model).total;
208
+ }
209
+ buildQueryUIFields() {
210
+ if (this.enableQueryBuilder) {
211
+ this.fields_ = this.queryBuilder.buildQueryUIFields(this.filterFields, true, true);
212
+ }
213
+ else {
214
+ this.fields_ = this.filterFields;
215
+ }
216
+ }
217
+ initializeComponent() {
218
+ this.apiName = this.config.data?.apiName || '';
219
+ this.moduleName = this.config.data?.moduleName || '';
220
+ this.initializeFilterFields();
221
+ this.onExport();
222
+ }
223
+ initializeFilterFields() {
224
+ this.filterFields = this.config.data?.filterFields || this.getDefaultFilterFields();
225
+ this.model = this.config.data?.model || {};
226
+ this.fileName = this.config.data?.defaultFileName || `export_${new Date().toISOString().split('T')[0]}`;
227
+ }
228
+ initializeExportConfig() {
229
+ this.exportConfig = {
230
+ filters: this.model,
231
+ exportType: this.exportType,
232
+ fileName: this.fileName
233
+ };
234
+ }
235
+ initializeExportMenu() {
236
+ this.exportMenuItems = [
237
+ // Edit Report Name menu item
238
+ {
239
+ label: this.translate.instant('EDIT_REPORT_NAME'),
240
+ icon: 'pi pi-pencil',
241
+ command: () => this.openReportNameDialog()
242
+ },
243
+ // Separator
244
+ { separator: true },
245
+ // Export type menu items
246
+ ...this.exportTypes.map(type => ({
247
+ label: this.translate.instant(type.label),
248
+ icon: type.icon,
249
+ command: () => this.onExportTypeChange(type.value)
250
+ }))
251
+ ];
252
+ }
253
+ openReportNameDialog() {
254
+ const ref = this.dialogService.open(ReportNameDialogComponent, {
255
+ header: this.translate.instant('EDIT_REPORT_NAME'),
256
+ width: '500px',
257
+ data: {
258
+ fileName: this.fileName
259
+ }
260
+ });
261
+ ref?.onClose.subscribe((result) => {
262
+ if (result) {
263
+ this.fileName = result;
264
+ }
265
+ });
266
+ }
267
+ getDefaultFilterFields() {
268
+ return [
269
+ {
270
+ key: 'search',
271
+ type: 'input',
272
+ props: {
273
+ label: this.translate.instant('SEARCH'),
274
+ placeholder: this.translate.instant('ENTER_SEARCH_TERM'),
275
+ }
276
+ }
277
+ ];
278
+ }
279
+ // Query and Preview Methods
280
+ generatePreview() {
281
+ this.onExport();
282
+ }
283
+ onSubmit() {
284
+ const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);
285
+ this.queryString = this.queryBuilder.toODataQueryString(odataParams);
286
+ this.onExport();
287
+ }
288
+ onReset() {
289
+ this.exportType = ExportType.PDF;
290
+ this.fileName = `export_${new Date().toISOString().split('T')[0]}`;
291
+ this.form.reset();
292
+ this.model = {};
293
+ this.generatePreview();
294
+ }
295
+ // Export Methods
296
+ onExport() {
297
+ this.loading = true;
298
+ const exportConfig = this.createExportConfig();
299
+ this.handleApiExport(exportConfig);
300
+ }
301
+ createExportConfig() {
302
+ return {
303
+ filters: this.model,
304
+ exportType: this.exportType,
305
+ fileName: this.fileName
306
+ };
307
+ }
308
+ handleApiExport(config) {
309
+ if (this.form.invalid)
310
+ return;
311
+ const requestOptions = this.createRequestOptions(config);
312
+ this.restService.request(requestOptions, { apiName: this.apiName, moduleName: this.moduleName })
313
+ .pipe(takeUntil(this.destroy$))
314
+ .subscribe({
315
+ next: (response) => {
316
+ this.handleExportResponse(response, config);
317
+ },
318
+ error: (error) => {
319
+ console.error('Export failed:', error);
320
+ this.loading = false;
321
+ }
322
+ });
323
+ }
324
+ createRequestOptions(config) {
325
+ // Default query
326
+ if (!this.queryString || this.queryString == '') {
327
+ // Use the new QueryBuilderService methods
328
+ const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);
329
+ // this.odataSearch.emit(odataParams);
330
+ // Generate query string using the unified method
331
+ this.queryString = this.queryBuilder.toODataQueryString(odataParams);
332
+ // console.log('OData Query String:', queryString);
333
+ }
334
+ const filters = {
335
+ fileName: config.fileName || '',
336
+ query: this.queryString,
337
+ exportType: config.exportType,
338
+ };
339
+ const params = Object.keys(filters).reduce((acc, key) => {
340
+ acc[key] = filters[key];
341
+ return acc;
342
+ }, {});
343
+ const requestOptions = {
344
+ method: 'GET',
345
+ url: `/${this.apiName}/export`,
346
+ params: params
347
+ };
348
+ if (config.exportType === ExportType.HTML) {
349
+ requestOptions.responseType = 'text';
350
+ }
351
+ return requestOptions;
352
+ }
353
+ // private handleExportResponse(response: any, config: any) {
354
+ // this.loading = false;
355
+ // if (config.exportType === ExportType.HTML) {
356
+ // this.showHtmlExport(response);
357
+ // } else {
358
+ // this.downloadBinaryExport(response, config);
359
+ // }
360
+ // }
361
+ handleExportResponse(response, config) {
362
+ this.loading = false;
363
+ if (config.exportType === ExportType.HTML) {
364
+ this.showHtmlExport(response);
365
+ // } else if (config.exportType === ExportType.PDF && this.isMobileDevice()) {
366
+ }
367
+ else if (config.exportType === ExportType.PDF) {
368
+ this.showPdfInMobile(response, config);
369
+ }
370
+ else {
371
+ this.downloadBinaryExport(response, config);
372
+ }
373
+ }
374
+ // Platform detection methods
375
+ isMobileDevice() {
376
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
377
+ }
378
+ isIOS() {
379
+ return /iPad|iPhone|iPod/.test(navigator.userAgent);
380
+ }
381
+ isAndroid() {
382
+ return /Android/.test(navigator.userAgent);
383
+ }
384
+ showPdfModal = false;
385
+ currentPdfUrl;
386
+ currentFileName = '';
387
+ showPdfInMobile(base64Data, config) {
388
+ try {
389
+ const blob = this.base64ToBlob(base64Data, this.getMimeType(ExportType.PDF));
390
+ this.currentPdfUrl = this.sanitizeUrl(URL.createObjectURL(blob));
391
+ this.currentFileName = `${config.fileName}.pdf`;
392
+ this.showPdfModal = true;
393
+ }
394
+ catch (error) {
395
+ var error = 'PDF is too large for mobile viewing. Please download instead.';
396
+ }
397
+ finally {
398
+ // this.loading = false;
399
+ }
400
+ }
401
+ sanitizeUrl(url) {
402
+ return this.sanitizer.bypassSecurityTrustResourceUrl(url);
403
+ }
404
+ // onPdfModalClose(): void {
405
+ // this.showPdfModal = false;
406
+ // if (this.currentPdfUrl) {
407
+ // URL.revokeObjectURL(this.currentPdfUrl);
408
+ // this.currentPdfUrl = '';
409
+ // }
410
+ // }
411
+ onPdfDownload() {
412
+ // Trigger download
413
+ // const blob = this.base64ToBlob(this.getCurrentBase64(), this.getMimeType(ExportType.PDF));
414
+ // this.downloadFile(blob, this.currentFileName);
415
+ }
416
+ downloadBinaryExport(response, config) {
417
+ const blob = this.base64ToBlob(response, this.getMimeType(config.exportType));
418
+ this.downloadFile(blob, `${config.fileName}.${this.getFileExtension(config.exportType)}`);
419
+ }
420
+ // HTML Export Methods
421
+ showHtmlExport(htmlContent) {
422
+ const cleanHtml = this.cleanHtmlContent(htmlContent);
423
+ this.htmlExportContent = cleanHtml;
424
+ this.showHtmlInIframe = true;
425
+ setTimeout(() => {
426
+ this.setIframeContent(cleanHtml);
427
+ }, 100);
428
+ }
429
+ setIframeContent(htmlContent) {
430
+ const iframe = document.getElementById('reportIframe');
431
+ if (!iframe) {
432
+ console.error('Iframe not found');
433
+ return;
434
+ }
435
+ const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;
436
+ if (iframeDoc) {
437
+ iframeDoc.open();
438
+ iframeDoc.write(htmlContent);
439
+ iframeDoc.close();
440
+ }
441
+ }
442
+ print() {
443
+ // const iframe = document.getElementById('reportIframe') as HTMLIFrameElement | null;
444
+ // if (!iframe || !iframe.contentWindow) return;
445
+ // const iframeWindow = iframe.contentWindow;
446
+ // iframeWindow.focus();
447
+ // iframeWindow.print();
448
+ document.getElementById('reportIframe').contentWindow.print();
449
+ }
450
+ // Utility Methods
451
+ getExportButtonText() {
452
+ switch (this.exportType) {
453
+ case ExportType.PRINT:
454
+ return this.translate.instant('PRINT');
455
+ case ExportType.HTML:
456
+ return this.translate.instant('EXPORT');
457
+ default:
458
+ return this.translate.instant('EXPORT');
459
+ }
460
+ }
461
+ onExportTypeChange(type) {
462
+ this.exportType = type;
463
+ }
464
+ getCurrentExportTypeIcon() {
465
+ const currentType = this.exportTypes.find(type => type.value === this.exportType);
466
+ return currentType?.icon || 'pi pi-download';
467
+ }
468
+ base64ToBlob(base64, mime) {
469
+ const byteChars = atob(base64);
470
+ const byteNums = Array.from(byteChars, c => c.charCodeAt(0));
471
+ return new Blob([new Uint8Array(byteNums)], { type: mime });
472
+ }
473
+ downloadFile(blob, fileName) {
474
+ const url = window.URL.createObjectURL(blob);
475
+ const link = document.createElement('a');
476
+ link.href = url;
477
+ link.download = fileName;
478
+ document.body.appendChild(link);
479
+ link.click();
480
+ document.body.removeChild(link);
481
+ window.URL.revokeObjectURL(url);
482
+ }
483
+ getFileExtension(exportType) {
484
+ switch (exportType) {
485
+ case ExportType.EXCEL:
486
+ return 'xlsx';
487
+ case ExportType.PDF:
488
+ return 'pdf';
489
+ case ExportType.HTML:
490
+ return 'html';
491
+ default:
492
+ return 'pdf';
493
+ }
494
+ }
495
+ getMimeType(exportType) {
496
+ switch (exportType) {
497
+ case ExportType.EXCEL:
498
+ return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
499
+ case ExportType.PDF:
500
+ return 'application/pdf';
501
+ default:
502
+ return 'application/octet-stream';
503
+ }
504
+ }
505
+ cleanHtmlContent(html) {
506
+ return html
507
+ .replace(/\\r\\n/g, '\n')
508
+ .replace(/\\"/g, '"')
509
+ .replace(/\\t/g, ' ')
510
+ .trim();
511
+ }
512
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericReportComponent, deps: [{ token: i1$1.DynamicDialogRef }, { token: i1$1.DynamicDialogConfig }], target: i0.ɵɵFactoryTarget.Component });
513
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: GenericReportComponent, isStandalone: true, selector: "app-generic-report", inputs: { filterFields: "filterFields", enableQueryBuilder: "enableQueryBuilder", localExport: "localExport", queryString: "queryString", apiName: "apiName", moduleName: "moduleName", model: "model" }, providers: [DialogService, RestService], viewQueries: [{ propertyName: "previewContainer", first: true, predicate: ["previewContainer"], descendants: true }], ngImport: i0, template: "<!-- class=\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\" -->\n<div >\n <!-- Content -->\n <div class=\"flex-1 overflow-hidden p-2\">\n\n <!-- Preview Actions -->\n <div class=\"flex justify-between items-center mb-6 p-2 bg-white rounded-lg\">\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {{ 'REPORT' | translate }}\n </h3>\n <div class=\"flex gap-2\">\n <!-- Filters Button -->\n <button\n type=\"button\"\n (click)=\"showFilters = !showFilters\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\n [pTooltip]=\"'SEARCH_FILTERS' | translate\">\n <i class=\"pi pi-filter\"></i>\n @if (filterCount > 0) {\n <span class=\"ml-2 bg-blue-500 text-white text-xs rounded-full h-5 w-5 flex items-center justify-center\">\n {{ filterCount }}\n </span>\n }\n </button>\n\n <!-- Refresh Preview -->\n <button\n (click)=\"generatePreview()\"\n [disabled]=\"loading\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors\"\n [pTooltip]=\"'REFRESH' | translate\">\n <i class=\"pi pi-refresh mr-2 ml-2\" [class.animate-spin]=\"loading\"></i>\n {{ 'REFRESH' | translate }}\n </button>\n\n <!-- Print Button -->\n @if (exportType === 4 || exportType === 1 || exportType === 2) {\n <button\n (click)=\"print()\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\n [pTooltip]=\"'PRINT' | translate\">\n <i class=\"pi pi-print mr-2 ml-2\"></i>\n {{ 'PRINT' | translate }}\n </button>\n }\n </div>\n </div>\n\n <!-- Preview Content -->\n <div #previewContainer class=\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg\">\n <!-- HTML Export Preview (Iframe) -->\n @if (showHtmlInIframe && htmlExportContent || showPdfModal) {\n <div class=\"html-export-preview\">\n <iframe\n id=\"reportIframe\"\n class=\"w-full border border-gray-300 dark:border-gray-600 rounded-b-lg\"\n [style.height]=\"'600px'\"\n title=\"HTML Export Preview\"\n [src]=\"currentPdfUrl\"\n width=\"100%\"\n height=\"100%\"\n frameborder=\"0\"\n allowfullscreen\n >\n <!-- allowfullscreen -->\n </iframe>\n </div>\n }\n <!-- <app-pdf-modal\n *ngIf=\"showPdfModal\"\n [pdfUrl]=\"currentPdfUrl\"\n [fileName]=\"currentFileName\"\n (closed)=\"onPdfModalClose()\"\n (downloadRequested)=\"onPdfDownload()\">\n </app-pdf-modal> -->\n\n <!-- Regular Preview Table -->\n <!-- <div *ngIf=\"!showHtmlInIframe\" class=\"p-4\">\n <p-table\n [value]=\"previewData\"\n [columns]=\"previewColumns\"\n [paginator]=\"true\"\n [rows]=\"10\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"Showing {first} to {last} of {totalRecords} entries\"\n styleClass=\"p-datatable-sm\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th *ngFor=\"let col of previewColumns\" class=\"text-left\">\n {{ col.header }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData>\n <tr>\n <td *ngFor=\"let col of previewColumns\" class=\"text-left\">\n {{ rowData[col.field] }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"previewColumns.length\" class=\"text-center py-4\">\n <div class=\"text-center py-8\">\n <i class=\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\"></i>\n <p class=\"text-gray-500 dark:text-gray-400\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div> -->\n</div>\n\n<!-- <div class=\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\">\n<p class=\"text-sm text-green-700 dark:text-green-300\">\n <i class=\"pi pi-info-circle mr-2\"></i>\n {{ 'PREVIEW_INFO' | translate }}\n</p>\n</div> -->\n</div>\n\n<!-- Footer -->\n<div class=\"border-t border-gray-200 dark:border-gray-700 px-2 py-2 bg-gray-50 dark:bg-gray-800\">\n <div class=\"flex justify-between items-center\">\n <button\n type=\"button\"\n (click)=\"onReset()\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n [disabled]=\"loading\">\n <i class=\"pi pi-refresh mr-2\"></i>\n {{ 'RESET' | translate }}\n </button>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n (click)=\"ref?.close()\"\n class=\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\n [disabled]=\"loading\">\n {{ 'CANCEL' | translate }}\n </button>\n\n <!-- SplitButton for Export -->\n <!-- || previewData.length === 0 -->\n <p-splitButton\n [label]=\"getExportButtonText()\"\n [icon]=\"getCurrentExportTypeIcon()\"\n [model]=\"exportMenuItems\"\n (onClick)=\"onExport()\"\n [disabled]=\"loading\"\n styleClass=\"p-button-primary\">\n </p-splitButton>\n </div>\n </div>\n</div>\n\n<!-- Filters Drawer -->\n@if(showFilters){\n <p-drawer\n [(visible)]=\"showFilters\"\n position=\"right\"\n [styleClass]=\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \"\n [modal]=\"true\"\n [dismissible]=\"true\"\n styleClass=\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\">\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit(); showFilters=false\" class=\"flex flex-col flex-1\">\n <div class=\"flex-1 overflow-auto\">\n <formly-form\n [form]=\"form\"\n [fields]=\"fields_\"\n [model]=\"model\"\n [options]=\"options\">\n </formly-form>\n </div>\n </form>\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end mt-2 space-x-2 flex-none\">\n <button\n type=\"submit\"\n pButton size=\"small\"\n (click)=\" onSubmit(); showFilters=false\"\n label=\"{{ 'SEARCH' | translate }}\">\n </button>\n <button\n type=\"button\"\n pButton\n size=\"small\"\n class=\"p-button-text\"\n (click)=\"onReset(); showFilters=false\">\n {{ 'CLEAR' | translate }}\n </button>\n </div>\n </ng-template>\n </p-drawer>\n}\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "ngmodule", type: CheckboxModule }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i5.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: TableModule }, { kind: "ngmodule", type: SplitButtonModule }, { kind: "component", type: i6.SplitButton, selector: "p-splitbutton, p-splitButton, p-split-button", inputs: ["model", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "icon", "iconPos", "label", "tooltip", "tooltipOptions", "styleClass", "menuStyle", "menuStyleClass", "dropdownIcon", "appendTo", "dir", "expandAriaLabel", "showTransitionOptions", "hideTransitionOptions", "buttonProps", "menuButtonProps", "autofocus", "disabled", "tabindex", "menuButtonDisabled", "buttonDisabled"], outputs: ["onClick", "onMenuHide", "onMenuShow", "onDropdownClick"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
514
+ }
515
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericReportComponent, decorators: [{
516
+ type: Component,
517
+ args: [{ selector: 'app-generic-report', imports: [
518
+ ReactiveFormsModule,
519
+ FormsModule,
520
+ TranslatePipe,
521
+ ButtonModule,
522
+ DialogModule,
523
+ InputTextModule,
524
+ RadioButtonModule,
525
+ CheckboxModule,
526
+ DrawerModule,
527
+ FormlyForm,
528
+ TableModule,
529
+ SplitButtonModule,
530
+ TooltipModule
531
+ ], providers: [DialogService, RestService], template: "<!-- class=\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\" -->\n<div >\n <!-- Content -->\n <div class=\"flex-1 overflow-hidden p-2\">\n\n <!-- Preview Actions -->\n <div class=\"flex justify-between items-center mb-6 p-2 bg-white rounded-lg\">\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {{ 'REPORT' | translate }}\n </h3>\n <div class=\"flex gap-2\">\n <!-- Filters Button -->\n <button\n type=\"button\"\n (click)=\"showFilters = !showFilters\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\n [pTooltip]=\"'SEARCH_FILTERS' | translate\">\n <i class=\"pi pi-filter\"></i>\n @if (filterCount > 0) {\n <span class=\"ml-2 bg-blue-500 text-white text-xs rounded-full h-5 w-5 flex items-center justify-center\">\n {{ filterCount }}\n </span>\n }\n </button>\n\n <!-- Refresh Preview -->\n <button\n (click)=\"generatePreview()\"\n [disabled]=\"loading\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed transition-colors\"\n [pTooltip]=\"'REFRESH' | translate\">\n <i class=\"pi pi-refresh mr-2 ml-2\" [class.animate-spin]=\"loading\"></i>\n {{ 'REFRESH' | translate }}\n </button>\n\n <!-- Print Button -->\n @if (exportType === 4 || exportType === 1 || exportType === 2) {\n <button\n (click)=\"print()\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\n [pTooltip]=\"'PRINT' | translate\">\n <i class=\"pi pi-print mr-2 ml-2\"></i>\n {{ 'PRINT' | translate }}\n </button>\n }\n </div>\n </div>\n\n <!-- Preview Content -->\n <div #previewContainer class=\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg\">\n <!-- HTML Export Preview (Iframe) -->\n @if (showHtmlInIframe && htmlExportContent || showPdfModal) {\n <div class=\"html-export-preview\">\n <iframe\n id=\"reportIframe\"\n class=\"w-full border border-gray-300 dark:border-gray-600 rounded-b-lg\"\n [style.height]=\"'600px'\"\n title=\"HTML Export Preview\"\n [src]=\"currentPdfUrl\"\n width=\"100%\"\n height=\"100%\"\n frameborder=\"0\"\n allowfullscreen\n >\n <!-- allowfullscreen -->\n </iframe>\n </div>\n }\n <!-- <app-pdf-modal\n *ngIf=\"showPdfModal\"\n [pdfUrl]=\"currentPdfUrl\"\n [fileName]=\"currentFileName\"\n (closed)=\"onPdfModalClose()\"\n (downloadRequested)=\"onPdfDownload()\">\n </app-pdf-modal> -->\n\n <!-- Regular Preview Table -->\n <!-- <div *ngIf=\"!showHtmlInIframe\" class=\"p-4\">\n <p-table\n [value]=\"previewData\"\n [columns]=\"previewColumns\"\n [paginator]=\"true\"\n [rows]=\"10\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"Showing {first} to {last} of {totalRecords} entries\"\n styleClass=\"p-datatable-sm\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th *ngFor=\"let col of previewColumns\" class=\"text-left\">\n {{ col.header }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData>\n <tr>\n <td *ngFor=\"let col of previewColumns\" class=\"text-left\">\n {{ rowData[col.field] }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"previewColumns.length\" class=\"text-center py-4\">\n <div class=\"text-center py-8\">\n <i class=\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\"></i>\n <p class=\"text-gray-500 dark:text-gray-400\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div> -->\n</div>\n\n<!-- <div class=\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\">\n<p class=\"text-sm text-green-700 dark:text-green-300\">\n <i class=\"pi pi-info-circle mr-2\"></i>\n {{ 'PREVIEW_INFO' | translate }}\n</p>\n</div> -->\n</div>\n\n<!-- Footer -->\n<div class=\"border-t border-gray-200 dark:border-gray-700 px-2 py-2 bg-gray-50 dark:bg-gray-800\">\n <div class=\"flex justify-between items-center\">\n <button\n type=\"button\"\n (click)=\"onReset()\"\n class=\"flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n [disabled]=\"loading\">\n <i class=\"pi pi-refresh mr-2\"></i>\n {{ 'RESET' | translate }}\n </button>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n (click)=\"ref?.close()\"\n class=\"px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\n [disabled]=\"loading\">\n {{ 'CANCEL' | translate }}\n </button>\n\n <!-- SplitButton for Export -->\n <!-- || previewData.length === 0 -->\n <p-splitButton\n [label]=\"getExportButtonText()\"\n [icon]=\"getCurrentExportTypeIcon()\"\n [model]=\"exportMenuItems\"\n (onClick)=\"onExport()\"\n [disabled]=\"loading\"\n styleClass=\"p-button-primary\">\n </p-splitButton>\n </div>\n </div>\n</div>\n\n<!-- Filters Drawer -->\n@if(showFilters){\n <p-drawer\n [(visible)]=\"showFilters\"\n position=\"right\"\n [styleClass]=\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \"\n [modal]=\"true\"\n [dismissible]=\"true\"\n styleClass=\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\">\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit(); showFilters=false\" class=\"flex flex-col flex-1\">\n <div class=\"flex-1 overflow-auto\">\n <formly-form\n [form]=\"form\"\n [fields]=\"fields_\"\n [model]=\"model\"\n [options]=\"options\">\n </formly-form>\n </div>\n </form>\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end mt-2 space-x-2 flex-none\">\n <button\n type=\"submit\"\n pButton size=\"small\"\n (click)=\" onSubmit(); showFilters=false\"\n label=\"{{ 'SEARCH' | translate }}\">\n </button>\n <button\n type=\"button\"\n pButton\n size=\"small\"\n class=\"p-button-text\"\n (click)=\"onReset(); showFilters=false\">\n {{ 'CLEAR' | translate }}\n </button>\n </div>\n </ng-template>\n </p-drawer>\n}\n</div>\n" }]
532
+ }], ctorParameters: () => [{ type: i1$1.DynamicDialogRef }, { type: i1$1.DynamicDialogConfig }], propDecorators: { previewContainer: [{
533
+ type: ViewChild,
534
+ args: ['previewContainer']
535
+ }], filterFields: [{
536
+ type: Input
537
+ }], enableQueryBuilder: [{
538
+ type: Input
539
+ }], localExport: [{
540
+ type: Input
541
+ }], queryString: [{
542
+ type: Input
543
+ }], apiName: [{
544
+ type: Input
545
+ }], moduleName: [{
546
+ type: Input
547
+ }], model: [{
548
+ type: Input
549
+ }] } });
550
+
551
+ /**
552
+ * Generated bundle index. Do not edit.
553
+ */
554
+
555
+ export { ExportType, GenericReportComponent, GenericReportModule, ReportNameDialogComponent };
556
+ //# sourceMappingURL=es.framework-ng.ui.core-generic-report.mjs.map