@acorex/connectivity 21.0.0-next.8 → 21.0.0-next.85

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 (104) hide show
  1. package/fesm2022/{acorex-connectivity-api-execute.command-SGNBLcOi.mjs → acorex-connectivity-api-execute.command-CjCFEav4.mjs} +18 -8
  2. package/fesm2022/acorex-connectivity-api-execute.command-CjCFEav4.mjs.map +1 -0
  3. package/fesm2022/acorex-connectivity-api.mjs +196 -192
  4. package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
  5. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs +86927 -0
  6. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-Btm13GJK.mjs.map +1 -0
  7. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-CY_5d0KF.mjs +288 -0
  8. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-CY_5d0KF.mjs.map +1 -0
  9. package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CIof4zTg.mjs +200 -0
  10. package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CIof4zTg.mjs.map +1 -0
  11. package/fesm2022/{acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs → acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs} +18 -17
  12. package/fesm2022/acorex-connectivity-mock-category-with-items.query-DAKUJIIt.mjs.map +1 -0
  13. package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.mjs +111 -0
  14. package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-Hj-2bHyJ.mjs.map +1 -0
  15. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs +121 -0
  16. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-0ZnevjmT.mjs.map +1 -0
  17. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs +121 -0
  18. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-D8sCgp69.mjs.map +1 -0
  19. package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs +45 -0
  20. package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs.map +1 -0
  21. package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs +968 -0
  22. package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs.map +1 -0
  23. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs +16 -0
  24. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs.map +1 -0
  25. package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs → acorex-connectivity-mock-distribution-record.activity-a1_k9Czb.mjs} +29 -14
  26. package/fesm2022/acorex-connectivity-mock-distribution-record.activity-a1_k9Czb.mjs.map +1 -0
  27. package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs +67 -0
  28. package/fesm2022/acorex-connectivity-mock-entity-create.activity-CdoUzUvF.mjs.map +1 -0
  29. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs +60 -0
  30. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs.map +1 -0
  31. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs +67 -0
  32. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs.map +1 -0
  33. package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs +68 -0
  34. package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs.map +1 -0
  35. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs +64 -0
  36. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs.map +1 -0
  37. package/fesm2022/{acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs → acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs} +4 -4
  38. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs.map +1 -0
  39. package/fesm2022/{acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs → acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs} +4 -4
  40. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs.map +1 -0
  41. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs +39 -0
  42. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs.map +1 -0
  43. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs +69 -0
  44. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs.map +1 -0
  45. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-BWbZj3tp.mjs +214 -0
  46. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-BWbZj3tp.mjs.map +1 -0
  47. package/fesm2022/acorex-connectivity-mock-get-location-list.query-CQ2rFDUM.mjs +209 -0
  48. package/fesm2022/acorex-connectivity-mock-get-location-list.query-CQ2rFDUM.mjs.map +1 -0
  49. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs +186 -0
  50. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs.map +1 -0
  51. package/fesm2022/{acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs → acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs} +111 -14
  52. package/fesm2022/acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs.map +1 -0
  53. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs +192 -0
  54. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs.map +1 -0
  55. package/fesm2022/{acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs → acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs} +5 -5
  56. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-CkQnH-F_.mjs.map +1 -0
  57. package/fesm2022/{acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs → acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs} +92 -14
  58. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-C_ecGCyk.mjs.map +1 -0
  59. package/fesm2022/{acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs → acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs} +92 -14
  60. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-t4BHU8qk.mjs.map +1 -0
  61. package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs → acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs} +5 -5
  62. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-CgMZxfzh.mjs.map +1 -0
  63. package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs → acorex-connectivity-mock-get-tenant-registration-timeline.query-COmTsDCV.mjs} +92 -14
  64. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-COmTsDCV.mjs.map +1 -0
  65. package/fesm2022/{acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs → acorex-connectivity-mock-get-tenant-user-distribution.query-jQAsUf_h.mjs} +92 -14
  66. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-jQAsUf_h.mjs.map +1 -0
  67. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs +35 -0
  68. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs.map +1 -0
  69. package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs +73 -0
  70. package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs.map +1 -0
  71. package/fesm2022/acorex-connectivity-mock-report-summary.util-CGOhHIZr.mjs +56 -0
  72. package/fesm2022/acorex-connectivity-mock-report-summary.util-CGOhHIZr.mjs.map +1 -0
  73. package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs → acorex-connectivity-mock-sample.command-CJmDL4pL.mjs} +4 -4
  74. package/fesm2022/acorex-connectivity-mock-sample.command-CJmDL4pL.mjs.map +1 -0
  75. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs +38 -0
  76. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs.map +1 -0
  77. package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-D2QjJXu4.mjs +30 -0
  78. package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-D2QjJXu4.mjs.map +1 -0
  79. package/fesm2022/acorex-connectivity-mock.mjs +2 -50419
  80. package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
  81. package/fesm2022/acorex-connectivity-utils.mjs +7 -7
  82. package/fesm2022/acorex-connectivity-utils.mjs.map +1 -1
  83. package/fesm2022/acorex-connectivity.mjs.map +1 -1
  84. package/package.json +8 -7
  85. package/{api/index.d.ts → types/acorex-connectivity-api.d.ts} +14 -60
  86. package/types/acorex-connectivity-mock.d.ts +4224 -0
  87. package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +0 -1
  88. package/fesm2022/acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map +0 -1
  89. package/fesm2022/acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs.map +0 -1
  90. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map +0 -1
  91. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map +0 -1
  92. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs +0 -97
  93. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map +0 -1
  94. package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map +0 -1
  95. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs.map +0 -1
  96. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs.map +0 -1
  97. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map +0 -1
  98. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map +0 -1
  99. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map +0 -1
  100. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs.map +0 -1
  101. package/fesm2022/acorex-connectivity-mock-sample.command-CkH5bmEs.mjs.map +0 -1
  102. package/mock/index.d.ts +0 -2669
  103. /package/{utils/index.d.ts → types/acorex-connectivity-utils.d.ts} +0 -0
  104. /package/{index.d.ts → types/acorex-connectivity.d.ts} +0 -0
