@coreui/react-pro 5.10.0 → 5.12.0
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.
- package/README.md +1 -1
- package/dist/cjs/components/accordion/CAccordionBody.js +2 -2
- package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
- package/dist/cjs/components/accordion/CAccordionButton.js +2 -2
- package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
- package/dist/cjs/components/accordion/CAccordionItem.d.ts +5 -0
- package/dist/cjs/components/accordion/CAccordionItem.js +7 -4
- package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
- package/dist/cjs/components/badge/CBadge.js +1 -1
- package/dist/cjs/components/badge/CBadge.js.map +1 -1
- package/dist/cjs/components/calendar/CCalendar.d.ts +57 -44
- package/dist/cjs/components/calendar/CCalendar.js +51 -187
- package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
- package/dist/cjs/components/calendar/CCalendarNavigation.d.ts +21 -0
- package/dist/cjs/components/calendar/CCalendarNavigation.js +23 -0
- package/dist/cjs/components/calendar/CCalendarNavigation.js.map +1 -0
- package/dist/cjs/components/calendar/CCalendarPanel.d.ts +28 -0
- package/dist/cjs/components/calendar/CCalendarPanel.js +149 -0
- package/dist/cjs/components/calendar/CCalendarPanel.js.map +1 -0
- package/dist/cjs/components/calendar/types.d.ts +3 -0
- package/dist/cjs/components/calendar/utils.d.ts +175 -18
- package/dist/cjs/components/calendar/utils.js +312 -43
- package/dist/cjs/components/calendar/utils.js.map +1 -1
- package/dist/cjs/components/date-picker/CDatePicker.d.ts +1 -1
- package/dist/cjs/components/date-range-picker/CDateRangePicker.d.ts +2 -2
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js +0 -2
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/cjs/components/date-range-picker/utils.d.ts +16 -0
- package/dist/cjs/components/date-range-picker/utils.js +18 -2
- package/dist/cjs/components/date-range-picker/utils.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdown.d.ts +77 -20
- package/dist/cjs/components/dropdown/CDropdown.js +6 -3
- package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownMenu.js +1 -1
- package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/cjs/components/modal/CModal.js +0 -1
- package/dist/cjs/components/modal/CModal.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroup.js +1 -1
- package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
- package/dist/cjs/components/popover/CPopover.d.ts +75 -20
- package/dist/cjs/components/popover/CPopover.js +8 -21
- package/dist/cjs/components/popover/CPopover.js.map +1 -1
- package/dist/cjs/components/progress/CProgress.d.ts +1 -1
- package/dist/cjs/components/range-slider/CRangeSlider.js +6 -2
- package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebar.d.ts +7 -2
- package/dist/cjs/components/sidebar/CSidebar.js +7 -6
- package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
- package/dist/cjs/components/smart-pagination/CSmartPagination.d.ts +4 -12
- package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableHead.js +12 -25
- package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
- package/dist/cjs/components/smart-table/types.d.ts +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.d.ts +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/cjs/components/time-picker/types.d.ts +5 -0
- package/dist/cjs/components/time-picker/utils.d.ts +8 -11
- package/dist/cjs/components/time-picker/utils.js +8 -4
- package/dist/cjs/components/time-picker/utils.js.map +1 -1
- package/dist/cjs/components/tooltip/CTooltip.d.ts +67 -15
- package/dist/cjs/components/tooltip/CTooltip.js +8 -21
- package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
- package/dist/cjs/hooks/index.d.ts +2 -1
- package/dist/cjs/hooks/useClipboard.d.ts +12 -0
- package/dist/cjs/hooks/useClipboard.js +54 -0
- package/dist/cjs/hooks/useClipboard.js.map +1 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node_modules/react-device-detect/dist/lib.js +1 -1
- package/dist/cjs/node_modules/react-device-detect/dist/lib.js.map +1 -1
- package/dist/cjs/node_modules/tslib/tslib.es6.js +40 -0
- package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -1
- package/dist/cjs/utils/mergeClassNames.d.ts +2 -0
- package/dist/esm/components/accordion/CAccordionBody.js +2 -2
- package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
- package/dist/esm/components/accordion/CAccordionButton.js +2 -2
- package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
- package/dist/esm/components/accordion/CAccordionItem.d.ts +5 -0
- package/dist/esm/components/accordion/CAccordionItem.js +8 -5
- package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
- package/dist/esm/components/badge/CBadge.js +1 -1
- package/dist/esm/components/badge/CBadge.js.map +1 -1
- package/dist/esm/components/calendar/CCalendar.d.ts +57 -44
- package/dist/esm/components/calendar/CCalendar.js +52 -188
- package/dist/esm/components/calendar/CCalendar.js.map +1 -1
- package/dist/esm/components/calendar/CCalendarNavigation.d.ts +21 -0
- package/dist/esm/components/calendar/CCalendarNavigation.js +21 -0
- package/dist/esm/components/calendar/CCalendarNavigation.js.map +1 -0
- package/dist/esm/components/calendar/CCalendarPanel.d.ts +28 -0
- package/dist/esm/components/calendar/CCalendarPanel.js +147 -0
- package/dist/esm/components/calendar/CCalendarPanel.js.map +1 -0
- package/dist/esm/components/calendar/types.d.ts +3 -0
- package/dist/esm/components/calendar/utils.d.ts +175 -18
- package/dist/esm/components/calendar/utils.js +306 -44
- package/dist/esm/components/calendar/utils.js.map +1 -1
- package/dist/esm/components/date-picker/CDatePicker.d.ts +1 -1
- package/dist/esm/components/date-range-picker/CDateRangePicker.d.ts +2 -2
- package/dist/esm/components/date-range-picker/CDateRangePicker.js +0 -2
- package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/esm/components/date-range-picker/utils.d.ts +16 -0
- package/dist/esm/components/date-range-picker/utils.js +18 -2
- package/dist/esm/components/date-range-picker/utils.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdown.d.ts +77 -20
- package/dist/esm/components/dropdown/CDropdown.js +6 -3
- package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownMenu.js +1 -1
- package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/esm/components/modal/CModal.js +0 -1
- package/dist/esm/components/modal/CModal.js.map +1 -1
- package/dist/esm/components/nav/CNavGroup.js +1 -1
- package/dist/esm/components/nav/CNavGroup.js.map +1 -1
- package/dist/esm/components/popover/CPopover.d.ts +75 -20
- package/dist/esm/components/popover/CPopover.js +8 -21
- package/dist/esm/components/popover/CPopover.js.map +1 -1
- package/dist/esm/components/progress/CProgress.d.ts +1 -1
- package/dist/esm/components/range-slider/CRangeSlider.js +6 -2
- package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebar.d.ts +7 -2
- package/dist/esm/components/sidebar/CSidebar.js +7 -6
- package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
- package/dist/esm/components/smart-pagination/CSmartPagination.d.ts +4 -12
- package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableHead.js +13 -26
- package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
- package/dist/esm/components/smart-table/types.d.ts +1 -1
- package/dist/esm/components/time-picker/CTimePicker.d.ts +1 -1
- package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/esm/components/time-picker/types.d.ts +5 -0
- package/dist/esm/components/time-picker/utils.d.ts +8 -11
- package/dist/esm/components/time-picker/utils.js +8 -4
- package/dist/esm/components/time-picker/utils.js.map +1 -1
- package/dist/esm/components/tooltip/CTooltip.d.ts +67 -15
- package/dist/esm/components/tooltip/CTooltip.js +8 -21
- package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
- package/dist/esm/hooks/index.d.ts +2 -1
- package/dist/esm/hooks/useClipboard.d.ts +12 -0
- package/dist/esm/hooks/useClipboard.js +52 -0
- package/dist/esm/hooks/useClipboard.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/react-device-detect/dist/lib.js +1 -1
- package/dist/esm/node_modules/react-device-detect/dist/lib.js.map +1 -1
- package/dist/esm/node_modules/tslib/tslib.es6.js +39 -1
- package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -1
- package/dist/esm/utils/mergeClassNames.d.ts +2 -0
- package/package.json +12 -10
- package/src/components/accordion/CAccordionBody.tsx +3 -3
- package/src/components/accordion/CAccordionButton.tsx +3 -2
- package/src/components/accordion/CAccordionItem.tsx +14 -5
- package/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.tsx.snap +0 -2
- package/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.tsx.snap +0 -2
- package/src/components/badge/CBadge.tsx +1 -1
- package/src/components/calendar/CCalendar.tsx +154 -489
- package/src/components/calendar/CCalendarNavigation.tsx +120 -0
- package/src/components/calendar/CCalendarPanel.tsx +306 -0
- package/src/components/calendar/types.ts +5 -0
- package/src/components/calendar/utils.ts +414 -109
- package/src/components/carousel/__tests__/CCarousel.spec.tsx +1 -2
- package/src/components/date-picker/CDatePicker.tsx +1 -1
- package/src/components/date-range-picker/CDateRangePicker.tsx +2 -4
- package/src/components/date-range-picker/utils.ts +23 -3
- package/src/components/dropdown/CDropdown.tsx +106 -26
- package/src/components/dropdown/CDropdownMenu.tsx +0 -1
- package/src/components/dropdown/CDropdownToggle.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdown.spec.tsx +43 -19
- package/src/components/modal/CModal.tsx +0 -2
- package/src/components/modal/__tests__/CModal.spec.tsx +33 -25
- package/src/components/nav/CNavGroup.tsx +5 -1
- package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +4 -1
- package/src/components/popover/CPopover.tsx +103 -43
- package/src/components/popover/__tests__/CPopover.spec.tsx +1 -1
- package/src/components/popover/__tests__/__snapshots__/CPopover.spec.tsx.snap +2 -3
- package/src/components/progress/CProgress.tsx +1 -1
- package/src/components/range-slider/CRangeSlider.tsx +7 -2
- package/src/components/sidebar/CSidebar.tsx +15 -5
- package/src/components/smart-pagination/CSmartPagination.tsx +4 -12
- package/src/components/smart-table/CSmartTableHead.tsx +10 -34
- package/src/components/smart-table/types.ts +7 -1
- package/src/components/time-picker/CTimePicker.tsx +3 -3
- package/src/components/time-picker/types.ts +7 -0
- package/src/components/time-picker/utils.ts +15 -13
- package/src/components/tooltip/CTooltip.tsx +94 -38
- package/src/components/tooltip/__tests__/__snapshots__/CTooltip.spec.tsx.snap +0 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useClipboard.ts +38 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/mergeClassNames.ts +25 -0
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates input IDs or names based on the provided attributes, range, and position.
|
|
3
|
+
*
|
|
4
|
+
* @param attribute - A single string or a tuple of two strings representing the attribute names.
|
|
5
|
+
* @param range - A boolean indicating whether the input is part of a range.
|
|
6
|
+
* @param position - Optional. Specifies the position ('start' or 'end') when `range` is true.
|
|
7
|
+
* @returns A string representing the input ID or name.
|
|
8
|
+
*/
|
|
1
9
|
export const getInputIdOrName = (
|
|
2
10
|
attribute: string | [string, string],
|
|
3
11
|
range: boolean,
|
|
@@ -14,7 +22,19 @@ export const getInputIdOrName = (
|
|
|
14
22
|
return attribute
|
|
15
23
|
}
|
|
16
24
|
|
|
17
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Parses a date string into a Date object based on the provided locale and time inclusion.
|
|
27
|
+
*
|
|
28
|
+
* @param dateString - The date string to parse.
|
|
29
|
+
* @param locale - The locale to use for parsing the date string.
|
|
30
|
+
* @param includeTime - Optional. Determines whether to include time in the parsed Date object.
|
|
31
|
+
* @returns A Date object representing the parsed date and time, or `undefined` if parsing fails.
|
|
32
|
+
*/
|
|
33
|
+
export const getLocalDateFromString = (
|
|
34
|
+
string: string,
|
|
35
|
+
locale: string,
|
|
36
|
+
time?: boolean,
|
|
37
|
+
): Date | undefined => {
|
|
18
38
|
if (!Number.isNaN(Date.parse(string))) {
|
|
19
39
|
return new Date(Date.parse(string))
|
|
20
40
|
}
|
|
@@ -48,9 +68,9 @@ export const getLocalDateFromString = (string: string, locale: string, time?: bo
|
|
|
48
68
|
Number(partials.groups['month']) - 1,
|
|
49
69
|
Number(partials.groups['day']),
|
|
50
70
|
partials.groups['ampm']
|
|
51
|
-
?
|
|
71
|
+
? partials.groups['ampm'] === 'PM'
|
|
52
72
|
? Number(partials.groups['hour']) + 12
|
|
53
|
-
: Number(partials.groups['hour'])
|
|
73
|
+
: Number(partials.groups['hour'])
|
|
54
74
|
: Number(partials.groups['hour']),
|
|
55
75
|
Number(partials.groups['minute']),
|
|
56
76
|
Number(partials.groups['second']),
|
|
@@ -10,6 +10,7 @@ import React, {
|
|
|
10
10
|
} from 'react'
|
|
11
11
|
import PropTypes from 'prop-types'
|
|
12
12
|
import classNames from 'classnames'
|
|
13
|
+
import type { Options } from '@popperjs/core'
|
|
13
14
|
|
|
14
15
|
import { PolymorphicRefForwardingComponent } from '../../helpers'
|
|
15
16
|
import { useForkedRef, usePopper } from '../../hooks'
|
|
@@ -22,77 +23,148 @@ import { getPlacement } from './utils'
|
|
|
22
23
|
|
|
23
24
|
export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIElement> {
|
|
24
25
|
/**
|
|
25
|
-
*
|
|
26
|
+
* Specifies the alignment of the React Dropdown Menu within this React Dropdown.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // Align dropdown menu to the end on large devices, otherwise start
|
|
30
|
+
* <CDropdown alignment={{ lg: 'end', xs: 'start' }}>
|
|
31
|
+
* <CDropdownToggle>Toggle dropdown</CDropdownToggle>
|
|
32
|
+
* <CDropdownMenu>
|
|
33
|
+
* <CDropdownItem>Action</CDropdownItem>
|
|
34
|
+
* <CDropdownItem>Another Action</CDropdownItem>
|
|
35
|
+
* </CDropdownMenu>
|
|
36
|
+
* </CDropdown>
|
|
26
37
|
*
|
|
27
38
|
* @type 'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'}
|
|
28
39
|
*/
|
|
29
40
|
alignment?: Alignments
|
|
41
|
+
|
|
30
42
|
/**
|
|
31
|
-
*
|
|
43
|
+
* Determines the root node component (native HTML element or a custom React component) for the React Dropdown.
|
|
32
44
|
*/
|
|
33
45
|
as?: ElementType
|
|
46
|
+
|
|
34
47
|
/**
|
|
35
|
-
*
|
|
36
|
-
* - `true` -
|
|
37
|
-
* - `false` -
|
|
38
|
-
* - `'inside'` -
|
|
39
|
-
* - `'outside'` -
|
|
48
|
+
* Configures automatic closing behavior for the React Dropdown:
|
|
49
|
+
* - `true` - Close on clicks inside or outside of the React Dropdown Menu.
|
|
50
|
+
* - `false` - Disable auto-close; manually call `hide` or `toggle` (also not closed by `Escape`).
|
|
51
|
+
* - `'inside'` - Close only when clicking inside the React Dropdown Menu.
|
|
52
|
+
* - `'outside'` - Close only when clicking outside the React Dropdown Menu.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* // Close only when user clicks outside of the menu
|
|
56
|
+
* <CDropdown autoClose="outside" />
|
|
40
57
|
*/
|
|
41
58
|
autoClose?: 'inside' | 'outside' | boolean
|
|
59
|
+
|
|
42
60
|
/**
|
|
43
|
-
*
|
|
61
|
+
* Adds custom classes to the React Dropdown root element.
|
|
44
62
|
*/
|
|
45
63
|
className?: string
|
|
64
|
+
|
|
46
65
|
/**
|
|
47
|
-
* Appends the
|
|
66
|
+
* Appends the React Dropdown Menu to a specific element. You can pass an HTML element or a function returning an element. Defaults to `document.body`.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // Append the menu to a custom container
|
|
70
|
+
* const myContainer = document.getElementById('my-container')
|
|
71
|
+
*
|
|
72
|
+
* <CDropdown container={myContainer} />
|
|
48
73
|
*
|
|
49
74
|
* @since 4.11.0
|
|
50
75
|
*/
|
|
51
76
|
container?: DocumentFragment | Element | (() => DocumentFragment | Element | null) | null
|
|
77
|
+
|
|
52
78
|
/**
|
|
53
|
-
*
|
|
79
|
+
* Applies a darker color scheme to the React Dropdown Menu, often used within dark navbars.
|
|
54
80
|
*/
|
|
55
81
|
dark?: boolean
|
|
82
|
+
|
|
56
83
|
/**
|
|
57
|
-
*
|
|
84
|
+
* Specifies the direction of the React Dropdown.
|
|
58
85
|
*/
|
|
59
86
|
direction?: 'center' | 'dropup' | 'dropup-center' | 'dropend' | 'dropstart'
|
|
87
|
+
|
|
60
88
|
/**
|
|
61
|
-
*
|
|
89
|
+
* Defines x and y offsets ([x, y]) for the React Dropdown Menu relative to its target.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* // Offset the menu 10px in X and 5px in Y direction
|
|
93
|
+
* <CDropdown offset={[10, 5]}>
|
|
94
|
+
* ...
|
|
95
|
+
* </CDropdown>
|
|
62
96
|
*/
|
|
63
97
|
offset?: [number, number]
|
|
98
|
+
|
|
64
99
|
/**
|
|
65
|
-
* Callback fired
|
|
100
|
+
* Callback fired right before the React Dropdown becomes hidden.
|
|
66
101
|
*
|
|
67
102
|
* @since 4.9.0
|
|
68
103
|
*/
|
|
69
104
|
onHide?: () => void
|
|
105
|
+
|
|
70
106
|
/**
|
|
71
|
-
* Callback fired
|
|
107
|
+
* Callback fired immediately after the React Dropdown is displayed.
|
|
72
108
|
*/
|
|
73
109
|
onShow?: () => void
|
|
110
|
+
|
|
74
111
|
/**
|
|
75
|
-
*
|
|
112
|
+
* Determines the placement of the React Dropdown Menu after Popper.js modifiers.
|
|
76
113
|
*
|
|
77
|
-
* @type 'auto' | 'top-end' | 'top' | 'top-start' | 'bottom-end' | 'bottom' | 'bottom-start' | 'right-start' | 'right' | 'right-end' | 'left-start' | 'left' | 'left-end'
|
|
114
|
+
* @type 'auto' | 'auto-start' | 'auto-end' | 'top-end' | 'top' | 'top-start' | 'bottom-end' | 'bottom' | 'bottom-start' | 'right-start' | 'right' | 'right-end' | 'left-start' | 'left' | 'left-end'
|
|
78
115
|
*/
|
|
79
116
|
placement?: Placements
|
|
117
|
+
|
|
80
118
|
/**
|
|
81
|
-
*
|
|
119
|
+
* Enables or disables dynamic positioning via Popper.js for the React Dropdown Menu.
|
|
82
120
|
*/
|
|
83
121
|
popper?: boolean
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Provides a custom Popper.js configuration or a function that returns a modified Popper.js configuration for advanced positioning of the React Dropdown Menu. [Read more](https://popper.js.org/docs/v2/constructors/#options)
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* // Providing a custom popper config
|
|
128
|
+
* <CDropdown
|
|
129
|
+
* popperConfig={{
|
|
130
|
+
* modifiers: [
|
|
131
|
+
* {
|
|
132
|
+
* name: 'flip',
|
|
133
|
+
* options: { fallbackPlacements: ['bottom', 'top'] },
|
|
134
|
+
* },
|
|
135
|
+
* ],
|
|
136
|
+
* }}
|
|
137
|
+
* >...</CDropdown>
|
|
138
|
+
*
|
|
139
|
+
* @since 5.5.0
|
|
140
|
+
*/
|
|
141
|
+
popperConfig?: Partial<Options> | ((defaultPopperConfig: Partial<Options>) => Partial<Options>)
|
|
142
|
+
|
|
84
143
|
/**
|
|
85
|
-
*
|
|
144
|
+
* Renders the React Dropdown Menu using a React Portal, allowing it to escape the DOM hierarchy for improved positioning.
|
|
86
145
|
*
|
|
87
146
|
* @since 4.8.0
|
|
88
147
|
*/
|
|
89
148
|
portal?: boolean
|
|
149
|
+
|
|
90
150
|
/**
|
|
91
|
-
*
|
|
151
|
+
* Defines the visual variant of the React Dropdown
|
|
92
152
|
*/
|
|
93
153
|
variant?: 'btn-group' | 'dropdown' | 'input-group' | 'nav-item'
|
|
154
|
+
|
|
94
155
|
/**
|
|
95
|
-
*
|
|
156
|
+
* Controls the visibility of the React Dropdown Menu:
|
|
157
|
+
* - `true` - Visible
|
|
158
|
+
* - `false` - Hidden
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* // Programmatically manage the dropdown visibility
|
|
162
|
+
* const [visible, setVisible] = useState(false)
|
|
163
|
+
*
|
|
164
|
+
* <CDropdown visible={visible}>
|
|
165
|
+
* ...
|
|
166
|
+
* </CDropdown>
|
|
167
|
+
*
|
|
96
168
|
*/
|
|
97
169
|
visible?: boolean
|
|
98
170
|
}
|
|
@@ -126,12 +198,13 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
126
198
|
onShow,
|
|
127
199
|
placement = 'bottom-start',
|
|
128
200
|
popper = true,
|
|
201
|
+
popperConfig,
|
|
129
202
|
portal = false,
|
|
130
203
|
variant = 'btn-group',
|
|
131
204
|
visible = false,
|
|
132
205
|
...rest
|
|
133
206
|
},
|
|
134
|
-
ref
|
|
207
|
+
ref
|
|
135
208
|
) => {
|
|
136
209
|
const dropdownRef = useRef<HTMLDivElement>(null)
|
|
137
210
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -161,7 +234,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
161
234
|
setVisible,
|
|
162
235
|
}
|
|
163
236
|
|
|
164
|
-
const
|
|
237
|
+
const defaultPopperConfig = {
|
|
165
238
|
modifiers: [
|
|
166
239
|
{
|
|
167
240
|
name: 'offset',
|
|
@@ -173,6 +246,11 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
173
246
|
placement: getPlacement(placement, direction, alignment, isRTL(dropdownMenuRef.current)),
|
|
174
247
|
}
|
|
175
248
|
|
|
249
|
+
const computedPopperConfig: Partial<Options> = {
|
|
250
|
+
...defaultPopperConfig,
|
|
251
|
+
...(typeof popperConfig === 'function' ? popperConfig(defaultPopperConfig) : popperConfig),
|
|
252
|
+
}
|
|
253
|
+
|
|
176
254
|
useEffect(() => {
|
|
177
255
|
setVisible(visible)
|
|
178
256
|
}, [visible])
|
|
@@ -180,7 +258,8 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
180
258
|
useEffect(() => {
|
|
181
259
|
if (_visible && dropdownToggleRef.current && dropdownMenuRef.current) {
|
|
182
260
|
dropdownToggleRef.current.focus()
|
|
183
|
-
popper &&
|
|
261
|
+
popper &&
|
|
262
|
+
initPopper(dropdownToggleRef.current, dropdownMenuRef.current, computedPopperConfig)
|
|
184
263
|
window.addEventListener('mouseup', handleMouseUp)
|
|
185
264
|
window.addEventListener('keyup', handleKeyup)
|
|
186
265
|
dropdownToggleRef.current.addEventListener('keydown', handleKeydown)
|
|
@@ -209,7 +288,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
209
288
|
event.preventDefault()
|
|
210
289
|
const target = event.target as HTMLElement
|
|
211
290
|
const items: HTMLElement[] = Array.from(
|
|
212
|
-
dropdownMenuRef.current.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)')
|
|
291
|
+
dropdownMenuRef.current.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)')
|
|
213
292
|
)
|
|
214
293
|
getNextActiveElement(items, target, event.key === 'ArrowDown', true).focus()
|
|
215
294
|
}
|
|
@@ -258,7 +337,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
258
337
|
[`${direction}`]:
|
|
259
338
|
direction && direction !== 'center' && direction !== 'dropup-center',
|
|
260
339
|
},
|
|
261
|
-
className
|
|
340
|
+
className
|
|
262
341
|
)}
|
|
263
342
|
{...rest}
|
|
264
343
|
ref={forkedRef}
|
|
@@ -268,7 +347,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
268
347
|
)}
|
|
269
348
|
</CDropdownContext.Provider>
|
|
270
349
|
)
|
|
271
|
-
}
|
|
350
|
+
}
|
|
272
351
|
)
|
|
273
352
|
|
|
274
353
|
const alignmentDirection = PropTypes.oneOf<Directions>(['start', 'end'])
|
|
@@ -297,6 +376,7 @@ CDropdown.propTypes = {
|
|
|
297
376
|
onShow: PropTypes.func,
|
|
298
377
|
placement: placementPropType,
|
|
299
378
|
popper: PropTypes.bool,
|
|
379
|
+
popperConfig: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
|
|
300
380
|
portal: PropTypes.bool,
|
|
301
381
|
variant: PropTypes.oneOf(['btn-group', 'dropdown', 'input-group', 'nav-item']),
|
|
302
382
|
visible: PropTypes.bool,
|
|
@@ -42,7 +42,6 @@ export const CDropdownMenu: PolymorphicRefForwardingComponent<'ul', CDropdownMen
|
|
|
42
42
|
)}
|
|
43
43
|
ref={forkedRef}
|
|
44
44
|
role="menu"
|
|
45
|
-
aria-hidden={!visible}
|
|
46
45
|
{...(!popper && { 'data-coreui-popper': 'static' })}
|
|
47
46
|
{...(dark && { 'data-coreui-theme': 'dark' })}
|
|
48
47
|
{...rest}
|
|
@@ -90,7 +90,7 @@ export const CDropdownToggle: FC<CDropdownToggleProps> = ({
|
|
|
90
90
|
|
|
91
91
|
if (variant === 'nav-item' && navLink) {
|
|
92
92
|
return (
|
|
93
|
-
<a href="#" {...togglerProps} role="button" ref={dropdownToggleRef}>
|
|
93
|
+
<a href="#" {...togglerProps} role="button" {...rest} ref={dropdownToggleRef}>
|
|
94
94
|
{children}
|
|
95
95
|
</a>
|
|
96
96
|
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
2
|
+
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
3
3
|
import '@testing-library/jest-dom'
|
|
4
4
|
import {
|
|
5
5
|
CDropdown,
|
|
@@ -52,26 +52,50 @@ test('CDropdown customize', async () => {
|
|
|
52
52
|
// jest.useRealTimers()
|
|
53
53
|
// })
|
|
54
54
|
|
|
55
|
-
test('CDropdown click', async () => {
|
|
55
|
+
test('CDropdown opens on toggle click and closes on clicking outside', async () => {
|
|
56
56
|
render(
|
|
57
|
-
<
|
|
58
|
-
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
<div>
|
|
58
|
+
{/* External element to simulate clicking outside the dropdown */}
|
|
59
|
+
<div data-testid="external-area">External Area</div>
|
|
60
|
+
|
|
61
|
+
{/* The dropdown component */}
|
|
62
|
+
<CDropdown>
|
|
63
|
+
<CDropdownToggle>Test</CDropdownToggle>
|
|
64
|
+
<CDropdownMenu>
|
|
65
|
+
<CDropdownItem>A</CDropdownItem>
|
|
66
|
+
<CDropdownItem>B</CDropdownItem>
|
|
67
|
+
</CDropdownMenu>
|
|
68
|
+
</CDropdown>
|
|
69
|
+
</div>,
|
|
64
70
|
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
|
|
72
|
+
// Ensure the dropdown is initially closed
|
|
73
|
+
const toggleButton = screen.getByText('Test')
|
|
74
|
+
expect(toggleButton).toBeInTheDocument()
|
|
75
|
+
|
|
76
|
+
// Assuming the 'show' class is applied to the CDropdownMenu
|
|
77
|
+
const dropdownMenu = screen.getByRole('menu', { hidden: true }) // Adjust role if different
|
|
78
|
+
expect(dropdownMenu).not.toHaveClass('show')
|
|
79
|
+
|
|
80
|
+
// Click on the toggle to open the dropdown
|
|
81
|
+
fireEvent.click(toggleButton)
|
|
82
|
+
|
|
83
|
+
// Wait for the dropdown menu to become visible
|
|
84
|
+
await waitFor(() => {
|
|
85
|
+
const openedMenu = screen.getByRole('menu') // Adjust role if different
|
|
86
|
+
expect(openedMenu).toBeVisible()
|
|
87
|
+
expect(openedMenu).toHaveClass('show')
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
// Click outside the dropdown to close it
|
|
91
|
+
const externalArea = screen.getByTestId('external-area')
|
|
92
|
+
fireEvent.mouseUp(externalArea)
|
|
93
|
+
|
|
94
|
+
// Wait for the dropdown menu to be hidden
|
|
95
|
+
await waitFor(() => {
|
|
96
|
+
const closedMenu = screen.getByRole('menu', { hidden: true }) // Adjust role if different
|
|
97
|
+
expect(closedMenu).not.toHaveClass('show')
|
|
98
|
+
})
|
|
75
99
|
})
|
|
76
100
|
|
|
77
101
|
test('CDropdown example', async () => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
|
-
import { render, fireEvent } from '@testing-library/react'
|
|
2
|
+
import { render, fireEvent, screen, waitFor } from '@testing-library/react'
|
|
3
3
|
import '@testing-library/jest-dom'
|
|
4
4
|
import { CModal } from '../../../index'
|
|
5
5
|
|
|
@@ -33,34 +33,42 @@ test('CModal dialog close on press ESC', async () => {
|
|
|
33
33
|
</CModal>,
|
|
34
34
|
)
|
|
35
35
|
expect(onClose).toHaveBeenCalledTimes(0)
|
|
36
|
-
|
|
36
|
+
|
|
37
|
+
const modal = screen.getByText('Test').closest('.modal')
|
|
38
|
+
expect(modal).toBeInTheDocument()
|
|
39
|
+
|
|
37
40
|
if (modal !== null) {
|
|
38
41
|
fireEvent.keyDown(modal, {
|
|
39
42
|
key: 'Escape',
|
|
40
|
-
code: 'Escape',
|
|
41
|
-
keyCode: 27,
|
|
42
|
-
charCode: 27,
|
|
43
43
|
})
|
|
44
|
-
}
|
|
45
|
-
await new Promise((r) => setTimeout(r, 1000))
|
|
46
|
-
console.log(modal)
|
|
47
|
-
expect(onClose).toHaveBeenCalledTimes(1)
|
|
48
|
-
})
|
|
49
44
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
render(
|
|
54
|
-
<CModal onClose={onClose} portal={false} visible={true}>
|
|
55
|
-
Test
|
|
56
|
-
</CModal>,
|
|
57
|
-
)
|
|
58
|
-
expect(onClose).toHaveBeenCalledTimes(0)
|
|
59
|
-
const backdrop = document.querySelector('.modal-backdrop')
|
|
60
|
-
if (backdrop !== null) {
|
|
61
|
-
fireEvent.click(backdrop)
|
|
45
|
+
await waitFor(() => {
|
|
46
|
+
expect(onClose).toHaveBeenCalledTimes(1)
|
|
47
|
+
})
|
|
62
48
|
}
|
|
63
|
-
jest.runAllTimers()
|
|
64
|
-
expect(onClose).toHaveBeenCalledTimes(1)
|
|
65
|
-
jest.useRealTimers()
|
|
66
49
|
})
|
|
50
|
+
|
|
51
|
+
// test('CModal dialog closes when clicking outside the modal', async () => {
|
|
52
|
+
// const onClose = jest.fn()
|
|
53
|
+
|
|
54
|
+
// render(
|
|
55
|
+
// <CModal onClose={onClose} portal={false} visible>
|
|
56
|
+
// Test
|
|
57
|
+
// </CModal>,
|
|
58
|
+
// )
|
|
59
|
+
|
|
60
|
+
// // Ensure onClose hasn't been called yet
|
|
61
|
+
// expect(onClose).not.toHaveBeenCalled()
|
|
62
|
+
|
|
63
|
+
// // Optionally, verify that the modal is in the document
|
|
64
|
+
// const modal = screen.getByText('Test').closest('.modal')
|
|
65
|
+
// expect(modal).toBeInTheDocument()
|
|
66
|
+
|
|
67
|
+
// // Simulate a click on the external area (outside the modal)
|
|
68
|
+
// fireEvent.mouseDown(document.body)
|
|
69
|
+
|
|
70
|
+
// // Wait for onClose to be called once
|
|
71
|
+
// await waitFor(() => {
|
|
72
|
+
// expect(onClose).toHaveBeenCalledTimes(1)
|
|
73
|
+
// })
|
|
74
|
+
// })
|
|
@@ -124,7 +124,11 @@ export const CNavGroup: PolymorphicRefForwardingComponent<'li', CNavGroupProps>
|
|
|
124
124
|
ref={ref}
|
|
125
125
|
>
|
|
126
126
|
{toggler && (
|
|
127
|
-
<a
|
|
127
|
+
<a
|
|
128
|
+
className="nav-link nav-group-toggle"
|
|
129
|
+
href="#"
|
|
130
|
+
onClick={(event) => handleTogglerOnCLick(event)}
|
|
131
|
+
>
|
|
128
132
|
{toggler}
|
|
129
133
|
</a>
|
|
130
134
|
)}
|
|
@@ -7,12 +7,13 @@ exports[`CNavGroup customize 1`] = `
|
|
|
7
7
|
>
|
|
8
8
|
<a
|
|
9
9
|
class="nav-link nav-group-toggle"
|
|
10
|
+
href="#"
|
|
10
11
|
>
|
|
11
12
|
anchorText
|
|
12
13
|
</a>
|
|
13
14
|
<ul
|
|
14
15
|
class="nav-group-items"
|
|
15
|
-
style="
|
|
16
|
+
style="height: 0px; display: block;"
|
|
16
17
|
/>
|
|
17
18
|
</li>
|
|
18
19
|
</div>
|
|
@@ -25,11 +26,13 @@ exports[`loads and displays CNavGroup component 1`] = `
|
|
|
25
26
|
>
|
|
26
27
|
<a
|
|
27
28
|
class="nav-link nav-group-toggle"
|
|
29
|
+
href="#"
|
|
28
30
|
>
|
|
29
31
|
anchorText
|
|
30
32
|
</a>
|
|
31
33
|
<ul
|
|
32
34
|
class="nav-group-items"
|
|
35
|
+
style="height: 0px;"
|
|
33
36
|
/>
|
|
34
37
|
</li>
|
|
35
38
|
</div>
|