playbook_ui 13.7.0 → 13.8.0.pre.alpha.PLAY962SingleSelect1246

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_currency/_currency.scss +35 -15
  3. data/app/pb_kits/playbook/pb_currency/_currency.tsx +44 -42
  4. data/app/pb_kits/playbook/pb_currency/currency.html.erb +11 -5
  5. data/app/pb_kits/playbook/pb_currency/currency.rb +10 -2
  6. data/app/pb_kits/playbook/pb_currency/docs/_currency_unstyled.html.erb +14 -0
  7. data/app/pb_kits/playbook/pb_currency/docs/_currency_unstyled.jsx +30 -0
  8. data/app/pb_kits/playbook/pb_currency/docs/_currency_unstyled.md +1 -0
  9. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.html.erb +2 -1
  10. data/app/pb_kits/playbook/pb_currency/docs/example.yml +2 -0
  11. data/app/pb_kits/playbook/pb_currency/docs/index.js +1 -0
  12. data/app/pb_kits/playbook/pb_multi_level_select/_helper_functions.tsx +27 -22
  13. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +2 -1
  14. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +234 -109
  15. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +6 -7
  16. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.jsx +1 -1
  17. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +73 -0
  18. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +87 -0
  19. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +3 -2
  20. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +2 -1
  21. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +7 -0
  22. data/app/pb_kits/playbook/pb_nav/_item.tsx +12 -9
  23. data/app/pb_kits/playbook/pb_nav/_nav_item.test.js +23 -1
  24. data/app/pb_kits/playbook/pb_nav/_subtle_mixin.scss +6 -0
  25. data/app/pb_kits/playbook/pb_nav/_vertical_nav.scss +3 -0
  26. data/app/pb_kits/playbook/pb_nav/item.rb +7 -2
  27. data/app/pb_kits/playbook/pb_table/styles/_table_header.scss +9 -9
  28. data/app/pb_kits/playbook/pb_table/table_header.html.erb +10 -2
  29. data/dist/playbook-rails.js +5 -5
  30. data/lib/playbook/version.rb +2 -2
  31. metadata +12 -7
