playbook_ui 3.4.0 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -0
  3. data/app/pb_kits/playbook/index.js +1 -0
  4. data/app/pb_kits/playbook/packs/examples.js +3 -0
  5. data/app/pb_kits/playbook/pb_body/_body_mixins.scss +6 -0
  6. data/app/pb_kits/playbook/pb_checkbox/_checkbox.html.erb +1 -1
  7. data/app/pb_kits/playbook/pb_checkbox/_checkbox.jsx +11 -3
  8. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +12 -0
  9. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +10 -1
  10. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_dark_error.html.erb +7 -0
  11. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_dark_error.jsx +18 -0
  12. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_error.html.erb +6 -0
  13. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_error.jsx +17 -0
  14. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +4 -0
  15. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +2 -0
  16. data/app/pb_kits/playbook/pb_enhanced_element/element_observer.js +67 -0
  17. data/app/pb_kits/playbook/pb_enhanced_element/index.js +62 -0
  18. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -1
  19. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form.html.erb +1 -1
  20. data/app/pb_kits/playbook/pb_form/form_builder/simple_form_builder.rb +1 -1
  21. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.html.erb +1 -1
  22. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.jsx +3 -1
  23. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_dark.html.erb +1 -0
  24. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_dark.jsx +1 -0
  25. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.html.erb +1 -0
  26. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.jsx +1 -0
  27. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +1 -0
  28. data/app/pb_kits/playbook/pb_list/_item.html.erb +5 -3
  29. data/app/pb_kits/playbook/pb_list/_list.html.erb +7 -3
  30. data/app/pb_kits/playbook/pb_list/item.rb +2 -0
  31. data/app/pb_kits/playbook/pb_list/list.rb +2 -0
  32. data/app/pb_kits/playbook/pb_radio/_radio.html.erb +1 -1
  33. data/app/pb_kits/playbook/pb_radio/_radio.jsx +7 -2
  34. data/app/pb_kits/playbook/pb_radio/_radio.scss +15 -5
  35. data/app/pb_kits/playbook/pb_radio/docs/_radio_dark_error.html.erb +7 -0
  36. data/app/pb_kits/playbook/pb_radio/docs/_radio_dark_error.jsx +17 -0
  37. data/app/pb_kits/playbook/pb_radio/docs/_radio_error.html.erb +6 -0
  38. data/app/pb_kits/playbook/pb_radio/docs/_radio_error.jsx +16 -0
  39. data/app/pb_kits/playbook/pb_radio/docs/example.yml +4 -3
  40. data/app/pb_kits/playbook/pb_radio/docs/index.js +2 -0
  41. data/app/pb_kits/playbook/pb_radio/radio.rb +16 -8
  42. data/app/pb_kits/playbook/pb_select/_select.html.erb +2 -0
  43. data/app/pb_kits/playbook/pb_select/_select.jsx +27 -16
  44. data/app/pb_kits/playbook/pb_select/_select.scss +22 -1
  45. data/app/pb_kits/playbook/pb_select/docs/_select_dark_error.html.erb +25 -0
  46. data/app/pb_kits/playbook/pb_select/docs/_select_dark_error.jsx +37 -0
  47. data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +24 -0
  48. data/app/pb_kits/playbook/pb_select/docs/_select_error.jsx +35 -0
  49. data/app/pb_kits/playbook/pb_select/docs/example.yml +4 -0
  50. data/app/pb_kits/playbook/pb_select/docs/index.js +2 -0
  51. data/app/pb_kits/playbook/pb_select/select.rb +14 -11
  52. data/app/pb_kits/playbook/pb_text_input/_text_input.html.erb +7 -1
  53. data/app/pb_kits/playbook/pb_text_input/_text_input.jsx +22 -9
  54. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +19 -0
  55. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_dark_error.html.erb +14 -0
  56. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_dark_error.jsx +18 -0
  57. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +2 -0
  58. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.jsx +17 -0
  59. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +4 -0
  60. data/app/pb_kits/playbook/pb_text_input/docs/index.js +2 -0
  61. data/app/pb_kits/playbook/pb_text_input/text_input.rb +12 -3
  62. data/app/pb_kits/playbook/pb_textarea/_textarea.html.erb +6 -0
  63. data/app/pb_kits/playbook/pb_textarea/_textarea.jsx +15 -5
  64. data/app/pb_kits/playbook/pb_textarea/_textarea.scss +14 -0
  65. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_dark_error.html.erb +6 -0
  66. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_dark_error.jsx +20 -0
  67. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +1 -0
  68. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.jsx +19 -0
  69. data/app/pb_kits/playbook/pb_textarea/docs/example.yml +4 -0
  70. data/app/pb_kits/playbook/pb_textarea/docs/index.js +2 -0
  71. data/app/pb_kits/playbook/pb_textarea/textarea.rb +13 -6
  72. data/app/pb_kits/playbook/pb_typeahead/_typeahead.html.erb +16 -0
  73. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +52 -0
  74. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default.html.erb +51 -0
  75. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +3 -0
  76. data/app/pb_kits/playbook/pb_typeahead/index.js +158 -0
  77. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +28 -0
  78. data/app/pb_kits/playbook/tokens/_colors.scss +2 -0
  79. data/lib/playbook/version.rb +1 -1
  80. metadata +30 -2
