playbook_ui 15.3.0.pre.alpha.PLAY2577reactpopoverappendToPOC11730 → 15.3.0.pre.alpha.PLAY258611978
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 +15 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.jsx +4 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.md +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_columns_and_header.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_react.md +1 -1
- data/app/pb_kits/playbook/pb_background/docs/_background_category.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_background.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_header.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_highlight.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_light.md +1 -1
- data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +16 -4
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_and_dropdown_range..md +14 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_and_dropdown_range.jsx +38 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +2 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_distribution_bar/docs/_distribution_bar_custom_colors.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +1 -0
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +111 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick.jsx +18 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick.md +4 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.jsx +18 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end.jsx +19 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers.jsx +38 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers.md +14 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options_react.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +5 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +5 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +148 -2
- data/app/pb_kits/playbook/pb_dropdown/quickpick/index.ts +60 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_max_width.md +1 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_rails.md +1 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_react.md +1 -1
- data/app/pb_kits/playbook/pb_icon/docs/_icon_color.md +1 -1
- data/app/pb_kits/playbook/pb_icon_circle/docs/_icon_circle_color.md +1 -1
- data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.html.erb +7 -14
- data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.jsx +6 -15
- data/app/pb_kits/playbook/pb_layout/docs/_layout_collection.md +1 -1
- data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav_item_spacing.md +1 -1
- data/app/pb_kits/playbook/pb_nav/docs/_nav_with_spacing_control.md +1 -1
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_layout.md +1 -1
- data/app/pb_kits/playbook/pb_pill/docs/_description.md +1 -1
- data/app/pb_kits/playbook/pb_popover/_popover.tsx +43 -29
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_description.md +1 -1
- data/app/pb_kits/playbook/pb_section_separator/docs/_description.md +1 -1
- data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +29 -0
- data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius_rails.md +1 -1
- data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius_react.md +1 -1
- data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_layout.md +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_side_highlight.md +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_sm.md +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible.html.erb +63 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible.jsx +89 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible_rails.md +4 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible_react.md +3 -0
- data/app/pb_kits/playbook/pb_table/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_table/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -2
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +41 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +23 -9
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.html.erb +64 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.jsx +70 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.md +1 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_options.html.erb +67 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_value.jsx +68 -6
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.md +1 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/index.js +2 -1
- data/dist/chunks/{_line_graph-BzjyTvYN.js → _line_graph-BokgW0SI.js} +1 -1
- data/dist/chunks/_typeahead-BR-uKbcO.js +6 -0
- data/dist/chunks/_weekday_stacked-n_2SPgc2.js +37 -0
- data/dist/chunks/{lib-CGxXTQ75.js → lib-BXBHAZMY.js} +1 -1
- data/dist/chunks/{pb_form_validation-DebqlUKZ.js → pb_form_validation-BZppqQZM.js} +1 -1
- 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 +25 -7
- data/dist/chunks/_typeahead-esKmpSrF.js +0 -6
- data/dist/chunks/_weekday_stacked-aFv39NoP.js +0 -37
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from "react"
|
|
1
|
+
import React, { useState } from "react"
|
|
2
2
|
import { render, screen, fireEvent } from "../utilities/test-utils"
|
|
3
3
|
|
|
4
4
|
import { Dropdown, Icon, IconCircle } from 'playbook-ui'
|
|
@@ -393,4 +393,150 @@ test("applies activeStyle backgroundColor and fontColor when selected", () => {
|
|
|
393
393
|
expect(selected).toBeInTheDocument()
|
|
394
394
|
expect(selected).toHaveClass("bg-bg_light")
|
|
395
395
|
expect(selected).toHaveClass("font-primary")
|
|
396
|
-
})
|
|
396
|
+
})
|
|
397
|
+
|
|
398
|
+
test("renders quickpick variant with auto-generated options", () => {
|
|
399
|
+
render(
|
|
400
|
+
<Dropdown
|
|
401
|
+
data={{ testid: testId }}
|
|
402
|
+
variant="quickpick"
|
|
403
|
+
/>
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
const kit = screen.getByTestId(testId)
|
|
407
|
+
expect(kit).toHaveClass('pb_dropdown_quickpick')
|
|
408
|
+
|
|
409
|
+
// Check that quickpick options are generated
|
|
410
|
+
const options = kit.querySelectorAll('.pb_dropdown_option_list')
|
|
411
|
+
expect(options.length).toBe(10)
|
|
412
|
+
expect(options[0]).toHaveTextContent("Today")
|
|
413
|
+
})
|
|
414
|
+
|
|
415
|
+
test("quickpick variant accepts string defaultValue", () => {
|
|
416
|
+
render(
|
|
417
|
+
<Dropdown
|
|
418
|
+
data={{ testid: testId }}
|
|
419
|
+
defaultValue="This Month"
|
|
420
|
+
variant="quickpick"
|
|
421
|
+
/>
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
const kit = screen.getByTestId(testId)
|
|
425
|
+
const trigger = kit.querySelector('.pb_dropdown_trigger')
|
|
426
|
+
|
|
427
|
+
expect(trigger).toHaveTextContent("This Month")
|
|
428
|
+
})
|
|
429
|
+
|
|
430
|
+
test("quickpick attaches _dropdownRef to DOM element when id is provided", () => {
|
|
431
|
+
render(
|
|
432
|
+
<Dropdown
|
|
433
|
+
data={{ testid: testId }}
|
|
434
|
+
id="test-quickpick"
|
|
435
|
+
variant="quickpick"
|
|
436
|
+
/>
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
const kit = screen.getByTestId(testId)
|
|
440
|
+
|
|
441
|
+
// Check that the element has the _dropdownRef attached
|
|
442
|
+
expect(kit._dropdownRef).toBeDefined()
|
|
443
|
+
expect(kit._dropdownRef.current).toBeDefined()
|
|
444
|
+
expect(kit._dropdownRef.current.clearSelected).toBeDefined()
|
|
445
|
+
})
|
|
446
|
+
|
|
447
|
+
test("quickpick clears selection when clicking X icon", () => {
|
|
448
|
+
render(
|
|
449
|
+
<Dropdown
|
|
450
|
+
data={{ testid: testId }}
|
|
451
|
+
defaultValue="This Week"
|
|
452
|
+
variant="quickpick"
|
|
453
|
+
/>
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
const kit = screen.getByTestId(testId)
|
|
457
|
+
const trigger = kit.querySelector('.pb_dropdown_trigger')
|
|
458
|
+
|
|
459
|
+
expect(trigger).toHaveTextContent("This Week")
|
|
460
|
+
|
|
461
|
+
const clearIcon = kit.querySelector('[aria-label="times icon"]')
|
|
462
|
+
expect(clearIcon).toBeInTheDocument()
|
|
463
|
+
|
|
464
|
+
fireEvent.click(clearIcon.parentElement)
|
|
465
|
+
|
|
466
|
+
expect(trigger).toHaveTextContent("Select...")
|
|
467
|
+
})
|
|
468
|
+
|
|
469
|
+
test("quickpick returns date array values when option selected", () => {
|
|
470
|
+
const TestComponent = () => {
|
|
471
|
+
const [selected, setSelected] = useState(null)
|
|
472
|
+
return (
|
|
473
|
+
<>
|
|
474
|
+
<Dropdown
|
|
475
|
+
data={{ testid: testId }}
|
|
476
|
+
onSelect={(item) => setSelected(item)}
|
|
477
|
+
variant="quickpick"
|
|
478
|
+
/>
|
|
479
|
+
{selected && (
|
|
480
|
+
<div data-testid="selected-value">
|
|
481
|
+
{JSON.stringify({
|
|
482
|
+
label: selected.label,
|
|
483
|
+
hasValue: !!selected.value,
|
|
484
|
+
isArray: Array.isArray(selected.value),
|
|
485
|
+
valueLength: selected.value?.length
|
|
486
|
+
})}
|
|
487
|
+
</div>
|
|
488
|
+
)}
|
|
489
|
+
</>
|
|
490
|
+
)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
render(<TestComponent />)
|
|
494
|
+
|
|
495
|
+
const kit = screen.getByTestId(testId)
|
|
496
|
+
const options = kit.querySelectorAll('.pb_dropdown_option_list')
|
|
497
|
+
|
|
498
|
+
fireEvent.click(options[0])
|
|
499
|
+
|
|
500
|
+
const selectedValue = screen.getByTestId('selected-value')
|
|
501
|
+
const data = JSON.parse(selectedValue.textContent)
|
|
502
|
+
|
|
503
|
+
expect(data.label).toBe("Today")
|
|
504
|
+
expect(data.hasValue).toBe(true)
|
|
505
|
+
expect(data.isArray).toBe(true)
|
|
506
|
+
expect(data.valueLength).toBe(2)
|
|
507
|
+
})
|
|
508
|
+
|
|
509
|
+
test("quickpick option values are Date objects", () => {
|
|
510
|
+
const onSelectMock = jest.fn()
|
|
511
|
+
|
|
512
|
+
render(
|
|
513
|
+
<Dropdown
|
|
514
|
+
data={{ testid: testId }}
|
|
515
|
+
onSelect={onSelectMock}
|
|
516
|
+
variant="quickpick"
|
|
517
|
+
/>
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
const kit = screen.getByTestId(testId)
|
|
521
|
+
const options = kit.querySelectorAll('.pb_dropdown_option_list')
|
|
522
|
+
|
|
523
|
+
const thisMonthOption = Array.from(options).find(opt => opt.textContent === 'This Month')
|
|
524
|
+
fireEvent.click(thisMonthOption)
|
|
525
|
+
|
|
526
|
+
const selectedItem = onSelectMock.mock.calls[0][0]
|
|
527
|
+
|
|
528
|
+
expect(selectedItem.label).toBe("This Month")
|
|
529
|
+
expect(selectedItem.value).toBeDefined()
|
|
530
|
+
expect(Array.isArray(selectedItem.value)).toBe(true)
|
|
531
|
+
expect(selectedItem.value.length).toBe(2)
|
|
532
|
+
|
|
533
|
+
const [startDate, endDate] = selectedItem.value
|
|
534
|
+
|
|
535
|
+
expect(startDate instanceof Date).toBe(true)
|
|
536
|
+
expect(endDate instanceof Date).toBe(true)
|
|
537
|
+
|
|
538
|
+
expect(startDate.getTime()).not.toBeNaN()
|
|
539
|
+
expect(endDate.getTime()).not.toBeNaN()
|
|
540
|
+
|
|
541
|
+
expect(endDate.getTime()).toBeGreaterThanOrEqual(startDate.getTime())
|
|
542
|
+
})
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// QuickPick default options for Dropdown
|
|
2
|
+
// This provides date range options similar to the DatePicker QuickPick functionality
|
|
3
|
+
|
|
4
|
+
import DateTime from '../../pb_kit/dateTime';
|
|
5
|
+
|
|
6
|
+
type QuickPickOption = {
|
|
7
|
+
label: string;
|
|
8
|
+
value: Date[];
|
|
9
|
+
formattedStartDate?: string;
|
|
10
|
+
formattedEndDate?: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// Helper to get QuickPick options with date ranges
|
|
15
|
+
const getQuickPickOptions = (rangeEndsToday = false): QuickPickOption[] => {
|
|
16
|
+
const today = new Date();
|
|
17
|
+
const yesterday = DateTime.getYesterdayDate(new Date());
|
|
18
|
+
|
|
19
|
+
const thisWeekStartDate = DateTime.getFirstDayOfWeek(new Date());
|
|
20
|
+
const thisWeekEndDate = rangeEndsToday ? new Date() : DateTime.getLastDayOfWeek(new Date());
|
|
21
|
+
const lastWeekStartDate = DateTime.getPreviousWeekStartDate(new Date());
|
|
22
|
+
const lastWeekEndDate = DateTime.getPreviousWeekEndDate(new Date());
|
|
23
|
+
|
|
24
|
+
const thisMonthStartDate = DateTime.getMonthStartDate(new Date());
|
|
25
|
+
const thisMonthEndDate = rangeEndsToday ? new Date() : DateTime.getMonthEndDate(new Date());
|
|
26
|
+
const lastMonthStartDate = DateTime.getPreviousMonthStartDate(new Date());
|
|
27
|
+
const lastMonthEndDate = DateTime.getPreviousMonthEndDate(new Date());
|
|
28
|
+
|
|
29
|
+
const thisQuarterStartDate = DateTime.getQuarterStartDate(new Date());
|
|
30
|
+
const thisQuarterEndDate = rangeEndsToday ? new Date() : DateTime.getQuarterEndDate(new Date());
|
|
31
|
+
const lastQuarterStartDate = DateTime.getPreviousQuarterStartDate(new Date());
|
|
32
|
+
const lastQuarterEndDate = DateTime.getPreviousQuarterEndDate(new Date());
|
|
33
|
+
|
|
34
|
+
const thisYearStartDate = DateTime.getYearStartDate(new Date());
|
|
35
|
+
const thisYearEndDate = rangeEndsToday ? new Date() : DateTime.getYearEndDate(new Date());
|
|
36
|
+
const lastYearStartDate = DateTime.getPreviousYearStartDate(new Date());
|
|
37
|
+
const lastYearEndDate = DateTime.getPreviousYearEndDate(new Date());
|
|
38
|
+
|
|
39
|
+
const formatDate = (date: Date) => {
|
|
40
|
+
const day = String(date.getDate()).padStart(2, "0")
|
|
41
|
+
const month = String(date.getMonth() + 1).padStart(2, "0")
|
|
42
|
+
const year = date.getFullYear()
|
|
43
|
+
|
|
44
|
+
return `${month}/${day}/${year}`
|
|
45
|
+
}
|
|
46
|
+
return [
|
|
47
|
+
{ label: 'Today', value: [today, today], id: 'quickpick-today' },
|
|
48
|
+
{ label: 'Yesterday', value: [yesterday, yesterday], formattedStartDate: `${formatDate(yesterday)}`, formattedEndDate: `${formatDate(yesterday)}`, id: 'quickpick-yesterday' },
|
|
49
|
+
{ label: 'This Week', value: [thisWeekStartDate, thisWeekEndDate], formattedStartDate: `${formatDate(thisWeekStartDate)}`, formattedEndDate: `${formatDate(thisWeekEndDate)}`, id: 'quickpick-this-week' },
|
|
50
|
+
{ label: 'This Month', value: [thisMonthStartDate, thisMonthEndDate], formattedStartDate: `${formatDate(thisMonthStartDate)}`, formattedEndDate: `${formatDate(thisMonthEndDate)}`, id: 'quickpick-this-month' },
|
|
51
|
+
{ label: 'This Quarter', value: [thisQuarterStartDate, thisQuarterEndDate], formattedStartDate: `${formatDate(thisQuarterStartDate)}`, formattedEndDate: `${formatDate(thisQuarterEndDate)}`, id: 'quickpick-this-quarter' },
|
|
52
|
+
{ label: 'This Year', value: [thisYearStartDate, thisYearEndDate], formattedStartDate: `${formatDate(thisYearStartDate)}`, formattedEndDate: `${formatDate(thisYearEndDate)}`, id: 'quickpick-this-year' },
|
|
53
|
+
{ label: 'Last Week', value: [lastWeekStartDate, lastWeekEndDate], formattedStartDate: `${formatDate(lastWeekStartDate)}`, formattedEndDate: `${formatDate(lastWeekEndDate)}`, id: 'quickpick-last-week' },
|
|
54
|
+
{ label: 'Last Month', value: [lastMonthStartDate, lastMonthEndDate], formattedStartDate: `${formatDate(lastMonthStartDate)}`, formattedEndDate: `${formatDate(lastMonthEndDate)}`, id: 'quickpick-last-month' },
|
|
55
|
+
{ label: 'Last Quarter', value: [lastQuarterStartDate, lastQuarterEndDate], formattedStartDate: `${formatDate(lastQuarterStartDate)}`, formattedEndDate: `${formatDate(lastQuarterEndDate)}`, id: 'quickpick-last-quarter' },
|
|
56
|
+
{ label: 'Last Year', value: [lastYearStartDate, lastYearEndDate], formattedStartDate: `${formatDate(lastYearStartDate)}`, formattedEndDate: `${formatDate(lastYearEndDate)}`, id: 'quickpick-last-year' },
|
|
57
|
+
];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export default getQuickPickOptions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Filter can leverage the max-width property. Learn more in our <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
Filter can leverage the max-width property. Learn more in our <a href="https://playbook.powerapp.cloud/global_props/max_width" target="_blank">visual guidelines.</a>
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
For Form Pills with longer text, the truncate global prop can be used to truncate the label within each Form Pill. See [here](https://playbook.powerapp.cloud/
|
|
1
|
+
For Form Pills with longer text, the truncate global prop can be used to truncate the label within each Form Pill. See [here](https://playbook.powerapp.cloud/global_props/truncate) for more information on the truncate global prop.
|
|
2
2
|
|
|
3
3
|
__NOTE__: For Rails Form Pills (not ones embedded within a React-rendered Typeahead or MultiLevelSelect), a unique `id` is required to enable the Tooltip functionality displaying the text or tag section of the Form Pill.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
For Form Pills with longer text, the `truncate` global prop can be used to truncate the label within each Form Pill. Hover over the truncated Form Pill and a Tooltip containing the text or tag section of the Form Pill will appear. See [here](https://playbook.powerapp.cloud/
|
|
1
|
+
For Form Pills with longer text, the `truncate` global prop can be used to truncate the label within each Form Pill. Hover over the truncated Form Pill and a Tooltip containing the text or tag section of the Form Pill will appear. See [here](https://playbook.powerapp.cloud/global_props/truncate) for more information on the truncate global prop.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Pass any text, status, data, product, or category Playbook <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
Pass any text, status, data, product, or category Playbook <a href="https://playbook.powerapp.cloud/tokens/colors" target="_blank">color token</a> to the `color` prop to change any icon's color.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Customize your icon circle by passing one of our seven base colors to the `variant` prop: `royal` `
|
|
1
|
+
Customize your icon circle by passing one of our seven base colors to the `variant` prop: `royal` `orange` `purple` `teal` `red` `yellow` `green`
|
|
@@ -3,48 +3,41 @@
|
|
|
3
3
|
text: "Mercury",
|
|
4
4
|
unit: "AU",
|
|
5
5
|
value: 0.39,
|
|
6
|
-
variant:"
|
|
6
|
+
variant:"royal"
|
|
7
7
|
}) %>
|
|
8
8
|
<br>
|
|
9
9
|
<%= pb_rails("icon_stat_value", props: { icon: "planet-ringed",
|
|
10
10
|
text: "Venus",
|
|
11
11
|
unit: "AU",
|
|
12
12
|
value: 0.723,
|
|
13
|
-
variant:"
|
|
13
|
+
variant:"purple"
|
|
14
14
|
}) %>
|
|
15
15
|
<br>
|
|
16
16
|
<%= pb_rails("icon_stat_value", props: { icon: "planet-moon",
|
|
17
17
|
text: "Earth",
|
|
18
18
|
unit: "AU",
|
|
19
19
|
value: 1.0,
|
|
20
|
-
variant:"
|
|
20
|
+
variant:"teal"
|
|
21
21
|
}) %>
|
|
22
22
|
<br>
|
|
23
23
|
<%= pb_rails("icon_stat_value", props: { icon: "solar-system",
|
|
24
24
|
text: "Mars",
|
|
25
25
|
unit: "AU",
|
|
26
26
|
value: 1.524,
|
|
27
|
-
variant:"
|
|
27
|
+
variant:"red"
|
|
28
28
|
}) %>
|
|
29
29
|
<br>
|
|
30
30
|
<%= pb_rails("icon_stat_value", props: { icon: "globe-americas",
|
|
31
|
-
text: "
|
|
31
|
+
text: "Jupiter",
|
|
32
32
|
unit: "AU",
|
|
33
33
|
value: 5.203,
|
|
34
|
-
variant:"
|
|
34
|
+
variant:"yellow"
|
|
35
35
|
}) %>
|
|
36
36
|
<br>
|
|
37
37
|
<%= pb_rails("icon_stat_value", props: { icon: "globe-africa",
|
|
38
38
|
text: "Saturn",
|
|
39
39
|
unit: "AU",
|
|
40
40
|
value: 9.539,
|
|
41
|
-
variant:"yellow"
|
|
42
|
-
}) %>
|
|
43
|
-
<br>
|
|
44
|
-
<%= pb_rails("icon_stat_value", props: { icon: "globe",
|
|
45
|
-
text: "Uranus",
|
|
46
|
-
unit: "AU",
|
|
47
|
-
value: 19.18,
|
|
48
41
|
variant:"green"
|
|
49
42
|
}) %>
|
|
50
43
|
<br>
|
|
@@ -53,4 +46,4 @@
|
|
|
53
46
|
unit: "AU",
|
|
54
47
|
value: 19.18,
|
|
55
48
|
variant:"orange"
|
|
56
|
-
}) %>
|
|
49
|
+
}) %>
|
|
@@ -9,7 +9,7 @@ const IconStatValueColor = (props) => {
|
|
|
9
9
|
text="Mercury"
|
|
10
10
|
unit="AU"
|
|
11
11
|
value={0.39}
|
|
12
|
-
variant="
|
|
12
|
+
variant="royal"
|
|
13
13
|
{...props}
|
|
14
14
|
/>
|
|
15
15
|
<br />
|
|
@@ -18,7 +18,7 @@ const IconStatValueColor = (props) => {
|
|
|
18
18
|
text="Venus"
|
|
19
19
|
unit="AU"
|
|
20
20
|
value={0.723}
|
|
21
|
-
variant="
|
|
21
|
+
variant="purple"
|
|
22
22
|
{...props}
|
|
23
23
|
/>
|
|
24
24
|
<br />
|
|
@@ -27,7 +27,7 @@ const IconStatValueColor = (props) => {
|
|
|
27
27
|
text="Earth"
|
|
28
28
|
unit="AU"
|
|
29
29
|
value={1.0}
|
|
30
|
-
variant="
|
|
30
|
+
variant="teal"
|
|
31
31
|
{...props}
|
|
32
32
|
/>
|
|
33
33
|
<br />
|
|
@@ -36,16 +36,16 @@ const IconStatValueColor = (props) => {
|
|
|
36
36
|
text="Mars"
|
|
37
37
|
unit="AU"
|
|
38
38
|
value={1.524}
|
|
39
|
-
variant="
|
|
39
|
+
variant="red"
|
|
40
40
|
{...props}
|
|
41
41
|
/>
|
|
42
42
|
<br />
|
|
43
43
|
<IconStatValue
|
|
44
44
|
icon="globe-americas"
|
|
45
|
-
text="
|
|
45
|
+
text="Jupiter"
|
|
46
46
|
unit="AU"
|
|
47
47
|
value={5.203}
|
|
48
|
-
variant="
|
|
48
|
+
variant="yellow"
|
|
49
49
|
{...props}
|
|
50
50
|
/>
|
|
51
51
|
<br />
|
|
@@ -54,15 +54,6 @@ const IconStatValueColor = (props) => {
|
|
|
54
54
|
text="Saturn"
|
|
55
55
|
unit="AU"
|
|
56
56
|
value={9.539}
|
|
57
|
-
variant="yellow"
|
|
58
|
-
{...props}
|
|
59
|
-
/>
|
|
60
|
-
<br />
|
|
61
|
-
<IconStatValue
|
|
62
|
-
icon="globe"
|
|
63
|
-
text="Uranus"
|
|
64
|
-
unit="AU"
|
|
65
|
-
value={19.18}
|
|
66
57
|
variant="green"
|
|
67
58
|
{...props}
|
|
68
59
|
/>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Layout can leverage the max-width property. Learn more in our <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
Layout can leverage the max-width property. Learn more in our <a href="https://playbook.powerapp.cloud/global_props/max_width" target="_blank">visual guidelines.</a>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
The `itemSpacing` prop can optionally be applied to the `Nav` parent element and accepts an object through which any of our [
|
|
1
|
+
The `itemSpacing` prop can optionally be applied to the `Nav` parent element and accepts an object through which any of our Spacing ([padding](https://playbook.powerapp.cloud/global_props/padding), [margin](https://playbook.powerapp.cloud/global_props/margin)) global prop values can be passed as an object. All spacing values passed to `itemSpacing` will be applied to all navItems within the nav. Spacing (padding, margin) global props can still be used on nested navItems in conjunction with `itenSpacing` on the Nav for customized control. Any Spacing (padding,margin) global props applied directly to a navItem will override any competing `itemSpacing` value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
All Nav variants' navItems accept our
|
|
1
|
+
All Nav variants' navItems accept our global Spacing ([padding](https://playbook.powerapp.cloud/global_props/padding), [margin](https://playbook.powerapp.cloud/global_props/margin)) props for custom spacing requirements. This example uses paddingY="xxs" and margin="none" on the bold variant to show this in action!
|
|
@@ -2,4 +2,4 @@ The optional `layout` prop accepts the `position` and `size` of the overlay as a
|
|
|
2
2
|
|
|
3
3
|
The `position` key accepts `bottom` (default), `top`, `y` (for both top and bottom) `right`, `left`, or `x` (for both left and right), which sets the side(s) where the `color` overlay starts. The direction of the overlay is always toward the opposite side of the position. For example, the default position of `bottom` starts the overlay on the bottom edge of your container and extends it toward the opposite side: the top.
|
|
4
4
|
|
|
5
|
-
The `size` value is `full` (100%) by default, but accepts our
|
|
5
|
+
The `size` value is `full` (100%) by default, but accepts our spacing tokens([padding](https://playbook.powerapp.cloud/global_props/padding), [margin](https://playbook.powerapp.cloud/global_props/margin)) or a percentage value as a string, and literally translates to how much of the container is covered by the overlay(s).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
A pill uses both a keyword and a specific color to categorize an item. Each pill directly corresponds to a data color <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
A pill uses both a keyword and a specific color to categorize an item. Each pill directly corresponds to a data color <a href="https://playbook.powerapp.cloud/global_props/colors" target="_blank">here</a>.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable react/no-multi-comp */
|
|
2
|
-
import React, { useEffect, useState } from "react";
|
|
2
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
3
3
|
import ReactDOM from "react-dom";
|
|
4
4
|
import {
|
|
5
5
|
Popper,
|
|
@@ -109,7 +109,7 @@ const Popover = (props: PbPopoverProps) => {
|
|
|
109
109
|
const popoverSpacing =
|
|
110
110
|
filteredGlobalProps.includes("dark") || !filteredGlobalProps
|
|
111
111
|
? "p_sm"
|
|
112
|
-
: filteredGlobalProps
|
|
112
|
+
: filteredGlobalProps
|
|
113
113
|
const overflowHandling = maxHeight || maxWidth ? "overflow_handling" : "";
|
|
114
114
|
const zIndexStyle = zIndex ? { zIndex: zIndex } : {};
|
|
115
115
|
const widthHeightStyles = () => {
|
|
@@ -191,42 +191,56 @@ const PbReactPopover = (props: PbPopoverProps): React.ReactElement => {
|
|
|
191
191
|
minHeight,
|
|
192
192
|
minWidth,
|
|
193
193
|
width,
|
|
194
|
+
closeOnClick,
|
|
195
|
+
shouldClosePopover = noop,
|
|
194
196
|
} = props;
|
|
195
197
|
|
|
198
|
+
// Store latest callback in a ref to avoid re-runs
|
|
199
|
+
const shouldClosePopoverRef = useRef(shouldClosePopover);
|
|
200
|
+
|
|
201
|
+
// Update ref on change
|
|
196
202
|
useEffect(() => {
|
|
197
|
-
|
|
203
|
+
shouldClosePopoverRef.current = shouldClosePopover;
|
|
204
|
+
}, [shouldClosePopover]);
|
|
198
205
|
|
|
206
|
+
useEffect(() => {
|
|
199
207
|
if (!closeOnClick) return;
|
|
200
208
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
209
|
+
// Function to handle popover event listener and targetId.
|
|
210
|
+
// Ensure that whenever the component is conditionally rendered
|
|
211
|
+
// that the old listener is removed and the new listener is
|
|
212
|
+
// updated with the targetId.
|
|
213
|
+
const handleClick = (e: MouseEvent) => {
|
|
214
|
+
const target = e.target as HTMLElement
|
|
205
215
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
216
|
+
const targetIsPopover =
|
|
217
|
+
target.closest("#" + targetId) !== null;
|
|
218
|
+
const targetIsReference =
|
|
219
|
+
target.closest("#reference-" + targetId) !== null;
|
|
210
220
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
221
|
+
const shouldClose = () => {
|
|
222
|
+
setTimeout(() => shouldClosePopoverRef.current(true), 0);
|
|
223
|
+
}
|
|
214
224
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
);
|
|
229
|
-
|
|
225
|
+
switch (closeOnClick) {
|
|
226
|
+
case "outside":
|
|
227
|
+
if (!targetIsPopover && !targetIsReference) shouldClose();
|
|
228
|
+
break;
|
|
229
|
+
case "inside":
|
|
230
|
+
if (targetIsPopover) shouldClose();
|
|
231
|
+
break;
|
|
232
|
+
case "any":
|
|
233
|
+
if (targetIsPopover || !targetIsPopover && !targetIsReference) shouldClose();
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
document.body.addEventListener("click", handleClick, { capture: true });
|
|
239
|
+
|
|
240
|
+
return () => {
|
|
241
|
+
document.body.removeEventListener("click", handleClick, { capture: true });
|
|
242
|
+
};
|
|
243
|
+
}, [targetId, closeOnClick]);
|
|
230
244
|
|
|
231
245
|
const popoverComponent = (
|
|
232
246
|
<Popover
|
|
@@ -1 +1 @@
|
|
|
1
|
-
NOTE: All editors have a default max-width of "md". Use our [Max Width global prop](https://playbook.powerapp.cloud/
|
|
1
|
+
NOTE: All editors have a default max-width of "md". Use our [Max Width global prop](https://playbook.powerapp.cloud/global_props/max_width) to override this default, as necessary.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Section separator is a divider line that compartmentalizes content, typically used on cards or white backgrounds.
|
|
2
2
|
|
|
3
|
-
To ensure that the section separator is properly rendered, please be sure to use our global `width` prop to set width to 100%. [See here](https://playbook.powerapp.cloud/
|
|
3
|
+
To ensure that the section separator is properly rendered, please be sure to use our global `width` prop to set width to 100%. [See here](https://playbook.powerapp.cloud/global_props/width) for more information on the global width prop.
|
|
@@ -216,4 +216,33 @@ $pb_selectable_paddings: (
|
|
|
216
216
|
background: $error;
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.pb_selectable_card_kit_disabled,
|
|
222
|
+
.pb_selectable_card_kit_checked_disabled {
|
|
223
|
+
>label {
|
|
224
|
+
cursor: not-allowed;
|
|
225
|
+
|
|
226
|
+
@media (hover:hover) {
|
|
227
|
+
&:hover {
|
|
228
|
+
box-shadow: none !important;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.pb_selectable_card_kit_disabled>label {
|
|
235
|
+
border-color: $border_light !important;
|
|
236
|
+
|
|
237
|
+
.dark & {
|
|
238
|
+
border-color: $border_dark !important;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.pb_selectable_card_kit_checked_disabled>label {
|
|
243
|
+
border-color: $primary !important;
|
|
244
|
+
|
|
245
|
+
.dark & {
|
|
246
|
+
border-color: $primary_action_dark !important;
|
|
247
|
+
}
|
|
219
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
The `border_radius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/
|
|
1
|
+
The `border_radius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/global_props/border_radius) tokens, with `sm` as default.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
The `borderRadius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/
|
|
1
|
+
The `borderRadius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/global_props/border_radius) tokens, with `sm` as default.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Use the `stack` and `gap` props in conjunction to layer multiple Skeleton loading bars on top of each other.
|
|
2
2
|
|
|
3
|
-
`stack` accepts a number that correlates to the number of rows (1 is default), and `gap` accepts a portion of our [spacing props](https://playbook.powerapp.cloud/
|
|
3
|
+
`stack` accepts a number that correlates to the number of rows (1 is default), and `gap` accepts a portion of our [spacing props](https://playbook.powerapp.cloud/global_props/spacing) (`xxs` as default, `xs`, `sm`, `md`, `lg`, `xl`, `xxl`) to set the pixel distance between each row. `gap` will not do anything if there is no corresponding `stack` prop set.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Side highlight can take product, status, and category colors. To view full list of colors, visit <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
Side highlight can take product, status, and category colors. To view full list of colors, visit <a href="https://playbook.powerapp.cloud/tokens/colors" target="_blank">token colors</a>.
|
|
2
2
|
|
|
3
3
|
Note: Only use category colors for categories. Do not mix it with product or status colors.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Use table size `"sm"` when data density is a priority. Smaller row height enables the user to view more data without the need for scrolling.
|
|
2
2
|
|
|
3
|
-
Table can leverage the max-width property. Learn more
|
|
3
|
+
Table can leverage the max-width property. Learn more on our <a href="https://playbook.powerapp.cloud/global_props/max_width" target="_blank">Max Width Global Props page.</a>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<% content = capture do %>
|
|
2
|
+
<%= pb_rails("card", props: { border_none: true, border_radius: "none", padding: "md" }) do %>
|
|
3
|
+
<%= pb_rails("body", props: { text: "Nested content inside a Table Row" }) %>
|
|
4
|
+
<% end %>
|
|
5
|
+
<% end %>
|
|
6
|
+
|
|
7
|
+
<%= pb_rails("table", props: { size: "sm" }) do %>
|
|
8
|
+
<%= pb_rails("table/table_head") do %>
|
|
9
|
+
<%= pb_rails("table/table_row") do %>
|
|
10
|
+
<%= pb_rails("table/table_header", props: { text: "Column 1"}) %>
|
|
11
|
+
<%= pb_rails("table/table_header", props: { text: "Column 2"}) %>
|
|
12
|
+
<%= pb_rails("table/table_header", props: { text: "Column 3"}) %>
|
|
13
|
+
<%= pb_rails("table/table_header", props: { text: "Column 4"}) %>
|
|
14
|
+
<%= pb_rails("table/table_header", props: { text: "Column 5"}) %>
|
|
15
|
+
<%= pb_rails("table/table_header", props: { text: ""}) %>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% end %>
|
|
18
|
+
<%= pb_rails("table/table_body") do %>
|
|
19
|
+
<%= pb_rails("table/table_row", props: { collapsible: true, collapsible_content: content, collapsible_side_highlight: true, id: "11" }) do %>
|
|
20
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 1", html_options: { onclick: "toggleArrows()" }}) %>
|
|
21
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 2", html_options: { onclick: "toggleArrows()" }}) %>
|
|
22
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 3", html_options: { onclick: "toggleArrows()" }}) %>
|
|
23
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 4", html_options: { onclick: "toggleArrows()" }}) %>
|
|
24
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 5", html_options: { onclick: "toggleArrows()" }}) %>
|
|
25
|
+
<%= pb_rails("table/table_cell", props: { text_align: "right", html_options: { onclick: "toggleArrows()" }}) do %>
|
|
26
|
+
<%= pb_rails("icon", props: {id: "chevron-icon-down", icon: "chevron-down", fixed_width: true, color: "primary" }) %>
|
|
27
|
+
<%= pb_rails("icon", props: {id: "chevron-icon-up", icon: "chevron-up", fixed_width: true, color: "primary" }) %>
|
|
28
|
+
<% end %>
|
|
29
|
+
<% end %>
|
|
30
|
+
<%= pb_rails("table/table_row") do %>
|
|
31
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
|
|
32
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
|
|
33
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
|
|
34
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
|
|
35
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
|
|
36
|
+
<%= pb_rails("table/table_cell", props: { text: ""}) %>
|
|
37
|
+
<% end %>
|
|
38
|
+
<%= pb_rails("table/table_row") do %>
|
|
39
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
|
|
40
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
|
|
41
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
|
|
42
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
|
|
43
|
+
<%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
|
|
44
|
+
<%= pb_rails("table/table_cell", props: { text: ""}) %>
|
|
45
|
+
<% end %>
|
|
46
|
+
<% end %>
|
|
47
|
+
<% end %>
|
|
48
|
+
|
|
49
|
+
<script>
|
|
50
|
+
const downArrow = document.getElementById("chevron-icon-down");
|
|
51
|
+
const upArrow = document.getElementById("chevron-icon-up");
|
|
52
|
+
|
|
53
|
+
upArrow.style.display = upArrow.style.display === 'none' ? 'inline-block' : 'none';
|
|
54
|
+
|
|
55
|
+
function toggleArrows() {
|
|
56
|
+
if (downArrow) {
|
|
57
|
+
downArrow.style.display = downArrow.style.display === 'none' ? 'inline-block' : 'none';
|
|
58
|
+
}
|
|
59
|
+
if (upArrow) {
|
|
60
|
+
upArrow.style.display = upArrow.style.display === 'none' ? 'inline-block' : 'none';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
</script>
|