@televet/kibble-ui 1.18.0 → 1.19.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.
@@ -0,0 +1,4 @@
1
+ declare const ScrollContainer: ({ ...props }: {
2
+ [x: string]: any;
3
+ }) => JSX.Element;
4
+ export default ScrollContainer;
@@ -0,0 +1,9 @@
1
+ import { MutableRefObject } from 'react';
2
+ interface TimeOptionProps {
3
+ value: string;
4
+ innerRef?: MutableRefObject<HTMLDivElement | null> | null;
5
+ isSelected: boolean;
6
+ handleClick: (selectedValue: string) => void;
7
+ }
8
+ declare const TimeOption: ({ value, innerRef, isSelected, handleClick }: TimeOptionProps) => JSX.Element;
9
+ export default TimeOption;
@@ -0,0 +1,3 @@
1
+ export * from './timePicker.component';
2
+ export * from './timePicker.types';
3
+ export * from '../TimeRange/timeRange.component';
@@ -0,0 +1,82 @@
1
+ export declare const timePickerArgTypes: {
2
+ initialTime: {
3
+ defaultValue: Date;
4
+ description: string;
5
+ table: {
6
+ type: {
7
+ summary: string;
8
+ };
9
+ defaultValue: null;
10
+ };
11
+ type: {
12
+ name: string;
13
+ };
14
+ };
15
+ minuteInterval: {
16
+ defaultValue: number;
17
+ description: string;
18
+ control: string;
19
+ table: {
20
+ type: {
21
+ summary: string;
22
+ };
23
+ defaultValue: number;
24
+ };
25
+ type: {
26
+ name: string;
27
+ };
28
+ };
29
+ placement: {
30
+ description: string;
31
+ options: import("@chakra-ui/popper/dist/declarations/src/popper.placement").PlacementWithLogical[];
32
+ control: {
33
+ type: string;
34
+ };
35
+ table: {
36
+ type: {
37
+ summary: string;
38
+ };
39
+ defaultValue: {
40
+ summary: string;
41
+ };
42
+ };
43
+ };
44
+ onTimeChange: {
45
+ description: string;
46
+ action: string;
47
+ table: {
48
+ type: {
49
+ summary: string;
50
+ };
51
+ };
52
+ };
53
+ inputProps: {
54
+ description: string;
55
+ control: {
56
+ type: string;
57
+ };
58
+ table: {
59
+ summary: {
60
+ variant: string;
61
+ size: string;
62
+ };
63
+ };
64
+ };
65
+ onChange: any;
66
+ size: any;
67
+ label: any;
68
+ helperText: any;
69
+ helperTextAlignment: any;
70
+ errorText: any;
71
+ isDisabled: any;
72
+ isInvalid: any;
73
+ useInvalidIcon: any;
74
+ useInvalidText: any;
75
+ useInvalidBorder: any;
76
+ invalidIconColor: any;
77
+ isReadOnly: any;
78
+ isRequired: any;
79
+ autoFocus: any;
80
+ labelStyle: any;
81
+ formControlStyle: any;
82
+ };
@@ -0,0 +1,10 @@
1
+ import { PlacementWithLogical } from '@chakra-ui/react';
2
+ import { TextInputProps } from '../TextInput';
3
+ export interface TimePickerProps {
4
+ initialTime: Date;
5
+ minuteInterval?: number;
6
+ inputProps?: Omit<TextInputProps, 'onChange' | 'value' | 'isClearable' | 'onClear'>;
7
+ placement?: PlacementWithLogical;
8
+ onTimeChange?: (time: Date) => void;
9
+ }
10
+ export declare const TimePicker: ({ initialTime, minuteInterval, inputProps, placement, onTimeChange, }: TimePickerProps) => JSX.Element;
@@ -0,0 +1,4 @@
1
+ export declare enum Meridiem {
2
+ AM = "AM",
3
+ PM = "PM"
4
+ }
@@ -0,0 +1 @@
1
+ export * from './timeRange.component';
@@ -0,0 +1,38 @@
1
+ export declare const timeRangeArgTypes: {
2
+ startTimePickerProps: {
3
+ description: string;
4
+ control: {
5
+ type: string;
6
+ };
7
+ table: {
8
+ summary: {
9
+ variant: string;
10
+ size: string;
11
+ };
12
+ };
13
+ };
14
+ endTimePickerProps: {
15
+ description: string;
16
+ control: {
17
+ type: string;
18
+ };
19
+ table: {
20
+ summary: {
21
+ variant: string;
22
+ size: string;
23
+ };
24
+ };
25
+ };
26
+ dashContainerProps: {
27
+ description: string;
28
+ control: {
29
+ type: string;
30
+ };
31
+ table: {
32
+ summary: {
33
+ variant: string;
34
+ size: string;
35
+ };
36
+ };
37
+ };
38
+ };
@@ -0,0 +1,8 @@
1
+ import { BoxProps } from '@chakra-ui/react';
2
+ import { TimePickerProps } from '../TimePicker/timePicker.component';
3
+ export interface TimeRangeProps {
4
+ startTimePickerProps: TimePickerProps;
5
+ endTimePickerProps: TimePickerProps;
6
+ dashContainerProps?: BoxProps;
7
+ }
8
+ export declare const TimeRange: ({ startTimePickerProps, endTimePickerProps, dashContainerProps, }: TimeRangeProps) => JSX.Element;
@@ -8,3 +8,4 @@ export * from './Select';
8
8
  export * from './Switch';
