@solidxai/core 0.1.12 → 0.1.13-beta.0
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/controllers/view-metadata.controller.d.ts +1 -1
- package/dist/decorators/workflow-field-data-provider.decorator.d.ts +3 -0
- package/dist/decorators/workflow-field-data-provider.decorator.d.ts.map +1 -0
- package/dist/decorators/workflow-field-data-provider.decorator.js +11 -0
- package/dist/decorators/workflow-field-data-provider.decorator.js.map +1 -0
- package/dist/helpers/solid-registry.d.ts +5 -1
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js +17 -0
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +24 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/repository/security-rule.repository.d.ts +1 -0
- package/dist/repository/security-rule.repository.d.ts.map +1 -1
- package/dist/repository/security-rule.repository.js +28 -7
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +1 -1
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts +16 -1
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +99 -22
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +1 -0
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +15 -0
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/solid-introspect.service.d.ts +1 -0
- package/dist/services/solid-introspect.service.d.ts.map +1 -1
- package/dist/services/solid-introspect.service.js +12 -0
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +5 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +63 -14
- package/dist/services/view-metadata.service.js.map +1 -1
- package/package.json +1 -1
- package/src/decorators/workflow-field-data-provider.decorator.ts +7 -0
- package/src/helpers/solid-registry.ts +21 -1
- package/src/index.ts +1 -0
- package/src/interfaces.ts +29 -0
- package/src/repository/security-rule.repository.ts +52 -10
- package/src/services/chatter-message.service.ts +5 -1
- package/src/services/crud-helper.service.ts +220 -22
- package/src/services/crud.service.ts +30 -0
- package/src/services/solid-introspect.service.ts +19 -0
- package/src/services/view-metadata.service.ts +87 -21
|
@@ -18,6 +18,7 @@ import { MenuItemMetadataService } from './menu-item-metadata.service';
|
|
|
18
18
|
import { SolidIntrospectService } from './solid-introspect.service';
|
|
19
19
|
import { UserViewMetadataService } from './user-view-metadata.service';
|
|
20
20
|
import { MenuItemMetadata } from 'src/entities/menu-item-metadata.entity';
|
|
21
|
+
import { IWorkflowFieldDataProviderValues } from 'src/interfaces';
|
|
21
22
|
|
|
22
23
|
@Injectable()
|
|
23
24
|
export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
@@ -112,6 +113,90 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
112
113
|
|
|
113
114
|
private readonly logger = new Logger(ViewMetadataService.name);
|
|
114
115
|
|
|
116
|
+
private parseJsonObject(value: any): Record<string, any> {
|
|
117
|
+
if (!value) {
|
|
118
|
+
return {};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (typeof value === 'object') {
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (typeof value === 'string') {
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(value);
|
|
128
|
+
} catch (error: any) {
|
|
129
|
+
this.logger.warn(`Unable to parse workflow field provider context: ${error?.message ?? error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return {};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private async getDefaultWorkflowFieldData(
|
|
137
|
+
workflowField: FieldMetadata,
|
|
138
|
+
workflowFieldName: string,
|
|
139
|
+
fieldsMap: Map<string, FieldMetadata>,
|
|
140
|
+
): Promise<IWorkflowFieldDataProviderValues[]> {
|
|
141
|
+
if (workflowField.type === 'selectionStatic') {
|
|
142
|
+
return workflowField.selectionStaticValues.map(item => {
|
|
143
|
+
const [value, label] = item.split(":");
|
|
144
|
+
return { label, value };
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {
|
|
149
|
+
const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);
|
|
150
|
+
const data = await comodelCrudService.find({ limit: 100, offset: 0, });
|
|
151
|
+
const records = data.records ?? [];
|
|
152
|
+
const workflowFieldMetadata = fieldsMap.get(workflowFieldName);
|
|
153
|
+
const workflowFieldUserKey = (workflowFieldMetadata as any)?.relationModel?.userKeyField?.name;
|
|
154
|
+
|
|
155
|
+
if (!workflowFieldUserKey) {
|
|
156
|
+
this.logger.warn(`Unable to identify relation user key for workflow field: ${workflowFieldName}`);
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return records.map(item => ({ label: item[workflowFieldUserKey], value: item['id'] }));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private async getWorkflowFieldData(
|
|
167
|
+
entity: ViewMetadata,
|
|
168
|
+
workflowField: FieldMetadata,
|
|
169
|
+
workflowFieldName: string,
|
|
170
|
+
fieldsMap: Map<string, FieldMetadata>,
|
|
171
|
+
query: Record<string, any>,
|
|
172
|
+
activeUser: any,
|
|
173
|
+
): Promise<readonly IWorkflowFieldDataProviderValues[]> {
|
|
174
|
+
const workflowFieldDataProviderName = entity.layout?.attrs?.workflowFieldDataProvider;
|
|
175
|
+
if (workflowFieldDataProviderName) {
|
|
176
|
+
const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });
|
|
177
|
+
const provider = solidRegistry.getWorkflowFieldDataProviderInstance(workflowFieldDataProviderName);
|
|
178
|
+
if (!provider) {
|
|
179
|
+
throw new BadRequestException(`Workflow field data provider ${workflowFieldDataProviderName} not found`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return provider.values({
|
|
183
|
+
entityId: query?.id,
|
|
184
|
+
modelName: entity.model?.singularName ?? query?.modelName,
|
|
185
|
+
moduleName: entity.module?.name ?? query?.moduleName,
|
|
186
|
+
workflowFieldName,
|
|
187
|
+
workflowField,
|
|
188
|
+
solidModel: entity.model,
|
|
189
|
+
solidView: entity,
|
|
190
|
+
solidFieldsMetadata: Object.fromEntries(fieldsMap),
|
|
191
|
+
query,
|
|
192
|
+
providerContext: this.parseJsonObject(entity.layout?.attrs?.workflowFieldDataProviderCtxt),
|
|
193
|
+
activeUser,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);
|
|
198
|
+
}
|
|
199
|
+
|
|
115
200
|
//for locales
|
|
116
201
|
private async getEntityRecordsInAllLocales(
|
|
117
202
|
modelName: string,
|
|
@@ -331,28 +416,9 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
331
416
|
}
|
|
332
417
|
|
|
333
418
|
// 9. Use the resolved workflowField to populate workflow specific metadata.
|
|
334
|
-
|
|
335
|
-
let solidFormViewWorkflowData = [];
|
|
419
|
+
let solidFormViewWorkflowData: readonly IWorkflowFieldDataProviderValues[] = [];
|
|
336
420
|
if (viewType === 'form' && workflowField) {
|
|
337
|
-
|
|
338
|
-
// for workflowFields of type selectionStatic we simply return the key/values from field metadata AS-IS
|
|
339
|
-
if (workflowField.type === 'selectionStatic') {
|
|
340
|
-
solidFormViewWorkflowData = workflowField.selectionStaticValues.map(item => {
|
|
341
|
-
const [value, label] = item.split(":");
|
|
342
|
-
return { label, value };
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
// for workflowFields of type relation.many-to-one we need to query the co-model, and return data in key/value format.
|
|
346
|
-
if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {
|
|
347
|
-
const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);
|
|
348
|
-
const data = await comodelCrudService.find({ limit: 100, offset: 0, });
|
|
349
|
-
const records = data.records ?? [];
|
|
350
|
-
const workflowFieldMetadata = fieldsMap.get(workflowFieldName);
|
|
351
|
-
const workflowFielUserkey = workflowFieldMetadata['relationModel']['userKeyField']['name'];
|
|
352
|
-
|
|
353
|
-
// iterate over the comodel records extracting the label & value.
|
|
354
|
-
solidFormViewWorkflowData = records.map(item => ({ 'label': item[workflowFielUserkey], 'value': item['id'] }))
|
|
355
|
-
}
|
|
421
|
+
solidFormViewWorkflowData = await this.getWorkflowFieldData(entity, workflowField, workflowFieldName, fieldsMap, query, activeUser);
|
|
356
422
|
}
|
|
357
423
|
|
|
358
424
|
// 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.
|