Skip to content

Commit 0781c4a

Browse files
committed
fix: CProgress: rewrite component similar to Vue version
1 parent 51ad5f4 commit 0781c4a

File tree

4 files changed

+119
-86
lines changed

4 files changed

+119
-86
lines changed

package.json

-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
"core-js": "^3.6.5",
4848
"lodash.isfunction": "^3.0.9",
4949
"lodash.isobject": "^3.0.2",
50-
"lodash.tonumber": "^4.0.3",
5150
"prop-types": "^15.7.2",
5251
"react-onclickout": "^2.0.8",
5352
"react-perfect-scrollbar": "~1.5.8",

src/CProgress.js

+44-85
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,85 @@
1-
import React from 'react';
2-
import PropTypes from 'prop-types';
3-
import classNames from 'classnames';
4-
import toNumber from 'lodash.tonumber';
5-
import {tagPropType, mapToCssModules} from './Shared/helper.js';
1+
import React from 'react'
2+
import PropTypes from 'prop-types'
3+
import classNames from 'classnames'
4+
import { mapToCssModules } from './Shared/helper.js'
5+
import CProgressBar from './CProgressBar'
66

7+
export const Context = React.createContext({})
78
//component - CoreUI / CProgress
89

9-
const CProgress = props=>{
10+
const CProgress = props => {
1011

1112
const {
12-
tag: Tag,
1313
children,
1414
className,
1515
cssModule,
1616
//
1717
innerRef,
18-
barClassName,
19-
barProps,
20-
height,
21-
value,
22-
max,
23-
animated,
24-
striped,
18+
size,
2519
color,
26-
bar,
27-
multi,
20+
striped,
21+
animated,
22+
precision,
2823
showPercentage,
2924
showValue,
30-
precision,
31-
size,
25+
max,
26+
value,
3227
...attributes
33-
} = props;
28+
} = props
3429

35-
let valueNumber = toNumber(value);
36-
let percent = (valueNumber / toNumber(max)) * 100;
37-
38-
// render
30+
const inheritedProps = {
31+
color,
32+
striped,
33+
animated,
34+
precision,
35+
showPercentage,
36+
showValue,
37+
max,
38+
value
39+
}
3940

4041
const progressClasses = mapToCssModules(classNames(
41-
className,
42-
size ? 'progress-'+size : null,
43-
'progress'
44-
), cssModule);
45-
46-
const progressBarClasses = mapToCssModules(classNames(
47-
'progress-bar',
48-
bar ? className || barClassName : barClassName,
49-
animated ? 'progress-bar-animated' : null,
50-
color ? `bg-${color}` : null,
51-
striped || animated ? 'progress-bar-striped' : null
52-
), cssModule);
42+
'progress',
43+
size && 'progress-' + size,
44+
className
45+
), cssModule)
5346

54-
if (precision)
55-
percent = percent.toPrecision(precision);
56-
if (precision)
57-
valueNumber = valueNumber.toPrecision(precision);
58-
59-
const ProgressBar = multi ? children : (
60-
<div
61-
className={progressBarClasses}
62-
style={{ width: `${percent}%` }}
63-
role="progressbar"
64-
aria-valuenow={value}
65-
aria-valuemin="0"
66-
aria-valuemax={max}
67-
{...barProps}
47+
// render
48+
return (
49+
<div
50+
className={progressClasses}
51+
{...attributes}
52+
ref={innerRef}
6853
>
69-
{showPercentage?percent+'%': showValue?value: children}
54+
<Context.Provider value={{ inheritedProps }}>
55+
{ children || <CProgressBar/>}
56+
</Context.Provider>
7057
</div>
71-
);
72-
73-
if (bar) {
74-
return ProgressBar;
75-
}
76-
77-
let style;
78-
if (height)
79-
style = {height};
80-
else
81-
style = {};
82-
83-
return (
84-
<Tag {...attributes} style={style} className={progressClasses} ref={innerRef}>
85-
{ProgressBar}
86-
</Tag>
87-
);
58+
)
8859

8960
}
9061

