pebble-web 2.25.2 → 2.26.1-alpha.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.
Files changed (94) hide show
  1. package/dist/components/typings/Button.d.ts +1 -0
  2. package/dist/components/typings/Calendar.d.ts +1 -0
  3. package/dist/components/typings/CheckboxGroup.d.ts +1 -0
  4. package/dist/components/typings/Control.d.ts +1 -0
  5. package/dist/components/typings/DateInput.d.ts +1 -0
  6. package/dist/components/typings/Dropdown.d.ts +1 -0
  7. package/dist/components/typings/Input.d.ts +1 -0
  8. package/dist/components/typings/Loader.d.ts +1 -0
  9. package/dist/components/typings/Message.d.ts +1 -0
  10. package/dist/components/typings/OptionGroup.d.ts +1 -0
  11. package/dist/components/typings/OptionGroupCheckBox.d.ts +1 -0
  12. package/dist/components/typings/OptionGroupRadio.d.ts +1 -0
  13. package/dist/components/typings/PhoneNumberInput.d.ts +1 -0
  14. package/dist/components/typings/PopUp.d.ts +1 -0
  15. package/dist/components/typings/RadioGroup.d.ts +1 -0
  16. package/dist/components/typings/Search.d.ts +1 -0
  17. package/dist/components/typings/SecondaryInput.d.ts +1 -0
  18. package/dist/components/typings/Select.d.ts +1 -0
  19. package/dist/components/typings/Text.d.ts +1 -0
  20. package/dist/components/typings/Typeahead.d.ts +1 -0
  21. package/dist/index.d.ts +1 -0
  22. package/dist/pebble-web.dev.js +358 -164
  23. package/dist/pebble-web.dev.js.map +1 -1
  24. package/dist/pebble-web.es.dev.js +239 -70
  25. package/dist/pebble-web.es.dev.js.map +1 -1
  26. package/dist/pebble-web.es.js +233 -64
  27. package/dist/pebble-web.es.js.map +1 -1
  28. package/dist/pebble-web.js +352 -158
  29. package/dist/pebble-web.js.map +1 -1
  30. package/dist/pebble-web.module.dev.js +347 -165
  31. package/dist/pebble-web.module.dev.js.map +1 -1
  32. package/dist/pebble-web.module.js +341 -159
  33. package/dist/pebble-web.module.js.map +1 -1
  34. package/dist/pebble-web.umd.dev.js +360 -166
  35. package/dist/pebble-web.umd.dev.js.map +1 -1
  36. package/dist/pebble-web.umd.js +354 -160
  37. package/dist/pebble-web.umd.js.map +1 -1
  38. package/dist/utils/index.d.ts +1 -0
  39. package/dist/utils/testIds.d.ts +65 -0
  40. package/package.json +3 -2
  41. package/src/components/Button.tsx +3 -1
  42. package/src/components/Calendar.tsx +28 -4
  43. package/src/components/CheckboxGroup.tsx +13 -3
  44. package/src/components/DateInput.tsx +3 -1
  45. package/src/components/DropDown.tsx +3 -1
  46. package/src/components/Input.tsx +15 -3
  47. package/src/components/Loader.tsx +3 -1
  48. package/src/components/Message.tsx +3 -1
  49. package/src/components/NativeDateInput.tsx +2 -1
  50. package/src/components/OptionGroupCheckBox.tsx +14 -2
  51. package/src/components/PhoneNumberInput.tsx +7 -1
  52. package/src/components/PopUp.tsx +7 -1
  53. package/src/components/RadioGroup.tsx +20 -3
  54. package/src/components/Search.tsx +3 -1
  55. package/src/components/SecondaryInput.tsx +9 -2
  56. package/src/components/Select.tsx +13 -1
  57. package/src/components/Tabs.tsx +1 -1
  58. package/src/components/Text.tsx +7 -2
  59. package/src/components/TimePicker.tsx +2 -2
  60. package/src/components/Toast.tsx +2 -2
  61. package/src/components/TypeAhead.tsx +14 -3
  62. package/src/components/__tests__/__snapshots__/checkboxGroup.test.tsx.snap +88 -0
  63. package/src/components/__tests__/__snapshots__/optionGroup.test.tsx.snap +0 -3
  64. package/src/components/__tests__/__snapshots__/select.test.tsx.snap +3 -0
  65. package/src/components/__tests__/__snapshots__/timepicker.test.tsx.snap +18 -18
  66. package/src/components/__tests__/calendar.test.tsx +6 -24
  67. package/src/components/__tests__/checkboxGroup.test.tsx +39 -8
  68. package/src/components/__tests__/select.test.tsx +19 -30
  69. package/src/components/__tests__/timepicker.test.tsx +4 -14
  70. package/src/components/shared/Control.tsx +3 -1
  71. package/src/components/shared/OptionGroup.tsx +23 -5
  72. package/src/components/typings/Button.ts +1 -0
  73. package/src/components/typings/Calendar.ts +1 -0
  74. package/src/components/typings/CheckboxGroup.ts +1 -0
  75. package/src/components/typings/Control.ts +1 -0
  76. package/src/components/typings/DateInput.ts +1 -0
  77. package/src/components/typings/Dropdown.ts +1 -0
  78. package/src/components/typings/Input.ts +1 -0
  79. package/src/components/typings/Loader.ts +1 -0
  80. package/src/components/typings/Message.ts +1 -0
  81. package/src/components/typings/OptionGroup.ts +1 -0
  82. package/src/components/typings/OptionGroupCheckBox.ts +1 -0
  83. package/src/components/typings/OptionGroupRadio.ts +1 -0
  84. package/src/components/typings/PhoneNumberInput.ts +1 -0
  85. package/src/components/typings/PopUp.ts +1 -0
  86. package/src/components/typings/RadioGroup.ts +1 -0
  87. package/src/components/typings/Search.ts +1 -0
  88. package/src/components/typings/SecondaryInput.ts +1 -0
  89. package/src/components/typings/Select.ts +1 -0
  90. package/src/components/typings/Text.ts +1 -0
  91. package/src/components/typings/Typeahead.ts +1 -0
  92. package/src/index.ts +1 -0
  93. package/src/utils/index.ts +1 -0
  94. package/src/utils/testIds.ts +119 -0
