fix(tui): align form visibility with active answers
This commit is contained in:
parent
d6472bfda7
commit
ae8a591426
1 changed files with 31 additions and 12 deletions
|
|
@ -172,16 +172,19 @@ function FieldsPrompt(props: { form: FormInfo & { mode: "form" } }) {
|
||||||
let textarea: TextareaRenderable | undefined
|
let textarea: TextareaRenderable | undefined
|
||||||
let review: ScrollBoxRenderable | undefined
|
let review: ScrollBoxRenderable | undefined
|
||||||
|
|
||||||
const fields = createMemo(() =>
|
const fields = createMemo(() => {
|
||||||
props.form.fields.filter((field) =>
|
const answers: Record<string, FormValue | undefined> = {}
|
||||||
(field.when ?? []).every((when) => {
|
return props.form.fields.filter((field) => {
|
||||||
const value = store.answers[when.key]
|
const active = (field.when ?? []).every((when) => {
|
||||||
|
const value = answers[when.key]
|
||||||
if (value === undefined) return false
|
if (value === undefined) return false
|
||||||
const hit = Array.isArray(value) ? value.some((item) => item === when.value) : value === when.value
|
const hit = Array.isArray(value) ? value.some((item) => item === when.value) : value === when.value
|
||||||
return when.op === "eq" ? hit : !hit
|
return when.op === "eq" ? hit : !hit
|
||||||
}),
|
})
|
||||||
),
|
if (active) answers[field.key] = store.answers[field.key]
|
||||||
)
|
return active
|
||||||
|
})
|
||||||
|
})
|
||||||
const single = createMemo(() => {
|
const single = createMemo(() => {
|
||||||
const list = fields()
|
const list = fields()
|
||||||
if (list.length !== 1) return false
|
if (list.length !== 1) return false
|
||||||
|
|
@ -254,11 +257,20 @@ function FieldsPrompt(props: { form: FormInfo & { mode: "form" } }) {
|
||||||
answer(current.key, value)
|
answer(current.key, value)
|
||||||
if (customValue !== undefined) setStore("custom", { ...store.custom, [current.key]: customValue })
|
if (customValue !== undefined) setStore("custom", { ...store.custom, [current.key]: customValue })
|
||||||
if (single()) {
|
if (single()) {
|
||||||
void sdk.api.form.reply({
|
sdk.api.form
|
||||||
sessionID: props.form.sessionID,
|
.reply({
|
||||||
formID: props.form.id,
|
sessionID: props.form.sessionID,
|
||||||
answer: { [current.key]: value },
|
formID: props.form.id,
|
||||||
})
|
answer: { [current.key]: value },
|
||||||
|
})
|
||||||
|
.catch((error: unknown) => {
|
||||||
|
setStore(
|
||||||
|
"error",
|
||||||
|
typeof error === "object" && error !== null && "message" in error && typeof error.message === "string"
|
||||||
|
? error.message
|
||||||
|
: "Invalid answer",
|
||||||
|
)
|
||||||
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
setStore("tab", store.tab + 1)
|
setStore("tab", store.tab + 1)
|
||||||
|
|
@ -446,6 +458,13 @@ function FieldsPrompt(props: { form: FormInfo & { mode: "form" } }) {
|
||||||
setStore("editing", false)
|
setStore("editing", false)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (current.type === "string") {
|
||||||
|
const invalid = validateText(current, text)
|
||||||
|
if (invalid) {
|
||||||
|
setStore("error", invalid)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
pick(text, text)
|
pick(text, text)
|
||||||
setStore("editing", false)
|
setStore("editing", false)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue