@sealcode/sealgen 0.8.1 → 0.8.3

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 (70) hide show
  1. package/@types/forms/controls/autocomplete.d.ts +22 -0
  2. package/@types/forms/controls/checkbox-group.d.ts +21 -0
  3. package/@types/forms/controls/checkbox.d.ts +8 -1
  4. package/@types/forms/controls/collapsible-checkbox-group.d.ts +12 -0
  5. package/@types/forms/controls/collapsible-field-group.d.ts +21 -0
  6. package/@types/forms/controls/controls.d.ts +4 -0
  7. package/@types/forms/controls/field-group.d.ts +12 -4
  8. package/@types/forms/controls/simple-input.d.ts +9 -2
  9. package/@types/forms/controls/tickable.d.ts +9 -12
  10. package/@types/forms/fields/enum-multiple.d.ts +18 -0
  11. package/@types/forms/fields/existing-sealious-value.d.ts +6 -0
  12. package/@types/forms/fields/field.d.ts +8 -4
  13. package/@types/forms/fields/proxy-field.d.ts +13 -0
  14. package/@types/page/list.d.ts +3 -3
  15. package/@types/utils/input-wrapper.d.ts +2 -1
  16. package/lib/forms/controls/autocomplete.js +27 -0
  17. package/lib/forms/controls/autocomplete.js.map +1 -0
  18. package/lib/forms/controls/checkbox-group.js +27 -0
  19. package/lib/forms/controls/checkbox-group.js.map +1 -0
  20. package/lib/forms/controls/checkbox.js +12 -1
  21. package/lib/forms/controls/checkbox.js.map +1 -1
  22. package/lib/forms/controls/collapsible-checkbox-group.js +17 -0
  23. package/lib/forms/controls/collapsible-checkbox-group.js.map +1 -0
  24. package/lib/forms/controls/collapsible-field-group.js +82 -0
  25. package/lib/forms/controls/collapsible-field-group.js.map +1 -0
  26. package/lib/forms/controls/controls.js +4 -0
  27. package/lib/forms/controls/controls.js.map +1 -1
  28. package/lib/forms/controls/field-group.js +39 -8
  29. package/lib/forms/controls/field-group.js.map +1 -1
  30. package/lib/forms/controls/simple-input.js +64 -29
  31. package/lib/forms/controls/simple-input.js.map +1 -1
  32. package/lib/forms/controls/tickable.js +4 -2
  33. package/lib/forms/controls/tickable.js.map +1 -1
  34. package/lib/forms/fields/boolean.js +7 -0
  35. package/lib/forms/fields/boolean.js.map +1 -1
  36. package/lib/forms/fields/enum-multiple.js +45 -0
  37. package/lib/forms/fields/enum-multiple.js.map +1 -0
  38. package/lib/forms/fields/existing-sealious-value.js +20 -0
  39. package/lib/forms/fields/existing-sealious-value.js.map +1 -0
  40. package/lib/forms/fields/field.js +7 -0
  41. package/lib/forms/fields/field.js.map +1 -1
  42. package/lib/forms/fields/pick-from-list.js +1 -1
  43. package/lib/forms/fields/pick-from-list.js.map +1 -1
  44. package/lib/forms/fields/proxy-field.js +24 -0
  45. package/lib/forms/fields/proxy-field.js.map +1 -0
  46. package/lib/page/list.js +9 -6
  47. package/lib/page/list.js.map +1 -1
  48. package/lib/sanitize.js +1 -1
  49. package/lib/sanitize.js.map +1 -1
  50. package/lib/utils/input-wrapper.js.map +1 -1
  51. package/package.json +2 -2
  52. package/src/forms/controls/autocomplete.ts +46 -0
  53. package/src/forms/controls/checkbox-group.ts +81 -0
  54. package/src/forms/controls/checkbox.ts +16 -1
  55. package/src/forms/controls/collapsible-checkbox-group.ts +31 -0
  56. package/src/forms/controls/collapsible-field-group.ts +96 -0
  57. package/src/forms/controls/controls.ts +4 -0
  58. package/src/forms/controls/field-group.ts +60 -9
  59. package/src/forms/controls/simple-input.ts +90 -42
  60. package/src/forms/controls/tickable.ts +14 -10
  61. package/src/forms/fields/boolean.ts +6 -0
  62. package/src/forms/fields/enum-multiple.ts +58 -0
  63. package/src/forms/fields/existing-sealious-value.ts +22 -0
  64. package/src/forms/fields/field.ts +14 -2
  65. package/src/forms/fields/pick-from-list.ts +1 -1
  66. package/src/forms/fields/proxy-field.ts +24 -0
  67. package/src/forms/forms.scss +11 -0
  68. package/src/page/list.ts +12 -10
  69. package/src/sanitize.ts +1 -1
  70. package/src/utils/input-wrapper.ts +5 -2
