Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8,170 changes: 8,149 additions & 21 deletions package-lock.json

Large diffs are not rendered by default.

206 changes: 103 additions & 103 deletions src/objectmap-jsonforms/package-lock.json

Large diffs are not rendered by default.

8 changes: 6 additions & 2 deletions src/objectmap-jsonforms/src/ObjectMap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import { rankWith, ControlProps, JsonSchema, and, uiTypeIs } from '@jsonforms/co
import Row from './Row';
import { Typography } from '@material-ui/core';

interface Row {
target: Enum;
}

interface Enum {
value: string;
label?: string;
Expand Down Expand Up @@ -31,7 +35,7 @@ const ObjectMapControlVanillaRenderer = ({ data, handleChange, path, ...props }:
const schema = props.schema as JsonSchemaWithCustomProps;

const handleRowChange = (targetValue: string, source: Enum) => {
const i = data.findIndex((row: any) => row.target.value === targetValue);
const i = data.findIndex((row: Row) => row.target.value === targetValue);

if (source.type === 'clearable') {
data[i] = { target: data[i].target };
Expand All @@ -52,7 +56,7 @@ const ObjectMapControlVanillaRenderer = ({ data, handleChange, path, ...props }:
{schema.items.properties.source.title}
</Typography>
</div>
{schema.items.properties.target.enum.map((e: any) => {
{schema.items.properties.target.enum.map((e: Enum) => {
return (
<Row key={e.value} target={e} sourceEnum={schema.items.properties.source.enum} onChange={handleRowChange} />
);
Expand Down
4 changes: 2 additions & 2 deletions src/objectmap-jsonforms/src/Row.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ const Row = ({ target, sourceEnum, onChange }: Props) => {
<Select
label="Select a Property"
value={targetValue}
onChange={(e: any) => {
onChange={(e) => {
const source = sourceEnum.find((val) => val.value === e.target.value);

if (!source) {
return;
}

setTargetValue(e.target.value);
setTargetValue(e.target.value as string);
onChange(target?.value || '', source);
}}
>
Expand Down
76 changes: 49 additions & 27 deletions src/objectmap-jsonforms/src/SourceTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,57 @@ import { Table, TableBody, TableCell, TableRow, TableHead, TableContainer, Paper
import dot from 'dot-object';

const SourceTableVanillaRenderer = ({ data }: ControlProps) => {
const baseTable = useMemo(() => {
return dot.dot(data);
const { baseTable, isDataEmpty, renderTable } = useMemo(() => {
const sourceData = data || {};

if (!data) {
return { baseTable: null, renderTable: false, isDataEmpty: true };
}

if (Object.keys(sourceData).length === 0) {
return { baseTable: null, renderTable: true, isDataEmpty: true };
}

return { baseTable: dot.dot(sourceData), renderTable: true, isDataEmpty: false };
}, [data]);

return (
<div>
<Typography variant="h5" style={{ width: 'max-content', margin: '16px 0' }}>
Source Data
</Typography>
<TableContainer component={Paper} style={{ marginBottom: '16px' }}>
<Table>
<TableHead>
<TableRow>
{Object.keys(baseTable).map((val) => (
<TableCell key={val}>{val}</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
<TableRow>
{Object.keys(baseTable).map((val) => (
<TableCell key={val}>{dot.pick(val, data)}</TableCell>
))}
</TableRow>
</TableBody>
</Table>
</TableContainer>
</div>
);
if (renderTable && isDataEmpty) {
return (
<div>
<Typography style={{ width: 'max-content', margin: '16px 0' }}>No Data Found</Typography>
</div>
);
}

if (renderTable && !isDataEmpty) {
return (
<div>
<Typography variant="h5" style={{ width: 'max-content', margin: '16px 0' }}>
Source Data
</Typography>
<TableContainer component={Paper} style={{ marginBottom: '16px' }}>
<Table>
<TableHead>
<TableRow>
{Object.keys(baseTable).map((val) => (
<TableCell key={val}>{val}</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
<TableRow>
{Object.keys(baseTable).map((val) => (
<TableCell key={val}>{baseTable[val]}</TableCell>
))}
</TableRow>
</TableBody>
</Table>
</TableContainer>
</div>
);
}

return null;
};

const SourceTableTester = rankWith(3, and(uiTypeIs('SourceTable')));
Expand Down
14 changes: 10 additions & 4 deletions src/objectmap-jsonforms/src/TransformedTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,21 @@ import { rankWith, ControlProps, and, uiTypeIs } from '@jsonforms/core';
import { Table, TableBody, TableCell, TableRow, TableHead, TableContainer, Paper, Typography } from '@material-ui/core';
import { objectMap } from '@fusebit/objectmap-utils';
import dot from 'dot-object';
import { AnyObject } from './types';

const TransformedTableVanillaRenderer = ({ data }: ControlProps) => {
const ctx = useJsonForms();

const tranformedTable: any = useMemo(() => {
return dot.dot(objectMap.transformData(ctx.core.data, data)) || [];
const tranformedTable: AnyObject = useMemo(() => {
const sourceData = [dot.object(data || {})];
const transformedDataArray = objectMap.transformData(ctx.core.data, sourceData);
const transformedDataObject = transformedDataArray?.[0] || {};
return dot.dot(transformedDataObject) || [];
}, [ctx.core.data, data]);

return (
const renderTable = Object.keys(data || {}).length > 0;

return renderTable ? (
<div>
{Object.keys(tranformedTable || []).length > 0 && (
<>
Expand Down Expand Up @@ -40,7 +46,7 @@ const TransformedTableVanillaRenderer = ({ data }: ControlProps) => {
</>
)}
</div>
);
) : null;
};

const TransformedTableTester = rankWith(3, and(uiTypeIs('TransformedTable')));
Expand Down
1 change: 1 addition & 0 deletions src/objectmap-jsonforms/src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type AnyObject = Record<string, any>;
56 changes: 30 additions & 26 deletions src/objectmap-utils/src/sdk.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import dot from 'dot-object';
import { AnyObject } from './types';

const getKeyWithoutLastElement = (key: string) => {
const splittedKey = key.split('.');
Expand All @@ -12,8 +13,8 @@ const parseKey = (key: string) => {
return objectKey;
};

const generateEnum = (schema: any) => {
const schemaEnum: any = [];
const generateEnum = (schema: AnyObject) => {
const schemaEnum: AnyObject[] = [];

Object.keys(dot.dot(schema.properties)).forEach((key) => {
const value = parseKey(key);
Expand All @@ -29,15 +30,15 @@ const generateEnum = (schema: any) => {
return schemaEnum;
};

export const getKeyByUiSchemaType = (uischema: any, type: string) => {
let objectKey = null;
export const getKeyByUiSchemaType = (uischema: AnyObject, type: string) => {
let objectKey = '';

Object.keys(dot.dot(uischema)).forEach((element) => {
if (element.includes('type') && dot.pick(element, uischema) === type) {
const scopePicker = element.replace('type', 'scope');
const scope = dot.pick(scopePicker, uischema);
const splittedScope = scope.split('/');
const key = splittedScope[splittedScope.length - 1];
const key: string = splittedScope[splittedScope.length - 1];
objectKey = key;
}
});
Expand All @@ -51,14 +52,14 @@ export const createSchema = ({
uischema,
dataToTransform,
}: {
source: any;
target: any;
uischema: any;
dataToTransform: any;
source: AnyObject;
target: AnyObject;
uischema: AnyObject;
dataToTransform?: AnyObject;
}) => {
const objectMapKey: any = getKeyByUiSchemaType(uischema, 'ObjectMap');
const sourceTableKey: any = getKeyByUiSchemaType(uischema, 'SourceTable');
const TransformedTableKey: any = getKeyByUiSchemaType(uischema, 'TransformedTable');
const objectMapKey = getKeyByUiSchemaType(uischema, 'ObjectMap');
const sourceTableKey = getKeyByUiSchemaType(uischema, 'SourceTable');
const TransformedTableKey = getKeyByUiSchemaType(uischema, 'TransformedTable');
const sourceEnum = generateEnum(source);
const targetEnum = generateEnum(target);

Expand Down Expand Up @@ -90,9 +91,9 @@ export const createSchema = ({
};

return {
schema: schema,
schema,
data: {
[objectMapKey]: targetEnum.map((target: any) => ({ target })),
[objectMapKey]: targetEnum.map((target: AnyObject) => ({ target })),
[sourceTableKey]: dataToTransform,
[TransformedTableKey]: dataToTransform,
baseKeys: {
Expand All @@ -104,14 +105,13 @@ export const createSchema = ({
};
};

export const createRecipe = (data: any) => {
export const createRecipe = (data: AnyObject) => {
if (!data.baseKeys.objectMapKey) {
return;
}

return data?.[data.baseKeys.objectMapKey]?.reduce(
//@ts-ignore
(acc, { source, target }) => {
(acc: AnyObject, { source, target }: { source: { value: AnyObject }; target: { value: string } }) => {
if (!source?.value) {
return acc;
}
Expand All @@ -124,17 +124,21 @@ export const createRecipe = (data: any) => {
);
};

export const transformData = (data: any, sourceData: any) => {
export const transformData = (data: AnyObject, sourceData: AnyObject[]) => {
try {
const recipe = createRecipe(data);
const transformedData = Object.keys(recipe || []).reduce((acc: any, curr) => {
const sourceKey = recipe[curr];
const sourceValue = dot.pick(sourceKey, sourceData);
acc[curr] = sourceValue;
return dot.object(acc);
}, {});

return transformedData;
const transformations = sourceData.map((source) => {
const transformedData = Object.keys(recipe || []).reduce((acc: AnyObject, curr) => {
const sourceKey = recipe[curr];
const sourceValue = dot.pick(sourceKey, source);
acc[curr] = sourceValue;
return dot.object(acc);
}, {});

return transformedData;
});

return transformations;
} catch (e) {
console.error(e);
}
Expand Down
1 change: 1 addition & 0 deletions src/objectmap-utils/src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type AnyObject = Record<string, any>;