@@ -0,0 +1,186 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { AXPEntityService } from '@acorex/platform/layout/entity';
4
+ import { RootConfig } from '@acorex/modules/product-catalog';
5
+
6
+ //#endregion
7
+ class GetProductChartDataQuery {
8
+ constructor() {
9
+ this.entityService = inject(AXPEntityService);
10
+ this.productService = this.entityService.withEntity(`${RootConfig.module.name}.${RootConfig.entities.product.name}`).data();
11
+ }
12
+ async fetch(input) {
13
+ // Extract product-specific filters from AXPFilterClause format
14
+ const extractedFilters = this.extractProductFilters(input.filters);
15
+ // Separate custom filters from entity filters
16
+ const entityFilters = [];
17
+ let priceRangeFilter;
18
+ if (extractedFilters && extractedFilters.length > 0) {
19
+ for (const filter of extractedFilters) {
20
+ if (filter.field === 'priceRange') {
21
+ priceRangeFilter = filter.value;
22
+ }
23
+ else {
24
+ entityFilters.push(filter);
25
+ }
26
+ }
27
+ }
28
+ // Get all products from storage with entity filters (no pagination for charts)
29
+ const allProductsResult = await this.productService.query({
30
+ skip: 0,
31
+ take: 10000, // Get all products for aggregation
32
+ filter: entityFilters.length > 0
33
+ ? {
34
+ logic: input.logic || 'and',
35
+ filters: entityFilters,
36
+ }
37
+ : undefined,
38
+ });
39
+ let allProducts = allProductsResult.items;
40
+ // Apply custom price range filter after fetching
41
+ if (priceRangeFilter && priceRangeFilter !== 'all') {
42
+ allProducts = this.applyPriceRangeFilter(allProducts, priceRangeFilter);
43
+ }
44
+ // Group products by brand
45
+ const brandGroups = new Map();
46
+ for (const product of allProducts) {
47
+ const brandKey = product.brand?.title || product.brandId || 'Unknown';
48
+ if (!brandGroups.has(brandKey)) {
49
+ brandGroups.set(brandKey, []);
50
+ }
51
+ brandGroups.get(brandKey).push(product);
52
+ }
53
+ // Aggregate data by brand for chart
54
+ const chartResults = [];
55
+ for (const [brandName, products] of brandGroups.entries()) {
56
+ chartResults.push({
57
+ brand: brandName,
58
+ productCount: products.length,
59
+ });
60
+ }
61
+ return {
62
+ items: chartResults,
63
+ };
64
+ }
65
+ //#region ---- Filter Extraction ----
66
+ /**
67
+ * Extract product-specific filters from AXPFilterClause format
68
+ * Maps report parameter paths to product entity field names
69
+ */
70
+ extractProductFilters(parameters) {
71
+ const filters = [];
72
+ const paramsAny = parameters;
73
+ if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {
74
+ return filters;
75
+ }
76
+ for (const filter of paramsAny.filters) {
77
+ if (!filter?.field || filter?.value === undefined || filter?.value === null) {
78
+ continue;
79
+ }
80
+ const field = filter.field;
81
+ const value = filter.value;
82
+ const operator = filter.operator || { type: 'equal' };
83
+ // Handle product-specific field mappings
84
+ if (field === 'brand') {
85
+ // Brand filter - can be array of IDs or single ID
86
+ if (Array.isArray(value) && value.length > 0) {
87
+ filters.push({
88
+ field: 'brandId',
89
+ operator: { type: 'in' },
90
+ value: value,
91
+ });
92
+ }
93
+ else if (value) {
94
+ filters.push({
95
+ field: 'brandId',
96
+ operator: { type: 'equal' },
97
+ value: value,
98
+ });
99
+ }
100
+ }
101
+ else if (field === 'category') {
102
+ // Category filter - can be array of IDs or single ID
103
+ if (Array.isArray(value) && value.length > 0) {
104
+ filters.push({
105
+ field: 'categoryIds',
106
+ operator: { type: 'contains' },
107
+ value: value[0], // Use first category for contains check
108
+ });
109
+ }
110
+ else if (value) {
111
+ filters.push({
112
+ field: 'categoryIds',
113
+ operator: { type: 'contains' },
114
+ value: value,
115
+ });
116
+ }
117
+ }
118
+ else if (field === 'status') {
119
+ // Status filter - skip 'all' value
120
+ if (value && value !== 'all') {
121
+ filters.push({
122
+ field: 'statusId',
123
+ operator: { type: 'equal' },
124
+ value: value,
125
+ });
126
+ }
127
+ }
128
+ else if (field === 'priceRange') {
129
+ // Price range filter - custom logic handled in query
130
+ filters.push({
131
+ field: 'priceRange',
132
+ operator: { type: 'equal' },
133
+ value: value,
134
+ });
135
+ }
136
+ else if (field === 'startDate' || field === 'endDate') {
137
+ // Date filters - can be handled if needed
138
+ // For now, skip as they might not be directly on product entity
139
+ }
140
+ else {
141
+ // Direct field mapping
142
+ filters.push({
143
+ field: field,
144
+ operator: operator,
145
+ value: value,
146
+ });
147
+ }
148
+ }
149
+ return filters;
150
+ }
151
+ //#endregion
152
+ //#region ---- Custom Filter Handlers ----
153
+ /**
154
+ * Apply custom price range filter to products
155
+ */
156
+ applyPriceRangeFilter(products, priceRange) {
157
+ return products.filter((product) => {
158
+ const price = product.basePrice || 0;
159
+ switch (priceRange) {
160
+ case 'under-50':
161
+ return price < 50;
162
+ case '50-100':
163
+ return price >= 50 && price < 100;
164
+ case '100-500':
165
+ return price >= 100 && price < 500;
166
+ case '500-1000':
167
+ return price >= 500 && price < 1000;
168
+ case 'over-1000':
169
+ return price >= 1000;
170
+ default:
171
+ return true;
172
+ }
173
+ });
174
+ }
175
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
176
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductChartDataQuery, providedIn: 'root' }); }
177
+ }
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductChartDataQuery, decorators: [{
179
+ type: Injectable,
180
+ args: [{
181
+ providedIn: 'root',
182
+ }]
183
+ }] });
184
+
185
+ export { GetProductChartDataQuery };
186
+ //# sourceMappingURL=acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs","sources":["../../../../libs/connectivity/mock/src/lib/product-catalog/reports/get-product-chart-data.query.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXMProductCatalogProductEntityModel } from '@acorex/modules/product-catalog';\nimport { RootConfig } from '@acorex/modules/product-catalog';\n\n//#region ---- Query Input/Output Types ----\n\nexport interface GetProductChartDataQueryInput {\n filters?: Array<{\n field: string;\n operator: { type: string };\n value: any;\n }>;\n logic?: 'and' | 'or';\n}\n\nexport interface ProductChartDataResult {\n brand: string;\n productCount: number;\n}\n\nexport interface GetProductChartDataQueryResult {\n items: ProductChartDataResult[];\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GetProductChartDataQuery implements AXPQuery<GetProductChartDataQueryInput, GetProductChartDataQueryResult> {\n private readonly entityService = inject(AXPEntityService);\n private productService = this.entityService.withEntity(`${RootConfig.module.name}.${RootConfig.entities.product.name}`).data<string, AXMProductCatalogProductEntityModel>();\n\n async fetch(input: GetProductChartDataQueryInput | any): Promise<GetProductChartDataQueryResult> {\n // Extract product-specific filters from AXPFilterClause format\n const extractedFilters = this.extractProductFilters(input.filters);\n\n // Separate custom filters from entity filters\n const entityFilters: GetProductChartDataQueryInput['filters'] = [];\n let priceRangeFilter: string | undefined;\n\n if (extractedFilters && extractedFilters.length > 0) {\n for (const filter of extractedFilters) {\n if (filter.field === 'priceRange') {\n priceRangeFilter = filter.value;\n } else {\n entityFilters.push(filter);\n }\n }\n }\n\n // Get all products from storage with entity filters (no pagination for charts)\n const allProductsResult = await this.productService.query({\n skip: 0,\n take: 10000, // Get all products for aggregation\n filter:\n entityFilters.length > 0\n ? ({\n logic: input.logic || 'and',\n filters: entityFilters,\n } as any)\n : undefined,\n });\n\n let allProducts = allProductsResult.items;\n\n // Apply custom price range filter after fetching\n if (priceRangeFilter && priceRangeFilter !== 'all') {\n allProducts = this.applyPriceRangeFilter(allProducts, priceRangeFilter);\n }\n\n // Group products by brand\n const brandGroups = new Map<string, AXMProductCatalogProductEntityModel[]>();\n\n for (const product of allProducts) {\n const brandKey = product.brand?.title || product.brandId || 'Unknown';\n\n if (!brandGroups.has(brandKey)) {\n brandGroups.set(brandKey, []);\n }\n\n brandGroups.get(brandKey)!.push(product);\n }\n\n // Aggregate data by brand for chart\n const chartResults: ProductChartDataResult[] = [];\n\n for (const [brandName, products] of brandGroups.entries()) {\n chartResults.push({\n brand: brandName,\n productCount: products.length,\n });\n }\n\n return {\n items: chartResults,\n };\n }\n\n //#region ---- Filter Extraction ----\n\n /**\n * Extract product-specific filters from AXPFilterClause format\n * Maps report parameter paths to product entity field names\n */\n private extractProductFilters(parameters: any): GetProductChartDataQueryInput['filters'] {\n const filters: GetProductChartDataQueryInput['filters'] = [];\n const paramsAny = parameters as any;\n\n if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {\n return filters;\n }\n\n for (const filter of paramsAny.filters) {\n if (!filter?.field || filter?.value === undefined || filter?.value === null) {\n continue;\n }\n\n const field = filter.field;\n const value = filter.value;\n const operator = filter.operator || { type: 'equal' };\n\n // Handle product-specific field mappings\n if (field === 'brand') {\n // Brand filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'brandId',\n operator: { type: 'in' },\n value: value,\n });\n } else if (value) {\n filters.push({\n field: 'brandId',\n operator: { type: 'equal' },\n value: value,\n });\n }\n } else if (field === 'category') {\n // Category filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'categoryIds',\n operator: { type: 'contains' },\n value: value[0], // Use first category for contains check\n });\n } else if (value) {\n filters.push({\n field: 'categoryIds',\n operator: { type: 'contains' },\n value: value,\n });\n }\n } else if (field === 'status') {\n // Status filter - skip 'all' value\n if (value && value !== 'all') {\n filters.push({\n field: 'statusId',\n operator: { type: 'equal' },\n value: value,\n });\n }\n } else if (field === 'priceRange') {\n // Price range filter - custom logic handled in query\n filters.push({\n field: 'priceRange',\n operator: { type: 'equal' },\n value: value,\n });\n } else if (field === 'startDate' || field === 'endDate') {\n // Date filters - can be handled if needed\n // For now, skip as they might not be directly on product entity\n } else {\n // Direct field mapping\n filters.push({\n field: field,\n operator: operator,\n value: value,\n });\n }\n }\n\n return filters;\n }\n\n //#endregion\n\n //#region ---- Custom Filter Handlers ----\n\n /**\n * Apply custom price range filter to products\n */\n private applyPriceRangeFilter(\n products: AXMProductCatalogProductEntityModel[],\n priceRange: string\n ): AXMProductCatalogProductEntityModel[] {\n return products.filter((product) => {\n const price = product.basePrice || 0;\n\n switch (priceRange) {\n case 'under-50':\n return price < 50;\n case '50-100':\n return price >= 50 && price < 100;\n case '100-500':\n return price >= 100 && price < 500;\n case '500-1000':\n return price >= 500 && price < 1000;\n case 'over-1000':\n return price >= 1000;\n default:\n return true;\n }\n });\n }\n\n //#endregion\n}\n\n"],"names":[],"mappings":"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"}
@@ -1,20 +1,26 @@
1
+ import { resolveMultiLanguageString } from '@acorex/core/translation';
2
+ import { RootConfig } from '@acorex/modules/product-catalog';
3
+ import { AXPEntityService } from '@acorex/platform/layout/entity';
1
4
  import * as i0 from '@angular/core';
