playbook_ui 15.0.0.pre.alpha.PLAY2316advancedtablerightsidedoubleborder10726 → 15.0.0.pre.alpha.PLAY2361datepickerarrownav10322
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/_playbook.scss +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +11 -24
- data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +7 -7
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +2 -7
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +13 -67
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.html.erb +2 -4
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.jsx +9 -12
- data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_card/_card.scss +4 -12
- data/app/pb_kits/playbook/pb_card/_card.tsx +3 -3
- data/app/pb_kits/playbook/pb_card/_card_mixin.scss +0 -10
- data/app/pb_kits/playbook/pb_card/docs/_card_highlight.html.erb +0 -3
- data/app/pb_kits/playbook/pb_card/docs/_card_highlight.jsx +0 -8
- data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.tsx +0 -2
- data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.html.erb +0 -1
- data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +0 -1
- data/app/pb_kits/playbook/pb_contact/_contact.tsx +0 -5
- data/app/pb_kits/playbook/pb_contact/contact.rb +0 -4
- data/app/pb_kits/playbook/pb_contact/contact.test.js +1 -21
- data/app/pb_kits/playbook/pb_contact/docs/_contact_default.html.erb +1 -16
- data/app/pb_kits/playbook/pb_contact/docs/_contact_default.jsx +0 -15
- data/app/pb_kits/playbook/pb_contact/docs/_contact_with_detail.html.erb +0 -6
- data/app/pb_kits/playbook/pb_contact/docs/_contact_with_detail.jsx +0 -6
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +4 -6
- data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +5 -37
- data/app/pb_kits/playbook/pb_dialog/_close_icon.tsx +1 -5
- data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +8 -6
- data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +1 -1
- data/app/pb_kits/playbook/pb_dialog/dialogHelper.js +65 -0
- data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +2 -2
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +0 -9
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.html.erb +3 -3
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +0 -1
- data/app/pb_kits/playbook/pb_icon/_icon.tsx +2 -13
- data/app/pb_kits/playbook/pb_icon/icon.rb +1 -9
- data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +0 -1
- data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +1 -2
- data/app/pb_kits/playbook/pb_icon_circle/icon_circle.html.erb +1 -1
- data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +1 -3
- data/app/pb_kits/playbook/pb_loading_inline/docs/example.yml +0 -2
- data/app/pb_kits/playbook/pb_loading_inline/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_loading_inline/loading_inline.html.erb +1 -1
- data/app/pb_kits/playbook/pb_loading_inline/loading_inline.rb +0 -11
- data/app/pb_kits/playbook/pb_nav/_item.tsx +5 -19
- data/app/pb_kits/playbook/pb_nav/item.html.erb +2 -6
- data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_breached.html.erb +3 -3
- data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_common.html.erb +3 -3
- data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_confirmation.html.erb +3 -3
- data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.html.erb +3 -3
- data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_strength_change.html.erb +3 -3
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.html.erb +2 -2
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +5 -13
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.html.erb +0 -23
- data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.jsx +7 -45
- data/app/pb_kits/playbook/pb_section_separator/section_separator.html.erb +1 -4
- data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +0 -3
- data/app/pb_kits/playbook/pb_text_input/docs/example.yml +0 -3
- data/app/pb_kits/playbook/pb_text_input/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_text_input/text_input.rb +3 -2
- data/app/pb_kits/playbook/pb_text_input/text_input.test.js +0 -38
- data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +8 -24
- data/app/pb_kits/playbook/pb_timestamp/docs/_time_stamp_default.md +1 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_align.html.erb +10 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_align.jsx +9 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_default.html.erb +17 -3
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_default.jsx +15 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_elapsed.html.erb +2 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_elapsed.jsx +2 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_timezones.html.erb +14 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_timezones.jsx +14 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_unstyled.html.erb +4 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_unstyled.jsx +4 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated.jsx +1 -0
- data/app/pb_kits/playbook/pb_timestamp/docs/example.yml +6 -18
- data/app/pb_kits/playbook/pb_timestamp/docs/index.js +0 -6
- data/app/pb_kits/playbook/pb_timestamp/timestamp.rb +7 -29
- data/app/pb_kits/playbook/pb_timestamp/timestamp.test.js +4 -69
- data/dist/chunks/{_line_graph-DeH7NK-i.js → _line_graph-DHO-uYxy.js} +1 -1
- data/dist/chunks/_typeahead-_kMvPVfz.js +6 -0
- data/dist/chunks/_weekday_stacked-B1esXFeA.js +37 -0
- data/dist/chunks/{lib-QZuu1ltS.js → lib-C43ywQsO.js} +1 -1
- data/dist/chunks/{pb_form_validation-CleM960_.js → pb_form_validation-Cqj3itLG.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +1 -15
- 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/engine.rb +1 -0
- data/lib/playbook/forms/builder/form_field_builder.rb +2 -37
- data/lib/playbook/kit_base.rb +2 -23
- data/lib/playbook/version.rb +1 -1
- metadata +28 -108
- data/app/pb_kits/playbook/pb_contact/docs/_contact_default.md +0 -5
- data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_variant.html.erb +0 -5
- data/app/pb_kits/playbook/pb_loading_inline/docs/_loading_inline_variant.jsx +0 -24
- data/app/pb_kits/playbook/pb_pb_bar_graph/_pb_bar_graph.scss +0 -0
- data/app/pb_kits/playbook/pb_pb_bar_graph/_pb_bar_graph.tsx +0 -62
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_colors.html.erb +0 -35
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_colors.jsx +0 -49
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_colors_rails.md +0 -1
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_colors_react.md +0 -2
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_default.html.erb +0 -38
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_default.jsx +0 -51
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_height.html.erb +0 -46
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_height.jsx +0 -62
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_height.md +0 -3
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_horizontal.html.erb +0 -47
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_horizontal.jsx +0 -60
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend.html.erb +0 -25
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend.jsx +0 -36
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend_non_clickable.jsx +0 -44
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend_position.html.erb +0 -100
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_legend_position.jsx +0 -126
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_negative_numbers.html.erb +0 -32
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_negative_numbers.jsx +0 -48
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_secondary_y_axis.html.erb +0 -68
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_secondary_y_axis.jsx +0 -81
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_spline.html.erb +0 -31
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_spline.jsx +0 -42
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_spline.md +0 -2
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_stacked.html.erb +0 -35
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/_pb_bar_graph_stacked.jsx +0 -51
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/example.yml +0 -27
- data/app/pb_kits/playbook/pb_pb_bar_graph/docs/index.js +0 -11
- data/app/pb_kits/playbook/pb_pb_bar_graph/pbBarGraphTheme.ts +0 -106
- data/app/pb_kits/playbook/pb_pb_bar_graph/pb_bar_graph.html.erb +0 -1
- data/app/pb_kits/playbook/pb_pb_bar_graph/pb_bar_graph.rb +0 -28
- data/app/pb_kits/playbook/pb_pb_bar_graph/pbbargraph.test.jsx +0 -31
- data/app/pb_kits/playbook/pb_pb_circle_chart/_pb_circle_chart.scss +0 -3
- data/app/pb_kits/playbook/pb_pb_circle_chart/_pb_circle_chart.tsx +0 -62
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_block_content.html.erb +0 -31
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_block_content.jsx +0 -81
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_color_overrides.html.erb +0 -25
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_color_overrides.jsx +0 -40
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_color_overrides.md +0 -5
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_custom_tooltip.html.erb +0 -27
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_custom_tooltip.jsx +0 -39
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_custom_tooltip.md +0 -5
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_legend_position.html.erb +0 -93
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_legend_position.jsx +0 -131
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_legend_position.md +0 -14
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_with_labels.html.erb +0 -42
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_with_labels.jsx +0 -58
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_with_legend.html.erb +0 -24
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_data_with_legend.jsx +0 -38
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_default.html.erb +0 -22
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_default.jsx +0 -33
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_inner_sizes.html.erb +0 -118
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_inner_sizes.jsx +0 -144
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_live_data.jsx +0 -60
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_rounded.html.erb +0 -24
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_rounded.jsx +0 -42
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_with_title.html.erb +0 -38
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/_pb_circle_chart_with_title.jsx +0 -52
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/example.yml +0 -29
- data/app/pb_kits/playbook/pb_pb_circle_chart/docs/index.js +0 -11
- data/app/pb_kits/playbook/pb_pb_circle_chart/pbCircleChartTheme.ts +0 -88
- data/app/pb_kits/playbook/pb_pb_circle_chart/pb_circle_chart.html.erb +0 -1
- data/app/pb_kits/playbook/pb_pb_circle_chart/pb_circle_chart.rb +0 -28
- data/app/pb_kits/playbook/pb_pb_circle_chart/pb_circle_chart.test.jsx +0 -51
- data/app/pb_kits/playbook/pb_section_separator/section_separator.test.js +0 -165
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_autocomplete.html.erb +0 -41
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_autocomplete.jsx +0 -80
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_autocomplete.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_align.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_default.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_elapsed.md +0 -5
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_current_year.html.erb +0 -12
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_current_year.jsx +0 -25
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_current_year.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_date.html.erb +0 -4
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_date.jsx +0 -17
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_date.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_time.html.erb +0 -18
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_time.jsx +0 -44
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_show_time.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_timezones.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated.md +0 -5
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_current_year.html.erb +0 -16
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_current_year.jsx +0 -30
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_current_year.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_date.html.erb +0 -16
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_date.jsx +0 -30
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_date.md +0 -1
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_time.html.erb +0 -26
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_time.jsx +0 -41
- data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_show_time.md +0 -1
- data/dist/chunks/_typeahead-CCGp0OQe.js +0 -6
- data/dist/chunks/_weekday_stacked-Dy1jab6x.js +0 -37
- data/dist/chunks/componentRegistry-DzmmLR2x.js +0 -1
@@ -28,21 +28,6 @@ const ContactDefault = (props) => {
|
|
28
28
|
contactValue="3245627482"
|
29
29
|
{...props}
|
30
30
|
/>
|
31
|
-
<Contact
|
32
|
-
contactType="wrong-phone"
|
33
|
-
contactValue="2124396666"
|
34
|
-
{...props}
|
35
|
-
/>
|
36
|
-
<Contact
|
37
|
-
contactType='extension'
|
38
|
-
contactValue="1234"
|
39
|
-
{...props}
|
40
|
-
/>
|
41
|
-
<Contact
|
42
|
-
contactType="international"
|
43
|
-
contactValue="+44 7700 900461"
|
44
|
-
{...props}
|
45
|
-
/>
|
46
31
|
</div>
|
47
32
|
)
|
48
33
|
}
|
@@ -210,12 +210,10 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
|
|
210
210
|
className="input_wrapper"
|
211
211
|
>
|
212
212
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
/>
|
218
|
-
)}
|
213
|
+
<Caption
|
214
|
+
className="pb_date_picker_kit_label"
|
215
|
+
text={hideLabel ? null : label}
|
216
|
+
/>
|
219
217
|
<>
|
220
218
|
<div className="date_picker_input_wrapper">
|
221
219
|
<input
|
@@ -89,44 +89,12 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
|
|
89
89
|
}
|
90
90
|
}
|
91
91
|
|
92
|
-
// Helper function to get min/max years based on yearRange. If minDate/maxDate provided, grab year from those values
|
93
|
-
const getMinMaxYears = () => {
|
94
|
-
const [minYear, maxYear] = yearRange;
|
95
|
-
|
96
|
-
const extractYear = (dateOption: typeof minDate | typeof maxDate): number | null => {
|
97
|
-
if (!dateOption) return null;
|
98
|
-
|
99
|
-
// If it's already a number, assume it's a year
|
100
|
-
if (typeof dateOption === 'number') {
|
101
|
-
return dateOption;
|
102
|
-
}
|
103
|
-
|
104
|
-
// If it's a string, extract year with regex
|
105
|
-
if (typeof dateOption === 'string') {
|
106
|
-
const match = dateOption.match(/\b(19|20)\d{2}\b/);
|
107
|
-
return match ? parseInt(match[0], 10) : null;
|
108
|
-
}
|
109
|
-
|
110
|
-
// If it's a Date object, get the year directly
|
111
|
-
if (dateOption instanceof Date) {
|
112
|
-
return dateOption.getFullYear();
|
113
|
-
}
|
114
|
-
|
115
|
-
return null;
|
116
|
-
};
|
117
|
-
|
118
|
-
const setMinYear = minDate ? (extractYear(minDate) ?? minYear) : minYear;
|
119
|
-
const setMaxYear = maxDate ? (extractYear(maxDate) ?? maxYear) : maxYear;
|
120
|
-
|
121
|
-
return { setMinYear, setMaxYear };
|
122
|
-
};
|
123
|
-
|
124
|
-
const { setMinYear, setMaxYear } = getMinMaxYears()
|
125
|
-
|
126
92
|
// Helper function to get min/max dates based on yearRange
|
127
93
|
const getMinMaxDates = () => {
|
128
|
-
const
|
129
|
-
|
94
|
+
const [minYear, maxYear] = yearRange
|
95
|
+
|
96
|
+
const setMinDate = minDate || `01/01/${minYear}`
|
97
|
+
const setMaxDate = maxDate || `12/31/${maxYear}`
|
130
98
|
|
131
99
|
return { setMinDate, setMaxDate }
|
132
100
|
}
|
@@ -294,7 +262,7 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
|
|
294
262
|
|
295
263
|
// create html option tags for desired years
|
296
264
|
let years = ''
|
297
|
-
for (let year =
|
265
|
+
for (let year = yearRange[1]; year >= yearRange[0]; year--) {
|
298
266
|
years += `<option value="${year}">${year}</option>`
|
299
267
|
}
|
300
268
|
|
@@ -12,14 +12,10 @@ export const CloseIcon = (props: CloseIconProps): React.ReactElement => {
|
|
12
12
|
const timesIcon = getAllIcons()["times"]
|
13
13
|
return (
|
14
14
|
<div
|
15
|
-
aria-label="Close Dialog"
|
16
15
|
className="pb_dialog_close_icon"
|
17
|
-
onClick={onClose}
|
18
|
-
role="button"
|
19
|
-
tabIndex={0}
|
16
|
+
onClick={onClose}
|
20
17
|
>
|
21
18
|
<Icon
|
22
|
-
aria={{ "hidden": true }}
|
23
19
|
className="svg-inline--fa"
|
24
20
|
customIcon={timesIcon.icon as unknown as { [key: string]: SVGElement }}
|
25
21
|
fixedWidth
|
@@ -73,8 +73,8 @@ const Dialog = (props: DialogProps): React.ReactElement => {
|
|
73
73
|
const ariaProps = buildAriaProps(aria);
|
74
74
|
const dataProps = buildDataProps(data)
|
75
75
|
const htmlProps = buildHtmlProps(htmlOptions);
|
76
|
-
const
|
77
|
-
base: classnames("pb_dialog", buildCss("pb_dialog", size, placement)
|
76
|
+
const dialogClassNames = {
|
77
|
+
base: classnames("pb_dialog", buildCss("pb_dialog", size, placement)),
|
78
78
|
afterOpen: "pb_dialog_after_open",
|
79
79
|
beforeClose: "pb_dialog_before_close",
|
80
80
|
};
|
@@ -93,8 +93,10 @@ const Dialog = (props: DialogProps): React.ReactElement => {
|
|
93
93
|
|
94
94
|
const dynamicInlineProps = globalInlineProps(props);
|
95
95
|
|
96
|
-
const
|
96
|
+
const classes = classnames(
|
97
97
|
buildCss("pb_dialog_wrapper"),
|
98
|
+
globalProps(props),
|
99
|
+
className
|
98
100
|
);
|
99
101
|
|
100
102
|
const [triggerOpened, setTriggerOpened] = useState(false),
|
@@ -171,13 +173,13 @@ const Dialog = (props: DialogProps): React.ReactElement => {
|
|
171
173
|
{...ariaProps}
|
172
174
|
{...dataProps}
|
173
175
|
{...htmlProps}
|
174
|
-
className={
|
176
|
+
className={classes}
|
175
177
|
>
|
176
178
|
<Modal
|
177
179
|
ariaHideApp={false}
|
178
|
-
className={
|
180
|
+
className={dialogClassNames}
|
179
181
|
closeTimeoutMS={200}
|
180
|
-
contentLabel="
|
182
|
+
contentLabel="Minimal Modal Example"
|
181
183
|
id={id}
|
182
184
|
isOpen={modalIsOpened}
|
183
185
|
onRequestClose={onClose}
|
@@ -12,7 +12,7 @@
|
|
12
12
|
data-cancel-button-id="<%= object.cancel_button_id %>"
|
13
13
|
<% end %>
|
14
14
|
>
|
15
|
-
<%= pb_content_tag(:dialog
|
15
|
+
<%= pb_content_tag(:dialog) do %>
|
16
16
|
<% if object.status === "" && object.title %>
|
17
17
|
<%= pb_rails("dialog/dialog_header", props: { title: object.title, id: object.id }) %>
|
18
18
|
<% end %>
|
@@ -0,0 +1,65 @@
|
|
1
|
+
// Three places in Nitro depend on this function inside the window scope.
|
2
|
+
// We will keep this file until we remove this dependency from Nitro.
|
3
|
+
const dialogHelper = () => {
|
4
|
+
const openTrigger = document.querySelectorAll("[data-open-dialog]");
|
5
|
+
const closeTrigger = document.querySelectorAll("[data-close-dialog]");
|
6
|
+
const dialogs = document.querySelectorAll(".pb_dialog_rails")
|
7
|
+
|
8
|
+
const loadingButton = document.querySelector('[data-disable-with="Loading"]');
|
9
|
+
if (loadingButton) {
|
10
|
+
loadingButton.addEventListener("click", function() {
|
11
|
+
const okayLoadingButton = document.querySelector('[data-disable-with="Loading"]');
|
12
|
+
const cancelButton = document.querySelector('[data-disable-cancel-with="Loading"]');
|
13
|
+
let currentClass = okayLoadingButton.className;
|
14
|
+
let cancelClass = cancelButton ? cancelButton.className : "";
|
15
|
+
|
16
|
+
let newClass = currentClass.replace("_enabled", "_disabled_loading");
|
17
|
+
let newCancelClass = cancelClass.replace("_enabled", "_disabled");
|
18
|
+
|
19
|
+
// Disable the buttons
|
20
|
+
okayLoadingButton.disabled = true;
|
21
|
+
if (cancelButton) cancelButton.disabled = true;
|
22
|
+
|
23
|
+
okayLoadingButton.className = newClass;
|
24
|
+
if (cancelButton) cancelButton.className = newCancelClass;
|
25
|
+
});
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
openTrigger.forEach((open) => {
|
30
|
+
open.addEventListener("click", () => {
|
31
|
+
var openTriggerData = open.dataset.openDialog;
|
32
|
+
var targetDialog = document.getElementById(openTriggerData)
|
33
|
+
if (targetDialog.open) return;
|
34
|
+
targetDialog.showModal();
|
35
|
+
});
|
36
|
+
});
|
37
|
+
|
38
|
+
closeTrigger.forEach((close) => {
|
39
|
+
close.addEventListener("click", () => {
|
40
|
+
var closeTriggerData = close.dataset.closeDialog;
|
41
|
+
document.getElementById(closeTriggerData).close();
|
42
|
+
});
|
43
|
+
});
|
44
|
+
|
45
|
+
// Close dialog box on outside click
|
46
|
+
dialogs.forEach((dialogElement) => {
|
47
|
+
dialogElement.addEventListener("mousedown", (event) => {
|
48
|
+
const dialogParentDataset = dialogElement.parentElement.dataset
|
49
|
+
if (dialogParentDataset.overlayClick === "overlay_close") return
|
50
|
+
|
51
|
+
const dialogModal = event.target.getBoundingClientRect()
|
52
|
+
const clickedOutsideDialogModal = event.clientX < dialogModal.left ||
|
53
|
+
event.clientX > dialogModal.right ||
|
54
|
+
event.clientY < dialogModal.top ||
|
55
|
+
event.clientY > dialogModal.bottom
|
56
|
+
|
57
|
+
if (clickedOutsideDialogModal) {
|
58
|
+
dialogElement.close()
|
59
|
+
event.stopPropagation()
|
60
|
+
}
|
61
|
+
})
|
62
|
+
})
|
63
|
+
};
|
64
|
+
|
65
|
+
export default dialogHelper;
|
@@ -2,8 +2,8 @@
|
|
2
2
|
<%= pb_rails("flex", props: {classname:object.classname, spacing:"between", padding:"sm", align:"center"}) do %>
|
3
3
|
<%= content.presence || object.title %>
|
4
4
|
|
5
|
-
<button class="dialog-button-class pb_dialog_close_icon" type="button" data-close-dialog= <%= object.id %>
|
6
|
-
<%= pb_rails("icon", props: { custom_icon: Playbook::Engine::root.join(times_icon)
|
5
|
+
<button class="dialog-button-class pb_dialog_close_icon" type="button" data-close-dialog= <%= object.id %> >
|
6
|
+
<%= pb_rails("icon", props: { custom_icon: Playbook::Engine::root.join(times_icon) }) %>
|
7
7
|
</button>
|
8
8
|
<% end %>
|
9
9
|
<%= pb_rails("section_separator") %>
|
@@ -35,7 +35,6 @@ type FixedConfirmationToastProps = {
|
|
35
35
|
|
36
36
|
const FixedConfirmationToast = (props: FixedConfirmationToastProps): React.ReactElement => {
|
37
37
|
const [showToast, toggleToast] = useState(true);
|
38
|
-
|
39
38
|
const {
|
40
39
|
autoClose = 0,
|
41
40
|
children,
|
@@ -88,15 +87,8 @@ const FixedConfirmationToast = (props: FixedConfirmationToastProps): React.React
|
|
88
87
|
<>
|
89
88
|
{showToast && (
|
90
89
|
<div
|
91
|
-
aria-atomic="true"
|
92
|
-
aria-live="polite"
|
93
90
|
className={css}
|
94
91
|
onClick={handleClick}
|
95
|
-
onKeyDown={(e) => {
|
96
|
-
if (e.key === "Enter" || e.key === " ") handleClick();
|
97
|
-
}}
|
98
|
-
role="status"
|
99
|
-
tabIndex={0}
|
100
92
|
{...htmlProps}
|
101
93
|
>
|
102
94
|
{returnedIcon && icon !== "none" && (
|
@@ -119,7 +111,6 @@ const FixedConfirmationToast = (props: FixedConfirmationToastProps): React.React
|
|
119
111
|
|
120
112
|
{closeable && (
|
121
113
|
<Icon
|
122
|
-
aria={{ "label": "Close Toast" }}
|
123
114
|
className="pb_icon"
|
124
115
|
cursor="pointer"
|
125
116
|
fixedWidth={false}
|
@@ -1,6 +1,6 @@
|
|
1
|
-
<%= pb_content_tag
|
1
|
+
<%= pb_content_tag do %>
|
2
2
|
<% if object.icon_value && object.icon_value != "none" %>
|
3
|
-
<%= pb_rails("icon", props: { icon: object.icon_value, classname: "pb_icon", fixed_width: true
|
3
|
+
<%= pb_rails("icon", props: { icon: object.icon_value, classname: "pb_icon", fixed_width: true }) %>
|
4
4
|
<% end %>
|
5
5
|
<% if content %>
|
6
6
|
<%= content %>
|
@@ -8,5 +8,5 @@
|
|
8
8
|
<%= pb_rails("title", props: { text: object.text, size: 4, flex: "1", classname: "pb_fixed_confirmation_toast_text" }) %>
|
9
9
|
<% end %>
|
10
10
|
|
11
|
-
<%= pb_rails("icon", props: { icon: "times", classname: "pb_icon", cursor: "pointer", fixed_width: true
|
11
|
+
<%= pb_rails("icon", props: { icon: "times", classname: "pb_icon", cursor: "pointer", fixed_width: true }) if object.closeable %>
|
12
12
|
<% end %>
|
@@ -91,7 +91,6 @@
|
|
91
91
|
<%= pb_form_with(scope: :example, url: "", method: :get) do |form| %>
|
92
92
|
<%= form.typeahead :example_typeahead, props: { data: { typeahead_example1: true, user: {} }, label: true, placeholder: "Search for a user" } %>
|
93
93
|
<%= form.text_field :example_text_field, props: { label: true } %>
|
94
|
-
<%= form.text_field :example_text_field_2, props: { label: "Text Field Custom Label" } %>
|
95
94
|
<%= form.phone_number_field :example_phone_number_field, props: { label: "Example phone field", hidden_inputs: true } %>
|
96
95
|
<%= form.email_field :example_email_field, props: { label: true } %>
|
97
96
|
<%= form.number_field :example_number_field, props: { label: true } %>
|
@@ -20,7 +20,7 @@ export type IconSizes = "lg"
|
|
20
20
|
| ""
|
21
21
|
|
22
22
|
type IconProps = {
|
23
|
-
aria?: {
|
23
|
+
aria?: {[key: string]: string},
|
24
24
|
border?: string,
|
25
25
|
className?: string,
|
26
26
|
color?: string,
|
@@ -211,15 +211,7 @@ const Icon = (props: IconProps) => {
|
|
211
211
|
)
|
212
212
|
|
213
213
|
aria.label ? null : aria.label = `${icon} icon`
|
214
|
-
|
215
|
-
const normalizedAria: { [key: string]: string } = Object.fromEntries(
|
216
|
-
Object.entries(aria).map(([key, value]) => [
|
217
|
-
key,
|
218
|
-
typeof value === "boolean" ? String(value) : value,
|
219
|
-
])
|
220
|
-
)
|
221
|
-
|
222
|
-
const ariaProps = buildAriaProps(normalizedAria)
|
214
|
+
const ariaProps: {[key: string]: any} = buildAriaProps(aria)
|
223
215
|
const dataProps: {[key: string]: any} = buildDataProps(data)
|
224
216
|
const htmlProps = buildHtmlProps(htmlOptions)
|
225
217
|
|
@@ -230,7 +222,6 @@ const Icon = (props: IconProps) => {
|
|
230
222
|
<>
|
231
223
|
{
|
232
224
|
React.cloneElement(iconElement || customIcon, {
|
233
|
-
...ariaProps,
|
234
225
|
...dataProps,
|
235
226
|
...htmlProps,
|
236
227
|
className: classes,
|
@@ -246,7 +237,6 @@ const Icon = (props: IconProps) => {
|
|
246
237
|
return (
|
247
238
|
<>
|
248
239
|
<span
|
249
|
-
{...ariaProps}
|
250
240
|
{...dataProps}
|
251
241
|
{...htmlProps}
|
252
242
|
className={classesEmoji}
|
@@ -260,7 +250,6 @@ const Icon = (props: IconProps) => {
|
|
260
250
|
return (
|
261
251
|
<>
|
262
252
|
<i
|
263
|
-
{...ariaProps}
|
264
253
|
{...dataProps}
|
265
254
|
{...htmlProps}
|
266
255
|
className={classes}
|
@@ -110,20 +110,12 @@ module Playbook
|
|
110
110
|
svg["class"] = %w[pb_custom_icon svg-inline--fa].concat([object.custom_icon_classname]).join(" ")
|
111
111
|
svg["id"] = object.id
|
112
112
|
svg["data"] = object.data
|
113
|
+
svg["aria"] = object.aria
|
113
114
|
svg["height"] = "auto"
|
114
115
|
svg["width"] = "auto"
|
115
116
|
svg["tabindex"] = object.tabindex
|
116
117
|
fill_color = object.color || "currentColor"
|
117
118
|
doc.at_css("path")["fill"] = fill_color
|
118
|
-
|
119
|
-
if object.aria.present?
|
120
|
-
object.aria.each do |key, value|
|
121
|
-
k = key.to_s
|
122
|
-
attr = k.start_with?("aria-") ? k : "aria-#{k.tr('_', '-')}"
|
123
|
-
svg[attr] = value
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
119
|
raw doc
|
128
120
|
rescue OpenURI::HTTPError, StandardError
|
129
121
|
# Handle any exceptions and return an empty string
|
@@ -16,7 +16,6 @@ type LoadingInlineProps = {
|
|
16
16
|
htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
|
17
17
|
id?: string,
|
18
18
|
text?: string,
|
19
|
-
variant?: "dotted" | "solid" ,
|
20
19
|
}
|
21
20
|
|
22
21
|
const LoadingInline = (props: LoadingInlineProps) => {
|
@@ -29,7 +28,6 @@ const LoadingInline = (props: LoadingInlineProps) => {
|
|
29
28
|
htmlOptions = {},
|
30
29
|
id,
|
31
30
|
text = ' Loading',
|
32
|
-
variant = 'dotted',
|
33
31
|
} = props
|
34
32
|
|
35
33
|
const ariaProps = buildAriaProps(aria)
|
@@ -56,7 +54,7 @@ const LoadingInline = (props: LoadingInlineProps) => {
|
|
56
54
|
<Icon
|
57
55
|
aria={{ label: 'loading icon' }}
|
58
56
|
fixedWidth
|
59
|
-
icon=
|
57
|
+
icon="spinner"
|
60
58
|
pulse
|
61
59
|
/>
|
62
60
|
{text}
|
@@ -3,11 +3,9 @@ examples:
|
|
3
3
|
rails:
|
4
4
|
- loading_inline_default: Default
|
5
5
|
- loading_inline_custom: Custom Text
|
6
|
-
- loading_inline_variant: Variant
|
7
6
|
|
8
7
|
|
9
8
|
|
10
9
|
react:
|
11
10
|
- loading_inline_default: Default
|
12
11
|
- loading_inline_custom: Custom Text
|
13
|
-
- loading_inline_variant: Variant
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= pb_content_tag do %>
|
2
2
|
|
3
3
|
<%= pb_rails("body", props: { color: "light", dark: object.dark }) do %>
|
4
|
-
<%= pb_rails("icon", props: { aria: { label: "loading icon" }, fixed_width: true, icon:
|
4
|
+
<%= pb_rails("icon", props: { aria: { label: "loading icon" }, fixed_width: true, icon: "spinner", pulse: true }) %> <%= object.text %>
|
5
5
|
<% end %>
|
6
6
|
<% end %>
|
@@ -8,21 +8,10 @@ module Playbook
|
|
8
8
|
default: "left"
|
9
9
|
prop :dark, type: Playbook::Props::Boolean, default: false
|
10
10
|
prop :text, type: Playbook::Props::String, default: "Loading"
|
11
|
-
prop :variant, type: Playbook::Props::Enum,
|
12
|
-
values: %w[dotted solid],
|
13
|
-
default: "dotted"
|
14
11
|
|
15
12
|
def classname
|
16
13
|
generate_classname("pb_loading_inline_kit", align)
|
17
14
|
end
|
18
|
-
|
19
|
-
def spinner_icon
|
20
|
-
if variant == "dotted"
|
21
|
-
"spinner"
|
22
|
-
elsif variant == "solid"
|
23
|
-
"spinner-solid"
|
24
|
-
end
|
25
|
-
end
|
26
15
|
end
|
27
16
|
end
|
28
17
|
end
|
@@ -140,8 +140,7 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
|
|
140
140
|
delete filteredProps?.marginLeft;
|
141
141
|
|
142
142
|
|
143
|
-
const
|
144
|
-
const Tag = isLink ? "a" : "div"
|
143
|
+
const Tag = link ? "a" : "div";
|
145
144
|
const activeClass = active === true ? "active" : "";
|
146
145
|
const highlightedBorderClass = active === true && highlighted_border === false ? "highlighted_border_none" : "";
|
147
146
|
const collapsibleTrailClass = collapsible && collapsibleTrail ? "collapsible_trail" : "";
|
@@ -201,13 +200,6 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
|
|
201
200
|
|
202
201
|
const collapsibleClasses = buildCss("collapsible_nav_wrapper", activeClass, highlightedBorderClass, collapsibleTrailClass)
|
203
202
|
|
204
|
-
const handleKeyDown = (e: React.KeyboardEvent) => {
|
205
|
-
if (!isLink && (e.key === "Enter" || e.key === " ")) {
|
206
|
-
e.preventDefault()
|
207
|
-
onClick?.()
|
208
|
-
}
|
209
|
-
}
|
210
|
-
|
211
203
|
return (
|
212
204
|
<>
|
213
205
|
{collapsible ? (
|
@@ -230,18 +222,15 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
|
|
230
222
|
{...dataProps}
|
231
223
|
{...htmlProps}
|
232
224
|
className={classes}
|
233
|
-
href={
|
225
|
+
href={link}
|
234
226
|
id={id}
|
235
|
-
|
236
|
-
tabIndex={!isLink ? 0 : undefined}
|
237
|
-
target={isLink ? target : undefined}
|
227
|
+
target={target}
|
238
228
|
>
|
239
229
|
{imageUrl && (
|
240
230
|
<div
|
241
231
|
className="pb_nav_list_item_icon_section_collapsible"
|
242
232
|
key={imageUrl}
|
243
233
|
onClick={(e) => handleIconClick(e)}
|
244
|
-
onKeyDown={!isLink ? handleKeyDown : undefined}
|
245
234
|
>
|
246
235
|
<Image className="pb_nav_img_wrapper"
|
247
236
|
url={imageUrl}
|
@@ -276,13 +265,10 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
|
|
276
265
|
{...dataProps}
|
277
266
|
{...htmlProps}
|
278
267
|
className={classes}
|
279
|
-
href={
|
268
|
+
href={link}
|
280
269
|
id={id}
|
281
270
|
onClick={onClick}
|
282
|
-
|
283
|
-
role={!isLink ? "button" : undefined}
|
284
|
-
tabIndex={!isLink ? 0 : undefined}
|
285
|
-
target={isLink ? target : undefined}
|
271
|
+
target={target}
|
286
272
|
>
|
287
273
|
{imageUrl && (
|
288
274
|
<div className="pb_nav_list_item_icon_section"
|
@@ -3,9 +3,7 @@
|
|
3
3
|
<%= pb_rails("collapsible/collapsible_main", props: { name: "default-collapsible-nav", icon: object.collapsible_icons, size: "xs", dark: object.dark, classname:object.margin_classes }) do %>
|
4
4
|
<%= pb_content_tag( object.tag,
|
5
5
|
href: object.link && object.link,
|
6
|
-
target: object.link && object.target
|
7
|
-
onkeydown: !object.link ? "if(event.key==='Enter'||event.key===' '){event.preventDefault(); this.click();}" : nil,
|
8
|
-
tabindex: object.link ? nil : 0,
|
6
|
+
target: object.link && object.target
|
9
7
|
) do %>
|
10
8
|
<% if object.image_url %>
|
11
9
|
<%= pb_rails("image", props: { url: object.image_url, classname: "pb_nav_img_wrapper_collapsible" }) %>
|
@@ -25,9 +23,7 @@
|
|
25
23
|
<% else %>
|
26
24
|
<%= pb_content_tag( object.tag,
|
27
25
|
href: object.link && object.link,
|
28
|
-
target: object.link && object.target
|
29
|
-
onkeydown: !object.link ? "if(event.key==='Enter'||event.key===' '){event.preventDefault(); this.click();}" : nil,
|
30
|
-
tabindex: object.link ? nil : 0,
|
26
|
+
target: object.link && object.target
|
31
27
|
) do %>
|
32
28
|
<% if object.image_url %>
|
33
29
|
<%= pb_rails("image", props: { url: object.image_url, classname: "pb_nav_img_wrapper" }) %>
|
@@ -4,8 +4,8 @@
|
|
4
4
|
|
5
5
|
<%= pb_rails("caption", props: { size: 'xs', text: "hello", id: "caption_breached" }) %>
|
6
6
|
|
7
|
-
|
8
|
-
window.addEventListener("
|
7
|
+
<%= javascript_tag do %>
|
8
|
+
window.addEventListener("DOMContentLoaded", () => {
|
9
9
|
|
10
10
|
// variables for the kits you are targeting
|
11
11
|
const passphrase = document.querySelector(".passphrase_breached").querySelector("input")
|
@@ -142,4 +142,4 @@
|
|
142
142
|
});
|
143
143
|
|
144
144
|
})
|
145
|
-
|
145
|
+
<% end %>
|
@@ -10,8 +10,8 @@
|
|
10
10
|
<%= pb_rails("caption", props: { size: 'xs', text: "hello", id: "caption_common" }) %>
|
11
11
|
|
12
12
|
|
13
|
-
|
14
|
-
window.addEventListener("
|
13
|
+
<%= javascript_tag do %>
|
14
|
+
window.addEventListener("DOMContentLoaded", () => {
|
15
15
|
|
16
16
|
const commonText = document.querySelector("#body_common")
|
17
17
|
|
@@ -133,4 +133,4 @@
|
|
133
133
|
});
|
134
134
|
|
135
135
|
})
|
136
|
-
|
136
|
+
<% end %>
|
@@ -4,8 +4,8 @@
|
|
4
4
|
|
5
5
|
<div id="match"> </div>
|
6
6
|
|
7
|
-
|
8
|
-
window.addEventListener("
|
7
|
+
<%= javascript_tag do %>
|
8
|
+
window.addEventListener("DOMContentLoaded", () => {
|
9
9
|
|
10
10
|
const useState = (defaultValue) => {
|
11
11
|
let value = defaultValue;
|
@@ -48,4 +48,4 @@
|
|
48
48
|
|
49
49
|
}
|
50
50
|
})
|
51
|
-
|
51
|
+
<% end %>
|
@@ -32,8 +32,8 @@
|
|
32
32
|
|
33
33
|
|
34
34
|
|
35
|
-
|
36
|
-
window.addEventListener("
|
35
|
+
<%= javascript_tag do %>
|
36
|
+
window.addEventListener("DOMContentLoaded", () => {
|
37
37
|
|
38
38
|
|
39
39
|
// variables for the passphrase kits you are targeting
|
@@ -320,4 +320,4 @@
|
|
320
320
|
|
321
321
|
|
322
322
|
})
|
323
|
-
|
323
|
+
<% end %>
|