playbook_ui 12.24.0.pre.alpha.play824733 → 12.24.0.pre.alpha.railsmultilevelimprovements741

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8231bb3fbf02190e76cf2763a3d70ee166e665ea67ab0456fb61e90aba95e933
4
- data.tar.gz: 71ef01fbd0bb7e37c38958c8b0409d577a682283713c3c7a50aec203b6870423
3
+ metadata.gz: da9354cafa403b90e25fad73dc219e98daf8daa09d49ea12b51bfd537a2221f8
4
+ data.tar.gz: 347e207c228a8bb42406003a64f811c115c14ab0abd8e60de3399014fc60752c
5
5
  SHA512:
6
- metadata.gz: 5ec035a7462706717a83e63a232d4e2cbf761eeb8e89b17466630e1921f01c1aeecd79b6e21f3b2d930a112edab0cf39cbd649ea9ddd3320a8ca9b942a4322ac
7
- data.tar.gz: e1966ede2224963aa2c903d23765dae5cb24c0317d3d7bff6f0fd9d211ae1453f48d70ab94cffdf3d04d760274234a61b5fd2d2c1cf838d652bea6e635f059d8
6
+ metadata.gz: 066a9da18630f39904e91a4807ac6941ebc6ea111c174208c34c21cb6ac9de1eaccb4c6d1b79f77ca7181c674fa6d7fd0740446166b0a06137f9070f1804fdd5
7
+ data.tar.gz: b6ee20cdcf777fe7405ff203719b0ce03592f71631406df7c682dba5e6d14e95543a30bbac23b489efb1016f06fcb7bb1bcee5e545df4bc9651c19ab0148a0be
@@ -5,8 +5,6 @@
5
5
  module Playbook
6
6
  module PbDocs
7
7
  class KitExample < Playbook::KitBase
8
- include Playbook::Markdown::Helper
9
-
10
8
  prop :kit, type: Playbook::Props::String, required: true
11
9
  prop :example_title, type: Playbook::Props::String, required: true
12
10
  prop :example_key, type: Playbook::Props::String, required: true
@@ -1,16 +1,11 @@
1
- import React, { forwardRef, useEffect, useRef, useState } from 'react'
1
+ import React, { useEffect, useRef, useState } from 'react'
2
2
  import classnames from 'classnames'
3
-
4
- import intlTelInput from 'intl-tel-input'
5
- import 'intl-tel-input/build/css/intlTelInput.css'
6
- import 'intl-tel-input/build/js/utils.js'
7
-
8
3
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
9
4
  import { globalProps } from '../utilities/globalProps'
10
-
5
+ import intlTelInput from 'intl-tel-input'
6
+ import 'intl-tel-input/build/css/intlTelInput.css'
11
7
  import TextInput from '../pb_text_input/_text_input'
12
- import { Callback } from '../types'
13
- import { isEmpty } from '../utilities/object'
8
+ import 'intl-tel-input/build/js/utils.js'
14
9
 
