Skip to content

Commit 7e9b01e

Browse files
authored
feat(SlidePane): support loading attribute in slide pane (#428)
1 parent 7a03ffd commit 7e9b01e

File tree

5 files changed

+68
-25
lines changed

5 files changed

+68
-25
lines changed

src/slidePane/__tests/__snapshots__/index.test.tsx.snap

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,23 @@ exports[`test SlidePane snapshot match 1`] = `
2525
class="dtc-slide-pane-content"
2626
role="dialog"
2727
>
28-
<img
29-
alt="closeBtn"
30-
class="dtc-slide-pane-icon"
31-
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAABwCAYAAAAE0LDPAAAAAXNSR0IArs4c6QAAAnlJREFUaEPtmk9IVHEQx78jufpw7ykouuEaBG6dEmrXOmRRt476VgvyEngKlNqQMu3PoSU7iCBq4CW2olNdRMRr7HasnnZb0y57WGODzUDjt/RIonbeyzfQYd51h/m8+c7395u3MOSs5Xexr4dKRLt5AhYJtbPRaNO7velo/4Bf6YhoB8B0R3vzNSLaNr8ECnBRRLTc0d583kBEAJU3J5o6HG0ZkgTs1OBATAxgqqghTIoCiPBeFABQSRggZFOxg/anC0ElYq9JlUglYhVgA9RFKhGrABugLlKJWAXYAHWRSsQqwAaoi1QiVgE2gHVRejKDUKgWQ1cvmj/XbMLfA3jA42dwVvPo7+tBd/xo8ICNzQLG7y3AskIYvz2IcEO9LwhbgcmWebGCpeUcEvEYBvrOBg8ol7cxOjaP4lYJqZEkIm2NniGeKjDZ3mQ/YPbJa7S1NiI1YntuuGeAgTx8lMHqx3XYvWdwOnHMUxW+AJufC7hzdwH1VggTt64gHLZYiC+Ayfb85QoWl3KIn+jEpeS54AHlb98xOjaHYrGEG8M2DkWaqkJ8V2CyZd86mJl7hdaWg7h5PVm14f8EMJD0zxM+ePkCuo4f+WsV/ycgm3MwMy8k0d4mp4ZtRIJusmvTxMlODNgB21T8oLlXRbK3B6cS3maDZxeJXnbudb315Wvl9AZ+XbsDpzseQ3/QA+fTRgET9wVHpvmqcNbWK6PSjEy/D9vkB+mnaLDq5D5b/L6x7+8iBbBNVolUItYDKpFKxCrABqiLVCJWATZAXaQSsQqwAeoilYhVgA1QFzESCS8wia9giS6Rma1B0TU40UU+sVVEoWXK6uugPwBjVkdxauLcgwAAAABJRU5ErkJggg=="
32-
/>
3328
<div
34-
class="dtc-slide-pane-body"
29+
class="ant-spin-nested-loading dtc-slide-pane-nested-loading"
3530
>
36-
Hello World
31+
<div
32+
class="ant-spin-container"
33+
>
34+
<img
35+
alt="closeBtn"
36+
class="dtc-slide-pane-icon"
37+
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAABwCAYAAAAE0LDPAAAAAXNSR0IArs4c6QAAAnlJREFUaEPtmk9IVHEQx78jufpw7ykouuEaBG6dEmrXOmRRt476VgvyEngKlNqQMu3PoSU7iCBq4CW2olNdRMRr7HasnnZb0y57WGODzUDjt/RIonbeyzfQYd51h/m8+c7395u3MOSs5Xexr4dKRLt5AhYJtbPRaNO7velo/4Bf6YhoB8B0R3vzNSLaNr8ECnBRRLTc0d583kBEAJU3J5o6HG0ZkgTs1OBATAxgqqghTIoCiPBeFABQSRggZFOxg/anC0ElYq9JlUglYhVgA9RFKhGrABugLlKJWAXYAHWRSsQqwAaoi1QiVgE2gHVRejKDUKgWQ1cvmj/XbMLfA3jA42dwVvPo7+tBd/xo8ICNzQLG7y3AskIYvz2IcEO9LwhbgcmWebGCpeUcEvEYBvrOBg8ol7cxOjaP4lYJqZEkIm2NniGeKjDZ3mQ/YPbJa7S1NiI1YntuuGeAgTx8lMHqx3XYvWdwOnHMUxW+AJufC7hzdwH1VggTt64gHLZYiC+Ayfb85QoWl3KIn+jEpeS54AHlb98xOjaHYrGEG8M2DkWaqkJ8V2CyZd86mJl7hdaWg7h5PVm14f8EMJD0zxM+ePkCuo4f+WsV/ycgm3MwMy8k0d4mp4ZtRIJusmvTxMlODNgB21T8oLlXRbK3B6cS3maDZxeJXnbudb315Wvl9AZ+XbsDpzseQ3/QA+fTRgET9wVHpvmqcNbWK6PSjEy/D9vkB+mnaLDq5D5b/L6x7+8iBbBNVolUItYDKpFKxCrABqiLVCJWATZAXaQSsQqwAeoilYhVgA1QFzESCS8wia9giS6Rma1B0TU40UU+sVVEoWXK6uugPwBjVkdxauLcgwAAAABJRU5ErkJggg=="
38+
/>
39+
<div
40+
class="dtc-slide-pane-body"
41+
>
42+
Hello World
43+
</div>
44+
</div>
3745
</div>
3846
</div>
3947
</div>

src/slidePane/__tests/index.test.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@ describe('test SlidePane ', () => {
1313
const { container } = render(<SlidePane visible={false}>Hello World</SlidePane>);
1414
expect(container).not.toHaveClass();
1515
});
16+
test('should render loading correct ', () => {
17+
const { unmount } = render(<SlidePane visible>Hello World</SlidePane>);
18+
const dom = document.querySelector('.ant-spin-spinning');
19+
expect(dom).toBe(null);
20+
unmount();
21+
render(
22+
<SlidePane visible loading>
23+
Hello World
24+
</SlidePane>
25+
);
26+
const domLoading = document.querySelector('.ant-spin-spinning');
27+
expect(domLoading).not.toBe(null);
28+
});
1629
test('should render mask correct ', () => {
1730
const { unmount } = render(<SlidePane visible>Hello World</SlidePane>);
1831
const dom = document.querySelector('.dtc-slide-pane-mask');

src/slidePane/demos/basic.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { SlidePane } from 'dt-react-component';
44

55
export default () => {
66
const [visible, setVisible] = useState(false);
7+
const [loading, setLoading] = useState(false);
78
const [width, setWidth] = useState(80);
89

910
return (
@@ -15,11 +16,21 @@ export default () => {
1516
onChange={(value: number) => setWidth(value)}
1617
/>
1718
<span>width:{width}%</span>
18-
<Button style={{ margin: '10px' }} onClick={() => setVisible((v) => !v)}>
19+
<Button
20+
style={{ margin: '10px' }}
21+
onClick={() => {
22+
setVisible((v) => !v);
23+
setLoading(true);
24+
setTimeout(() => {
25+
setLoading(false);
26+
}, 3000);
27+
}}
28+
>
1929
click me
2030
</Button>
2131
<SlidePane
2232
visible={visible}
33+
loading={loading}
2334
width={`${width}%`}
2435
onClose={() => setVisible(false)}
2536
title="title"

src/slidePane/index.tsx

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { CSSProperties, KeyboardEvent, MouseEvent, useEffect, useState } from 'react';
2-
import { Tabs } from 'antd';
2+
import { Spin, Tabs } from 'antd';
33
import classNames from 'classnames';
44
import RcDrawer from 'rc-drawer';
55

@@ -17,6 +17,7 @@ type TabKey<T extends readOnlyTab> = T[number]['key'];
1717

1818
type TabsSlidePane<T extends readOnlyTab> = {
1919
visible: boolean;
20+
loading?: boolean;
2021
rootClassName?: string;
2122
bodyClassName?: string;
2223
width?: number | string;
@@ -32,6 +33,7 @@ type TabsSlidePane<T extends readOnlyTab> = {
3233

3334
type NormalSlidePane = {
3435
visible: boolean;
36+
loading?: boolean;
3537
rootClassName?: string;
3638
bodyClassName?: string;
3739
width?: number | string;
@@ -54,6 +56,7 @@ const SlidePane = <T extends readOnlyTab>(props: SlidePaneProps<T>) => {
5456

5557
const {
5658
visible,
59+
loading = false,
5760
rootClassName,
5861
bodyClassName,
5962
mask = false,
@@ -94,23 +97,28 @@ const SlidePane = <T extends readOnlyTab>(props: SlidePaneProps<T>) => {
9497
rootClassName={rootClassName}
9598
{...motionProps}
9699
>
97-
{!mask && renderButton()}
98-
{title && <div className={`${slidePrefixCls}-header`}>{title}</div>}
99-
{isFunction(props) && (
100-
<Tabs
101-
destroyInactiveTabPane
102-
activeKey={tabKey}
103-
onChange={setTabKey}
104-
className={`${slidePrefixCls}-tabs`}
100+
<Spin wrapperClassName={`${slidePrefixCls}-nested-loading`} spinning={loading}>
101+
{!mask && renderButton()}
102+
{title && <div className={`${slidePrefixCls}-header`}>{title}</div>}
103+
{isFunction(props) && (
104+
<Tabs
105+
destroyInactiveTabPane
106+
activeKey={tabKey}
107+
onChange={setTabKey}
108+
className={`${slidePrefixCls}-tabs`}
109+
>
110+
{props.tabs?.map((tab: { key: string; title: React.ReactNode }) => (
111+
<Tabs.TabPane tab={tab.title} key={tab.key} />
112+
))}
113+
</Tabs>
114+
)}
115+
<div
116+
className={classNames(`${slidePrefixCls}-body`, bodyClassName)}
117+
style={bodyStyle}
105118
>
106-
{props.tabs?.map((tab: { key: string; title: React.ReactNode }) => (
107-
<Tabs.TabPane tab={tab.title} key={tab.key} />
108-
))}
109-
</Tabs>
110-
)}
111-
<div className={classNames(`${slidePrefixCls}-body`, bodyClassName)} style={bodyStyle}>
112-
{typeof children === 'function' ? children(tabKey) : children}
113-
</div>
119+
{typeof children === 'function' ? children(tabKey) : children}
120+
</div>
121+
</Spin>
114122
</RcDrawer>
115123
);
116124
};

src/slidePane/style.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ $prefix: "dtc-slide-pane";
7575
z-index: 999;
7676
cursor: pointer;
7777
}
78+
&-nested-loading {
79+
height: 100%;
80+
}
7881
}
7982

8083
$duration: 0.3s;

0 commit comments

Comments
 (0)