Skip to content

Commit dfeaae4

Browse files
committed
feat(form): add values property to FazForm
Fixes: #161
1 parent b13ef1b commit dfeaae4

4 files changed

Lines changed: 48 additions & 7 deletions

File tree

src/form.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ export class FazFormElement extends FazElement {
4444
}
4545
}
4646
}
47+
48+
get form(): HTMLFormElement|undefined {
49+
return undefined
50+
}
51+
52+
get values(): Record<string, FormDataEntryValue> {
53+
const values: Record<string, FormDataEntryValue> = {};
54+
if (this.form === undefined) {
55+
return values;
56+
}
57+
const formData = new FormData(this.form);
58+
for (const [key, value] of formData.entries()) {
59+
values[key] = value;
60+
}
61+
return values;
62+
}
4763

4864
public clearErrorsFor(key: string) {
4965
const errors = { ...this.errors() };

test/form.test.tsx

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,49 @@
1515
*/
1616

1717
import { FazFormElement } from "../src/form";
18-
import { describe, expect, test } from "vitest";
19-
import { allComments } from "../src/test";
18+
import { allComments} from "../src/test";
19+
import { JSX } from "solid-js/jsx-runtime";
20+
import { render } from "solid-js/web";
21+
import { afterEach, beforeEach, describe, expect, test, vitest } from "vitest";
2022

2123
class TestForm extends FazFormElement {
2224

25+
public testForm: JSX.Element;
26+
2327
constructor() {
2428
super();
2529
}
30+
31+
get form(): HTMLFormElement|undefined {
32+
return this.testForm as HTMLFormElement;
33+
}
34+
35+
show() {
36+
this.testForm = <form></form>;
37+
render(() => this.testForm, this);
38+
}
2639
}
2740

2841
customElements.define("test-form", TestForm);
2942

43+
beforeEach(() => {
44+
vitest.useFakeTimers();
45+
});
46+
afterEach(() => {
47+
vitest.useRealTimers();
48+
});
3049

3150
describe("Test Forms", () => {
32-
test("Form errors", () => {
51+
test("Form errors", async() => {
3352
document.body.innerHTML = `
3453
<test-form>
54+
<input name="input1" value="1"/>
55+
<input name="input2" value="2"/>
3556
</test-form>
3657
`;
3758
const [formComment] = allComments(document.body);
3859
const form = formComment.fazElement() as FazFormElement;
60+
await vitest.runAllTimersAsync();
3961
expect(form.hasErrors()).toBeFalsy();
4062
form.pushError("field1", "error 1");
4163
form.pushError("field1", "error 1");
@@ -45,10 +67,11 @@ describe("Test Forms", () => {
4567
expect(form.hasErrorsFor("field1")).toBeTruthy();
4668
expect(form.hasErrorsFor("field2")).toBeTruthy();
4769
expect(form.hasErrorsFor("field3")).toBeFalsy();
48-
expect(form.getErrorsFor("field1").length == 2).toBeTruthy();
49-
expect(form.getErrorsFor("field2").length == 1).toBeTruthy();
70+
expect(form.getErrorsFor("field1").length).toBe(2);
71+
expect(form.getErrorsFor("field2").length).toBe(1);
5072
form.clearErrors();
5173
expect(form.hasErrors()).toBeFalsy();
52-
74+
expect(form.form).toStrictEqual((form as TestForm).testForm);
75+
expect(form.values).toStrictEqual({ input1: '1', input2: '2' });
5376
});
5477
});

types/form.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export declare class FazFormElement extends FazElement {
2323
method: Accessor<string>;
2424
setMethod: Setter<string>;
2525
constructor();
26+
get form(): HTMLFormElement | undefined;
27+
get values(): Record<string, FormDataEntryValue>;
2628
clearErrorsFor(key: string): void;
2729
clearErrors(): void;
2830
hasErrorsFor(key: string): boolean;

types/form.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)