@sealcode/sealgen 0.6.1 → 0.7.1

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 (91) 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/components/components.d.ts +1 -0
  8. package/@types/components/tabs.d.ts +2 -0
  9. package/@types/forms/controls/controls.d.ts +1 -0
  10. package/@types/forms/controls/field-group.d.ts +17 -0
  11. package/@types/forms/controls/form-control.d.ts +1 -1
  12. package/@types/forms/controls/form-field-control.d.ts +1 -1
  13. package/@types/forms/controls/simple-input.d.ts +2 -1
  14. package/@types/forms/form.d.ts +19 -6
  15. package/@types/forms/multiform.d.ts +9 -11
  16. package/@types/index.d.ts +2 -0
  17. package/@types/page/mountable-with-fields.d.ts +32 -0
  18. package/@types/page/mountable.d.ts +2 -27
  19. package/@types/page/page.d.ts +2 -2
  20. package/@types/templates/multiform.d.ts +1 -0
  21. package/@types/templates/redirect.d.ts +1 -0
  22. package/@types/utils/input-wrapper.d.ts +4 -0
  23. package/coverage/clover.xml +79 -0
  24. package/lib/add-route.js +27 -8
  25. package/lib/add-route.js.map +1 -1
  26. package/lib/components/components.js +14 -0
  27. package/lib/components/components.js.map +1 -0
  28. package/lib/components/tabs.js +92 -0
  29. package/lib/components/tabs.js.map +1 -0
  30. package/lib/forms/controls/checkboxed-list-input.js +12 -9
  31. package/lib/forms/controls/checkboxed-list-input.js.map +1 -1
  32. package/lib/forms/controls/controls.js +3 -1
  33. package/lib/forms/controls/controls.js.map +1 -1
  34. package/lib/forms/controls/dropdown.js +14 -12
  35. package/lib/forms/controls/dropdown.js.map +1 -1
  36. package/lib/forms/controls/field-group.js +26 -0
  37. package/lib/forms/controls/field-group.js.map +1 -0
  38. package/lib/forms/controls/form-control.js.map +1 -1
  39. package/lib/forms/controls/form-field-control.js.map +1 -1
  40. package/lib/forms/controls/simple-input.js +6 -8
  41. package/lib/forms/controls/simple-input.js.map +1 -1
  42. package/lib/forms/controls/textarea.js +13 -15
  43. package/lib/forms/controls/textarea.js.map +1 -1
  44. package/lib/forms/form.js +95 -57
  45. package/lib/forms/form.js.map +1 -1
  46. package/lib/forms/multiform.js +52 -62
  47. package/lib/forms/multiform.js.map +1 -1
  48. package/lib/generate-routes.js +7 -3
  49. package/lib/generate-routes.js.map +1 -1
  50. package/lib/index.js +3 -1
  51. package/lib/index.js.map +1 -1
  52. package/lib/page/list.js +1 -1
  53. package/lib/page/list.js.map +1 -1
  54. package/lib/page/mountable-with-fields.js +63 -0
  55. package/lib/page/mountable-with-fields.js.map +1 -0
  56. package/lib/page/mountable.js +2 -49
  57. package/lib/page/mountable.js.map +1 -1
  58. package/lib/page/page.js +2 -2
  59. package/lib/page/page.js.map +1 -1
  60. package/lib/templates/multiform.js +59 -0
  61. package/lib/templates/multiform.js.map +1 -0
  62. package/lib/templates/redirect.js +27 -0
  63. package/lib/templates/redirect.js.map +1 -0
  64. package/lib/tests/manual/multiform.js +14 -5
  65. package/lib/tests/manual/multiform.js.map +1 -1
  66. package/lib/utils/input-wrapper.js +20 -0
  67. package/lib/utils/input-wrapper.js.map +1 -0
  68. package/package.json +4 -3
  69. package/src/add-route.ts +30 -11
  70. package/src/components/components.ts +1 -0
  71. package/src/components/tabs.ts +95 -0
  72. package/src/forms/controls/checkboxed-list-input.ts +17 -10
  73. package/src/forms/controls/controls.ts +1 -0
  74. package/src/forms/controls/dropdown.ts +28 -23
  75. package/src/forms/controls/field-group.ts +32 -0
  76. package/src/forms/controls/form-control.ts +3 -1
  77. package/src/forms/controls/form-field-control.ts +4 -1
  78. package/src/forms/controls/simple-input.ts +19 -12
  79. package/src/forms/controls/textarea.ts +15 -14
  80. package/src/forms/form.ts +122 -76
  81. package/src/forms/multiform.ts +211 -0
  82. package/src/generate-routes.ts +7 -3
  83. package/src/index.ts +2 -0
  84. package/src/page/list.ts +1 -1
  85. package/src/page/mountable-with-fields.ts +112 -0
  86. package/src/page/mountable.ts +4 -96
  87. package/src/page/page.ts +7 -3
  88. package/src/templates/multiform.ts +58 -0
  89. package/src/templates/redirect.ts +22 -0
  90. package/src/tests/manual/multiform.ts +106 -0
  91. 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 @@
