playbook_ui 13.34.1.pre.alpha.powerfontsexternal3403 → 14.0.0.pre.alpha.PBNTR415starratingform3492
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/Components/TableHeaderCell.tsx +5 -2
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +24 -20
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +17 -12
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +86 -1
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +30 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.jsx +67 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_avatar/_avatar.scss +0 -30
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +19 -1
- data/app/pb_kits/playbook/pb_avatar/avatar.rb +44 -1
- data/app/pb_kits/playbook/pb_avatar/avatar.test.js +17 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +3 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +1 -1
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
- data/app/pb_kits/playbook/pb_icon/_icon.tsx +3 -0
- data/app/pb_kits/playbook/pb_icon/icon.rb +2 -0
- data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.tsx +2 -1
- data/app/pb_kits/playbook/pb_icon_circle/icon_circle.rb +2 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.scss +0 -11
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.tsx +3 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.html.erb +1 -0
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.rb +2 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +5 -4
- data/app/pb_kits/playbook/pb_nav/_horizontal_nav.scss +1 -1
- data/app/pb_kits/playbook/pb_online_status/_online_status.scss +52 -5
- data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +6 -1
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.html.erb +1 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.jsx +14 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.html.erb +3 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.jsx +25 -0
- data/app/pb_kits/playbook/pb_online_status/docs/example.yml +6 -2
- data/app/pb_kits/playbook/pb_online_status/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_online_status/online_status.rb +11 -1
- data/app/pb_kits/playbook/pb_online_status/online_status.test.js +31 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.html.erb +61 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.jsx +70 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.md +1 -0
- data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -2
- data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +83 -6
- data/app/pb_kits/playbook/pb_star_rating/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_star_rating/index.js +128 -22
- data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +5 -3
- data/app/pb_kits/playbook/pb_star_rating/star_rating.rb +19 -2
- data/app/pb_kits/playbook/pb_star_rating/stars/utils.tsx +5 -1
- data/app/pb_kits/playbook/pb_star_rating/subcomponents/_star_rating_interactive.tsx +50 -21
- data/app/pb_kits/playbook/pb_table/_table.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/index.ts +4 -4
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_cell.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_head.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_header.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/table.test.js +2 -0
- data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +1 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +1 -1
- data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +45 -27
- data/app/pb_kits/playbook/pb_textarea/index.ts +3 -3
- data/app/pb_kits/playbook/pb_time/_time.tsx +3 -3
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +1 -1
- data/app/pb_kits/playbook/pb_timeline/_item.tsx +1 -1
- data/app/pb_kits/playbook/pb_timeline/_timeline.tsx +1 -1
- data/app/pb_kits/playbook/pb_title_detail/_title_detail.tsx +10 -10
- data/app/pb_kits/playbook/pb_toggle/_toggle.tsx +1 -1
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +2 -2
- data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +1 -2
- data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +2 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -2
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_multi_kit.html.erb +1 -1
- data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +1 -0
- data/app/pb_kits/playbook/pb_user/_user.tsx +1 -1
- data/app/pb_kits/playbook/pb_user_badge/_user_badge.tsx +6 -6
- data/app/pb_kits/playbook/pb_user_badge/badges/million-dollar.tsx +236 -235
- data/app/pb_kits/playbook/pb_user_badge/badges/veteran.tsx +1 -1
- data/app/pb_kits/playbook/pb_walkthrough/_walkthrough.tsx +68 -63
- data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +1 -1
- data/app/pb_kits/playbook/utilities/_positioning.scss +26 -15
- data/dist/chunks/{_typeahead-COUJ88EA.js → _typeahead-D6PRvP-1.js} +2 -2
- data/dist/chunks/{_weekday_stacked-BZu4elIU.js → _weekday_stacked-Dzgi_IL5.js} +2 -2
- data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
- data/dist/chunks/{lib-Bf_E03gc.js → lib-BE0Z3F7x.js} +1 -1
- data/dist/chunks/{pb_form_validation-D0dhqeN2.js → pb_form_validation-TzZQ0Flx.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- 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 +2 -2
- metadata +17 -8
- data/app/pb_kits/playbook/pb_online_status/_online_status_mixins.scss +0 -32
- data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
@@ -1,50 +1,156 @@
|
|
1
|
-
import PbEnhancedElement from "../pb_enhanced_element"
|
1
|
+
import PbEnhancedElement from "../pb_enhanced_element"
|
2
2
|
|
3
|
-
const
|
4
|
-
const
|
3
|
+
const STAR_RATING_WRAPPER_SELECTOR = "[data-pb-star-rating-wrapper]"
|
4
|
+
const STAR_RATING_SELECTOR = "[data-pb-star-rating]"
|
5
|
+
const STAR_RATING_INPUT_DATA_SELECTOR = "[data-pb-star-rating-input]"
|
5
6
|
|
6
7
|
export default class PbStarRating extends PbEnhancedElement {
|
7
8
|
static get selector() {
|
8
|
-
return
|
9
|
+
return STAR_RATING_WRAPPER_SELECTOR
|
9
10
|
}
|
10
11
|
|
11
12
|
connect() {
|
12
|
-
this.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
this.addEventListeners()
|
14
|
+
this.handleFormReset()
|
15
|
+
}
|
16
|
+
|
17
|
+
addEventListeners() {
|
18
|
+
this.element.querySelectorAll(STAR_RATING_SELECTOR).forEach(star => {
|
19
|
+
star.addEventListener("click", (event) => {
|
20
|
+
const clickedStarId = event.currentTarget.id
|
21
|
+
this.updateStarColors(clickedStarId)
|
22
|
+
this.updateHiddenInputValue(clickedStarId)
|
23
|
+
this.clearFormValidation()
|
24
|
+
})
|
25
|
+
|
26
|
+
star.addEventListener("mouseenter", (event) => {
|
27
|
+
const hoveredStarId = event.currentTarget.id
|
28
|
+
this.updateStarHoverColors(hoveredStarId)
|
29
|
+
})
|
30
|
+
|
31
|
+
star.addEventListener("mouseleave", () => {
|
32
|
+
this.removeStarHoverColors()
|
33
|
+
})
|
34
|
+
|
35
|
+
star.addEventListener("keydown", (event) => {
|
36
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
37
|
+
event.preventDefault()
|
38
|
+
this.handleStarClick(star.id)
|
39
|
+
}
|
40
|
+
})
|
41
|
+
})
|
42
|
+
}
|
43
|
+
|
44
|
+
handleStarClick(starId) {
|
45
|
+
this.updateStarColors(starId)
|
46
|
+
this.updateHiddenInputValue(starId)
|
17
47
|
}
|
18
48
|
|
19
49
|
updateStarColors(clickedStarId) {
|
20
|
-
const allStars =
|
50
|
+
const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
|
21
51
|
|
22
52
|
allStars.forEach(star => {
|
23
|
-
const starId = star.id
|
24
|
-
const icon = star.querySelector(".interactive-star-icon")
|
53
|
+
const starId = star.id
|
54
|
+
const icon = star.querySelector(".interactive-star-icon")
|
25
55
|
|
26
56
|
if (icon) {
|
27
57
|
if (starId <= clickedStarId) {
|
28
58
|
if (star.classList.contains("yellow_star")) {
|
29
|
-
icon.classList.add("yellow-star-selected")
|
30
|
-
} else if (star.classList.contains("
|
31
|
-
icon.classList.add("primary-star-selected")
|
32
|
-
} else if (star.classList.contains("
|
33
|
-
icon.classList.add("
|
59
|
+
icon.classList.add("yellow-star-selected")
|
60
|
+
} else if (star.classList.contains("primary_star_light")) {
|
61
|
+
icon.classList.add("primary-star-selected")
|
62
|
+
} else if (star.classList.contains("primary_star_dark")) {
|
63
|
+
icon.classList.add("primary-star-selected")
|
64
|
+
} else if (star.classList.contains("subtle_star_light")) {
|
65
|
+
icon.classList.add("subtle-star-selected")
|
66
|
+
} else if (star.classList.contains("subtle_star_dark")) {
|
67
|
+
icon.classList.add("subtle-star-selected")
|
34
68
|
} else {
|
35
|
-
icon.classList.add("yellow-star-selected")
|
69
|
+
icon.classList.add("yellow-star-selected")
|
36
70
|
}
|
37
71
|
} else {
|
38
|
-
icon.classList.remove("yellow-star-selected", "primary-star-selected", "
|
72
|
+
icon.classList.remove("yellow-star-selected", "primary-star-selected", "subtle-star-selected")
|
39
73
|
}
|
74
|
+
icon.classList.remove("star-hovered")
|
40
75
|
}
|
41
|
-
})
|
76
|
+
})
|
42
77
|
}
|
43
78
|
|
44
79
|
updateHiddenInputValue(value) {
|
45
|
-
const hiddenInput =
|
80
|
+
const hiddenInput = this.element.querySelector(STAR_RATING_INPUT_DATA_SELECTOR)
|
46
81
|
if (hiddenInput) {
|
47
|
-
hiddenInput.value = value
|
82
|
+
hiddenInput.value = value
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
updateStarHoverColors(hoveredStarId) {
|
87
|
+
const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
|
88
|
+
|
89
|
+
allStars.forEach(star => {
|
90
|
+
const starId = star.id
|
91
|
+
const icon = star.querySelector(".interactive-star-icon")
|
92
|
+
|
93
|
+
if (icon) {
|
94
|
+
if (starId <= hoveredStarId) {
|
95
|
+
if (!icon.classList.contains("yellow-star-selected") &&
|
96
|
+
!icon.classList.contains("primary-star-selected") &&
|
97
|
+
!icon.classList.contains("subtle-star-selected")) {
|
98
|
+
icon.classList.add("star-hovered")
|
99
|
+
}
|
100
|
+
} else {
|
101
|
+
icon.classList.remove("star-hovered")
|
102
|
+
}
|
103
|
+
}
|
104
|
+
})
|
105
|
+
}
|
106
|
+
|
107
|
+
|
108
|
+
removeStarHoverColors() {
|
109
|
+
const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
|
110
|
+
|
111
|
+
allStars.forEach(star => {
|
112
|
+
const icon = star.querySelector(".interactive-star-icon")
|
113
|
+
if (icon) {
|
114
|
+
if (!icon.classList.contains("yellow-star-selected") &&
|
115
|
+
!icon.classList.contains("primary-star-selected") &&
|
116
|
+
!icon.classList.contains("subtle-star-selected")) {
|
117
|
+
icon.classList.remove("star-hovered")
|
118
|
+
}
|
119
|
+
}
|
120
|
+
})
|
121
|
+
}
|
122
|
+
|
123
|
+
isStarSelected() {
|
124
|
+
return this.element.querySelectorAll(".yellow-star-selected, .primary-star-selected, .subtle-star-selected").length > 0
|
125
|
+
}
|
126
|
+
|
127
|
+
handleFormReset() {
|
128
|
+
const form = this.element.closest("form")
|
129
|
+
if (form) {
|
130
|
+
form.addEventListener("reset", () => {
|
131
|
+
this.updateHiddenInputValue("")
|
132
|
+
this.resetStarRatingValues()
|
133
|
+
})
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
resetStarRatingValues() {
|
138
|
+
const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
|
139
|
+
allStars.forEach(star => {
|
140
|
+
const icon = star.querySelector(".interactive-star-icon")
|
141
|
+
if (icon) {
|
142
|
+
icon.classList.remove("yellow-star-selected", "primary-star-selected", "subtle-star-selected")
|
143
|
+
}
|
144
|
+
})
|
145
|
+
}
|
146
|
+
|
147
|
+
clearFormValidation() {
|
148
|
+
const hiddenInput = this.element.querySelector(STAR_RATING_INPUT_DATA_SELECTOR)
|
149
|
+
if (hiddenInput.checkValidity()) {
|
150
|
+
const errorLabelElement = this.element.querySelector(".pb_body_kit_negative")
|
151
|
+
if (errorLabelElement) {
|
152
|
+
errorLabelElement.remove()
|
153
|
+
}
|
48
154
|
}
|
49
155
|
}
|
50
156
|
}
|
@@ -39,15 +39,17 @@
|
|
39
39
|
<% end %>
|
40
40
|
|
41
41
|
<% else %>
|
42
|
-
<%= pb_rails("flex", props: { orientation: "column" }) do %>
|
42
|
+
<%= pb_rails("flex", props: { data: {"pb-star-rating-wrapper": "true" }, orientation: "column" }) do %>
|
43
43
|
<% if object.label.present? %>
|
44
44
|
<%= pb_rails("caption", props: {text: object.label, margin_bottom:"xs"}) %>
|
45
45
|
<% end %>
|
46
|
-
|
46
|
+
|
47
|
+
<%= hidden_input_tag %>
|
48
|
+
|
47
49
|
<%= pb_rails("flex", props: { orientation: "row" }) do %>
|
48
50
|
<% object.denominator.times do |index| %>
|
49
51
|
<div data-pb-star-rating id="<%= index + 1 %>" class="<%= star_color %>">
|
50
|
-
<%= pb_rails("icon", props: { classname: "#{background_star_color} pb_star_#{size} interactive-star-icon", custom_icon: Playbook::Engine.root.join(background_star_path)} ) %>
|
52
|
+
<%= pb_rails("icon", props: { classname: "#{background_star_color} pb_star_#{size} interactive-star-icon", custom_icon: Playbook::Engine.root.join(background_star_path), tabindex: 0 } ) %>
|
51
53
|
</div>
|
52
54
|
<% end %>
|
53
55
|
<% end %>
|
@@ -30,6 +30,10 @@ module Playbook
|
|
30
30
|
default: "display"
|
31
31
|
prop :label, type: Playbook::Props::String
|
32
32
|
prop :name, type: Playbook::Props::String
|
33
|
+
prop :required, type: Playbook::Props::Boolean,
|
34
|
+
default: false
|
35
|
+
prop :input_options, type: Playbook::Props::HashProp,
|
36
|
+
default: {}
|
33
37
|
|
34
38
|
def one_decimal_rating
|
35
39
|
rating.to_f.round(1)
|
@@ -52,9 +56,9 @@ module Playbook
|
|
52
56
|
when "yellow"
|
53
57
|
"yellow_star"
|
54
58
|
when "primary"
|
55
|
-
"
|
59
|
+
dark ? "primary_star_dark" : "primary_star_light"
|
56
60
|
when "subtle"
|
57
|
-
dark ? "
|
61
|
+
dark ? "subtle_star_dark" : "subtle_star_light"
|
58
62
|
end
|
59
63
|
end
|
60
64
|
|
@@ -106,6 +110,19 @@ module Playbook
|
|
106
110
|
def classname
|
107
111
|
generate_classname("pb_star_rating_kit")
|
108
112
|
end
|
113
|
+
|
114
|
+
def hidden_input_tag
|
115
|
+
tag(:input, all_input_options)
|
116
|
+
end
|
117
|
+
|
118
|
+
def all_input_options
|
119
|
+
input_options.merge(
|
120
|
+
data: { "pb-star-rating-input": true },
|
121
|
+
name: name,
|
122
|
+
required: required,
|
123
|
+
style: "display: none"
|
124
|
+
)
|
125
|
+
end
|
109
126
|
end
|
110
127
|
end
|
111
128
|
end
|
@@ -53,7 +53,11 @@ const starOutline = (
|
|
53
53
|
)
|
54
54
|
|
55
55
|
export const getStarIconObject = (backgroundType: string, color: string, dark: boolean, size: string) => {
|
56
|
-
const colorClassName = color === "subtle"
|
56
|
+
const colorClassName = color === "subtle"
|
57
|
+
? (dark ? "suble_star_dark" : "suble_star_light")
|
58
|
+
: color === "primary"
|
59
|
+
? (dark ? "primary_star_dark" : "primary_star_light")
|
60
|
+
: `${color}_star`
|
57
61
|
const backgroundClassName = backgroundType === "outline" ? (dark ? "outline_empty_star_dark" : "outline_empty_star_light") : (dark ? "empty_star_dark" : "empty_star_light")
|
58
62
|
|
59
63
|
return {
|
@@ -23,40 +23,69 @@ const StarRatingInteractive = (props: StarRatingInteractiveProps) => {
|
|
23
23
|
size,
|
24
24
|
} = props
|
25
25
|
const [interactiveStarValue, setInteractiveStarValue] = useState(0)
|
26
|
+
const [hoverStarValue, setHoverStarValue] = useState<number | null>(null)
|
26
27
|
const starIcon = getStarIconObject(backgroundType, colorOption, dark, size)
|
27
28
|
|
28
29
|
const handleOnClick = (interactiveStarValue: number) => {
|
29
30
|
setInteractiveStarValue(interactiveStarValue)
|
30
31
|
onClick && onClick(interactiveStarValue)
|
31
32
|
}
|
33
|
+
const handleMouseEnter = (value: number) => {
|
34
|
+
setHoverStarValue(value);
|
35
|
+
}
|
36
|
+
const handleMouseLeave = () => {
|
37
|
+
setHoverStarValue(null);
|
38
|
+
}
|
39
|
+
const handleOnKeyDown = (event: React.KeyboardEvent<HTMLDivElement>, starIndex: number) => {
|
40
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
41
|
+
event.preventDefault()
|
42
|
+
handleOnClick(starIndex)
|
43
|
+
}
|
44
|
+
}
|
32
45
|
|
33
46
|
return (
|
34
47
|
<Flex className="star_flex_area">
|
35
|
-
{[...Array(denominator)].map((_, index) =>
|
36
|
-
|
37
|
-
|
48
|
+
{[...Array(denominator)].map((_, index) => {
|
49
|
+
const starIndex = index + 1
|
50
|
+
const isFilled = starIndex <= interactiveStarValue
|
51
|
+
const isHovered = hoverStarValue !== null && starIndex > interactiveStarValue && starIndex <= hoverStarValue
|
52
|
+
|
53
|
+
const baseClass = dark
|
54
|
+
? starIcon[backgroundType].className.replace("empty_star_light", "empty_star_dark")
|
55
|
+
: starIcon[backgroundType].className
|
56
|
+
|
57
|
+
let starClass = baseClass
|
58
|
+
if (isFilled) {
|
59
|
+
starClass = starClass.replace(/(empty_star_light|empty_star_dark)/, '')
|
60
|
+
starClass += ` ${starIcon[colorOption].className}`
|
61
|
+
}
|
62
|
+
if (isHovered) {
|
63
|
+
starClass += " star-hovered"
|
64
|
+
}
|
65
|
+
if (isFilled && starIndex === interactiveStarValue) {
|
66
|
+
starClass += " star-selected"
|
67
|
+
}
|
68
|
+
|
69
|
+
return (
|
70
|
+
<div
|
71
|
+
key={index}
|
72
|
+
onKeyDown={(event) => handleOnKeyDown(event, starIndex)}
|
73
|
+
>
|
38
74
|
<Icon
|
39
|
-
className={
|
75
|
+
className={starClass.trim()}
|
40
76
|
cursor="pointer"
|
41
|
-
customIcon={starIcon[
|
42
|
-
htmlOptions={{
|
77
|
+
customIcon={starIcon[backgroundType].icon as unknown as { [key: string]: SVGElement }}
|
78
|
+
htmlOptions={{
|
79
|
+
onClick: () => handleOnClick(starIndex),
|
80
|
+
onMouseEnter: () => handleMouseEnter(starIndex),
|
81
|
+
onMouseLeave: () => handleMouseLeave(),
|
82
|
+
}}
|
43
83
|
icon=""
|
84
|
+
tabIndex={0}
|
44
85
|
/>
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
<React.Fragment key={index}>
|
49
|
-
<Icon
|
50
|
-
className={starIcon[backgroundType].className}
|
51
|
-
cursor="pointer"
|
52
|
-
customIcon={starIcon[backgroundType].icon as unknown as { [key: string]: SVGElement }}
|
53
|
-
htmlOptions={{ onClick: () => handleOnClick(index + 1) }}
|
54
|
-
icon=""
|
55
|
-
/>
|
56
|
-
</React.Fragment>
|
57
|
-
)}
|
58
|
-
</React.Fragment>
|
59
|
-
))}
|
86
|
+
</div>
|
87
|
+
);
|
88
|
+
})}
|
60
89
|
</Flex>
|
61
90
|
)
|
62
91
|
}
|
@@ -1,19 +1,19 @@
|
|
1
1
|
import PbEnhancedElement from '../pb_enhanced_element'
|
2
2
|
|
3
3
|
export default class PbTable extends PbEnhancedElement {
|
4
|
-
static get selector() {
|
4
|
+
static get selector(): string {
|
5
5
|
return '.table-responsive-collapse'
|
6
6
|
}
|
7
7
|
|
8
|
-
connect() {
|
8
|
+
connect(): void {
|
9
9
|
const tables = document.querySelectorAll('.table-responsive-collapse');
|
10
10
|
|
11
11
|
// Each Table
|
12
12
|
[].forEach.call(tables, (table: HTMLTableElement) => {
|
13
13
|
// Header Titles
|
14
|
-
|
14
|
+
const headers: string[] = [];
|
15
15
|
[].forEach.call(table.querySelectorAll('th'), (header: HTMLTableCellElement) => {
|
16
|
-
|
16
|
+
const colSpan = header.colSpan
|
17
17
|
for (let i = 0; i < colSpan; i++) {
|
18
18
|
headers.push(header.textContent.replace(/\r?\n|\r/, ''));
|
19
19
|
}
|
@@ -5,12 +5,12 @@ import TextInput from '../../pb_text_input/_text_input'
|
|
5
5
|
import Title from '../../pb_title/_title'
|
6
6
|
|
7
7
|
const TextInputDefault = (props) => {
|
8
|
+
const [firstName, setFirstName] = useState('')
|
8
9
|
const handleOnChangeFirstName = ({ target }) => {
|
9
10
|
setFirstName(target.value)
|
10
11
|
}
|
11
12
|
const ref = React.createRef()
|
12
13
|
|
13
|
-
const [firstName, setFirstName] = useState('')
|
14
14
|
const [formFields, setFormFields] = useState({
|
15
15
|
firstName: 'Jane',
|
16
16
|
lastName: 'Doe',
|
@@ -52,14 +52,15 @@ const Textarea = ({
|
|
52
52
|
label,
|
53
53
|
maxCharacters,
|
54
54
|
name,
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
55
56
|
onChange = () => {},
|
56
57
|
placeholder,
|
57
58
|
required,
|
58
59
|
rows = 4,
|
59
60
|
value,
|
60
61
|
...props
|
61
|
-
}: TextareaProps
|
62
|
-
ref = useRef<HTMLTextAreaElement>(null)
|
62
|
+
}: TextareaProps) => {
|
63
|
+
const ref = useRef<HTMLTextAreaElement>(null)
|
63
64
|
useEffect(() => {
|
64
65
|
if (ref.current && resize === 'auto') {
|
65
66
|
PbTextarea.addMatch(ref.current)
|
@@ -71,58 +72,75 @@ const Textarea = ({
|
|
71
72
|
const resizeClass = `resize_${resize}`
|
72
73
|
const classes = classnames('pb_textarea_kit', errorClass, inlineClass, resizeClass, globalProps(props), className)
|
73
74
|
const noCount = typeof characterCount !== 'undefined'
|
74
|
-
const ariaProps: {[key: string]:
|
75
|
-
const dataProps: {[key: string]:
|
75
|
+
const ariaProps: {[key: string]: string} = buildAriaProps(aria)
|
76
|
+
const dataProps: {[key: string]: string} = buildDataProps(data)
|
76
77
|
const htmlProps = buildHtmlProps(htmlOptions)
|
77
|
-
const characterCounter = () => {
|
78
|
-
return maxCharacters && characterCount ? `${checkIfZero(characterCount)} / ${maxCharacters}` : `${checkIfZero(characterCount)}`
|
79
|
-
}
|
80
|
-
|
81
78
|
const checkIfZero = (characterCount: string | number) => {
|
82
79
|
return characterCount == 0 ? characterCount.toString() : characterCount
|
83
80
|
}
|
81
|
+
const characterCounter = () => {
|
82
|
+
return maxCharacters && characterCount ? `${checkIfZero(characterCount)} / ${maxCharacters}` : `${checkIfZero(characterCount)}`
|
83
|
+
}
|
84
84
|
|
85
85
|
return (
|
86
86
|
<div
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
87
|
+
{...ariaProps}
|
88
|
+
{...dataProps}
|
89
|
+
{...htmlProps}
|
90
|
+
className={classes}
|
91
91
|
>
|
92
92
|
<Caption text={label} />
|
93
93
|
{children || (
|
94
94
|
<textarea
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
95
|
+
className="pb_textarea_kit"
|
96
|
+
disabled={disabled}
|
97
|
+
name={name}
|
98
|
+
onChange={onChange}
|
99
|
+
placeholder={placeholder}
|
100
|
+
ref={ref}
|
101
|
+
required={required}
|
102
|
+
rows={rows}
|
103
|
+
value={value}
|
104
|
+
{...props}
|
105
105
|
/>
|
106
106
|
)}
|
107
107
|
|
108
108
|
{error ? (
|
109
109
|
<>
|
110
110
|
{characterCount ? (
|
111
|
-
<Flex
|
111
|
+
<Flex
|
112
|
+
spacing="between"
|
113
|
+
vertical="center"
|
114
|
+
>
|
112
115
|
<FlexItem>
|
113
|
-
<Body
|
116
|
+
<Body
|
117
|
+
margin="none"
|
118
|
+
status="negative"
|
119
|
+
text={error}
|
120
|
+
/>
|
114
121
|
</FlexItem>
|
115
122
|
<FlexItem>
|
116
|
-
<Caption
|
123
|
+
<Caption
|
124
|
+
margin="none"
|
125
|
+
size="xs"
|
126
|
+
text={characterCounter()}
|
127
|
+
/>
|
117
128
|
</FlexItem>
|
118
129
|
</Flex>
|
119
130
|
) : (
|
120
|
-
<Body
|
131
|
+
<Body
|
132
|
+
status="negative"
|
133
|
+
text={error}
|
134
|
+
/>
|
121
135
|
)}
|
122
136
|
</>
|
123
137
|
) : (
|
124
138
|
noCount && (
|
125
|
-
<Caption
|
139
|
+
<Caption
|
140
|
+
margin="none"
|
141
|
+
size="xs"
|
142
|
+
text={characterCounter()}
|
143
|
+
/>
|
126
144
|
)
|
127
145
|
)}
|
128
146
|
</div>
|
@@ -3,16 +3,16 @@ import PbEnhancedElement from '../pb_enhanced_element'
|
|
3
3
|
export default class PbTextarea extends PbEnhancedElement {
|
4
4
|
style: {[key: string]: string}
|
5
5
|
scrollHeight: string
|
6
|
-
static get selector() {
|
6
|
+
static get selector(): string {
|
7
7
|
return '.resize_auto textarea'
|
8
8
|
}
|
9
9
|
|
10
|
-
onInput() {
|
10
|
+
onInput(): void {
|
11
11
|
this.style.height = 'auto'
|
12
12
|
this.style.height = (this.scrollHeight) + 'px'
|
13
13
|
}
|
14
14
|
|
15
|
-
connect() {
|
15
|
+
connect(): void {
|
16
16
|
this.element.setAttribute('style', 'height:' + (this.element.scrollHeight) + 'px;overflow-y:hidden;')
|
17
17
|
this.element.addEventListener('input', this.onInput, false)
|
18
18
|
}
|
@@ -24,7 +24,7 @@ type TimeProps = {
|
|
24
24
|
unstyled?: boolean;
|
25
25
|
} & GlobalProps
|
26
26
|
|
27
|
-
const Time = (props: TimeProps) => {
|
27
|
+
const Time = (props: TimeProps): React.ReactElement => {
|
28
28
|
const {
|
29
29
|
align,
|
30
30
|
className,
|
@@ -47,8 +47,8 @@ const Time = (props: TimeProps) => {
|
|
47
47
|
|
48
48
|
return (
|
49
49
|
<div
|
50
|
-
|
51
|
-
|
50
|
+
{...htmlProps}
|
51
|
+
className={classes}
|
52
52
|
>
|
53
53
|
{showIcon && (
|
54
54
|
unstyled
|
@@ -36,7 +36,7 @@ const dateTimeIso = (dateValue: Date) => {
|
|
36
36
|
return DateTime.toIso(dateValue)
|
37
37
|
}
|
38
38
|
|
39
|
-
const TimeRangeInline = (props: TimeRangeInlineProps) => {
|
39
|
+
const TimeRangeInline = (props: TimeRangeInlineProps): React.ReactElement => {
|
40
40
|
const {
|
41
41
|
aria = {},
|
42
42
|
className,
|
@@ -26,7 +26,7 @@ const TimelineItem = ({
|
|
26
26
|
iconColor = 'default',
|
27
27
|
lineStyle = 'solid',
|
28
28
|
...props
|
29
|
-
}: ItemProps) => {
|
29
|
+
}: ItemProps): React.ReactElement => {
|
30
30
|
const timelineItemCss = buildCss('pb_timeline_item_kit', lineStyle)
|
31
31
|
|
32
32
|
const htmlProps = buildHtmlProps(htmlOptions)
|
@@ -27,7 +27,7 @@ const Timeline = ({
|
|
27
27
|
orientation = 'horizontal',
|
28
28
|
showDate = false,
|
29
29
|
...props
|
30
|
-
}: TimelineProps) => {
|
30
|
+
}: TimelineProps): React.ReactElement => {
|
31
31
|
const ariaProps = buildAriaProps(aria)
|
32
32
|
const dataProps = buildDataProps(data)
|
33
33
|
const htmlProps = buildHtmlProps(htmlOptions)
|