@uxf/form 11.46.0 → 11.47.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.
- package/components.d.ts +5 -0
- package/components.js +5 -0
- package/money-input/README.md +7 -0
- package/money-input/index.d.ts +1 -0
- package/money-input/index.js +17 -0
- package/money-input/money-input.d.ts +16 -0
- package/money-input/money-input.js +82 -0
- package/money-input/money-input.stories.d.ts +2 -0
- package/money-input/money-input.stories.js +15 -0
- package/package.json +2 -2
- package/readmes.d.ts +1 -0
- package/readmes.js +22 -20
package/components.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import * as dropzoneStories from "./dropzone/dropzone.stories";
|
|
|
10
10
|
import * as fileInputStories from "./file-input/file-input.stories";
|
|
11
11
|
import * as formStories from "./form/form.stories";
|
|
12
12
|
import * as gpsInputStories from "./gps-input/gps-input.stories";
|
|
13
|
+
import * as moneyInputStories from "./money-input/money-input.stories";
|
|
13
14
|
import * as multiComboboxStories from "./multi-combobox/multi-combobox.stories";
|
|
14
15
|
import * as multiSelectStories from "./multi-select/multi-select.stories";
|
|
15
16
|
import * as numberInputStories from "./number-input/number-input.stories";
|
|
@@ -69,6 +70,10 @@ export declare const components: {
|
|
|
69
70
|
readonly title: "GpsInput";
|
|
70
71
|
readonly stories: typeof gpsInputStories;
|
|
71
72
|
};
|
|
73
|
+
readonly "money-input": {
|
|
74
|
+
readonly title: "MoneyInput";
|
|
75
|
+
readonly stories: typeof moneyInputStories;
|
|
76
|
+
};
|
|
72
77
|
readonly "multi-combobox": {
|
|
73
78
|
readonly title: "MultiCombobox";
|
|
74
79
|
readonly stories: typeof multiComboboxStories;
|
package/components.js
CHANGED
|
@@ -37,6 +37,7 @@ const dropzoneStories = __importStar(require("./dropzone/dropzone.stories"));
|
|
|
37
37
|
const fileInputStories = __importStar(require("./file-input/file-input.stories"));
|
|
38
38
|
const formStories = __importStar(require("./form/form.stories"));
|
|
39
39
|
const gpsInputStories = __importStar(require("./gps-input/gps-input.stories"));
|
|
40
|
+
const moneyInputStories = __importStar(require("./money-input/money-input.stories"));
|
|
40
41
|
const multiComboboxStories = __importStar(require("./multi-combobox/multi-combobox.stories"));
|
|
41
42
|
const multiSelectStories = __importStar(require("./multi-select/multi-select.stories"));
|
|
42
43
|
const numberInputStories = __importStar(require("./number-input/number-input.stories"));
|
|
@@ -96,6 +97,10 @@ exports.components = {
|
|
|
96
97
|
title: "GpsInput",
|
|
97
98
|
stories: gpsInputStories
|
|
98
99
|
},
|
|
100
|
+
"money-input": {
|
|
101
|
+
title: "MoneyInput",
|
|
102
|
+
stories: moneyInputStories
|
|
103
|
+
},
|
|
99
104
|
"multi-combobox": {
|
|
100
105
|
title: "MultiCombobox",
|
|
101
106
|
stories: multiComboboxStories
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./money-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("./money-input"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Currency, Money } from "@uxf/core/money";
|
|
2
|
+
import { FormControlProps } from "@uxf/ui/types";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { FieldValues, UseControllerProps } from "react-hook-form";
|
|
5
|
+
export type MoneyInputValue = Money | null;
|
|
6
|
+
export type MoneyInputProps<FormData extends FieldValues> = Omit<UseControllerProps<FormData>, "defaultValue"> & Omit<FormControlProps<MoneyInputValue>, "value" | "onChange"> & {
|
|
7
|
+
id?: string;
|
|
8
|
+
requiredMessage?: string;
|
|
9
|
+
defaultCurrency?: Currency;
|
|
10
|
+
label?: string;
|
|
11
|
+
onChange?: FormControlProps<MoneyInputValue>["onChange"];
|
|
12
|
+
};
|
|
13
|
+
export declare function MoneyInput<FormData extends FieldValues>(props: MoneyInputProps<FormData>): React.JSX.Element;
|
|
14
|
+
export declare namespace MoneyInput {
|
|
15
|
+
var displayName: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.MoneyInput = MoneyInput;
|
|
27
|
+
const currencies_1 = require("@uxf/core/money/currencies");
|
|
28
|
+
const is_empty_1 = require("@uxf/core/utils/is-empty");
|
|
29
|
+
const is_nil_1 = require("@uxf/core/utils/is-nil");
|
|
30
|
+
const is_not_nil_1 = require("@uxf/core/utils/is-not-nil");
|
|
31
|
+
const form_id_context_1 = require("@uxf/form/form-id-context");
|
|
32
|
+
const text_input_1 = require("@uxf/ui/text-input");
|
|
33
|
+
const react_1 = __importStar(require("react"));
|
|
34
|
+
const react_hook_form_1 = require("react-hook-form");
|
|
35
|
+
const SPECIAL_KEYS = ["Backspace", "Delete", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Tab"];
|
|
36
|
+
// Allow keys for copy/paste/select/cut
|
|
37
|
+
const CONTROL_KEYS = ["v", "V", "c", "C", "x", "X", "a", "A"];
|
|
38
|
+
// Allow digits and decimal point (.,)
|
|
39
|
+
const ALLOWED_KEYS = /[0-9+\-.,]/;
|
|
40
|
+
function MoneyInput(props) {
|
|
41
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
42
|
+
const formId = (0, form_id_context_1.useFormIdContext)();
|
|
43
|
+
const id = (_a = props.id) !== null && _a !== void 0 ? _a : `${formId}__${props.name}`;
|
|
44
|
+
const { field, fieldState } = (0, react_hook_form_1.useController)({
|
|
45
|
+
control: props.control,
|
|
46
|
+
name: props.name,
|
|
47
|
+
rules: {
|
|
48
|
+
required: props.isRequired ? props.requiredMessage || "Toto pole je povinné" : undefined,
|
|
49
|
+
},
|
|
50
|
+
shouldUnregister: props.shouldUnregister,
|
|
51
|
+
});
|
|
52
|
+
const [lastCurrency, setLastCurrency] = (0, react_1.useState)((_d = (_c = (_b = field.value) === null || _b === void 0 ? void 0 : _b.currency) !== null && _c !== void 0 ? _c : props.defaultCurrency) !== null && _d !== void 0 ? _d : "CZK");
|
|
53
|
+
(0, react_1.useEffect)(() => {
|
|
54
|
+
var _a;
|
|
55
|
+
if ((0, is_not_nil_1.isNotNil)(field.value) && ((_a = field.value) === null || _a === void 0 ? void 0 : _a.currency) !== lastCurrency) {
|
|
56
|
+
setLastCurrency(field.value.currency);
|
|
57
|
+
}
|
|
58
|
+
}, [field.value, lastCurrency]);
|
|
59
|
+
const keyDownHandler = (event) => {
|
|
60
|
+
const key = event.key;
|
|
61
|
+
// Check if the key is allowed
|
|
62
|
+
if (!SPECIAL_KEYS.includes(key) && !ALLOWED_KEYS.test(key)) {
|
|
63
|
+
// Check if Ctrl or Command key is pressed along with control key
|
|
64
|
+
if (!(event.ctrlKey || event.metaKey) || !CONTROL_KEYS.includes(key)) {
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const changeHandler = (value, event) => {
|
|
70
|
+
var _a, _b, _c;
|
|
71
|
+
const newValue = (0, is_nil_1.isNil)(value) || (0, is_empty_1.isEmpty)(value)
|
|
72
|
+
? null
|
|
73
|
+
: {
|
|
74
|
+
amount: value,
|
|
75
|
+
currency: (_b = (_a = field.value) === null || _a === void 0 ? void 0 : _a.currency) !== null && _b !== void 0 ? _b : lastCurrency,
|
|
76
|
+
};
|
|
77
|
+
field.onChange(newValue);
|
|
78
|
+
(_c = props.onChange) === null || _c === void 0 ? void 0 : _c.call(props, newValue, event);
|
|
79
|
+
};
|
|
80
|
+
return (react_1.default.createElement(text_input_1.TextInput, { className: "uxf-money-input uxf-input--no-spin-buttons", helperText: (_e = fieldState.error) === null || _e === void 0 ? void 0 : _e.message, id: id, inputMode: "decimal", isDisabled: props.isDisabled, isInvalid: Boolean(fieldState.error), isReadOnly: props.isReadOnly, isRequired: props.isRequired, label: props.label, name: field.name, onChange: changeHandler, onKeyDown: keyDownHandler, ref: field.ref, rightElement: currencies_1.currencies[(_g = (_f = field.value) === null || _f === void 0 ? void 0 : _f.currency) !== null && _g !== void 0 ? _g : lastCurrency].symbol, step: 2, type: "number", value: (_j = (_h = field.value) === null || _h === void 0 ? void 0 : _h.amount) !== null && _j !== void 0 ? _j : "" }));
|
|
81
|
+
}
|
|
82
|
+
MoneyInput.displayName = "UxfFormMoneyInput";
|
|
@@ -0,0 +1,15 @@
|
|
|
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 = Default;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const storybook_form_1 = require("../storybook/storybook-form");
|
|
9
|
+
const money_input_1 = require("./money-input");
|
|
10
|
+
function Default() {
|
|
11
|
+
return (react_1.default.createElement(storybook_form_1.StorybookForm, { className: "space-y-4 p-4", defaultValues: { "default-value": { amount: "100", currency: "USD" } } }, ({ control }) => (react_1.default.createElement(react_1.default.Fragment, null,
|
|
12
|
+
react_1.default.createElement(money_input_1.MoneyInput, { control: control, label: "Default money input", name: "default" }),
|
|
13
|
+
react_1.default.createElement(money_input_1.MoneyInput, { control: control, defaultCurrency: "EUR", label: "Money input with default currency", name: "default-currency" }),
|
|
14
|
+
react_1.default.createElement(money_input_1.MoneyInput, { control: control, label: "Money input with default value", name: "default-value" })))));
|
|
15
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uxf/form",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.47.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@uxf/ui": "11.
|
|
18
|
+
"@uxf/ui": "11.47.1",
|
|
19
19
|
"coordinate-parser": "1.0.7",
|
|
20
20
|
"dayjs": "1.11.13",
|
|
21
21
|
"react-hook-form": "7.53.0"
|
package/readmes.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export declare const readmes: {
|
|
|
12
12
|
readonly "file-input": typeof avatarFileInputReadme;
|
|
13
13
|
readonly form: typeof avatarFileInputReadme;
|
|
14
14
|
readonly "gps-input": typeof avatarFileInputReadme;
|
|
15
|
+
readonly "money-input": typeof avatarFileInputReadme;
|
|
15
16
|
readonly "multi-combobox": typeof avatarFileInputReadme;
|
|
16
17
|
readonly "multi-select": typeof avatarFileInputReadme;
|
|
17
18
|
readonly "number-input": typeof avatarFileInputReadme;
|
package/readmes.js
CHANGED
|
@@ -17,16 +17,17 @@ const README_md_9 = __importDefault(require("./dropzone/README.md"));
|
|
|
17
17
|
const README_md_10 = __importDefault(require("./file-input/README.md"));
|
|
18
18
|
const README_md_11 = __importDefault(require("./form/README.md"));
|
|
19
19
|
const README_md_12 = __importDefault(require("./gps-input/README.md"));
|
|
20
|
-
const README_md_13 = __importDefault(require("./
|
|
21
|
-
const README_md_14 = __importDefault(require("./multi-
|
|
22
|
-
const README_md_15 = __importDefault(require("./
|
|
23
|
-
const README_md_16 = __importDefault(require("./
|
|
24
|
-
const README_md_17 = __importDefault(require("./
|
|
25
|
-
const README_md_18 = __importDefault(require("./
|
|
26
|
-
const README_md_19 = __importDefault(require("./
|
|
27
|
-
const README_md_20 = __importDefault(require("./
|
|
28
|
-
const README_md_21 = __importDefault(require("./
|
|
29
|
-
const README_md_22 = __importDefault(require("./
|
|
20
|
+
const README_md_13 = __importDefault(require("./money-input/README.md"));
|
|
21
|
+
const README_md_14 = __importDefault(require("./multi-combobox/README.md"));
|
|
22
|
+
const README_md_15 = __importDefault(require("./multi-select/README.md"));
|
|
23
|
+
const README_md_16 = __importDefault(require("./number-input/README.md"));
|
|
24
|
+
const README_md_17 = __importDefault(require("./password-input/README.md"));
|
|
25
|
+
const README_md_18 = __importDefault(require("./radio-group/README.md"));
|
|
26
|
+
const README_md_19 = __importDefault(require("./select/README.md"));
|
|
27
|
+
const README_md_20 = __importDefault(require("./text-input/README.md"));
|
|
28
|
+
const README_md_21 = __importDefault(require("./textarea/README.md"));
|
|
29
|
+
const README_md_22 = __importDefault(require("./time-picker-input/README.md"));
|
|
30
|
+
const README_md_23 = __importDefault(require("./toggle/README.md"));
|
|
30
31
|
exports.readmes = {
|
|
31
32
|
"avatar-file-input": README_md_1.default,
|
|
32
33
|
"checkbox-button": README_md_2.default,
|
|
@@ -40,14 +41,15 @@ exports.readmes = {
|
|
|
40
41
|
"file-input": README_md_10.default,
|
|
41
42
|
"form": README_md_11.default,
|
|
42
43
|
"gps-input": README_md_12.default,
|
|
43
|
-
"
|
|
44
|
-
"multi-
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
44
|
+
"money-input": README_md_13.default,
|
|
45
|
+
"multi-combobox": README_md_14.default,
|
|
46
|
+
"multi-select": README_md_15.default,
|
|
47
|
+
"number-input": README_md_16.default,
|
|
48
|
+
"password-input": README_md_17.default,
|
|
49
|
+
"radio-group": README_md_18.default,
|
|
50
|
+
"select": README_md_19.default,
|
|
51
|
+
"text-input": README_md_20.default,
|
|
52
|
+
"textarea": README_md_21.default,
|
|
53
|
+
"time-picker-input": README_md_22.default,
|
|
54
|
+
"toggle": README_md_23.default,
|
|
53
55
|
};
|