@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.
- package/dist/published/components/custom/CriteriaBuilder/CriteriaBuilder.js +1 -17
- package/dist/published/components/custom/CriteriaBuilder/ValueEditor.js +23 -8
- package/dist/published/components/custom/CriteriaBuilder/index.d.ts +2 -1
- package/dist/published/components/custom/CriteriaBuilder/index.js +2 -1
- package/dist/published/components/custom/CriteriaBuilder/utils.d.ts +13 -0
- package/dist/published/components/custom/CriteriaBuilder/utils.js +58 -1
- package/dist/published/components/custom/Form/Common/Form.js +20 -21
- package/dist/published/components/custom/Form/Common/FormComponentWrapper.js +2 -1
- package/dist/published/components/custom/Form/FormComponents/ObjectComponent/ObjectComponent.d.ts +2 -0
- package/dist/published/components/custom/Form/FormComponents/ObjectComponent/ObjectComponent.js +75 -26
- package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/ActionDialog.d.ts +5 -2
- package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/ActionDialog.js +4 -6
- package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/RepeatableField.js +3 -1
- package/dist/published/components/custom/Form/FormComponents/RepeatableFieldComponent/RepeatableFieldComponent.js +31 -13
- package/dist/published/components/custom/Form/tests/Form.test.d.ts +1 -0
- package/dist/published/components/custom/Form/tests/Form.test.js +112 -0
- package/dist/published/components/custom/Form/tests/test-data.d.ts +13 -0
- package/dist/published/components/custom/Form/tests/test-data.js +282 -0
- package/dist/published/components/custom/Form/utils.d.ts +10 -4
- package/dist/published/components/custom/Form/utils.js +133 -52
- package/dist/published/components/custom/HistoryLog/DisplayedProperty.d.ts +2 -1
- package/dist/published/components/custom/HistoryLog/DisplayedProperty.js +5 -2
- package/dist/published/components/custom/HistoryLog/HistoryData.d.ts +1 -0
- package/dist/published/components/custom/HistoryLog/HistoryData.js +9 -3
- package/dist/published/components/custom/HistoryLog/index.js +24 -2
- package/dist/published/components/custom/index.d.ts +1 -1
- package/dist/published/components/custom/index.js +1 -1
- package/dist/published/index.d.ts +1 -1
- package/dist/published/index.js +1 -1
- 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
|
-
|
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
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
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
|
-
|
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
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
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
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
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
|
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
|
};
|
@@ -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';
|
package/dist/published/index.js
CHANGED
@@ -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.
|
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",
|