rsuite 5.0.0-beta.8 → 5.0.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 +4 -4
- package/Sidenav/styles/index.less +99 -37
- package/cjs/@types/common.d.ts +2 -0
- package/cjs/DateRangePicker/Calendar.d.ts +2 -1
- package/cjs/DateRangePicker/Calendar.js +4 -3
- package/cjs/DateRangePicker/DateRangePicker.d.ts +1 -1
- package/cjs/DateRangePicker/DateRangePicker.js +58 -43
- package/cjs/DateRangePicker/utils.d.ts +1 -1
- package/cjs/DateRangePicker/utils.js +9 -5
- package/cjs/Dropdown/Dropdown.js +31 -18
- package/cjs/Dropdown/DropdownContext.d.ts +4 -1
- package/cjs/Dropdown/DropdownItem.js +31 -4
- package/cjs/Dropdown/DropdownState.d.ts +37 -0
- package/cjs/Dropdown/DropdownState.js +66 -0
- package/cjs/SelectPicker/SelectPicker.d.ts +1 -3
- package/cjs/Sidenav/SidenavDropdown.js +6 -1
- package/cjs/Sidenav/SidenavItem.js +4 -12
- package/cjs/utils/dateUtils.d.ts +1 -0
- package/cjs/utils/dateUtils.js +5 -1
- package/cjs/utils/useInternalId.d.ts +4 -0
- package/cjs/utils/useInternalId.js +24 -0
- package/cjs/utils/useUniqueId.d.ts +1 -1
- package/cjs/utils/useUniqueId.js +1 -1
- package/dist/rsuite-rtl.css +142 -72
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +142 -72
- package/dist/rsuite.js +54 -10
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.css.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/@types/common.d.ts +2 -0
- package/esm/DateRangePicker/Calendar.d.ts +2 -1
- package/esm/DateRangePicker/Calendar.js +4 -3
- package/esm/DateRangePicker/DateRangePicker.d.ts +1 -1
- package/esm/DateRangePicker/DateRangePicker.js +27 -12
- package/esm/DateRangePicker/utils.d.ts +1 -1
- package/esm/DateRangePicker/utils.js +7 -3
- package/esm/Dropdown/Dropdown.js +30 -19
- package/esm/Dropdown/DropdownContext.d.ts +4 -1
- package/esm/Dropdown/DropdownItem.js +30 -6
- package/esm/Dropdown/DropdownState.d.ts +37 -0
- package/esm/Dropdown/DropdownState.js +55 -0
- package/esm/SelectPicker/SelectPicker.d.ts +1 -3
- package/esm/Sidenav/SidenavDropdown.js +5 -1
- package/esm/Sidenav/SidenavItem.js +4 -10
- package/esm/utils/dateUtils.d.ts +1 -0
- package/esm/utils/dateUtils.js +1 -0
- package/esm/utils/useInternalId.d.ts +4 -0
- package/esm/utils/useInternalId.js +16 -0
- package/esm/utils/useUniqueId.d.ts +1 -1
- package/esm/utils/useUniqueId.js +1 -1
- package/package.json +2 -2
- package/styles/color-modes/dark.less +16 -0
- package/styles/color-modes/high-contrast.less +17 -0
- package/styles/color-modes/light.less +16 -0
package/esm/@types/common.d.ts
CHANGED
|
@@ -72,6 +72,8 @@ export interface PickerBaseProps<LocaleType = any> extends WithAsProps, Animatio
|
|
|
72
72
|
defaultOpen?: boolean;
|
|
73
73
|
/** A picker that can clear values */
|
|
74
74
|
cleanable?: boolean;
|
|
75
|
+
/** A picker can have different sizes */
|
|
76
|
+
size?: TypeAttributes.Size;
|
|
75
77
|
/** Called when Modal is displayed */
|
|
76
78
|
onOpen?: () => void;
|
|
77
79
|
/** Called when Modal is closed */
|
|
@@ -13,7 +13,8 @@ export interface CalendarProps extends WithAsProps, Omit<CalendarCoreProps, Omit
|
|
|
13
13
|
isoWeek?: boolean;
|
|
14
14
|
limitEndYear?: number;
|
|
15
15
|
locale?: DatePickerLocale;
|
|
16
|
-
onChangeCalendarDate?: (index: number,
|
|
16
|
+
onChangeCalendarDate?: (index: number, date: Date) => void;
|
|
17
|
+
onChangeCalendarTime?: (index: number, date: Date) => void;
|
|
17
18
|
onMouseMove?: (date: Date) => void;
|
|
18
19
|
onSelect?: (date: Date, event?: React.SyntheticEvent<any>) => void;
|
|
19
20
|
showOneCalendar?: boolean;
|
|
@@ -19,9 +19,10 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
19
19
|
index = props.index,
|
|
20
20
|
limitEndYear = props.limitEndYear,
|
|
21
21
|
onChangeCalendarDate = props.onChangeCalendarDate,
|
|
22
|
+
onChangeCalendarTime = props.onChangeCalendarTime,
|
|
22
23
|
showOneCalendar = props.showOneCalendar,
|
|
23
24
|
value = props.value,
|
|
24
|
-
rest = _objectWithoutPropertiesLoose(props, ["as", "calendarDate", "disabledDate", "index", "limitEndYear", "onChangeCalendarDate", "showOneCalendar", "value"]);
|
|
25
|
+
rest = _objectWithoutPropertiesLoose(props, ["as", "calendarDate", "disabledDate", "index", "limitEndYear", "onChangeCalendarDate", "onChangeCalendarTime", "showOneCalendar", "value"]);
|
|
25
26
|
|
|
26
27
|
var _useState = useState(),
|
|
27
28
|
calendarState = _useState[0],
|
|
@@ -38,8 +39,8 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
38
39
|
setCalendarState(undefined);
|
|
39
40
|
}, [index, onChangeCalendarDate]);
|
|
40
41
|
var handleChangePageTime = useCallback(function (nextPageDate) {
|
|
41
|
-
|
|
42
|
-
}, [index,
|
|
42
|
+
onChangeCalendarTime(index, nextPageDate);
|
|
43
|
+
}, [index, onChangeCalendarTime]);
|
|
43
44
|
var toggleMonthDropdown = useCallback(function () {
|
|
44
45
|
setCalendarState(calendarState === CalendarState.DROP_MONTH ? undefined : CalendarState.DROP_MONTH);
|
|
45
46
|
}, [calendarState]);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { PickerComponent } from '../Picker';
|
|
3
2
|
import { FormControlBaseProps, PickerBaseProps } from '../@types/common';
|
|
3
|
+
import { PickerComponent } from '../Picker';
|
|
4
4
|
import { DisabledDateFunction, RangeType, ValueType } from './types';
|
|
5
5
|
export interface DateRangePickerProps extends PickerBaseProps, FormControlBaseProps<ValueType> {
|
|
6
6
|
/** Configure shortcut options */
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
2
2
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import IconCalendar from '@rsuite/icons/legacy/Calendar';
|
|
4
|
+
import isUndefined from 'lodash/isUndefined';
|
|
5
5
|
import omit from 'lodash/omit';
|
|
6
|
+
import partial from 'lodash/partial';
|
|
6
7
|
import pick from 'lodash/pick';
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
import * as disabledDateUtils from './disabledDateUtils';
|
|
8
|
+
import PropTypes from 'prop-types';
|
|
9
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
10
10
|
import { FormattedDate } from '../CustomProvider';
|
|
11
11
|
import Toolbar from '../DatePicker/Toolbar';
|
|
12
|
-
import
|
|
13
|
-
import { getCalendarDate, getMonthHoverRange, getWeekHoverRange, setTimingMargin } from './utils';
|
|
12
|
+
import { omitTriggerPropKeys, pickerDefaultProps, PickerOverlay, pickerPropTypes, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, usePickerClassName, usePublicMethods, useToggleKeyDownEvent } from '../Picker';
|
|
14
13
|
import { createChainedFunction, DATERANGE_DISABLED_TARGET, DateUtils, mergeRefs, useClassNames, useControlled, useCustom } from '../utils';
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
17
|
-
import
|
|
14
|
+
import { addMonths, compareAsc, isSameMonth } from '../utils/dateUtils';
|
|
15
|
+
import Calendar from './Calendar';
|
|
16
|
+
import * as disabledDateUtils from './disabledDateUtils';
|
|
17
|
+
import { getCalendarDate, getMonthHoverRange, getWeekHoverRange, isSameRange, setTimingMargin } from './utils';
|
|
18
18
|
|
|
19
19
|
var defaultProps = _extends({}, pickerDefaultProps, {
|
|
20
20
|
as: 'div',
|
|
@@ -234,7 +234,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
234
234
|
var nextValue = !isUndefined(nextSelectValue) ? nextSelectValue : selectValue;
|
|
235
235
|
setSelectValue(nextValue || []);
|
|
236
236
|
|
|
237
|
-
if (!
|
|
237
|
+
if (!isSameRange(nextValue, value, formatStr)) {
|
|
238
238
|
setValue(nextValue);
|
|
239
239
|
onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
|
|
240
240
|
} // `closeOverlay` default value is `true`
|
|
@@ -243,7 +243,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
243
243
|
if (closeOverlay !== false) {
|
|
244
244
|
handleCloseDropdown();
|
|
245
245
|
}
|
|
246
|
-
}, [handleCloseDropdown, onChange, selectValue,
|
|
246
|
+
}, [formatStr, handleCloseDropdown, onChange, selectValue, setValue, value]);
|
|
247
247
|
/**
|
|
248
248
|
* Select the date range. If oneTap is not set, you need to click twice to select the start time and end time.
|
|
249
249
|
* The MouseMove event is called between the first click and the second click to update the selection state.
|
|
@@ -332,6 +332,20 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
332
332
|
nextCalendarDate[index] = date;
|
|
333
333
|
updateCalendarDate(nextCalendarDate);
|
|
334
334
|
}, [calendarDate, updateCalendarDate]);
|
|
335
|
+
var handleChangeCalendarTime = useCallback(function (index, date) {
|
|
336
|
+
setSelectValue(function (prev) {
|
|
337
|
+
var next = [].concat(prev);
|
|
338
|
+
var clonedDate = new Date(date.valueOf()); // if next[index] is not empty, only update the time after aligning the year, month and day
|
|
339
|
+
|
|
340
|
+
if (next[index]) {
|
|
341
|
+
clonedDate.setFullYear(next[index].getFullYear(), next[index].getMonth(), next[index].getDate());
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
next[index] = clonedDate;
|
|
345
|
+
return next;
|
|
346
|
+
});
|
|
347
|
+
handleChangeCalendarDate(index, date);
|
|
348
|
+
}, [handleChangeCalendarDate]);
|
|
335
349
|
/**
|
|
336
350
|
* Toolbar operation callback function
|
|
337
351
|
*/
|
|
@@ -496,6 +510,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
496
510
|
showWeekNumbers: showWeekNumbers,
|
|
497
511
|
value: selectValue,
|
|
498
512
|
onChangeCalendarDate: handleChangeCalendarDate,
|
|
513
|
+
onChangeCalendarTime: handleChangeCalendarTime,
|
|
499
514
|
onMouseMove: handleMouseMove,
|
|
500
515
|
onSelect: handleSelectValueChange
|
|
501
516
|
};
|
|
@@ -4,6 +4,6 @@ export declare function getCalendarDate({ value }: {
|
|
|
4
4
|
value?: ValueType;
|
|
5
5
|
}): ValueType;
|
|
6
6
|
export declare const getDefaultRanges: () => RangeType[];
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const isSameRange: (source: ValueType, dest: ValueType, format: string) => boolean;
|
|
8
8
|
export declare const getMonthHoverRange: (date: Date) => ValueType;
|
|
9
9
|
export declare const getWeekHoverRange: (isoWeek: boolean, date: Date) => ValueType;
|
|
@@ -36,10 +36,14 @@ export var getDefaultRanges = function getDefaultRanges() {
|
|
|
36
36
|
value: [setTimingMargin(DateUtils.subDays(todayDate, 6)), setTimingMargin(todayDate, 'right')]
|
|
37
37
|
}];
|
|
38
38
|
};
|
|
39
|
-
export var
|
|
40
|
-
var
|
|
39
|
+
export var isSameRange = function isSameRange(source, dest, format) {
|
|
40
|
+
var result = DateUtils.isSameDay(source === null || source === void 0 ? void 0 : source[0], dest === null || dest === void 0 ? void 0 : dest[0]) && DateUtils.isSameDay(source === null || source === void 0 ? void 0 : source[1], dest === null || dest === void 0 ? void 0 : dest[1]);
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
if (DateUtils.shouldTime(format)) {
|
|
43
|
+
result && (result = DateUtils.isSameSecond(source === null || source === void 0 ? void 0 : source[0], dest === null || dest === void 0 ? void 0 : dest[0]) && DateUtils.isSameSecond(source === null || source === void 0 ? void 0 : source[1], dest === null || dest === void 0 ? void 0 : dest[1]));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return result;
|
|
43
47
|
};
|
|
44
48
|
export var getMonthHoverRange = function getMonthHoverRange(date) {
|
|
45
49
|
return [DateUtils.startOfMonth(date), DateUtils.endOfMonth(date)];
|
package/esm/Dropdown/Dropdown.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
import React, { useCallback, useContext, useMemo } from 'react';
|
|
3
|
+
import React, { useCallback, useContext, useMemo, useReducer } from 'react';
|
|
4
4
|
import PropTypes from 'prop-types';
|
|
5
5
|
import omit from 'lodash/omit';
|
|
6
|
+
import pick from 'lodash/pick';
|
|
6
7
|
import DropdownMenu from './DropdownMenu';
|
|
7
8
|
import { mergeRefs, PLACEMENT_8, placementPolyfill, useClassNames } from '../utils';
|
|
8
9
|
import { SidenavContext } from '../Sidenav/Sidenav';
|
|
@@ -18,6 +19,7 @@ import { NavbarContext } from '../Navbar/Navbar';
|
|
|
18
19
|
import Disclosure from '../Disclosure/Disclosure';
|
|
19
20
|
import SidenavDropdown from '../Sidenav/SidenavDropdown';
|
|
20
21
|
import NavContext from '../Nav/NavContext';
|
|
22
|
+
import { initialState, reducer } from './DropdownState';
|
|
21
23
|
var defaultProps = {
|
|
22
24
|
as: 'div',
|
|
23
25
|
classPrefix: 'dropdown',
|
|
@@ -96,14 +98,29 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
96
98
|
}, [trigger]);
|
|
97
99
|
var parentMenu = useContext(MenuContext);
|
|
98
100
|
var sidenav = useContext(SidenavContext);
|
|
99
|
-
var navbar = useContext(NavbarContext);
|
|
101
|
+
var navbar = useContext(NavbarContext);
|
|
102
|
+
|
|
103
|
+
var _useReducer = useReducer(reducer, initialState),
|
|
104
|
+
items = _useReducer[0].items,
|
|
105
|
+
dispatch = _useReducer[1];
|
|
106
|
+
|
|
107
|
+
var hasSelectedItem = useMemo(function () {
|
|
108
|
+
return items.some(function (item) {
|
|
109
|
+
return item.props.selected;
|
|
110
|
+
});
|
|
111
|
+
}, [items]);
|
|
112
|
+
var dropdownContextValue = useMemo(function () {
|
|
113
|
+
return {
|
|
114
|
+
activeKey: activeKey,
|
|
115
|
+
onSelect: emitSelect,
|
|
116
|
+
hasSelectedItem: hasSelectedItem,
|
|
117
|
+
dispatch: dispatch
|
|
118
|
+
};
|
|
119
|
+
}, [activeKey, emitSelect, hasSelectedItem, dispatch]); // Render a disclosure when inside expanded <Sidenav>
|
|
100
120
|
|
|
101
121
|
if (sidenav !== null && sidenav !== void 0 && sidenav.expanded) {
|
|
102
122
|
return /*#__PURE__*/React.createElement(DropdownContext.Provider, {
|
|
103
|
-
value:
|
|
104
|
-
activeKey: activeKey,
|
|
105
|
-
onSelect: emitSelect
|
|
106
|
-
}
|
|
123
|
+
value: dropdownContextValue
|
|
107
124
|
}, /*#__PURE__*/React.createElement(SidenavDropdown, _extends({
|
|
108
125
|
ref: ref
|
|
109
126
|
}, rest)));
|
|
@@ -112,10 +129,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
112
129
|
|
|
113
130
|
if (navbar) {
|
|
114
131
|
return /*#__PURE__*/React.createElement(DropdownContext.Provider, {
|
|
115
|
-
value:
|
|
116
|
-
activeKey: activeKey,
|
|
117
|
-
onSelect: emitSelect
|
|
118
|
-
}
|
|
132
|
+
value: dropdownContextValue
|
|
119
133
|
}, /*#__PURE__*/React.createElement(Disclosure, {
|
|
120
134
|
hideOnClickOutside: true
|
|
121
135
|
}, function (_ref, containerRef) {
|
|
@@ -155,7 +169,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
155
169
|
className: toggleClassName,
|
|
156
170
|
placement: placement,
|
|
157
171
|
disabled: disabled
|
|
158
|
-
}, omit(menuButtonProps, ['open']), toggleProps), title);
|
|
172
|
+
}, omit(menuButtonProps, ['open']), omit(toggleProps, ['data-testid'])), title);
|
|
159
173
|
};
|
|
160
174
|
|
|
161
175
|
if (parentMenu) {
|
|
@@ -172,16 +186,13 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
172
186
|
className: mergeNavItemClassNames(toggleClassName, withNavItemClassPrefix({
|
|
173
187
|
focus: active
|
|
174
188
|
}))
|
|
175
|
-
}, menuButtonProps, omit(menuitemProps, ['onClick']), toggleProps), title);
|
|
189
|
+
}, menuButtonProps, omit(menuitemProps, ['onClick']), omit(toggleProps, 'data-testid')), title);
|
|
176
190
|
});
|
|
177
191
|
};
|
|
178
192
|
}
|
|
179
193
|
|
|
180
194
|
return /*#__PURE__*/React.createElement(DropdownContext.Provider, {
|
|
181
|
-
value:
|
|
182
|
-
activeKey: activeKey,
|
|
183
|
-
onSelect: emitSelect
|
|
184
|
-
}
|
|
195
|
+
value: dropdownContextValue
|
|
185
196
|
}, /*#__PURE__*/React.createElement(Menu, {
|
|
186
197
|
menuButtonText: title,
|
|
187
198
|
renderMenuButton: renderMenuButton,
|
|
@@ -190,7 +201,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
190
201
|
var open = _ref4.open,
|
|
191
202
|
popupProps = _objectWithoutPropertiesLoose(_ref4, ["open"]);
|
|
192
203
|
|
|
193
|
-
var menuClassName = mergeMenuClassName(className, withMenuClassPrefix()); // When inside a collapsed <Sidenav>, render a header in menu
|
|
204
|
+
var menuClassName = mergeMenuClassName(className, withMenuClassPrefix({})); // When inside a collapsed <Sidenav>, render a header in menu
|
|
194
205
|
|
|
195
206
|
var showHeader = !!sidenav;
|
|
196
207
|
return /*#__PURE__*/React.createElement("ul", _extends({
|
|
@@ -218,11 +229,11 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
218
229
|
var open = _ref5.open,
|
|
219
230
|
menuContainer = _objectWithoutPropertiesLoose(_ref5, ["open"]);
|
|
220
231
|
|
|
221
|
-
var classes = merge(className, withClassPrefix((_withClassPrefix2 = {}, _withClassPrefix2["placement-" + kebabCase(placementPolyfill(placement))] = !!placement, _withClassPrefix2.disabled = disabled, _withClassPrefix2.open = open, _withClassPrefix2.submenu = !!parentMenu, _withClassPrefix2)));
|
|
232
|
+
var classes = merge(className, withClassPrefix((_withClassPrefix2 = {}, _withClassPrefix2["placement-" + kebabCase(placementPolyfill(placement))] = !!placement, _withClassPrefix2.disabled = disabled, _withClassPrefix2.open = open, _withClassPrefix2.submenu = !!parentMenu, _withClassPrefix2['selected-within'] = hasSelectedItem, _withClassPrefix2)));
|
|
222
233
|
return /*#__PURE__*/React.createElement(Component, _extends({
|
|
223
234
|
ref: mergeRefs(ref, menuContainerRef),
|
|
224
235
|
className: classes
|
|
225
|
-
}, menuContainer, {
|
|
236
|
+
}, menuContainer, pick(toggleProps, ['data-testid']), {
|
|
226
237
|
style: style
|
|
227
238
|
}));
|
|
228
239
|
}));
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { Dispatch } from 'react';
|
|
2
|
+
import { DropdownAction } from './DropdownState';
|
|
2
3
|
export interface DropdownContextProps {
|
|
3
4
|
activeKey?: string;
|
|
4
5
|
onSelect: (eventKey: string, event: React.SyntheticEvent) => void;
|
|
6
|
+
hasSelectedItem?: boolean;
|
|
7
|
+
dispatch?: Dispatch<DropdownAction>;
|
|
5
8
|
}
|
|
6
9
|
declare const DropdownContext: React.Context<DropdownContextProps>;
|
|
7
10
|
export default DropdownContext;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
import React, { useCallback, useContext } from 'react';
|
|
3
|
+
import React, { useCallback, useContext, useEffect } from 'react';
|
|
4
4
|
import PropTypes from 'prop-types';
|
|
5
5
|
import { SidenavContext } from '../Sidenav/Sidenav';
|
|
6
6
|
import deprecatePropType from '../utils/deprecatePropType';
|
|
@@ -13,6 +13,8 @@ import SidenavDropdownItem from '../Sidenav/SidenavDropdownItem';
|
|
|
13
13
|
import DisclosureContext, { DisclosureActionTypes } from '../Disclosure/DisclosureContext';
|
|
14
14
|
import SafeAnchor from '../SafeAnchor';
|
|
15
15
|
import NavContext from '../Nav/NavContext';
|
|
16
|
+
import useInternalId from '../utils/useInternalId';
|
|
17
|
+
import { DropdownActionType } from './DropdownState';
|
|
16
18
|
var defaultProps = {
|
|
17
19
|
as: 'li',
|
|
18
20
|
classPrefix: 'dropdown-item'
|
|
@@ -32,6 +34,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
32
34
|
icon = props.icon,
|
|
33
35
|
rest = _objectWithoutPropertiesLoose(props, ["classPrefix", "className", "active", "eventKey", "onSelect", "icon"]);
|
|
34
36
|
|
|
37
|
+
var internalId = useInternalId('DropdownItem');
|
|
35
38
|
var nav = useContext(NavContext);
|
|
36
39
|
var dropdown = useContext(DropdownContext);
|
|
37
40
|
|
|
@@ -59,6 +62,29 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
59
62
|
});
|
|
60
63
|
handleSelectItem === null || handleSelectItem === void 0 ? void 0 : handleSelectItem(event);
|
|
61
64
|
}, [dispatchDisclosure, handleSelectItem]);
|
|
65
|
+
var selected = activeProp || !isNil(eventKey) && (shallowEqual(dropdown === null || dropdown === void 0 ? void 0 : dropdown.activeKey, eventKey) || shallowEqual(nav === null || nav === void 0 ? void 0 : nav.activeKey, eventKey));
|
|
66
|
+
var dispatch = dropdown === null || dropdown === void 0 ? void 0 : dropdown.dispatch;
|
|
67
|
+
useEffect(function () {
|
|
68
|
+
if (dispatch) {
|
|
69
|
+
dispatch({
|
|
70
|
+
type: DropdownActionType.RegisterItem,
|
|
71
|
+
payload: {
|
|
72
|
+
id: internalId,
|
|
73
|
+
props: {
|
|
74
|
+
selected: selected
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return function () {
|
|
79
|
+
dispatch({
|
|
80
|
+
type: DropdownActionType.UnregisterItem,
|
|
81
|
+
payload: {
|
|
82
|
+
id: internalId
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}, [internalId, selected, dispatch]);
|
|
62
88
|
|
|
63
89
|
if (sidenav !== null && sidenav !== void 0 && sidenav.expanded) {
|
|
64
90
|
return /*#__PURE__*/React.createElement(SidenavDropdownItem, _extends({
|
|
@@ -66,8 +92,6 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
66
92
|
}, props));
|
|
67
93
|
}
|
|
68
94
|
|
|
69
|
-
var menuitemSelected = activeProp || !isNil(eventKey) && (shallowEqual(dropdown === null || dropdown === void 0 ? void 0 : dropdown.activeKey, eventKey) || shallowEqual(nav === null || nav === void 0 ? void 0 : nav.activeKey, eventKey));
|
|
70
|
-
|
|
71
95
|
var Component = rest.as,
|
|
72
96
|
divider = rest.divider,
|
|
73
97
|
panel = rest.panel,
|
|
@@ -97,7 +121,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
97
121
|
disabled: disabled,
|
|
98
122
|
divider: divider,
|
|
99
123
|
panel: panel,
|
|
100
|
-
active:
|
|
124
|
+
active: selected
|
|
101
125
|
}));
|
|
102
126
|
var dataAttributes = {
|
|
103
127
|
'data-event-key': eventKey
|
|
@@ -110,7 +134,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
110
134
|
return /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(SafeAnchor, _extends({
|
|
111
135
|
ref: ref,
|
|
112
136
|
className: classes,
|
|
113
|
-
"aria-current":
|
|
137
|
+
"aria-current": selected || undefined
|
|
114
138
|
}, dataAttributes, restProps, {
|
|
115
139
|
onClick: createChainedFunction(handleClickNavbarDropdownItem, restProps.onClick)
|
|
116
140
|
}), icon && /*#__PURE__*/React.cloneElement(icon, {
|
|
@@ -119,7 +143,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
119
143
|
}
|
|
120
144
|
|
|
121
145
|
return /*#__PURE__*/React.createElement(MenuItem, {
|
|
122
|
-
selected:
|
|
146
|
+
selected: selected,
|
|
123
147
|
disabled: disabled,
|
|
124
148
|
onActivate: handleSelectItem
|
|
125
149
|
}, function (_ref2, menuitemRef) {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
interface DropdownItemState {
|
|
2
|
+
/**
|
|
3
|
+
* Internal ID
|
|
4
|
+
*/
|
|
5
|
+
id: string;
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
props: {
|
|
10
|
+
selected: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
interface DropdownState {
|
|
14
|
+
items: DropdownItemState[];
|
|
15
|
+
}
|
|
16
|
+
export declare const initialState: DropdownState;
|
|
17
|
+
export declare enum DropdownActionType {
|
|
18
|
+
RegisterItem = 0,
|
|
19
|
+
UnregisterItem = 1,
|
|
20
|
+
UpdateItem = 2
|
|
21
|
+
}
|
|
22
|
+
export declare type DropdownAction = {
|
|
23
|
+
type: DropdownActionType.RegisterItem;
|
|
24
|
+
payload: {
|
|
25
|
+
id: string;
|
|
26
|
+
props: {
|
|
27
|
+
selected: boolean;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
} | {
|
|
31
|
+
type: DropdownActionType.UnregisterItem;
|
|
32
|
+
payload: {
|
|
33
|
+
id: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export declare function reducer(state: DropdownState, action: DropdownAction): DropdownState;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
export var initialState = {
|
|
3
|
+
items: []
|
|
4
|
+
};
|
|
5
|
+
export var DropdownActionType;
|
|
6
|
+
|
|
7
|
+
(function (DropdownActionType) {
|
|
8
|
+
DropdownActionType[DropdownActionType["RegisterItem"] = 0] = "RegisterItem";
|
|
9
|
+
DropdownActionType[DropdownActionType["UnregisterItem"] = 1] = "UnregisterItem";
|
|
10
|
+
DropdownActionType[DropdownActionType["UpdateItem"] = 2] = "UpdateItem";
|
|
11
|
+
})(DropdownActionType || (DropdownActionType = {}));
|
|
12
|
+
|
|
13
|
+
export function reducer(state, action) {
|
|
14
|
+
if (state === void 0) {
|
|
15
|
+
state = initialState;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
switch (action.type) {
|
|
19
|
+
case DropdownActionType.RegisterItem:
|
|
20
|
+
if (state.items.find(function (item) {
|
|
21
|
+
return item.id === action.payload.id;
|
|
22
|
+
})) {
|
|
23
|
+
return _extends({}, state, {
|
|
24
|
+
items: state.items.map(function (item) {
|
|
25
|
+
if (item.id === action.payload.id) {
|
|
26
|
+
return _extends({}, item, {
|
|
27
|
+
props: _extends({}, item.props, {
|
|
28
|
+
selected: action.payload.props.selected
|
|
29
|
+
})
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return item;
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return _extends({}, state, {
|
|
39
|
+
items: [].concat(state.items, [{
|
|
40
|
+
id: action.payload.id,
|
|
41
|
+
props: action.payload.props
|
|
42
|
+
}])
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
case DropdownActionType.UnregisterItem:
|
|
46
|
+
return _extends({}, state, {
|
|
47
|
+
items: state.items.filter(function (item) {
|
|
48
|
+
return item.id !== action.payload.id;
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
default:
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { PickerLocale } from '../locales';
|
|
3
3
|
import { PickerComponent } from '../Picker';
|
|
4
|
-
import {
|
|
4
|
+
import { FormControlPickerProps, ItemDataType } from '../@types/common';
|
|
5
5
|
import { ListProps } from 'react-virtualized/dist/commonjs/List';
|
|
6
6
|
export declare type ValueType = number | string;
|
|
7
7
|
export interface SelectProps<T = ValueType> {
|
|
@@ -16,8 +16,6 @@ export interface SelectProps<T = ValueType> {
|
|
|
16
16
|
* https://github.com/bvaughn/react-virtualized/blob/master/docs/List.md#prop-types
|
|
17
17
|
*/
|
|
18
18
|
listProps?: ListProps;
|
|
19
|
-
/** A picker can have different sizes */
|
|
20
|
-
size?: TypeAttributes.Size;
|
|
21
19
|
/** Custom search rules. */
|
|
22
20
|
searchBy?: (keyword: string, label: React.ReactNode, item: ItemDataType) => boolean;
|
|
23
21
|
/** Sort options */
|
|
@@ -11,6 +11,7 @@ import { SidenavContext } from './Sidenav';
|
|
|
11
11
|
import deprecatePropType from '../utils/deprecatePropType';
|
|
12
12
|
import SidenavDropdownCollapse from './SidenavDropdownCollapse';
|
|
13
13
|
import Disclosure from '../Disclosure/Disclosure';
|
|
14
|
+
import DropdownContext from '../Dropdown/DropdownContext';
|
|
14
15
|
var defaultProps = {
|
|
15
16
|
as: 'div',
|
|
16
17
|
classPrefix: 'dropdown',
|
|
@@ -43,6 +44,9 @@ var SidenavDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
43
44
|
openKeys = _useContext$openKeys === void 0 ? [] : _useContext$openKeys,
|
|
44
45
|
onOpenChange = _useContext.onOpenChange;
|
|
45
46
|
|
|
47
|
+
var _useContext2 = useContext(DropdownContext),
|
|
48
|
+
hasSelectedItem = _useContext2.hasSelectedItem;
|
|
49
|
+
|
|
46
50
|
var _useClassNames = useClassNames(classPrefix),
|
|
47
51
|
merge = _useClassNames.merge,
|
|
48
52
|
withClassPrefix = _useClassNames.withClassPrefix;
|
|
@@ -65,7 +69,7 @@ var SidenavDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
65
69
|
var _withClassPrefix;
|
|
66
70
|
|
|
67
71
|
var open = _ref.open;
|
|
68
|
-
var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = placement, _withClassPrefix[open ? 'expand' : 'collapse'] = true, _withClassPrefix.disabled = disabled, _withClassPrefix['no-caret'] = noCaret, _withClassPrefix)));
|
|
72
|
+
var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = placement, _withClassPrefix[open ? 'expand' : 'collapse'] = true, _withClassPrefix.disabled = disabled, _withClassPrefix['selected-within'] = hasSelectedItem, _withClassPrefix['no-caret'] = noCaret, _withClassPrefix)));
|
|
69
73
|
return /*#__PURE__*/React.createElement(Component, _extends({
|
|
70
74
|
ref: mergeRefs(ref, containerRef),
|
|
71
75
|
style: style,
|
|
@@ -61,26 +61,20 @@ var SidenavItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
61
61
|
focus: active,
|
|
62
62
|
active: selected,
|
|
63
63
|
disabled: disabled
|
|
64
|
-
}));
|
|
65
|
-
var item = /*#__PURE__*/React.createElement(Component, _extends({
|
|
66
|
-
ref: mergeRefs(ref, menuitemRef),
|
|
67
|
-
disabled: Component === SafeAnchor ? disabled : undefined,
|
|
68
|
-
className: classes,
|
|
69
|
-
"data-event-key": eventKey
|
|
70
|
-
}, menuitem, omit(rest, ['divider', 'panel'])), icon, _children, /*#__PURE__*/React.createElement(Ripple, null)); // Show tooltip when inside a collapse <Sidenav>
|
|
64
|
+
})); // Show tooltip when inside a collapse <Sidenav>
|
|
71
65
|
|
|
72
|
-
return
|
|
66
|
+
return appendTooltip({
|
|
73
67
|
children: function children(triggerProps, triggerRef) {
|
|
74
68
|
return /*#__PURE__*/React.createElement(Component, _extends({
|
|
75
69
|
ref: mergeRefs(mergeRefs(ref, menuitemRef), triggerRef),
|
|
76
70
|
disabled: Component === SafeAnchor ? disabled : undefined,
|
|
77
71
|
className: classes,
|
|
78
72
|
"data-event-key": eventKey
|
|
79
|
-
},
|
|
73
|
+
}, omit(rest, ['divider', 'panel']), triggerProps, menuitem), icon, _children, /*#__PURE__*/React.createElement(Ripple, null));
|
|
80
74
|
},
|
|
81
75
|
message: _children,
|
|
82
76
|
placement: 'right'
|
|
83
|
-
})
|
|
77
|
+
});
|
|
84
78
|
});
|
|
85
79
|
}
|
|
86
80
|
|
package/esm/utils/dateUtils.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export { default as isBefore } from 'date-fns/isBefore';
|
|
|
19
19
|
export { default as isEqual } from 'date-fns/isEqual';
|
|
20
20
|
export { default as isSameDay } from 'date-fns/isSameDay';
|
|
21
21
|
export { default as isSameMonth } from 'date-fns/isSameMonth';
|
|
22
|
+
export { default as isSameSecond } from 'date-fns/isSameSecond';
|
|
22
23
|
export { default as parse } from 'date-fns/parse';
|
|
23
24
|
export { default as parseISO } from 'date-fns/parseISO';
|
|
24
25
|
export { default as setDate } from 'date-fns/setDate';
|
package/esm/utils/dateUtils.js
CHANGED
|
@@ -26,6 +26,7 @@ export { default as isBefore } from 'date-fns/isBefore';
|
|
|
26
26
|
export { default as isEqual } from 'date-fns/isEqual';
|
|
27
27
|
export { default as isSameDay } from 'date-fns/isSameDay';
|
|
28
28
|
export { default as isSameMonth } from 'date-fns/isSameMonth';
|
|
29
|
+
export { default as isSameSecond } from 'date-fns/isSameSecond';
|
|
29
30
|
export { default as parse } from 'date-fns/parse';
|
|
30
31
|
export { default as parseISO } from 'date-fns/parseISO';
|
|
31
32
|
export { default as setDate } from 'date-fns/setDate';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useDebugValue, useRef } from 'react';
|
|
2
|
+
import uniqueId from 'lodash/uniqueId';
|
|
3
|
+
/**
|
|
4
|
+
* Used for generating unique ID for DOM elements
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export default function useInternalId(prefix) {
|
|
8
|
+
var idRef = useRef();
|
|
9
|
+
|
|
10
|
+
if (!idRef.current) {
|
|
11
|
+
idRef.current = uniqueId("internal://" + prefix);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
useDebugValue(idRef.current);
|
|
15
|
+
return idRef.current;
|
|
16
|
+
}
|
package/esm/utils/useUniqueId.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rsuite",
|
|
3
|
-
"version": "5.0.0
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "A suite of react components",
|
|
5
5
|
"main": "cjs/index.js",
|
|
6
6
|
"module": "esm/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"prop-types": "^15.7.2",
|
|
40
40
|
"react-text-mask": "^5.4.3",
|
|
41
41
|
"react-virtualized": "^9.22.3",
|
|
42
|
-
"rsuite-table": "^5.0.0
|
|
42
|
+
"rsuite-table": "^5.0.0",
|
|
43
43
|
"schema-typed": "^2.0.1"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
@@ -159,6 +159,22 @@
|
|
|
159
159
|
--rs-navbar-subtle-hover-bg: @B700;
|
|
160
160
|
--rs-navbar-subtle-hover-text: @B050;
|
|
161
161
|
|
|
162
|
+
// Sidenav
|
|
163
|
+
--rs-sidenav-default-bg: @B800;
|
|
164
|
+
--rs-sidenav-default-text: @B200;
|
|
165
|
+
--rs-sidenav-default-selected-text: @H500;
|
|
166
|
+
--rs-sidenav-default-hover-bg: @B700;
|
|
167
|
+
--rs-sidenav-default-hover-text: @B050;
|
|
168
|
+
--rs-sidenav-inverse-bg: @H700;
|
|
169
|
+
--rs-sidenav-inverse-text: #fff;
|
|
170
|
+
--rs-sidenav-inverse-selected-bg: @H400;
|
|
171
|
+
--rs-sidenav-inverse-hover-bg: @H600;
|
|
172
|
+
--rs-sidenav-subtle-bg: transparent;
|
|
173
|
+
--rs-sidenav-subtle-text: @B200;
|
|
174
|
+
--rs-sidenav-subtle-selected-text: @H500;
|
|
175
|
+
--rs-sidenav-subtle-hover-bg: @B700;
|
|
176
|
+
--rs-sidenav-subtle-hover-text: @B050;
|
|
177
|
+
|
|
162
178
|
// Input
|
|
163
179
|
--rs-input-bg: @B800;
|
|
164
180
|
--rs-input-focus-border: @H500;
|