1
0
Fork 0
mirror of synced 2024-07-12 17:56:07 +12:00

Merge pull request #741 from Budibase/mike-fixes

Bugfixes, love from mike
This commit is contained in:
Michael Shanks 2020-10-16 22:54:18 +01:00 committed by GitHub
commit 88efc3cb15
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 73 additions and 111 deletions

View file

@ -1,3 +1,6 @@
import sanitizeUrl from "./sanitizeUrl"
import { rowListUrl } from "./rowListScreen"
export default function(tables) { export default function(tables) {
return tables.map(table => { return tables.map(table => {
return { return {
@ -8,6 +11,7 @@ export default function(tables) {
}) })
} }
export const newRowUrl = table => sanitizeUrl(`/${table.name}/new`)
export const NEW_ROW_TEMPLATE = "NEW_ROW_TEMPLATE" export const NEW_ROW_TEMPLATE = "NEW_ROW_TEMPLATE"
const createScreen = table => ({ const createScreen = table => ({
@ -216,7 +220,7 @@ const createScreen = table => ({
}, },
{ {
parameters: { parameters: {
url: `/${table.name.toLowerCase()}`, url: rowListUrl(table),
}, },
"##eventHandlerType": "Navigate To", "##eventHandlerType": "Navigate To",
}, },
@ -246,6 +250,6 @@ const createScreen = table => ({
_instanceName: `${table.name} - New`, _instanceName: `${table.name} - New`,
_code: "", _code: "",
}, },
route: `/${table.name.toLowerCase()}/new`, route: newRowUrl(table),
name: "", name: "",
}) })

View file

@ -1,3 +1,6 @@
import sanitizeUrl from "./sanitizeUrl"
import { rowListUrl } from "./rowListScreen"
export default function(tables) { export default function(tables) {
return tables.map(table => { return tables.map(table => {
const heading = table.primaryDisplay const heading = table.primaryDisplay
@ -12,6 +15,7 @@ export default function(tables) {
} }
export const ROW_DETAIL_TEMPLATE = "ROW_DETAIL_TEMPLATE" export const ROW_DETAIL_TEMPLATE = "ROW_DETAIL_TEMPLATE"
export const rowDetailUrl = table => sanitizeUrl(`/${table.name}/:id`)
const createScreen = (table, heading) => ({ const createScreen = (table, heading) => ({
props: { props: {
@ -224,7 +228,7 @@ const createScreen = (table, heading) => ({
}, },
{ {
parameters: { parameters: {
url: `/${table.name.toLowerCase()}`, url: rowListUrl(table),
}, },
"##eventHandlerType": "Navigate To", "##eventHandlerType": "Navigate To",
}, },
@ -265,7 +269,7 @@ const createScreen = (table, heading) => ({
}, },
{ {
parameters: { parameters: {
url: `/${table.name.toLowerCase()}`, url: rowListUrl(table),
}, },
"##eventHandlerType": "Navigate To", "##eventHandlerType": "Navigate To",
}, },
@ -295,6 +299,6 @@ const createScreen = (table, heading) => ({
_instanceName: `${table.name} - Detail`, _instanceName: `${table.name} - Detail`,
_code: "", _code: "",
}, },
route: `/${table.name.toLowerCase()}/:id`, route: rowDetailUrl(table),
name: "", name: "",
}) })

View file

@ -1,3 +1,6 @@
import sanitizeUrl from "./sanitizeUrl"
import { newRowUrl } from "./newRowScreen"
export default function(tables) { export default function(tables) {
return tables.map(table => { return tables.map(table => {
return { return {
@ -9,6 +12,7 @@ export default function(tables) {
} }
export const ROW_LIST_TEMPLATE = "ROW_LIST_TEMPLATE" export const ROW_LIST_TEMPLATE = "ROW_LIST_TEMPLATE"
export const rowListUrl = table => sanitizeUrl(`/${table.name}`)
const createScreen = table => ({ const createScreen = table => ({
props: { props: {
@ -120,7 +124,7 @@ const createScreen = table => ({
onClick: [ onClick: [
{ {
parameters: { parameters: {
url: `/${table.name.toLowerCase()}/new`, url: newRowUrl(table),
}, },
"##eventHandlerType": "Navigate To", "##eventHandlerType": "Navigate To",
}, },
@ -163,6 +167,6 @@ const createScreen = table => ({
className: "", className: "",
onLoad: [], onLoad: [],
}, },
route: `/${table.name.toLowerCase()}`, route: rowListUrl(table),
name: "", name: "",
}) })

View file

@ -0,0 +1,11 @@
export default function(url) {
return url
.split("/")
.map(part => {
// if parameter, then use as is
if (part.startsWith(":")) return part
return encodeURIComponent(part.replace(" ", "-"))
})
.join("/")
.toLowerCase()
}

View file

@ -40,7 +40,7 @@
$: tableOptions = $backendUiStore.tables.filter( $: tableOptions = $backendUiStore.tables.filter(
table => table._id !== $backendUiStore.draftTable._id table => table._id !== $backendUiStore.draftTable._id
) )
$: required = !!field?.constraints?.presence $: required = !!field?.constraints?.presence || primaryDisplay
async function saveColumn() { async function saveColumn() {
backendUiStore.update(state => { backendUiStore.update(state => {
@ -67,6 +67,14 @@
field.constraints.presence = req ? { allowEmpty: false } : false field.constraints.presence = req ? { allowEmpty: false } : false
required = req required = req
} }
function onChangePrimaryDisplay(e) {
const isPrimary = e.target.checked
// primary display is always required
if (isPrimary) {
field.constraints.presence = { allowEmpty: false }
}
}
</script> </script>
<div class="actions"> <div class="actions">
@ -88,6 +96,7 @@
<Toggle <Toggle
checked={required} checked={required}
on:change={onChangeRequired} on:change={onChangeRequired}
disabled={primaryDisplay}
thin thin
text="Required" /> text="Required" />
{/if} {/if}
@ -95,6 +104,7 @@
{#if field.type !== 'link'} {#if field.type !== 'link'}
<Toggle <Toggle
bind:checked={primaryDisplay} bind:checked={primaryDisplay}
on:change={onChangePrimaryDisplay}
thin thin
text="Use as table display column" /> text="Use as table display column" />
{/if} {/if}

View file

@ -132,12 +132,6 @@ export default {
}, },
], ],
}, },
{
name: "Input",
description: "These components handle user input.",
icon: "ri-edit-box-line",
commonProps: {},
children: [
{ {
_component: "@budibase/standard-components/input", _component: "@budibase/standard-components/input",
name: "Textfield", name: "Textfield",
@ -157,39 +151,6 @@ export default {
], ],
}, },
}, },
{
_component: "@budibase/standard-components/checkbox",
name: "Checkbox",
description: "A selectable checkbox component",
icon: "ri-checkbox-line",
properties: {
design: { ...all },
settings: [{ label: "Label", key: "label", control: Input }],
},
},
{
_component: "@budibase/standard-components/radiobutton",
name: "Radiobutton",
description: "A selectable radiobutton component",
icon: "ri-radio-button-line",
properties: {
design: { ...all },
settings: [{ label: "Label", key: "label", control: Input }],
},
},
{
_component: "@budibase/standard-components/select",
name: "Select",
description:
"A select component for choosing from different options",
icon: "ri-file-list-line",
properties: {
design: { ...all },
settings: [],
},
},
],
},
{ {
_component: "@budibase/standard-components/button", _component: "@budibase/standard-components/button",
name: "Button", name: "Button",
@ -584,48 +545,6 @@ export default {
}, },
], ],
}, },
{
name: "Table",
_component: "@budibase/standard-components/datatable",
description: "A component that generates a table from your data.",
icon: "ri-archive-drawer-line",
properties: {
design: { ...all },
settings: [
{
label: "Data",
key: "datasource",
control: TableViewSelect,
},
{
label: "Stripe Color",
key: "stripeColor",
control: Colorpicker,
defaultValue: "#FFFFFF",
},
{
label: "Border Color",
key: "borderColor",
control: Colorpicker,
defaultValue: "#FFFFFF",
},
{
label: "TH Color",
key: "backgroundColor",
control: Colorpicker,
defaultValue: "#FFFFFF",
},
{
label: "TH Font Color",
key: "color",
control: Colorpicker,
defaultValue: "#FFFFFF",
},
{ label: "Table", key: "table", control: TableSelect },
],
},
children: [],
},
{ {
name: "Form", name: "Form",
description: "A component that generates a form from your data.", description: "A component that generates a form from your data.",

View file

@ -3,6 +3,19 @@ import appStore from "../state/store"
import { parseAppIdFromCookie } from "./getAppId" import { parseAppIdFromCookie } from "./getAppId"
export const screenRouter = ({ screens, onScreenSelected, window }) => { export const screenRouter = ({ screens, onScreenSelected, window }) => {
function sanitize(url) {
if (!url) return url
return url
.split("/")
.map(part => {
// if parameter, then use as is
if (part.startsWith(":")) return part
return encodeURIComponent(part)
})
.join("/")
.toLowerCase()
}
const isRunningLocally = () => { const isRunningLocally = () => {
const hostname = (window.location && window.location.hostname) || "" const hostname = (window.location && window.location.hostname) || ""
return ( return (
@ -16,6 +29,7 @@ export const screenRouter = ({ screens, onScreenSelected, window }) => {
if (isRunningLocally()) { if (isRunningLocally()) {
const appId = parseAppIdFromCookie(window.document.cookie) const appId = parseAppIdFromCookie(window.document.cookie)
if (url) { if (url) {
url = sanitize(url)
if (!url.startsWith("/")) { if (!url.startsWith("/")) {
url = `/${url}` url = `/${url}`
} }
@ -26,7 +40,7 @@ export const screenRouter = ({ screens, onScreenSelected, window }) => {
} }
return `/${appId}` return `/${appId}`
} }
return url return sanitize(url)
} }
const routes = screens.map(s => makeRootedPath(s.route)) const routes = screens.map(s => makeRootedPath(s.route))

View file

@ -18,7 +18,7 @@
bind:this={theButton} bind:this={theButton}
class="default" class="default"
disabled={disabled || false} disabled={disabled || false}
on:click={clickHandler}> on:click|once={clickHandler}>
{#if !_bb.props._children || _bb.props._children.length === 0}{text}{/if} {#if !_bb.props._children || _bb.props._children.length === 0}{text}{/if}
</button> </button>

View file

@ -4,11 +4,8 @@ export { default as container } from "./Container.svelte"
export { default as text } from "./Text.svelte" export { default as text } from "./Text.svelte"
export { default as heading } from "./Heading.svelte" export { default as heading } from "./Heading.svelte"
export { default as input } from "./Input.svelte" export { default as input } from "./Input.svelte"
export { default as select } from "./Select.svelte"
export { default as textfield } from "./Textfield.svelte" export { default as textfield } from "./Textfield.svelte"
export { default as checkbox } from "./Checkbox.svelte"
export { default as radiobutton } from "./Radiobutton.svelte"
export { default as option } from "./Option.svelte"
export { default as button } from "./Button.svelte" export { default as button } from "./Button.svelte"
export { default as login } from "./Login.svelte" export { default as login } from "./Login.svelte"
export { default as saveRowButton } from "./Templates/saveRowButton" export { default as saveRowButton } from "./Templates/saveRowButton"
@ -16,7 +13,6 @@ export { default as link } from "./Link.svelte"
export { default as image } from "./Image.svelte" export { default as image } from "./Image.svelte"
export { default as Navigation } from "./Navigation.svelte" export { default as Navigation } from "./Navigation.svelte"
export { default as datagrid } from "./DataGrid/Component.svelte" export { default as datagrid } from "./DataGrid/Component.svelte"
export { default as datatable } from "./DataTable.svelte"
export { default as dataform } from "./DataForm.svelte" export { default as dataform } from "./DataForm.svelte"
export { default as dataformwide } from "./DataFormWide.svelte" export { default as dataformwide } from "./DataFormWide.svelte"
export { default as datachart } from "./DataChart.svelte" export { default as datachart } from "./DataChart.svelte"