@@ -13,7 +13,8 @@ function Control<OptionType>(props: ControlProps<OptionType>) {
13
13
  children = ControlView,
14
14
  type,
15
15
  className,
16
- indeterminate
16
+ indeterminate,
17
+ testId
17
18
  } = props;
18
19
  return (
19
20
  <div
@@ -30,6 +31,7 @@ function Control<OptionType>(props: ControlProps<OptionType>) {
30
31
  onChange && onChange({ value, checked: !checked }, e)
31
32
  : undefined
32
33
  }
34
+ data-testid={testId}
33
35
  >
34
36
  {children(props)}
35
37
  </div>
@@ -12,6 +12,11 @@ import {
12
12
  searchBoxHeight
13
13
  } from "../styles/OptionGroup.styles";
14
14
  import { rowWrapper, advancedActionsWrapper } from "../styles/Options.styles";
15
+ import {
16
+ getOptionGroupTestIds,
17
+ getOptionTestId,
18
+ getTestIds
19
+ } from "../../utils/testIds";
15
20
 
16
21
  class OptionGroup<OptionType> extends React.PureComponent<
17
22
  OptionGroupProps<OptionType>,
@@ -121,10 +126,13 @@ class OptionGroup<OptionType> extends React.PureComponent<
121
126
  className,
122
127
  isSelected,
123
128
  handleChange,
124
- searchBoxProps
129
+ searchBoxProps,
130
+ testId
125
131
  } = this.props;
126
132
  const { isScrolled, highlighted } = this.state;
127
133
 
134
+ const testIds = getTestIds(testId, getOptionGroupTestIds);
135
+
128
136
  const _children = React.Children.map(children, (_option, i) => {
129
137
  // `_option as React.ReactElement<OptionProps>` is a hack
130
138
  // Because React does not allow us to specify what sort of elements
@@ -142,7 +150,10 @@ class OptionGroup<OptionType> extends React.PureComponent<
142
150
  isSelected: isSelected(option.props.value),
143
151
  multiSelect,
144
152
  // @ts-ignore
145
- ref
153
+ ref,
154
+ testId: testIds.optionId
155
+ ? getOptionTestId(testIds.optionId, i)
156
+ : undefined
146
157
  });
