@sealcode/sealgen 0.6.1 → 0.7.0

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.
Files changed (78) hide show
  1. package/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json +1 -0
  2. package/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +1 -0
  3. package/.nyc_output/processinfo/1c5dff80-7861-427a-b1bb-d0686211f098.json +1 -0
  4. package/.nyc_output/processinfo/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -0
  6. package/.xunit +3 -0
  7. package/@types/forms/controls/field-group.d.ts +17 -0
  8. package/@types/forms/controls/form-control.d.ts +1 -1
  9. package/@types/forms/controls/form-field-control.d.ts +1 -1
  10. package/@types/forms/controls/simple-input.d.ts +2 -1
  11. package/@types/forms/form.d.ts +19 -6
  12. package/@types/forms/multiform.d.ts +9 -11
  13. package/@types/index.d.ts +1 -0
  14. package/@types/page/mountable-with-fields.d.ts +32 -0
  15. package/@types/page/mountable.d.ts +2 -27
  16. package/@types/page/page.d.ts +2 -2
  17. package/@types/templates/multiform.d.ts +1 -0
  18. package/@types/templates/redirect.d.ts +1 -0
  19. package/@types/utils/input-wrapper.d.ts +4 -0
  20. package/coverage/clover.xml +79 -0
  21. package/lib/add-route.js +27 -8
  22. package/lib/add-route.js.map +1 -1
  23. package/lib/forms/controls/checkboxed-list-input.js +12 -9
  24. package/lib/forms/controls/checkboxed-list-input.js.map +1 -1
  25. package/lib/forms/controls/dropdown.js +14 -12
  26. package/lib/forms/controls/dropdown.js.map +1 -1
  27. package/lib/forms/controls/field-group.js +26 -0
  28. package/lib/forms/controls/field-group.js.map +1 -0
  29. package/lib/forms/controls/form-control.js.map +1 -1
  30. package/lib/forms/controls/form-field-control.js.map +1 -1
  31. package/lib/forms/controls/simple-input.js +6 -8
  32. package/lib/forms/controls/simple-input.js.map +1 -1
  33. package/lib/forms/controls/textarea.js +13 -15
  34. package/lib/forms/controls/textarea.js.map +1 -1
  35. package/lib/forms/form.js +95 -57
  36. package/lib/forms/form.js.map +1 -1
  37. package/lib/forms/multiform.js +52 -62
  38. package/lib/forms/multiform.js.map +1 -1
  39. package/lib/generate-routes.js +7 -3
  40. package/lib/generate-routes.js.map +1 -1
  41. package/lib/index.js +1 -0
  42. package/lib/index.js.map +1 -1
  43. package/lib/page/list.js +1 -1
  44. package/lib/page/list.js.map +1 -1
  45. package/lib/page/mountable-with-fields.js +63 -0
  46. package/lib/page/mountable-with-fields.js.map +1 -0
  47. package/lib/page/mountable.js +2 -49
  48. package/lib/page/mountable.js.map +1 -1
  49. package/lib/page/page.js +2 -2
  50. package/lib/page/page.js.map +1 -1
  51. package/lib/templates/multiform.js +59 -0
  52. package/lib/templates/multiform.js.map +1 -0
  53. package/lib/templates/redirect.js +27 -0
  54. package/lib/templates/redirect.js.map +1 -0
  55. package/lib/tests/manual/multiform.js +14 -5
  56. package/lib/tests/manual/multiform.js.map +1 -1
  57. package/lib/utils/input-wrapper.js +20 -0
  58. package/lib/utils/input-wrapper.js.map +1 -0
  59. package/package.json +4 -3
  60. package/src/add-route.ts +30 -11
  61. package/src/forms/controls/checkboxed-list-input.ts +17 -10
  62. package/src/forms/controls/dropdown.ts +28 -23
  63. package/src/forms/controls/form-control.ts +3 -1
  64. package/src/forms/controls/form-field-control.ts +4 -1
  65. package/src/forms/controls/simple-input.ts +19 -12
  66. package/src/forms/controls/textarea.ts +15 -14
  67. package/src/forms/form.ts +122 -76
  68. package/src/forms/multiform.ts +211 -0
  69. package/src/generate-routes.ts +7 -3
  70. package/src/index.ts +1 -0
  71. package/src/page/list.ts +1 -1
  72. package/src/page/mountable-with-fields.ts +112 -0
  73. package/src/page/mountable.ts +4 -96
  74. package/src/page/page.ts +7 -3
  75. package/src/templates/multiform.ts +58 -0
  76. package/src/templates/redirect.ts +22 -0
  77. package/src/tests/manual/multiform.ts +106 -0
  78. package/src/utils/input-wrapper.ts +18 -0
