colibri-ui 0.7.110 → 0.7.113
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/Avatar/Avatar.module.css +1 -1
- package/Calendar/components/Month/Month.d.ts +2 -0
- package/Calendar/components/Month/Month.js +1 -1
- package/Calendar/components/Month/index.module.css +1 -1
- package/Calendar/index.d.ts +2 -18
- package/Calendar/index.js +28 -18
- package/Calendar/index.module.css +2 -7
- package/Calendar/index.props.d.ts +21 -0
- package/Checkbox/Checkbox.module.css +2 -2
- package/Datepicker/Datepicker.module.css +6 -0
- package/Datepicker/components/DatePicker/index.d.ts +7 -0
- package/Datepicker/components/DatePicker/index.js +56 -0
- package/Datepicker/components/DatePicker/index.module.css +47 -0
- package/Datepicker/components/TimePicker/Label/index.d.ts +8 -0
- package/Datepicker/components/TimePicker/Label/index.js +23 -0
- package/Datepicker/components/TimePicker/helpers.d.ts +12 -0
- package/Datepicker/components/TimePicker/helpers.js +41 -0
- package/Datepicker/components/TimePicker/index.d.ts +9 -0
- package/Datepicker/components/TimePicker/index.js +71 -0
- package/Datepicker/components/TimePicker/index.module.css +34 -0
- package/Datepicker/index.d.ts +8 -0
- package/Datepicker/index.js +31 -0
- package/Datepicker/package.json +6 -0
- package/Dropdown/index.js +25 -18
- package/Dropdown/index.props.d.ts +2 -0
- package/Menu/components/MenuItem/MenuItem.module.css +5 -5
- package/Menu/components/MenuItem/index.js +1 -1
- package/Select/index.d.ts +1 -1
- package/Select/index.js +5 -2
- package/Select/index.module.css +1 -1
- package/Select/index.props.d.ts +2 -0
- package/TimeSelect/index.d.ts +1 -1
- package/esm/Avatar/Avatar.module.css +1 -1
- package/esm/Calendar/components/Month/Month.d.ts +2 -0
- package/esm/Calendar/components/Month/Month.js +1 -1
- package/esm/Calendar/components/Month/index.module.css +1 -1
- package/esm/Calendar/index.d.ts +2 -18
- package/esm/Calendar/index.js +28 -18
- package/esm/Calendar/index.module.css +2 -7
- package/esm/Calendar/index.props.d.ts +21 -0
- package/esm/Checkbox/Checkbox.module.css +2 -2
- package/esm/Datepicker/Datepicker.module.css +6 -0
- package/esm/Datepicker/components/DatePicker/index.d.ts +7 -0
- package/esm/Datepicker/components/DatePicker/index.js +46 -0
- package/esm/Datepicker/components/DatePicker/index.module.css +47 -0
- package/esm/Datepicker/components/TimePicker/Label/index.d.ts +8 -0
- package/esm/Datepicker/components/TimePicker/Label/index.js +15 -0
- package/esm/Datepicker/components/TimePicker/helpers.d.ts +12 -0
- package/esm/Datepicker/components/TimePicker/helpers.js +35 -0
- package/esm/Datepicker/components/TimePicker/index.d.ts +9 -0
- package/esm/Datepicker/components/TimePicker/index.js +61 -0
- package/esm/Datepicker/components/TimePicker/index.module.css +34 -0
- package/esm/Datepicker/index.d.ts +8 -0
- package/esm/Datepicker/index.js +21 -0
- package/esm/Dropdown/index.js +25 -18
- package/esm/Dropdown/index.props.d.ts +2 -0
- package/esm/Menu/components/MenuItem/MenuItem.module.css +5 -5
- package/esm/Menu/components/MenuItem/index.js +1 -1
- package/esm/Select/index.d.ts +1 -1
- package/esm/Select/index.js +5 -2
- package/esm/Select/index.module.css +1 -1
- package/esm/Select/index.props.d.ts +2 -0
- package/esm/TimeSelect/index.d.ts +1 -1
- package/esm/helpers/date/index.d.ts +1 -0
- package/esm/helpers/date/index.js +5 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/helpers/date/index.d.ts +1 -0
- package/helpers/date/index.js +5 -0
- package/index.d.ts +1 -0
- package/index.js +55 -53
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ export type Placement = Extract<PopperPlacement, "bottom-start" | "bottom" | "bo
|
|
|
5
5
|
export type Trigger = "click" | "hover" | "focus";
|
|
6
6
|
export type DropdownProps = {
|
|
7
7
|
zIndex?: number;
|
|
8
|
+
fontSize?: number;
|
|
8
9
|
disabled?: boolean;
|
|
9
10
|
onVisibleChange?: (visible: boolean) => void;
|
|
10
11
|
overlay: ReactNode;
|
|
@@ -13,5 +14,6 @@ export type DropdownProps = {
|
|
|
13
14
|
trigger?: [Trigger, ...Trigger[]];
|
|
14
15
|
visible?: boolean;
|
|
15
16
|
preventOverflow?: boolean;
|
|
17
|
+
preventAutoClose?: boolean;
|
|
16
18
|
samewidth?: boolean;
|
|
17
19
|
};
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
align-items: center;
|
|
3
3
|
cursor: pointer;
|
|
4
4
|
display: flex;
|
|
5
|
-
font-size:
|
|
5
|
+
font-size: 1em;
|
|
6
6
|
font-style: normal;
|
|
7
7
|
font-weight: 400;
|
|
8
8
|
justify-content: space-between;
|
|
9
|
-
line-height:
|
|
9
|
+
line-height: 1.5;
|
|
10
10
|
list-style: none;
|
|
11
11
|
padding: 8px 6px;
|
|
12
12
|
}
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
background-color: var(--palette-white);
|
|
21
21
|
}
|
|
22
22
|
.item_variant_primary:hover {
|
|
23
|
-
background-color: var(--palette-
|
|
23
|
+
background-color: var(--palette-bg-2);
|
|
24
24
|
}
|
|
25
25
|
.item_variant_primary:active {
|
|
26
|
-
background-color: var(--palette-
|
|
26
|
+
background-color: var(--palette-bg-2);
|
|
27
27
|
}
|
|
28
28
|
.item_variant_primary:focus, .item_variant_primary:focus-within {
|
|
29
|
-
background-color: var(--palette-
|
|
29
|
+
background-color: var(--palette-bg-2);
|
|
30
30
|
}
|
|
31
31
|
.item > * {
|
|
32
32
|
overflow: hidden;
|
|
@@ -26,7 +26,7 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
|
26
26
|
ref: ref,
|
|
27
27
|
"data-component": "menu-item",
|
|
28
28
|
style: {
|
|
29
|
-
backgroundColor: isSelected ? "var(--palette-
|
|
29
|
+
backgroundColor: isSelected ? "var(--palette-bg-2, rgb(232, 240, 254))" : ""
|
|
30
30
|
},
|
|
31
31
|
"data-testid": "menuitem",
|
|
32
32
|
className: clx("item", (_b = {
|
package/Select/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { SelectProps } from "./index.props";
|
|
3
|
-
declare const Select: <T extends string>({ options, value, name, zIndex, label, hint, error, required, placeholder, disabled, size, fullWidth, className, onChange, }: SelectProps<T>) => React.JSX.Element;
|
|
3
|
+
declare const Select: <T extends string>({ options, value, name, zIndex, fontSize, label, hint, error, required, placeholder, disabled, size, fullWidth, customInputRoot, className, onChange, }: SelectProps<T>) => React.JSX.Element;
|
|
4
4
|
export default Select;
|
package/Select/index.js
CHANGED
|
@@ -24,6 +24,7 @@ var Select = function Select(_a) {
|
|
|
24
24
|
value = _a.value,
|
|
25
25
|
name = _a.name,
|
|
26
26
|
zIndex = _a.zIndex,
|
|
27
|
+
fontSize = _a.fontSize,
|
|
27
28
|
label = _a.label,
|
|
28
29
|
hint = _a.hint,
|
|
29
30
|
error = _a.error,
|
|
@@ -34,6 +35,7 @@ var Select = function Select(_a) {
|
|
|
34
35
|
size = _c === void 0 ? "m" : _c,
|
|
35
36
|
_d = _a.fullWidth,
|
|
36
37
|
fullWidth = _d === void 0 ? false : _d,
|
|
38
|
+
customInputRoot = _a.customInputRoot,
|
|
37
39
|
className = _a.className,
|
|
38
40
|
onChange = _a.onChange;
|
|
39
41
|
var _e = React.useState(false),
|
|
@@ -72,13 +74,14 @@ var Select = function Select(_a) {
|
|
|
72
74
|
onVisibleChange: setIsOpen,
|
|
73
75
|
trigger: ["click"],
|
|
74
76
|
zIndex: zIndex,
|
|
77
|
+
fontSize: fontSize,
|
|
75
78
|
disabled: !!disabled,
|
|
76
79
|
overlay: /*#__PURE__*/React__default.default.createElement(index$2.default, {
|
|
77
80
|
options: preparedOptions,
|
|
78
81
|
onChange: onChange
|
|
79
82
|
}),
|
|
80
83
|
samewidth: true
|
|
81
|
-
}, /*#__PURE__*/React__default.default.createElement(index$3.default, {
|
|
84
|
+
}, customInputRoot ? customInputRoot : (/*#__PURE__*/React__default.default.createElement(index$3.default, {
|
|
82
85
|
error: error,
|
|
83
86
|
size: size,
|
|
84
87
|
className: clx(styles__default.default.root),
|
|
@@ -98,7 +101,7 @@ var Select = function Select(_a) {
|
|
|
98
101
|
name: name,
|
|
99
102
|
tabIndex: -1,
|
|
100
103
|
value: value || ""
|
|
101
|
-
}))));
|
|
104
|
+
})))));
|
|
102
105
|
};
|
|
103
106
|
|
|
104
107
|
exports.default = Select;
|
package/Select/index.module.css
CHANGED
package/Select/index.props.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export interface SelectProps<T extends string> extends Omit<FormFieldProps, "chi
|
|
|
10
10
|
options: IOption<T>[];
|
|
11
11
|
value?: T;
|
|
12
12
|
zIndex?: number;
|
|
13
|
+
fontSize?: number;
|
|
13
14
|
onChange: (value: T) => void;
|
|
14
15
|
disabled?: boolean;
|
|
15
16
|
placeholder?: string;
|
|
@@ -17,6 +18,7 @@ export interface SelectProps<T extends string> extends Omit<FormFieldProps, "chi
|
|
|
17
18
|
required?: boolean;
|
|
18
19
|
size?: Size;
|
|
19
20
|
className?: string;
|
|
21
|
+
customInputRoot?: ReactNode;
|
|
20
22
|
name?: string;
|
|
21
23
|
}
|
|
22
24
|
export type Coordinates = {
|
package/TimeSelect/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SelectProps } from "../Select/index.props";
|
|
2
2
|
import type { FC } from "react";
|
|
3
|
-
interface TimeSelectProps extends Omit<SelectProps<string>,
|
|
3
|
+
interface TimeSelectProps extends Omit<SelectProps<string>, "options"> {
|
|
4
4
|
interval?: 5 | 10 | 15 | 30;
|
|
5
5
|
currentDate?: Date | null;
|
|
6
6
|
selectedDate?: Date | null;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CalendarTitleSize } from "../../index.props";
|
|
1
2
|
import type { FunctionComponent } from "react";
|
|
2
3
|
export interface FCWithElements<T = {}> extends FunctionComponent<T> {
|
|
3
4
|
}
|
|
@@ -10,6 +11,7 @@ type Props = {
|
|
|
10
11
|
onDayClick: (date: string) => void;
|
|
11
12
|
offsetLeft: number;
|
|
12
13
|
availableDates?: string[];
|
|
14
|
+
titleSize?: CalendarTitleSize;
|
|
13
15
|
};
|
|
14
16
|
export declare const Month: FCWithElements<Props>;
|
|
15
17
|
export {};
|
|
@@ -46,7 +46,7 @@ var Month = function Month(props) {
|
|
|
46
46
|
className: clx(styles["month-name"])
|
|
47
47
|
}, /*#__PURE__*/React.createElement(Typography, {
|
|
48
48
|
tag: "span",
|
|
49
|
-
size:
|
|
49
|
+
size: props.titleSize
|
|
50
50
|
}, getUpperMonthName(props.startDate))), /*#__PURE__*/React.createElement("div", {
|
|
51
51
|
className: clx(styles.table)
|
|
52
52
|
}, /*#__PURE__*/React.createElement("ul", {
|
package/esm/Calendar/index.d.ts
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
date: string;
|
|
5
|
-
period: number;
|
|
6
|
-
};
|
|
7
|
-
type Props = {
|
|
8
|
-
today: string;
|
|
9
|
-
selectedDate?: string;
|
|
10
|
-
selectedPeriod?: number;
|
|
11
|
-
canSelectRange?: boolean;
|
|
12
|
-
activeDates?: string[];
|
|
13
|
-
datePresets?: Preset[];
|
|
14
|
-
availableDates?: string[];
|
|
15
|
-
onChange?: (payload: ChangePayload) => void;
|
|
16
|
-
onCancel?: () => void;
|
|
17
|
-
withContinueButton?: boolean;
|
|
18
|
-
};
|
|
19
|
-
declare const Calendar: React.FC<Props>;
|
|
2
|
+
import type { CalendarProps } from "./index.props";
|
|
3
|
+
declare const Calendar: React.FC<CalendarProps>;
|
|
20
4
|
export default Calendar;
|
package/esm/Calendar/index.js
CHANGED
|
@@ -26,20 +26,25 @@ var Calendar = function Calendar(_a) {
|
|
|
26
26
|
canSelectRange = _a.canSelectRange,
|
|
27
27
|
onChange = _a.onChange,
|
|
28
28
|
onCancel = _a.onCancel,
|
|
29
|
-
_b = _a.
|
|
30
|
-
|
|
29
|
+
_b = _a.minWidth,
|
|
30
|
+
minWidth = _b === void 0 ? 360 : _b,
|
|
31
|
+
_c = _a.withContinueButton,
|
|
32
|
+
withContinueButton = _c === void 0 ? false : _c,
|
|
33
|
+
className = _a.className,
|
|
34
|
+
_d = _a.titleSize,
|
|
35
|
+
titleSize = _d === void 0 ? "h3" : _d;
|
|
31
36
|
var $root = useRef(null);
|
|
32
37
|
var startMonth = getStartMonth({
|
|
33
38
|
today: today,
|
|
34
39
|
activeDates: activeDates
|
|
35
40
|
});
|
|
36
|
-
var
|
|
37
|
-
selectedDate =
|
|
38
|
-
setSelectedDate =
|
|
39
|
-
var
|
|
40
|
-
selectedPeriod =
|
|
41
|
-
setSelectedPeriod =
|
|
42
|
-
var
|
|
41
|
+
var _e = useState(initialSelectedDate),
|
|
42
|
+
selectedDate = _e[0],
|
|
43
|
+
setSelectedDate = _e[1];
|
|
44
|
+
var _f = useState(initialSelectedPeriod),
|
|
45
|
+
selectedPeriod = _f[0],
|
|
46
|
+
setSelectedPeriod = _f[1];
|
|
47
|
+
var _g = useState(function () {
|
|
43
48
|
if (initialSelectedDate) {
|
|
44
49
|
return getNumberOfMonthsBetweenDates(startMonth, initialSelectedDate);
|
|
45
50
|
} else if (activeDates && activeDates.length) {
|
|
@@ -47,14 +52,14 @@ var Calendar = function Calendar(_a) {
|
|
|
47
52
|
}
|
|
48
53
|
return 0;
|
|
49
54
|
}),
|
|
50
|
-
currentMonthOffset =
|
|
51
|
-
setCurrentMonthOffset =
|
|
52
|
-
var
|
|
53
|
-
contentWidth =
|
|
54
|
-
setContentWidth =
|
|
55
|
-
var
|
|
56
|
-
isRangeCompleted =
|
|
57
|
-
setIsRangeCompleted =
|
|
55
|
+
currentMonthOffset = _g[0],
|
|
56
|
+
setCurrentMonthOffset = _g[1];
|
|
57
|
+
var _h = useState(0),
|
|
58
|
+
contentWidth = _h[0],
|
|
59
|
+
setContentWidth = _h[1];
|
|
60
|
+
var _j = useState(true),
|
|
61
|
+
isRangeCompleted = _j[0],
|
|
62
|
+
setIsRangeCompleted = _j[1];
|
|
58
63
|
useEffect(function () {
|
|
59
64
|
var _a;
|
|
60
65
|
setContentWidth(((_a = $root.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) || 0);
|
|
@@ -139,7 +144,10 @@ var Calendar = function Calendar(_a) {
|
|
|
139
144
|
onDayClick: handleDayClick
|
|
140
145
|
};
|
|
141
146
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
142
|
-
className: clx(styles.root),
|
|
147
|
+
className: clx(styles.root, className),
|
|
148
|
+
style: {
|
|
149
|
+
minWidth: "".concat(minWidth, "px")
|
|
150
|
+
},
|
|
143
151
|
"data-testid": "calendar",
|
|
144
152
|
ref: $root
|
|
145
153
|
}, /*#__PURE__*/React__default.createElement("div", null, contentWidth ? (/*#__PURE__*/React__default.createElement("div", {
|
|
@@ -157,9 +165,11 @@ var Calendar = function Calendar(_a) {
|
|
|
157
165
|
offsetLeft: index * contentWidth
|
|
158
166
|
});
|
|
159
167
|
return /*#__PURE__*/React__default.createElement(Month, __assign({}, attrs, {
|
|
168
|
+
titleSize: titleSize,
|
|
160
169
|
key: "month-".concat(index)
|
|
161
170
|
}));
|
|
162
171
|
}))) : (/*#__PURE__*/React__default.createElement(Month, __assign({
|
|
172
|
+
titleSize: titleSize,
|
|
163
173
|
today: today,
|
|
164
174
|
startDate: getMonthStartDate(currentMonthOffset),
|
|
165
175
|
offsetLeft: 0
|
|
@@ -3,18 +3,13 @@
|
|
|
3
3
|
flex-direction: column;
|
|
4
4
|
-moz-osx-font-smoothing: grayscale;
|
|
5
5
|
-webkit-font-smoothing: antialiased;
|
|
6
|
-
gap:
|
|
7
|
-
min-width:
|
|
6
|
+
gap: 1rem;
|
|
7
|
+
min-width: 360px;
|
|
8
8
|
overflow: hidden;
|
|
9
9
|
position: relative;
|
|
10
10
|
text-rendering: optimizelegibility;
|
|
11
11
|
text-size-adjust: 100%;
|
|
12
12
|
}
|
|
13
|
-
@media (width >= 360px) {
|
|
14
|
-
.root {
|
|
15
|
-
min-width: 360px;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
13
|
|
|
19
14
|
.month-control {
|
|
20
15
|
background: transparent;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Preset } from "./components/Presets";
|
|
2
|
+
export type CalendarPayload = {
|
|
3
|
+
date: string;
|
|
4
|
+
period: number;
|
|
5
|
+
};
|
|
6
|
+
export type CalendarTitleSize = "xs" | "s" | "m" | "l" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
7
|
+
export type CalendarProps = {
|
|
8
|
+
today: string;
|
|
9
|
+
selectedDate?: string;
|
|
10
|
+
selectedPeriod?: number;
|
|
11
|
+
canSelectRange?: boolean;
|
|
12
|
+
activeDates?: string[];
|
|
13
|
+
datePresets?: Preset[];
|
|
14
|
+
availableDates?: string[];
|
|
15
|
+
onChange?: (payload: CalendarPayload) => void;
|
|
16
|
+
onCancel?: () => void;
|
|
17
|
+
withContinueButton?: boolean;
|
|
18
|
+
className?: string;
|
|
19
|
+
minWidth?: number;
|
|
20
|
+
titleSize?: CalendarTitleSize;
|
|
21
|
+
};
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
box-shadow: 0 0 0 2px var(--palette-alert);
|
|
58
58
|
}
|
|
59
59
|
.variant_primary_checked::after {
|
|
60
|
-
border-block-end: 2px solid var(--palette-
|
|
61
|
-
border-inline-end: 2px solid var(--palette-
|
|
60
|
+
border-block-end: 2px solid var(--palette-black);
|
|
61
|
+
border-inline-end: 2px solid var(--palette-black);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
.control {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React__default, { useState } from 'react';
|
|
2
|
+
import classNames from 'classnames/bind';
|
|
3
|
+
import Dropdown from '../../../Dropdown/index.js';
|
|
4
|
+
import Calendar from '../../../Calendar/index.js';
|
|
5
|
+
import { toISODate, toDMYDate } from '../../../helpers/date/index.js';
|
|
6
|
+
import styles from './index.module.css';
|
|
7
|
+
|
|
8
|
+
var clx = classNames.bind(styles);
|
|
9
|
+
var DatePicker = function DatePicker(_a) {
|
|
10
|
+
var className = _a.className,
|
|
11
|
+
_b = _a.selectedDate,
|
|
12
|
+
selectedDate = _b === void 0 ? "" : _b;
|
|
13
|
+
var _c = useState(selectedDate),
|
|
14
|
+
date = _c[0],
|
|
15
|
+
setDate = _c[1];
|
|
16
|
+
return /*#__PURE__*/React__default.createElement("div", {
|
|
17
|
+
className: clx(styles['input-container'], styles['input-date'], className)
|
|
18
|
+
}, /*#__PURE__*/React__default.createElement(Dropdown, {
|
|
19
|
+
placement: "bottom",
|
|
20
|
+
preventAutoClose: true,
|
|
21
|
+
fontSize: 14,
|
|
22
|
+
trigger: ["click"],
|
|
23
|
+
overlay: /*#__PURE__*/React__default.createElement(Calendar, {
|
|
24
|
+
minWidth: 260,
|
|
25
|
+
className: styles.calendar,
|
|
26
|
+
today: toISODate(new Date()),
|
|
27
|
+
titleSize: "h5",
|
|
28
|
+
selectedDate: date,
|
|
29
|
+
onChange: function onChange(payload) {
|
|
30
|
+
setDate(payload.date);
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
}, /*#__PURE__*/React__default.createElement("input", {
|
|
34
|
+
className: clx(styles['input-field']),
|
|
35
|
+
tabIndex: 0,
|
|
36
|
+
"aria-expanded": "false",
|
|
37
|
+
"aria-haspopup": "true",
|
|
38
|
+
"aria-invalid": "false",
|
|
39
|
+
autoComplete: "off",
|
|
40
|
+
maxLength: 7,
|
|
41
|
+
readOnly: true,
|
|
42
|
+
value: toDMYDate(date)
|
|
43
|
+
})));
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { DatePicker as default };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
.input-container {
|
|
2
|
+
border-radius: 6px;
|
|
3
|
+
border: 1px solid var(--palette-bg-3);
|
|
4
|
+
display: flex;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
align-items: center;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.input-field {
|
|
10
|
+
height: 100%;
|
|
11
|
+
padding: 4px;
|
|
12
|
+
text-align: center;
|
|
13
|
+
font-size: 1em;
|
|
14
|
+
outline: none;
|
|
15
|
+
border: none;
|
|
16
|
+
width: 100%;
|
|
17
|
+
background: transparent;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.input-date {
|
|
21
|
+
position: relative;
|
|
22
|
+
border-bottom-left-radius: 0;
|
|
23
|
+
border-left: none;
|
|
24
|
+
border-top-left-radius: 0;
|
|
25
|
+
width: 100px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.input-date:focus-within {
|
|
29
|
+
border: 1px solid var(--palette-primary-3);
|
|
30
|
+
border-bottom-left-radius: 0;
|
|
31
|
+
border-left: none;
|
|
32
|
+
border-top-left-radius: 0;
|
|
33
|
+
box-shadow: 0 0 0 2px var(--palette-primary-2);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.input-date:focus-within::before {
|
|
37
|
+
content: "";
|
|
38
|
+
position: absolute;
|
|
39
|
+
height: 100%;
|
|
40
|
+
width: 1px;
|
|
41
|
+
background-color: var(--palette-primary-3);
|
|
42
|
+
left: 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.calendar {
|
|
46
|
+
max-width: 250px;
|
|
47
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React__default, { useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
var OptionLabel = function OptionLabel(_a) {
|
|
4
|
+
var time = _a.time,
|
|
5
|
+
onClick = _a.onClick,
|
|
6
|
+
onMouseEnter = _a.onMouseEnter;
|
|
7
|
+
var ref = useRef(null);
|
|
8
|
+
return /*#__PURE__*/React__default.createElement("span", {
|
|
9
|
+
onClick: onClick,
|
|
10
|
+
onMouseEnter: onMouseEnter,
|
|
11
|
+
ref: ref
|
|
12
|
+
}, time);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { OptionLabel as default };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type Timestamp = {
|
|
2
|
+
time: string;
|
|
3
|
+
disabled?: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare const DEFAULT_TIME: {
|
|
6
|
+
index: number;
|
|
7
|
+
time: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const formatTime: (date: Date) => string;
|
|
10
|
+
export declare const generateSuggest: (interval?: number) => Timestamp[];
|
|
11
|
+
export declare const checkIsBeforeNow: (time: string, currentDate?: Date | null) => boolean;
|
|
12
|
+
export declare const checkIsBeforeSelectedDate: (time: string, interval: number, date?: Date | null) => boolean;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { format, addMinutes, isBefore, parse } from 'date-fns';
|
|
2
|
+
|
|
3
|
+
var day = new Date();
|
|
4
|
+
day.setHours(24, 0, 0, 0);
|
|
5
|
+
var DEFAULT_TIME = {
|
|
6
|
+
index: 24,
|
|
7
|
+
time: "12:00"
|
|
8
|
+
};
|
|
9
|
+
var formatTime = function formatTime(date) {
|
|
10
|
+
return format(date, "HH:mm");
|
|
11
|
+
};
|
|
12
|
+
var generateSuggest = function generateSuggest(interval) {
|
|
13
|
+
if (interval === void 0) {
|
|
14
|
+
interval = 15;
|
|
15
|
+
}
|
|
16
|
+
return new Array(24 * 60 / interval).fill(null).map(function (_, index) {
|
|
17
|
+
var date = addMinutes(day, index * interval);
|
|
18
|
+
return {
|
|
19
|
+
time: formatTime(date)
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var checkIsBeforeNow = function checkIsBeforeNow(time, currentDate) {
|
|
24
|
+
return currentDate ? isBefore(parse(time, "HH:mm", currentDate), new Date()) : false;
|
|
25
|
+
};
|
|
26
|
+
var checkIsBeforeSelectedDate = function checkIsBeforeSelectedDate(time, interval, date) {
|
|
27
|
+
if (date) {
|
|
28
|
+
var selectedDate = new Date(date);
|
|
29
|
+
selectedDate.setMinutes(selectedDate.getMinutes() + interval);
|
|
30
|
+
return isBefore(parse(time, "HH:mm", date), selectedDate);
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export { DEFAULT_TIME, checkIsBeforeNow, checkIsBeforeSelectedDate, formatTime, generateSuggest };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface TimePickerProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
interval?: 5 | 10 | 15 | 30;
|
|
5
|
+
value?: string;
|
|
6
|
+
selectedTime?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: React.MemoExoticComponent<({ className, interval, selectedTime, }: TimePickerProps) => React.JSX.Element>;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { __assign } from 'tslib';
|
|
2
|
+
import React__default, { useState, useMemo, memo } from 'react';
|
|
3
|
+
import classNames from 'classnames/bind';
|
|
4
|
+
import Select from '../../../Select/index.js';
|
|
5
|
+
import styles from './index.module.css';
|
|
6
|
+
import { generateSuggest } from './helpers.js';
|
|
7
|
+
import OptionLabel from './Label/index.js';
|
|
8
|
+
|
|
9
|
+
var clx = classNames.bind(styles);
|
|
10
|
+
var TimePicker = function TimePicker(_a) {
|
|
11
|
+
var className = _a.className,
|
|
12
|
+
_b = _a.interval,
|
|
13
|
+
interval = _b === void 0 ? 30 : _b,
|
|
14
|
+
_c = _a.selectedTime,
|
|
15
|
+
selectedTime = _c === void 0 ? "" : _c;
|
|
16
|
+
var _d = useState(selectedTime),
|
|
17
|
+
time = _d[0],
|
|
18
|
+
setTime = _d[1];
|
|
19
|
+
var baseOptions = useMemo(function () {
|
|
20
|
+
return generateSuggest(interval).map(function (item) {
|
|
21
|
+
return {
|
|
22
|
+
value: item.time,
|
|
23
|
+
label: /*#__PURE__*/React__default.createElement(OptionLabel, {
|
|
24
|
+
time: item.time
|
|
25
|
+
})
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}, [interval]);
|
|
29
|
+
var options = useMemo(function () {
|
|
30
|
+
return baseOptions.map(function (option) {
|
|
31
|
+
return __assign(__assign({}, option), {
|
|
32
|
+
disabled: false
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}, [baseOptions, interval]);
|
|
36
|
+
return /*#__PURE__*/React__default.createElement(Select, {
|
|
37
|
+
className: className,
|
|
38
|
+
value: time,
|
|
39
|
+
options: options,
|
|
40
|
+
fontSize: 14,
|
|
41
|
+
customInputRoot: /*#__PURE__*/React__default.createElement("div", {
|
|
42
|
+
className: clx(styles['input-container'], styles['input-time'])
|
|
43
|
+
}, /*#__PURE__*/React__default.createElement("input", {
|
|
44
|
+
className: clx(styles['input-field']),
|
|
45
|
+
tabIndex: 0,
|
|
46
|
+
"aria-expanded": "false",
|
|
47
|
+
"aria-haspopup": "true",
|
|
48
|
+
"aria-invalid": "false",
|
|
49
|
+
autoComplete: "off",
|
|
50
|
+
maxLength: 5,
|
|
51
|
+
readOnly: true,
|
|
52
|
+
value: time
|
|
53
|
+
})),
|
|
54
|
+
onChange: function onChange(time) {
|
|
55
|
+
return setTime(time);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
var TimePickerInput = /*#__PURE__*/memo(TimePicker);
|
|
60
|
+
|
|
61
|
+
export { TimePickerInput as default };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.input-container {
|
|
2
|
+
border-radius: 6px;
|
|
3
|
+
border: 1px solid var(--palette-bg-3);
|
|
4
|
+
display: flex;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
align-items: center;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.input-field {
|
|
10
|
+
height: 100%;
|
|
11
|
+
padding: 4px;
|
|
12
|
+
text-align: center;
|
|
13
|
+
font-size: 1em;
|
|
14
|
+
outline: none;
|
|
15
|
+
border: none;
|
|
16
|
+
width: 100%;
|
|
17
|
+
background: transparent;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.input-time {
|
|
21
|
+
border-bottom-right-radius: 0;
|
|
22
|
+
border-right: 1px solid var(--palette-bg-3);
|
|
23
|
+
border-top-right-radius: 0;
|
|
24
|
+
width: 89px;
|
|
25
|
+
height: 100%;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.input-time:focus-within {
|
|
29
|
+
border: 1px solid var(--palette-primary-3);
|
|
30
|
+
border-bottom-right-radius: 0;
|
|
31
|
+
border-top-right-radius: 0;
|
|
32
|
+
box-shadow: 0 0 0 2px var(--palette-primary-2);
|
|
33
|
+
z-index: 3;
|
|
34
|
+
}
|