@@ -0,0 +1,22 @@
1
+ import { Context } from "koa";
2
+ import { PickFromListField } from "../fields/pick-from-list";
3
+ import { FormDataValue } from "../form";
4
+ import { SimpleInput } from "./simple-input";
5
+ export declare class Autocomplete extends SimpleInput {
6
+ field: PickFromListField<boolean>;
7
+ options: {
8
+ id?: string;
9
+ label?: string;
10
+ placeholder?: string;
11
+ };
12
+ constructor(field: PickFromListField<boolean>, options: {
13
+ id?: string;
14
+ label?: string;
15
+ placeholder?: string;
16
+ });
17
+ getListID(): string;
18
+ getInputAttributes(ctx: Context, data: Record<string, FormDataValue>, field_prefix: string, form_id: string): Promise<{
19
+ list: string;
20
+ }>;
21
+ postInput(ctx: Context): Promise<string>;
22
+ }
@@ -0,0 +1,21 @@
1
+ import { Context } from "koa";
2
+ import { FlatTemplatable } from "tempstream";
3
+ import { EnumMultipleField, FormField } from "../fields/field";
4
+ import { FormDataValue, FormMessage } from "../form";
5
+ import { CheckboxWithValue } from "./checkbox";
6
+ import { FormFieldControl } from "./controls";
7
+ export declare type DefaultCheckboxOptions = {
8
+ id?: string;
9
+ label?: string;
10
+ hide_errors?: boolean;
11
+ readonly?: boolean;
12
+ name?: string;
13
+ checkboxNameToLabel?: (name: string) => string;
14
+ };
15
+ export declare class CheckboxGroup<Options extends DefaultCheckboxOptions = DefaultCheckboxOptions> extends FormFieldControl {
16
+ field: EnumMultipleField<readonly string[], boolean>;
17
+ options: Options;
18
+ constructor(field: EnumMultipleField<readonly string[], boolean>, options?: Options);
19
+ wrapGroup(ctx: Context, data: Record<string, FormDataValue>, messages: FormMessage[], field_prefix: string, form_id: string, checkboxes: CheckboxWithValue[]): Promise<FlatTemplatable>;
20
+ render<Fields extends Record<string, FormField>>(ctx: Context, data: Record<string, FormDataValue>, messages: FormMessage[], field_prefix: string, form_id: string): Promise<FlatTemplatable>;
21
+ }
@@ -1,8 +1,15 @@
1
1
  import { Context } from "koa";
2
2
  import { FormDataValue } from "../form";
3
- import { Tickable } from "./tickable";
3
+ import { Tickable, TickableOptions } from "./tickable";
4
+ import { FormField } from "../fields/field";
4
5
  export declare class Checkbox extends Tickable<boolean> {
5
6
  type: "checkbox";
6
7
  isChecked(_ctx: Context, _data: Record<string, FormDataValue>, value: boolean): boolean;
7
8
  getValueAttribute(): string;
8
9
  }
10
+ export declare class CheckboxWithValue extends Checkbox {
11
+ field: FormField<boolean, boolean>;
12
+ value: string;
13
+ constructor(field: FormField<boolean, boolean>, options: TickableOptions, value: string);
14
+ getValueAttribute(): string;
15
+ }
@@ -0,0 +1,12 @@
1
+ import { Context } from "koa";
2
+ import { FlatTemplatable } from "tempstream";
3
+ import { FormDataValue, FormMessage } from "../form";
4
+ import { CheckboxWithValue } from "./checkbox";
5
+ import { CheckboxGroup, DefaultCheckboxOptions } from "./checkbox-group";
6
+ export declare class CollapsibleCheckboxGroup extends CheckboxGroup<DefaultCheckboxOptions & {
7
+ textWhenOpen?: string;
8
+ textWhenClosed?: string;
9
+ groupID?: string;
10
+ }> {
11
+ wrapGroup(ctx: Context, data: Record<string, FormDataValue>, messages: FormMessage[], field_prefix: string, form_id: string, checkboxes: CheckboxWithValue[]): Promise<FlatTemplatable>;
12
+ }
@@ -0,0 +1,21 @@
1
+ import { FlatTemplatable } from "tempstream";
2
+ import { FieldGroup } from "./field-group";
3
+ import { FormControl } from "./form-control";
4
+ declare type CollapsibleFieldGroupOptions = {
5
+ label?: string;
6
+ classes?: string;
7
+ openOnStart?: boolean;
8
+ textWhenOpen?: string;
9
+ textWhenClosed?: string;
10
+ groupID?: string;
11
+ };
12
+ export declare class CollapsibleFieldGroup extends FieldGroup {
13
+ controls: FormControl[];
14
+ options: CollapsibleFieldGroupOptions;
15
+ collapseID: string;
16
+ constructor(controls: FormControl[], options?: CollapsibleFieldGroupOptions);
17
+ getGroupLabelProps(): string;
18
+ preLabelContainer(): FlatTemplatable;
19
+ postLabel(): FlatTemplatable;
20
+ }
21
+ export {};
@@ -16,3 +16,7 @@ export * from "./tickable";
16
16
  export * from "./checkbox";
17
17
  export * from "./radio";