@@ -0,0 +1,87 @@
1
+ import React from "react";
2
+ import MultiLevelSelect from "../_multi_level_select";
3
+
4
+ const treeData = [
5
+ {
6
+ label: "Power Home Remodeling",
7
+ value: "Power Home Remodeling",
8
+ id: "powerhome2",
9
+ expanded: true,
10
+ children: [
11
+ {
12
+ label: "People",
13
+ value: "People",
14
+ id: "people2",
15
+ expanded: true,
16
+ children: [
17
+ {
18
+ label: "Talent Acquisition",
19
+ value: "Talent Acquisition",
20
+ id: "talent2",
21
+ },
22
+ {
23
+ label: "Business Affairs",
24
+ value: "Business Affairs",
25
+ id: "business2",
26
+ children: [
27
+ {
28
+ label: "Initiatives",
29
+ value: "Initiatives",
30
+ id: "initiative2",
31
+ },
32
+ {
33
+ label: "Learning & Development",
34
+ value: "Learning & Development",
35
+ id: "development2",
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ label: "People Experience",
41
+ value: "People Experience",
42
+ id: "experience2",
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ label: "Contact Center",
48
+ value: "Contact Center",
49
+ id: "contact2",
50
+ children: [
51
+ {
52
+ label: "Appointment Management",
53
+ value: "Appointment Management",
54
+ id: "appointment2",
55
+ },
56
+ {
57
+ label: "Customer Service",
58
+ value: "Customer Service",
59
+ id: "customer2",
60
+ },
61
+ {
62
+ label: "Energy",
63
+ value: "Energy",
64
+ id: "energy2",
65
+ },
66
+ ],
67
+ },
68
+ ],
69
+ },
70
+ ];
71
+
72
+ const MultiLevelSelectSingle = (props) => {
73
+ return (
74
+ <div>
75
+ <MultiLevelSelect
76
+ id="multiselect-single"
77
+ inputName="Power"
78
+ onSelect={(selectedNode) => console.log("Selected Node", selectedNode)}
79
+ treeData={treeData}
80
+ variant="single"
81
+ {...props}
82
+ />
83
+ </div>
84
+ )
85
+ };
86
+
87
+ export default MultiLevelSelectSingle;
@@ -1,12 +1,13 @@
1
1
  examples:
2
2
  rails:
3
3
  - multi_level_select_default: Default
4
+ - multi_level_select_single: Single Select
4
5
  - multi_level_select_return_all_selected: Return All Selected
5
6
  - multi_level_select_selected_ids: Selected Ids
6
7
  - multi_level_select_with_form: With Form
7
-
8
+
8
9
  react:
9
10
  - multi_level_select_default: Default
11
+ - multi_level_select_single: Single Select
10
12
  - multi_level_select_return_all_selected: Return All Selected
11
13
  - multi_level_select_selected_ids: Selected Ids
12
-
@@ -1,3 +1,4 @@
1
1
  export { default as MultiLevelSelectDefault } from './_multi_level_select_default.jsx'
2
+ export { default as MultiLevelSelectSingle } from './_multi_level_select_single.jsx'
2
3
  export { default as MultiLevelSelectReturnAllSelected } from './_multi_level_select_return_all_selected.jsx'
3
- export { default as MultiLevelSelectSelectedIds } from "./_multi_level_select_selected_ids.jsx"
4
+ export { default as MultiLevelSelectSelectedIds } from "./_multi_level_select_selected_ids.jsx"
@@ -14,6 +14,11 @@ module Playbook
14
14
  prop :input_display, type: Playbook::Props::Enum,
15
15
  values: %w[pills none],
16
16
  default: "pills"
17
+ prop :input_name, type: Playbook::Props::String,
18
+ default: ""
19
+ prop :variant, type: Playbook::Props::Enum,
20
+ values: %w[multi single],
21
+ default: "multi"
17
22
 
18
23
  def classname
19
24
  generate_classname("pb_multi_level_select")
@@ -27,6 +32,8 @@ module Playbook
27
32
  treeData: tree_data,
28
33
  returnAllSelected: return_all_selected,
29
34
  selectedIds: selected_ids,
35
+ input_name: input_name,
36
+ variant: variant,
30
37
  }
31
38
  end
32
39
  end
@@ -12,6 +12,7 @@ import { Spacing } from "../types";
12
12
 
13
13
  type NavItemProps = {
14
14
  active?: boolean;
15
+ highlighted_border?: boolean;
15
16
  aria?: { [key: string]: string };
16
17
  fontWeight?: "regular" | "bold" | "bolder";
17
18
  children?: React.ReactNode[] | React.ReactNode;
@@ -44,7 +45,7 @@ type NavItemProps = {
44
45
  } & GlobalProps;
45
46
 
46
47
  const NavItem = (props: NavItemProps) => {
47
-
48
+
48
49
  const fontWeightDefault = (orientation: string, variant: string) => {
49
50
  return orientation === "horizontal" && variant === "subtle"
50
51
  ? "regular"
@@ -55,6 +56,7 @@ const NavItem = (props: NavItemProps) => {
55
56
 
56
57
  const {
57
58
  active = false,
59
+ highlighted_border = true,
58
60
  aria = {},
59
61
  orientation,
60
62
  variant,
@@ -97,7 +99,7 @@ const NavItem = (props: NavItemProps) => {
97
99
  marginY,
98
100
  };
99
101
 
100
- //separate margin props and padding props in itemSpacing object
102
+ //separate margin props and padding props in itemSpacing object
101
103
  const filterItemSpacing = (obj: { [key: string]: string }) => {
102
104
  const filteredPadding: { [key: string]: string } = {};
103
105
  const filteredMargin: { [key: string]: string } = {};
@@ -114,7 +116,7 @@ const filterItemSpacing = (obj: { [key: string]: string }) => {
114
116
  //deconstruct itemSpacing
115
117
  const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
116
118
 
117
- //if itemSpacing has margin props, apply those, if margin global props passed to navItem itself, navItem props take precendence
119
+ //if itemSpacing has margin props, apply those, if margin global props passed to navItem itself, navItem props take precendence
118
120
  const finalItemSpacing = {
119
121
  ...(filteredMargin || {}),
120
122
  ...Object.entries(spacingMarginProps).reduce((acc: any, [prop, value]) => {
@@ -138,19 +140,20 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
138
140
 
139
141
  const Tag = link ? "a" : "div";
140
142
  const activeClass = active === true ? "active" : "";
143
+ const highlightedBorderClass = active === true && highlighted_border === false ? "highlighted_border_none" : "";
141
144
  const collapsibleTrailClass = collapsible && collapsibleTrail ? "collapsible_trail" : "";
142
145
 
143
146
  const fontSizeMapping = {
144
147
  "small": "font_size_small",
145
148
  "normal": "font_size_normal"
146
149
  };
147
-
150
+
148
151
  const fontWeightMapping = {
149
152
  "bold": "font_bold",
150
153
  "bolder": "font_bolder",
151
154
  "regular": "font_regular"
152
155
  };
153
-
156
+
154
157
  const fontSizeClass = fontSizeMapping[fontSize];
155
158
  const fontWeightClass = fontWeightMapping[fontWeight];
156
159
 
@@ -162,9 +165,9 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
162
165
  );
163
166
 
164
167
  const classes = classnames(
165
- buildCss("pb_nav_list_kit_item", activeClass),
168
+ buildCss("pb_nav_list_kit_item", activeClass, highlightedBorderClass),
166
169
  collapsible
167
- ? buildCss("pb_collapsible_nav_item", activeClass)
170
+ ? buildCss("pb_collapsible_nav_item", activeClass, highlightedBorderClass)
168
171
  : "",
169
172
  fontSizeClass,
170
173
  fontWeightClass,
@@ -192,7 +195,7 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
192
195
  return child;
193
196
  });
194
197
 
195
- const collapsibleClasses = buildCss("collapsible_nav_wrapper", activeClass, collapsibleTrailClass)
198
+ const collapsibleClasses = buildCss("collapsible_nav_wrapper", activeClass, highlightedBorderClass, collapsibleTrailClass)
196
199
 
197
200
  return (
198
201
  <>
@@ -207,7 +210,7 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
207
210
  onIconClick={onIconRightClick}
208
211
  onClick={onClick}
209
212
  >
210
- <Collapsible.Main
213
+ <Collapsible.Main
211
214
  className={globalProps({ ...finalItemSpacing })}
212
215
  dark={dark}>
213
216
  <Tag
@@ -6,6 +6,8 @@ import NavItem from './_item'
6
6
 
7
7
  const navTestId = 'nav'
8
8
  const itemTestId = 'item'
9
+ const activeTestBorderlessId = 'activeborderless'
10
+ const activeTestBorderId = 'active'
9
11
  const navClassName = 'custom-class-name-nav'
10
12
  const itemClassName = 'custom-class-name-item'
11
13
  const navTitle = 'Menu'
@@ -35,6 +37,14 @@ const NavDefault = (props) => {
35
37
  />
36
38
  <NavItem
37
39
  active
40
+ data={{ testid: activeTestBorderId }}
41
+ link="#"
42
+ text="Video"
43
+ />
44
+ <NavItem
45
+ active
46
+ data={{ testid: activeTestBorderlessId }}
47
+ highlighted_border={false}
38
48
  link="#"
39
49
  text="Video"
40
50
  />
@@ -70,6 +80,18 @@ test('should render title', () => {
70
80
  expect(kit).toBeInTheDocument()
71
81
  })
72
82
 
83
+ test('should have a left border', () => {
84
+ render(<NavDefault iconRight="angle-down" />)
85
+ const kit = screen.getByTestId(activeTestBorderId)
86
+ expect(kit).toContainHTML('pb_nav_list_kit_item_active')
87
+ })
88
+
89
+ test('should not have a left border', () => {
90
+ render(<NavDefault iconRight="angle-down" />)
91
+ const kit = screen.getByTestId(activeTestBorderlessId)
92
+ expect(kit).toContainHTML('pb_nav_list_kit_item_active_highlighted_border_none')
93
+ })
94
+
73
95
  test('should have a right icon', () => {
74
96
  render(<NavDefault iconRight="angle-down" />)
75
97
  const kit = screen.getByTestId(itemTestId)
@@ -80,4 +102,4 @@ test('should have a left icon', () => {
80
102
  render(<NavDefault iconLeft="users-class" />)
81
103
  const kit = screen.getByTestId(itemTestId)
82
104
  expect(kit).toContainHTML('<i class="pb_icon_kit far fa-fw fa-users-class pb_nav_list_item_icon_left" />')
83
- })
105
+ })
@@ -41,5 +41,11 @@
41
41
  color: $primary;
42
42
  letter-spacing: normal;
43
43
  }
44
+ &[class*="dark"] {
45
+ [class*="_item_text"],
46
+ [class*="_item_icon"] {
47
+ color: $white !important;
48
+ }
49
+ }
44
50
  }
45
51
  }
@@ -22,6 +22,9 @@ $selector: ".pb_nav_list";
22
22
  border-bottom: 1px solid $border_light;
23
23
  &[class*="_active"] {
24
24
  border-left-color: $primary !important;
25
+ &[class*="_highlighted_border_none"] {
26
+ border-left-width: 0px !important;
27
+ }
25
28
  [class*="_item_icon"] {
26
29
  color: $primary !important;
27
30
  }
@@ -10,6 +10,7 @@ module Playbook
10
10
  prop :font_weight, type: Playbook::Props::Enum,
11
11
  values: %w[bold regular bolder],
12
12
  default: "regular"
13
+ prop :highlighted_border, type: Playbook::Props::Boolean, default: true
13
14
  prop :collapsible, type: Playbook::Props::Boolean, default: false
14
15
  prop :link
15
16
  prop :text
@@ -22,9 +23,9 @@ module Playbook
22
23
  default: "_self"
23
24
  def classname
24
25
  if collapsible
25
- "#{generate_classname('pb_nav_list_kit_item', active_class)} #{generate_classname('pb_collapsible_nav_item', active_class, collapsible_trail_class)} #{font_size_class} #{font_weight_class} pb_nav_list_item_link_collapsible"
26
+ "#{generate_classname('pb_nav_list_kit_item', active_class, highlighted_border_class)} #{generate_classname('pb_collapsible_nav_item', active_class, collapsible_trail_class)} #{font_size_class} #{font_weight_class} pb_nav_list_item_link_collapsible"
26
27
  else
27
- "#{generate_classname('pb_nav_list_kit_item', active_class)} #{font_size_class} #{font_weight_class} pb_nav_list_item_link"
28
+ "#{generate_classname('pb_nav_list_kit_item', active_class, highlighted_border_class)} #{font_size_class} #{font_weight_class} pb_nav_list_item_link"
28
29
  end
29
30
  end
30
31
 
@@ -96,6 +97,10 @@ module Playbook
96
97
  active ? "active" : nil
97
98
  end
98
99
 
100
+ def highlighted_border_class
101
+ !highlighted_border && active ? "highlighted_border_none" : nil
102
+ end
103
+
99
104
  def font_weight_class
100
105
  case font_weight
101
106
  when "bold"
@@ -24,6 +24,7 @@ $text_align_values: (
24
24
  .pb_th_link:hover {
25
25
  background-color: rgba($primary, 0.03);
26
26
  color: $primary !important;
27
+ border-radius: $border_radius_md;
27
28
  }
28
29
 
29
30
  .pb_th_link, .pb_th_nolink{
@@ -38,13 +39,12 @@ $text_align_values: (
38
39
  }
39
40
  }
40
41
 
41
- [class*="pb_table_header_dropdown"][class*="_vertical"] {
42
- &[class*="_normal"] {
43
- [class*="pb_nav_list_kit_item"][class*="pb_nav_list_item"] {
44
- &[class*="_link"] {
45
- border-left-width: 0px;
46
- background-color: #fff !important;
47
- }
48
- }
49
- }
42
+ .header_last_item {
43
+ border-bottom-left-radius: $border_radius_md;
44
+ border-bottom-right-radius: $border_radius_md;
45
+ }
46
+
47
+ .header_first_item {
48
+ border-top-left-radius: $border_radius_md;
49
+ border-top-right-radius: $border_radius_md;
50
50
  }
@@ -28,8 +28,16 @@
28
28
  position: object.placement ,
29
29
  padding: 'none'}) do %>
30
30
  <%= pb_rails("nav", props: {classname: "pb_table_header_dropdown"}) do %>
31
- <% object.sort_menu.each do |item| %>
32
- <%= pb_rails("nav/item", props: { text: item[:item], link: item[:link], icon_right: sort_icon(item[:direction], item[:active]), active: item[:active] }) %>
31
+ <% object.sort_menu.each_with_index do |item, index| %>
32
+ <%= pb_rails("nav/item", props: {
33
+ text: item[:item],
34
+ link: item[:link],
35
+ highlighted_border: false,
36
+ padding: "xs",
37
+ icon_right: sort_icon(item[:direction], item[:active]),
38
+ active: item[:active],
39
+ classname: "header_nav_item #{'header_first_item' if index == 0} #{'header_last_item' if index == object.sort_menu.size - 1}"
40
+ }) %>
33
41
  <% end %>
34
42
  <% end %>
35
43
  <% end %>