@evoke-platform/ui-components 1.4.0-testing.0 → 1.4.0-testing.2

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 (22) hide show
  1. package/dist/published/components/custom/Form/Common/Form.js +20 -21
  2. package/dist/published/components/custom/Form/FormComponents/ObjectComponent/ObjectComponent.d.ts +2 -0
  3. package/dist/published/components/custom/Form/FormComponents/ObjectComponent/ObjectComponent.js +75 -26
  4. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/ActionDialog.d.ts +5 -2
  5. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/ActionDialog.js +4 -6
  6. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/RepeatableField.js +3 -1
  7. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/RepeatableFieldComponent.js +31 -13
  8. package/dist/published/components/custom/Form/tests/Form.test.d.ts +1 -0
  9. package/dist/published/components/custom/Form/tests/Form.test.js +112 -0
  10. package/dist/published/components/custom/Form/tests/test-data.d.ts +13 -0
  11. package/dist/published/components/custom/Form/tests/test-data.js +282 -0
  12. package/dist/published/components/custom/Form/utils.d.ts +10 -4
  13. package/dist/published/components/custom/Form/utils.js +133 -52
  14. package/dist/published/components/custom/Menubar/Menubar.d.ts +2 -3
  15. package/dist/published/components/custom/Menubar/Menubar.js +15 -12
  16. package/dist/published/index.d.ts +1 -0
  17. package/dist/published/index.js +1 -0
  18. package/dist/published/theme/hooks.d.ts +31 -0
  19. package/dist/published/theme/hooks.js +35 -0
  20. package/dist/published/theme/index.d.ts +3 -0
  21. package/dist/published/theme/index.js +3 -0
  22. package/package.json +2 -3
