@evoke-platform/ui-components 1.4.0-testing.1 → 1.4.0-testing.3

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 (30) hide show
  1. package/dist/published/components/custom/CriteriaBuilder/CriteriaBuilder.js +1 -17
  2. package/dist/published/components/custom/CriteriaBuilder/ValueEditor.js +23 -8
  3. package/dist/published/components/custom/CriteriaBuilder/index.d.ts +2 -1
  4. package/dist/published/components/custom/CriteriaBuilder/index.js +2 -1
  5. package/dist/published/components/custom/CriteriaBuilder/utils.d.ts +13 -0
  6. package/dist/published/components/custom/CriteriaBuilder/utils.js +58 -1
  7. package/dist/published/components/custom/Form/Common/Form.js +20 -21
  8. package/dist/published/components/custom/Form/Common/FormComponentWrapper.js +2 -1
  9. package/dist/published/components/custom/Form/FormComponents/ObjectComponent/ObjectComponent.d.ts +2 -0
  10. package/dist/published/components/custom/Form/FormComponents/ObjectComponent/ObjectComponent.js +75 -26
  11. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/ActionDialog.d.ts +5 -2
  12. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/ActionDialog.js +4 -6
  13. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/RepeatableField.js +3 -1
  14. package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/RepeatableFieldComponent.js +31 -13
  15. package/dist/published/components/custom/Form/tests/Form.test.d.ts +1 -0
  16. package/dist/published/components/custom/Form/tests/Form.test.js +112 -0
  17. package/dist/published/components/custom/Form/tests/test-data.d.ts +13 -0
  18. package/dist/published/components/custom/Form/tests/test-data.js +282 -0
  19. package/dist/published/components/custom/Form/utils.d.ts +10 -4
  20. package/dist/published/components/custom/Form/utils.js +133 -52
  21. package/dist/published/components/custom/HistoryLog/DisplayedProperty.d.ts +2 -1
  22. package/dist/published/components/custom/HistoryLog/DisplayedProperty.js +5 -2
  23. package/dist/published/components/custom/HistoryLog/HistoryData.d.ts +1 -0
  24. package/dist/published/components/custom/HistoryLog/HistoryData.js +9 -3
  25. package/dist/published/components/custom/HistoryLog/index.js +24 -2
  26. package/dist/published/components/custom/index.d.ts +1 -1
  27. package/dist/published/components/custom/index.js +1 -1
  28. package/dist/published/index.d.ts +1 -1
  29. package/dist/published/index.js +1 -1
  30. package/package.json +2 -3
@@ -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,8 +1,9 @@
1
- import { Property } from '@evoke-platform/context';
1
+ import { Obj, Property } from '@evoke-platform/context';
2
2
  import React from 'react';
3
3
  type DisplayedPropertyProps = {
4
4
  property: Property;
5
5
  value: unknown;
6
+ referencedObject?: Obj;
6
7
  };
7
8
  declare const DisplayedProperty: (props: DisplayedPropertyProps) => React.JSX.Element;
8
9
  export default DisplayedProperty;
@@ -2,9 +2,10 @@ import { DateTime } from 'luxon';
2
2
  import React from 'react';
3
3
  import { CardMedia, Typography } from '../../core';
4
4
  import { Grid } from '../../layout';
5
+ import { getReadableQuery } from '../CriteriaBuilder';
5
6
  import { RichTextViewer } from '../RichTextViewer';
