| <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> |
| |