@tecsinapse/cortex-react 1.13.0 → 1.13.1-beta.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.
Files changed (71) hide show
  1. package/dist/cjs/components/DatePicker/DatePickerInput.js +3 -2
  2. package/dist/cjs/components/DatePicker/DateRangePickerInput.js +3 -2
  3. package/dist/cjs/components/ScrollableDigitSelector.js +57 -0
  4. package/dist/cjs/components/Select/CustomMultiOption.js +38 -0
  5. package/dist/cjs/components/Select/CustomOption.js +31 -0
  6. package/dist/cjs/components/Select/MultiCheckAllOptions.js +1 -1
  7. package/dist/cjs/components/Select/MultiGroupedOptions.js +2 -8
  8. package/dist/cjs/components/Select/MultiOption.js +3 -12
  9. package/dist/cjs/components/Select/MultiOptions.js +2 -3
  10. package/dist/cjs/components/Select/Options.js +15 -10
  11. package/dist/cjs/components/Select/index.js +5 -1
  12. package/dist/cjs/components/Select/useMultiSelectOption.js +29 -0
  13. package/dist/cjs/components/Select/utils.js +2 -2
  14. package/dist/cjs/components/TimePicker/TimeField.js +48 -0
  15. package/dist/cjs/components/TimePicker/TimeFieldInput.js +82 -0
  16. package/dist/cjs/components/TimePicker/TimePickerInput.js +78 -0
  17. package/dist/cjs/components/TimePicker/TimePickerSelector.js +118 -0
  18. package/dist/cjs/hooks/useTimePickerInput.js +45 -0
  19. package/dist/cjs/index.js +8 -2
  20. package/dist/cjs/styles/time-field-input.js +18 -0
  21. package/dist/cjs/utils/date.js +0 -5
  22. package/dist/esm/components/DatePicker/DatePickerInput.js +3 -2
  23. package/dist/esm/components/DatePicker/DateRangePickerInput.js +3 -2
  24. package/dist/esm/components/ScrollableDigitSelector.js +55 -0
  25. package/dist/esm/components/Select/CustomMultiOption.js +36 -0
  26. package/dist/esm/components/Select/CustomOption.js +29 -0
  27. package/dist/esm/components/Select/MultiCheckAllOptions.js +1 -1
  28. package/dist/esm/components/Select/MultiGroupedOptions.js +2 -8
  29. package/dist/esm/components/Select/MultiOption.js +4 -13
  30. package/dist/esm/components/Select/MultiOptions.js +2 -3
  31. package/dist/esm/components/Select/Options.js +16 -11
  32. package/dist/esm/components/Select/index.js +5 -1
  33. package/dist/esm/components/Select/useMultiSelectOption.js +27 -0
  34. package/dist/esm/components/Select/utils.js +2 -2
  35. package/dist/esm/components/TimePicker/TimeField.js +46 -0
  36. package/dist/esm/components/TimePicker/TimeFieldInput.js +80 -0
  37. package/dist/esm/components/TimePicker/TimePickerInput.js +76 -0
  38. package/dist/esm/components/TimePicker/TimePickerSelector.js +116 -0
  39. package/dist/esm/hooks/useTimePickerInput.js +43 -0
  40. package/dist/esm/index.js +5 -2
  41. package/dist/esm/styles/time-field-input.js +16 -0
  42. package/dist/esm/utils/date.js +2 -6
  43. package/dist/types/components/ScrollableDigitSelector.d.ts +10 -0
  44. package/dist/types/components/Select/CustomMultiOption.d.ts +3 -0
  45. package/dist/types/components/Select/CustomOption.d.ts +3 -0
  46. package/dist/types/components/Select/MultiOption.d.ts +1 -1
  47. package/dist/types/components/Select/Options.d.ts +1 -1
  48. package/dist/types/components/Select/context.d.ts +1 -1
  49. package/dist/types/components/Select/index.d.ts +4 -2
  50. package/dist/types/components/Select/types.d.ts +10 -3
  51. package/dist/types/components/Select/useMultiSelectOption.d.ts +8 -0
  52. package/dist/types/components/Select/utils.d.ts +1 -1
  53. package/dist/types/components/{TimeField → TimePicker}/TimeField.d.ts +2 -1
  54. package/dist/types/components/TimePicker/TimeFieldInput.d.ts +14 -0
  55. package/dist/types/components/TimePicker/TimePickerInput.d.ts +15 -0
  56. package/dist/types/components/TimePicker/TimePickerSelector.d.ts +14 -0
  57. package/dist/types/components/TimePicker/index.d.ts +4 -0
  58. package/dist/types/components/index.d.ts +1 -1
  59. package/dist/types/hooks/index.d.ts +1 -0
  60. package/dist/types/hooks/useTimePickerInput.d.ts +14 -0
  61. package/dist/types/styles/time-field-input.d.ts +25 -0
  62. package/package.json +2 -2
  63. package/dist/cjs/components/TimeField/TimeField.js +0 -24
  64. package/dist/cjs/components/TimeField/TimeFieldInput.js +0 -42
  65. package/dist/esm/components/TimeField/TimeField.js +0 -22
  66. package/dist/esm/components/TimeField/TimeFieldInput.js +0 -40
  67. package/dist/types/components/TimeField/TimeFieldInput.d.ts +0 -11
  68. package/dist/types/components/TimeField/index.d.ts +0 -2
  69. /package/dist/cjs/components/{DatePicker/Content.js → Content.js} +0 -0
  70. /package/dist/esm/components/{DatePicker/Content.js → Content.js} +0 -0
  71. /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/TimeField/TimeField.js');
