@es.framework/ng.ui.core 2.0.64 → 2.0.66

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 (176) hide show
  1. package/README.md +3 -3
  2. package/attachments/README.md +3 -3
  3. package/base-crud/README.md +3 -3
  4. package/breadcrumb/README.md +3 -3
  5. package/checkbox/README.md +3 -3
  6. package/collapsible/README.md +3 -3
  7. package/color-picker/README.md +3 -3
  8. package/column-settings-popover/README.md +3 -3
  9. package/custom-switch/README.md +3 -3
  10. package/datepicker/README.md +3 -3
  11. package/deactivation-reason/README.md +3 -3
  12. package/excel-import/README.md +3 -3
  13. package/fesm2022/es.framework-ng.ui.core-attachments.mjs +2 -2
  14. package/fesm2022/es.framework-ng.ui.core-attachments.mjs.map +1 -1
  15. package/fesm2022/es.framework-ng.ui.core-base-crud.mjs.map +1 -1
  16. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs +108 -108
  17. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs.map +1 -1
  18. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs +54 -54
  19. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs.map +1 -1
  20. package/fesm2022/es.framework-ng.ui.core-collapsible.mjs.map +1 -1
  21. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs +44 -44
  22. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs.map +1 -1
  23. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs +2 -2
  24. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs.map +1 -1
  25. package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs.map +1 -1
  26. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs +178 -178
  27. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs.map +1 -1
  28. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs +46 -46
  29. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs.map +1 -1
  30. package/fesm2022/es.framework-ng.ui.core-excel-import.mjs.map +1 -1
  31. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs +624 -624
  32. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs.map +1 -1
  33. package/fesm2022/es.framework-ng.ui.core-form-button.mjs.map +1 -1
  34. package/fesm2022/es.framework-ng.ui.core-form-field.mjs +80 -80
  35. package/fesm2022/es.framework-ng.ui.core-form-field.mjs.map +1 -1
  36. package/fesm2022/es.framework-ng.ui.core-form-template.mjs.map +1 -1
  37. package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs.map +1 -1
  38. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs +44 -44
  39. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs.map +1 -1
  40. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs +92 -92
  41. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs.map +1 -1
  42. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs +24 -24
  43. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs.map +1 -1
  44. package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs.map +1 -1
  45. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs +366 -366
  46. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs.map +1 -1
  47. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs +16 -16
  48. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs.map +1 -1
  49. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs.map +1 -1
  50. package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs.map +1 -1
  51. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs +16 -16
  52. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs.map +1 -1
  53. package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs.map +1 -1
  54. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs +38 -38
  55. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs.map +1 -1
  56. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs +8 -2
  57. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs.map +1 -1
  58. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs +2 -2
  59. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs.map +1 -1
  60. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs +14 -3
  61. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs.map +1 -1
  62. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs +2 -2
  63. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs.map +1 -1
  64. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs +2 -2
  65. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs.map +1 -1
  66. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs +2 -2
  67. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs.map +1 -1
  68. package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs +64 -64
  69. package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs.map +1 -1
  70. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs +2 -2
  71. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs.map +1 -1
  72. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs +68 -68
  73. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs.map +1 -1
  74. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs +19 -3
  75. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs.map +1 -1
  76. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs +442 -442
  77. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs.map +1 -1
  78. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs +2 -2
  79. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs.map +1 -1
  80. package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs.map +1 -1
  81. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs +16 -8
  82. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs.map +1 -1
  83. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs +7 -4
  84. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs.map +1 -1
  85. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs +2 -2
  86. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs.map +1 -1
  87. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs +106 -106
  88. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs.map +1 -1
  89. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs +58 -58
  90. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs.map +1 -1
  91. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs +26 -26
  92. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs.map +1 -1
  93. package/fesm2022/es.framework-ng.ui.core-input.mjs +64 -64
  94. package/fesm2022/es.framework-ng.ui.core-input.mjs.map +1 -1
  95. package/fesm2022/es.framework-ng.ui.core-label-type.mjs +16 -16
  96. package/fesm2022/es.framework-ng.ui.core-label-type.mjs.map +1 -1
  97. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs +22 -22
  98. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs.map +1 -1
  99. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs +2 -2
  100. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs.map +1 -1
  101. package/fesm2022/es.framework-ng.ui.core-query-type.mjs +14 -14
  102. package/fesm2022/es.framework-ng.ui.core-query-type.mjs.map +1 -1
  103. package/fesm2022/es.framework-ng.ui.core-radio.mjs +30 -30
  104. package/fesm2022/es.framework-ng.ui.core-radio.mjs.map +1 -1
  105. package/fesm2022/es.framework-ng.ui.core-repeat.mjs +354 -354
  106. package/fesm2022/es.framework-ng.ui.core-repeat.mjs.map +1 -1
  107. package/fesm2022/es.framework-ng.ui.core-select.mjs +84 -84
  108. package/fesm2022/es.framework-ng.ui.core-select.mjs.map +1 -1
  109. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs +2 -2
  110. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs.map +1 -1
  111. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs +2 -2
  112. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs.map +1 -1
  113. package/fesm2022/es.framework-ng.ui.core-tabs.mjs +14 -14
  114. package/fesm2022/es.framework-ng.ui.core-tabs.mjs.map +1 -1
  115. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs +80 -80
  116. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs.map +1 -1
  117. package/fesm2022/es.framework-ng.ui.core-text-editor.mjs.map +1 -1
  118. package/fesm2022/es.framework-ng.ui.core-textarea.mjs.map +1 -1
  119. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs +118 -118
  120. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs.map +1 -1
  121. package/fesm2022/es.framework-ng.ui.core.mjs +2 -2
  122. package/fesm2022/es.framework-ng.ui.core.mjs.map +1 -1
  123. package/filter-templates/README.md +3 -3
  124. package/form-button/README.md +3 -3
  125. package/form-field/README.md +3 -3
  126. package/form-template/README.md +3 -3
  127. package/formly-avatar-image/README.md +3 -3
  128. package/formly-avatar-label/README.md +3 -3
  129. package/formly-button/README.md +3 -3
  130. package/formly-button-selector/README.md +3 -3
  131. package/formly-presets/README.md +3 -3
  132. package/formly-prime-icon-picker/README.md +3 -3
  133. package/formly-split-button/README.md +3 -3
  134. package/formly-ui/README.md +3 -3
  135. package/formly-ui-all/README.md +3 -3
  136. package/formly-username-with-domain/README.md +3 -3
  137. package/generic-assets/README.md +3 -3
  138. package/generic-autocomplete/README.md +3 -3
  139. package/generic-button/README.md +3 -3
  140. package/generic-card/README.md +3 -3
  141. package/generic-crud-table/README.md +3 -3
  142. package/generic-dialog/README.md +3 -3
  143. package/generic-errormessage/README.md +3 -3
  144. package/generic-formly-fields/README.md +3 -3
  145. package/generic-loadingspinner/README.md +3 -3
  146. package/generic-report/README.md +3 -3
  147. package/generic-search/README.md +3 -3
  148. package/generic-search-advanced/README.md +3 -3
  149. package/generic-selector/README.md +3 -3
  150. package/generic-table/README.md +3 -3
  151. package/generic-view/README.md +3 -3
  152. package/header-wrapper/README.md +3 -3
  153. package/icon-picker/README.md +3 -3
  154. package/input/README.md +3 -3
  155. package/input-switch/README.md +3 -3
  156. package/input-with-icon/README.md +3 -3
  157. package/label-type/README.md +3 -3
  158. package/loading-skeletons/README.md +3 -3
  159. package/odata-query-builder/README.md +3 -3
  160. package/package.json +1 -1
  161. package/query-type/README.md +3 -3
  162. package/radio/README.md +3 -3
  163. package/repeat/README.md +3 -3
  164. package/select/README.md +3 -3
  165. package/sidebar-cards/README.md +3 -3
  166. package/sidebar-toggles/README.md +3 -3
  167. package/styles.css +0 -0
  168. package/tabs/README.md +3 -3
  169. package/tag-type/README.md +3 -3
  170. package/text-editor/README.md +3 -3
  171. package/textarea/README.md +3 -3
  172. package/types/es.framework-ng.ui.core-generic-button.d.ts +3 -1
  173. package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +1 -0
  174. package/types/es.framework-ng.ui.core-generic-report.d.ts +1 -0
  175. package/types/es.framework-ng.ui.core-generic-table.d.ts +1 -1
  176. package/wrappers/README.md +3 -3
