@douyinfe/semi-ui 2.14.0-beta.2 → 2.15.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/autoComplete/index.tsx +0 -1
- package/cascader/__test__/cascader.test.js +13 -10
- package/cascader/_story/cascader.stories.js +22 -0
- package/cascader/index.tsx +53 -35
- package/checkbox/checkbox.tsx +1 -0
- package/checkbox/checkboxInner.tsx +4 -1
- package/datePicker/__test__/datePicker.test.js +1 -0
- package/datePicker/_story/v2/FixTriggerRender.tsx +36 -0
- package/datePicker/_story/v2/index.js +1 -0
- package/datePicker/datePicker.tsx +7 -5
- package/dist/css/semi.css +39 -11
- package/dist/css/semi.min.css +1 -1
- package/dist/umd/semi-ui.js +1151 -347
- package/dist/umd/semi-ui.js.map +1 -1
- package/dist/umd/semi-ui.min.js +1 -1
- package/dist/umd/semi-ui.min.js.map +1 -1
- package/dropdown/context.ts +2 -0
- package/dropdown/dropdownItem.tsx +2 -1
- package/dropdown/dropdownMenu.tsx +24 -1
- package/dropdown/index.tsx +10 -2
- package/form/_story/form.stories.tsx +23 -15
- package/form/hoc/withField.tsx +1 -1
- package/form/interface.ts +1 -1
- package/input/__test__/input.test.js +31 -0
- package/input/_story/input.stories.js +24 -1
- package/input/index.tsx +5 -2
- package/input/inputGroup.tsx +7 -6
- package/inputNumber/index.tsx +5 -3
- package/lib/cjs/autoComplete/index.d.ts +0 -1
- package/lib/cjs/autoComplete/index.js +0 -1
- package/lib/cjs/cascader/index.d.ts +1 -1
- package/lib/cjs/cascader/index.js +36 -9
- package/lib/cjs/checkbox/checkbox.d.ts +1 -0
- package/lib/cjs/checkbox/checkbox.js +2 -1
- package/lib/cjs/checkbox/checkboxInner.d.ts +2 -0
- package/lib/cjs/checkbox/checkboxInner.js +8 -2
- package/lib/cjs/datePicker/datePicker.d.ts +1 -1
- package/lib/cjs/datePicker/datePicker.js +21 -6
- package/lib/cjs/dropdown/context.d.ts +2 -0
- package/lib/cjs/dropdown/dropdownItem.js +3 -1
- package/lib/cjs/dropdown/dropdownMenu.d.ts +18 -1
- package/lib/cjs/dropdown/dropdownMenu.js +23 -2
- package/lib/cjs/dropdown/index.d.ts +4 -0
- package/lib/cjs/dropdown/index.js +13 -5
- package/lib/cjs/form/baseForm.d.ts +16 -15
- package/lib/cjs/form/field.d.ts +16 -15
- package/lib/cjs/form/hoc/withField.d.ts +1 -1
- package/lib/cjs/form/interface.d.ts +1 -1
- package/lib/cjs/input/index.d.ts +2 -1
- package/lib/cjs/input/index.js +11 -5
- package/lib/cjs/input/inputGroup.js +16 -9
- package/lib/cjs/inputNumber/index.d.ts +1 -0
- package/lib/cjs/inputNumber/index.js +8 -3
- package/lib/cjs/locale/source/de.d.ts +3 -0
- package/lib/cjs/locale/source/de.js +165 -0
- package/lib/cjs/locale/source/fr.d.ts +3 -0
- package/lib/cjs/locale/source/fr.js +165 -0
- package/lib/cjs/locale/source/it.d.ts +3 -0
- package/lib/cjs/locale/source/it.js +165 -0
- package/lib/cjs/modal/ModalContent.d.ts +1 -0
- package/lib/cjs/modal/ModalContent.js +17 -4
- package/lib/cjs/modal/confirm.d.ts +5 -0
- package/lib/cjs/radio/radio.d.ts +2 -0
- package/lib/cjs/radio/radio.js +2 -1
- package/lib/cjs/radio/radioInner.d.ts +2 -0
- package/lib/cjs/radio/radioInner.js +8 -2
- package/lib/cjs/rating/index.d.ts +7 -0
- package/lib/cjs/rating/index.js +135 -68
- package/lib/cjs/rating/item.d.ts +27 -3
- package/lib/cjs/rating/item.js +145 -38
- package/lib/cjs/select/index.d.ts +2 -0
- package/lib/cjs/select/index.js +15 -3
- package/lib/cjs/spin/icon.js +1 -1
- package/lib/cjs/table/Body/index.js +1 -1
- package/lib/cjs/tabs/index.d.ts +1 -0
- package/lib/cjs/tabs/index.js +2 -1
- package/lib/cjs/tabs/interface.d.ts +1 -0
- package/lib/cjs/tag/index.js +4 -5
- package/lib/cjs/tag/interface.d.ts +1 -0
- package/lib/cjs/tagInput/index.d.ts +2 -0
- package/lib/cjs/tagInput/index.js +19 -5
- package/lib/cjs/timePicker/TimeInput.d.ts +2 -1
- package/lib/cjs/timePicker/TimeInput.js +7 -3
- package/lib/cjs/timePicker/TimePicker.d.ts +2 -0
- package/lib/cjs/timePicker/TimePicker.js +2 -1
- package/lib/cjs/timePicker/index.d.ts +1 -0
- package/lib/cjs/tooltip/index.d.ts +2 -0
- package/lib/cjs/tooltip/index.js +12 -4
- package/lib/cjs/tree/index.d.ts +1 -0
- package/lib/cjs/tree/index.js +21 -5
- package/lib/cjs/tree/treeNode.js +15 -19
- package/lib/cjs/treeSelect/index.js +20 -4
- package/lib/es/autoComplete/index.d.ts +0 -1
- package/lib/es/autoComplete/index.js +0 -1
- package/lib/es/cascader/index.d.ts +1 -1
- package/lib/es/cascader/index.js +36 -9
- package/lib/es/checkbox/checkbox.d.ts +1 -0
- package/lib/es/checkbox/checkbox.js +2 -1
- package/lib/es/checkbox/checkboxInner.d.ts +2 -0
- package/lib/es/checkbox/checkboxInner.js +8 -2
- package/lib/es/datePicker/datePicker.d.ts +1 -1
- package/lib/es/datePicker/datePicker.js +21 -6
- package/lib/es/dropdown/context.d.ts +2 -0
- package/lib/es/dropdown/dropdownItem.js +3 -1
- package/lib/es/dropdown/dropdownMenu.d.ts +18 -1
- package/lib/es/dropdown/dropdownMenu.js +21 -2
- package/lib/es/dropdown/index.d.ts +4 -0
- package/lib/es/dropdown/index.js +13 -5
- package/lib/es/form/baseForm.d.ts +16 -15
- package/lib/es/form/field.d.ts +16 -15
- package/lib/es/form/hoc/withField.d.ts +1 -1
- package/lib/es/form/interface.d.ts +1 -1
- package/lib/es/input/index.d.ts +2 -1
- package/lib/es/input/index.js +11 -5
- package/lib/es/input/inputGroup.js +15 -9
- package/lib/es/inputNumber/index.d.ts +1 -0
- package/lib/es/inputNumber/index.js +8 -3
- package/lib/es/locale/source/de.d.ts +3 -0
- package/lib/es/locale/source/de.js +153 -0
- package/lib/es/locale/source/fr.d.ts +3 -0
- package/lib/es/locale/source/fr.js +153 -0
- package/lib/es/locale/source/it.d.ts +3 -0
- package/lib/es/locale/source/it.js +153 -0
- package/lib/es/modal/ModalContent.d.ts +1 -0
- package/lib/es/modal/ModalContent.js +17 -4
- package/lib/es/modal/confirm.d.ts +5 -0
- package/lib/es/radio/radio.d.ts +2 -0
- package/lib/es/radio/radio.js +2 -1
- package/lib/es/radio/radioInner.d.ts +2 -0
- package/lib/es/radio/radioInner.js +8 -2
- package/lib/es/rating/index.d.ts +7 -0
- package/lib/es/rating/index.js +133 -65
- package/lib/es/rating/item.d.ts +27 -3
- package/lib/es/rating/item.js +145 -32
- package/lib/es/select/index.d.ts +2 -0
- package/lib/es/select/index.js +15 -3
- package/lib/es/spin/icon.js +1 -1
- package/lib/es/table/Body/index.js +1 -1
- package/lib/es/tabs/index.d.ts +1 -0
- package/lib/es/tabs/index.js +2 -1
- package/lib/es/tabs/interface.d.ts +1 -0
- package/lib/es/tag/index.js +4 -5
- package/lib/es/tag/interface.d.ts +1 -0
- package/lib/es/tagInput/index.d.ts +2 -0
- package/lib/es/tagInput/index.js +19 -5
- package/lib/es/timePicker/TimeInput.d.ts +2 -1
- package/lib/es/timePicker/TimeInput.js +7 -3
- package/lib/es/timePicker/TimePicker.d.ts +2 -0
- package/lib/es/timePicker/TimePicker.js +2 -1
- package/lib/es/timePicker/index.d.ts +1 -0
- package/lib/es/tooltip/index.d.ts +2 -0
- package/lib/es/tooltip/index.js +13 -4
- package/lib/es/tree/index.d.ts +1 -0
- package/lib/es/tree/index.js +19 -5
- package/lib/es/tree/treeNode.js +14 -20
- package/lib/es/treeSelect/index.js +18 -4
- package/locale/source/de.ts +156 -0
- package/locale/source/fr.ts +156 -0
- package/locale/source/it.ts +156 -0
- package/modal/ModalContent.tsx +7 -4
- package/package.json +8 -8
- package/radio/radio.tsx +2 -0
- package/radio/radioInner.tsx +4 -1
- package/rating/__test__/rating.test.js +13 -31
- package/rating/_story/rating.stories.js +13 -2
- package/rating/index.tsx +63 -18
- package/rating/item.tsx +141 -26
- package/select/index.tsx +6 -2
- package/spin/icon.tsx +1 -1
- package/table/Body/index.tsx +1 -1
- package/table/_story/v2/FixedVirtualizedEmpty.tsx +76 -0
- package/table/_story/v2/index.js +2 -1
- package/tabs/index.tsx +1 -0
- package/tabs/interface.ts +1 -0
- package/tag/index.tsx +2 -3
- package/tag/interface.ts +1 -0
- package/tagInput/index.tsx +8 -4
- package/timePicker/TimeInput.tsx +5 -3
- package/timePicker/TimePicker.tsx +2 -0
- package/tooltip/index.tsx +7 -2
- package/tree/index.tsx +13 -2
- package/tree/treeNode.tsx +11 -13
- package/treeSelect/_story/treeSelect.stories.js +38 -1
- package/treeSelect/index.tsx +13 -3
- package/upload/_story/upload.stories.tsx +9 -6
package/autoComplete/index.tsx
CHANGED
|
@@ -427,10 +427,10 @@ describe('Cascader', () => {
|
|
|
427
427
|
});
|
|
428
428
|
expect(
|
|
429
429
|
cascaderWithSingleFilter
|
|
430
|
-
.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper
|
|
430
|
+
.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper span`)
|
|
431
431
|
.getDOMNode()
|
|
432
|
-
.
|
|
433
|
-
|
|
432
|
+
.textContent
|
|
433
|
+
).toEqual('亚洲 / 中国');
|
|
434
434
|
cascaderWithSingleFilter.unmount();
|
|
435
435
|
|
|
436
436
|
const cascaderWithSingleControlled = render({
|
|
@@ -550,10 +550,10 @@ describe('Cascader', () => {
|
|
|
550
550
|
expect(searchWrapper.exists()).toEqual(true);
|
|
551
551
|
expect(
|
|
552
552
|
searchWrapper
|
|
553
|
-
.find('
|
|
554
|
-
.
|
|
555
|
-
.
|
|
556
|
-
|
|
553
|
+
.find('span')
|
|
554
|
+
.getDOMNode()
|
|
555
|
+
.textContent
|
|
556
|
+
).toEqual('placeholder');
|
|
557
557
|
});
|
|
558
558
|
|
|
559
559
|
it('onSearch', () => {
|
|
@@ -563,10 +563,11 @@ describe('Cascader', () => {
|
|
|
563
563
|
filterTreeNode: true,
|
|
564
564
|
onSearch: spyOnSearch,
|
|
565
565
|
});
|
|
566
|
-
const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);
|
|
567
566
|
let searchValue = '${BASE_CLASS_PREFIX}';
|
|
568
567
|
let event = { target: { value: searchValue } };
|
|
569
|
-
|
|
568
|
+
cascader.simulate('click');
|
|
569
|
+
const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`);
|
|
570
|
+
input.simulate('change', event);
|
|
570
571
|
expect(spyOnSearch.calledOnce).toBe(true);
|
|
571
572
|
expect(spyOnSearch.calledWithMatch(searchValue)).toBe(true);
|
|
572
573
|
});
|
|
@@ -1228,8 +1229,10 @@ describe('Cascader', () => {
|
|
|
1228
1229
|
separator: ' > ',
|
|
1229
1230
|
defaultOpen: true,
|
|
1230
1231
|
});
|
|
1232
|
+
const span = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`);
|
|
1233
|
+
expect(span.getDOMNode().textContent).toEqual('亚洲 > 中国 > 北京');
|
|
1234
|
+
cascader.simulate('click');
|
|
1231
1235
|
const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`);
|
|
1232
|
-
expect(input.props().placeholder).toEqual('亚洲 > 中国 > 北京');
|
|
1233
1236
|
const event = { target: { value: '中国' } };
|
|
1234
1237
|
input.simulate('change', event);
|
|
1235
1238
|
expect(
|
|
@@ -396,6 +396,28 @@ Searchable.parameters = {
|
|
|
396
396
|
chromatic: { disableSnapshot: false },
|
|
397
397
|
}
|
|
398
398
|
|
|
399
|
+
export const filterTreeNodeAndDisplayRender = () => {
|
|
400
|
+
return (
|
|
401
|
+
<>
|
|
402
|
+
<div>
|
|
403
|
+
filterTreeNode=true,配合displayRender 使用,回显到input的内容也是符合预期
|
|
404
|
+
</div>
|
|
405
|
+
<Cascader
|
|
406
|
+
filterTreeNode
|
|
407
|
+
style={{ width: 300 }}
|
|
408
|
+
treeData={treeData4}
|
|
409
|
+
placeholder="自定义回填时显示数据的格式"
|
|
410
|
+
defaultValue={['zhejiang', 'ningbo', 'jiangbei']}
|
|
411
|
+
displayRender={(item) => {
|
|
412
|
+
console.log('item', item);
|
|
413
|
+
return <div>
|
|
414
|
+
{'已选择:' + item.join(' -> ')}
|
|
415
|
+
</div>;}}
|
|
416
|
+
/>
|
|
417
|
+
</>
|
|
418
|
+
);
|
|
419
|
+
};
|
|
420
|
+
|
|
399
421
|
export const Disabled = () => {
|
|
400
422
|
return (
|
|
401
423
|
<div>
|
package/cascader/index.tsx
CHANGED
|
@@ -168,6 +168,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
|
|
|
168
168
|
disableStrictly: PropTypes.bool,
|
|
169
169
|
leafOnly: PropTypes.bool,
|
|
170
170
|
enableLeafClick: PropTypes.bool,
|
|
171
|
+
preventScroll: PropTypes.bool,
|
|
171
172
|
};
|
|
172
173
|
|
|
173
174
|
static defaultProps = {
|
|
@@ -180,7 +181,6 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
|
|
|
180
181
|
showClear: false,
|
|
181
182
|
autoClearSearchValue: true,
|
|
182
183
|
changeOnSelect: false,
|
|
183
|
-
disabled: false,
|
|
184
184
|
disableStrictly: false,
|
|
185
185
|
autoMergeValue: true,
|
|
186
186
|
multiple: false,
|
|
@@ -248,6 +248,7 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
|
|
|
248
248
|
loadingKeys: new Set(),
|
|
249
249
|
/* Mark whether this rendering has triggered asynchronous loading of data */
|
|
250
250
|
loading: false,
|
|
251
|
+
showInput: false,
|
|
251
252
|
};
|
|
252
253
|
this.options = {};
|
|
253
254
|
this.isEmpty = false;
|
|
@@ -268,15 +269,16 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
|
|
|
268
269
|
this.setState({ inputPlaceHolder: value });
|
|
269
270
|
},
|
|
270
271
|
focusInput: () => {
|
|
272
|
+
const { preventScroll } = this.props;
|
|
271
273
|
if (this.inputRef && this.inputRef.current) {
|
|
272
274
|
// TODO: check the reason
|
|
273
|
-
(this.inputRef.current as any).focus();
|
|
275
|
+
(this.inputRef.current as any).focus({ preventScroll });
|
|
274
276
|
}
|
|
275
277
|
},
|
|
276
278
|
};
|
|
277
279
|
const cascaderAdapter: Pick<
|
|
278
|
-
|
|
279
|
-
|
|
280
|
+
CascaderAdapter,
|
|
281
|
+
'registerClickOutsideHandler' | 'unregisterClickOutsideHandler' | 'rePositionDropdown'
|
|
280
282
|
> = {
|
|
281
283
|
registerClickOutsideHandler: cb => {
|
|
282
284
|
const clickOutsideHandler = (e: Event) => {
|
|
@@ -363,6 +365,14 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
|
|
|
363
365
|
},
|
|
364
366
|
notifyOnExceed: data => this.props.onExceed(data),
|
|
365
367
|
notifyClear: () => this.props.onClear(),
|
|
368
|
+
toggleInputShow: (showInput: boolean, cb: (...args: any) => void) => {
|
|
369
|
+
this.setState({ showInput }, () => {
|
|
370
|
+
cb();
|
|
371
|
+
});
|
|
372
|
+
},
|
|
373
|
+
updateFocusState: (isFocus: boolean) => {
|
|
374
|
+
this.setState({ isFocus });
|
|
375
|
+
},
|
|
366
376
|
};
|
|
367
377
|
}
|
|
368
378
|
|
|
@@ -542,20 +552,28 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
|
|
|
542
552
|
renderInput() {
|
|
543
553
|
const { size, disabled } = this.props;
|
|
544
554
|
const inputcls = cls(`${prefixcls}-input`);
|
|
545
|
-
const { inputValue, inputPlaceHolder } = this.state;
|
|
555
|
+
const { inputValue, inputPlaceHolder, showInput } = this.state;
|
|
546
556
|
const inputProps = {
|
|
547
557
|
disabled,
|
|
548
558
|
value: inputValue,
|
|
549
559
|
className: inputcls,
|
|
550
560
|
onChange: this.handleInputChange,
|
|
551
|
-
placeholder: inputPlaceHolder,
|
|
552
561
|
};
|
|
553
562
|
const wrappercls = cls({
|
|
554
563
|
[`${prefixcls}-search-wrapper`]: true,
|
|
555
564
|
});
|
|
565
|
+
|
|
566
|
+
const displayText = this.renderDisplayText();
|
|
567
|
+
const spanCls = cls({
|
|
568
|
+
[`${prefixcls}-selection-placeholder`]: !displayText,
|
|
569
|
+
[`${prefixcls}-selection-text-hide`]: showInput && inputValue,
|
|
570
|
+
[`${prefixcls}-selection-text-inactive`]: showInput && !inputValue,
|
|
571
|
+
});
|
|
572
|
+
|
|
556
573
|
return (
|
|
557
574
|
<div className={wrappercls}>
|
|
558
|
-
<
|
|
575
|
+
<span className={spanCls}>{displayText ? displayText : inputPlaceHolder}</span>
|
|
576
|
+
{showInput && <Input ref={this.inputRef as any} size={size} {...inputProps} />}
|
|
559
577
|
</div>
|
|
560
578
|
);
|
|
561
579
|
}
|
|
@@ -866,40 +884,40 @@ class Cascader extends BaseComponent<CascaderProps, CascaderState> {
|
|
|
866
884
|
const { isOpen, isFocus, isInput, checkedKeys } = this.state;
|
|
867
885
|
const filterable = Boolean(filterTreeNode);
|
|
868
886
|
const useCustomTrigger = typeof triggerRender === 'function';
|
|
869
|
-
const classNames = useCustomTrigger
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
const mouseEvent = showClear
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
887
|
+
const classNames = useCustomTrigger ?
|
|
888
|
+
cls(className) :
|
|
889
|
+
cls(prefixcls, className, {
|
|
890
|
+
[`${prefixcls}-focus`]: isFocus || (isOpen && !isInput),
|
|
891
|
+
[`${prefixcls}-disabled`]: disabled,
|
|
892
|
+
[`${prefixcls}-single`]: true,
|
|
893
|
+
[`${prefixcls}-filterable`]: filterable,
|
|
894
|
+
[`${prefixcls}-error`]: validateStatus === 'error',
|
|
895
|
+
[`${prefixcls}-warning`]: validateStatus === 'warning',
|
|
896
|
+
[`${prefixcls}-small`]: size === 'small',
|
|
897
|
+
[`${prefixcls}-large`]: size === 'large',
|
|
898
|
+
[`${prefixcls}-with-prefix`]: prefix || insetLabel,
|
|
899
|
+
[`${prefixcls}-with-suffix`]: suffix,
|
|
900
|
+
});
|
|
901
|
+
const mouseEvent = showClear ?
|
|
902
|
+
{
|
|
903
|
+
onMouseEnter: () => this.handleMouseOver(),
|
|
904
|
+
onMouseLeave: () => this.handleMouseLeave(),
|
|
905
|
+
} :
|
|
906
|
+
{};
|
|
889
907
|
const sectionCls = cls(`${prefixcls}-selection`, {
|
|
890
908
|
[`${prefixcls}-selection-multiple`]: multiple && !isEmpty(checkedKeys),
|
|
891
909
|
});
|
|
892
910
|
const inner = useCustomTrigger
|
|
893
911
|
? this.renderCustomTrigger()
|
|
894
912
|
: [
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
913
|
+
<Fragment key={'prefix'}>{prefix || insetLabel ? this.renderPrefix() : null}</Fragment>,
|
|
914
|
+
<Fragment key={'selection'}>
|
|
915
|
+
<div className={sectionCls}>{this.renderSelectContent()}</div>
|
|
916
|
+
</Fragment>,
|
|
917
|
+
<Fragment key={'clearbtn'}>{this.renderClearBtn()}</Fragment>,
|
|
918
|
+
<Fragment key={'suffix'}>{suffix ? this.renderSuffix() : null}</Fragment>,
|
|
919
|
+
<Fragment key={'arrow'}>{this.renderArrow()}</Fragment>,
|
|
920
|
+
];
|
|
903
921
|
/**
|
|
904
922
|
* Reasons for disabling the a11y eslint rule:
|
|
905
923
|
* The following attributes(aria-controls,aria-expanded) will be automatically added by Tooltip, no need to declare here
|
package/checkbox/checkbox.tsx
CHANGED
|
@@ -26,6 +26,7 @@ export interface CheckboxInnerProps {
|
|
|
26
26
|
focusInner?: boolean;
|
|
27
27
|
onInputFocus?: (e: any) => void;
|
|
28
28
|
onInputBlur?: (e: any) => void;
|
|
29
|
+
preventScroll?: boolean;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
class CheckboxInner extends PureComponent<CheckboxInnerProps> {
|
|
@@ -49,6 +50,7 @@ class CheckboxInner extends PureComponent<CheckboxInnerProps> {
|
|
|
49
50
|
focusInner: PropTypes.bool,
|
|
50
51
|
onInputFocus: PropTypes.func,
|
|
51
52
|
onInputBlur: PropTypes.func,
|
|
53
|
+
preventScroll: PropTypes.bool,
|
|
52
54
|
};
|
|
53
55
|
|
|
54
56
|
static defaultProps = {
|
|
@@ -61,7 +63,8 @@ class CheckboxInner extends PureComponent<CheckboxInnerProps> {
|
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
focus() {
|
|
64
|
-
this.
|
|
66
|
+
const { preventScroll } = this.props;
|
|
67
|
+
this.inputEntity.focus({ preventScroll });
|
|
65
68
|
}
|
|
66
69
|
|
|
67
70
|
render() {
|
|
@@ -1056,6 +1056,7 @@ describe(`DatePicker`, () => {
|
|
|
1056
1056
|
const rightSecondWeek = rightPanel.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-week`)[1];
|
|
1057
1057
|
const rightSecondWeekDays = rightSecondWeek.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-day`);
|
|
1058
1058
|
leftSecondWeekDays[0].click();
|
|
1059
|
+
await sleep();
|
|
1059
1060
|
rightSecondWeekDays[0].click();
|
|
1060
1061
|
|
|
1061
1062
|
const baseElem = elem.find(BaseDatePicker);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React, { useState, useCallback, useMemo } from 'react';
|
|
2
|
+
import { DatePicker, Button, Icon, Space } from '../../../index';
|
|
3
|
+
|
|
4
|
+
export default function Demo() {
|
|
5
|
+
const [date, setDate] = useState([]);
|
|
6
|
+
const onChange = useCallback(date => {
|
|
7
|
+
setDate(date);
|
|
8
|
+
console.log(date);
|
|
9
|
+
}, []);
|
|
10
|
+
const onClear = useCallback(e => {
|
|
11
|
+
e && e.stopPropagation();
|
|
12
|
+
setDate(null);
|
|
13
|
+
}, []);
|
|
14
|
+
|
|
15
|
+
const closeIcon = useMemo(() => (date ? <Icon type="close" onClick={onClear} /> : <Icon type="chevron_down" />), [date]);
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<Space>
|
|
19
|
+
<DatePicker
|
|
20
|
+
type="dateTimeRange"
|
|
21
|
+
onChange={onChange}
|
|
22
|
+
value={date}
|
|
23
|
+
triggerRender={({ placeholder }) => (
|
|
24
|
+
<Button theme={'light'} icon={closeIcon} iconPosition={'right'}>
|
|
25
|
+
{(date && String(date)) || placeholder}
|
|
26
|
+
</Button>
|
|
27
|
+
)}
|
|
28
|
+
/>
|
|
29
|
+
<DatePicker
|
|
30
|
+
type="dateRange"
|
|
31
|
+
motion={false}
|
|
32
|
+
triggerRender={({ placeholder }) => <Button theme={'light'}>{placeholder}</Button>}
|
|
33
|
+
/>
|
|
34
|
+
</Space>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -8,3 +8,4 @@ export { default as InputFormat } from './InputFormat';
|
|
|
8
8
|
export { default as InputFormatDisabled } from './InputFormatDisabled';
|
|
9
9
|
export { default as AutoFillTime } from './AutoFillTime';
|
|
10
10
|
export { default as InputFormatConfirm } from './InputFormatConfirm';
|
|
11
|
+
export { default as FixedTriggerRender } from './FixTriggerRender';
|
|
@@ -125,6 +125,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
125
125
|
// Callback function for panel date switching
|
|
126
126
|
onPanelChange: PropTypes.func,
|
|
127
127
|
rangeSeparator: PropTypes.string,
|
|
128
|
+
preventScroll: PropTypes.bool,
|
|
128
129
|
};
|
|
129
130
|
|
|
130
131
|
static defaultProps = {
|
|
@@ -138,7 +139,6 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
138
139
|
type: 'date',
|
|
139
140
|
size: 'default',
|
|
140
141
|
density: 'default',
|
|
141
|
-
disabled: false,
|
|
142
142
|
multiple: false,
|
|
143
143
|
defaultOpen: false,
|
|
144
144
|
disabledHours: noop,
|
|
@@ -272,13 +272,14 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
272
272
|
typeIsYearOrMonth: () => ['month', 'year'].includes(this.props.type),
|
|
273
273
|
setMotionEnd: motionEnd => this.setState({ motionEnd }),
|
|
274
274
|
setRangeInputFocus: rangeInputFocus => {
|
|
275
|
+
const { preventScroll } = this.props;
|
|
275
276
|
if (rangeInputFocus !== this.state.rangeInputFocus) {
|
|
276
277
|
this.setState({ rangeInputFocus });
|
|
277
278
|
}
|
|
278
279
|
switch (rangeInputFocus) {
|
|
279
280
|
case 'rangeStart':
|
|
280
281
|
const inputStartNode = get(this, 'rangeInputStartRef.current');
|
|
281
|
-
inputStartNode && inputStartNode.focus();
|
|
282
|
+
inputStartNode && inputStartNode.focus({ preventScroll });
|
|
282
283
|
/**
|
|
283
284
|
* 解决选择完startDate,切换到endDate后panel被立马关闭的问题。
|
|
284
285
|
* 用户打开panel,选了startDate后,会执行setRangeInputFocus('rangeEnd'),focus到endDateInput,
|
|
@@ -298,7 +299,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
298
299
|
break;
|
|
299
300
|
case 'rangeEnd':
|
|
300
301
|
const inputEndNode = get(this, 'rangeInputEndRef.current');
|
|
301
|
-
inputEndNode && inputEndNode.focus();
|
|
302
|
+
inputEndNode && inputEndNode.focus({ preventScroll });
|
|
302
303
|
/**
|
|
303
304
|
* 解决选择完startDate,切换到endDate后panel被立马关闭的问题。
|
|
304
305
|
* 用户打开panel,选了startDate后,会执行setRangeInputFocus('rangeEnd'),focus到endDateInput,
|
|
@@ -323,19 +324,20 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
323
324
|
couldPanelClosed: () => this.focusRecordsRef.current.rangeStart && this.focusRecordsRef.current.rangeEnd,
|
|
324
325
|
isEventTarget: e => e && e.target === e.currentTarget,
|
|
325
326
|
setInsetInputFocus: () => {
|
|
327
|
+
const { preventScroll } = this.props;
|
|
326
328
|
const { rangeInputFocus } = this.state;
|
|
327
329
|
switch (rangeInputFocus) {
|
|
328
330
|
case 'rangeEnd':
|
|
329
331
|
if (document.activeElement !== this.rangeInputEndRef.current) {
|
|
330
332
|
const inputEndNode = get(this, 'rangeInputEndRef.current');
|
|
331
|
-
inputEndNode && inputEndNode.focus();
|
|
333
|
+
inputEndNode && inputEndNode.focus({ preventScroll });
|
|
332
334
|
}
|
|
333
335
|
break;
|
|
334
336
|
case 'rangeStart':
|
|
335
337
|
default:
|
|
336
338
|
if (document.activeElement !== this.rangeInputStartRef.current) {
|
|
337
339
|
const inputStartNode = get(this, 'rangeInputStartRef.current');
|
|
338
|
-
inputStartNode && inputStartNode.focus();
|
|
340
|
+
inputStartNode && inputStartNode.focus({ preventScroll });
|
|
339
341
|
}
|
|
340
342
|
break;
|
|
341
343
|
}
|
package/dist/css/semi.css
CHANGED
|
@@ -3088,6 +3088,12 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
3088
3088
|
.semi-cascader-selection .semi-tagInput .semi-input-wrapper-large {
|
|
3089
3089
|
height: 38px;
|
|
3090
3090
|
}
|
|
3091
|
+
.semi-cascader-selection-text-inactive {
|
|
3092
|
+
color: var(--semi-color-text-2);
|
|
3093
|
+
}
|
|
3094
|
+
.semi-cascader-selection-text-hide {
|
|
3095
|
+
display: none;
|
|
3096
|
+
}
|
|
3091
3097
|
.semi-cascader-arrow, .semi-cascader-clearbtn {
|
|
3092
3098
|
display: inline-flex;
|
|
3093
3099
|
align-items: center;
|
|
@@ -3181,8 +3187,17 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
3181
3187
|
}
|
|
3182
3188
|
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper {
|
|
3183
3189
|
width: 100%;
|
|
3190
|
+
height: 30px;
|
|
3191
|
+
display: flex;
|
|
3192
|
+
align-items: center;
|
|
3193
|
+
position: relative;
|
|
3184
3194
|
}
|
|
3185
3195
|
.semi-cascader-single.semi-cascader-filterable .semi-cascader-selection .semi-cascader-search-wrapper .semi-input-wrapper {
|
|
3196
|
+
position: absolute;
|
|
3197
|
+
top: 0;
|
|
3198
|
+
left: 0;
|
|
3199
|
+
border: none;
|
|
3200
|
+
background-color: transparent;
|
|
3186
3201
|
height: 100%;
|
|
3187
3202
|
width: 100%;
|
|
3188
3203
|
border: none;
|
|
@@ -3456,11 +3471,6 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
3456
3471
|
.semi-checkbox-inner-display .semi-icon {
|
|
3457
3472
|
font-size: 16px;
|
|
3458
3473
|
}
|
|
3459
|
-
.semi-checkbox-inner-pureCardType {
|
|
3460
|
-
opacity: 0;
|
|
3461
|
-
width: 0;
|
|
3462
|
-
margin-right: 0 !important;
|
|
3463
|
-
}
|
|
3464
3474
|
.semi-checkbox-inner-checked .semi-checkbox-inner-display {
|
|
3465
3475
|
background: var(--semi-color-primary);
|
|
3466
3476
|
color: var(--semi-color-white);
|
|
@@ -3519,6 +3529,11 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
3519
3529
|
.semi-checkbox-cardType .semi-checkbox-inner-display {
|
|
3520
3530
|
background: var(--semi-color-white);
|
|
3521
3531
|
}
|
|
3532
|
+
.semi-checkbox-cardType .semi-checkbox-inner-pureCardType {
|
|
3533
|
+
opacity: 0;
|
|
3534
|
+
width: 0;
|
|
3535
|
+
margin-right: 0;
|
|
3536
|
+
}
|
|
3522
3537
|
.semi-checkbox-cardType .semi-checkbox-addon {
|
|
3523
3538
|
font-weight: 600;
|
|
3524
3539
|
font-size: 14px;
|
|
@@ -5032,6 +5047,10 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
5032
5047
|
.semi-dropdown-item:not(.semi-dropdown-item-active):active {
|
|
5033
5048
|
background-color: var(--semi-color-fill-1);
|
|
5034
5049
|
}
|
|
5050
|
+
.semi-dropdown-item:focus-visible {
|
|
5051
|
+
background-color: var(--semi-color-fill-0);
|
|
5052
|
+
outline: 0;
|
|
5053
|
+
}
|
|
5035
5054
|
.semi-dropdown-item-icon {
|
|
5036
5055
|
display: inline-flex;
|
|
5037
5056
|
align-items: center;
|
|
@@ -12432,7 +12451,7 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
12432
12451
|
padding: 12px 24px;
|
|
12433
12452
|
}
|
|
12434
12453
|
.semi-list-empty {
|
|
12435
|
-
padding: 12px;
|
|
12454
|
+
padding: 12px 0px;
|
|
12436
12455
|
color: var(--semi-color-text-2);
|
|
12437
12456
|
width: 100%;
|
|
12438
12457
|
text-align: center;
|
|
@@ -14625,10 +14644,15 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
14625
14644
|
margin: 0px;
|
|
14626
14645
|
padding: 0px;
|
|
14627
14646
|
color: rgba(var(--semi-yellow-5), 1);
|
|
14628
|
-
font-size: 20px;
|
|
14629
|
-
line-height: unset;
|
|
14630
14647
|
list-style: none;
|
|
14631
14648
|
outline: none;
|
|
14649
|
+
border-radius: 3px;
|
|
14650
|
+
}
|
|
14651
|
+
.semi-rating-focus {
|
|
14652
|
+
outline: 2px solid var(--semi-color-primary-light-active);
|
|
14653
|
+
}
|
|
14654
|
+
.semi-rating-no-focus {
|
|
14655
|
+
outline: none;
|
|
14632
14656
|
}
|
|
14633
14657
|
.semi-rating-disabled .semi-rating-star {
|
|
14634
14658
|
cursor: default;
|
|
@@ -14648,12 +14672,12 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
14648
14672
|
.semi-rating-star:not(:last-child) {
|
|
14649
14673
|
margin-right: 6px;
|
|
14650
14674
|
}
|
|
14651
|
-
.semi-rating-star > div:focus {
|
|
14652
|
-
outline: 0;
|
|
14653
|
-
}
|
|
14654
14675
|
.semi-rating-star > div:hover, .semi-rating-star > div:focus {
|
|
14655
14676
|
transform: scale(1.1);
|
|
14656
14677
|
}
|
|
14678
|
+
.semi-rating-star > div.semi-rating-star-disabled {
|
|
14679
|
+
transform: none;
|
|
14680
|
+
}
|
|
14657
14681
|
.semi-rating-star-small {
|
|
14658
14682
|
width: 16px;
|
|
14659
14683
|
height: 16px;
|
|
@@ -14666,6 +14690,10 @@ body[theme-mode=dark], body .semi-always-dark {
|
|
|
14666
14690
|
}
|
|
14667
14691
|
.semi-rating-star-wrapper {
|
|
14668
14692
|
position: relative;
|
|
14693
|
+
overflow: hidden;
|
|
14694
|
+
border-radius: 3px;
|
|
14695
|
+
width: 100%;
|
|
14696
|
+
height: 100%;
|
|
14669
14697
|
}
|
|
14670
14698
|
.semi-rating-star-first, .semi-rating-star-second {
|
|
14671
14699
|
color: var(--semi-color-fill-0);
|