2
5
  import { inject, Injectable } from '@angular/core';
3
- import { AXPEntityService } from '@acorex/platform/layout/entity';
4
- import { RootConfig } from '@acorex/modules/product-catalog';
6
+ import { c as computeReportFooterSummary } from './acorex-connectivity-mock-report-summary.util-CGOhHIZr.mjs';
5
7
 
6
8
  //#endregion
7
9
  class GetProductListQuery {
8
10
  constructor() {
9
11
  this.entityService = inject(AXPEntityService);
10
- this.productService = this.entityService.withEntity(`${RootConfig.module.name}.${RootConfig.entities.product.name}`).data();
12
+ this.productService = this.entityService
13
+ .withEntity(`${RootConfig.module.name}.${RootConfig.entities.product.name}`)
14
+ .data();
11
15
  }
12
16
  async fetch(input) {
17
+ // Extract product-specific filters from AXPFilterClause format
18
+ const extractedFilters = this.extractProductFilters(input.filters);
13
19
  // Separate custom filters from entity filters
14
20
  const entityFilters = [];
15
21
  let priceRangeFilter;
16
- if (input.filters && input.filters.length > 0) {
17
- for (const filter of input.filters) {
22
+ if (extractedFilters && extractedFilters.length > 0) {
23
+ for (const filter of extractedFilters) {
18
24
  if (filter.field === 'priceRange') {
19
25
  priceRangeFilter = filter.value;
20
26
  }
@@ -63,7 +69,7 @@ class GetProductListQuery {
63
69
  if (product.categories && Array.isArray(product.categories)) {
64
70
  for (const cat of product.categories) {
65
71
  if (cat.title) {
66
- categorySet.add(cat.title);
72
+ categorySet.add(resolveMultiLanguageString(cat.title, 'en-US'));
67
73
  }
68
74
  }
69
75
  }
@@ -72,7 +78,11 @@ class GetProductListQuery {
72
78
  // Get brand ID from first product
73
79
  const brandId = products[0]?.brandId || products[0]?.brand?.id;
74
80
  // Get manufacturer from first product (assuming all products in a brand have same manufacturer)
75
- const manufacturerName = products[0]?.manufacturer?.title || products[0]?.manufacturerId || 'Unknown';
81
+ const manufacturerName = (products[0]?.manufacturer?.title != null
82
+ ? resolveMultiLanguageString(products[0].manufacturer.title, 'en-US')
83
+ : '') ||
84
+ products[0]?.manufacturerId ||
85
+ 'Unknown';
76
86
  const manufacturerId = products[0]?.manufacturerId || products[0]?.manufacturer?.id;
77
87
  aggregatedResults.push({
78
88
  brand: brandName,
@@ -91,11 +101,10 @@ class GetProductListQuery {
91
101
  if (input.sort && input.sort.length > 0) {
92
102
  aggregatedResults.sort((a, b) => {
93
103
  for (const sortField of input.sort) {
94
- const field = sortField.field;
104
+ const field = sortField.name;
95
105
  const aValue = a[field];
96
106
  const bValue = b[field];
97
107
  const dir = sortField.dir === 'asc' ? 1 : -1;
98
- // Handle undefined values
99
108
  if (aValue === undefined && bValue === undefined)
100
109
  continue;
101
110
  if (aValue === undefined)
@@ -110,7 +119,7 @@ class GetProductListQuery {
110
119
  return 0;
111
120
  });
112
121
  }
113
- // Apply pagination
122
+ const summary = computeReportFooterSummary(aggregatedResults, input.summary);
114
123
  const skip = input.skip || 0;
115
124
  const take = input.take || 10;
116
125
  const total = aggregatedResults.length;
@@ -118,8 +127,96 @@ class GetProductListQuery {
118
127
  return {
119
128
  items,
120
129
  total,
130
+ summary,
121
131
  };
122
132
  }
133
+ //#region ---- Filter Extraction ----
134
+ /**
135
+ * Extract product-specific filters from AXPFilterClause format
136
+ * Maps report parameter paths to product entity field names
137
+ */
138
+ extractProductFilters(parameters) {
139
+ const filters = [];
140
+ const paramsAny = parameters;
141
+ if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {
142
+ return filters;
143
+ }
144
+ for (const filter of paramsAny.filters) {
145
+ if (!filter?.field || filter?.value === undefined || filter?.value === null) {
146
+ continue;
147
+ }
148
+ const field = filter.field;
149
+ const value = filter.value;
150
+ const operator = filter.operator || { type: 'equal' };
151
+ // Handle product-specific field mappings
152
+ if (field === 'brand') {
153
+ // Brand filter - can be array of IDs or single ID
154
+ if (Array.isArray(value) && value.length > 0) {
155
+ filters.push({
156
+ field: 'brandId',
157
+ operator: { type: 'in' },
158
+ value: value,
159
+ });
160
+ }
161
+ else if (value) {
162
+ filters.push({
163
+ field: 'brandId',
164
+ operator: { type: 'equal' },
165
+ value: value,
166
+ });
167
+ }
168
+ }
169
+ else if (field === 'category') {
170
+ // Category filter - can be array of IDs or single ID
171
+ if (Array.isArray(value) && value.length > 0) {
172
+ filters.push({
173
+ field: 'categoryIds',
174
+ operator: { type: 'contains' },
175
+ value: value[0], // Use first category for contains check
176
+ });
177
+ }
178
+ else if (value) {
179
+ filters.push({
180
+ field: 'categoryIds',
181
+ operator: { type: 'contains' },
182
+ value: value,
183
+ });
184
+ }
185
+ }
186
+ else if (field === 'status') {
187
+ // Status filter - skip 'all' value
188
+ if (value && value !== 'all') {
189
+ filters.push({
190
+ field: 'statusId',
191
+ operator: { type: 'equal' },
192
+ value: value,
193
+ });
194
+ }
195
+ }
196
+ else if (field === 'priceRange') {
197
+ // Price range filter - custom logic handled in query
198
+ filters.push({
199
+ field: 'priceRange',
200
+ operator: { type: 'equal' },
201
+ value: value,
202
+ });
203
+ }
204
+ else if (field === 'startDate' || field === 'endDate') {
205
+ // Date filters - can be handled if needed
206
+ // For now, skip as they might not be directly on product entity
207
+ }
208
+ else {
209
+ // Direct field mapping
210
+ filters.push({
211
+ field: field,
212
+ operator: operator,
213
+ value: value,
214
+ });
215
+ }
216
+ }
217
+ return filters;
218
+ }
219
+ //#endregion
123
220
  //#region ---- Custom Filter Handlers ----
124
221
  /**
125
222
  * Apply custom price range filter to products
@@ -143,10 +240,10 @@ class GetProductListQuery {
143
240
  }
144
241
  });
145
242
  }
146
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetProductListQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
147
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetProductListQuery, providedIn: 'root' }); }
243
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductListQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
244
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductListQuery, providedIn: 'root' }); }
148
245
  }
149
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetProductListQuery, decorators: [{
246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductListQuery, decorators: [{
150
247
  type: Injectable,
151
248
  args: [{
152
249
  providedIn: 'root',
@@ -154,4 +251,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
154
251
  }] });
155
252
 
156
253
  export { GetProductListQuery };
157
- //# sourceMappingURL=acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map
254
+ //# sourceMappingURL=acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs","sources":["../../../../libs/connectivity/mock/src/lib/product-catalog/reports/get-product-list.query.ts"],"sourcesContent":["import { resolveMultiLanguageString } from '@acorex/core/translation';\nimport { AXPReportSummaryOptions } from '@acorex/modules/report-management';\nimport { AXMProductCatalogProductEntityModel, RootConfig } from '@acorex/modules/product-catalog';\nimport { AXPQuerySort } from '@acorex/platform/common';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { inject, Injectable } from '@angular/core';\nimport { computeReportFooterSummary } from '../../report-management/report-summary.util';\n\n//#region ---- Query Input/Output Types ----\n\nexport interface GetProductListQueryInput {\n skip?: number;\n take?: number;\n sort?: AXPQuerySort[];\n summary?: AXPReportSummaryOptions[];\n filters?: Array<{\n field: string;\n operator: { type: string };\n value: any;\n }>;\n logic?: 'and' | 'or';\n}\n\nexport interface ProductByBrandResult {\n brand: string;\n brandId?: string;\n manufacturer: string;\n manufacturerId?: string;\n productCount: number;\n totalValue: number;\n averagePrice: number;\n minPrice: number;\n maxPrice: number;\n categories: string;\n}\n\nexport interface GetProductListQueryResult {\n items: ProductByBrandResult[];\n total: number;\n summary?: Record<string, number | null>;\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GetProductListQuery implements AXPQuery<GetProductListQueryInput, GetProductListQueryResult> {\n private readonly entityService = inject(AXPEntityService);\n private productService = this.entityService\n .withEntity(`${RootConfig.module.name}.${RootConfig.entities.product.name}`)\n .data<string, AXMProductCatalogProductEntityModel>();\n\n async fetch(input: GetProductListQueryInput | any): Promise<GetProductListQueryResult> {\n // Extract product-specific filters from AXPFilterClause format\n const extractedFilters = this.extractProductFilters(input.filters);\n\n // Separate custom filters from entity filters\n const entityFilters: GetProductListQueryInput['filters'] = [];\n let priceRangeFilter: string | undefined;\n\n if (extractedFilters && extractedFilters.length > 0) {\n for (const filter of extractedFilters) {\n if (filter.field === 'priceRange') {\n priceRangeFilter = filter.value;\n } else {\n entityFilters.push(filter);\n }\n }\n }\n\n // Get all products from storage with entity filters\n const allProductsResult = await this.productService.query({\n skip: 0,\n take: 10000, // Get all products for aggregation\n filter:\n entityFilters.length > 0\n ? ({\n logic: input.logic || 'and',\n filters: entityFilters,\n } as any)\n : undefined,\n });\n\n let allProducts = allProductsResult.items;\n\n // Apply custom price range filter after fetching\n if (priceRangeFilter && priceRangeFilter !== 'all') {\n allProducts = this.applyPriceRangeFilter(allProducts, priceRangeFilter);\n }\n\n // Group products by brand\n const brandGroups = new Map<string, AXMProductCatalogProductEntityModel[]>();\n\n for (const product of allProducts) {\n const brandKey = product.brand?.title || product.brandId || 'Unknown';\n\n if (!brandGroups.has(brandKey)) {\n brandGroups.set(brandKey, []);\n }\n\n brandGroups.get(brandKey)!.push(product);\n }\n\n // Aggregate data by brand\n const aggregatedResults: ProductByBrandResult[] = [];\n\n for (const [brandName, products] of brandGroups.entries()) {\n const prices = products.map((p) => p.basePrice || 0).filter((p) => p > 0);\n const totalValue = prices.reduce((sum, price) => sum + price, 0);\n const productCount = products.length;\n const averagePrice = productCount > 0 ? totalValue / productCount : 0;\n const minPrice = prices.length > 0 ? Math.min(...prices) : 0;\n const maxPrice = prices.length > 0 ? Math.max(...prices) : 0;\n\n // Get unique categories\n const categorySet = new Set<string>();\n for (const product of products) {\n if (product.categories && Array.isArray(product.categories)) {\n for (const cat of product.categories) {\n if (cat.title) {\n categorySet.add(resolveMultiLanguageString(cat.title, 'en-US'));\n }\n }\n }\n }\n const categories = Array.from(categorySet).join(', ');\n\n // Get brand ID from first product\n const brandId = products[0]?.brandId || products[0]?.brand?.id;\n\n // Get manufacturer from first product (assuming all products in a brand have same manufacturer)\n const manufacturerName =\n (products[0]?.manufacturer?.title != null\n ? resolveMultiLanguageString(products[0].manufacturer!.title, 'en-US')\n : '') ||\n products[0]?.manufacturerId ||\n 'Unknown';\n const manufacturerId = products[0]?.manufacturerId || products[0]?.manufacturer?.id;\n\n aggregatedResults.push({\n brand: brandName,\n brandId,\n manufacturer: manufacturerName,\n manufacturerId,\n productCount,\n totalValue: Number(totalValue.toFixed(2)),\n averagePrice: Number(averagePrice.toFixed(2)),\n minPrice: Number(minPrice.toFixed(2)),\n maxPrice: Number(maxPrice.toFixed(2)),\n categories,\n });\n }\n\n // Apply sorting if provided\n if (input.sort && input.sort.length > 0) {\n aggregatedResults.sort((a, b) => {\n for (const sortField of input.sort!) {\n const field = sortField.name as keyof ProductByBrandResult;\n const aValue = a[field];\n const bValue = b[field];\n const dir = sortField.dir === 'asc' ? 1 : -1;\n\n if (aValue === undefined && bValue === undefined) continue;\n if (aValue === undefined) return 1 * dir;\n if (bValue === undefined) return -1 * dir;\n\n if (aValue < bValue) return -1 * dir;\n if (aValue > bValue) return 1 * dir;\n }\n return 0;\n });\n }\n\n const summary = computeReportFooterSummary(\n aggregatedResults as unknown as Record<string, unknown>[],\n input.summary,\n );\n\n const skip = input.skip || 0;\n const take = input.take || 10;\n const total = aggregatedResults.length;\n const items = aggregatedResults.slice(skip, skip + take);\n\n return {\n items,\n total,\n summary,\n };\n }\n\n //#region ---- Filter Extraction ----\n\n /**\n * Extract product-specific filters from AXPFilterClause format\n * Maps report parameter paths to product entity field names\n */\n private extractProductFilters(parameters: any): GetProductListQueryInput['filters'] {\n const filters: GetProductListQueryInput['filters'] = [];\n const paramsAny = parameters as any;\n\n if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {\n return filters;\n }\n\n for (const filter of paramsAny.filters) {\n if (!filter?.field || filter?.value === undefined || filter?.value === null) {\n continue;\n }\n\n const field = filter.field;\n const value = filter.value;\n const operator = filter.operator || { type: 'equal' };\n\n // Handle product-specific field mappings\n if (field === 'brand') {\n // Brand filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'brandId',\n operator: { type: 'in' },\n value: value,\n });\n } else if (value) {\n filters.push({\n field: 'brandId',\n operator: { type: 'equal' },\n value: value,\n });\n }\n } else if (field === 'category') {\n // Category filter - can be array of IDs or single ID\n if (Array.isArray(value) && value.length > 0) {\n filters.push({\n field: 'categoryIds',\n operator: { type: 'contains' },\n value: value[0], // Use first category for contains check\n });\n } else if (value) {\n filters.push({\n field: 'categoryIds',\n operator: { type: 'contains' },\n value: value,\n });\n }\n } else if (field === 'status') {\n // Status filter - skip 'all' value\n if (value && value !== 'all') {\n filters.push({\n field: 'statusId',\n operator: { type: 'equal' },\n value: value,\n });\n }\n } else if (field === 'priceRange') {\n // Price range filter - custom logic handled in query\n filters.push({\n field: 'priceRange',\n operator: { type: 'equal' },\n value: value,\n });\n } else if (field === 'startDate' || field === 'endDate') {\n // Date filters - can be handled if needed\n // For now, skip as they might not be directly on product entity\n } else {\n // Direct field mapping\n filters.push({\n field: field,\n operator: operator,\n value: value,\n });\n }\n }\n\n return filters;\n }\n\n //#endregion\n\n //#region ---- Custom Filter Handlers ----\n\n /**\n * Apply custom price range filter to products\n */\n private applyPriceRangeFilter(\n products: AXMProductCatalogProductEntityModel[],\n priceRange: string,\n ): AXMProductCatalogProductEntityModel[] {\n return products.filter((product) => {\n const price = product.basePrice || 0;\n\n switch (priceRange) {\n case 'under-50':\n return price < 50;\n case '50-100':\n return price >= 50 && price < 100;\n case '100-500':\n return price >= 100 && price < 500;\n case '500-1000':\n return price >= 500 && price < 1000;\n case 'over-1000':\n return price >= 1000;\n default:\n return true;\n }\n });\n }\n\n //#endregion\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { GetProductListQuery } from './acorex-connectivity-mock-get-product-list.query-Bv1im5yj.mjs';
4
+
5
+ //#endregion
6
+ class GetProductPdfDataQuery {
7
+ constructor() {
8
+ this.productListQuery = inject(GetProductListQuery);
9
+ }
10
+ async fetch(input) {
11
+ // Extract product-specific filters from AXPFilterClause format
12
+ const extractedFilters = this.extractProductFilters(input.filters);
13
+ // Get the product list data to generate PDF content
14
+ const productListInput = {
15
+ skip: 0,
16
+ take: 10000, // Get all products for PDF
17
+ filters: extractedFilters,
18
+ logic: input.logic,
19
+ };
20
+ const productData = await this.productListQuery.fetch(productListInput);
21
+ // Generate a mock PDF base64 string
22
+ // In production, this would call an actual PDF generation service
23
+ const pdfBase64 = this.generateMockPdfBase64(productData);
24
+ return {
25
+ base64: pdfBase64,
26
+ filename: `Product_Report_${new Date().toISOString().split('T')[0]}.pdf`,
27
+ };
28
+ }
29
+ //#region ---- Filter Extraction ----
30
+ /**
31
+ * Extract product-specific filters from AXPFilterClause format
32
+ * Maps report parameter paths to product entity field names
33
+ */
34
+ extractProductFilters(parameters) {
35
+ const filters = [];
36
+ const paramsAny = parameters;
37
+ if (!paramsAny?.filters || !Array.isArray(paramsAny.filters)) {
38
+ return filters;
39
+ }
40
+ for (const filter of paramsAny.filters) {
41
+ if (!filter?.field || filter?.value === undefined || filter?.value === null) {
42
+ continue;
43
+ }
44
+ const field = filter.field;
45
+ const value = filter.value;
46
+ const operator = filter.operator || { type: 'equal' };
47
+ // Handle product-specific field mappings
48
+ if (field === 'brand') {
49
+ // Brand filter - can be array of IDs or single ID
50
+ if (Array.isArray(value) && value.length > 0) {
51
+ filters.push({
52
+ field: 'brandId',
53
+ operator: { type: 'in' },
54
+ value: value,
55
+ });
56
+ }
57
+ else if (value) {
58
+ filters.push({
59
+ field: 'brandId',
60
+ operator: { type: 'equal' },
61
+ value: value,
62
+ });
63
+ }
64
+ }
65
+ else if (field === 'category') {
66
+ // Category filter - can be array of IDs or single ID
67
+ if (Array.isArray(value) && value.length > 0) {
68
+ filters.push({
69
+ field: 'categoryIds',
70
+ operator: { type: 'contains' },
71
+ value: value[0], // Use first category for contains check
72
+ });
73
+ }
74
+ else if (value) {
75
+ filters.push({
76
+ field: 'categoryIds',
77
+ operator: { type: 'contains' },
78
+ value: value,
79
+ });
80
+ }
81
+ }
82
+ else if (field === 'status') {
83
+ // Status filter - skip 'all' value
84
+ if (value && value !== 'all') {
85
+ filters.push({
86
+ field: 'statusId',
87
+ operator: { type: 'equal' },
88
+ value: value,
89
+ });
90
+ }
91
+ }
92
+ else if (field === 'priceRange') {
93
+ // Price range filter - custom logic handled in query
94
+ filters.push({
95
+ field: 'priceRange',
96
+ operator: { type: 'equal' },
97
+ value: value,
98
+ });
99
+ }
100
+ else if (field === 'startDate' || field === 'endDate') {
101
+ // Date filters - can be handled if needed
102
+ // For now, skip as they might not be directly on product entity
103
+ }
104
+ else {
105
+ // Direct field mapping
106
+ filters.push({
107
+ field: field,
108
+ operator: operator,
109
+ value: value,
110
+ });
111
+ }
112
+ }
113
+ return filters;
114
+ }
115
+ //#endregion
116
+ //#region ---- PDF Generation Helpers ----
117
+ /**
118
+ * Generate a mock PDF base64 string
119
+ * In production, this would call an actual PDF generation service
120
+ */
121
+ generateMockPdfBase64(productData) {
122
+ // Create a minimal valid PDF with some content
123
+ // This is a very basic PDF structure for demonstration
124
+ // In production, use a proper PDF library like jsPDF or call a backend service
125
+ const pdfContent = this.createSimplePdf(productData);
126
+ // Convert to base64
127
+ const base64 = btoa(pdfContent);
128
+ return base64;
129
+ }
130
+ /**
131
+ * Create a simple PDF document structure
132
+ * This is a minimal valid PDF for demonstration - in production use a proper PDF library
133
+ */
134
+ createSimplePdf(productData) {
135
+ // Use a minimal valid PDF structure that browsers can render
136
+ // This is a very basic single-page PDF
137
+ const pdf = `%PDF-1.4
138
+ 1 0 obj
139
+ << /Type /Catalog /Pages 2 0 R >>
140
+ endobj
141
+ 2 0 obj
142
+ << /Type /Pages /Kids [3 0 R] /Count 1 >>
143
+ endobj
144
+ 3 0 obj
145
+ << /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>
146
+ endobj
147
+ 4 0 obj
148
+ << /Length 200 >>
149
+ stream
150
+ BT
151
+ /F1 12 Tf
152
+ 100 700 Td
153
+ (Product Report) Tj
154
+ 0 -20 Td
155
+ (Total Brands: ${productData.total}) Tj
156
+ 0 -20 Td
157
+ (Generated: ${new Date().toLocaleDateString()}) Tj
158
+ 0 -20 Td
159
+ (Items: ${productData.items.length}) Tj
160
+ ET
161
+ endstream
162
+ endobj
163
+ 5 0 obj
164
+ << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>
165
+ endobj
166
+ xref
167
+ 0 6
168
+ 0000000000 65535 f
169
+ 0000000009 00000 n
170
+ 0000000058 00000 n
171
+ 0000000115 00000 n
172
+ 0000000317 00000 n
173
+ 0000000444 00000 n
174
+ trailer
175
+ << /Size 6 /Root 1 0 R >>
176
+ startxref
177
+ 527
178
+ %%EOF`;
179
+ return pdf;
180
+ }
181
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductPdfDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
182
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductPdfDataQuery, providedIn: 'root' }); }
183
+ }
184
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: GetProductPdfDataQuery, decorators: [{
185
+ type: Injectable,
186
+ args: [{
187
+ providedIn: 'root',
188
+ }]
189
+ }] });
190
+
191
+ export { GetProductPdfDataQuery };
192
+ //# sourceMappingURL=acorex-connectivity-mock-get-product-pdf-data.query-Cp65_mpB.mjs.map