Skip to content

Commit 2885f7c

Browse files
draft commit, rebase and adjust when PR
1 parent 0d9b834 commit 2885f7c

File tree

2 files changed

+129
-20
lines changed

2 files changed

+129
-20
lines changed

client/src/components/Form/FormElement.vue

+25-14
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { computed, ref, useAttrs } from "vue";
99
1010
import { linkify } from "@/utils/utils";
1111
12-
import type { FormParameterAttributes, FormParameterTypes, FormParameterValue } from "./parameterTypes";
12+
import type { FormParameterAttributes, FormParameterTypeMap, FormParameterTypes } from "./parameterTypes";
1313
1414
import FormBoolean from "./Elements/FormBoolean.vue";
1515
import FormColor from "./Elements/FormColor.vue";
@@ -36,10 +36,10 @@ const TYPE_TO_PLACEHOLDER: Record<string, string> = {
3636
float: "a floating point number",
3737
};
3838
39-
interface FormElementProps {
39+
interface FormElementProps<T extends FormParameterTypes> {
4040
id?: string;
41-
type?: FormParameterTypes;
42-
value?: FormParameterValue;
41+
type?: T;
42+
value?: FormParameterTypeMap[T];
4343
title?: string;
4444
refreshOnChange?: boolean;
4545
help?: string;
@@ -48,7 +48,7 @@ interface FormElementProps {
4848
warning?: string;
4949
disabled?: boolean;
5050
loading?: boolean;
51-
attributes?: FormParameterAttributes;
51+
attributes?: FormParameterAttributes<T>;
5252
collapsedEnableText?: string;
5353
collapsedDisableText?: string;
5454
collapsedEnableIcon?: string;
@@ -62,7 +62,9 @@ interface FormElementProps {
6262
workflowRun?: boolean;
6363
}
6464
65-
const props = withDefaults(defineProps<FormElementProps>(), {
65+
const props = withDefaults(defineProps<FormElementProps<FormParameterTypes>>(), {
66+
attributes: undefined,
67+
error: undefined,
6668
id: "identifier",
6769
refreshOnChange: false,
6870
disabled: false,
@@ -74,13 +76,18 @@ const props = withDefaults(defineProps<FormElementProps>(), {
7476
connectedDisableText: "Add connection to module.",
7577
connectedEnableIcon: "fa fa-times",
7678
connectedDisableIcon: "fa fa-arrows-alt-h",
79+
help: undefined,
7780
helpFormat: "html",
81+
title: undefined,
82+
type: undefined,
83+
value: undefined,
84+
warning: undefined,
7885
workflowBuildingMode: false,
7986
workflowRun: false,
8087
});
8188
8289
const emit = defineEmits<{
83-
(e: "input", value: FormParameterValue, id: string): void;
90+
(e: "input", value: FormParameterTypeMap[FormParameterTypes], id: string): void;
8491
(e: "change", shouldRefresh: boolean): void;
8592
}>();
8693
@@ -91,10 +98,14 @@ library.add(faExclamation, faTimes, faArrowsAltH, faCaretSquareDown, faCaretSqua
9198
It is present for compatibility with the legacy "FormParameter" component,
9299
but should be removed as soon as that component is removed.
93100
*/
94-
const attrs: ComputedRef<FormParameterAttributes> = computed(() => props.attributes || useAttrs());
95-
const collapsibleValue: ComputedRef<FormParameterValue> = computed(() => attrs.value["collapsible_value"]);
96-
const defaultValue: ComputedRef<FormParameterValue> = computed(() => attrs.value["default_value"]);
97-
const connectedValue: FormParameterValue = { __class__: "ConnectedValue" };
101+
const attrs: ComputedRef<FormParameterAttributes<FormParameterTypes>> = computed(() => props.attributes || useAttrs());
102+
const collapsibleValue: ComputedRef<FormParameterTypeMap[FormParameterTypes]> = computed(
103+
() => attrs.value["collapsible_value"]
104+
);
105+
const defaultValue: ComputedRef<FormParameterTypeMap[FormParameterTypes]> = computed(
106+
() => attrs.value["default_value"]
107+
);
108+
const connectedValue: FormParameterTypeMap[FormParameterTypes] = { __class__: "ConnectedValue" };
98109
99110
const computedPlaceholder = computed(() => {
100111
if (!props.workflowRun) {
@@ -132,7 +143,7 @@ const connectable = computed(() => collapsible.value && Boolean(attrs.value["con
132143
}
133144
134145
/** Submits a changed value. */
135-
function setValue(value: FormParameterValue) {
146+
function setValue(value: FormParameterTypeMap[FormParameterTypes]) {
136147
emit("input", value, props.id);
137148
emit("change", props.refreshOnChange);
138149
}
@@ -171,7 +182,7 @@ const formDataField = computed(() =>
171182
);
172183
const isUriDataField = computed(() => {
173184
const dataField = props.type == "data";
174-
if (dataField && props.value && "src" in props.value) {
185+
if (dataField && props.value && typeof props.value === "object" && "src" in props.value) {
175186
const src = props.value.src;
176187
return src == "url";
177188
}
@@ -193,7 +204,7 @@ const nonMdHelp = computed(() =>
193204
: ""
194205
);
195206
196-
const currentValue = computed({
207+
const currentValue = computed<FormParameterTypeMap[FormParameterTypes]>({
197208
get() {
198209
return props.value;
199210
},

client/src/components/Form/parameterTypes.d.ts

+104-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
// TODO: stricter types
2-
export type FormParameterValue = any;
3-
export type FormParameterAttributes = {
4-
[attribute: string]: any;
5-
};
6-
71
export type FormParameterTypes =
82
| "boolean"
93
| "hidden"
@@ -27,3 +21,107 @@ export type FormParameterTypes =
2721
| "upload"
2822
| "rules"
2923
| "tags";
24+
25+
export type FormParameterTypeMap = {
26+
boolean: boolean | string;
27+
hidden: string;
28+
hidden_data: string | undefined;
29+
baseurl: string | undefined;
30+
integer: number | string;
31+
float: number | string;
32+
radio: string;
33+
color: string;
34+
directory_uri: string;
35+
text: string | number | string[];
36+
password: string | number | string[];
37+
select: string;
38+
data_column: string;
39+
genomebuild: string;
40+
data: FormParameterDataOption;
41+
data_collection: FormParameterDataOption;
42+
drill_down: string;
43+
group_tag: string;
44+
ftpfile: string;
45+
upload: string;
46+
rules: string;
47+
data_dialog: string | string[];
48+
tags: string;
49+
};
50+
51+
type FormParameterDataOption =
52+
| {
53+
src: "dce" | "hda" | "hdca" | "ldda" | "url";
54+
id: string;
55+
hid: number;
56+
name: string;
57+
tags?: string[];
58+
keep?: boolean;
59+
map_over_type?: string;
60+
}
61+
| {
62+
__class__: string;
63+
};
64+
export type FormParameterAttributes<T extends FormParameterTypes> = {
65+
area?: boolean;
66+
argument?: string | null;
67+
collapsible_preview?: boolean;
68+
collapsible_value?: FormParameterTypeMap[T];
69+
color?: string;
70+
cls?: string;
71+
collection_types?: string[];
72+
connectable?: boolean;
73+
data?: FormParameterTypeMap[T][];
74+
datalist?: FormParameterTypeMap[T][];
75+
default_value?: FormParameterTypeMap[T];
76+
display?: string;
77+
edam?: {
78+
edam_data: string[];
79+
edam_formats: string[];
80+
};
81+
error?: string | null;
82+
extensions?: string[];
83+
flavor?: string;
84+
help?: string;
85+
help_format?: string;
86+
hidden?: boolean;
87+
info?: string;
88+
is_dynamic?: boolean;
89+
is_workflow?: boolean;
90+
label?: string;
91+
max?: string | number;
92+
min?: string | number;
93+
model_class?:
94+
| "ColorToolParameter"
95+
| "DirectoryUriToolParameter"
96+
| "BaseDataToolParameter"
97+
| "BooleanToolParameter"
98+
| "DataCollectionToolParameter"
99+
| "DataToolParameter"
100+
| "FloatToolParameter"
101+
| "HiddenToolParameter"
102+
| "IntegerToolParameter"
103+
| "SelectToolParameter"
104+
| "TextToolParameter";
105+
multiple?: boolean | string;
106+
name?: string;
107+
optional?: boolean;
108+
options?:
109+
| FormParameterTypeMap[T][]
110+
| {
111+
dce: FormParameterDataOption[];
112+
hda: FormParameterDataOption[];
113+
hdca: FormParameterDataOption[];
114+
ldda: FormParameterDataOption[];
115+
};
116+
placeholder?: string;
117+
readonly?: boolean;
118+
refresh_on_change?: boolean;
119+
tag?: string;
120+
target?: Record<string, unknown>;
121+
textable?: boolean;
122+
text_value?: string;
123+
titleonly?: boolean;
124+
truevalue?: FormParameterTypeMap[T];
125+
type?: FormParameterTypes;
126+
value?: FormParameterTypeMap[T];
127+
};

0 commit comments

Comments
 (0)