15
10
  declare global {
16
11
  interface Window {
@@ -24,17 +19,14 @@ type PhoneNumberInputProps = {
24
19
  dark?: boolean,
25
20
  data?: { [key: string]: string },
26
21
  disabled?: boolean,
27
- error?: string,
28
22
  id?: string,
29
23
  initialCountry?: string,
30
24
  isValid?: (valid: boolean) => void,
31
25
  label?: string,
32
26
  name?: string,
33
27
  onChange?: (e: React.FormEvent<HTMLInputElement>) => void,
34
- onValidate?: Callback<boolean, void>,
35
28
  onlyCountries: string[],
36
29
  preferredCountries?: string[],
37
- required?: boolean,
38
30
  value?: string,
39
31
  }
40
32
 
@@ -48,10 +40,10 @@ const formatToGlobalCountryName = (countryName: string) => {
48
40
  }
49
41
 
50
42
  const formatAllCountries = () => {
51
- const countryData = window.intlTelInputGlobals.getCountryData()
43
+ let countryData = window.intlTelInputGlobals.getCountryData()
52
44
 
53
45
  for (let i = 0; i < countryData.length; i++) {
54
- const country = countryData[i]
46
+ let country = countryData[i]
55
47
  country.name = formatToGlobalCountryName(country.name)
56
48
  }
57
49
  }
@@ -79,9 +71,7 @@ const PhoneNumberInput = (props: PhoneNumberInputProps) => {
79
71
  onChange = () => {
80
72
  void 0
81
73
  },
82
- onValidate = () => null,
83
74
  onlyCountries = [],
84
- required = false,
85
75
  preferredCountries = [],
86
76
  value = "",
87
77
  } = props
@@ -97,18 +87,10 @@ const PhoneNumberInput = (props: PhoneNumberInputProps) => {
97
87
  const inputRef = useRef<HTMLInputElement>()
98
88
  const [inputValue, setInputValue] = useState(value)
99
89
  const [itiInit, setItiInit] = useState<any>()
100
- const [error, setError] = useState(props.error)
90
+ const [error, setError] = useState('')
101
91
  const [dropDownIsOpen, setDropDownIsOpen] = useState(false)
102
92
  const [selectedData, setSelectedData] = useState()
103
93
 
104
- useEffect(() => {
105
- if (error?.length > 0) {
106
- onValidate(false)
107
- } else {
108
- onValidate(true)
109
- }
110
- }, [error, onValidate])
111
-
112
94
  const validateTooLongNumber = (itiInit: any) => {
113
95
  const error = itiInit.getValidationError()
114
96
 
@@ -155,7 +137,9 @@ const PhoneNumberInput = (props: PhoneNumberInputProps) => {
155
137
 
156
138
  // Separating Concerns as React Docs Recommend
157
139
  // This also Fixes things for our react_component rendering on the Rails Side
158
- useEffect(formatAllCountries, [])
140
+ useEffect(() => {
141
+ formatAllCountries()
142
+ }, [])
159
143
 
160
144
  useEffect(() => {
161
145
  const telInputInit = new intlTelInput(inputRef.current, {
@@ -164,14 +148,14 @@ const PhoneNumberInput = (props: PhoneNumberInputProps) => {
164
148
  allowDropdown: !disabled,
165
149
  initialCountry,
166
150
  onlyCountries,
167
- })
151
+ }
152
+ )
168
153
 
169
154
  inputRef.current.addEventListener("countrychange", (evt: Event) => {
170
155
  validateTooLongNumber(telInputInit)
171
156
  const phoneNumberData = getCurrentSelectedData(telInputInit, (evt.target as HTMLInputElement).value)
172
157
  setSelectedData(phoneNumberData)
173
158
  onChange(phoneNumberData)
174
- isValid(telInputInit.isValidNumber())
175
159
  })
176
160
 
177
161
  inputRef.current.addEventListener("open:countrydropdown", () => setDropDownIsOpen(true))
@@ -180,34 +164,24 @@ const PhoneNumberInput = (props: PhoneNumberInputProps) => {
180
164
  setItiInit(telInputInit)
181
165
  }, [])
182
166
 
183
- let textInputProps: {[key: string]: any} = {
184
- className: dropDownIsOpen ? 'dropdown_open' : '',
185
- dark,
186
- "data-phone-number": JSON.stringify(selectedData),
187
- disabled,
188
- error,
189
- id,
190
- label,
191
- name,
192
- onBlur: validateErrors,
193
- onChange: handleOnChange,
194
- value: inputValue
195
- }
196
-
197
- let wrapperProps: Record<string, unknown> = { className: classes }
198
-
199
- if (!isEmpty(aria)) textInputProps = {...textInputProps, ...ariaProps}
200
- if (!isEmpty(data)) wrapperProps = {...wrapperProps, ...dataProps}
201
- if (required) textInputProps.required = true
202
-
203
167
  return (
204
- <div {...wrapperProps}>
168
+ <div {...ariaProps} {...dataProps} className={classes}>
205
169
  <TextInput
206
- ref={inputRef}
207
- {...textInputProps}
170
+ className={dropDownIsOpen ? 'dropdown_open' : ''}
171
+ dark={dark}
172
+ data-phone-number={JSON.stringify(selectedData)}
173
+ disabled={disabled}
174
+ error={error}
175
+ id={id}
176
+ label={label}
177
+ name={name}
178
+ onBlur={() => validateErrors()}
179
+ onChange={handleOnChange}
180
+ ref={inputRef}
181
+ value={inputValue}
208
182
  />
209
183
  </div>
210
184
  )
211
185
  }
212
186
 
213
- export default forwardRef(PhoneNumberInput)
187
+ export default PhoneNumberInput
@@ -5,11 +5,9 @@ examples:
5
5
  - phone_number_input_preferred_countries: Preferred Countries
6
6
  - phone_number_input_initial_country: Initial Country
7
7
  - phone_number_input_only_countries: Limited Countries
8
- - phone_number_input_validation: Form Validation
9
8
 
10
9
  rails:
11
10
  - phone_number_input_default: Default
12
11
  - phone_number_input_preferred_countries: Preferred Countries
13
12
  - phone_number_input_initial_country: Initial Country
14
- - phone_number_input_only_countries: Limited Countries
15
- - phone_number_input_validation: Form Validation
13
+ - phone_number_input_only_countries: Limited Countries
@@ -2,4 +2,3 @@ export { default as PhoneNumberInputDefault } from './_phone_number_input_defaul
2
2
  export { default as PhoneNumberInputPreferredCountries } from './_phone_number_input_preferred_countries'
3
3
  export { default as PhoneNumberInputInitialCountry } from './_phone_number_input_initial_country'
4
4
  export { default as PhoneNumberInputOnlyCountries } from './_phone_number_input_only_countries'
5
- export { default as PhoneNumberInputValidation } from './_phone_number_input_validation'
@@ -5,8 +5,6 @@ module Playbook
5
5
  class PhoneNumberInput < Playbook::KitBase
6
6
  prop :disabled, type: Playbook::Props::Boolean,
7
7
  default: false
8
- prop :required, type: Playbook::Props::Boolean,
9
- default: false
10
8
  prop :initial_country, type: Playbook::Props::String,
11
9
  default: ""
12
10
  prop :label, type: Playbook::Props::String,
@@ -17,7 +15,6 @@ module Playbook
17
15
  default: []
18
16
  prop :preferred_countries, type: Playbook::Props::Array,
19
17
  default: []
20
- prop :error, type: Playbook::Props::String
21
18
  prop :value, type: Playbook::Props::String,
22
19
  default: ""
23
20
 
@@ -30,13 +27,11 @@ module Playbook
30
27
  id: id,
31
28
  dark: dark,
32
29
  disabled: disabled,
33
- error: error,
34
30
  initialCountry: initial_country,
35
31
  label: label,
36
32
  name: name,
37
33
  onlyCountries: only_countries,
38
34
  preferredCountries: preferred_countries,
39
- required: required,
40
35
  value: value,
41
36
  }
42
37
  end
@@ -1,122 +1,74 @@
1
- import React from "react";
2
- import { render, screen } from "../utilities/test-utils";
3
- import PhoneNumberInput from "./_phone_number_input";
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+ import PhoneNumberInput from './_phone_number_input'
4
4
 
5
- const testId = "phoneNumberInput";
5
+ const testId = "phoneNumberInput"
6
6
 
7
- test("should be disabled", () => {
8
- const props = {
9
- disabled: true,
10
- id: testId,
11
- };
12
-
13
- render(<PhoneNumberInput {...props} />);
14
- const kit = screen.getByRole("textbox");
15
- expect(kit).toBeDisabled();
16
- });
17
-
18
- test("should be enabled by default", () => {
19
- const props = {
20
- id: testId,
21
- };
22
-
23
- render(<PhoneNumberInput {...props} />);
24
- const kit = screen.getByRole("textbox");
25
- expect(kit).not.toBeDisabled();
26
- });
27
-
28
- test("should have label", () => {
29
- const label = "Phone Number";
30
- const props = {
31
- id: testId,
32
- label,
33
- };
34
-
35
- render(<PhoneNumberInput {...props} />);
36
- const kit = screen.getByText(label);
37
- expect(kit).toBeInTheDocument();
38
- });
39
-
40
- test("should pass data prop", () => {
41
- const props = {
42
- data: { testid: testId },
43
- id: testId,
44
- };
45
-
46
- render(<PhoneNumberInput {...props} />);
47
- const kit = screen.getByTestId(testId);
48
- expect(kit).toBeInTheDocument();
49
- });
50
-
51
- test("should pass className prop", () => {
52
- const className = "custom-class-name";
53
- const props = {
54
- className,
55
- data: { testid: testId },
56
- id: testId,
57
- };
58
-
59
- render(<PhoneNumberInput {...props} />);
60
- const kit = screen.getByTestId(testId);
61
- expect(kit).toHaveClass(className);
62
- });
63
-
64
- test("should pass value prop", () => {
65
- const value = "1234567890";
66
- const props = {
67
- id: testId,
68
- value,
69
- };
7
+ test('should be disabled', () => {
8
+ const props = {
9
+ disabled: true,
10
+ id: testId,
11
+ }
70
12
 
71
- render(<PhoneNumberInput {...props} />);
72
- const kit = screen.getByRole("textbox");
73
- expect(kit).toHaveDisplayValue(value);
74
- });
13
+ render(<PhoneNumberInput {...props} />)
14
+ const kit = screen.getByRole("textbox")
15
+ expect(kit).toBeDisabled()
16
+ })
75
17
 
76
- //TODO: test required field presence
77
- test("should pass required prop", () => {
78
- const props = {
79
- id: testId,
80
- };
18
+ test('should be enabled by default', () => {
19
+ const props = {
20
+ id: testId,
21
+ }
81
22
 
82
- render(
83
- <PhoneNumberInput
84
- required
85
- {...props}
86
- />
87
- );
88
- const kit = screen.getByRole("textbox");
89
- expect(kit).toHaveAttribute("required");
90
- });
23
+ render(<PhoneNumberInput {...props} />)
24
+ const kit = screen.getByRole("textbox")
25
+ expect(kit).not.toBeDisabled()
26
+ })
91
27
 
92
- test("should have error attribute when invalid", () => {
28
+ test('should have label', () => {
29
+ const label = 'Phone Number'
93
30
  const props = {
94
- id: testId,
95
- error: "Something isn't right here."
96
- };
31
+ id: testId,
32
+ label,
33
+ }
97
34
 
98
- render(
99
- <PhoneNumberInput
100
- {...props}
101
- />
102
- );
103
- const kit = screen.getByRole("textbox");
104
- expect(kit).toHaveAttribute("error");
105
- });
106
-
107
- test("should trigger callback", () => {
108
- const handleOnValidate = jest.fn((valid) => valid)
35
+ render(<PhoneNumberInput {...props} />)
36
+ const kit = screen.getByText(label)
37
+ expect(kit).toBeInTheDocument()
38
+ })
109
39
 
40
+ test('should pass data prop', () => {
110
41
  const props = {
111
- id: testId,
112
- onValidate: handleOnValidate
113
- };
42
+ data: { testid: testId },
43
+ id: testId,
44
+ }
114
45
 
115
- render(
116
- <PhoneNumberInput
117
- {...props}
118
- />
119
- );
46
+ render(<PhoneNumberInput {...props} />)
47
+ const kit = screen.getByTestId(testId)
48
+ expect(kit).toBeInTheDocument()
49
+ })
120
50
 
121
- expect(handleOnValidate).toBeCalledWith(true)
122
- });
51
+ test('should pass className prop', () => {
52
+ const className = 'custom-class-name'
53
+ const props = {
54
+ className,
55
+ data: { testid: testId },
56
+ id: testId,
57
+ }
58
+
59
+ render(<PhoneNumberInput {...props} />)
60
+ const kit = screen.getByTestId(testId)
61
+ expect(kit).toHaveClass(className)
62
+ })
63
+
64
+ test('should pass value prop', () => {
65
+ const value = '1234567890'
66
+ const props = {
67
+ id: testId,
68
+ value,
69
+ }
70
+
71
+ render(<PhoneNumberInput {...props} />)
72
+ const kit = screen.getByRole("textbox")
73
+ expect(kit).toHaveDisplayValue(value)
74
+ })