@@ -334,7 +334,7 @@ class GenericReportComponent {
334
334
  const filters = {
335
335
  fileName: config.fileName || '',
336
336
  query: this.queryString,
337
- exportType: config.exportType,
337
+ exportType: this.getApiExportType(config.exportType),
338
338
  };
339
339
  const params = Object.keys(filters).reduce((acc, key) => {
340
340
  acc[key] = filters[key];
@@ -502,6 +502,22 @@ class GenericReportComponent {
502
502
  return 'application/octet-stream';
503
503
  }
504
504
  }
505
+ getApiExportType(exportType) {
506
+ switch (exportType) {
507
+ case ExportType.EXCEL:
508
+ return 'Excel';
509
+ case ExportType.PDF:
510
+ return 'Pdf';
511
+ case ExportType.LIST:
512
+ return 'List';
513
+ case ExportType.HTML:
514
+ return 'Html';
515
+ case ExportType.PRINT:
516
+ return 'Print';
517
+ default:
518
+ return String(exportType);
519
+ }
520
+ }
505
521
  cleanHtmlContent(html) {
506
522
  return html
507
523
  .replace(/\\r\\n/g, '\n')
@@ -510,7 +526,7 @@ class GenericReportComponent {
510
526
  .trim();
511
527
  }
512
528
  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" }] });
529
+ 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\" -->\r\n<div >\r\n <!-- Content -->\r\n <div class=\"flex-1 overflow-hidden p-2\">\r\n\r\n <!-- Preview Actions -->\r\n <div class=\"flex justify-between items-center mb-6 p-2 bg-white rounded-lg\">\r\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white\">\r\n {{ 'REPORT' | translate }}\r\n </h3>\r\n <div class=\"flex gap-2\">\r\n <!-- Filters Button -->\r\n <button\r\n type=\"button\"\r\n (click)=\"showFilters = !showFilters\"\r\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\"\r\n [pTooltip]=\"'SEARCH_FILTERS' | translate\">\r\n <i class=\"pi pi-filter\"></i>\r\n @if (filterCount > 0) {\r\n <span class=\"ml-2 bg-blue-500 text-white text-xs rounded-full h-5 w-5 flex items-center justify-center\">\r\n {{ filterCount }}\r\n </span>\r\n }\r\n </button>\r\n\r\n <!-- Refresh Preview -->\r\n <button\r\n (click)=\"generatePreview()\"\r\n [disabled]=\"loading\"\r\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\"\r\n [pTooltip]=\"'REFRESH' | translate\">\r\n <i class=\"pi pi-refresh mr-2 ml-2\" [class.animate-spin]=\"loading\"></i>\r\n {{ 'REFRESH' | translate }}\r\n </button>\r\n\r\n <!-- Print Button -->\r\n @if (exportType === 4 || exportType === 1 || exportType === 2) {\r\n <button\r\n (click)=\"print()\"\r\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\"\r\n [pTooltip]=\"'PRINT' | translate\">\r\n <i class=\"pi pi-print mr-2 ml-2\"></i>\r\n {{ 'PRINT' | translate }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Preview Content -->\r\n <div #previewContainer class=\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg\">\r\n <!-- HTML Export Preview (Iframe) -->\r\n @if (showHtmlInIframe && htmlExportContent || showPdfModal) {\r\n <div class=\"html-export-preview\">\r\n <iframe\r\n id=\"reportIframe\"\r\n class=\"w-full border border-gray-300 dark:border-gray-600 rounded-b-lg\"\r\n [style.height]=\"'600px'\"\r\n title=\"HTML Export Preview\"\r\n [src]=\"currentPdfUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n frameborder=\"0\"\r\n allowfullscreen\r\n >\r\n <!-- allowfullscreen -->\r\n </iframe>\r\n </div>\r\n }\r\n <!-- <app-pdf-modal\r\n *ngIf=\"showPdfModal\"\r\n [pdfUrl]=\"currentPdfUrl\"\r\n [fileName]=\"currentFileName\"\r\n (closed)=\"onPdfModalClose()\"\r\n (downloadRequested)=\"onPdfDownload()\">\r\n </app-pdf-modal> -->\r\n\r\n <!-- Regular Preview Table -->\r\n <!-- <div *ngIf=\"!showHtmlInIframe\" class=\"p-4\">\r\n <p-table\r\n [value]=\"previewData\"\r\n [columns]=\"previewColumns\"\r\n [paginator]=\"true\"\r\n [rows]=\"10\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"Showing {first} to {last} of {totalRecords} entries\"\r\n styleClass=\"p-datatable-sm\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th *ngFor=\"let col of previewColumns\" class=\"text-left\">\r\n {{ col.header }}\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData>\r\n <tr>\r\n <td *ngFor=\"let col of previewColumns\" class=\"text-left\">\r\n {{ rowData[col.field] }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"previewColumns.length\" class=\"text-center py-4\">\r\n <div class=\"text-center py-8\">\r\n <i class=\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\"></i>\r\n <p class=\"text-gray-500 dark:text-gray-400\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div> -->\r\n</div>\r\n\r\n<!-- <div class=\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\">\r\n<p class=\"text-sm text-green-700 dark:text-green-300\">\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n {{ 'PREVIEW_INFO' | translate }}\r\n</p>\r\n</div> -->\r\n</div>\r\n\r\n<!-- Footer -->\r\n<div class=\"border-t border-gray-200 dark:border-gray-700 px-2 py-2 bg-gray-50 dark:bg-gray-800\">\r\n <div class=\"flex justify-between items-center\">\r\n <button\r\n type=\"button\"\r\n (click)=\"onReset()\"\r\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\"\r\n [disabled]=\"loading\">\r\n <i class=\"pi pi-refresh mr-2\"></i>\r\n {{ 'RESET' | translate }}\r\n </button>\r\n\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n (click)=\"ref?.close()\"\r\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\"\r\n [disabled]=\"loading\">\r\n {{ 'CANCEL' | translate }}\r\n </button>\r\n\r\n <!-- SplitButton for Export -->\r\n <!-- || previewData.length === 0 -->\r\n <p-splitButton\r\n [label]=\"getExportButtonText()\"\r\n [icon]=\"getCurrentExportTypeIcon()\"\r\n [model]=\"exportMenuItems\"\r\n (onClick)=\"onExport()\"\r\n [disabled]=\"loading\"\r\n styleClass=\"p-button-primary\">\r\n </p-splitButton>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Filters Drawer -->\r\n@if(showFilters){\r\n <p-drawer\r\n [(visible)]=\"showFilters\"\r\n position=\"right\"\r\n [styleClass]=\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \"\r\n [modal]=\"true\"\r\n [dismissible]=\"true\"\r\n styleClass=\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit(); showFilters=false\" class=\"flex flex-col flex-1\">\r\n <div class=\"flex-1 overflow-auto\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"fields_\"\r\n [model]=\"model\"\r\n [options]=\"options\">\r\n </formly-form>\r\n </div>\r\n </form>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end mt-2 space-x-2 flex-none\">\r\n <button\r\n type=\"submit\"\r\n pButton size=\"small\"\r\n (click)=\" onSubmit(); showFilters=false\"\r\n label=\"{{ 'SEARCH' | translate }}\">\r\n </button>\r\n <button\r\n type=\"button\"\r\n pButton\r\n size=\"small\"\r\n class=\"p-button-text\"\r\n (click)=\"onReset(); showFilters=false\">\r\n {{ 'CLEAR' | translate }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}\r\n</div>\r\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
530
  }
515
531
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericReportComponent, decorators: [{
516
532
  type: Component,
@@ -528,7 +544,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
528
544
  TableModule,
529
545
  SplitButtonModule,
530
546
  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" }]
547
+ ], providers: [DialogService, RestService], template: "<!-- class=\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\" -->\r\n<div >\r\n <!-- Content -->\r\n <div class=\"flex-1 overflow-hidden p-2\">\r\n\r\n <!-- Preview Actions -->\r\n <div class=\"flex justify-between items-center mb-6 p-2 bg-white rounded-lg\">\r\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white\">\r\n {{ 'REPORT' | translate }}\r\n </h3>\r\n <div class=\"flex gap-2\">\r\n <!-- Filters Button -->\r\n <button\r\n type=\"button\"\r\n (click)=\"showFilters = !showFilters\"\r\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\"\r\n [pTooltip]=\"'SEARCH_FILTERS' | translate\">\r\n <i class=\"pi pi-filter\"></i>\r\n @if (filterCount > 0) {\r\n <span class=\"ml-2 bg-blue-500 text-white text-xs rounded-full h-5 w-5 flex items-center justify-center\">\r\n {{ filterCount }}\r\n </span>\r\n }\r\n </button>\r\n\r\n <!-- Refresh Preview -->\r\n <button\r\n (click)=\"generatePreview()\"\r\n [disabled]=\"loading\"\r\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\"\r\n [pTooltip]=\"'REFRESH' | translate\">\r\n <i class=\"pi pi-refresh mr-2 ml-2\" [class.animate-spin]=\"loading\"></i>\r\n {{ 'REFRESH' | translate }}\r\n </button>\r\n\r\n <!-- Print Button -->\r\n @if (exportType === 4 || exportType === 1 || exportType === 2) {\r\n <button\r\n (click)=\"print()\"\r\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\"\r\n [pTooltip]=\"'PRINT' | translate\">\r\n <i class=\"pi pi-print mr-2 ml-2\"></i>\r\n {{ 'PRINT' | translate }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Preview Content -->\r\n <div #previewContainer class=\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg\">\r\n <!-- HTML Export Preview (Iframe) -->\r\n @if (showHtmlInIframe && htmlExportContent || showPdfModal) {\r\n <div class=\"html-export-preview\">\r\n <iframe\r\n id=\"reportIframe\"\r\n class=\"w-full border border-gray-300 dark:border-gray-600 rounded-b-lg\"\r\n [style.height]=\"'600px'\"\r\n title=\"HTML Export Preview\"\r\n [src]=\"currentPdfUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n frameborder=\"0\"\r\n allowfullscreen\r\n >\r\n <!-- allowfullscreen -->\r\n </iframe>\r\n </div>\r\n }\r\n <!-- <app-pdf-modal\r\n *ngIf=\"showPdfModal\"\r\n [pdfUrl]=\"currentPdfUrl\"\r\n [fileName]=\"currentFileName\"\r\n (closed)=\"onPdfModalClose()\"\r\n (downloadRequested)=\"onPdfDownload()\">\r\n </app-pdf-modal> -->\r\n\r\n <!-- Regular Preview Table -->\r\n <!-- <div *ngIf=\"!showHtmlInIframe\" class=\"p-4\">\r\n <p-table\r\n [value]=\"previewData\"\r\n [columns]=\"previewColumns\"\r\n [paginator]=\"true\"\r\n [rows]=\"10\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"Showing {first} to {last} of {totalRecords} entries\"\r\n styleClass=\"p-datatable-sm\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th *ngFor=\"let col of previewColumns\" class=\"text-left\">\r\n {{ col.header }}\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData>\r\n <tr>\r\n <td *ngFor=\"let col of previewColumns\" class=\"text-left\">\r\n {{ rowData[col.field] }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"previewColumns.length\" class=\"text-center py-4\">\r\n <div class=\"text-center py-8\">\r\n <i class=\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\"></i>\r\n <p class=\"text-gray-500 dark:text-gray-400\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div> -->\r\n</div>\r\n\r\n<!-- <div class=\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\">\r\n<p class=\"text-sm text-green-700 dark:text-green-300\">\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n {{ 'PREVIEW_INFO' | translate }}\r\n</p>\r\n</div> -->\r\n</div>\r\n\r\n<!-- Footer -->\r\n<div class=\"border-t border-gray-200 dark:border-gray-700 px-2 py-2 bg-gray-50 dark:bg-gray-800\">\r\n <div class=\"flex justify-between items-center\">\r\n <button\r\n type=\"button\"\r\n (click)=\"onReset()\"\r\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\"\r\n [disabled]=\"loading\">\r\n <i class=\"pi pi-refresh mr-2\"></i>\r\n {{ 'RESET' | translate }}\r\n </button>\r\n\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n (click)=\"ref?.close()\"\r\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\"\r\n [disabled]=\"loading\">\r\n {{ 'CANCEL' | translate }}\r\n </button>\r\n\r\n <!-- SplitButton for Export -->\r\n <!-- || previewData.length === 0 -->\r\n <p-splitButton\r\n [label]=\"getExportButtonText()\"\r\n [icon]=\"getCurrentExportTypeIcon()\"\r\n [model]=\"exportMenuItems\"\r\n (onClick)=\"onExport()\"\r\n [disabled]=\"loading\"\r\n styleClass=\"p-button-primary\">\r\n </p-splitButton>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Filters Drawer -->\r\n@if(showFilters){\r\n <p-drawer\r\n [(visible)]=\"showFilters\"\r\n position=\"right\"\r\n [styleClass]=\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \"\r\n [modal]=\"true\"\r\n [dismissible]=\"true\"\r\n styleClass=\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit(); showFilters=false\" class=\"flex flex-col flex-1\">\r\n <div class=\"flex-1 overflow-auto\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"fields_\"\r\n [model]=\"model\"\r\n [options]=\"options\">\r\n </formly-form>\r\n </div>\r\n </form>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end mt-2 space-x-2 flex-none\">\r\n <button\r\n type=\"submit\"\r\n pButton size=\"small\"\r\n (click)=\" onSubmit(); showFilters=false\"\r\n label=\"{{ 'SEARCH' | translate }}\">\r\n </button>\r\n <button\r\n type=\"button\"\r\n pButton\r\n size=\"small\"\r\n class=\"p-button-text\"\r\n (click)=\"onReset(); showFilters=false\">\r\n {{ 'CLEAR' | translate }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}\r\n</div>\r\n" }]
532
548
  }], ctorParameters: () => [{ type: i1$1.DynamicDialogRef }, { type: i1$1.DynamicDialogConfig }], propDecorators: { previewContainer: [{
533
549
  type: ViewChild,
534
550
  args: ['previewContainer']
@@ -1 +1 @@
1
- {"version":3,"file":"es.framework-ng.ui.core-generic-report.mjs","sources":["../../../../libs/ng.ui.core/generic-report/src/lib/generic-report-module.ts","../../../../libs/ng.ui.core/generic-report/src/lib/report-name-dialog.component.ts","../../../../libs/ng.ui.core/generic-report/src/lib/generic-report.component.ts","../../../../libs/ng.ui.core/generic-report/src/lib/generic-report.component.html","../../../../libs/ng.ui.core/generic-report/src/es.framework-ng.ui.core-generic-report.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class GenericReportModule {}\n","// report-name-dialog.component.ts\r\nimport { Component, inject } from '@angular/core';\r\n\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\n\r\n@Component({\r\n selector: 'app-report-name-dialog',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslatePipe,\r\n ButtonModule,\r\n InputTextModule\r\n],\r\n template: `\r\n <div class=\"p-fluid\">\r\n <div class=\"field\">\r\n <label for=\"fileName\" class=\"block text-sm font-medium mb-2\">\r\n {{ 'REPORT_NAME' | translate }}\r\n </label>\r\n <input\r\n id=\"fileName\"\r\n type=\"text\"\r\n [(ngModel)]=\"fileName\"\r\n pInputText\r\n class=\"w-full\"\r\n [placeholder]=\"'ENTER_REPORT_NAME' | translate\"\r\n autofocus>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-end gap-2 mt-4\">\r\n <button\r\n type=\"button\"\r\n pButton\r\n class=\"p-button-text\"\r\n (click)=\"ref.close()\"\r\n [label]=\"'CANCEL' | translate\">\r\n </button>\r\n <button\r\n type=\"button\"\r\n pButton\r\n (click)=\"save()\"\r\n [label]=\"'SAVE' | translate\">\r\n </button>\r\n </div>\r\n `\r\n})\r\nexport class ReportNameDialogComponent {\r\n fileName: string = '';\r\n\r\n ref = inject(DynamicDialogRef);\r\n config = inject(DynamicDialogConfig);\r\n translate = inject(LocalizationService);\r\n\r\n ngOnInit() {\r\n this.fileName = this.config.data?.fileName || '';\r\n }\r\n\r\n save() {\r\n if (this.fileName?.trim()) {\r\n this.ref.close(this.fileName.trim());\r\n }\r\n }\r\n}\r\n","\r\nimport { Component, inject, OnInit, ViewChild, ElementRef, Input, OnDestroy } from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { FormlyFieldConfig, FormlyFormOptions, FormlyForm } from '@ngx-formly/core';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DynamicDialogRef, DynamicDialogConfig, DialogService } from 'primeng/dynamicdialog';\r\nimport { LocalizationService, RestService } from '@es.framework/ng.core/services';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { TableModule } from 'primeng/table';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { ReportNameDialogComponent } from './report-name-dialog.component';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { QueryBuilderService } from '@es.framework/ng.ui.core/generic-search-advanced';\r\n\r\nexport interface ExportConfig {\r\n filters: any;\r\n exportType: ExportType;\r\n fileName?: string;\r\n}\r\n\r\nexport enum ExportType {\r\n LIST,\r\n HTML,\r\n PDF,\r\n EXCEL,\r\n PRINT\r\n}\r\n\r\n@Component({\r\n selector: 'app-generic-report',\r\n templateUrl: './generic-report.component.html',\r\n imports: [\r\n ReactiveFormsModule,\r\n FormsModule,\r\n TranslatePipe,\r\n ButtonModule,\r\n DialogModule,\r\n InputTextModule,\r\n RadioButtonModule,\r\n CheckboxModule,\r\n DrawerModule,\r\n FormlyForm,\r\n TableModule,\r\n SplitButtonModule,\r\n TooltipModule\r\n],\r\n providers:[DialogService,RestService]\r\n})\r\nexport class GenericReportComponent implements OnInit, OnDestroy {\r\n @ViewChild('previewContainer') previewContainer!: ElementRef;\r\n\r\n @Input() filterFields: FormlyFieldConfig[] = [];\r\n fields_: FormlyFieldConfig[] = [];\r\n exportType: ExportType = ExportType.PDF;\r\n fileName: string = '';\r\n showFilters: boolean = false;\r\n loading: boolean = false;\r\n currentDate: Date = new Date();\r\n previewData: any[] = [];\r\n htmlExportContent: string = '';\r\n showHtmlInIframe: boolean = false;\r\n previewColumns: any[] = [];\r\n\r\n options: FormlyFormOptions = {};\r\n @Input() enableQueryBuilder: boolean = true;\r\n @Input() localExport: boolean = false;\r\n @Input() queryString: string = '';\r\n @Input() apiName: string = '';\r\n @Input() moduleName: string = '';\r\n\r\n @Input() model: any = {};\r\n form = new FormGroup({});\r\n exportConfig!: ExportConfig;\r\n\r\n exportTypes = [\r\n { value: ExportType.EXCEL, label: 'EXCEL', icon: 'pi pi-file-excel' },\r\n { value: ExportType.PDF, label: 'PDF', icon: 'pi pi-file-pdf' },\r\n { value: ExportType.HTML, label: 'HTML', icon: 'pi pi-code' },\r\n { value: ExportType.PRINT, label: 'PRINT', icon: 'pi pi-print' }\r\n ];\r\n\r\n exportMenuItems: MenuItem[] = [];\r\n\r\n private destroy$ = new Subject<void>();\r\n private dialogService:DialogService = inject(DialogService);\r\n private translate = inject(LocalizationService);\r\n private restService: RestService = inject(RestService);\r\n private queryBuilder = inject(QueryBuilderService);\r\nprivate sanitizer: DomSanitizer = inject(DomSanitizer);\r\n constructor(\r\n public ref: DynamicDialogRef,\r\n public config: DynamicDialogConfig\r\n ) {}\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.ref) {\r\n try {\r\n this.ref.close();\r\n } catch (e) {\r\n // Ignore errors during cleanup\r\n }\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.filterFields = this.config.data?.filterFields || [];\r\n this.buildQueryUIFields();\r\n this.initializeComponent();\r\n this.initializeExportConfig();\r\n this.initializeExportMenu();\r\n }\r\n get filterCount() {\r\n\r\n return this.queryBuilder.getAppliedFiltersCount(this.model).total;\r\n }\r\n private buildQueryUIFields() {\r\n if (this.enableQueryBuilder) {\r\n this.fields_ = this.queryBuilder.buildQueryUIFields(this.filterFields,true,true);\r\n } else {\r\n this.fields_ = this.filterFields;\r\n }\r\n }\r\n\r\n private initializeComponent() {\r\n this.apiName = this.config.data?.apiName || '';\r\n this.moduleName = this.config.data?.moduleName || '';\r\n this.initializeFilterFields();\r\n this.onExport();\r\n }\r\n\r\n private initializeFilterFields() {\r\n this.filterFields = this.config.data?.filterFields || this.getDefaultFilterFields();\r\n this.model = this.config.data?.model || {};\r\n this.fileName = this.config.data?.defaultFileName || `export_${new Date().toISOString().split('T')[0]}`;\r\n }\r\n\r\n private initializeExportConfig() {\r\n this.exportConfig = {\r\n filters: this.model,\r\n exportType: this.exportType,\r\n fileName: this.fileName\r\n };\r\n }\r\n\r\n private initializeExportMenu() {\r\n this.exportMenuItems = [\r\n // Edit Report Name menu item\r\n {\r\n label: this.translate.instant('EDIT_REPORT_NAME'),\r\n icon: 'pi pi-pencil',\r\n command: () => this.openReportNameDialog()\r\n },\r\n // Separator\r\n { separator: true },\r\n // Export type menu items\r\n ...this.exportTypes.map(type => ({\r\n label: this.translate.instant(type.label),\r\n icon: type.icon,\r\n command: () => this.onExportTypeChange(type.value)\r\n }))\r\n ];\r\n}\r\n\r\nprivate openReportNameDialog() {\r\n const ref = this.dialogService.open(ReportNameDialogComponent, {\r\n header: this.translate.instant('EDIT_REPORT_NAME'),\r\n width: '500px',\r\n data: {\r\n fileName: this.fileName\r\n }\r\n });\r\n\r\n ref?.onClose.subscribe((result: string) => {\r\n if (result) {\r\n this.fileName = result;\r\n }\r\n });\r\n}\r\n\r\n private getDefaultFilterFields(): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'search',\r\n type: 'input',\r\n props: {\r\n label: this.translate.instant('SEARCH'),\r\n placeholder: this.translate.instant('ENTER_SEARCH_TERM'),\r\n }\r\n }\r\n ];\r\n }\r\n\r\n // Query and Preview Methods\r\n generatePreview() {\r\n this.onExport();\r\n }\r\n\r\n onSubmit() {\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);\r\n this.queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n this.onExport();\r\n }\r\n\r\n onReset() {\r\n this.exportType = ExportType.PDF;\r\n this.fileName = `export_${new Date().toISOString().split('T')[0]}`;\r\n this.form.reset();\r\n this.model = {};\r\n this.generatePreview();\r\n }\r\n\r\n // Export Methods\r\n onExport() {\r\n this.loading = true;\r\n const exportConfig = this.createExportConfig();\r\n this.handleApiExport(exportConfig);\r\n }\r\n\r\n private createExportConfig(): any {\r\n return {\r\n filters: this.model,\r\n exportType: this.exportType,\r\n fileName: this.fileName\r\n };\r\n }\r\n\r\n private handleApiExport(config: any) {\r\n if (this.form.invalid) return;\r\n\r\n const requestOptions = this.createRequestOptions(config);\r\n\r\n this.restService.request<any, any>(\r\n requestOptions,\r\n { apiName: this.apiName , moduleName: this.moduleName }\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.handleExportResponse(response, config);\r\n },\r\n error: (error) => {\r\n console.error('Export failed:', error);\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private createRequestOptions(config: any): any {\r\n // Default query\r\n if(!this.queryString || this.queryString == ''){\r\n\r\n // Use the new QueryBuilderService methods\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);\r\n // this.odataSearch.emit(odataParams);\r\n\r\n // Generate query string using the unified method\r\n this.queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n // console.log('OData Query String:', queryString);\r\n\r\n }\r\n const filters: Partial<any> = {\r\n fileName: config.fileName || '',\r\n query: this.queryString,\r\n exportType: config.exportType,\r\n };\r\n\r\n\r\n\r\n const params = Object.keys(filters).reduce((acc: any, key) => {\r\n acc[key] = filters[key];\r\n return acc;\r\n }, {});\r\n\r\n const requestOptions: any = {\r\n method: 'GET',\r\n url: `/${this.apiName}/export`,\r\n params: params\r\n };\r\n\r\n if (config.exportType === ExportType.HTML) {\r\n requestOptions.responseType = 'text';\r\n }\r\n\r\n return requestOptions;\r\n }\r\n\r\n // private handleExportResponse(response: any, config: any) {\r\n // this.loading = false;\r\n\r\n // if (config.exportType === ExportType.HTML) {\r\n // this.showHtmlExport(response);\r\n // } else {\r\n // this.downloadBinaryExport(response, config);\r\n // }\r\n // }\r\n private handleExportResponse(response: any, config: any) {\r\n this.loading = false;\r\n\r\n if (config.exportType === ExportType.HTML) {\r\n this.showHtmlExport(response);\r\n // } else if (config.exportType === ExportType.PDF && this.isMobileDevice()) {\r\n } else if (config.exportType === ExportType.PDF) {\r\n this.showPdfInMobile(response, config);\r\n } else {\r\n this.downloadBinaryExport(response, config);\r\n }\r\n }\r\n // Platform detection methods\r\nprivate isMobileDevice(): boolean {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n}\r\n\r\nprivate isIOS(): boolean {\r\n return /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n}\r\n\r\nprivate isAndroid(): boolean {\r\n return /Android/.test(navigator.userAgent);\r\n}\r\n showPdfModal = false;\r\n currentPdfUrl?:SafeResourceUrl;\r\n currentFileName = '';\r\n private showPdfInMobile(base64Data: string, config: any): void {\r\n\r\n\r\n try {\r\n const blob = this.base64ToBlob(base64Data, this.getMimeType(ExportType.PDF));\r\n this.currentPdfUrl = this.sanitizeUrl(URL.createObjectURL(blob));\r\n this.currentFileName = `${config.fileName}.pdf`;\r\n this.showPdfModal = true;\r\n } catch (error) {\r\n var error = 'PDF is too large for mobile viewing. Please download instead.';\r\n } finally {\r\n // this.loading = false;\r\n }\r\n }\r\n\r\n\r\n private sanitizeUrl(url: string): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n\r\n // onPdfModalClose(): void {\r\n // this.showPdfModal = false;\r\n // if (this.currentPdfUrl) {\r\n // URL.revokeObjectURL(this.currentPdfUrl);\r\n // this.currentPdfUrl = '';\r\n // }\r\n // }\r\n\r\n onPdfDownload(): void {\r\n // Trigger download\r\n // const blob = this.base64ToBlob(this.getCurrentBase64(), this.getMimeType(ExportType.PDF));\r\n // this.downloadFile(blob, this.currentFileName);\r\n }\r\n private downloadBinaryExport(response: any, config: any) {\r\n const blob = this.base64ToBlob(\r\n response,\r\n this.getMimeType(config.exportType)\r\n );\r\n\r\n this.downloadFile(\r\n blob,\r\n `${config.fileName}.${this.getFileExtension(config.exportType)}`\r\n );\r\n }\r\n\r\n // HTML Export Methods\r\n private showHtmlExport(htmlContent: string): void {\r\n const cleanHtml = this.cleanHtmlContent(htmlContent);\r\n this.htmlExportContent = cleanHtml;\r\n this.showHtmlInIframe = true;\r\n\r\n setTimeout(() => {\r\n this.setIframeContent(cleanHtml);\r\n }, 100);\r\n }\r\n\r\n private setIframeContent(htmlContent: string): void {\r\n const iframe = document.getElementById('reportIframe') as HTMLIFrameElement;\r\n if (!iframe) {\r\n console.error('Iframe not found');\r\n return;\r\n }\r\n\r\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\r\n if (iframeDoc) {\r\n iframeDoc.open();\r\n iframeDoc.write(htmlContent);\r\n iframeDoc.close();\r\n }\r\n }\r\n\r\n print(): void {\r\n // const iframe = document.getElementById('reportIframe') as HTMLIFrameElement | null;\r\n // if (!iframe || !iframe.contentWindow) return;\r\n\r\n // const iframeWindow = iframe.contentWindow;\r\n // iframeWindow.focus();\r\n // iframeWindow.print();\r\n\r\n (document.getElementById('reportIframe') as any).contentWindow.print() ;\r\n }\r\n\r\n\r\n // Utility Methods\r\n getExportButtonText(): string {\r\n switch (this.exportType) {\r\n case ExportType.PRINT:\r\n return this.translate.instant('PRINT');\r\n case ExportType.HTML:\r\n return this.translate.instant('EXPORT');\r\n default:\r\n return this.translate.instant('EXPORT');\r\n }\r\n }\r\n\r\n onExportTypeChange(type: ExportType) {\r\n this.exportType = type;\r\n }\r\n\r\n getCurrentExportTypeIcon(): string {\r\n const currentType = this.exportTypes.find(type => type.value === this.exportType);\r\n return currentType?.icon || 'pi pi-download';\r\n }\r\n\r\n private base64ToBlob(base64: string, mime: string): Blob {\r\n const byteChars = atob(base64);\r\n const byteNums = Array.from(byteChars, c => c.charCodeAt(0));\r\n return new Blob([new Uint8Array(byteNums)], { type: mime });\r\n }\r\n\r\n private downloadFile(blob: Blob, fileName: string) {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n private getFileExtension(exportType: ExportType): string {\r\n switch (exportType) {\r\n case ExportType.EXCEL:\r\n return 'xlsx';\r\n case ExportType.PDF:\r\n return 'pdf';\r\n case ExportType.HTML:\r\n return 'html';\r\n default:\r\n return 'pdf';\r\n }\r\n }\r\n\r\n private getMimeType(exportType: ExportType): string {\r\n switch (exportType) {\r\n case ExportType.EXCEL:\r\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n case ExportType.PDF:\r\n return 'application/pdf';\r\n default:\r\n return 'application/octet-stream';\r\n }\r\n }\r\n\r\n private cleanHtmlContent(html: string): string {\r\n return html\r\n .replace(/\\\\r\\\\n/g, '\\n')\r\n .replace(/\\\\\"/g, '\"')\r\n .replace(/\\\\t/g, ' ')\r\n .trim();\r\n }\r\n}\r\n","<!-- 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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"es.framework-ng.ui.core-generic-report.mjs","sources":["../../../../libs/ng.ui.core/generic-report/src/lib/generic-report-module.ts","../../../../libs/ng.ui.core/generic-report/src/lib/report-name-dialog.component.ts","../../../../libs/ng.ui.core/generic-report/src/lib/generic-report.component.ts","../../../../libs/ng.ui.core/generic-report/src/lib/generic-report.component.html","../../../../libs/ng.ui.core/generic-report/src/es.framework-ng.ui.core-generic-report.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n})\r\nexport class GenericReportModule {}\r\n","// report-name-dialog.component.ts\r\nimport { Component, inject } from '@angular/core';\r\n\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\n\r\n@Component({\r\n selector: 'app-report-name-dialog',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslatePipe,\r\n ButtonModule,\r\n InputTextModule\r\n],\r\n template: `\r\n <div class=\"p-fluid\">\r\n <div class=\"field\">\r\n <label for=\"fileName\" class=\"block text-sm font-medium mb-2\">\r\n {{ 'REPORT_NAME' | translate }}\r\n </label>\r\n <input\r\n id=\"fileName\"\r\n type=\"text\"\r\n [(ngModel)]=\"fileName\"\r\n pInputText\r\n class=\"w-full\"\r\n [placeholder]=\"'ENTER_REPORT_NAME' | translate\"\r\n autofocus>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-end gap-2 mt-4\">\r\n <button\r\n type=\"button\"\r\n pButton\r\n class=\"p-button-text\"\r\n (click)=\"ref.close()\"\r\n [label]=\"'CANCEL' | translate\">\r\n </button>\r\n <button\r\n type=\"button\"\r\n pButton\r\n (click)=\"save()\"\r\n [label]=\"'SAVE' | translate\">\r\n </button>\r\n </div>\r\n `\r\n})\r\nexport class ReportNameDialogComponent {\r\n fileName: string = '';\r\n\r\n ref = inject(DynamicDialogRef);\r\n config = inject(DynamicDialogConfig);\r\n translate = inject(LocalizationService);\r\n\r\n ngOnInit() {\r\n this.fileName = this.config.data?.fileName || '';\r\n }\r\n\r\n save() {\r\n if (this.fileName?.trim()) {\r\n this.ref.close(this.fileName.trim());\r\n }\r\n }\r\n}\r\n","\r\nimport { Component, inject, OnInit, ViewChild, ElementRef, Input, OnDestroy } from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { FormlyFieldConfig, FormlyFormOptions, FormlyForm } from '@ngx-formly/core';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DynamicDialogRef, DynamicDialogConfig, DialogService } from 'primeng/dynamicdialog';\r\nimport { LocalizationService, RestService } from '@es.framework/ng.core/services';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { TableModule } from 'primeng/table';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { ReportNameDialogComponent } from './report-name-dialog.component';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { QueryBuilderService } from '@es.framework/ng.ui.core/generic-search-advanced';\r\n\r\nexport interface ExportConfig {\r\n filters: any;\r\n exportType: ExportType;\r\n fileName?: string;\r\n}\r\n\r\nexport enum ExportType {\r\n LIST,\r\n HTML,\r\n PDF,\r\n EXCEL,\r\n PRINT\r\n}\r\n\r\n@Component({\r\n selector: 'app-generic-report',\r\n templateUrl: './generic-report.component.html',\r\n imports: [\r\n ReactiveFormsModule,\r\n FormsModule,\r\n TranslatePipe,\r\n ButtonModule,\r\n DialogModule,\r\n InputTextModule,\r\n RadioButtonModule,\r\n CheckboxModule,\r\n DrawerModule,\r\n FormlyForm,\r\n TableModule,\r\n SplitButtonModule,\r\n TooltipModule\r\n],\r\n providers:[DialogService,RestService]\r\n})\r\nexport class GenericReportComponent implements OnInit, OnDestroy {\r\n @ViewChild('previewContainer') previewContainer!: ElementRef;\r\n\r\n @Input() filterFields: FormlyFieldConfig[] = [];\r\n fields_: FormlyFieldConfig[] = [];\r\n exportType: ExportType = ExportType.PDF;\r\n fileName: string = '';\r\n showFilters: boolean = false;\r\n loading: boolean = false;\r\n currentDate: Date = new Date();\r\n previewData: any[] = [];\r\n htmlExportContent: string = '';\r\n showHtmlInIframe: boolean = false;\r\n previewColumns: any[] = [];\r\n\r\n options: FormlyFormOptions = {};\r\n @Input() enableQueryBuilder: boolean = true;\r\n @Input() localExport: boolean = false;\r\n @Input() queryString: string = '';\r\n @Input() apiName: string = '';\r\n @Input() moduleName: string = '';\r\n\r\n @Input() model: any = {};\r\n form = new FormGroup({});\r\n exportConfig!: ExportConfig;\r\n\r\n exportTypes = [\r\n { value: ExportType.EXCEL, label: 'EXCEL', icon: 'pi pi-file-excel' },\r\n { value: ExportType.PDF, label: 'PDF', icon: 'pi pi-file-pdf' },\r\n { value: ExportType.HTML, label: 'HTML', icon: 'pi pi-code' },\r\n { value: ExportType.PRINT, label: 'PRINT', icon: 'pi pi-print' }\r\n ];\r\n\r\n exportMenuItems: MenuItem[] = [];\r\n\r\n private destroy$ = new Subject<void>();\r\n private dialogService:DialogService = inject(DialogService);\r\n private translate = inject(LocalizationService);\r\n private restService: RestService = inject(RestService);\r\n private queryBuilder = inject(QueryBuilderService);\r\nprivate sanitizer: DomSanitizer = inject(DomSanitizer);\r\n constructor(\r\n public ref: DynamicDialogRef,\r\n public config: DynamicDialogConfig\r\n ) {}\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.ref) {\r\n try {\r\n this.ref.close();\r\n } catch (e) {\r\n // Ignore errors during cleanup\r\n }\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.filterFields = this.config.data?.filterFields || [];\r\n this.buildQueryUIFields();\r\n this.initializeComponent();\r\n this.initializeExportConfig();\r\n this.initializeExportMenu();\r\n }\r\n get filterCount() {\r\n\r\n return this.queryBuilder.getAppliedFiltersCount(this.model).total;\r\n }\r\n private buildQueryUIFields() {\r\n if (this.enableQueryBuilder) {\r\n this.fields_ = this.queryBuilder.buildQueryUIFields(this.filterFields,true,true);\r\n } else {\r\n this.fields_ = this.filterFields;\r\n }\r\n }\r\n\r\n private initializeComponent() {\r\n this.apiName = this.config.data?.apiName || '';\r\n this.moduleName = this.config.data?.moduleName || '';\r\n this.initializeFilterFields();\r\n this.onExport();\r\n }\r\n\r\n private initializeFilterFields() {\r\n this.filterFields = this.config.data?.filterFields || this.getDefaultFilterFields();\r\n this.model = this.config.data?.model || {};\r\n this.fileName = this.config.data?.defaultFileName || `export_${new Date().toISOString().split('T')[0]}`;\r\n }\r\n\r\n private initializeExportConfig() {\r\n this.exportConfig = {\r\n filters: this.model,\r\n exportType: this.exportType,\r\n fileName: this.fileName\r\n };\r\n }\r\n\r\n private initializeExportMenu() {\r\n this.exportMenuItems = [\r\n // Edit Report Name menu item\r\n {\r\n label: this.translate.instant('EDIT_REPORT_NAME'),\r\n icon: 'pi pi-pencil',\r\n command: () => this.openReportNameDialog()\r\n },\r\n // Separator\r\n { separator: true },\r\n // Export type menu items\r\n ...this.exportTypes.map(type => ({\r\n label: this.translate.instant(type.label),\r\n icon: type.icon,\r\n command: () => this.onExportTypeChange(type.value)\r\n }))\r\n ];\r\n}\r\n\r\nprivate openReportNameDialog() {\r\n const ref = this.dialogService.open(ReportNameDialogComponent, {\r\n header: this.translate.instant('EDIT_REPORT_NAME'),\r\n width: '500px',\r\n data: {\r\n fileName: this.fileName\r\n }\r\n });\r\n\r\n ref?.onClose.subscribe((result: string) => {\r\n if (result) {\r\n this.fileName = result;\r\n }\r\n });\r\n}\r\n\r\n private getDefaultFilterFields(): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'search',\r\n type: 'input',\r\n props: {\r\n label: this.translate.instant('SEARCH'),\r\n placeholder: this.translate.instant('ENTER_SEARCH_TERM'),\r\n }\r\n }\r\n ];\r\n }\r\n\r\n // Query and Preview Methods\r\n generatePreview() {\r\n this.onExport();\r\n }\r\n\r\n onSubmit() {\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);\r\n this.queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n this.onExport();\r\n }\r\n\r\n onReset() {\r\n this.exportType = ExportType.PDF;\r\n this.fileName = `export_${new Date().toISOString().split('T')[0]}`;\r\n this.form.reset();\r\n this.model = {};\r\n this.generatePreview();\r\n }\r\n\r\n // Export Methods\r\n onExport() {\r\n this.loading = true;\r\n const exportConfig = this.createExportConfig();\r\n this.handleApiExport(exportConfig);\r\n }\r\n\r\n private createExportConfig(): any {\r\n return {\r\n filters: this.model,\r\n exportType: this.exportType,\r\n fileName: this.fileName\r\n };\r\n }\r\n\r\n private handleApiExport(config: any) {\r\n if (this.form.invalid) return;\r\n\r\n const requestOptions = this.createRequestOptions(config);\r\n\r\n this.restService.request<any, any>(\r\n requestOptions,\r\n { apiName: this.apiName , moduleName: this.moduleName }\r\n )\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (response) => {\r\n this.handleExportResponse(response, config);\r\n },\r\n error: (error) => {\r\n console.error('Export failed:', error);\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n private createRequestOptions(config: any): any {\r\n // Default query\r\n if(!this.queryString || this.queryString == ''){\r\n\r\n // Use the new QueryBuilderService methods\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.filterFields);\r\n // this.odataSearch.emit(odataParams);\r\n\r\n // Generate query string using the unified method\r\n this.queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n // console.log('OData Query String:', queryString);\r\n\r\n }\r\n const filters: Partial<any> = {\n fileName: config.fileName || '',\n query: this.queryString,\n exportType: this.getApiExportType(config.exportType),\n };\n\r\n\r\n\r\n const params = Object.keys(filters).reduce((acc: any, key) => {\r\n acc[key] = filters[key];\r\n return acc;\r\n }, {});\r\n\r\n const requestOptions: any = {\r\n method: 'GET',\r\n url: `/${this.apiName}/export`,\r\n params: params\r\n };\r\n\r\n if (config.exportType === ExportType.HTML) {\r\n requestOptions.responseType = 'text';\r\n }\r\n\r\n return requestOptions;\r\n }\r\n\r\n // private handleExportResponse(response: any, config: any) {\r\n // this.loading = false;\r\n\r\n // if (config.exportType === ExportType.HTML) {\r\n // this.showHtmlExport(response);\r\n // } else {\r\n // this.downloadBinaryExport(response, config);\r\n // }\r\n // }\r\n private handleExportResponse(response: any, config: any) {\r\n this.loading = false;\r\n\r\n if (config.exportType === ExportType.HTML) {\r\n this.showHtmlExport(response);\r\n // } else if (config.exportType === ExportType.PDF && this.isMobileDevice()) {\r\n } else if (config.exportType === ExportType.PDF) {\r\n this.showPdfInMobile(response, config);\r\n } else {\r\n this.downloadBinaryExport(response, config);\r\n }\r\n }\r\n // Platform detection methods\r\nprivate isMobileDevice(): boolean {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n}\r\n\r\nprivate isIOS(): boolean {\r\n return /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n}\r\n\r\nprivate isAndroid(): boolean {\r\n return /Android/.test(navigator.userAgent);\r\n}\r\n showPdfModal = false;\r\n currentPdfUrl?:SafeResourceUrl;\r\n currentFileName = '';\r\n private showPdfInMobile(base64Data: string, config: any): void {\r\n\r\n\r\n try {\r\n const blob = this.base64ToBlob(base64Data, this.getMimeType(ExportType.PDF));\r\n this.currentPdfUrl = this.sanitizeUrl(URL.createObjectURL(blob));\r\n this.currentFileName = `${config.fileName}.pdf`;\r\n this.showPdfModal = true;\r\n } catch (error) {\r\n var error = 'PDF is too large for mobile viewing. Please download instead.';\r\n } finally {\r\n // this.loading = false;\r\n }\r\n }\r\n\r\n\r\n private sanitizeUrl(url: string): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n\r\n // onPdfModalClose(): void {\r\n // this.showPdfModal = false;\r\n // if (this.currentPdfUrl) {\r\n // URL.revokeObjectURL(this.currentPdfUrl);\r\n // this.currentPdfUrl = '';\r\n // }\r\n // }\r\n\r\n onPdfDownload(): void {\r\n // Trigger download\r\n // const blob = this.base64ToBlob(this.getCurrentBase64(), this.getMimeType(ExportType.PDF));\r\n // this.downloadFile(blob, this.currentFileName);\r\n }\r\n private downloadBinaryExport(response: any, config: any) {\r\n const blob = this.base64ToBlob(\r\n response,\r\n this.getMimeType(config.exportType)\r\n );\r\n\r\n this.downloadFile(\r\n blob,\r\n `${config.fileName}.${this.getFileExtension(config.exportType)}`\r\n );\r\n }\r\n\r\n // HTML Export Methods\r\n private showHtmlExport(htmlContent: string): void {\r\n const cleanHtml = this.cleanHtmlContent(htmlContent);\r\n this.htmlExportContent = cleanHtml;\r\n this.showHtmlInIframe = true;\r\n\r\n setTimeout(() => {\r\n this.setIframeContent(cleanHtml);\r\n }, 100);\r\n }\r\n\r\n private setIframeContent(htmlContent: string): void {\r\n const iframe = document.getElementById('reportIframe') as HTMLIFrameElement;\r\n if (!iframe) {\r\n console.error('Iframe not found');\r\n return;\r\n }\r\n\r\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\r\n if (iframeDoc) {\r\n iframeDoc.open();\r\n iframeDoc.write(htmlContent);\r\n iframeDoc.close();\r\n }\r\n }\r\n\r\n print(): void {\r\n // const iframe = document.getElementById('reportIframe') as HTMLIFrameElement | null;\r\n // if (!iframe || !iframe.contentWindow) return;\r\n\r\n // const iframeWindow = iframe.contentWindow;\r\n // iframeWindow.focus();\r\n // iframeWindow.print();\r\n\r\n (document.getElementById('reportIframe') as any).contentWindow.print() ;\r\n }\r\n\r\n\r\n // Utility Methods\r\n getExportButtonText(): string {\r\n switch (this.exportType) {\r\n case ExportType.PRINT:\r\n return this.translate.instant('PRINT');\r\n case ExportType.HTML:\r\n return this.translate.instant('EXPORT');\r\n default:\r\n return this.translate.instant('EXPORT');\r\n }\r\n }\r\n\r\n onExportTypeChange(type: ExportType) {\r\n this.exportType = type;\r\n }\r\n\r\n getCurrentExportTypeIcon(): string {\r\n const currentType = this.exportTypes.find(type => type.value === this.exportType);\r\n return currentType?.icon || 'pi pi-download';\r\n }\r\n\r\n private base64ToBlob(base64: string, mime: string): Blob {\r\n const byteChars = atob(base64);\r\n const byteNums = Array.from(byteChars, c => c.charCodeAt(0));\r\n return new Blob([new Uint8Array(byteNums)], { type: mime });\r\n }\r\n\r\n private downloadFile(blob: Blob, fileName: string) {\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n private getFileExtension(exportType: ExportType): string {\r\n switch (exportType) {\r\n case ExportType.EXCEL:\r\n return 'xlsx';\r\n case ExportType.PDF:\r\n return 'pdf';\r\n case ExportType.HTML:\r\n return 'html';\r\n default:\r\n return 'pdf';\r\n }\r\n }\r\n\r\n private getMimeType(exportType: ExportType): string {\n switch (exportType) {\n case ExportType.EXCEL:\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n case ExportType.PDF:\n return 'application/pdf';\n default:\n return 'application/octet-stream';\n }\n }\n\n private getApiExportType(exportType: ExportType): string {\n switch (exportType) {\n case ExportType.EXCEL:\n return 'Excel';\n case ExportType.PDF:\n return 'Pdf';\n case ExportType.LIST:\n return 'List';\n case ExportType.HTML:\n return 'Html';\n case ExportType.PRINT:\n return 'Print';\n default:\n return String(exportType);\n }\n }\n\n private cleanHtmlContent(html: string): string {\n return html\n .replace(/\\\\r\\\\n/g, '\\n')\r\n .replace(/\\\\\"/g, '\"')\r\n .replace(/\\\\t/g, ' ')\r\n .trim();\r\n }\r\n}\r\n","<!-- class=\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg max-w-6xl mx-auto\" -->\r\n<div >\r\n <!-- Content -->\r\n <div class=\"flex-1 overflow-hidden p-2\">\r\n\r\n <!-- Preview Actions -->\r\n <div class=\"flex justify-between items-center mb-6 p-2 bg-white rounded-lg\">\r\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white\">\r\n {{ 'REPORT' | translate }}\r\n </h3>\r\n <div class=\"flex gap-2\">\r\n <!-- Filters Button -->\r\n <button\r\n type=\"button\"\r\n (click)=\"showFilters = !showFilters\"\r\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\"\r\n [pTooltip]=\"'SEARCH_FILTERS' | translate\">\r\n <i class=\"pi pi-filter\"></i>\r\n @if (filterCount > 0) {\r\n <span class=\"ml-2 bg-blue-500 text-white text-xs rounded-full h-5 w-5 flex items-center justify-center\">\r\n {{ filterCount }}\r\n </span>\r\n }\r\n </button>\r\n\r\n <!-- Refresh Preview -->\r\n <button\r\n (click)=\"generatePreview()\"\r\n [disabled]=\"loading\"\r\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\"\r\n [pTooltip]=\"'REFRESH' | translate\">\r\n <i class=\"pi pi-refresh mr-2 ml-2\" [class.animate-spin]=\"loading\"></i>\r\n {{ 'REFRESH' | translate }}\r\n </button>\r\n\r\n <!-- Print Button -->\r\n @if (exportType === 4 || exportType === 1 || exportType === 2) {\r\n <button\r\n (click)=\"print()\"\r\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\"\r\n [pTooltip]=\"'PRINT' | translate\">\r\n <i class=\"pi pi-print mr-2 ml-2\"></i>\r\n {{ 'PRINT' | translate }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Preview Content -->\r\n <div #previewContainer class=\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg\">\r\n <!-- HTML Export Preview (Iframe) -->\r\n @if (showHtmlInIframe && htmlExportContent || showPdfModal) {\r\n <div class=\"html-export-preview\">\r\n <iframe\r\n id=\"reportIframe\"\r\n class=\"w-full border border-gray-300 dark:border-gray-600 rounded-b-lg\"\r\n [style.height]=\"'600px'\"\r\n title=\"HTML Export Preview\"\r\n [src]=\"currentPdfUrl\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n frameborder=\"0\"\r\n allowfullscreen\r\n >\r\n <!-- allowfullscreen -->\r\n </iframe>\r\n </div>\r\n }\r\n <!-- <app-pdf-modal\r\n *ngIf=\"showPdfModal\"\r\n [pdfUrl]=\"currentPdfUrl\"\r\n [fileName]=\"currentFileName\"\r\n (closed)=\"onPdfModalClose()\"\r\n (downloadRequested)=\"onPdfDownload()\">\r\n </app-pdf-modal> -->\r\n\r\n <!-- Regular Preview Table -->\r\n <!-- <div *ngIf=\"!showHtmlInIframe\" class=\"p-4\">\r\n <p-table\r\n [value]=\"previewData\"\r\n [columns]=\"previewColumns\"\r\n [paginator]=\"true\"\r\n [rows]=\"10\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"Showing {first} to {last} of {totalRecords} entries\"\r\n styleClass=\"p-datatable-sm\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th *ngFor=\"let col of previewColumns\" class=\"text-left\">\r\n {{ col.header }}\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData>\r\n <tr>\r\n <td *ngFor=\"let col of previewColumns\" class=\"text-left\">\r\n {{ rowData[col.field] }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td [attr.colspan]=\"previewColumns.length\" class=\"text-center py-4\">\r\n <div class=\"text-center py-8\">\r\n <i class=\"pi pi-inbox text-4xl text-gray-400 dark:text-gray-500 mb-4\"></i>\r\n <p class=\"text-gray-500 dark:text-gray-400\">{{ 'NO_PREVIEW_DATA' | translate }}</p>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div> -->\r\n</div>\r\n\r\n<!-- <div class=\"mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg\">\r\n<p class=\"text-sm text-green-700 dark:text-green-300\">\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n {{ 'PREVIEW_INFO' | translate }}\r\n</p>\r\n</div> -->\r\n</div>\r\n\r\n<!-- Footer -->\r\n<div class=\"border-t border-gray-200 dark:border-gray-700 px-2 py-2 bg-gray-50 dark:bg-gray-800\">\r\n <div class=\"flex justify-between items-center\">\r\n <button\r\n type=\"button\"\r\n (click)=\"onReset()\"\r\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\"\r\n [disabled]=\"loading\">\r\n <i class=\"pi pi-refresh mr-2\"></i>\r\n {{ 'RESET' | translate }}\r\n </button>\r\n\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n (click)=\"ref?.close()\"\r\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\"\r\n [disabled]=\"loading\">\r\n {{ 'CANCEL' | translate }}\r\n </button>\r\n\r\n <!-- SplitButton for Export -->\r\n <!-- || previewData.length === 0 -->\r\n <p-splitButton\r\n [label]=\"getExportButtonText()\"\r\n [icon]=\"getCurrentExportTypeIcon()\"\r\n [model]=\"exportMenuItems\"\r\n (onClick)=\"onExport()\"\r\n [disabled]=\"loading\"\r\n styleClass=\"p-button-primary\">\r\n </p-splitButton>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Filters Drawer -->\r\n@if(showFilters){\r\n <p-drawer\r\n [(visible)]=\"showFilters\"\r\n position=\"right\"\r\n [styleClass]=\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \"\r\n [modal]=\"true\"\r\n [dismissible]=\"true\"\r\n styleClass=\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit(); showFilters=false\" class=\"flex flex-col flex-1\">\r\n <div class=\"flex-1 overflow-auto\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"fields_\"\r\n [model]=\"model\"\r\n [options]=\"options\">\r\n </formly-form>\r\n </div>\r\n </form>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end mt-2 space-x-2 flex-none\">\r\n <button\r\n type=\"submit\"\r\n pButton size=\"small\"\r\n (click)=\" onSubmit(); showFilters=false\"\r\n label=\"{{ 'SEARCH' | translate }}\">\r\n </button>\r\n <button\r\n type=\"button\"\r\n pButton\r\n size=\"small\"\r\n class=\"p-button-text\"\r\n (click)=\"onReset(); showFilters=false\">\r\n {{ 'CLEAR' | translate }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":"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"}