1
0
Fork 0
mirror of synced 2024-06-13 16:05:06 +12:00
budibase/packages/builder/src/components/backend/DataTable/popovers/CreateEditColumn.svelte

130 lines
3.5 KiB
Svelte
Raw Normal View History

2020-08-08 03:13:57 +12:00
<script>
import { onMount } from "svelte"
import {
Input,
TextArea,
Button,
Select,
Toggle,
Label,
} from "@budibase/bbui"
2020-08-14 07:22:14 +12:00
import { cloneDeep, merge } from "lodash/fp"
2020-08-08 03:13:57 +12:00
import { store, backendUiStore } from "builderStore"
import { FIELDS } from "constants/backend"
import { notifier } from "builderStore/store/notifications"
import ButtonGroup from "components/common/ButtonGroup.svelte"
import NumberBox from "components/common/NumberBox.svelte"
import ValuesList from "components/common/ValuesList.svelte"
import ErrorsBox from "components/common/ErrorsBox.svelte"
import Checkbox from "components/common/Checkbox.svelte"
import ActionButton from "components/common/ActionButton.svelte"
import DatePicker from "components/common/DatePicker.svelte"
import LinkedRecordSelector from "components/common/LinkedRecordSelector.svelte"
import * as api from "../api"
let fieldDefinitions = cloneDeep(FIELDS)
2020-08-08 03:13:57 +12:00
export let onClosed
export let field = {
type: "string",
constraints: fieldDefinitions.STRING.constraints,
}
2020-08-08 03:13:57 +12:00
2020-08-11 02:34:37 +12:00
let originalName = field.name
2020-08-08 04:41:20 +12:00
2020-08-08 03:13:57 +12:00
async function saveColumn() {
2020-08-08 04:41:20 +12:00
backendUiStore.update(state => {
backendUiStore.actions.models.saveField({
originalName,
2020-08-11 22:23:07 +12:00
field,
2020-08-08 04:41:20 +12:00
})
return state
2020-08-08 03:13:57 +12:00
})
onClosed()
}
function handleFieldConstraints(event) {
const { type, constraints } = fieldDefinitions[
event.target.value.toUpperCase()
]
field.type = type
field.constraints = constraints
}
2020-08-08 03:13:57 +12:00
</script>
<div class="actions">
<Input label="Name" thin bind:value={field.name} />
2020-08-08 03:13:57 +12:00
<Select
secondary
thin
label="Type"
on:change={handleFieldConstraints}
2020-08-21 02:49:18 +12:00
bind:value={field.type}>
2020-08-14 07:22:14 +12:00
{#each Object.values(fieldDefinitions) as field}
2020-08-21 02:49:18 +12:00
<option value={field.type}>{field.name}</option>
2020-08-08 03:13:57 +12:00
{/each}
</Select>
<Toggle
bind:checked={field.constraints.presence.allowEmpty}
thin
text="Required" />
2020-08-08 03:13:57 +12:00
{#if field.type === 'string' && field.constraints}
<Input
thin
type="number"
label="Max Length"
bind:value={field.constraints.length.maximum} />
<ValuesList label="Categories" bind:values={field.constraints.inclusion} />
{:else if field.type === 'datetime' && field.constraints}
<DatePicker
label="Earliest"
bind:value={field.constraints.datetime.earliest} />
<DatePicker label="Latest" bind:value={field.constraints.datetime.latest} />
{:else if field.type === 'number' && field.constraints}
<Input
thin
type="number"
label="Min Value"
bind:value={field.constraints.numericality.greaterThanOrEqualTo} />
<Input
thin
type="number"
label="Max Value"
bind:value={field.constraints.numericality.lessThanOrEqualTo} />
{:else if field.type === 'link'}
<div class="field">
<label>Link</label>
<Select bind:value={field.modelId}>
<option value="">Choose an option</option>
{#each $backendUiStore.models as model}
{#if model._id !== $backendUiStore.draftModel._id}
<option value={model._id}>{model.name}</option>
{/if}
{/each}
</Select>
</div>
{/if}
<footer>
2020-08-08 03:13:57 +12:00
<Button secondary on:click={onClosed}>Cancel</Button>
<Button primary on:click={saveColumn}>Save Column</Button>
</footer>
</div>
2020-08-08 03:13:57 +12:00
<style>
.actions {
padding: var(--spacing-xl);
2020-08-08 03:13:57 +12:00
display: grid;
grid-gap: var(--spacing-xl);
min-width: 400px;
2020-08-08 03:13:57 +12:00
}
footer {
display: flex;
justify-content: flex-end;
gap: var(--spacing-m);
2020-08-08 03:13:57 +12:00
}
</style>