@coreui/react-pro 5.25.0 → 5.26.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/dist/cjs/components/card/CCardImage.js.map +1 -1
- package/dist/cjs/components/carousel/CCarousel.js +44 -33
- package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
- package/dist/cjs/components/carousel/CCarouselItem.js +19 -28
- package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/cjs/components/chip/CChip.d.ts +12 -0
- package/dist/cjs/components/chip/CChip.js +16 -63
- package/dist/cjs/components/chip/CChip.js.map +1 -1
- package/dist/cjs/components/chip/const.d.ts +1 -0
- package/dist/cjs/components/chip/const.js +8 -0
- package/dist/cjs/components/chip/const.js.map +1 -0
- package/dist/cjs/components/chip-set/CChipSet.d.ts +73 -0
- package/dist/cjs/components/chip-set/CChipSet.js +66 -0
- package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
- package/dist/cjs/components/chip-set/index.d.ts +2 -0
- package/dist/cjs/components/chip-set/useChipSet.d.ts +48 -0
- package/dist/cjs/components/chip-set/useChipSet.js +163 -0
- package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
- package/dist/cjs/components/chip-set/utils.d.ts +7 -0
- package/dist/cjs/components/chip-set/utils.js +18 -0
- package/dist/cjs/components/chip-set/utils.js.map +1 -0
- package/dist/cjs/components/collapse/CCollapse.js +14 -6
- package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
- package/dist/cjs/components/conditional-portal/CConditionalPortal.js +3 -1
- package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdown.js +22 -29
- package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/cjs/components/form/CChipInput.d.ts +14 -2
- package/dist/cjs/components/form/CChipInput.js +77 -49
- package/dist/cjs/components/form/CChipInput.js.map +1 -1
- package/dist/cjs/components/form/CFormCheck.js.map +1 -1
- package/dist/cjs/components/form/CFormInput.js.map +1 -1
- package/dist/cjs/components/form/CFormSelect.js.map +1 -1
- package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
- package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
- package/dist/cjs/components/grid/CContainer.js +3 -1
- package/dist/cjs/components/grid/CContainer.js.map +1 -1
- package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/link/CLink.js +4 -2
- package/dist/cjs/components/link/CLink.js.map +1 -1
- package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/cjs/components/modal/CModal.js +14 -2
- package/dist/cjs/components/modal/CModal.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelect.d.ts +73 -1
- package/dist/cjs/components/multi-select/CMultiSelect.js +157 -18
- package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +3 -0
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js +45 -2
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +1 -0
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js +4 -3
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/cjs/components/multi-select/types.d.ts +12 -0
- package/dist/cjs/components/multi-select/utils.js +1 -4
- package/dist/cjs/components/multi-select/utils.js.map +1 -1
- package/dist/cjs/components/nav/CNav.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroup.d.ts +10 -5
- package/dist/cjs/components/nav/CNavGroup.js +83 -24
- package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroupContext.d.ts +25 -0
- package/dist/cjs/components/nav/CNavGroupContext.js +13 -0
- package/dist/cjs/components/nav/CNavGroupContext.js.map +1 -0
- package/dist/cjs/components/nav/CNavLink.d.ts +1 -5
- package/dist/cjs/components/nav/CNavLink.js +21 -8
- package/dist/cjs/components/nav/CNavLink.js.map +1 -1
- package/dist/cjs/components/popover/CPopover.js +57 -9
- package/dist/cjs/components/popover/CPopover.js.map +1 -1
- package/dist/cjs/components/progress/CProgress.js.map +1 -1
- package/dist/cjs/components/rating/CRating.d.ts +1 -1
- package/dist/cjs/components/rating/CRating.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebar.js +40 -23
- package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebarNav.js +6 -35
- package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
- package/dist/cjs/components/table/types.d.ts +2 -1
- package/dist/cjs/components/table/utils.js +4 -4
- package/dist/cjs/components/table/utils.js.map +1 -1
- package/dist/cjs/components/tabs/CTabPanel.js +3 -1
- package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
- package/dist/cjs/components/tooltip/CTooltip.js +57 -9
- package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
- package/dist/cjs/helpers/polymorphicComponent.d.ts +1 -2
- package/dist/cjs/hooks/useForkedRef.d.ts +1 -1
- package/dist/cjs/hooks/useForkedRef.js +6 -3
- package/dist/cjs/hooks/useForkedRef.js.map +1 -1
- package/dist/cjs/hooks/usePopper.js +8 -6
- package/dist/cjs/hooks/usePopper.js.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
- package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js +3 -3
- package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
- package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -1
- package/dist/cjs/utils/swipe.d.ts +26 -0
- package/dist/cjs/utils/swipe.js +94 -0
- package/dist/cjs/utils/swipe.js.map +1 -0
- package/dist/esm/components/card/CCardImage.js.map +1 -1
- package/dist/esm/components/carousel/CCarousel.js +44 -33
- package/dist/esm/components/carousel/CCarousel.js.map +1 -1
- package/dist/esm/components/carousel/CCarouselItem.js +19 -28
- package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/esm/components/chip/CChip.d.ts +12 -0
- package/dist/esm/components/chip/CChip.js +16 -63
- package/dist/esm/components/chip/CChip.js.map +1 -1
- package/dist/esm/components/chip/const.d.ts +1 -0
- package/dist/esm/components/chip/const.js +6 -0
- package/dist/esm/components/chip/const.js.map +1 -0
- package/dist/esm/components/chip-set/CChipSet.d.ts +73 -0
- package/dist/esm/components/chip-set/CChipSet.js +64 -0
- package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
- package/dist/esm/components/chip-set/index.d.ts +2 -0
- package/dist/esm/components/chip-set/useChipSet.d.ts +48 -0
- package/dist/esm/components/chip-set/useChipSet.js +161 -0
- package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
- package/dist/esm/components/chip-set/utils.d.ts +7 -0
- package/dist/esm/components/chip-set/utils.js +16 -0
- package/dist/esm/components/chip-set/utils.js.map +1 -0
- package/dist/esm/components/collapse/CCollapse.js +14 -6
- package/dist/esm/components/collapse/CCollapse.js.map +1 -1
- package/dist/esm/components/conditional-portal/CConditionalPortal.js +3 -1
- package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdown.js +22 -29
- package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/esm/components/form/CChipInput.d.ts +14 -2
- package/dist/esm/components/form/CChipInput.js +78 -50
- package/dist/esm/components/form/CChipInput.js.map +1 -1
- package/dist/esm/components/form/CFormCheck.js.map +1 -1
- package/dist/esm/components/form/CFormInput.js.map +1 -1
- package/dist/esm/components/form/CFormSelect.js.map +1 -1
- package/dist/esm/components/form/CFormTextarea.js.map +1 -1
- package/dist/esm/components/form/CInputGroupText.js.map +1 -1
- package/dist/esm/components/grid/CContainer.js +3 -1
- package/dist/esm/components/grid/CContainer.js.map +1 -1
- package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/link/CLink.js +4 -2
- package/dist/esm/components/link/CLink.js.map +1 -1
- package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/esm/components/modal/CModal.js +14 -2
- package/dist/esm/components/modal/CModal.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelect.d.ts +73 -1
- package/dist/esm/components/multi-select/CMultiSelect.js +158 -19
- package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +3 -0
- package/dist/esm/components/multi-select/CMultiSelectOptions.js +45 -2
- package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +1 -0
- package/dist/esm/components/multi-select/CMultiSelectSelection.js +4 -3
- package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/esm/components/multi-select/types.d.ts +12 -0
- package/dist/esm/components/multi-select/utils.js +1 -4
- package/dist/esm/components/multi-select/utils.js.map +1 -1
- package/dist/esm/components/nav/CNav.js.map +1 -1
- package/dist/esm/components/nav/CNavGroup.d.ts +10 -5
- package/dist/esm/components/nav/CNavGroup.js +84 -25
- package/dist/esm/components/nav/CNavGroup.js.map +1 -1
- package/dist/esm/components/nav/CNavGroupContext.d.ts +25 -0
- package/dist/esm/components/nav/CNavGroupContext.js +11 -0
- package/dist/esm/components/nav/CNavGroupContext.js.map +1 -0
- package/dist/esm/components/nav/CNavLink.d.ts +1 -5
- package/dist/esm/components/nav/CNavLink.js +21 -8
- package/dist/esm/components/nav/CNavLink.js.map +1 -1
- package/dist/esm/components/popover/CPopover.js +57 -9
- package/dist/esm/components/popover/CPopover.js.map +1 -1
- package/dist/esm/components/progress/CProgress.js.map +1 -1
- package/dist/esm/components/rating/CRating.d.ts +1 -1
- package/dist/esm/components/rating/CRating.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebar.js +40 -23
- package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebarNav.js +7 -36
- package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/esm/components/table/CTableDataCell.js.map +1 -1
- package/dist/esm/components/table/types.d.ts +2 -1
- package/dist/esm/components/table/utils.js +4 -4
- package/dist/esm/components/table/utils.js.map +1 -1
- package/dist/esm/components/tabs/CTabPanel.js +3 -1
- package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
- package/dist/esm/components/tooltip/CTooltip.js +57 -9
- package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
- package/dist/esm/helpers/polymorphicComponent.d.ts +1 -2
- package/dist/esm/hooks/useForkedRef.d.ts +1 -1
- package/dist/esm/hooks/useForkedRef.js +6 -3
- package/dist/esm/hooks/useForkedRef.js.map +1 -1
- package/dist/esm/hooks/usePopper.js +9 -7
- package/dist/esm/hooks/usePopper.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
- package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js +3 -3
- package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
- package/dist/esm/utils/executeAfterTransition.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -1
- package/dist/esm/utils/swipe.d.ts +26 -0
- package/dist/esm/utils/swipe.js +90 -0
- package/dist/esm/utils/swipe.js.map +1 -0
- package/package.json +6 -6
- package/src/components/autocomplete/CAutocompleteOptions.tsx +1 -1
- package/src/components/card/CCardImage.tsx +3 -2
- package/src/components/carousel/CCarousel.tsx +48 -51
- package/src/components/carousel/CCarouselContext.ts +1 -1
- package/src/components/carousel/CCarouselItem.tsx +25 -26
- package/src/components/carousel/__tests__/CCarousel.spec.tsx +47 -4
- package/src/components/carousel/__tests__/CCarouselItem.spec.tsx +37 -0
- package/src/components/chip/CChip.tsx +45 -78
- package/src/components/chip/__tests__/CChip.spec.tsx +26 -19
- package/src/components/chip/const.ts +3 -0
- package/src/components/chip-set/CChipSet.tsx +183 -0
- package/src/components/chip-set/__tests__/CChipSet.spec.tsx +215 -0
- package/src/components/chip-set/__tests__/__snapshots__/CChipSet.spec.tsx.snap +22 -0
- package/src/components/chip-set/index.ts +3 -0
- package/src/components/chip-set/useChipSet.ts +243 -0
- package/src/components/chip-set/utils.ts +19 -0
- package/src/components/collapse/CCollapse.tsx +18 -6
- package/src/components/conditional-portal/CConditionalPortal.tsx +4 -2
- package/src/components/dropdown/CDropdown.tsx +28 -33
- package/src/components/dropdown/CDropdownToggle.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdown.spec.tsx +55 -0
- package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +1 -1
- package/src/components/form/CChipInput.tsx +105 -67
- package/src/components/form/CFormCheck.tsx +1 -2
- package/src/components/form/CFormInput.tsx +1 -2
- package/src/components/form/CFormSelect.tsx +1 -2
- package/src/components/form/CFormTextarea.tsx +1 -2
- package/src/components/form/CInputGroupText.tsx +3 -2
- package/src/components/form/__tests__/CChipInput.spec.tsx +67 -1
- package/src/components/form/__tests__/__snapshots__/CChipInput.spec.tsx.snap +7 -0
- package/src/components/grid/CContainer.tsx +3 -1
- package/src/components/header/CHeaderBrand.tsx +3 -2
- package/src/components/index.ts +1 -0
- package/src/components/link/CLink.tsx +7 -4
- package/src/components/list-group/CListGroupItem.tsx +3 -2
- package/src/components/modal/CModal.tsx +19 -2
- package/src/components/modal/__tests__/CModal.spec.tsx +43 -0
- package/src/components/multi-select/CMultiSelect.tsx +341 -46
- package/src/components/multi-select/CMultiSelectNativeSelect.tsx +1 -1
- package/src/components/multi-select/CMultiSelectOptions.tsx +74 -3
- package/src/components/multi-select/CMultiSelectSelection.tsx +5 -1
- package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +12 -8
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelect.spec.tsx.snap +62 -45
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectNativeSelect.spec.tsx.snap +2 -2
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectOptions.spec.tsx.snap +1 -0
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelection.spec.tsx.snap +5 -1
- package/src/components/multi-select/types.ts +14 -0
- package/src/components/nav/CNav.tsx +3 -2
- package/src/components/nav/CNavGroup.tsx +193 -107
- package/src/components/nav/CNavGroupContext.ts +27 -0
- package/src/components/nav/CNavLink.tsx +26 -12
- package/src/components/nav/__tests__/CNavGroup.spec.tsx +195 -20
- package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +2 -0
- package/src/components/popover/CPopover.tsx +59 -9
- package/src/components/popover/__tests__/CPopover.spec.tsx +76 -1
- package/src/components/progress/CProgress.tsx +1 -2
- package/src/components/rating/CRating.tsx +1 -0
- package/src/components/search-button/__tests__/CSearchButton.spec.tsx +2 -2
- package/src/components/sidebar/CSidebar.tsx +51 -26
- package/src/components/sidebar/CSidebarNav.tsx +12 -51
- package/src/components/sidebar/__tests__/CSidebar.spec.tsx +26 -0
- package/src/components/table/CTableDataCell.tsx +2 -1
- package/src/components/table/types.ts +3 -1
- package/src/components/table/utils.ts +4 -4
- package/src/components/tabs/CTabPanel.tsx +3 -1
- package/src/components/tabs/CTabsContext.ts +1 -1
- package/src/components/tooltip/CTooltip.tsx +59 -9
- package/src/components/tooltip/__tests__/CTooltip.spec.tsx +96 -1
- package/src/helpers/polymorphicComponent.ts +1 -1
- package/src/hooks/useColorModes.ts +2 -2
- package/src/hooks/useForkedRef.ts +20 -15
- package/src/hooks/usePopper.ts +13 -9
- package/src/utils/__tests__/swipe.spec.ts +82 -0
- package/src/utils/executeAfterTransition.ts +1 -1
- package/src/utils/index.ts +2 -0
- package/src/utils/mergeClassNames.ts +1 -1
- package/src/utils/swipe.ts +114 -0
- package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +0 -5
- package/dist/cjs/components/sidebar/CSidebarNavContext.js +0 -8
- package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +0 -1
- package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +0 -5
- package/dist/esm/components/sidebar/CSidebarNavContext.js +0 -6
- package/dist/esm/components/sidebar/CSidebarNavContext.js.map +0 -1
- package/src/components/sidebar/CSidebarNavContext.ts +0 -8
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
2
|
import { fireEvent, render, screen } from '@testing-library/react'
|
|
3
3
|
import '@testing-library/jest-dom'
|
|
4
|
-
import { CNavGroup } from '../index'
|
|
5
|
-
import {
|
|
4
|
+
import { CNavGroup, CNavItem } from '../index'
|
|
5
|
+
import { CSidebarNav } from '../../sidebar/CSidebarNav'
|
|
6
6
|
|
|
7
7
|
test('loads and displays CNavGroup component', async () => {
|
|
8
8
|
const { container } = render(<CNavGroup toggler="anchorText" />)
|
|
@@ -11,43 +11,218 @@ test('loads and displays CNavGroup component', async () => {
|
|
|
11
11
|
|
|
12
12
|
test('CNavGroup customize', async () => {
|
|
13
13
|
const { container } = render(
|
|
14
|
-
<CNavGroup className="bazinga" toggler="anchorText" visible={true}
|
|
14
|
+
<CNavGroup className="bazinga" toggler="anchorText" visible={true} />
|
|
15
15
|
)
|
|
16
16
|
expect(container).toMatchSnapshot()
|
|
17
17
|
expect(container.firstChild).toHaveClass('nav-group')
|
|
18
18
|
expect(container.firstChild).toHaveClass('bazinga')
|
|
19
19
|
const arr = container.getElementsByClassName('nav-link')
|
|
20
20
|
if (arr.length > 0) {
|
|
21
|
-
//expect(arr[0].innerText).toHaveTextContent('anchorText')
|
|
22
21
|
expect(arr[0].innerHTML).toBe('anchorText')
|
|
23
22
|
} else {
|
|
24
23
|
expect(true).toBe(false)
|
|
25
24
|
}
|
|
26
25
|
})
|
|
27
26
|
|
|
28
|
-
test('CNavGroup
|
|
29
|
-
render(
|
|
30
|
-
<
|
|
31
|
-
<CNavGroup
|
|
32
|
-
|
|
27
|
+
test('CNavGroup toggles its own visibility when uncontrolled', async () => {
|
|
28
|
+
const { container } = render(
|
|
29
|
+
<CSidebarNav>
|
|
30
|
+
<CNavGroup toggler="anchorText">
|
|
31
|
+
<CNavItem href="#">Item</CNavItem>
|
|
32
|
+
</CNavGroup>
|
|
33
|
+
</CSidebarNav>
|
|
33
34
|
)
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
const group = container.querySelector('.nav-group') as HTMLElement
|
|
37
|
+
expect(group).not.toHaveClass('show')
|
|
38
|
+
|
|
39
|
+
fireEvent.click(container.querySelector('.nav-group-toggle') as HTMLElement)
|
|
40
|
+
expect(group).toHaveClass('show')
|
|
41
|
+
|
|
42
|
+
fireEvent.click(container.querySelector('.nav-group-toggle') as HTMLElement)
|
|
43
|
+
expect(group).not.toHaveClass('show')
|
|
36
44
|
})
|
|
37
45
|
|
|
38
|
-
test('CNavGroup
|
|
39
|
-
render(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
test('CNavGroup follows the visible prop in controlled mode', async () => {
|
|
47
|
+
const { container, rerender } = render(<CNavGroup toggler="anchorText" visible={true} />)
|
|
48
|
+
expect(container.querySelector('.nav-group')).toHaveClass('show')
|
|
49
|
+
|
|
50
|
+
rerender(<CNavGroup toggler="anchorText" visible={false} />)
|
|
51
|
+
expect(container.querySelector('.nav-group')).not.toHaveClass('show')
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
test('CNavGroup stays open when the parent rejects the collapse (controlled)', async () => {
|
|
55
|
+
const onVisibleChange = jest.fn()
|
|
56
|
+
const { container } = render(
|
|
57
|
+
<CNavGroup toggler="anchorText" visible={true} onVisibleChange={onVisibleChange} />
|
|
46
58
|
)
|
|
47
59
|
|
|
48
|
-
expect(
|
|
60
|
+
expect(container.querySelector('.nav-group')).toHaveClass('show')
|
|
49
61
|
|
|
50
|
-
|
|
62
|
+
// Parent keeps `visible` at `true` (rejects the collapse).
|
|
63
|
+
fireEvent.click(container.querySelector('.nav-group-toggle') as HTMLElement)
|
|
64
|
+
|
|
65
|
+
expect(onVisibleChange).toHaveBeenCalledWith(false)
|
|
66
|
+
expect(container.querySelector('.nav-group')).toHaveClass('show')
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test('CNavGroup toggler render function receives visible state', async () => {
|
|
70
|
+
render(<CNavGroup toggler={({ visible }) => <span>{visible ? 'expanded' : 'collapsed'}</span>} />)
|
|
51
71
|
|
|
52
72
|
expect(screen.getByText('collapsed')).toBeInTheDocument()
|
|
73
|
+
|
|
74
|
+
fireEvent.click(screen.getByRole('link'))
|
|
75
|
+
|
|
76
|
+
expect(screen.getByText('expanded')).toBeInTheDocument()
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
test('an active nav link opens its parent group', async () => {
|
|
80
|
+
const { container } = render(
|
|
81
|
+
<CSidebarNav>
|
|
82
|
+
<CNavGroup toggler="anchorText">
|
|
83
|
+
<CNavItem href="#" active>
|
|
84
|
+
Item
|
|
85
|
+
</CNavItem>
|
|
86
|
+
</CNavGroup>
|
|
87
|
+
</CSidebarNav>
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
expect(container.querySelector('.nav-group')).toHaveClass('show')
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
test('opening another group closes a controlled group when the parent accepts', async () => {
|
|
94
|
+
const Wrapper = () => {
|
|
95
|
+
const [visible, setVisible] = React.useState(true)
|
|
96
|
+
return (
|
|
97
|
+
<CSidebarNav>
|
|
98
|
+
<CNavGroup toggler="Controlled" visible={visible} onVisibleChange={setVisible}>
|
|
99
|
+
<CNavItem href="#">A</CNavItem>
|
|
100
|
+
</CNavGroup>
|
|
101
|
+
<CNavGroup toggler="Other">
|
|
102
|
+
<CNavItem href="#">B</CNavItem>
|
|
103
|
+
</CNavGroup>
|
|
104
|
+
</CSidebarNav>
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const { container } = render(<Wrapper />)
|
|
109
|
+
const [controlled, other] = Array.from(container.querySelectorAll('.nav-group'))
|
|
110
|
+
expect(controlled).toHaveClass('show')
|
|
111
|
+
|
|
112
|
+
fireEvent.click(container.querySelectorAll('.nav-group-toggle')[1] as HTMLElement)
|
|
113
|
+
|
|
114
|
+
expect(other).toHaveClass('show')
|
|
115
|
+
expect(controlled).not.toHaveClass('show')
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
test('a locked controlled group stays open when another group opens', async () => {
|
|
119
|
+
const Wrapper = () => {
|
|
120
|
+
const [visible, setVisible] = React.useState(true)
|
|
121
|
+
const onVisibleChange = (value: boolean) => {
|
|
122
|
+
if (value) {
|
|
123
|
+
setVisible(true)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return (
|
|
127
|
+
<CSidebarNav>
|
|
128
|
+
<CNavGroup toggler="Locked" visible={visible} onVisibleChange={onVisibleChange}>
|
|
129
|
+
<CNavItem href="#">A</CNavItem>
|
|
130
|
+
</CNavGroup>
|
|
131
|
+
<CNavGroup toggler="Other">
|
|
132
|
+
<CNavItem href="#">B</CNavItem>
|
|
133
|
+
</CNavGroup>
|
|
134
|
+
</CSidebarNav>
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const { container } = render(<Wrapper />)
|
|
139
|
+
const [locked, other] = Array.from(container.querySelectorAll('.nav-group'))
|
|
140
|
+
expect(locked).toHaveClass('show')
|
|
141
|
+
|
|
142
|
+
fireEvent.click(container.querySelectorAll('.nav-group-toggle')[1] as HTMLElement)
|
|
143
|
+
|
|
144
|
+
expect(other).toHaveClass('show')
|
|
145
|
+
expect(locked).toHaveClass('show')
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
test('opening an uncontrolled group collapses its sibling', async () => {
|
|
149
|
+
const { container } = render(
|
|
150
|
+
<CSidebarNav>
|
|
151
|
+
<CNavGroup toggler="A">
|
|
152
|
+
<CNavItem href="#">Item</CNavItem>
|
|
153
|
+
</CNavGroup>
|
|
154
|
+
<CNavGroup toggler="B">
|
|
155
|
+
<CNavItem href="#">Item</CNavItem>
|
|
156
|
+
</CNavGroup>
|
|
157
|
+
</CSidebarNav>
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
const [groupA, groupB] = Array.from(container.querySelectorAll('.nav-group'))
|
|
161
|
+
const [togglerA, togglerB] = Array.from(container.querySelectorAll('.nav-group-toggle'))
|
|
162
|
+
|
|
163
|
+
fireEvent.click(togglerA as HTMLElement)
|
|
164
|
+
expect(groupA).toHaveClass('show')
|
|
165
|
+
expect(groupB).not.toHaveClass('show')
|
|
166
|
+
|
|
167
|
+
fireEvent.click(togglerB as HTMLElement)
|
|
168
|
+
expect(groupA).not.toHaveClass('show')
|
|
169
|
+
expect(groupB).toHaveClass('show')
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
test('reopening a parent restores the open state of its nested subgroups', async () => {
|
|
173
|
+
const { container } = render(
|
|
174
|
+
<CSidebarNav>
|
|
175
|
+
<CNavGroup toggler="A" visible>
|
|
176
|
+
<CNavGroup toggler="B" visible>
|
|
177
|
+
<CNavGroup toggler="C" visible>
|
|
178
|
+
<CNavItem href="#">Item</CNavItem>
|
|
179
|
+
</CNavGroup>
|
|
180
|
+
</CNavGroup>
|
|
181
|
+
</CNavGroup>
|
|
182
|
+
</CSidebarNav>
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
const [groupA, groupB, groupC] = Array.from(container.querySelectorAll('.nav-group'))
|
|
186
|
+
expect(groupA).toHaveClass('show')
|
|
187
|
+
expect(groupB).toHaveClass('show')
|
|
188
|
+
expect(groupC).toHaveClass('show')
|
|
189
|
+
|
|
190
|
+
const outerToggler = container.querySelectorAll('.nav-group-toggle')[0] as HTMLElement
|
|
191
|
+
|
|
192
|
+
// Collapse the parent: the whole branch is hidden.
|
|
193
|
+
fireEvent.click(outerToggler)
|
|
194
|
+
expect(groupA).not.toHaveClass('show')
|
|
195
|
+
|
|
196
|
+
// Reopen the parent: nested subgroups come back open (matches vanilla/Vue).
|
|
197
|
+
fireEvent.click(outerToggler)
|
|
198
|
+
expect(groupA).toHaveClass('show')
|
|
199
|
+
expect(groupB).toHaveClass('show')
|
|
200
|
+
expect(groupC).toHaveClass('show')
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
test('nested default-open groups render open and stay independently toggleable', async () => {
|
|
204
|
+
const { container } = render(
|
|
205
|
+
<CSidebarNav>
|
|
206
|
+
<CNavGroup toggler="Group A" visible>
|
|
207
|
+
<CNavGroup toggler="Group B" visible>
|
|
208
|
+
<CNavItem href="#">Item</CNavItem>
|
|
209
|
+
</CNavGroup>
|
|
210
|
+
</CNavGroup>
|
|
211
|
+
</CSidebarNav>
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
const [groupA, groupB] = Array.from(container.querySelectorAll('.nav-group'))
|
|
215
|
+
expect(groupA).toHaveClass('show')
|
|
216
|
+
expect(groupB).toHaveClass('show')
|
|
217
|
+
|
|
218
|
+
// Collapsing the inner group keeps the outer one open.
|
|
219
|
+
const innerToggler = container.querySelectorAll('.nav-group-toggle')[1] as HTMLElement
|
|
220
|
+
fireEvent.click(innerToggler)
|
|
221
|
+
expect(groupA).toHaveClass('show')
|
|
222
|
+
expect(groupB).not.toHaveClass('show')
|
|
223
|
+
|
|
224
|
+
// Collapsing the outer group closes the whole branch.
|
|
225
|
+
const outerToggler = container.querySelectorAll('.nav-group-toggle')[0] as HTMLElement
|
|
226
|
+
fireEvent.click(outerToggler)
|
|
227
|
+
expect(groupA).not.toHaveClass('show')
|
|
53
228
|
})
|
|
@@ -6,6 +6,7 @@ exports[`CNavGroup customize 1`] = `
|
|
|
6
6
|
class="nav-group show bazinga"
|
|
7
7
|
>
|
|
8
8
|
<a
|
|
9
|
+
aria-expanded="true"
|
|
9
10
|
class="nav-link nav-group-toggle"
|
|
10
11
|
href="#"
|
|
11
12
|
>
|
|
@@ -25,6 +26,7 @@ exports[`loads and displays CNavGroup component 1`] = `
|
|
|
25
26
|
class="nav-group"
|
|
26
27
|
>
|
|
27
28
|
<a
|
|
29
|
+
aria-expanded="false"
|
|
28
30
|
class="nav-link nav-group-toggle"
|
|
29
31
|
href="#"
|
|
30
32
|
>
|
|
@@ -182,6 +182,14 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
182
182
|
const { initPopper, destroyPopper } = usePopper()
|
|
183
183
|
|
|
184
184
|
const _delay = typeof delay === 'number' ? { show: delay, hide: delay } : delay
|
|
185
|
+
const timer = useRef<ReturnType<typeof setTimeout>>(undefined)
|
|
186
|
+
|
|
187
|
+
const clearTimer = () => {
|
|
188
|
+
if (timer.current) {
|
|
189
|
+
clearTimeout(timer.current)
|
|
190
|
+
timer.current = undefined
|
|
191
|
+
}
|
|
192
|
+
}
|
|
185
193
|
|
|
186
194
|
const defaultPopperConfig: Partial<Options> = {
|
|
187
195
|
modifiers: [
|
|
@@ -198,12 +206,23 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
198
206
|
}
|
|
199
207
|
|
|
200
208
|
const handleShow = () => {
|
|
201
|
-
|
|
209
|
+
clearTimer()
|
|
210
|
+
|
|
211
|
+
if (mounted) {
|
|
212
|
+
timer.current = setTimeout(() => {
|
|
213
|
+
setVisible(true)
|
|
214
|
+
}, _delay.show)
|
|
215
|
+
} else {
|
|
216
|
+
setMounted(true)
|
|
217
|
+
}
|
|
218
|
+
|
|
202
219
|
onShow?.()
|
|
203
220
|
}
|
|
204
221
|
|
|
205
222
|
const handleHide = () => {
|
|
206
|
-
|
|
223
|
+
clearTimer()
|
|
224
|
+
|
|
225
|
+
timer.current = setTimeout(() => {
|
|
207
226
|
setVisible(false)
|
|
208
227
|
onHide?.()
|
|
209
228
|
}, _delay.hide)
|
|
@@ -220,7 +239,7 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
220
239
|
useEffect(() => {
|
|
221
240
|
if (mounted && togglerRef.current && popoverRef.current) {
|
|
222
241
|
initPopper(togglerRef.current, popoverRef.current, computedPopperConfig)
|
|
223
|
-
setTimeout(() => {
|
|
242
|
+
timer.current = setTimeout(() => {
|
|
224
243
|
setVisible(true)
|
|
225
244
|
}, _delay.show)
|
|
226
245
|
|
|
@@ -232,6 +251,13 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
232
251
|
}
|
|
233
252
|
}, [mounted])
|
|
234
253
|
|
|
254
|
+
useEffect(() => {
|
|
255
|
+
return () => {
|
|
256
|
+
clearTimer()
|
|
257
|
+
destroyPopper()
|
|
258
|
+
}
|
|
259
|
+
}, [])
|
|
260
|
+
|
|
235
261
|
useEffect(() => {
|
|
236
262
|
if (!_visible && togglerRef.current && popoverRef.current) {
|
|
237
263
|
executeAfterTransition(() => {
|
|
@@ -240,23 +266,47 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
240
266
|
}
|
|
241
267
|
}, [_visible])
|
|
242
268
|
|
|
269
|
+
const child = children as React.ReactElement<
|
|
270
|
+
React.HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }
|
|
271
|
+
>
|
|
272
|
+
|
|
243
273
|
return (
|
|
244
274
|
<>
|
|
245
|
-
{React.cloneElement(
|
|
275
|
+
{React.cloneElement(child, {
|
|
246
276
|
...(_visible && {
|
|
247
277
|
'aria-describedby': id,
|
|
248
278
|
}),
|
|
249
279
|
ref: togglerRef,
|
|
250
280
|
...((trigger === 'click' || trigger.includes('click')) && {
|
|
251
|
-
onClick: () =>
|
|
281
|
+
onClick: (event: React.MouseEvent<HTMLElement>) => {
|
|
282
|
+
child.props.onClick?.(event)
|
|
283
|
+
|
|
284
|
+
if (_visible) {
|
|
285
|
+
handleHide()
|
|
286
|
+
} else {
|
|
287
|
+
handleShow()
|
|
288
|
+
}
|
|
289
|
+
},
|
|
252
290
|
}),
|
|
253
291
|
...((trigger === 'focus' || trigger.includes('focus')) && {
|
|
254
|
-
onFocus: () =>
|
|
255
|
-
|
|
292
|
+
onFocus: (event: React.FocusEvent<HTMLElement>) => {
|
|
293
|
+
child.props.onFocus?.(event)
|
|
294
|
+
handleShow()
|
|
295
|
+
},
|
|
296
|
+
onBlur: (event: React.FocusEvent<HTMLElement>) => {
|
|
297
|
+
child.props.onBlur?.(event)
|
|
298
|
+
handleHide()
|
|
299
|
+
},
|
|
256
300
|
}),
|
|
257
301
|
...((trigger === 'hover' || trigger.includes('hover')) && {
|
|
258
|
-
onMouseEnter: () =>
|
|
259
|
-
|
|
302
|
+
onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {
|
|
303
|
+
child.props.onMouseEnter?.(event)
|
|
304
|
+
handleShow()
|
|
305
|
+
},
|
|
306
|
+
onMouseLeave: (event: React.MouseEvent<HTMLElement>) => {
|
|
307
|
+
child.props.onMouseLeave?.(event)
|
|
308
|
+
handleHide()
|
|
309
|
+
},
|
|
260
310
|
}),
|
|
261
311
|
})}
|
|
262
312
|
<CConditionalPortal container={container} portal={true}>
|
|
@@ -16,6 +16,74 @@ afterEach(() => {
|
|
|
16
16
|
cleanup()
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
+
test('CPopover stays visible when re-hovered during the hide delay', async () => {
|
|
20
|
+
jest.useFakeTimers()
|
|
21
|
+
|
|
22
|
+
render(
|
|
23
|
+
<CPopover trigger="hover" delay={{ show: 0, hide: 300 }} content="content">
|
|
24
|
+
<CButton color="primary">Test</CButton>
|
|
25
|
+
</CPopover>
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
const btn = screen.getByRole('button', { name: /test/i })
|
|
29
|
+
|
|
30
|
+
act(() => {
|
|
31
|
+
fireEvent.mouseOver(btn)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
act(() => {
|
|
35
|
+
jest.runAllTimers()
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
expect(document.querySelector('.popover')).toHaveClass('show')
|
|
39
|
+
|
|
40
|
+
act(() => {
|
|
41
|
+
fireEvent.mouseOut(btn)
|
|
42
|
+
jest.advanceTimersByTime(100)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
act(() => {
|
|
46
|
+
fireEvent.mouseOver(btn)
|
|
47
|
+
jest.advanceTimersByTime(1000)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
expect(document.querySelector('.popover')).toHaveClass('show')
|
|
51
|
+
|
|
52
|
+
jest.useRealTimers()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
test('CPopover preserves event handlers of the child element', async () => {
|
|
56
|
+
jest.useFakeTimers()
|
|
57
|
+
|
|
58
|
+
const onClick = jest.fn()
|
|
59
|
+
const onMouseEnter = jest.fn()
|
|
60
|
+
|
|
61
|
+
render(
|
|
62
|
+
<CPopover trigger={['hover', 'click']} content="content">
|
|
63
|
+
<CButton color="primary" onClick={onClick} onMouseEnter={onMouseEnter}>
|
|
64
|
+
Test
|
|
65
|
+
</CButton>
|
|
66
|
+
</CPopover>
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
const btn = screen.getByRole('button', { name: /test/i })
|
|
70
|
+
|
|
71
|
+
act(() => {
|
|
72
|
+
fireEvent.mouseOver(btn)
|
|
73
|
+
jest.runAllTimers()
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
act(() => {
|
|
77
|
+
fireEvent.click(btn)
|
|
78
|
+
jest.runAllTimers()
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
expect(onMouseEnter).toHaveBeenCalledTimes(1)
|
|
82
|
+
expect(onClick).toHaveBeenCalledTimes(1)
|
|
83
|
+
|
|
84
|
+
jest.useRealTimers()
|
|
85
|
+
})
|
|
86
|
+
|
|
19
87
|
test('loads and displays CPopover component', async () => {
|
|
20
88
|
const { container } = render(
|
|
21
89
|
<CPopover content="A">
|
|
@@ -61,7 +129,14 @@ test('CPopover onShow and onHide', async () => {
|
|
|
61
129
|
const onHide = jest.fn()
|
|
62
130
|
|
|
63
131
|
render(
|
|
64
|
-
<CPopover
|
|
132
|
+
<CPopover
|
|
133
|
+
content="content"
|
|
134
|
+
title="title"
|
|
135
|
+
trigger="click"
|
|
136
|
+
placement="right"
|
|
137
|
+
onShow={onShow}
|
|
138
|
+
onHide={onHide}
|
|
139
|
+
>
|
|
65
140
|
<CButton color="primary">Test</CButton>
|
|
66
141
|
</CPopover>,
|
|
67
142
|
{ container: container! }
|
|
@@ -6,8 +6,7 @@ import { CProgressStackedContext } from './CProgressStackedContext'
|
|
|
6
6
|
import { CProgressBar, CProgressBarProps } from './CProgressBar'
|
|
7
7
|
|
|
8
8
|
export interface CProgressProps
|
|
9
|
-
extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>,
|
|
10
|
-
CProgressBarProps {
|
|
9
|
+
extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>, CProgressBarProps {
|
|
11
10
|
/**
|
|
12
11
|
* A string of all className you want applied to the component.
|
|
13
12
|
*/
|
|
@@ -26,7 +26,7 @@ test('loads and displays CSearchButton component', async () => {
|
|
|
26
26
|
|
|
27
27
|
test('CSearchButton customize', async () => {
|
|
28
28
|
const { container } = render(
|
|
29
|
-
<CSearchButton className="bazinga" placeholder="Command palette" shortcut="meta+k,ctrl+k"
|
|
29
|
+
<CSearchButton className="bazinga" placeholder="Command palette" shortcut="meta+k,ctrl+k" />
|
|
30
30
|
)
|
|
31
31
|
|
|
32
32
|
expect(container).toMatchSnapshot()
|
|
@@ -56,7 +56,7 @@ test('CSearchButton ignores plain typing in editable fields', async () => {
|
|
|
56
56
|
<>
|
|
57
57
|
<input aria-label="Search input" />
|
|
58
58
|
<CSearchButton onClick={onClick} shortcut="k" />
|
|
59
|
-
|
|
59
|
+
</>
|
|
60
60
|
)
|
|
61
61
|
|
|
62
62
|
fireEvent.keyDown(screen.getByLabelText('Search input'), { key: 'k' })
|
|
@@ -92,7 +92,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
92
92
|
visible,
|
|
93
93
|
...rest
|
|
94
94
|
},
|
|
95
|
-
ref
|
|
95
|
+
ref
|
|
96
96
|
) => {
|
|
97
97
|
const sidebarRef = useRef<HTMLDivElement>(null)
|
|
98
98
|
const forkedRef = useForkedRef(ref, sidebarRef)
|
|
@@ -101,46 +101,65 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
101
101
|
const [mobile, setMobile] = useState(false)
|
|
102
102
|
const [visibleMobile, setVisibleMobile] = useState<boolean>(false)
|
|
103
103
|
const [visibleDesktop, setVisibleDesktop] = useState<boolean>(
|
|
104
|
-
visible
|
|
104
|
+
visible === undefined ? !overlaid : visible
|
|
105
105
|
)
|
|
106
106
|
|
|
107
107
|
useEffect(() => {
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
if (sidebarRef.current) {
|
|
109
|
+
setMobile(isOnMobile(sidebarRef.current))
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (visible !== undefined) {
|
|
113
|
+
handleVisibleChange(visible)
|
|
114
|
+
}
|
|
110
115
|
}, [visible])
|
|
111
116
|
|
|
112
117
|
useEffect(() => {
|
|
113
|
-
inViewport !== undefined
|
|
114
|
-
|
|
115
|
-
|
|
118
|
+
if (inViewport !== undefined) {
|
|
119
|
+
onVisibleChange?.(inViewport)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (inViewport) {
|
|
123
|
+
onShow?.()
|
|
124
|
+
} else {
|
|
125
|
+
onHide?.()
|
|
126
|
+
}
|
|
116
127
|
}, [inViewport])
|
|
117
128
|
|
|
118
129
|
useEffect(() => {
|
|
119
|
-
|
|
130
|
+
if (mobile) {
|
|
131
|
+
setVisibleMobile(false)
|
|
132
|
+
}
|
|
120
133
|
}, [mobile])
|
|
121
134
|
|
|
122
135
|
useEffect(() => {
|
|
123
|
-
|
|
124
|
-
|
|
136
|
+
const element = sidebarRef.current
|
|
137
|
+
|
|
138
|
+
if (element) {
|
|
139
|
+
setMobile(isOnMobile(element))
|
|
140
|
+
setInViewport(isInViewport(element))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const handleTransitionEnd = () => {
|
|
144
|
+
if (element) {
|
|
145
|
+
setInViewport(isInViewport(element))
|
|
146
|
+
}
|
|
147
|
+
}
|
|
125
148
|
|
|
126
149
|
window.addEventListener('resize', handleResize)
|
|
127
150
|
window.addEventListener('mouseup', handleClickOutside)
|
|
128
151
|
window.addEventListener('keyup', handleKeyup)
|
|
129
152
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
|
|
133
|
-
})
|
|
153
|
+
element?.addEventListener('mouseup', handleOnClick)
|
|
154
|
+
element?.addEventListener('transitionend', handleTransitionEnd)
|
|
134
155
|
|
|
135
156
|
return () => {
|
|
136
157
|
window.removeEventListener('resize', handleResize)
|
|
137
158
|
window.removeEventListener('mouseup', handleClickOutside)
|
|
138
159
|
window.removeEventListener('keyup', handleKeyup)
|
|
139
160
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
|
|
143
|
-
})
|
|
161
|
+
element?.removeEventListener('mouseup', handleOnClick)
|
|
162
|
+
element?.removeEventListener('transitionend', handleTransitionEnd)
|
|
144
163
|
}
|
|
145
164
|
})
|
|
146
165
|
|
|
@@ -158,8 +177,10 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
158
177
|
}
|
|
159
178
|
|
|
160
179
|
const handleResize = () => {
|
|
161
|
-
|
|
162
|
-
|
|
180
|
+
if (sidebarRef.current) {
|
|
181
|
+
setMobile(isOnMobile(sidebarRef.current))
|
|
182
|
+
setInViewport(isInViewport(sidebarRef.current))
|
|
183
|
+
}
|
|
163
184
|
}
|
|
164
185
|
|
|
165
186
|
const handleKeyup = (event: Event) => {
|
|
@@ -183,11 +204,15 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
183
204
|
|
|
184
205
|
const handleOnClick = (event: Event) => {
|
|
185
206
|
const target = event.target as HTMLAnchorElement
|
|
186
|
-
|
|
207
|
+
|
|
208
|
+
if (
|
|
209
|
+
target &&
|
|
187
210
|
target.classList.contains('nav-link') &&
|
|
188
211
|
!target.classList.contains('nav-group-toggle') &&
|
|
189
|
-
mobile
|
|
212
|
+
mobile
|
|
213
|
+
) {
|
|
190
214
|
handleHide()
|
|
215
|
+
}
|
|
191
216
|
}
|
|
192
217
|
|
|
193
218
|
return (
|
|
@@ -206,7 +231,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
206
231
|
show: (mobile && visibleMobile) || (overlaid && visibleDesktop),
|
|
207
232
|
hide: visibleDesktop === false && !mobile && !overlaid,
|
|
208
233
|
},
|
|
209
|
-
className
|
|
234
|
+
className
|
|
210
235
|
)}
|
|
211
236
|
{...rest}
|
|
212
237
|
ref={forkedRef}
|
|
@@ -217,11 +242,11 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
217
242
|
mobile &&
|
|
218
243
|
createPortal(
|
|
219
244
|
<CBackdrop className="sidebar-backdrop" visible={mobile && visibleMobile} />,
|
|
220
|
-
document.body
|
|
245
|
+
document.body
|
|
221
246
|
)}
|
|
222
247
|
</>
|
|
223
248
|
)
|
|
224
|
-
}
|
|
249
|
+
}
|
|
225
250
|
)
|
|
226
251
|
|
|
227
252
|
CSidebar.propTypes = {
|
|
@@ -241,4 +266,4 @@ CSidebar.propTypes = {
|
|
|
241
266
|
visible: PropTypes.bool,
|
|
242
267
|
}
|
|
243
268
|
|
|
244
|
-
CSidebar.displayName = 'CSidebar'
|
|
269
|
+
CSidebar.displayName = 'CSidebar'
|