playbook_ui 12.24.0.pre.alpha.railsmultilevelimprovements749 → 12.24.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6fe605ba32fd5f0d1b3a69fa8dc0459b1f15336526f1f615bcd35b271adcdaf
4
- data.tar.gz: 696f4ef6e81087809a81f79a4c04a9a719eeac93b00c27365d365c151da9c37c
3
+ metadata.gz: f27b3e255fc8158201600b6221f2091e84ceb753c83d6d28a045ca256729ec05
4
+ data.tar.gz: d2af8d464afa9225d3a3647dc83c2a241f208849978b39312d49f45b74415937
5
5
  SHA512:
6
- metadata.gz: 1d402c24afb0d5c5d45131ab241dd8b3fc3906c4e79f0fd7d00337ab2299456676e2c892b31b11fe186cc3beaee8e5124061f6fbe18d76405dafc5722bdfbaea
7
- data.tar.gz: 0b94788ff8de309a8b6e2649523ceef0ef17b0bdda8c691425fccf18d30bec309cdc1d062d37266227962dc5c2448a046b8c7dd373649152c877e26f6764493d
6
+ metadata.gz: '018df9baaa8a9b1bc628873a71a2c1a5dde29e228be173511078a8f934cab375c7992f7bdd1b8e50523d401bd3554fb5f491f2fe98daf811c27e88c5ed6534a4'
7
+ data.tar.gz: 30cf511832a2ce5021ed6658e76f89c5ecacd040538b67e169e41071eb6451969cc8e0fe71a6855e8a413ae1465837fd122ba26baa07a49788031c21e2c00744
@@ -0,0 +1,311 @@
1
+ <% if !local_prop_data.present? %>
2
+ <div data-action="toggle" data-togglable="prop_example" class="pb--propsTable">
3
+ <%= pb_rails("title", props: { text: "Available Props", size: 3, margin_bottom: "sm" }) %>
4
+ <%= pb_rails("card", props: { padding: "none" }) do %>
5
+ <%= pb_rails("card/card_body", props: { padding: "sm" }) do %>
6
+ <%= pb_rails("nav", props: { orientation: "horizontal", variant: "subtle" }) do %>
7
+ <%= pb_rails("nav/item", props: { text: "Global Props", link: "#", active: true }) %>
8
+ <% end %>
9
+ <% end %>
10
+ <%= pb_rails("section_separator") %>
11
+ <%= pb_rails("card/card_body", props: {}) do %>
12
+ <%= pb_rails("table", props: {container: false, disable_hover: true }) do %>
13
+ <thead>
14
+ <tr>
15
+ <th>Props</th>
16
+ <th>Type</th>
17
+ <th>Values</th>
18
+ </tr>
19
+ </thead>
20
+ <tbody>
21
+ <% global_prop_data.each do |key, value|%>
22
+ <tr>
23
+ <td>
24
+ <%= pb_rails("title", props: { text: key, tag: "h4", size: 4 }) %>
25
+ </td>
26
+ <td>
27
+ <%= pb_rails("card", props: {
28
+ classname: "card",
29
+ padding: "xxs",
30
+ background: "light",
31
+ border_none: true,
32
+ border_radius: "sm"
33
+ }) do %>
34
+ <%= pb_rails("body", props: {
35
+ classname: "kearning"
36
+ }) do %>
37
+ <% if key =~ /^padding|^margin/ %>
38
+ <%= "array" %>
39
+ <% else %>
40
+ <%= value[:type].to_s.downcase %>
41
+ <% end %>
42
+ <% end %>
43
+ <% end %>
44
+ </td>
45
+ <td>
46
+ <% if key =~ /^padding|^margin/ %>
47
+ <% padding_margin_values.each do |item| %>
48
+ <%= pb_rails("card", props: {
49
+ flex_direction: "row",
50
+ classname: "card",
51
+ padding: "xxs",
52
+ background: "light",
53
+ border_none: true,
54
+ border_radius: "sm",
55
+ margin: "xxs"
56
+ }) do %>
57
+ <%= pb_rails("body", props: {
58
+ classname: "kearning"
59
+ }) do %>
60
+ <%= item %>
61
+ <% end %>
62
+ <% end %>
63
+ <% end %>
64
+ <% else %>
65
+ <% if value[:values].present? %>
66
+ <% value[:values].each do |item| %>
67
+ <% if item != nil %>
68
+ <%= pb_rails("card", props: {
69
+ flex_direction: "row",
70
+ classname: "card",
71
+ padding: "xxs",
72
+ background: "light",
73
+ border_none: true,
74
+ border_radius: "sm",
75
+ margin: "xxs"
76
+ }) do %>
77
+ <%= pb_rails("body", props: {
78
+ classname: "kearning"
79
+ }) do %>
80
+ <%= item %>
81
+ <% end %>
82
+ <% end %>
83
+ <% end %>
84
+ <% end %>
85
+ <% end %>
86
+ <% end %>
87
+ </td>
88
+ </tr>
89
+ <% end %>
90
+ </tbody>
91
+ <% end %>
92
+ <% end %>
93
+ <% end %>
94
+ </div>
95
+ <% else %>
96
+ <div data-action="toggle" data-togglable="prop_example" class="pb--propsTable">
97
+ <%= pb_rails("title", props: { text: "Available Props", size: 3, margin_bottom: "sm" }) %>
98
+ <%= pb_rails("card", props: { padding: "none" }) do %>
99
+ <%= pb_rails("card/card_body", props: { padding: "sm" }) do %>
100
+ <%= pb_rails("nav", props: { orientation: "horizontal", variant: "subtle" }) do %>
101
+ <% if local_prop_data.present? %>
102
+ <%= pb_rails("nav/item", props: { text: "Kit Props", link: "#", active: true, id: "local-button-active", classname: "local-active" }) %>
103
+ <% end %>
104
+ <% if local_prop_data.present? %>
105
+ <%= pb_rails("nav/item", props: { text: "Kit Props", link: "#", id: "local-button", classname: "global-active" }) %>
106
+ <% end %>
107
+ <%= pb_rails("nav/item", props: { text: "Global Props", link: "#", active: true, id: "global-button-active", classname: "global-active" }) %>
108
+ <%= pb_rails("nav/item", props: { text: "Global Props", link: "#", id: "global-button", classname: "local-active" }) %>
109
+ <% end %>
110
+ <% end %>
111
+ <%= pb_rails("section_separator") %>
112
+ <%= pb_rails("card/card_body", props: {}) do %>
113
+ <%= pb_rails("table", props: {container: false, disable_hover: true, id: "global-prop-table", classname: "global-active"}) do %>
114
+ <thead>
115
+ <tr>
116
+ <th>Props</th>
117
+ <th>Type</th>
118
+ <th>Values</th>
119
+ </tr>
120
+ </thead>
121
+ <tbody>
122
+ <% global_prop_data.each do |key, value|%>
123
+ <tr>
124
+ <td>
125
+ <%= pb_rails("title", props: { text: key, tag: "h4", size: 4 }) %>
126
+ </td>
127
+ <td>
128
+ <%= pb_rails("card", props: {
129
+ classname: "card",
130
+ padding: "xxs",
131
+ background: "light",
132
+ border_none: true,
133
+ border_radius: "sm"
134
+ }) do %>
135
+ <%= pb_rails("body", props: {
136
+ classname: "kearning"
137
+ }) do %>
138
+ <% if key =~ /^padding|^margin/ %>
139
+ <%= "array" %>
140
+ <% else %>
141
+ <%= value[:type].to_s.downcase %>
142
+ <% end %>
143
+ <% end %>
144
+ <% end %>
145
+ </td>
146
+ <td>
147
+ <% if key =~ /^padding|^margin/ %>
148
+ <% padding_margin_values.each do |item| %>
149
+ <%= pb_rails("card", props: {
150
+ flex_direction: "row",
151
+ classname: "card",
152
+ padding: "xxs",
153
+ background: "light",
154
+ border_none: true,
155
+ border_radius: "sm",
156
+ margin: "xxs"
157
+ }) do %>
158
+ <%= pb_rails("body", props: {
159
+ classname: "kearning"
160
+ }) do %>
161
+ <%= item %>
162
+ <% end %>
163
+ <% end %>
164
+ <% end %>
165
+ <% else %>
166
+ <% if value[:values].present? %>
167
+ <% value[:values].each do |item| %>
168
+ <% if item != nil %>
169
+ <%= pb_rails("card", props: {
170
+ flex_direction: "row",
171
+ classname: "card",
172
+ padding: "xxs",
173
+ background: "light",
174
+ border_none: true,
175
+ border_radius: "sm",
176
+ margin: "xxs"
177
+ }) do %>
178
+ <%= pb_rails("body", props: {
179
+ classname: "kearning"
180
+ }) do %>
181
+ <%= item %>
182
+ <% end %>
183
+ <% end %>
184
+ <% end %>
185
+ <% end %>
186
+ <% end %>
187
+ <% end %>
188
+ </td>
189
+ </tr>
190
+ <% end %>
191
+ </tbody>
192
+ <% end %>
193
+ <%= pb_rails("table", props: {container: false, disable_hover: true, id: "local-prop-table", classname: "local-active"}) do %>
194
+ <thead>
195
+ <tr>
196
+ <th>Props</th>
197
+ <th>Type</th>
198
+ <th>Values</th>
199
+ <th>Default</th>
200
+ </tr>
201
+ </thead>
202
+ <tbody>
203
+ <% local_prop_data.each do |key, value|%>
204
+ <tr>
205
+ <td>
206
+ <%= pb_rails("title", props: { text: key, tag: "h4", size: 4 }) %>
207
+ </td>
208
+ <td>
209
+ <%= pb_rails("card", props: {
210
+ classname: "card",
211
+ padding: "xxs",
212
+ background: "light",
213
+ border_none: true,
214
+ border_radius: "sm"
215
+ }) do %>
216
+ <%= pb_rails("body", props: {
217
+ classname: "kearning"
218
+ }) do %>
219
+ <%= value[:type].downcase %>
220
+ <% end %>
221
+ <% end %>
222
+ </td>
223
+ <td>
224
+ <% if value[:values].present? %>
225
+ <% value[:values].each do |item| %>
226
+ <% if item != nil %>
227
+ <%= pb_rails("card", props: {
228
+ flex_direction: "row",
229
+ classname: "card",
230
+ padding: "xxs",
231
+ background: "light",
232
+ border_none: true,
233
+ border_radius: "sm",
234
+ margin: "xxs"
235
+ }) do %>
236
+ <%= pb_rails("body", props: {
237
+ classname: "kearning"
238
+ }) do %>
239
+ <%= item %>
240
+ <% end %>
241
+ <% end %>
242
+ <% end %>
243
+ <% end %>
244
+ <% end %>
245
+ </td>
246
+ <td>
247
+ <% if value[:default].present? || value[:default].is_a?(TrueClass) || value[:default].is_a?(FalseClass) %>
248
+ <%= pb_rails("card", props: {
249
+ classname: "card",
250
+ padding: "xxs",
251
+ background: "light",
252
+ border_none: true,
253
+ border_radius: "sm"
254
+ }) do %>
255
+ <%= pb_rails("body", props: {
256
+ classname: "kearning"
257
+ }) do %>
258
+ <%= value[:default] %>
259
+ <% end %>
260
+ <% end %>
261
+ <% end %>
262
+ </td>
263
+ </tr>
264
+ <% end %>
265
+ </tbody>
266
+ <% end %>
267
+ <% end %>
268
+ <% end %>
269
+ </div>
270
+ <% end %>
271
+
272
+ <script>
273
+
274
+ const globalNavAndTable = document.querySelectorAll('.global-active');
275
+ const localNavAndTable = document.querySelectorAll('.local-active');
276
+
277
+ globalNavAndTable.forEach(element => {
278
+ element.style.display = 'none';
279
+ });
280
+
281
+ const globalButton = document.getElementById("global-button");
282
+ if (globalButton) {
283
+ globalButton.addEventListener("click", showGlobal);
284
+ }
285
+
286
+ const localButton = document.getElementById("local-button");
287
+ if (localButton) {
288
+ localButton.addEventListener("click", showLocal);
289
+ }
290
+
291
+ function showGlobal() {
292
+ localNavAndTable.forEach(element => {
293
+ element.style.display = 'none';
294
+ });
295
+
296
+ globalNavAndTable.forEach(element => {
297
+ element.style.display = 'table';
298
+ });
299
+ }
300
+
301
+ function showLocal() {
302
+ localNavAndTable.forEach(element => {
303
+ element.style.display = 'table';
304
+ });
305
+
306
+ globalNavAndTable.forEach(element => {
307
+ element.style.display = 'none';
308
+ });
309
+ }
310
+
311
+ </script>
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDocs
5
+ class KitApi < Playbook::KitBase
6
+ prop :kit, type: Playbook::Props::String, required: true
7
+
8
+ def kit_local_props
9
+ local = []
10
+ kit_props.each do |key, value|
11
+ value.kit != Playbook::KitBase && local.push({ key: key, value: value })
12
+ end
13
+ local
14
+ end
15
+
16
+ def padding_margin_values
17
+ %w[none xxs xs sm md lg xl]
18
+ end
19
+
20
+ def local_prop_data
21
+ local_props = {}
22
+
23
+ kit_local_props.each do |key, _value|
24
+ name = key[:value].instance_variable_get(:@name)
25
+ type = key[:value].class.to_s.split("::").last
26
+ default = key[:value].instance_variable_get(:@default)
27
+ values = key[:value].instance_variable_get(:@values)
28
+ local_props[name.to_sym] = { "type": type, "default": default, "values": values }
29
+ end
30
+ local_props
31
+ end
32
+
33
+ def kit_global_props
34
+ global_props = {}
35
+ global_prop_names = []
36
+ global_prop_values = {}
37
+ global_props_with_values = {}
38
+ global_props_without_values = []
39
+ parent_child_object = {}
40
+ updated_global_props_with_values = {}
41
+
42
+ # extracts the modules from kit_base.rb, which is where we import all the global props that we inject into every rails kit
43
+ pb_module = Playbook::KitBase.included_modules.select { |mod| mod.to_s.include?("Playbook::") }
44
+
45
+ # loops through the kits and extracts each prop with its values and pushes that to the global_props hash
46
+ kit_props.each do |key, value|
47
+ value.kit == Playbook::KitBase && global_props[key.to_sym] = value
48
+ end
49
+
50
+ # loops through the global_props and extracts the name of each prop and pushes that to global_prop_names array
51
+ global_props.each do |name, _values|
52
+ global_prop_names.push(name)
53
+ end
54
+
55
+ # Loops through each module in pb_module and searches for methods that end in _values, as these methods hold the values for each prop
56
+ # we then save the values and type and push that to the values hash as a key value pair
57
+ pb_module.each do |mod|
58
+ mod.instance_methods.each do |method_name|
59
+ next unless method_name.to_s.end_with?("_values")
60
+
61
+ value = send(method_name)
62
+ type = value.class
63
+ global_prop_values[method_name.to_s.chomp("_values").to_sym] = { "type": type, "values": value }
64
+ end
65
+ end
66
+
67
+ # loops through the global_prop_names array
68
+ # then loops through the global_prop_values hash and extracts the values that have the same name found in global_prop_names
69
+ # this loop helps ensure only global props values are actually extracted, as there could be other methods that end in _values in the modules we are iterating over
70
+ # these verified global props with values are then pushed to the global_props_with_values hash
71
+ global_prop_names.each do |name, _prop|
72
+ global_prop_values.each do |key, value|
73
+ global_props_with_values[key] = value if key == name
74
+ end
75
+ end
76
+
77
+ # now we grab all the global_prop_names that do not have a matching key in global_prop_values.
78
+ # This gives us any global prop that did not have any predefined value. like classname and dark
79
+ global_props_without_values = global_prop_names - global_prop_values.keys
80
+
81
+ # Loops through each module in pb_module and searches for methods that end in _options, as these methods hold all the props in the module
82
+ # save the prop names prop values and and parent module name to parent_child_object hash
83
+ # this is a comprehensive list of all parent module and children props for edge cases like spacing.rb, that is not named after the props it represents
84
+ pb_module.each do |mod|
85
+ mod.instance_methods.each do |method_name|
86
+ next unless method_name.to_s.end_with?("_options")
87
+
88
+ props = send(method_name)
89
+ parent = mod.to_s.split("::").last
90
+ values = send("#{parent.underscore}_values")
91
+ parent_child_object[parent] = { "props": props, "values": values }
92
+ end
93
+ end
94
+
95
+ # loops through each object in parent_child_object and extracts its children (props and values)
96
+ # loops through each child and extracts the individual props
97
+ # Checks if the props match any of the props in global_props_without_values
98
+ # if it does, then we push that prop to global_props_with_values hash
99
+ # This extracts the props in the spacing.rb file and any file that is not named after the props it represents
100
+ parent_child_object.each do |_parent, children|
101
+ children.each do |_child, props|
102
+ props.each do |prop, _value|
103
+ type = children[:values].class
104
+ values = children[:values]
105
+ global_props_with_values[prop] = { "type": type, "values": values } if global_props_without_values.include?(prop)
106
+ end
107
+ end
108
+ end
109
+
110
+ # loop through the global_props hash and the global_props_with_values hash.
111
+ # extract the props from global_props that are not found in global_props_with_values into updated_global_props_with_values
112
+ # This is the last piece that grabs the global props that did not have values at all, like classname and dark, and adds it to our hash
113
+ global_props.each do |prop, value|
114
+ unless global_props_with_values.include?(prop)
115
+ type = value.class.to_s.split("::").last
116
+ updated_global_props_with_values[prop] = { "type": type }
117
+ end
118
+ end
119
+
120
+ # Merge updated_global_props_with_values into global_props_with_values
121
+ # global_props_with_values will now hold all the global props thier values and type
122
+ global_props_with_values.merge!(updated_global_props_with_values)
123
+
124
+ global_props_with_values
125
+ end
126
+
127
+ def global_prop_data
128
+ global_props = {}
129
+
130
+ kit_global_props.each do |key, value|
131
+ type = value[:type]
132
+ values = value[:values]
133
+ global_props[key] = { "type": type, "values": values }
134
+ end
135
+ global_props
136
+ end
137
+
138
+ def kit_props
139
+ kit_class.props
140
+ end
141
+
142
+ private
143
+
144
+ def kit_class
145
+ @kit_class ||= Playbook::KitResolver.resolve(kit.to_s)
146
+ end
147
+ end
148
+ end
149
+ end
@@ -5,6 +5,8 @@
5
5
  module Playbook