9
9
  export * from './DatePicker';
10
10
  export * from './FormControl';
11
+ export * from './TimePicker';
@@ -1,4 +1,4 @@
1
- import { ReactElement, ReactNode, MutableRefObject, KeyboardEvent } from 'react';
1
+ import { ReactNode, MutableRefObject, KeyboardEvent, ReactElement } from 'react';
2
2
  import { TextColor } from 'components/Typography';
3
3
  export interface MenuItemProps {
4
4
  canSelectAll?: boolean;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { PopoverProps as ChakraPopoverProps } from '@chakra-ui/react';
2
+ import { PopoverProps as ChakraPopoverProps, PopoverContentProps } from '@chakra-ui/react';
3
3
  import { PopoverSize } from './popover.types';
4
4
  import { Token } from '@chakra-ui/styled-system/dist/declarations/src/utils';
5
5
  import * as CSS from 'csstype';
@@ -10,5 +10,6 @@ export interface PopoverProps extends ChakraPopoverProps {
10
10
  allowEscape?: boolean;
11
11
  size?: PopoverSize;
12
12
  shadow?: Token<CSS.Property.BoxShadow | number, 'shadows'>;
13
+ contentProps?: PopoverContentProps;
13
14
  }
14
- export declare const Popover: ({ children, popoverTrigger, darkMode, allowEscape, size, shadow, ...rest }: PopoverProps) => JSX.Element;
15
+ export declare const Popover: ({ children, popoverTrigger, darkMode, allowEscape, size, shadow, contentProps, ...rest }: PopoverProps) => JSX.Element;
package/build/index.js CHANGED
@@ -7208,7 +7208,7 @@ function withFormControl(Component) {
7208
7208
  var labelColor = useAdaptiveColorMap(colors.text, 'default');
7209
7209
  return (React__default["default"].createElement(react.FormControl, __assign({}, formControlStyle, { isInvalid: isInvalid, isRequired: isRequired, isReadOnly: isReadOnly, isDisabled: isDisabled }),
7210
7210
  label && (React__default["default"].createElement(react.FormLabel, __assign({ display: isFieldInline ? 'inline-block' : 'block', color: labelColor, fontSize: fontSizes[size] }, labelStyle), label)),
7211
- React__default["default"].createElement(react.Flex, { align: "center", gap: 2 },
7211
+ React__default["default"].createElement(react.Flex, { align: "center", gap: 2, display: isFieldInline ? 'inline-block' : 'block' },
7212
7212
  React__default["default"].createElement(Component, __assign({ size: size }, props, { isFieldInline: isFieldInline, errorBorderColor: useInvalidBorder ? colors.border.light.error : colors.border.light.default, focusBorderColor: colors.border.light.focus })),
7213
7213
  useInvalidIcon && isInvalid && React__default["default"].createElement(Icon, { name: "warningSign", color: invalidIconColor || 'error', size: size })),
7214
7214
  shouldShowBottomContent && (React__default["default"].createElement(react.Flex, { mt: 2, w: "100%", justifyContent: alignment, alignItems: "center" },
@@ -8188,14 +8188,15 @@ var ModalFooterButtons = function (_a) {
8188
8188
  };
8189
8189
 
8190
8190
  var Popover = function (_a) {
8191
- var children = _a.children, popoverTrigger = _a.popoverTrigger, darkMode = _a.darkMode, _b = _a.allowEscape, allowEscape = _b === void 0 ? true : _b, _c = _a.size, size = _c === void 0 ? 'sm' : _c, _d = _a.shadow, shadow = _d === void 0 ? 'md' : _d, rest = __rest(_a, ["children", "popoverTrigger", "darkMode", "allowEscape", "size", "shadow"]);
8191
+ var children = _a.children, popoverTrigger = _a.popoverTrigger, darkMode = _a.darkMode, _b = _a.allowEscape, allowEscape = _b === void 0 ? true : _b, _c = _a.size, size = _c === void 0 ? 'sm' : _c, _d = _a.shadow, shadow = _d === void 0 ? 'md' : _d, contentProps = _a.contentProps, rest = __rest(_a, ["children", "popoverTrigger", "darkMode", "allowEscape", "size", "shadow", "contentProps"]);
8192
8192
  var _e = useTheme(), colors = _e.colors, components = _e.components;
8193
8193
  var width = components.Popover[size].width;
8194
8194
  var adaptiveBackground = useAdaptiveColor(colors.background);
8195
8195
  var bg = !darkMode ? adaptiveBackground : colors.background.dark;
8196
+ var borderColor = !darkMode ? colors.border.light.default : colors.background.dark;
8196
8197
  return (React__default["default"].createElement(react.Popover, __assign({}, rest, { closeOnBlur: allowEscape, closeOnEsc: allowEscape }),
8197
8198
  React__default["default"].createElement(react.PopoverTrigger, null, popoverTrigger),
8198
- withDarkMode$1(React__default["default"].createElement(react.PopoverContent, { width: width, bg: bg, shadow: shadow },
8199
+ withDarkMode$1(React__default["default"].createElement(react.PopoverContent, __assign({ width: width, bg: bg, borderColor: borderColor, shadow: shadow }, contentProps),
8199
8200
  React__default["default"].createElement(react.PopoverArrow, { bg: bg }),
8200
8201
  React__default["default"].createElement(Text, { size: "sm" }, children)), !!darkMode)));
8201
8202
  };
@@ -18755,6 +18756,159 @@ var DatePicker = function (_a) {
18755
18756
  React__default["default"].createElement(react.Grid, { gap: "0 64px", templateColumns: "repeat(".concat(activeMonths.length, ")") }, activeMonths.map(function (month) { return (React__default["default"].createElement(Month, { key: "".concat(month.year, "-").concat(month.month), year: month.year, month: month.month, firstDayOfWeek: firstDayOfWeek, onDaySelected: function () { return onClose(); } })); })))))));
18756
18757
  };
18757
18758
 
18759
+ var ScrollContainer = function (_a) {
18760
+ var props = __rest(_a, []);
18761
+ return (React__default["default"].createElement(react.Flex, { direction: "column", gap: 1, overflowY: "auto", sx: {
18762
+ '&::-webkit-scrollbar': {
18763
+ display: 'none',
18764
+ },
18765
+ } }, props.children));
18766
+ };
18767
+
18768
+ var TimeOption = function (_a) {
18769
+ var value = _a.value, innerRef = _a.innerRef, isSelected = _a.isSelected, handleClick = _a.handleClick;
18770
+ var onClick = React.useCallback(function (event) {
18771
+ var selectedValue = event.currentTarget.textContent || '';
18772
+ handleClick(selectedValue);
18773
+ }, [handleClick]);
18774
+ return (React__default["default"].createElement(react.Box, { ref: innerRef, onClick: onClick, background: isSelected ? colors$1.background.brand : colors$1.white, color: isSelected ? colors$1.text.dark.default : colors$1.text.light.subtle, fontSize: fontSizes.sm, textAlign: "center", px: 3, py: 1, w: "100%", borderRadius: radii$1.md, cursor: "pointer", _hover: {
18775
+ background: isSelected ? colors$1.background.brand : colors$1.background.hover,
18776
+ } }, value));
18777
+ };
18778
+
18779
+ exports.Meridiem = void 0;
18780
+ (function (Meridiem) {
18781
+ Meridiem["AM"] = "AM";
18782
+ Meridiem["PM"] = "PM";
18783
+ })(exports.Meridiem || (exports.Meridiem = {}));
18784
+
18785
+ var useIconTextSizeMap = function (textSize) {
18786
+ switch (textSize) {
18787
+ case 'xs':
18788
+ return 'xs';
18789
+ case 'sm':
18790
+ return 'sm';
18791
+ case 'md':
18792
+ return 'md';
18793
+ case 'lg':
18794
+ case 'xl':
18795
+ case '2xl':
18796
+ case '3xl':
18797
+ case '4xl':
18798
+ return 'lg';
18799
+ case '5xl':
18800
+ case '6xl':
18801
+ return '2xl';
18802
+ }
18803
+ };
18804
+
18805
+ var TimePicker = function (_a) {
18806
+ var initialTime = _a.initialTime, _b = _a.minuteInterval, minuteInterval = _b === void 0 ? 5 : _b, inputProps = _a.inputProps, placement = _a.placement, onTimeChange = _a.onTimeChange;
18807
+ var _c = react.useDisclosure(), isOpen = _c.isOpen, onOpen = _c.onOpen, onClose = _c.onClose;
18808
+ var localTime = React.useMemo(function () { return new Date(initialTime); }, [initialTime]);
18809
+ // selectedTime should always be UTC
18810
+ var _d = __read(React.useState(initialTime), 2), selectedTime = _d[0], setSelectedTime = _d[1];
18811
+ var initialSelectedHour = React.useMemo(function () {
18812
+ var hours = localTime.getHours();
18813
+ var adjustedHours = hours;
18814
+ if (hours > 12) {
18815
+ adjustedHours = hours - 12;
18816
+ }
18817
+ if (hours === 0) {
18818
+ adjustedHours = 12;
18819
+ }
18820
+ return adjustedHours.toString();
18821
+ }, [localTime]);
18822
+ // convert to local time for display
18823
+ var _e = __read(React.useState(initialSelectedHour), 2), selectedHour = _e[0], setSelectedHour = _e[1];
18824
+ var _f = __read(React.useState(localTime.getMinutes().toString()), 2), selectedMinute = _f[0], setSelectedMinute = _f[1];
18825
+ var _g = __read(React.useState(localTime.getHours() > 11 ? exports.Meridiem.PM : exports.Meridiem.AM), 2), selectedMeridiem = _g[0], setSelectedMeridiem = _g[1];
18826
+ var hourRef = React.useRef(null);
18827
+ var minuteRef = React.useRef(null);
18828
+ React.useEffect(function () {
18829
+ if (isOpen) {
18830
+ if (hourRef.current) {
18831
+ hourRef.current.scrollIntoView();
18832
+ }
18833
+ if (minuteRef.current) {
18834
+ minuteRef.current.scrollIntoView();
18835
+ }
18836
+ }
18837
+ }, [isOpen]);
18838
+ var formattedTime = React.useMemo(function () {
18839
+ return format(selectedTime, 'h:mm aa');
18840
+ }, [selectedTime]);
18841
+ var formatNumber = function (number) {
18842
+ var formattedValue = number.toString();
18843
+ if (formattedValue.length === 1) {
18844
+ return "0".concat(formattedValue);
18845
+ }
18846
+ return formattedValue;
18847
+ };
18848
+ var hourOptions = React.useMemo(function () {
18849
+ return [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map(function (hour) { return hour.toString(); });
18850
+ }, []);
18851
+ var minuteOptions = React.useMemo(function () {
18852
+ var minutes = [];
18853
+ for (var i = 0; i < 60; i += minuteInterval) {
18854
+ minutes.push(i);
18855
+ }
18856
+ return minutes.map(formatNumber);
18857
+ }, [minuteInterval]);
18858
+ var meridiemOptions = [exports.Meridiem.AM, exports.Meridiem.PM];
18859
+ var handleTimeChange = React.useCallback(function (hour, minute, meridiem) {
18860
+ var meridiemAdjustment = 0;
18861
+ // set 1-11pm to 13-23. Don't set 12pm to 24
18862
+ if (meridiem === exports.Meridiem.PM && Number(hour) < 12) {
18863
+ meridiemAdjustment = 12;
18864
+ }
18865
+ // set 12am to 00
18866
+ if (meridiem === exports.Meridiem.AM && Number(hour) === 12) {
18867
+ meridiemAdjustment = -12;
18868
+ }
18869
+ var hours = Number(hour) + meridiemAdjustment;
18870
+ var time = new Date().setHours(hours, Number(minute), 0, 0);
18871
+ var date = new Date(time);
18872
+ setSelectedTime(date);
18873
+ if (onTimeChange) {
18874
+ onTimeChange(date);
18875
+ }
18876
+ }, [onTimeChange]);
18877
+ var handleHourClick = React.useCallback(function (value) {
18878
+ setSelectedHour(value);
18879
+ handleTimeChange(value, selectedMinute, selectedMeridiem);
18880
+ }, [handleTimeChange, selectedMeridiem, selectedMinute]);
18881
+ var handleMinuteClick = React.useCallback(function (value) {
18882
+ setSelectedMinute(value);
18883
+ handleTimeChange(selectedHour, value, selectedMeridiem);
18884
+ }, [handleTimeChange, selectedHour, selectedMeridiem]);
18885
+ var handleMeridiemClick = React.useCallback(function (value) {
18886
+ setSelectedMeridiem(value);
18887
+ handleTimeChange(selectedHour, selectedMinute, value);
18888
+ }, [handleTimeChange, selectedHour, selectedMinute]);
18889
+ return (React__default["default"].createElement(Popover, { isOpen: isOpen, onOpen: onOpen, onClose: onClose, placement: placement, contentProps: { width: 'max-content' }, popoverTrigger: React__default["default"].createElement(react.Box, null,
18890
+ React__default["default"].createElement(WrappedTextInput, __assign({ rightElement: React__default["default"].createElement(Icon, { size: useIconTextSizeMap((inputProps === null || inputProps === void 0 ? void 0 : inputProps.size) || 'md'), name: "clock" }), value: formattedTime, isReadOnly: true, cursor: 'pointer' }, inputProps))) },
18891
+ React__default["default"].createElement(react.PopoverBody, { p: 3 },
18892
+ React__default["default"].createElement(react.Flex, { height: "186px", gap: 1.5, overflow: "hidden" },
18893
+ React__default["default"].createElement(ScrollContainer, null, hourOptions.map(function (hour) {
18894
+ return (React__default["default"].createElement(TimeOption, { key: "hour-option-".concat(hour), innerRef: hour === selectedHour ? hourRef : null, value: hour, isSelected: hour === selectedHour, handleClick: handleHourClick }));
18895
+ })),
18896
+ React__default["default"].createElement(ScrollContainer, null, minuteOptions.map(function (minute) {
18897
+ return (React__default["default"].createElement(TimeOption, { key: "minute-option-".concat(minute), innerRef: minute === formatNumber(selectedMinute) ? minuteRef : null, value: minute, isSelected: minute === formatNumber(selectedMinute), handleClick: handleMinuteClick }));
18898
+ })),
18899
+ React__default["default"].createElement(ScrollContainer, null, meridiemOptions.map(function (meridiem) {
18900
+ return (React__default["default"].createElement(TimeOption, { key: "meridian-option-".concat(meridiem), value: meridiem, isSelected: meridiem === selectedMeridiem, handleClick: handleMeridiemClick }));
18901
+ }))))));
18902
+ };
18903
+
18904
+ var TimeRange = function (_a) {
18905
+ var startTimePickerProps = _a.startTimePickerProps, endTimePickerProps = _a.endTimePickerProps, dashContainerProps = _a.dashContainerProps;
18906
+ return (React__default["default"].createElement(react.Flex, null,
18907
+ React__default["default"].createElement(TimePicker, __assign({}, startTimePickerProps)),
18908
+ React__default["default"].createElement(react.Box, __assign({ alignSelf: "center", mx: 1 }, dashContainerProps), "-"),
18909
+ React__default["default"].createElement(TimePicker, __assign({}, endTimePickerProps))));
18910
+ };
18911
+
18758
18912
  var DragHandle = function (_a) {
18759
18913
  var rest = __rest(_a, []);
18760
18914
  var _b = React.useContext(SortableItemContext), attributes = _b.attributes, listeners = _b.listeners, ref = _b.ref;
@@ -25540,26 +25694,6 @@ var LinkIcon = function (iconProps) {
25540
25694
  return React__default["default"].createElement(Icon, __assign({}, rest));
25541
25695
  };
25542
25696
 
25543
- var useIconTextSizeMap = function (textSize) {
25544
- switch (textSize) {
25545
- case 'xs':
25546
- return 'xs';
25547
- case 'sm':
25548
- return 'sm';
25549
- case 'md':
25550
- return 'md';
25551
- case 'lg':
25552
- case 'xl':
25553
- case '2xl':
25554
- case '3xl':
25555
- case '4xl':
25556
- return 'lg';
25557
- case '5xl':
25558
- case '6xl':
25559
- return '2xl';
25560
- }
25561
- };
25562
-
25563
25697
  var Link = React.forwardRef(function (props, ref) {
25564
25698
  var colors = useTheme().colors;
25565
25699
  var children = props.children, color = props.color, _a = props.colorToken, colorToken = _a === void 0 ? 'link' : _a, _b = props.onDark, onDark = _b === void 0 ? false : _b, iconProps = props.iconProps, _c = props.size, size = _c === void 0 ? 'md' : _c, rest = __rest(props, ["children", "color", "colorToken", "onDark", "iconProps", "size"]);
@@ -28511,6 +28645,8 @@ exports.TextInput = WrappedTextInput;
28511
28645
  exports.TextInputConfig = TextInputConfig;
28512
28646
  exports.Textarea = WrappedTextArea;
28513
28647
  exports.TextareaConfig = TextareaConfig;
28648
+ exports.TimePicker = TimePicker;
28649
+ exports.TimeRange = TimeRange;
28514
28650
  exports.Tooltip = Tooltip;
28515
28651
  exports.TooltipConfig = TooltipConfig;
28516
28652
  exports.TooltipGlobalStyle = TooltipGlobalStyle;