playbook_ui 13.33.0.pre.alpha.PBNTR405dropdownformfixesrails3311 → 13.33.0.pre.alpha.PLAY1454formpillicons3309
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 +4 -4
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -7
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +1 -1
- data/app/pb_kits/playbook/pb_dropdown/index.js +31 -37
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +4 -0
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.test.jsx +11 -0
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +52 -17
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_icon.html.erb +5 -0
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_icon.jsx +19 -0
- data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -1
- data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +16 -9
- data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +6 -1
- data/dist/playbook-rails.js +6 -6
- data/lib/playbook/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3efbce8e6bf0e2038cb58c547e077b7b44abba6abf56c59a4fc907fbfce2c5e
|
4
|
+
data.tar.gz: 7880d9315a8eaa5c0e9a3a265511ec50560452fe801cdbc4c0ccacd8dc788d83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0dbccb4ffc9f8ddf6aa98023dcfe77065eb705d3d2212ab6dff3d0c15e6797708f20789530ea9fcde6a1f2d687f4c6d2ff57e106f983171ed6d326b7f62ff99c
|
7
|
+
data.tar.gz: 8d4dc0b7828a8d9add30dd1c23416fbc4181a2ecb319e38792a80a717aef3b37e75a99790ef42d703be18dcd09c474faaaa5c4b6e6b612097bfb1044167128ed
|
@@ -8,13 +8,9 @@
|
|
8
8
|
<%= pb_rails("caption", props: {text: object.label, margin_bottom:"xs"}) %>
|
9
9
|
<% end %>
|
10
10
|
<div class="dropdown_wrapper<%= error_class %>" style="position: relative">
|
11
|
-
<input
|
12
|
-
|
13
|
-
|
14
|
-
name="<%= object.name %>"
|
15
|
-
style="display: none"
|
16
|
-
<%= object.required ? "required" : ""%>
|
17
|
-
/>
|
11
|
+
<input type="hidden" name="<%= object.name %>" id="dropdown-selected-option" value="<%= input_default_value %>" />
|
12
|
+
<input id="dropdown-form-validation" name="<%= object.name %>_form_validation" value="<%= input_default_value %>" style="display: none" <%= object.required ? "required" : ""%> />
|
13
|
+
|
18
14
|
<% if content.present? %>
|
19
15
|
<%= content.presence %>
|
20
16
|
<%= pb_rails("body", props: { status: "negative", text: object.error }) %>
|
@@ -8,9 +8,9 @@ const DOWN_ARROW_SELECTOR = "#dropdown_open_icon";
|
|
8
8
|
const UP_ARROW_SELECTOR = "#dropdown_close_icon";
|
9
9
|
const OPTION_SELECTOR = "[data-dropdown-option-label]";
|
10
10
|
const CUSTOM_DISPLAY_SELECTOR = "[data-dropdown-custom-trigger]";
|
11
|
+
const INPUT_FORM_VALIDATION = "#dropdown-form-validation";
|
11
12
|
const DROPDOWN_TRIGGER_DISPLAY = "#dropdown_trigger_display";
|
12
13
|
const DROPDOWN_PLACEHOLDER = "[data-dropdown-placeholder]";
|
13
|
-
const DROPDOWN_INPUT = "#dropdown-selected-option";
|
14
14
|
|
15
15
|
export default class PbDropdown extends PbEnhancedElement {
|
16
16
|
static get selector() {
|
@@ -47,13 +47,14 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
47
47
|
|
48
48
|
handleOptionClick(event) {
|
49
49
|
const option = event.target.closest(OPTION_SELECTOR);
|
50
|
-
const hiddenInput = this.element.querySelector(
|
50
|
+
const hiddenInput = this.element.querySelector("#dropdown-selected-option");
|
51
|
+
const inputFormValidation = this.element.querySelector(INPUT_FORM_VALIDATION);
|
51
52
|
|
52
53
|
if (option) {
|
53
54
|
const value = option.dataset.dropdownOptionLabel;
|
54
55
|
hiddenInput.value = JSON.parse(value).id;
|
55
|
-
|
56
|
-
|
56
|
+
inputFormValidation.value = JSON.parse(value).id;
|
57
|
+
this.clearFormValidation(inputFormValidation);
|
57
58
|
this.onOptionSelected(value, option);
|
58
59
|
}
|
59
60
|
}
|
@@ -159,18 +160,14 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
159
160
|
}
|
160
161
|
|
161
162
|
handleFormValidation() {
|
162
|
-
const
|
163
|
-
|
164
|
-
|
165
|
-
"
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
}
|
171
|
-
},
|
172
|
-
true
|
173
|
-
);
|
163
|
+
const inputFormValidation = this.element.querySelector(INPUT_FORM_VALIDATION);
|
164
|
+
|
165
|
+
inputFormValidation.addEventListener("invalid", function (event) {
|
166
|
+
if (inputFormValidation.hasAttribute("required") && inputFormValidation.value === "") {
|
167
|
+
event.preventDefault();
|
168
|
+
inputFormValidation.closest(".dropdown_wrapper").classList.add("error");
|
169
|
+
}
|
170
|
+
}, true);
|
174
171
|
}
|
175
172
|
|
176
173
|
clearFormValidation(input) {
|
@@ -178,9 +175,7 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
178
175
|
const dropdownWrapperElement = input.closest(".dropdown_wrapper");
|
179
176
|
dropdownWrapperElement.classList.remove("error");
|
180
177
|
|
181
|
-
const errorLabelElement = dropdownWrapperElement.querySelector(
|
182
|
-
".pb_body_kit_negative"
|
183
|
-
);
|
178
|
+
const errorLabelElement = dropdownWrapperElement.querySelector(".pb_body_kit_negative");
|
184
179
|
if (errorLabelElement) {
|
185
180
|
errorLabelElement.remove();
|
186
181
|
}
|
@@ -188,22 +183,23 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
188
183
|
}
|
189
184
|
|
190
185
|
setDefaultValue() {
|
191
|
-
const hiddenInput = this.element.querySelector(
|
192
|
-
const options = this.element.querySelectorAll(OPTION_SELECTOR);
|
186
|
+
const hiddenInput = this.element.querySelector("#dropdown-selected-option");
|
193
187
|
|
194
|
-
|
195
|
-
|
188
|
+
if (hiddenInput.value) {
|
189
|
+
const inputFormValidation = this.element.querySelector(INPUT_FORM_VALIDATION);
|
190
|
+
const defaultValue = JSON.parse(hiddenInput.value.replaceAll("=>", ":"));
|
191
|
+
const options = this.element.querySelectorAll(OPTION_SELECTOR);
|
196
192
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
);
|
193
|
+
options.forEach((option) => {
|
194
|
+
if (defaultValue.id === JSON.parse(option.dataset.dropdownOptionLabel).id) {
|
195
|
+
option.classList.add("pb_dropdown_option_selected");
|
196
|
+
}
|
202
197
|
});
|
203
|
-
|
204
|
-
this.setTriggerElementText(
|
205
|
-
|
206
|
-
|
198
|
+
|
199
|
+
this.setTriggerElementText(defaultValue.label);
|
200
|
+
|
201
|
+
hiddenInput.value = defaultValue.id;
|
202
|
+
inputFormValidation.value = defaultValue.id;
|
207
203
|
}
|
208
204
|
}
|
209
205
|
|
@@ -218,13 +214,11 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
218
214
|
}
|
219
215
|
|
220
216
|
resetDropdownValue() {
|
221
|
-
const hiddenInput = this.element.querySelector(
|
222
|
-
const
|
223
|
-
options.forEach((option) => {
|
224
|
-
option.classList.remove("pb_dropdown_option_selected");
|
225
|
-
});
|
217
|
+
const hiddenInput = this.element.querySelector("#dropdown-selected-option");
|
218
|
+
const inputFormValidation = this.element.querySelector(INPUT_FORM_VALIDATION);
|
226
219
|
|
227
220
|
hiddenInput.value = "";
|
221
|
+
inputFormValidation.value = "";
|
228
222
|
|
229
223
|
const defaultPlaceholder = this.element.querySelector(DROPDOWN_PLACEHOLDER);
|
230
224
|
this.setTriggerElementText(defaultPlaceholder.dataset.dropdownPlaceholder);
|
@@ -50,4 +50,15 @@ test('displays size variant', () => {
|
|
50
50
|
)
|
51
51
|
const kit = screen.getByTestId('formpill')
|
52
52
|
expect(kit).toHaveClass(`pb_form_pill_kit_primary small none`)
|
53
|
+
});
|
54
|
+
|
55
|
+
test('displays icon', () => {
|
56
|
+
render(
|
57
|
+
<FormPill
|
58
|
+
data={{ testid: testId }}
|
59
|
+
icon={"test"}
|
60
|
+
/>
|
61
|
+
)
|
62
|
+
const kit = screen.getByTestId('formpill')
|
63
|
+
expect(kit).toHaveClass(`pb_form_pill_kit_primary_icon none`)
|
53
64
|
});
|
@@ -21,6 +21,7 @@ type FormPillProps = {
|
|
21
21
|
color?: "primary" | "neutral",
|
22
22
|
data?: {[key: string]: string},
|
23
23
|
tabIndex?: number,
|
24
|
+
icon?: string,
|
24
25
|
closeProps?: {
|
25
26
|
onClick?: React.MouseEventHandler<HTMLSpanElement>,
|
26
27
|
onMouseDown?: React.MouseEventHandler<HTMLSpanElement>,
|
@@ -42,9 +43,12 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
|
|
42
43
|
color = "primary",
|
43
44
|
data = {},
|
44
45
|
tabIndex,
|
46
|
+
icon = "",
|
45
47
|
} = props
|
48
|
+
|
49
|
+
const iconClass = icon ? "_icon" : ""
|
46
50
|
const css = classnames(
|
47
|
-
`pb_form_pill_kit_${color}`,
|
51
|
+
`pb_form_pill_kit_${color}${iconClass}`,
|
48
52
|
globalProps(props),
|
49
53
|
className,
|
50
54
|
size === 'small' ? 'small' : null,
|
@@ -61,29 +65,60 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
|
|
61
65
|
{...dataProps}
|
62
66
|
{...htmlProps}
|
63
67
|
>
|
64
|
-
|
68
|
+
{((name && !icon && !text) || (name && !icon && text)) && (
|
65
69
|
<>
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
70
|
+
<Avatar
|
71
|
+
imageUrl={avatarUrl}
|
72
|
+
name={name}
|
73
|
+
size="xs"
|
74
|
+
status={null}
|
75
|
+
/>
|
76
|
+
<Title
|
77
|
+
className="pb_form_pill_text"
|
78
|
+
size={4}
|
79
|
+
text={name}
|
80
|
+
/>
|
77
81
|
</>
|
78
|
-
|
79
|
-
|
80
|
-
|
82
|
+
)}
|
83
|
+
{((name && icon && !text) || (name && icon && text)) && (
|
84
|
+
<>
|
85
|
+
<Avatar
|
86
|
+
imageUrl={avatarUrl}
|
87
|
+
name={name}
|
88
|
+
size="xs"
|
89
|
+
status={null}
|
90
|
+
/>
|
91
|
+
<Title
|
92
|
+
className="pb_form_pill_text"
|
93
|
+
size={4}
|
94
|
+
text={name}
|
95
|
+
/>
|
96
|
+
<Icon
|
97
|
+
className="pb_form_pill_icon"
|
98
|
+
icon={icon}
|
99
|
+
/>
|
100
|
+
</>
|
101
|
+
)}
|
102
|
+
{(!name && icon && text) && (
|
103
|
+
<>
|
104
|
+
<Icon
|
105
|
+
className="pb_form_pill_icon"
|
106
|
+
icon={icon}
|
107
|
+
/>
|
108
|
+
<Title
|
109
|
+
className="pb_form_pill_tag"
|
110
|
+
size={4}
|
111
|
+
text={text}
|
112
|
+
/>
|
113
|
+
</>
|
114
|
+
)}
|
115
|
+
{(!name && !icon && text) && (
|
81
116
|
<Title
|
82
117
|
className="pb_form_pill_tag"
|
83
118
|
size={4}
|
84
119
|
text={text}
|
85
120
|
/>
|
86
|
-
}
|
121
|
+
)}
|
87
122
|
<div
|
88
123
|
className="pb_form_pill_close"
|
89
124
|
onClick={onClick}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import FormPill from '../_form_pill'
|
3
|
+
|
4
|
+
const FormPillIcon = (props) => {
|
5
|
+
return (
|
6
|
+
<div>
|
7
|
+
<FormPill
|
8
|
+
icon="badge-check"
|
9
|
+
onClick={() => {
|
10
|
+
alert('Click!')
|
11
|
+
}}
|
12
|
+
tabIndex={0}
|
13
|
+
text="icon and tag"
|
14
|
+
{...props}
|
15
|
+
/>
|
16
|
+
</div>
|
17
|
+
)
|
18
|
+
}
|
19
|
+
export default FormPillIcon
|
@@ -5,10 +5,11 @@ examples:
|
|
5
5
|
- form_pill_size: Form Pill Size
|
6
6
|
- form_pill_tag: Form Pill Tag
|
7
7
|
- form_pill_example: Example
|
8
|
-
|
8
|
+
- form_pill_icon: Form Pill Icon
|
9
9
|
|
10
10
|
react:
|
11
11
|
- form_pill_user: Form Pill User
|
12
12
|
- form_pill_size: Form Pill Size
|
13
13
|
- form_pill_tag: Form Pill Tag
|
14
14
|
- form_pill_example: Example
|
15
|
+
- form_pill_icon: Form Pill Icon
|
@@ -2,4 +2,4 @@ export { default as FormPillUser } from './_form_pill_user.jsx'
|
|
2
2
|
export { default as FormPillSize } from './_form_pill_size.jsx'
|
3
3
|
export { default as FormPillTag } from './_form_pill_tag.jsx'
|
4
4
|
export { default as FormPillExample } from './_form_pill_example.jsx'
|
5
|
-
|
5
|
+
export { default as FormPillIcon } from './_form_pill_icon.jsx'
|
@@ -1,12 +1,19 @@
|
|
1
1
|
<%= content_tag(:div, id: object.id, data: object.data, class: object.classname + object.size_class, tabindex: object.tabindex, **combined_html_options) do %>
|
2
2
|
<% if object.name.present? %>
|
3
3
|
<%= pb_rails("avatar", props: { name: object.name, image_url: object.avatar_url, size: "xs" }) %>
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
<%= pb_rails("title", props: { text: object.name, size: 4, classname: "pb_form_pill_text" }) %>
|
5
|
+
<% if object.icon.present? %>
|
6
|
+
<%= pb_rails("icon", props: { classname: "pb_form_pill_icon", icon: object.icon }) %>
|
7
|
+
<% end %>
|
8
|
+
<% elsif object.text.present? %>
|
9
|
+
<% if object.icon.present? %>
|
10
|
+
<%= pb_rails("icon", props: { classname: "pb_form_pill_icon", icon: object.icon }) %>
|
11
|
+
<% end %>
|
12
|
+
<% if object.text.present? %>
|
13
|
+
<%= pb_rails("title", props: { text: object.text, size: 4, classname: "pb_form_pill_tag" }) %>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
16
|
+
<%= pb_rails("body", props: { classname: "pb_form_pill_close" }) do %>
|
17
|
+
<%= pb_rails("icon", props: { icon: 'times' , fixed_width: true }) %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
@@ -15,9 +15,10 @@ module Playbook
|
|
15
15
|
values: %w[primary neutral],
|
16
16
|
default: "primary"
|
17
17
|
prop :tabindex
|
18
|
+
prop :icon
|
18
19
|
|
19
20
|
def classname
|
20
|
-
generate_classname("pb_form_pill_kit", color, name, text, text_transform)
|
21
|
+
generate_classname("pb_form_pill_kit", color, icon_class, name, text, text_transform)
|
21
22
|
end
|
22
23
|
|
23
24
|
def display_text
|
@@ -27,6 +28,10 @@ module Playbook
|
|
27
28
|
def size_class
|
28
29
|
size == "small" ? " small" : ""
|
29
30
|
end
|
31
|
+
|
32
|
+
def icon_class
|
33
|
+
icon ? "icon" : nil
|
34
|
+
end
|
30
35
|
end
|
31
36
|
end
|
32
37
|
end
|