From 87e01fe9265a87d195a950d68f8035581b01f2bc Mon Sep 17 00:00:00 2001 From: Faton Ramadani Date: Wed, 17 Jul 2024 17:16:58 +0200 Subject: [PATCH] feat(frontend): array of resources (#4095) * feat(frontend): wip * feat(frontend): wip * feat(frontend): add support for array of resources * feat(frontend): improve code * feat(frontend): add support for array of resources in the flow and app editors * feat(frontend): improve code * feat(frontend): display the detected resource type * fix(frontend): Fix PR comments + add warning on the value format * fix(frontend): improve code --- frontend/src/lib/common.ts | 3 +- frontend/src/lib/components/ArgInput.svelte | 8 +- .../lib/components/ArrayTypeNarrowing.svelte | 90 +++++++++++++------ .../lib/components/LightweightArgInput.svelte | 8 +- .../components/schema/PropertyEditor.svelte | 5 +- frontend/src/lib/inferArgSig.ts | 2 + 6 files changed, 82 insertions(+), 34 deletions(-) diff --git a/frontend/src/lib/common.ts b/frontend/src/lib/common.ts index 9bd03af131..64e7fb762f 100644 --- a/frontend/src/lib/common.ts +++ b/frontend/src/lib/common.ts @@ -26,9 +26,10 @@ export interface SchemaProperty { contentEncoding?: 'base64' | 'binary' format?: string items?: { - type?: 'string' | 'number' | 'bytes' | 'object' + type?: 'string' | 'number' | 'bytes' | 'object' | 'resource' contentEncoding?: 'base64' enum?: string[] + resourceType?: string } min?: number max?: number diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index a1b7edc7a1..85c7f70491 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -47,12 +47,14 @@ export let disabled = false export let itemsType: | { - type?: 'string' | 'number' | 'bytes' | 'object' + type?: 'string' | 'number' | 'bytes' | 'object' | 'resource' contentEncoding?: 'base64' enum?: string[] multiselect?: string[] + resourceType?: string } | undefined = undefined + export let displayHeader = true export let properties: { [name: string]: SchemaProperty } | undefined = undefined export let nestedRequired: string[] | undefined = undefined @@ -372,7 +374,7 @@ on:change={(x) => fileChanged(x, (val) => (value[i] = val))} multiple={false} /> - {:else if itemsType?.type == 'object'} + {:else if itemsType?.type == 'object' && itemsType?.resourceType === undefined} {:else if Array.isArray(itemsType?.enum)} + {:else if itemsType?.type == 'resource' && itemsType?.resourceType} + {:else} {/if} diff --git a/frontend/src/lib/components/ArrayTypeNarrowing.svelte b/frontend/src/lib/components/ArrayTypeNarrowing.svelte index 49449d00b2..b3be754331 100644 --- a/frontend/src/lib/components/ArrayTypeNarrowing.svelte +++ b/frontend/src/lib/components/ArrayTypeNarrowing.svelte @@ -3,16 +3,21 @@ import { Button } from './common' import { fade } from 'svelte/transition' import Label from './Label.svelte' + import ResourceTypePicker from './ResourceTypePicker.svelte' + import Badge from './common/badge/Badge.svelte' + import Alert from './common/alert/Alert.svelte' + export let canEditResourceType: boolean = false export let itemsType: | { - type?: 'string' | 'number' | 'bytes' | 'object' + type?: 'string' | 'number' | 'bytes' | 'object' | 'resource' contentEncoding?: 'base64' enum?: string[] + resourceType?: string } | undefined - let selected: 'string' | 'number' | 'object' | 'bytes' | 'enum' | undefined = + let selected: 'string' | 'number' | 'object' | 'bytes' | 'enum' | 'resource' | undefined = itemsType?.type != 'string' ? itemsType?.type : Array.isArray(itemsType?.enum) @@ -20,33 +25,62 @@ : 'string' - +{:else} + +{/if} + +{#if itemsType?.type === 'resource'} + - - - - - - - + The value passed is the path of the resource, not the resource itself. You can use the SDK to + get the resource by using the path. + +{/if} + +{#if canEditResourceType && itemsType?.type == 'resource'} + +{/if} + {#if Array.isArray(itemsType?.enum)} {#if type == 'array'} - + {:else if type == 'string' || ['number', 'integer', 'object'].includes(type ?? '')}