@postxl/generators 1.0.14 → 1.1.1
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.
- package/dist/backend-core/template/apps/api/src/e2e.ts +13 -4
- package/dist/backend-router-trpc/generators/model-routes.generator.js +24 -3
- package/dist/backend-router-trpc/generators/model-routes.generator.js.map +1 -1
- package/dist/backend-router-trpc/router-trpc.generator.d.ts +2 -0
- package/dist/backend-router-trpc/router-trpc.generator.js +2 -0
- package/dist/backend-router-trpc/router-trpc.generator.js.map +1 -1
- package/dist/backend-view/model-view-service.generator.js +276 -0
- package/dist/backend-view/model-view-service.generator.js.map +1 -1
- package/dist/backend-view/template/filter.utils.test.ts +387 -0
- package/dist/backend-view/template/filter.utils.ts +218 -0
- package/dist/backend-view/view.generator.js +5 -1
- package/dist/backend-view/view.generator.js.map +1 -1
- package/dist/e2e/e2e.generator.js +2 -14
- package/dist/e2e/e2e.generator.js.map +1 -1
- package/dist/e2e/generators/docker-sh.generator.d.ts +2 -0
- package/dist/e2e/generators/docker-sh.generator.js +25 -0
- package/dist/e2e/generators/docker-sh.generator.js.map +1 -0
- package/dist/frontend-admin/generators/model-admin-page.generator.js +38 -8
- package/dist/frontend-admin/generators/model-admin-page.generator.js.map +1 -1
- package/dist/frontend-core/frontend.generator.js +1 -0
- package/dist/frontend-core/frontend.generator.js.map +1 -1
- package/dist/frontend-core/template/src/components/admin/table-filter-header-icon.tsx +30 -0
- package/dist/frontend-core/template/src/components/admin/table-filter.tsx +537 -0
- package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.stories.tsx +2 -1
- package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.tsx +10 -1
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-column-header.tsx +32 -2
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-types.ts +10 -2
- package/dist/frontend-core/template/src/context-providers/auth-context-provider.tsx +2 -5
- package/dist/frontend-core/template/src/styles/styles.css +14 -2
- package/dist/frontend-tables/generators/model-table.generator.js +69 -46
- package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
- package/dist/frontend-trpc-client/generators/model-hook.generator.js +33 -5
- package/dist/frontend-trpc-client/generators/model-hook.generator.js.map +1 -1
- package/dist/frontend-trpc-client/trpc-client.generator.d.ts +8 -0
- package/dist/frontend-trpc-client/trpc-client.generator.js +2 -0
- package/dist/frontend-trpc-client/trpc-client.generator.js.map +1 -1
- package/dist/types/generators/model-type.generator.d.ts +2 -0
- package/dist/types/generators/model-type.generator.js +241 -0
- package/dist/types/generators/model-type.generator.js.map +1 -1
- package/dist/types/template/filter.types.ts +70 -0
- package/dist/types/types.generator.d.ts +25 -0
- package/dist/types/types.generator.js +17 -0
- package/dist/types/types.generator.js.map +1 -1
- package/package.json +2 -2
- package/dist/e2e/template/scripts/docker.sh +0 -17
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
import { INestApplication } from '@nestjs/common'
|
|
73
73
|
|
|
74
74
|
import { getMemoryUsage } from 'apps/api/src/console.logger'
|
|
75
|
+
import { Mutex } from 'async-mutex'
|
|
75
76
|
import express, { Express, Request, Response } from 'express'
|
|
76
77
|
import http, { Server } from 'node:http'
|
|
77
78
|
import { format } from 'node:util'
|
|
@@ -159,13 +160,21 @@ const defaultBackendId = zSpecId.parse('default-backend')
|
|
|
159
160
|
const backends = new Map<SpecId, Backend>()
|
|
160
161
|
const usedPorts = new Set<Port>()
|
|
161
162
|
|
|
163
|
+
// Mutex to prevent race conditions when allocating ports
|
|
164
|
+
const portAllocationMutex = new Mutex()
|
|
165
|
+
|
|
162
166
|
async function getNextAvailablePort(): Promise<Port> {
|
|
167
|
+
const release = await portAllocationMutex.acquire()
|
|
163
168
|
let port: Port = 4000 as Port
|
|
164
|
-
|
|
165
|
-
port
|
|
169
|
+
try {
|
|
170
|
+
while (usedPorts.has(port) || !(await checkPortAvailability(port))) {
|
|
171
|
+
port = (port + 1) as Port
|
|
172
|
+
}
|
|
173
|
+
usedPorts.add(port)
|
|
174
|
+
return port
|
|
175
|
+
} finally {
|
|
176
|
+
release()
|
|
166
177
|
}
|
|
167
|
-
usedPorts.add(port)
|
|
168
|
-
return port
|
|
169
178
|
}
|
|
170
179
|
|
|
171
180
|
async function startBackend(spec: SpecId, isDefault: boolean): Promise<Backend_Running> {
|
|
@@ -41,6 +41,8 @@ const Generator = __importStar(require("@postxl/generator"));
|
|
|
41
41
|
function generateModelRoutes({ model, context }) {
|
|
42
42
|
const imports = Generator.ImportGenerator.from(model.trpcRoute._filePath)
|
|
43
43
|
.add(model.types.id.decoder)
|
|
44
|
+
.add(model.types.filter.decoder)
|
|
45
|
+
.add(model.types.filter.field)
|
|
44
46
|
.add({ name: context.trpcRouter._middleware.auth.name, location: context.trpcRouter._middleware._filePath })
|
|
45
47
|
.add({ name: context.trpcRouter._shared.procedure.name, location: context.trpcRouter._shared._filePath })
|
|
46
48
|
.add({ name: context.trpcRouter._shared.router.name, location: context.trpcRouter._shared._filePath });
|
|
@@ -60,8 +62,10 @@ function generateModelRoutes({ model, context }) {
|
|
|
60
62
|
}
|
|
61
63
|
}
|
|
62
64
|
const defaultValueMethod = `getDefault: ${context.trpcRouter._shared.procedure.name}.query(({ ctx }) => ctx.view.${model.view.service.variableName}.data.defaultValue),`;
|
|
65
|
+
const variableName = model.view.service.variableName;
|
|
63
66
|
return /* ts */ `
|
|
64
67
|
|
|
68
|
+
import { z } from 'zod'
|
|
65
69
|
${imports.generate()}
|
|
66
70
|
|
|
67
71
|
export const ${model.trpcRoute.name} = router({
|
|
@@ -70,15 +74,32 @@ function generateModelRoutes({ model, context }) {
|
|
|
70
74
|
${model.trpcRoute.get.name}: procedure
|
|
71
75
|
.use(authMiddleware)
|
|
72
76
|
.input(${model.types.id.decoder.name})
|
|
73
|
-
.query(({ input, ctx }) => ctx.view.${
|
|
77
|
+
.query(({ input, ctx }) => ctx.view.${variableName}.get({ id: input, user: ctx.user})),
|
|
74
78
|
|
|
75
79
|
${model.trpcRoute.getMap.name}: procedure
|
|
76
80
|
.use(authMiddleware)
|
|
77
|
-
.query(({ ctx }) => ctx.view.${
|
|
81
|
+
.query(({ ctx }) => ctx.view.${variableName}.getAll(ctx.user)),
|
|
78
82
|
|
|
79
83
|
${model.trpcRoute.getList.name}: procedure
|
|
80
84
|
.use(authMiddleware)
|
|
81
|
-
.query(({ ctx }) => ctx.view.${
|
|
85
|
+
.query(({ ctx }) => ctx.view.${variableName}.getList(ctx.user)),
|
|
86
|
+
|
|
87
|
+
${model.trpcRoute.getFiltered.name}: procedure
|
|
88
|
+
.use(authMiddleware)
|
|
89
|
+
.input(${model.types.filter.decoder.name})
|
|
90
|
+
.query(({ input, ctx }) => ctx.view.${variableName}.getFiltered({ filters: input, user: ctx.user })),
|
|
91
|
+
|
|
92
|
+
${model.trpcRoute.getFilterOptions.name}: procedure
|
|
93
|
+
.use(authMiddleware)
|
|
94
|
+
.input(
|
|
95
|
+
z.object({
|
|
96
|
+
field: z.enum(${model.types.filter.field.name}),
|
|
97
|
+
filters: ${model.types.filter.decoder.name},
|
|
98
|
+
}),
|
|
99
|
+
)
|
|
100
|
+
.query(({ input, ctx }) =>
|
|
101
|
+
ctx.view.${variableName}.getFilterOptions({ field: input.field, filters: input.filters, user: ctx.user }),
|
|
102
|
+
),
|
|
82
103
|
|
|
83
104
|
${mutations.join('\n')}
|
|
84
105
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-routes.generator.js","sourceRoot":"","sources":["../../../src/backend-router-trpc/generators/model-routes.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,
|
|
1
|
+
{"version":3,"file":"model-routes.generator.js","sourceRoot":"","sources":["../../../src/backend-router-trpc/generators/model-routes.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -101,6 +101,8 @@ export type TrpcRouterModelContext = Generator.ImportableFunction & {
|
|
|
101
101
|
get: Generator.ImportableFunction;
|
|
102
102
|
getMap: Generator.ImportableFunction;
|
|
103
103
|
getList: Generator.ImportableFunction;
|
|
104
|
+
getFiltered: Generator.ImportableFunction;
|
|
105
|
+
getFilterOptions: Generator.ImportableFunction;
|
|
104
106
|
};
|
|
105
107
|
export type RouterEnumContext = Generator.ImportableFunction;
|
|
106
108
|
export declare const generatorId: string & import("zod").BRAND<"PXL.GeneratorInterfaceId">;
|
|
@@ -183,6 +183,8 @@ function registerModelRouter(model) {
|
|
|
183
183
|
get: { name: Generator.toFunctionName(`get`), location },
|
|
184
184
|
getMap: { name: Generator.toFunctionName(`getMap`), location },
|
|
185
185
|
getList: { name: Generator.toFunctionName(`getList`), location },
|
|
186
|
+
getFiltered: { name: Generator.toFunctionName(`getFiltered`), location },
|
|
187
|
+
getFilterOptions: { name: Generator.toFunctionName(`getFilterOptions`), location },
|
|
186
188
|
};
|
|
187
189
|
return { ...model, trpcRoute: router };
|
|
188
190
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-trpc.generator.js","sourceRoot":"","sources":["../../src/backend-router-trpc/router-trpc.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAmC;AAEnC,6DAA8C;AAE9C,wDAA2E;AAC3E,sEAAuG;AACvG,kDAA+E;AAC/E,kEAA0F;AAC1F,sDAAyE;AACzE,kDAAkE;AAClE,kCAAmD;AAEnD,oCAAsD;AAEtD,4EAAqE;AACrE,sFAA8E;AAC9E,4EAAsE;AACtE,gFAAyE;AACzE,8EAAuF;AACvF,4FAAoF;AACpF,8EAAuE;AA4GvE,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,OAAO;CACnB,CAAA;
|
|
1
|
+
{"version":3,"file":"router-trpc.generator.js","sourceRoot":"","sources":["../../src/backend-router-trpc/router-trpc.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,12 +36,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.generateModelViewService = generateModelViewService;
|
|
37
37
|
exports.generateModelViewService_NoRepository = generateModelViewService_NoRepository;
|
|
38
38
|
const Generator = __importStar(require("@postxl/generator"));
|
|
39
|
+
const model_type_generator_1 = require("../types/generators/model-type.generator");
|
|
39
40
|
function generateModelViewService({ model, context }) {
|
|
40
41
|
const imports = Generator.ImportGenerator.from(model.view.service.location);
|
|
41
42
|
imports.addType(model.types);
|
|
42
43
|
imports.addType({ name: Generator.toTypeName('User'), location: context.types.location });
|
|
43
44
|
imports.addType(model.types.id);
|
|
45
|
+
imports.addType(model.types.filter.type);
|
|
46
|
+
imports.addType(model.types.filter.fieldType);
|
|
47
|
+
imports.add(model.types.filter.config);
|
|
44
48
|
imports.add(context.view.service);
|
|
49
|
+
imports.addImport({
|
|
50
|
+
items: [
|
|
51
|
+
Generator.toFunctionName('applyRangeFilters'),
|
|
52
|
+
Generator.toFunctionName('getMatches'),
|
|
53
|
+
Generator.toFunctionName('getOptions'),
|
|
54
|
+
Generator.toFunctionName('formatAndSortOptions'),
|
|
55
|
+
],
|
|
56
|
+
from: Generator.toBackendModuleLocation('@view/filter.utils'),
|
|
57
|
+
});
|
|
58
|
+
imports.addImport({
|
|
59
|
+
items: [Generator.toFunctionName('omit')],
|
|
60
|
+
from: Generator.toBackendModuleLocation('@postxl/utils'),
|
|
61
|
+
});
|
|
45
62
|
if (model.repository.kind === 'NoRepository') {
|
|
46
63
|
return generateModelViewService_NoRepository({ model, context, imports });
|
|
47
64
|
}
|
|
@@ -54,6 +71,7 @@ function generateModelViewService_HasRepository({ model, context, imports, }) {
|
|
|
54
71
|
return '';
|
|
55
72
|
}
|
|
56
73
|
imports.add(model.repository);
|
|
74
|
+
const filteringMethods = generateFilteringMethods({ model, imports });
|
|
57
75
|
return `
|
|
58
76
|
import { Inject, Injectable, forwardRef } from '@nestjs/common'
|
|
59
77
|
|
|
@@ -118,6 +136,9 @@ export class ${model.view.service.name} {
|
|
|
118
136
|
|
|
119
137
|
return result
|
|
120
138
|
}
|
|
139
|
+
|
|
140
|
+
${filteringMethods}
|
|
141
|
+
|
|
121
142
|
${generateAuthorizeMethod({ model, context })}
|
|
122
143
|
}
|
|
123
144
|
`;
|
|
@@ -181,6 +202,22 @@ export class ${model.view.service.name} {
|
|
|
181
202
|
return result
|
|
182
203
|
}
|
|
183
204
|
|
|
205
|
+
/**
|
|
206
|
+
* Returns a filtered list of ${model.userFriendlyNamePlural}.
|
|
207
|
+
*/
|
|
208
|
+
public async getFiltered({ filters, user }: { filters: ${model.types.filter.type.name}, user: User }): Promise<${model.types.name}[]> {
|
|
209
|
+
// TODO: Implement this method.
|
|
210
|
+
return this.getList(user)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Returns the filter options for a given field.
|
|
215
|
+
*/
|
|
216
|
+
public async getFilterOptions({ field, filters, user }: { field: ${model.types.filter.field.name}, filters: ${model.types.filter.type.name}, user: User }): Promise<any> {
|
|
217
|
+
// TODO: Implement this method.
|
|
218
|
+
return []
|
|
219
|
+
}
|
|
220
|
+
|
|
184
221
|
${generateAuthorizeMethod({ model, context })}
|
|
185
222
|
}`;
|
|
186
223
|
}
|
|
@@ -193,4 +230,243 @@ function generateAuthorizeMethod({ model }) {
|
|
|
193
230
|
return Promise.resolve() // NOSONAR - adhere to the same interface
|
|
194
231
|
}`;
|
|
195
232
|
}
|
|
233
|
+
function generateFilteringMethods({ model, imports, }) {
|
|
234
|
+
const filterFields = [];
|
|
235
|
+
const usedMatchMethods = new Set();
|
|
236
|
+
// Generate filter conditions for all fields, including nested DU fields
|
|
237
|
+
for (const field of model.fields.values()) {
|
|
238
|
+
const conditions = getFilterConditionsForField({
|
|
239
|
+
field,
|
|
240
|
+
usedMatchMethods,
|
|
241
|
+
});
|
|
242
|
+
filterFields.push(...conditions);
|
|
243
|
+
}
|
|
244
|
+
if (usedMatchMethods.size > 0) {
|
|
245
|
+
imports.addImport({
|
|
246
|
+
items: Array.from(usedMatchMethods).map((m) => Generator.toFunctionName(m)),
|
|
247
|
+
from: Generator.toBackendModuleLocation('@view/filter.utils'),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
return `
|
|
251
|
+
/**
|
|
252
|
+
* Returns a filtered list of ${model.userFriendlyNamePlural}.
|
|
253
|
+
* For really large datasets, consider implementing server-side filtering in the repository instead.
|
|
254
|
+
*/
|
|
255
|
+
public async getFiltered({ filters, user }: { filters: ${model.types.filter.type.name}, user: User }): Promise<${model.types.name}[]> {
|
|
256
|
+
const allItems = await this.getList(user)
|
|
257
|
+
return this.filter${model._conjugated.PascalCasePlural}(allItems, filters)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Returns the filter options for a given field.
|
|
262
|
+
* For really large datasets, consider implementing server-side filtering in the repository instead.
|
|
263
|
+
*/
|
|
264
|
+
public async getFilterOptions({
|
|
265
|
+
field,
|
|
266
|
+
filters,
|
|
267
|
+
user,
|
|
268
|
+
}: {
|
|
269
|
+
field: ${model.types.filter.fieldType.name}
|
|
270
|
+
filters: ${model.types.filter.type.name}
|
|
271
|
+
user: User
|
|
272
|
+
}): Promise<{ value: string; label: string; hasMatches: boolean }[]> {
|
|
273
|
+
const allItems = await this.getList(user)
|
|
274
|
+
const reducedFilters = omit(filters, field)
|
|
275
|
+
const filteredItems = this.filter${model._conjugated.PascalCasePlural}(allItems, reducedFilters)
|
|
276
|
+
|
|
277
|
+
const config = ${model.types.filter.config.name}[field]
|
|
278
|
+
const accessor = this.getFieldAccessor(field)
|
|
279
|
+
|
|
280
|
+
// If we are getting options for a number/date field, we want to respect the range filter (so options outside the range are grayed out), but still ignore the values filter (so we can see all options).
|
|
281
|
+
const itemsWithRange = applyRangeFilters(filteredItems, accessor, config, filters)
|
|
282
|
+
|
|
283
|
+
let referencedItems: Map<string, any> | undefined
|
|
284
|
+
if (config.kind === 'relation') {
|
|
285
|
+
referencedItems = await (this.viewService as any)[config.referencedModelViewServiceVariableName]?.getAll(user)
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const { matches, options } = {
|
|
289
|
+
matches: getMatches(itemsWithRange, accessor),
|
|
290
|
+
options: getOptions(allItems, accessor, config, referencedItems),
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return formatAndSortOptions(options, matches)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Helper method to filter ${model.userFriendlyNamePlural} based on provided filters.
|
|
298
|
+
*/
|
|
299
|
+
private filter${model._conjugated.PascalCasePlural}(
|
|
300
|
+
${model._conjugated.camelCasePlural}: ${model.types.name}[],
|
|
301
|
+
filters: ${model.types.filter.type.name},
|
|
302
|
+
): ${model.types.name}[] {
|
|
303
|
+
return ${model._conjugated.camelCasePlural}.filter((item) => {
|
|
304
|
+
${filterFields.join('')}
|
|
305
|
+
return true
|
|
306
|
+
})
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
${generateGetFieldAccessorMethod({ model })}
|
|
310
|
+
`;
|
|
311
|
+
}
|
|
312
|
+
function generateGetFieldAccessorMethod({ model }) {
|
|
313
|
+
const accessors = [];
|
|
314
|
+
// Generate accessor cases for all fields, including nested DU fields
|
|
315
|
+
for (const field of model.fields.values()) {
|
|
316
|
+
const cases = generateFieldAccessorCases({
|
|
317
|
+
field,
|
|
318
|
+
model,
|
|
319
|
+
});
|
|
320
|
+
accessors.push(...cases);
|
|
321
|
+
}
|
|
322
|
+
const defaultAccessor = `return (item: ${model.types.name}) => (item as any)[field]`;
|
|
323
|
+
// Add default case
|
|
324
|
+
accessors.push(` default:
|
|
325
|
+
${defaultAccessor}`);
|
|
326
|
+
return `/**
|
|
327
|
+
* Returns an accessor function for the given filter field.
|
|
328
|
+
*/
|
|
329
|
+
private getFieldAccessor(field: ${model.types.filter.fieldType.name}): (item: ${model.types.name}) => any {
|
|
330
|
+
${accessors.length > 1
|
|
331
|
+
? `switch (field) {
|
|
332
|
+
${accessors.join('\n')}
|
|
333
|
+
}`
|
|
334
|
+
: defaultAccessor}
|
|
335
|
+
}`;
|
|
336
|
+
}
|
|
337
|
+
function generateFieldAccessorCases(params) {
|
|
338
|
+
const { field, model, duParentFieldName, duMemberType } = params;
|
|
339
|
+
const result = [];
|
|
340
|
+
// Handle discriminated union: add the discriminant field plus all nested fields
|
|
341
|
+
if (field.kind === 'discriminatedUnion') {
|
|
342
|
+
// Add the discriminant field itself
|
|
343
|
+
const caseString = generateFieldAccessorCase({ field, model, duParentFieldName, duMemberType });
|
|
344
|
+
if (caseString) {
|
|
345
|
+
result.push(caseString);
|
|
346
|
+
}
|
|
347
|
+
// Add common fields
|
|
348
|
+
for (const commonField of field.commonFields.values()) {
|
|
349
|
+
result.push(...generateFieldAccessorCases({
|
|
350
|
+
field: commonField,
|
|
351
|
+
model,
|
|
352
|
+
duParentFieldName: field.name,
|
|
353
|
+
}));
|
|
354
|
+
}
|
|
355
|
+
// Add member-specific fields
|
|
356
|
+
for (const member of field.members.values()) {
|
|
357
|
+
for (const memberField of member.fields.values()) {
|
|
358
|
+
result.push(...generateFieldAccessorCases({
|
|
359
|
+
field: memberField,
|
|
360
|
+
model,
|
|
361
|
+
duParentFieldName: field.name,
|
|
362
|
+
duMemberType: member.type,
|
|
363
|
+
}));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
// Regular field
|
|
369
|
+
const caseString = generateFieldAccessorCase({ field, model, duParentFieldName, duMemberType });
|
|
370
|
+
if (caseString) {
|
|
371
|
+
result.push(caseString);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return result;
|
|
375
|
+
}
|
|
376
|
+
function generateFieldAccessorCase({ field, model, duParentFieldName, duMemberType, }) {
|
|
377
|
+
// For discriminated union fields at top level, we need to return the discriminant (type) value
|
|
378
|
+
if (field.kind === 'discriminatedUnion' && !duParentFieldName) {
|
|
379
|
+
return ` case '${field.name}':
|
|
380
|
+
return (item: ${model.types.name}) => item.${field.name}?.type`;
|
|
381
|
+
}
|
|
382
|
+
// Skip generating a case for simple top-level fields - the default case handles them
|
|
383
|
+
if (!duParentFieldName) {
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
const caseKey = `'${(0, model_type_generator_1.getFilterFieldName)(field.name, duParentFieldName)}'`;
|
|
387
|
+
let accessorExpression;
|
|
388
|
+
if (duMemberType) {
|
|
389
|
+
// Member-specific field: only return value if the member type matches
|
|
390
|
+
accessorExpression = `item.${duParentFieldName}?.type === '${duMemberType}' ? item.${duParentFieldName}?.${field.name} : undefined`;
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
// Common field in DU
|
|
394
|
+
accessorExpression = `item.${duParentFieldName}?.${field.name}`;
|
|
395
|
+
}
|
|
396
|
+
return ` case ${caseKey}:
|
|
397
|
+
return (item: ${model.types.name}) => ${accessorExpression}`;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Returns all filter conditions for a field, including nested DU fields.
|
|
401
|
+
*/
|
|
402
|
+
function getFilterConditionsForField(params) {
|
|
403
|
+
const { field, usedMatchMethods, duParentFieldName, duMemberType } = params;
|
|
404
|
+
const result = [];
|
|
405
|
+
// Handle discriminated union: add the discriminant field plus all nested fields
|
|
406
|
+
if (field.kind === 'discriminatedUnion') {
|
|
407
|
+
// Add the discriminant field itself
|
|
408
|
+
result.push(generateFilterCondition({ field, usedMatchMethods, duParentFieldName, duMemberType }));
|
|
409
|
+
// Add common fields
|
|
410
|
+
for (const commonField of field.commonFields.values()) {
|
|
411
|
+
result.push(...getFilterConditionsForField({
|
|
412
|
+
field: commonField,
|
|
413
|
+
usedMatchMethods,
|
|
414
|
+
duParentFieldName: field.name,
|
|
415
|
+
}));
|
|
416
|
+
}
|
|
417
|
+
// Add member-specific fields
|
|
418
|
+
for (const member of field.members.values()) {
|
|
419
|
+
for (const memberField of member.fields.values()) {
|
|
420
|
+
result.push(...getFilterConditionsForField({
|
|
421
|
+
field: memberField,
|
|
422
|
+
usedMatchMethods,
|
|
423
|
+
duParentFieldName: field.name,
|
|
424
|
+
duMemberType: member.type,
|
|
425
|
+
}));
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
// Regular field
|
|
431
|
+
result.push(generateFilterCondition(params));
|
|
432
|
+
}
|
|
433
|
+
return result;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Generates a single filter condition for a field.
|
|
437
|
+
*/
|
|
438
|
+
function generateFilterCondition({ field, usedMatchMethods, duParentFieldName, duMemberType, }) {
|
|
439
|
+
const valueType = (0, model_type_generator_1.getFilterValueType)(field);
|
|
440
|
+
let matchMethod = 'matchFilter';
|
|
441
|
+
if (valueType === 'number') {
|
|
442
|
+
matchMethod = 'matchNumberFilter';
|
|
443
|
+
}
|
|
444
|
+
else if (valueType === 'date') {
|
|
445
|
+
matchMethod = 'matchDateFilter';
|
|
446
|
+
}
|
|
447
|
+
usedMatchMethods.add(matchMethod);
|
|
448
|
+
// Build the accessor path for the field value
|
|
449
|
+
let accessor;
|
|
450
|
+
if (duParentFieldName) {
|
|
451
|
+
if (duMemberType) {
|
|
452
|
+
// Member-specific field: only check if the member type matches
|
|
453
|
+
accessor = `item.${duParentFieldName}?.type === '${duMemberType}' ? item.${duParentFieldName}?.${field.name} : undefined`;
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
// Common field in DU
|
|
457
|
+
accessor = `item.${duParentFieldName}?.${field.name}`;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
else if (field.kind === 'discriminatedUnion') {
|
|
461
|
+
// DU field at top level: filter by the discriminant (type) value
|
|
462
|
+
accessor = `item.${field.name}?.type`;
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
accessor = `item.${field.name}`;
|
|
466
|
+
}
|
|
467
|
+
return `
|
|
468
|
+
if (!${matchMethod}(${accessor}, filters.${(0, model_type_generator_1.getFilterFieldName)(field.name, duParentFieldName)})) {
|
|
469
|
+
return false
|
|
470
|
+
}`;
|
|
471
|
+
}
|
|
196
472
|
//# sourceMappingURL=model-view-service.generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-view-service.generator.js","sourceRoot":"","sources":["../../src/backend-view/model-view-service.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"model-view-service.generator.js","sourceRoot":"","sources":["../../src/backend-view/model-view-service.generator.ts"],"names":[],"mappings":"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"}
|