@coreui/react-pro 5.12.0 → 5.13.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/CAccordion.js.map +1 -1
- package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
- package/dist/cjs/components/alert/CAlert.js.map +1 -1
- package/dist/cjs/components/alert/CAlertHeading.js.map +1 -1
- package/dist/cjs/components/backdrop/CBackdrop.js.map +1 -1
- package/dist/cjs/components/badge/CBadge.js.map +1 -1
- package/dist/cjs/components/button/CButton.js.map +1 -1
- package/dist/cjs/components/calendar/CCalendar.js +53 -38
- package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
- package/dist/cjs/components/calendar/CCalendarNavigation.js.map +1 -1
- package/dist/cjs/components/calendar/CCalendarPanel.js.map +1 -1
- package/dist/cjs/components/calendar/utils.d.ts +8 -0
- package/dist/cjs/components/calendar/utils.js +16 -0
- package/dist/cjs/components/calendar/utils.js.map +1 -1
- package/dist/cjs/components/card/CCardHeader.js.map +1 -1
- package/dist/cjs/components/card/CCardSubtitle.js.map +1 -1
- package/dist/cjs/components/card/CCardText.js.map +1 -1
- package/dist/cjs/components/card/CCardTitle.js.map +1 -1
- package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
- package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js +53 -33
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownHeader.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownItem.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownItemPlain.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/cjs/components/form/CFormCheck.js.map +1 -1
- package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
- package/dist/cjs/components/form/CFormInput.js.map +1 -1
- package/dist/cjs/components/form/CFormLabel.js.map +1 -1
- package/dist/cjs/components/form/CFormText.js.map +1 -1
- package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
- package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
- package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
- package/dist/cjs/components/header/CHeaderToggler.js.map +1 -1
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/link/CLink.js.map +1 -1
- package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
- package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/cjs/components/loading-button/CLoadingButton.js.map +1 -1
- package/dist/cjs/components/modal/CModal.js.map +1 -1
- package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
- package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelect.d.ts +6 -0
- package/dist/cjs/components/multi-select/CMultiSelect.js +21 -4
- package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/cjs/components/nav/CNav.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
- package/dist/cjs/components/nav/CNavItem.js.map +1 -1
- package/dist/cjs/components/nav/CNavLink.js.map +1 -1
- package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
- package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
- package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
- package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
- package/dist/cjs/components/navbar/CNavbarToggler.js.map +1 -1
- package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
- package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
- package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
- package/dist/cjs/components/password-input/CPasswordInput.d.ts +43 -0
- package/dist/cjs/components/password-input/CPasswordInput.js +35 -0
- package/dist/cjs/components/password-input/CPasswordInput.js.map +1 -0
- package/dist/cjs/components/password-input/index.d.ts +2 -0
- package/dist/cjs/components/picker/CPicker.js.map +1 -1
- package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
- package/dist/cjs/components/popover/CPopover.js.map +1 -1
- package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
- package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -1
- package/dist/cjs/components/rating/CRating.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
- package/dist/cjs/components/smart-table/utils.js.map +1 -1
- package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
- package/dist/cjs/components/tabs/CTab.js.map +1 -1
- package/dist/cjs/components/tabs/CTabList.js.map +1 -1
- package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
- package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.js +13 -7
- package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/cjs/components/time-picker/CTimePickerRollCol.js.map +1 -1
- package/dist/cjs/components/time-picker/utils.d.ts +10 -0
- package/dist/cjs/components/time-picker/utils.js +25 -9
- package/dist/cjs/components/time-picker/utils.js.map +1 -1
- package/dist/cjs/components/toast/CToast.js.map +1 -1
- package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
- package/dist/cjs/components/widgets/CWidgetStatsF.js.map +1 -1
- package/dist/cjs/hooks/useClipboard.js.map +1 -1
- package/dist/cjs/hooks/useColorModes.js.map +1 -1
- package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
- package/dist/cjs/node_modules/dom-helpers/esm/hasClass.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/react-transition-group/esm/CSSTransition.js +9 -9
- package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
- package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
- package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
- 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/getNextActiveElement.js.map +1 -1
- package/dist/cjs/utils/isObjectInArray.js.map +1 -1
- package/dist/esm/components/accordion/CAccordion.js.map +1 -1
- package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
- package/dist/esm/components/alert/CAlert.js.map +1 -1
- package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
- package/dist/esm/components/avatar/CAvatar.js +1 -1
- package/dist/esm/components/backdrop/CBackdrop.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/button/CButton.js.map +1 -1
- package/dist/esm/components/calendar/CCalendar.js +54 -39
- package/dist/esm/components/calendar/CCalendar.js.map +1 -1
- package/dist/esm/components/calendar/CCalendarNavigation.js.map +1 -1
- package/dist/esm/components/calendar/CCalendarPanel.js.map +1 -1
- package/dist/esm/components/calendar/utils.d.ts +8 -0
- package/dist/esm/components/calendar/utils.js +16 -1
- package/dist/esm/components/calendar/utils.js.map +1 -1
- package/dist/esm/components/card/CCardHeader.js.map +1 -1
- package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
- package/dist/esm/components/card/CCardText.js.map +1 -1
- package/dist/esm/components/card/CCardTitle.js.map +1 -1
- package/dist/esm/components/carousel/CCarousel.js.map +1 -1
- package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
- package/dist/esm/components/date-range-picker/CDateRangePicker.js +47 -27
- package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/esm/components/form/CFormCheck.js.map +1 -1
- package/dist/esm/components/form/CFormFeedback.js.map +1 -1
- package/dist/esm/components/form/CFormInput.js.map +1 -1
- package/dist/esm/components/form/CFormLabel.js.map +1 -1
- package/dist/esm/components/form/CFormText.js.map +1 -1
- package/dist/esm/components/form/CInputGroupText.js.map +1 -1
- package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
- package/dist/esm/components/header/CHeaderNav.js.map +1 -1
- package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/link/CLink.js.map +1 -1
- package/dist/esm/components/list-group/CListGroup.js.map +1 -1
- package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/esm/components/loading-button/CLoadingButton.js.map +1 -1
- package/dist/esm/components/modal/CModal.js.map +1 -1
- package/dist/esm/components/modal/CModalHeader.js.map +1 -1
- package/dist/esm/components/modal/CModalTitle.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelect.d.ts +6 -0
- package/dist/esm/components/multi-select/CMultiSelect.js +22 -5
- package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/esm/components/nav/CNav.js.map +1 -1
- package/dist/esm/components/nav/CNavGroup.js.map +1 -1
- package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
- package/dist/esm/components/nav/CNavItem.js.map +1 -1
- package/dist/esm/components/nav/CNavLink.js.map +1 -1
- package/dist/esm/components/nav/CNavTitle.js.map +1 -1
- package/dist/esm/components/navbar/CNavbar.js.map +1 -1
- package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
- package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
- package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
- package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
- package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
- package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
- package/dist/esm/components/password-input/CPasswordInput.d.ts +43 -0
- package/dist/esm/components/password-input/CPasswordInput.js +33 -0
- package/dist/esm/components/password-input/CPasswordInput.js.map +1 -0
- package/dist/esm/components/password-input/index.d.ts +2 -0
- package/dist/esm/components/picker/CPicker.js.map +1 -1
- package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
- package/dist/esm/components/popover/CPopover.js +1 -1
- package/dist/esm/components/popover/CPopover.js.map +1 -1
- package/dist/esm/components/progress/CProgressBar.js.map +1 -1
- package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -1
- package/dist/esm/components/rating/CRating.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
- package/dist/esm/components/smart-table/utils.js +1 -1
- package/dist/esm/components/smart-table/utils.js.map +1 -1
- package/dist/esm/components/spinner/CSpinner.js.map +1 -1
- package/dist/esm/components/tabs/CTab.js.map +1 -1
- package/dist/esm/components/tabs/CTabList.js.map +1 -1
- package/dist/esm/components/tabs/CTabPane.js.map +1 -1
- package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
- package/dist/esm/components/time-picker/CTimePicker.js +14 -8
- package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/esm/components/time-picker/CTimePickerRollCol.js.map +1 -1
- package/dist/esm/components/time-picker/utils.d.ts +10 -0
- package/dist/esm/components/time-picker/utils.js +25 -10
- package/dist/esm/components/time-picker/utils.js.map +1 -1
- package/dist/esm/components/toast/CToast.js.map +1 -1
- package/dist/esm/components/tooltip/CTooltip.js +1 -1
- package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
- package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
- package/dist/esm/hooks/useClipboard.js.map +1 -1
- package/dist/esm/hooks/useColorModes.js.map +1 -1
- package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
- package/dist/esm/node_modules/dom-helpers/esm/hasClass.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/react-transition-group/esm/Transition.js.map +1 -1
- package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
- 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/getNextActiveElement.js.map +1 -1
- package/dist/esm/utils/isObjectInArray.js.map +1 -1
- package/package.json +9 -9
- package/src/components/calendar/CCalendar.tsx +74 -56
- package/src/components/calendar/CCalendarNavigation.tsx +2 -2
- package/src/components/calendar/CCalendarPanel.tsx +4 -4
- package/src/components/calendar/utils.ts +33 -10
- package/src/components/date-picker/CDatePicker.tsx +1 -1
- package/src/components/date-range-picker/CDateRangePicker.tsx +37 -21
- package/src/components/index.ts +1 -0
- package/src/components/multi-select/CMultiSelect.tsx +49 -14
- package/src/components/password-input/CPasswordInput.tsx +164 -0
- package/src/components/password-input/index.ts +3 -0
- package/src/components/time-picker/CTimePicker.tsx +19 -12
- package/src/components/time-picker/utils.ts +30 -14
|
@@ -188,6 +188,12 @@ export interface CMultiSelectProps
|
|
|
188
188
|
* Size the component small or large.
|
|
189
189
|
*/
|
|
190
190
|
size?: 'sm' | 'lg'
|
|
191
|
+
/**
|
|
192
|
+
* Sets the initially selected values for the multi-select component.
|
|
193
|
+
*
|
|
194
|
+
* @since 5.13.0
|
|
195
|
+
*/
|
|
196
|
+
value?: string | number | (string | number)[]
|
|
191
197
|
/**
|
|
192
198
|
* Enable virtual scroller for the options list.
|
|
193
199
|
*
|
|
@@ -248,12 +254,13 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
248
254
|
text,
|
|
249
255
|
tooltipFeedback,
|
|
250
256
|
valid,
|
|
257
|
+
value,
|
|
251
258
|
virtualScroller,
|
|
252
259
|
visible = false,
|
|
253
260
|
visibleItems = 10,
|
|
254
261
|
...rest
|
|
255
262
|
},
|
|
256
|
-
ref
|
|
263
|
+
ref
|
|
257
264
|
) => {
|
|
258
265
|
const {
|
|
259
266
|
dropdownMenuElement,
|
|
@@ -278,18 +285,38 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
278
285
|
isExternalSearch(search)
|
|
279
286
|
? [...options, ...filterOptionsList(searchValue, userOptions)]
|
|
280
287
|
: filterOptionsList(searchValue, [...options, ...userOptions]),
|
|
281
|
-
true
|
|
288
|
+
true
|
|
282
289
|
),
|
|
283
|
-
[options, searchValue, userOptions]
|
|
290
|
+
[options, searchValue, userOptions]
|
|
284
291
|
)
|
|
285
292
|
|
|
286
|
-
const flattenedOptions = useMemo(
|
|
293
|
+
const flattenedOptions = useMemo(
|
|
294
|
+
() =>
|
|
295
|
+
flattenOptionsArray(options).map((option) => {
|
|
296
|
+
if (value && Array.isArray(value)) {
|
|
297
|
+
return {
|
|
298
|
+
...option,
|
|
299
|
+
selected: value.includes(option.value),
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (value === option.value) {
|
|
304
|
+
return {
|
|
305
|
+
...option,
|
|
306
|
+
selected: true,
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return option
|
|
311
|
+
}),
|
|
312
|
+
[options, value]
|
|
313
|
+
)
|
|
287
314
|
|
|
288
315
|
const userOption = useMemo(() => {
|
|
289
316
|
if (
|
|
290
317
|
allowCreateOptions &&
|
|
291
318
|
filteredOptions.some(
|
|
292
|
-
(option) => option.label && option.label.toLowerCase() === searchValue.toLowerCase()
|
|
319
|
+
(option) => option.label && option.label.toLowerCase() === searchValue.toLowerCase()
|
|
293
320
|
)
|
|
294
321
|
) {
|
|
295
322
|
return false
|
|
@@ -305,7 +332,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
305
332
|
|
|
306
333
|
const _selected = flattenedOptions.filter((option: Option) => option.selected === true)
|
|
307
334
|
const deselected = flattenedOptions.filter(
|
|
308
|
-
(option: Option) => option.selected === false
|
|
335
|
+
(option: Option) => option.selected === false
|
|
309
336
|
) as Option[]
|
|
310
337
|
|
|
311
338
|
if (_selected.length > 0) {
|
|
@@ -314,7 +341,9 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
314
341
|
}, [flattenedOptions])
|
|
315
342
|
|
|
316
343
|
useEffect(() => {
|
|
317
|
-
!isInitialMount.current && onFilterChange
|
|
344
|
+
if (!isInitialMount.current && onFilterChange) {
|
|
345
|
+
onFilterChange(searchValue)
|
|
346
|
+
}
|
|
318
347
|
}, [searchValue])
|
|
319
348
|
|
|
320
349
|
useEffect(() => {
|
|
@@ -378,7 +407,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
378
407
|
items,
|
|
379
408
|
target,
|
|
380
409
|
event.key === 'ArrowDown',
|
|
381
|
-
!items.includes(target)
|
|
410
|
+
!items.includes(target)
|
|
382
411
|
).focus()
|
|
383
412
|
return
|
|
384
413
|
}
|
|
@@ -395,7 +424,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
395
424
|
setSelected([
|
|
396
425
|
...selected,
|
|
397
426
|
filteredOptions.find(
|
|
398
|
-
(option) => String(option.label).toLowerCase() === searchValue.toLowerCase()
|
|
427
|
+
(option) => String(option.label).toLowerCase() === searchValue.toLowerCase()
|
|
399
428
|
) as Option,
|
|
400
429
|
])
|
|
401
430
|
}
|
|
@@ -437,7 +466,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
437
466
|
items,
|
|
438
467
|
target,
|
|
439
468
|
event.key === 'ArrowDown',
|
|
440
|
-
!items.includes(target)
|
|
469
|
+
!items.includes(target)
|
|
441
470
|
).focus()
|
|
442
471
|
}
|
|
443
472
|
}
|
|
@@ -488,8 +517,8 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
488
517
|
selectOptions(
|
|
489
518
|
multiple,
|
|
490
519
|
[...flattenedOptions.filter((option: Option) => !option.disabled), ...userOptions],
|
|
491
|
-
selected
|
|
492
|
-
)
|
|
520
|
+
selected
|
|
521
|
+
)
|
|
493
522
|
)
|
|
494
523
|
}
|
|
495
524
|
|
|
@@ -534,7 +563,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
534
563
|
'is-valid': valid,
|
|
535
564
|
show: isOpen,
|
|
536
565
|
},
|
|
537
|
-
className
|
|
566
|
+
className
|
|
538
567
|
)}
|
|
539
568
|
onKeyDown={handleGlobalSearch}
|
|
540
569
|
aria-expanded={isOpen}
|
|
@@ -646,7 +675,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
|
|
|
646
675
|
</div>
|
|
647
676
|
</CFormControlWrapper>
|
|
648
677
|
)
|
|
649
|
-
}
|
|
678
|
+
}
|
|
650
679
|
)
|
|
651
680
|
|
|
652
681
|
CMultiSelect.propTypes = {
|
|
@@ -687,6 +716,12 @@ CMultiSelect.propTypes = {
|
|
|
687
716
|
selectionType: PropTypes.oneOf(['counter', 'tags', 'text']),
|
|
688
717
|
selectionTypeCounterText: PropTypes.string,
|
|
689
718
|
size: PropTypes.oneOf(['sm', 'lg']),
|
|
719
|
+
value: PropTypes.oneOfType([
|
|
720
|
+
PropTypes.number,
|
|
721
|
+
PropTypes.string,
|
|
722
|
+
PropTypes.arrayOf(PropTypes.number),
|
|
723
|
+
PropTypes.arrayOf(PropTypes.string),
|
|
724
|
+
]),
|
|
690
725
|
virtualScroller: PropTypes.bool,
|
|
691
726
|
visible: PropTypes.bool,
|
|
692
727
|
visibleItems: PropTypes.number,
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import React, {
|
|
2
|
+
ChangeEventHandler,
|
|
3
|
+
forwardRef,
|
|
4
|
+
InputHTMLAttributes,
|
|
5
|
+
useEffect,
|
|
6
|
+
useState,
|
|
7
|
+
} from 'react'
|
|
8
|
+
import PropTypes from 'prop-types'
|
|
9
|
+
import classNames from 'classnames'
|
|
10
|
+
|
|
11
|
+
import { CFormControlWrapper, CFormControlWrapperProps } from '../form/CFormControlWrapper'
|
|
12
|
+
|
|
13
|
+
export interface CPasswordInputProps
|
|
14
|
+
extends CFormControlWrapperProps,
|
|
15
|
+
Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
|
|
16
|
+
/**
|
|
17
|
+
* Sets the accessible label (`aria-label`) for the toggle password visibility button. This improves accessibility for screen readers and should describe the action, e.g. `"Show password"` or `"Hide password"`.
|
|
18
|
+
*/
|
|
19
|
+
ariaLabelToggler?: string
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A string of all className you want applied to the component.
|
|
23
|
+
*/
|
|
24
|
+
className?: string
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Enables delayed `onChange` execution for improved performance in React password inputs.
|
|
28
|
+
* - `true` delays the `onChange` callback by 500ms.
|
|
29
|
+
* - You can also pass a custom delay (in milliseconds) as a number.
|
|
30
|
+
*/
|
|
31
|
+
delay?: boolean | number
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Disables the password input field. When `true`, the user cannot interact with the field.
|
|
35
|
+
*/
|
|
36
|
+
disabled?: boolean
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Callback triggered when the value of the password input changes. If `delay` is set, the callback is called after the specified timeout.
|
|
40
|
+
*/
|
|
41
|
+
onChange?: ChangeEventHandler<HTMLInputElement>
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Makes the React password input read-only. Prevents user input but allows text selection.
|
|
45
|
+
*/
|
|
46
|
+
readOnly?: boolean
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Controls the initial visibility of the password. When `true`, the input type is set to `"text"` instead of `"password"`. This allows **toggling password visibility** in React forms.
|
|
50
|
+
*/
|
|
51
|
+
showPassword?: boolean
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Sets the visual size of the password input. Use `'sm'` for small or `'lg'` for large input fields.
|
|
55
|
+
*/
|
|
56
|
+
size?: 'sm' | 'lg'
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The value of the password input field. To make the input controlled, pair this with the `onChange` handler.
|
|
60
|
+
*/
|
|
61
|
+
value?: string | string[] | number
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const CPasswordInput = forwardRef<HTMLInputElement, CPasswordInputProps>(
|
|
65
|
+
(
|
|
66
|
+
{
|
|
67
|
+
children,
|
|
68
|
+
ariaLabelToggler = 'Toggle password visibility',
|
|
69
|
+
className,
|
|
70
|
+
delay = false,
|
|
71
|
+
feedback,
|
|
72
|
+
feedbackInvalid,
|
|
73
|
+
feedbackValid,
|
|
74
|
+
floatingClassName,
|
|
75
|
+
floatingLabel,
|
|
76
|
+
id,
|
|
77
|
+
invalid,
|
|
78
|
+
label,
|
|
79
|
+
onChange,
|
|
80
|
+
showPassword: showPasswordProp = false,
|
|
81
|
+
size,
|
|
82
|
+
text,
|
|
83
|
+
tooltipFeedback,
|
|
84
|
+
valid,
|
|
85
|
+
...rest
|
|
86
|
+
},
|
|
87
|
+
ref
|
|
88
|
+
) => {
|
|
89
|
+
const [value, setValue] = useState<React.ChangeEvent<HTMLInputElement>>()
|
|
90
|
+
const [showPassword, setShowPassword] = useState<boolean>(showPasswordProp)
|
|
91
|
+
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const timeOutId = setTimeout(
|
|
94
|
+
() => value && onChange && onChange(value),
|
|
95
|
+
typeof delay === 'number' ? delay : 500
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return () => clearTimeout(timeOutId)
|
|
99
|
+
}, [value])
|
|
100
|
+
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
setShowPassword(showPasswordProp)
|
|
103
|
+
}, [showPasswordProp])
|
|
104
|
+
|
|
105
|
+
return (
|
|
106
|
+
<CFormControlWrapper
|
|
107
|
+
describedby={rest['aria-describedby']}
|
|
108
|
+
feedback={feedback}
|
|
109
|
+
feedbackInvalid={feedbackInvalid}
|
|
110
|
+
feedbackValid={feedbackValid}
|
|
111
|
+
floatingClassName={floatingClassName}
|
|
112
|
+
floatingLabel={floatingLabel}
|
|
113
|
+
id={id}
|
|
114
|
+
invalid={invalid}
|
|
115
|
+
label={label}
|
|
116
|
+
text={text}
|
|
117
|
+
tooltipFeedback={tooltipFeedback}
|
|
118
|
+
valid={valid}
|
|
119
|
+
>
|
|
120
|
+
<div className="form-password">
|
|
121
|
+
<input
|
|
122
|
+
className={classNames(
|
|
123
|
+
'form-control',
|
|
124
|
+
{
|
|
125
|
+
[`form-control-${size}`]: size,
|
|
126
|
+
'is-invalid': invalid,
|
|
127
|
+
'is-valid': valid,
|
|
128
|
+
},
|
|
129
|
+
className
|
|
130
|
+
)}
|
|
131
|
+
id={id}
|
|
132
|
+
type={showPassword ? 'text' : 'password'}
|
|
133
|
+
onChange={(event) => (delay ? setValue(event) : onChange && onChange(event))}
|
|
134
|
+
{...rest}
|
|
135
|
+
ref={ref}
|
|
136
|
+
>
|
|
137
|
+
{children}
|
|
138
|
+
</input>
|
|
139
|
+
<button
|
|
140
|
+
type="button"
|
|
141
|
+
className="form-password-action"
|
|
142
|
+
data-coreui-toggle="password"
|
|
143
|
+
aria-label={ariaLabelToggler}
|
|
144
|
+
onClick={() => setShowPassword((prev) => !prev)}
|
|
145
|
+
>
|
|
146
|
+
<span className="form-password-action-icon"></span>
|
|
147
|
+
</button>
|
|
148
|
+
</div>
|
|
149
|
+
</CFormControlWrapper>
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
CPasswordInput.propTypes = {
|
|
155
|
+
ariaLabelToggler: PropTypes.string,
|
|
156
|
+
className: PropTypes.string,
|
|
157
|
+
id: PropTypes.string,
|
|
158
|
+
delay: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),
|
|
159
|
+
showPassword: PropTypes.bool,
|
|
160
|
+
size: PropTypes.oneOf(['sm', 'lg']),
|
|
161
|
+
...CFormControlWrapper.propTypes,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
CPasswordInput.displayName = 'CPasswordInput'
|
|
@@ -200,7 +200,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
200
200
|
visible,
|
|
201
201
|
...rest
|
|
202
202
|
},
|
|
203
|
-
ref
|
|
203
|
+
ref
|
|
204
204
|
) => {
|
|
205
205
|
const formRef = useRef<HTMLFormElement>()
|
|
206
206
|
const inputRef = useRef<HTMLInputElement>(null)
|
|
@@ -239,8 +239,9 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
239
239
|
})
|
|
240
240
|
: ''
|
|
241
241
|
}
|
|
242
|
-
|
|
243
|
-
|
|
242
|
+
if (date) {
|
|
243
|
+
setAmPm(getAmPm(new Date(date), locale))
|
|
244
|
+
}
|
|
244
245
|
}, [date])
|
|
245
246
|
|
|
246
247
|
useEffect(() => {
|
|
@@ -262,7 +263,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
262
263
|
const handleClear = (event: React.MouseEvent<HTMLElement>) => {
|
|
263
264
|
event.stopPropagation()
|
|
264
265
|
setDate(null)
|
|
265
|
-
onTimeChange
|
|
266
|
+
onTimeChange?.(null)
|
|
266
267
|
}
|
|
267
268
|
|
|
268
269
|
const handleFormValidation = (form: HTMLFormElement) => {
|
|
@@ -279,7 +280,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
279
280
|
|
|
280
281
|
const handleOnChange = useDebouncedCallback(
|
|
281
282
|
(value: string) => isValidTime(value) && setDate(convertTimeToDate(value)),
|
|
282
|
-
inputOnChangeDelay
|
|
283
|
+
inputOnChangeDelay
|
|
283
284
|
)
|
|
284
285
|
|
|
285
286
|
const handleTimeChange = (set: 'hours' | 'minutes' | 'seconds' | 'toggle', value: string) => {
|
|
@@ -311,7 +312,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
311
312
|
}
|
|
312
313
|
|
|
313
314
|
setDate(new Date(_date))
|
|
314
|
-
onTimeChange
|
|
315
|
+
onTimeChange?.(_date.toTimeString(), _date.toLocaleTimeString(), _date)
|
|
315
316
|
}
|
|
316
317
|
|
|
317
318
|
const InputGroup = () => (
|
|
@@ -456,7 +457,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
456
457
|
'is-invalid': isValid === false ? true : false,
|
|
457
458
|
'is-valid': isValid,
|
|
458
459
|
},
|
|
459
|
-
className
|
|
460
|
+
className
|
|
460
461
|
)}
|
|
461
462
|
container={container}
|
|
462
463
|
disabled={disabled}
|
|
@@ -470,7 +471,10 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
470
471
|
size={cancelButtonSize}
|
|
471
472
|
variant={cancelButtonVariant}
|
|
472
473
|
onClick={() => {
|
|
473
|
-
|
|
474
|
+
if (initialDate) {
|
|
475
|
+
setDate(new Date(initialDate))
|
|
476
|
+
}
|
|
477
|
+
|
|
474
478
|
setVisible(false)
|
|
475
479
|
}}
|
|
476
480
|
>
|
|
@@ -493,12 +497,15 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
493
497
|
}
|
|
494
498
|
onHide={() => {
|
|
495
499
|
setVisible(false)
|
|
496
|
-
onHide
|
|
500
|
+
onHide?.()
|
|
497
501
|
}}
|
|
498
502
|
onShow={() => {
|
|
499
|
-
|
|
503
|
+
if (date) {
|
|
504
|
+
setInitialDate(new Date(date))
|
|
505
|
+
}
|
|
506
|
+
|
|
500
507
|
setVisible(true)
|
|
501
|
-
onShow
|
|
508
|
+
onShow?.()
|
|
502
509
|
}}
|
|
503
510
|
portal={portal}
|
|
504
511
|
toggler={InputGroup()}
|
|
@@ -550,7 +557,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
|
|
|
550
557
|
</CPicker>
|
|
551
558
|
</CFormControlWrapper>
|
|
552
559
|
)
|
|
553
|
-
}
|
|
560
|
+
}
|
|
554
561
|
)
|
|
555
562
|
|
|
556
563
|
CTimePicker.propTypes = {
|
|
@@ -65,12 +65,12 @@ export const getAmPm = (date: Date, locale: string): AmPm => {
|
|
|
65
65
|
export const formatTimePartials = (
|
|
66
66
|
values: number[],
|
|
67
67
|
locale: string,
|
|
68
|
-
partial: 'hour' | 'minute' | 'second'
|
|
68
|
+
partial: 'hour' | 'minute' | 'second'
|
|
69
69
|
): FormattedPartial[] => {
|
|
70
70
|
const date = new Date()
|
|
71
|
-
|
|
71
|
+
const forceTwoDigit = shouldUseTwoDigitHour(locale)
|
|
72
72
|
const formatter = new Intl.DateTimeFormat(locale, {
|
|
73
|
-
hour: 'numeric',
|
|
73
|
+
hour: forceTwoDigit ? '2-digit' : 'numeric',
|
|
74
74
|
minute: '2-digit',
|
|
75
75
|
second: '2-digit',
|
|
76
76
|
})
|
|
@@ -109,32 +109,32 @@ export const getLocalizedTimePartials = (
|
|
|
109
109
|
ampm: 'auto' | boolean = 'auto',
|
|
110
110
|
hours: boolean | number[] | ((hour: number) => number[]) = [],
|
|
111
111
|
minutes: boolean | number[] | ((minute: number) => number[]) = [],
|
|
112
|
-
seconds: boolean | number[] | ((second: number) => number[]) = []
|
|
112
|
+
seconds: boolean | number[] | ((second: number) => number[]) = []
|
|
113
113
|
): LocalizedTimePartials => {
|
|
114
114
|
const hour12 = (ampm === 'auto' && isAmPm(locale)) || ampm === true
|
|
115
115
|
|
|
116
116
|
const listOfHours =
|
|
117
117
|
Array.isArray(hours) && hours.length > 0
|
|
118
118
|
? hours
|
|
119
|
-
:
|
|
119
|
+
: typeof hours === 'function'
|
|
120
120
|
? Array.from({ length: hour12 ? 12 : 24 }, (_, i) => (hour12 ? i + 1 : i)).filter((hour) =>
|
|
121
|
-
hours(hour)
|
|
121
|
+
hours(hour)
|
|
122
122
|
)
|
|
123
|
-
: Array.from({ length: hour12 ? 12 : 24 }, (_, i) => (hour12 ? i + 1 : i))
|
|
123
|
+
: Array.from({ length: hour12 ? 12 : 24 }, (_, i) => (hour12 ? i + 1 : i))
|
|
124
124
|
|
|
125
125
|
const listOfMinutes =
|
|
126
126
|
Array.isArray(minutes) && minutes.length > 0
|
|
127
127
|
? minutes
|
|
128
|
-
:
|
|
128
|
+
: typeof minutes === 'function'
|
|
129
129
|
? Array.from({ length: 60 }, (_, i) => i).filter((minute) => minutes(minute))
|
|
130
|
-
: Array.from({ length: 60 }, (_, i) => i)
|
|
130
|
+
: Array.from({ length: 60 }, (_, i) => i)
|
|
131
131
|
|
|
132
132
|
const listOfSeconds =
|
|
133
133
|
Array.isArray(seconds) && seconds.length > 0
|
|
134
134
|
? seconds
|
|
135
|
-
:
|
|
135
|
+
: typeof seconds === 'function'
|
|
136
136
|
? Array.from({ length: 60 }, (_, i) => i).filter((second) => seconds(second))
|
|
137
|
-
: Array.from({ length: 60 }, (_, i) => i)
|
|
137
|
+
: Array.from({ length: 60 }, (_, i) => i)
|
|
138
138
|
|
|
139
139
|
return {
|
|
140
140
|
listOfHours: formatTimePartials(listOfHours, locale, 'hour'),
|
|
@@ -154,12 +154,12 @@ export const getLocalizedTimePartials = (
|
|
|
154
154
|
export const getSelectedHour = (
|
|
155
155
|
date: Date | null,
|
|
156
156
|
locale: string,
|
|
157
|
-
ampm: 'auto' | boolean = 'auto'
|
|
157
|
+
ampm: 'auto' | boolean = 'auto'
|
|
158
158
|
): number | string =>
|
|
159
159
|
date
|
|
160
|
-
? (
|
|
160
|
+
? (ampm === 'auto' && isAmPm(locale)) || ampm === true
|
|
161
161
|
? convert24hTo12h(date.getHours())
|
|
162
|
-
: date.getHours()
|
|
162
|
+
: date.getHours()
|
|
163
163
|
: ''
|
|
164
164
|
|
|
165
165
|
/**
|
|
@@ -195,3 +195,19 @@ export const isValidTime = (time: string): boolean => {
|
|
|
195
195
|
const d = new Date(`1970-01-01T${time}`)
|
|
196
196
|
return d instanceof Date && !Number.isNaN(d.getTime())
|
|
197
197
|
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Checks whether the given locale formats the hour "9" with a leading zero ("09")
|
|
201
|
+
* when using `hour: 'numeric'` in `toLocaleTimeString`.
|
|
202
|
+
*
|
|
203
|
+
* This helps determine if you should force `hour: '2-digit'` for consistent formatting.
|
|
204
|
+
*
|
|
205
|
+
* @param {string} locale - The locale code (e.g., "en-US", "pl-PL").
|
|
206
|
+
* @returns {boolean} `true` if the formatted hour starts with a leading zero, otherwise `false`.
|
|
207
|
+
*/
|
|
208
|
+
export const shouldUseTwoDigitHour = (locale: string): boolean => {
|
|
209
|
+
const d = new Date(2020, 0, 1, 7, 5, 7) // 7:05:07
|
|
210
|
+
const formatted = d.toLocaleTimeString(locale)
|
|
211
|
+
|
|
212
|
+
return formatted.startsWith('0') // check if the hour starts with "0"
|
|
213
|
+
}
|