@@ -0,0 +1,282 @@
1
+ // Objects
2
+ export const licenseObject = {
3
+ id: 'license',
4
+ name: 'License',
5
+ properties: [
6
+ {
7
+ id: 'name',
8
+ name: 'License Number',
9
+ type: 'string',
10
+ },
11
+ {
12
+ id: 'status',
13
+ name: 'Status',
14
+ type: 'string',
15
+ enum: ['Active', 'Inactive'],
16
+ },
17
+ {
18
+ id: 'licenseType',
19
+ name: 'License Type',
20
+ type: 'object',
21
+ objectId: 'licenseType',
22
+ },
23
+ ],
24
+ actions: [
25
+ {
26
+ id: '_update',
27
+ name: 'Update',
28
+ type: 'update',
29
+ outputEvent: 'License Updated',
30
+ },
31
+ {
32
+ id: '_delete',
33
+ name: 'Delete',
34
+ type: 'delete',
35
+ outputEvent: 'License Deleted',
36
+ },
37
+ {
38
+ id: '_create',
39
+ name: 'Create',
40
+ type: 'create',
41
+ outputEvent: 'License Created',
42
+ },
43
+ ],
44
+ };
45
+ export const licenseTypeObject = {
46
+ id: 'licenseType',
47
+ name: 'License Type',
48
+ properties: [
49
+ {
50
+ id: 'name',
51
+ name: 'Name',
52
+ type: 'string',
53
+ },
54
+ {
55
+ id: 'licenseNumberPrefix',
56
+ name: 'License Number Prefix',
57
+ type: 'string',
58
+ },
59
+ ],
60
+ actions: [
61
+ {
62
+ id: '_update',
63
+ name: 'Update',
64
+ type: 'update',
65
+ outputEvent: 'License Type Updated',
66
+ },
67
+ {
68
+ id: '_delete',
69
+ name: 'Delete',
70
+ type: 'delete',
71
+ outputEvent: 'License Type Deleted',
72
+ },
73
+ {
74
+ id: '_create',
75
+ name: 'Create',
76
+ type: 'create',
77
+ outputEvent: 'License Type Created',
78
+ },
79
+ ],
80
+ };
81
+ export const specialtyObject = {
82
+ id: 'specialty',
83
+ name: 'Specialty',
84
+ properties: [
85
+ {
86
+ id: 'name',
87
+ name: 'Name',
88
+ type: 'string',
89
+ },
90
+ {
91
+ id: 'specialtyType',
92
+ name: 'Specialty Type',
93
+ type: 'object',
94
+ objectId: 'specialtyType',
95
+ },
96
+ {
97
+ id: 'license',
98
+ name: 'License',
99
+ type: 'object',
100
+ objectId: 'license',
101
+ },
102
+ ],
103
+ actions: [
104
+ {
105
+ id: '_update',
106
+ name: 'Update',
107
+ type: 'update',
108
+ outputEvent: 'Specialty Updated',
109
+ },
110
+ {
111
+ id: '_delete',
112
+ name: 'Delete',
113
+ type: 'delete',
114
+ outputEvent: 'Specialty Deleted',
115
+ },
116
+ {
117
+ id: '_create',
118
+ name: 'Create',
119
+ type: 'create',
120
+ outputEvent: 'Specialty Created',
121
+ parameters: [
122
+ {
123
+ id: 'name',
124
+ name: 'Name',
125
+ type: 'string',
126
+ },
127
+ {
128
+ id: 'specialtyType',
129
+ name: 'Specialty Type',
130
+ type: 'object',
131
+ objectId: 'specialtyType',
132
+ validation: {
133
+ criteria: {
134
+ $and: [{ 'licenseType.id': '{{{input.license.licenseType.id}}}' }],
135
+ },
136
+ },
137
+ },
138
+ {
139
+ id: 'license',
140
+ name: 'License',
141
+ type: 'object',
142
+ objectId: 'license',
143
+ },
144
+ ],
145
+ form: {
146
+ entries: [
147
+ {
148
+ parameterId: 'name',
149
+ type: 'input',
150
+ display: {
151
+ label: 'Name',
152
+ },
153
+ },
154
+ {
155
+ parameterId: 'specialtyType',
156
+ type: 'input',
157
+ display: {
158
+ label: 'Specialty Type',
159
+ relatedObjectDisplay: 'dropdown',
160
+ },
161
+ },
162
+ {
163
+ parameterId: 'license',
164
+ type: 'input',
165
+ display: {
166
+ label: 'License',
167
+ relatedObjectDisplay: 'dropdown',
168
+ },
169
+ },
170
+ ],
171
+ },
172
+ },
173
+ ],
174
+ };
175
+ export const specialtyTypeObject = {
176
+ id: 'specialtyType',
177
+ name: 'Specialty Type',
178
+ properties: [
179
+ {
180
+ id: 'name',
181
+ name: 'Name',
182
+ type: 'string',
183
+ },
184
+ {
185
+ id: 'licenseType',
186
+ name: 'License Type',
187
+ type: 'object',
188
+ objectId: 'licenseType',
189
+ },
190
+ ],
191
+ actions: [
192
+ {
193
+ id: '_update',
194
+ name: 'Update',
195
+ type: 'update',
196
+ outputEvent: 'Specialty Type Updated',
197
+ },
198
+ {
199
+ id: '_delete',
200
+ name: 'Delete',
201
+ type: 'delete',
202
+ outputEvent: 'Specialty Type Deleted',
203
+ },
204
+ {
205
+ id: '_create',
206
+ name: 'Create',
207
+ type: 'create',
208
+ outputEvent: 'Specialty Type Created',
209
+ },
210
+ ],
211
+ };
212
+ // Instances
213
+ export const rnLicense = {
214
+ id: 'rnLicense',
215
+ objectId: 'license',
216
+ name: 'RN License',
217
+ licenseType: {
218
+ id: 'rnLicenseType',
219
+ name: 'RN License Type',
220
+ },
221
+ status: 'Active',
222
+ };
223
+ export const npLicense = {
224
+ id: 'npLicense',
225
+ objectId: 'license',
226
+ name: 'NP License',
227
+ licenseType: {
228
+ id: 'npLicenseType',
229
+ name: 'NP License Type',
230
+ },
231
+ status: 'Active',
232
+ };
233
+ export const rnLicenseType = {
234
+ id: 'rnLicenseType',
235
+ objectId: 'licenseType',
236
+ name: 'RN License Type',
237
+ licenseNumberPrefix: 'RN',
238
+ };
239
+ export const npLicesneType = {
240
+ id: 'npLicenseType',
241
+ objectId: 'licenseType',
242
+ name: 'NP License Type',
243
+ licenseNumberPrefix: 'NP',
244
+ };
245
+ export const rnSpecialtyType1 = {
246
+ id: 'specialtyType1',
247
+ objectId: 'specialtyType',
248
+ name: 'RN Specialty Type #1',
249
+ int: 1,
250
+ licenseType: {
251
+ id: 'rnLicenseType',
252
+ name: 'RN License Type',
253
+ },
254
+ };
255
+ export const rnSpecialtyType2 = {
256
+ id: 'specialtyType2',
257
+ objectId: 'specialtyType',
258
+ name: 'RN Specialty Type #2',
259
+ int: 1,
260
+ licenseType: {
261
+ id: 'rnLicenseType',
262
+ name: 'RN License Type',
263
+ },
264
+ };
265
+ export const npSpecialtyType1 = {
266
+ id: 'specialtyType3',
267
+ objectId: 'specialtyType',
268
+ name: 'NP Specialty Type #1',
269
+ licenseType: {
270
+ id: 'npLicenseType',
271
+ name: 'NP License Type',
272
+ },
273
+ };
274
+ export const npSpecialtyType2 = {
275
+ id: 'specialtyType4',
276
+ objectId: 'specialtyType',
277
+ name: 'NP Specialty Type #2',
278
+ licenseType: {
279
+ id: 'npLicenseType',
280
+ name: 'NP License Type',
281
+ },
282
+ };
@@ -1,4 +1,4 @@
1
- import { ActionInput, ActionInputType, ApiServices, FormEntry, InputParameter, InputParameterReference, Obj, ObjectInstance, Property, PropertyType } from '@evoke-platform/context';
1
+ import { ActionInput, ActionInputType, ApiServices, FormEntry, InputParameter, InputParameterReference, Obj, ObjectInstance, Property, PropertyType, UserAccount } from '@evoke-platform/context';
2
2
  import { ReactComponent } from '@formio/react';
