@itwin/itwinui-react 3.0.0-dev.1 → 3.0.0-dev.3
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/CHANGELOG.md +25 -0
- package/cjs/core/Alert/Alert.d.ts +47 -28
- package/cjs/core/Alert/Alert.js +73 -21
- package/cjs/core/Avatar/Avatar.js +1 -1
- package/cjs/core/AvatarGroup/AvatarGroup.js +1 -1
- package/cjs/core/Breadcrumbs/Breadcrumbs.js +2 -3
- package/cjs/core/ButtonGroup/ButtonGroup.js +1 -4
- package/cjs/core/Buttons/DropdownButton/DropdownButton.js +3 -5
- package/cjs/core/Carousel/Carousel.d.ts +2 -2
- package/cjs/core/Carousel/Carousel.js +3 -5
- package/cjs/core/Carousel/CarouselDotsList.js +8 -10
- package/cjs/core/Carousel/CarouselNavigation.d.ts +2 -2
- package/cjs/core/Carousel/CarouselNavigation.js +3 -5
- package/cjs/core/Carousel/CarouselSlider.js +10 -15
- package/cjs/core/ColorPicker/ColorBuilder.js +7 -10
- package/cjs/core/ColorPicker/ColorInputPanel.js +12 -15
- package/cjs/core/ColorPicker/ColorPalette.js +4 -6
- package/cjs/core/ColorPicker/ColorPicker.js +3 -3
- package/cjs/core/ComboBox/ComboBox.js +25 -32
- package/cjs/core/ComboBox/ComboBoxDropdown.js +1 -2
- package/cjs/core/ComboBox/ComboBoxEndIcon.js +1 -1
- package/cjs/core/ComboBox/ComboBoxInput.js +21 -20
- package/cjs/core/ComboBox/ComboBoxMenu.js +3 -4
- package/cjs/core/ComboBox/ComboBoxMenuItem.js +2 -2
- package/cjs/core/ComboBox/helpers.js +4 -5
- package/cjs/core/DatePicker/DatePicker.js +32 -32
- package/cjs/core/Dialog/Dialog.js +11 -4
- package/cjs/core/Dialog/DialogBackdrop.js +1 -1
- package/cjs/core/Dialog/DialogContext.d.ts +11 -0
- package/cjs/core/Dialog/DialogMain.js +16 -22
- package/cjs/core/DropdownMenu/DropdownMenu.js +6 -8
- package/cjs/core/ExpandableBlock/ExpandableBlock.js +2 -2
- package/cjs/core/FileUpload/FileEmptyCard.js +1 -1
- package/cjs/core/FileUpload/FileUpload.d.ts +3 -4
- package/cjs/core/FileUpload/FileUpload.js +5 -8
- package/cjs/core/FileUpload/FileUploadCard.js +9 -10
- package/cjs/core/FileUpload/FileUploadTemplate.d.ts +1 -0
- package/cjs/core/FileUpload/FileUploadTemplate.js +1 -0
- package/cjs/core/InformationPanel/InformationPanel.js +1 -4
- package/cjs/core/LabeledInput/LabeledInput.js +1 -1
- package/cjs/core/LabeledTextarea/LabeledTextarea.js +1 -1
- package/cjs/core/Menu/Menu.js +3 -4
- package/cjs/core/Menu/MenuItem.js +8 -11
- package/cjs/core/Modal/Modal.d.ts +8 -9
- package/cjs/core/Modal/Modal.js +7 -17
- package/cjs/core/SearchBox/SearchBox.js +12 -12
- package/cjs/core/Select/Select.js +12 -17
- package/cjs/core/SideNavigation/SideNavigation.js +2 -2
- package/cjs/core/Slider/Slider.js +16 -19
- package/cjs/core/Slider/Thumb.js +1 -1
- package/cjs/core/StatusMessage/StatusMessage.js +1 -1
- package/cjs/core/Stepper/Stepper.js +1 -1
- package/cjs/core/Stepper/StepperStep.js +1 -1
- package/cjs/core/Table/Table.js +15 -15
- package/cjs/core/Table/TablePaginator.js +2 -3
- package/cjs/core/Table/TableRowMemoized.js +38 -45
- package/cjs/core/Table/actionHandlers/expandHandler.js +3 -3
- package/cjs/core/Table/actionHandlers/filterHandler.js +4 -5
- package/cjs/core/Table/actionHandlers/selectHandler.js +6 -6
- package/cjs/core/Table/cells/DefaultCell.js +1 -1
- package/cjs/core/Table/cells/EditableCell.js +6 -12
- package/cjs/core/Table/columns/actionColumn.js +3 -6
- package/cjs/core/Table/columns/expanderColumn.js +3 -3
- package/cjs/core/Table/columns/selectionColumn.js +4 -4
- package/cjs/core/Table/filters/DateRangeFilter/DatePickerInput.js +2 -4
- package/cjs/core/Table/filters/DateRangeFilter/DateRangeFilter.js +2 -3
- package/cjs/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +2 -3
- package/cjs/core/Table/filters/TextFilter/TextFilter.js +1 -2
- package/cjs/core/Table/hooks/useResizeColumns.js +16 -22
- package/cjs/core/Table/hooks/useScrollToRow.js +1 -2
- package/cjs/core/Table/hooks/useStickyColumns.js +3 -5
- package/cjs/core/Table/hooks/useSubRowFiltering.js +2 -4
- package/cjs/core/Tabs/Tabs.js +13 -16
- package/cjs/core/ThemeProvider/ThemeContext.d.ts +1 -1
- package/cjs/core/ThemeProvider/ThemeProvider.d.ts +2 -3
- package/cjs/core/ThemeProvider/ThemeProvider.js +14 -13
- package/cjs/core/Tile/Tile.js +2 -3
- package/cjs/core/TimePicker/TimePicker.js +13 -13
- package/cjs/core/Toast/Toast.d.ts +5 -10
- package/cjs/core/Toast/Toast.js +17 -16
- package/cjs/core/Toast/Toaster.d.ts +24 -26
- package/cjs/core/Toast/Toaster.js +91 -121
- package/cjs/core/Toast/index.d.ts +1 -4
- package/cjs/core/Toast/index.js +3 -6
- package/cjs/core/TransferList/TransferList.js +3 -4
- package/cjs/core/Tree/Tree.js +9 -13
- package/cjs/core/Tree/TreeNode.js +9 -10
- package/cjs/core/index.d.ts +1 -2
- package/cjs/core/index.js +2 -5
- package/cjs/core/utils/color/ColorValue.js +9 -15
- package/cjs/core/utils/components/AutoclearingHiddenLiveRegion.js +2 -3
- package/cjs/core/utils/components/FocusTrap.js +4 -4
- package/cjs/core/utils/components/MiddleTextTruncation.js +1 -2
- package/cjs/core/utils/components/Popover.d.ts +1 -1
- package/cjs/core/utils/components/Popover.js +5 -8
- package/cjs/core/utils/components/Resizer.js +7 -6
- package/cjs/core/utils/components/VirtualScroll.js +14 -21
- package/cjs/core/utils/functions/dom.d.ts +0 -8
- package/cjs/core/utils/functions/dom.js +3 -26
- package/cjs/core/utils/functions/polymorphic.d.ts +1 -1
- package/cjs/core/utils/functions/polymorphic.js +1 -1
- package/cjs/core/utils/functions/supports.js +1 -1
- package/cjs/core/utils/hooks/index.d.ts +0 -1
- package/cjs/core/utils/hooks/index.js +0 -1
- package/cjs/core/utils/hooks/useContainerWidth.js +1 -1
- package/cjs/core/utils/hooks/useDragAndDrop.js +8 -10
- package/cjs/core/utils/hooks/useEventListener.js +1 -1
- package/cjs/core/utils/hooks/useGlobals.d.ts +9 -2
- package/cjs/core/utils/hooks/useGlobals.js +6 -4
- package/cjs/core/utils/hooks/useId.js +1 -2
- package/cjs/core/utils/hooks/useIntersection.js +2 -3
- package/cjs/core/utils/hooks/useMediaQuery.js +6 -8
- package/cjs/core/utils/hooks/useOverflow.js +1 -2
- package/cjs/core/utils/hooks/useResizeObserver.js +3 -4
- package/cjs/styles.js +1 -4
- package/esm/core/Alert/Alert.d.ts +47 -28
- package/esm/core/Alert/Alert.js +74 -22
- package/esm/core/Avatar/Avatar.js +1 -1
- package/esm/core/AvatarGroup/AvatarGroup.js +1 -1
- package/esm/core/Breadcrumbs/Breadcrumbs.js +2 -3
- package/esm/core/ButtonGroup/ButtonGroup.js +1 -4
- package/esm/core/Buttons/DropdownButton/DropdownButton.js +3 -5
- package/esm/core/Carousel/Carousel.d.ts +2 -2
- package/esm/core/Carousel/Carousel.js +3 -5
- package/esm/core/Carousel/CarouselDotsList.js +8 -10
- package/esm/core/Carousel/CarouselNavigation.d.ts +2 -2
- package/esm/core/Carousel/CarouselNavigation.js +3 -5
- package/esm/core/Carousel/CarouselSlider.js +10 -15
- package/esm/core/ColorPicker/ColorBuilder.js +7 -10
- package/esm/core/ColorPicker/ColorInputPanel.js +12 -15
- package/esm/core/ColorPicker/ColorPalette.js +4 -6
- package/esm/core/ColorPicker/ColorPicker.js +3 -3
- package/esm/core/ComboBox/ComboBox.js +25 -32
- package/esm/core/ComboBox/ComboBoxDropdown.js +1 -2
- package/esm/core/ComboBox/ComboBoxEndIcon.js +1 -1
- package/esm/core/ComboBox/ComboBoxInput.js +21 -20
- package/esm/core/ComboBox/ComboBoxMenu.js +3 -4
- package/esm/core/ComboBox/ComboBoxMenuItem.js +2 -2
- package/esm/core/ComboBox/helpers.js +4 -5
- package/esm/core/DatePicker/DatePicker.js +32 -32
- package/esm/core/Dialog/Dialog.js +12 -5
- package/esm/core/Dialog/DialogBackdrop.js +1 -1
- package/esm/core/Dialog/DialogContext.d.ts +11 -0
- package/esm/core/Dialog/DialogMain.js +16 -22
- package/esm/core/DropdownMenu/DropdownMenu.js +6 -8
- package/esm/core/ExpandableBlock/ExpandableBlock.js +2 -2
- package/esm/core/FileUpload/FileEmptyCard.js +1 -1
- package/esm/core/FileUpload/FileUpload.d.ts +3 -4
- package/esm/core/FileUpload/FileUpload.js +5 -8
- package/esm/core/FileUpload/FileUploadCard.js +9 -10
- package/esm/core/FileUpload/FileUploadTemplate.d.ts +1 -0
- package/esm/core/FileUpload/FileUploadTemplate.js +1 -0
- package/esm/core/InformationPanel/InformationPanel.js +1 -4
- package/esm/core/LabeledInput/LabeledInput.js +1 -1
- package/esm/core/LabeledTextarea/LabeledTextarea.js +1 -1
- package/esm/core/Menu/Menu.js +3 -4
- package/esm/core/Menu/MenuItem.js +8 -11
- package/esm/core/Modal/Modal.d.ts +8 -9
- package/esm/core/Modal/Modal.js +3 -10
- package/esm/core/SearchBox/SearchBox.js +12 -12
- package/esm/core/Select/Select.js +12 -17
- package/esm/core/SideNavigation/SideNavigation.js +2 -2
- package/esm/core/Slider/Slider.js +16 -19
- package/esm/core/Slider/Thumb.js +1 -1
- package/esm/core/StatusMessage/StatusMessage.js +1 -1
- package/esm/core/Stepper/Stepper.js +1 -1
- package/esm/core/Stepper/StepperStep.js +1 -1
- package/esm/core/Table/Table.js +15 -15
- package/esm/core/Table/TablePaginator.js +2 -3
- package/esm/core/Table/TableRowMemoized.js +38 -45
- package/esm/core/Table/actionHandlers/expandHandler.js +3 -3
- package/esm/core/Table/actionHandlers/filterHandler.js +4 -5
- package/esm/core/Table/actionHandlers/selectHandler.js +6 -6
- package/esm/core/Table/cells/DefaultCell.js +1 -1
- package/esm/core/Table/cells/EditableCell.js +6 -12
- package/esm/core/Table/columns/actionColumn.js +3 -6
- package/esm/core/Table/columns/expanderColumn.js +3 -3
- package/esm/core/Table/columns/selectionColumn.js +4 -4
- package/esm/core/Table/filters/DateRangeFilter/DatePickerInput.js +2 -4
- package/esm/core/Table/filters/DateRangeFilter/DateRangeFilter.js +2 -3
- package/esm/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +2 -3
- package/esm/core/Table/filters/TextFilter/TextFilter.js +1 -2
- package/esm/core/Table/hooks/useResizeColumns.js +16 -22
- package/esm/core/Table/hooks/useScrollToRow.js +1 -2
- package/esm/core/Table/hooks/useStickyColumns.js +3 -5
- package/esm/core/Table/hooks/useSubRowFiltering.js +2 -4
- package/esm/core/Tabs/Tabs.js +13 -16
- package/esm/core/ThemeProvider/ThemeContext.d.ts +1 -1
- package/esm/core/ThemeProvider/ThemeProvider.d.ts +2 -3
- package/esm/core/ThemeProvider/ThemeProvider.js +15 -14
- package/esm/core/Tile/Tile.js +2 -3
- package/esm/core/TimePicker/TimePicker.js +13 -13
- package/esm/core/Toast/Toast.d.ts +5 -10
- package/esm/core/Toast/Toast.js +18 -17
- package/esm/core/Toast/Toaster.d.ts +24 -26
- package/esm/core/Toast/Toaster.js +85 -121
- package/esm/core/Toast/index.d.ts +1 -4
- package/esm/core/Toast/index.js +1 -3
- package/esm/core/TransferList/TransferList.js +3 -4
- package/esm/core/Tree/Tree.js +9 -13
- package/esm/core/Tree/TreeNode.js +9 -10
- package/esm/core/index.d.ts +1 -2
- package/esm/core/index.js +1 -1
- package/esm/core/utils/color/ColorValue.js +9 -15
- package/esm/core/utils/components/AutoclearingHiddenLiveRegion.js +2 -3
- package/esm/core/utils/components/FocusTrap.js +4 -4
- package/esm/core/utils/components/MiddleTextTruncation.js +1 -2
- package/esm/core/utils/components/Popover.d.ts +1 -1
- package/esm/core/utils/components/Popover.js +5 -8
- package/esm/core/utils/components/Resizer.js +7 -6
- package/esm/core/utils/components/VirtualScroll.js +14 -21
- package/esm/core/utils/functions/dom.d.ts +0 -8
- package/esm/core/utils/functions/dom.js +2 -21
- package/esm/core/utils/functions/polymorphic.d.ts +1 -1
- package/esm/core/utils/functions/polymorphic.js +1 -1
- package/esm/core/utils/functions/supports.js +1 -1
- package/esm/core/utils/hooks/index.d.ts +0 -1
- package/esm/core/utils/hooks/index.js +0 -1
- package/esm/core/utils/hooks/useContainerWidth.js +1 -1
- package/esm/core/utils/hooks/useDragAndDrop.js +8 -10
- package/esm/core/utils/hooks/useEventListener.js +1 -1
- package/esm/core/utils/hooks/useGlobals.d.ts +9 -2
- package/esm/core/utils/hooks/useGlobals.js +6 -4
- package/esm/core/utils/hooks/useId.js +1 -2
- package/esm/core/utils/hooks/useIntersection.js +2 -3
- package/esm/core/utils/hooks/useMediaQuery.js +6 -8
- package/esm/core/utils/hooks/useOverflow.js +1 -2
- package/esm/core/utils/hooks/useResizeObserver.js +3 -4
- package/esm/styles.js +1 -4
- package/package.json +2 -2
- package/styles.css +19 -20
- package/cjs/core/Toast/ToastWrapper.d.ts +0 -10
- package/cjs/core/Toast/ToastWrapper.js +0 -49
- package/cjs/core/utils/hooks/useIsThemeAlreadySet.d.ts +0 -7
- package/cjs/core/utils/hooks/useIsThemeAlreadySet.js +0 -54
- package/esm/core/Toast/ToastWrapper.d.ts +0 -10
- package/esm/core/Toast/ToastWrapper.js +0 -20
- package/esm/core/utils/hooks/useIsThemeAlreadySet.d.ts +0 -7
- package/esm/core/utils/hooks/useIsThemeAlreadySet.js +0 -27
|
@@ -110,17 +110,20 @@ export const generateLocalizedStrings = (locale) => {
|
|
|
110
110
|
* <DatePicker date={new Date()} onChange={(e) => console.log('New date value: ' + e)} />
|
|
111
111
|
*/
|
|
112
112
|
export const DatePicker = React.forwardRef((props, forwardedRef) => {
|
|
113
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
114
113
|
const { date, onChange, localizedNames, className, setFocus = false, showTime = false, use12Hours = false, precision, hourStep, minuteStep, secondStep, useCombinedRenderer, combinedRenderer, hourRenderer, minuteRenderer, secondRenderer, meridiemRenderer, showYearSelection = false, enableRangeSelect = false, startDate, endDate, isDateDisabled, ...rest } = props;
|
|
115
|
-
const monthNames =
|
|
116
|
-
const shortDays =
|
|
117
|
-
const longDays =
|
|
114
|
+
const monthNames = localizedNames?.months ?? defaultMonths;
|
|
115
|
+
const shortDays = localizedNames?.shortDays ?? defaultShortDays;
|
|
116
|
+
const longDays = localizedNames?.days ?? defaultLongDays;
|
|
118
117
|
const [selectedDay, setSelectedDay] = React.useState(date);
|
|
119
118
|
const [selectedStartDay, setSelectedStartDay] = React.useState(startDate);
|
|
120
119
|
const [selectedEndDay, setSelectedEndDay] = React.useState(endDate);
|
|
121
|
-
const [focusedDay, setFocusedDay] = React.useState(
|
|
122
|
-
const [displayedMonthIndex, setDisplayedMonthIndex] = React.useState(
|
|
123
|
-
|
|
120
|
+
const [focusedDay, setFocusedDay] = React.useState(selectedStartDay ?? selectedDay ?? new Date());
|
|
121
|
+
const [displayedMonthIndex, setDisplayedMonthIndex] = React.useState(selectedStartDay?.getMonth() ??
|
|
122
|
+
selectedDay?.getMonth() ??
|
|
123
|
+
new Date().getMonth());
|
|
124
|
+
const [displayedYear, setDisplayedYear] = React.useState(selectedStartDay?.getFullYear() ??
|
|
125
|
+
selectedDay?.getFullYear() ??
|
|
126
|
+
new Date().getFullYear());
|
|
124
127
|
// boolean that toggles between the user picking the start date and end date for date range
|
|
125
128
|
const [isSelectingStartDate, setIsSelectingStartDate] = React.useState(true);
|
|
126
129
|
// Used to focus days only when days are changed
|
|
@@ -136,15 +139,16 @@ export const DatePicker = React.forwardRef((props, forwardedRef) => {
|
|
|
136
139
|
setDisplayedYear(newYear);
|
|
137
140
|
}, []);
|
|
138
141
|
React.useEffect(() => {
|
|
139
|
-
var _a, _b, _c, _d;
|
|
140
142
|
const currentDate = new Date();
|
|
141
143
|
setSelectedDay(date);
|
|
142
144
|
setSelectedStartDay(startDate);
|
|
143
145
|
setSelectedEndDay(endDate);
|
|
144
146
|
if (!enableRangeSelect) {
|
|
145
|
-
setFocusedDay(date
|
|
147
|
+
setFocusedDay(date ?? currentDate);
|
|
146
148
|
}
|
|
147
|
-
setMonthAndYear(
|
|
149
|
+
setMonthAndYear(startDate?.getMonth() ?? date?.getMonth() ?? currentDate.getMonth(), startDate?.getFullYear() ??
|
|
150
|
+
date?.getFullYear() ??
|
|
151
|
+
currentDate.getFullYear());
|
|
148
152
|
}, [date, setMonthAndYear, startDate, endDate, enableRangeSelect]);
|
|
149
153
|
const days = React.useMemo(() => {
|
|
150
154
|
let offsetToFirst = new Date(displayedYear, displayedMonthIndex, 1).getDay();
|
|
@@ -169,8 +173,7 @@ export const DatePicker = React.forwardRef((props, forwardedRef) => {
|
|
|
169
173
|
return weeksInMonth;
|
|
170
174
|
}, [days]);
|
|
171
175
|
const getNewFocusedDate = (newYear, newMonth) => {
|
|
172
|
-
|
|
173
|
-
const currentDate = (_a = selectedStartDay !== null && selectedStartDay !== void 0 ? selectedStartDay : selectedDay) !== null && _a !== void 0 ? _a : new Date();
|
|
176
|
+
const currentDate = selectedStartDay ?? selectedDay ?? new Date();
|
|
174
177
|
const newDate = new Date(newYear, newMonth, currentDate.getDate(), currentDate.getHours(), currentDate.getMinutes(), currentDate.getSeconds());
|
|
175
178
|
return newDate;
|
|
176
179
|
};
|
|
@@ -199,51 +202,51 @@ export const DatePicker = React.forwardRef((props, forwardedRef) => {
|
|
|
199
202
|
const onDayClick = (day) => {
|
|
200
203
|
// single date selection
|
|
201
204
|
if (!enableRangeSelect) {
|
|
202
|
-
if (day.getMonth() !==
|
|
205
|
+
if (day.getMonth() !== selectedDay?.getMonth()) {
|
|
203
206
|
setMonthAndYear(day.getMonth(), day.getFullYear());
|
|
204
207
|
}
|
|
205
|
-
const currentDate = selectedDay
|
|
208
|
+
const currentDate = selectedDay ?? new Date();
|
|
206
209
|
const newDate = new Date(day.getFullYear(), day.getMonth(), day.getDate(), currentDate.getHours(), currentDate.getMinutes(), currentDate.getSeconds());
|
|
207
210
|
setSelectedDay(newDate);
|
|
208
211
|
setFocusedDay(newDate);
|
|
209
|
-
isSingleOnChange(onChange, enableRangeSelect) &&
|
|
212
|
+
isSingleOnChange(onChange, enableRangeSelect) && onChange?.(newDate);
|
|
210
213
|
}
|
|
211
214
|
// start date selection (date range only)
|
|
212
215
|
else if (isSelectingStartDate) {
|
|
213
|
-
if (day.getMonth() !==
|
|
216
|
+
if (day.getMonth() !== selectedStartDay?.getMonth()) {
|
|
214
217
|
setMonthAndYear(day.getMonth(), day.getFullYear());
|
|
215
218
|
}
|
|
216
|
-
const currentStartDate = selectedStartDay
|
|
219
|
+
const currentStartDate = selectedStartDay ?? new Date();
|
|
217
220
|
const newStartDate = new Date(day.getFullYear(), day.getMonth(), day.getDate(), currentStartDate.getHours(), currentStartDate.getMinutes(), currentStartDate.getSeconds());
|
|
218
221
|
setSelectedStartDay(newStartDate);
|
|
219
222
|
setFocusedDay(newStartDate);
|
|
220
223
|
// if the start date is after the end date or the end date is undefined, reset the end date
|
|
221
224
|
if (!isBefore(newStartDate, selectedEndDay)) {
|
|
222
225
|
setSelectedEndDay(newStartDate);
|
|
223
|
-
onChange
|
|
226
|
+
onChange?.(newStartDate, newStartDate);
|
|
224
227
|
}
|
|
225
228
|
else {
|
|
226
|
-
selectedEndDay &&
|
|
229
|
+
selectedEndDay && onChange?.(newStartDate, selectedEndDay);
|
|
227
230
|
}
|
|
228
231
|
setIsSelectingStartDate(false);
|
|
229
232
|
}
|
|
230
233
|
// end date selection (date range only)
|
|
231
234
|
else {
|
|
232
|
-
if (day.getMonth() !==
|
|
235
|
+
if (day.getMonth() !== selectedEndDay?.getMonth()) {
|
|
233
236
|
setMonthAndYear(day.getMonth(), day.getFullYear());
|
|
234
237
|
}
|
|
235
|
-
const currentEndDate = selectedEndDay
|
|
238
|
+
const currentEndDate = selectedEndDay ?? new Date();
|
|
236
239
|
const newEndDate = new Date(day.getFullYear(), day.getMonth(), day.getDate(), currentEndDate.getHours(), currentEndDate.getMinutes(), currentEndDate.getSeconds());
|
|
237
240
|
setFocusedDay(newEndDate);
|
|
238
241
|
// if the end date is before the start date, move back the start date and still have user select end date
|
|
239
242
|
if (!isBefore(newEndDate, selectedStartDay)) {
|
|
240
243
|
setSelectedEndDay(newEndDate);
|
|
241
|
-
selectedStartDay &&
|
|
244
|
+
selectedStartDay && onChange?.(selectedStartDay, newEndDate);
|
|
242
245
|
setIsSelectingStartDate(true);
|
|
243
246
|
}
|
|
244
247
|
else {
|
|
245
248
|
setSelectedStartDay(newEndDate);
|
|
246
|
-
selectedEndDay &&
|
|
249
|
+
selectedEndDay && onChange?.(newEndDate, selectedEndDay);
|
|
247
250
|
}
|
|
248
251
|
}
|
|
249
252
|
};
|
|
@@ -295,7 +298,7 @@ export const DatePicker = React.forwardRef((props, forwardedRef) => {
|
|
|
295
298
|
case 'Enter':
|
|
296
299
|
case ' ':
|
|
297
300
|
case 'Spacebar':
|
|
298
|
-
if (!
|
|
301
|
+
if (!isDateDisabled?.(focusedDay)) {
|
|
299
302
|
onDayClick(focusedDay);
|
|
300
303
|
}
|
|
301
304
|
event.preventDefault();
|
|
@@ -348,17 +351,14 @@ export const DatePicker = React.forwardRef((props, forwardedRef) => {
|
|
|
348
351
|
React.createElement("div", { onKeyDown: handleCalendarKeyDown, role: 'listbox' }, weeks.map((weekDays, weekIndex) => {
|
|
349
352
|
return (React.createElement(Box, { key: `week-${displayedMonthIndex}-${weekIndex}`, className: 'iui-calendar-week' }, weekDays.map((weekDay, dayIndex) => {
|
|
350
353
|
const dateValue = weekDay.getDate();
|
|
351
|
-
const isDisabled = isDateDisabled
|
|
354
|
+
const isDisabled = isDateDisabled?.(weekDay);
|
|
352
355
|
return (React.createElement(Box, { key: `day-${displayedMonthIndex}-${dayIndex}`, className: getDayClass(weekDay), onClick: () => !isDisabled && onDayClick(weekDay), role: 'option', tabIndex: isSameDay(weekDay, focusedDay) ? 0 : -1, "aria-disabled": isDisabled ? 'true' : undefined, ref: (element) => isSameDay(weekDay, focusedDay) &&
|
|
353
356
|
needFocus.current &&
|
|
354
|
-
|
|
357
|
+
element?.focus() }, dateValue));
|
|
355
358
|
})));
|
|
356
359
|
}))),
|
|
357
|
-
showTime && (React.createElement(TimePicker, { date: selectedStartDay
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
? onChange === null || onChange === void 0 ? void 0 : onChange(date)
|
|
361
|
-
: onChange === null || onChange === void 0 ? void 0 : onChange(new Date((_a = selectedStartDay === null || selectedStartDay === void 0 ? void 0 : selectedStartDay.getFullYear()) !== null && _a !== void 0 ? _a : date.getFullYear(), (_b = selectedStartDay === null || selectedStartDay === void 0 ? void 0 : selectedStartDay.getMonth()) !== null && _b !== void 0 ? _b : date.getMonth(), (_c = selectedStartDay === null || selectedStartDay === void 0 ? void 0 : selectedStartDay.getDate()) !== null && _c !== void 0 ? _c : date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()), new Date((_d = selectedEndDay === null || selectedEndDay === void 0 ? void 0 : selectedEndDay.getFullYear()) !== null && _d !== void 0 ? _d : date.getFullYear(), (_e = selectedEndDay === null || selectedEndDay === void 0 ? void 0 : selectedEndDay.getMonth()) !== null && _e !== void 0 ? _e : date.getMonth(), (_f = selectedEndDay === null || selectedEndDay === void 0 ? void 0 : selectedEndDay.getDate()) !== null && _f !== void 0 ? _f : date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
|
|
362
|
-
} }))));
|
|
360
|
+
showTime && (React.createElement(TimePicker, { date: selectedStartDay ?? selectedDay, use12Hours: use12Hours, precision: precision, hourStep: hourStep, minuteStep: minuteStep, secondStep: secondStep, useCombinedRenderer: useCombinedRenderer, combinedRenderer: combinedRenderer, hourRenderer: hourRenderer, minuteRenderer: minuteRenderer, secondRenderer: secondRenderer, meridiemRenderer: meridiemRenderer, onChange: (date) => isSingleOnChange(onChange, enableRangeSelect)
|
|
361
|
+
? onChange?.(date)
|
|
362
|
+
: onChange?.(new Date(selectedStartDay?.getFullYear() ?? date.getFullYear(), selectedStartDay?.getMonth() ?? date.getMonth(), selectedStartDay?.getDate() ?? date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()), new Date(selectedEndDay?.getFullYear() ?? date.getFullYear(), selectedEndDay?.getMonth() ?? date.getMonth(), selectedEndDay?.getDate() ?? date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())) }))));
|
|
363
363
|
});
|
|
364
364
|
export default DatePicker;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import * as React from 'react';
|
|
6
|
+
import * as ReactDOM from 'react-dom';
|
|
6
7
|
import cx from 'classnames';
|
|
7
8
|
import { DialogTitleBar } from './DialogTitleBar.js';
|
|
8
9
|
import { DialogContent } from './DialogContent.js';
|
|
@@ -10,11 +11,18 @@ import { DialogBackdrop } from './DialogBackdrop.js';
|
|
|
10
11
|
import { DialogContext } from './DialogContext.js';
|
|
11
12
|
import { DialogButtonBar } from './DialogButtonBar.js';
|
|
12
13
|
import { DialogMain } from './DialogMain.js';
|
|
13
|
-
import { useMergedRefs, Box } from '../utils/index.js';
|
|
14
|
+
import { useMergedRefs, Box, useGlobals, getDocument, useIsClient, } from '../utils/index.js';
|
|
14
15
|
const DialogComponent = React.forwardRef((props, ref) => {
|
|
15
|
-
const { trapFocus = false, setFocus = false, preventDocumentScroll = false, isOpen = false, isDismissible = true, closeOnEsc = true, closeOnExternalClick = false, onClose, isDraggable = false, isResizable = false, relativeTo = 'viewport', placement, className, ...rest } = props;
|
|
16
|
+
const { trapFocus = false, setFocus = false, preventDocumentScroll = false, isOpen = false, isDismissible = true, closeOnEsc = true, closeOnExternalClick = false, onClose, isDraggable = false, isResizable = false, relativeTo = 'viewport', placement, className, portal = false, ...rest } = props;
|
|
16
17
|
const dialogRootRef = React.useRef(null);
|
|
17
|
-
const
|
|
18
|
+
const context = useGlobals();
|
|
19
|
+
const isClient = useIsClient();
|
|
20
|
+
const portalTo = typeof portal !== 'boolean'
|
|
21
|
+
? portal.to
|
|
22
|
+
: portal
|
|
23
|
+
? context?.portalContainerRef?.current ?? getDocument()?.body
|
|
24
|
+
: null;
|
|
25
|
+
const dialog = (React.createElement(Box, { className: cx('iui-dialog-wrapper', className), "data-iui-relative": relativeTo === 'container', ref: useMergedRefs(ref, dialogRootRef), ...rest }));
|
|
18
26
|
return (React.createElement(DialogContext.Provider, { value: {
|
|
19
27
|
isOpen,
|
|
20
28
|
onClose,
|
|
@@ -29,8 +37,7 @@ const DialogComponent = React.forwardRef((props, ref) => {
|
|
|
29
37
|
relativeTo,
|
|
30
38
|
dialogRootRef,
|
|
31
39
|
placement,
|
|
32
|
-
} },
|
|
33
|
-
React.createElement(Box, { className: cx('iui-dialog-wrapper', className), "data-iui-relative": relativeTo === 'container', ref: refs, ...rest })));
|
|
40
|
+
} }, portalTo && isClient ? ReactDOM.createPortal(dialog, portalTo) : dialog));
|
|
34
41
|
});
|
|
35
42
|
/**
|
|
36
43
|
* Dialog component.
|
|
@@ -27,7 +27,7 @@ export const DialogBackdrop = React.forwardRef((props, ref) => {
|
|
|
27
27
|
if (isDismissible && closeOnExternalClick && onClose) {
|
|
28
28
|
onClose(event);
|
|
29
29
|
}
|
|
30
|
-
onMouseDown
|
|
30
|
+
onMouseDown?.(event);
|
|
31
31
|
};
|
|
32
32
|
return (React.createElement(Backdrop, { isVisible: isVisible, className: cx({ 'iui-backdrop-fixed': relativeTo === 'viewport' }, className), ref: refs, onMouseDown: handleMouseDown, style: {
|
|
33
33
|
pointerEvents: 'auto',
|
|
@@ -61,6 +61,17 @@ export declare type DialogContextProps = {
|
|
|
61
61
|
* @default 'viewport'
|
|
62
62
|
*/
|
|
63
63
|
relativeTo?: 'container' | 'viewport';
|
|
64
|
+
/**
|
|
65
|
+
* If true, the dialog will be portaled into a <div> inside the nearest `ThemeProvider`.
|
|
66
|
+
* Recommended to set to true when for modal dialogs that use `relativeTo='viewport'`.
|
|
67
|
+
*
|
|
68
|
+
* Can be set to an object with a `to` property to portal into a specific element.
|
|
69
|
+
*
|
|
70
|
+
* @default false
|
|
71
|
+
*/
|
|
72
|
+
portal?: boolean | {
|
|
73
|
+
to: HTMLElement;
|
|
74
|
+
};
|
|
64
75
|
/**
|
|
65
76
|
* Dialog root ref. For internal use.
|
|
66
77
|
*/
|
|
@@ -45,8 +45,7 @@ export const DialogMain = React.forwardRef((props, ref) => {
|
|
|
45
45
|
}, [isOpen]);
|
|
46
46
|
// Prevents document from scrolling when the dialog is open.
|
|
47
47
|
React.useEffect(() => {
|
|
48
|
-
|
|
49
|
-
const ownerDocument = (_a = dialogRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument;
|
|
48
|
+
const ownerDocument = dialogRef.current?.ownerDocument;
|
|
50
49
|
// If there is no `ownerDocument` or `preventDocumentScroll` is false or
|
|
51
50
|
// document body originally has `overflow: hidden` (possibly from other/parent dialog), then do nothing.
|
|
52
51
|
if (!ownerDocument ||
|
|
@@ -73,7 +72,7 @@ export const DialogMain = React.forwardRef((props, ref) => {
|
|
|
73
72
|
if (isDismissible && closeOnEsc && event.key === 'Escape' && onClose) {
|
|
74
73
|
onClose(event);
|
|
75
74
|
}
|
|
76
|
-
onKeyDown
|
|
75
|
+
onKeyDown?.(event);
|
|
77
76
|
};
|
|
78
77
|
const { onPointerDown, transform } = useDragAndDrop(dialogRef, dialogContext.dialogRootRef, isDraggable);
|
|
79
78
|
const handlePointerDown = React.useCallback((event) => {
|
|
@@ -83,23 +82,19 @@ export const DialogMain = React.forwardRef((props, ref) => {
|
|
|
83
82
|
}, [isDraggable, onPointerDown]);
|
|
84
83
|
// Prevents dialog from moving when window is being resized
|
|
85
84
|
useIsomorphicLayoutEffect(() => {
|
|
86
|
-
var _a;
|
|
87
85
|
if (!isDraggable || !isOpen) {
|
|
88
86
|
return;
|
|
89
87
|
}
|
|
90
|
-
const rect =
|
|
88
|
+
const rect = dialogRef.current?.getBoundingClientRect();
|
|
91
89
|
const [translateX, translateY] = getTranslateValues(dialogRef.current);
|
|
92
|
-
setStyle((oldStyle) => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
transform: `translate(${translateX}px,${translateY}px)`,
|
|
101
|
-
});
|
|
102
|
-
});
|
|
90
|
+
setStyle((oldStyle) => ({
|
|
91
|
+
...oldStyle,
|
|
92
|
+
width: rect?.width,
|
|
93
|
+
height: rect?.height,
|
|
94
|
+
left: dialogRef.current?.offsetLeft,
|
|
95
|
+
top: dialogRef.current?.offsetTop,
|
|
96
|
+
transform: `translate(${translateX}px,${translateY}px)`,
|
|
97
|
+
}));
|
|
103
98
|
}, [isDraggable, isOpen]);
|
|
104
99
|
const setResizeStyle = React.useCallback((newStyle) => {
|
|
105
100
|
setStyle((oldStyle) => ({
|
|
@@ -131,15 +126,14 @@ export const DialogMain = React.forwardRef((props, ref) => {
|
|
|
131
126
|
}, timeout: { exit: 600 },
|
|
132
127
|
// Focuses dialog when opened
|
|
133
128
|
onEntered: () => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
setFocus &&
|
|
129
|
+
previousFocusedElement.current = dialogRef.current?.ownerDocument
|
|
130
|
+
.activeElement;
|
|
131
|
+
setFocus && dialogRef.current?.focus({ preventScroll: true });
|
|
137
132
|
},
|
|
138
133
|
// Brings back focus to the previously focused element when closed
|
|
139
134
|
onExit: () => {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
(_c = previousFocusedElement.current) === null || _c === void 0 ? void 0 : _c.focus();
|
|
135
|
+
if (dialogRef.current?.contains(dialogRef.current?.ownerDocument.activeElement)) {
|
|
136
|
+
previousFocusedElement.current?.focus();
|
|
143
137
|
}
|
|
144
138
|
}, unmountOnExit: true, nodeRef: dialogRef },
|
|
145
139
|
React.createElement(DialogDragContext.Provider, { value: { onPointerDown: handlePointerDown } },
|
|
@@ -26,29 +26,27 @@ import { Menu } from '../Menu/index.js';
|
|
|
26
26
|
*/
|
|
27
27
|
export const DropdownMenu = (props) => {
|
|
28
28
|
const { menuItems, children, className, style, role = 'menu', visible, placement = 'bottom-start', onShow, onHide, trigger, id, ...rest } = props;
|
|
29
|
-
const [isVisible, setIsVisible] = React.useState(visible
|
|
29
|
+
const [isVisible, setIsVisible] = React.useState(visible ?? false);
|
|
30
30
|
React.useEffect(() => {
|
|
31
|
-
setIsVisible(visible
|
|
31
|
+
setIsVisible(visible ?? false);
|
|
32
32
|
}, [visible]);
|
|
33
33
|
const open = React.useCallback(() => setIsVisible(true), []);
|
|
34
34
|
const close = React.useCallback(() => setIsVisible(false), []);
|
|
35
35
|
const targetRef = React.useRef(null);
|
|
36
36
|
const onShowHandler = React.useCallback((instance) => {
|
|
37
37
|
setIsVisible(true);
|
|
38
|
-
onShow
|
|
38
|
+
onShow?.(instance);
|
|
39
39
|
}, [onShow]);
|
|
40
40
|
const onHideHandler = React.useCallback((instance) => {
|
|
41
|
-
var _a;
|
|
42
41
|
setIsVisible(false);
|
|
43
|
-
|
|
44
|
-
onHide
|
|
42
|
+
targetRef.current?.focus();
|
|
43
|
+
onHide?.(instance);
|
|
45
44
|
}, [onHide]);
|
|
46
45
|
return (React.createElement(Popover, { content: React.createElement(Menu, { className: className, style: style, role: role, id: id }, React.useMemo(() => menuItems(close), [menuItems, close])), visible: trigger === undefined ? isVisible : undefined, onClickOutside: close, placement: placement, onShow: onShowHandler, onHide: onHideHandler, trigger: visible === undefined ? trigger : undefined, ...rest }, React.cloneElement(children, {
|
|
47
46
|
ref: mergeRefs(targetRef, props.children.ref),
|
|
48
47
|
onClick: (args) => {
|
|
49
|
-
var _a, _b;
|
|
50
48
|
trigger === undefined && (isVisible ? close() : open());
|
|
51
|
-
|
|
49
|
+
children.props.onClick?.(args);
|
|
52
50
|
},
|
|
53
51
|
})));
|
|
54
52
|
};
|
|
@@ -16,7 +16,7 @@ import { StatusIconMap, WithCSSTransition, SvgChevronRight, Icon, Box, } from '.
|
|
|
16
16
|
*/
|
|
17
17
|
export const ExpandableBlock = React.forwardRef((props, ref) => {
|
|
18
18
|
const { caption, children, className, title, onToggle, style, isExpanded = false, endIcon, status, size = 'default', styleType = 'default', disabled = false, ...rest } = props;
|
|
19
|
-
const icon = endIcon
|
|
19
|
+
const icon = endIcon ?? (status && StatusIconMap[status]());
|
|
20
20
|
const [expanded, setExpanded] = React.useState(isExpanded);
|
|
21
21
|
React.useEffect(() => {
|
|
22
22
|
setExpanded(isExpanded);
|
|
@@ -26,7 +26,7 @@ export const ExpandableBlock = React.forwardRef((props, ref) => {
|
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
setExpanded(!expanded);
|
|
29
|
-
onToggle
|
|
29
|
+
onToggle?.(!expanded);
|
|
30
30
|
};
|
|
31
31
|
const onKeyDown = (event) => {
|
|
32
32
|
if (event.altKey || disabled) {
|
|
@@ -18,7 +18,7 @@ const FileEmptyCardText = polymorphic.span('iui-file-card-empty-action');
|
|
|
18
18
|
// FileEmptyCard component
|
|
19
19
|
const FileEmptyCardComponent = React.forwardRef((props, ref) => {
|
|
20
20
|
const { children, className, ...rest } = props;
|
|
21
|
-
return (React.createElement(Box, { className: cx('iui-file-card-empty', className), ref: ref, ...rest }, children
|
|
21
|
+
return (React.createElement(Box, { className: cx('iui-file-card-empty', className), ref: ref, ...rest }, children ?? (React.createElement(React.Fragment, null,
|
|
22
22
|
React.createElement(FileEmptyCard.Icon, null),
|
|
23
23
|
React.createElement(FileEmptyCard.Text, null,
|
|
24
24
|
React.createElement(FileUploadCard.InputLabel, null, "Choose a file"),
|
|
@@ -4,7 +4,6 @@ declare type FileUploadProps = {
|
|
|
4
4
|
/**
|
|
5
5
|
* Content shown over `children` when file is being dragged onto the component.
|
|
6
6
|
* Should always be used when drag content differs from `children` being wrapped.
|
|
7
|
-
* Can be skipped if wrapping `FileUploadTemplate`.
|
|
8
7
|
*/
|
|
9
8
|
dragContent?: React.ReactNode;
|
|
10
9
|
/**
|
|
@@ -13,15 +12,15 @@ declare type FileUploadProps = {
|
|
|
13
12
|
onFileDropped: (files: FileList) => void;
|
|
14
13
|
/**
|
|
15
14
|
* Component to wrap `FileUpload` around.
|
|
16
|
-
* Either pass `
|
|
15
|
+
* Either pass `FileUploadCard` (for default state) or a different component to wrap.
|
|
17
16
|
*/
|
|
18
17
|
children: React.ReactNode;
|
|
19
18
|
};
|
|
20
19
|
/**
|
|
21
|
-
* File upload component to be wrapped around `
|
|
20
|
+
* File upload component to be wrapped around `FileUploadCard` or any arbitrary component.
|
|
22
21
|
* Provides support for dragging and dropping multiple files.
|
|
23
22
|
* @example
|
|
24
|
-
* <FileUpload onFileDropped={console.log}><
|
|
23
|
+
* <FileUpload onFileDropped={console.log}><FileUploadCard /></FileUpload>
|
|
25
24
|
* <FileUpload dragContent='Drop file here' onFileDropped={console.log}><Textarea /></FileUpload>
|
|
26
25
|
*/
|
|
27
26
|
export declare const FileUpload: PolymorphicForwardRefComponent<"div", FileUploadProps>;
|
|
@@ -6,10 +6,10 @@ import * as React from 'react';
|
|
|
6
6
|
import cx from 'classnames';
|
|
7
7
|
import { Box, useMergedRefs } from '../utils/index.js';
|
|
8
8
|
/**
|
|
9
|
-
* File upload component to be wrapped around `
|
|
9
|
+
* File upload component to be wrapped around `FileUploadCard` or any arbitrary component.
|
|
10
10
|
* Provides support for dragging and dropping multiple files.
|
|
11
11
|
* @example
|
|
12
|
-
* <FileUpload onFileDropped={console.log}><
|
|
12
|
+
* <FileUpload onFileDropped={console.log}><FileUploadCard /></FileUpload>
|
|
13
13
|
* <FileUpload dragContent='Drop file here' onFileDropped={console.log}><Textarea /></FileUpload>
|
|
14
14
|
*/
|
|
15
15
|
export const FileUpload = React.forwardRef((props, ref) => {
|
|
@@ -22,31 +22,28 @@ export const FileUpload = React.forwardRef((props, ref) => {
|
|
|
22
22
|
e.stopPropagation();
|
|
23
23
|
};
|
|
24
24
|
const onDragEnterHandler = (e) => {
|
|
25
|
-
var _a, _b, _c;
|
|
26
25
|
e.preventDefault();
|
|
27
26
|
e.stopPropagation();
|
|
28
27
|
// only set active if a file is dragged over
|
|
29
|
-
if (!isDragActive &&
|
|
28
|
+
if (!isDragActive && e.dataTransfer?.items?.[0]?.kind === 'file') {
|
|
30
29
|
setIsDragActive(true);
|
|
31
30
|
}
|
|
32
31
|
};
|
|
33
32
|
const onDragLeaveHandler = (e) => {
|
|
34
|
-
var _a;
|
|
35
33
|
e.preventDefault();
|
|
36
34
|
e.stopPropagation();
|
|
37
35
|
// only set inactive if secondary target is outside the component
|
|
38
36
|
if (isDragActive &&
|
|
39
|
-
!
|
|
37
|
+
!fileUploadRef.current?.contains(e.relatedTarget)) {
|
|
40
38
|
setIsDragActive(false);
|
|
41
39
|
}
|
|
42
40
|
};
|
|
43
41
|
const onDropHandler = (e) => {
|
|
44
|
-
var _a;
|
|
45
42
|
e.preventDefault();
|
|
46
43
|
e.stopPropagation();
|
|
47
44
|
if (isDragActive) {
|
|
48
45
|
setIsDragActive(false);
|
|
49
|
-
onFileDropped(
|
|
46
|
+
onFileDropped(e.dataTransfer?.files);
|
|
50
47
|
}
|
|
51
48
|
};
|
|
52
49
|
return (React.createElement(Box, { className: cx('iui-file-upload', { 'iui-drag': isDragActive }, className), onDragEnter: onDragEnterHandler, onDragOver: onDragOverHandler, onDragLeave: onDragLeaveHandler, onDrop: onDropHandler, ref: refs, ...rest },
|
|
@@ -35,7 +35,7 @@ const FileUploadCardTitle = React.forwardRef((props, ref) => {
|
|
|
35
35
|
const { children, className, ...rest } = props;
|
|
36
36
|
const { files } = useSafeContext(FileUploadCardContext);
|
|
37
37
|
const title = files.length > 1 ? files.length + ' files selected' : files[0].name;
|
|
38
|
-
return (React.createElement(Box, { as: 'span', className: cx('iui-file-card-title', className), ref: ref, ...rest }, children
|
|
38
|
+
return (React.createElement(Box, { as: 'span', className: cx('iui-file-card-title', className), ref: ref, ...rest }, children ?? title));
|
|
39
39
|
});
|
|
40
40
|
FileUploadCardTitle.displayName = 'FileUploadCard.Title';
|
|
41
41
|
// ----------------------------------------------------------------------------
|
|
@@ -49,7 +49,7 @@ const FileUploadCardDescription = React.forwardRef((props, ref) => {
|
|
|
49
49
|
if (files.length > 2) {
|
|
50
50
|
description += ', and ' + (files.length - 2) + ' others';
|
|
51
51
|
}
|
|
52
|
-
return (React.createElement(Box, { as: 'span', className: cx('iui-file-card-description', className), ref: ref, ...rest }, children
|
|
52
|
+
return (React.createElement(Box, { as: 'span', className: cx('iui-file-card-description', className), ref: ref, ...rest }, children ?? description));
|
|
53
53
|
});
|
|
54
54
|
FileUploadCardDescription.displayName = 'FileUploadCard.Description';
|
|
55
55
|
// ----------------------------------------------------------------------------
|
|
@@ -70,8 +70,7 @@ const FileUploadCardInput = React.forwardRef((props, ref) => {
|
|
|
70
70
|
const { children, onChange, id, ...rest } = props;
|
|
71
71
|
const { files, onFilesChange, setInternalFiles, inputId, setInputId } = useSafeContext(FileUploadCardContext);
|
|
72
72
|
const setNativeFilesRef = React.useCallback((node) => {
|
|
73
|
-
|
|
74
|
-
if (!node || !((_a = getWindow()) === null || _a === void 0 ? void 0 : _a.DataTransfer)) {
|
|
73
|
+
if (!node || !getWindow()?.DataTransfer) {
|
|
75
74
|
return;
|
|
76
75
|
}
|
|
77
76
|
const dataTransfer = new DataTransfer();
|
|
@@ -88,19 +87,18 @@ const FileUploadCardInput = React.forwardRef((props, ref) => {
|
|
|
88
87
|
return (React.createElement(React.Fragment, null,
|
|
89
88
|
React.createElement(VisuallyHidden, { as: 'input', type: 'file', unhideOnFocus: false, onChange: mergeEventHandlers(onChange, (e) => {
|
|
90
89
|
const _files = Array.from(e.currentTarget.files || []);
|
|
91
|
-
onFilesChange
|
|
90
|
+
onFilesChange?.(_files);
|
|
92
91
|
setInternalFiles(_files);
|
|
93
|
-
}), ref: refs, id: id
|
|
92
|
+
}), ref: refs, id: id ?? inputId, ...rest }),
|
|
94
93
|
children));
|
|
95
94
|
});
|
|
96
95
|
FileUploadCardInput.displayName = 'FileUploadCard.Input';
|
|
97
96
|
const FileUploadCardComponent = React.forwardRef((props, ref) => {
|
|
98
|
-
var _a;
|
|
99
97
|
const { className, children, files: filesProp, onFilesChange, emptyCard = React.createElement(FileEmptyCard, null), input, ...rest } = props;
|
|
100
98
|
const [internalFiles, setInternalFiles] = React.useState();
|
|
101
99
|
const uid = useId();
|
|
102
100
|
const [inputId, setInputId] = React.useState(uid);
|
|
103
|
-
const files =
|
|
101
|
+
const files = filesProp ?? internalFiles ?? [];
|
|
104
102
|
return (React.createElement(FileUploadCardContext.Provider, { value: {
|
|
105
103
|
files,
|
|
106
104
|
onFilesChange,
|
|
@@ -108,13 +106,14 @@ const FileUploadCardComponent = React.forwardRef((props, ref) => {
|
|
|
108
106
|
inputId,
|
|
109
107
|
setInputId,
|
|
110
108
|
} },
|
|
111
|
-
|
|
109
|
+
files?.length ? (React.createElement(Box, { className: cx('iui-file-card', className), ref: ref, ...rest }, children ?? (React.createElement(React.Fragment, null,
|
|
112
110
|
React.createElement(FileUploadCard.Icon, null),
|
|
113
111
|
React.createElement(FileUploadCard.Info, null,
|
|
114
112
|
React.createElement(FileUploadCard.Title, null),
|
|
115
113
|
React.createElement(FileUploadCard.Description, null)),
|
|
116
114
|
React.createElement(FileUploadCard.Action, null,
|
|
117
|
-
React.createElement(FileUploadCard.InputLabel, null, "Replace")))))) : (emptyCard),
|
|
115
|
+
React.createElement(FileUploadCard.InputLabel, null, "Replace")))))) : (emptyCard),
|
|
116
|
+
input ?? React.createElement(FileUploadCard.Input, null)));
|
|
118
117
|
});
|
|
119
118
|
/**
|
|
120
119
|
* Default card to be used with the `FileUpload` wrapper component for single-file uploading.
|
|
@@ -32,6 +32,7 @@ declare type FileUploadTemplateProps = {
|
|
|
32
32
|
children?: React.ReactNode;
|
|
33
33
|
};
|
|
34
34
|
/**
|
|
35
|
+
* @deprecated Use `FileUploadCard` instead.
|
|
35
36
|
* Default template to be used with the `FileUpload` wrapper component.
|
|
36
37
|
* Contains a hidden input with styled labels (customizable).
|
|
37
38
|
* @example
|
|
@@ -7,6 +7,7 @@ import cx from 'classnames';
|
|
|
7
7
|
import { SvgUpload, Box } from '../utils/index.js';
|
|
8
8
|
import { Anchor } from '../Typography/Anchor/Anchor.js';
|
|
9
9
|
/**
|
|
10
|
+
* @deprecated Use `FileUploadCard` instead.
|
|
10
11
|
* Default template to be used with the `FileUpload` wrapper component.
|
|
11
12
|
* Contains a hidden input with styled labels (customizable).
|
|
12
13
|
* @example
|
|
@@ -40,10 +40,7 @@ export const InformationPanel = React.forwardRef((props, ref) => {
|
|
|
40
40
|
e.preventDefault();
|
|
41
41
|
e.stopPropagation();
|
|
42
42
|
infoPanelRef.current.ownerDocument.addEventListener('pointermove', onResize);
|
|
43
|
-
infoPanelRef.current.ownerDocument.addEventListener('pointerup', () => {
|
|
44
|
-
var _a;
|
|
45
|
-
return (_a = infoPanelRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument.removeEventListener('pointermove', onResize);
|
|
46
|
-
}, { once: true });
|
|
43
|
+
infoPanelRef.current.ownerDocument.addEventListener('pointerup', () => infoPanelRef.current?.ownerDocument.removeEventListener('pointermove', onResize), { once: true });
|
|
47
44
|
};
|
|
48
45
|
const onResize = React.useCallback((e) => {
|
|
49
46
|
e.preventDefault();
|
|
@@ -16,7 +16,7 @@ import { StatusIconMap, InputContainer, useId } from '../utils/index.js';
|
|
|
16
16
|
export const LabeledInput = React.forwardRef((props, ref) => {
|
|
17
17
|
const uid = useId();
|
|
18
18
|
const { className, disabled = false, label, message, status, svgIcon, style, inputClassName, inputStyle, displayStyle = 'default', iconDisplayStyle = displayStyle === 'default' ? 'block' : 'inline', required = false, id = uid, ...rest } = props;
|
|
19
|
-
const icon = svgIcon
|
|
19
|
+
const icon = svgIcon ?? (status && StatusIconMap[status]());
|
|
20
20
|
return (React.createElement(InputContainer, { label: label, disabled: disabled, required: required, status: status, message: message, icon: icon, isLabelInline: displayStyle === 'inline', isIconInline: iconDisplayStyle === 'inline', className: className, style: style, inputId: id },
|
|
21
21
|
React.createElement(Input, { disabled: disabled, className: inputClassName, style: inputStyle, required: required, ref: ref, id: id, ...rest })));
|
|
22
22
|
});
|
|
@@ -29,7 +29,7 @@ import { Textarea } from '../Textarea/index.js';
|
|
|
29
29
|
export const LabeledTextarea = React.forwardRef((props, ref) => {
|
|
30
30
|
const uid = useId();
|
|
31
31
|
const { className, style, disabled = false, label, message, status, textareaClassName, textareaStyle, displayStyle = 'default', iconDisplayStyle = displayStyle === 'default' ? 'block' : 'inline', svgIcon, required = false, id = uid, ...textareaProps } = props;
|
|
32
|
-
const icon = svgIcon
|
|
32
|
+
const icon = svgIcon ?? (status && StatusIconMap[status]());
|
|
33
33
|
return (React.createElement(InputContainer, { label: label, disabled: disabled, required: required, status: status, message: message, icon: icon, isLabelInline: displayStyle === 'inline', isIconInline: iconDisplayStyle === 'inline', className: className, style: style, inputId: id },
|
|
34
34
|
React.createElement(Textarea, { disabled: disabled, className: textareaClassName, style: textareaStyle, required: required, id: id, ...textareaProps, ref: ref })));
|
|
35
35
|
});
|
package/esm/core/Menu/Menu.js
CHANGED
|
@@ -19,10 +19,9 @@ export const Menu = React.forwardRef((props, ref) => {
|
|
|
19
19
|
return focusableItems.filter((i) => !focusableItems.some((p) => p.contains(i.parentElement)));
|
|
20
20
|
}, []);
|
|
21
21
|
React.useEffect(() => {
|
|
22
|
-
var _a;
|
|
23
22
|
const items = getFocusableNodes();
|
|
24
23
|
if (focusedIndex != null) {
|
|
25
|
-
|
|
24
|
+
items?.[focusedIndex]?.focus();
|
|
26
25
|
return;
|
|
27
26
|
}
|
|
28
27
|
const selectedIndex = items.findIndex((el) => el.getAttribute('aria-selected') === 'true');
|
|
@@ -35,10 +34,10 @@ export const Menu = React.forwardRef((props, ref) => {
|
|
|
35
34
|
return;
|
|
36
35
|
}
|
|
37
36
|
const items = getFocusableNodes();
|
|
38
|
-
if (!
|
|
37
|
+
if (!items?.length) {
|
|
39
38
|
return;
|
|
40
39
|
}
|
|
41
|
-
const currentIndex = focusedIndex
|
|
40
|
+
const currentIndex = focusedIndex ?? 0;
|
|
42
41
|
switch (event.key) {
|
|
43
42
|
case 'ArrowDown': {
|
|
44
43
|
setFocusedIndex(Math.min(currentIndex + 1, items.length - 1));
|