File component ts conversion

This commit is contained in:
Peter Clement 2025-03-19 15:13:28 +00:00
parent a442b3f280
commit ed8160bdbb
2 changed files with 41 additions and 36 deletions

View File

@ -1,43 +1,47 @@
<script> <script lang="ts">
import ActionButton from "../../ActionButton/ActionButton.svelte" import ActionButton from "../../ActionButton/ActionButton.svelte"
import { uuid } from "../../helpers" import { uuid } from "../../helpers"
import Icon from "../../Icon/Icon.svelte" import Icon from "../../Icon/Icon.svelte"
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
export let value = null const BYTES_IN_MB = 1000000
export let title = "Upload file"
export let disabled = false export let value: File | undefined = undefined
export let allowClear = null export let title: string = "Upload file"
export let extensions = null export let disabled: boolean = false
export let handleFileTooLarge = null export let allowClear: boolean | undefined = undefined
export let fileSizeLimit = BYTES_IN_MB * 20 export let extensions: string[] | undefined = undefined
export let id = null export let handleFileTooLarge: ((file: File) => void) | undefined = undefined
export let previewUrl = null export let fileSizeLimit: number = BYTES_IN_MB * 20
export let id: string | undefined = undefined
export let previewUrl: string | undefined = undefined
const fieldId = id || uuid() const fieldId = id || uuid()
const BYTES_IN_KB = 1000 const BYTES_IN_KB = 1000
const BYTES_IN_MB = 1000000
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
let fileInput let fileInput: HTMLInputElement | undefined
$: inputAccept = Array.isArray(extensions) ? extensions.join(",") : "*" $: inputAccept = Array.isArray(extensions) ? extensions.join(",") : "*"
async function processFile(targetFile) { async function processFile(targetFile: File | undefined) {
if (handleFileTooLarge && targetFile?.size >= fileSizeLimit) { if (targetFile) {
handleFileTooLarge(targetFile) if (handleFileTooLarge && targetFile.size >= fileSizeLimit) {
return handleFileTooLarge(targetFile)
return
}
dispatch("change", targetFile)
} }
dispatch("change", targetFile)
} }
function handleFile(evt) { function handleFile(evt: Event) {
processFile(evt.target.files[0]) const target = evt.target as HTMLInputElement
processFile(target.files?.[0])
} }
function clearFile() { function clearFile() {
dispatch("change", null) dispatch("change", undefined)
} }
</script> </script>
@ -75,7 +79,9 @@
{/if} {/if}
</div> </div>
{/if} {/if}
<ActionButton {disabled} on:click={fileInput.click()}>{title}</ActionButton> <ActionButton {disabled} on:click={() => fileInput?.click()}>
{title}
</ActionButton>
</div> </div>
<style> <style>

View File

@ -1,23 +1,23 @@
<script> <script lang="ts">
import Field from "./Field.svelte" import Field from "./Field.svelte"
import { CoreFile } from "./Core" import { CoreFile } from "./Core"
import { createEventDispatcher } from "svelte" import { createEventDispatcher } from "svelte"
export let label = null export let label: string | undefined = undefined
export let labelPosition = "above" export let labelPosition: string = "above"
export let disabled = false export let disabled: boolean = false
export let allowClear = null export let allowClear: boolean | undefined = undefined
export let handleFileTooLarge = () => {} export let handleFileTooLarge: (file: File) => void = () => {}
export let previewUrl = null export let previewUrl: string | undefined = undefined
export let extensions = null export let extensions: string[] | undefined = undefined
export let error = null export let error: string | undefined = undefined
export let title = null export let title: string | undefined = undefined
export let value = null export let value: File | undefined = undefined
export let tooltip = null export let tooltip: string | undefined = undefined
export let helpText = null export let helpText: string | undefined = undefined
const dispatch = createEventDispatcher() const dispatch = createEventDispatcher()
const onChange = e => { const onChange = (e: CustomEvent) => {
value = e.detail value = e.detail
dispatch("change", e.detail) dispatch("change", e.detail)
} }
@ -25,7 +25,6 @@
<Field {helpText} {label} {labelPosition} {error} {tooltip}> <Field {helpText} {label} {labelPosition} {error} {tooltip}>
<CoreFile <CoreFile
{error}
{disabled} {disabled}
{allowClear} {allowClear}
{title} {title}