jrs-react 1.0.0 → 1.0.2
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/build/index.es.js +4 -2
- package/build/index.js +4 -2
- package/package.json +5 -2
- package/src/components/JRFields/JRFields.jsx +7 -0
- package/src/components/JRSubmit.js +296 -0
- package/src/components/JRTable/JRTable.jsx +7 -0
- package/src/components/JRUtils.jsx +79 -0
- package/src/components/Test.js +14 -0
- package/src/index.js +9 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jrs-react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"module": "build/index.es.js",
|
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@rollup/plugin-commonjs": "^28.0.3",
|
|
15
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
16
|
+
"axios": "^1.8.3",
|
|
15
17
|
"react": "^19.0.0",
|
|
16
|
-
"react-dom": "^19.0.0"
|
|
18
|
+
"react-dom": "^19.0.0",
|
|
19
|
+
"styled-components": "^6.1.15"
|
|
17
20
|
},
|
|
18
21
|
"devDependencies": {
|
|
19
22
|
"@babel/core": "^7.26.10",
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import axios from 'axios'
|
|
3
|
+
import { colonValueString, flexType, po } from './JRUtils'
|
|
4
|
+
// import { displaySpinner } from '../jrx/LoadingBar'
|
|
5
|
+
// import msg from '../jrx/IMessage'
|
|
6
|
+
import styled from 'styled-components'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const axiosSubmit = axios.create({
|
|
10
|
+
authorization: `Bearer ${localStorage.getItem("accessToken")}`
|
|
11
|
+
,timeout: 120000
|
|
12
|
+
,maxBodyLength: 104857600 //100mb 104857600
|
|
13
|
+
,maxContentLength: 104857600 //100mb
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const StyledCover=styled.div`
|
|
17
|
+
border:2px solid red;
|
|
18
|
+
`
|
|
19
|
+
const Cover=({children})=>{
|
|
20
|
+
return <StyledCover>{children}</StyledCover>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default class JRSubmit extends React.Component {
|
|
24
|
+
#methods = ['get', 'post', 'put','patch','delete','download']
|
|
25
|
+
|
|
26
|
+
constructor(props) {
|
|
27
|
+
super(props)
|
|
28
|
+
if(this.props.value===undefined && this.props.initValue!==undefined ){
|
|
29
|
+
if(this.props.onChange===undefined){
|
|
30
|
+
this.state={
|
|
31
|
+
value:props.initValue
|
|
32
|
+
,rawValue:JSON.parse(JSON.stringify(props.initValue))
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
componentDidMount() {
|
|
38
|
+
this.#methods
|
|
39
|
+
.filter((method) => this[method] && this.props[method] && this.props[method].autoRun)
|
|
40
|
+
.forEach((method) => {
|
|
41
|
+
this[method]()
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
get(_config = {}) {
|
|
45
|
+
const config = Object.assign(
|
|
46
|
+
{
|
|
47
|
+
method:'get'
|
|
48
|
+
,updateValue:true
|
|
49
|
+
// ,updateRawValue:true
|
|
50
|
+
}
|
|
51
|
+
,this.props['get']
|
|
52
|
+
,_config
|
|
53
|
+
)
|
|
54
|
+
this.submit(config)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
post(config = {}) {
|
|
58
|
+
config = Object.assign(
|
|
59
|
+
{
|
|
60
|
+
method:'post'
|
|
61
|
+
,updateValue:false
|
|
62
|
+
}
|
|
63
|
+
,this.props['post']
|
|
64
|
+
,config
|
|
65
|
+
)
|
|
66
|
+
this.submit(config)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
put(config = {}) {
|
|
70
|
+
config = Object.assign(
|
|
71
|
+
{
|
|
72
|
+
method:'put'
|
|
73
|
+
,updateValue:false
|
|
74
|
+
}
|
|
75
|
+
,this.props['put']
|
|
76
|
+
,config
|
|
77
|
+
)
|
|
78
|
+
this.submit(config)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
delete(config = {}) {
|
|
82
|
+
config = Object.assign(
|
|
83
|
+
{
|
|
84
|
+
method:'delete'
|
|
85
|
+
,updateValue:false
|
|
86
|
+
}
|
|
87
|
+
,this.props['delete']
|
|
88
|
+
,config
|
|
89
|
+
)
|
|
90
|
+
this.submit(config)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
get from(){
|
|
94
|
+
return this.props.value===undefined?'state':'props'
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
get isDirty(){
|
|
98
|
+
return this.state?.isDirty
|
|
99
|
+
}
|
|
100
|
+
set isDirty(isDirty){
|
|
101
|
+
this.setState({isDirty})
|
|
102
|
+
}
|
|
103
|
+
get rawValue(){
|
|
104
|
+
return this.state?.rawValue
|
|
105
|
+
}
|
|
106
|
+
setRawValue(rawValue){
|
|
107
|
+
this.setState({rawValue:JSON.parse(JSON.stringify(rawValue??''))})
|
|
108
|
+
}
|
|
109
|
+
reset(){
|
|
110
|
+
this.setValue(this.rawValue,true)
|
|
111
|
+
}
|
|
112
|
+
setValue(value,reset=false){
|
|
113
|
+
if(this.props.onChange){
|
|
114
|
+
this.props.onChange(value)
|
|
115
|
+
}else{
|
|
116
|
+
this.setState({value})
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if(reset){
|
|
120
|
+
this.setRawValue(value)
|
|
121
|
+
}
|
|
122
|
+
this.isDirty=!reset
|
|
123
|
+
}
|
|
124
|
+
setRes(isSuccess,response,config){
|
|
125
|
+
if (isSuccess && config.updateValue) {
|
|
126
|
+
const value=config.formatValue?.bind(this)(response.data)??response.data
|
|
127
|
+
response.data=value
|
|
128
|
+
this.setValue(value,true)
|
|
129
|
+
} else if(config.updateValue){
|
|
130
|
+
this.setValue(null,true)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
#getValueByName(fullnamList,record){
|
|
134
|
+
const name=fullnamList.shift()
|
|
135
|
+
if(fullnamList.length==0){
|
|
136
|
+
return record?.[name]
|
|
137
|
+
}else if(record?.[name]!=null){
|
|
138
|
+
return this.#getValueByName(fullnamList,record[name])
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
getValue(fullname){
|
|
143
|
+
if(fullname){
|
|
144
|
+
const fullnamList=fullname.split('.')
|
|
145
|
+
return this.#getValueByName(fullnamList,this[this.from]?.value)
|
|
146
|
+
}else{
|
|
147
|
+
return flexType(this[this.from]?.value,this,null,null)
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
getSubmitValue(){
|
|
152
|
+
return this.getValue()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
getAxiosParams({url,method,value,extraValue,sendValue,transformValue,...params}){
|
|
156
|
+
const _extraValue=extraValue?.bind?.(this)() ?? extraValue
|
|
157
|
+
// let payload=typeof value === 'function'
|
|
158
|
+
// ?value.bind(this)({
|
|
159
|
+
// ...this.getSubmitValue()
|
|
160
|
+
// ,..._extraValue
|
|
161
|
+
// })
|
|
162
|
+
// :value==null
|
|
163
|
+
// ?{
|
|
164
|
+
// ...this.getSubmitValue()
|
|
165
|
+
// ,..._extraValue
|
|
166
|
+
// }
|
|
167
|
+
// :{
|
|
168
|
+
// ...value
|
|
169
|
+
// ,..._extraValue
|
|
170
|
+
// }
|
|
171
|
+
let payload=value?.bind?.(this)({
|
|
172
|
+
...this.getSubmitValue()
|
|
173
|
+
,..._extraValue
|
|
174
|
+
})
|
|
175
|
+
?? value==null
|
|
176
|
+
?{
|
|
177
|
+
...this.getSubmitValue()
|
|
178
|
+
,..._extraValue
|
|
179
|
+
}
|
|
180
|
+
:{
|
|
181
|
+
...value
|
|
182
|
+
,..._extraValue
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if(transformValue){
|
|
186
|
+
payload=transformValue.bind(this)(payload)
|
|
187
|
+
}
|
|
188
|
+
const headers={
|
|
189
|
+
authorization: `Bearer ${localStorage.getItem("accessToken")}`
|
|
190
|
+
}
|
|
191
|
+
let params1={}
|
|
192
|
+
const params2={}
|
|
193
|
+
if(method=='get'){
|
|
194
|
+
if(sendValue==null || sendValue)params1.params=payload
|
|
195
|
+
params1.headers=headers
|
|
196
|
+
}else if(method=='delete'){
|
|
197
|
+
if(sendValue==null || sendValue)params1.data=payload
|
|
198
|
+
params1.headers=headers
|
|
199
|
+
}else{
|
|
200
|
+
if(sendValue==null || sendValue){
|
|
201
|
+
params1=payload
|
|
202
|
+
}else{
|
|
203
|
+
params1=null
|
|
204
|
+
}
|
|
205
|
+
params2.headers=headers
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
url:colonValueString(url,payload)
|
|
209
|
+
,method
|
|
210
|
+
,params1
|
|
211
|
+
,params2
|
|
212
|
+
,payload
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
reload(){
|
|
217
|
+
po('reload 還沒有做 ')
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
submit(config){
|
|
221
|
+
const me=this
|
|
222
|
+
// displaySpinner({mask:config.mask})++++++++++++++
|
|
223
|
+
this.setState({loading:true})
|
|
224
|
+
let _payload
|
|
225
|
+
;(()=>{
|
|
226
|
+
if (Array.isArray(config.url)) {
|
|
227
|
+
_payload=[]
|
|
228
|
+
return Promise.allSettled(
|
|
229
|
+
config.url.map((_url) => {
|
|
230
|
+
const urlParams=typeof _url === 'object'
|
|
231
|
+
?_url
|
|
232
|
+
:{url: _url}
|
|
233
|
+
const finalConfig=Object.assign(config,urlParams)
|
|
234
|
+
const {url,method,params1,params2,payload}=this.getAxiosParams(finalConfig)
|
|
235
|
+
_payload.push(payload)
|
|
236
|
+
return axiosSubmit[method](url,params1,params2)
|
|
237
|
+
})
|
|
238
|
+
)
|
|
239
|
+
}else{
|
|
240
|
+
const {url,method,params1,params2,payload}=this.getAxiosParams(config)
|
|
241
|
+
_payload=payload
|
|
242
|
+
return axiosSubmit[method](url,params1,params2)
|
|
243
|
+
}
|
|
244
|
+
})()
|
|
245
|
+
.then((res)=>{
|
|
246
|
+
this.handleResponse(res,_payload,config)
|
|
247
|
+
})
|
|
248
|
+
.catch((res)=>{
|
|
249
|
+
this.handleResponse(res,_payload,config)
|
|
250
|
+
})
|
|
251
|
+
.finally(function (a,b,c) {
|
|
252
|
+
me.setState({loading:false})
|
|
253
|
+
// displaySpinner({mask:false})+++++++++++++++++++++++
|
|
254
|
+
})
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
handleResponse=(response,payload,config)=>{
|
|
258
|
+
if(Array.isArray(response)){
|
|
259
|
+
response=response.map((re,index)=>{
|
|
260
|
+
if(re.value){
|
|
261
|
+
re.value.payload=payload[index]
|
|
262
|
+
}else if(re.reason){
|
|
263
|
+
re.reason.payload=payload[index]
|
|
264
|
+
}
|
|
265
|
+
return re
|
|
266
|
+
})
|
|
267
|
+
}else{
|
|
268
|
+
response.payload=payload
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
response = config?.response?.bind(this)(response,payload) ?? response
|
|
272
|
+
const isSuccess = response.status >= 200 && response.status <= 299
|
|
273
|
+
|
|
274
|
+
this.setRes(isSuccess,response,config)
|
|
275
|
+
if (isSuccess) {
|
|
276
|
+
if (config.successMessage) {
|
|
277
|
+
// msg.success({ message:config.successMessage });+++++++++++++++++++++
|
|
278
|
+
}
|
|
279
|
+
} else {
|
|
280
|
+
if (config.failedMessage) {
|
|
281
|
+
// msg.error({ message:config.failedMessage });+++++++++++++++++++++++
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
config.callback?.bind(this)(isSuccess,response,payload)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
renderer(){
|
|
288
|
+
return
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
render() {
|
|
292
|
+
return this.props.cover!=null && this.state?.lodaing
|
|
293
|
+
?<Cover>{flexType(this.props.cover,this,null,null)}</Cover>
|
|
294
|
+
:this.renderer()
|
|
295
|
+
}
|
|
296
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import React from "react"
|
|
2
|
+
|
|
3
|
+
export const po=console.debug
|
|
4
|
+
|
|
5
|
+
export const colonValueString=(string,value)=>{
|
|
6
|
+
const get=typeof value.get ==='function'
|
|
7
|
+
? (value,name)=>{
|
|
8
|
+
return value?.get(name.slice(1)) ?? name
|
|
9
|
+
}
|
|
10
|
+
: (value,name)=>{
|
|
11
|
+
return value?.[name.slice(1)] ?? name
|
|
12
|
+
}
|
|
13
|
+
return Array.from(string.match(/\:\w+/g)??[])
|
|
14
|
+
.reduce((aco,name)=>{
|
|
15
|
+
return aco.replace(new RegExp(name, "g"), get(value,name) );
|
|
16
|
+
},string)
|
|
17
|
+
;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const genData=()=>{
|
|
21
|
+
const fa=1
|
|
22
|
+
// const gData=Array(10).fill(9).map((ff,fa,fd)=>{
|
|
23
|
+
const data=Array(50).fill(9).reduce((acc,f,a,d)=>{
|
|
24
|
+
po(acc,f,a,d)
|
|
25
|
+
acc.push({
|
|
26
|
+
id:a
|
|
27
|
+
,name:`Name ${a}`
|
|
28
|
+
,age:a+28+fa//dayjs//dayjs().add(-a,'day')
|
|
29
|
+
,fullName:{
|
|
30
|
+
firstName:`First Name ${fa}`
|
|
31
|
+
,lastName:`Last Name ${a}`
|
|
32
|
+
}
|
|
33
|
+
,items:Array(5).fill(3).map((f1,a1,d1)=>{
|
|
34
|
+
return {
|
|
35
|
+
id:`IT${a}-${a1}`
|
|
36
|
+
,name:`ITN ${a} ${a1}`
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
return acc
|
|
41
|
+
},[])
|
|
42
|
+
po(data)
|
|
43
|
+
return data
|
|
44
|
+
// })
|
|
45
|
+
|
|
46
|
+
// po(gData)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
export const flexType=(type,me,payload,doElse)=>{
|
|
51
|
+
const result=typeof type==='function'
|
|
52
|
+
?type?.bind(me)(payload)
|
|
53
|
+
:type??doElse
|
|
54
|
+
return result
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const whatType=(
|
|
58
|
+
{type,typeStyle:_typeStyle,render,...config}
|
|
59
|
+
,me
|
|
60
|
+
,doElse
|
|
61
|
+
)=>{
|
|
62
|
+
if(type){
|
|
63
|
+
// const style=flexType(typeStyle,me,{},{})
|
|
64
|
+
// return 'type'
|
|
65
|
+
const typeStyle=typeof _typeStyle==='function'
|
|
66
|
+
?_typeStyle?.bind(me)()
|
|
67
|
+
:_typeStyle
|
|
68
|
+
|
|
69
|
+
return React.createElement(type,{
|
|
70
|
+
style:typeStyle
|
|
71
|
+
|
|
72
|
+
})
|
|
73
|
+
}else if(render){
|
|
74
|
+
return render.bind(me)()
|
|
75
|
+
}else {
|
|
76
|
+
return doElse
|
|
77
|
+
}
|
|
78
|
+
return 'what type'
|
|
79
|
+
}
|