mirror of https://github.com/Budibase/budibase.git
12 changed files with 120 additions and 290 deletions
@ -0,0 +1,22 @@ |
|||
export default { |
|||
name: `Create from Scratch`, |
|||
create: () => createScreen(), |
|||
} |
|||
|
|||
const createScreen = () => ({ |
|||
props: { |
|||
_id: "", |
|||
_component: "@budibase/standard-components/container", |
|||
_styles: { |
|||
normal: {}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
type: "div", |
|||
_children: [], |
|||
_instanceName: "", |
|||
}, |
|||
route: "", |
|||
name: "screen-id", |
|||
}) |
|||
@ -0,0 +1,22 @@ |
|||
export default { |
|||
name: `New Record (Empty)`, |
|||
create: () => createScreen(), |
|||
} |
|||
|
|||
const createScreen = () => ({ |
|||
props: { |
|||
_id: "", |
|||
_component: "@budibase/standard-components/recorddetail", |
|||
_styles: { |
|||
normal: {}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
_children: [], |
|||
_instanceName: "", |
|||
model: "", |
|||
}, |
|||
route: "", |
|||
name: "screen-id", |
|||
}) |
|||
@ -0,0 +1,22 @@ |
|||
export default { |
|||
name: `Record Detail (Empty)`, |
|||
create: () => createScreen(), |
|||
} |
|||
|
|||
const createScreen = () => ({ |
|||
props: { |
|||
_id: "", |
|||
_component: "@budibase/standard-components/recorddetail", |
|||
_styles: { |
|||
normal: {}, |
|||
hover: {}, |
|||
active: {}, |
|||
selected: {}, |
|||
}, |
|||
_children: [], |
|||
_instanceName: "", |
|||
model: "", |
|||
}, |
|||
route: "", |
|||
name: "screen-id", |
|||
}) |
|||
@ -1,62 +0,0 @@ |
|||
<script> |
|||
import { store, backendUiStore } from "builderStore" |
|||
import { Input, Select, Button, Spacer } from "@budibase/bbui" |
|||
import getTemplates from "builderStore/store/screenTemplates" |
|||
import { createEventDispatcher } from "svelte" |
|||
const dispatch = createEventDispatcher() |
|||
|
|||
let screens |
|||
let template |
|||
|
|||
$: templates = getTemplates($store, $backendUiStore.models) |
|||
|
|||
const save = () => { |
|||
if (!template) return |
|||
if (template === "none") { |
|||
dispatch("next") |
|||
return |
|||
} |
|||
|
|||
store.createScreen({ |
|||
screen: template.create(), |
|||
}) |
|||
|
|||
dispatch("finished") |
|||
} |
|||
|
|||
const cancel = () => { |
|||
dispatch("finished") |
|||
} |
|||
</script> |
|||
|
|||
<div data-cy="new-screen-dialog"> |
|||
|
|||
<div class="bb-margin-xl"> |
|||
<label>Choose a Template</label> |
|||
<Select bind:value={template} secondary> |
|||
<option value="">Choose an Option</option> |
|||
<option value="none">No Template</option> |
|||
{#if templates} |
|||
{#each templates as template} |
|||
<option value={template}>{template.name}</option> |
|||
{/each} |
|||
{/if} |
|||
</Select> |
|||
</div> |
|||
</div> |
|||
|
|||
<Spacer extraLarge /> |
|||
|
|||
<div data-cy="create-screen-footer" class="modal-footer"> |
|||
<Button secondary medium on:click={cancel}>Cancel</Button> |
|||
<Button blue medium on:click={save} disabled={!template}> |
|||
{template === 'none' ? 'Next' : 'Create Screen'} |
|||
</Button> |
|||
</div> |
|||
|
|||
<style> |
|||
.modal-footer { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
} |
|||
</style> |
|||
@ -1,50 +0,0 @@ |
|||
<script> |
|||
import { store } from "builderStore" |
|||
import { Modal, Spacer } from "@budibase/bbui" |
|||
import ChooseTemplate from "./ChooseTemplate.svelte" |
|||
import NoTemplate from "./NoTemplate.svelte" |
|||
import { slide, fade } from "svelte/transition" |
|||
|
|||
export const show = () => { |
|||
dialog.show() |
|||
} |
|||
|
|||
const finished = () => { |
|||
dialog.hide() |
|||
template = undefined |
|||
} |
|||
|
|||
let dialog |
|||
let template |
|||
</script> |
|||
|
|||
<Modal bind:this={dialog} minWidth="500px"> |
|||
<h2>New Screen</h2> |
|||
<Spacer extraLarge /> |
|||
|
|||
{#if template === 'none'} |
|||
<div transition:slide={{ delay: 0, duration: 300 }}> |
|||
<NoTemplate on:finished={finished} /> |
|||
</div> |
|||
{:else} |
|||
<div transition:fade={{ delay: 0, duration: 100 }}> |
|||
<ChooseTemplate |
|||
on:finished={finished} |
|||
on:next={() => (template = 'none')} /> |
|||
</div> |
|||
{/if} |
|||
</Modal> |
|||
|
|||
<style> |
|||
h2 { |
|||
font-size: var(--font-size-xl); |
|||
margin: 0; |
|||
font-family: var(--font-sans); |
|||
font-weight: 600; |
|||
} |
|||
|
|||
.modal-footer { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
} |
|||
</style> |
|||
@ -1,118 +0,0 @@ |
|||
<script> |
|||
import { store } from "builderStore" |
|||
import { Input, Button, Spacer, Select } from "@budibase/bbui" |
|||
import { createEventDispatcher } from "svelte" |
|||
import { some } from "lodash/fp" |
|||
|
|||
const dispatch = createEventDispatcher() |
|||
const CONTAINER = "@budibase/standard-components/container" |
|||
|
|||
let screens |
|||
let name = "" |
|||
let routeError |
|||
let baseComponent = CONTAINER |
|||
|
|||
$: route = !route && $store.screens.length === 0 ? "*" : route |
|||
|
|||
$: baseComponents = Object.values($store.components) |
|||
.filter(componentDefinition => componentDefinition.baseComponent) |
|||
.map(c => c._component) |
|||
|
|||
const save = () => { |
|||
if (!route) { |
|||
routeError = "Url is required" |
|||
} else { |
|||
if (routeNameExists(route)) { |
|||
routeError = "This url is already taken" |
|||
} else { |
|||
routeError = "" |
|||
} |
|||
} |
|||
|
|||
if (routeError) return false |
|||
|
|||
store.createScreen({ |
|||
screenName: name, |
|||
route, |
|||
baseComponent, |
|||
}) |
|||
|
|||
name = "" |
|||
route = "" |
|||
baseComponent = CONTAINER |
|||
dispatch("finished") |
|||
} |
|||
|
|||
const cancel = () => { |
|||
dispatch("finished") |
|||
} |
|||
|
|||
const routeNameExists = route => { |
|||
return $store.screens.some( |
|||
screen => screen.route.toLowerCase() === route.toLowerCase() |
|||
) |
|||
} |
|||
|
|||
const routeChanged = event => { |
|||
if (!event.target.value.startsWith("/")) { |
|||
route = "/" + event.target.value |
|||
} |
|||
} |
|||
|
|||
const componentShortName = fullname => { |
|||
const parts = fullname.split("/") |
|||
const shortName = parts[parts.length - 1] |
|||
// make known ones a bit prettier |
|||
if (shortName === "container") return "Container" |
|||
if (shortName === "recorddetail") return "Record Detail" |
|||
if (shortName === "newrecord") return "New Record" |
|||
return shortName |
|||
} |
|||
</script> |
|||
|
|||
<Spacer extraLarge /> |
|||
|
|||
<div data-cy="new-screen-dialog"> |
|||
<div class="bb-margin-xl"> |
|||
<Input label="Name" bind:value={name} /> |
|||
</div> |
|||
|
|||
<div class="bb-margin-xl"> |
|||
<Input |
|||
label="Url" |
|||
error={routeError} |
|||
bind:value={route} |
|||
on:change={routeChanged} /> |
|||
</div> |
|||
|
|||
<div class="bb-margin-xl"> |
|||
<label>Screen Type</label> |
|||
<Select bind:value={baseComponent} secondary> |
|||
{#each baseComponents as component} |
|||
<option value={component}>{componentShortName(component)}</option> |
|||
{/each} |
|||
</Select> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
<Spacer extraLarge /> |
|||
|
|||
<div data-cy="create-screen-footer" class="modal-footer"> |
|||
<Button secondary medium on:click={cancel}>Cancel</Button> |
|||
<Button blue medium on:click={save}>Create Screen</Button> |
|||
</div> |
|||
|
|||
<style> |
|||
h2 { |
|||
font-size: var(--font-size-xl); |
|||
margin: 0; |
|||
font-family: var(--font-sans); |
|||
font-weight: 600; |
|||
} |
|||
|
|||
.modal-footer { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue