mirror of https://github.com/Budibase/budibase.git
5 changed files with 330 additions and 309 deletions
@ -1,221 +1,219 @@ |
|||
const LayoutTypes = { |
|||
MAIN: "main", |
|||
UNAUTHENTICATED: "unauthenticated", |
|||
} |
|||
|
|||
const MAIN = { |
|||
componentLibraries: ["@budibase/standard-components"], |
|||
title: "{{ name }}", |
|||
favicon: "./_shared/favicon.png", |
|||
stylesheets: [], |
|||
name: LayoutTypes.MAIN, |
|||
props: { |
|||
_id: "private-master-root", |
|||
_component: "@budibase/standard-components/container", |
|||
_children: [ |
|||
{ |
|||
_id: "c74f07266980c4b6eafc33e2a6caa783d", |
|||
_component: "@budibase/standard-components/container", |
|||
_styles: { |
|||
normal: { |
|||
display: "flex", |
|||
"flex-direction": "row", |
|||
"justify-content": "flex-start", |
|||
"align-items": "flex-start", |
|||
background: "#fff", |
|||
width: "100%", |
|||
"box-shadow": "0 1px 2px 0 rgba(0, 0, 0, 0.05)", |
|||
const BASE_LAYOUTS = [ |
|||
{ |
|||
componentLibraries: ["@budibase/standard-components"], |
|||
title: "{{ name }}", |
|||
favicon: "./_shared/favicon.png", |
|||
stylesheets: [], |
|||
name: "Main", |
|||
props: { |
|||
_id: "private-master-root", |
|||
_component: "@budibase/standard-components/container", |
|||
_children: [ |
|||
{ |
|||
_id: "c74f07266980c4b6eafc33e2a6caa783d", |
|||
_component: "@budibase/standard-components/container", |
|||
_styles: { |
|||
normal: { |
|||
display: "flex", |
|||
"flex-direction": "row", |
|||
"justify-content": "flex-start", |
|||
"align-items": "flex-start", |
|||
background: "#fff", |
|||
width: "100%", |
|||
"box-shadow": "0 1px 2px 0 rgba(0, 0, 0, 0.05)", |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
_code: "", |
|||
className: "", |
|||
onLoad: [], |
|||
type: "div", |
|||
_appId: "inst_app_80b_f158d4057d2c4bedb0042d42fda8abaf", |
|||
_instanceName: "Header", |
|||
_children: [ |
|||
{ |
|||
_id: "49e0e519-9e5e-4127-885a-ee6a0a49e2c1", |
|||
_component: "@budibase/standard-components/Navigation", |
|||
_styles: { |
|||
normal: { |
|||
"max-width": "1400px", |
|||
"margin-left": "auto", |
|||
"margin-right": "auto", |
|||
padding: "20px", |
|||
color: "#757575", |
|||
"font-weight": "400", |
|||
"font-size": "16px", |
|||
flex: "1 1 auto", |
|||
_code: "", |
|||
className: "", |
|||
onLoad: [], |
|||
type: "div", |
|||
_appId: "inst_app_80b_f158d4057d2c4bedb0042d42fda8abaf", |
|||
_instanceName: "Header", |
|||
_children: [ |
|||
{ |
|||
_id: "49e0e519-9e5e-4127-885a-ee6a0a49e2c1", |
|||
_component: "@budibase/standard-components/Navigation", |
|||
_styles: { |
|||
normal: { |
|||
"max-width": "1400px", |
|||
"margin-left": "auto", |
|||
"margin-right": "auto", |
|||
padding: "20px", |
|||
color: "#757575", |
|||
"font-weight": "400", |
|||
"font-size": "16px", |
|||
flex: "1 1 auto", |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
_code: "", |
|||
logoUrl: |
|||
"https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg", |
|||
title: "", |
|||
backgroundColor: "", |
|||
color: "", |
|||
borderWidth: "", |
|||
borderColor: "", |
|||
borderStyle: "", |
|||
_appId: "inst_cf8ace4_69efc0d72e6f443db2d4c902c14d9394", |
|||
_instanceName: "Navigation", |
|||
_children: [ |
|||
{ |
|||
_id: "48b35328-4c91-4343-a6a3-1a1fd77b3386", |
|||
_component: "@budibase/standard-components/link", |
|||
_styles: { |
|||
normal: { |
|||
"font-family": "Inter", |
|||
"font-weight": "500", |
|||
color: "#000000", |
|||
"text-decoration-line": "none", |
|||
"font-size": "16px", |
|||
_code: "", |
|||
logoUrl: |
|||
"https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg", |
|||
title: "", |
|||
backgroundColor: "", |
|||
color: "", |
|||
borderWidth: "", |
|||
borderColor: "", |
|||
borderStyle: "", |
|||
_appId: "inst_cf8ace4_69efc0d72e6f443db2d4c902c14d9394", |
|||
_instanceName: "Navigation", |
|||
_children: [ |
|||
{ |
|||
_id: "48b35328-4c91-4343-a6a3-1a1fd77b3386", |
|||
_component: "@budibase/standard-components/link", |
|||
_styles: { |
|||
normal: { |
|||
"font-family": "Inter", |
|||
"font-weight": "500", |
|||
color: "#000000", |
|||
"text-decoration-line": "none", |
|||
"font-size": "16px", |
|||
}, |
|||
hover: { |
|||
color: "#4285f4", |
|||
}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
hover: { |
|||
color: "#4285f4", |
|||
}, |
|||
active: {}, |
|||
selected: {}, |
|||
_code: "", |
|||
url: "/", |
|||
openInNewTab: false, |
|||
text: "Home", |
|||
color: "", |
|||
hoverColor: "", |
|||
underline: false, |
|||
fontSize: "", |
|||
fontFamily: "initial", |
|||
_appId: "inst_cf8ace4_69efc0d72e6f443db2d4c902c14d9394", |
|||
_instanceName: "Home Link", |
|||
_children: [], |
|||
}, |
|||
_code: "", |
|||
url: "/", |
|||
openInNewTab: false, |
|||
text: "Home", |
|||
color: "", |
|||
hoverColor: "", |
|||
underline: false, |
|||
fontSize: "", |
|||
fontFamily: "initial", |
|||
_appId: "inst_cf8ace4_69efc0d72e6f443db2d4c902c14d9394", |
|||
_instanceName: "Home Link", |
|||
_children: [], |
|||
}, |
|||
], |
|||
}, |
|||
], |
|||
}, |
|||
{ |
|||
_id: "7fcf11e4-6f5b-4085-8e0d-9f3d44c98967", |
|||
_component: "##builtin/screenslot", |
|||
_styles: { |
|||
normal: { |
|||
flex: "1 1 auto", |
|||
display: "flex", |
|||
"flex-direction": "column", |
|||
"justify-content": "flex-start", |
|||
"align-items": "stretch", |
|||
"max-width": "100%", |
|||
"margin-left": "20px", |
|||
"margin-right": "20px", |
|||
width: "1400px", |
|||
padding: "20px", |
|||
], |
|||
}, |
|||
], |
|||
}, |
|||
{ |
|||
_id: "7fcf11e4-6f5b-4085-8e0d-9f3d44c98967", |
|||
_component: "##builtin/screenslot", |
|||
_styles: { |
|||
normal: { |
|||
flex: "1 1 auto", |
|||
display: "flex", |
|||
"flex-direction": "column", |
|||
"justify-content": "flex-start", |
|||
"align-items": "stretch", |
|||
"max-width": "100%", |
|||
"margin-left": "20px", |
|||
"margin-right": "20px", |
|||
width: "1400px", |
|||
padding: "20px", |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
_code: "", |
|||
_children: [], |
|||
}, |
|||
_code: "", |
|||
_children: [], |
|||
}, |
|||
], |
|||
type: "div", |
|||
_styles: { |
|||
active: {}, |
|||
hover: {}, |
|||
normal: { |
|||
display: "flex", |
|||
"flex-direction": "column", |
|||
"align-items": "center", |
|||
"justify-content": "flex-start", |
|||
"margin-right": "auto", |
|||
"margin-left": "auto", |
|||
"min-height": "100%", |
|||
"background-image": |
|||
"linear-gradient(135deg, rgba(252,215,212,1) 20%, rgba(207,218,255,1) 100%);", |
|||
], |
|||
type: "div", |
|||
_styles: { |
|||
active: {}, |
|||
hover: {}, |
|||
normal: { |
|||
display: "flex", |
|||
"flex-direction": "column", |
|||
"align-items": "center", |
|||
"justify-content": "flex-start", |
|||
"margin-right": "auto", |
|||
"margin-left": "auto", |
|||
"min-height": "100%", |
|||
"background-image": |
|||
"linear-gradient(135deg, rgba(252,215,212,1) 20%, rgba(207,218,255,1) 100%);", |
|||
}, |
|||
selected: {}, |
|||
}, |
|||
selected: {}, |
|||
_code: "", |
|||
className: "", |
|||
onLoad: [], |
|||
}, |
|||
_code: "", |
|||
className: "", |
|||
onLoad: [], |
|||
}, |
|||
} |
|||
|
|||
const UNAUTHENTICATED = { |
|||
componentLibraries: ["@budibase/standard-components"], |
|||
title: "{{ name }}", |
|||
favicon: "./_shared/favicon.png", |
|||
stylesheets: [], |
|||
name: LayoutTypes.UNAUTHENTICATED, |
|||
props: { |
|||
_id: "public-master-root", |
|||
_component: "@budibase/standard-components/container", |
|||
_children: [ |
|||
{ |
|||
_id: "686c252d-dbf2-4e28-9078-414ba4719759", |
|||
_component: "@budibase/standard-components/login", |
|||
_styles: { |
|||
normal: { |
|||
padding: "64px", |
|||
background: "rgba(255, 255, 255, 0.4)", |
|||
"border-radius": "0.5rem", |
|||
"margin-top": "0px", |
|||
margin: "0px", |
|||
"line-height": "1", |
|||
"box-shadow": |
|||
"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)", |
|||
"font-size": "16px", |
|||
"font-family": "Inter", |
|||
flex: "0 1 auto", |
|||
transform: "0", |
|||
{ |
|||
componentLibraries: ["@budibase/standard-components"], |
|||
title: "{{ name }}", |
|||
favicon: "./_shared/favicon.png", |
|||
stylesheets: [], |
|||
name: "Unauthenticated", |
|||
props: { |
|||
_id: "public-master-root", |
|||
_component: "@budibase/standard-components/container", |
|||
_children: [ |
|||
{ |
|||
_id: "686c252d-dbf2-4e28-9078-414ba4719759", |
|||
_component: "@budibase/standard-components/login", |
|||
_styles: { |
|||
normal: { |
|||
padding: "64px", |
|||
background: "rgba(255, 255, 255, 0.4)", |
|||
"border-radius": "0.5rem", |
|||
"margin-top": "0px", |
|||
margin: "0px", |
|||
"line-height": "1", |
|||
"box-shadow": |
|||
"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)", |
|||
"font-size": "16px", |
|||
"font-family": "Inter", |
|||
flex: "0 1 auto", |
|||
transform: "0", |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
_code: "", |
|||
loginRedirect: "", |
|||
usernameLabel: "Username", |
|||
passwordLabel: "Password", |
|||
loginButtonLabel: "Login", |
|||
buttonClass: "", |
|||
_instanceName: "Login", |
|||
inputClass: "", |
|||
_children: [], |
|||
title: "Log in to {{ name }}", |
|||
buttonText: "Log In", |
|||
logo: |
|||
"https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg", |
|||
}, |
|||
_code: "", |
|||
loginRedirect: "", |
|||
usernameLabel: "Username", |
|||
passwordLabel: "Password", |
|||
loginButtonLabel: "Login", |
|||
buttonClass: "", |
|||
_instanceName: "Login", |
|||
inputClass: "", |
|||
_children: [], |
|||
title: "Log in to {{ name }}", |
|||
buttonText: "Log In", |
|||
logo: |
|||
"https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg", |
|||
}, |
|||
], |
|||
type: "div", |
|||
_styles: { |
|||
active: {}, |
|||
hover: {}, |
|||
normal: { |
|||
display: "flex", |
|||
"flex-direction": "column", |
|||
"align-items": "center", |
|||
"justify-content": "center", |
|||
"margin-right": "auto", |
|||
"margin-left": "auto", |
|||
"min-height": "100%", |
|||
"background-image": |
|||
"linear-gradient(135deg, rgba(252,215,212,1) 20%, rgba(207,218,255,1) 100%);", |
|||
], |
|||
type: "div", |
|||
_styles: { |
|||
active: {}, |
|||
hover: {}, |
|||
normal: { |
|||
display: "flex", |
|||
"flex-direction": "column", |
|||
"align-items": "center", |
|||
"justify-content": "center", |
|||
"margin-right": "auto", |
|||
"margin-left": "auto", |
|||
"min-height": "100%", |
|||
"background-image": |
|||
"linear-gradient(135deg, rgba(252,215,212,1) 20%, rgba(207,218,255,1) 100%);", |
|||
}, |
|||
selected: {}, |
|||
}, |
|||
selected: {}, |
|||
_code: "", |
|||
className: "", |
|||
onLoad: [], |
|||
}, |
|||
_code: "", |
|||
className: "", |
|||
onLoad: [], |
|||
}, |
|||
} |
|||
] |
|||
|
|||
module.exports = { MAIN, UNAUTHENTICATED, LayoutTypes } |
|||
module.exports = { |
|||
BASE_LAYOUTS, |
|||
} |
|||
|
|||
@ -0,0 +1,73 @@ |
|||
const handlebars = require("handlebars") |
|||
|
|||
handlebars.registerHelper("object", value => { |
|||
return new handlebars.SafeString(JSON.stringify(value)) |
|||
}) |
|||
|
|||
/** |
|||
* When running mustache statements to execute on the context of the automation it possible user's may input mustache |
|||
* in a few different forms, some of which are invalid but are logically valid. An example of this would be the mustache |
|||
* statement "{{steps[0].revision}}" here it is obvious the user is attempting to access an array or object using array |
|||
* like operators. These are not supported by Mustache and therefore the statement will fail. This function will clean up |
|||
* the mustache statement so it instead reads as "{{steps.0.revision}}" which is valid and will work. It may also be expanded |
|||
* to include any other mustache statement cleanup that has been deemed necessary for the system. |
|||
* |
|||
* @param {string} string The string which *may* contain mustache statements, it is OK if it does not contain any. |
|||
* @returns {string} The string that was input with cleaned up mustache statements as required. |
|||
*/ |
|||
function cleanMustache(string) { |
|||
let charToReplace = { |
|||
"[": ".", |
|||
"]": "", |
|||
} |
|||
let regex = new RegExp(/{{[^}}]*}}/g) |
|||
let matches = string.match(regex) |
|||
if (matches == null) { |
|||
return string |
|||
} |
|||
for (let match of matches) { |
|||
let baseIdx = string.indexOf(match) |
|||
for (let key of Object.keys(charToReplace)) { |
|||
let idxChar = match.indexOf(key) |
|||
if (idxChar !== -1) { |
|||
string = |
|||
string.slice(baseIdx, baseIdx + idxChar) + |
|||
charToReplace[key] + |
|||
string.slice(baseIdx + idxChar + 1) |
|||
} |
|||
} |
|||
} |
|||
return string |
|||
} |
|||
|
|||
/** |
|||
* Given an input object this will recurse through all props to try and update |
|||
* any handlebars/mustache statements within. |
|||
* @param {object|array} inputs The input structure which is to be recursed, it is important to note that |
|||
* if the structure contains any cycles then this will fail. |
|||
* @param {object} context The context that handlebars should fill data from. |
|||
* @returns {object|array} The structure input, as fully updated as possible. |
|||
*/ |
|||
function recurseMustache(inputs, context) { |
|||
// JSON stringify will fail if there are any cycles, stops infinite recursion
|
|||
try { |
|||
JSON.stringify(inputs) |
|||
} catch (err) { |
|||
throw "Unable to process inputs to JSON, cannot recurse" |
|||
} |
|||
for (let key of Object.keys(inputs)) { |
|||
let val = inputs[key] |
|||
if (typeof val === "string") { |
|||
val = cleanMustache(inputs[key]) |
|||
const template = handlebars.compile(val) |
|||
inputs[key] = template(context) |
|||
} |
|||
// this covers objects and arrays
|
|||
else if (typeof val === "object") { |
|||
inputs[key] = recurseMustache(inputs[key], context) |
|||
} |
|||
} |
|||
return inputs |
|||
} |
|||
|
|||
exports.recurseMustache = recurseMustache |
|||
Loading…
Reference in new issue