@plexui/ui 0.7.96 → 0.7.97
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/README.md +1 -1
- package/dist/es/components/DateInput/DateInput.js +73 -0
- package/dist/es/components/DateInput/DateInput.js.map +1 -0
- package/dist/es/components/DateInput/index.js +2 -0
- package/dist/es/components/DateInput/index.js.map +1 -0
- package/dist/types/components/DateInput/DateInput.d.ts +17 -0
- package/dist/types/components/DateInput/index.d.ts +1 -0
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -107,7 +107,7 @@ import { Select, Option } from "@plexui/ui/components/Select";
|
|
|
107
107
|
<details>
|
|
108
108
|
<summary>Full component list</summary>
|
|
109
109
|
|
|
110
|
-
Alert, Avatar, AvatarGroup, Badge, Button, ButtonLink, Checkbox, CodeBlock, CopyTooltip, DatePicker, DateRangePicker, EmptyMessage, FieldError, FloatingLabelInput, Icon, Image, Indicators (LoadingIndicator, LoadingDots, CircularProgress), Input, Markdown, Menu, PlexUIProvider, Popover, ProgressSteps, RadioGroup, SegmentedControl, Select, SelectControl, ShimmerText, Sidebar, Skeleton, Slider, Switch, TagInput, TextLink, Textarea, Tooltip, Transition (Animate, AnimateLayout, AnimateLayoutGroup, TransitionGroup)
|
|
110
|
+
Alert, Avatar, AvatarGroup, Badge, Button, ButtonLink, Checkbox, CodeBlock, CopyTooltip, DateInput, DatePicker, DateRangePicker, EmptyMessage, FieldError, FloatingLabelInput, Icon, Image, Indicators (LoadingIndicator, LoadingDots, CircularProgress), Input, Markdown, Menu, PlexUIProvider, Popover, ProgressSteps, RadioGroup, SegmentedControl, Select, SelectControl, ShimmerText, Sidebar, Skeleton, Slider, Switch, TagInput, TextLink, Textarea, Tooltip, Transition (Animate, AnimateLayout, AnimateLayoutGroup, TransitionGroup)
|
|
111
111
|
|
|
112
112
|
</details>
|
|
113
113
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { maskitoDateOptionsGenerator, maskitoDateTimeOptionsGenerator, maskitoParseDate, maskitoParseDateTime, maskitoStringifyDate, maskitoStringifyDateTime, } from "@maskito/kit";
|
|
4
|
+
import { useMaskito } from "@maskito/react";
|
|
5
|
+
import { DateTime } from "luxon";
|
|
6
|
+
import { useEffect, useMemo, useState } from "react";
|
|
7
|
+
import { mergeRefs } from "react-merge-refs";
|
|
8
|
+
import { Input } from "../Input";
|
|
9
|
+
export const DateInput = (props) => {
|
|
10
|
+
const { value, onChange, mode = "dd/mm/yyyy", separator = ".", timeMode, dateTimeSeparator = ", ", timeStep = 0, min, max, clearable = false, placeholder, ref, ...inputProps } = props;
|
|
11
|
+
const hasTime = !!timeMode;
|
|
12
|
+
const dateParams = useMemo(() => ({
|
|
13
|
+
mode,
|
|
14
|
+
separator,
|
|
15
|
+
...(min ? { min: min.toJSDate() } : undefined),
|
|
16
|
+
...(max ? { max: max.toJSDate() } : undefined),
|
|
17
|
+
}),
|
|
18
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
19
|
+
[mode, separator, min?.toMillis(), max?.toMillis()]);
|
|
20
|
+
const dateTimeParams = useMemo(() => ({
|
|
21
|
+
dateMode: mode,
|
|
22
|
+
dateSeparator: separator,
|
|
23
|
+
timeMode: timeMode ?? "HH:MM",
|
|
24
|
+
dateTimeSeparator,
|
|
25
|
+
...(timeStep ? { timeStep } : undefined),
|
|
26
|
+
...(min ? { min: min.toJSDate() } : undefined),
|
|
27
|
+
...(max ? { max: max.toJSDate() } : undefined),
|
|
28
|
+
}),
|
|
29
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
30
|
+
[mode, separator, timeMode, dateTimeSeparator, timeStep, min?.toMillis(), max?.toMillis()]);
|
|
31
|
+
const maskOptions = useMemo(() => hasTime
|
|
32
|
+
? maskitoDateTimeOptionsGenerator(dateTimeParams)
|
|
33
|
+
: maskitoDateOptionsGenerator(dateParams), [hasTime, dateParams, dateTimeParams]);
|
|
34
|
+
const maskRef = useMaskito({ options: maskOptions });
|
|
35
|
+
const [inputValue, setInputValue] = useState("");
|
|
36
|
+
const valueMsKey = value?.toMillis() ?? null;
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!value) {
|
|
39
|
+
setInputValue("");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setInputValue(hasTime
|
|
43
|
+
? maskitoStringifyDateTime(value.toJSDate(), dateTimeParams)
|
|
44
|
+
: maskitoStringifyDate(value.toJSDate(), dateParams));
|
|
45
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
46
|
+
}, [valueMsKey, hasTime, dateParams, dateTimeParams]);
|
|
47
|
+
const handleInput = (evt) => {
|
|
48
|
+
const str = evt.currentTarget.value;
|
|
49
|
+
setInputValue(str);
|
|
50
|
+
if (!str) {
|
|
51
|
+
onChange(null);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const parsed = hasTime
|
|
55
|
+
? maskitoParseDateTime(str, dateTimeParams)
|
|
56
|
+
: maskitoParseDate(str, dateParams);
|
|
57
|
+
if (parsed) {
|
|
58
|
+
onChange(DateTime.fromJSDate(parsed));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const handleClear = () => {
|
|
62
|
+
setInputValue("");
|
|
63
|
+
onChange(null);
|
|
64
|
+
};
|
|
65
|
+
const defaultPlaceholder = useMemo(() => {
|
|
66
|
+
const datePart = mode.replace(/\//g, separator).toUpperCase();
|
|
67
|
+
if (!hasTime)
|
|
68
|
+
return datePart;
|
|
69
|
+
return `${datePart}${dateTimeSeparator}${timeMode}`;
|
|
70
|
+
}, [mode, separator, hasTime, timeMode, dateTimeSeparator]);
|
|
71
|
+
return (_jsx(Input, { ...inputProps, ref: mergeRefs([maskRef, ref]), value: inputValue, onInput: handleInput, placeholder: placeholder ?? defaultPlaceholder, onClear: clearable ? handleClear : undefined }));
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=DateInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateInput.js","sourceRoot":"","sources":["../../../../src/components/DateInput/DateInput.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport {\n maskitoDateOptionsGenerator,\n maskitoDateTimeOptionsGenerator,\n maskitoParseDate,\n maskitoParseDateTime,\n maskitoStringifyDate,\n maskitoStringifyDateTime,\n type MaskitoDateMode,\n type MaskitoDateParams,\n type MaskitoDateTimeParams,\n type MaskitoTimeMode,\n} from \"@maskito/kit\"\nimport { useMaskito } from \"@maskito/react\"\nimport { DateTime } from \"luxon\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport { mergeRefs } from \"react-merge-refs\"\nimport { Input, type InputProps } from \"../Input\"\n\nexport type DateInputProps = {\n value: DateTime | null\n onChange: (value: DateTime | null) => void\n mode?: MaskitoDateMode\n separator?: string\n timeMode?: MaskitoTimeMode\n dateTimeSeparator?: string\n timeStep?: number\n min?: DateTime\n max?: DateTime\n clearable?: boolean\n ref?: React.Ref<HTMLInputElement | null>\n} & Omit<\n InputProps,\n \"value\" | \"defaultValue\" | \"onChange\" | \"onInput\" | \"onClear\" | \"ref\" | \"type\" | \"min\" | \"max\"\n>\n\nexport const DateInput = (props: DateInputProps) => {\n const {\n value,\n onChange,\n mode = \"dd/mm/yyyy\",\n separator = \".\",\n timeMode,\n dateTimeSeparator = \", \",\n timeStep = 0,\n min,\n max,\n clearable = false,\n placeholder,\n ref,\n ...inputProps\n } = props\n\n const hasTime = !!timeMode\n\n const dateParams = useMemo<MaskitoDateParams>(\n () => ({\n mode,\n separator,\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, min?.toMillis(), max?.toMillis()],\n )\n\n const dateTimeParams = useMemo<MaskitoDateTimeParams>(\n () => ({\n dateMode: mode,\n dateSeparator: separator,\n timeMode: timeMode ?? \"HH:MM\",\n dateTimeSeparator,\n ...(timeStep ? { timeStep } : undefined),\n ...(min ? { min: min.toJSDate() } : undefined),\n ...(max ? { max: max.toJSDate() } : undefined),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mode, separator, timeMode, dateTimeSeparator, timeStep, min?.toMillis(), max?.toMillis()],\n )\n\n const maskOptions = useMemo(\n () =>\n hasTime\n ? maskitoDateTimeOptionsGenerator(dateTimeParams)\n : maskitoDateOptionsGenerator(dateParams),\n [hasTime, dateParams, dateTimeParams],\n )\n\n const maskRef = useMaskito({ options: maskOptions })\n\n const [inputValue, setInputValue] = useState(\"\")\n\n const valueMsKey = value?.toMillis() ?? null\n useEffect(() => {\n if (!value) {\n setInputValue(\"\")\n return\n }\n setInputValue(\n hasTime\n ? maskitoStringifyDateTime(value.toJSDate(), dateTimeParams)\n : maskitoStringifyDate(value.toJSDate(), dateParams),\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueMsKey, hasTime, dateParams, dateTimeParams])\n\n const handleInput = (evt: React.FormEvent<HTMLInputElement>) => {\n const str = evt.currentTarget.value\n setInputValue(str)\n\n if (!str) {\n onChange(null)\n return\n }\n\n const parsed = hasTime\n ? maskitoParseDateTime(str, dateTimeParams)\n : maskitoParseDate(str, dateParams)\n\n if (parsed) {\n onChange(DateTime.fromJSDate(parsed))\n }\n }\n\n const handleClear = () => {\n setInputValue(\"\")\n onChange(null)\n }\n\n const defaultPlaceholder = useMemo(() => {\n const datePart = mode.replace(/\\//g, separator).toUpperCase()\n if (!hasTime) return datePart\n return `${datePart}${dateTimeSeparator}${timeMode}`\n }, [mode, separator, hasTime, timeMode, dateTimeSeparator])\n\n return (\n <Input\n {...inputProps}\n ref={mergeRefs([maskRef as unknown as React.Ref<HTMLInputElement>, ref])}\n value={inputValue}\n onInput={handleInput}\n placeholder={placeholder ?? defaultPlaceholder}\n onClear={clearable ? handleClear : undefined}\n />\n )\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/DateInput/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,aAAa,CAAA","sourcesContent":["export { DateInput, type DateInputProps } from \"./DateInput\"\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type MaskitoDateMode, type MaskitoTimeMode } from "@maskito/kit";
|
|
2
|
+
import { DateTime } from "luxon";
|
|
3
|
+
import { type InputProps } from "../Input";
|
|
4
|
+
export type DateInputProps = {
|
|
5
|
+
value: DateTime | null;
|
|
6
|
+
onChange: (value: DateTime | null) => void;
|
|
7
|
+
mode?: MaskitoDateMode;
|
|
8
|
+
separator?: string;
|
|
9
|
+
timeMode?: MaskitoTimeMode;
|
|
10
|
+
dateTimeSeparator?: string;
|
|
11
|
+
timeStep?: number;
|
|
12
|
+
min?: DateTime;
|
|
13
|
+
max?: DateTime;
|
|
14
|
+
clearable?: boolean;
|
|
15
|
+
ref?: React.Ref<HTMLInputElement | null>;
|
|
16
|
+
} & Omit<InputProps, "value" | "defaultValue" | "onChange" | "onInput" | "onClear" | "ref" | "type" | "min" | "max">;
|
|
17
|
+
export declare const DateInput: (props: DateInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DateInput, type DateInputProps } from "./DateInput";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plexui/ui",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.97",
|
|
4
4
|
"description": "Modern design system for building high-quality applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -81,6 +81,9 @@
|
|
|
81
81
|
"tailwindcss": "^4.0.10"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
+
"@maskito/core": "^5.2.2",
|
|
85
|
+
"@maskito/kit": "^5.2.2",
|
|
86
|
+
"@maskito/react": "^5.2.2",
|
|
84
87
|
"@tanstack/react-table": "^8.21.3",
|
|
85
88
|
"@tiptap/core": "^3.21.0",
|
|
86
89
|
"@tiptap/extension-bold": "^3.21.0",
|
|
@@ -116,7 +119,7 @@
|
|
|
116
119
|
"devDependencies": {
|
|
117
120
|
"@tailwindcss/postcss": "4.0.17",
|
|
118
121
|
"@types/lodash": "4.17.16",
|
|
119
|
-
"@types/luxon": "3.
|
|
122
|
+
"@types/luxon": "^3.7.1",
|
|
120
123
|
"@types/mdast": "^4.0.4",
|
|
121
124
|
"@types/postcss-functions": "4.0.4",
|
|
122
125
|
"@types/postcss-mixins": "9.0.6",
|