diff --git a/frontend/src/lib/common.ts b/frontend/src/lib/common.ts index 437c36884a..d569838d70 100644 --- a/frontend/src/lib/common.ts +++ b/frontend/src/lib/common.ts @@ -19,7 +19,7 @@ export interface SchemaProperty { } export type Schema = { - $schema: string + $schema: string | undefined type: string properties: { [name: string]: SchemaProperty } required: string[] diff --git a/frontend/src/lib/components/ApiConnectForm.svelte b/frontend/src/lib/components/ApiConnectForm.svelte index 93035314d0..e10c5ccf26 100644 --- a/frontend/src/lib/components/ApiConnectForm.svelte +++ b/frontend/src/lib/components/ApiConnectForm.svelte @@ -4,6 +4,7 @@ import { emptySchema, emptyString } from '$lib/utils' import SchemaForm from './SchemaForm.svelte' import SimpleEditor from './SimpleEditor.svelte' + import Toggle from './Toggle.svelte' export let resource_type: string export let args: Record | any = {} @@ -12,7 +13,10 @@ let schema = emptySchema() let notFound = false + async function loadSchema() { + rawCode = '{}' + viewJsonSchema = false try { const rt = await ResourceService.getResourceType({ workspace: $workspaceStore!, @@ -21,8 +25,6 @@ schema = rt.schema notFound = false } catch (e) { - rawCode = '{}' - notFound = true } } @@ -43,17 +45,38 @@ } let error = '' let rawCode = '' + let viewJsonSchema = false + + function switchTab(asJson: boolean) { + viewJsonSchema = asJson + if (asJson) { + rawCode = JSON.stringify(args, null, 2) + } else { + parseJson() + } + } -{#if notFound} +{#if !notFound} +
+ switchTab(e.detail)} + options={{ + right: 'As JSON' + }} + /> +
+{:else}

No corresponding resource type found in your workspace for {resource_type}. Define the value in JSON directly

+{/if} +{#if notFound || viewJsonSchema} {#if !emptyString(error)}{error}{:else}
{/if} {:else} - + {/if} diff --git a/frontend/src/lib/components/AppConnect.svelte b/frontend/src/lib/components/AppConnect.svelte index 30fa18e1aa..90968fb6b6 100644 --- a/frontend/src/lib/components/AppConnect.svelte +++ b/frontend/src/lib/components/AppConnect.svelte @@ -155,6 +155,7 @@ async function next() { if (step == 1 && manual) { step += 1 + args = {} } else if (step == 1 && !manual) { const url = new URL(`/api/oauth/connect/${resource_type}`, $page.url.origin) url.searchParams.append('scopes', scopes.join('+')) @@ -410,15 +411,17 @@
{#if apiTokenApps[resource_type].img} -
- connect +
+ connect
{/if} {/if}

Value

- + {#key resource_type} + + {/key}

Description

diff --git a/frontend/src/lib/components/ResourceEditor.svelte b/frontend/src/lib/components/ResourceEditor.svelte index ea728d38ee..2da2d2ee1f 100644 --- a/frontend/src/lib/components/ResourceEditor.svelte +++ b/frontend/src/lib/components/ResourceEditor.svelte @@ -13,6 +13,7 @@ import SimpleEditor from './SimpleEditor.svelte' import { faSave } from '@fortawesome/free-solid-svg-icons' import SchemaForm from './SchemaForm.svelte' + import Toggle from './Toggle.svelte' let path = '' let initialPath = '' @@ -38,6 +39,7 @@ path = p resourceToEdit = undefined resourceSchema = undefined + viewJsonSchema = false loadingSchema = true drawer.openDrawer?.() resourceToEdit = await ResourceService.getResource({ workspace: $workspaceStore!, path: p }) @@ -111,6 +113,16 @@ args[k] = `$var:${path}` }) } + let viewJsonSchema = false + + function switchTab(asJson: boolean) { + viewJsonSchema = asJson + if (asJson) { + rawCode = JSON.stringify(args, null, 2) + } else { + parseJson() + } + } @@ -136,12 +148,21 @@ kind="resource" />
-

Value

+
+

Value

+ switchTab(e.detail)} + options={{ + right: 'As JSON' + }} + /> +
{#if loadingSchema} - {:else if resourceSchema && resourceSchema?.properties} + {:else if !viewJsonSchema && resourceSchema && resourceSchema?.properties} {:else} -

No corresponding resource type found in your workspace for {selectedResourceType}. - Define the value in JSON directly

+ {#if !viewJsonSchema} +

No corresponding resource type found in your workspace for {selectedResourceType}. + Define the value in JSON directly

+ {/if} + {#if !emptyString(jsonError)}{jsonError}{:else}
{/if} diff --git a/frontend/src/lib/components/SchemaForm.svelte b/frontend/src/lib/components/SchemaForm.svelte index 76767660b8..ca136b6117 100644 --- a/frontend/src/lib/components/SchemaForm.svelte +++ b/frontend/src/lib/components/SchemaForm.svelte @@ -30,6 +30,7 @@ export let filter: string[] | undefined = undefined export let noDynamicToggle = false export let flexWrap = false + export let noDelete = false let clazz: string = '' export { clazz as class } @@ -59,7 +60,9 @@ let lkeys = Object.keys(schema?.properties ?? {}) if (schema?.properties && JSON.stringify(lkeys) != JSON.stringify(keys)) { keys = lkeys - removeExtraKey() + if (!noDelete) { + removeExtraKey() + } } } diff --git a/frontend/src/lib/components/common/drawer/Drawer.svelte b/frontend/src/lib/components/common/drawer/Drawer.svelte index f3df1dd78b..2396675061 100644 --- a/frontend/src/lib/components/common/drawer/Drawer.svelte +++ b/frontend/src/lib/components/common/drawer/Drawer.svelte @@ -55,8 +55,10 @@ if (open) { switch (event.key) { case 'Escape': - open = false event.preventDefault() + event.stopPropagation() + event.stopImmediatePropagation() + open = false break } } diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 42bdf47a9a..c669de6500 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -151,7 +151,7 @@ export interface DropdownItem { export function emptySchema() { return { - $schema: 'https://json-schema.org/draft/2020-12/schema', + $schema: 'https://json-schema.org/draft/2020-12/schema' as string | undefined, properties: {}, required: [], type: 'object' diff --git a/frontend/src/routes/(root)/(logged)/resources/+page.svelte b/frontend/src/routes/(root)/(logged)/resources/+page.svelte index b52c44d609..0ae1e0fc3a 100644 --- a/frontend/src/routes/(root)/(logged)/resources/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/resources/+page.svelte @@ -40,6 +40,9 @@ import ListFilters from '$lib/components/home/ListFilters.svelte' import SearchItems from '$lib/components/SearchItems.svelte' import autosize from 'svelte-autosize' + import SimpleEditor from '$lib/components/SimpleEditor.svelte' + import { convert } from '@redocly/json-to-json-schema' + import Portal from 'svelte-portal' type ResourceW = ListableResource & { canWrite: boolean } type ResourceTypeW = ResourceType & { canWrite: boolean } @@ -200,10 +203,47 @@ } }) + function openInferrer(): void { + inferrer?.openDrawer?.() + } + let disableCustomPrefix = false let tab: 'workspace' | 'types' | 'states' = 'workspace' + + let inferrer: Drawer | undefined = undefined + let inferrerJson = '' + + function inferJson(): void { + try { + newResourceType.schema = { + $schema: undefined, + required: [], + properties: {}, + ...convert(JSON.parse(inferrerJson)) + } + } catch (e) { + sendUserToast(`Invalid JSON: ${e}`, true) + } + inferrer?.closeDrawer?.() + } + + + inferrer?.toggleDrawer?.()}> + + + + + + + +
@@ -259,6 +299,11 @@ >
Schema
+
+ +