Fix: form submit (#76)

* fix: worker template extension form submit

* bump @kksh/api

* update api package version
This commit is contained in:
Huakun Shen 2025-01-24 02:37:36 -05:00 committed by GitHub
parent 0cc744592f
commit e719176b9c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 153 additions and 39 deletions

View File

@ -9,11 +9,13 @@
"updateInternalDependencies": "patch", "updateInternalDependencies": "patch",
"ignore": [ "ignore": [
"jarvis", "jarvis",
"form-view",
"@kksh/desktop", "@kksh/desktop",
"@kksh/supabase", "@kksh/supabase",
"@kksh/utils", "@kksh/utils",
"@kksh/extension", "@kksh/extension",
"@kksh/schema", "@kksh/schema",
"@kksh/supabase" "@kksh/supabase",
"@kksh/ui"
] ]
} }

View File

@ -1,5 +1,12 @@
# kksh # kksh
## 0.0.30
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.29 ## 0.0.29
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"name": "kksh", "name": "kksh",
"module": "dist/cli.js", "module": "dist/cli.js",
"version": "0.0.29", "version": "0.0.30",
"type": "module", "type": "module",
"bin": { "bin": {
"kksh": "./dist/cli.js", "kksh": "./dist/cli.js",

View File

@ -1,5 +1,12 @@
# create-kunkun # create-kunkun
## 0.1.40
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.1.38 ## 0.1.38
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"name": "create-kunkun", "name": "create-kunkun",
"type": "module", "type": "module",
"version": "0.1.39", "version": "0.1.40",
"bin": { "bin": {
"create-kunkun": "dist/index.mjs" "create-kunkun": "dist/index.mjs"
}, },

View File

@ -359,7 +359,14 @@
{/snippet} {/snippet}
</Templates.ListView> </Templates.ListView>
{:else if loaded && formViewContent !== undefined} {:else if loaded && formViewContent !== undefined}
<Templates.FormView {formViewContent} onGoBack={goBack} /> <Templates.FormView
{formViewContent}
onGoBack={goBack}
onSubmit={(formData: Record<string, string | number | boolean>) => {
console.log("formData", formData)
workerAPI?.onFormSubmit(formData)
}}
/>
{:else if loaded && markdownViewContent !== undefined} {:else if loaded && markdownViewContent !== undefined}
<Templates.MarkdownView {markdownViewContent} onGoBack={goBack} /> <Templates.MarkdownView {markdownViewContent} onGoBack={goBack} />
{/if} {/if}

View File

@ -1,5 +1,11 @@
# @kksh/api # @kksh/api
## 0.0.53
### Patch Changes
- Add Show Debug option for worker template form view
## 0.0.48 ## 0.0.48
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "https://jsr.io/schema/config-file.v1.json", "$schema": "https://jsr.io/schema/config-file.v1.json",
"name": "@kunkun/api", "name": "@kunkun/api",
"version": "0.0.52", "version": "0.0.53",
"license": "MIT", "license": "MIT",
"exports": { "exports": {
".": "./src/index.ts", ".": "./src/index.ts",
@ -17,6 +17,6 @@
"./dev": "./src/dev/index.ts", "./dev": "./src/dev/index.ts",
"./events": "./src/events.ts", "./events": "./src/events.ts",
"./extensions/jsr": "./src/extensions/jsr/index.ts" "./extensions/jsr": "./src/extensions/jsr/index.ts"
}, },
"imports": {} "imports": {}
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@kksh/api", "name": "@kksh/api",
"version": "0.0.52", "version": "0.0.53",
"type": "module", "type": "module",
"exports": { "exports": {
".": "./src/index.ts", ".": "./src/index.ts",

View File

@ -137,6 +137,7 @@ export class ArrayField
export class Form implements IComponent<FormSchema.Form> { export class Form implements IComponent<FormSchema.Form> {
nodeName: FormNodeName = FormNodeNameEnum.Form nodeName: FormNodeName = FormNodeNameEnum.Form
fields: (AllFormFields | Form)[] fields: (AllFormFields | Form)[]
showFormDataDebug?: boolean
key: string key: string
title?: string title?: string
description?: string description?: string
@ -148,6 +149,7 @@ export class Form implements IComponent<FormSchema.Form> {
this.title = model.title this.title = model.title
this.description = model.description this.description = model.description
this.submitBtnText = model.submitBtnText this.submitBtnText = model.submitBtnText
this.showFormDataDebug = model.showFormDataDebug
} }
toModel(): FormSchema.Form { toModel(): FormSchema.Form {

View File

@ -136,6 +136,7 @@ export type FormField = InferOutput<typeof FormField>
export const Form: GenericSchema<Form> = object({ export const Form: GenericSchema<Form> = object({
nodeName: FormNodeName, nodeName: FormNodeName,
key: string(), key: string(),
showFormDataDebug: optional(boolean()),
fields: array(union([lazy(() => Form), FormField])), fields: array(union([lazy(() => Form), FormField])),
title: optional(string()), title: optional(string()),
description: optional(string()), description: optional(string()),
@ -144,6 +145,7 @@ export const Form: GenericSchema<Form> = object({
export type Form = { export type Form = {
nodeName: FormNodeName nodeName: FormNodeName
title?: string title?: string
showFormDataDebug?: boolean
description?: string description?: string
submitBtnText?: string submitBtnText?: string
key: string key: string

View File

@ -21,7 +21,7 @@ export const breakingChangesVersionCheckpoints = [
const checkpointVersions = breakingChangesVersionCheckpoints.map((c) => c.version) const checkpointVersions = breakingChangesVersionCheckpoints.map((c) => c.version)
const sortedCheckpointVersions = sort(checkpointVersions) const sortedCheckpointVersions = sort(checkpointVersions)
export const version = "0.0.52" export const version = "0.0.53"
export function isVersionBetween(v: string, start: string, end: string) { export function isVersionBetween(v: string, start: string, end: string) {
const vCleaned = clean(v) const vCleaned = clean(v)

View File

@ -1,5 +1,12 @@
# demo-template-extension # demo-template-extension
## 0.0.6
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.5 ## 0.0.5
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "../../schema/manifest-json-schema.json", "$schema": "../../schema/manifest-json-schema.json",
"name": "demo-template-extension", "name": "demo-template-extension",
"version": "0.0.5", "version": "0.0.6",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"kunkun": { "kunkun": {

View File

@ -1,5 +1,12 @@
# template-ext-sveltekit # template-ext-sveltekit
## 0.0.6
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.5 ## 0.0.5
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "https://schema.kunkun.sh", "$schema": "https://schema.kunkun.sh",
"name": "ext-sveltekit-exp", "name": "ext-sveltekit-exp",
"version": "0.0.5", "version": "0.0.6",
"license": "MIT", "license": "MIT",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",

View File

@ -25,10 +25,11 @@ class ExtensionTemplate extends WorkerExtension {
const markdown = new Markdown(`# Hello World const markdown = new Markdown(`# Hello World
<img src="https://github.com/huakunshen.png" />`) <img src="https://github.com/huakunshen.png" />`)
// markdown.toModel // markdown.toModel
return ui.render(markdown) // return ui.render(markdown)
const form = new Form.Form({ const form = new Form.Form({
title: "Form 1", title: "Form 1",
key: "form1", key: "form1",
showFormDataDebug: true,
submitBtnText: "Download", submitBtnText: "Download",
fields: [ fields: [
new Form.DateField({ new Form.DateField({

View File

@ -1,5 +1,12 @@
# template-ext-worker # template-ext-worker
## 0.0.5
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.4 ## 0.0.4
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-headless", "name": "template-ext-headless",
"version": "0.0.4", "version": "0.0.5",
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"kunkun": { "kunkun": {

View File

@ -1,5 +1,12 @@
# template-ext-next # template-ext-next
## 0.1.4
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.1.3 ## 0.1.3
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-next", "name": "template-ext-next",
"version": "0.1.3", "version": "0.1.4",
"license": "MIT", "license": "MIT",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",

View File

@ -1,5 +1,12 @@
# template-ext-nuxt # template-ext-nuxt
## 0.0.6
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.5 ## 0.0.5
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-nuxt", "name": "template-ext-nuxt",
"version": "0.0.5", "version": "0.0.6",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"kunkun": { "kunkun": {

View File

@ -1,5 +1,12 @@
# template-ext-react # template-ext-react
## 0.0.5
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.4 ## 0.0.4
### Patch Changes ### Patch Changes

View File

@ -2,7 +2,7 @@
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-react", "name": "template-ext-react",
"license": "MIT", "license": "MIT",
"version": "0.0.4", "version": "0.0.5",
"type": "module", "type": "module",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",

View File

@ -1,5 +1,12 @@
# template-ext-svelte # template-ext-svelte
## 0.0.5
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.4 ## 0.0.4
### Patch Changes ### Patch Changes

View File

@ -2,7 +2,7 @@
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-svelte", "name": "template-ext-svelte",
"license": "MIT", "license": "MIT",
"version": "0.0.4", "version": "0.0.5",
"type": "module", "type": "module",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",

View File

@ -1,5 +1,12 @@
# template-ext-sveltekit # template-ext-sveltekit
## 0.0.6
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.5 ## 0.0.5
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-sveltekit", "name": "template-ext-sveltekit",
"version": "0.0.5", "version": "0.0.6",
"license": "MIT", "license": "MIT",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",

View File

@ -1,5 +1,12 @@
# template-ext-vue # template-ext-vue
## 0.0.3
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.2 ## 0.0.2
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"name": "template-ext-vue", "name": "template-ext-vue",
"license": "MIT", "license": "MIT",
"version": "0.0.2", "version": "0.0.3",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@ -1,5 +1,12 @@
# template-ext-worker # template-ext-worker
## 0.0.5
### Patch Changes
- Updated dependencies
- @kksh/api@0.0.53
## 0.0.4 ## 0.0.4
### Patch Changes ### Patch Changes

View File

@ -1,7 +1,7 @@
{ {
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-worker", "name": "template-ext-worker",
"version": "0.0.4", "version": "0.0.5",
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"kunkun": { "kunkun": {

View File

@ -10,12 +10,16 @@
let { let {
date = $bindable(), date = $bindable(),
dateValue = $bindable(),
class: className, class: className,
value = $bindable() value = $bindable()
}: { date?: DateValue; class?: string; value?: string } = $props() }: { date?: Date; dateValue?: DateValue; class?: string; value?: string } = $props()
const valueString = $derived(date ? df.format(date.toDate(getLocalTimeZone())) : "") const valueString = $derived(dateValue ? df.format(dateValue.toDate(getLocalTimeZone())) : "")
$effect(() => { $effect(() => {
value = date ? date.toString() : "" value = dateValue ? dateValue.toString() : ""
if (dateValue) {
date = dateValue?.toDate(getLocalTimeZone())
}
}) })
const items = [ const items = [
{ value: 0, label: "Today" }, { value: 0, label: "Today" },
@ -32,12 +36,12 @@
variant: "outline", variant: "outline",
class: "w-[280px] justify-start text-left font-normal" class: "w-[280px] justify-start text-left font-normal"
}), }),
!date && "text-muted-foreground", !dateValue && "text-muted-foreground",
className className
)} )}
> >
<CalendarIcon class="mr-2 size-4" /> <CalendarIcon class="mr-2 size-4" />
{date ? df.format(date.toDate(getLocalTimeZone())) : "Pick a date"} {dateValue ? df.format(dateValue.toDate(getLocalTimeZone())) : "Pick a date"}
</Popover.Trigger> </Popover.Trigger>
<Popover.Content class="flex w-auto flex-col space-y-2 p-2"> <Popover.Content class="flex w-auto flex-col space-y-2 p-2">
<Select.Root <Select.Root
@ -46,7 +50,7 @@
controlledValue controlledValue
onValueChange={(v: string) => { onValueChange={(v: string) => {
if (!v) return if (!v) return
date = today(getLocalTimeZone()).add({ days: Number.parseInt(v) }) dateValue = today(getLocalTimeZone()).add({ days: Number.parseInt(v) })
}} }}
> >
<Select.Trigger> <Select.Trigger>
@ -59,7 +63,7 @@
</Select.Content> </Select.Content>
</Select.Root> </Select.Root>
<div class="rounded-md border"> <div class="rounded-md border">
<Calendar.Calendar type="single" bind:value={date} /> <Calendar.Calendar type="single" bind:value={dateValue} />
</div> </div>
</Popover.Content> </Popover.Content>
</Popover.Root> </Popover.Root>

View File

@ -4,8 +4,15 @@
import { ArrowLeftIcon } from "lucide-svelte" import { ArrowLeftIcon } from "lucide-svelte"
import Form from "./form.svelte" import Form from "./form.svelte"
let { formViewContent, onGoBack }: { formViewContent: FormSchema.Form; onGoBack: () => void } = let {
$props() formViewContent,
onGoBack,
onSubmit
}: {
formViewContent: FormSchema.Form
onGoBack: () => void
onSubmit?: (formData: Record<string, string | number | boolean>) => void
} = $props()
</script> </script>
<div data-tauri-drag-region class="h-12 w-full"></div> <div data-tauri-drag-region class="h-12 w-full"></div>
@ -14,5 +21,5 @@
</Button> </Button>
<main class="container flex flex-col gap-2 pb-4"> <main class="container flex flex-col gap-2 pb-4">
<h1 class="text-2xl font-bold">{formViewContent.title}</h1> <h1 class="text-2xl font-bold">{formViewContent.title}</h1>
<Form {formViewContent} /> <Form {formViewContent} {onSubmit} />
</main> </main>

View File

@ -1,14 +1,12 @@
<script lang="ts"> <script lang="ts">
import type { DateValue } from "@internationalized/date"
import { FormNodeNameEnum, FormSchema } from "@kksh/api/models" import { FormNodeNameEnum, FormSchema } from "@kksh/api/models"
import { Button, Checkbox, Form, Input, Label, Select } from "@kksh/svelte5" import { Button, Checkbox, Input, Label, Select } from "@kksh/svelte5"
import { DatePickerWithPreset, Shiki } from "@kksh/ui" import { DatePickerWithPreset } from "@kksh/ui"
import { buildFormSchema, cn } from "@kksh/ui/utils" import { buildFormSchema, cn } from "@kksh/ui/utils"
import { onMount, tick } from "svelte" import { onMount } from "svelte"
import SuperDebug, { defaults, superForm } from "sveltekit-superforms" import SuperDebug, { defaults, superForm } from "sveltekit-superforms"
import { valibot, valibotClient } from "sveltekit-superforms/adapters" import { valibot, valibotClient } from "sveltekit-superforms/adapters"
import * as v from "valibot" import * as v from "valibot"
import DatePicker from "../../common/date/DatePicker.svelte"
import TauriLink from "../../common/TauriLink.svelte" import TauriLink from "../../common/TauriLink.svelte"
let { let {
@ -37,16 +35,15 @@
validators: valibotClient(formSchema), validators: valibotClient(formSchema),
SPA: true, SPA: true,
onUpdate({ form, cancel }) { onUpdate({ form, cancel }) {
cancel()
console.log($formData)
if (!form.valid) return if (!form.valid) return
cancel()
const parsedData = v.parse(formSchema, $formData) const parsedData = v.parse(formSchema, $formData)
console.log(parsedData)
onSubmit?.(parsedData) onSubmit?.(parsedData)
} }
}) })
) )
const { form: formData, enhance, errors } = $derived(form) const { form: formData, enhance, errors } = $derived(form)
$inspect(formData)
</script> </script>
{#snippet error(messages?: string[])} {#snippet error(messages?: string[])}
@ -83,7 +80,7 @@
/> />
{:else if field.nodeName === FormNodeNameEnum.Date} {:else if field.nodeName === FormNodeNameEnum.Date}
{@const field2 = field as FormSchema.DateField} {@const field2 = field as FormSchema.DateField}
<DatePickerWithPreset class="w-full" bind:value={$formData[field2.key]} /> <DatePickerWithPreset class="w-full" bind:date={$formData[field2.key]} />
{:else if field.nodeName === FormNodeNameEnum.Select} {:else if field.nodeName === FormNodeNameEnum.Select}
{@const field2 = field as FormSchema.SelectField} {@const field2 = field as FormSchema.SelectField}
<Select.Root type="single" name="favoriteFruit" bind:value={$formData[field2.key]}> <Select.Root type="single" name="favoriteFruit" bind:value={$formData[field2.key]}>
@ -141,4 +138,6 @@
<Button type="submit">{formViewContent.submitBtnText ?? "Submit"}</Button> <Button type="submit">{formViewContent.submitBtnText ?? "Submit"}</Button>
</form> </form>
{/key} {/key}
<!-- <SuperDebug data={$formData} /> --> {#if formViewContent.showFormDataDebug}
<SuperDebug data={$formData} />
{/if}