@@ -0,0 +1,37 @@
1
+ import React from 'react'
2
+ import { Body, Select } from '../..'
3
+
4
+ const SelectDarkError = () => {
5
+ return (
6
+ <div>
7
+ <Select
8
+ dark
9
+ error="Please make a valid selection"
10
+ label="Favorite Food"
11
+ name="food"
12
+ options={[
13
+ {
14
+ value: '1',
15
+ valueText: 'Burgers',
16
+ },
17
+ {
18
+ value: '2',
19
+ selected: true,
20
+ valueText: 'Pizza',
21
+ },
22
+ {
23
+ value: '3',
24
+ valueText: 'Tacos',
25
+ },
26
+ ]}
27
+ />
28
+ <Body
29
+ dark
30
+ error="Please make a valid selection"
31
+ status="negative"
32
+ />
33
+ </div>
34
+ )
35
+ }
36
+
37
+ export default SelectDarkError
@@ -0,0 +1,24 @@
1
+ <%= pb_rails("select", props: {
2
+ error: "Please make a valid selection",
3
+ label: "Favorite Food",
4
+ name: "food",
5
+ options: [
6
+ {
7
+ value: "1",
8
+ value_text: "Burgers",
9
+ },
10
+ {
11
+ value: "2",
12
+ selected: true,
13
+ value_text: "Pizza",
14
+ },
15
+ {
16
+ value: "3",
17
+ value_text: "Tacos",
18
+ },
19
+ {
20
+ value: "4",
21
+ value_text: "BBQ",
22
+ },
23
+ ]
24
+ }) %>
@@ -0,0 +1,35 @@
1
+ import React from 'react'
2
+ import { Body, Select } from '../..'
3
+
4
+ const SelectError = () => {
5
+ return (
6
+ <div>
7
+ <Select
8
+ error="Please make a valid selection"
9
+ label="Favorite Food"
10
+ name="food"
11
+ options={[
12
+ {
13
+ value: '1',
14
+ valueText: 'Burgers',
15
+ },
16
+ {
17
+ value: '2',
18
+ selected: true,
19
+ valueText: 'Pizza',
20
+ },
21
+ {
22
+ value: '3',
23
+ valueText: 'Tacos',
24
+ },
25
+ ]}
26
+ />
27
+ <Body
28
+ error="Please make a valid selection"
29
+ status="negative"
30
+ />
31
+ </div>
32
+ )
33
+ }
34
+
35
+ export default SelectError
@@ -9,6 +9,8 @@ examples:
9
9
  - select_value_text_same: Equal option value and value text
10
10
  - select_custom_select: Custom Select
11
11
  - select_dark: Dark Select
12
+ - select_error: Select w/ Error
13
+ - select_dark_error: Select Dark w/ Error
12
14
 
