windmill-components 1.60.3 → 1.60.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/FolderEditor.svelte +1 -1
- package/components/UserSettings.svelte +14 -25
- package/components/apps/components/dataDisplay/AppHtml.svelte +10 -14
- package/components/apps/components/dataDisplay/AppHtml.svelte.d.ts +0 -2
- package/components/apps/components/dataDisplay/VegaLiteHtml.svelte +36 -11
- package/components/apps/components/dataDisplay/VegaLiteHtml.svelte.d.ts +2 -2
- package/components/apps/components/table/AppTable.svelte +12 -2
- package/components/apps/editor/AppPreview.svelte +26 -4
- package/components/apps/editor/AppPreview.svelte.d.ts +2 -0
- package/components/apps/editor/ComponentEditor.svelte +7 -0
- package/components/apps/editor/componentsPanel/ComponentList.svelte +2 -1
- package/components/apps/editor/componentsPanel/data.js +34 -0
- package/components/apps/editorUtils.js +39 -0
- package/components/apps/types.d.ts +2 -1
- package/components/apps/utils.js +4 -0
- package/components/flows/content/CapturePayload.svelte +3 -3
- package/package.json +1 -1
|
@@ -47,12 +47,13 @@ async function loadLoginType() {
|
|
|
47
47
|
}
|
|
48
48
|
async function createToken() {
|
|
49
49
|
newToken = undefined;
|
|
50
|
-
let
|
|
50
|
+
let date;
|
|
51
51
|
if (newTokenExpiration) {
|
|
52
|
-
|
|
52
|
+
date = new Date();
|
|
53
|
+
date.setDate(date.getDate() + newTokenExpiration);
|
|
53
54
|
}
|
|
54
55
|
newToken = await UserService.createToken({
|
|
55
|
-
requestBody: { label: newTokenLabel, expiration:
|
|
56
|
+
requestBody: { label: newTokenLabel, expiration: date?.toISOString() }
|
|
56
57
|
});
|
|
57
58
|
listTokens();
|
|
58
59
|
displayCreateToken = false;
|
|
@@ -75,7 +76,7 @@ async function deleteToken(tokenPrefix) {
|
|
|
75
76
|
Windmill {version}
|
|
76
77
|
</div>
|
|
77
78
|
|
|
78
|
-
<h2 class="border-b">User info</h2>
|
|
79
|
+
<h2 class="border-b mt-4">User info</h2>
|
|
79
80
|
<div class="">
|
|
80
81
|
{#if passwordError}
|
|
81
82
|
<div class="text-red-600 text-2xs grow">{passwordError}</div>
|
|
@@ -152,7 +153,7 @@ async function deleteToken(tokenPrefix) {
|
|
|
152
153
|
>{truncate(newToken ?? '', 10, '****')} <Icon data={faClipboard} />
|
|
153
154
|
</button>
|
|
154
155
|
</div>
|
|
155
|
-
<div class="pt-1 text-xs
|
|
156
|
+
<div class="pt-1 text-xs ml-2">
|
|
156
157
|
Make sure to copy your personal access token now. You won’t be able to see it again!
|
|
157
158
|
</div>
|
|
158
159
|
</div>
|
|
@@ -173,29 +174,17 @@ async function deleteToken(tokenPrefix) {
|
|
|
173
174
|
</div>
|
|
174
175
|
<div class="flex flex-col ">
|
|
175
176
|
<label for="expires"
|
|
176
|
-
>Expires
|
|
177
|
+
>Expires In<span class="text-xs text-gray-500">(optional)</span>
|
|
177
178
|
</label>
|
|
178
|
-
<
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
min={getToday().getFullYear() +
|
|
185
|
-
'/' +
|
|
186
|
-
getToday().getMonth() +
|
|
187
|
-
'/' +
|
|
188
|
-
getToday().getDate()}
|
|
189
|
-
max={getToday().getFullYear() +
|
|
190
|
-
1 +
|
|
191
|
-
'/' +
|
|
192
|
-
getToday().getMonth() +
|
|
193
|
-
'/' +
|
|
194
|
-
getToday().getDate()}
|
|
195
|
-
/>
|
|
179
|
+
<select bind:value={newTokenExpiration}>
|
|
180
|
+
<option value={undefined}>No expiration</option>
|
|
181
|
+
<option value={7}>7d</option>
|
|
182
|
+
<option value={30}>30d</option>
|
|
183
|
+
<option value={90}>90d</option>
|
|
184
|
+
</select>
|
|
196
185
|
</div>
|
|
197
186
|
<div class="flex items-end">
|
|
198
|
-
<Button btnClasses="!mt-2" on:click={createToken}>
|
|
187
|
+
<Button btnClasses="!mt-2" on:click={createToken}>New Token</Button>
|
|
199
188
|
</div>
|
|
200
189
|
</div>
|
|
201
190
|
</div>
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
import RunnableWrapper from '../helpers/RunnableWrapper.svelte';
|
|
3
3
|
export let id;
|
|
4
4
|
export let componentInput;
|
|
5
|
-
export let horizontalAlignment = 'left';
|
|
6
|
-
export let verticalAlignment = undefined;
|
|
7
5
|
export let configuration;
|
|
8
6
|
export const staticOutputs = ['result', 'loading'];
|
|
9
7
|
let result = undefined;
|
|
@@ -19,17 +17,15 @@ let w = undefined;
|
|
|
19
17
|
bind:clientHeight={h}
|
|
20
18
|
bind:clientWidth={w}
|
|
21
19
|
>
|
|
22
|
-
<RunnableWrapper flexWrap bind:componentInput {id} bind:result>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{/key}
|
|
33
|
-
</AlignWrapper>
|
|
20
|
+
<RunnableWrapper autoRefresh flexWrap bind:componentInput {id} bind:result>
|
|
21
|
+
{#key result}
|
|
22
|
+
<iframe
|
|
23
|
+
frameborder="0"
|
|
24
|
+
style="height: {h}px; width: {w}px"
|
|
25
|
+
class="p-0"
|
|
26
|
+
title="sandbox"
|
|
27
|
+
srcdoc={result ? '<scr' + `ipt src="/tailwind.css"></script>` + result : 'No html'}
|
|
28
|
+
/>
|
|
29
|
+
{/key}
|
|
34
30
|
</RunnableWrapper>
|
|
35
31
|
</div>
|
|
@@ -4,8 +4,6 @@ declare const __propDef: {
|
|
|
4
4
|
props: {
|
|
5
5
|
id: string;
|
|
6
6
|
componentInput: AppInput | undefined;
|
|
7
|
-
horizontalAlignment?: 'left' | 'center' | 'right' | undefined;
|
|
8
|
-
verticalAlignment?: 'top' | 'center' | 'bottom' | undefined;
|
|
9
7
|
configuration: Record<string, AppInput>;
|
|
10
8
|
staticOutputs?: string[] | undefined;
|
|
11
9
|
};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
<script>import {
|
|
1
|
+
<script>import { Loader2 } from 'lucide-svelte';
|
|
2
|
+
import { parse } from 'path';
|
|
3
|
+
import { onMount } from 'svelte';
|
|
2
4
|
import AlignWrapper from '../helpers/AlignWrapper.svelte';
|
|
5
|
+
import InputValue from '../helpers/InputValue.svelte';
|
|
3
6
|
import RunnableWrapper from '../helpers/RunnableWrapper.svelte';
|
|
4
7
|
export let id;
|
|
5
8
|
export let componentInput;
|
|
6
|
-
export let horizontalAlignment = 'left';
|
|
7
|
-
export let verticalAlignment = undefined;
|
|
8
9
|
export let configuration;
|
|
9
10
|
export const staticOutputs = ['result', 'loading'];
|
|
10
11
|
let result = undefined;
|
|
@@ -12,17 +13,41 @@ let divEl = null;
|
|
|
12
13
|
let vegaEmbed;
|
|
13
14
|
onMount(async () => {
|
|
14
15
|
if (divEl) {
|
|
16
|
+
//@ts-ignore
|
|
15
17
|
await import('https://cdn.jsdelivr.net/npm/vega@5.22.1');
|
|
18
|
+
//@ts-ignore
|
|
16
19
|
await import('https://cdn.jsdelivr.net/npm/vega-lite@5.6.0');
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
vegaEmbed
|
|
20
|
+
//@ts-ignore
|
|
21
|
+
await import('https://cdn.jsdelivr.net/npm/vega-embed@6.21.0');
|
|
22
|
+
vegaEmbed = window['vegaEmbed'];
|
|
20
23
|
}
|
|
21
24
|
});
|
|
25
|
+
let h = undefined;
|
|
26
|
+
let w = undefined;
|
|
27
|
+
let canvas = false;
|
|
28
|
+
$: vegaEmbed &&
|
|
29
|
+
result &&
|
|
30
|
+
divEl &&
|
|
31
|
+
h &&
|
|
32
|
+
w &&
|
|
33
|
+
vegaEmbed(divEl, { ...result, ...{ width: w - 100 } }, {
|
|
34
|
+
mode: 'vega-lite',
|
|
35
|
+
actions: false,
|
|
36
|
+
renderer: canvas ? 'canvas' : 'svg',
|
|
37
|
+
height: h - 75,
|
|
38
|
+
width: w - 75
|
|
39
|
+
});
|
|
22
40
|
</script>
|
|
23
41
|
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
42
|
+
<InputValue {id} input={configuration.canvas} bind:value={canvas} />
|
|
43
|
+
|
|
44
|
+
<div class="w-full h-full" bind:clientHeight={h} bind:clientWidth={w}>
|
|
45
|
+
<RunnableWrapper flexWrap bind:componentInput {id} bind:result>
|
|
46
|
+
{#if !vegaEmbed}
|
|
47
|
+
<div class="p-2">
|
|
48
|
+
<Loader2 class="animate-spin" />
|
|
49
|
+
</div>
|
|
50
|
+
{/if}
|
|
51
|
+
<div on:pointerdown bind:this={divEl} />
|
|
52
|
+
</RunnableWrapper>
|
|
53
|
+
</div>
|
|
@@ -4,12 +4,12 @@ declare const __propDef: {
|
|
|
4
4
|
props: {
|
|
5
5
|
id: string;
|
|
6
6
|
componentInput: AppInput | undefined;
|
|
7
|
-
horizontalAlignment?: 'left' | 'center' | 'right' | undefined;
|
|
8
|
-
verticalAlignment?: 'top' | 'center' | 'bottom' | undefined;
|
|
9
7
|
configuration: Record<string, AppInput>;
|
|
10
8
|
staticOutputs?: string[] | undefined;
|
|
11
9
|
};
|
|
12
10
|
events: {
|
|
11
|
+
pointerdown: PointerEvent;
|
|
12
|
+
} & {
|
|
13
13
|
[evt: string]: CustomEvent<any>;
|
|
14
14
|
};
|
|
15
15
|
slots: {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script>import { getContext } from 'svelte';
|
|
1
|
+
<script>import { getContext, onMount } from 'svelte';
|
|
2
2
|
import InputValue from '../helpers/InputValue.svelte';
|
|
3
3
|
import RunnableWrapper from '../helpers/RunnableWrapper.svelte';
|
|
4
4
|
import { writable } from 'svelte/store';
|
|
@@ -29,13 +29,23 @@ const options = writable({
|
|
|
29
29
|
});
|
|
30
30
|
let table = createSvelteTable(options);
|
|
31
31
|
const { worldStore, staticOutputs: staticOutputsStore } = getContext('AppEditorContext');
|
|
32
|
-
let selectedRowIndex =
|
|
32
|
+
let selectedRowIndex = -1;
|
|
33
33
|
function toggleRow(row, rowIndex) {
|
|
34
34
|
if (selectedRowIndex !== rowIndex) {
|
|
35
35
|
selectedRowIndex = rowIndex;
|
|
36
36
|
outputs?.selectedRow.set(row.original);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
+
let mounted = false;
|
|
40
|
+
onMount(() => {
|
|
41
|
+
mounted = true;
|
|
42
|
+
});
|
|
43
|
+
$: selectedRowIndex === -1 &&
|
|
44
|
+
Array.isArray(result) &&
|
|
45
|
+
result.length > 0 &&
|
|
46
|
+
// We need to wait until the component is mounted so the world is created
|
|
47
|
+
mounted &&
|
|
48
|
+
toggleRow({ original: result[0] }, 0);
|
|
39
49
|
function setOptions(filteredResult) {
|
|
40
50
|
if (!Array.isArray(result)) {
|
|
41
51
|
return;
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
<script>import { onMount, setContext } from 'svelte';
|
|
2
|
+
import { fade } from 'svelte/transition';
|
|
3
|
+
import { cubicOut } from 'svelte/easing';
|
|
2
4
|
import { writable } from 'svelte/store';
|
|
3
5
|
import { buildWorld } from '../rx';
|
|
4
6
|
import GridEditor from './GridEditor.svelte';
|
|
5
7
|
import { classNames } from '../../../utils';
|
|
8
|
+
import Button from '../../common/button/Button.svelte';
|
|
9
|
+
import { Unlock } from 'lucide-svelte';
|
|
6
10
|
export let app;
|
|
7
11
|
export let appPath;
|
|
8
12
|
export let breakpoint;
|
|
@@ -12,6 +16,7 @@ export let workspace;
|
|
|
12
16
|
export let isEditor;
|
|
13
17
|
export let context;
|
|
14
18
|
export let noBackend = false;
|
|
19
|
+
export let isLocked = false;
|
|
15
20
|
const appStore = writable(app);
|
|
16
21
|
const worldStore = writable(undefined);
|
|
17
22
|
const staticOutputs = writable({});
|
|
@@ -48,12 +53,29 @@ onMount(() => {
|
|
|
48
53
|
});
|
|
49
54
|
$: mounted && ($worldStore = buildWorld($staticOutputs, undefined, context));
|
|
50
55
|
$: width = $breakpoint === 'sm' ? 'max-w-[640px]' : 'w-full ';
|
|
56
|
+
$: lockedClasses = isLocked ? '!max-h-[400px] overflow-hidden pointer-events-none' : '';
|
|
51
57
|
</script>
|
|
52
58
|
|
|
53
|
-
<div class="
|
|
54
|
-
{
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
<div class="relative">
|
|
60
|
+
<div class="{$$props.class} {lockedClasses} h-full max-h-[calc(100%-41px)] overflow-auto
|
|
61
|
+
w-full {app.fullscreen ? '' : 'max-w-6xl'} mx-auto">
|
|
62
|
+
{#if $appStore.grid}
|
|
63
|
+
<div class={classNames('mx-auto pb-4', width)}>
|
|
64
|
+
<GridEditor {policy} />
|
|
65
|
+
</div>
|
|
66
|
+
{/if}
|
|
67
|
+
</div>
|
|
68
|
+
{#if isLocked}
|
|
69
|
+
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
70
|
+
<div
|
|
71
|
+
transition:fade|local={{ duration: 200, easing: cubicOut }}
|
|
72
|
+
on:click={() => isLocked = false}
|
|
73
|
+
class="absolute inset-0 center-center bg-black/20 z-50 backdrop-blur-[1px] cursor-pointer"
|
|
74
|
+
>
|
|
75
|
+
<Button on:click={() => isLocked = false}>
|
|
76
|
+
Unlock preview
|
|
77
|
+
<Unlock size={18} class="ml-1" strokeWidth={2.5} />
|
|
78
|
+
</Button>
|
|
57
79
|
</div>
|
|
58
80
|
{/if}
|
|
59
81
|
</div>
|
|
@@ -4,6 +4,7 @@ import type { App, EditorBreakpoint } from '../types';
|
|
|
4
4
|
import type { Policy } from '../../../gen';
|
|
5
5
|
declare const __propDef: {
|
|
6
6
|
props: {
|
|
7
|
+
[x: string]: any;
|
|
7
8
|
app: App;
|
|
8
9
|
appPath: string;
|
|
9
10
|
breakpoint: Writable<EditorBreakpoint>;
|
|
@@ -13,6 +14,7 @@ declare const __propDef: {
|
|
|
13
14
|
isEditor: boolean;
|
|
14
15
|
context: Record<string, any>;
|
|
15
16
|
noBackend?: boolean | undefined;
|
|
17
|
+
isLocked?: boolean | undefined;
|
|
16
18
|
};
|
|
17
19
|
events: {
|
|
18
20
|
[evt: string]: CustomEvent<any>;
|
|
@@ -17,6 +17,7 @@ import AppScatterChart from '../components/dataDisplay/AppScatterChart.svelte';
|
|
|
17
17
|
import AppTimeseries from '../components/dataDisplay/AppTimeseries.svelte';
|
|
18
18
|
import AppHtml from '../components/dataDisplay/AppHtml.svelte';
|
|
19
19
|
import AppSliderInputs from '../components/numberInputs/AppSliderInputs.svelte';
|
|
20
|
+
import VegaLiteHtml from '../components/dataDisplay/VegaLiteHtml.svelte';
|
|
20
21
|
export let component;
|
|
21
22
|
export let selected;
|
|
22
23
|
export let locked = false;
|
|
@@ -74,6 +75,12 @@ const { staticOutputs, mode, connectingInput } = getContext('AppEditorContext');
|
|
|
74
75
|
bind:componentInput={component.componentInput}
|
|
75
76
|
bind:staticOutputs={$staticOutputs[component.id]}
|
|
76
77
|
/>
|
|
78
|
+
{:else if component.type === 'vegalitecomponent'}
|
|
79
|
+
<VegaLiteHtml
|
|
80
|
+
{...component}
|
|
81
|
+
bind:componentInput={component.componentInput}
|
|
82
|
+
bind:staticOutputs={$staticOutputs[component.id]}
|
|
83
|
+
/>
|
|
77
84
|
{:else if component.type === 'scatterchartcomponent'}
|
|
78
85
|
<AppScatterChart
|
|
79
86
|
{...component}
|
|
@@ -29,7 +29,8 @@ function getRecommendedDimensionsByComponent(componentType, column) {
|
|
|
29
29
|
'barchartcomponent',
|
|
30
30
|
'piechartcomponent',
|
|
31
31
|
'displaycomponent',
|
|
32
|
-
'scatterchartcomponent'
|
|
32
|
+
'scatterchartcomponent',
|
|
33
|
+
'vegalitecomponent'
|
|
33
34
|
],
|
|
34
35
|
'3:10-6:10': ['tablecomponent']
|
|
35
36
|
};
|
|
@@ -232,6 +232,40 @@ const display = {
|
|
|
232
232
|
configuration: {},
|
|
233
233
|
card: false
|
|
234
234
|
},
|
|
235
|
+
{
|
|
236
|
+
softWrap: false,
|
|
237
|
+
id: 'vegalitecomponent',
|
|
238
|
+
type: 'vegalitecomponent',
|
|
239
|
+
componentInput: {
|
|
240
|
+
type: 'static',
|
|
241
|
+
fieldType: 'object',
|
|
242
|
+
value: {
|
|
243
|
+
data: {
|
|
244
|
+
values: [
|
|
245
|
+
{ a: 'A', b: 28 },
|
|
246
|
+
{ a: 'B', b: 55 },
|
|
247
|
+
{ a: 'C', b: 43 },
|
|
248
|
+
{ a: 'D', b: 91 },
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
mark: 'bar',
|
|
252
|
+
encoding: {
|
|
253
|
+
x: { field: 'a', type: 'ordinal' },
|
|
254
|
+
y: { field: 'b', type: 'quantitative' }
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
configuration: {
|
|
259
|
+
canvas: {
|
|
260
|
+
type: 'static',
|
|
261
|
+
onlyStatic: true,
|
|
262
|
+
fieldType: 'boolean',
|
|
263
|
+
value: false,
|
|
264
|
+
tooltip: "use the canvas renderer instead of the svg one for more interactive plots"
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
card: false
|
|
268
|
+
},
|
|
235
269
|
{
|
|
236
270
|
softWrap: true,
|
|
237
271
|
horizontalAlignment: 'left',
|
|
@@ -94,6 +94,45 @@ const DEFAULT_CODES = {
|
|
|
94
94
|
<h1 class="absolute top-4 left-2 text-white">
|
|
95
95
|
Hello world
|
|
96
96
|
</h1>'''`,
|
|
97
|
+
},
|
|
98
|
+
vegalitecomponent: {
|
|
99
|
+
deno: `
|
|
100
|
+
export async function main() {
|
|
101
|
+
return {
|
|
102
|
+
data: {
|
|
103
|
+
values: [
|
|
104
|
+
{ a: "A", b: 28 },
|
|
105
|
+
{ a: "B", b: 55 },
|
|
106
|
+
{ a: "C", b: 43 },
|
|
107
|
+
{ a: "D", b: 91 },
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
mark: "bar",
|
|
111
|
+
encoding: {
|
|
112
|
+
x: { field: "a", type: "ordinal" },
|
|
113
|
+
y: { field: "b", type: "quantitative" },
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
`,
|
|
118
|
+
python3: `
|
|
119
|
+
def main():
|
|
120
|
+
return {
|
|
121
|
+
"data": {
|
|
122
|
+
"values": [
|
|
123
|
+
{ "a": "A", "b": 28 },
|
|
124
|
+
{ "a": "B", "b": 55 },
|
|
125
|
+
{ "a": "C", "b": 43 },
|
|
126
|
+
{ "a": "D", "b": 91 },
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
"mark": "bar",
|
|
130
|
+
"encoding": {
|
|
131
|
+
"x": { "field": "a", "type": "ordinal" },
|
|
132
|
+
"y": { "field": "b", "type": "quantitative" },
|
|
133
|
+
},
|
|
134
|
+
}
|
|
135
|
+
`
|
|
97
136
|
},
|
|
98
137
|
piechartcomponent: {
|
|
99
138
|
deno: `export async function main() {
|
|
@@ -14,6 +14,7 @@ export type DateInputComponent = BaseComponent<'dateinputcomponent'>;
|
|
|
14
14
|
export type NumberInputComponent = BaseComponent<'numberinputcomponent'>;
|
|
15
15
|
export type SliderComponent = BaseComponent<'slidercomponent'>;
|
|
16
16
|
export type HtmlComponent = BaseComponent<'htmlcomponent'>;
|
|
17
|
+
export type VegaLiteComponent = BaseComponent<'vegalitecomponent'>;
|
|
17
18
|
export type TimeseriesComponent = BaseComponent<'timeseriescomponent'>;
|
|
18
19
|
export type ButtonComponent = BaseComponent<'buttoncomponent'> & {
|
|
19
20
|
recomputeIds: string[] | undefined;
|
|
@@ -56,7 +57,7 @@ export interface BaseAppComponent extends Partial<Aligned> {
|
|
|
56
57
|
*/
|
|
57
58
|
softWrap?: boolean;
|
|
58
59
|
}
|
|
59
|
-
export type AppComponent = BaseAppComponent & (RunFormComponent | DisplayComponent | TextInputComponent | PasswordInputComponent | DateInputComponent | NumberInputComponent | SliderComponent | BarChartComponent | TimeseriesComponent | HtmlComponent | TableComponent | TextComponent | TableComponent | ButtonComponent | PieChartComponent | ScatterChartComponent | ImageComponent | InputComponent | SelectComponent | CheckboxComponent | RadioComponent | FormComponent);
|
|
60
|
+
export type AppComponent = BaseAppComponent & (RunFormComponent | DisplayComponent | TextInputComponent | PasswordInputComponent | DateInputComponent | NumberInputComponent | SliderComponent | BarChartComponent | TimeseriesComponent | HtmlComponent | TableComponent | TextComponent | TableComponent | ButtonComponent | PieChartComponent | ScatterChartComponent | ImageComponent | InputComponent | SelectComponent | CheckboxComponent | RadioComponent | FormComponent | VegaLiteComponent);
|
|
60
61
|
export type ComponentSet = {
|
|
61
62
|
title: string;
|
|
62
63
|
components: AppComponent[];
|
package/components/apps/utils.js
CHANGED
|
@@ -106,11 +106,11 @@ async function getCaptureInput() {
|
|
|
106
106
|
Copy as flow inputs and test args
|
|
107
107
|
</Button>
|
|
108
108
|
</svelte:fragment>
|
|
109
|
-
<h3 class="my-2">Derived schema</h3>
|
|
109
|
+
<h3 class="my-2 mt-8">Derived schema</h3>
|
|
110
110
|
<div class="box p-2">
|
|
111
111
|
<SchemaViewer schema={jsonSchema} />
|
|
112
112
|
</div>
|
|
113
|
-
<h3 class="mt-
|
|
114
|
-
<SchemaForm class="
|
|
113
|
+
<h3 class="mt-8">Test args</h3>
|
|
114
|
+
<SchemaForm class="pt-4" schema={$flowStore.schema} args={$previewArgs} />
|
|
115
115
|
</DrawerContent>
|
|
116
116
|
</Drawer>
|