@uxf/form 1.0.0-beta.98 → 1.0.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 (110) hide show
  1. package/avatar-file-input/avatar-file-input.d.ts +14 -0
  2. package/avatar-file-input/avatar-file-input.js +38 -0
  3. package/avatar-file-input/avatar-file-input.stories.d.ts +8 -0
  4. package/avatar-file-input/avatar-file-input.stories.js +25 -0
  5. package/avatar-file-input/index.d.ts +1 -0
  6. package/avatar-file-input/index.js +17 -0
  7. package/checkbox-button/checkbox-button.d.ts +11 -3
  8. package/checkbox-button/checkbox-button.js +12 -3
  9. package/checkbox-button/checkbox-button.stories.d.ts +2 -2
  10. package/checkbox-button/checkbox-button.stories.js +2 -2
  11. package/checkbox-input/checkbox-input.d.ts +15 -0
  12. package/checkbox-input/checkbox-input.js +38 -0
  13. package/checkbox-input/checkbox-input.stories.d.ts +8 -0
  14. package/checkbox-input/checkbox-input.stories.js +26 -0
  15. package/checkbox-input/index.d.ts +1 -0
  16. package/checkbox-input/index.js +17 -0
  17. package/color-radio-group/color-radio-group.d.ts +11 -4
  18. package/color-radio-group/color-radio-group.js +12 -3
  19. package/color-radio-group/color-radio-group.stories.d.ts +2 -2
  20. package/color-radio-group/color-radio-group.stories.js +2 -2
  21. package/combobox/combobox.d.ts +11 -4
  22. package/combobox/combobox.js +12 -3
  23. package/combobox/combobox.stories.d.ts +2 -2
  24. package/combobox/combobox.stories.js +4 -3
  25. package/date-picker-input/date-picker-input.d.ts +9 -3
  26. package/date-picker-input/date-picker-input.js +63 -4
  27. package/date-picker-input/date-picker-input.stories.d.ts +2 -2
  28. package/date-picker-input/date-picker-input.stories.js +8 -3
  29. package/datetime-picker-input/datetime-picker-input.d.ts +13 -0
  30. package/datetime-picker-input/datetime-picker-input.js +90 -0
  31. package/datetime-picker-input/datetime-picker-input.stories.d.ts +8 -0
  32. package/datetime-picker-input/datetime-picker-input.stories.js +28 -0
  33. package/datetime-picker-input/index.d.ts +1 -0
  34. package/datetime-picker-input/index.js +17 -0
  35. package/dropzone/dropzone-input.d.ts +16 -0
  36. package/dropzone/dropzone-input.js +58 -0
  37. package/dropzone/dropzone-list.d.ts +14 -0
  38. package/dropzone/dropzone-list.js +23 -0
  39. package/dropzone/dropzone.stories.d.ts +9 -0
  40. package/dropzone/dropzone.stories.js +42 -0
  41. package/dropzone/index.d.ts +7 -0
  42. package/dropzone/index.js +6 -0
  43. package/file-input/file-input.d.ts +14 -0
  44. package/file-input/file-input.js +38 -0
  45. package/file-input/file-input.stories.d.ts +8 -0
  46. package/file-input/file-input.stories.js +31 -0
  47. package/file-input/index.d.ts +1 -0
  48. package/file-input/index.js +17 -0
  49. package/form/form.d.ts +13 -11
  50. package/form/form.js +10 -38
  51. package/form/form.stories.d.ts +2 -2
  52. package/form/form.stories.js +10 -7
  53. package/form-id-context/form-id-context.d.ts +3 -0
  54. package/form-id-context/form-id-context.js +8 -0
  55. package/form-id-context/index.d.ts +1 -0
  56. package/form-id-context/index.js +17 -0
  57. package/gps-input/gps-input.d.ts +18 -0
  58. package/gps-input/gps-input.js +153 -0
  59. package/gps-input/gps-input.stories.d.ts +8 -0
  60. package/gps-input/gps-input.stories.js +24 -0
  61. package/gps-input/index.d.ts +1 -0
  62. package/{checkbox → gps-input}/index.js +1 -1
  63. package/multi-combobox/multi-combobox.d.ts +11 -4
  64. package/multi-combobox/multi-combobox.js +13 -4
  65. package/multi-combobox/multi-combobox.stories.d.ts +2 -2
  66. package/multi-combobox/multi-combobox.stories.js +18 -7
  67. package/multi-select/index.d.ts +1 -0
  68. package/multi-select/index.js +17 -0
  69. package/multi-select/multi-select.d.ts +14 -0
  70. package/multi-select/multi-select.js +38 -0
  71. package/multi-select/multi-select.stories.d.ts +8 -0
  72. package/multi-select/multi-select.stories.js +41 -0
  73. package/number-input/number-input.d.ts +10 -3
  74. package/number-input/number-input.js +12 -3
  75. package/number-input/number-input.stories.d.ts +2 -2
  76. package/number-input/number-input.stories.js +2 -2
  77. package/package.json +6 -6
  78. package/radio-group/radio-group.d.ts +11 -4
  79. package/radio-group/radio-group.js +12 -3
  80. package/radio-group/radio-group.stories.d.ts +2 -2
  81. package/radio-group/radio-group.stories.js +2 -2
  82. package/select/select.d.ts +11 -4
  83. package/select/select.js +12 -3
  84. package/select/select.stories.d.ts +2 -2
  85. package/select/select.stories.js +10 -3
  86. package/storybook/form-data-printer.d.ts +2 -2
  87. package/storybook/storybook-form.d.ts +7 -0
  88. package/storybook/{form.js → storybook-form.js} +7 -6
  89. package/text-input/text-input.d.ts +11 -4
  90. package/text-input/text-input.js +14 -5
  91. package/text-input/text-input.stories.d.ts +2 -2
  92. package/text-input/text-input.stories.js +7 -7
  93. package/textarea/textarea.d.ts +10 -3
  94. package/textarea/textarea.js +12 -3
  95. package/textarea/textarea.stories.d.ts +2 -2
  96. package/textarea/textarea.stories.js +2 -2
  97. package/time-picker-input/time-picker-input.d.ts +8 -3
  98. package/time-picker-input/time-picker-input.js +51 -3
  99. package/time-picker-input/time-picker-input.stories.d.ts +2 -2
  100. package/time-picker-input/time-picker-input.stories.js +7 -3
  101. package/toggle/toggle.d.ts +11 -3
  102. package/toggle/toggle.js +12 -3
  103. package/toggle/toggle.stories.d.ts +2 -2
  104. package/toggle/toggle.stories.js +2 -2
  105. package/checkbox/checkbox.d.ts +0 -7
  106. package/checkbox/checkbox.js +0 -29
  107. package/checkbox/checkbox.stories.d.ts +0 -8
  108. package/checkbox/checkbox.stories.js +0 -26
  109. package/checkbox/index.d.ts +0 -1
  110. package/storybook/form.d.ts +0 -7