3
3
  import { LocalDateTime } from '@js-joda/core';
4
4
  import { AutocompleteOption } from '../../core';
@@ -21,7 +21,11 @@ export declare function getMiddleObject(instance: ObjectInstance, property: Prop
21
21
  } | undefined;
22
22
  export declare function getMiddleInstance(instanceId: string, property: Property, middleObjectInstances: ObjectInstance[]): ObjectInstance | undefined;
23
23
  export declare function getPrefixedUrl(url: string): string;
24
- export declare function addObjectPropertiesToComponentProps(properties: Property[], formComponents: any[], instance?: ObjectInstance, objectPropertyInputProps?: ObjectPropertyInputProps, autoSave?: (data: Record<string, unknown>) => void, readOnly?: boolean, defaultPages?: Record<string, string>, navigateTo?: (path: string) => void, queryAddresses?: (query: string) => Promise<Address[]>, apiServices?: ApiServices, isModal?: boolean, fieldHeight?: 'small' | 'medium', richTextEditor?: typeof ReactComponent): Promise<ActionInput[]>;
24
+ export declare function flattenFormComponents(components?: ActionInput[]): ActionInput[];
25
+ export declare function addObjectPropertiesToComponentProps(properties: Property[], formComponents: any[], allCriteriaInputs?: string[], instance?: ObjectInstance, objectPropertyInputProps?: ObjectPropertyInputProps, associatedObject?: {
26
+ instanceId?: string;
27
+ propertyId?: string;
28
+ }, autoSave?: (data: Record<string, unknown>) => void, readOnly?: boolean, defaultPages?: Record<string, string>, navigateTo?: (path: string) => void, queryAddresses?: (query: string) => Promise<Address[]>, apiServices?: ApiServices, isModal?: boolean, fieldHeight?: 'small' | 'medium', richTextEditor?: typeof ReactComponent): Promise<ActionInput[]>;
25
29
  export declare function getDefaultValue(initialValue: unknown, selectOptions?: AutocompleteOption[]): unknown;
