@transferwise/components 0.0.0-experimental-26e03bf → 0.0.0-experimental-c82d979

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 (195) hide show
  1. package/build/calendarInput/CalendarInput.js +159 -0
  2. package/build/calendarInput/CalendarInput.js.map +1 -0
  3. package/build/{dateLookup/DateLookup.messages.js → calendarInput/CalendarInput.messages.js} +1 -1
  4. package/build/calendarInput/CalendarInput.messages.js.map +1 -0
  5. package/build/{dateLookup/DateLookup.messages.mjs → calendarInput/CalendarInput.messages.mjs} +1 -1
  6. package/build/calendarInput/CalendarInput.messages.mjs.map +1 -0
  7. package/build/calendarInput/CalendarInput.mjs +155 -0
  8. package/build/calendarInput/CalendarInput.mjs.map +1 -0
  9. package/build/{dateLookup → calendarInput}/dateHeader/DateHeader.js +4 -4
  10. package/build/calendarInput/dateHeader/DateHeader.js.map +1 -0
  11. package/build/{dateLookup → calendarInput}/dateHeader/DateHeader.mjs +1 -1
  12. package/build/calendarInput/dateHeader/DateHeader.mjs.map +1 -0
  13. package/build/{dateLookup → calendarInput}/dayCalendar/DayCalendar.js +2 -2
  14. package/build/calendarInput/dayCalendar/DayCalendar.js.map +1 -0
  15. package/build/{dateLookup → calendarInput}/dayCalendar/DayCalendar.mjs +1 -1
  16. package/build/calendarInput/dayCalendar/DayCalendar.mjs.map +1 -0
  17. package/build/calendarInput/dayCalendar/table/DayCalendarTable.js.map +1 -0
  18. package/build/calendarInput/dayCalendar/table/DayCalendarTable.mjs.map +1 -0
  19. package/build/calendarInput/getFocusableTime/getFocusableTime.js.map +1 -0
  20. package/build/calendarInput/getFocusableTime/getFocusableTime.mjs.map +1 -0
  21. package/build/calendarInput/getStartOfDay/getStartOfDay.js.map +1 -0
  22. package/build/calendarInput/getStartOfDay/getStartOfDay.mjs.map +1 -0
  23. package/build/{dateLookup → calendarInput}/monthCalendar/MonthCalendar.js +2 -2
  24. package/build/calendarInput/monthCalendar/MonthCalendar.js.map +1 -0
  25. package/build/{dateLookup → calendarInput}/monthCalendar/MonthCalendar.mjs +1 -1
  26. package/build/calendarInput/monthCalendar/MonthCalendar.mjs.map +1 -0
  27. package/build/calendarInput/monthCalendar/table/MonthCalendarTable.js.map +1 -0
  28. package/build/calendarInput/monthCalendar/table/MonthCalendarTable.mjs.map +1 -0
  29. package/build/{dateLookup → calendarInput}/tableLink/TableLink.js +2 -2
  30. package/build/calendarInput/tableLink/TableLink.js.map +1 -0
  31. package/build/{dateLookup → calendarInput}/tableLink/TableLink.mjs +1 -1
  32. package/build/calendarInput/tableLink/TableLink.mjs.map +1 -0
  33. package/build/{dateLookup → calendarInput}/yearCalendar/YearCalendar.js +2 -2
  34. package/build/calendarInput/yearCalendar/YearCalendar.js.map +1 -0
  35. package/build/{dateLookup → calendarInput}/yearCalendar/YearCalendar.mjs +1 -1
  36. package/build/calendarInput/yearCalendar/YearCalendar.mjs.map +1 -0
  37. package/build/calendarInput/yearCalendar/table/YearCalendarTable.js.map +1 -0
  38. package/build/calendarInput/yearCalendar/table/YearCalendarTable.mjs.map +1 -0
  39. package/build/dateLookup/DateLookup.js +28 -165
  40. package/build/dateLookup/DateLookup.js.map +1 -1
  41. package/build/dateLookup/DateLookup.mjs +29 -166
  42. package/build/dateLookup/DateLookup.mjs.map +1 -1
  43. package/build/index.js +2 -0
  44. package/build/index.js.map +1 -1
  45. package/build/index.mjs +1 -0
  46. package/build/index.mjs.map +1 -1
  47. package/build/main.css +97 -106
  48. package/build/prompt/InfoPrompt/InfoPrompt.js +1 -1
  49. package/build/prompt/InfoPrompt/InfoPrompt.js.map +1 -1
  50. package/build/prompt/InfoPrompt/InfoPrompt.mjs +2 -2
  51. package/build/prompt/InfoPrompt/InfoPrompt.mjs.map +1 -1
  52. package/build/styles/calendarInput/CalendarInput.css +83 -0
  53. package/build/styles/dateLookup/DateLookup.css +0 -90
  54. package/build/styles/main.css +97 -106
  55. package/build/types/calendarInput/CalendarInput.d.ts +13 -0
  56. package/build/types/calendarInput/CalendarInput.d.ts.map +1 -0
  57. package/build/types/{dateLookup/DateLookup.messages.d.ts → calendarInput/CalendarInput.messages.d.ts} +1 -1
  58. package/build/types/calendarInput/CalendarInput.messages.d.ts.map +1 -0
  59. package/build/types/calendarInput/dateHeader/DateHeader.d.ts.map +1 -0
  60. package/build/types/calendarInput/dateHeader/index.d.ts.map +1 -0
  61. package/build/types/calendarInput/dayCalendar/DayCalendar.d.ts.map +1 -0
  62. package/build/types/calendarInput/dayCalendar/index.d.ts.map +1 -0
  63. package/build/types/calendarInput/dayCalendar/table/DayCalendarTable.d.ts.map +1 -0
  64. package/build/types/calendarInput/dayCalendar/table/index.d.ts.map +1 -0
  65. package/build/types/calendarInput/getFocusableTime/getFocusableTime.d.ts.map +1 -0
  66. package/build/types/calendarInput/getStartOfDay/getStartOfDay.d.ts.map +1 -0
  67. package/build/types/calendarInput/getStartOfDay/index.d.ts.map +1 -0
  68. package/build/types/calendarInput/index.d.ts +3 -0
  69. package/build/types/calendarInput/index.d.ts.map +1 -0
  70. package/build/types/{dateLookup → calendarInput}/monthCalendar/MonthCalendar.d.ts +1 -1
  71. package/build/types/calendarInput/monthCalendar/MonthCalendar.d.ts.map +1 -0
  72. package/build/types/calendarInput/monthCalendar/index.d.ts.map +1 -0
  73. package/build/types/{dateLookup → calendarInput}/monthCalendar/table/MonthCalendarTable.d.ts +1 -1
  74. package/build/types/calendarInput/monthCalendar/table/MonthCalendarTable.d.ts.map +1 -0
  75. package/build/types/calendarInput/monthCalendar/table/index.d.ts.map +1 -0
  76. package/build/types/calendarInput/tableLink/TableLink.d.ts.map +1 -0
  77. package/build/types/calendarInput/tableLink/index.d.ts.map +1 -0
  78. package/build/types/{dateLookup → calendarInput}/yearCalendar/YearCalendar.d.ts +1 -1
  79. package/build/types/calendarInput/yearCalendar/YearCalendar.d.ts.map +1 -0
  80. package/build/types/calendarInput/yearCalendar/index.d.ts.map +1 -0
  81. package/build/types/{dateLookup → calendarInput}/yearCalendar/table/YearCalendarTable.d.ts +1 -1
  82. package/build/types/calendarInput/yearCalendar/table/YearCalendarTable.d.ts.map +1 -0
  83. package/build/types/calendarInput/yearCalendar/table/index.d.ts.map +1 -0
  84. package/build/types/dateLookup/DateLookup.d.ts +2 -25
  85. package/build/types/dateLookup/DateLookup.d.ts.map +1 -1
  86. package/build/types/index.d.ts +2 -0
  87. package/build/types/index.d.ts.map +1 -1
  88. package/build/types/prompt/InfoPrompt/InfoPrompt.d.ts +2 -3
  89. package/build/types/prompt/InfoPrompt/InfoPrompt.d.ts.map +1 -1
  90. package/package.json +3 -3
  91. package/src/calendarInput/CalendarInput.css +83 -0
  92. package/src/calendarInput/CalendarInput.less +79 -0
  93. package/src/calendarInput/CalendarInput.story.tsx +65 -0
  94. package/src/calendarInput/CalendarInput.test.tsx +140 -0
  95. package/src/calendarInput/CalendarInput.tsx +165 -0
  96. package/src/{dateLookup → calendarInput}/dateHeader/DateHeader.tsx +1 -1
  97. package/src/{dateLookup → calendarInput}/dayCalendar/DayCalendar.tsx +1 -1
  98. package/src/calendarInput/index.ts +2 -0
  99. package/src/{dateLookup → calendarInput}/monthCalendar/MonthCalendar.tsx +2 -2
  100. package/src/{dateLookup → calendarInput}/monthCalendar/table/MonthCalendarTable.tsx +1 -1
  101. package/src/{dateLookup → calendarInput}/tableLink/TableLink.tsx +1 -1
  102. package/src/{dateLookup → calendarInput}/yearCalendar/YearCalendar.tsx +2 -2
  103. package/src/{dateLookup → calendarInput}/yearCalendar/table/YearCalendarTable.tsx +1 -1
  104. package/src/dateLookup/DateLookup.css +0 -90
  105. package/src/dateLookup/DateLookup.less +0 -91
  106. package/src/dateLookup/DateLookup.test.tsx +0 -124
  107. package/src/dateLookup/DateLookup.tsx +31 -157
  108. package/src/index.ts +2 -0
  109. package/src/main.css +97 -106
  110. package/src/main.less +1 -0
  111. package/src/prompt/InfoPrompt/InfoPrompt.story.tsx +0 -42
  112. package/src/prompt/InfoPrompt/InfoPrompt.test.tsx +1 -65
  113. package/src/prompt/InfoPrompt/InfoPrompt.tsx +4 -15
  114. package/build/dateLookup/DateLookup.messages.js.map +0 -1
  115. package/build/dateLookup/DateLookup.messages.mjs.map +0 -1
  116. package/build/dateLookup/dateHeader/DateHeader.js.map +0 -1
  117. package/build/dateLookup/dateHeader/DateHeader.mjs.map +0 -1
  118. package/build/dateLookup/dayCalendar/DayCalendar.js.map +0 -1
  119. package/build/dateLookup/dayCalendar/DayCalendar.mjs.map +0 -1
  120. package/build/dateLookup/dayCalendar/table/DayCalendarTable.js.map +0 -1
  121. package/build/dateLookup/dayCalendar/table/DayCalendarTable.mjs.map +0 -1
  122. package/build/dateLookup/getFocusableTime/getFocusableTime.js.map +0 -1
  123. package/build/dateLookup/getFocusableTime/getFocusableTime.mjs.map +0 -1
  124. package/build/dateLookup/getStartOfDay/getStartOfDay.js.map +0 -1
  125. package/build/dateLookup/getStartOfDay/getStartOfDay.mjs.map +0 -1
  126. package/build/dateLookup/monthCalendar/MonthCalendar.js.map +0 -1
  127. package/build/dateLookup/monthCalendar/MonthCalendar.mjs.map +0 -1
  128. package/build/dateLookup/monthCalendar/table/MonthCalendarTable.js.map +0 -1
  129. package/build/dateLookup/monthCalendar/table/MonthCalendarTable.mjs.map +0 -1
  130. package/build/dateLookup/tableLink/TableLink.js.map +0 -1
  131. package/build/dateLookup/tableLink/TableLink.mjs.map +0 -1
  132. package/build/dateLookup/yearCalendar/YearCalendar.js.map +0 -1
  133. package/build/dateLookup/yearCalendar/YearCalendar.mjs.map +0 -1
  134. package/build/dateLookup/yearCalendar/table/YearCalendarTable.js.map +0 -1
  135. package/build/dateLookup/yearCalendar/table/YearCalendarTable.mjs.map +0 -1
  136. package/build/types/dateLookup/DateLookup.messages.d.ts.map +0 -1
  137. package/build/types/dateLookup/dateHeader/DateHeader.d.ts.map +0 -1
  138. package/build/types/dateLookup/dateHeader/index.d.ts.map +0 -1
  139. package/build/types/dateLookup/dayCalendar/DayCalendar.d.ts.map +0 -1
  140. package/build/types/dateLookup/dayCalendar/index.d.ts.map +0 -1
  141. package/build/types/dateLookup/dayCalendar/table/DayCalendarTable.d.ts.map +0 -1
  142. package/build/types/dateLookup/dayCalendar/table/index.d.ts.map +0 -1
  143. package/build/types/dateLookup/getFocusableTime/getFocusableTime.d.ts.map +0 -1
  144. package/build/types/dateLookup/getStartOfDay/getStartOfDay.d.ts.map +0 -1
  145. package/build/types/dateLookup/getStartOfDay/index.d.ts.map +0 -1
  146. package/build/types/dateLookup/monthCalendar/MonthCalendar.d.ts.map +0 -1
  147. package/build/types/dateLookup/monthCalendar/index.d.ts.map +0 -1
  148. package/build/types/dateLookup/monthCalendar/table/MonthCalendarTable.d.ts.map +0 -1
  149. package/build/types/dateLookup/monthCalendar/table/index.d.ts.map +0 -1
  150. package/build/types/dateLookup/tableLink/TableLink.d.ts.map +0 -1
  151. package/build/types/dateLookup/tableLink/index.d.ts.map +0 -1
  152. package/build/types/dateLookup/yearCalendar/YearCalendar.d.ts.map +0 -1
  153. package/build/types/dateLookup/yearCalendar/index.d.ts.map +0 -1
  154. package/build/types/dateLookup/yearCalendar/table/YearCalendarTable.d.ts.map +0 -1
  155. package/build/types/dateLookup/yearCalendar/table/index.d.ts.map +0 -1
  156. /package/build/{dateLookup → calendarInput}/dayCalendar/table/DayCalendarTable.js +0 -0
  157. /package/build/{dateLookup → calendarInput}/dayCalendar/table/DayCalendarTable.mjs +0 -0
  158. /package/build/{dateLookup → calendarInput}/getFocusableTime/getFocusableTime.js +0 -0
  159. /package/build/{dateLookup → calendarInput}/getFocusableTime/getFocusableTime.mjs +0 -0
  160. /package/build/{dateLookup → calendarInput}/getStartOfDay/getStartOfDay.js +0 -0
  161. /package/build/{dateLookup → calendarInput}/getStartOfDay/getStartOfDay.mjs +0 -0
  162. /package/build/{dateLookup → calendarInput}/monthCalendar/table/MonthCalendarTable.js +0 -0
  163. /package/build/{dateLookup → calendarInput}/monthCalendar/table/MonthCalendarTable.mjs +0 -0
  164. /package/build/{dateLookup → calendarInput}/yearCalendar/table/YearCalendarTable.js +0 -0
  165. /package/build/{dateLookup → calendarInput}/yearCalendar/table/YearCalendarTable.mjs +0 -0
  166. /package/build/types/{dateLookup → calendarInput}/dateHeader/DateHeader.d.ts +0 -0
  167. /package/build/types/{dateLookup → calendarInput}/dateHeader/index.d.ts +0 -0
  168. /package/build/types/{dateLookup → calendarInput}/dayCalendar/DayCalendar.d.ts +0 -0
  169. /package/build/types/{dateLookup → calendarInput}/dayCalendar/index.d.ts +0 -0
  170. /package/build/types/{dateLookup → calendarInput}/dayCalendar/table/DayCalendarTable.d.ts +0 -0
  171. /package/build/types/{dateLookup → calendarInput}/dayCalendar/table/index.d.ts +0 -0
  172. /package/build/types/{dateLookup → calendarInput}/getFocusableTime/getFocusableTime.d.ts +0 -0
  173. /package/build/types/{dateLookup → calendarInput}/getStartOfDay/getStartOfDay.d.ts +0 -0
  174. /package/build/types/{dateLookup → calendarInput}/getStartOfDay/index.d.ts +0 -0
  175. /package/build/types/{dateLookup → calendarInput}/monthCalendar/index.d.ts +0 -0
  176. /package/build/types/{dateLookup → calendarInput}/monthCalendar/table/index.d.ts +0 -0
  177. /package/build/types/{dateLookup → calendarInput}/tableLink/TableLink.d.ts +0 -0
  178. /package/build/types/{dateLookup → calendarInput}/tableLink/index.d.ts +0 -0
  179. /package/build/types/{dateLookup → calendarInput}/yearCalendar/index.d.ts +0 -0
  180. /package/build/types/{dateLookup → calendarInput}/yearCalendar/table/index.d.ts +0 -0
  181. /package/src/{dateLookup/DateLookup.messages.ts → calendarInput/CalendarInput.messages.ts} +0 -0
  182. /package/src/{dateLookup → calendarInput}/dateHeader/index.ts +0 -0
  183. /package/src/{dateLookup → calendarInput}/dayCalendar/index.ts +0 -0
  184. /package/src/{dateLookup → calendarInput}/dayCalendar/table/DayCalendarTable.tsx +0 -0
  185. /package/src/{dateLookup → calendarInput}/dayCalendar/table/index.ts +0 -0
  186. /package/src/{dateLookup → calendarInput}/getFocusableTime/getFocusable.test.ts +0 -0
  187. /package/src/{dateLookup → calendarInput}/getFocusableTime/getFocusableTime.tsx +0 -0
  188. /package/src/{dateLookup → calendarInput}/getStartOfDay/getStartOfDay.test.js +0 -0
  189. /package/src/{dateLookup → calendarInput}/getStartOfDay/getStartOfDay.tsx +0 -0
  190. /package/src/{dateLookup → calendarInput}/getStartOfDay/index.ts +0 -0
  191. /package/src/{dateLookup → calendarInput}/monthCalendar/index.ts +0 -0
  192. /package/src/{dateLookup → calendarInput}/monthCalendar/table/index.ts +0 -0
  193. /package/src/{dateLookup → calendarInput}/tableLink/index.ts +0 -0
  194. /package/src/{dateLookup → calendarInput}/yearCalendar/index.ts +0 -0
  195. /package/src/{dateLookup → calendarInput}/yearCalendar/table/index.ts +0 -0