13
15
 
14
16
  react:
@@ -20,3 +22,5 @@ examples:
20
22
  - select_value_text_same: Equal option value and value text
21
23
  - select_custom_select: Custom Select
22
24
  - select_dark: Dark Select
25
+ - select_error: Select w/ Error
26
+ - select_dark_error: Select Dark w/ Error
@@ -6,3 +6,5 @@ export { default as SelectDisabled } from './_select_disabled.jsx'
6
6
  export { default as SelectRequired } from './_select_required.jsx'
7
7
  export { default as SelectCustomSelect } from './_select_custom_select.jsx'
8
8
  export { default as SelectValueTextSame } from './_select_value_text_same.jsx'
9
+ export { default as SelectError } from './_select_error.jsx'
10
+ export { default as SelectDarkError } from './_select_dark_error.jsx'
@@ -11,26 +11,26 @@ module Playbook
11
11
 
12
12
  partial "pb_select/select"
13
13
 
14
- prop :label
15
- prop :required, type: Playbook::Props::Boolean, default: false
14
+ prop :blank_selection
15
+ prop :dark, type: Playbook::Props::Boolean, default: false
16
16
  prop :disabled, type: Playbook::Props::Boolean, default: false
17
+ prop :error
18
+ prop :include_blank
19
+ prop :label
17
20
  prop :multiple, type: Playbook::Props::Boolean, default: false
18
21
  prop :name
19
22
  prop :onchange
20
- prop :include_blank
21
- prop :blank_selection
22
23
  prop :options, type: Playbook::Props::HashArray, required: false, default: []
23
- prop :dark, type: Playbook::Props::Boolean, default: false
24
+ prop :required, type: Playbook::Props::Boolean, default: false
24
25
 
25
26
  def classname
26
- generate_classname("pb_select", dark_class)
27
+ generate_classname("pb_select", dark_class) + error_class
27
28
  end
28
29
 
29
30
  def options_to_array
30
31
  options.map { |option| [option[:value_text] || option[:value], option[:value]] }
31
32
  end
32
33
 
33
-
34
34
  def selected
35
35
  selections = options.map { |option| option[:value] if option[:selected] == true }.compact
36
36
  if selections.empty?
@@ -49,12 +49,15 @@ module Playbook
49
49
  end
50
50
  end
51
51
 
52
- private
52
+ private
53
53
 
54
- def dark_class
55
- dark ? "dark" : nil
56
- end
54
+ def error_class
55
+ error ? " error" : ""
56
+ end
57
57
 
58
+ def dark_class
59
+ dark ? "dark" : nil
60
+ end
58
61
  end
59
62
  end
60
63
  end
@@ -6,7 +6,10 @@
6
6
  <%= content_tag(:div,
7
7
  class: "text_input_wrapper") do %>
8
8
  <% if object.children.present? %>
9
- <% capture(&object.children) %>
9
+ <%= capture(&object.children) %>
10
+ <% if object.error %>
11
+ <%= pb_rails("body", props: {dark: object.dark, status: "negative", text: object.error}) %>
12
+ <% end %>
10
13
  <% else %>
11
14
  <%= tag(:input,
12
15
  id: object.id,
@@ -16,6 +19,9 @@
16
19
  placeholder: object.placeholder,
17
20
  type: object.type,
18
21
  value: object.value) %>
22
+ <% if object.error %>
23
+ <%= pb_rails("body", props: {dark: object.dark, status: "negative", text: object.error}) %>
24
+ <% end %>
19
25
  <% end %>
20
26
  <% end %>
21
27
  <% end %>
@@ -1,23 +1,28 @@
1
1
  /* @flow */
2
2
  import React from 'react'
3
3
  import classnames from 'classnames'
4
- import { Caption } from '../'
4
+ import {
5
+ Body,
6
+ Caption,
7
+ } from '../'
5
8
 
