147 lines
3.5 KiB
Svelte
147 lines
3.5 KiB
Svelte
|
|
<script>
|
|
import { backendUiStore } from "builderStore"
|
|
import { DropdownMenu, Button, Icon, Input, Select } from "@budibase/bbui"
|
|
import { FIELDS } from "constants/backend"
|
|
import CreateEditColumnPopover from "./CreateEditColumnPopover.svelte"
|
|
import ConfirmDialog from "components/common/ConfirmDialog.svelte"
|
|
import { notifier } from "../../../../builderStore/store/notifications"
|
|
|
|
export let field
|
|
|
|
let anchor
|
|
let dropdown
|
|
let editing
|
|
let confirmDeleteDialog
|
|
|
|
$: sortColumn = $backendUiStore.sort && $backendUiStore.sort.column
|
|
$: sortDirection = $backendUiStore.sort && $backendUiStore.sort.direction
|
|
$: type = field?.type
|
|
|
|
function showEditor() {
|
|
editing = true
|
|
}
|
|
|
|
function hideEditor() {
|
|
dropdown.hide()
|
|
editing = false
|
|
}
|
|
|
|
function showDelete() {
|
|
dropdown.hide()
|
|
confirmDeleteDialog.show()
|
|
}
|
|
|
|
function deleteColumn() {
|
|
if (field.name === $backendUiStore.selectedTable.primaryDisplay) {
|
|
notifier.danger("You cannot delete the display column")
|
|
} else {
|
|
backendUiStore.actions.tables.deleteField(field)
|
|
notifier.success("Column deleted")
|
|
}
|
|
hideEditor()
|
|
}
|
|
|
|
function sort(direction, column) {
|
|
backendUiStore.update(state => {
|
|
if (direction !== "none") {
|
|
state.sort = { direction, column }
|
|
} else {
|
|
state.sort = undefined
|
|
}
|
|
return state
|
|
})
|
|
hideEditor()
|
|
}
|
|
</script>
|
|
|
|
<div class="container" bind:this={anchor} on:click={dropdown.show}>
|
|
<span>{field.name}</span>
|
|
<Icon name="arrowdown" />
|
|
</div>
|
|
<DropdownMenu bind:this={dropdown} {anchor} align="left">
|
|
{#if editing}
|
|
<h5>Edit Column</h5>
|
|
<CreateEditColumnPopover onClosed={hideEditor} {field} />
|
|
{:else}
|
|
<ul>
|
|
{#if type !== 'link'}
|
|
<li data-cy="edit-column-header" on:click={showEditor}>
|
|
<Icon name="edit" />
|
|
Edit
|
|
</li>
|
|
{/if}
|
|
<li data-cy="delete-column-header" on:click={showDelete}>
|
|
<Icon name="delete" />
|
|
Delete
|
|
</li>
|
|
{#if sortDirection === 'desc' || sortDirection === 'asc'}
|
|
<li on:click={() => sort('none', field.name)}>
|
|
<Icon name="close" />
|
|
Remove sort
|
|
</li>
|
|
{/if}
|
|
{#if sortDirection === 'desc' || sortColumn !== field.name}
|
|
<li on:click={() => sort('asc', field.name)}>
|
|
<Icon name="sortascending" />
|
|
Sort A - Z
|
|
</li>
|
|
{/if}
|
|
{#if sortDirection === 'asc' || sortColumn !== field.name}
|
|
<li on:click={() => sort('desc', field.name)}>
|
|
<Icon name="sortdescending" />
|
|
Sort Z - A
|
|
</li>
|
|
{/if}
|
|
</ul>
|
|
{/if}
|
|
</DropdownMenu>
|
|
<ConfirmDialog
|
|
bind:this={confirmDeleteDialog}
|
|
body={`Are you sure you wish to delete this column? Your data will be deleted and this action cannot be undone.`}
|
|
okText="Delete Column"
|
|
onOk={deleteColumn}
|
|
title="Confirm Delete" />
|
|
|
|
<style>
|
|
.container {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: flex-start;
|
|
align-items: center;
|
|
gap: var(--spacing-xs);
|
|
}
|
|
|
|
h5 {
|
|
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
|
|
margin: 0;
|
|
font-weight: 500;
|
|
}
|
|
|
|
ul {
|
|
list-style: none;
|
|
padding-left: 0;
|
|
margin: 0;
|
|
padding: var(--spacing-s) 0;
|
|
}
|
|
|
|
li {
|
|
display: flex;
|
|
font-family: var(--font-sans);
|
|
font-size: var(--font-size-xs);
|
|
color: var(--ink);
|
|
padding: var(--spacing-s) var(--spacing-m);
|
|
margin: auto 0px;
|
|
align-items: center;
|
|
cursor: pointer;
|
|
}
|
|
|
|
li:hover {
|
|
background-color: var(--grey-2);
|
|
}
|
|
|
|
li:active {
|
|
color: var(--blue);
|
|
}
|
|
</style>
|