@@ -0,0 +1,165 @@
1
+ import { useState, useCallback, useEffect, KeyboardEvent } from 'react';
2
+
3
+ import { MonthFormat } from '../common';
4
+ import { isWithinRange, moveToWithinRange, returnDateView } from '../common/dateUtils';
5
+ import DayCalendar from './dayCalendar';
6
+ import { getStartOfDay } from './getStartOfDay';
7
+ import MonthCalendar from './monthCalendar';
8
+ import YearCalendar from './yearCalendar';
9
+
10
+ export interface CalendarInputProps {
11
+ value: Date | null;
12
+ min?: Date | null;
13
+ max?: Date | null;
14
+ monthFormat?: `${MonthFormat}`;
15
+ placeholder?: string;
16
+ onChange: (date: Date | null) => void;
17
+ onSelect?: (date: Date) => void;
18
+ }
19
+
20
+ const CalendarInput = ({
21
+ value,
22
+ min: minProp = null,
23
+ max: maxProp = null,
24
+ monthFormat = MonthFormat.LONG,
25
+ placeholder,
26
+ onChange,
27
+ onSelect,
28
+ }: CalendarInputProps) => {
29
+ const selectedDate = getStartOfDay(value);
30
+ const min = getStartOfDay(minProp);
31
+ const max = getStartOfDay(maxProp);
32
+
33
+ useEffect(() => {
34
+ if (selectedDate && !isWithinRange(selectedDate, min, max)) {
35
+ onChange(moveToWithinRange(selectedDate, min, max));
36
+ }
37
+ }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onChange]); // eslint-disable-line react-hooks/exhaustive-deps
38
+
39
+ const dateView = returnDateView(selectedDate, min, max);
40
+ const [viewMonth, setViewMonth] = useState(dateView.getMonth());
41
+ const [viewYear, setViewYear] = useState(dateView.getFullYear());
42
+ const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');
43
+
44
+ useEffect(() => {
45
+ const view = returnDateView(selectedDate, min, max);
46
+ // eslint-disable-next-line react-hooks/set-state-in-effect
47
+ setViewMonth(view.getMonth());
48
+
49
+ setViewYear(view.getFullYear());
50
+ }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps
51
+
52
+ const handleViewDateUpdate = useCallback(
53
+ // eslint-disable-next-line react-hooks/preserve-manual-memoization
54
+ ({ month, year }: { month?: number; year?: number }) => {
55
+ if (month !== undefined) setViewMonth(month);
56
+ if (year !== undefined) setViewYear(year);
57
+ },
58
+ [],
59
+ );
60
+
61
+ const switchToDays = useCallback(() => setMode('day'), []);
62
+ const switchToMonths = useCallback(() => setMode('month'), []);
63
+ const switchToYears = useCallback(() => setMode('year'), []);
64
+
65
+ const handleSelectedDateUpdate = useCallback(
66
+ (date: Date) => {
67
+ if (onSelect) {
68
+ onSelect(date);
69
+ } else {
70
+ onChange(date);
71
+ }
72
+ },
73
+ [onChange, onSelect],
74
+ );
75
+
76
+ const adjustDate = useCallback(
77
+ (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {
78
+ let date: Date | null;
79
+ if (selectedDate) {
80
+ date = new Date(
81
+ mode === 'year' ? selectedDate.getFullYear() + yearsToAdd : selectedDate.getFullYear(),
82
+ mode === 'month' ? selectedDate.getMonth() + monthsToAdd : selectedDate.getMonth(),
83
+ mode === 'day' ? selectedDate.getDate() + daysToAdd : selectedDate.getDate(),
84
+ );
85
+ } else {
86
+ date = getStartOfDay(new Date());
87
+ }
88
+ date &&= moveToWithinRange(date, min, max);
89
+ if (date?.getTime() !== selectedDate?.getTime()) {
90
+ onChange(date);
91
+ }
92
+ },
93
+ [selectedDate, min, max, mode, onChange],
94
+ );
95
+
96
+ const handleKeyDown = useCallback(
97
+ (event: KeyboardEvent<HTMLDivElement>) => {
98
+ switch (event.key) {
99
+ case 'ArrowLeft':
100
+ adjustDate(-1, -1, -1);
101
+ event.preventDefault();
102
+ break;
103
+ case 'ArrowUp':
104
+ adjustDate(-7, -4, -4);
105
+ event.preventDefault();
106
+ break;
107
+ case 'ArrowRight':
108
+ adjustDate(1, 1, 1);
109
+ event.preventDefault();
110
+ break;
111
+ case 'ArrowDown':
112
+ adjustDate(7, 4, 4);
113
+ event.preventDefault();
114
+ break;
115
+ default:
116
+ break;
117
+ }
118
+ },
119
+ [adjustDate],
120
+ );
121
+
122
+ return (
123
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
124
+ <div onKeyDown={handleKeyDown}>
125
+ {mode === 'day' && (
126
+ <DayCalendar
127
+ selectedDate={selectedDate}
128
+ min={min}
129
+ max={max}
130
+ viewMonth={viewMonth}
131
+ viewYear={viewYear}
132
+ monthFormat={monthFormat}
133
+ onSelect={handleSelectedDateUpdate}
134
+ onLabelClick={switchToYears}
135
+ onViewDateUpdate={handleViewDateUpdate}
136
+ />
137
+ )}
138
+ {mode === 'month' && (
139
+ <MonthCalendar
140
+ selectedDate={selectedDate}
141
+ min={min}
142
+ max={max}
143
+ viewYear={viewYear}
144
+ {...(placeholder != null && { placeholder })}
145
+ onSelect={switchToDays}
146
+ onLabelClick={switchToYears}
147
+ onViewDateUpdate={handleViewDateUpdate}
148
+ />
149
+ )}
150
+ {mode === 'year' && (
151
+ <YearCalendar
152
+ selectedDate={selectedDate}
153
+ min={min}
154
+ max={max}
155
+ viewYear={viewYear}
156
+ {...(placeholder != null && { placeholder })}
157
+ onSelect={switchToMonths}
158
+ onViewDateUpdate={handleViewDateUpdate}
159
+ />
160
+ )}
161
+ </div>
162
+ );
163
+ };
164
+
165
+ export default CalendarInput;
@@ -4,7 +4,7 @@ import { useIntl } from 'react-intl';
4
4
  import { Typography } from '../../common';
5
5
  import { useLayout } from '../../common/hooks';
6
6
  import Title from '../../title';
7
- import messages from '../DateLookup.messages';
7
+ import messages from '../CalendarInput.messages';
8
8
  import Button from '../../button/Button';
9
9
  import { ChevronDown, ChevronLeft, ChevronRight } from '@transferwise/icons';
10
10
  import IconButton from '../../iconButton';
@@ -3,7 +3,7 @@ import { PureComponent } from 'react';
3
3
  import { injectIntl, WrappedComponentProps } from 'react-intl';
4
4
 
5
5
  import { MonthFormat } from '../../common';
6
- import messages from '../DateLookup.messages';
6
+ import messages from '../CalendarInput.messages';
7
7
  import DateHeader from '../dateHeader';
8
8
 
9
9
  import DayCalendarTable from './table';
@@ -0,0 +1,2 @@
1
+ export { default } from './CalendarInput';
2
+ export type { CalendarInputProps } from './CalendarInput';
@@ -2,7 +2,7 @@ import { formatDate } from '@transferwise/formatting';
2
2
  import { PureComponent } from 'react';
3
3
  import { injectIntl, WrappedComponentProps } from 'react-intl';
4
4
 
5
- import messages from '../DateLookup.messages';
5
+ import messages from '../CalendarInput.messages';
6
6
  import DateHeader from '../dateHeader';
7
7
 
8
8
  import MonthCalendarTable from './table';
@@ -12,7 +12,7 @@ interface MonthCalendarProps extends WrappedComponentProps {
12
12
  min: Date | null;
13
13
  max: Date | null;
14
14
  viewYear: number;
15
- placeholder: string;
15
+ placeholder?: string;
16
16
  onSelect: () => void;
17
17
  onLabelClick: () => void;
18
18
  onViewDateUpdate: (date: { year?: number; month?: number }) => void;
@@ -9,7 +9,7 @@ interface MonthCalendarTableProps {
9
9
  min: Date | null;
10
10
  max: Date | null;
11
11
  viewYear: number;
12
- placeholder: string;
12
+ placeholder?: string;
13
13
  onSelect: (date: number) => void;
14
14
  }
15
15
 
@@ -2,7 +2,7 @@ import { clsx } from 'clsx';
2
2
  import { useEffect, useRef } from 'react';
3
3
  import { useIntl } from 'react-intl';
4
4
 
5
- import messages from '../DateLookup.messages';
5
+ import messages from '../CalendarInput.messages';
6
6
 
7
7
  interface TableLinkProps {
8
8
  item: number;
@@ -1,7 +1,7 @@
1
1
  import { PureComponent } from 'react';
2
2
  import { injectIntl, WrappedComponentProps } from 'react-intl';
3
3
 
4
- import messages from '../DateLookup.messages';
4
+ import messages from '../CalendarInput.messages';
5
5
  import DateHeader from '../dateHeader';
6
6
 
7
7
  import YearCalendarTable from './table';
@@ -11,7 +11,7 @@ interface YearCalendarProps extends WrappedComponentProps {
11
11
  min: Date | null;
12
12
  max: Date | null;
13
13
  viewYear: number;
14
- placeholder: string;
14
+ placeholder?: string;
15
15
  onSelect: () => void;
16
16
  onViewDateUpdate: (date: { year: number }) => void;
17
17
  }
@@ -9,7 +9,7 @@ interface YearCalendarTableProps {
9
9
  min: Date | null;
10
10
  max: Date | null;
11
11
  viewYear: number;
12
- placeholder: string;
12
+ placeholder?: string;
13
13
  onSelect: (year: number) => void;
14
14
  }
15
15
 
@@ -1,93 +1,3 @@
1
1
  .tw-date-lookup-menu {
2
2
  width: 400px;
3
3
  }
4
- .tw-date-lookup-calendar {
5
- min-width: 300px;
6
- text-align: center;
7
- table-layout: fixed;
8
- background-color: inherit;
9
- }
10
- .tw-date-lookup-calendar > tbody > tr > td.weekend button {
11
- color: #5d7079;
12
- color: var(--color-content-secondary);
13
- }
14
- .tw-date-lookup-calendar > tbody > tr > td {
15
- padding: 4px;
16
- padding: var(--size-4);
17
- }
18
- @media (max-width: 320px) {
19
- .tw-date-lookup-calendar > tbody > tr > td {
20
- padding: 0;
21
- }
22
- }
23
- .tw-date-lookup-calendar > tbody > tr > td:has(.tw-date-lookup-day-option) {
24
- padding: 1px;
25
- }
26
- .tw-date-lookup-calendar > tbody > tr > td button {
27
- width: 100%;
28
- padding: 4px 0;
29
- padding: var(--size-4) 0;
30
- color: #0097c7;
31
- color: var(--color-content-accent);
32
- border: transparent;
33
- border-radius: 10px;
34
- border-radius: var(--radius-small);
35
- background-color: transparent;
36
- font-weight: 600;
37
- font-weight: var(--font-weight-semi-bold);
38
- color: #37517e;
39
- color: var(--color-content-primary);
40
- }
41
- @media (max-width: 320px) {
42
- .tw-date-lookup-calendar > tbody > tr > td button {
43
- padding: 0;
44
- }
45
- }
46
- .tw-date-lookup-calendar > tbody > tr > td button.tw-date-lookup-day-option {
47
- height: 40px;
48
- height: var(--size-40);
49
- border-radius: 9999px;
50
- border-radius: var(--radius-full);
51
- line-height: 40px;
52
- line-height: var(--size-40);
53
- width: 40px;
54
- width: var(--size-40);
55
- padding: 0;
56
- display: inline-flex;
57
- align-items: center;
58
- justify-content: center;
59
- }
60
- .tw-date-lookup-calendar > tbody > tr > td button.tw-date-lookup-day-option.today {
61
- -webkit-text-decoration: underline;
62
- text-decoration: underline;
63
- text-decoration-thickness: 2px;
64
- text-underline-offset: 4px;
65
- }
66
- .tw-date-lookup-calendar > tbody > tr > td:not(.disabled):not(:disabled) button.show-focus,
67
- .tw-date-lookup-calendar > tbody > tr > td:hover button:not(.disabled):not(:disabled) {
68
- background-color: var(--color-background-screen-hover);
69
- }
70
- .tw-date-lookup-calendar > tbody > tr > td:not(.disabled):not(:disabled) button.active {
71
- background-color: var(--color-interactive-primary);
72
- color: var(--color-interactive-contrast);
73
- }
74
- .tw-date-lookup-calendar abbr {
75
- -webkit-text-decoration: none;
76
- text-decoration: none;
77
- }
78
- .tw-date-lookup-header-current-container {
79
- display: inline;
80
- }
81
- .np-theme-personal.tw-date-lookup-menu .table-bordered,
82
- .np-theme-personal .tw-date-lookup-menu .table-bordered {
83
- border: none;
84
- }
85
- .np-theme-personal.tw-date-lookup-menu thead,
86
- .np-theme-personal .tw-date-lookup-menu thead {
87
- background-color: transparent;
88
- background-color: initial;
89
- }
90
- .np-theme-personal.tw-date-lookup-menu td,
91
- .np-theme-personal .tw-date-lookup-menu td {
92
- border: none;
93
- }
@@ -1,94 +1,3 @@
1
- @import (reference) "./../styles/variables/neptune-tokens.less";
2
-
3
1
  .tw-date-lookup-menu {
4
2
  width: 400px;
5
3
  }
6
-
7
- .tw-date-lookup-calendar {
8
- min-width: 300px;
9
- text-align: center;
10
- table-layout: fixed;
11
-
12
- > tbody > tr > td.weekend button {
13
- color: var(--color-content-secondary);
14
- }
15
-
16
- > tbody > tr > td {
17
- padding: var(--size-4);
18
- @media (--screen-400-zoom) {
19
- padding: 0;
20
- }
21
-
22
- &:has(.tw-date-lookup-day-option) {
23
- padding: 1px;
24
- }
25
-
26
- button {
27
- width: 100%;
28
- padding: var(--size-4) 0;
29
- @media (--screen-400-zoom) {
30
- padding: 0;
31
- }
32
- color: var(--color-content-accent);
33
- border: transparent;
34
- border-radius: var(--radius-small);
35
- background-color: transparent;
36
- font-weight: var(--font-weight-semi-bold);
37
- color: var(--color-content-primary);
38
-
39
- &.tw-date-lookup-day-option {
40
- height: var(--size-40);
41
- border-radius: var(--radius-full);
42
- line-height: var(--size-40);
43
- width: var(--size-40);
44
- padding: 0;
45
- display: inline-flex;
46
- align-items: center;
47
- justify-content: center;
48
-
49
- &.today {
50
- text-decoration: underline;
51
- text-decoration-thickness: 2px;
52
- text-underline-offset: 4px;
53
- }
54
- }
55
- }
56
-
57
- &:not(.disabled, :disabled) button.show-focus,
58
- &:hover button:not(.disabled, :disabled) {
59
- background-color: var(--color-background-screen-hover);
60
- }
61
-
62
- &:not(.disabled, :disabled) button.active {
63
- background-color: var(--color-interactive-primary);
64
- color: var(--color-interactive-contrast);
65
- }
66
- }
67
-
68
- abbr {
69
- text-decoration: none;
70
- }
71
-
72
- background-color: inherit;
73
- }
74
-
75
- .tw-date-lookup-header-current-container {
76
- display: inline;
77
- }
78
-
79
- .np-theme-personal {
80
- &.tw-date-lookup-menu,
81
- .tw-date-lookup-menu {
82
- .table-bordered {
83
- border: none;
84
- }
85
-
86
- thead {
87
- background-color: unset;
88
- }
89
-
90
- td {
91
- border: none;
92
- }
93
- }
94
- }
@@ -198,28 +198,6 @@ describe('DateLookup', () => {
198
198
  expect(handleChange).toHaveBeenCalledWith(initialValue);
199
199
  });
200
200
  });
201
-
202
- it('limits min value', async () => {
203
- const min = new Date(initialValue);
204
- min.setDate(min.getDate() - 1);
205
- const handleChange = jest.fn();
206
- await setupAndOpenWithMouse({ min, onChange: handleChange });
207
-
208
- await user.keyboard('{ArrowLeft}{ArrowLeft}');
209
-
210
- expect(handleChange).toHaveBeenCalledWith(min);
211
- });
212
-
213
- it('limits max value', async () => {
214
- const max = new Date(initialValue);
215
- max.setDate(max.getDate() + 1);
216
- const handleChange = jest.fn();
217
- await setupAndOpenWithMouse({ max, onChange: handleChange });
218
-
219
- await user.keyboard('{ArrowRight}{ArrowRight}');
220
-
221
- expect(handleChange).toHaveBeenCalledWith(max);
222
- });
223
201
  });