@@ -0,0 +1 @@
1
+ {"/home/kuba/projects/sealcode/sealgen/src/example.test.ts":{"path":"/home/kuba/projects/sealcode/sealgen/src/example.test.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":3,"column":3}},"1":{"start":{"line":2,"column":4},"end":{"line":2,"column":32}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":23},"end":{"line":1,"column":24}},"loc":{"start":{"line":1,"column":29},"end":{"line":3,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":2,"column":21},"end":{"line":2,"column":22}},"loc":{"start":{"line":2,"column":27},"end":{"line":2,"column":30}},"line":2}},"branchMap":{},"s":{"0":1,"1":1},"f":{"0":1,"1":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f60a8a2f5051bd47a2ce6553c1f7f9e18533ec03","contentHash":"80209287f8d0b7c368c56582afecd56b1dd5756f6894ddc90f7687a0d13a9bd3"}}
@@ -0,0 +1 @@
1
+ {"/home/kuba/projects/sealcode/sealgen/.eslintrc.js":{"path":"/home/kuba/projects/sealcode/sealgen/.eslintrc.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":38,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/@types/cli.d.ts":{"path":"/home/kuba/projects/sealcode/sealgen/@types/cli.d.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/@types/forms/controls/controls.d.ts":{"path":"/home/kuba/projects/sealcode/sealgen/@types/forms/controls/controls.d.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/@types/run.d.ts":{"path":"/home/kuba/projects/sealcode/sealgen/@types/run.d.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/@types/tests/manual/multiform.d.ts":{"path":"/home/kuba/projects/sealcode/sealgen/@types/tests/manual/multiform.d.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/src/example.test.ts":{"path":"/home/kuba/projects/sealcode/sealgen/src/example.test.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":3,"column":3}},"1":{"start":{"line":2,"column":1},"end":{"line":2,"column":28}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":23},"end":{"line":1,"column":24}},"loc":{"start":{"line":1,"column":29},"end":{"line":3,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":2,"column":18},"end":{"line":2,"column":19}},"loc":{"start":{"line":2,"column":24},"end":{"line":2,"column":26}},"line":2}},"branchMap":{},"s":{"0":0,"1":0},"f":{"0":0,"1":0},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/src/forms/controls/controls.ts":{"path":"/home/kuba/projects/sealcode/sealgen/src/forms/controls/controls.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/src/run.ts":{"path":"/home/kuba/projects/sealcode/sealgen/src/run.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"all":true},"/home/kuba/projects/sealcode/sealgen/test.js":{"path":"/home/kuba/projects/sealcode/sealgen/test.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":26}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":42}},"2":{"start":{"line":4,"column":13},"end":{"line":4,"column":34}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":22}},"4":{"start":{"line":7,"column":16},"end":{"line":7,"column":38}},"5":{"start":{"line":9,"column":14},"end":{"line":9,"column":31}},"6":{"start":{"line":11,"column":20},"end":{"line":18,"column":1}},"7":{"start":{"line":20,"column":0},"end":{"line":28,"column":1}},"8":{"start":{"line":21,"column":4},"end":{"line":27,"column":6}},"9":{"start":{"line":30,"column":20},"end":{"line":30,"column":40}},"10":{"start":{"line":32,"column":14},"end":{"line":32,"column":55}},"11":{"start":{"line":34,"column":0},"end":{"line":49,"column":1}},"12":{"start":{"line":35,"column":16},"end":{"line":42,"column":5}},"13":{"start":{"line":43,"column":4},"end":{"line":47,"column":5}},"14":{"start":{"line":44,"column":8},"end":{"line":44,"column":39}},"15":{"start":{"line":46,"column":8},"end":{"line":46,"column":41}},"16":{"start":{"line":48,"column":4},"end":{"line":48,"column":35}},"17":{"start":{"line":51,"column":0},"end":{"line":53,"column":1}},"18":{"start":{"line":52,"column":4},"end":{"line":52,"column":46}},"19":{"start":{"line":55,"column":0},"end":{"line":55,"column":42}},"20":{"start":{"line":57,"column":13},"end":{"line":60,"column":2}},"21":{"start":{"line":62,"column":0},"end":{"line":68,"column":3}},"22":{"start":{"line":63,"column":4},"end":{"line":67,"column":5}},"23":{"start":{"line":64,"column":8},"end":{"line":64,"column":24}},"24":{"start":{"line":66,"column":8},"end":{"line":66,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":62,"column":16},"end":{"line":62,"column":17}},"loc":{"start":{"line":62,"column":32},"end":{"line":68,"column":1}},"line":62}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":0},"end":{"line":28,"column":1}},"type":"if","locations":[{"start":{"line":20,"column":0},"end":{"line":28,"column":1}},{"start":{"line":20,"column":0},"end":{"line":28,"column":1}}],"line":20},"1":{"loc":{"start":{"line":34,"column":0},"end":{"line":49,"column":1}},"type":"if","locations":[{"start":{"line":34,"column":0},"end":{"line":49,"column":1}},{"start":{"line":34,"column":0},"end":{"line":49,"column":1}}],"line":34},"2":{"loc":{"start":{"line":43,"column":4},"end":{"line":47,"column":5}},"type":"if","locations":[{"start":{"line":43,"column":4},"end":{"line":47,"column":5}},{"start":{"line":43,"column":4},"end":{"line":47,"column":5}}],"line":43},"3":{"loc":{"start":{"line":51,"column":0},"end":{"line":53,"column":1}},"type":"if","locations":[{"start":{"line":51,"column":0},"end":{"line":53,"column":1}},{"start":{"line":51,"column":0},"end":{"line":53,"column":1}}],"line":51},"4":{"loc":{"start":{"line":63,"column":4},"end":{"line":67,"column":5}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":67,"column":5}},{"start":{"line":63,"column":4},"end":{"line":67,"column":5}}],"line":63}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0]},"all":true}}
@@ -0,0 +1 @@
1
+ {"parent":null,"pid":78339,"argv":["/usr/bin/node","/home/kuba/projects/sealcode/sealgen/node_modules/.bin/mocha","--recursive","--timeout=10000","--require","source-map-support/register","-r"," ts-node/register","--reporter","xunit","--reporter-option","output=.xunit","src/**/*.test.ts"],"execArgv":[],"cwd":"/home/kuba/projects/sealcode/sealgen","time":1666291707797,"ppid":78328,"coverageFilename":"/home/kuba/projects/sealcode/sealgen/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json","externalId":"","uuid":"1c5dff80-7861-427a-b1bb-d0686211f098","files":["/home/kuba/projects/sealcode/sealgen/src/example.test.ts"]}
@@ -0,0 +1 @@
1
+ {"parent":null,"pid":78328,"argv":["/usr/bin/node","/home/kuba/projects/sealcode/sealgen/node_modules/.bin/nyc","-all","--exclude","lib","--source-map","false","--reporter","clover","./node_modules/.bin/mocha","--recursive","--timeout=10000","--require","source-map-support/register","-r"," ts-node/register","--reporter","xunit","--reporter-option","output=.xunit","src/**/*.test.ts"],"execArgv":[],"cwd":"/home/kuba/projects/sealcode/sealgen","time":1666291706894,"ppid":78321,"coverageFilename":"/home/kuba/projects/sealcode/sealgen/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json","externalId":"","uuid":"a38a0d08-1f1f-4973-b5e2-efc434c1593d","files":["/home/kuba/projects/sealcode/sealgen/.eslintrc.js","/home/kuba/projects/sealcode/sealgen/@types/cli.d.ts","/home/kuba/projects/sealcode/sealgen/@types/forms/controls/controls.d.ts","/home/kuba/projects/sealcode/sealgen/@types/run.d.ts","/home/kuba/projects/sealcode/sealgen/@types/tests/manual/multiform.d.ts","/home/kuba/projects/sealcode/sealgen/src/example.test.ts","/home/kuba/projects/sealcode/sealgen/src/forms/controls/controls.ts","/home/kuba/projects/sealcode/sealgen/src/run.ts","/home/kuba/projects/sealcode/sealgen/test.js"]}
@@ -0,0 +1 @@
1
+ {"processes":{"1c5dff80-7861-427a-b1bb-d0686211f098":{"parent":null,"children":[]},"a38a0d08-1f1f-4973-b5e2-efc434c1593d":{"parent":null,"children":[]}},"files":{"/home/kuba/projects/sealcode/sealgen/src/example.test.ts":["1c5dff80-7861-427a-b1bb-d0686211f098","a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/.eslintrc.js":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/@types/cli.d.ts":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/@types/forms/controls/controls.d.ts":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/@types/run.d.ts":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/@types/tests/manual/multiform.d.ts":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/src/forms/controls/controls.ts":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/src/run.ts":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"],"/home/kuba/projects/sealcode/sealgen/test.js":["a38a0d08-1f1f-4973-b5e2-efc434c1593d"]},"externalIds":{}}
package/.xunit ADDED
@@ -0,0 +1,3 @@
1
+ <testsuite name="Mocha Tests" tests="1" failures="0" errors="0" skipped="0" timestamp="Thu, 20 Oct 2022 18:48:29 GMT" time="0.002">
2
+ <testcase classname="empty test" name="empty test" time="0"/>
3
+ </testsuite>
@@ -0,0 +1,17 @@
1
+ import { Context } from "koa";
2
+ import { FlatTemplatable } from "tempstream";
3
+ import { FormDataValue } from "../form";
4
+ import { FormControl } from "./form-control";
5
+ export declare class FieldGroup extends FormControl {
6
+ controls: FormControl[];
7
+ options: {
8
+ label?: string;
9
+ classes?: string;
10
+ };
11
+ constructor(controls: FormControl[], options?: {
12
+ label?: string;
13
+ classes?: string;
14
+ });
15
+ render(ctx: Context, data: Record<string, FormDataValue>): Promise<FlatTemplatable>;
16
+ role: "decoration";
17
+ }
@@ -2,6 +2,6 @@ import { Context } from "koa";
2
2
  import { FlatTemplatable } from "tempstream";
3
3
  import { FormDataValue, FormMessage } from "../form";
4
4
  export declare abstract class FormControl {
5
- abstract render(ctx: Context, data: Record<string, FormDataValue>, messages: FormMessage[]): FlatTemplatable | Promise<FlatTemplatable>;
5
+ abstract render(ctx: Context, data: Record<string, FormDataValue>, messages: FormMessage[], field_name_prefix: string, form_id: string): FlatTemplatable | Promise<FlatTemplatable>;
6
6
  abstract role: "input" | "decoration" | "messages" | "submit";
7
7
  }
@@ -10,5 +10,5 @@ export declare abstract class FormFieldControl extends FormControl {
10
10
  fields: FormField[];
11
11
  role: "input";
12
12
  constructor(fields: FormField[]);
13
- abstract render(ctx: Context, data: Record<string, FormDataValue>): FlatTemplatable | Promise<FlatTemplatable>;
13
+ abstract render(ctx: Context, data: Record<string, FormDataValue>, messages: [], field_name_prefix: string, form_id: string): FlatTemplatable | Promise<FlatTemplatable>;
14
14
  }
@@ -1,4 +1,5 @@
1
1
  import { Context } from "koa";
2
+ import { FlatTemplatable } from "tempstream";
2
3
  import { FormField } from "../fields/field";
3
4
  import { FormDataValue } from "../form";
4
5
  import { FormFieldControl } from "./controls";
@@ -26,5 +27,5 @@ export declare class SimpleInput extends FormFieldControl {
26
27
  readonly?: boolean;
27
28
  step?: number;
28
29
  });
29
- render<Fields extends Record<string, FormField>>(ctx: Context, data: Record<string, FormDataValue>): Promise<string>;
30
+ render<Fields extends Record<string, FormField>>(ctx: Context, data: Record<string, FormDataValue>, _: unknown[], field_prefix: string, form_id: string): Promise<FlatTemplatable>;
30
31
  }
@@ -3,7 +3,7 @@ import { Context } from "koa";
3
3
  import Router from "@koa/router";
4
4
  import { FlatTemplatable } from "tempstream";
5
5
  import { FormField } from "./fields/field";
6
- import { Fields, Mountable, PageErrorMessage } from "../page/mountable";
6
+ import { Fields, MountableWithFields, PageErrorMessage } from "../page/mountable-with-fields";
7
7
  export declare type FormDataPrimitive = string | string[] | undefined;
8
8
  export declare type FormDataValue = FormDataPrimitive | Record<string, FormDataPrimitive>;
9
9
  export declare type FieldValueType<F extends FormField> = F extends FormField<infer R> ? R : never;
@@ -18,20 +18,33 @@ export declare type FormData<Fieldnames extends string = string> = {
18
18
  raw_values: Record<Fieldnames, FormDataValue>;
19
19
  messages: FormMessage[];
20
20
  };
21
- export declare abstract class Form<F extends Fields> extends Mountable<F> {
21
+ export declare type FormReaction = {
22
+ action: "stay";
23
+ content: FlatTemplatable;
24
+ messages?: FormMessage[];
25
+ } | {
26
+ action: "redirect";
27
+ url: string;
28
+ messages?: FormMessage[];
29
+ };
30
+ export declare abstract class Form<F extends Fields> extends MountableWithFields<F> {
22
31
  defaultSuccessMessage: string;
23
32
  submitButtonText: string;
33
+ action: string;
24
34
  canAccess(_: Context): Promise<{
25
35
  canAccess: boolean;
26
36
  message: string;
27
37
  }>;
28
38
  renderError(_: Context, error: PageErrorMessage): Promise<FlatTemplatable>;
39
+ makeSubmitButton(): FlatTemplatable;
29
40
  render(ctx: Context, data: FormData): Promise<FlatTemplatable>;
30
- makeFormTag(): FlatTemplatable;
31
- onValuesInvalid(ctx: Context, form_messages: FormMessage[]): Promise<void>;
32
- onError(ctx: Context, data: FormData, error: unknown): Promise<void>;
41
+ makeOpenFormTag(): FlatTemplatable;
42
+ makeCloseFormTag(): FlatTemplatable;
43
+ onValuesInvalid(ctx: Context, form_messages: FormMessage[]): Promise<FormReaction>;
44
+ onError(ctx: Context, data: FormData, error: unknown): Promise<FormReaction>;
33
45
  abstract onSubmit(ctx: Context, data: FormData): void | Promise<void>;
34
- onSuccess(ctx: Context, data: FormData): Promise<void>;
46
+ onSuccess(ctx: Context, data: FormData): Promise<FormReaction>;
47
+ handlePost(ctx: Context): Promise<FormReaction>;
35
48
  mount(router: Router, path: string): void;
36
49
  extractRawValues(ctx: Context): Record<string, FormDataValue>;
37
50
  }
@@ -2,24 +2,22 @@
2
2
  import Router from "@koa/router";
3
3
  import { Context } from "koa";
4
4
  import { FlatTemplatable } from "tempstream";
5
- import { Form, FormData, FormDataValue, FormMessage, Mountable } from "..";
6
- import { Fields } from "../page/mountable";
7
- export default class Multiform extends Mountable {
5
+ import { Form, FormDataValue, FormMessage } from "..";
6
+ import { Fields, MountableWithFields } from "../page/mountable-with-fields";
7
+ export declare class Multiform extends MountableWithFields {
8
+ controls: never[];
8
9
  name: string;
9
10
  forms: Record<string, Form<Fields>>;
10
- wrapper: (content: FlatTemplatable) => FlatTemplatable;
11
- controls: never[];
12
- constructor(name: string, forms: Record<string, Form<Fields>>, wrapper?: (content: FlatTemplatable) => FlatTemplatable);
13
11
  init(): void;
14
12
  extractRawValues(ctx: Context): Record<string, FormDataValue>;
15
- canAccess(_: Context): Promise<{
13
+ canAccess(): Promise<{
16
14
  canAccess: boolean;
17
15
  message: string;
18
16
  }>;
19
- getSubFormsToRender(ctx: Context): Array<readonly [string, Form<any>]>;
20
- renderSubForm(ctx: Context, sub_form_name: string): Promise<FlatTemplatable>;
17
+ getSubformsToRender(ctx: Context): Array<readonly [string, Form<any>]>;
18
+ renderSubform(ctx: Context, sub_form_name: string): Promise<FlatTemplatable>;
21
19
  getSubformRawValues(ctx: Context, sub_form_name: string): Record<string, FormDataValue>;
22
- renderSubForms(ctx: Context, messages: FormMessage[], prerenderedForms?: Record<string, FlatTemplatable | undefined>): Promise<FlatTemplatable>;
23
- render(ctx: Context, data: FormData<any>): Promise<FlatTemplatable>;
20
+ render(ctx: Context, messages: FormMessage[], prerenderedForms?: Record<string, FlatTemplatable | undefined>): Promise<FlatTemplatable>;
21
+ makeBottomScript(): string;
24
22
  mount(router: Router, path: string): void;
25
23
  }
package/@types/index.d.ts CHANGED
@@ -17,3 +17,4 @@ export * from "./utils/utils";
17
17
  export * from "./page/list";
18
18
  export * from "./utils/translate";
19
19
  export * as sanitize from "./sanitize";
20
+ export * from "./forms/multiform";
@@ -0,0 +1,32 @@
1
+ import { Context } from "koa";
2
+ import { FlatTemplatable } from "tempstream";
3
+ import { FormControl } from "../forms/controls/form-control";
4
+ import { FormField } from "../forms/fields/field";
5
+ import { FormData, FormDataValue, FormMessage } from "../forms/form";
6
+ import { Mountable } from "./mountable";
7
+ export declare type PageErrorMessage = {
8
+ type: "access" | "internal";
9
+ message: string;
10
+ };
11
+ export declare type Fields = Record<string, FormField<unknown>>;
12
+ export declare abstract class MountableWithFields<F extends Fields = Fields> extends Mountable {
13
+ fields: F;
14
+ field_names_prefix: string;
15
+ form_id: string;
16
+ abstract controls: FormControl[];
17
+ constructor();
18
+ init(): void;
19
+ validateValues(ctx: Context, data: Record<string, FormDataValue>): Promise<{
20
+ valid: boolean;
21
+ error: string;
22
+ }>;
23
+ validate(ctx: Context, values: Record<string, FormDataValue>): Promise<{
24
+ valid: boolean;
25
+ field_errors: Partial<Record<keyof Fields, string>>;
26
+ form_messages: FormMessage[];
27
+ }>;
28
+ renderControls(ctx: Context, data: FormData<keyof Fields>): FlatTemplatable;
29
+ renderError(_: Context, error: PageErrorMessage): Promise<FlatTemplatable>;
30
+ renderMessages(_: Context, data: FormData<keyof Fields>): FlatTemplatable;
31
+ abstract extractRawValues(ctx: Context): Record<string, FormDataValue>;
32
+ }
@@ -1,36 +1,11 @@
1
1
  /// <reference types="koa__router" />
2
2
  import Router from "@koa/router";
3
- import { FormControl } from "../forms/controls/form-control";
4
3
  import { Context } from "koa";
5
- import { FlatTemplatable } from "tempstream";
6
- import { FormField } from "../forms/fields/field";
7
- import { FormData, FormDataValue, FormMessage } from "../forms/form";
8
- export declare type PageErrorMessage = {
9
- type: "access" | "internal";
10
- message: string;
11
- };
12
- export declare type Fields = Record<string, FormField<unknown>>;
13
- export declare abstract class Mountable<F extends Fields = Fields> {
14
- fields: F;
15
- constructor();
16
- abstract controls: FormControl[];
4
+ export declare abstract class Mountable {
5
+ init(): void;
17
6
  abstract mount(router: Router, path: string): void;
18
7
  abstract canAccess(ctx: Context): Promise<{
19
8
  canAccess: boolean;
20
9
  message: string;
21
10
  }>;
22
- abstract renderError(ctx: Context, error: PageErrorMessage): Promise<FlatTemplatable>;
23
- abstract extractRawValues(ctx: Context): Record<string, FormDataValue>;
24
- validateValues(ctx: Context, data: Record<string, FormDataValue>): Promise<{
25
- valid: boolean;
26
- error: string;
27
- }>;
28
- protected validate(ctx: Context, values: Record<string, FormDataValue>): Promise<{
29
- valid: boolean;
30
- field_errors: Partial<Record<keyof Fields, string>>;
31
- form_messages: FormMessage[];
32
- }>;
33
- init(): void;
34
- renderControls(ctx: Context, data: FormData<keyof Fields>): FlatTemplatable;
35
- renderMessages(_: Context, data: FormData<keyof Fields>): FlatTemplatable;
36
11
  }
@@ -3,9 +3,9 @@ import Router from "@koa/router";
3
3
  import { Context } from "koa";
4
4
  import { FlatTemplatable } from "tempstream";
5
5
  import { FormDataValue } from "../forms/form";
6
- import { Fields, Mountable, PageErrorMessage } from "./mountable";
6
+ import { Fields, MountableWithFields, PageErrorMessage } from "./mountable-with-fields";
7
7
  import { PagePropsParser } from "./props-parser";
8
- export declare abstract class Page<F extends Fields = Record<string, never>> extends Mountable<F> {
8
+ export declare abstract class Page<F extends Fields = Record<string, never>> extends MountableWithFields<F> {
9
9
  propsParser: PagePropsParser<Record<keyof Fields, unknown>>;
10
10
  controls: never[];
11
11
  mount(router: Router, path: string): void;
@@ -0,0 +1 @@
1
+ export declare function multiformTemplate(action_name: string, newfilefullpath: string): Promise<string>;
@@ -0,0 +1 @@
1
+ export declare function redirectTemplate(action_name: string): Promise<string>;
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from "stream";
3
+ export declare function getRequiredClass(isRequired: boolean): string;
4
+ export declare function inputWrapper(modifiers: string[], input: string): Readable;
@@ -0,0 +1,79 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <coverage generated="1666291709806" clover="3.2.0">
3
+ <project timestamp="1666291709807" name="All files">
4
+ <metrics statements="28" coveredstatements="2" conditionals="10" coveredconditionals="0" methods="3" coveredmethods="2" elements="41" coveredelements="4" complexity="0" loc="28" ncloc="28" packages="6" files="9" classes="9"/>
5
+ <package name="sealgen">
6
+ <metrics statements="26" coveredstatements="0" conditionals="10" coveredconditionals="0" methods="1" coveredmethods="0"/>
7
+ <file name=".eslintrc.js" path="/home/kuba/projects/sealcode/sealgen/.eslintrc.js">
8
+ <metrics statements="1" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
9
+ <line num="1" count="0" type="stmt"/>
10
+ </file>
11
+ <file name="test.js" path="/home/kuba/projects/sealcode/sealgen/test.js">
12
+ <metrics statements="25" coveredstatements="0" conditionals="10" coveredconditionals="0" methods="1" coveredmethods="0"/>
13
+ <line num="1" count="0" type="stmt"/>
14
+ <line num="2" count="0" type="stmt"/>
15
+ <line num="4" count="0" type="stmt"/>
16
+ <line num="5" count="0" type="stmt"/>
17
+ <line num="7" count="0" type="stmt"/>
18
+ <line num="9" count="0" type="stmt"/>
19
+ <line num="11" count="0" type="stmt"/>
20
+ <line num="20" count="0" type="cond" truecount="0" falsecount="2"/>
21
+ <line num="21" count="0" type="stmt"/>
22
+ <line num="30" count="0" type="stmt"/>
23
+ <line num="32" count="0" type="stmt"/>
24
+ <line num="34" count="0" type="cond" truecount="0" falsecount="2"/>
25
+ <line num="35" count="0" type="stmt"/>
26
+ <line num="43" count="0" type="cond" truecount="0" falsecount="2"/>
27
+ <line num="44" count="0" type="stmt"/>
28
+ <line num="46" count="0" type="stmt"/>
29
+ <line num="48" count="0" type="stmt"/>
30
+ <line num="51" count="0" type="cond" truecount="0" falsecount="2"/>
31
+ <line num="52" count="0" type="stmt"/>
32
+ <line num="55" count="0" type="stmt"/>
33
+ <line num="57" count="0" type="stmt"/>
34
+ <line num="62" count="0" type="stmt"/>
35
+ <line num="63" count="0" type="cond" truecount="0" falsecount="2"/>
36
+ <line num="64" count="0" type="stmt"/>
37
+ <line num="66" count="0" type="stmt"/>
38
+ </file>
39
+ </package>
40
+ <package name="sealgen.@types">
41
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
42
+ <file name="cli.d.ts" path="/home/kuba/projects/sealcode/sealgen/@types/cli.d.ts">
43
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
44
+ </file>
45
+ <file name="run.d.ts" path="/home/kuba/projects/sealcode/sealgen/@types/run.d.ts">
46
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
47
+ </file>
48
+ </package>
49
+ <package name="sealgen.@types.forms.controls">
50
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
51
+ <file name="controls.d.ts" path="/home/kuba/projects/sealcode/sealgen/@types/forms/controls/controls.d.ts">
52
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
53
+ </file>
54
+ </package>
55
+ <package name="sealgen.@types.tests.manual">
56
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
57
+ <file name="multiform.d.ts" path="/home/kuba/projects/sealcode/sealgen/@types/tests/manual/multiform.d.ts">
58
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
59
+ </file>
60
+ </package>
61
+ <package name="sealgen.src">
62
+ <metrics statements="2" coveredstatements="2" conditionals="0" coveredconditionals="0" methods="2" coveredmethods="2"/>
63
+ <file name="example.test.ts" path="/home/kuba/projects/sealcode/sealgen/src/example.test.ts">
64
+ <metrics statements="2" coveredstatements="2" conditionals="0" coveredconditionals="0" methods="2" coveredmethods="2"/>
65
+ <line num="1" count="1" type="stmt"/>
66
+ <line num="2" count="1" type="stmt"/>
67
+ </file>
68
+ <file name="run.ts" path="/home/kuba/projects/sealcode/sealgen/src/run.ts">
69
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
70
+ </file>
71
+ </package>
72
+ <package name="sealgen.src.forms.controls">
73
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
74
+ <file name="controls.ts" path="/home/kuba/projects/sealcode/sealgen/src/forms/controls/controls.ts">
75
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
76
+ </file>
77
+ </package>
78
+ </project>
79
+ </coverage>
package/lib/add-route.js CHANGED
@@ -4,29 +4,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.addRoute = void 0;
7
- const path_1 = require("path");
8
7
  const fs_1 = require("fs");
9
- const question_1 = require("./utils/question");
10
- const page_1 = require("./templates/page");
11
- const form_1 = require("./templates/form");
12
- const route_test_1 = require("./templates/route-test");
13
- const escape_url_params_1 = require("./utils/escape-url-params");
14
8
  const locreq_1 = __importDefault(require("locreq"));
9
+ const path_1 = require("path");
15
10
  const generate_routes_1 = require("./generate-routes");
11
+ const form_1 = require("./templates/form");
16
12
  const list_1 = require("./templates/list");
13
+ const multiform_1 = require("./templates/multiform");
14
+ const page_1 = require("./templates/page");
15
+ const redirect_1 = require("./templates/redirect");
16
+ const route_test_1 = require("./templates/route-test");
17
+ const escape_url_params_1 = require("./utils/escape-url-params");
18
+ const question_1 = require("./utils/question");
19
+ const prompts = require("prompts");
17
20
  const target_locreq = locreq_1.default(process.cwd());
18
21
  async function addRoute() {
19
22
  const action = await question_1.question('What\'s the name of the action (e.g. "AddUser"): ', (s) => s.length > 3);
20
23
  const url = await question_1.question("Enter a full absolute path for the new route (e.g. /admin/users/add): ", (s) => s.trim()[0] == "/");
21
- const mode_answer = (await question_1.question("Is this a page (p), a form (f), or a list (l)? ", (a) => ["p", "f", "l"].includes(a.toLowerCase())));
22
- const mode = { p: "page", f: "form", l: "list" }[mode_answer];
24
+ const response = await prompts({
25
+ type: "select",
26
+ name: "mode",
27
+ message: "What kind of route is it?",
28
+ choices: [
29
+ { title: "page", value: "page" },
30
+ { title: "form", value: "form" },
31
+ { title: "list", value: "list" },
32
+ { title: "multiform", value: "multiform" },
33
+ { title: "redirect", value: "redirect" },
34
+ ],
35
+ });
36
+ const mode = response.mode;
23
37
  const file_path = target_locreq.resolve(`src/back/routes/${escape_url_params_1.escape_url_params(url)}.${mode}.ts`);
24
38
  const test_file_path = target_locreq.resolve(`src/back/routes/${escape_url_params_1.escape_url_params(url)}.test.ts`);
25
39
  const template = {
26
40
  page: page_1.pageTemplate,
27
41
  form: form_1.formTemplate,
28
42
  list: list_1.listTemplate,
43
+ multiform: multiform_1.multiformTemplate,
44
+ redirect: redirect_1.redirectTemplate,
29
45
  }[mode];
46
+ if (!template) {
47
+ throw new Error(`Could not get template ${mode}`);
48
+ }
30
49
  if (fs_1.existsSync(file_path)) {
31
50
  // eslint-disable-next-line no-console
32
51
  console.error(`ERROR: File ${file_path} already exists.`);
@@ -1 +1 @@
1
- {"version":3,"file":"add-route.js","sourceRoot":"","sources":["../src/add-route.ts"],"names":[],"mappings":";;;;;;AAAA,+BAA+B;AAC/B,2BAAgD;AAChD,+CAA4C;AAC5C,2CAAgD;AAChD,2CAAgD;AAChD,uDAAsD;AACtD,iEAA8D;AAE9D,oDAA6B;AAC7B,uDAAmD;AACnD,2CAAgD;AAChD,MAAM,aAAa,GAAG,gBAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAEtC,KAAK,UAAU,QAAQ;IAC7B,MAAM,MAAM,GAAG,MAAM,mBAAQ,CAC5B,mDAAmD,EACnD,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAC3B,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,mBAAQ,CACzB,wEAAwE,EACxE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CACjC,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,MAAM,mBAAQ,CAClC,iDAAiD,EACjD,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CACxD,CAAoB,CAAC;IACtB,MAAM,IAAI,GAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAG,CAAC,WAAW,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CACtC,mBAAmB,qCAAiB,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,CACtD,CAAC;IACF,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAC3C,mBAAmB,qCAAiB,CAAC,GAAG,CAAC,UAAU,CACnD,CAAC;IACF,MAAM,QAAQ,GAAG;QAChB,IAAI,EAAE,mBAAY;QAClB,IAAI,EAAE,mBAAY;QAClB,IAAI,EAAE,mBAAY;KAClB,CAAC,IAAI,CAAC,CAAC;IAER,IAAI,eAAU,CAAC,SAAS,CAAC,EAAE;QAC1B,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,eAAe,SAAS,kBAAkB,CAAC,CAAC;QAC1D,OAAO;KACP;IACD,MAAM,aAAE,CAAC,KAAK,CAAC,cAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,aAAE,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACjE,MAAM,aAAE,CAAC,SAAS,CAAC,cAAc,EAAE,yBAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;IACpC,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,UAAU,CAAC,CAAC;IACzC,MAAM,gCAAc,EAAE,CAAC;AACxB,CAAC;AAxCD,4BAwCC"}
1
+ {"version":3,"file":"add-route.js","sourceRoot":"","sources":["../src/add-route.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAgD;AAChD,oDAA6B;AAC7B,+BAA+B;AAC/B,uDAAmD;AACnD,2CAAgD;AAChD,2CAAgD;AAChD,qDAA0D;AAC1D,2CAAgD;AAChD,mDAAwD;AACxD,uDAAsD;AACtD,iEAA8D;AAC9D,+CAA4C;AAC5C,mCAAoC;AAEpC,MAAM,aAAa,GAAG,gBAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAEtC,KAAK,UAAU,QAAQ;IAC7B,MAAM,MAAM,GAAG,MAAM,mBAAQ,CAC5B,mDAAmD,EACnD,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAC3B,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,mBAAQ,CACzB,wEAAwE,EACxE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CACjC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC9B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE;YACR,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAChC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAChC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAChC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;YAC1C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;SACxC;KACD,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAc,CAAC;IAErC,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CACtC,mBAAmB,qCAAiB,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,CACtD,CAAC;IACF,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAC3C,mBAAmB,qCAAiB,CAAC,GAAG,CAAC,UAAU,CACnD,CAAC;IACF,MAAM,QAAQ,GAAG;QAChB,IAAI,EAAE,mBAAY;QAClB,IAAI,EAAE,mBAAY;QAClB,IAAI,EAAE,mBAAY;QAClB,SAAS,EAAE,6BAAiB;QAC5B,QAAQ,EAAE,2BAAgB;KAC1B,CAAC,IAAI,CAAC,CAAC;IAER,IAAI,CAAC,QAAQ,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;KAClD;IAED,IAAI,eAAU,CAAC,SAAS,CAAC,EAAE;QAC1B,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,eAAe,SAAS,kBAAkB,CAAC,CAAC;QAC1D,OAAO;KACP;IACD,MAAM,aAAE,CAAC,KAAK,CAAC,cAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,aAAE,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACjE,MAAM,aAAE,CAAC,SAAS,CAAC,cAAc,EAAE,yBAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;IACpC,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,UAAU,CAAC,CAAC;IACzC,MAAM,gCAAc,EAAE,CAAC;AACxB,CAAC;AAxDD,4BAwDC"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CheckboxedListInput = void 0;
4
4
  const ts_predicates_1 = require("@sealcode/ts-predicates");
5
5
  const tempstream_1 = require("tempstream");
6
+ const input_wrapper_1 = require("../../utils/input-wrapper");
6
7
  const controls_1 = require("./controls");
7
8
  class CheckboxedListInput extends controls_1.FormFieldControl {
8
9
  constructor(field, options = { label: field.name }) {
@@ -19,16 +20,18 @@ class CheckboxedListInput extends controls_1.FormFieldControl {
19
20
  this.field.generateOptions(ctx),
20
21
  this.field.isVisible(ctx),
21
22
  ]);
23
+ const { name, required } = this.field;
22
24
  return tempstream_1.tempstream /* HTML */ `${isVisible
23
- ? Object.entries(options).map(([value, text]) => /* HTML */ `<div>
24
- <input
25
- type="checkbox"
26
- id="${this.field.name}.${value}"
27
- name="${this.field.name}.${value}"
28
- ${pickedValues.includes(value) ? "checked" : ""}
29
- />
30
- <label for="${this.field.name}.${value}">${text}</label>
31
- </div>`)
25
+ ? Object.entries(options).map(([value, text]) => input_wrapper_1.inputWrapper([name, input_wrapper_1.getRequiredClass(required)],
26
+ /* HTML */ `
27
+ <input
28
+ type="checkbox"
29
+ id="${name}.${value}"
30
+ name="${name}.${value}"
31
+ ${pickedValues.includes(value) ? "checked" : ""}
32
+ />
33
+ <label for="${name}.${value}">${text}</label>
34
+ `))
32
35
  : ""}`;
33
36
  }
34
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checkboxed-list-input.js","sourceRoot":"","sources":["../../../src/forms/controls/checkboxed-list-input.ts"],"names":[],"mappings":";;;AAAA,2DAAyD;AAEzD,2CAAwC;AAGxC,yCAA8C;AAE9C,MAAa,mBAAoB,SAAQ,2BAAgB;IACxD,YACQ,KAAyB,EACzB,UAA6B,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;QAEzD,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAHR,UAAK,GAAL,KAAK,CAAoB;QACzB,YAAO,GAAP,OAAO,CAA2C;IAG1D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAY,EAAE,IAAmC;QAC7D,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,kBAAE,CAAC,YAAY,EAAE,0BAAU,CAAC,KAAK,CAAC,0BAAU,CAAC,MAAM,CAAC,CAAC,EAAE;YAC3D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;SAC5D;QACD,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;SACzB,CAAC,CAAC;QACH,OAAO,uBAAU,CAAA,UAAU,CAAC,GAAG,SAAS;YACvC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAC3B,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;;;aAGtB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK;eACtB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK;SAC9B,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;oBAElC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,IAAI;YACzC,CACN;YACH,CAAC,CAAC,EAAE,EAAE,CAAC;IACT,CAAC;CACD;AA/BD,kDA+BC"}
1
+ {"version":3,"file":"checkboxed-list-input.js","sourceRoot":"","sources":["../../../src/forms/controls/checkboxed-list-input.ts"],"names":[],"mappings":";;;AAAA,2DAAyD;AAEzD,2CAAwC;AACxC,6DAA2E;AAG3E,yCAA8C;AAE9C,MAAa,mBAAoB,SAAQ,2BAAgB;IACxD,YACQ,KAAyB,EACzB,UAA6B,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;QAEzD,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAHR,UAAK,GAAL,KAAK,CAAoB;QACzB,YAAO,GAAP,OAAO,CAA2C;IAG1D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAY,EAAE,IAAmC;QAC7D,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,kBAAE,CAAC,YAAY,EAAE,0BAAU,CAAC,KAAK,CAAC,0BAAU,CAAC,MAAM,CAAC,CAAC,EAAE;YAC3D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;SAC5D;QACD,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;SACzB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAEtC,OAAO,uBAAU,CAAA,UAAU,CAAC,GAAG,SAAS;YACvC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAC9C,4BAAY,CACX,CAAC,IAAI,EAAE,gCAAgB,CAAC,QAAQ,CAAC,CAAC;YAClC,UAAU,CAAC;;;cAGH,IAAI,IAAI,KAAK;gBACX,IAAI,IAAI,KAAK;UACnB,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;qBAElC,IAAI,IAAI,KAAK,KAAK,IAAI;OACpC,CACD,CACA;YACH,CAAC,CAAC,EAAE,EAAE,CAAC;IACT,CAAC;CACD;AArCD,kDAqCC"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Dropdown = void 0;
4
- const tempstream_1 = require("tempstream");
5
4
  const sanitize_1 = require("../../sanitize");
5
+ const input_wrapper_1 = require("../../utils/input-wrapper");
6
6
  const controls_1 = require("./controls");
7
7
  class Dropdown extends controls_1.FormFieldControl {
8
8
  constructor(field, options = {
@@ -16,21 +16,23 @@ class Dropdown extends controls_1.FormFieldControl {
16
16
  }
17
17
  async render(ctx, data) {
18
18
  const { parsed: picked_value } = await this.field.getValue(ctx, data);
19
- const id = this.field.name;
20
- return tempstream_1.tempstream /* HTML */ `<label for="${id}"
21
- >${this.options.label}</label
22
- ><select
23
- name="${this.field.name}"
24
- id="${id}"
25
- ${this.options.autosubmit
19
+ const name = this.field.name;
20
+ return input_wrapper_1.inputWrapper([name, input_wrapper_1.getRequiredClass(this.field.required)],
21
+ /* HTML */ `<label for="${name}">${this.options.label}</label
22
+ ><select
23
+ name="${this.field.name}"
24
+ id="${name}"
25
+ ${this.options.autosubmit
26
26
  ? `onchange='this.form.submit()'`
27
27
  : ""}
28
- ${!this.options.autocomplete ? `autocomplete="off"` : ""}
29
- >
30
- ${Promise.resolve(this.field.generateOptions(ctx)).then((options) => Object.entries(options).map(([value, text]) => `<option value="${sanitize_1.attribute(value)}" ${(value || "") == picked_value
28
+ ${!this.options.autocomplete ? `autocomplete="off"` : ""}
29
+ >
30
+ ${
31
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
32
+ Promise.resolve(this.field.generateOptions(ctx)).then((options) => Object.entries(options).map(([value, text]) => `<option value="${sanitize_1.attribute(value)}" ${(value || "") == picked_value
31
33
  ? "selected"
32
34
  : ""}>${text}</option>`))}
33
- </select>`;
35
+ </select>`);
34
36
  }
35
37
  }
36
38
  exports.Dropdown = Dropdown;
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.js","sourceRoot":"","sources":["../../../src/forms/controls/dropdown.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AACxC,6CAA2C;AAG3C,yCAA8C;AAE9C,MAAa,QAAS,SAAQ,2BAAgB;IAC7C,YACQ,KAAwB,EACxB,UAIH;QACH,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,IAAI;KAClB;QAED,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAXR,UAAK,GAAL,KAAK,CAAmB;QACxB,YAAO,GAAP,OAAO,CAQb;IAGF,CAAC;IAED,KAAK,CAAC,MAAM,CACX,GAAY,EACZ,IAAmC;QAEnC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3B,OAAO,uBAAU,CAAA,UAAU,CAAC,eAAe,EAAE;OACxC,IAAI,CAAC,OAAO,CAAC,KAAK;;YAEb,IAAI,CAAC,KAAK,CAAC,IAAI;UACjB,EAAE;MACN,IAAI,CAAC,OAAO,CAAC,UAAU;YACxB,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,EAAE;MACH,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE;;MAEtD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CACtD,CAAC,OAAO,EAAE,EAAE,CACX,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAC1B,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CACjB,kBAAkB,oBAAS,CAAC,KAAK,CAAC,KACjC,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,YAAY;YAC5B,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,EACJ,IAAI,IAAI,WAAW,CACpB,CACF;aACQ,CAAC;IACb,CAAC;CACD;AA7CD,4BA6CC"}
1
+ {"version":3,"file":"dropdown.js","sourceRoot":"","sources":["../../../src/forms/controls/dropdown.ts"],"names":[],"mappings":";;;AACA,6CAA2C;AAC3C,6DAA2E;AAG3E,yCAA8C;AAE9C,MAAa,QAAS,SAAQ,2BAAgB;IAC7C,YACQ,KAAwB,EACxB,UAIH;QACH,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,IAAI;KAClB;QAED,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAXR,UAAK,GAAL,KAAK,CAAmB;QACxB,YAAO,GAAP,OAAO,CAQb;IAGF,CAAC;IAED,KAAK,CAAC,MAAM,CACX,GAAY,EACZ,IAAmC;QAEnC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7B,OAAO,4BAAY,CAClB,CAAC,IAAI,EAAE,gCAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,UAAU,CAAC,eAAe,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;;aAE3C,IAAI,CAAC,KAAK,CAAC,IAAI;WACjB,IAAI;OACR,IAAI,CAAC,OAAO,CAAC,UAAU;YACxB,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,EAAE;OACH,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE;;OAEtD;QACD,4EAA4E;QAC5E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CACpD,CAAC,OAAO,EAAE,EAAE,CACX,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAC1B,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CACjB,kBAAkB,oBAAS,CAAC,KAAK,CAAC,KACjC,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,YAAY;YAC5B,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,EACJ,IAAI,IAAI,WAAW,CACpB,CAEJ;cACS,CACX,CAAC;IACH,CAAC;CACD;AAlDD,4BAkDC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FieldGroup = void 0;
4
+ const tempstream_1 = require("tempstream");
5
+ const form_control_1 = require("./form-control");
6
+ class FieldGroup extends form_control_1.FormControl {
7
+ constructor(controls, options = {}) {
8
+ super();
9
+ this.controls = controls;
10
+ this.options = options;
11
+ this.role = "decoration";
12
+ }
13
+ async render(ctx, data) {
14
+ const { label, classes } = this.options;
15
+ return tempstream_1.tempstream /* HTML */ `
16
+ <div class="field-group ${classes || ""}">
17
+ ${label ? `<label>${label}</label>` : ""}
18
+ <div class="field-group__fields">
19
+ ${this.controls.map((control) => control.render(ctx, data, []))}
20
+ </div>
21
+ </div>
22
+ `;
23
+ }
24
+ }
25
+ exports.FieldGroup = FieldGroup;
26
+ //# sourceMappingURL=field-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-group.js","sourceRoot":"","sources":["../../../src/forms/controls/field-group.ts"],"names":[],"mappings":";;;AACA,2CAAyD;AAEzD,iDAA6C;AAE7C,MAAa,UAAW,SAAQ,0BAAW;IAC1C,YACQ,QAAuB,EACvB,UAAgD,EAAE;QAEzD,KAAK,EAAE,CAAC;QAHD,aAAQ,GAAR,QAAQ,CAAe;QACvB,YAAO,GAAP,OAAO,CAA2C;QAsB1D,SAAI,GAAU,YAAY,CAAC;IAnB3B,CAAC;IAED,KAAK,CAAC,MAAM,CACX,GAAY,EACZ,IAAmC;QAEnC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAExC,OAAO,uBAAU,CAAA,UAAU,CAAC;6BACD,OAAO,IAAI,EAAE;MACpC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE;;OAErC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC/B,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAC7B;;;GAGH,CAAC;IACH,CAAC;CAED;AA1BD,gCA0BC"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-control.js","sourceRoot":"","sources":["../../../src/forms/controls/form-control.ts"],"names":[],"mappings":";;;AAIA,MAAsB,WAAW;CAOhC;AAPD,kCAOC"}
1
+ {"version":3,"file":"form-control.js","sourceRoot":"","sources":["../../../src/forms/controls/form-control.ts"],"names":[],"mappings":";;;AAIA,MAAsB,WAAW;CAShC;AATD,kCASC"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-field-control.js","sourceRoot":"","sources":["../../../src/forms/controls/form-field-control.ts"],"names":[],"mappings":";;;AAIA,iDAA6C;AAQ7C,MAAsB,gBAAiB,SAAQ,0BAAW;IAEzD,YAAmB,MAAmB;QACrC,KAAK,EAAE,CAAC;QADU,WAAM,GAAN,MAAM,CAAa;QADtC,SAAI,GAAU,OAAO,CAAC;IAGtB,CAAC;CAMD;AAVD,4CAUC"}
1
+ {"version":3,"file":"form-field-control.js","sourceRoot":"","sources":["../../../src/forms/controls/form-field-control.ts"],"names":[],"mappings":";;;AAIA,iDAA6C;AAQ7C,MAAsB,gBAAiB,SAAQ,0BAAW;IAEzD,YAAmB,MAAmB;QACrC,KAAK,EAAE,CAAC;QADU,WAAM,GAAN,MAAM,CAAa;QADtC,SAAI,GAAU,OAAO,CAAC;IAGtB,CAAC;CASD;AAbD,4CAaC"}