|
<script> |
|
|
|
* @type {{type: string; label: string; component:string}[]} |
|
*/ |
|
export let app_info; |
|
|
|
/** |
|
* @type any[] |
|
*/ |
|
export let request_data = []; |
|
|
|
/** |
|
* |
|
* @param files {FileList|null} |
|
* @param i {number} |
|
*/ |
|
function handle_file(files, i) { |
|
if (!files) return; |
|
const _files = Array.from(files); |
|
request_data[i] = files.length === 1 ? _files[0] : _files; |
|
} |
|
</script> |
|
|
|
<h3>Request Inputs</h3> |
|
|
|
{#each app_info as { type, label, component }, i} |
|
{#if type === "string"} |
|
<label for=""> |
|
<span>{label} <code>{type}</code></span> |
|
<input type="text" bind:value={request_data[i]} /> |
|
</label> |
|
{:else if type === "number"} |
|
<label for=""> |
|
<span>{label} <code>{type}</code></span> |
|
<input type="number" bind:value={request_data[i]} /> |
|
</label> |
|
{:else if type === "boolean"} |
|
<label for=""> |
|
<span>{label} <code>{type}</code></span> |
|
<input type="checkbox" bind:value={request_data[i]} /> |
|
</label> |
|
{:else if type === "number"} |
|
<label for=""> |
|
<span>{label} <code>{type}</code></span> |
|
<input type="number" bind:value={request_data[i]} /> |
|
</label> |
|
{:else if type === "string[]"} |
|
<label for=""> |
|
<span>{label} <code>{type} - comma separated list</code></span> |
|
<input |
|
type="text" |
|
value={request_data[i]} |
|
on:input={(e) => |
|
(request_data[i] = e.currentTarget.value |
|
.split(",") |
|
.map((v) => v.trim()))} |
|
/> |
|
</label> |
|
{:else if ["Image", "Audio", "Video"].includes(component)} |
|
<label for=""> |
|
<span>{label} <code>File</code></span> |
|
<input |
|
type="file" |
|
on:input={(e) => handle_file(e.currentTarget.files, i)} |
|
/> |
|
</label> |
|
{/if} |
|
{/each} |
|
|
|
<style> |
|
label { |
|
display: flex; |
|
flex-direction: column; |
|
gap: var(--size-1); |
|
width: 100%; |
|
} |
|
|
|
input { |
|
outline: none; |
|
border-radius: 2px; |
|
} |
|
|
|
input:focus-visible { |
|
border-color: var(--color-accent); |
|
} |
|
</style> |
|
|