2025-08-13 18:52:37 -07:00
|
|
|
<script lang="ts">
|
2025-09-08 15:56:57 -07:00
|
|
|
import calendar_days_icon from "../assets/heroicons/20/solid/calendar-days.svg?raw";
|
|
|
|
|
import document_text_icon from "../assets/heroicons/20/solid/document-text.svg?raw";
|
|
|
|
|
import identification_icon from "../assets/heroicons/20/solid/identification.svg?raw";
|
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-09-08 15:56:57 -07:00
|
|
|
let { field = $bindable(), index }: Props = $props();
|
|
|
|
|
|
|
|
|
|
const original_label_value = field.field.label;
|
|
|
|
|
|
|
|
|
|
let type_indicator_element = $state<HTMLButtonElement | undefined>();
|
|
|
|
|
let popover_element = $state<HTMLDivElement | undefined>();
|
|
|
|
|
let name_value = $state(field.field.name);
|
|
|
|
|
let label_value = $state(field.field.label ?? "");
|
|
|
|
|
|
|
|
|
|
$effect(() => {
|
|
|
|
|
field.field.label = label_value === "" ? undefined : label_value;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$effect(() => {
|
|
|
|
|
popover_element?.addEventListener("toggle", handle_popover_toggle);
|
|
|
|
|
return () => {
|
|
|
|
|
popover_element?.removeEventListener("toggle", handle_popover_toggle);
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
function handle_type_indicator_element_click() {
|
|
|
|
|
popover_element?.togglePopover();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handle_popover_toggle(ev: ToggleEvent) {
|
|
|
|
|
if (ev.newState === "closed") {
|
|
|
|
|
type_indicator_element?.focus();
|
|
|
|
|
field.field.label = original_label_value;
|
|
|
|
|
label_value = original_label_value ?? "";
|
|
|
|
|
}
|
|
|
|
|
}
|
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-08-13 18:52:37 -07:00
|
|
|
role="columnheader"
|
|
|
|
|
style:width={`${field.field.width_px}px`}
|
|
|
|
|
>
|
2025-09-08 15:56:57 -07:00
|
|
|
<div class="field-header__label">
|
|
|
|
|
{field.field.label ?? field.field.name}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="field-header__menu-container">
|
|
|
|
|
<button
|
|
|
|
|
bind:this={type_indicator_element}
|
|
|
|
|
class="field-header__type-indicator"
|
|
|
|
|
onclick={handle_type_indicator_element_click}
|
|
|
|
|
>
|
|
|
|
|
{#if field.field.presentation.t === "Text"}
|
|
|
|
|
{@html document_text_icon}
|
|
|
|
|
{:else if field.field.presentation.t === "Timestamp"}
|
|
|
|
|
{@html calendar_days_icon}
|
|
|
|
|
{:else if field.field.presentation.t === "Uuid"}
|
|
|
|
|
{@html identification_icon}
|
|
|
|
|
{/if}
|
|
|
|
|
</button>
|
|
|
|
|
<div
|
|
|
|
|
bind:this={popover_element}
|
|
|
|
|
class="field-header__popover"
|
|
|
|
|
popover="auto"
|
|
|
|
|
>
|
|
|
|
|
<FieldDetails bind:name_value bind:label_value name_input_disabled />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-08-13 18:52:37 -07:00
|
|
|
</div>
|