1
0
Fork 0
mirror of synced 2024-09-20 11:27:56 +12:00
budibase/packages/builder/src/userInterface/pagesParsing/createProps.js

100 lines
2.5 KiB
JavaScript
Raw Normal View History

import { isString, isUndefined } from "lodash/fp"
import { types } from "./types"
import { assign } from "lodash"
import { uuid } from "../../builderStore/uuid"
2019-08-15 09:11:59 +12:00
export const getNewScreen = (components, rootComponentName, name) => {
const rootComponent = components.find(c => c.name === rootComponentName)
return {
name: name || "",
description: "",
url: "",
_css: "",
uiFunctions: "",
props: createProps(rootComponent).props,
}
}
export const createProps = (componentDefinition, derivedFromProps) => {
const error = (propName, error) => errors.push({ propName, error })
2019-07-21 08:41:06 +12:00
const props = {
_component: componentDefinition.name,
_styles: { position: {}, layout: {} },
_id: uuid(),
_code: "",
}
2019-07-19 23:52:08 +12:00
const errors = []
2019-07-19 23:52:08 +12:00
if (!componentDefinition.name)
error("_component", "Component name not supplied")
2019-07-21 08:41:06 +12:00
const propsDef = componentDefinition.props
for (let propDef in propsDef) {
const parsedPropDef = parsePropDef(propsDef[propDef])
if (parsedPropDef.error) error(propDef, parsedPropDef.error)
else props[propDef] = parsedPropDef
}
2019-07-19 23:52:08 +12:00
if (derivedFromProps) {
assign(props, derivedFromProps)
}
2019-07-19 23:52:08 +12:00
if (componentDefinition.children !== false && isUndefined(props._children)) {
props._children = []
}
return {
props,
errors,
}
2019-07-19 23:52:08 +12:00
}
export const makePropsSafe = (componentDefinition, props) => {
const safeProps = createProps(componentDefinition, props).props
for (let propName in safeProps) {
props[propName] = safeProps[propName]
}
for (let propName in props) {
if (safeProps[propName] === undefined) {
delete props[propName]
}
}
return props
}
2019-07-19 23:52:08 +12:00
const parsePropDef = propDef => {
const error = message => ({ error: message, propDef })
2019-07-19 23:52:08 +12:00
if (isString(propDef)) {
if (!types[propDef]) return error(`Do not recognise type ${propDef}`)
return types[propDef].default()
}
2019-07-19 23:52:08 +12:00
if (!propDef.type) return error("Property Definition must declare a type")
const type = types[propDef.type]
if (!type) return error(`Do not recognise type ${propDef.type}`)
2019-07-19 23:52:08 +12:00
if (isUndefined(propDef.default)) return type.default(propDef)
2019-07-19 23:52:08 +12:00
if (!type.isOfType(propDef.default))
return error(`${propDef.default} is not of type ${type}`)
2019-07-19 23:52:08 +12:00
return propDef.default
2019-07-19 23:52:08 +12:00
}
export const arrayElementComponentName = (parentComponentName, arrayPropName) =>
`${parentComponentName}:${arrayPropName}`
2019-09-03 21:42:19 +12:00
2019-07-20 05:03:58 +12:00
/*
Allowed propDefOptions
- type: string, bool, number, array
- default: default value, when undefined
- required: field is required
*/