@acorex/connectivity 21.0.0-next.3 → 21.0.0-next.5

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 (24) hide show
  1. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs +115 -0
  2. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map +1 -0
  3. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs +163 -0
  4. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map +1 -0
  5. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs +97 -0
  6. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map +1 -0
  7. package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs +157 -0
  8. package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map +1 -0
  9. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs +56 -0
  10. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs.map +1 -0
  11. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs +168 -0
  12. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs.map +1 -0
  13. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs +180 -0
  14. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map +1 -0
  15. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs +56 -0
  16. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map +1 -0
  17. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs +216 -0
  18. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map +1 -0
  19. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs +134 -0
  20. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs.map +1 -0
  21. package/fesm2022/acorex-connectivity-mock.mjs +4585 -6501
  22. package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
  23. package/mock/index.d.ts +35 -253
  24. package/package.json +2 -2
@@ -0,0 +1,115 @@
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/application-management';
5
+
6
+ //#endregion
7
+ class GetApplicationVersionsChartDataQuery {
8
+ constructor() {
9
+ this.entityService = inject(AXPEntityService);
10
+ this.appVersionService = this.entityService
11
+ .withEntity(`${RootConfig.module.name}.${RootConfig.entities.appVersion.name}`)
12
+ .data();
13
+ }
14
+ async fetch(input) {
15
+ // Get all app versions from storage (no pagination for charts)
16
+ const allVersionsResult = await this.appVersionService.query({
17
+ skip: 0,
18
+ take: 10000, // Get all versions for aggregation
19
+ filter: input.filters && input.filters.length > 0
20
+ ? {
21
+ logic: input.logic || 'and',
22
+ filters: input.filters,
23
+ }
24
+ : undefined,
25
+ });
26
+ let allVersions = allVersionsResult.items;
27
+ // Apply custom filters after fetching
28
+ if (input.filters) {
29
+ for (const filter of input.filters) {
30
+ if (filter.field === 'dateRange' && filter.value) {
31
+ allVersions = this.applyDateRangeFilter(allVersions, filter.value);
32
+ }
33
+ if (filter.field === 'versionNumber' && filter.value) {
34
+ allVersions = this.applyVersionNumberFilter(allVersions, filter.value);
35
+ }
36
+ }
37
+ }
38
+ // Group versions by month for chart aggregation
39
+ const monthGroups = new Map();
40
+ for (const version of allVersions) {
41
+ const publishDate = new Date(version.publishDate);
42
+ const year = publishDate.getFullYear();
43
+ const month = publishDate.getMonth() + 1;
44
+ const monthKey = `${year}-${String(month).padStart(2, '0')}`;
45
+ if (!monthGroups.has(monthKey)) {
46
+ monthGroups.set(monthKey, []);
47
+ }
48
+ monthGroups.get(monthKey).push(version);
49
+ }
50
+ // Aggregate data by month for chart
51
+ const chartResults = [];
52
+ for (const [monthKey, versions] of monthGroups.entries()) {
53
+ const [year, month] = monthKey.split('-');
54
+ const publishDate = new Date(parseInt(year), parseInt(month) - 1, 1);
55
+ const monthName = publishDate.toLocaleString('en-US', { month: 'long' });
56
+ const quarter = Math.ceil(parseInt(month) / 3);
57
+ const quarterName = `Q${quarter}`;
58
+ chartResults.push({
59
+ publishDate: publishDate.toISOString(),
60
+ month: monthName,
61
+ year: parseInt(year),
62
+ quarter: quarterName,
63
+ versionCount: versions.length,
64
+ });
65
+ }
66
+ // Sort by date ascending for timeline
67
+ chartResults.sort((a, b) => {
68
+ const dateA = new Date(a.publishDate).getTime();
69
+ const dateB = new Date(b.publishDate).getTime();
70
+ return dateA - dateB;
71
+ });
72
+ return {
73
+ items: chartResults,
74
+ };
75
+ }
76
+ //#region ---- Custom Filter Handlers ----
77
+ /**
78
+ * Apply date range filter to versions
79
+ */
80
+ applyDateRangeFilter(versions, dateRange) {
81
+ if (!dateRange || !dateRange.start || !dateRange.end) {
82
+ return versions;
83
+ }
84
+ const startDate = new Date(dateRange.start);
85
+ const endDate = new Date(dateRange.end);
86
+ endDate.setHours(23, 59, 59, 999); // Include the entire end date
87
+ return versions.filter((version) => {
88
+ const publishDate = new Date(version.publishDate);
89
+ return publishDate >= startDate && publishDate <= endDate;
90
+ });
91
+ }
92
+ /**
93
+ * Apply version number filter to versions
94
+ */
95
+ applyVersionNumberFilter(versions, versionNumber) {
96
+ if (!versionNumber) {
97
+ return versions;
98
+ }
99
+ const searchTerm = versionNumber.toLowerCase().trim();
100
+ return versions.filter((version) => {
101
+ return version.versionNumber.toLowerCase().includes(searchTerm);
102
+ });
103
+ }
104
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetApplicationVersionsChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
105
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetApplicationVersionsChartDataQuery, providedIn: 'root' }); }
106
+ }
107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetApplicationVersionsChartDataQuery, decorators: [{
108
+ type: Injectable,
109
+ args: [{
110
+ providedIn: 'root',
111
+ }]
112
+ }] });
113
+
114
+ export { GetApplicationVersionsChartDataQuery };
115
+ //# sourceMappingURL=acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs","sources":["../tmp-esm2022/mock/lib/application-management/reports/get-application-versions-chart-data.query.js"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { RootConfig } from '@acorex/modules/application-management';\nimport * as i0 from \"@angular/core\";\n//#endregion\nexport class GetApplicationVersionsChartDataQuery {\n constructor() {\n this.entityService = inject(AXPEntityService);\n this.appVersionService = this.entityService\n .withEntity(`${RootConfig.module.name}.${RootConfig.entities.appVersion.name}`)\n .data();\n }\n async fetch(input) {\n // Get all app versions from storage (no pagination for charts)\n const allVersionsResult = await this.appVersionService.query({\n skip: 0,\n take: 10000, // Get all versions for aggregation\n filter: input.filters && input.filters.length > 0\n ? {\n logic: input.logic || 'and',\n filters: input.filters,\n }\n : undefined,\n });\n let allVersions = allVersionsResult.items;\n // Apply custom filters after fetching\n if (input.filters) {\n for (const filter of input.filters) {\n if (filter.field === 'dateRange' && filter.value) {\n allVersions = this.applyDateRangeFilter(allVersions, filter.value);\n }\n if (filter.field === 'versionNumber' && filter.value) {\n allVersions = this.applyVersionNumberFilter(allVersions, filter.value);\n }\n }\n }\n // Group versions by month for chart aggregation\n const monthGroups = new Map();\n for (const version of allVersions) {\n const publishDate = new Date(version.publishDate);\n const year = publishDate.getFullYear();\n const month = publishDate.getMonth() + 1;\n const monthKey = `${year}-${String(month).padStart(2, '0')}`;\n if (!monthGroups.has(monthKey)) {\n monthGroups.set(monthKey, []);\n }\n monthGroups.get(monthKey).push(version);\n }\n // Aggregate data by month for chart\n const chartResults = [];\n for (const [monthKey, versions] of monthGroups.entries()) {\n const [year, month] = monthKey.split('-');\n const publishDate = new Date(parseInt(year), parseInt(month) - 1, 1);\n const monthName = publishDate.toLocaleString('en-US', { month: 'long' });\n const quarter = Math.ceil(parseInt(month) / 3);\n const quarterName = `Q${quarter}`;\n chartResults.push({\n publishDate: publishDate.toISOString(),\n month: monthName,\n year: parseInt(year),\n quarter: quarterName,\n versionCount: versions.length,\n });\n }\n // Sort by date ascending for timeline\n chartResults.sort((a, b) => {\n const dateA = new Date(a.publishDate).getTime();\n const dateB = new Date(b.publishDate).getTime();\n return dateA - dateB;\n });\n return {\n items: chartResults,\n };\n }\n //#region ---- Custom Filter Handlers ----\n /**\n * Apply date range filter to versions\n */\n applyDateRangeFilter(versions, dateRange) {\n if (!dateRange || !dateRange.start || !dateRange.end) {\n return versions;\n }\n const startDate = new Date(dateRange.start);\n const endDate = new Date(dateRange.end);\n endDate.setHours(23, 59, 59, 999); // Include the entire end date\n return versions.filter((version) => {\n const publishDate = new Date(version.publishDate);\n return publishDate >= startDate && publishDate <= endDate;\n });\n }\n /**\n * Apply version number filter to versions\n */\n applyVersionNumberFilter(versions, versionNumber) {\n if (!versionNumber) {\n return versions;\n }\n const searchTerm = versionNumber.toLowerCase().trim();\n return versions.filter((version) => {\n return version.versionNumber.toLowerCase().includes(searchTerm);\n });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetApplicationVersionsChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetApplicationVersionsChartDataQuery, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetApplicationVersionsChartDataQuery, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFwcGxpY2F0aW9uLXZlcnNpb25zLWNoYXJ0LWRhdGEucXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nvbm5lY3Rpdml0eS9tb2NrL3NyYy9saWIvYXBwbGljYXRpb24tbWFuYWdlbWVudC9yZXBvcnRzL2dldC1hcHBsaWNhdGlvbi12ZXJzaW9ucy1jaGFydC1kYXRhLnF1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUEwQnBFLFlBQVk7QUFLWixNQUFNLE9BQU8sb0NBQW9DO0lBSGpEO1FBTW1CLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDM0MsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDOUUsSUFBSSxFQUFvQyxDQUFDO0tBc0g3QztJQXBIQyxLQUFLLENBQUMsS0FBSyxDQUNULEtBQWdEO1FBRWhELCtEQUErRDtRQUMvRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztZQUMzRCxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxLQUFLLEVBQUUsbUNBQW1DO1lBQ2hELE1BQU0sRUFDSixLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBRTtvQkFDQyxLQUFLLEVBQUUsS0FBSyxD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QUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCLENBQzlCLFFBQW9DLEVBQ3BDLGFBQXFCO1FBRXJCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXRELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2pDLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQXpIVSxvQ0FBb0M7bUhBQXBDLG9DQUFvQyxjQUZuQyxNQUFNOzs0RkFFUCxvQ0FBb0M7a0JBSGhELFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWFBRdWVyeSB9IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vcnVudGltZSc7XG5pbXBvcnQgeyBBWFBFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9sYXlvdXQvZW50aXR5JztcbmltcG9ydCB7IEFYTUFwcFZlcnNpb25FbnRpdHlNb2RlbCB9IGZyb20gJ0BhY29yZXgvbW9kdWxlcy9hcHBsaWNhdGlvbi1tYW5hZ2VtZW50JztcbmltcG9ydCB7IFJvb3RDb25maWcgfSBmcm9tICdAYWNvcmV4L21vZHVsZXMvYXBwbGljYXRpb24tbWFuYWdlbWVudCc7XG5pbXBvcnQgeyBHZXRBcHBsaWNhdGlvblZlcnNpb25zVGltZWxpbmVRdWVyeUlucHV0IH0gZnJvbSAnLi9nZXQtYXBwbGljYXRpb24tdmVyc2lvbnMtdGltZWxpbmUucXVlcnknO1xuXG4vLyNyZWdpb24gLS0tLSAgIFF1ZXJ5IElucHV0L091dHB1dCBUeXBlcyAgIC0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRBcHBsaWNhdGlvblZlcnNpb25zQ2hhcnREYXRhUXVlcnlJbnB1dCB7XG4gIGZpbHRlcnM/OiBBcnJheTx7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBvcGVyYXRvcjogeyB0eXBlOiBzdHJpbmcgfTtcbiAgICB2YWx1ZTogYW55O1xuICB9PjtcbiAgbG9naWM/OiAnYW5kJyB8ICdvcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25WZXJzaW9uQ2hhcnREYXRhUmVzdWx0IHtcbiAgcHVibGlzaERhdGU6IHN0cmluZztcbiAgbW9udGg6IHN0cmluZztcbiAgeWVhcjogbnVtYmVyO1xuICBxdWFydGVyOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEFwcGxpY2F0aW9uVmVyc2lvbnNDaGFydERhdGFRdWVyeVJlc3VsdCB7XG4gIGl0ZW1zOiBBcHBsaWNhdGlvblZlcnNpb25DaGFydERhdGFSZXN1bHRbXTtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHZXRBcHBsaWNhdGlvblZlcnNpb25zQ2hhcnREYXRhUXVlcnlcbiAgaW1wbGVtZW50cyBBWFBRdWVyeTxHZXRBcHBsaWNhdGlvblZlcnNpb25zQ2hhcnREYXRhUXVlcnlJbnB1dCwgR2V0QXBwbGljYXRpb25WZXJzaW9uc0NoYXJ0RGF0YVF1ZXJ5UmVzdWx0Plxue1xuICBwcml2YXRlIHJlYWRvbmx5IGVudGl0eVNlcnZpY2UgPSBpbmplY3QoQVhQRW50aXR5U2VydmljZSk7XG4gIHByaXZhdGUgYXBwVmVyc2lvblNlcnZpY2UgPSB0aGlzLmVudGl0eVNlcnZpY2VcbiAgICAud2l0aEVudGl0eShgJHtSb290Q29uZmlnLm1vZHVsZS5uYW1lfS4ke1Jvb3RDb25maWcuZW50aXRpZXMuYXBwVmVyc2lvbi5uYW1lfWApXG4gICAgLmRhdGE8c3RyaW5nLCBBWE1BcHBWZXJzaW9uRW50aXR5TW9kZWw+KCk7XG5cbiAgYXN5bmMgZmV0Y2goXG4gICAgaW5wdXQ6IEdldEFwcGxpY2F0aW9uVmVyc2lvbnNDaGFydERhdGFRdWVyeUlucHV0XG4gICk6IFByb21pc2U8R2V0QXBwbGljYXRpb25WZXJzaW9uc0NoYXJ0RGF0YVF1ZXJ5UmVzdWx0PiB7XG4gICAgLy8gR2V0IGFsbCBhcHAgdmVyc2lvbnMgZnJvbSBzdG9yYWdlIChubyBwYWdpbmF0aW9uIGZvciBjaGFydHMpXG4gICAgY29uc3QgYWxsVmVyc2lvbnNSZXN1bHQgPSBhd2FpdCB0aGlzLmFwcFZlcnNpb25TZXJ2aWNlLnF1ZXJ5KHtcbiAgICAgIHNraXA6IDAsXG4gICAgICB0YWtlOiAxMDAwMCwgLy8gR2V0IGFsbCB2ZXJzaW9ucyBmb3IgYWdncmVnYXRpb25cbiAgICAgIGZpbHRlcjpcbiAgICAgICAgaW5wdXQuZmlsdGVycyAmJiBpbnB1dC5maWx0ZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgIGxvZ2ljOiBpbnB1dC5sb2dpYyB8fCAnYW5kJyxcbiAgICAgICAgICAgICAgZmlsdGVyczogaW5wdXQuZmlsdGVycyxcbiAgICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgbGV0IGFsbFZlcnNpb25zID0gYWxsVmVyc2lvbnNSZXN1bHQuaXRlbXM7XG5cbiAgICAvLyBBcHBseSBjdXN0b20gZmlsdGVycyBhZnRlciBmZXRjaGluZ1xuICAgIGlmIChpbnB1dC5maWx0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBpbnB1dC5maWx0ZXJzKSB7XG4gICAgICAgIGlmIChmaWx0ZXIuZmllbGQgPT09ICdkYXRlUmFuZ2UnICYmIGZpbHRlci52YWx1ZSkge1xuICAgICAgICAgIGFsbFZlcnNpb25zID0gdGhpcy5hcHBseURhdGVSYW5nZUZpbHRlcihhbGxWZXJzaW9ucywgZmlsdGVyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyLmZpZWxkID09PSAndmVyc2lvbk51bWJlcicgJiYgZmlsdGVyLnZhbHVlKSB7XG4gICAgICAgICAgYWxsVmVyc2lvbnMgPSB0aGlzLmFwcGx5VmVyc2lvbk51bWJlckZpbHRlcihhbGxWZXJzaW9ucywgZmlsdGVyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdyb3VwIHZlcnNpb25zIGJ5IG1vbnRoIGZvciBjaGFydCBhZ2dyZWdhdGlvblxuICAgIGNvbnN0IG1vbnRoR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIEFYTUFwcFZlcnNpb25FbnRpdHlNb2RlbFtdPigpO1xuXG4gICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIGFsbFZlcnNpb25zKSB7XG4gICAgICBjb25zdCBwdWJsaXNoRGF0ZSA9IG5ldyBEYXRlKHZlcnNpb24ucHVibGlzaERhdGUpO1xuICAgICAgY29uc3QgeWVhciA9IHB1Ymxpc2hEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICBjb25zdCBtb250aCA9IHB1Ymxpc2hEYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgY29uc3QgbW9udGhLZXkgPSBgJHt5ZWFyfS0ke1N0cmluZyhtb250aCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuXG4gICAgICBpZiAoIW1vbnRoR3JvdXBzLmhhcyhtb250aEtleSkpIHtcbiAgICAgICAgbW9udGhHcm91cHMuc2V0KG1vbnRoS2V5LCBbXSk7XG4gICAgICB9XG5cbiAgICAgIG1vbnRoR3JvdXBzLmdldChtb250aEtleSkhLnB1c2godmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gQWdncmVnYXRlIGRhdGEgYnkgbW9udGggZm9yIGNoYXJ0XG4gICAgY29uc3QgY2hhcnRSZXN1bHRzOiBBcHBsaWNhdGlvblZlcnNpb25DaGFydERhdGFSZXN1bHRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbW9udGhLZXksIHZlcnNpb25zXSBvZiBtb250aEdyb3Vwcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IFt5ZWFyLCBtb250aF0gPSBtb250aEtleS5zcGxpdCgnLScpO1xuICAgICAgY29uc3QgcHVibGlzaERhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh5ZWFyKSwgcGFyc2VJbnQobW9udGgpIC0gMSwgMSk7XG4gICAgICBjb25zdCBtb250aE5hbWUgPSBwdWJsaXNoRGF0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnbG9uZycgfSk7XG4gICAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKHBhcnNlSW50KG1vbnRoKSAvIDMpO1xuICAgICAgY29uc3QgcXVhcnRlck5hbWUgPSBgUSR7cXVhcnRlcn1gO1xuXG4gICAgICBjaGFydFJlc3VsdHMucHVzaCh7XG4gICAgICAgIHB1Ymxpc2hEYXRlOiBwdWJsaXNoRGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBtb250aDogbW9udGhOYW1lLFxuICAgICAgICB5ZWFyOiBwYXJzZUludCh5ZWFyKSxcbiAgICAgICAgcXVhcnRlcjogcXVhcnRlck5hbWUsXG4gICAgICAgIHZlcnNpb25Db3VudDogdmVyc2lvbnMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSBkYXRlIGFzY2VuZGluZyBmb3IgdGltZWxpbmVcbiAgICBjaGFydFJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgZGF0ZUEgPSBuZXcgRGF0ZShhLnB1Ymxpc2hEYXRlKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBkYXRlQiA9IG5ldyBEYXRlKGIucHVibGlzaERhdGUpLmdldFRpbWUoKTtcbiAgICAgIHJldHVybiBkYXRlQSAtIGRhdGVCO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiBjaGFydFJlc3VsdHMsXG4gICAgfTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiAtLS0tICAgQ3VzdG9tIEZpbHRlciBIYW5kbGVycyAgIC0tLS1cblxuICAvKipcbiAgICogQXBwbHkgZGF0ZSByYW5nZSBmaWx0ZXIgdG8gdmVyc2lvbnNcbiAgICovXG4gIHByaXZhdGUgYXBwbHlEYXRlUmFuZ2VGaWx0ZXIodmVyc2lvbnM6IEFYTUFwcFZlcnNpb25FbnRpdHlNb2RlbFtdLCBkYXRlUmFuZ2U6IGFueSk6IEFYTUFwcFZlcnNpb25FbnRpdHlNb2RlbFtdIHtcbiAgICBpZiAoIWRhdGVSYW5nZSB8fCAhZGF0ZVJhbmdlLnN0YXJ0IHx8ICFkYXRlUmFuZ2UuZW5kKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbnM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZGF0ZVJhbmdlLnN0YXJ0KTtcbiAgICBjb25zdCBlbmREYXRlID0gbmV3IERhdGUoZGF0ZVJhbmdlLmVuZCk7XG4gICAgZW5kRGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOyAvLyBJbmNsdWRlIHRoZSBlbnRpcmUgZW5kIGRhdGVcblxuICAgIHJldHVybiB2ZXJzaW9ucy5maWx0ZXIoKHZlcnNpb24pID0+IHtcbiAgICAgIGNvbnN0IHB1Ymxpc2hEYXRlID0gbmV3IERhdGUodmVyc2lvbi5wdWJsaXNoRGF0ZSk7XG4gICAgICByZXR1cm4gcHVibGlzaERhdGUgPj0gc3RhcnREYXRlICYmIHB1Ymxpc2hEYXRlIDw9IGVuZERhdGU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdmVyc2lvbiBudW1iZXIgZmlsdGVyIHRvIHZlcnNpb25zXG4gICAqL1xuICBwcml2YXRlIGFwcGx5VmVyc2lvbk51bWJlckZpbHRlcihcbiAgICB2ZXJzaW9uczogQVhNQXBwVmVyc2lvbkVudGl0eU1vZGVsW10sXG4gICAgdmVyc2lvbk51bWJlcjogc3RyaW5nXG4gICk6IEFYTUFwcFZlcnNpb25FbnRpdHlNb2RlbFtdIHtcbiAgICBpZiAoIXZlcnNpb25OdW1iZXIpIHtcbiAgICAgIHJldHVybiB2ZXJzaW9ucztcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdmVyc2lvbk51bWJlci50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgIHJldHVybiB2ZXJzaW9ucy5maWx0ZXIoKHZlcnNpb24pID0+IHtcbiAgICAgIHJldHVybiB2ZXJzaW9uLnZlcnNpb25OdW1iZXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuXG4iXX0="],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
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/application-management';
5
+
6
+ //#endregion
7
+ class GetApplicationVersionsTimelineQuery {
8
+ constructor() {
9
+ this.entityService = inject(AXPEntityService);
10
+ this.appVersionService = this.entityService
11
+ .withEntity(`${RootConfig.module.name}.${RootConfig.entities.appVersion.name}`)
12
+ .data();
13
+ }
14
+ async fetch(input) {
15
+ // Get all app versions from storage
16
+ const allVersionsResult = await this.appVersionService.query({
17
+ skip: 0,
18
+ take: 10000, // Get all versions for aggregation
19
+ filter: input.filters && input.filters.length > 0
20
+ ? {
21
+ logic: input.logic || 'and',
22
+ filters: input.filters,
23
+ }
24
+ : undefined,
25
+ });
26
+ let allVersions = allVersionsResult.items;
27
+ // Apply date range filter if provided
28
+ if (input.filters) {
29
+ for (const filter of input.filters) {
30
+ if (filter.field === 'dateRange' && filter.value) {
31
+ allVersions = this.applyDateRangeFilter(allVersions, filter.value);
32
+ }
33
+ if (filter.field === 'versionNumber' && filter.value) {
34
+ allVersions = this.applyVersionNumberFilter(allVersions, filter.value);
35
+ }
36
+ }
37
+ }
38
+ // Group versions by time period (month/quarter/year)
39
+ const periodGroups = new Map();
40
+ for (const version of allVersions) {
41
+ const publishDate = new Date(version.publishDate);
42
+ const year = publishDate.getFullYear();
43
+ const month = publishDate.getMonth() + 1;
44
+ const quarter = Math.ceil(month / 3);
45
+ const monthName = publishDate.toLocaleString('en-US', { month: 'long' });
46
+ const quarterName = `Q${quarter}`;
47
+ const periodKey = `${year}-${String(month).padStart(2, '0')}`;
48
+ if (!periodGroups.has(periodKey)) {
49
+ periodGroups.set(periodKey, []);
50
+ }
51
+ periodGroups.get(periodKey).push(version);
52
+ }
53
+ // Create timeline results
54
+ const timelineResults = [];
55
+ for (const version of allVersions) {
56
+ const publishDate = new Date(version.publishDate);
57
+ const year = publishDate.getFullYear();
58
+ const month = publishDate.getMonth() + 1;
59
+ const quarter = Math.ceil(month / 3);
60
+ const monthName = publishDate.toLocaleString('en-US', { month: 'long' });
61
+ const quarterName = `Q${quarter}`;
62
+ const periodKey = `${year}-${String(month).padStart(2, '0')}`;
63
+ const versionsInPeriod = periodGroups.get(periodKey)?.length || 0;
64
+ timelineResults.push({
65
+ versionNumber: version.versionNumber,
66
+ publishDate: version.publishDate,
67
+ publishDateObj: publishDate,
68
+ year,
69
+ month: monthName,
70
+ monthNumber: month,
71
+ quarter: quarterName,
72
+ versionCount: versionsInPeriod,
73
+ });
74
+ }
75
+ // Apply sorting if provided
76
+ if (input.sort && input.sort.length > 0) {
77
+ timelineResults.sort((a, b) => {
78
+ for (const sortField of input.sort) {
79
+ const field = sortField.field;
80
+ const aValue = a[field];
81
+ const bValue = b[field];
82
+ const dir = sortField.dir === 'asc' ? 1 : -1;
83
+ // Handle undefined values
84
+ if (aValue === undefined && bValue === undefined)
85
+ continue;
86
+ if (aValue === undefined)
87
+ return 1 * dir;
88
+ if (bValue === undefined)
89
+ return -1 * dir;
90
+ // Handle date comparison
91
+ if (field === 'publishDateObj') {
92
+ const aDate = a.publishDateObj.getTime();
93
+ const bDate = b.publishDateObj.getTime();
94
+ if (aDate < bDate)
95
+ return -1 * dir;
96
+ if (aDate > bDate)
97
+ return 1 * dir;
98
+ continue;
99
+ }
100
+ if (aValue < bValue)
101
+ return -1 * dir;
102
+ if (aValue > bValue)
103
+ return 1 * dir;
104
+ }
105
+ return 0;
106
+ });
107
+ }
108
+ else {
109
+ // Default sort by publish date descending (newest first)
110
+ timelineResults.sort((a, b) => {
111
+ return b.publishDateObj.getTime() - a.publishDateObj.getTime();
112
+ });
113
+ }
114
+ // Apply pagination
115
+ const skip = input.skip || 0;
116
+ const take = input.take || 10;
117
+ const total = timelineResults.length;
118
+ const items = timelineResults.slice(skip, skip + take);
119
+ return {
120
+ items,
121
+ total,
122
+ };
123
+ }
124
+ //#region ---- Custom Filter Handlers ----
125
+ /**
126
+ * Apply date range filter to versions
127
+ */
128
+ applyDateRangeFilter(versions, dateRange) {
129
+ if (!dateRange || !dateRange.start || !dateRange.end) {
130
+ return versions;
131
+ }
132
+ const startDate = new Date(dateRange.start);
133
+ const endDate = new Date(dateRange.end);
134
+ endDate.setHours(23, 59, 59, 999); // Include the entire end date
135
+ return versions.filter((version) => {
136
+ const publishDate = new Date(version.publishDate);
137
+ return publishDate >= startDate && publishDate <= endDate;
138
+ });
139
+ }
140
+ /**
141
+ * Apply version number filter to versions
142
+ */
143
+ applyVersionNumberFilter(versions, versionNumber) {
144
+ if (!versionNumber) {
145
+ return versions;
146
+ }
147
+ const searchTerm = versionNumber.toLowerCase().trim();
148
+ return versions.filter((version) => {
149
+ return version.versionNumber.toLowerCase().includes(searchTerm);
150
+ });
151
+ }
152
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetApplicationVersionsTimelineQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
153
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetApplicationVersionsTimelineQuery, providedIn: 'root' }); }
154
+ }
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetApplicationVersionsTimelineQuery, decorators: [{
156
+ type: Injectable,
157
+ args: [{
158
+ providedIn: 'root',
159
+ }]
160
+ }] });
161
+
162
+ export { GetApplicationVersionsTimelineQuery };
163
+ //# sourceMappingURL=acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs","sources":["../tmp-esm2022/mock/lib/application-management/reports/get-application-versions-timeline.query.js"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { RootConfig } from '@acorex/modules/application-management';\nimport * as i0 from \"@angular/core\";\n//#endregion\nexport class GetApplicationVersionsTimelineQuery {\n constructor() {\n this.entityService = inject(AXPEntityService);\n this.appVersionService = this.entityService\n .withEntity(`${RootConfig.module.name}.${RootConfig.entities.appVersion.name}`)\n .data();\n }\n async fetch(input) {\n // Get all app versions from storage\n const allVersionsResult = await this.appVersionService.query({\n skip: 0,\n take: 10000, // Get all versions for aggregation\n filter: input.filters && input.filters.length > 0\n ? {\n logic: input.logic || 'and',\n filters: input.filters,\n }\n : undefined,\n });\n let allVersions = allVersionsResult.items;\n // Apply date range filter if provided\n if (input.filters) {\n for (const filter of input.filters) {\n if (filter.field === 'dateRange' && filter.value) {\n allVersions = this.applyDateRangeFilter(allVersions, filter.value);\n }\n if (filter.field === 'versionNumber' && filter.value) {\n allVersions = this.applyVersionNumberFilter(allVersions, filter.value);\n }\n }\n }\n // Group versions by time period (month/quarter/year)\n const periodGroups = new Map();\n for (const version of allVersions) {\n const publishDate = new Date(version.publishDate);\n const year = publishDate.getFullYear();\n const month = publishDate.getMonth() + 1;\n const quarter = Math.ceil(month / 3);\n const monthName = publishDate.toLocaleString('en-US', { month: 'long' });\n const quarterName = `Q${quarter}`;\n const periodKey = `${year}-${String(month).padStart(2, '0')}`;\n if (!periodGroups.has(periodKey)) {\n periodGroups.set(periodKey, []);\n }\n periodGroups.get(periodKey).push(version);\n }\n // Create timeline results\n const timelineResults = [];\n for (const version of allVersions) {\n const publishDate = new Date(version.publishDate);\n const year = publishDate.getFullYear();\n const month = publishDate.getMonth() + 1;\n const quarter = Math.ceil(month / 3);\n const monthName = publishDate.toLocaleString('en-US', { month: 'long' });\n const quarterName = `Q${quarter}`;\n const periodKey = `${year}-${String(month).padStart(2, '0')}`;\n const versionsInPeriod = periodGroups.get(periodKey)?.length || 0;\n timelineResults.push({\n versionNumber: version.versionNumber,\n publishDate: version.publishDate,\n publishDateObj: publishDate,\n year,\n month: monthName,\n monthNumber: month,\n quarter: quarterName,\n versionCount: versionsInPeriod,\n });\n }\n // Apply sorting if provided\n if (input.sort && input.sort.length > 0) {\n timelineResults.sort((a, b) => {\n for (const sortField of input.sort) {\n const field = sortField.field;\n const aValue = a[field];\n const bValue = b[field];\n const dir = sortField.dir === 'asc' ? 1 : -1;\n // Handle undefined values\n if (aValue === undefined && bValue === undefined)\n continue;\n if (aValue === undefined)\n return 1 * dir;\n if (bValue === undefined)\n return -1 * dir;\n // Handle date comparison\n if (field === 'publishDateObj') {\n const aDate = a.publishDateObj.getTime();\n const bDate = b.publishDateObj.getTime();\n if (aDate < bDate)\n return -1 * dir;\n if (aDate > bDate)\n return 1 * dir;\n continue;\n }\n if (aValue < bValue)\n return -1 * dir;\n if (aValue > bValue)\n return 1 * dir;\n }\n return 0;\n });\n }\n else {\n // Default sort by publish date descending (newest first)\n timelineResults.sort((a, b) => {\n return b.publishDateObj.getTime() - a.publishDateObj.getTime();\n });\n }\n // Apply pagination\n const skip = input.skip || 0;\n const take = input.take || 10;\n const total = timelineResults.length;\n const items = timelineResults.slice(skip, skip + take);\n return {\n items,\n total,\n };\n }\n //#region ---- Custom Filter Handlers ----\n /**\n * Apply date range filter to versions\n */\n applyDateRangeFilter(versions, dateRange) {\n if (!dateRange || !dateRange.start || !dateRange.end) {\n return versions;\n }\n const startDate = new Date(dateRange.start);\n const endDate = new Date(dateRange.end);\n endDate.setHours(23, 59, 59, 999); // Include the entire end date\n return versions.filter((version) => {\n const publishDate = new Date(version.publishDate);\n return publishDate >= startDate && publishDate <= endDate;\n });\n }\n /**\n * Apply version number filter to versions\n */\n applyVersionNumberFilter(versions, versionNumber) {\n if (!versionNumber) {\n return versions;\n }\n const searchTerm = versionNumber.toLowerCase().trim();\n return versions.filter((version) => {\n return version.versionNumber.toLowerCase().includes(searchTerm);\n });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetApplicationVersionsTimelineQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetApplicationVersionsTimelineQuery, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetApplicationVersionsTimelineQuery, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFwcGxpY2F0aW9uLXZlcnNpb25zLXRpbWVsaW5lLnF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb25uZWN0aXZpdHkvbW9jay9zcmMvbGliL2FwcGxpY2F0aW9uLW1hbmFnZW1lbnQvcmVwb3J0cy9nZXQtYXBwbGljYXRpb24tdmVyc2lvbnMtdGltZWxpbmUucXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOztBQWdDcEUsWUFBWTtBQUtaLE1BQU0sT0FBTyxtQ0FBbUM7SUFIaEQ7UUFPbUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxzQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYTthQUMzQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUM5RSxJQUFJLEVBQW9DLENBQUM7S0FpSzdDO0lBL0pDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBK0M7UUFDekQsb0NBQW9DO1FBQ3BDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1lBQzNELElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLEtBQUssRUFBRSxtQ0FBbUM7WUFDaEQsTUFBTSxFQUNKLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDdkMsQ0FBQyxDQUFFO29CQUNELEtBQUssRUFBRSxLQUFLLENBQUMs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TyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDakMsT0FBTyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBcktVLG1DQUFtQzttSEFBbkMsbUNBQW1DLGNBRmxDLE1BQU07OzRGQUVQLG1DQUFtQztrQkFIL0MsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUFF1ZXJ5IH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9ydW50aW1lJztcbmltcG9ydCB7IEFYUEVudGl0eVNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9lbnRpdHknO1xuaW1wb3J0IHsgQVhNQXBwVmVyc2lvbkVudGl0eU1vZGVsIH0gZnJvbSAnQGFjb3JleC9tb2R1bGVzL2FwcGxpY2F0aW9uLW1hbmFnZW1lbnQnO1xuaW1wb3J0IHsgUm9vdENvbmZpZyB9IGZyb20gJ0BhY29yZXgvbW9kdWxlcy9hcHBsaWNhdGlvbi1tYW5hZ2VtZW50JztcblxuLy8jcmVnaW9uIC0tLS0gICBRdWVyeSBJbnB1dC9PdXRwdXQgVHlwZXMgICAtLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXBwbGljYXRpb25WZXJzaW9uc1RpbWVsaW5lUXVlcnlJbnB1dCB7XG4gIHNraXA/OiBudW1iZXI7XG4gIHRha2U/OiBudW1iZXI7XG4gIHNvcnQ/OiBBcnJheTx7IGZpZWxkOiBzdHJpbmc7IGRpcjogJ2FzYycgfCAnZGVzYycgfT47XG4gIGZpbHRlcnM/OiBBcnJheTx7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBvcGVyYXRvcjogeyB0eXBlOiBzdHJpbmcgfTtcbiAgICB2YWx1ZTogYW55O1xuICB9PjtcbiAgbG9naWM/OiAnYW5kJyB8ICdvcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25WZXJzaW9uVGltZWxpbmVSZXN1bHQge1xuICB2ZXJzaW9uTnVtYmVyOiBzdHJpbmc7XG4gIHB1Ymxpc2hEYXRlOiBzdHJpbmc7XG4gIHB1Ymxpc2hEYXRlT2JqOiBEYXRlO1xuICB5ZWFyOiBudW1iZXI7XG4gIG1vbnRoOiBzdHJpbmc7XG4gIG1vbnRoTnVtYmVyOiBudW1iZXI7XG4gIHF1YXJ0ZXI6IHN0cmluZztcbiAgdmVyc2lvbkNvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXBwbGljYXRpb25WZXJzaW9uc1RpbWVsaW5lUXVlcnlSZXN1bHQge1xuICBpdGVtczogQXBwbGljYXRpb25WZXJzaW9uVGltZWxpbmVSZXN1bHRbXTtcbiAgdG90YWw6IG51bWJlcjtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHZXRBcHBsaWNhdGlvblZlcnNpb25zVGltZWxpbmVRdWVyeVxuICBpbXBsZW1lbnRzIEFYUFF1ZXJ5PEdldEFwcGxpY2F0aW9uVmVyc2lvbnNUaW1lbGluZVF1ZXJ5SW5wdXQsIEdldEFwcGxpY2F0aW9uVmVyc2lvbnNUaW1lbGluZVF1ZXJ5UmVzdWx0PiB7XG5cblxuICBwcml2YXRlIHJlYWRvbmx5IGVudGl0eVNlcnZpY2UgPSBpbmplY3QoQVhQRW50aXR5U2VydmljZSk7XG4gIHByaXZhdGUgYXBwVmVyc2lvblNlcnZpY2UgPSB0aGlzLmVudGl0eVNlcnZpY2VcbiAgICAud2l0aEVudGl0eShgJHtSb290Q29uZmlnLm1vZHVsZS5uYW1lfS4ke1Jvb3RDb25maWcuZW50aXRpZXMuYXBwVmVyc2lvbi5uYW1lfWApXG4gICAgLmRhdGE8c3RyaW5nLCBBWE1BcHBWZXJzaW9uRW50aXR5TW9kZWw+KCk7XG5cbiAgYXN5bmMgZmV0Y2goaW5wdXQ6IEdldEFwcGxpY2F0aW9uVmVyc2lvbnNUaW1lbGluZVF1ZXJ5SW5wdXQpOiBQcm9taXNlPEdldEFwcGxpY2F0aW9uVmVyc2lvbnNUaW1lbGluZVF1ZXJ5UmVzdWx0PiB7XG4gICAgLy8gR2V0IGFsbCBhcHAgdmVyc2lvbnMgZnJvbSBzdG9yYWdlXG4gICAgY29uc3QgYWxsVmVyc2lvbnNSZXN1bHQgPSBhd2FpdCB0aGlzLmFwcFZlcnNpb25TZXJ2aWNlLnF1ZXJ5KHtcbiAgICAgIHNraXA6IDAsXG4gICAgICB0YWtlOiAxMDAwMCwgLy8gR2V0IGFsbCB2ZXJzaW9ucyBmb3IgYWdncmVnYXRpb25cbiAgICAgIGZpbHRlcjpcbiAgICAgICAgaW5wdXQuZmlsdGVycyAmJiBpbnB1dC5maWx0ZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/ICh7XG4gICAgICAgICAgICBsb2dpYzogaW5wdXQubG9naWMgfHwgJ2FuZCcsXG4gICAgICAgICAgICBmaWx0ZXJzOiBpbnB1dC5maWx0ZXJzLFxuICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgbGV0IGFsbFZlcnNpb25zID0gYWxsVmVyc2lvbnNSZXN1bHQuaXRlbXM7XG5cbiAgICAvLyBBcHBseSBkYXRlIHJhbmdlIGZpbHRlciBpZiBwcm92aWRlZFxuICAgIGlmIChpbnB1dC5maWx0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBpbnB1dC5maWx0ZXJzKSB7XG4gICAgICAgIGlmIChmaWx0ZXIuZmllbGQgPT09ICdkYXRlUmFuZ2UnICYmIGZpbHRlci52YWx1ZSkge1xuICAgICAgICAgIGFsbFZlcnNpb25zID0gdGhpcy5hcHBseURhdGVSYW5nZUZpbHRlcihhbGxWZXJzaW9ucywgZmlsdGVyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyLmZpZWxkID09PSAndmVyc2lvbk51bWJlcicgJiYgZmlsdGVyLnZhbHVlKSB7XG4gICAgICAgICAgYWxsVmVyc2lvbnMgPSB0aGlzLmFwcGx5VmVyc2lvbk51bWJlckZpbHRlcihhbGxWZXJzaW9ucywgZmlsdGVyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdyb3VwIHZlcnNpb25zIGJ5IHRpbWUgcGVyaW9kIChtb250aC9xdWFydGVyL3llYXIpXG4gICAgY29uc3QgcGVyaW9kR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIEFYTUFwcFZlcnNpb25FbnRpdHlNb2RlbFtdPigpO1xuXG4gICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIGFsbFZlcnNpb25zKSB7XG4gICAgICBjb25zdCBwdWJsaXNoRGF0ZSA9IG5ldyBEYXRlKHZlcnNpb24ucHVibGlzaERhdGUpO1xuICAgICAgY29uc3QgeWVhciA9IHB1Ymxpc2hEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICBjb25zdCBtb250aCA9IHB1Ymxpc2hEYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbChtb250aCAvIDMpO1xuICAgICAgY29uc3QgbW9udGhOYW1lID0gcHVibGlzaERhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ2xvbmcnIH0pO1xuICAgICAgY29uc3QgcXVhcnRlck5hbWUgPSBgUSR7cXVhcnRlcn1gO1xuICAgICAgY29uc3QgcGVyaW9kS2V5ID0gYCR7eWVhcn0tJHtTdHJpbmcobW9udGgpLnBhZFN0YXJ0KDIsICcwJyl9YDtcblxuICAgICAgaWYgKCFwZXJpb2RHcm91cHMuaGFzKHBlcmlvZEtleSkpIHtcbiAgICAgICAgcGVyaW9kR3JvdXBzLnNldChwZXJpb2RLZXksIFtdKTtcbiAgICAgIH1cblxuICAgICAgcGVyaW9kR3JvdXBzLmdldChwZXJpb2RLZXkpIS5wdXNoKHZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aW1lbGluZSByZXN1bHRzXG4gICAgY29uc3QgdGltZWxpbmVSZXN1bHRzOiBBcHBsaWNhdGlvblZlcnNpb25UaW1lbGluZVJlc3VsdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZlcnNpb24gb2YgYWxsVmVyc2lvbnMpIHtcbiAgICAgIGNvbnN0IHB1Ymxpc2hEYXRlID0gbmV3IERhdGUodmVyc2lvbi5wdWJsaXNoRGF0ZSk7XG4gICAgICBjb25zdCB5ZWFyID0gcHVibGlzaERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IG1vbnRoID0gcHVibGlzaERhdGUuZ2V0TW9udGgoKSArIDE7XG4gICAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKG1vbnRoIC8gMyk7XG4gICAgICBjb25zdCBtb250aE5hbWUgPSBwdWJsaXNoRGF0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnbG9uZycgfSk7XG4gICAgICBjb25zdCBxdWFydGVyTmFtZSA9IGBRJHtxdWFydGVyfWA7XG4gICAgICBjb25zdCBwZXJpb2RLZXkgPSBgJHt5ZWFyfS0ke1N0cmluZyhtb250aCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuXG4gICAgICBjb25zdCB2ZXJzaW9uc0luUGVyaW9kID0gcGVyaW9kR3JvdXBzLmdldChwZXJpb2RLZXkpPy5sZW5ndGggfHwgMDtcblxuICAgICAgdGltZWxpbmVSZXN1bHRzLnB1c2goe1xuICAgICAgICB2ZXJzaW9uTnVtYmVyOiB2ZXJzaW9uLnZlcnNpb25OdW1iZXIsXG4gICAgICAgIHB1Ymxpc2hEYXRlOiB2ZXJzaW9uLnB1Ymxpc2hEYXRlLFxuICAgICAgICBwdWJsaXNoRGF0ZU9iajogcHVibGlzaERhdGUsXG4gICAgICAgIHllYXIsXG4gICAgICAgIG1vbnRoOiBtb250aE5hbWUsXG4gICAgICAgIG1vbnRoTnVtYmVyOiBtb250aCxcbiAgICAgICAgcXVhcnRlcjogcXVhcnRlck5hbWUsXG4gICAgICAgIHZlcnNpb25Db3VudDogdmVyc2lvbnNJblBlcmlvZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHNvcnRpbmcgaWYgcHJvdmlkZWRcbiAgICBpZiAoaW5wdXQuc29ydCAmJiBpbnB1dC5zb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRpbWVsaW5lUmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc29ydEZpZWxkIG9mIGlucHV0LnNvcnQhKSB7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBzb3J0RmllbGQuZmllbGQgYXMga2V5b2YgQXBwbGljYXRpb25WZXJzaW9uVGltZWxpbmVSZXN1bHQ7XG4gICAgICAgICAgY29uc3QgYVZhbHVlID0gYVtmaWVsZF07XG4gICAgICAgICAgY29uc3QgYlZhbHVlID0gYltmaWVsZF07XG4gICAgICAgICAgY29uc3QgZGlyID0gc29ydEZpZWxkLmRpciA9PT0gJ2FzYycgPyAxIDogLTE7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgICAgIGlmIChhVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBiVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgaWYgKGFWYWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMSAqIGRpcjtcbiAgICAgICAgICBpZiAoYlZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAtMSAqIGRpcjtcblxuICAgICAgICAgIC8vIEhhbmRsZSBkYXRlIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoZmllbGQgPT09ICdwdWJsaXNoRGF0ZU9iaicpIHtcbiAgICAgICAgICAgIGNvbnN0IGFEYXRlID0gYS5wdWJsaXNoRGF0ZU9iai5nZXRUaW1lKCk7XG4gICAgICAgICAgICBjb25zdCBiRGF0ZSA9IGIucHVibGlzaERhdGVPYmouZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKGFEYXRlIDwgYkRhdGUpIHJldHVybiAtMSAqIGRpcjtcbiAgICAgICAgICAgIGlmIChhRGF0ZSA+IGJEYXRlKSByZXR1cm4gMSAqIGRpcjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhVmFsdWUgPCBiVmFsdWUpIHJldHVybiAtMSAqIGRpcjtcbiAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSByZXR1cm4gMSAqIGRpcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHNvcnQgYnkgcHVibGlzaCBkYXRlIGRlc2NlbmRpbmcgKG5ld2VzdCBmaXJzdClcbiAgICAgIHRpbWVsaW5lUmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBiLnB1Ymxpc2hEYXRlT2JqLmdldFRpbWUoKSAtIGEucHVibGlzaERhdGVPYmouZ2V0VGltZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgcGFnaW5hdGlvblxuICAgIGNvbnN0IHNraXAgPSBpbnB1dC5za2lwIHx8IDA7XG4gICAgY29uc3QgdGFrZSA9IGlucHV0LnRha2UgfHwgMTA7XG4gICAgY29uc3QgdG90YWwgPSB0aW1lbGluZVJlc3VsdHMubGVuZ3RoO1xuICAgIGNvbnN0IGl0ZW1zID0gdGltZWxpbmVSZXN1bHRzLnNsaWNlKHNraXAsIHNraXAgKyB0YWtlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtcyxcbiAgICAgIHRvdGFsLFxuICAgIH07XG4gIH1cblxuICAvLyNyZWdpb24gLS0tLSAgIEN1c3RvbSBGaWx0ZXIgSGFuZGxlcnMgICAtLS0tXG5cbiAgLyoqXG4gICAqIEFwcGx5IGRhdGUgcmFuZ2UgZmlsdGVyIHRvIHZlcnNpb25zXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RGF0ZVJhbmdlRmlsdGVyKHZlcnNpb25zOiBBWE1BcHBWZXJzaW9uRW50aXR5TW9kZWxbXSwgZGF0ZVJhbmdlOiBhbnkpOiBBWE1BcHBWZXJzaW9uRW50aXR5TW9kZWxbXSB7XG4gICAgaWYgKCFkYXRlUmFuZ2UgfHwgIWRhdGVSYW5nZS5zdGFydCB8fCAhZGF0ZVJhbmdlLmVuZCkge1xuICAgICAgcmV0dXJuIHZlcnNpb25zO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKGRhdGVSYW5nZS5zdGFydCk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlKGRhdGVSYW5nZS5lbmQpO1xuICAgIGVuZERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsgLy8gSW5jbHVkZSB0aGUgZW50aXJlIGVuZCBkYXRlXG5cbiAgICByZXR1cm4gdmVyc2lvbnMuZmlsdGVyKCh2ZXJzaW9uKSA9PiB7XG4gICAgICBjb25zdCBwdWJsaXNoRGF0ZSA9IG5ldyBEYXRlKHZlcnNpb24ucHVibGlzaERhdGUpO1xuICAgICAgcmV0dXJuIHB1Ymxpc2hEYXRlID49IHN0YXJ0RGF0ZSAmJiBwdWJsaXNoRGF0ZSA8PSBlbmREYXRlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHZlcnNpb24gbnVtYmVyIGZpbHRlciB0byB2ZXJzaW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVZlcnNpb25OdW1iZXJGaWx0ZXIoXG4gICAgdmVyc2lvbnM6IEFYTUFwcFZlcnNpb25FbnRpdHlNb2RlbFtdLFxuICAgIHZlcnNpb25OdW1iZXI6IHN0cmluZ1xuICApOiBBWE1BcHBWZXJzaW9uRW50aXR5TW9kZWxbXSB7XG4gICAgaWYgKCF2ZXJzaW9uTnVtYmVyKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbnM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybSA9IHZlcnNpb25OdW1iZXIudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICByZXR1cm4gdmVyc2lvbnMuZmlsdGVyKCh2ZXJzaW9uKSA9PiB7XG4gICAgICByZXR1cm4gdmVyc2lvbi52ZXJzaW9uTnVtYmVyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cblxuIl19"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
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
+ // Separate custom filters from entity filters
14
+ const entityFilters = [];
15
+ let priceRangeFilter;
16
+ if (input.filters && input.filters.length > 0) {
17
+ for (const filter of input.filters) {
18
+ if (filter.field === 'priceRange') {
19
+ priceRangeFilter = filter.value;
20
+ }
21
+ else {
22
+ entityFilters.push(filter);
23
+ }
24
+ }
25
+ }
26
+ // Get all products from storage with entity filters (no pagination for charts)
27
+ const allProductsResult = await this.productService.query({
28
+ skip: 0,
29
+ take: 10000, // Get all products for aggregation
30
+ filter: entityFilters.length > 0
31
+ ? {
32
+ logic: input.logic || 'and',
33
+ filters: entityFilters,
34
+ }
35
+ : undefined,
36
+ });
37
+ let allProducts = allProductsResult.items;
38
+ // Apply custom price range filter after fetching
39
+ if (priceRangeFilter && priceRangeFilter !== 'all') {
40
+ allProducts = this.applyPriceRangeFilter(allProducts, priceRangeFilter);
41
+ }
42
+ // Group products by brand
43
+ const brandGroups = new Map();
44
+ for (const product of allProducts) {
45
+ const brandKey = product.brand?.title || product.brandId || 'Unknown';
46
+ if (!brandGroups.has(brandKey)) {
47
+ brandGroups.set(brandKey, []);
48
+ }
49
+ brandGroups.get(brandKey).push(product);
50
+ }
51
+ // Aggregate data by brand for chart
52
+ const chartResults = [];
53
+ for (const [brandName, products] of brandGroups.entries()) {
54
+ chartResults.push({
55
+ brand: brandName,
56
+ productCount: products.length,
57
+ });
58
+ }
59
+ return {
60
+ items: chartResults,
61
+ };
62
+ }
63
+ //#region ---- Custom Filter Handlers ----
64
+ /**
65
+ * Apply custom price range filter to products
66
+ */
67
+ applyPriceRangeFilter(products, priceRange) {
68
+ return products.filter((product) => {
69
+ const price = product.basePrice || 0;
70
+ switch (priceRange) {
71
+ case 'under-50':
72
+ return price < 50;
73
+ case '50-100':
74
+ return price >= 50 && price < 100;
75
+ case '100-500':
76
+ return price >= 100 && price < 500;
77
+ case '500-1000':
78
+ return price >= 500 && price < 1000;
79
+ case 'over-1000':
80
+ return price >= 1000;
81
+ default:
82
+ return true;
83
+ }
84
+ });
85
+ }
86
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetProductChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
87
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetProductChartDataQuery, providedIn: 'root' }); }
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetProductChartDataQuery, decorators: [{
90
+ type: Injectable,
91
+ args: [{
92
+ providedIn: 'root',
93
+ }]
94
+ }] });
95
+
96
+ export { GetProductChartDataQuery };
97
+ //# sourceMappingURL=acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs","sources":["../tmp-esm2022/mock/lib/product-catalog/reports/get-product-chart-data.query.js"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { RootConfig } from '@acorex/modules/product-catalog';\nimport * as i0 from \"@angular/core\";\n//#endregion\nexport class GetProductChartDataQuery {\n constructor() {\n this.entityService = inject(AXPEntityService);\n this.productService = this.entityService.withEntity(`${RootConfig.module.name}.${RootConfig.entities.product.name}`).data();\n }\n async fetch(input) {\n // Separate custom filters from entity filters\n const entityFilters = [];\n let priceRangeFilter;\n if (input.filters && input.filters.length > 0) {\n for (const filter of input.filters) {\n if (filter.field === 'priceRange') {\n priceRangeFilter = filter.value;\n }\n else {\n entityFilters.push(filter);\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: entityFilters.length > 0\n ? {\n logic: input.logic || 'and',\n filters: entityFilters,\n }\n : undefined,\n });\n let allProducts = allProductsResult.items;\n // Apply custom price range filter after fetching\n if (priceRangeFilter && priceRangeFilter !== 'all') {\n allProducts = this.applyPriceRangeFilter(allProducts, priceRangeFilter);\n }\n // Group products by brand\n const brandGroups = new Map();\n for (const product of allProducts) {\n const brandKey = product.brand?.title || product.brandId || 'Unknown';\n if (!brandGroups.has(brandKey)) {\n brandGroups.set(brandKey, []);\n }\n brandGroups.get(brandKey).push(product);\n }\n // Aggregate data by brand for chart\n const chartResults = [];\n for (const [brandName, products] of brandGroups.entries()) {\n chartResults.push({\n brand: brandName,\n productCount: products.length,\n });\n }\n return {\n items: chartResults,\n };\n }\n //#region ---- Custom Filter Handlers ----\n /**\n * Apply custom price range filter to products\n */\n applyPriceRangeFilter(products, priceRange) {\n return products.filter((product) => {\n const price = product.basePrice || 0;\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 static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetProductChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetProductChartDataQuery, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetProductChartDataQuery, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXByb2R1Y3QtY2hhcnQtZGF0YS5xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29ubmVjdGl2aXR5L21vY2svc3JjL2xpYi9wcm9kdWN0LWNhdGFsb2cvcmVwb3J0cy9nZXQtcHJvZHVjdC1jaGFydC1kYXRhLnF1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFtQyxNQUFNLGVBQWUsQ0FBQztBQUVwRixPQUFPLEVBQTRCLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQXVCN0QsWUFBWTtBQUtaLE1BQU0sT0FBTyx3QkFBd0I7SUFIckM7UUFJbUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQStDLENBQUM7S0ErRjdLO0lBN0ZDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBb0M7UUFDOUMsOENBQThDO1FBQzlDLE1BQU0sYUFBYSxHQUE2QyxFQUFFLENBQUM7UUFDbkUsSUFBSSxnQkFBb0MsQ0FBQztRQUV6QyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25DLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDbEMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDbEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELCtFQUErRTtRQUMvRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDeEQsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsS0FBSyxFQUFFLG1DQUFtQztZQUNoRCxNQUFNLEVBQ0osYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUN0QixDQUFDLENBQUU7b0JBQ0QsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSztvQkFDM0IsT0FBTyxFQUFFLGFBQWE7aUJBQ2Y7Z0JBQ1QsQ0FBQyxDQUFDLFNBQVM7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1FBRTFDLGlEQUFpRDtRQUNqRCxJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25ELFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBaUQsQ0FBQztRQUU3RSxLQUFLLE1BQU0sT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDO1lBRXRFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sWUFBWSxHQUE2QixFQUFFLENBQUM7UUFFbEQsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzFELFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLEtBQUssRUFBRSxTQUFTO2dCQUNoQixZQUFZLEVBQUUsUUFBUSxDQUFDLE1BQU07YUFDOUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU87WUFDTCxLQUFLLEVBQUUsWUFBWTtTQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVELDhDQUE4QztJQUU5Qzs7T0FFRztJQUNLLHFCQUFxQixDQUMzQixRQUErQyxFQUMvQyxVQUFrQjtRQUVsQixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNqQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztZQUVyQyxRQUFRLFVBQVUsRUFBRSxDQUFDO2dCQUNuQixLQUFLLFVBQVU7b0JBQ2IsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixLQUFLLFFBQVE7b0JBQ1gsT0FBTyxLQUFLLElBQUksRUFBRSxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7Z0JBQ3BDLEtBQUssU0FBUztvQkFDWixPQUFPLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDckMsS0FBSyxVQUFVO29CQUNiLE9BQU8sS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUN0QyxLQUFLLFdBQVc7b0JBQ2QsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDO2dCQUN2QjtvQkFDRSxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTlGVSx3QkFBd0I7bUhBQXhCLHdCQUF3QixjQUZ2QixNQUFNOzs0RkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWFBRdWVyeSB9IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vcnVudGltZSc7XG5pbXBvcnQgeyBBWE1FbnRpdHlDcnVkU2VydmljZUltcGwsIEFYUEVudGl0eVNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9lbnRpdHknO1xuaW1wb3J0IHsgQVhNUHJvZHVjdENhdGFsb2dQcm9kdWN0RW50aXR5TW9kZWwgfSBmcm9tICdAYWNvcmV4L21vZHVsZXMvcHJvZHVjdC1jYXRhbG9nJztcbmltcG9ydCB7IFJvb3RDb25maWcgfSBmcm9tICdAYWNvcmV4L21vZHVsZXMvcHJvZHVjdC1jYXRhbG9nJztcbmltcG9ydCB7IEdldFByb2R1Y3RMaXN0UXVlcnlJbnB1dCB9IGZyb20gJy4vZ2V0LXByb2R1Y3QtbGlzdC5xdWVyeSc7XG5cbi8vI3JlZ2lvbiAtLS0tICAgUXVlcnkgSW5wdXQvT3V0cHV0IFR5cGVzICAgLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFByb2R1Y3RDaGFydERhdGFRdWVyeUlucHV0IHtcbiAgZmlsdGVycz86IEFycmF5PHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiB7IHR5cGU6IHN0cmluZyB9O1xuICAgIHZhbHVlOiBhbnk7XG4gIH0+O1xuICBsb2dpYz86ICdhbmQnIHwgJ29yJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0Q2hhcnREYXRhUmVzdWx0IHtcbiAgYnJhbmQ6IHN0cmluZztcbiAgcHJvZHVjdENvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UHJvZHVjdENoYXJ0RGF0YVF1ZXJ5UmVzdWx0IHtcbiAgaXRlbXM6IFByb2R1Y3RDaGFydERhdGFSZXN1bHRbXTtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHZXRQcm9kdWN0Q2hhcnREYXRhUXVlcnkgaW1wbGVtZW50cyBBWFBRdWVyeTxHZXRQcm9kdWN0Q2hhcnREYXRhUXVlcnlJbnB1dCwgR2V0UHJvZHVjdENoYXJ0RGF0YVF1ZXJ5UmVzdWx0PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW50aXR5U2VydmljZSA9IGluamVjdChBWFBFbnRpdHlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBwcm9kdWN0U2VydmljZSA9IHRoaXMuZW50aXR5U2VydmljZS53aXRoRW50aXR5KGAke1Jvb3RDb25maWcubW9kdWxlLm5hbWV9LiR7Um9vdENvbmZpZy5lbnRpdGllcy5wcm9kdWN0Lm5hbWV9YCkuZGF0YTxzdHJpbmcsIEFYTVByb2R1Y3RDYXRhbG9nUHJvZHVjdEVudGl0eU1vZGVsPigpO1xuXG4gIGFzeW5jIGZldGNoKGlucHV0OiBHZXRQcm9kdWN0Q2hhcnREYXRhUXVlcnlJbnB1dCk6IFByb21pc2U8R2V0UHJvZHVjdENoYXJ0RGF0YVF1ZXJ5UmVzdWx0PiB7XG4gICAgLy8gU2VwYXJhdGUgY3VzdG9tIGZpbHRlcnMgZnJvbSBlbnRpdHkgZmlsdGVyc1xuICAgIGNvbnN0IGVudGl0eUZpbHRlcnM6IEdldFByb2R1Y3RDaGFydERhdGFRdWVyeUlucHV0WydmaWx0ZXJzJ10gPSBbXTtcbiAgICBsZXQgcHJpY2VSYW5nZUZpbHRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlucHV0LmZpbHRlcnMgJiYgaW5wdXQuZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBpbnB1dC5maWx0ZXJzKSB7XG4gICAgICAgIGlmIChmaWx0ZXIuZmllbGQgPT09ICdwcmljZVJhbmdlJykge1xuICAgICAgICAgIHByaWNlUmFuZ2VGaWx0ZXIgPSBmaWx0ZXIudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50aXR5RmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWxsIHByb2R1Y3RzIGZyb20gc3RvcmFnZSB3aXRoIGVudGl0eSBmaWx0ZXJzIChubyBwYWdpbmF0aW9uIGZvciBjaGFydHMpXG4gICAgY29uc3QgYWxsUHJvZHVjdHNSZXN1bHQgPSBhd2FpdCB0aGlzLnByb2R1Y3RTZXJ2aWNlLnF1ZXJ5KHtcbiAgICAgIHNraXA6IDAsXG4gICAgICB0YWtlOiAxMDAwMCwgLy8gR2V0IGFsbCBwcm9kdWN0cyBmb3IgYWdncmVnYXRpb25cbiAgICAgIGZpbHRlcjpcbiAgICAgICAgZW50aXR5RmlsdGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgPyAoe1xuICAgICAgICAgICAgbG9naWM6IGlucHV0LmxvZ2ljIHx8ICdhbmQnLFxuICAgICAgICAgICAgZmlsdGVyczogZW50aXR5RmlsdGVycyxcbiAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGxldCBhbGxQcm9kdWN0cyA9IGFsbFByb2R1Y3RzUmVzdWx0Lml0ZW1zO1xuXG4gICAgLy8gQXBwbHkgY3VzdG9tIHByaWNlIHJhbmdlIGZpbHRlciBhZnRlciBmZXRjaGluZ1xuICAgIGlmIChwcmljZVJhbmdlRmlsdGVyICYmIHByaWNlUmFuZ2VGaWx0ZXIgIT09ICdhbGwnKSB7XG4gICAgICBhbGxQcm9kdWN0cyA9IHRoaXMuYXBwbHlQcmljZVJhbmdlRmlsdGVyKGFsbFByb2R1Y3RzLCBwcmljZVJhbmdlRmlsdGVyKTtcbiAgICB9XG5cbiAgICAvLyBHcm91cCBwcm9kdWN0cyBieSBicmFuZFxuICAgIGNvbnN0IGJyYW5kR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIEFYTVByb2R1Y3RDYXRhbG9nUHJvZHVjdEVudGl0eU1vZGVsW10+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHByb2R1Y3Qgb2YgYWxsUHJvZHVjdHMpIHtcbiAgICAgIGNvbnN0IGJyYW5kS2V5ID0gcHJvZHVjdC5icmFuZD8udGl0bGUgfHwgcHJvZHVjdC5icmFuZElkIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFicmFuZEdyb3Vwcy5oYXMoYnJhbmRLZXkpKSB7XG4gICAgICAgIGJyYW5kR3JvdXBzLnNldChicmFuZEtleSwgW10pO1xuICAgICAgfVxuXG4gICAgICBicmFuZEdyb3Vwcy5nZXQoYnJhbmRLZXkpIS5wdXNoKHByb2R1Y3QpO1xuICAgIH1cblxuICAgIC8vIEFnZ3JlZ2F0ZSBkYXRhIGJ5IGJyYW5kIGZvciBjaGFydFxuICAgIGNvbnN0IGNoYXJ0UmVzdWx0czogUHJvZHVjdENoYXJ0RGF0YVJlc3VsdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFticmFuZE5hbWUsIHByb2R1Y3RzXSBvZiBicmFuZEdyb3Vwcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNoYXJ0UmVzdWx0cy5wdXNoKHtcbiAgICAgICAgYnJhbmQ6IGJyYW5kTmFtZSxcbiAgICAgICAgcHJvZHVjdENvdW50OiBwcm9kdWN0cy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IGNoYXJ0UmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgLy8jcmVnaW9uIC0tLS0gICBDdXN0b20gRmlsdGVyIEhhbmRsZXJzICAgLS0tLVxuXG4gIC8qKlxuICAgKiBBcHBseSBjdXN0b20gcHJpY2UgcmFuZ2UgZmlsdGVyIHRvIHByb2R1Y3RzXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UHJpY2VSYW5nZUZpbHRlcihcbiAgICBwcm9kdWN0czogQVhNUHJvZHVjdENhdGFsb2dQcm9kdWN0RW50aXR5TW9kZWxbXSxcbiAgICBwcmljZVJhbmdlOiBzdHJpbmdcbiAgKTogQVhNUHJvZHVjdENhdGFsb2dQcm9kdWN0RW50aXR5TW9kZWxbXSB7XG4gICAgcmV0dXJuIHByb2R1Y3RzLmZpbHRlcigocHJvZHVjdCkgPT4ge1xuICAgICAgY29uc3QgcHJpY2UgPSBwcm9kdWN0LmJhc2VQcmljZSB8fCAwO1xuXG4gICAgICBzd2l0Y2ggKHByaWNlUmFuZ2UpIHtcbiAgICAgICAgY2FzZSAndW5kZXItNTAnOlxuICAgICAgICAgIHJldHVybiBwcmljZSA8IDUwO1xuICAgICAgICBjYXNlICc1MC0xMDAnOlxuICAgICAgICAgIHJldHVybiBwcmljZSA+PSA1MCAmJiBwcmljZSA8IDEwMDtcbiAgICAgICAgY2FzZSAnMTAwLTUwMCc6XG4gICAgICAgICAgcmV0dXJuIHByaWNlID49IDEwMCAmJiBwcmljZSA8IDUwMDtcbiAgICAgICAgY2FzZSAnNTAwLTEwMDAnOlxuICAgICAgICAgIHJldHVybiBwcmljZSA+PSA1MDAgJiYgcHJpY2UgPCAxMDAwO1xuICAgICAgICBjYXNlICdvdmVyLTEwMDAnOlxuICAgICAgICAgIHJldHVybiBwcmljZSA+PSAxMDAwO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG59XG5cbiJdfQ=="],"names":[],"mappings":"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"}