1
0
Fork 0
mirror of synced 2024-06-03 02:55:14 +12:00
budibase/packages/builder/src/components/design/NavigationPanel/NewScreenModal.svelte

118 lines
3.1 KiB
Svelte
Raw Normal View History

<script>
import { store, allScreens, selectedAccessRole } from "builderStore"
import { tables } from "stores/backend"
import { roles } from "stores/backend"
import { Input, Select, ModalContent, Toggle } from "@budibase/bbui"
import getTemplates from "builderStore/store/screenTemplates"
import analytics, { Events } from "analytics"
import sanitizeUrl from "builderStore/store/screenTemplates/utils/sanitizeUrl"
2020-10-09 02:53:06 +13:00
const CONTAINER = "@budibase/standard-components/container"
2020-02-03 22:50:30 +13:00
let name = ""
2020-08-19 04:14:35 +12:00
let routeError
2020-10-09 02:53:06 +13:00
let baseComponent = CONTAINER
2020-10-09 23:58:46 +13:00
let templateIndex
let draftScreen
let createLink = true
let roleId = $selectedAccessRole || "BASIC"
2020-02-26 04:21:23 +13:00
$: templates = getTemplates($store, $tables.list)
$: route = !route && $allScreens.length === 0 ? "*" : route
2020-10-09 23:58:46 +13:00
$: {
if (templates && templateIndex === undefined) {
templateIndex = 0
templateChanged(0)
}
}
2021-05-04 22:32:22 +12:00
const templateChanged = newTemplateIndex => {
2020-10-09 23:58:46 +13:00
if (newTemplateIndex === undefined) return
draftScreen = templates[newTemplateIndex].create()
if (draftScreen.props._instanceName) {
name = draftScreen.props._instanceName
}
if (draftScreen.props._component) {
baseComponent = draftScreen.props._component
}
if (draftScreen.routing) {
route = draftScreen.routing.route
}
}
const save = async () => {
if (!route) {
routeError = "URL is required"
2020-08-19 04:14:35 +12:00
} else {
if (routeExists(route, roleId)) {
routeError = "This URL is already taken for this access role"
2020-08-19 04:14:35 +12:00
} else {
routeError = ""
}
}
2020-10-09 02:53:06 +13:00
if (routeError) return false
draftScreen.props._instanceName = name
draftScreen.props._component = baseComponent
draftScreen.routing = { route, roleId }
await store.actions.screens.create(draftScreen)
if (createLink) {
await store.actions.components.links.save(route, name)
}
2020-11-21 00:41:17 +13:00
await store.actions.routing.fetch()
if (templateIndex !== undefined) {
const template = templates[templateIndex]
analytics.captureEvent(Events.SCREEN.CREATED, {
template: template.id || template.name,
})
}
2020-02-03 22:50:30 +13:00
}
const routeExists = (route, roleId) => {
return $allScreens.some(
2021-05-04 22:32:22 +12:00
screen =>
screen.routing.route.toLowerCase() === route.toLowerCase() &&
screen.routing.roleId === roleId
2020-05-07 21:53:34 +12:00
)
2020-02-25 23:01:07 +13:00
}
2021-05-04 22:32:22 +12:00
const routeChanged = event => {
2021-04-20 23:48:37 +12:00
if (!event.detail.startsWith("/")) {
route = "/" + event.detail
2020-02-25 23:01:07 +13:00
}
route = sanitizeUrl(route)
2020-02-25 23:01:07 +13:00
}
</script>
2020-10-08 21:34:22 +13:00
<ModalContent title="New Screen" confirmText="Create Screen" onConfirm={save}>
2020-10-09 04:15:12 +13:00
<Select
label="Choose a Template"
bind:value={templateIndex}
2021-05-04 22:32:22 +12:00
on:change={ev => templateChanged(ev.detail)}
2021-04-20 23:48:37 +12:00
options={templates}
placeholder={null}
2021-05-04 22:32:22 +12:00
getOptionLabel={x => x.name}
getOptionValue={(x, idx) => idx}
/>
<Input label="Name" bind:value={name} />
<Input
label="Url"
error={routeError}
bind:value={route}
on:change={routeChanged}
/>
2021-04-20 23:48:37 +12:00
<Select
label="Access"
bind:value={roleId}
options={$roles}
2021-05-04 22:32:22 +12:00
getOptionLabel={x => x.name}
getOptionValue={x => x._id}
/>
2021-04-20 23:48:37 +12:00
<Toggle text="Create link in navigation bar" bind:value={createLink} />
2020-10-08 21:34:22 +13:00
</ModalContent>