6
7
  const DisplayedProperty = (props) => {
7
- const { property, value } = props;
8
+ const { property, value, referencedObject } = props;
8
9
  const getAddressAsString = (address) => {
9
10
  let stringAddress = '';
10
11
  if (address?.line1)
@@ -22,7 +23,7 @@ const DisplayedProperty = (props) => {
22
23
  return stringAddress;
23
24
  };
24
25
  const formatData = (property, value) => {
25
- if (property?.objectId) {
26
+ if (property?.objectId && property?.type === 'object') {
26
27
  return value?.name ?? value?.id;
27
28
  }
28
29
  switch (property?.type) {
@@ -47,6 +48,8 @@ const DisplayedProperty = (props) => {
47
48
  return value ? DateTime.fromISO(value).toFormat('MM/dd/yyyy hh:mm a') : undefined;
48
49
  case 'document':
49
50
  return value && Array.isArray(value) ? value.map((v) => v.name).join(', ') : undefined;
51
+ case 'criteria':
52
+ return getReadableQuery(value ?? {}, referencedObject?.properties);
50
53
  }
51
54
  return value;
52
55
  };
@@ -6,6 +6,7 @@ type HistoryDataProps = {
6
6
  records: History[];
7
7
  documentHistory?: Record<string, History[]>;
8
8
  object: Obj;
9
+ referencedObjects?: Obj[];
9
10
  };
10
11
  declare const HistoricalData: (props: HistoryDataProps) => React.JSX.Element;
11
12
  export default HistoricalData;
@@ -30,7 +30,7 @@ const styles = {
30
30
  },
31
31
  };
32
32
  const HistoricalData = (props) => {
33
- const { records, documentHistory, object } = props;
33
+ const { records, documentHistory, object, referencedObjects } = props;
34
34
  const getPastDocumentVersion = (history) => {
35
35
  const documentVersions = documentHistory?.[history.subject?.id ?? 'unknown'] ?? [];
36
36
  const currentVersion = documentVersions?.map((v) => v.timestamp).indexOf(history.timestamp);
@@ -65,11 +65,17 @@ const HistoricalData = (props) => {
65
65
  fontWeight: 600,
66
66
  minWidth: 'fit-content',
67
67
  alignSelf: 'flex-start',
68
+ lineHeight: '17px',
69
+ padding: '3px 8px',
68
70
  } }, property.name)),
69
- React.createElement(DisplayedProperty, { property: property, value: d.historicalValue }),
71
+ React.createElement(DisplayedProperty, { property: property, value: d.historicalValue, referencedObject: property.objectId
72
+ ? referencedObjects?.find((o) => o.id === property.objectId)
73
+ : undefined }),
70
74
  React.createElement(Grid, { item: true, xs: 0.5 },
71
75
  React.createElement(ArrowForward, { sx: { fontSize: '12px' } })),
72
- React.createElement(DisplayedProperty, { property: property, value: d.updatedValue }))));
76
+ React.createElement(DisplayedProperty, { property: property, value: d.updatedValue, referencedObject: property.objectId
77
+ ? referencedObjects?.find((o) => o.id === property.objectId)
78
+ : undefined }))));
73
79
  }))),
74
80
  ['document', 'correspondence'].includes(r.type) && (React.createElement(Box, null,
75
81
  React.createElement(Box, { display: "grid", gridTemplateColumns: 'fit-content(100%) fit-content(2%) fit-content(100%)', alignItems: "center", sx: { overflowWrap: 'break-word' } },
@@ -1,6 +1,9 @@
1
+ import { useApiServices } from '@evoke-platform/context';
1
2
  import { Circle } from '@mui/icons-material';
3
+ import { uniq } from 'lodash';
2
4
  import { DateTime } from 'luxon';
3
5
  import React, { useEffect, useState } from 'react';
6
+ import { Snackbar } from '../../core';
4
7
  import Typography from '../../core/Typography';
5
8
  import Box from '../../layout/Box';
6
9
  import HistoryFilter from './Filter';
@@ -20,9 +23,27 @@ export const HistoryLog = (props) => {
20
23
  const { object, history, loading, title } = props;
21
24
  const [historyMap, setHistoryMap] = useState({});
22
25
  const [documentHistory, setDocumentHistory] = useState({});
26
+ const [referencedObjects, setReferencedObjects] = useState([]);
23
27
  const [filteredHistory, setFilteredHistory] = useState({});
24
28
  const [filter, setFilter] = useState([]);
25
29
  const [order, setOrder] = useState('desc');
30
+ const [showSnackbar, setShowSnackbar] = useState(false);
31
+ const apiServices = useApiServices();
32
+ useEffect(() => {
33
+ const criteriaProperties = object.properties?.filter((property) => property.type === 'criteria');
34
+ if (criteriaProperties?.length) {
35
+ const uniqueObjectIds = uniq(criteriaProperties?.map((property) => property.objectId));
36
+ Promise.all(uniqueObjectIds.map((objectId) => apiServices.get(`/data/objects/${objectId}/effective`, {
37
+ params: {
38
+ filter: {
39
+ fields: ['id', 'name', 'properties'],
40
+ },
41
+ },
42
+ })))
43
+ .then((objs) => setReferencedObjects(objs))
44
+ .catch(() => setShowSnackbar(true));
45
+ }
46
+ }, [object, apiServices]);
26
47
  const sortHistoryByTimestamp = (historicalData, order) => {
27
48
  return historicalData.sort((a, b) => order === 'desc' ? b.timestamp.localeCompare(a.timestamp) : a.timestamp.localeCompare(b.timestamp));
28
49
  };
@@ -78,13 +99,14 @@ export const HistoryLog = (props) => {
78
99
  ' ',
79
100
  "\u00A0"),
80
101
  React.createElement(Typography, { sx: { fontWeight: 600, fontSize: '16px', color: '#637381' } }, format(new Date(date + ' 00:00:000'), 'MMM dd, yyyy'))),
81
- React.createElement(HistoricalData, { object: object, records: records, documentHistory: documentHistory })));
102
+ React.createElement(HistoricalData, { object: object, records: records, documentHistory: documentHistory, referencedObjects: referencedObjects })));
82
103
  }
83
104
  return null;
84
105
  }),