6
6
  module PbDocs
7
7
  class KitExample < Playbook::KitBase
8
+ include Playbook::Markdown::Helper
9
+
8
10
  prop :kit, type: Playbook::Props::String, required: true
9
11
  prop :example_title, type: Playbook::Props::String, required: true
10
12
  prop :example_key, type: Playbook::Props::String, required: true
@@ -10,7 +10,6 @@ type MultiLevelSelectProps = {
10
10
  className?: string;
11
11
  data?: { [key: string]: string };
12
12
  id?: string;
13
- name?: string;
14
13
  returnAllSelected?: boolean;
15
14
  treeData?: { [key: string]: string }[];
16
15
  onSelect?: (prop: { [key: string]: any }) => void;
@@ -22,7 +21,6 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
22
21
  className,
23
22
  data = {},
24
23
  id,
25
- name,
26
24
  returnAllSelected = false,
27
25
  treeData,
28
26
  onSelect = () => {},
@@ -79,14 +77,6 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
79
77
  setFormattedData(updatedData);
80
78
  };
81
79
 
82
- const updateHiddenInputValue = (value: any) => {
83
- const hiddenInput = document.querySelector('input#'+id) as HTMLInputElement;
84
- if (hiddenInput) {
85
- hiddenInput.value = JSON.stringify(value);
86
- }
87
- };
88
-
89
-
90
80
  useEffect(() => {
91
81
  if (returnAllSelected) {
92
82
  const selected = selectedItems.filter(
@@ -105,7 +95,6 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
105
95
  if (el) {
106
96
  el.setAttribute("data-tree", JSON.stringify(checkedData));
107
97
  }
108
- updateHiddenInputValue(checkedData);
109
98
  if (returnAllSelected) {
110
99
  onSelect(checkedData);
111
100
  }
@@ -132,8 +121,6 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
132
121
 
133
122
  return (
134
123
  <div {...ariaProps} {...dataProps} className={classes} id={id}>
135
-
136
- <input type="hidden" id={id} name={name} value="" />
137
124
  {returnAllSelected ? (
138
125
  <MultiSelectHelper
139
126
  treeData={formattedData}
@@ -64,9 +64,9 @@
64
64
  }] %>
65
65
 
66
66
 
67
- <%= pb_rails("multi_level_select", props: {
68
- id: "default-multi-level-select",
69
- tree_data:treeData
70
- }) %>
67
+ <%= pb_rails("multi_level_select", props: {
68
+ id: "default-multi-level-select",
69
+ tree_data:treeData
70
+ }) %>
71
71
 
72
72
 
@@ -2,7 +2,6 @@ examples:
2
2
  rails:
3
3
  - multi_level_select_default: Default
4
4
  - multi_level_select_return_all_selected: Return All Selected
5
- - multi_level_select_with_form: With Form
6
5
 
7
6
  react:
8
7
  - multi_level_select_default: Default
@@ -3,8 +3,6 @@
3
3
  module Playbook
4
4
  module PbMultiLevelSelect
5
5
  class MultiLevelSelect < Playbook::KitBase
6
- prop :id
7
- prop :name
8
6
  prop :tree_data, type: Playbook::Props::Array,
9
7
  default: []
10
8
  prop :return_all_selected, type: Playbook::Props::Boolean,
@@ -17,7 +15,6 @@ module Playbook
17
15
  def multi_level_select_options
18
16
  {
19
17
  id: id,
20
- name: name,
21
18
  treeData: tree_data,
22
19
  returnAllSelected: return_all_selected,
23
20
  }
@@ -10,7 +10,6 @@ module Playbook
10
10
  require_relative "builder/form_field_builder"
11
11
  require_relative "builder/select_field"
12
12
  require_relative "builder/typeahead_field"
13
- require_relative "builder/multi_level_select_field"
14
13
 
15
14
  prepend(FormFieldBuilder.new(:email_field, kit_name: "text_input"))
16
15
  prepend(FormFieldBuilder.new(:number_field, kit_name: "text_input"))