| <script lang="ts"> | |
| import { createEventDispatcher } from "svelte"; | |
| import FieldInput from "@graphite/components/widgets/inputs/FieldInput.svelte"; | |
| const dispatch = createEventDispatcher<{ commitText: string }>(); | |
| export let value: string; | |
| export let label: string | undefined = undefined; | |
| export let tooltip: string | undefined = undefined; | |
| export let disabled = false; | |
| let self: FieldInput | undefined; | |
| let editing = false; | |
| function onTextFocused() { | |
| editing = true; | |
| } | |
| // Called only when `value` is changed from the <textarea> element via user input and committed, either | |
| // via the `change` event or when the <input> element is unfocused (with the `blur` event binding) | |
| function onTextChanged() { | |
| // The `unFocus()` call in `onTextChangeCanceled()` causes itself to be run again, so this if statement skips a second run | |
| if (!editing) return; | |
| onTextChangeCanceled(); | |
| // TODO: Find a less hacky way to do this | |
| if (self) dispatch("commitText", self.getValue()); | |
| // Required if value is not changed by the parent component upon update:value event | |
| self?.setInputElementValue(self.getValue()); | |
| } | |
| function onTextChangeCanceled() { | |
| editing = false; | |
| self?.unFocus(); | |
| } | |
| export function focus() { | |
| self?.focus(); | |
| } | |
| </script> | |
| <FieldInput | |
| class="text-area-input" | |
| classes={{ "has-label": Boolean(label) }} | |
| {value} | |
| on:value | |
| on:textFocused={onTextFocused} | |
| on:textChanged={onTextChanged} | |
| on:textChangeCanceled={onTextChangeCanceled} | |
| textarea={true} | |
| spellcheck={true} | |
| {label} | |
| {disabled} | |
| {tooltip} | |
| bind:this={self} | |
| /> | |
| <style lang="scss" global> | |
| </style> | |