18
18
  export * from "./big-radio-group";
19
+ export * from "./checkbox-group";
20
+ export * from "./collapsible-field-group";
21
+ export * from "./collapsible-checkbox-group";
22
+ export * from "./autocomplete";
@@ -1,17 +1,25 @@
1
1
  import { Context } from "koa";
2
2
  import { FlatTemplatable } from "tempstream";
3
- import { FormDataValue } from "../form";
3
+ import { FormDataValue, FormMessage } from "../form";
4
4
  import { FormControl } from "./form-control";
5
- export declare class FieldGroup extends FormControl {
5
+ import { FormFieldControl } from "./form-field-control";
6
+ export declare class FieldGroup extends FormFieldControl {
6
7
  controls: FormControl[];
7
8
  options: {
8
9
  label?: string;
9
10
  classes?: string;
11
+ containerID?: string;
10
12
  };
11
13
  constructor(controls: FormControl[], options?: {
12
14
  label?: string;
13
15
  classes?: string;
16
+ containerID?: string;
14
17
  });
15
- render(ctx: Context, data: Record<string, FormDataValue>): Promise<FlatTemplatable>;
16
- role: "decoration";
18
+ preLabel(): FlatTemplatable;
19
+ preLabelContainer(): FlatTemplatable;
20
+ postLabel(): FlatTemplatable;
21
+ preFields(): FlatTemplatable;
22
+ postFields(): FlatTemplatable;
23
+ getGroupLabelProps(): FlatTemplatable;
24
+ render(ctx: Context, data: Record<string, FormDataValue>, messages: FormMessage[], field_prefix: string, form_id: string): Promise<FlatTemplatable>;
17
25
  }
@@ -1,7 +1,7 @@
1
1
  import { Context } from "koa";
2
2
  import { FlatTemplatable } from "tempstream";
3
3
  import { FormField } from "../fields/field";
4
- import { FormDataValue } from "../form";
4
+ import { FormDataValue, FormMessage } from "../form";
5
5
  import { FormFieldControl } from "./controls";
6
6
  export declare class SimpleInput extends FormFieldControl {
7
7
  field: FormField;
@@ -27,5 +27,12 @@ export declare class SimpleInput extends FormFieldControl {
27
27
  readonly?: boolean;
28
28
  step?: number;
29
29
  });
30
- render<Fields extends Record<string, FormField>>(ctx: Context, data: Record<string, FormDataValue>, _: unknown[], field_prefix: string, form_id: string): Promise<FlatTemplatable>;
30
+ getType(): string;
31
+ getLabel(): string;
32
+ getID(): string;
33
+ getPlaceholder(): string;
34
+ getInputAttributes(ctx: Context, data: Record<string, FormDataValue>, field_prefix: string, form_id: string): Promise<Record<string, string | true>>;
35
+ renderAttributes(attrs: Record<string, string | true>): string;
36
+ postInput(ctx: Context): Promise<FlatTemplatable>;
37
+ render<Fields extends Record<string, FormField>>(ctx: Context, data: Record<string, FormDataValue>, _messages: FormMessage[], field_prefix: string, form_id: string): Promise<FlatTemplatable>;
31
38
  }
@@ -3,20 +3,17 @@ import { FlatTemplatable } from "tempstream";
3
3
  import { FormField } from "../fields/field";
4
4
  import { FormDataValue } from "../form";
5
5
  import { FormFieldControl } from "./controls";
