buildPropsHierarchy + test
This commit is contained in:
parent
e383c03435
commit
dc0ad5c0d1
|
@ -0,0 +1,63 @@
|
||||||
|
import {
|
||||||
|
getComponentInfo, createProps, getInstanceProps
|
||||||
|
} from "./createProps";
|
||||||
|
import { cloneDeep } from "lodash/fp";
|
||||||
|
|
||||||
|
export const buildPropsHierarchy = (allComponents, baseComponent) => {
|
||||||
|
|
||||||
|
const buildProps = (componentName, propsDefinition, derivedFromProps) => {
|
||||||
|
|
||||||
|
const {props} = createProps(componentName, propsDefinition, derivedFromProps);
|
||||||
|
props._component = componentName;
|
||||||
|
for(let propName in props) {
|
||||||
|
if(propName === "_component") continue;
|
||||||
|
|
||||||
|
const propDef = propsDefinition[propName];
|
||||||
|
if(propDef.type === "component") {
|
||||||
|
|
||||||
|
const subComponentProps = props[propName];
|
||||||
|
|
||||||
|
if(!subComponentProps._component) continue;
|
||||||
|
|
||||||
|
const propComponentInfo = getComponentInfo(
|
||||||
|
allComponents, subComponentProps._component);
|
||||||
|
|
||||||
|
const subComponentInstanceProps = getInstanceProps(
|
||||||
|
propComponentInfo,
|
||||||
|
subComponentProps
|
||||||
|
);
|
||||||
|
|
||||||
|
props[propName] = buildProps(
|
||||||
|
propComponentInfo.rootComponent.name,
|
||||||
|
propComponentInfo.propsDefinition,
|
||||||
|
subComponentInstanceProps);
|
||||||
|
|
||||||
|
} else if(propDef.type === "array") {
|
||||||
|
const propsArray = props[propName];
|
||||||
|
const newPropsArray = [];
|
||||||
|
let index = 0;
|
||||||
|
for(let element of propsArray) {
|
||||||
|
newPropsArray.push(
|
||||||
|
buildProps(
|
||||||
|
`${propName}[${index}]`,
|
||||||
|
propDef.elementDefinition,
|
||||||
|
element));
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
props[propName] = newPropsArray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return props;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseComponentInfo = getComponentInfo(allComponents, baseComponent);
|
||||||
|
|
||||||
|
return buildProps(
|
||||||
|
baseComponentInfo.rootComponent.name,
|
||||||
|
baseComponentInfo.propsDefinition,
|
||||||
|
baseComponentInfo.fullProps);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
import { allComponents } from "./testData";
|
||||||
|
import {
|
||||||
|
find
|
||||||
|
} from "lodash/fp";
|
||||||
|
import { buildPropsHierarchy } from "../src/userInterface/pagesParsing/buildPropsHierarchy";
|
||||||
|
|
||||||
|
describe("buildPropsHierarchy", () => {
|
||||||
|
|
||||||
|
|
||||||
|
it("should build a complex component with arrays and components", () => {
|
||||||
|
|
||||||
|
const components = allComponents();
|
||||||
|
|
||||||
|
const allprops = buildPropsHierarchy(
|
||||||
|
components, "ButtonGroup");
|
||||||
|
|
||||||
|
expect(allprops._component).toEqual("budibase-components/div");
|
||||||
|
|
||||||
|
const primaryButtonProps = () => ({
|
||||||
|
_component: "budibase-components/Button",
|
||||||
|
css:"btn-primary",
|
||||||
|
content: {_component:""},
|
||||||
|
contentText: "",
|
||||||
|
size:""
|
||||||
|
});
|
||||||
|
|
||||||
|
const headerButton = primaryButtonProps();
|
||||||
|
expect(allprops.header).toEqual(headerButton);
|
||||||
|
|
||||||
|
const button1 = primaryButtonProps();
|
||||||
|
button1.contentText = "Button 1";
|
||||||
|
expect(allprops.children[0]).toEqual({
|
||||||
|
_component: "children[0]",
|
||||||
|
control: button1
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
const button2 = primaryButtonProps();
|
||||||
|
button2.contentText = "Button 2";
|
||||||
|
expect(allprops.children[1]).toEqual({
|
||||||
|
_component: "children[1]",
|
||||||
|
control: button2
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
|
@ -92,8 +92,8 @@ describe("getAncestorProps", () => {
|
||||||
|
|
||||||
expect(result).toEqual([
|
expect(result).toEqual([
|
||||||
components[0].props,
|
components[0].props,
|
||||||
{...components[2].props},
|
{...components[3].props},
|
||||||
{...components[3].props}
|
{...components[4].props}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -16,9 +16,24 @@ export const allComponents = () => ([
|
||||||
props: {
|
props: {
|
||||||
size: {type:"options", options:["small", "medium", "large"]},
|
size: {type:"options", options:["small", "medium", "large"]},
|
||||||
css: "string",
|
css: "string",
|
||||||
content: "component"
|
content: "component",
|
||||||
|
contentText: "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "budibase-components/div",
|
||||||
|
tags: ["input"],
|
||||||
|
props: {
|
||||||
|
width: "number",
|
||||||
|
header : "component",
|
||||||
|
children: {
|
||||||
|
type:"array",
|
||||||
|
elementDefinition: {
|
||||||
|
control: "component"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
inherits:"budibase-components/TextBox",
|
inherits:"budibase-components/TextBox",
|
||||||
name: "common/SmallTextbox",
|
name: "common/SmallTextbox",
|
||||||
|
@ -40,5 +55,31 @@ export const allComponents = () => ([
|
||||||
props: {
|
props: {
|
||||||
css:"btn-primary"
|
css:"btn-primary"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
inherits:"budibase-components/div",
|
||||||
|
name:"ButtonGroup",
|
||||||
|
props: {
|
||||||
|
|
||||||
|
width: 100,
|
||||||
|
header: {
|
||||||
|
_component: "PrimaryButton"
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
control: {
|
||||||
|
_component: "PrimaryButton",
|
||||||
|
contentText: "Button 1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
control: {
|
||||||
|
_component: "PrimaryButton",
|
||||||
|
contentText: "Button 2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
])
|
])
|
Loading…
Reference in New Issue