carbon-react 142.13.1 → 142.13.2

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.
@@ -37,9 +37,11 @@ export interface DatePickerProps {
37
37
  setOpen: (isOpen: boolean) => void;
38
38
  /** Id passed to tab guard element */
39
39
  pickerTabGuardId?: string;
40
+ /** Callback triggered when the picker is closed */
41
+ onPickerClose?: () => void;
40
42
  }
41
43
  export declare const DatePicker: {
42
- ({ inputElement, minDate, maxDate, selectedDays, disablePortal, onDayClick, pickerMouseDown, pickerProps, open, setOpen, pickerTabGuardId, }: DatePickerProps): React.JSX.Element | null;
44
+ ({ inputElement, minDate, maxDate, selectedDays, disablePortal, onDayClick, pickerMouseDown, pickerProps, open, setOpen, pickerTabGuardId, onPickerClose, }: DatePickerProps): React.JSX.Element | null;
43
45
  displayName: string;
44
46
  };
45
47
  export default DatePicker;
@@ -28,7 +28,8 @@ export const DatePicker = ({
28
28
  pickerProps,
29
29
  open,
30
30
  setOpen,
31
- pickerTabGuardId
31
+ pickerTabGuardId,
32
+ onPickerClose
32
33
  }) => {
33
34
  const locale = useLocale();
34
35
  const {
@@ -96,6 +97,7 @@ export const DatePicker = ({
96
97
  name
97
98
  };
98
99
  onDayClick?.(date, ev);
100
+ onPickerClose?.();
99
101
  }
100
102
  };
101
103
  const handleKeyUp = useCallback(ev => {
@@ -103,14 +105,16 @@ export const DatePicker = ({
103
105
  if (open && Events.isEscKey(ev)) {
104
106
  inputElement.current?.querySelector("input")?.focus();
105
107
  setOpen(false);
108
+ onPickerClose?.();
106
109
  ev.stopPropagation();
107
110
  }
108
- }, [inputElement, open, setOpen]);
111
+ }, [inputElement, onPickerClose, open, setOpen]);
109
112
  const handleOnKeyDown = ev => {
110
113
  /* istanbul ignore else */
111
114
  if (ref.current?.querySelector(".DayPicker-NavBar button") === document.activeElement && Events.isTabKey(ev) && Events.isShiftKey(ev)) {
112
115
  ev.preventDefault();
113
116
  setOpen(false);
117
+ onPickerClose?.();
114
118
  inputElement.current?.querySelector("input")?.focus();
115
119
  }
116
120
  };
@@ -120,6 +124,7 @@ export const DatePicker = ({
120
124
  if (Events.isTabKey(ev) && !Events.isShiftKey(ev)) {
121
125
  ev.preventDefault();
122
126
  setOpen(false);
127
+ onPickerClose?.();
123
128
  const input = inputElement.current?.querySelector("input");
124
129
 
125
130
  /* istanbul ignore else */
@@ -38,6 +38,10 @@ export interface DateInputProps extends Omit<TextboxProps, "value" | "formattedV
38
38
  * Name passed from DateRange to allow it to know which input is updating
39
39
  * */
40
40
  inputName?: InputName;
41
+ /** Callback triggered when the picker is opened */
42
+ onPickerOpen?: () => void;
43
+ /** Callback triggered when the picker is closed */
44
+ onPickerClose?: () => void;
41
45
  }
42
46
  export declare const DateInput: React.ForwardRefExoticComponent<DateInputProps & React.RefAttributes<HTMLInputElement>>;
43
47
  export default DateInput;
@@ -39,6 +39,8 @@ const DateInput = /*#__PURE__*/React.forwardRef(({
39
39
  labelWidth,
40
40
  maxWidth,
41
41
  inputName,
42
+ onPickerClose,
43
+ onPickerOpen,
42
44
  ...rest
43
45
  }, ref) => {
44
46
  const wrapperRef = useRef(null);
@@ -102,6 +104,7 @@ const DateInput = /*#__PURE__*/React.forwardRef(({
102
104
  isBlurBlocked.current = false;
103
105
  internalInputRef.current?.blur();
104
106
  setOpen(false);
107
+ onPickerClose?.();
105
108
  alreadyFocused.current = false;
106
109
  }
107
110
  } else {
@@ -180,6 +183,7 @@ const DateInput = /*#__PURE__*/React.forwardRef(({
180
183
  if (!open && !alreadyFocused.current) {
181
184
  setTimeout(() => {
182
185
  setOpen(true);
186
+ onPickerOpen?.();
183
187
  }, 0);
184
188
  } else {
185
189
  alreadyFocused.current = false;
@@ -192,9 +196,10 @@ const DateInput = /*#__PURE__*/React.forwardRef(({
192
196
  /* istanbul ignore else */
193
197
  if (open && Events.isEscKey(ev)) {
194
198
  setOpen(false);
199
+ onPickerClose?.();
195
200
  ev.stopPropagation();
196
201
  }
197
- }, [open]);
202
+ }, [onPickerClose, open]);
198
203
  const handleKeyDown = ev => {
199
204
  if (onKeyDown) {
200
205
  onKeyDown(ev);
@@ -202,6 +207,7 @@ const DateInput = /*#__PURE__*/React.forwardRef(({
202
207
  if (open && Events.isTabKey(ev)) {
203
208
  if (Events.isShiftKey(ev)) {
204
209
  setOpen(false);
210
+ onPickerClose?.();
205
211
  } else if (!disablePortal) {
206
212
  ev.preventDefault();
207
213
  document?.querySelector(`[id="${pickerTabGuardId.current}"]`)?.focus();
@@ -225,11 +231,20 @@ const DateInput = /*#__PURE__*/React.forwardRef(({
225
231
  if (type !== "text") {
226
232
  alreadyFocused.current = true;
227
233
  setTimeout(() => {
228
- setOpen(prev => !prev);
234
+ setOpen(prev => {
235
+ const nextState = !prev;
236
+ if (!nextState) {
237
+ onPickerClose?.();
238
+ } else {
239
+ onPickerOpen?.();
240
+ }
241
+ return nextState;
242
+ });
229
243
  }, 0);
230
244
  } else if (!open) {
231
245
  setTimeout(() => {
232
246
  setOpen(true);
247
+ onPickerOpen?.();
233
248
  }, 0);
234
249
  }
235
250
  };
@@ -333,7 +348,8 @@ const DateInput = /*#__PURE__*/React.forwardRef(({
333
348
  pickerMouseDown: handlePickerMouseDown,
334
349
  open: open,
335
350
  setOpen: setOpen,
336
- pickerTabGuardId: pickerTabGuardId.current
351
+ pickerTabGuardId: pickerTabGuardId.current,
352
+ onPickerClose: onPickerClose
337
353
  }));
338
354
  });
339
355
  if (process.env.NODE_ENV !== "production") {
@@ -719,6 +735,8 @@ if (process.env.NODE_ENV !== "production") {
719
735
  "onPasteCapture": PropTypes.func,
720
736
  "onPause": PropTypes.func,
721
737
  "onPauseCapture": PropTypes.func,
738
+ "onPickerClose": PropTypes.func,
739
+ "onPickerOpen": PropTypes.func,
722
740
  "onPlay": PropTypes.func,
723
741
  "onPlayCapture": PropTypes.func,
724
742
  "onPlaying": PropTypes.func,
@@ -107,6 +107,7 @@ const TabTitle = /*#__PURE__*/React.forwardRef(({
107
107
  return titlePosition === "before" ? [titleText, titleSiblings] : [titleSiblings, titleText];
108
108
  };
109
109
  const titleChildren = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(StyledTitleContent, {
110
+ "data-role": "tab-title-content",
110
111
  error: error,
111
112
  warning: warning,
112
113
  info: info,
@@ -137,6 +138,7 @@ const TabTitle = /*#__PURE__*/React.forwardRef(({
137
138
  info: infoMessage
138
139
  }))), !(hasFailedValidation || hasAlternateStyling) && isTabSelected && /*#__PURE__*/React.createElement(StyledSelectedIndicator, {
139
140
  "data-element": "tab-selected-indicator",
141
+ "data-role": "tab-selected-indicator",
140
142
  position: position
141
143
  }));
142
144
  const titleWrapperProps = {
@@ -102,6 +102,8 @@ const Tabs = ({
102
102
 
103
103
  /** Handles the changing of tabs with the mouse */
104
104
  const handleTabClick = ev => {
105
+ // istanbul ignore if
106
+ // (code doesn't seem to be ever reached - FE-6835 raised to investigate and hopefully remove this)
105
107
  if (Event.isEventType(ev, "keydown")) {
106
108
  return;
107
109
  }
@@ -256,7 +258,8 @@ const Tabs = ({
256
258
  };
257
259
  return /*#__PURE__*/React.createElement(StyledTabs, _extends({
258
260
  className: className,
259
- position: isInSidebar ? "left" : position
261
+ position: isInSidebar ? "left" : position,
262
+ "data-role": "tabs"
260
263
  }, tagComponent("tabs", rest), {
261
264
  isInSidebar: isInSidebar,
262
265
  headerWidth: headerWidth
@@ -37,9 +37,11 @@ export interface DatePickerProps {
37
37
  setOpen: (isOpen: boolean) => void;
38
38
  /** Id passed to tab guard element */
39
39
  pickerTabGuardId?: string;
40
+ /** Callback triggered when the picker is closed */
41
+ onPickerClose?: () => void;
40
42
  }
41
43
  export declare const DatePicker: {
42
- ({ inputElement, minDate, maxDate, selectedDays, disablePortal, onDayClick, pickerMouseDown, pickerProps, open, setOpen, pickerTabGuardId, }: DatePickerProps): React.JSX.Element | null;
44
+ ({ inputElement, minDate, maxDate, selectedDays, disablePortal, onDayClick, pickerMouseDown, pickerProps, open, setOpen, pickerTabGuardId, onPickerClose, }: DatePickerProps): React.JSX.Element | null;
43
45
  displayName: string;
44
46
  };
45
47
  export default DatePicker;
@@ -36,7 +36,8 @@ const DatePicker = ({
36
36
  pickerProps,
37
37
  open,
38
38
  setOpen,
39
- pickerTabGuardId
39
+ pickerTabGuardId,
40
+ onPickerClose
40
41
  }) => {
41
42
  const locale = (0, _useLocale.default)();
42
43
  const {
@@ -104,6 +105,7 @@ const DatePicker = ({
104
105
  name
105
106
  };
106
107
  onDayClick?.(date, ev);
108
+ onPickerClose?.();
107
109
  }
108
110
  };
109
111
  const handleKeyUp = (0, _react.useCallback)(ev => {
@@ -111,14 +113,16 @@ const DatePicker = ({
111
113
  if (open && _events.default.isEscKey(ev)) {
112
114
  inputElement.current?.querySelector("input")?.focus();
113
115
  setOpen(false);
116
+ onPickerClose?.();
114
117
  ev.stopPropagation();
115
118
  }
116
- }, [inputElement, open, setOpen]);
119
+ }, [inputElement, onPickerClose, open, setOpen]);
117
120
  const handleOnKeyDown = ev => {
118
121
  /* istanbul ignore else */
119
122
  if (ref.current?.querySelector(".DayPicker-NavBar button") === document.activeElement && _events.default.isTabKey(ev) && _events.default.isShiftKey(ev)) {
120
123
  ev.preventDefault();
121
124
  setOpen(false);
125
+ onPickerClose?.();
122
126
  inputElement.current?.querySelector("input")?.focus();
123
127
  }
124
128
  };
@@ -128,6 +132,7 @@ const DatePicker = ({
128
132
  if (_events.default.isTabKey(ev) && !_events.default.isShiftKey(ev)) {
129
133
  ev.preventDefault();
130
134
  setOpen(false);
135
+ onPickerClose?.();
131
136
  const input = inputElement.current?.querySelector("input");
132
137
 
133
138
  /* istanbul ignore else */
@@ -38,6 +38,10 @@ export interface DateInputProps extends Omit<TextboxProps, "value" | "formattedV
38
38
  * Name passed from DateRange to allow it to know which input is updating
39
39
  * */
40
40
  inputName?: InputName;
41
+ /** Callback triggered when the picker is opened */
42
+ onPickerOpen?: () => void;
43
+ /** Callback triggered when the picker is closed */
44
+ onPickerClose?: () => void;
41
45
  }
42
46
  export declare const DateInput: React.ForwardRefExoticComponent<DateInputProps & React.RefAttributes<HTMLInputElement>>;
43
47
  export default DateInput;
@@ -48,6 +48,8 @@ const DateInput = exports.DateInput = /*#__PURE__*/_react.default.forwardRef(({
48
48
  labelWidth,
49
49
  maxWidth,
50
50
  inputName,
51
+ onPickerClose,
52
+ onPickerOpen,
51
53
  ...rest
52
54
  }, ref) => {
53
55
  const wrapperRef = (0, _react.useRef)(null);
@@ -111,6 +113,7 @@ const DateInput = exports.DateInput = /*#__PURE__*/_react.default.forwardRef(({
111
113
  isBlurBlocked.current = false;
112
114
  internalInputRef.current?.blur();
113
115
  setOpen(false);
116
+ onPickerClose?.();
114
117
  alreadyFocused.current = false;
115
118
  }
116
119
  } else {
@@ -189,6 +192,7 @@ const DateInput = exports.DateInput = /*#__PURE__*/_react.default.forwardRef(({
189
192
  if (!open && !alreadyFocused.current) {
190
193
  setTimeout(() => {
191
194
  setOpen(true);
195
+ onPickerOpen?.();
192
196
  }, 0);
193
197
  } else {
194
198
  alreadyFocused.current = false;
@@ -201,9 +205,10 @@ const DateInput = exports.DateInput = /*#__PURE__*/_react.default.forwardRef(({
201
205
  /* istanbul ignore else */
202
206
  if (open && _events.default.isEscKey(ev)) {
203
207
  setOpen(false);
208
+ onPickerClose?.();
204
209
  ev.stopPropagation();
205
210
  }
206
- }, [open]);
211
+ }, [onPickerClose, open]);
207
212
  const handleKeyDown = ev => {
208
213
  if (onKeyDown) {
209
214
  onKeyDown(ev);
@@ -211,6 +216,7 @@ const DateInput = exports.DateInput = /*#__PURE__*/_react.default.forwardRef(({
211
216
  if (open && _events.default.isTabKey(ev)) {
212
217
  if (_events.default.isShiftKey(ev)) {
213
218
  setOpen(false);
219
+ onPickerClose?.();
214
220
  } else if (!disablePortal) {
215
221
  ev.preventDefault();
216
222
  document?.querySelector(`[id="${pickerTabGuardId.current}"]`)?.focus();
@@ -234,11 +240,20 @@ const DateInput = exports.DateInput = /*#__PURE__*/_react.default.forwardRef(({
234
240
  if (type !== "text") {
235
241
  alreadyFocused.current = true;
236
242
  setTimeout(() => {
237
- setOpen(prev => !prev);
243
+ setOpen(prev => {
244
+ const nextState = !prev;
245
+ if (!nextState) {
246
+ onPickerClose?.();
247
+ } else {
248
+ onPickerOpen?.();
249
+ }
250
+ return nextState;
251
+ });
238
252
  }, 0);
239
253
  } else if (!open) {
240
254
  setTimeout(() => {
241
255
  setOpen(true);
256
+ onPickerOpen?.();
242
257
  }, 0);
243
258
  }
244
259
  };
@@ -342,7 +357,8 @@ const DateInput = exports.DateInput = /*#__PURE__*/_react.default.forwardRef(({
342
357
  pickerMouseDown: handlePickerMouseDown,
343
358
  open: open,
344
359
  setOpen: setOpen,
345
- pickerTabGuardId: pickerTabGuardId.current
360
+ pickerTabGuardId: pickerTabGuardId.current,
361
+ onPickerClose: onPickerClose
346
362
  }));
347
363
  });
348
364
  if (process.env.NODE_ENV !== "production") {
@@ -728,6 +744,8 @@ if (process.env.NODE_ENV !== "production") {
728
744
  "onPasteCapture": _propTypes.default.func,
729
745
  "onPause": _propTypes.default.func,
730
746
  "onPauseCapture": _propTypes.default.func,
747
+ "onPickerClose": _propTypes.default.func,
748
+ "onPickerOpen": _propTypes.default.func,
731
749
  "onPlay": _propTypes.default.func,
732
750
  "onPlayCapture": _propTypes.default.func,
733
751
  "onPlaying": _propTypes.default.func,
@@ -116,6 +116,7 @@ const TabTitle = /*#__PURE__*/_react.default.forwardRef(({
116
116
  return titlePosition === "before" ? [titleText, titleSiblings] : [titleSiblings, titleText];
117
117
  };
118
118
  const titleChildren = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_tabTitle.StyledTitleContent, {
119
+ "data-role": "tab-title-content",
119
120
  error: error,
120
121
  warning: warning,
121
122
  info: info,
@@ -146,6 +147,7 @@ const TabTitle = /*#__PURE__*/_react.default.forwardRef(({
146
147
  info: infoMessage
147
148
  }))), !(hasFailedValidation || hasAlternateStyling) && isTabSelected && /*#__PURE__*/_react.default.createElement(_tabTitle.StyledSelectedIndicator, {
148
149
  "data-element": "tab-selected-indicator",
150
+ "data-role": "tab-selected-indicator",
149
151
  position: position
150
152
  }));
151
153
  const titleWrapperProps = {
@@ -117,6 +117,8 @@ const Tabs = ({
117
117
 
118
118
  /** Handles the changing of tabs with the mouse */
119
119
  const handleTabClick = ev => {
120
+ // istanbul ignore if
121
+ // (code doesn't seem to be ever reached - FE-6835 raised to investigate and hopefully remove this)
120
122
  if (_events.default.isEventType(ev, "keydown")) {
121
123
  return;
122
124
  }
@@ -271,7 +273,8 @@ const Tabs = ({
271
273
  };
272
274
  return /*#__PURE__*/_react.default.createElement(_tabs.default, _extends({
273
275
  className: className,
274
- position: isInSidebar ? "left" : position
276
+ position: isInSidebar ? "left" : position,
277
+ "data-role": "tabs"
275
278
  }, (0, _tags.default)("tabs", rest), {
276
279
  isInSidebar: isInSidebar,
277
280
  headerWidth: headerWidth
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "142.13.1",
3
+ "version": "142.13.2",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "files": [
6
6
  "lib",