6
+ export declare type TickableOptions = {
7
+ id?: string;
8
+ name?: string;
9
+ label?: string;
10
+ hide_errors?: boolean;
11
+ readonly?: boolean;
12
+ };
6
13
  export declare abstract class Tickable<T extends unknown> extends FormFieldControl {
7
14
  field: FormField<boolean, T>;
8
- options: {
9
- id?: string;
10
- label?: string;
11
- hide_errors?: boolean;
12
- readonly?: boolean;
13
- };
14
- constructor(field: FormField<boolean, T>, options?: {
15
- id?: string;
16
- label?: string;
17
- hide_errors?: boolean;
18
- readonly?: boolean;
19
- });
15
+ options: TickableOptions;
16
+ constructor(field: FormField<boolean, T>, options?: TickableOptions);
20
17
  type: "checkbox" | "radio";
21
18
  abstract getValueAttribute(ctx: Context, data: Record<string, FormDataValue>, value: T): string;
22
19
  abstract isChecked(ctx: Context, data: Record<string, FormDataValue>, value: T): boolean;
@@ -0,0 +1,18 @@
1
+ import { Context } from "koa";
2
+ import { FormDataValue } from "../form";
3
+ import { FieldParseResult, FormField } from "./field";
4
+ export declare class EnumMultipleField<Options extends readonly string[], Required extends boolean> extends FormField<Required, string[]> {
5
+ options: Options;
6
+ error_message: (options: Options) => string;
7
+ constructor(required: Required, options: Options, error_message?: (options: Options) => string);
8
+ predicate: (v: unknown, w: unknown) => {
9
+ readonly match: boolean;
10
+ readonly wildcard: Options[number];
11
+ };
12
+ isValueValid(_: Context, values: string[]): Promise<{
13
+ valid: boolean;
14
+ message: string;
15
+ }>;
16
+ parse(_: Context, value: FormDataValue): Promise<FieldParseResult<string[]>>;
17
+ getEmptyValue(): string[];
18
+ }
@@ -0,0 +1,6 @@
1
+ import { Field } from "sealious";
2
+ import { PickFromListField } from "./pick-from-list";
3
+ export declare class ExistingSealiousValue<Required extends boolean> extends PickFromListField<Required> {
4
+ constructor(required: Required, field: Field);
5
+ getEmptyValue(): string;
6
+ }
@@ -13,19 +13,20 @@ export declare type FieldsToShape<T extends Record<string, FormField>> = {
13
13
  };
14
14
  export declare function fieldsToShape<Fields extends Record<string, FormField>>(obj: Fields): FieldsToShape<Fields>;
15
15
  export declare type FieldParseResult<T> = {
16
- parsable: false;
17
- error: string;
18
- parsed_value: null;
19
- } | {
20
16
  parsable: true;
21
17
  error: null;
22
18
  parsed_value: T;
19
+ } | {
20
+ parsable: false;
21
+ error: string;
22
+ parsed_value: null;
23
23
  };
24
24
  export declare abstract class FormField<Required extends boolean = boolean, ParsedValue extends unknown = unknown> {
25
25
  readonly required: Required;
26
26
  name: string;
27
27
  constructor(required: Required);
28
28
  predicate: Predicate;
29
+ mapToFilter: (parsed: ParsedValue) => unknown;
29
30
  init(fieldname: string): void;
30
31
  _validate(ctx: Context, value: ParsedValue): Promise<FormFieldValidationResponse>;
31
32
  abstract getEmptyValue(): ParsedValue;
@@ -37,6 +38,7 @@ export declare abstract class FormField<Required extends boolean = boolean, Pars
37
38
  parsed: ParsedValue;
38
39
  raw: FormDataValue;
39
40
  }>;
41
+ setMapToFilter(fn: (parsed: ParsedValue) => unknown): this;
40
42
  }
41
43
  export * from "./simple-form-field";
42
44
  export * from "./checkboxed-list";
@@ -47,3 +49,5 @@ export * from "./regexp";
47
49
  export * from "./email";
48
50
  export * from "./enum";
49
51
  export * from "./boolean";
52
+ export * from "./enum-multiple";
53
+ export * from "./existing-sealious-value";
@@ -0,0 +1,13 @@
1
+ import { FormField } from "./field";
2
+ export declare class ProxyFormField<T> extends FormField<boolean, T> {
3
+ name: string;
4
+ empty_value: T;
5
+ parsed_value: T;
6
+ constructor(required: boolean, name: string, empty_value: T, parsed_value: T);
7
+ getEmptyValue(): T;
8
+ parse(): Promise<{
9
+ readonly parsable: true;
10
+ readonly error: null;
11
+ readonly parsed_value: T;
12
+ }>;
13
+ }
@@ -3,7 +3,7 @@ import { Collection, CollectionItem, ItemList } from "sealious";
3
3
  import { Templatable, FlatTemplatable } from "tempstream";
4
4
  import { Page } from "./page";
5
5
  import { ShapeToType } from "@sealcode/ts-predicates";
6
- import { FormFieldControl } from "../forms/controls/controls";
6
+ import { FormControl } from "../forms/controls/controls";
7
7
  import { FormField, NumberField } from "../forms/fields/field";
8
8
  import { FormDataValue } from "..";
9
9
  export declare const BasePagePropsShape: {};
@@ -17,10 +17,10 @@ export declare abstract class ListPage<ItemType, F extends typeof BaseListPageFi
17
17
  abstract getTotalPages(ctx: Context, itemsPerPage: number, values: Record<string, FormDataValue>): Promise<number>;
18
18
  abstract renderItem(ctx: Context, item: ItemType): Promise<FlatTemplatable>;
19
19
  filterFields: Record<string, FormField>;
20
- filterControls: FormFieldControl[];
20
+ filterControls: FormControl[];
21
21
  init(): void;
22
22
  renderListContainer(_: Context, content: Templatable): FlatTemplatable;
23
- renderItems(ctx: Context, values?: Record<string, FormDataValue>): Promise<FlatTemplatable>;
23
+ renderItems(ctx: Context, values?: Record<string, FormDataValue>, items?: ItemType[]): Promise<FlatTemplatable>;
24
24
  render(ctx: Context): Promise<FlatTemplatable>;
25
25
  renderPagination(ctx: Context, values: Record<string, FormDataValue>): Promise<FlatTemplatable>;
26
26
  private renderPageButton;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
2
  import { Readable } from "stream";
3
+ import { FlatTemplatable } from "tempstream";
3
4
  export declare function getRequiredClass(isRequired: boolean): string;