@@ -1,8 +1,8 @@
1
- /// <reference types="react" />
1
+ import React from "react";
2
2
  import { DatePickerInput } from "./date-picker-input";
3
3
  declare const _default: {
4
4
  title: string;
5
5
  component: typeof DatePickerInput;
6
6
  };
7
7
  export default _default;
8
- export declare function Default(): JSX.Element;
8
+ export declare function Default(): React.JSX.Element;
@@ -6,17 +6,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Default = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const date_picker_input_1 = require("./date-picker-input");
9
- const form_1 = require("../storybook/form");
9
+ const storybook_form_1 = require("../storybook/storybook-form");
10
10
  const button_1 = require("@uxf/ui/button");
11
+ const dayjs_1 = __importDefault(require("dayjs"));
11
12
  exports.default = {
12
13
  title: "Form/DatePickerInput",
13
14
  component: date_picker_input_1.DatePickerInput,
14
15
  };
15
16
  function Default() {
16
17
  const storyFormDatePickers = (control) => (react_1.default.createElement("div", { className: "space-y-4" },
17
- react_1.default.createElement(date_picker_input_1.DatePickerInput, { label: "Default date picker", name: "default", control: control }),
18
+ react_1.default.createElement(date_picker_input_1.DatePickerInput, { control: control, isClearable: true, isRequired: true, label: "Default date picker", name: "default" }),
19
+ react_1.default.createElement(date_picker_input_1.DatePickerInput, { control: control, isClearable: true, isRequired: true, label: "Default date picker with default value", name: "withDefaultValue" }),
20
+ react_1.default.createElement(date_picker_input_1.DatePickerInput, { control: control, isClearable: true, isRequired: true, minDate: "2023-06-10", maxDate: "2023-06-20", label: "Date picker with input validation", name: "withMinMaxValidation", placeholder: "" }),
18
21
  react_1.default.createElement(button_1.Button, { type: "submit" }, "Submit")));
19
- return (react_1.default.createElement(form_1.Form, null, ({ control }) => (react_1.default.createElement("div", { className: "flex flex-col lg:flex-row" },
22
+ return (react_1.default.createElement(storybook_form_1.StorybookForm, { defaultValues: {
23
+ withDefaultValue: (0, dayjs_1.default)().format("YYYY-MM-DD"),
24
+ } }, ({ control }) => (react_1.default.createElement("div", { className: "flex flex-col lg:flex-row" },
20
25
  react_1.default.createElement("div", { className: "light space-y-2 p-20 lg:w-1/2" }, storyFormDatePickers(control)),
21
26
  react_1.default.createElement("div", { className: "dark space-y-2 bg-gray-900 p-20 text-white lg:w-1/2" }, storyFormDatePickers(control))))));
22
27
  }
@@ -0,0 +1,13 @@
1
+ import { DatetimePickerInputProps as UIDatetimePickerInputProps } from "@uxf/ui/datetime-picker-input";
2
+ import React from "react";
3
+ import { FieldValues, UseControllerProps } from "react-hook-form";
4
+ export type DatetimePickerInputProps<FormData extends FieldValues> = UseControllerProps<FormData> & Omit<UIDatetimePickerInputProps, "isInvalid" | "max" | "min" | "pattern" | "step" | "name" | "onChange" | "value"> & {
5
+ onChange?: UIDatetimePickerInputProps["onChange"];
6
+ requiredMessage?: string;
7
+ minDate?: string;
8
+ maxDate?: string;
9
+ };
10
+ export declare function DatetimePickerInput<FormData extends FieldValues>(props: DatetimePickerInputProps<FormData>): React.JSX.Element;
11
+ export declare namespace DatetimePickerInput {
12
+ var displayName: string;
13
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.DatetimePickerInput = void 0;
30
+ const datetime_picker_input_1 = require("@uxf/ui/datetime-picker-input");
31
+ const dayjs_1 = __importStar(require("dayjs"));
32
+ const react_1 = __importDefault(require("react"));
33
+ const react_hook_form_1 = require("react-hook-form");
34
+ const customParseFormat_1 = __importDefault(require("dayjs/plugin/customParseFormat"));
35
+ const form_id_context_1 = require("../form-id-context");
36
+ const datetime_picker_1 = require("@uxf/ui/datetime-picker");
37
+ const date_picker_input_1 = require("@uxf/ui/date-picker-input");
38
+ (0, dayjs_1.extend)(customParseFormat_1.default);
39
+ function DatetimePickerInput(props) {
40
+ var _a, _b, _c, _d, _e, _f, _g;
41
+ const formId = (0, form_id_context_1.useFormIdContext)();
42
+ const id = (_a = props.id) !== null && _a !== void 0 ? _a : `${formId}__${props.name}`;
43
+ const { field, fieldState } = (0, react_hook_form_1.useController)({
44
+ control: props.control,
45
+ defaultValue: props.defaultValue,
46
+ name: props.name,
47
+ rules: {
48
+ required: props.isRequired ? props.requiredMessage || "Toto pole je povinné" : undefined,
49
+ ...((_b = props.rules) !== null && _b !== void 0 ? _b : {}),
50
+ validate: {
51
+ validDate: (value) => {
52
+ if (!value) {
53
+ return;
54
+ }
55
+ if (!(0, datetime_picker_1.getStrictParsedDatetime)(value).isValid()) {
56
+ return `Datum a čas musí být ve formátu ${datetime_picker_input_1.DISPLAY_DATETIME_FORMAT}.`;
57
+ }
58
+ },
59
+ validDateRange: (value) => {
60
+ if (!value) {
61
+ return;
62
+ }
63
+ if (props.minDate && (0, dayjs_1.default)(value, date_picker_input_1.OUTPUT_DATE_FORMAT, true).isBefore(props.minDate, "date")) {
64
+ return `Minimální datum, který je možné zadat, je: ${(0, dayjs_1.default)(props.minDate).format(date_picker_input_1.DISPLAY_DATE_FORMAT)}`;
65
+ }
66
+ if (props.maxDate && (0, dayjs_1.default)(value, date_picker_input_1.OUTPUT_DATE_FORMAT, true).isAfter(props.maxDate, "date")) {
67
+ return `Maximální datum, který je možné zadat, je: ${(0, dayjs_1.default)(props.maxDate).format(date_picker_input_1.DISPLAY_DATE_FORMAT)}`;
68
+ }
69
+ },
70
+ ...(typeof ((_c = props.rules) === null || _c === void 0 ? void 0 : _c.validate) === "function"
71
+ ? { custom: props.rules.validate }
72
+ : (_e = (_d = props.rules) === null || _d === void 0 ? void 0 : _d.validate) !== null && _e !== void 0 ? _e : {}),
73
+ },
74
+ },
75
+ shouldUnregister: props.shouldUnregister,
76
+ });
77
+ const onBlur = (event) => {
78
+ var _a;
79
+ field.onBlur();
80
+ (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, event);
81
+ };
82
+ const onChange = (value, event) => {
83
+ var _a;
84
+ field.onChange(value);
85
+ (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, value, event);
86
+ };
87
+ return (react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { minDate: props.minDate, maxDate: props.maxDate, className: props.className, form: props.form, helperText: (_g = (_f = fieldState.error) === null || _f === void 0 ? void 0 : _f.message) !== null && _g !== void 0 ? _g : props.helperText, hiddenLabel: props.hiddenLabel, id: id, isClearable: props.isClearable, isDisabled: props.isDisabled, isInvalid: !!fieldState.error, isReadOnly: props.isReadOnly, isRequired: props.isRequired, label: props.label, leftAddon: props.leftAddon, leftElement: props.leftElement, name: field.name, onBlur: onBlur, onChange: onChange, onFocus: props.onFocus, placeholder: props.placeholder, popoverPlacement: props.popoverPlacement, popoverStrategy: props.popoverStrategy, ref: field.ref, rightAddon: props.rightAddon, rightElement: props.rightElement, size: props.size, triggerElement: props.triggerElement, value: field.value, variant: props.variant }));
88
+ }
89
+ exports.DatetimePickerInput = DatetimePickerInput;
90
+ DatetimePickerInput.displayName = "UxfFormDatePickerInput";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { DatetimePickerInput } from "./datetime-picker-input";
3
+ declare const _default: {
4
+ title: string;
5
+ component: typeof DatetimePickerInput;
6
+ };
7
+ export default _default;
8
+ export declare function Default(): React.JSX.Element;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Default = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const datetime_picker_input_1 = require("./datetime-picker-input");
9
+ const storybook_form_1 = require("../storybook/storybook-form");
10
+ const button_1 = require("@uxf/ui/button");
11
+ const dayjs_1 = __importDefault(require("dayjs"));
12
+ exports.default = {
13
+ title: "Form/DatetimePickerInput",
14
+ component: datetime_picker_input_1.DatetimePickerInput,
15
+ };
16
+ function Default() {
17
+ const storyFormDatePickers = (control) => (react_1.default.createElement("div", { className: "space-y-4" },
18
+ react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { control: control, isClearable: true, isRequired: true, label: "Default datetime picker", name: "default" }),
19
+ react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { control: control, isClearable: true, isRequired: true, label: "Default datetime picker with default value", name: "withDefaultValue" }),
20
+ react_1.default.createElement(datetime_picker_input_1.DatetimePickerInput, { control: control, isClearable: true, isRequired: true, minDate: "2023-06-10", maxDate: "2023-06-20", label: "Date time picker with input validation", name: "withMinMaxValidation", placeholder: "" }),
21
+ react_1.default.createElement(button_1.Button, { type: "submit" }, "Submit")));
22
+ return (react_1.default.createElement(storybook_form_1.StorybookForm, { defaultValues: {
23
+ withDefaultValue: (0, dayjs_1.default)().toISOString(),
24
+ } }, ({ control }) => (react_1.default.createElement("div", { className: "flex flex-col lg:flex-row" },
25
+ react_1.default.createElement("div", { className: "light space-y-2 p-20 lg:w-1/2" }, storyFormDatePickers(control)),
26
+ react_1.default.createElement("div", { className: "dark space-y-2 bg-gray-900 p-20 text-white lg:w-1/2" }, storyFormDatePickers(control))))));
27
+ }
28
+ exports.Default = Default;
@@ -0,0 +1 @@
1
+ export * from "./datetime-picker-input";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./datetime-picker-input"), exports);
@@ -0,0 +1,16 @@
1
+ import { DropzoneInputProps as UIDropzoneProps } from "@uxf/ui/dropzone";
2
+ import { DropzoneFile } from "@uxf/ui/dropzone/types";
3
+ import React from "react";
4
+ import { FieldValues, UseControllerProps } from "react-hook-form";
5
+ import { FormControlProps } from "@uxf/ui/types";
6
+ type OnChangeHandler = FormControlProps<DropzoneFile[] | undefined>["onChange"];
7
+ export type DropzoneProps<FormData extends FieldValues> = UseControllerProps<FormData> & Omit<UIDropzoneProps, "onChange" | "value"> & {
8
+ minFilesCount?: number;
9
+ onChange?: OnChangeHandler;
10
+ requiredMessage?: string;
11
+ };
12
+ export declare function DropzoneInput<FormData extends FieldValues>(props: DropzoneProps<FormData>): React.JSX.Element;
13
+ export declare namespace DropzoneInput {
14
+ var displayName: string;
15
+ }
16
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DropzoneInput = void 0;
7
+ const dropzone_1 = require("@uxf/ui/dropzone");
8
+ const react_1 = __importDefault(require("react"));
9
+ const react_hook_form_1 = require("react-hook-form");
10
+ const form_id_context_1 = require("../form-id-context");
11
+ function DropzoneInput(props) {
12
+ var _a, _b, _c, _d;
13
+ const formId = (0, form_id_context_1.useFormIdContext)();
14
+ const id = (_a = props.id) !== null && _a !== void 0 ? _a : `${formId}__${props.name}`;
15
+ const { field, fieldState } = (0, react_hook_form_1.useController)({
16
+ control: props.control,
17
+ defaultValue: props.defaultValue,
18
+ name: props.name,
19
+ rules: {
20
+ ...((_b = props.rules) !== null && _b !== void 0 ? _b : {}),
21
+ validate: {
22
+ default: (value) => {
23
+ var _a;
24
+ if (props.isRequired &&
25
+ props.minFilesCount !== 0 &&
26
+ (!value || value.length < ((_a = props.minFilesCount) !== null && _a !== void 0 ? _a : 1))) {
27
+ return props.requiredMessage || "Toto pole je povinné";
28
+ }
29
+ if (props.maxFilesCount && value && value.length > props.maxFilesCount) {
30
+ return `Maximální počet souborů je ${props.maxFilesCount}`;
31
+ }
32
+ if (props.minFilesCount && value && value.length < props.minFilesCount) {
33
+ return `Minimální počet souborů je ${props.minFilesCount}`;
34
+ }
35
+ // TODO – validate this only on submit
36
+ // if (value?.some((file) => file.id < 0)) {
37
+ // return "Nahrávání souborů ještě nebylo dokončeno";
38
+ // }
39
+ return true;
40
+ },
41
+ ...(((_c = props.rules) === null || _c === void 0 ? void 0 : _c.validate)
42
+ ? typeof props.rules.validate === "function"
43
+ ? { custom: props.rules.validate }
44
+ : props.rules.validate
45
+ : {}),
46
+ },
47
+ },
48
+ shouldUnregister: props.shouldUnregister,
49
+ });
50
+ const onChange = (value, event) => {
51
+ var _a;
52
+ field.onChange(value);
53
+ (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, value, event);
54
+ };
55
+ return (react_1.default.createElement(dropzone_1.Dropzone, { helperText: ((_d = fieldState.error) === null || _d === void 0 ? void 0 : _d.message) || props.helperText, id: id, isDisabled: props.isDisabled, isInvalid: !!fieldState.error, isRequired: props.isRequired, label: props.label, maxFileSize: props.maxFileSize, maxFilesCount: props.maxFilesCount, minFileSize: props.minFileSize, noClick: props.noClick, noDrag: props.noDrag, onChange: onChange, onUploadError: props.onUploadError, onUploadFile: props.onUploadFile, ref: field.ref, value: field.value }));
56
+ }
57
+ exports.DropzoneInput = DropzoneInput;
58
+ DropzoneInput.displayName = "UxfFormDropzoneInput";
@@ -0,0 +1,14 @@
1
+ import { DropzoneListProps as UIDropzoneListProps } from "@uxf/ui/dropzone";
2
+ import React from "react";
3
+ import { FieldValues, UseControllerProps } from "react-hook-form";
4
+ import { FormControlProps } from "@uxf/ui/types";
5
+ import { DropzoneFile } from "@uxf/ui/dropzone/types";
6
+ type OnChangeHandler = FormControlProps<DropzoneFile[] | undefined>["onChange"];
7
+ export interface DropzoneListProps<FormData extends FieldValues> extends Pick<UseControllerProps<FormData>, "control" | "name">, Pick<UIDropzoneListProps, "errorText" | "onAbortWarning" | "onRemoveWarning" | "renderItem"> {
8
+ onChange?: OnChangeHandler;
9
+ }
10
+ export declare function DropzoneList<FormData extends FieldValues>(props: DropzoneListProps<FormData>): React.JSX.Element;
11
+ export declare namespace DropzoneList {
12
+ var displayName: string;
13
+ }
14
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DropzoneList = void 0;
7
+ const dropzone_1 = require("@uxf/ui/dropzone");
8
+ const react_1 = __importDefault(require("react"));
9
+ const react_hook_form_1 = require("react-hook-form");
10
+ function DropzoneList(props) {
11
+ const { field } = (0, react_hook_form_1.useController)({
12
+ control: props.control,
13
+ name: props.name,
14
+ });
15
+ const onChange = (value, event) => {
16
+ var _a;
17
+ field.onChange(value);
18
+ (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, value, event);
19
+ };
20
+ return (react_1.default.createElement(dropzone_1.Dropzone.List, { errorText: props.errorText, onAbortWarning: props.onAbortWarning, onChange: onChange, onRemoveWarning: props.onRemoveWarning, renderItem: props.renderItem, value: field.value }));
21
+ }
22
+ exports.DropzoneList = DropzoneList;
23
+ DropzoneList.displayName = "UxfFormDropzoneList";
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ declare const _default: {
3
+ title: string;
4
+ component: typeof import("./dropzone-input").DropzoneInput & {
5
+ List: typeof import("./dropzone-list").DropzoneList;
6
+ };
7
+ };
8
+ export default _default;
9
+ export declare function Default(): React.JSX.Element;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Default = void 0;
7
+ const button_1 = require("@uxf/ui/button");
8
+ const uploadFIle_mock_1 = require("@uxf/ui/utils/mocks/uploadFIle.mock");
9
+ const react_1 = __importDefault(require("react"));
10
+ const storybook_form_1 = require("../storybook/storybook-form");
11
+ const index_1 = require("./index");
12
+ exports.default = {
13
+ title: "Form/Dropzone",
14
+ component: index_1.Dropzone,
15
+ };
16
+ const DUMMY_FILES = [
17
+ {
18
+ id: 1,
19
+ uuid: "1",
20
+ name: "file1",
21
+ extension: "jpg",
22
+ progress: null,
23
+ },
24
+ {
25
+ id: 2,
26
+ uuid: "2",
27
+ name: "file2",
28
+ extension: "pdf",
29
+ progress: null,
30
+ },
31
+ ];
32
+ function Default() {
33
+ const storyFormDropzone = (control) => (react_1.default.createElement("div", { className: "space-y-8" },
34
+ react_1.default.createElement(index_1.Dropzone, { control: control, helperText: "Allow multiple files", isRequired: true, label: "Use drag and drop or click to upload", name: "dropzone", onUploadFile: uploadFIle_mock_1.uploadFile }),
35
+ react_1.default.createElement(button_1.Button, { type: "submit" }, "Submit"),
36
+ react_1.default.createElement(index_1.Dropzone.List, { control: control, errorText: "Oops, n\u011Bco se pokazilo", name: "dropzone", onAbortWarning: "Opravdu chcete zru\u0161it nahr\u00E1v\u00E1n\u00ED?", onRemoveWarning: "Opravdu chcete smazat soubor?" })));
37
+ return (react_1.default.createElement(storybook_form_1.StorybookForm, { defaultValues: { dropzone: DUMMY_FILES } }, ({ control }) => (react_1.default.createElement(react_1.default.Fragment, null,
38
+ react_1.default.createElement("div", { className: "flex flex-col lg:flex-row" },
39
+ react_1.default.createElement("div", { className: "light space-y-2 p-20 lg:w-1/2" }, storyFormDropzone(control)),
40
+ react_1.default.createElement("div", { className: "dark space-y-2 bg-gray-900 p-20 lg:w-1/2" }, storyFormDropzone(control)))))));
41
+ }
42
+ exports.Default = Default;
@@ -0,0 +1,7 @@
1
+ import { DropzoneInput } from "./dropzone-input";
2
+ import { DropzoneList } from "./dropzone-list";
3
+ export { DropzoneProps } from "./dropzone-input";
4
+ export { DropzoneListProps } from "./dropzone-list";
5
+ export declare const Dropzone: typeof DropzoneInput & {
6
+ List: typeof DropzoneList;
7
+ };
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Dropzone = void 0;
4
+ const dropzone_input_1 = require("./dropzone-input");
5
+ const dropzone_list_1 = require("./dropzone-list");
6
+ exports.Dropzone = Object.assign(dropzone_input_1.DropzoneInput, { List: dropzone_list_1.DropzoneList });
@@ -0,0 +1,14 @@
1
+ import { FileInputProps as UIFileInputProps } from "@uxf/ui/file-input";
2
+ import React from "react";
3
+ import { FieldValues, UseControllerProps } from "react-hook-form";
4
+ import { FileResponse, FormControlProps } from "@uxf/ui/types";
5
+ type OnChangeHandler = FormControlProps<FileResponse | null>["onChange"];
6
+ export type FileInputProps<FormData extends FieldValues> = UseControllerProps<FormData> & Omit<UIFileInputProps, "isInvalid" | "onChange" | "value"> & {
7
+ onChange?: OnChangeHandler;
8
+ requiredMessage?: string;
9
+ };
10
+ export declare function FileInput<FormData extends FieldValues>(props: FileInputProps<FormData>): React.JSX.Element;
11
+ export declare namespace FileInput {
12
+ var displayName: string;
13
+ }
14
+ export {};
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FileInput = void 0;
7
+ const file_input_1 = require("@uxf/ui/file-input");
8
+ const react_1 = __importDefault(require("react"));
9
+ const react_hook_form_1 = require("react-hook-form");
10
+ const form_id_context_1 = require("../form-id-context");
11
+ function FileInput(props) {
12
+ var _a, _b, _c, _d;
13
+ const formId = (0, form_id_context_1.useFormIdContext)();
14
+ const id = (_a = props.id) !== null && _a !== void 0 ? _a : `${formId}__${props.name}`;
15
+ const { field, fieldState } = (0, react_hook_form_1.useController)({
16
+ control: props.control,
17
+ defaultValue: props.defaultValue,
18
+ name: props.name,
19
+ rules: {
20
+ required: props.isRequired ? props.requiredMessage || "Toto pole je povinné" : undefined,
21
+ ...((_b = props.rules) !== null && _b !== void 0 ? _b : {}),
22
+ },
23
+ shouldUnregister: props.shouldUnregister,
24
+ });
25
+ const onBlur = (event) => {
26
+ var _a;
27
+ field.onBlur();
28
+ (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, event);
29
+ };
30
+ const onChange = (value, event) => {
31
+ var _a;
32
+ field.onChange(value);
33
+ (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, value, event);
34
+ };
35
+ return (react_1.default.createElement(file_input_1.FileInput, { accept: props.accept, className: props.className, form: props.form, helperText: (_d = (_c = fieldState.error) === null || _c === void 0 ? void 0 : _c.message) !== null && _d !== void 0 ? _d : props.helperText, id: id, isClearable: props.isClearable, isDisabled: props.isDisabled, isInvalid: !!fieldState.error, isReadOnly: props.isReadOnly, isRequired: props.isRequired, label: props.label, name: field.name, onBlur: onBlur, onChange: onChange, onFocus: props.onFocus, onUploadError: props.onUploadError, onUploadFile: props.onUploadFile, ref: field.ref, size: props.size, value: field.value, variant: props.variant }));
36
+ }
37
+ exports.FileInput = FileInput;
38
+ FileInput.displayName = "FileInput";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { FileInput } from "./file-input";
3
+ declare const _default: {
4
+ title: string;
5
+ component: typeof FileInput;
6
+ };
7
+ export default _default;
8
+ export declare function Default(): React.JSX.Element;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Default = void 0;
7
+ const button_1 = require("@uxf/ui/button");
8
+ const uploadFIle_mock_1 = require("@uxf/ui/utils/mocks/uploadFIle.mock");
9
+ const react_1 = __importDefault(require("react"));
10
+ const storybook_form_1 = require("../storybook/storybook-form");
11
+ const file_input_1 = require("./file-input");
12
+ exports.default = {
13
+ title: "Form/FileInput",
14
+ component: file_input_1.FileInput,
15
+ };
16
+ const DUMMY_FILE = {
17
+ id: 1,
18
+ uuid: "1",
19
+ name: "file1",
20
+ extension: "jpg",
21
+ };
22
+ function Default() {
23
+ const storyFormFileInputs = (control, mode) => (react_1.default.createElement("div", { className: "space-y-4" },
24
+ react_1.default.createElement(file_input_1.FileInput, { control: control, label: "Default file input", name: `default-${mode}`, onUploadFile: uploadFIle_mock_1.uploadFile, isClearable: true }),
25
+ react_1.default.createElement(file_input_1.FileInput, { control: control, id: `required-${mode}`, isRequired: true, label: "Required file input", name: `required-${mode}`, onUploadFile: uploadFIle_mock_1.uploadFile }),
26
+ react_1.default.createElement(button_1.Button, { type: "submit" }, "Submit")));
27
+ return (react_1.default.createElement(storybook_form_1.StorybookForm, { defaultValues: { "default-light": DUMMY_FILE } }, ({ control }) => (react_1.default.createElement("div", { className: "flex flex-col lg:flex-row" },
28
+ react_1.default.createElement("div", { className: "light space-y-2 p-20 lg:w-1/2" }, storyFormFileInputs(control, "light")),
29
+ react_1.default.createElement("div", { className: "dark space-y-2 bg-gray-900 p-20 lg:w-1/2" }, storyFormFileInputs(control, "dark"))))));
30
+ }
31
+ exports.Default = Default;
@@ -0,0 +1 @@
1
+ export * from "./file-input";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./file-input"), exports);
package/form/form.d.ts CHANGED
@@ -1,13 +1,15 @@
1
- import { ReactNode } from "react";
2
- import { Control, DefaultValues, FieldValues, UseFormReset, UseFormReturn, ValidationMode } from "react-hook-form";
3
- export declare type FormSubmitHandler<TFieldValues extends FieldValues> = (values: TFieldValues, reset: UseFormReset<TFieldValues>) => Promise<unknown>;
4
- export declare type FormControl<TFieldValues extends FieldValues> = Control<TFieldValues> & {
5
- formId: string;
1
+ import React, { ReactNode, Ref } from "react";
2
+ import { FieldValues, SubmitHandler, UseFormReturn } from "react-hook-form";
3
+ export type FormProps<TFieldValues extends FieldValues> = {
4
+ children: ReactNode;
5
+ className?: string;
6
+ formApi: UseFormReturn<TFieldValues>;
7
+ forwardRef?: Ref<HTMLFormElement> | undefined;
8
+ id: string;
9
+ omitSubmitInput?: boolean;
10
+ onSubmit: SubmitHandler<TFieldValues>;
6
11
  };
7
- export interface FormProps<TFieldValues extends FieldValues> {
8
- children: (control: FormControl<TFieldValues>, formApi: UseFormReturn<TFieldValues>) => ReactNode;
9
- defaultValues?: DefaultValues<TFieldValues>;
10
- mode?: keyof ValidationMode;
11
- onSubmit?: FormSubmitHandler<TFieldValues>;
12
+ export declare function Form<TFieldValues extends FieldValues = FieldValues>(props: FormProps<TFieldValues>): React.JSX.Element;
13
+ export declare namespace Form {
14
+ var displayName: string;
12
15
  }
13
- export declare function Form<TFieldValues extends FieldValues>(props: FormProps<TFieldValues>): JSX.Element;
package/form/form.js CHANGED
@@ -1,47 +1,19 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
4
  };
25
5
  Object.defineProperty(exports, "__esModule", { value: true });
26
6
  exports.Form = void 0;
27
7
  const sr_only_1 = require("@uxf/styles/mixins/sr-only");
28
- const react_1 = __importStar(require("react"));
8
+ const react_1 = __importDefault(require("react"));
29
9
  const react_hook_form_1 = require("react-hook-form");
10
+ const form_id_context_1 = require("../form-id-context");
30
11
  function Form(props) {
31
- var _a;
32
- const formId = (0, react_1.useId)();
33
- const formApi = (0, react_hook_form_1.useForm)({
34
- mode: (_a = props.mode) !== null && _a !== void 0 ? _a : "onSubmit",
35
- defaultValues: props.defaultValues,
36
- });
37
- const onSubmit = async (values) => {
38
- if (props.onSubmit) {
39
- await props.onSubmit(values, formApi.reset);
40
- }
41
- };
42
- const control = (0, react_1.useMemo)(() => Object.assign(formApi.control, { formId }), [formApi.control, formId]);
43
- return (react_1.default.createElement("form", { id: formId, noValidate: true, onSubmit: formApi.handleSubmit(onSubmit) },
44
- props.children(control, formApi),
45
- props.onSubmit && react_1.default.createElement("input", { style: sr_only_1.srOnly, type: "submit" })));
12
+ return (react_1.default.createElement(form_id_context_1.FormIdContextProvider, { value: props.id },
13
+ react_1.default.createElement(react_hook_form_1.FormProvider, { ...props.formApi },
14
+ react_1.default.createElement("form", { className: props.className, id: props.id, noValidate: true, onSubmit: props.formApi.handleSubmit(props.onSubmit), ref: props.forwardRef },
15
+ props.children,
16
+ !props.omitSubmitInput && react_1.default.createElement("input", { style: sr_only_1.srOnly, type: "submit" })))));
46
17
  }
47
18
  exports.Form = Form;
19
+ Form.displayName = "UxfForm";
@@ -1,8 +1,8 @@
1
- /// <reference types="react" />
1
+ import React from "react";
2
2
  import { Form } from "./form";
3
3
  declare const _default: {
4
4
  title: string;
5
5
  component: typeof Form;
6
6
  };
7
7
  export default _default;
8
- export declare function Default(): JSX.Element;
8
+ export declare function Default(): React.JSX.Element;