26
30
  export declare const buildComponentPropsFromObjectProperties: (properties: Property[], objectId: string, instance?: ObjectInstance, objectPropertyInputProps?: ObjectPropertyInputProps, hasActionPermissions?: boolean, autoSave?: ((data: Record<string, unknown>) => void) | undefined, readOnly?: boolean, queryAddresses?: ((query: string) => Promise<Address[]>) | undefined, isModal?: boolean, fieldHeight?: 'small' | 'medium', richTextEditor?: typeof ReactComponent) => unknown[];
27
31
  export declare const buildComponentPropsFromDocumentProperties: (documentProperties: [string, unknown][], readOnly?: boolean, autoSave?: ((data: Record<string, unknown>) => void) | undefined, fieldHeight?: 'small' | 'medium') => {
@@ -35,8 +39,10 @@ export declare const buildComponentPropsFromDocumentProperties: (documentPropert
35
39
  }[];
36
40
  export declare const OPERATOR_MAP: Record<string, string>;
37
41
  export declare function transformToWhere(mongoQuery: object): Record<string, unknown>;
38
- export declare function updateCriteriaInputs(criteria: Record<string, unknown>, field: string, fieldValue: string, isInputField?: boolean): void;
39
- export declare function getAllCriteriaInputs(criteria: Record<string, unknown>): string[];
42
+ export declare function updateCriteriaInputs(criteria: Record<string, unknown>, data: Record<string, unknown>, user?: UserAccount): Record<string, unknown>;
43
+ export declare function getCriteriaInputs(criteria?: Record<string, unknown>): string[];
44
+ export declare function getAllCriteriaInputs(components: ActionInput[] | InputParameter[]): string[];
45
+ export declare function populateInstanceWithNestedData(instanceId: string, objectId: string, paths: string[], apiServices: ApiServices): Promise<ObjectInstance>;
40
46
  export declare function isPropertyVisible(conditional: {
41
47
  when: string;
42
48
  show: boolean;
@@ -1,6 +1,10 @@
1
1
  import { camelCase, get, isArray, isEmpty, isNil, isObject, isUndefined, pick, startCase, transform, uniq, } from 'lodash';
2
2
  import { DateTime } from 'luxon';
3
3
  import { nanoid } from 'nanoid';
4
+ import Handlebars from 'no-eval-handlebars';
5
+ import qs from 'qs';
6
+ import { defaultRuleProcessorMongoDB, formatQuery, parseMongoDB, } from 'react-querybuilder';
7
+ import escape from 'string-escape-regex';
4
8
  // The following functions are used to build the FormIO form components from the form parameters.
5
9
  export function determineComponentType(properties, parameter) {
6
10
  if (!parameter)
@@ -163,6 +167,7 @@ export function convertFormToComponents(entries, parameters, object) {
163
167
  name: topLevelProperty?.name
164
168
  ? `${topLevelProperty.name} ${startCase(property.id.split('.')[1])}`
165
169
  : startCase(property.id.split('.')[1]),
170
+ type: topLevelProperty?.type,
166
171
  };
167
172
  }
168
173
  const type = determineComponentType(object.properties ?? [], parameter);
@@ -482,11 +487,26 @@ export function getPrefixedUrl(url) {
482
487
  console.error('Invalid URL');
483
488
  return url;
484
489
  }
490
+ export function flattenFormComponents(components) {
491
+ if (!components)
492
+ return [];
493
+ return components.reduce((acc, component) => {
494
+ if (component.type === 'Section') {
495
+ return acc.concat(component.components?.flatMap((components) => flattenFormComponents(components.components)) ?? []);
496
+ }
497
+ else if (component.type === 'Columns') {
498
+ return acc.concat(component.columns?.flatMap((column) => flattenFormComponents(column.components)) ?? []);
499
+ }
500
+ else {
501
+ return acc.concat(component);
502
+ }
503
+ }, []);
504
+ }
485
505
  // The following function adds the object properties to the form components.
486
506
  // This function is used when there is no form configured in the form builder.
487
507
  export async function addObjectPropertiesToComponentProps(properties,
488
508
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
489
- formComponents, instance, objectPropertyInputProps, autoSave, readOnly, defaultPages, navigateTo, queryAddresses, apiServices, isModal, fieldHeight, richTextEditor) {
509
+ formComponents, allCriteriaInputs, instance, objectPropertyInputProps, associatedObject, autoSave, readOnly, defaultPages, navigateTo, queryAddresses, apiServices, isModal, fieldHeight, richTextEditor) {
490
510
  return [
491
511
  ...(await Promise.all(formComponents
492
512
  ?.filter((component) => !isUndefined(component) && !isNil(component))
@@ -624,6 +644,8 @@ formComponents, instance, objectPropertyInputProps, autoSave, readOnly, defaultP
624
644
  ...(component.type === 'Object' && objectPropertyInputProps),
625
645
  defaultValue,
626
646
  property,
647
+ allCriteriaInputs,
648
+ properties,
627
649
  type: `${readOnly ? 'ViewOnly' : ''}${component.type}`,
628
650
  readOnly: component.readOnly || readOnly || property?.formula,
629
651
  multiple: ['array', 'document'].includes(property.type),
@@ -648,13 +670,24 @@ formComponents, instance, objectPropertyInputProps, autoSave, readOnly, defaultP
648
670
  : undefined,
649
671
  };
650
672
  }
651
- const defaultValue = getDefaultValue(isNil(instanceValue) ? component.initialValue : instanceValue, component?.data?.values);
673
+ let defaultValue = getDefaultValue(isNil(instanceValue) ? component.initialValue : instanceValue, component?.data?.values);
674
+ // If "associatedObject" is defined, that means the form is associating an existing instance with the current instance.
675
+ // Set the associated instance as a default value and hide the field.
676
+ if (associatedObject?.instanceId &&
677
+ associatedObject?.propertyId &&
678
+ associatedObject?.propertyId === property.id) {
679
+ defaultValue = { id: associatedObject.instanceId };
680
+ component.hidden = true;
681
+ }
652
682
  return {
653
683
  ...component,
654
684
  ...(component.type === 'Object' && objectPropertyInputProps),
655
685
  type: `${readOnly ? 'ViewOnly' : ''}${component.type}`,
656
686
  defaultValue,
687
+ allCriteriaInputs,
688
+ properties,
657
689
  property,
690
+ associatedObject,
658
691
  readOnly: component.readOnly || readOnly || property?.formula,
659
692
  multiple: ['array', 'document'].includes(property.type),
660
693
  instance: instance,
@@ -693,7 +726,7 @@ formComponents, instance, objectPropertyInputProps, autoSave, readOnly, defaultP
693
726
  }
694
727
  if (component.columns) {
695
728
  for (const column of component.columns) {
696
- column.components = await addObjectPropertiesToComponentProps(properties, column.components, instance, objectPropertyInputProps, autoSave, readOnly, undefined, undefined, queryAddresses, apiServices, isModal, fieldHeight, richTextEditor);
729
+ column.components = await addObjectPropertiesToComponentProps(properties, column.components, allCriteriaInputs, instance, objectPropertyInputProps, associatedObject, autoSave, readOnly, undefined, undefined, queryAddresses, apiServices, isModal, fieldHeight, richTextEditor);
697
730
  }
698
731
  return component;
699
732
  }
@@ -713,6 +746,14 @@ formComponents, instance, objectPropertyInputProps, autoSave, readOnly, defaultP
713
746
  if (item.type.includes('RepeatableField') && !!instance) {
714
747
  item.instance = instance;
715
748
  }
749
+ // If "associatedObject" is defined, that means the form is associating an existing instance with the current instance.
750
+ // Set the associated instance as a default value and hide the field.
751
+ if (associatedObject?.instanceId &&
752
+ associatedObject?.propertyId &&
753
+ item.property.id === associatedObject.propertyId) {
754
+ item.defaultValue = { id: associatedObject.instanceId };
755
+ item.hidden = true;
756
+ }
716
757
  }
717
758
  if (nestedFieldProperty) {
718
759
  item.type = `${readOnly ? 'ViewOnly' : ''}${item.type}`;
@@ -725,6 +766,7 @@ formComponents, instance, objectPropertyInputProps, autoSave, readOnly, defaultP
725
766
  item.user = objectPropertyInputProps?.user;
726
767
  item.defaultPages = defaultPages;
727
768
  item.navigateTo = navigateTo;
769
+ item.allCriteriaInputs = allCriteriaInputs;
728
770
  item.isModal = isModal;
729
771
  item.fieldHeight = fieldHeight;
730
772
  item.richTextEditor = ['RepeatableField', 'Object'].includes(item.type)
@@ -751,7 +793,7 @@ formComponents, instance, objectPropertyInputProps, autoSave, readOnly, defaultP
751
793
  }
752
794
  }
753
795
  return {
754
- components: await addObjectPropertiesToComponentProps(properties, component.components, instance, objectPropertyInputProps, autoSave, readOnly, defaultPages, navigateTo, queryAddresses, apiServices, isModal, fieldHeight, richTextEditor),
796
+ components: await addObjectPropertiesToComponentProps(properties, component.components, allCriteriaInputs, instance, objectPropertyInputProps, associatedObject, autoSave, readOnly, defaultPages, navigateTo, queryAddresses, apiServices, isModal, fieldHeight, richTextEditor),
755
797
  ...component,
756
798
  ...(component.type === 'Object' && objectPropertyInputProps),
757
799
  type: `${readOnly ? 'ViewOnly' : ''}${component.type}`,
@@ -1127,61 +1169,100 @@ export function transformToWhere(mongoQuery) {
1127
1169
  result[newKey] = isObject(value) ? transformToWhere(value) : value;
1128
1170
  });
1129
1171
  }
1130
- export function updateCriteriaInputs(criteria, field, fieldValue, isInputField) {
1131
- for (const [key, value] of Object.entries(criteria)) {
1132
- if (isArray(value)) {
1133
- for (const index in value) {
1134
- if (isObject(value[index])) {
1135
- updateCriteriaInputs(value[index], field, fieldValue, isInputField);
1136
- }
1137
- else {
1138
- value[index] =
1139
- typeof value[index] === 'string'
1140
- ? value[index]
1141
- ?.replaceAll(!isInputField ? `{{{${field}}}}` : `{{{input.${field}}}}`, fieldValue ?? '')
1142
- .trim() || undefined
1143
- : value ?? undefined;
1144
- }
1145
- }
1146
- }
1147
- else if (isObject(value)) {
1148
- updateCriteriaInputs(value, field, fieldValue, isInputField);
1172
+ function compileQueryValues(query, data) {
1173
+ if ('rules' in query && Array.isArray(query.rules)) {
1174
+ const updatedRules = query.rules
1175
+ .map((item) => compileQueryValues(item, data))
1176
+ .filter((item) => item !== undefined);
1177
+ if (updatedRules?.length) {
1178
+ return {
1179
+ ...query,
1180
+ rules: updatedRules,
1181
+ };
1149
1182
  }
1150
1183
  else {
1151
- criteria[key] =
1152
- typeof value === 'string'
1153
- ? value
1154
- ?.replaceAll(!isInputField ? `{{{${field}}}}` : `{{{input.${field}}}}`, fieldValue ?? '')
1155
- .trim() || undefined
1156
- : value ?? undefined;
1184
+ return undefined;
1157
1185
  }
1158
1186
  }
1159
- }
1160
- export function getAllCriteriaInputs(criteria) {
1161
- const result = [];
1162
- for (const [, value] of Object.entries(criteria)) {
1163
- if (isArray(value)) {
1164
- for (const item of value) {
1165
- if (item && typeof item === 'object') {
1166
- const inputProps = getAllCriteriaInputs(item);
1167
- inputProps && result.push(...inputProps);
1168
- }
1169
- else {
1170
- const inputProps = typeof item === 'string' ? item.match(/{{{input\..*}}}/g) : undefined;
1171
- inputProps && result.push(...inputProps);
1172
- }
1187
+ else {
1188
+ if ('value' in query && typeof query.value === 'string') {
1189
+ const template = Handlebars.compileAST(query.value);
1190
+ const result = template(data);
1191
+ if (result !== '') {
1192
+ return {
1193
+ ...query,
1194
+ value: result,
1195
+ };
1196
+ }
1197
+ else {
1198
+ return undefined;
1173
1199
  }
1174
1200
  }
1175
- else if (value && typeof value === 'object') {
1176
- const inputProps = getAllCriteriaInputs(value);
1177
- inputProps && result.push(...inputProps);
1178
- }
1179
- else {
1180
- const inputProps = typeof value === 'string' ? value.match(/{{{input\..*}}}/g) : undefined;
1181
- inputProps && result.push(...inputProps);
1182
- }
1201
+ return query;
1202
+ }
1203
+ }
1204
+ export function updateCriteriaInputs(criteria, data, user) {
1205
+ const dataSet = {
1206
+ input: {
1207
+ ...data,
1208
+ },
1209
+ user: user,
1210
+ };
1211
+ const compiledQuery = compileQueryValues(parseMongoDB(criteria), dataSet);
1212
+ // The "compiledQueryValues" function filters out rules that have a value of "undefined".
1213
+ // If "compiledQuery" is "undefined", that means that all rules and nested rules have a value of "undefined".
1214
+ // Therefore, the resulting query is empty.
1215
+ return !compiledQuery
1216
+ ? {}
1217
+ : JSON.parse(formatQuery(compiledQuery, {
1218
+ format: 'mongodb',
1219
+ ruleProcessor: (rule, options) => {
1220
+ let updatedRule = rule;
1221
+ if (['contains', 'beginsWith', 'endsWith'].includes(rule.operator)) {
1222
+ updatedRule = { ...rule, value: escape(rule.value) };
1223
+ }
1224
+ return defaultRuleProcessorMongoDB(updatedRule, options);
1225
+ },
1226
+ }));
1227
+ }
1228
+ function getRuleValues(query) {
1229
+ const values = [];
1230
+ if ('rules' in query && Array.isArray(query.rules)) {
1231
+ query.rules.forEach((item) => {
1232
+ values.push(...getRuleValues(item));
1233
+ });
1234
+ }
1235
+ else {
1236
+ values.push(query.value);
1237
+ }
1238
+ return values;
1239
+ }
1240
+ export function getCriteriaInputs(criteria) {
1241
+ if (!criteria)
1242
+ return [];
1243
+ const values = getRuleValues(parseMongoDB(criteria)).filter((val) => typeof val === 'string' && val.match(/{{{input\..*}}}/g));
1244
+ return uniq(values).map((item) => item.replace('{{{input.', '').replace('}}}', ''));
1245
+ }
1246
+ export function getAllCriteriaInputs(components) {
1247
+ const allComponents = components;
1248
+ const results = allComponents.reduce((inputs, c) => inputs.concat(getCriteriaInputs(c.validate?.criteria ??
1249
+ c.validation?.criteria)), []);
1250
+ return results;
1251
+ }
1252
+ export async function populateInstanceWithNestedData(instanceId, objectId, paths, apiServices) {
1253
+ let instance = { id: instanceId, objectId };
1254
+ try {
1255
+ instance = await apiServices.get(getPrefixedUrl(`/objects/${objectId}/instances/${instanceId}`), {
1256
+ params: {
1257
+ expand: paths,
1258
+ },
1259
+ paramsSerializer: (params) => qs.stringify(params, { arrayFormat: 'repeat' }),
1260
+ });
1261
+ }
1262
+ catch (err) {
1263
+ console.log(err);
1183
1264
  }
1184
- return uniq(result.map((item) => item.replace('{{{input.', '').replace('}}}', '')));
1265
+ return instance;
1185
1266
  }
1186
1267
  export function isPropertyVisible(conditional, formData) {
1187
1268
  const isConditional = !!conditional?.when;
@@ -1,10 +1,9 @@
1
- import { ReactJSXElement } from '@emotion/react/types/jsx-namespace';
2
- import React from 'react';
1
+ import React, { ReactNode } from 'react';
3
2
  export type MenuBarProps = {
4
3
  showNotifications: boolean;
5
4
  logo: string;
6
5
  logoAltText?: string;
7
- navItems?: ReactJSXElement;
6
+ navItems?: ReactNode;
8
7
  envName?: string;
9
8
  };
10
9
  export default function MenuBar(props: MenuBarProps): React.JSX.Element;
@@ -1,18 +1,21 @@
1
1
  import { AppBar, Box, CardMedia, Toolbar, Typography } from '@mui/material';
2
2
  import React from 'react';
3
- import UIThemeProvider from '../../../theme';
4
- const classes = {
5
- title: {
6
- flexGrow: 1,
7
- height: 70,
8
- },
9
- logo: {
10
- paddingRight: '16px',
11
- height: '70px',
12
- width: 'inherit',
13
- },
14
- };
3
+ import UIThemeProvider, { useResponsive } from '../../../theme';
15
4
  export default function MenuBar(props) {
5
+ const { isXs: isMobileView } = useResponsive();
6
+ const classes = {
7
+ title: {
8
+ height: 70,
9
+ flexGrow: 1,
10
+ },
11
+ logo: {
12
+ paddingRight: '16px',
13
+ height: '70px',
14
+ maxWidth: isMobileView ? '220px' : null,
15
+ objectFit: 'contain',
16
+ width: 'auto',
17
+ },
18
+ };
16
19
  return (React.createElement(UIThemeProvider, null,
17
20
  React.createElement(AppBar, { color: "inherit", position: "fixed", elevation: 0, sx: { zIndex: (theme) => theme.zIndex.drawer + 1, borderBottom: '1px solid #919EAB3D' } },
18
21
  React.createElement(Toolbar, { sx: { justifyContent: 'space-between' } },
@@ -6,6 +6,7 @@ export { BuilderGrid, CriteriaBuilder, DataGrid, ErrorComponent, Form, FormField
6
6
  export type { FormRef } from './components/custom';
7
7
  export { NumericFormat } from './components/custom/FormField/InputFieldComponent';
8
8
  export { Box, Container, Grid, Stack } from './components/layout';
9
+ export * from './theme';
9
10
  export * as EVOKE_TYPES from './types';
10
11
  export * from './util';
11
12
  export type { AutocompleteRenderGroupParams, ButtonBaseActions, ButtonBaseClasses, FormControlProps, FormHelperTextProps, GridSize, MenuItemClasses, TextFieldProps, Theme, } from '@mui/material';
@@ -5,5 +5,6 @@ export * from './components/core';
5
5
  export { BuilderGrid, CriteriaBuilder, DataGrid, ErrorComponent, Form, FormField, HistoryLog, MenuBar, MultiSelect, RepeatableField, RichTextViewer, UserAvatar, } from './components/custom';
6
6
  export { NumericFormat } from './components/custom/FormField/InputFieldComponent';
7
7
  export { Box, Container, Grid, Stack } from './components/layout';
8
+ export * from './theme';
8
9
  export * as EVOKE_TYPES from './types';
9
10
  export * from './util';