4
- export declare function inputWrapper(modifiers: string[], input: string): Readable;
5
+ export declare function inputWrapper(modifiers: string[], input: FlatTemplatable): Readable;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Autocomplete = void 0;
4
+ const simple_input_1 = require("./simple-input");
5
+ class Autocomplete extends simple_input_1.SimpleInput {
6
+ constructor(field, options) {
7
+ super(field);
8
+ this.field = field;
9
+ this.options = options;
10
+ }
11
+ getListID() {
12
+ return this.getID() + "_list";
13
+ }
14
+ async getInputAttributes(ctx, data, field_prefix, form_id) {
15
+ return {
16
+ ...(await super.getInputAttributes(ctx, data, field_prefix, form_id)),
17
+ list: this.getListID(),
18
+ };
19
+ }
20
+ async postInput(ctx) {
21
+ return /* HTML */ `<datalist id="${this.getListID()}">
22
+ ${Object.entries(await this.field.generateOptions(ctx)).map(([key, value]) => /* HTML */ `<option>${key}</option>`)}
23
+ </datalist>`;
24
+ }
25
+ }
26
+ exports.Autocomplete = Autocomplete;
27
+ //# sourceMappingURL=autocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../../src/forms/controls/autocomplete.ts"],"names":[],"mappings":";;;AAOA,iDAA6C;AAE7C,MAAa,YAAa,SAAQ,0BAAW;IAC5C,YACQ,KAAiC,EACjC,OAA8D;QAErE,KAAK,CAAC,KAAK,CAAC,CAAC;QAHN,UAAK,GAAL,KAAK,CAA4B;QACjC,YAAO,GAAP,OAAO,CAAuD;IAGtE,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,GAAY,EACZ,IAAmC,EACnC,YAAoB,EACpB,OAAe;QAEf,OAAO;YACN,GAAG,CAAC,MAAM,KAAK,CAAC,kBAAkB,CACjC,GAAG,EACH,IAAI,EACJ,YAAY,EACZ,OAAO,CACP,CAAC;YACF,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE;SACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAY;QAC3B,OAAO,UAAU,CAAC,iBAAiB,IAAI,CAAC,SAAS,EAAE;KAChD,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAC1D,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,GAAG,WAAW,CACtD;cACU,CAAC;IACd,CAAC;CACD;AApCD,oCAoCC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CheckboxGroup = void 0;
4
+ const proxy_field_1 = require("../fields/proxy-field");
5
+ const checkbox_1 = require("./checkbox");
6
+ const controls_1 = require("./controls");
7
+ class CheckboxGroup extends controls_1.FormFieldControl {
8
+ constructor(field, options = {}) {
9
+ super([field]);
10
+ this.field = field;
11
+ this.options = options;
12
+ }
13
+ wrapGroup(ctx, data, messages, field_prefix, form_id, checkboxes) {
14
+ return new controls_1.FieldGroup(checkboxes, { label: this.options.label }).render(ctx, data, messages, field_prefix, form_id);
15
+ }
16
+ async render(ctx, data, messages, field_prefix, form_id) {
17
+ const { parsed: values } = await this.field.getValue(ctx, data);
18
+ const checkboxes = this.field.options.map((option) => new checkbox_1.CheckboxWithValue(new proxy_field_1.ProxyFormField(false, this.field.name + "[]", false, values.includes(option)), {
19
+ id: this.field.name + "__" + option,
20
+ label: (this.options.checkboxNameToLabel ||
21
+ ((s) => s))(option),
22
+ }, option));
23
+ return this.wrapGroup(ctx, data, messages, field_prefix, form_id, checkboxes);
24
+ }
25
+ }
26
+ exports.CheckboxGroup = CheckboxGroup;
27
+ //# sourceMappingURL=checkbox-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox-group.js","sourceRoot":"","sources":["../../../src/forms/controls/checkbox-group.ts"],"names":[],"mappings":";;;AAGA,uDAAuD;AAEvD,yCAA+C;AAC/C,yCAA0D;AAW1D,MAAa,aAEX,SAAQ,2BAAgB;IACzB,YACQ,KAAoD,EACpD,UAAmB,EAAa;QAEvC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAHR,UAAK,GAAL,KAAK,CAA+C;QACpD,YAAO,GAAP,OAAO,CAAyB;IAGxC,CAAC;IAED,SAAS,CACR,GAAY,EACZ,IAAmC,EACnC,QAAuB,EACvB,YAAoB,EACpB,OAAe,EACf,UAA+B;QAE/B,OAAO,IAAI,qBAAU,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CACtE,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,OAAO,CACP,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACX,GAAY,EACZ,IAAmC,EACnC,QAAuB,EACvB,YAAoB,EACpB,OAAe;QAEf,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CACxC,CAAC,MAAM,EAAE,EAAE,CACV,IAAI,4BAAiB,CACpB,IAAI,4BAAc,CACjB,KAAK,EACL,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EACtB,KAAK,EACL,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CACvB,EACD;YACC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM;YACnC,KAAK,EAAE,CACN,IAAI,CAAC,OAAO,CAAC,mBAAmB;gBAChC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAClB,CAAC,MAAM,CAAC;SACT,EACD,MAAM,CACN,CACF,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CACpB,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,UAAU,CACV,CAAC;IACH,CAAC;CACD;AA/DD,sCA+DC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Checkbox = void 0;
3
+ exports.CheckboxWithValue = exports.Checkbox = void 0;
4
4
  const tickable_1 = require("./tickable");