9162
CProgress.propTypes = {
92-
tag: tagPropType,
9363
children: PropTypes.node,
9464
className: PropTypes.string,
9565
cssModule: PropTypes.object,
9666
//
9767
innerRef: PropTypes.oneOfType([PropTypes.object, PropTypes.func, PropTypes.string]),
98-
barClassName: PropTypes.string,
99-
barProps: PropTypes.object,
100-
height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
101-
bar: PropTypes.bool,
102-
multi: PropTypes.bool,
103-
value: PropTypes.oneOfType([
104-
PropTypes.string,
105-
PropTypes.number,
106-
]),
107-
max: PropTypes.oneOfType([
108-
PropTypes.string,
109-
PropTypes.number,
110-
]),
68+
size: PropTypes.string,
69+
value: PropTypes.oneOfType([PropTypes.string,PropTypes.number]),
70+
max: PropTypes.oneOfType([PropTypes.string,PropTypes.number]),
11171
animated: PropTypes.bool,
11272
striped: PropTypes.bool,
11373
color: PropTypes.string,
11474
precision: PropTypes.number,
11575
showPercentage: PropTypes.bool,
116-
showValue: PropTypes.bool,
117-
size: PropTypes.string
76+
showValue: PropTypes.bool
11877
};
11978

12079
CProgress.defaultProps = {
121-
tag: 'div',
12280
value: 0,
12381
max: 100,
82+
precision: 0
12483
};
12584

126-
export default CProgress;
85+
export default CProgress

src/CProgressBar.js

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import React, { useContext } from 'react'
2+
import PropTypes from 'prop-types'
3+
import classNames from 'classnames'
4+
import { mapToCssModules } from './Shared/helper.js'
5+
import { Context } from './CProgress'
6+
//component - CoreUI / CProgressBar
7+
8+
const CProgressBar = directProps => {
9+
10+
const { inheritedProps } = useContext(Context)
11+
const props = {...inheritedProps, ...directProps }
12+
13+
const {
14+
children,
15+
className,
16+
cssModule,
17+
//
18+
innerRef,
19+
color,
20+
striped,
21+
animated,
22+
precision,
23+
showPercentage,
24+
showValue,
25+
max,
26+
value,
27+
...attributes
28+
} = props
29+
30+
// render
31+
const progressBarClasses = mapToCssModules(classNames(
32+
'progress-bar',
33+
animated && 'progress-bar-animated',
34+
striped || animated && 'progress-bar-striped',
35+
color && `bg-${color}`,
36+
className
37+
), cssModule)
38+
39+
const valLabel = Number(value).toFixed(precision)
40+
const percentLabel = Number((value / max) * 100).toFixed(precision) + '%'
41+
42+
return (
43+
<div
44+
className={progressBarClasses}
45+
style={{ width: `${(value / max) * 100}%` }}
46+
role="progressbar"
47+
aria-valuenow={value}
48+
aria-valuemin="0"
49+
aria-valuemax={max}
50+
{...attributes}
51+
ref={innerRef}
52+
>
53+
{ showPercentage ? percentLabel : showValue ? valLabel : children }
54+
</div>
55+
)
56+
}
57+
58+
CProgressBar.propTypes = {
59+
children: PropTypes.node,
60+
className: PropTypes.string,
61+
cssModule: PropTypes.object,
62+
//
63+
innerRef: PropTypes.oneOfType([PropTypes.object, PropTypes.func, PropTypes.string]),
64+
value: PropTypes.number,
65+
max: PropTypes.number,
66+
animated: PropTypes.bool,
67+
striped: PropTypes.bool,
68+
color: PropTypes.string,
69+
precision: PropTypes.number,
70+
showPercentage: PropTypes.bool,
71+
showValue: PropTypes.bool
72+
};
73+
74+
export default CProgressBar

src/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export {default as CTabPane} from './CTabPane';
3434
export {default as CTabContent} from './CTabContent';
3535
export {default as CPopover} from './CPopover';
3636
export {default as CProgress} from './CProgress';
37+
export {default as CProgressBar} from './CProgressBar';
3738
// export {default as CPortal} from './CPortal';
3839
export {default as CDropdown} from './CDropdown';
3940
export {default as CDropdownDivider} from './CDropdownDivider';

0 commit comments

Comments
 (0)