jrs-react 1.2.19 → 1.2.20
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 +327 -132
- package/build/index.js +330 -132
- package/package.json +2 -1
- package/src/app/App.css +12 -1
- package/src/app/App.jsx +2 -0
- package/src/app/dev/devApp.jsx +146 -0
- package/src/app/dev/tobeimport.js +7 -0
- package/src/app/test/index.jsx +44 -4
- package/src/components/JRMask/JRMask.jsx +204 -0
- package/src/components/JRSubmit.jsx +13 -8
- package/src/components/JRUtils.jsx +4 -0
- package/src/components/JRWindow/TitleBar.jsx +1 -21
- package/src/index.js +4 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { JRHTML } from "jrs-js"
|
|
2
|
+
import { useEffect, useRef } from "react"
|
|
3
|
+
import { po, random } from "../../components/JRUtils"
|
|
4
|
+
import MyFunction from "./tobeimport"
|
|
5
|
+
import JRMask, { showMask } from "../../components/JRMask/JRMask"
|
|
6
|
+
import JRFields from "../../components/JRFields/JRFields"
|
|
7
|
+
import JRTable from "../../components/JRTable/JRTable"
|
|
8
|
+
import JRSelect from "../../components/JRInput/JRSelect"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
const removeFunctions={}
|
|
13
|
+
export default function DevApp() {
|
|
14
|
+
const tRef=useRef()
|
|
15
|
+
const fRef=useRef()
|
|
16
|
+
const sRef=useRef()
|
|
17
|
+
const no=5
|
|
18
|
+
|
|
19
|
+
useEffect(()=>{
|
|
20
|
+
// showMask('JRMask',null,'jr-mask')
|
|
21
|
+
},[])
|
|
22
|
+
return <div id={'dev'}>
|
|
23
|
+
<JRMask />
|
|
24
|
+
|
|
25
|
+
<button
|
|
26
|
+
onClick={()=>{
|
|
27
|
+
po(random())
|
|
28
|
+
}}
|
|
29
|
+
>
|
|
30
|
+
Random
|
|
31
|
+
</button>
|
|
32
|
+
|
|
33
|
+
<button
|
|
34
|
+
onClick={()=>{
|
|
35
|
+
const removeFunction=showMask('JRMask',null,'jr-mask')
|
|
36
|
+
removeFunction()
|
|
37
|
+
}}
|
|
38
|
+
>
|
|
39
|
+
JRMask
|
|
40
|
+
</button>
|
|
41
|
+
|
|
42
|
+
<button
|
|
43
|
+
onClick={()=>{
|
|
44
|
+
const removeFunction=showMask('Default')
|
|
45
|
+
removeFunction()
|
|
46
|
+
}}
|
|
47
|
+
>
|
|
48
|
+
Default
|
|
49
|
+
</button>
|
|
50
|
+
<br/>
|
|
51
|
+
|
|
52
|
+
<button
|
|
53
|
+
onClick={()=>{
|
|
54
|
+
setTimeout(()=>{tRef.current.get({mask:random(2000,100)})},random(4000,100))
|
|
55
|
+
setTimeout(()=>{fRef.current.get()},random(3000,100))
|
|
56
|
+
setTimeout(()=>{sRef.current.get()},random(2000,100))
|
|
57
|
+
}}
|
|
58
|
+
>
|
|
59
|
+
Get all
|
|
60
|
+
</button>
|
|
61
|
+
<br/>
|
|
62
|
+
{
|
|
63
|
+
Array(no).fill().map((f,a,i)=>{
|
|
64
|
+
return <button
|
|
65
|
+
key={a}
|
|
66
|
+
onClick={()=>{
|
|
67
|
+
removeFunctions[a]=showMask(`message ${a}`,null,'jr-mask')
|
|
68
|
+
|
|
69
|
+
}}
|
|
70
|
+
>
|
|
71
|
+
Add {a}
|
|
72
|
+
</button>
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
<br/>
|
|
76
|
+
{
|
|
77
|
+
Array(no).fill().map((f,a,i)=>{
|
|
78
|
+
return <button
|
|
79
|
+
key={a}
|
|
80
|
+
onClick={()=>{
|
|
81
|
+
removeFunctions[a]?.()
|
|
82
|
+
}}
|
|
83
|
+
>
|
|
84
|
+
del {a}
|
|
85
|
+
</button>
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
<JRFields
|
|
89
|
+
ref={fRef}
|
|
90
|
+
get={{
|
|
91
|
+
url:'data.json'
|
|
92
|
+
// ,autoRun:true
|
|
93
|
+
,mask:'JRFields loading'
|
|
94
|
+
}}
|
|
95
|
+
columns={[
|
|
96
|
+
{name:'name'}
|
|
97
|
+
]}
|
|
98
|
+
left={function(){
|
|
99
|
+
return <div>
|
|
100
|
+
<button
|
|
101
|
+
onClick={()=>{
|
|
102
|
+
this.get({
|
|
103
|
+
mask:'Field is loading'
|
|
104
|
+
})
|
|
105
|
+
}}
|
|
106
|
+
>Get</button>
|
|
107
|
+
</div>
|
|
108
|
+
}}
|
|
109
|
+
/>
|
|
110
|
+
<JRTable
|
|
111
|
+
ref={tRef}
|
|
112
|
+
get={{
|
|
113
|
+
url:'list.json'
|
|
114
|
+
// ,autoRun:true
|
|
115
|
+
,mask:'JRTable loading'
|
|
116
|
+
}}
|
|
117
|
+
style={{
|
|
118
|
+
height:'50px'
|
|
119
|
+
}}
|
|
120
|
+
columns={[
|
|
121
|
+
{name:'name'}
|
|
122
|
+
]}
|
|
123
|
+
left={function(){
|
|
124
|
+
return <div>
|
|
125
|
+
<button
|
|
126
|
+
onClick={()=>{
|
|
127
|
+
this.get({
|
|
128
|
+
mask:'Table is loading'
|
|
129
|
+
})
|
|
130
|
+
}}
|
|
131
|
+
>Get</button>
|
|
132
|
+
</div>
|
|
133
|
+
}}
|
|
134
|
+
/>
|
|
135
|
+
<JRSelect
|
|
136
|
+
ref={sRef}
|
|
137
|
+
get={{
|
|
138
|
+
url:'list.json'
|
|
139
|
+
,autoRun:true
|
|
140
|
+
,mask:'JRSelect is loading'
|
|
141
|
+
}}
|
|
142
|
+
labelName={'name'}
|
|
143
|
+
valueName={'id'}
|
|
144
|
+
/>
|
|
145
|
+
</div>
|
|
146
|
+
}
|
package/src/app/test/index.jsx
CHANGED
|
@@ -1,8 +1,48 @@
|
|
|
1
|
-
import React, { useEffect } from "react"
|
|
2
|
-
|
|
1
|
+
import React, { useEffect, useRef, useState } from "react"
|
|
2
|
+
import { po } from "../../components/JRUtils"
|
|
3
|
+
import JRFields from "../../components/JRFields/JRFields"
|
|
4
|
+
import JRFrame from "../../components/JRFrame/JRFrame"
|
|
5
|
+
import styled from "styled-components"
|
|
3
6
|
|
|
7
|
+
const StyledDialog=styled.dialog`
|
|
8
|
+
`
|
|
9
|
+
class JRDialog extends JRFrame {
|
|
10
|
+
renderer(){
|
|
11
|
+
return <StyledDialog open>
|
|
12
|
+
Dialog
|
|
13
|
+
{super.renderer()}
|
|
14
|
+
</StyledDialog>
|
|
15
|
+
}
|
|
16
|
+
}
|
|
4
17
|
export default function TestApp(){
|
|
18
|
+
const ref=useRef()
|
|
19
|
+
const [open,setOpen]=useState(false)
|
|
5
20
|
useEffect(()=>{
|
|
6
|
-
|
|
7
|
-
|
|
21
|
+
if(open){
|
|
22
|
+
po('open',open)
|
|
23
|
+
ref.current.showModal()
|
|
24
|
+
}else{
|
|
25
|
+
po('close',open)
|
|
26
|
+
ref.current.close()
|
|
27
|
+
}
|
|
28
|
+
},[open])
|
|
29
|
+
return <div>
|
|
30
|
+
isOpen={open+''}
|
|
31
|
+
<button onClick={()=>{
|
|
32
|
+
// ref.current.showModal();
|
|
33
|
+
po(true)
|
|
34
|
+
setOpen(true)
|
|
35
|
+
}}>open dialog</button>
|
|
36
|
+
|
|
37
|
+
<StyledDialog id="dialog" ref={ref} >
|
|
38
|
+
<JRFields/>
|
|
39
|
+
<p>I'm a dialog.</p>
|
|
40
|
+
<button
|
|
41
|
+
onClick={()=>{
|
|
42
|
+
// ref.current.close();
|
|
43
|
+
setOpen(false)
|
|
44
|
+
}}
|
|
45
|
+
>Close</button>
|
|
46
|
+
</StyledDialog>
|
|
47
|
+
</div>
|
|
8
48
|
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { JRHTML } from "jrs-js"
|
|
2
|
+
import { po } from "../JRUtils"
|
|
3
|
+
import styled from "styled-components"
|
|
4
|
+
|
|
5
|
+
const StyledMask = styled.dialog`
|
|
6
|
+
display:none;
|
|
7
|
+
&:open{
|
|
8
|
+
display:flex;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
&:modal {
|
|
12
|
+
outline: 0;
|
|
13
|
+
background: #000c6e77;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
#jr-mask-msg{
|
|
17
|
+
padding: 10px;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
max-width: 100vw;
|
|
21
|
+
max-height: 100vh;
|
|
22
|
+
|
|
23
|
+
width: 100vw;
|
|
24
|
+
height: 100vh;
|
|
25
|
+
|
|
26
|
+
border:0;
|
|
27
|
+
margin: 0;
|
|
28
|
+
top: 0;
|
|
29
|
+
left: 0;
|
|
30
|
+
|
|
31
|
+
user-select: none;
|
|
32
|
+
cursor: wait;
|
|
33
|
+
flex-direction: column;
|
|
34
|
+
justify-content: center;
|
|
35
|
+
align-items: center;
|
|
36
|
+
position: fixed;
|
|
37
|
+
|
|
38
|
+
z-index: 20000;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
|
|
41
|
+
.cs-loader-inner {
|
|
42
|
+
transform: translateY(-30%);
|
|
43
|
+
width: calc(100% - 200xpx);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.cs-loader-inner label {
|
|
47
|
+
font-size: 20px;
|
|
48
|
+
opacity: 0;
|
|
49
|
+
display:inline-block;
|
|
50
|
+
color:white;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@keyframes lol {
|
|
54
|
+
0% {
|
|
55
|
+
opacity: 0;
|
|
56
|
+
transform: translateX(-300px);
|
|
57
|
+
}
|
|
58
|
+
33% {
|
|
59
|
+
opacity: 1;
|
|
60
|
+
transform: translateX(0px);
|
|
61
|
+
}
|
|
62
|
+
66% {
|
|
63
|
+
opacity: 1;
|
|
64
|
+
transform: translateX(0px);
|
|
65
|
+
}
|
|
66
|
+
100% {
|
|
67
|
+
opacity: 0;
|
|
68
|
+
transform: translateX(300px);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@-webkit-keyframes lol {
|
|
73
|
+
0% {
|
|
74
|
+
opacity: 0;
|
|
75
|
+
-webkit-transform: translateX(-300px);
|
|
76
|
+
}
|
|
77
|
+
33% {
|
|
78
|
+
opacity: 1;
|
|
79
|
+
-webkit-transform: translateX(0px);
|
|
80
|
+
}
|
|
81
|
+
66% {
|
|
82
|
+
opacity: 1;
|
|
83
|
+
-webkit-transform: translateX(0px);
|
|
84
|
+
}
|
|
85
|
+
100% {
|
|
86
|
+
opacity: 0;
|
|
87
|
+
-webkit-transform: translateX(300px);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.cs-loader-inner label:nth-child(6) {
|
|
92
|
+
-webkit-animation: lol 3s infinite ease-in-out;
|
|
93
|
+
animation: lol 3s infinite ease-in-out;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.cs-loader-inner label:nth-child(5) {
|
|
97
|
+
-webkit-animation: lol 3s 100ms infinite ease-in-out;
|
|
98
|
+
animation: lol 3s 100ms infinite ease-in-out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.cs-loader-inner label:nth-child(4) {
|
|
102
|
+
-webkit-animation: lol 3s 200ms infinite ease-in-out;
|
|
103
|
+
animation: lol 3s 200ms infinite ease-in-out;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.cs-loader-inner label:nth-child(3) {
|
|
107
|
+
-webkit-animation: lol 3s 300ms infinite ease-in-out;
|
|
108
|
+
animation: lol 3s 300ms infinite ease-in-out;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.cs-loader-inner label:nth-child(2) {
|
|
112
|
+
-webkit-animation: lol 3s 400ms infinite ease-in-out;
|
|
113
|
+
animation: lol 3s 400ms infinite ease-in-out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.cs-loader-inner label:nth-child(1) {
|
|
117
|
+
-webkit-animation: lol 3s 500ms infinite ease-in-out;
|
|
118
|
+
animation: lol 3s 500ms infinite ease-in-out;
|
|
119
|
+
}
|
|
120
|
+
`
|
|
121
|
+
|
|
122
|
+
export default function JRMask({id='jr-mask'}){
|
|
123
|
+
return <StyledMask id={id} className={'jr-mask'}>
|
|
124
|
+
<div id={'jr-mask-msg'} ></div>
|
|
125
|
+
<div className="cs-loader-inner">
|
|
126
|
+
<label>●</label>
|
|
127
|
+
<label>●</label>
|
|
128
|
+
<label>●</label>
|
|
129
|
+
<label>●</label>
|
|
130
|
+
<label>●</label>
|
|
131
|
+
<label>●</label>
|
|
132
|
+
</div>
|
|
133
|
+
</StyledMask>
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class Mask extends JRHTML{
|
|
140
|
+
msg=[]
|
|
141
|
+
#msgIndex=0
|
|
142
|
+
#mask
|
|
143
|
+
get msgIndex(){
|
|
144
|
+
return this.#msgIndex++
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
addMsg(msg){
|
|
148
|
+
const index=this.msgIndex
|
|
149
|
+
this.msg.push({
|
|
150
|
+
i:index
|
|
151
|
+
,msg
|
|
152
|
+
})
|
|
153
|
+
this.renderMsg()
|
|
154
|
+
return ()=>{
|
|
155
|
+
po('remove function', index)
|
|
156
|
+
this.removeMsg(index)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
removeMsg(index){
|
|
160
|
+
this.msg=this.msg.filter(r=>r.i!=index)
|
|
161
|
+
this.renderMsg()
|
|
162
|
+
}
|
|
163
|
+
renderMsg(){
|
|
164
|
+
this.msgDiv.removeAllHijos()
|
|
165
|
+
if(this.msg.length){
|
|
166
|
+
this.msgDiv.agregarHijo(
|
|
167
|
+
new JRHTML({
|
|
168
|
+
yo:'div'
|
|
169
|
+
,textContent:this.msg[this.msg.length-1].msg
|
|
170
|
+
})
|
|
171
|
+
)
|
|
172
|
+
if(!this.yo.open){
|
|
173
|
+
this.yo.showModal()
|
|
174
|
+
}
|
|
175
|
+
}else{
|
|
176
|
+
this.yo.close()
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
get msg(){
|
|
180
|
+
return 'msg'
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export function showMask(msg,maskTarget,whichMask){
|
|
185
|
+
const jrMask=document.getElementById('jr-mask')
|
|
186
|
+
const jrMaskMsg=document.getElementById('jr-mask-msg')
|
|
187
|
+
|
|
188
|
+
if(!jrMask.maskDiv){
|
|
189
|
+
jrMask.maskDiv=new Mask({
|
|
190
|
+
yo:jrMask
|
|
191
|
+
,msgDiv:new JRHTML({
|
|
192
|
+
yo:jrMaskMsg
|
|
193
|
+
})
|
|
194
|
+
,listeners:{
|
|
195
|
+
keydown(e){
|
|
196
|
+
if (e.key === 'Escape') {
|
|
197
|
+
e.preventDefault();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
return jrMask.maskDiv.addMsg(msg)
|
|
204
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import axios from 'axios'
|
|
3
|
-
import { colonValueString, flexType, po } from './JRUtils'
|
|
4
|
-
import { displaySpinner } from './LoadingBar'
|
|
3
|
+
import { colonValueString, flexType, po, random } from './JRUtils'
|
|
5
4
|
import styled from 'styled-components'
|
|
5
|
+
import { showMask } from './JRMask/JRMask'
|
|
6
6
|
|
|
7
7
|
const axiosSubmit = axios.create({
|
|
8
8
|
authorization: `Bearer ${localStorage.getItem("accessToken")}`
|
|
@@ -218,9 +218,11 @@ export default class JRSubmit extends React.Component {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
submit(config){
|
|
221
|
-
const me=this
|
|
222
|
-
displaySpinner({mask:config.mask})
|
|
223
|
-
this.setState({loading:true})
|
|
221
|
+
// const me=this
|
|
222
|
+
// displaySpinner({mask:config.mask})
|
|
223
|
+
// this.setState({loading:true})//拿掉可能會有問題, 先觀察看看
|
|
224
|
+
if(config.mask) config.removeMaskFunction=showMask(config.mask,null,'jr-mask')
|
|
225
|
+
|
|
224
226
|
let _payload
|
|
225
227
|
;(()=>{
|
|
226
228
|
if (Array.isArray(config.url)) {
|
|
@@ -248,9 +250,12 @@ export default class JRSubmit extends React.Component {
|
|
|
248
250
|
.catch((res)=>{
|
|
249
251
|
this.handleResponse(res,_payload,config)
|
|
250
252
|
})
|
|
251
|
-
.finally(
|
|
252
|
-
|
|
253
|
-
displaySpinner({mask:false})
|
|
253
|
+
.finally(()=> {
|
|
254
|
+
// this.setState({loading:false})
|
|
255
|
+
// displaySpinner({mask:false})
|
|
256
|
+
// setTimeout(()=>{
|
|
257
|
+
config.removeMaskFunction?.()
|
|
258
|
+
// },random(4000,1000))
|
|
254
259
|
})
|
|
255
260
|
}
|
|
256
261
|
|
|
@@ -107,7 +107,6 @@ export default class TitleBar extends React.Component{
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
floatScreen=(e)=>{
|
|
110
|
-
po('floatScreen')
|
|
111
110
|
const w=this.props.windowRef.current
|
|
112
111
|
const {clientX,clientY}=e
|
|
113
112
|
|
|
@@ -119,8 +118,6 @@ export default class TitleBar extends React.Component{
|
|
|
119
118
|
document.body.style.overflow=this.props.window.orgBodyOverflow
|
|
120
119
|
}
|
|
121
120
|
fullScreen=(e)=>{
|
|
122
|
-
po('fullScreen',this.props.thick)
|
|
123
|
-
|
|
124
121
|
this.props.windowRef.current.style.transition='var(--transition-x-y), left .05s ease-in'
|
|
125
122
|
this.props.windowRef.current.style.left=`${-this.props.thick}px`
|
|
126
123
|
this.props.windowRef.current.style.top=`${-this.props.thick}px`
|
|
@@ -134,7 +131,6 @@ export default class TitleBar extends React.Component{
|
|
|
134
131
|
|
|
135
132
|
}
|
|
136
133
|
stop=(e)=>{
|
|
137
|
-
po('stop')
|
|
138
134
|
e.preventDefault()
|
|
139
135
|
if(this.moved){
|
|
140
136
|
const {clientX,clientY}=e
|
|
@@ -155,7 +151,6 @@ export default class TitleBar extends React.Component{
|
|
|
155
151
|
|
|
156
152
|
}
|
|
157
153
|
move=(e)=>{
|
|
158
|
-
po('move')
|
|
159
154
|
e.preventDefault()
|
|
160
155
|
this.moved=true
|
|
161
156
|
const {clientX,clientY}=e
|
|
@@ -169,32 +164,18 @@ export default class TitleBar extends React.Component{
|
|
|
169
164
|
this.y=w.offsetTop - this.pos2
|
|
170
165
|
this.x=w.offsetLeft - this.pos1
|
|
171
166
|
|
|
172
|
-
// if(this.props.window.orgWidth){
|
|
173
|
-
// w.style.width=`${this.props.window.orgWidth}px`
|
|
174
|
-
// this.props.window.orgWidth=null
|
|
175
|
-
// }
|
|
176
|
-
|
|
177
167
|
this.y=this.y<-this.props.thick?-this.props.thick:this.y
|
|
178
168
|
w.style.transition='unset'
|
|
179
169
|
w.style.top = `${this.y}px`
|
|
180
170
|
w.style.left = `${this.x}px`
|
|
181
171
|
}
|
|
182
172
|
preMove=(e)=>{
|
|
183
|
-
console.clear()
|
|
184
|
-
po('preMove')
|
|
185
|
-
|
|
186
173
|
const w=this.props.windowRef.current
|
|
187
174
|
const {clientX,clientY,...oe}=e
|
|
188
|
-
po('e',e)
|
|
189
175
|
|
|
190
176
|
const {x,y,width,height}=w.getBoundingClientRect()
|
|
191
|
-
po('width',width)
|
|
192
177
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
w.style.transition='left .05s ease-in, height .05s ease-in'
|
|
178
|
+
w.style.transition='left .05s ease-in, height .05s ease-in'
|
|
198
179
|
if(y<=0){
|
|
199
180
|
// contt browserWidth=
|
|
200
181
|
const w1=window.innerWidth-(this.props.thick*2)
|
|
@@ -220,7 +201,6 @@ w.style.transition='left .05s ease-in, height .05s ease-in'
|
|
|
220
201
|
window.removeEventListener('mousemove',this.preMove)
|
|
221
202
|
}
|
|
222
203
|
start(e){
|
|
223
|
-
po('start')
|
|
224
204
|
e.preventDefault()
|
|
225
205
|
this.moved=false
|
|
226
206
|
this.pos3 = e.clientX
|
package/src/index.js
CHANGED
|
@@ -10,11 +10,14 @@ import JRSelect from './components/JRInput/JRSelect'
|
|
|
10
10
|
import JRCheckbox from './components/JRInput/JRCheckbox'
|
|
11
11
|
import JRRadio from './components/JRInput/JRRadio'
|
|
12
12
|
import JRText from './components/JRInput/JRText'
|
|
13
|
-
|
|
13
|
+
import JRMask,{showMask} from './components/JRMask/JRMask'
|
|
14
|
+
import {random} from './components/JRUtils'
|
|
14
15
|
export {
|
|
15
16
|
JRTestReact
|
|
16
17
|
,JRSubmit,JRFrame,JRWindow,JRTable,JRFields,JRAlert
|
|
17
18
|
,JRButton
|
|
18
19
|
,JRText,JRSelect,JRCheckbox,JRRadio
|
|
20
|
+
,JRMask,showMask
|
|
21
|
+
,random
|
|
19
22
|
|
|
20
23
|
}
|