playbook_ui 15.3.0.pre.alpha.PLAY260211784 → 15.3.0.pre.alpha.play2464flexitemcantusehtmloptions12226
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/RegularTableView.tsx +2 -1
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +68 -5
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.html.erb +4 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.md +1 -1
- 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_column_styling.jsx +3 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +2 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +2 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.jsx +9 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.md +1 -1
- 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_advanced_table/docs/_advanced_table_with_custom_header_multi_header.jsx +16 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header_rails.html.erb +104 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header_rails.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/index.js +7 -7
- data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +90 -20
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +32 -3
- data/app/pb_kits/playbook/pb_background/background.html.erb +10 -2
- data/app/pb_kits/playbook/pb_background/docs/_background_category.md +1 -1
- data/app/pb_kits/playbook/pb_badge/_badge.tsx +4 -1
- data/app/pb_kits/playbook/pb_badge/badge.test.js +13 -0
- 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_currency/_currency.tsx +20 -7
- data/app/pb_kits/playbook/pb_currency/currency.rb +35 -8
- data/app/pb_kits/playbook/pb_currency/currency.test.js +47 -0
- data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.html.erb +1 -1
- data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.jsx +1 -1
- data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.md +1 -0
- 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.jsx +38 -0
- 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/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_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.html.erb +15 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_multi_line.html.erb +9 -8
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_positions.html.erb +11 -10
- data/app/pb_kits/playbook/pb_flex/_flex_item.tsx +12 -5
- data/app/pb_kits/playbook/pb_flex/docs/_flex_item_example.jsx +1 -0
- data/app/pb_kits/playbook/pb_form/pb_form_validation.js +44 -11
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +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_phone_number_input/_phone_number_input.tsx +110 -17
- data/app/pb_kits/playbook/pb_pill/docs/_description.md +1 -1
- data/app/pb_kits/playbook/pb_popover/_popover.tsx +69 -34
- data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.jsx +68 -0
- data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to_react.md +1 -0
- data/app/pb_kits/playbook/pb_popover/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_popover/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_popover/popover.test.js +80 -0
- 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.scss +7 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +105 -1
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +23 -9
- data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +33 -1
- 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-h5H-imfn.js → _line_graph-oRTpJgi9.js} +1 -1
- data/dist/chunks/_typeahead-CDf2C2se.js +6 -0
- data/dist/chunks/_weekday_stacked-BPxUGfCf.js +37 -0
- data/dist/chunks/{lib-CGxXTQ75.js → lib-BXBHAZMY.js} +1 -1
- data/dist/chunks/pb_form_validation-BNfSnIUF.js +1 -0
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +2 -2
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +31 -8
- data/dist/chunks/_typeahead-U8AjZIIW.js +0 -6
- data/dist/chunks/_weekday_stacked-Bd3ro1uX.js +0 -37
- data/dist/chunks/pb_form_validation-DebqlUKZ.js +0 -1
- /data/app/pb_kits/playbook/pb_popover/docs/{_popover_append_to.md → _popover_append_to_rails.md} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
You can link a Dropdown (`quickpick` variant) to standard DatePickers using the following props:
|
|
2
|
+
|
|
3
|
+
**For the Dropdown**:
|
|
4
|
+
`controlsStartId`: ID of the DatePicker that should receive the start date.
|
|
5
|
+
|
|
6
|
+
`controlsEndId`: ID of the DatePicker that should receive the end date.
|
|
7
|
+
|
|
8
|
+
When a quickpick option like “This Year” is selected, it automatically populates the linked start and end inputs.
|
|
9
|
+
|
|
10
|
+
**For the Start/End DatePickers**:
|
|
11
|
+
`syncStartWith`: ID of the quickpick this start date is synced to.
|
|
12
|
+
`syncEndWith`: ID of the quickpick this end date is synced to.
|
|
13
|
+
|
|
14
|
+
When a user manually edits the start or end date, it clears the selected quickpick to prevent conflicting values.
|
|
@@ -48,7 +48,8 @@ examples:
|
|
|
48
48
|
- date_picker_quick_pick_custom: Custom Quick Pick Dates
|
|
49
49
|
- date_picker_quick_pick_custom_override: Custom Quick Pick Dates (append to defaults)
|
|
50
50
|
- date_picker_quick_pick_default_date: Range (Quick Pick w/ Default Date)
|
|
51
|
-
- date_picker_range_pattern: Range with 2 Date Pickers and a Quick Pick
|
|
51
|
+
# - date_picker_range_pattern: Range with 2 Date Pickers and a Quick Pick
|
|
52
|
+
- date_picker_and_dropdown_range: Range with Dropdown and 2 Date Pickers
|
|
52
53
|
- date_picker_format: Format
|
|
53
54
|
- date_picker_disabled: Disabled Dates
|
|
54
55
|
- date_picker_min_max: Min Max
|
|
@@ -26,4 +26,5 @@ export { default as DatePickerOnClose } from './_date_picker_on_close.jsx'
|
|
|
26
26
|
export { default as DatePickerQuickPickCustom } from './_date_picker_quick_pick_custom'
|
|
27
27
|
export { default as DatePickerQuickPickCustomOverride } from './_date_picker_quick_pick_custom_override'
|
|
28
28
|
export { default as DatePickerQuickPickDefaultDate } from './_date_picker_quick_pick_default_date'
|
|
29
|
-
export { default as DatePickerRangePattern } from './_date_picker_range_pattern'
|
|
29
|
+
export { default as DatePickerRangePattern } from './_date_picker_range_pattern'
|
|
30
|
+
export { default as DatePickerAndDropdownRange } from './_date_picker_and_dropdown_range.jsx'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
You can customize the order of the colors you would like to use by using the `colors` prop. Only the data and status colors will work for Playbook charts. See the [design page](/
|
|
1
|
+
You can customize the order of the colors you would like to use by using the `colors` prop. Only the data and status colors will work for Playbook charts. See the [design page](https://playbook.powerapp.cloud/token/colors) for reference.
|
|
@@ -12,6 +12,7 @@ import DropdownContext from "./context";
|
|
|
12
12
|
import DropdownOption from "./subcomponents/DropdownOption";
|
|
13
13
|
import DropdownTrigger from "./subcomponents/DropdownTrigger";
|
|
14
14
|
import useDropdown from "./hooks/useDropdown";
|
|
15
|
+
import getQuickPickOptions from "./quickpick";
|
|
15
16
|
|
|
16
17
|
import {
|
|
17
18
|
separateChildComponents,
|
|
@@ -36,9 +37,12 @@ type DropdownProps = {
|
|
|
36
37
|
label?: string;
|
|
37
38
|
multiSelect?: boolean;
|
|
38
39
|
onSelect?: (arg: GenericObject) => null;
|
|
39
|
-
options
|
|
40
|
+
options?: GenericObject;
|
|
40
41
|
separators?: boolean;
|
|
41
|
-
variant?: "default" | "subtle";
|
|
42
|
+
variant?: "default" | "subtle" | "quickpick";
|
|
43
|
+
rangeEndsToday?: boolean;
|
|
44
|
+
controlsStartId?: string;
|
|
45
|
+
controlsEndId?: string;
|
|
42
46
|
activeStyle?: {
|
|
43
47
|
backgroundColor?: string;
|
|
44
48
|
fontColor?: string;
|
|
@@ -71,6 +75,9 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
71
75
|
formPillProps,
|
|
72
76
|
onSelect,
|
|
73
77
|
options,
|
|
78
|
+
rangeEndsToday = false,
|
|
79
|
+
controlsStartId,
|
|
80
|
+
controlsEndId,
|
|
74
81
|
separators = true,
|
|
75
82
|
variant = "default",
|
|
76
83
|
activeStyle,
|
|
@@ -85,11 +92,25 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
85
92
|
globalProps(props),
|
|
86
93
|
className
|
|
87
94
|
);
|
|
95
|
+
// ------------- Quick Pick ---------------------------------
|
|
96
|
+
// Use QuickPick options when variant is "quickpick"
|
|
97
|
+
const dropdownOptions = variant === "quickpick"
|
|
98
|
+
? getQuickPickOptions(rangeEndsToday)
|
|
99
|
+
: (options || []);
|
|
100
|
+
// ----------------------------------------------------------
|
|
88
101
|
|
|
89
102
|
const [isDropDownClosed, setIsDropDownClosed, toggleDropdown] = useDropdown(isClosed);
|
|
90
103
|
|
|
91
104
|
const [filterItem, setFilterItem] = useState("");
|
|
92
105
|
const initialSelected = useMemo(() => {
|
|
106
|
+
// Handle quickpick variant with string defaultValue (e.g., "This Month")
|
|
107
|
+
if (variant === "quickpick" && typeof defaultValue === "string" && defaultValue) {
|
|
108
|
+
const matchedOption = dropdownOptions.find(
|
|
109
|
+
(opt: GenericObject) => opt.label?.toLowerCase() === (defaultValue as string).toLowerCase()
|
|
110
|
+
);
|
|
111
|
+
return matchedOption || {};
|
|
112
|
+
}
|
|
113
|
+
|
|
93
114
|
if (multiSelect) {
|
|
94
115
|
if (Array.isArray(defaultValue)) return defaultValue;
|
|
95
116
|
return defaultValue && Object.keys(defaultValue).length
|
|
@@ -97,7 +118,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
97
118
|
: [];
|
|
98
119
|
}
|
|
99
120
|
return defaultValue || {};
|
|
100
|
-
}, [multiSelect, defaultValue]);
|
|
121
|
+
}, [multiSelect, defaultValue, variant, dropdownOptions]);
|
|
101
122
|
|
|
102
123
|
const [selected, setSelected] = useState<GenericObject | GenericObject[]>(
|
|
103
124
|
initialSelected
|
|
@@ -151,7 +172,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
151
172
|
}, [isClosed])
|
|
152
173
|
|
|
153
174
|
const blankSelectionOption: GenericObject = blankSelection ? [{ label: blankSelection, value: "" }] : [];
|
|
154
|
-
const optionsWithBlankSelection = blankSelectionOption.concat(
|
|
175
|
+
const optionsWithBlankSelection = blankSelectionOption.concat(dropdownOptions);
|
|
155
176
|
|
|
156
177
|
const availableOptions = useMemo(()=> {
|
|
157
178
|
if (!multiSelect) return optionsWithBlankSelection;
|
|
@@ -203,6 +224,21 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
203
224
|
setFilterItem("");
|
|
204
225
|
setIsDropDownClosed(true);
|
|
205
226
|
onSelect && onSelect(clickedItem);
|
|
227
|
+
|
|
228
|
+
// Sync with DatePickers if this is a quickpick variant
|
|
229
|
+
if (variant === "quickpick" && Array.isArray(clickedItem.value)) {
|
|
230
|
+
const [start, end] = clickedItem.value;
|
|
231
|
+
|
|
232
|
+
if (controlsStartId) {
|
|
233
|
+
const startPicker = (document.querySelector(`#${controlsStartId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
|
|
234
|
+
startPicker?.setDate(start, true);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (controlsEndId) {
|
|
238
|
+
const endPicker = (document.querySelector(`#${controlsEndId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
|
|
239
|
+
endPicker?.setDate(end, true);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
206
242
|
}
|
|
207
243
|
};
|
|
208
244
|
|
|
@@ -219,6 +255,19 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
219
255
|
setSelected({});
|
|
220
256
|
onSelect && onSelect(null);
|
|
221
257
|
setFocusedOptionIndex(-1);
|
|
258
|
+
|
|
259
|
+
// Clear linked DatePickers as well if this is a quickpick variant with controls
|
|
260
|
+
if (variant === "quickpick") {
|
|
261
|
+
if (controlsStartId) {
|
|
262
|
+
const startPicker = (document.querySelector(`#${controlsStartId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
|
|
263
|
+
startPicker?.clear();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (controlsEndId) {
|
|
267
|
+
const endPicker = (document.querySelector(`#${controlsEndId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
|
|
268
|
+
endPicker?.clear();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
222
271
|
}
|
|
223
272
|
};
|
|
224
273
|
|
|
@@ -232,7 +281,8 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
232
281
|
dark
|
|
233
282
|
});
|
|
234
283
|
|
|
235
|
-
|
|
284
|
+
// Create an internal ref object that holds the imperative handle methods
|
|
285
|
+
const imperativeRef = useRef({
|
|
236
286
|
clearSelected: () => {
|
|
237
287
|
if (multiSelect) {
|
|
238
288
|
setSelected([]);
|
|
@@ -244,7 +294,61 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
244
294
|
setFilterItem("");
|
|
245
295
|
setIsDropDownClosed(true);
|
|
246
296
|
},
|
|
247
|
-
})
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// Update imperativeRef whenever dependencies change
|
|
300
|
+
// (needed for external clearing of normal Dropdown + DatePicker-synced QuickPick Dropdown)
|
|
301
|
+
useEffect(() => {
|
|
302
|
+
imperativeRef.current = {
|
|
303
|
+
clearSelected: () => {
|
|
304
|
+
if (multiSelect) {
|
|
305
|
+
setSelected([]);
|
|
306
|
+
onSelect && onSelect([]);
|
|
307
|
+
} else {
|
|
308
|
+
setSelected({});
|
|
309
|
+
onSelect && onSelect(null);
|
|
310
|
+
}
|
|
311
|
+
setFilterItem("");
|
|
312
|
+
setIsDropDownClosed(true);
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
}, [multiSelect, onSelect, setSelected, setFilterItem, setIsDropDownClosed]);
|
|
316
|
+
|
|
317
|
+
useImperativeHandle(ref, () => imperativeRef.current);
|
|
318
|
+
|
|
319
|
+
// Create a ref to the outer div to attach the dropdown ref for DatePicker sync
|
|
320
|
+
const outerDivRef = useRef<HTMLDivElement>(null);
|
|
321
|
+
|
|
322
|
+
useEffect(() => {
|
|
323
|
+
// Attach the ref to the DOM element so DatePicker can access it
|
|
324
|
+
if (outerDivRef.current && variant === "quickpick" && id) {
|
|
325
|
+
(outerDivRef.current as any)._dropdownRef = imperativeRef;
|
|
326
|
+
}
|
|
327
|
+
}, [variant, id]);
|
|
328
|
+
|
|
329
|
+
// Sync defaultValue with DatePickers on mount when 3 input pattern is used
|
|
330
|
+
useEffect(() => {
|
|
331
|
+
if (variant === "quickpick" && initialSelected && typeof initialSelected === "object" && !Array.isArray(initialSelected)) {
|
|
332
|
+
const value = initialSelected.value;
|
|
333
|
+
|
|
334
|
+
if (Array.isArray(value) && value.length === 2) {
|
|
335
|
+
const [start, end] = value;
|
|
336
|
+
|
|
337
|
+
// Wait for DatePickers to be initialized
|
|
338
|
+
setTimeout(() => {
|
|
339
|
+
if (controlsStartId) {
|
|
340
|
+
const startPicker = (document.querySelector(`#${controlsStartId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
|
|
341
|
+
startPicker?.setDate(start, true);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (controlsEndId) {
|
|
345
|
+
const endPicker = (document.querySelector(`#${controlsEndId}`) as HTMLElement & { _flatpickr?: any })?._flatpickr;
|
|
346
|
+
endPicker?.setDate(end, true);
|
|
347
|
+
}
|
|
348
|
+
}, 0);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}, [variant, initialSelected, controlsStartId, controlsEndId]);
|
|
248
352
|
|
|
249
353
|
return (
|
|
250
354
|
<div {...ariaProps}
|
|
@@ -252,6 +356,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
|
252
356
|
{...htmlProps}
|
|
253
357
|
className={classes}
|
|
254
358
|
id={id}
|
|
359
|
+
ref={outerDivRef}
|
|
255
360
|
style={{position: "relative"}}
|
|
256
361
|
>
|
|
257
362
|
<DropdownContext.Provider
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
|
3
|
+
|
|
4
|
+
const DropdownQuickpick = (props) => {
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
<div>
|
|
8
|
+
<Dropdown
|
|
9
|
+
label="Date Range"
|
|
10
|
+
onSelect={(selectedItem) => console.log(selectedItem)}
|
|
11
|
+
variant="quickpick"
|
|
12
|
+
{...props}
|
|
13
|
+
/>
|
|
14
|
+
</div>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default DropdownQuickpick
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
|
3
|
+
|
|
4
|
+
const DropdownQuickpickDefaultDates = (props) => {
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
<div>
|
|
8
|
+
<Dropdown
|
|
9
|
+
defaultValue="This Year"
|
|
10
|
+
label="Date Range"
|
|
11
|
+
variant="quickpick"
|
|
12
|
+
{...props}
|
|
13
|
+
/>
|
|
14
|
+
</div>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default DropdownQuickpickDefaultDates
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
To set a default value for the Dropdown, you can use the label of the range you want set as default, for example "This Year", "Today", etc.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
|
3
|
+
|
|
4
|
+
const DropdownQuickpickRangeEnd = (props) => {
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
<div>
|
|
8
|
+
<Dropdown
|
|
9
|
+
label="Date Range"
|
|
10
|
+
onSelect={(selectedItem) => console.log(selectedItem)}
|
|
11
|
+
rangeEndsToday
|
|
12
|
+
variant="quickpick"
|
|
13
|
+
{...props}
|
|
14
|
+
/>
|
|
15
|
+
</div>
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default DropdownQuickpickRangeEnd
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
The optional `rangeEndsToday` prop can be used with the quickpick variant to set end date on all ranges that start with 'this' to today's date. For instance, by default 'This Year' will set end day to 12/31/(current year), but if `rangeEndsToday` prop is used, end date on that range will be today's date.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Dropdown from "../../pb_dropdown/_dropdown";
|
|
3
|
+
import DatePicker from "../../pb_date_picker/_date_picker";
|
|
4
|
+
|
|
5
|
+
const DropdownQuickpickWithDatePickers = (props) => {
|
|
6
|
+
return (
|
|
7
|
+
<>
|
|
8
|
+
<Dropdown
|
|
9
|
+
controlsEndId="end-date-picker"
|
|
10
|
+
controlsStartId="start-date-picker"
|
|
11
|
+
id="dropdown-quickpick"
|
|
12
|
+
label="Range"
|
|
13
|
+
marginBottom="sm"
|
|
14
|
+
placeholder="Select a Date Range"
|
|
15
|
+
variant="quickpick"
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
18
|
+
|
|
19
|
+
<DatePicker
|
|
20
|
+
label="Start Date"
|
|
21
|
+
pickerId="start-date-picker"
|
|
22
|
+
placeholder="Select a Start Date"
|
|
23
|
+
syncStartWith="dropdown-quickpick"
|
|
24
|
+
{...props}
|
|
25
|
+
/>
|
|
26
|
+
|
|
27
|
+
<DatePicker
|
|
28
|
+
label="End Date"
|
|
29
|
+
pickerId="end-date-picker"
|
|
30
|
+
placeholder="Select an End Date"
|
|
31
|
+
syncEndWith="dropdown-quickpick"
|
|
32
|
+
{...props}
|
|
33
|
+
/>
|
|
34
|
+
</>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default DropdownQuickpickWithDatePickers;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
You can link a Dropdown (`quickpick` variant) to standard DatePickers using the following props:
|
|
2
|
+
|
|
3
|
+
**For the Dropdown**:
|
|
4
|
+
`controlsStartId`: ID of the DatePicker that should receive the start date.
|
|
5
|
+
|
|
6
|
+
`controlsEndId`: ID of the DatePicker that should receive the end date.
|
|
7
|
+
|
|
8
|
+
When a quickpick option like “This Year” is selected, it automatically populates the linked start and end inputs.
|
|
9
|
+
|
|
10
|
+
**For the Start/End DatePickers**:
|
|
11
|
+
`syncStartWith`: ID of the quickpick this start date is synced to.
|
|
12
|
+
`syncEndWith`: ID of the quickpick this end date is synced to.
|
|
13
|
+
|
|
14
|
+
When a user manually edits the start or end date, it clears the selected quickpick to prevent conflicting values.
|
data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options_react.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
The `activeStyle` prop can be used to customize the appearance of the dropdown selection indicator. It accepts an object with the following keys: `backgroundColor` sets the background color of the selected item (and its hover state); `fontColor` sets the font color of the selected item.
|
|
2
2
|
|
|
3
3
|
`backgroundColor` **Type**: String | **Values**: bg_light | white | **Default**: (no selection) is primary
|
|
4
|
-
`fontColor` **Type**: String | **Values**: primary | all [Playbook Text Colors](https://playbook.powerapp.cloud/
|
|
4
|
+
`fontColor` **Type**: String | **Values**: primary | all [Playbook Text Colors](https://playbook.powerapp.cloud/global_props/colors) | **Default**: (no selection) is white
|
|
@@ -49,4 +49,9 @@ examples:
|
|
|
49
49
|
- dropdown_clear_selection: Clear Selection
|
|
50
50
|
- dropdown_separators_hidden: Separators Hidden
|
|
51
51
|
- dropdown_with_external_control: useDropdown Hook
|
|
52
|
+
- dropdown_quickpick: Quick Pick Variant
|
|
53
|
+
- dropdown_quickpick_range_end: Quick Pick Variant (Range Ends Today)
|
|
54
|
+
- dropdown_quickpick_default_dates: Quick Pick Variant (Default Dates)
|
|
55
|
+
- dropdown_quickpick_with_date_pickers: Quick Pick Variant with Date Pickers
|
|
56
|
+
|
|
52
57
|
|
|
@@ -22,4 +22,8 @@ export { default as DropdownMultiSelectWithDefault } from './_dropdown_multi_sel
|
|
|
22
22
|
export { default as DropdownMultiSelectWithCustomOptions } from './_dropdown_multi_select_with_custom_options.jsx'
|
|
23
23
|
export {default as DropdownWithCustomIconOptions} from './_dropdown_with_custom_icon_options.jsx'
|
|
24
24
|
export {default as DropdownWithCustomRadioOptions} from './_dropdown_with_custom_radio_options.jsx'
|
|
25
|
-
export {default as DropdownWithCustomActiveStyleOptions} from './_dropdown_with_custom_active_style_options.jsx'
|
|
25
|
+
export {default as DropdownWithCustomActiveStyleOptions} from './_dropdown_with_custom_active_style_options.jsx'
|
|
26
|
+
export { default as DropdownQuickpick } from './_dropdown_quickpick.jsx'
|
|
27
|
+
export { default as DropdownQuickpickRangeEnd } from './_dropdown_quickpick_range_end.jsx'
|
|
28
|
+
export { default as DropdownQuickpickDefaultDates } from './_dropdown_quickpick_default_dates.jsx'
|
|
29
|
+
export { default as DropdownQuickpickWithDatePickers } from './_dropdown_quickpick_with_date_pickers.jsx'
|
|
@@ -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>
|
|
@@ -22,13 +22,27 @@
|
|
|
22
22
|
}) %>
|
|
23
23
|
|
|
24
24
|
<script>
|
|
25
|
+
// Hide toasts immediately
|
|
26
|
+
const hideAutoToasts = () => {
|
|
27
|
+
const toastAuto = document.getElementById('toast-auto-close');
|
|
28
|
+
const toastAutoCloseable = document.getElementById('toast-auto-close-closeable');
|
|
29
|
+
if (toastAuto) toastAuto.style.display = 'none';
|
|
30
|
+
if (toastAutoCloseable) toastAutoCloseable.style.display = 'none';
|
|
31
|
+
}
|
|
32
|
+
hideAutoToasts();
|
|
33
|
+
|
|
34
|
+
// Handle various page load/restore events
|
|
35
|
+
window.addEventListener('pageshow', hideAutoToasts)
|
|
36
|
+
document.addEventListener('turbolinks:load', hideAutoToasts)
|
|
37
|
+
document.addEventListener('turbo:load', hideAutoToasts)
|
|
38
|
+
|
|
25
39
|
document.addEventListener('DOMContentLoaded', () => {
|
|
26
40
|
// Initialize toast elements and buttons
|
|
27
41
|
const toasts = {
|
|
28
42
|
'#toast-auto-close': document.querySelector("#toast-auto-close"),
|
|
29
43
|
'#toast-auto-close-closeable': document.querySelector("#toast-auto-close-closeable")
|
|
30
44
|
}
|
|
31
|
-
|
|
45
|
+
|
|
32
46
|
const buttons = {
|
|
33
47
|
'#toast-auto-close': document.querySelector("button[data-toast='#toast-auto-close']"),
|
|
34
48
|
'#toast-auto-close-closeable': document.querySelector("button[data-toast='#toast-auto-close-closeable']")
|