2025-08-13 18:52:37 -07:00
|
|
|
<script lang="ts">
|
2025-10-25 05:32:22 +00:00
|
|
|
import BasicDropdown from "./basic-dropdown.webc.svelte";
|
2025-08-13 18:52:37 -07:00
|
|
|
import { type FieldInfo } from "./field.svelte";
|
2025-09-08 15:56:57 -07:00
|
|
|
import FieldDetails from "./field-details.svelte";
|
2025-08-13 18:52:37 -07:00
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
|
field: FieldInfo;
|
|
|
|
|
index: number;
|
2025-11-05 22:48:55 +00:00
|
|
|
ondragenter?(ev: DragEvent): unknown;
|
|
|
|
|
ondragleave?(ev: DragEvent): unknown;
|
|
|
|
|
ondragover?(ev: DragEvent): unknown;
|
|
|
|
|
ondragstart?(ev: DragEvent): unknown;
|
|
|
|
|
ondrop?(ev: DragEvent): unknown;
|
2025-08-13 18:52:37 -07:00
|
|
|
};
|
|
|
|
|
|
2025-11-05 22:48:55 +00:00
|
|
|
let {
|
|
|
|
|
field = $bindable(),
|
|
|
|
|
index,
|
|
|
|
|
ondragenter,
|
|
|
|
|
ondragleave,
|
|
|
|
|
ondragover,
|
|
|
|
|
ondragstart,
|
|
|
|
|
ondrop,
|
|
|
|
|
}: Props = $props();
|
2025-09-08 15:56:57 -07:00
|
|
|
|
2025-09-14 16:19:44 -04:00
|
|
|
const original_label_value = field.field.table_label;
|
2025-09-08 15:56:57 -07:00
|
|
|
|
|
|
|
|
let type_indicator_element = $state<HTMLButtonElement | undefined>();
|
|
|
|
|
let name_value = $state(field.field.name);
|
2025-09-14 16:19:44 -04:00
|
|
|
let label_value = $state(field.field.table_label ?? "");
|
2025-09-08 15:56:57 -07:00
|
|
|
|
|
|
|
|
$effect(() => {
|
2025-09-14 16:19:44 -04:00
|
|
|
field.field.table_label = label_value === "" ? undefined : label_value;
|
2025-09-08 15:56:57 -07:00
|
|
|
});
|
2025-08-13 18:52:37 -07:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<div
|
|
|
|
|
aria-colindex={index}
|
2025-09-08 15:56:57 -07:00
|
|
|
class="field-header__container"
|
2025-11-05 22:48:55 +00:00
|
|
|
draggable={true}
|
|
|
|
|
{ondragenter}
|
|
|
|
|
{ondragleave}
|
|
|
|
|
{ondragover}
|
|
|
|
|
{ondragstart}
|
|
|
|
|
{ondrop}
|
2025-08-13 18:52:37 -07:00
|
|
|
role="columnheader"
|
2025-09-14 16:19:44 -04:00
|
|
|
style:width={`${field.field.table_width_px}px`}
|
2025-11-05 22:48:55 +00:00
|
|
|
tabindex={0}
|
2025-08-13 18:52:37 -07:00
|
|
|
>
|
2025-09-08 15:56:57 -07:00
|
|
|
<div class="field-header__label">
|
2025-09-14 16:19:44 -04:00
|
|
|
{field.field.table_label ?? field.field.name}
|
2025-09-08 15:56:57 -07:00
|
|
|
</div>
|
|
|
|
|
<div class="field-header__menu-container">
|
2025-10-25 05:32:22 +00:00
|
|
|
<BasicDropdown
|
|
|
|
|
alignment="right"
|
|
|
|
|
button_class="field-header__type-indicator"
|
|
|
|
|
on_toggle={(ev) => {
|
|
|
|
|
if (ev.newState === "closed") {
|
|
|
|
|
type_indicator_element?.focus();
|
|
|
|
|
field.field.table_label = original_label_value;
|
|
|
|
|
label_value = original_label_value ?? "";
|
|
|
|
|
}
|
|
|
|
|
}}
|
2025-09-08 15:56:57 -07:00
|
|
|
>
|
2025-10-25 05:32:22 +00:00
|
|
|
<span slot="button-contents">
|
|
|
|
|
{#if field.field.presentation.t === "Dropdown"}
|
|
|
|
|
<i class="ti ti-pointer"></i>
|
2025-11-11 01:26:48 +00:00
|
|
|
{:else if field.field.presentation.t === "Numeric"}
|
|
|
|
|
<i class="ti ti-decimal"></i>
|
2025-10-25 05:32:22 +00:00
|
|
|
{:else if field.field.presentation.t === "Text"}
|
|
|
|
|
<i class="ti ti-file-text"></i>
|
|
|
|
|
{:else if field.field.presentation.t === "Timestamp"}
|
|
|
|
|
<i class="ti ti-calendar"></i>
|
|
|
|
|
{:else if field.field.presentation.t === "Uuid"}
|
|
|
|
|
<i class="ti ti-id"></i>
|
|
|
|
|
{/if}
|
|
|
|
|
</span>
|
|
|
|
|
<div slot="popover" style:padding="16px">
|
|
|
|
|
<form method="post" action="update-field">
|
|
|
|
|
<FieldDetails
|
|
|
|
|
bind:name_value
|
|
|
|
|
bind:label_value
|
|
|
|
|
name_input_disabled
|
|
|
|
|
presentation={field.field.presentation}
|
|
|
|
|
/>
|
|
|
|
|
<input type="hidden" name="field_id" value={field.field.id} />
|
|
|
|
|
<button class="button--primary" type="submit">Save</button>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
</BasicDropdown>
|
2025-09-08 15:56:57 -07:00
|
|
|
</div>
|
2025-08-13 18:52:37 -07:00
|
|
|
</div>
|