@bitrise/bitkit 13.89.0 → 13.90.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bitrise/bitkit",
3
3
  "description": "Bitrise React component library",
4
- "version": "13.89.0",
4
+ "version": "13.90.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+ssh://git@github.com/bitrise-io/bitkit.git"
@@ -1,8 +1,10 @@
1
1
  import { createContext } from '@chakra-ui/react-utils';
2
2
  import { DateTime } from 'luxon';
3
3
  import { DateRange } from './useDateRange';
4
+ import type { DatePickerDayViewProps } from './DatePickerDay';
4
5
 
5
6
  interface Context {
7
+ dayTooltip?: DatePickerDayViewProps['tooltip'];
6
8
  selectable?: DateRange;
7
9
  selected?: DateRange;
8
10
  today: DateTime;
@@ -14,11 +14,13 @@ import DatePickerMonthSelector from './DatePickerMonthSelector';
14
14
  import useDateRange, { DateRange } from './useDateRange';
15
15
  import useViewDate from './useViewDate';
16
16
  import DatePickerFooter from './DatePickerFooter';
17
+ import { DatePickerDayViewProps } from './DatePickerDay';
17
18
 
18
19
  export { useDateRange, DateRange };
19
20
 
20
21
  export type DatePickerProps = {
21
22
  children: React.ReactNode;
23
+ dayTooltip?: DatePickerDayViewProps['tooltip'];
22
24
  selectable?: DateRange;
23
25
  onClose: () => void;
24
26
  onClear?: () => void;
@@ -42,7 +44,18 @@ export type DatePickerProps = {
42
44
  * range selection.
43
45
  */
44
46
  const DatePicker = (props: DatePickerProps) => {
45
- const { children, mode, onApply, onClear, onClose, selectable, selected, variant = 'default', visible } = props;
47
+ const {
48
+ children,
49
+ dayTooltip,
50
+ mode,
51
+ onApply,
52
+ onClear,
53
+ onClose,
54
+ selectable,
55
+ selected,
56
+ variant = 'default',
57
+ visible,
58
+ } = props;
46
59
 
47
60
  const { isMobile } = useResponsive();
48
61
  const today = DateTime.now().startOf('day');
@@ -162,6 +175,7 @@ const DatePicker = (props: DatePickerProps) => {
162
175
 
163
176
  const currentSelected = useDateRange([dateFrom, dateTo]);
164
177
  const ctx = useObjectMemo({
178
+ dayTooltip,
165
179
  onPreview: handlePreview,
166
180
  onSelect: handleSelect,
167
181
  preview,
@@ -4,6 +4,7 @@ import { BoxProps, useMultiStyleConfig } from '@chakra-ui/react';
4
4
  import { createContext } from '@chakra-ui/react-utils';
5
5
  import Box from '../Box/Box';
6
6
  import Text from '../Text/Text';
7
+ import Tooltip from '../Tooltip/Tooltip';
7
8
  import { useDatePickerContext } from './DatePicker.context';
8
9
 
9
10
  // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/64995
@@ -21,7 +22,9 @@ interface Context {
21
22
  viewDate: DateTime;
22
23
  }
23
24
  export interface DatePickerDayViewProps {
25
+ tooltip?(day: Pick<DatePickerDayViewProps, 'selectable' | 'date'>): string | undefined;
24
26
  onClick: () => void;
27
+ date: DateTime;
25
28
  onMouseEnter: () => void;
26
29
  selectable: boolean;
27
30
  today: boolean;
@@ -34,6 +37,8 @@ export interface DatePickerDayViewProps {
34
37
  const DatePickerDayView = ({
35
38
  children,
36
39
  currentMonth,
40
+ date,
41
+ tooltip,
37
42
  onClick,
38
43
  onMouseEnter,
39
44
  preview,
@@ -58,19 +63,24 @@ const DatePickerDayView = ({
58
63
  } else {
59
64
  ariaProps.tabIndex = -1;
60
65
  }
66
+
67
+ const tooltipText = tooltip?.({ selectable, date });
68
+
61
69
  return (
62
- <Box
63
- {...ariaProps}
64
- as="button"
65
- disabled={!selectable}
66
- onClick={onClick}
67
- onFocus={onMouseEnter}
68
- onMouseEnter={onMouseEnter}
69
- role="option"
70
- sx={day}
71
- >
72
- <Text sx={text}>{children}</Text>
73
- </Box>
70
+ <Tooltip label={tooltipText} isDisabled={!tooltipText}>
71
+ <Box
72
+ {...ariaProps}
73
+ as="button"
74
+ disabled={!selectable}
75
+ onClick={onClick}
76
+ onFocus={onMouseEnter}
77
+ onMouseEnter={onMouseEnter}
78
+ role="option"
79
+ sx={day}
80
+ >
81
+ <Text sx={text}>{children}</Text>
82
+ </Box>
83
+ </Tooltip>
74
84
  );
75
85
  };
76
86
  const [DatePickerDayContext, useDatePickerDayContext] = createContext<Context>();
@@ -80,6 +90,7 @@ const DatePickerDay = ({ n }: { n: number }): JSX.Element | null => {
80
90
  const {
81
91
  onPreview,
82
92
  onSelect,
93
+ dayTooltip,
83
94
  preview,
84
95
  selectable,
85
96
  selected,
@@ -143,6 +154,7 @@ const DatePickerDay = ({ n }: { n: number }): JSX.Element | null => {
143
154
  return (
144
155
  <DatePickerDayView
145
156
  currentMonth={isCurrentMonth}
157
+ date={date}
146
158
  onClick={onClick}
147
159
  onMouseEnter={onMouseEnter}
148
160
  preview={preview}
@@ -150,6 +162,7 @@ const DatePickerDay = ({ n }: { n: number }): JSX.Element | null => {
150
162
  selection={selection}
151
163
  showOutsideDays={showOutsideDays}
152
164
  today={today.equals(viewDate.set({ day: n - dayOfWeek + 1 }).startOf('day'))}
165
+ tooltip={dayTooltip}
153
166
  >
154
167
  {isPreviousMonth && daysInPreviousMonth - (dayOfWeek - n - 1)}
155
168
  {isCurrentMonth && n - dayOfWeek + 1}
@@ -56,6 +56,7 @@ export const FILTER_STORY_DATA: FilterData = {
56
56
  categoryName: 'Date',
57
57
  categoryNamePlural: 'dates',
58
58
  isMultiple: true,
59
+ dayTooltip: ({ date }) => (date > DateTime.now() ? 'Date must be in the past' : undefined),
59
60
  selectable: new DateRange(DateTime.now().minus({ days: 15 }), DateTime.now()),
60
61
  type: 'dateRange',
61
62
  },
@@ -1,6 +1,6 @@
1
1
  import { Dispatch, SetStateAction } from 'react';
2
2
  import { TypeIconName } from '../Icon/Icon';
3
- import { DateRange } from '../DatePicker/DatePicker';
3
+ import { DatePickerProps, DateRange } from '../DatePicker/DatePicker';
4
4
 
5
5
  export type FilterType = 'dateRange' | 'search' | 'select' | 'switch' | 'tag';
6
6
 
@@ -28,11 +28,13 @@ export type FilterCategoryProps = {
28
28
  | {
29
29
  type: 'dateRange';
30
30
  selectable?: DateRange;
31
+ dayTooltip?: DatePickerProps['dayTooltip'];
31
32
  isMultiple: true;
32
33
  }
33
34
  | {
34
35
  type?: Exclude<FilterType, 'dateRange'>;
35
36
  selectable?: never;
37
+ dayTooltip?: never;
36
38
  }
37
39
  );
38
40
 
@@ -59,6 +59,7 @@ const FilterDate = (props: FilterDateProps) => {
59
59
  onApply={onDateRangeApply}
60
60
  onClear={value?.length ? onClearClick : undefined}
61
61
  onClose={onClose}
62
+ dayTooltip={data.date_range.dayTooltip}
62
63
  selected={selectedRange}
63
64
  visible={isOpen}
64
65
  mode="range"