6
9
  type TextInputProps = {
7
- className: string,
10
+ className: String,
8
11
  dark: boolean,
9
- name: string,
10
- label: string,
11
- onChange: (string) => void,
12
- placeholder: string,
13
- type: string,
14
- value: string | number,
12
+ error?: String,
13
+ name: String,
14
+ label: String,
15
+ onChange: (String) => void,
16
+ placeholder: String,
17
+ type: String,
18
+ value: String | number,
15
19
  children: Node,
16
20
  }
17
21
 
18
22
  const TextInput = ({
19
23
  className,
20
- dark,
24
+ dark = false,
25
+ error,
21
26
  name,
22
27
  label,
23
28
  onChange = () => {},
@@ -29,6 +34,7 @@ const TextInput = ({
29
34
  const css = classnames([
30
35
  `pb_text_input_kit${dark === true ? '_dark' : ''}`,
31
36
  className,
37
+ error ? 'error' : null,
32
38
  ])
33
39
 
34
40
  return (
@@ -50,6 +56,13 @@ const TextInput = ({
50
56
  type={type}
51
57
  value={value}
52
58
  />
59
+ <If condition={error}>
60
+ <Body
61
+ dark={dark}
62
+ status="negative"
63
+ text={error}
64
+ />
65
+ </If>
53
66
  </If>
54
67
  </div>
55
68
  </div>
@@ -42,5 +42,24 @@
42
42
  @include pb_textarea_focus_dark;
43
43
  }
44
44
  }
45
+
46
+ &.error {
47
+ .text_input_wrapper {
48
+ > input:first-child {
49
+ border-color: $error_dark;
50
+ }
51
+ }
52
+ }
53
+ }
54
+
55
+ &.error {
56
+ .text_input_wrapper {
57
+ [class*=pb_body_kit] {
58
+ margin-top: $space_xs / 2;
59
+ }
60
+ > input:first-child {
61
+ border-color: $error;
62
+ }
63
+ }
45
64
  }
46
65
  }
@@ -0,0 +1,14 @@
1
+ <%= pb_rails("text_input", props: {
2
+ dark: true,
3
+ error: "Please enter a valid email address",
4
+ label: "Email Address",
5
+ type: "email",
6
+ placeholder: "Enter email address"
7
+ }) %>
8
+
9
+ <%= pb_rails("text_input", props: {
10
+ dark: true,
11
+ label: "Confirm Email Address",
12
+ type: "email",
13
+ placeholder: "Confirm email address"
14
+ }) %>
@@ -0,0 +1,18 @@
1
+ import React from 'react'
2
+ import {
3
+ TextInput,
4
+ } from '../..'
5
+
6
+ const TextInputDarkError = () => (
7
+ <div>
8
+ <TextInput
9
+ dark
10
+ error="Please enter a valid email address"
11
+ label="Email Address"
12
+ placeholder="Enter email address"
13
+ type="email"
14
+ />
15
+ </div>
16
+ )
17
+
18
+ export default TextInputDarkError
@@ -0,0 +1,2 @@
1
+ <%= pb_rails("text_input", props: { error: "Please enter a valid email address", label: "Email Address", type: "email", placeholder: "Enter email address" }) %>
2
+ <%= pb_rails("text_input", props: { label: "Confirm Email Address", type: "email", placeholder: "Confirm email address" }) %>
@@ -0,0 +1,17 @@
1
+ import React from 'react'
2
+ import {
3
+ TextInput,
4
+ } from '../..'
5
+
6
+ const TextInputError = () => (
7
+ <div>
8
+ <TextInput
9
+ error="Please enter a valid email address"
10
+ label="Email Address"
11
+ placeholder="Enter email address"
12
+ type="email"
13
+ />
14
+ </div>
15
+ )
16
+
17
+ export default TextInputError
@@ -2,9 +2,13 @@ examples:
2
2
  rails:
3
3
  - text_input_default: Default
4
4
  - text_input_dark: Dark
5
+ - text_input_error: With Error
6
+ - text_input_dark_error: Dark With Error
5
7
  - text_input_custom: Custom
6
8
  react:
7
9
  - text_input_default: Default
8
10
  - text_input_dark: Dark
11
+ - text_input_error: With Error
12
+ - text_input_dark_error: Dark With Error
9
13
  - text_input_custom: Custom
10
14
 
@@ -1,3 +1,5 @@
1
1
  export { default as TextInputDefault } from './_text_input_default.jsx'
2
2
  export { default as TextInputDark } from './_text_input_dark.jsx'
3
+ export { default as TextInputDarkError } from './_text_input_dark_error.jsx'
3
4
  export { default as TextInputCustom } from './_text_input_custom.jsx'
5
+ export { default as TextInputError } from './_text_input_error.jsx'
@@ -9,17 +9,26 @@ module Playbook
9
9
 
10
10
  prop :dark, type: Playbook::Props::Boolean,
11
11
  default: false
12
+ prop :disabled, type: Playbook::Props::Boolean,
13
+ default: false
14
+ prop :error
12
15
  prop :label
13
16
  prop :name
14
17
  prop :placeholder
15
- prop :value
18
+ prop :required, type: Playbook::Props::Boolean,
19
+ default: false
16
20
  prop :type, default: "text"
21
+ prop :value
17
22
 
18
23
  def classname
19
- generate_classname("pb_text_input_kit", dark_class)
24
+ generate_classname("pb_text_input_kit", dark_class) + error_class
20
25
  end
21
26
 
22
- private
27
+ private
28
+
29
+ def error_class
30
+ error ? " error" : ""
31
+ end
23
32
 
24
33
  def dark_class
25
34
  dark ? "dark" : nil
@@ -7,6 +7,9 @@
7
7
  <% end %>
8
8
  <% if object.children %>
9
9
  <%= capture(&object.children) %>
10
+ <% if object.error %>
11
+ <%= pb_rails("body", props: {dark: object.dark, status: "negative", text: object.error}) %>
12
+ <% end %>
10
13
  <% else %>
11
14
  <%= text_area(
12
15
  :object,
@@ -16,5 +19,8 @@
16
19
  :placeholder => object.placeholder,
17
20
  :rows => object.rows,
18
21
  :value => object.value )%>
22
+ <% if object.error %>
23
+ <%= pb_rails("body", props: {dark: object.dark, status: "negative", text: object.error}) %>
24
+ <% end %>
19
25
  <% end %>
20
26
  <% end %>
@@ -2,13 +2,14 @@
2
2
 
3
3
  import React from 'react'
4
4
  import classnames from 'classnames'
5
- import { Caption } from '../'
5
+ import { Body, Caption } from '../'
6
6
  import { type InputCallback } from '../types.js'
7
7
 
8
8
  type TextareaProps = {
9
9
  className?: String,
10
10
  children?: Array<React.ReactChild>,
11
11
  data?: String,
12
+ error?: String,
12
13
  id?: String,
13
14
  object?: String,
14
15
  method?: String,
@@ -24,18 +25,20 @@ type TextareaProps = {
24
25
  const Textarea = ({
25
26
  className,
26
27
  children,
28
+ dark = false,
29
+ error,
27
30
  label,
31
+ name,
28
32
  onChange = () => {},
29
33
  placeholder,
30
- value,
31
- dark = false,
32
34
  rows = 4,
33
- name,
35
+ value,
34
36
  }: TextareaProps) => {
35
37
  const textareaClass = `pb_textarea_kit${dark ? '_dark' : ''}`
38
+ const errorClass = error ? 'error' : null
36
39
 
37
40
  return (
38
- <div className={classnames(textareaClass, className)}>
41
+ <div className={classnames(textareaClass, className, errorClass)}>
39
42
  <Caption
40
43
  dark={dark}
41
44
  text={label}
@@ -51,6 +54,13 @@ const Textarea = ({
51
54
  rows={rows}
52
55
  value={value}
53
56
  />
57
+ <If condition={error}>
58
+ <Body
59
+ dark={dark}
60
+ status="negative"
61
+ text={error}
62
+ />
63
+ </If>
54
64
  </If>
55
65
  </div>
56
66
  )