224
202
 
225
203
  describe('DateLookup propTypes', () => {
@@ -296,75 +274,6 @@ describe('DateLookup (events)', () => {
296
274
  );
297
275
  };
298
276
 
299
- it('switches to years', async () => {
300
- const view = await setup();
301
- await openDateLookup();
302
- await clickDateButton();
303
-
304
- expect(getActiveYearButton(view)).toHaveFocus();
305
-
306
- await closeDateLookup(view);
307
- });
308
-
309
- it('has aria-label for 20 years', async () => {
310
- const view = await setup();
311
- await openDateLookup();
312
- await clickDateButton();
313
-
314
- expect(getButtonByAriaLabel('next 20 years')).toBeInTheDocument();
315
- expect(getButtonByAriaLabel('previous 20 years')).toBeInTheDocument();
316
-
317
- await closeDateLookup(view);
318
- });
319
-
320
- it('switches to months', async () => {
321
- const view = await setup();
322
- await openDateLookup();
323
- await clickDateButton();
324
- await userEvent.click(getActiveYearButton(view));
325
-
326
- expect(getActiveMonthButton(view)).toHaveFocus();
327
-
328
- await closeDateLookup(view);
329
- });
330
-
331
- it('has aria label for year', async () => {
332
- const view = await setup();
333
- await openDateLookup();
334
- await clickDateButton();
335
- await userEvent.click(getActiveYearButton(view));
336
-
337
- expect(getButtonByAriaLabel('next year')).toBeInTheDocument();
338
- expect(getButtonByAriaLabel('previous year')).toBeInTheDocument();
339
-
340
- await closeDateLookup(view);
341
- });
342
-
343
- it('switches to days', async () => {
344
- const view = await setup();
345
- await openDateLookup();
346
- await clickDateButton();
347
- await userEvent.click(getActiveYearButton(view));
348
- await userEvent.click(getActiveMonthButton(view));
349
-
350
- expect(getActiveDayButton(view)).toHaveFocus();
351
-
352
- await closeDateLookup(view);
353
- });
354
-
355
- it('has aria label for month', async () => {
356
- const view = await setup();
357
- await openDateLookup();
358
- await clickDateButton();
359
- await userEvent.click(getActiveYearButton(view));
360
- await userEvent.click(getActiveMonthButton(view));
361
-
362
- expect(getButtonByAriaLabel('next month')).toBeInTheDocument();
363
- expect(getButtonByAriaLabel('previous month')).toBeInTheDocument();
364
-
365
- await closeDateLookup(view);
366
- });
367
-
368
277
  it('has aria label on selected date', async () => {
369
278
  const view = await setup();
370
279
  await openDateLookup();
@@ -440,44 +349,11 @@ describe('DateLookup (events)', () => {
440
349
  });
441
350
  };
442
351
 
443
- const getDateButton = () => {
444
- return screen.getByRole('button', {
445
- name: /Go to 20 year view/i,
446
- });
447
- };
448
-
449
352
  const openDateLookup = async () => userEvent.click(getOpenButton(labelProp));
450
353
 
451
- const clickDateButton = async () => userEvent.click(getDateButton());
452
-
453
354
  // Close dateLookup and removes events attached to documents.
454
355
  const closeDateLookup = async (view: RenderResult) => userEvent.click(view.container);
455
356
 
456
357
  // @ts-expect-error getClearButton returns node
457
358
  const clickClearButton = async (view: RenderResult) => userEvent.click(getClearButton(view));
458
-
459
- const getActiveYearButton = (view: RenderResult) => {
460
- return screen.getByRole('button', {
461
- name: /selected year/i,
462
- pressed: true,
463
- });
464
- };
465
-
466
- const getActiveMonthButton = (view: RenderResult) => {
467
- return screen.getByRole('button', {
468
- name: /selected month/i,
469
- pressed: true,
470
- });
471
- };
472
-
473
- const getActiveDayButton = (view: RenderResult) => {
474
- return screen.getByRole('button', {
475
- name: /selected day/i,
476
- pressed: true,
477
- });
478
- };
479
-
480
- const getButtonByAriaLabel = (ariaLabel: string) => {
481
- return screen.getByRole('button', { name: ariaLabel });
482
- };
483
359
  });