41
- var TimeFieldInput = require('./components/TimeField/TimeFieldInput.js');
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;
@@ -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 '../Select/Content.js';
15
+ import { Content } from '../Content.js';
15
16
  import { DateField } from './DateField.js';
16
17
  import { DatePickerInputBase } from './DatePickerInputBase.js';
17
18
 
@@ -64,7 +65,7 @@ const DatePickerInputWithPopover = (props) => {
64
65
  )), /* @__PURE__ */ React__default.createElement(
65
66
  Popover.Content,
66
67
  {
67
- className: "bg-inherit shadow-none border-none",
68
+ className: "bg-inherit shadow-lg border-none",
68
69
  initialFocus: -1
69
70
  },
70
71
  /* @__PURE__ */ React__default.createElement(Calendar, { value, onChange: handleChangeCalendar })
@@ -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 './Content.js';
15
+ import { Content } from '../Content.js';
15
16
  import { DateField } from './DateField.js';
16
17
  import { DatePickerInputBase } from './DatePickerInputBase.js';
17
18
 
@@ -77,7 +78,7 @@ const DateRangePickerInputWithPopover = (props) => {
77
78
  )), /* @__PURE__ */ React__default.createElement(
78
79
  Popover.Content,
79
80
  {
80
- className: "bg-inherit shadow-none border-none",
81
+ className: "bg-inherit shadow-lg border-none",
81
82
  initialFocus: -1
82
83
  },
83
84
  /* @__PURE__ */ React__default.createElement(RangeCalendar, { value, onChange: handleChangeCalendar })
@@ -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 { value: currentValue = [], keyExtractor } = useContext(SelectContext);
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
- onSelectOption: (option2) => handleSelectMulti(
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, { useContext, useRef, useMemo, useCallback } from 'react';
3
- import { SelectContext } from './context.js';
2
+ import React__default from 'react';
3
+ import { useMultiSelectOption } from './useMultiSelectOption.js';
4
4
 
5
5
  const SelectMultiOption = ({
6
- onSelectOption,
6
+ onSelect,
7
7
  option: option$1,
8
8
  grouped = false
9
9
  }) => {
10
- const { keyExtractor, labelExtractor, value } = useContext(SelectContext);
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, value: currentValue = [] } = useContext(SelectContext);
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
- onSelectOption: (option2) => handleSelectMulti(option2, currentValue, onSelect, keyExtractor)
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
- return isLoading ? /* @__PURE__ */ React__default.createElement(SkeletonOptions, null) : /* @__PURE__ */ React__default.createElement("ul", { role: "select", className: list() }, _options?.map((option) => /* @__PURE__ */ React__default.createElement(
32
- SelectOption,
33
- {
34
- option,
35
- key: keyExtractor(option),
36
- onSelectOption: handleSelect
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, onSelect, keyExtractor) => {
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 };