@tecsinapse/cortex-react 1.13.0 → 1.13.1-beta.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.
- package/dist/cjs/components/DatePicker/DatePickerInput.js +2 -1
- package/dist/cjs/components/DatePicker/DateRangePickerInput.js +2 -1
- package/dist/cjs/components/ScrollableDigitSelector.js +57 -0
- package/dist/cjs/components/Select/CustomMultiOption.js +38 -0
- package/dist/cjs/components/Select/CustomOption.js +31 -0
- package/dist/cjs/components/Select/MultiCheckAllOptions.js +1 -1
- package/dist/cjs/components/Select/MultiGroupedOptions.js +2 -8
- package/dist/cjs/components/Select/MultiOption.js +3 -12
- package/dist/cjs/components/Select/MultiOptions.js +2 -3
- package/dist/cjs/components/Select/Options.js +15 -10
- package/dist/cjs/components/Select/index.js +5 -1
- package/dist/cjs/components/Select/useMultiSelectOption.js +29 -0
- package/dist/cjs/components/Select/utils.js +2 -2
- package/dist/cjs/components/TimePicker/TimeField.js +48 -0
- package/dist/cjs/components/TimePicker/TimeFieldInput.js +82 -0
- package/dist/cjs/components/TimePicker/TimePickerInput.js +78 -0
- package/dist/cjs/components/TimePicker/TimePickerSelector.js +118 -0
- package/dist/cjs/hooks/useTimePickerInput.js +45 -0
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/styles/time-field-input.js +18 -0
- package/dist/cjs/utils/date.js +0 -5
- package/dist/esm/components/DatePicker/DatePickerInput.js +2 -1
- package/dist/esm/components/DatePicker/DateRangePickerInput.js +2 -1
- package/dist/esm/components/ScrollableDigitSelector.js +55 -0
- package/dist/esm/components/Select/CustomMultiOption.js +36 -0
- package/dist/esm/components/Select/CustomOption.js +29 -0
- package/dist/esm/components/Select/MultiCheckAllOptions.js +1 -1
- package/dist/esm/components/Select/MultiGroupedOptions.js +2 -8
- package/dist/esm/components/Select/MultiOption.js +4 -13
- package/dist/esm/components/Select/MultiOptions.js +2 -3
- package/dist/esm/components/Select/Options.js +16 -11
- package/dist/esm/components/Select/index.js +5 -1
- package/dist/esm/components/Select/useMultiSelectOption.js +27 -0
- package/dist/esm/components/Select/utils.js +2 -2
- package/dist/esm/components/TimePicker/TimeField.js +46 -0
- package/dist/esm/components/TimePicker/TimeFieldInput.js +80 -0
- package/dist/esm/components/TimePicker/TimePickerInput.js +76 -0
- package/dist/esm/components/TimePicker/TimePickerSelector.js +116 -0
- package/dist/esm/hooks/useTimePickerInput.js +43 -0
- package/dist/esm/index.js +5 -2
- package/dist/esm/styles/time-field-input.js +16 -0
- package/dist/esm/utils/date.js +2 -6
- package/dist/types/components/ScrollableDigitSelector.d.ts +10 -0
- package/dist/types/components/Select/CustomMultiOption.d.ts +3 -0
- package/dist/types/components/Select/CustomOption.d.ts +3 -0
- package/dist/types/components/Select/MultiOption.d.ts +1 -1
- package/dist/types/components/Select/Options.d.ts +1 -1
- package/dist/types/components/Select/context.d.ts +1 -1
- package/dist/types/components/Select/index.d.ts +4 -2
- package/dist/types/components/Select/types.d.ts +10 -3
- package/dist/types/components/Select/useMultiSelectOption.d.ts +8 -0
- package/dist/types/components/Select/utils.d.ts +1 -1
- package/dist/types/components/{TimeField → TimePicker}/TimeField.d.ts +2 -1
- package/dist/types/components/TimePicker/TimeFieldInput.d.ts +14 -0
- package/dist/types/components/TimePicker/TimePickerInput.d.ts +15 -0
- package/dist/types/components/TimePicker/TimePickerSelector.d.ts +14 -0
- package/dist/types/components/TimePicker/index.d.ts +4 -0
- package/dist/types/components/index.d.ts +1 -1
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/hooks/useTimePickerInput.d.ts +14 -0
- package/dist/types/styles/time-field-input.d.ts +25 -0
- package/package.json +2 -2
- package/dist/cjs/components/TimeField/TimeField.js +0 -24
- package/dist/cjs/components/TimeField/TimeFieldInput.js +0 -42
- package/dist/esm/components/TimeField/TimeField.js +0 -22
- package/dist/esm/components/TimeField/TimeFieldInput.js +0 -40
- package/dist/types/components/TimeField/TimeFieldInput.d.ts +0 -11
- package/dist/types/components/TimeField/index.d.ts +0 -2
- /package/dist/cjs/components/{DatePicker/Content.js → Content.js} +0 -0
- /package/dist/esm/components/{DatePicker/Content.js → Content.js} +0 -0
- /package/dist/types/components/{DatePicker/Content.d.ts → Content.d.ts} +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var date = require('@internationalized/date');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var ScrollableDigitSelector = require('../ScrollableDigitSelector.js');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var Button = require('../Button.js');
|
|
8
|
+
var md = require('react-icons/md');
|
|
9
|
+
|
|
10
|
+
const dayPeriodStyle = "p-micro rounded-micro border-1 border-transparent hover:bg-primary-light hover:border-primary cursor-pointer";
|
|
11
|
+
const TimePickerSelector = ({
|
|
12
|
+
value,
|
|
13
|
+
hourCycle,
|
|
14
|
+
minuteInterval,
|
|
15
|
+
onPressOkButton,
|
|
16
|
+
onChangeTime,
|
|
17
|
+
hourLabel = "Hour",
|
|
18
|
+
minuteLabel = "Minute",
|
|
19
|
+
dayPeriodLabel = "Day Period"
|
|
20
|
+
}) => {
|
|
21
|
+
const handleHourChange = (hour) => {
|
|
22
|
+
let newHour = hour;
|
|
23
|
+
if (hourCycle === 12) {
|
|
24
|
+
if (isPM && newHour < 12) {
|
|
25
|
+
newHour += 12;
|
|
26
|
+
} else if (!isPM && newHour >= 12) {
|
|
27
|
+
newHour -= 12;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const newTime = new date.Time(newHour, value.minute, value.second);
|
|
31
|
+
onChangeTime(newTime);
|
|
32
|
+
};
|
|
33
|
+
const handleMinuteChange = (minute) => {
|
|
34
|
+
const newTime = new date.Time(value.hour, minute, value.second);
|
|
35
|
+
onChangeTime(newTime);
|
|
36
|
+
};
|
|
37
|
+
const handlePeriodChange = (isPM2) => {
|
|
38
|
+
if (value === void 0) return;
|
|
39
|
+
let newHour = value.hour;
|
|
40
|
+
if (hourCycle === 12) {
|
|
41
|
+
if (isPM2 && newHour < 12) {
|
|
42
|
+
newHour += 12;
|
|
43
|
+
} else if (!isPM2 && newHour >= 12) {
|
|
44
|
+
newHour -= 12;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const newTime = new date.Time(newHour, value.minute, value.second);
|
|
48
|
+
onChangeTime(newTime);
|
|
49
|
+
};
|
|
50
|
+
const isPM = value && value?.hour >= 12;
|
|
51
|
+
const displayHour = React.useMemo(() => {
|
|
52
|
+
if (value === void 0) return 0;
|
|
53
|
+
return hourCycle === 12 ? value.hour === 0 ? 12 : value.hour > 12 ? value.hour - 12 : value.hour : value.hour;
|
|
54
|
+
}, [value, hourCycle]);
|
|
55
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ React.createElement(
|
|
56
|
+
Button.Button,
|
|
57
|
+
{
|
|
58
|
+
className: "p-micro",
|
|
59
|
+
variants: {
|
|
60
|
+
size: "circle",
|
|
61
|
+
variant: "outline"
|
|
62
|
+
},
|
|
63
|
+
onClick: onPressOkButton
|
|
64
|
+
},
|
|
65
|
+
/* @__PURE__ */ React.createElement(md.MdClose, null)
|
|
66
|
+
)), /* @__PURE__ */ React.createElement("div", { className: "flex flex-row gap-x-deca max-h-[300px] overflow-hidden" }, /* @__PURE__ */ React.createElement("div", { className: "min-w-7 flex flex-col gap-y-micro p-micro" }, /* @__PURE__ */ React.createElement("span", { className: "text-base font-bold text-center" }, hourLabel), /* @__PURE__ */ React.createElement(
|
|
67
|
+
ScrollableDigitSelector.ScrollableDigitSelector,
|
|
68
|
+
{
|
|
69
|
+
value: displayHour,
|
|
70
|
+
onChange: handleHourChange,
|
|
71
|
+
min: hourCycle === 12 ? 1 : 0,
|
|
72
|
+
max: hourCycle === 12 ? 12 : 23
|
|
73
|
+
}
|
|
74
|
+
)), /* @__PURE__ */ React.createElement("div", { className: "min-w-7 flex flex-col gap-y-micro p-micro" }, /* @__PURE__ */ React.createElement("span", { className: "text-base font-bold text-center" }, minuteLabel), /* @__PURE__ */ React.createElement(
|
|
75
|
+
ScrollableDigitSelector.ScrollableDigitSelector,
|
|
76
|
+
{
|
|
77
|
+
value: value?.minute ?? 0,
|
|
78
|
+
onChange: handleMinuteChange,
|
|
79
|
+
min: 0,
|
|
80
|
+
max: 59,
|
|
81
|
+
step: minuteInterval
|
|
82
|
+
}
|
|
83
|
+
)), hourCycle === 12 && /* @__PURE__ */ React.createElement("div", { className: "min-w-7 flex flex-col gap-y-micro p-micro" }, /* @__PURE__ */ React.createElement("span", { className: "text-base font-bold text-center" }, dayPeriodLabel), /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-y-micro p-micro overflow-auto" }, /* @__PURE__ */ React.createElement(
|
|
84
|
+
"div",
|
|
85
|
+
{
|
|
86
|
+
onClick: () => handlePeriodChange(false),
|
|
87
|
+
className: "flex justify-center"
|
|
88
|
+
},
|
|
89
|
+
/* @__PURE__ */ React.createElement(
|
|
90
|
+
"span",
|
|
91
|
+
{
|
|
92
|
+
className: clsx(
|
|
93
|
+
dayPeriodStyle,
|
|
94
|
+
!isPM && "bg-primary-medium text-white"
|
|
95
|
+
)
|
|
96
|
+
},
|
|
97
|
+
"AM"
|
|
98
|
+
)
|
|
99
|
+
), /* @__PURE__ */ React.createElement(
|
|
100
|
+
"div",
|
|
101
|
+
{
|
|
102
|
+
onClick: () => handlePeriodChange(true),
|
|
103
|
+
className: "flex justify-center"
|
|
104
|
+
},
|
|
105
|
+
/* @__PURE__ */ React.createElement(
|
|
106
|
+
"span",
|
|
107
|
+
{
|
|
108
|
+
className: clsx(
|
|
109
|
+
dayPeriodStyle,
|
|
110
|
+
isPM && "bg-primary-medium text-white"
|
|
111
|
+
)
|
|
112
|
+
},
|
|
113
|
+
"PM"
|
|
114
|
+
)
|
|
115
|
+
)))));
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
exports.TimePickerSelector = TimePickerSelector;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var Context = require('../components/Popover/Context.js');
|
|
5
|
+
var date = require('@internationalized/date');
|
|
6
|
+
|
|
7
|
+
const useTimePickerInput = ({
|
|
8
|
+
value,
|
|
9
|
+
onChange,
|
|
10
|
+
minuteInterval
|
|
11
|
+
}) => {
|
|
12
|
+
const { setIsOpen } = Context.usePopoverContext();
|
|
13
|
+
const [popoverTime, setPopoverTime] = React.useState(value ?? new date.Time(0, 0));
|
|
14
|
+
const handleTimeFieldChange = (newValue) => {
|
|
15
|
+
if (newValue && minuteInterval > 1) {
|
|
16
|
+
const time = newValue;
|
|
17
|
+
const adjustedMinute = Math.round(time.minute / minuteInterval) * minuteInterval % 60;
|
|
18
|
+
const adjustedTime = time.set({ minute: adjustedMinute });
|
|
19
|
+
onChange?.(adjustedTime);
|
|
20
|
+
setPopoverTime(adjustedTime);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const newTime = newValue ? new date.Time(newValue.hour, newValue.minute, newValue.second) : void 0;
|
|
24
|
+
onChange?.(newTime);
|
|
25
|
+
setPopoverTime(newTime ?? new date.Time(0, 0));
|
|
26
|
+
};
|
|
27
|
+
const handleTogglePopover = React.useCallback(() => {
|
|
28
|
+
setIsOpen((open) => !open);
|
|
29
|
+
}, []);
|
|
30
|
+
const handleChangeTimeOnSelector = React.useCallback(
|
|
31
|
+
(time) => {
|
|
32
|
+
setPopoverTime(time);
|
|
33
|
+
handleTimeFieldChange(time);
|
|
34
|
+
},
|
|
35
|
+
[handleTimeFieldChange]
|
|
36
|
+
);
|
|
37
|
+
return {
|
|
38
|
+
handleTogglePopover,
|
|
39
|
+
handleTimeFieldChange,
|
|
40
|
+
handleChangeTimeOnSelector,
|
|
41
|
+
popoverTime
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
exports.useTimePickerInput = useTimePickerInput;
|
package/dist/cjs/index.js
CHANGED
|
@@ -37,8 +37,10 @@ var index$5 = require('./components/Stepper/index.js');
|
|
|
37
37
|
var Table = require('./components/Table.js');
|
|
38
38
|
var Tag = require('./components/Tag.js');
|
|
39
39
|
var index$6 = require('./components/TextArea/index.js');
|
|
40
|
-
var TimeField = require('./components/
|
|
41
|
-
var
|
|
40
|
+
var TimeField = require('./components/TimePicker/TimeField.js');
|
|
41
|
+
var TimePickerInput = require('./components/TimePicker/TimePickerInput.js');
|
|
42
|
+
var TimePickerSelector = require('./components/TimePicker/TimePickerSelector.js');
|
|
43
|
+
var TimeFieldInput = require('./components/TimePicker/TimeFieldInput.js');
|
|
42
44
|
var Toggle = require('./components/Toggle.js');
|
|
43
45
|
var Tooltip = require('./components/Tooltip.js');
|
|
44
46
|
var index$7 = require('./components/Uploader/index.js');
|
|
@@ -58,6 +60,7 @@ var useRangeCalendar = require('./hooks/useRangeCalendar.js');
|
|
|
58
60
|
var useSelectGroupedOptions = require('./hooks/useSelectGroupedOptions.js');
|
|
59
61
|
var useSelectOptions = require('./hooks/useSelectOptions.js');
|
|
60
62
|
var useStringMask = require('./hooks/useStringMask.js');
|
|
63
|
+
var useTimePickerInput = require('./hooks/useTimePickerInput.js');
|
|
61
64
|
var SnackbarSonner = require('./service/SnackbarSonner.js');
|
|
62
65
|
var MenubarProvider = require('./provider/MenubarProvider.js');
|
|
63
66
|
var SnackbarProvider = require('./provider/SnackbarProvider.js');
|
|
@@ -116,6 +119,8 @@ exports.Td = Table.Td;
|
|
|
116
119
|
exports.Tag = Tag.Tag;
|
|
117
120
|
exports.TextArea = index$6.TextArea;
|
|
118
121
|
exports.TimeField = TimeField.TimeField;
|
|
122
|
+
exports.TimePickerInput = TimePickerInput.TimePickerInput;
|
|
123
|
+
exports.TimePickerSelector = TimePickerSelector.TimePickerSelector;
|
|
119
124
|
exports.TimeFieldInput = TimeFieldInput.TimeFieldInput;
|
|
120
125
|
exports.Toggle = Toggle.Toggle;
|
|
121
126
|
exports.Tooltip = Tooltip.Tooltip;
|
|
@@ -141,6 +146,7 @@ exports.applyStringMask = useStringMask.applyStringMask;
|
|
|
141
146
|
exports.getMask = useStringMask.getMask;
|
|
142
147
|
exports.mergeMask = useStringMask.mergeMask;
|
|
143
148
|
exports.useStringMask = useStringMask.useStringMask;
|
|
149
|
+
exports.useTimePickerInput = useTimePickerInput.useTimePickerInput;
|
|
144
150
|
exports.SnackbarSonner = SnackbarSonner.SnackbarSonner;
|
|
145
151
|
exports.MenubarProvider = MenubarProvider.MenubarProvider;
|
|
146
152
|
exports.SnackbarProvider = SnackbarProvider.SnackbarProvider;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tailwindVariants = require('tailwind-variants');
|
|
4
|
+
|
|
5
|
+
const timePickerInputBase = tailwindVariants.tv({
|
|
6
|
+
slots: {
|
|
7
|
+
icon: "cursor-pointer text-deca"
|
|
8
|
+
},
|
|
9
|
+
variants: {
|
|
10
|
+
disabled: {
|
|
11
|
+
true: {
|
|
12
|
+
icon: "text-secondary-light cursor-default"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
exports.timePickerInputBase = timePickerInputBase;
|
package/dist/cjs/utils/date.js
CHANGED
|
@@ -16,11 +16,6 @@ const calendarDateToDate = (value) => {
|
|
|
16
16
|
if (!value) return void 0;
|
|
17
17
|
return value.toDate(date.getLocalTimeZone());
|
|
18
18
|
};
|
|
19
|
-
const timeFromTimeValue = (value) => {
|
|
20
|
-
if (!value) return void 0;
|
|
21
|
-
return new date.Time(value.hour, value.minute, value.second, value.millisecond);
|
|
22
|
-
};
|
|
23
19
|
|
|
24
20
|
exports.calendarDateToDate = calendarDateToDate;
|
|
25
21
|
exports.dateToCalendarDateTime = dateToCalendarDateTime;
|
|
26
|
-
exports.timeFromTimeValue = timeFromTimeValue;
|
|
@@ -9,9 +9,10 @@ import 'react-dropzone';
|
|
|
9
9
|
import 'uuid';
|
|
10
10
|
import '@floating-ui/react';
|
|
11
11
|
import 'currency.js';
|
|
12
|
+
import '../Popover/Context.js';
|
|
12
13
|
import { Calendar } from '../Calendar/Calendar.js';
|
|
13
14
|
import { Popover } from '../Popover/index.js';
|
|
14
|
-
import { Content } from '../
|
|
15
|
+
import { Content } from '../Content.js';
|
|
15
16
|
import { DateField } from './DateField.js';
|
|
16
17
|
import { DatePickerInputBase } from './DatePickerInputBase.js';
|
|
17
18
|
|
|
@@ -9,9 +9,10 @@ import 'react-dropzone';
|
|
|
9
9
|
import 'uuid';
|
|
10
10
|
import '@floating-ui/react';
|
|
11
11
|
import 'currency.js';
|
|
12
|
+
import '../Popover/Context.js';
|
|
12
13
|
import { RangeCalendar } from '../Calendar/RangeCalendar.js';
|
|
13
14
|
import { Popover } from '../Popover/index.js';
|
|
14
|
-
import { Content } from '
|
|
15
|
+
import { Content } from '../Content.js';
|
|
15
16
|
import { DateField } from './DateField.js';
|
|
16
17
|
import { DatePickerInputBase } from './DatePickerInputBase.js';
|
|
17
18
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React__default, { useRef, useMemo, useEffect } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
|
|
4
|
+
const formatValue = (val) => {
|
|
5
|
+
return val.toString().padStart(2, "0");
|
|
6
|
+
};
|
|
7
|
+
const ScrollableDigitSelector = ({
|
|
8
|
+
value,
|
|
9
|
+
onChange,
|
|
10
|
+
min,
|
|
11
|
+
max,
|
|
12
|
+
step = 1
|
|
13
|
+
}) => {
|
|
14
|
+
const containerRef = useRef(null);
|
|
15
|
+
const values = useMemo(() => {
|
|
16
|
+
const vals = [];
|
|
17
|
+
for (let i = min; i <= max; i += step) {
|
|
18
|
+
vals.push(i);
|
|
19
|
+
}
|
|
20
|
+
return vals;
|
|
21
|
+
}, [min, max, step]);
|
|
22
|
+
const scrollToValue = (targetValue) => {
|
|
23
|
+
if (containerRef.current) {
|
|
24
|
+
const index = values.indexOf(targetValue);
|
|
25
|
+
if (index !== -1) {
|
|
26
|
+
const itemHeight = 27;
|
|
27
|
+
const scrollTop = index * itemHeight;
|
|
28
|
+
containerRef.current.scrollTop = scrollTop;
|
|
29
|
+
containerRef.current.scrollTo({ top: scrollTop, behavior: "smooth" });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
scrollToValue(value);
|
|
35
|
+
}, []);
|
|
36
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
className: "flex flex-col items-center gap-y-micro p-micro overflow-auto",
|
|
40
|
+
ref: containerRef
|
|
41
|
+
},
|
|
42
|
+
values.map((val) => /* @__PURE__ */ React__default.createElement("div", { key: val }, /* @__PURE__ */ React__default.createElement("div", { onClick: () => onChange(val), className: "flex justify-center" }, /* @__PURE__ */ React__default.createElement(
|
|
43
|
+
"span",
|
|
44
|
+
{
|
|
45
|
+
className: clsx(
|
|
46
|
+
"p-micro rounded-micro border-1 border-transparent hover:bg-primary-light hover:border-primary cursor-pointer",
|
|
47
|
+
value === val && "bg-primary-medium text-white"
|
|
48
|
+
)
|
|
49
|
+
},
|
|
50
|
+
formatValue(val)
|
|
51
|
+
))))
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { ScrollableDigitSelector };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { option, checkbox } from '@tecsinapse/cortex-core';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { useMultiSelectOption } from './useMultiSelectOption.js';
|
|
4
|
+
|
|
5
|
+
const SelectCustomMultiOption = ({
|
|
6
|
+
onSelect,
|
|
7
|
+
option: option$1,
|
|
8
|
+
grouped = false,
|
|
9
|
+
children
|
|
10
|
+
}) => {
|
|
11
|
+
const { onClickOption, isChecked, inputRef } = useMultiSelectOption(
|
|
12
|
+
option$1,
|
|
13
|
+
onSelect
|
|
14
|
+
);
|
|
15
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
16
|
+
"li",
|
|
17
|
+
{
|
|
18
|
+
onClick: onClickOption,
|
|
19
|
+
className: option({ grouped }),
|
|
20
|
+
role: "option"
|
|
21
|
+
},
|
|
22
|
+
/* @__PURE__ */ React__default.createElement(
|
|
23
|
+
"input",
|
|
24
|
+
{
|
|
25
|
+
type: "checkbox",
|
|
26
|
+
checked: isChecked,
|
|
27
|
+
className: checkbox({ className: "pointer-events-none" }),
|
|
28
|
+
onChange: () => false,
|
|
29
|
+
ref: inputRef
|
|
30
|
+
}
|
|
31
|
+
),
|
|
32
|
+
children
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { SelectCustomMultiOption };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React__default, { useContext } from 'react';
|
|
2
|
+
import { SelectContext } from './context.js';
|
|
3
|
+
import { option } from '@tecsinapse/cortex-core';
|
|
4
|
+
|
|
5
|
+
const SelectCustomOption = ({
|
|
6
|
+
option: option$1,
|
|
7
|
+
onSelectOption,
|
|
8
|
+
grouped = false,
|
|
9
|
+
children
|
|
10
|
+
}) => {
|
|
11
|
+
const { keyExtractor, value } = useContext(SelectContext);
|
|
12
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
13
|
+
"li",
|
|
14
|
+
{
|
|
15
|
+
onClick: (e) => {
|
|
16
|
+
e.preventDefault();
|
|
17
|
+
onSelectOption(option$1);
|
|
18
|
+
},
|
|
19
|
+
className: option({
|
|
20
|
+
selected: value && keyExtractor(value) === keyExtractor(option$1),
|
|
21
|
+
grouped
|
|
22
|
+
}),
|
|
23
|
+
role: "option"
|
|
24
|
+
},
|
|
25
|
+
children
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { SelectCustomOption };
|
|
@@ -31,7 +31,7 @@ const SelectMultiCheckAllOptions = ({
|
|
|
31
31
|
updateSelected.splice(updateSelected.indexOf(it), 1);
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
|
-
onSelect(updateSelected);
|
|
34
|
+
onSelect?.(updateSelected);
|
|
35
35
|
}
|
|
36
36
|
}, [options, onSelect]);
|
|
37
37
|
return options?.length ? /* @__PURE__ */ React__default.createElement("div", { className: option(), onClick: checkAll }, /* @__PURE__ */ React__default.createElement(
|
|
@@ -12,7 +12,6 @@ import { useSelectGroupedOptions } from '../../hooks/useSelectGroupedOptions.js'
|
|
|
12
12
|
import { SelectMultiOption } from './MultiOption.js';
|
|
13
13
|
import { SkeletonOptions } from './SkeletonOptions.js';
|
|
14
14
|
import { SelectContext, SelectMultiOptionsContext } from './context.js';
|
|
15
|
-
import { handleSelectMulti } from './utils.js';
|
|
16
15
|
|
|
17
16
|
const { groupedTitle, list } = selectVariants();
|
|
18
17
|
const SelectMultiGroupedOptions = ({
|
|
@@ -21,7 +20,7 @@ const SelectMultiGroupedOptions = ({
|
|
|
21
20
|
options,
|
|
22
21
|
children
|
|
23
22
|
}) => {
|
|
24
|
-
const {
|
|
23
|
+
const { keyExtractor } = useContext(SelectContext);
|
|
25
24
|
const { options: _options, isLoading } = useSelectGroupedOptions({ options });
|
|
26
25
|
const flattenMap = useMemo(
|
|
27
26
|
() => _options ? Array.from(_options?.values()).flatMap((value) => value) : [],
|
|
@@ -39,12 +38,7 @@ const SelectMultiGroupedOptions = ({
|
|
|
39
38
|
grouped: true,
|
|
40
39
|
option,
|
|
41
40
|
key: keyExtractor(option),
|
|
42
|
-
|
|
43
|
-
option2,
|
|
44
|
-
currentValue,
|
|
45
|
-
onSelect,
|
|
46
|
-
keyExtractor
|
|
47
|
-
)
|
|
41
|
+
onSelect
|
|
48
42
|
}
|
|
49
43
|
)))))
|
|
50
44
|
);
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
import { option, checkbox } from '@tecsinapse/cortex-core';
|
|
2
|
-
import React__default
|
|
3
|
-
import {
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { useMultiSelectOption } from './useMultiSelectOption.js';
|
|
4
4
|
|
|
5
5
|
const SelectMultiOption = ({
|
|
6
|
-
|
|
6
|
+
onSelect,
|
|
7
7
|
option: option$1,
|
|
8
8
|
grouped = false
|
|
9
9
|
}) => {
|
|
10
|
-
const {
|
|
11
|
-
const inputRef = useRef(null);
|
|
12
|
-
const isChecked = useMemo(
|
|
13
|
-
() => value?.length > 0 && value.find((it) => keyExtractor(it) === keyExtractor(option$1)) !== void 0,
|
|
14
|
-
[value, option$1]
|
|
15
|
-
);
|
|
16
|
-
const onClickOption = useCallback(() => {
|
|
17
|
-
onSelectOption(option$1);
|
|
18
|
-
inputRef.current?.click();
|
|
19
|
-
}, [onSelectOption, inputRef]);
|
|
10
|
+
const { onClickOption, isChecked, inputRef, labelExtractor } = useMultiSelectOption(option$1, onSelect);
|
|
20
11
|
return /* @__PURE__ */ React__default.createElement(
|
|
21
12
|
"li",
|
|
22
13
|
{
|
|
@@ -12,7 +12,6 @@ import { useSelectOptions } from '../../hooks/useSelectOptions.js';
|
|
|
12
12
|
import { SelectMultiOption } from './MultiOption.js';
|
|
13
13
|
import { SkeletonOptions } from './SkeletonOptions.js';
|
|
14
14
|
import { SelectContext, SelectMultiOptionsContext } from './context.js';
|
|
15
|
-
import { handleSelectMulti } from './utils.js';
|
|
16
15
|
|
|
17
16
|
const { list } = selectVariants();
|
|
18
17
|
const SelectMultiOptions = ({
|
|
@@ -20,14 +19,14 @@ const SelectMultiOptions = ({
|
|
|
20
19
|
options,
|
|
21
20
|
children
|
|
22
21
|
}) => {
|
|
23
|
-
const { keyExtractor
|
|
22
|
+
const { keyExtractor } = useContext(SelectContext);
|
|
24
23
|
const { options: _options, isLoading } = useSelectOptions({ options });
|
|
25
24
|
return /* @__PURE__ */ React__default.createElement(SelectMultiOptionsContext.Provider, { value: { onSelect, options: _options } }, isLoading ? /* @__PURE__ */ React__default.createElement(SkeletonOptions, null) : /* @__PURE__ */ React__default.createElement("ul", { role: "select", className: list() }, children, _options?.map((option) => /* @__PURE__ */ React__default.createElement(
|
|
26
25
|
SelectMultiOption,
|
|
27
26
|
{
|
|
28
27
|
option,
|
|
29
28
|
key: keyExtractor(option),
|
|
30
|
-
|
|
29
|
+
onSelect
|
|
31
30
|
}
|
|
32
31
|
))));
|
|
33
32
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { selectVariants } from '@tecsinapse/cortex-core';
|
|
2
|
-
import React__default, { useContext, useCallback } from 'react';
|
|
2
|
+
import React__default, { useContext, useCallback, useMemo } from 'react';
|
|
3
3
|
import '@internationalized/date';
|
|
4
4
|
import 'react-aria';
|
|
5
5
|
import 'react-stately';
|
|
@@ -16,26 +16,31 @@ import { SelectContext } from './context.js';
|
|
|
16
16
|
const { list } = selectVariants();
|
|
17
17
|
const SelectOptions = ({
|
|
18
18
|
onSelect,
|
|
19
|
-
options
|
|
19
|
+
options,
|
|
20
|
+
children
|
|
20
21
|
}) => {
|
|
21
22
|
const { keyExtractor } = useContext(SelectContext);
|
|
22
23
|
const { setIsOpen } = usePopoverContext();
|
|
23
24
|
const { options: _options, isLoading } = useSelectOptions({ options });
|
|
24
25
|
const handleSelect = useCallback(
|
|
25
26
|
(option) => {
|
|
26
|
-
onSelect(option);
|
|
27
|
+
onSelect?.(option);
|
|
27
28
|
setIsOpen?.(false);
|
|
28
29
|
},
|
|
29
30
|
[onSelect]
|
|
30
31
|
);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
const defaultOptions = useMemo(
|
|
33
|
+
() => _options?.map((option) => /* @__PURE__ */ React__default.createElement(
|
|
34
|
+
SelectOption,
|
|
35
|
+
{
|
|
36
|
+
option,
|
|
37
|
+
key: keyExtractor(option),
|
|
38
|
+
onSelectOption: handleSelect
|
|
39
|
+
}
|
|
40
|
+
)) ?? [],
|
|
41
|
+
[_options, keyExtractor, handleSelect]
|
|
42
|
+
);
|
|
43
|
+
return isLoading ? /* @__PURE__ */ React__default.createElement(SkeletonOptions, null) : /* @__PURE__ */ React__default.createElement("ul", { role: "select", className: list() }, children ?? defaultOptions);
|
|
39
44
|
};
|
|
40
45
|
|
|
41
46
|
export { SelectOptions };
|
|
@@ -8,6 +8,8 @@ import { SelectOptions } from './Options.js';
|
|
|
8
8
|
import { SelectPopover } from './Popover.js';
|
|
9
9
|
import { SelectRoot } from './Root.js';
|
|
10
10
|
import { SelectTrigger } from './Trigger.js';
|
|
11
|
+
import { SelectCustomOption } from './CustomOption.js';
|
|
12
|
+
import { SelectCustomMultiOption } from './CustomMultiOption.js';
|
|
11
13
|
|
|
12
14
|
const Select = {
|
|
13
15
|
Root: SelectRoot,
|
|
@@ -19,7 +21,9 @@ const Select = {
|
|
|
19
21
|
MultiOptions: SelectMultiOptions,
|
|
20
22
|
MultiGroupedOptions: SelectMultiGroupedOptions,
|
|
21
23
|
MultiOption: SelectMultiOption,
|
|
22
|
-
MultiCheckAllOptions: SelectMultiCheckAllOptions
|
|
24
|
+
MultiCheckAllOptions: SelectMultiCheckAllOptions,
|
|
25
|
+
CustomOption: SelectCustomOption,
|
|
26
|
+
CustomMultiOption: SelectCustomMultiOption
|
|
23
27
|
};
|
|
24
28
|
|
|
25
29
|
export { Select };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useContext, useRef, useMemo, useCallback } from 'react';
|
|
2
|
+
import { SelectContext } from './context.js';
|
|
3
|
+
import { handleSelectMulti } from './utils.js';
|
|
4
|
+
|
|
5
|
+
const useMultiSelectOption = (option, onSelect) => {
|
|
6
|
+
const { keyExtractor, value, labelExtractor } = useContext(SelectContext);
|
|
7
|
+
const inputRef = useRef(null);
|
|
8
|
+
const onSelectOption = (option2) => handleSelectMulti(option2, value, keyExtractor, onSelect);
|
|
9
|
+
const isChecked = useMemo(
|
|
10
|
+
() => value?.length > 0 && value.find((it) => keyExtractor(it) === keyExtractor(option)) !== void 0,
|
|
11
|
+
[value, option]
|
|
12
|
+
);
|
|
13
|
+
const onClickOption = useCallback(() => {
|
|
14
|
+
onSelectOption(option);
|
|
15
|
+
inputRef.current?.click();
|
|
16
|
+
}, [onSelectOption, inputRef]);
|
|
17
|
+
return {
|
|
18
|
+
keyExtractor,
|
|
19
|
+
value,
|
|
20
|
+
isChecked,
|
|
21
|
+
onClickOption,
|
|
22
|
+
inputRef,
|
|
23
|
+
labelExtractor
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { useMultiSelectOption };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const handleSelectMulti = (option, value,
|
|
1
|
+
const handleSelectMulti = (option, value, keyExtractor, onSelect) => {
|
|
2
2
|
const current = Array.from(value ?? []);
|
|
3
3
|
const indexOf = current.findIndex(
|
|
4
4
|
(it) => keyExtractor(it) === keyExtractor(option)
|
|
@@ -8,7 +8,7 @@ const handleSelectMulti = (option, value, onSelect, keyExtractor) => {
|
|
|
8
8
|
} else {
|
|
9
9
|
current.splice(indexOf, 1);
|
|
10
10
|
}
|
|
11
|
-
onSelect(current);
|
|
11
|
+
onSelect?.(current);
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
export { handleSelectMulti };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React__default, { useCallback, useEffect } from 'react';
|
|
2
|
+
import { useLocale, useTimeField } from 'react-aria';
|
|
3
|
+
import { useTimeFieldState } from 'react-stately';
|
|
4
|
+
import { DateSegment } from '../DatePicker/DateSegment.js';
|
|
5
|
+
|
|
6
|
+
const formatLiteralSegment = (text) => {
|
|
7
|
+
return text.includes(",") ? text.replace(/,/g, " ") : text;
|
|
8
|
+
};
|
|
9
|
+
const TimeField = ({ onClickTime, ...props }) => {
|
|
10
|
+
const { value } = props;
|
|
11
|
+
const { locale } = useLocale();
|
|
12
|
+
const state = useTimeFieldState({
|
|
13
|
+
...props,
|
|
14
|
+
locale,
|
|
15
|
+
shouldForceLeadingZeros: true
|
|
16
|
+
});
|
|
17
|
+
const ref = React__default.useRef(null);
|
|
18
|
+
const { fieldProps } = useTimeField(
|
|
19
|
+
{ "aria-label": "time-field" },
|
|
20
|
+
state,
|
|
21
|
+
ref
|
|
22
|
+
);
|
|
23
|
+
const handleOnClickSegment = useCallback(
|
|
24
|
+
(segment) => {
|
|
25
|
+
if (!segment.isEditable || state.isDisabled) return;
|
|
26
|
+
if (["hour", "minute", "second", "dayPeriod"].includes(segment.type)) {
|
|
27
|
+
onClickTime?.();
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
[onClickTime, state.isDisabled]
|
|
31
|
+
);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!value) {
|
|
34
|
+
state.setValue(null);
|
|
35
|
+
}
|
|
36
|
+
}, [value]);
|
|
37
|
+
return /* @__PURE__ */ React__default.createElement("div", { ...fieldProps, ref, className: "flex flex-row" }, state.segments.map((segment, i) => {
|
|
38
|
+
if (segment.type === "literal") {
|
|
39
|
+
const text = formatLiteralSegment(segment.text);
|
|
40
|
+
return /* @__PURE__ */ React__default.createElement("span", { key: i, style: { whiteSpace: "pre" } }, text);
|
|
41
|
+
}
|
|
42
|
+
return /* @__PURE__ */ React__default.createElement("div", { key: i, onClick: () => handleOnClickSegment(segment) }, /* @__PURE__ */ React__default.createElement(DateSegment, { segment, state }));
|
|
43
|
+
}));
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { TimeField };
|