1
+ export * from "./tabs";
@@ -0,0 +1,2 @@
1
+ import { FlatTemplatable } from "tempstream";
2
+ export declare function tabs(tabs: Record<string, string>, selected_tab_style?: string, selected_index?: number): FlatTemplatable;
@@ -10,3 +10,4 @@ export { FormParagraph } from "./form-paragraph";
10
10
  export { HTML } from "./html";
11
11
  export { HiddenInput } from "./hidden-input";
12
12
  export { Textarea } from "./textarea";
13
+ export { FieldGroup } from "./field-group";
@@ -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,5 @@ 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";
21
+ export * as Components from "./components/components";
@@ -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"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./tabs"), exports);
14
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/components/components.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAuB"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tabs = void 0;
4
+ function name_to_id(str) {
5
+ return str.replace(/\W/g, "-");
6
+ }
7
+ const style = /* HTML */ `<style>
8
+ .tab-label {
9
+ height: 45px;
10
+ line-height: 45px;
11
+ padding: 0 45px;
12
+ display: block;
13
+ float: left;
14
+ box-sizing: border-box;
15
+ border-bottom: 3px solid transparent;
16
+ cursor: pointer;
17
+ font-size: 18px;
18
+ user-select: none;
19
+ }
20
+
21
+ @media screen and (max-width: 869px) {
22
+ .tab-label {
23
+ display: none;
24
+ }
25
+ }
26
+
27
+ .tab-label--mobile {
28
+ line-height: unset;
29
+ padding-top: 30px;
30
+ padding-left: 0;
31
+ pointer-events: none;
32
+ padding-bottom: 30px;
33
+ color: $font-graphite;
34
+ border-bottom: 2px solid $font-primary;
35
+ display: none;
36
+ @media screen and (max-width: 869px) {
37
+ display: block;
38
+ }
39
+ }
40
+
41
+ .tab-content {
42
+ padding-top: 30px;
43
+ clear: both;
44
+ }
45
+
46
+ @media screen and (max-width: 869px) {
47
+ .tab-content {
48
+ display: block !important;
49
+ }
50
+ }
51
+ </style>`;
52
+ function tabs(tabs, selected_tab_style = "font-weight: bold;", selected_index = 0) {
53
+ return /* HTML */ `${style}
54
+ ${Object.keys(tabs)
55
+ .map((tab_title, index) => {
56
+ const id = name_to_id(tab_title);
57
+ return /* HTML */ `<input
58
+ type="radio"
59
+ name="tabs"
60
+ id="${id}"
61
+ class="tab-radio--${id}"
62
+ style="display: none"
63
+ ${selected_index == index ? "checked" : ""}
64
+ />
65
+ <label class="tab-label tab-label--${id}" for="${id}">
66
+ ${tab_title}
67
+ </label>`;
68
+ })
69
+ .join("\n")}
70
+ ${Object.entries(tabs)
71
+ .map(([title, content]) => {
72
+ const id = name_to_id(title);
73
+ return /* HTML */ ` <div class="tab-label tab-label--mobile">
74
+ ${title}
75
+ </div>
76
+ <div class="tab-content tab-content--${id}">${content}</div>
77
+ <style>
78
+ .tab-radio--${id} ~ .tab-content--${id} {
79
+ display:none;
80
+ }
81
+ .tab-radio--${id}:checked ~ .tab-content--${id} {
82
+ display:block;
83
+ }
84
+ .tab-radio--${id}:checked ~ label.tab-label--${id} {
85
+ ${selected_tab_style}
86
+ }
87
+ </style>`;
88
+ })
89
+ .join("\n")}`;
90
+ }
91
+ exports.tabs = tabs;
92
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/components/tabs.ts"],"names":[],"mappings":";;;AAEA,SAAS,UAAU,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,KAAK,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA4ChB,CAAC;AAEV,SAAgB,IAAI,CACnB,IAA4B,EAC5B,kBAAkB,GAAG,oBAAoB,EACzC,cAAc,GAAG,CAAC;IAElB,OAAO,UAAU,CAAC,GAAG,KAAK;GACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SACjB,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,UAAU,CAAC;;;WAGV,EAAE;yBACY,EAAE;;OAEpB,cAAc,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;yCAEN,EAAE,UAAU,EAAE;OAChD,SAAS;aACH,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC;GACV,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE;QACzB,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,UAAU,CAAC;OACd,KAAK;;2CAE+B,EAAE,KAAK,OAAO;;mBAEtC,EAAE,oBAAoB,EAAE;;;mBAGxB,EAAE,4BAA4B,EAAE;;;mBAGhC,EAAE,+BAA+B,EAAE;QAC9C,kBAAkB;;aAEb,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAChB,CAAC;AA1CD,oBA0CC"}
@@ -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
  }