|
1 | 1 | <script lang="ts">
|
2 | 2 | import { getContext, onDestroy } from "svelte"
|
| 3 | + import type { Readable } from "svelte/store" |
3 | 4 | import { writable } from "svelte/store"
|
4 | 5 | import { Icon } from "@budibase/bbui"
|
5 | 6 | import { memo } from "@budibase/frontend-core"
|
6 | 7 | import Placeholder from "../Placeholder.svelte"
|
7 | 8 | import InnerForm from "./InnerForm.svelte"
|
8 |
| - import type { FieldApi } from "." |
| 9 | + import type { FieldSchema, FieldType } from "@budibase/types" |
| 10 | + import type { |
| 11 | + FieldApi, |
| 12 | + FieldState, |
| 13 | + FieldValidation, |
| 14 | + FormField, |
| 15 | + } from "@/types" |
| 16 | +
|
| 17 | + interface FieldInfo { |
| 18 | + field: string |
| 19 | + type: FieldType |
| 20 | + defaultValue: string | undefined |
| 21 | + disabled: boolean |
| 22 | + readonly: boolean |
| 23 | + validation?: FieldValidation |
| 24 | + formStep: number |
| 25 | + } |
9 | 26 |
|
10 | 27 | export let label: string | undefined = undefined
|
11 | 28 | export let field: string | undefined = undefined
|
12 |
| - export let fieldState: any |
13 |
| - export let fieldApi: FieldApi |
14 |
| - export let fieldSchema: any |
| 29 | + export let fieldState: FieldState | undefined |
| 30 | + export let fieldApi: FieldApi | undefined |
| 31 | + export let fieldSchema: FieldSchema | undefined |
15 | 32 | export let defaultValue: string | undefined = undefined
|
16 |
| - export let type: any |
| 33 | + export let type: FieldType |
17 | 34 | export let disabled = false
|
18 | 35 | export let readonly = false
|
19 |
| - export let validation: any |
| 36 | + export let validation: FieldValidation | undefined |
20 | 37 | export let span = 6
|
21 | 38 | export let helpText: string | undefined = undefined
|
22 | 39 |
|
23 | 40 | // Get contexts
|
24 |
| - const formContext: any = getContext("form") |
25 |
| - const formStepContext: any = getContext("form-step") |
26 |
| - const fieldGroupContext: any = getContext("field-group") |
| 41 | + const formContext = getContext("form") |
| 42 | + const formStepContext = getContext("form-step") |
| 43 | + const fieldGroupContext = getContext("field-group") |
27 | 44 | const { styleable, builderStore, Provider } = getContext("sdk")
|
28 |
| - const component: any = getContext("component") |
| 45 | + const component = getContext("component") |
29 | 46 |
|
30 | 47 | // Register field with form
|
31 | 48 | const formApi = formContext?.formApi
|
32 | 49 | const labelPos = fieldGroupContext?.labelPosition || "above"
|
33 | 50 |
|
34 |
| - let formField: any |
| 51 | + let formField: Readable<FormField> | undefined |
35 | 52 | let touched = false
|
36 |
| - let labelNode: any |
| 53 | + let labelNode: HTMLElement | undefined |
37 | 54 |
|
38 | 55 | // Memoize values required to register the field to avoid loops
|
39 | 56 | const formStep = formStepContext || writable(1)
|
40 |
| - const fieldInfo = memo({ |
| 57 | + const fieldInfo = memo<FieldInfo>({ |
41 | 58 | field: field || $component.name,
|
42 | 59 | type,
|
43 | 60 | defaultValue,
|
|
66 | 83 | $: $component.editing && labelNode?.focus()
|
67 | 84 |
|
68 | 85 | // Update form properties in parent component on every store change
|
69 |
| - $: unsubscribe = formField?.subscribe((value: any) => { |
70 |
| - fieldState = value?.fieldState |
71 |
| - fieldApi = value?.fieldApi |
72 |
| - fieldSchema = value?.fieldSchema |
73 |
| - }) |
| 86 | + $: unsubscribe = formField?.subscribe( |
| 87 | + (value?: { |
| 88 | + fieldState: FieldState |
| 89 | + fieldApi: FieldApi |
| 90 | + fieldSchema: FieldSchema |
| 91 | + }) => { |
| 92 | + fieldState = value?.fieldState |
| 93 | + fieldApi = value?.fieldApi |
| 94 | + fieldSchema = value?.fieldSchema |
| 95 | + } |
| 96 | + ) |
74 | 97 |
|
75 | 98 | // Determine label class from position
|
76 | 99 | $: labelClass = labelPos === "above" ? "" : `spectrum-FieldLabel--${labelPos}`
|
77 | 100 |
|
78 |
| - const registerField = (info: any) => { |
| 101 | + const registerField = (info: FieldInfo) => { |
79 | 102 | formField = formApi?.registerField(
|
80 | 103 | info.field,
|
81 | 104 | info.type,
|
|
87 | 110 | )
|
88 | 111 | }
|
89 | 112 |
|
90 |
| - const updateLabel = (e: any) => { |
| 113 | + const updateLabel = (e: Event) => { |
91 | 114 | if (touched) {
|
92 |
| - // @ts-expect-error and TODO updateProp isn't recognised - need builder TS conversion |
93 |
| - builderStore.actions.updateProp("label", e.target.textContent) |
| 115 | + const label = e.target as HTMLLabelElement |
| 116 | + builderStore.actions.updateProp("label", label.textContent) |
94 | 117 | }
|
95 | 118 | touched = false
|
96 | 119 | }
|
|
0 commit comments