|
<script lang="ts"> |
|
import { BaseColorPicker } from "@gradio/colorpicker"; |
|
import { BaseButton } from "@gradio/button"; |
|
import { BaseDropdown } from "./patched_dropdown/Index.svelte"; |
|
import { createEventDispatcher } from "svelte"; |
|
import { onMount, onDestroy } from "svelte"; |
|
|
|
export let label = ""; |
|
export let currentLabel = ""; |
|
export let choices = []; |
|
export let choicesColors = []; |
|
export let color = ""; |
|
export let currentColor = ""; |
|
export let showRemove = true; |
|
|
|
const dispatch = createEventDispatcher<{ |
|
change: object; |
|
}>(); |
|
|
|
function dispatchChange(ret: number) { |
|
dispatch("change", { |
|
label: currentLabel, |
|
color: currentColor, |
|
ret: ret |
|
}); |
|
} |
|
|
|
function onDropDownChange(event) { |
|
const { detail } = event; |
|
let choice = detail; |
|
|
|
if (Number.isInteger(choice)) { |
|
if (Array.isArray(choicesColors) && choice < choicesColors.length) { |
|
currentColor = choicesColors[choice]; |
|
} |
|
if (Array.isArray(choices) && choice < choices.length) { |
|
currentLabel = choices[choice][0]; |
|
} |
|
} else { |
|
currentLabel = choice; |
|
} |
|
} |
|
|
|
function onColorChange(event) { |
|
const { detail } = event; |
|
currentColor = detail; |
|
} |
|
|
|
function onDropDownEnter(event) { |
|
onDropDownChange(event); |
|
dispatchChange(1); |
|
} |
|
|
|
function handleKeyPress(event: KeyboardEvent) { |
|
switch (event.key) { |
|
case "Enter": |
|
dispatchChange(1); |
|
break; |
|
} |
|
} |
|
|
|
onMount(() => { |
|
document.addEventListener("keydown", handleKeyPress); |
|
currentLabel = label; |
|
currentColor = color; |
|
}); |
|
|
|
onDestroy(() => { |
|
document.removeEventListener("keydown", handleKeyPress); |
|
}); |
|
|
|
</script> |
|
|
|
<div class="modal" id="model-box-edit"> |
|
<div class="modal-container"> |
|
<span class="model-content"> |
|
<div style="margin-right: 10px;"> |
|
<BaseDropdown |
|
value={currentLabel} |
|
label="Label" |
|
{choices} |
|
show_label={false} |
|
allow_custom_value={true} |
|
on:change={onDropDownChange} |
|
on:enter={onDropDownEnter} |
|
/> |
|
</div> |
|
<div style="margin-right: 40px; margin-bottom: 8px;"> |
|
<BaseColorPicker |
|
value={currentColor} |
|
label="Color" |
|
show_label={false} |
|
on:change={onColorChange} |
|
/> |
|
</div> |
|
<div style="margin-right: 8px;"> |
|
<BaseButton |
|
on:click={() => dispatchChange(0)} |
|
>Cancel</BaseButton> |
|
</div> |
|
{#if showRemove} |
|
<div style="margin-right: 8px;"> |
|
<BaseButton |
|
variant="stop" |
|
on:click={() => dispatchChange(-1)} |
|
>Remove</BaseButton> |
|
</div> |
|
{/if} |
|
<div> |
|
<BaseButton |
|
variant="primary" |
|
on:click={() => dispatchChange(1)} |
|
>OK</BaseButton> |
|
</div> |
|
</span> |
|
</div> |
|
</div> |
|
|
|
<style> |
|
.modal { |
|
position: fixed; |
|
left: 0; |
|
top: 0; |
|
width: 100%; |
|
height: 100%; |
|
z-index: var(--layer-top); |
|
-webkit-backdrop-filter: blur(4px); |
|
backdrop-filter: blur(4px); |
|
} |
|
|
|
.modal-container { |
|
border-style: solid; |
|
border-width: var(--block-border-width); |
|
border-color: var(--block-border-color); |
|
margin-top: 10%; |
|
padding: 20px; |
|
box-shadow: var(--block-shadow); |
|
border-color: var(--block-border-color); |
|
border-radius: var(--block-radius); |
|
background: var(--block-background-fill); |
|
position: fixed; |
|
left: 50%; |
|
transform: translateX(-50%); |
|
width: fit-content; |
|
} |
|
|
|
.model-content { |
|
display: flex; |
|
align-items: flex-end; |
|
} |
|
</style> |
|
|