playbook_ui 15.1.0.pre.alpha.PLAY2468phonenuminputvalidation10993 → 15.1.0.pre.alpha.PLAY2468phonenuminputvalidation11111
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_advanced_table/Hooks/useTableState.ts +0 -2
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +4 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_stacked_alert.html.erb +16 -16
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_stacked_alert.jsx +2 -1
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_status.html.erb +31 -31
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_status.jsx +4 -3
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +11 -0
- data/app/pb_kits/playbook/pb_form/pb_form_validation.js +13 -37
- data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.tsx +2 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.scss +15 -21
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.tsx +6 -5
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.html.erb +2 -0
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.rb +11 -3
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +9 -8
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +15 -89
- data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +14 -6
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.html.erb +8 -4
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +5 -0
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.md +1 -0
- data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +3 -1
- data/app/pb_kits/playbook/pb_text_input/text_input.rb +6 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +39 -1
- data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +2 -0
- data/dist/chunks/{_line_graph-C3zTTfo0.js → _line_graph-Bb7DQKyL.js} +1 -1
- data/dist/chunks/{_typeahead-CfKPIYmd.js → _typeahead-BBamAvDm.js} +1 -1
- data/dist/chunks/{_weekday_stacked-CUTwEQ-P.js → _weekday_stacked-AqPvtHD7.js} +3 -3
- data/dist/chunks/pb_form_validation-CleM960_.js +1 -0
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +2 -2
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +7 -6
- data/dist/chunks/pb_form_validation-D1VURgVg.js +0 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 06ac01cc54efddaffa50486aecfb448a580bce3b816f85fdd201fa5ba05478da
|
|
4
|
+
data.tar.gz: '084380bb710d19465a2948e53c3b49e2ea833f0ab9565ba95838eb34075373e1'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 676249db4be37cd46c943a4cb0cf7dccd3f1f2bc54ba0f8f67e39dd0fb544aecc63353fdcf9e6e52bc185a3b0034607cc72679e1b1c6b831f7c1ab1d5597e074
|
|
7
|
+
data.tar.gz: 169b3fab71971b434ba4703e65229407e8fdada7c142312ee7236c87886bce64cef2fe91c1b648207cd804b4d12eb86c3e63a1f118f326b68e80b152951571b8
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
<%= pb_rails("button", props: { text: "Delete Status", data: {"open-dialog": "dialog-stacked-delete"}, margin_right: "md" }) %>
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
<%= pb_rails("dialog", props: {
|
|
7
|
-
id:"dialog-stacked-default",
|
|
6
|
+
<%= pb_rails("dialog", props: {
|
|
7
|
+
id:"dialog-stacked-default",
|
|
8
8
|
status: "default",
|
|
9
|
-
size: "sm",
|
|
10
|
-
title: "Are you sure?",
|
|
11
|
-
text: "Text explaining why there is an alert",
|
|
9
|
+
size: "sm",
|
|
10
|
+
title: "Are you sure?",
|
|
11
|
+
text: "Text explaining why there is an alert",
|
|
12
12
|
}) do %>
|
|
13
13
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
14
14
|
<%= pb_rails("flex", props: { orientation: "column", padding_x:"md", padding: "sm" }) do %>
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
<% end %>
|
|
19
19
|
<% end %>
|
|
20
20
|
|
|
21
|
-
<%= pb_rails("dialog", props: {
|
|
22
|
-
id:"dialog-stacked-caution",
|
|
21
|
+
<%= pb_rails("dialog", props: {
|
|
22
|
+
id:"dialog-stacked-caution",
|
|
23
23
|
status: "caution",
|
|
24
|
-
size: "sm",
|
|
25
|
-
title: "Are you sure?",
|
|
26
|
-
text: "This is the action you will be taking",
|
|
24
|
+
size: "sm",
|
|
25
|
+
title: "Are you sure?",
|
|
26
|
+
text: "This is the action you will be taking",
|
|
27
27
|
}) do %>
|
|
28
28
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
29
29
|
<%= pb_rails("flex", props: { orientation: "column", padding_x:"md", padding: "sm" }) do %>
|
|
@@ -33,16 +33,16 @@
|
|
|
33
33
|
<% end %>
|
|
34
34
|
<% end %>
|
|
35
35
|
|
|
36
|
-
<%= pb_rails("dialog", props: {
|
|
37
|
-
id:"dialog-stacked-delete",
|
|
36
|
+
<%= pb_rails("dialog", props: {
|
|
37
|
+
id:"dialog-stacked-delete",
|
|
38
38
|
status: "delete",
|
|
39
|
-
size: "sm",
|
|
40
|
-
title: "Delete",
|
|
41
|
-
text: "You are about to delete ...",
|
|
39
|
+
size: "sm",
|
|
40
|
+
title: "Delete",
|
|
41
|
+
text: "You are about to delete ...",
|
|
42
42
|
}) do %>
|
|
43
43
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
44
44
|
<%= pb_rails("flex", props: { orientation: "column", padding_x:"md", padding: "sm" }) do %>
|
|
45
|
-
<%= pb_rails("button", props: { text: "Yes, Action", full_width: true }) %>
|
|
45
|
+
<%= pb_rails("button", props: { text: "Yes, Action", variant: "danger", full_width: true }) %>
|
|
46
46
|
<%= pb_rails("button", props: { text: "No, Cancel", variant: "secondary", full_width: true, margin_top: "sm", data: {"close-dialog": "dialog-stacked-delete" } }) %>
|
|
47
47
|
<% end %>
|
|
48
48
|
<% end %>
|
|
@@ -51,7 +51,7 @@ const DialogStackedAlert = () => {
|
|
|
51
51
|
return (
|
|
52
52
|
<div>
|
|
53
53
|
<Flex
|
|
54
|
-
rowGap="xs"
|
|
54
|
+
rowGap="xs"
|
|
55
55
|
wrap
|
|
56
56
|
>
|
|
57
57
|
<Button
|
|
@@ -93,6 +93,7 @@ const DialogStackedAlert = () => {
|
|
|
93
93
|
<Button
|
|
94
94
|
fullWidth
|
|
95
95
|
onClick={dialog.toggle}
|
|
96
|
+
variant= {dialog.status == "delete" ? "danger" : "primary"}
|
|
96
97
|
>
|
|
97
98
|
{dialog.buttonOneText}
|
|
98
99
|
</Button>
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
<%= pb_rails("button", props: { text: "Success Status", data: {"open-dialog": "dialog-status-success"}, margin_right: "md" }) %>
|
|
9
9
|
<% end %>
|
|
10
10
|
|
|
11
|
-
<%= pb_rails("dialog", props: {
|
|
12
|
-
id:"dialog-status-default",
|
|
11
|
+
<%= pb_rails("dialog", props: {
|
|
12
|
+
id:"dialog-status-default",
|
|
13
13
|
status: "default",
|
|
14
|
-
size: "status_size",
|
|
15
|
-
title: "Are you sure?",
|
|
16
|
-
text: "Text explaining why there is an alert",
|
|
14
|
+
size: "status_size",
|
|
15
|
+
title: "Are you sure?",
|
|
16
|
+
text: "Text explaining why there is an alert",
|
|
17
17
|
}) do %>
|
|
18
18
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
19
19
|
<%= pb_rails("flex", props: { spacing:"between", padding_x:"md", padding_bottom:"md", padding: "sm" }) do %>
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
<% end %>
|
|
24
24
|
<% end %>
|
|
25
25
|
|
|
26
|
-
<%= pb_rails("dialog", props: {
|
|
27
|
-
id:"dialog-status-info",
|
|
26
|
+
<%= pb_rails("dialog", props: {
|
|
27
|
+
id:"dialog-status-info",
|
|
28
28
|
status: "info",
|
|
29
|
-
size: "status_size",
|
|
30
|
-
title: "Information",
|
|
31
|
-
text: "Text explaining why there is an alert",
|
|
29
|
+
size: "status_size",
|
|
30
|
+
title: "Information",
|
|
31
|
+
text: "Text explaining why there is an alert",
|
|
32
32
|
}) do %>
|
|
33
33
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
34
34
|
<%= pb_rails("flex", props: { spacing:"between", padding_x:"md", padding_bottom:"md", padding: "sm" }) do %>
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
<% end %>
|
|
38
38
|
<% end %>
|
|
39
39
|
|
|
40
|
-
<%= pb_rails("dialog", props: {
|
|
41
|
-
id:"dialog-status-caution",
|
|
40
|
+
<%= pb_rails("dialog", props: {
|
|
41
|
+
id:"dialog-status-caution",
|
|
42
42
|
status: "caution",
|
|
43
|
-
size: "status_size",
|
|
44
|
-
title: "Are you Sure?",
|
|
45
|
-
text: "This is the action you will be taking",
|
|
43
|
+
size: "status_size",
|
|
44
|
+
title: "Are you Sure?",
|
|
45
|
+
text: "This is the action you will be taking",
|
|
46
46
|
}) do %>
|
|
47
47
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
48
48
|
<%= pb_rails("flex", props: { spacing:"between", padding_x:"md", padding_bottom:"md", padding: "sm" }) do %>
|
|
@@ -52,27 +52,27 @@
|
|
|
52
52
|
<% end %>
|
|
53
53
|
<% end %>
|
|
54
54
|
|
|
55
|
-
<%= pb_rails("dialog", props: {
|
|
56
|
-
id:"dialog-status-delete",
|
|
55
|
+
<%= pb_rails("dialog", props: {
|
|
56
|
+
id:"dialog-status-delete",
|
|
57
57
|
status: "delete",
|
|
58
|
-
size: "status_size",
|
|
59
|
-
title: "Delete",
|
|
60
|
-
text: "You are about to delete ...",
|
|
58
|
+
size: "status_size",
|
|
59
|
+
title: "Delete",
|
|
60
|
+
text: "You are about to delete ...",
|
|
61
61
|
}) do %>
|
|
62
62
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
63
63
|
<%= pb_rails("flex", props: { spacing:"between", padding_x:"md", padding_bottom:"md", padding: "sm" }) do %>
|
|
64
|
-
<%= pb_rails("button", props: { text: "Yes, Delete" }) %>
|
|
64
|
+
<%= pb_rails("button", props: { text: "Yes, Delete", variant: "danger" }) %>
|
|
65
65
|
<%= pb_rails("button", props: { text: "No, Cancel", variant: "secondary", data: {"close-dialog": "dialog-status-delete" } }) %>
|
|
66
66
|
<% end %>
|
|
67
67
|
<% end %>
|
|
68
68
|
<% end %>
|
|
69
69
|
|
|
70
|
-
<%= pb_rails("dialog", props: {
|
|
71
|
-
id:"dialog-status-error",
|
|
70
|
+
<%= pb_rails("dialog", props: {
|
|
71
|
+
id:"dialog-status-error",
|
|
72
72
|
status: "error",
|
|
73
|
-
size: "status_size",
|
|
74
|
-
title: "Error Message",
|
|
75
|
-
text: "Text explaining the error",
|
|
73
|
+
size: "status_size",
|
|
74
|
+
title: "Error Message",
|
|
75
|
+
text: "Text explaining the error",
|
|
76
76
|
}) do %>
|
|
77
77
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
78
78
|
<%= pb_rails("flex", props: { spacing:"between", padding_x:"md", padding_bottom:"md", padding: "sm" }) do %>
|
|
@@ -81,12 +81,12 @@
|
|
|
81
81
|
<% end %>
|
|
82
82
|
<% end %>
|
|
83
83
|
|
|
84
|
-
<%= pb_rails("dialog", props: {
|
|
85
|
-
id:"dialog-status-success",
|
|
84
|
+
<%= pb_rails("dialog", props: {
|
|
85
|
+
id:"dialog-status-success",
|
|
86
86
|
status: "success",
|
|
87
|
-
size: "status_size",
|
|
88
|
-
title: "Success!",
|
|
89
|
-
text: "Text explaining what is successful",
|
|
87
|
+
size: "status_size",
|
|
88
|
+
title: "Success!",
|
|
89
|
+
text: "Text explaining what is successful",
|
|
90
90
|
}) do %>
|
|
91
91
|
<%= pb_rails("dialog/dialog_footer") do %>
|
|
92
92
|
<%= pb_rails("flex", props: { spacing:"between", padding_x:"md", padding_bottom:"md", padding: "sm" }) do %>
|
|
@@ -83,8 +83,8 @@ const DialogStatus = () => {
|
|
|
83
83
|
|
|
84
84
|
return (
|
|
85
85
|
<div>
|
|
86
|
-
<Flex
|
|
87
|
-
rowGap="xs"
|
|
86
|
+
<Flex
|
|
87
|
+
rowGap="xs"
|
|
88
88
|
wrap
|
|
89
89
|
>
|
|
90
90
|
<Button
|
|
@@ -117,7 +117,7 @@ const DialogStatus = () => {
|
|
|
117
117
|
>
|
|
118
118
|
{"Success Status"}
|
|
119
119
|
</Button>
|
|
120
|
-
<Button
|
|
120
|
+
<Button
|
|
121
121
|
marginRight="md"
|
|
122
122
|
onClick={toggleErrorAlert}
|
|
123
123
|
>
|
|
@@ -152,6 +152,7 @@ const DialogStatus = () => {
|
|
|
152
152
|
<Button
|
|
153
153
|
onClick={dialog.toggle}
|
|
154
154
|
paddingRight="xl"
|
|
155
|
+
variant={dialog.status == "delete" ? "danger" : "primary"}
|
|
155
156
|
>
|
|
156
157
|
{dialog.buttonOneText}
|
|
157
158
|
</Button>
|
|
@@ -21,6 +21,15 @@
|
|
|
21
21
|
]
|
|
22
22
|
%>
|
|
23
23
|
|
|
24
|
+
<%
|
|
25
|
+
example_typeahead_options = [
|
|
26
|
+
{ label: 'Orange', value: '#FFA500' },
|
|
27
|
+
{ label: 'Red', value: '#FF0000' },
|
|
28
|
+
{ label: 'Green', value: '#00FF00' },
|
|
29
|
+
{ label: 'Blue', value: '#0000FF' },
|
|
30
|
+
]
|
|
31
|
+
%>
|
|
32
|
+
|
|
24
33
|
<% treeData = [{
|
|
25
34
|
label: "Power Home Remodeling",
|
|
26
35
|
value: "Power Home Remodeling",
|
|
@@ -89,6 +98,8 @@
|
|
|
89
98
|
|
|
90
99
|
<%= pb_form_with(scope: :example, method: :get, url: "", validate: true) do |form| %>
|
|
91
100
|
<%= form.typeahead :example_typeahead_validation, props: { data: { typeahead_example2: true, user: {} }, label: true, placeholder: "Search for a user", required: true, validation: { message: "Please select a user." } } %>
|
|
101
|
+
<%= form.typeahead :example_typeahead_validation_react, props: { options: example_typeahead_options, pills: true, label: "Example Typeahead (React Rendered)", placeholder: "Search for a user", required: true, validation: { message: "Please select a color." } } %>
|
|
102
|
+
<%= form.typeahead :example_typeahead_validation_react_2, props: { options: example_typeahead_options, pills: true, label: "Example Typeahead 2 (React Rendered)", placeholder: "Search for a user", required: true } %>
|
|
92
103
|
<%= form.text_field :example_text_field_validation, props: { label: true, required: true } %>
|
|
93
104
|
<%= form.phone_number_field :example_phone_number_field_validation, props: { label: "Example phone field", hidden_inputs: true, required: true } %>
|
|
94
105
|
<%= form.email_field :example_email_field_validation, props: { label: true, required: true } %>
|
|
@@ -2,13 +2,12 @@ import PbEnhancedElement from '../pb_enhanced_element'
|
|
|
2
2
|
import { debounce } from '../utilities/object'
|
|
3
3
|
|
|
4
4
|
// Kit selectors
|
|
5
|
-
const KIT_SELECTOR
|
|
6
|
-
const ERROR_MESSAGE_SELECTOR
|
|
5
|
+
const KIT_SELECTOR = '[class^="pb_"][class*="_kit"]'
|
|
6
|
+
const ERROR_MESSAGE_SELECTOR = '.pb_body_kit_negative'
|
|
7
7
|
|
|
8
8
|
// Validation selectors
|
|
9
|
-
const FORM_SELECTOR
|
|
10
|
-
const REQUIRED_FIELDS_SELECTOR
|
|
11
|
-
const PHONE_NUMBER_VALIDATION_ERROR_SELECTOR = '[data-pb-phone-validation-error="true"]'
|
|
9
|
+
const FORM_SELECTOR = 'form[data-pb-form-validation="true"]'
|
|
10
|
+
const REQUIRED_FIELDS_SELECTOR = 'input[required],textarea[required],select[required]'
|
|
12
11
|
|
|
13
12
|
const FIELD_EVENTS = [
|
|
14
13
|
'change',
|
|
@@ -23,24 +22,12 @@ class PbFormValidation extends PbEnhancedElement {
|
|
|
23
22
|
|
|
24
23
|
connect() {
|
|
25
24
|
this.formValidationFields.forEach((field) => {
|
|
26
|
-
// Skip phone number inputs - they handle their own validation
|
|
27
|
-
const isPhoneNumberInput = field.closest('.pb_phone_number_input')
|
|
28
|
-
if (isPhoneNumberInput) return
|
|
29
|
-
|
|
30
25
|
FIELD_EVENTS.forEach((e) => {
|
|
31
26
|
field.addEventListener(e, debounce((event) => {
|
|
32
27
|
this.validateFormField(event)
|
|
33
28
|
}, 250), false)
|
|
34
29
|
})
|
|
35
30
|
})
|
|
36
|
-
|
|
37
|
-
// Add event listener to check for phone number validation errors
|
|
38
|
-
this.element.addEventListener('submit', (event) => {
|
|
39
|
-
if (this.hasPhoneNumberValidationErrors()) {
|
|
40
|
-
event.preventDefault()
|
|
41
|
-
return false
|
|
42
|
-
}
|
|
43
|
-
})
|
|
44
31
|
}
|
|
45
32
|
|
|
46
33
|
validateFormField(event) {
|
|
@@ -58,25 +45,20 @@ class PbFormValidation extends PbEnhancedElement {
|
|
|
58
45
|
|
|
59
46
|
showValidationMessage(target) {
|
|
60
47
|
const { parentElement } = target
|
|
61
|
-
const kitElement = parentElement.closest(KIT_SELECTOR)
|
|
62
|
-
|
|
63
|
-
// Check if this is a phone number input
|
|
64
|
-
const isPhoneNumberInput = kitElement && kitElement.classList.contains('pb_phone_number_input')
|
|
65
48
|
|
|
66
49
|
// ensure clean error message state
|
|
67
50
|
this.clearError(target)
|
|
68
|
-
|
|
51
|
+
parentElement.closest(KIT_SELECTOR).classList.add('error')
|
|
69
52
|
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
// set the error message element
|
|
73
|
-
const errorMessageContainer = this.errorMessageContainer
|
|
74
|
-
if (target.dataset.message) target.setCustomValidity(target.dataset.message)
|
|
75
|
-
errorMessageContainer.innerHTML = target.validationMessage
|
|
53
|
+
// set the error message element
|
|
54
|
+
const errorMessageContainer = this.errorMessageContainer
|
|
76
55
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
56
|
+
if (target.dataset.message) target.setCustomValidity(target.dataset.message)
|
|
57
|
+
|
|
58
|
+
errorMessageContainer.innerHTML = target.validationMessage
|
|
59
|
+
|
|
60
|
+
// add the error message element to the dom tree
|
|
61
|
+
parentElement.appendChild(errorMessageContainer)
|
|
80
62
|
}
|
|
81
63
|
|
|
82
64
|
clearError(target) {
|
|
@@ -86,12 +68,6 @@ class PbFormValidation extends PbEnhancedElement {
|
|
|
86
68
|
if (errorMessageContainer) errorMessageContainer.remove()
|
|
87
69
|
}
|
|
88
70
|
|
|
89
|
-
// Check if there are phone number input errors
|
|
90
|
-
hasPhoneNumberValidationErrors() {
|
|
91
|
-
const phoneNumberErrors = this.element.querySelectorAll(PHONE_NUMBER_VALIDATION_ERROR_SELECTOR)
|
|
92
|
-
return phoneNumberErrors.length > 0
|
|
93
|
-
}
|
|
94
|
-
|
|
95
71
|
get errorMessageContainer() {
|
|
96
72
|
const errorContainer = document.createElement('div')
|
|
97
73
|
const kitClassName = ERROR_MESSAGE_SELECTOR.replace(/\./, '')
|
|
@@ -3,7 +3,7 @@ import React from 'react'
|
|
|
3
3
|
import classnames from 'classnames'
|
|
4
4
|
|
|
5
5
|
import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
|
|
6
|
-
import { globalProps } from '../utilities/globalProps'
|
|
6
|
+
import { globalProps, GlobalProps } from '../utilities/globalProps'
|
|
7
7
|
|
|
8
8
|
import Icon from '../pb_icon/_icon'
|
|
9
9
|
|
|
@@ -26,7 +26,7 @@ type IconCircleProps = {
|
|
|
26
26
|
| "orange"
|
|
27
27
|
| "green"
|
|
28
28
|
| "lighter",
|
|
29
|
-
}
|
|
29
|
+
} & GlobalProps
|
|
30
30
|
|
|
31
31
|
const IconCircle = (props: IconCircleProps) => {
|
|
32
32
|
const {
|
|
@@ -3,51 +3,45 @@
|
|
|
3
3
|
@import "../tokens/spacing";
|
|
4
4
|
@import "../pb_icon_circle/icon_circle";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
.pb_icon_stat_value_kit_horizontal,
|
|
7
|
+
.pb_icon_stat_value_kit_vertical
|
|
8
|
+
{
|
|
7
9
|
display: flex;
|
|
8
10
|
align-items: baseline;
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
&.pb_icon_stat_value_kit_vertical {
|
|
11
13
|
flex-direction: column;
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
&.text_align_center {
|
|
14
16
|
align-items: center;
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
.pb_title_kit,
|
|
19
|
+
.pb_body_kit,
|
|
20
|
+
.pb_caption_kit_md {
|
|
19
21
|
text-align: center;
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
&.text_align_right {
|
|
24
26
|
align-items: flex-end;
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
.pb_title_kit,
|
|
29
|
+
.pb_body_kit,
|
|
30
|
+
.pb_caption_kit_md {
|
|
29
31
|
text-align: right;
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
[class^=pb_icon_circle] {
|
|
34
|
-
margin-bottom: $space-xs;
|
|
35
|
-
}
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
|
|
36
|
+
&.pb_icon_stat_value_kit_horizontal {
|
|
39
37
|
align-items: center;
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
&.text_align_center {
|
|
42
40
|
justify-content: center;
|
|
43
41
|
}
|
|
44
42
|
|
|
45
|
-
|
|
43
|
+
&.text_align_right {
|
|
46
44
|
justify-content: flex-end;
|
|
47
45
|
}
|
|
48
|
-
|
|
49
|
-
[class^=pb_icon_circle] {
|
|
50
|
-
margin-right: $space-sm;
|
|
51
|
-
}
|
|
52
46
|
}
|
|
53
47
|
}
|
|
@@ -2,7 +2,7 @@ import React from 'react'
|
|
|
2
2
|
import classnames from 'classnames'
|
|
3
3
|
|
|
4
4
|
import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
|
|
5
|
-
import { globalProps } from '../utilities/globalProps'
|
|
5
|
+
import { globalProps, GlobalProps } from '../utilities/globalProps'
|
|
6
6
|
|
|
7
7
|
import Body from '../pb_body/_body'
|
|
8
8
|
import Caption from '../pb_caption/_caption'
|
|
@@ -33,8 +33,7 @@ type IconStatValueProps = {
|
|
|
33
33
|
| "yellow"
|
|
34
34
|
| "orange"
|
|
35
35
|
| "green"
|
|
36
|
-
|
|
37
|
-
}
|
|
36
|
+
} & GlobalProps
|
|
38
37
|
|
|
39
38
|
const IconStatValue = (props: IconStatValueProps): React.ReactElement => {
|
|
40
39
|
const {
|
|
@@ -50,13 +49,13 @@ const IconStatValue = (props: IconStatValueProps): React.ReactElement => {
|
|
|
50
49
|
text = '',
|
|
51
50
|
unit = '',
|
|
52
51
|
value = 0,
|
|
53
|
-
variant = '
|
|
52
|
+
variant = 'default',
|
|
54
53
|
} = props
|
|
55
54
|
const ariaProps = buildAriaProps(aria)
|
|
56
55
|
const dataProps = buildDataProps(data)
|
|
57
56
|
const htmlProps = buildHtmlProps(htmlOptions)
|
|
58
57
|
const classes = classnames(
|
|
59
|
-
buildCss('pb_icon_stat_value_kit', orientation
|
|
58
|
+
buildCss('pb_icon_stat_value_kit', orientation), globalProps(props),
|
|
60
59
|
className
|
|
61
60
|
)
|
|
62
61
|
const titleSize = function(size: "sm" | "md" | "lg") {
|
|
@@ -101,6 +100,8 @@ const IconStatValue = (props: IconStatValueProps): React.ReactElement => {
|
|
|
101
100
|
<IconCircle
|
|
102
101
|
dark={dark}
|
|
103
102
|
icon={icon}
|
|
103
|
+
marginBottom={orientation == 'vertical' ? 'xs' : undefined}
|
|
104
|
+
marginRight={orientation == 'horizontal' ? 'sm' : undefined}
|
|
104
105
|
size={size}
|
|
105
106
|
variant={variant}
|
|
106
107
|
/>
|
|
@@ -9,8 +9,8 @@ module Playbook
|
|
|
9
9
|
values: %w[sm md lg],
|
|
10
10
|
default: "sm"
|
|
11
11
|
prop :variant, type: Playbook::Props::Enum,
|
|
12
|
-
values: %w[default royal blue purple teal red yellow green orange
|
|
13
|
-
default: "
|
|
12
|
+
values: %w[default royal blue purple teal red yellow green orange],
|
|
13
|
+
default: "default"
|
|
14
14
|
|
|
15
15
|
prop :orientation, type: Playbook::Props::Enum,
|
|
16
16
|
values: %w[vertical horizontal],
|
|
@@ -25,7 +25,7 @@ module Playbook
|
|
|
25
25
|
prop :value
|
|
26
26
|
|
|
27
27
|
def classname
|
|
28
|
-
generate_classname("pb_icon_stat_value_kit", orientation
|
|
28
|
+
generate_classname("pb_icon_stat_value_kit", orientation)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def value_string
|
|
@@ -41,6 +41,14 @@ module Playbook
|
|
|
41
41
|
3
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
|
+
|
|
45
|
+
def icon_margin_right
|
|
46
|
+
orientation === "horizontal" && "sm"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def icon_margin_bottom
|
|
50
|
+
orientation === "vertical" && "xs"
|
|
51
|
+
end
|
|
44
52
|
end
|
|
45
53
|
end
|
|
46
54
|
end
|
|
@@ -18,7 +18,7 @@ describe("IconStatValue Kit", () => {
|
|
|
18
18
|
)
|
|
19
19
|
|
|
20
20
|
const kit = screen.getByTestId(testId)
|
|
21
|
-
expect(kit).toHaveClass("
|
|
21
|
+
expect(kit).toHaveClass("pb_icon_stat_value_kit_horizontal")
|
|
22
22
|
})
|
|
23
23
|
|
|
24
24
|
test("renders icon", () => {
|
|
@@ -99,9 +99,10 @@ describe("IconStatValue Kit", () => {
|
|
|
99
99
|
value={64.18}
|
|
100
100
|
/>
|
|
101
101
|
)
|
|
102
|
-
|
|
102
|
+
const size = sizeProp === "sm" ? "3" : sizeProp === "md" ? "2" : "1"
|
|
103
103
|
const kit = screen.getByTestId(testId)
|
|
104
|
-
|
|
104
|
+
const title = kit.querySelector(".pb_title_kit")
|
|
105
|
+
expect(title).toHaveClass(`pb_title_${size}`)
|
|
105
106
|
|
|
106
107
|
cleanup()
|
|
107
108
|
})
|
|
@@ -115,8 +116,7 @@ describe("IconStatValue Kit", () => {
|
|
|
115
116
|
"teal",
|
|
116
117
|
"red",
|
|
117
118
|
"yellow",
|
|
118
|
-
"green"
|
|
119
|
-
"lighter"].forEach(
|
|
119
|
+
"green"].forEach(
|
|
120
120
|
(colorProp) => {
|
|
121
121
|
render(
|
|
122
122
|
<IconStatValue
|
|
@@ -128,9 +128,10 @@ describe("IconStatValue Kit", () => {
|
|
|
128
128
|
variant={colorProp}
|
|
129
129
|
/>
|
|
130
130
|
)
|
|
131
|
-
|
|
131
|
+
|
|
132
132
|
const kit = screen.getByTestId(testId)
|
|
133
|
-
|
|
133
|
+
const iconCircle = kit.querySelector(`.pb_icon_circle_kit_size_sm_${colorProp}`)
|
|
134
|
+
expect(iconCircle).toBeInTheDocument()
|
|
134
135
|
|
|
135
136
|
cleanup()
|
|
136
137
|
})
|
|
@@ -149,7 +150,7 @@ describe("IconStatValue Kit", () => {
|
|
|
149
150
|
)
|
|
150
151
|
|
|
151
152
|
const kit = screen.getByTestId(testId)
|
|
152
|
-
expect(kit).toHaveClass("
|
|
153
|
+
expect(kit).toHaveClass("pb_icon_stat_value_kit_vertical")
|
|
153
154
|
})
|
|
154
155
|
|
|
155
156
|
})
|