147
158
  });
148
159
 
@@ -168,6 +179,7 @@ class OptionGroup<OptionType> extends React.PureComponent<
168
179
  onKeyDown: this.handleKeyPress,
169
180
  autoFocus: true
170
181
  }}
182
+ testId={testIds.searchBoxId}
171
183
  />
172
184
  </div>
173
185
  )}
@@ -179,15 +191,21 @@ class OptionGroup<OptionType> extends React.PureComponent<
179
191
  }}
180
192
  className={cx(optionsWrapper, className)}
181
193
  role={multiSelect ? "group" : "radiogroup"}
182
- data-test-id="optiongroup"
194
+ data-testid={testId}
183
195
  aria-label={searchBoxProps && searchBoxProps.placeholder}
184
196
  >
185
197
  {advancedOptions && advancedOptionsProps && (
186
198
  <div className={_class}>
187
- <div onClick={advancedOptionsProps.selectVisible}>
199
+ <div
200
+ onClick={advancedOptionsProps.selectVisible}
201
+ data-testid={testIds.selectVisibleId}
202
+ >
188
203
  Select Visible
189
204
  </div>
190
- <div onClick={advancedOptionsProps.clearVisible}>
205
+ <div
206
+ onClick={advancedOptionsProps.clearVisible}
207
+ data-testid={testIds.clearVisibleId}
208
+ >
191
209
  Clear Visible
192
210
  </div>
193
211
  </div>
@@ -16,6 +16,7 @@ export interface ButtonProps {
16
16
  loading?: boolean;
17
17
  outline?: boolean;
18
18
  buttonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>;
19
+ testId?: string;
19
20
  }
20
21
 
21
22
  export interface DropDownButtonProps extends ButtonProps {
@@ -12,6 +12,7 @@ interface CommonCalendarProps extends Omit<CP, "onChange"> {
12
12
  onClear?: () => void;
13
13
  tileDots: TileDot[];
14
14
  disabledDays?: Array<number | Date>;
15
+ testId?: string;
15
16
  }
16
17
 
17
18
  export interface DateSingle extends CommonCalendarProps {
@@ -6,4 +6,5 @@ export interface CheckboxGroupProps<OptionType> {
6
6
  className?: string;
7
7
  name: string;
8
8
  disabled?: boolean;
9
+ testId?: string;
9
10
  }
@@ -14,4 +14,5 @@ export interface ControlProps<OptionType> {
14
14
  className?: string;
15
15
  iconClassName?: string;
16
16
  indeterminate?: boolean;
17
+ testId?: string;
17
18
  }
@@ -18,6 +18,7 @@ export interface DateInputProps {
18
18
  onOutsideClick?: (isOpen: boolean) => void;
19
19
  controlled?: boolean;
20
20
  isOpen?: boolean;
21
+ testId?: string;
21
22
  }
22
23
 
23
24
  export interface DateInputState {
@@ -25,6 +25,7 @@ export interface DropdownProps {
25
25
  modifiers?: Modifiers;
26
26
  controlled?: boolean;
27
27
  isOpen?: boolean;
28
+ testId?: string;
28
29
  }
29
30
 
30
31
  export interface DropdownState {
@@ -20,6 +20,7 @@ export interface CommonInputProps {
20
20
  successMessage?: string;
21
21
  leftElement?: () => React.ReactNode;
22
22
  rightElement?: () => React.ReactNode;
23
+ testId?: string;
23
24
  }
24
25
 
25
26
  export type InputType =
@@ -2,4 +2,5 @@ export interface LoaderProps {
2
2
  color?: string;
3
3
  className?: string;
4
4
  scale?: number;
5
+ testId?: string;
5
6
  }
@@ -4,4 +4,5 @@ export interface AlertProps {
4
4
  intent: "error" | "success";
5
5
  className?: string;
6
6
  text: React.ReactChild;
7
+ testId?: string;
7
8
  }
@@ -13,6 +13,7 @@ export interface CommonProps {
13
13
  selectVisible?: () => void;
14
14
  clearVisible?: () => void;
15
15
  };
16
+ testId?: string;
16
17
  }
17
18
 
18
19
  export interface OptionGroupProps<OptionType> extends CommonProps {
@@ -13,4 +13,5 @@ export interface OptionGroupCheckBoxProps<OptionType> extends CommonProps {
13
13
  props: OptionGroupCheckBoxProps<OptionType>
14
14
  ) => void;
15
15
  onClear?: () => void;
16
+ testId?: string;
16
17
  }
@@ -7,4 +7,5 @@ export interface OptionGroupRadio<OptionType> extends CommonProps {
7
7
  */
8
8
  selected?: OptionType;
9
9
  isSelected?: (value: OptionType) => boolean;
10
+ testId?: string;
10
11
  }
@@ -19,4 +19,5 @@ export interface PhoneNumberInputProps<OptionType = string> {
19
19
  inputProps?: Omit<SimpleInputProps, "value" | "onChange" | "placeholder">;
20
20
  placeholder?: string;
21
21
  required?: boolean;
22
+ testId?: string;
22
23
  }
@@ -9,4 +9,5 @@ export interface PopUpProps {
9
9
  rejectButtonText?: string | Element;
10
10
  approveButtonProps?: Omit<ButtonProps, "children" | "onClick">;
11
11
  rejectButtonProps?: Omit<ButtonProps, "children" | "onClick">;
12
+ testId?: string;
12
13
  }
@@ -7,4 +7,5 @@ export interface RadioGroupProps<OptionType> {
7
7
  className?: string;
8
8
  name: string;
9
9
  disabled?: boolean;
10
+ testId?: string;
10
11
  }
@@ -10,4 +10,5 @@ export interface SearchProps {
10
10
  clearable?: boolean;
11
11
  inputProps?: React.InputHTMLAttributes<HTMLInputElement>;
12
12
  loading?: boolean;
13
+ testId?: string;
13
14
  }
@@ -14,6 +14,7 @@ export interface SecondaryInputProps {
14
14
  message?: string;
15
15
  inputProps?: React.InputHTMLAttributes<HTMLInputElement> &
16
16
  React.RefAttributes<HTMLInputElement>;
17
+ testId?: string;
17
18
  }
18
19
 
19
20
  export interface SecondaryInputState {
@@ -23,6 +23,7 @@ export interface CommonSelectProps<OptionType> {
23
23
  isSelected?: (value: OptionType) => boolean;
24
24
  placement?: Placement;
25
25
  modifiers?: Modifiers;
26
+ testId?: string;
26
27
  }
27
28
 
28
29
  export interface SingleSelectProps<OptionType>
@@ -4,4 +4,5 @@ export interface TextProps {
4
4
  color?: string;
5
5
  className?: string;
6
6
  typography?: TypographyStyle;
7
+ testId?: string;
7
8
  }
@@ -34,6 +34,7 @@ export interface TypeaheadProps<OptionType> {
34
34
  valueExtractor: (value: OptionType) => string;
35
35
  onClear?: () => void;
36
36
  inputProps?: Omit<SimpleInputProps, "onChange" | "value" | "placeholder">;
37
+ testId?: string;
37
38
  }
38
39
 
39
40
  export interface TypeaheadState {
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./theme";
2
2
  export * from "./components";
3
3
  export * from "./utils/useragent";
4
+ export * from "./utils/testIds";
4
5
 
5
6
  import * as utils from "./utils";
6
7
  import { colors } from "pebble-shared";
@@ -2,3 +2,4 @@ export * from "./strings/capitalize";
2
2
  export * from "./numbers/format";
3
3
  export * from "./analytics/ga";
4
4
  export * from "./dimensions";
5
+ export * from "./testIds";
@@ -0,0 +1,119 @@
1
+ type TestIdMap = Record<string, string | object>;
2
+
3
+ type BaseSelectIds = {
4
+ inputId: string;
5
+ optionGroupId: string;
6
+ };
7
+
8
+ type OptionGroupCheckBoxIds = ReturnType<typeof getOptionGroupCheckBoxTestIds>;
9
+
10
+ type OptionGroupRadioIds = ReturnType<typeof getOptionGroupRadioTestIds>;
11
+
12
+ export function getTestIds<T extends TestIdMap>(
13
+ id: string | undefined,
14
+ builder: (_id: string) => Partial<T>
15
+ ): Partial<T> {
16
+ return id ? builder(id) : {};
17
+ }
18
+
19
+ export function getOptionTestId(id: string, index: number) {
20
+ return `${id}-${index}`;
21
+ }
22
+
23
+ export function getRadioGroupTestIds(id: string) {
24
+ return {
25
+ optionId: `${id}-option`
26
+ };
27
+ }
28
+
29
+ export function getOptionGroupTestIds(id: string) {
30
+ return {
31
+ searchBoxId: `${id}-search`,
32
+ optionId: `${id}-option`,
33
+ selectVisibleId: `${id}-select-visible`,
34
+ clearVisibleId: `${id}-clear-visible`
35
+ };
36
+ }
37
+
38
+ export const getOptionGroupRadioTestIds = (id: string) =>
39
+ getOptionGroupTestIds(id);
40
+
41
+ export function getOptionGroupCheckBoxTestIds(id: string) {
42
+ return {
43
+ applyButtonId: `${id}-apply-btn`,
44
+ clearButtonId: `${id}-clear-btn`,
45
+ ...getOptionGroupTestIds(id)
46
+ };
47
+ }
48
+
49
+ export function getPhoneNumberInputTestIds(id: string) {
50
+ return {
51
+ phoneId: `${id}-phone`,
52
+ countryId: `${id}-country`,
53
+ countryInputIds: getSelectInputTestIds(`${id}-country`)
54
+ };
55
+ }
56
+
57
+ export function getMessageTestId(id: string) {
58
+ return `${id}-message`;
59
+ }
60
+
61
+ export function getSelectInputTestIds(
62
+ id: string,
63
+ multiSelect: true
64
+ ): BaseSelectIds & OptionGroupCheckBoxIds;
65
+
66
+ export function getSelectInputTestIds(
67
+ id: string,
68
+ multiSelect?: false
69
+ ): BaseSelectIds & OptionGroupRadioIds;
70
+
71
+ export function getSelectInputTestIds(
72
+ id: string,
73
+ multiSelect?: boolean
74
+ ):
75
+ | (BaseSelectIds & OptionGroupCheckBoxIds)
76
+ | (BaseSelectIds & OptionGroupRadioIds);
77
+
78
+ export function getSelectInputTestIds(
79
+ id: string,
80
+ multiSelect: boolean = false
81
+ ) {
82
+ const optionGroupId = `${id}-option-group`;
83
+
84
+ const baseIds = {
85
+ inputId: `${id}-input`,
86
+ optionGroupId
87
+ };
88
+ return {
89
+ ...(multiSelect
90
+ ? getOptionGroupCheckBoxTestIds(optionGroupId)
91
+ : getOptionGroupRadioTestIds(optionGroupId)),
92
+ ...baseIds
93
+ };
94
+ }
95
+
96
+ export function getTypeaheadTestIds(id: string) {
97
+ const optionGroupId = `${id}-option-group`;
98
+ return {
99
+ optionGroupId,
100
+ ...getOptionGroupRadioTestIds(optionGroupId)
101
+ };
102
+ }
103
+
104
+ export function getCalendarTestIds(id: string){
105
+ return {
106
+ leftIconId: `${id}-left-icon`,
107
+ rightIconId: `${id}-right-icon`,
108
+ applyButtonId: `${id}-apply-btn`,
109
+ clearButtonId: `${id}-clear-btn`
110
+ };
111
+ }
112
+
113
+ export function getPopUpTestIds(id: string){
114
+ return {
115
+ closeButtonId: `${id}-close-btn`,
116
+ approveButtonId: `${id}-approve-btn`,
117
+ rejectButtonId: `${id}-reject-btn`
118
+ };
119
+ }