85
106
  !loading && filteredHistory && Object.values(filteredHistory).every((v) => !v.length) && (React.createElement(Box, { width: '100%', display: 'grid', justifyContent: 'center', marginTop: '60px' },
86
107
  React.createElement(Typography, { fontSize: '20px', fontWeight: 700 }, "You Have No History"),
87
108
  React.createElement(Typography, { fontSize: '14px', fontWeight: 400 }, "Try modifying the history type."))),
88
- loading && React.createElement(HistoryLoading, null)));
109
+ loading && React.createElement(HistoryLoading, null),
110
+ React.createElement(Snackbar, { open: showSnackbar, handleClose: () => setShowSnackbar(false), message: 'Error occurred when loading referenced objects', error: true })));
89
111
  };
90
112
  export default HistoryLog;
@@ -1,5 +1,5 @@
1
1
  export { BuilderGrid } from './BuilderGrid';
2
- export { CriteriaBuilder } from './CriteriaBuilder';
2
+ export { CriteriaBuilder, getReadableQuery } from './CriteriaBuilder';
3
3
  export { DataGrid } from './DataGrid';
4
4
  export { ErrorComponent } from './ErrorComponent';
5
5
  export { Form } from './Form';
@@ -1,5 +1,5 @@
1
1
  export { BuilderGrid } from './BuilderGrid';
2
- export { CriteriaBuilder } from './CriteriaBuilder';
2
+ export { CriteriaBuilder, getReadableQuery } from './CriteriaBuilder';
3
3
  export { DataGrid } from './DataGrid';
4
4
  export { ErrorComponent } from './ErrorComponent';
5
5
  export { Form } from './Form';
@@ -2,7 +2,7 @@ export { ClickAwayListener, createTheme, darken, lighten, styled, Toolbar } from
2
2
  export { CalendarPicker, DateTimePicker, MonthPicker, PickersDay, StaticDateTimePicker, StaticTimePicker, TimePicker, YearPicker, } from '@mui/x-date-pickers';
3
3
  export * from './colors';
4
4
  export * from './components/core';
5
- export { BuilderGrid, CriteriaBuilder, DataGrid, ErrorComponent, Form, FormField, HistoryLog, MenuBar, MultiSelect, RepeatableField, RichTextViewer, UserAvatar, } from './components/custom';
5
+ export { BuilderGrid, CriteriaBuilder, DataGrid, ErrorComponent, Form, FormField, getReadableQuery, HistoryLog, MenuBar, MultiSelect, RepeatableField, RichTextViewer, UserAvatar, } from './components/custom';
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';
@@ -2,7 +2,7 @@ export { ClickAwayListener, createTheme, darken, lighten, styled, Toolbar } from
2
2
  export { CalendarPicker, DateTimePicker, MonthPicker, PickersDay, StaticDateTimePicker, StaticTimePicker, TimePicker, YearPicker, } from '@mui/x-date-pickers';
3
3
  export * from './colors';
4
4
  export * from './components/core';
5
- export { BuilderGrid, CriteriaBuilder, DataGrid, ErrorComponent, Form, FormField, HistoryLog, MenuBar, MultiSelect, RepeatableField, RichTextViewer, UserAvatar, } from './components/custom';
5
+ export { BuilderGrid, CriteriaBuilder, DataGrid, ErrorComponent, Form, FormField, getReadableQuery, 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
8
  export * from './theme';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evoke-platform/ui-components",
3
- "version": "1.4.0-testing.1",
3
+ "version": "1.4.0-testing.3",
4
4
  "description": "",
5
5
  "main": "dist/published/index.js",
6
6
  "module": "dist/published/index.js",
@@ -51,7 +51,6 @@
51
51
  "@testing-library/jest-dom": "^6.4.2",
52
52
  "@testing-library/react": "^14.2.2",
53
53
  "@testing-library/user-event": "^14.5.2",
54
- "@types/dot-object": "^2.1.6",
55
54
  "@types/flat": "^5.0.5",
56
55
  "@types/jest": "^28.1.4",
57
56
  "@types/luxon": "^3.4.2",
@@ -111,12 +110,12 @@
111
110
  "devexpress-richedit": "^23.1.5",
112
111
  "devextreme": "^23.1.5",
113
112
  "devextreme-dist": "^23.1.5",
114
- "dot-object": "^2.1.5",
115
113
  "eslint-plugin-no-inline-styles": "^1.0.5",
116
114
  "flat": "^6.0.1",
117
115
  "formiojs": "^4.15.0-rc.23",
118
116
  "html-react-parser": "^5.1.18",
119
117
  "luxon": "^2.5.2",
118
+ "msw": "^2.7.3",
120
119
  "nanoid": "^5.0.8",
121
120
  "nanoid-dictionary": "^4.3.0",
122
121
  "no-eval-handlebars": "^1.0.2",