5
5
  class Checkbox extends tickable_1.Tickable {
6
6
  constructor() {
@@ -15,4 +15,15 @@ class Checkbox extends tickable_1.Tickable {
15
15
  }
16
16
  }
17
17
  exports.Checkbox = Checkbox;
18
+ class CheckboxWithValue extends Checkbox {
19
+ constructor(field, options, value) {
20
+ super(field, options);
21
+ this.field = field;
22
+ this.value = value;
23
+ }
24
+ getValueAttribute() {
25
+ return this.value;
26
+ }
27
+ }
28
+ exports.CheckboxWithValue = CheckboxWithValue;
18
29
  //# sourceMappingURL=checkbox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../../src/forms/controls/checkbox.ts"],"names":[],"mappings":";;;AAEA,yCAAsC;AAEtC,MAAa,QAAS,SAAQ,mBAAiB;IAA/C;;QACC,SAAI,GAAU,UAAU,CAAC;IAa1B,CAAC;IAXA,SAAS,CACR,IAAa,EACb,KAAoC,EACpC,KAAc;QAEd,OAAO,KAAK,CAAC;IACd,CAAC;IAED,iBAAiB;QAChB,OAAO,EAAE,CAAC;IACX,CAAC;CACD;AAdD,4BAcC"}
1
+ {"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../../src/forms/controls/checkbox.ts"],"names":[],"mappings":";;;AAEA,yCAAuD;AAGvD,MAAa,QAAS,SAAQ,mBAAiB;IAA/C;;QACC,SAAI,GAAU,UAAU,CAAC;IAa1B,CAAC;IAXA,SAAS,CACR,IAAa,EACb,KAAoC,EACpC,KAAc;QAEd,OAAO,KAAK,CAAC;IACd,CAAC;IAED,iBAAiB;QAChB,OAAO,EAAE,CAAC;IACX,CAAC;CACD;AAdD,4BAcC;AAED,MAAa,iBAAkB,SAAQ,QAAQ;IAC9C,YACQ,KAAkC,EACzC,OAAwB,EACjB,KAAa;QAEpB,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAJf,UAAK,GAAL,KAAK,CAA6B;QAElC,UAAK,GAAL,KAAK,CAAQ;IAGrB,CAAC;IAED,iBAAiB;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;CACD;AAZD,8CAYC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CollapsibleCheckboxGroup = void 0;
4
+ const checkbox_group_1 = require("./checkbox-group");
5
+ const collapsible_field_group_1 = require("./collapsible-field-group");
6
+ class CollapsibleCheckboxGroup extends checkbox_group_1.CheckboxGroup {
7
+ wrapGroup(ctx, data, messages, field_prefix, form_id, checkboxes) {
8
+ return new collapsible_field_group_1.CollapsibleFieldGroup(checkboxes, {
9
+ label: this.options.label,
10
+ textWhenOpen: this.options.textWhenOpen,
11
+ textWhenClosed: this.options.textWhenClosed,
12
+ groupID: this.options.groupID,
13
+ }).render(ctx, data, messages, field_prefix, form_id);
14
+ }
15
+ }
16
+ exports.CollapsibleCheckboxGroup = CollapsibleCheckboxGroup;
17
+ //# sourceMappingURL=collapsible-checkbox-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible-checkbox-group.js","sourceRoot":"","sources":["../../../src/forms/controls/collapsible-checkbox-group.ts"],"names":[],"mappings":";;;AAKA,qDAAyE;AACzE,uEAAkE;AAElE,MAAa,wBAAyB,SAAQ,8BAM7C;IACA,SAAS,CACR,GAAY,EACZ,IAAmC,EACnC,QAAuB,EACvB,YAAoB,EACpB,OAAe,EACf,UAA+B;QAE/B,OAAO,IAAI,+CAAqB,CAAC,UAAU,EAAE;YAC5C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;YACvC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;YAC3C,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;SAC7B,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACD;AAtBD,4DAsBC"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CollapsibleFieldGroup = void 0;
4
+ const field_group_1 = require("./field-group");
5
+ const crypto_1 = require("crypto");
6
+ class CollapsibleFieldGroup extends field_group_1.FieldGroup {
7
+ constructor(controls, options = {}) {
8
+ super([]);
9
+ this.controls = controls;
10
+ this.options = options;
11
+ if (this.options.groupID == undefined) {
12
+ this.options.groupID = "A" + crypto_1.randomUUID(); // "A" is needed as ids always have to start with a letter
13
+ }
14
+ this.collapseID = this.options.groupID + "collapse";
15
+ }
16
+ getGroupLabelProps() {
17
+ return super.getGroupLabelProps() + ` for="${this.collapseID}"`;
18
+ }
19
+ preLabelContainer() {
20
+ return /* HTML */ `<style>
21
+ input#${this.collapseID} {
22
+ display: none;
23
+ }
24
+
25
+ input#${this.collapseID} ~ .field-group__fields {
26
+ display: none;
27
+ }
28
+
29
+ input#${this.collapseID}:checked ~ .field-group__fields {
30
+ display: block;
31
+ }
32
+
33
+ input#${this.collapseID}
34
+ ~ .field-group__label-container
35
+ .field-group__collapse-label-text--open {
36
+ display: none;
37
+ }
38
+
39
+ input#${this.collapseID}:checked
40
+ ~ .field-group__label-container
41
+ .field-group__collapse-label-text--open {
42
+ display: inline-block;
43
+ }
44
+
45
+ input#${this.collapseID}
46
+ ~ .field-group__label-container
47
+ .field-group__collapse-label-text--closed {
48
+ display: inline-block;
49
+ }
50
+
51
+ input#${this.collapseID}:checked
52
+ ~ .field-group__label-container
53
+ .field-group__collapse-label-text--closed {
54
+ display: none;
55
+ }
56
+ </style>
57
+ <input
58
+ type="checkbox"
59
+ id="${this.collapseID}"
60
+ ${this.options.openOnStart ? "checked" : ""}
61
+ />`;
62
+ }
63
+ postLabel() {
64
+ return /* HTML */ `<label
65
+ class="field-group__collapse-label"
66
+ for="${this.collapseID}"
67
+ >
68
+ <span
69
+ class="field-group__collapse-label-text field-group__collapse-label-text--open"
70
+ >
71
+ ${this.options.textWhenOpen || "close"}
72
+ </span>
73
+ <span
74
+ class="field-group__collapse-label-text field-group__collapse-label-text--closed"
75
+ >
76
+ ${this.options.textWhenClosed || "open"}
77
+ </span>
78
+ </label>`;
79
+ }
80
+ }
81
+ exports.CollapsibleFieldGroup = CollapsibleFieldGroup;
82
+ //# sourceMappingURL=collapsible-field-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible-field-group.js","sourceRoot":"","sources":["../../../src/forms/controls/collapsible-field-group.ts"],"names":[],"mappings":";;;AAGA,+CAA2C;AAC3C,mCAAoC;AAYpC,MAAa,qBAAsB,SAAQ,wBAAU;IAEpD,YACQ,QAAuB,EACvB,UAAwC,EAAE;QAEjD,KAAK,CAAC,EAAE,CAAC,CAAC;QAHH,aAAQ,GAAR,QAAQ,CAAe;QACvB,YAAO,GAAP,OAAO,CAAmC;QAGjD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE;YACtC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,GAAG,GAAG,mBAAU,EAAE,CAAC,CAAC,0DAA0D;SACrG;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC;IACrD,CAAC;IAED,kBAAkB;QACjB,OAAO,KAAK,CAAC,kBAAkB,EAAE,GAAG,SAAS,IAAI,CAAC,UAAU,GAAG,CAAC;IACjE,CAAC;IAED,iBAAiB;QAChB,OAAO,UAAU,CAAC;YACR,IAAI,CAAC,UAAU;;;;YAIf,IAAI,CAAC,UAAU;;;;YAIf,IAAI,CAAC,UAAU;;;;YAIf,IAAI,CAAC,UAAU;;;;;;YAMf,IAAI,CAAC,UAAU;;;;;;YAMf,IAAI,CAAC,UAAU;;;;;;YAMf,IAAI,CAAC,UAAU;;;;;;;;UAQjB,IAAI,CAAC,UAAU;MACnB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;MACzC,CAAC;IACN,CAAC;IAED,SAAS;QACR,OAAO,UAAU,CAAC;;UAEV,IAAI,CAAC,UAAU;;;;;MAKnB,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO;;;;;MAKpC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,MAAM;;WAEhC,CAAC;IACX,CAAC;CACD;AA/ED,sDA+EC"}
@@ -42,4 +42,8 @@ __exportStar(require("./tickable"), exports);
42
42
  __exportStar(require("./checkbox"), exports);
43
43
  __exportStar(require("./radio"), exports);
44
44
  __exportStar(require("./big-radio-group"), exports);
45
+ __exportStar(require("./checkbox-group"), exports);
46
+ __exportStar(require("./collapsible-field-group"), exports);
47
+ __exportStar(require("./collapsible-checkbox-group"), exports);
48
+ __exportStar(require("./autocomplete"), exports);
45
49
  //# sourceMappingURL=controls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/forms/controls/controls.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,2EAAwE;AAA/D,sIAAA,wBAAwB,OAAA;AACjC,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAC5B,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,4CAA0B;AAC1B,6CAA2B;AAC3B,6CAA2B;AAC3B,0CAAwB;AACxB,oDAAkC"}
1
+ {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/forms/controls/controls.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,2EAAwE;AAA/D,sIAAA,wBAAwB,OAAA;AACjC,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAC5B,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,4CAA0B;AAC1B,6CAA2B;AAC3B,6CAA2B;AAC3B,0CAAwB;AACxB,oDAAkC;AAClC,mDAAiC;AACjC,4DAA0C;AAC1C,+DAA6C;AAC7C,iDAA+B"}
@@ -2,22 +2,53 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FieldGroup = void 0;
4
4
  const tempstream_1 = require("tempstream");
5
- const form_control_1 = require("./form-control");
6
- class FieldGroup extends form_control_1.FormControl {
5
+ const form_field_control_1 = require("./form-field-control");
6
+ class FieldGroup extends form_field_control_1.FormFieldControl {
7
7
  constructor(controls, options = {}) {
8
- super();
8
+ super([]);
9
9
  this.controls = controls;
10
10
  this.options = options;
11
- this.role = "decoration";
12
11
  }
13
- async render(ctx, data) {
12
+ preLabel() {
13
+ return "";
14
+ }
15
+ preLabelContainer() {
16
+ return "";
17
+ }
18
+ postLabel() {
19
+ return "";
20
+ }
21
+ preFields() {
22
+ return "";
23
+ }
24
+ postFields() {
25
+ return "";
26
+ }
27
+ getGroupLabelProps() {
28
+ return `class="field-group__label"`;
29
+ }
30
+ async render(ctx, data, messages, field_prefix, form_id) {
14
31
  const { label, classes } = this.options;
15
32
  return tempstream_1.tempstream /* HTML */ `
16
- <div class="field-group ${classes || ""}">
17
- ${label ? `<label>${label}</label>` : ""}
33
+ <div
34
+ class="field-group ${classes || ""}"
35
+ ${this.options.containerID
36
+ ? `id="${this.options.containerID}"`
37
+ : ""}
38
+ >
39
+ ${this.preLabelContainer()}
40
+ <div class="field-group__label-container">
41
+ ${this.preLabel()}
42
+ ${label
43
+ ? `<label ${this.getGroupLabelProps()}>${label}</label>`
44
+ : ""}
45
+ ${this.postLabel()}
46
+ </div>
47
+ ${this.preFields()}
18
48
  <div class="field-group__fields">
19
- ${this.controls.map((control) => control.render(ctx, data, [], "", ""))}
49
+ ${this.controls.map((control) => control.render(ctx, data, messages, field_prefix, form_id))}
20
50
  </div>
51
+ ${this.postFields()}
21
52
  </div>
22
53
  `;
23
54
  }
@@ -1 +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,EAAE,EAAE,EAAE,EAAE,CAAC,CACrC;;;GAGH,CAAC;IACH,CAAC;CAED;AA1BD,gCA0BC"}
1
+ {"version":3,"file":"field-group.js","sourceRoot":"","sources":["../../../src/forms/controls/field-group.ts"],"names":[],"mappings":";;;AACA,2CAAyD;AAGzD,6DAAwD;AAExD,MAAa,UAAW,SAAQ,qCAAgB;IAC/C,YACQ,QAAuB,EACvB,UAIH,EAAE;QAEN,KAAK,CAAC,EAAE,CAAC,CAAC;QAPH,aAAQ,GAAR,QAAQ,CAAe;QACvB,YAAO,GAAP,OAAO,CAIR;IAGP,CAAC;IAED,QAAQ;QACP,OAAO,EAAE,CAAC;IACX,CAAC;IAED,iBAAiB;QAChB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,SAAS;QACR,OAAO,EAAE,CAAC;IACX,CAAC;IAED,SAAS;QACR,OAAO,EAAE,CAAC;IACX,CAAC;IAED,UAAU;QACT,OAAO,EAAE,CAAC;IACX,CAAC;IAED,kBAAkB;QACjB,OAAO,4BAA4B,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CACX,GAAY,EACZ,IAAmC,EACnC,QAAuB,EACvB,YAAoB,EACpB,OAAe;QAEf,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAExC,OAAO,uBAAU,CAAA,UAAU,CAAC;;yBAEL,OAAO,IAAI,EAAE;MAChC,IAAI,CAAC,OAAO,CAAC,WAAW;YACzB,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG;YACpC,CAAC,CAAC,EAAE;;MAEH,IAAI,CAAC,iBAAiB,EAAE;;OAEvB,IAAI,CAAC,QAAQ,EAAE;OACf,KAAK;YACN,CAAC,CAAC,UAAU,IAAI,CAAC,kBAAkB,EAAE,IAAI,KAAK,UAAU;YACxD,CAAC,CAAC,EAAE;OACH,IAAI,CAAC,SAAS,EAAE;;MAEjB,IAAI,CAAC,SAAS,EAAE;;OAEf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC/B,OAAO,CAAC,MAAM,CACb,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,OAAO,CACP,CACD;;MAEA,IAAI,CAAC,UAAU,EAAE;;GAEpB,CAAC;IACH,CAAC;CACD;AA5ED,gCA4EC"}