@topthink/common 1.0.11 → 1.0.12
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/lib/index.js +75 -29
- package/lib/index.js.map +1 -1
- package/package.json +3 -4
- package/types/layout/sider.d.ts +1 -1
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMenu as r,MenuItem as n}from"rc-menu";import s from"styled-components";import{useRoutes as o,useLocation as a,Link as l,BrowserRouter as d,Routes as g,Route as h,Navigate as
|
|
1
|
+
import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMenu as r,MenuItem as n}from"rc-menu";import s from"styled-components";import{useRoutes as o,useLocation as a,Link as l,BrowserRouter as d,Routes as g,Route as h,Navigate as m}from"react-router-dom";import v,{useMemo as u,useEffect as p,useContext as f,Children as b,useState as x,useCallback as y,createElement as _,forwardRef as w,useRef as j,useImperativeHandle as z,Fragment as O}from"react";import"rc-menu/assets/index.css";import k from"sweetalert2/dist/sweetalert2.js";import C from"sweetalert2-react-content";import{Dropdown as N,Spinner as S,Card as A,Alert as D,Button as E,Pagination as $,Table as I,Modal as P}from"react-bootstrap";import B from"query-string";import F from"axios";import*as L from"retry-axios";import{intersection as M,mapValues as T}from"lodash";import q from"@topthink/json-form";import H from"rc-table";import{useAsyncCallback as U}from"react-async-hook";const K=s.footer`
|
|
2
2
|
background-color: #505050;
|
|
3
3
|
color: #9f9f9f;
|
|
4
4
|
padding: 65px 0 30px 0;
|
|
@@ -73,9 +73,19 @@ import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMen
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
.rc-menu-sub {
|
|
76
|
-
padding: 10px 0;
|
|
77
76
|
background-color: #eee;
|
|
78
|
-
border-top: 1px solid #
|
|
77
|
+
border-top: 1px solid #eee;
|
|
78
|
+
border-bottom: 1px solid #eee;
|
|
79
|
+
|
|
80
|
+
& > li {
|
|
81
|
+
&:first-child {
|
|
82
|
+
margin-top: 4px;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
&:last-child {
|
|
86
|
+
margin-bottom: 4px;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
79
89
|
|
|
80
90
|
.rc-menu-item-selected {
|
|
81
91
|
background-color: #eee;
|
|
@@ -96,20 +106,20 @@ import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMen
|
|
|
96
106
|
.rc-menu-submenu {
|
|
97
107
|
& > .rc-menu-submenu-title {
|
|
98
108
|
&:hover {
|
|
99
|
-
background-color: #
|
|
109
|
+
background-color: #e7e7e7;
|
|
100
110
|
}
|
|
101
111
|
}
|
|
102
112
|
}
|
|
103
113
|
|
|
104
114
|
.rc-menu-submenu-active > .rc-menu-submenu-title {
|
|
105
|
-
background-color: #
|
|
115
|
+
background-color: #eee;
|
|
106
116
|
}
|
|
107
117
|
|
|
108
118
|
.rc-menu-item,
|
|
109
119
|
.rc-menu-submenu > .rc-menu-submenu-title {
|
|
110
120
|
padding: 0 8px 0 24px;
|
|
111
121
|
font-size: 14px;
|
|
112
|
-
line-height:
|
|
122
|
+
line-height: 36px;
|
|
113
123
|
cursor: pointer;
|
|
114
124
|
}
|
|
115
125
|
|
|
@@ -129,9 +139,8 @@ import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMen
|
|
|
129
139
|
color: var(--bs-primary);
|
|
130
140
|
}
|
|
131
141
|
|
|
132
|
-
|
|
133
142
|
.rc-menu-submenu-selected {
|
|
134
|
-
background-color: #
|
|
143
|
+
background-color: #eee;
|
|
135
144
|
|
|
136
145
|
.rc-menu-submenu-title {
|
|
137
146
|
color: var(--bs-primary);
|
|
@@ -139,25 +148,62 @@ import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMen
|
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
150
|
|
|
142
|
-
|
|
151
|
+
& > .rc-menu-item {
|
|
152
|
+
line-height: 38px;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
& > .rc-menu-submenu {
|
|
156
|
+
&.rc-menu-submenu-selected {
|
|
157
|
+
background-color: #f5f5f5;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
& > .rc-menu-submenu-title {
|
|
161
|
+
line-height: 38px;
|
|
162
|
+
|
|
163
|
+
&:hover {
|
|
164
|
+
background-color: #f0f0f0;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
&.rc-menu-submenu-active > .rc-menu-submenu-title {
|
|
169
|
+
background-color: #f5f5f5;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
& > .rc-menu-sub {
|
|
173
|
+
border-top: 1px solid #e6e6e6;
|
|
174
|
+
border-bottom: 1px solid #e6e6e6;
|
|
175
|
+
|
|
176
|
+
& > li {
|
|
177
|
+
&:first-child {
|
|
178
|
+
margin-top: 9px;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
&:last-child {
|
|
182
|
+
margin-bottom: 9px;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
`,ic=e=>e.map((e=>e.children.length>0?c(r,Object.assign({title:e.title},{children:ic(e.children)}),e.path):c(n,{children:c(l,Object.assign({to:e.path},{children:e.title}),void 0)},e.path))),tc=()=>({height:0}),rc=c=>({height:c.scrollHeight}),nc={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:tc,onAppearActive:rc,onEnterStart:tc,onEnterActive:rc,onLeaveStart:rc,onLeaveActive:tc};function sc({routes:i,basename:t,title:r}){const n=o(i),s=u((()=>function(c,e="/"){return J(c,e)}(i,t)),[i,t]),{pathname:l}=a(),d=u((()=>{const c=[];return l.split("/").reduce(((e,i)=>(e.length>1&&c.push(e.join("/")),[...e,i])),[]),c}),[]);return e(Q,{children:[e(W,{children:[c(X,{children:r},void 0),c(ec,Object.assign({mode:"inline",motion:nc,defaultOpenKeys:d,selectedKeys:[l]},{children:ic(s)}),void 0)]},void 0),e(Z,{children:[c(cc,{children:n},void 0),c(Y,{},void 0)]},void 0)]},void 0)}const oc=C(k),ac={confirmButtonText:"确定",cancelButtonText:"取消"},lc={confirm:async c=>{const{isConfirmed:e}=await oc.fire({...ac,icon:"warning",showCancelButton:!0,...c});return e},error:c=>{oc.fire({...ac,toast:!0,position:"top",icon:"error",timer:3e3,showConfirmButton:!1,...c})}},dc=s.div`
|
|
143
189
|
padding: 48px 32px;
|
|
144
|
-
`,
|
|
190
|
+
`,gc=s.div`
|
|
145
191
|
margin-bottom: 24px;
|
|
146
192
|
text-align: center;
|
|
147
193
|
font-size: 72px;
|
|
148
|
-
`,
|
|
194
|
+
`,hc=s.div`
|
|
149
195
|
color: rgba(0, 0, 0, .85);
|
|
150
196
|
font-size: 24px;
|
|
151
197
|
line-height: 1.8;
|
|
152
198
|
text-align: center;
|
|
153
|
-
`,
|
|
199
|
+
`,mc=s.div`
|
|
154
200
|
margin-top: 32px;
|
|
155
201
|
text-align: center;
|
|
156
|
-
`,
|
|
202
|
+
`,vc={success:c("i",{className:"bi bi-check-circle-fill text-success"},void 0),error:c("i",{className:"bi bi-exclamation-circle-fill text-danger"},void 0),info:c("i",{className:"bi bi-info-circle-fill text-info"},void 0),warning:c("i",{className:"bi bi-exclamation-triangle-fill text-warning"},void 0)};function uc({status:i,title:t,icon:r,extra:n}){return!r&&i&&(r=vc[i]),e(dc,{children:[r&&c(gc,{children:r},void 0),t&&c(hc,{children:t},void 0),n&&c(mc,{children:n},void 0)]},void 0)}const pc=s.a`
|
|
157
203
|
cursor: pointer;
|
|
158
|
-
`;function
|
|
204
|
+
`;function fc({children:i,menus:t}){return c("header",Object.assign({className:"navbar navbar-light bg-white border-bottom sticky-top"},{children:e("div",Object.assign({className:"container-fluid"},{children:[c("a",Object.assign({className:"navbar-brand",href:"https://www.topthink.com"},{children:c("img",{src:"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e",height:"30"},void 0)}),void 0),i,c("div",Object.assign({className:"d-flex align-items-center"},{children:e(N,Object.assign({navbar:!0},{children:[c(N.Toggle,Object.assign({as:pc,className:"nav-link"},{children:c("i",{className:"bi bi-person-circle"},void 0)}),void 0),c(N.Menu,Object.assign({className:"shadow-sm"},{children:t}),void 0)]}),void 0)}),void 0)]}),void 0)}),void 0)}s.div`
|
|
159
205
|
position: relative;
|
|
160
|
-
`;const
|
|
206
|
+
`;const bc=s.div`
|
|
161
207
|
display: ${c=>c.active?"flex":"none"};
|
|
162
208
|
position: absolute;
|
|
163
209
|
top: 0 !important;
|
|
@@ -179,20 +225,20 @@ import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMen
|
|
|
179
225
|
user-select: none;
|
|
180
226
|
will-change: opacity;
|
|
181
227
|
z-index: 990;
|
|
182
|
-
`;function
|
|
228
|
+
`;function xc({loading:i=!0,children:t,variant:r="success",animation:n="border",...s}){return i?(t&&(t=c("p",Object.assign({className:"mt-3 text-secondary"},{children:t}),void 0)),e(bc,Object.assign({inverted:!0,active:!0},{children:[c(S,Object.assign({animation:n,variant:r},s),void 0),t]}),void 0)):null}L.attach(),F.defaults.raxConfig={retryDelay:2e3,backoffType:"static",shouldRetry:c=>{var e,i;return"GET"===(null===(e=c.config.method)||void 0===e?void 0:e.toUpperCase())&&449===(null===(i=c.response)||void 0===i?void 0:i.status)}},F.defaults.baseURL="/api",F.interceptors.request.use((c=>{const e=sessionStorage.getItem("authorization");return e&&(c.headers.Authorization=`Bearer ${e}`),c}),(c=>Promise.reject(c))),F.interceptors.response.use((c=>(201===c.status&&c.data.location&&(window.location.href=c.data.location,c.data=void 0),c)),(c=>{if(F.isAxiosError(c)&&c.response){const{data:e,status:i}=c.response;if(401===i){const{url:i}=e;if(i){const c=window.location.origin+"/login";window.location.href=`${i}&redirect_uri=${c}`}c.errors="Unauthorized"}else{let t={};if(422===i&&"object"==typeof e)for(let c in e)t[c]=e[c];else t="object"==typeof e&&"message"in e?e.message:e;c.errors=t}}return Promise.reject(c)}));const yc=async function(c){c="string"==typeof c?{url:c}:c;const{data:e}=await F.request({...c});return e};function _c(){const e=a(),i=B.parse(e.hash.substr(1));return sessionStorage.setItem("authorization",i.access_token),c(m,{to:"/",replace:!0},void 0)}function wc(){return p((()=>{yc("/logout").catch((()=>{sessionStorage.removeItem("authorization")}))}),[]),c(xc,{},void 0)}function jc({children:i}){return c(d,{children:e(g,{children:[c(h,{path:"*",element:i},void 0),c(h,{path:"login",element:c(_c,{},void 0)},void 0),c(h,{path:"logout",element:c(wc,{},void 0)},void 0)]},void 0)},void 0)}const zc=s(A)`
|
|
183
229
|
margin-bottom: 1rem;
|
|
184
|
-
`;function
|
|
230
|
+
`;function Oc({children:i,title:t,border:r="light",...n}){return c(zc,Object.assign({border:r},n,{children:e("div",Object.assign({className:"card-body"},{children:[t&&c("div",Object.assign({className:"card-title h5"},{children:t}),void 0),i]}),void 0)}),void 0)}function kc({errors:e}){return e?c(D,Object.assign({variant:"danger"},{children:c("ul",Object.assign({className:"mb-0"},{children:"string"==typeof e?c("li",{children:e},void 0):Object.entries(e).map((([e,i])=>c("li",{children:i},e)))}),void 0)}),void 0):null}const Cc=v.createContext(null),Nc=Cc.Provider;function Sc(){const c=f(Cc);if(!c)throw new Error("please use `useUser` in UserContext");return c}function Ac({require:e,children:t,fallback:r}){const n=Sc();let s=!1;return"function"==typeof e?s=e(n):("string"==typeof e&&(e=[e]),s=M(n.roles,e).length>0),s||(t=r),c(i,{children:t},void 0)}function Dc({children:e,size:i="small"}){"string"==typeof i&&(i={small:8,middle:16,large:24}[i]);const t=b.map(e,(e=>c($c,Object.assign({size:i},{children:e}),void 0)));return c(Ec,{children:t},void 0)}const Ec=s.div`
|
|
185
231
|
display: inline-flex;
|
|
186
232
|
align-items: center;
|
|
187
|
-
|
|
233
|
+
`,$c=s.div`
|
|
188
234
|
margin-right: ${c=>c.size}px;
|
|
189
235
|
|
|
190
236
|
&:last-child {
|
|
191
237
|
margin-right: 0;
|
|
192
238
|
}
|
|
193
|
-
`;function
|
|
239
|
+
`;function Ic({value:e,locale:t="zh-CN",currency:r=!0}){const n=u((()=>{let c={};return c=r?{style:"currency",currency:"CNY",...c}:{minimumFractionDigits:2},new Intl.NumberFormat(t,c)}),[r,t]);return c(i,{children:n.format(e)},void 0)}function Pc({loading:e,children:i,...t}){return c(E,Object.assign({},t,{disabled:e},{children:e?"Loading…":i}),void 0)}function Bc({url:c,method:e,confirm:i,onSuccess:t,children:r,as:n=E,...s}){const[o,a]=x(!1),l=y((async r=>{r.preventDefault();try{if(a(!0),i&&!await lc.confirm({text:i}))return;const r="string"==typeof c?{url:c,method:e}:{method:e,...c},n=await yc(r);t&&t(n)}catch(r){if(!F.isAxiosError(r))throw r;{let c=r.errors;"string"!=typeof r.errors&&(c=Object.values(r.errors).join("<br />")),lc.error({text:c})}}finally{a(!1)}}),[c,e]);return _(n,{...s,disabled:o,onClick:l},r)}const Fc=require("ajv-i18n/localize/zh"),Lc=w((({action:e,method:i="post",onSuccess:t,formData:r,onSubmit:n,children:s,...o},a)=>{const[l,d]=x(),[g,h]=x(!1),[m,v]=x(r),u=y((async(c,r)=>{try{if(h(!0),e){const{formData:r}=c;try{const c=await yc({url:e,method:i,data:r});d(void 0),t&&await t(c)}catch(c){throw F.isAxiosError(c)&&d((c=>{const e=c.errors;return"string"==typeof e?{__errors:[e]}:T(e,(c=>({__errors:[c]})))})(c)),c}}else n&&await n(c,r)}finally{h(!1)}}),[e,i,n]),p=y((({formData:c})=>{v(c)}),[v]),f=y((c=>(c=c.map((c=>({keyword:c.name,dataPath:c.property,...c}))),Fc(c),c)),[]);return c(q,Object.assign({ref:a,extraErrors:l,onSubmit:u,transformErrors:f,noHtml5Validate:!0,noValidate:!0},o,{formData:m,onChange:p},{children:s||c("div",Object.assign({className:"col-12"},{children:c(Pc,Object.assign({loading:g,type:"submit",variant:"primary"},{children:"提交"}),void 0)}),void 0)}),void 0)})),Mc=s.div`
|
|
194
240
|
width: 100%;
|
|
195
|
-
`,
|
|
241
|
+
`,Tc=s.div`
|
|
196
242
|
background-color: #fff;
|
|
197
243
|
display: flex;
|
|
198
244
|
|
|
@@ -202,26 +248,26 @@ import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMen
|
|
|
202
248
|
justify-content: space-between;
|
|
203
249
|
align-items: center;
|
|
204
250
|
}
|
|
205
|
-
`,Tc=s.div`
|
|
206
|
-
margin-top: 24px;
|
|
207
251
|
`,qc=s.div`
|
|
252
|
+
margin-top: 24px;
|
|
253
|
+
`,Hc=s.div`
|
|
208
254
|
font-size: 22px;
|
|
209
255
|
line-height: 64px;
|
|
210
256
|
height: 64px;
|
|
211
|
-
`,
|
|
257
|
+
`,Uc=s.div`
|
|
212
258
|
|
|
213
|
-
`;function
|
|
259
|
+
`;function Kc({title:i,children:t,extra:r}){return e(Mc,{children:[c(Tc,{children:e("div",Object.assign({className:"container"},{children:[c(Hc,{children:i},void 0),c(Uc,{children:r},void 0)]}),void 0)},void 0),c(qc,Object.assign({className:"container"},{children:t}),void 0)]},void 0)}function Rc(){}function Vc(c){return"number"==typeof c&&isFinite(c)&&Math.floor(c)===c}const Gc={table:e=>c(I,Object.assign({},e,{className:"align-middle table-hover"}),void 0)},Yc=s((function({total:e=0,onChange:i=Rc,defaultCurrent:t=1,defaultPageSize:r=10,className:n,...s}){const[o,a]=x(t),[l,d]=x(r);p((()=>{Vc(s.current)&&a(s.current)}),[s.current]),p((()=>{Vc(s.pageSize)&&d(s.pageSize)}),[s.pageSize]);const g=u((()=>Math.floor((e-1)/l)+1),[e,l]),h=y((c=>()=>{c!==o&&(a(c),i(c,l))}),[i,o,l]),m=o-1>0?o-1:0,v=o+1<g?o+1:g,f=[];let b=null,_=null,w=null,j=null;if(g<=7)for(let e=1;e<=g;e+=1){const i=o===e;f.push(c($.Item,Object.assign({active:i,onClick:h(e)},{children:e}),e))}else{j=c($.Last,{onClick:h(g)},"last"),w=c($.First,{onClick:h(1)},"first"),b=c($.Prev,{onClick:h(m)},"prev"),_=c($.Next,{onClick:h(v)},"next");let e=Math.max(1,o-2),i=Math.min(o+2,g);o-1<=2&&(i=5),g-o<=2&&(e=g-4);for(let t=e;t<=i;t+=1){const e=o===t;f.push(c($.Item,Object.assign({active:e,onClick:h(t)},{children:t}),t))}o-1>=4&&3!==o&&f.unshift(b),g-o>=4&&o!==g-2&&f.push(_),1!==e&&f.unshift(w),i!==g&&f.push(j)}return c($,Object.assign({className:n},{children:f}),void 0)}))`
|
|
214
260
|
margin-bottom: 0;
|
|
215
261
|
justify-content: flex-end;
|
|
216
|
-
`;const
|
|
262
|
+
`;const Jc=w((({source:i,rowKey:t="id",paginate:r=!0,toolBarRender:n,columns:s=[],...o},a)=>{const[l,d]=x([]),[g,h]=x(r?{total:0,current:1,pageSize:10}:null),[m,v]=x(!0),f=y((async(c={})=>{v(!0);try{let e;if("string"==typeof i){const t={};g&&(t.page=c.page||g.current),e=await yc({url:i,params:t})}else e=await i();r&&function(c){return"current_page"in c}(e)&&(h({total:e.total,current:e.current_page,pageSize:e.per_page}),e=e.data),d(e)}catch(c){}finally{v(!1)}}),[i,d,g]);p((()=>{f()}),[]);const b=j({reload:f});p((()=>{b.current={reload:f}}),[f]),z(a,(()=>b.current));const _=u((()=>s.map((c=>{const e={...c,render:void 0};if("render"in c&&c.render){const i=c.render;e.render=(c,e,t)=>i({value:c,record:e,index:t,action:b.current})}return e}))),[s,b]),w=y((c=>{f({page:c})}),[]);return e(Oc,{children:[c(xc,{loading:m},void 0),e(Qc,{children:[c(Xc,{children:n&&n(b.current)},void 0),c(Wc,{children:c(Zc,Object.assign({onClick:b.current.reload},{children:c("i",{className:"bi bi-arrow-repeat"},void 0)}),void 0)},void 0)]},void 0),c(H,Object.assign({},o,{rowKey:t,columns:_,components:Gc,data:l}),void 0),g&&c(Yc,Object.assign({},g,{onChange:w}),void 0)]},void 0)})),Qc=s.div`
|
|
217
263
|
display: flex;
|
|
218
264
|
justify-content: space-between;
|
|
219
265
|
padding-bottom: 1rem;
|
|
220
|
-
`,
|
|
266
|
+
`,Wc=s(Dc)`
|
|
221
267
|
|
|
222
|
-
`,
|
|
268
|
+
`,Xc=s(Dc)`
|
|
223
269
|
|
|
224
|
-
`,
|
|
270
|
+
`,Zc=s.span`
|
|
225
271
|
cursor: pointer;
|
|
226
272
|
font-size: 20px;
|
|
227
273
|
line-height: 1;
|
|
@@ -229,5 +275,5 @@ import{jsx as c,jsxs as e,Fragment as i}from"react/jsx-runtime";import t,{SubMen
|
|
|
229
275
|
&:hover {
|
|
230
276
|
color: var(--bs-primary);
|
|
231
277
|
}
|
|
232
|
-
`,
|
|
278
|
+
`,ce=w((({text:t,variant:r="primary",header:n=t,footer:s=!0,onOk:o,size:a,children:l},d)=>{const[g,h]=x(!1),[m,v]=x(!1),u=()=>h(!1);z(d,(()=>({close:u})));return e(i,{children:[c(E,Object.assign({variant:r,onClick:()=>h(!0)},{children:t}),void 0),e(P,Object.assign({size:a,show:g,onHide:u},{children:[n&&c(P.Header,Object.assign({closeButton:!0},{children:c(P.Title,Object.assign({as:"h5"},{children:n}),void 0)}),void 0),c(P.Body,{children:l},void 0),s&&e(P.Footer,{children:[c(E,Object.assign({variant:"secondary",onClick:u},{children:"取消"}),void 0),c(Pc,Object.assign({loading:m,variant:"primary",onClick:async()=>{if(o){v(!0);const c=await o();if(v(!1),!1===c)return}u()}},{children:"确定"}),void 0)]},void 0)]}),void 0)]},void 0)}));function ee({text:e,header:i,schema:t,uiSchema:r,action:n,method:s,formData:o,variant:a,onSuccess:l,size:d}){const g=j(null),h=j(null),m=y((async()=>{try{var c;const e=await(null===(c=g.current)||void 0===c?void 0:c.submit());return l&&l(e),!0}catch{return!1}}),[]);return c(ce,Object.assign({ref:h,text:e,onOk:m,header:i,variant:a,size:d},{children:c(Lc,Object.assign({ref:g,schema:t,uiSchema:r,action:n,method:s,formData:o},{children:c(O,{},void 0)}),void 0)}),void 0)}function ie(c,{manual:e,refreshDeps:i,...t}={}){const{execute:r,currentParams:n,error:s,...o}=U((async e=>(c="string"==typeof c?{url:c}:c,await yc({...c,...e}))),t);p((()=>{e||i||r()}),[]),p((()=>{i&&a()}),i);const a=y((()=>{n?r(...n):r()}),[r,n]);return{refresh:a,execute:r,...o}}export{Ac as Access,Oc as Card,Kc as Content,kc as Error,Y as Footer,Lc as Form,fc as Header,xc as Loader,Pc as LoadingButton,lc as Message,ce as ModalButton,ee as ModalForm,Ic as NumberFormat,Bc as RequestButton,uc as Result,jc as Root,sc as SiderLayout,Dc as Space,Jc as Table,Nc as UserProvider,yc as request,ie as useRequest,Sc as useUser};
|
|
233
279
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/components/footer.tsx","../src/images/logo_dark.svg","../src/utils/get-menu-data.ts","../src/layout/sider.tsx","../src/utils/message.ts","../src/components/result.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/dimmer.tsx","../src/components/loader.tsx","../src/request.ts","../src/components/root.tsx","../src/components/card.tsx","../src/components/error.tsx","../src/components/user-provider.tsx","../src/components/access.tsx","../src/components/space.tsx","../src/components/number-format.tsx","../src/components/loading-button.tsx","../src/components/request-button.tsx","../src/components/form.tsx","../src/components/content.tsx","../src/components/pagination.tsx","../src/components/table.tsx","../src/components/modal-button.tsx","../src/components/modal-form.tsx","../src/hooks/use-request.ts"],"sourcesContent":["import styled from 'styled-components';\r\nimport logo from '../images/logo_dark.svg';\r\n\r\nconst FooterWrapper = styled.footer`\r\n background-color: #505050;\r\n color: #9f9f9f;\r\n padding: 65px 0 30px 0;\r\n\r\n .container {\r\n padding: 0 100px;\r\n }\r\n`;\r\n\r\nconst FooterInner = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n`;\r\n\r\nconst FooterLinks = styled.ul`\r\n display: flex;\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n\r\n li {\r\n margin-left: 60px;\r\n\r\n a {\r\n text-decoration: none;\r\n color: #9f9f9f;\r\n font-size: 20px;\r\n }\r\n }\r\n`;\r\n\r\nconst Copyright = styled.div`\r\n text-align: center;\r\n margin-top: 75px;\r\n`;\r\n\r\n\r\nexport default function Footer() {\r\n return <FooterWrapper>\r\n <div className='container'>\r\n <FooterInner>\r\n <img src={logo} height='40' />\r\n <FooterLinks>\r\n <li><a href='#'>关于我们</a></li>\r\n <li><a href='#'>联系我们</a></li>\r\n <li><a href='#'>加入我们</a></li>\r\n <li><a href='#'>合作伙伴</a></li>\r\n </FooterLinks>\r\n </FooterInner>\r\n <Copyright>\r\n © 2021 上海顶想信息科技有限公司 沪ICP备12007941号-1\r\n </Copyright>\r\n </div>\r\n </FooterWrapper>;\r\n}\r\n","var img = \"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%239f9f9f%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import { PartialRouteObject } from 'react-router';\r\n\r\nexport interface MenuData {\r\n path: string\r\n title: string\r\n children: MenuData[]\r\n}\r\n\r\nconst formatRelativePath = (\r\n routes: PartialRouteObject[],\r\n parent: string = '/',\r\n): MenuData[] => {\r\n\r\n const menus: MenuData[] = [];\r\n\r\n for (const route of routes) {\r\n\r\n if (route.meta?.hideInMenu) {\r\n continue;\r\n }\r\n\r\n const title = route.meta?.title;\r\n if (!title) {\r\n continue;\r\n }\r\n\r\n let path = route.path || '';\r\n\r\n path = `${parent}/${path}`;\r\n\r\n path = path.replace(/\\/+/, '/').replace(/\\/$/, '');\r\n\r\n const menu: MenuData = {\r\n title,\r\n path,\r\n children: []\r\n };\r\n\r\n if (!route.meta?.hideChildrenInMenu) {\r\n if (route.children && route.children.length > 0) {\r\n menu.children = formatRelativePath(route.children, path);\r\n }\r\n }\r\n\r\n menus.push(menu);\r\n }\r\n\r\n return menus;\r\n};\r\n\r\nexport default function getMenuData(routes: PartialRouteObject[], base: string = '/'): MenuData[] {\r\n return formatRelativePath(routes, base);\r\n}\r\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\r\nimport Footer from '../components/footer';\r\nimport { Link, useLocation, useRoutes } from 'react-router-dom';\r\nimport { useMemo } from 'react';\r\nimport styled from 'styled-components';\r\nimport 'rc-menu/assets/index.css';\r\nimport { PartialRouteObject } from 'react-router';\r\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-wrap: nowrap;\r\n width: 100%;\r\n`;\r\n\r\nconst Sidebar = styled.nav`\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 100;\r\n padding: 60px 0 0;\r\n border-right: 1px solid #e3e3e3;\r\n width: 230px;\r\n background-color: #f5f5f5;\r\n`;\r\n\r\nconst Header = styled.div`\r\n padding-top: 10px;\r\n height: 54px;\r\n line-height: 44px;\r\n text-indent: 24px;\r\n`;\r\n\r\nconst Content = styled.div`\r\n margin-left: 230px;\r\n flex: 1;\r\n`;\r\n\r\nconst Main = styled.main`\r\n min-height: calc(100vh - 60px);\r\n position: relative;\r\n`;\r\n\r\nconst Menu = styled(RcMenu)`\r\n border: none;\r\n box-shadow: none;\r\n padding: 10px 0;\r\n\r\n .rc-menu-item {\r\n display: flex;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n\r\n a {\r\n flex: 1;\r\n text-decoration: none;\r\n color: inherit;\r\n }\r\n }\r\n\r\n .rc-menu-sub {\r\n padding: 10px 0;\r\n background-color: #eee;\r\n border-top: 1px solid #e6e6e6;\r\n\r\n .rc-menu-item-selected {\r\n background-color: #eee;\r\n color: var(--bs-primary);\r\n }\r\n\r\n .rc-menu-item-active {\r\n background-color: #eee;\r\n }\r\n\r\n .rc-menu-item {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-submenu {\r\n & > .rc-menu-submenu-title {\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n .rc-menu-item,\r\n .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding: 0 8px 0 24px;\r\n font-size: 14px;\r\n line-height: 38px;\r\n cursor: pointer;\r\n }\r\n\r\n .rc-menu-sub > .rc-menu-item,\r\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding-top: 0;\r\n padding-bottom: 0;\r\n padding-right: 0;\r\n }\r\n\r\n .rc-menu-submenu-arrow {\r\n line-height: 38px;\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #f5f5f5;\r\n color: var(--bs-primary);\r\n }\r\n\r\n\r\n .rc-menu-submenu-selected {\r\n background-color: #f5f5f5;\r\n\r\n .rc-menu-submenu-title {\r\n color: var(--bs-primary);\r\n font-weight: 500;\r\n }\r\n }\r\n\r\n`;\r\n\r\ninterface Props {\r\n title: string\r\n routes: PartialRouteObject[]\r\n basename: string\r\n}\r\n\r\nconst renderMenuItems = (items: MenuData[]) => {\r\n return items.map((item) => {\r\n if (item.children.length > 0) {\r\n return <SubMenu title={item.title} key={item.path}>\r\n {renderMenuItems(item.children)}\r\n </SubMenu>;\r\n } else {\r\n return <MenuItem key={item.path}>\r\n <Link to={item.path}>{item.title}</Link>\r\n </MenuItem>;\r\n }\r\n });\r\n};\r\n\r\n\r\nexport default function SiderLayout({ routes, basename, title }: Props) {\r\n\r\n const children = useRoutes(routes);\r\n\r\n const menu = useMemo(() => getMenuData(routes, basename), [routes, basename]);\r\n\r\n const { pathname } = useLocation();\r\n\r\n const openKeys = useMemo(() => {\r\n const keys: string[] = [];\r\n const parts = pathname.split('/');\r\n parts.reduce<string[]>((pre, curr) => {\r\n if (pre.length > 1) {\r\n keys.push(pre.join('/'));\r\n }\r\n return [...pre, curr];\r\n }, []);\r\n\r\n return keys;\r\n }, []);\r\n\r\n return <Container>\r\n <Sidebar>\r\n <Header>{title}</Header>\r\n <Menu mode='inline' defaultOpenKeys={openKeys} selectedKeys={[pathname]}>\r\n {renderMenuItems(menu)}\r\n </Menu>\r\n </Sidebar>\r\n <Content>\r\n <Main>{children}</Main>\r\n <Footer />\r\n </Content>\r\n </Container>;\r\n}\r\n","import Swal from 'sweetalert2/dist/sweetalert2.js';\r\nimport withReactContent from 'sweetalert2-react-content';\r\n\r\nconst CustomSwal = withReactContent(Swal);\r\n\r\ninterface MessageOptions {\r\n title?: string;\r\n text?: string;\r\n}\r\n\r\nconst defaultOptions = {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消'\r\n};\r\n\r\nconst Message = {\r\n confirm: async (options: MessageOptions) => {\r\n const { isConfirmed } = await CustomSwal.fire({\r\n ...defaultOptions,\r\n icon: 'warning',\r\n showCancelButton: true,\r\n ...options\r\n });\r\n\r\n return isConfirmed;\r\n },\r\n error: (options: MessageOptions) => {\r\n CustomSwal.fire({\r\n ...defaultOptions,\r\n toast: true,\r\n position: 'top',\r\n icon: 'error',\r\n timer: 3000,\r\n showConfirmButton: false,\r\n ...options\r\n });\r\n }\r\n};\r\n\r\nexport default Message;\r\n","import { ReactNode } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nconst Container = styled.div`\r\n padding: 48px 32px;\r\n`;\r\n\r\nconst Icon = styled.div`\r\n margin-bottom: 24px;\r\n text-align: center;\r\n font-size: 72px;\r\n`;\r\n\r\nconst Title = styled.div`\r\n color: rgba(0, 0, 0, .85);\r\n font-size: 24px;\r\n line-height: 1.8;\r\n text-align: center;\r\n`;\r\n\r\nconst Extra = styled.div`\r\n margin-top: 32px;\r\n text-align: center;\r\n`;\r\n\r\nconst IconMap = {\r\n success: <i className='bi bi-check-circle-fill text-success' />,\r\n error: <i className='bi bi-exclamation-circle-fill text-danger' />,\r\n info: <i className='bi bi-info-circle-fill text-info' />,\r\n warning: <i className='bi bi-exclamation-triangle-fill text-warning' />,\r\n};\r\n\r\ninterface ResultProps {\r\n status?: keyof typeof IconMap\r\n icon?: ReactNode\r\n title?: string\r\n extra?: ReactNode;\r\n}\r\n\r\nexport default function Result({ status, title, icon, extra }: ResultProps) {\r\n\r\n if (!icon && status) {\r\n icon = IconMap[status];\r\n }\r\n\r\n return <Container>\r\n {icon && <Icon>{icon}</Icon>}\r\n {title && <Title>{title}</Title>}\r\n {extra && <Extra>{extra}</Extra>}\r\n </Container>;\r\n}\r\n","import logo from '../images/logo.svg';\r\nimport { Dropdown } from 'react-bootstrap';\r\nimport styled from 'styled-components';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\n\r\nconst Avatar = styled.a`\r\n cursor: pointer;\r\n`;\r\n\r\ninterface Props {\r\n menus: ReactNode\r\n}\r\n\r\nexport default function Header({ children, menus }: PropsWithChildren<Props>) {\r\n\r\n return <header className='navbar navbar-light bg-white border-bottom sticky-top'>\r\n <div className='container-fluid'>\r\n <a className='navbar-brand' href='https://www.topthink.com'>\r\n <img src={logo} height='30' />\r\n </a>\r\n {children}\r\n <div className='d-flex align-items-center'>\r\n <Dropdown navbar>\r\n <Dropdown.Toggle as={Avatar} className='nav-link'>\r\n <i className='bi bi-person-circle' />\r\n </Dropdown.Toggle>\r\n <Dropdown.Menu className={'shadow-sm'}>\r\n {menus}\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n </div>\r\n </header>;\r\n}\r\n","var img = \"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import styled from 'styled-components';\r\n\r\nexport const Dimmable = styled.div`\r\n position: relative;\r\n`;\r\n\r\ninterface DimmerProps {\r\n active?: boolean\r\n inverted?: boolean\r\n}\r\n\r\nconst Dimmer = styled.div<DimmerProps>`\r\n display: ${props => props.active ? 'flex' : 'none'};\r\n position: absolute;\r\n top: 0 !important;\r\n left: 0 !important;\r\n width: 100%;\r\n height: 100%;\r\n text-align: center;\r\n vertical-align: middle;\r\n padding: 1em;\r\n background-color: ${props => props.inverted ? 'rgba(255, 255, 255, .85)' : 'rgba(0, 0, 0, .85)'};\r\n opacity: ${props => props.active ? 1 : 0};\r\n line-height: 1;\r\n animation-fill-mode: both;\r\n animation-duration: .5s;\r\n transition: background-color .5s linear;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n user-select: none;\r\n will-change: opacity;\r\n z-index: 990;\r\n`;\r\n\r\nexport default Dimmer;\r\n","import { PropsWithChildren } from 'react';\r\nimport { Spinner, SpinnerProps } from 'react-bootstrap';\r\nimport Dimmer from './dimmer';\r\n\r\ninterface LoaderProps {\r\n loading?: boolean\r\n animation?: SpinnerProps['animation']\r\n}\r\n\r\nexport default function Loader({\r\n loading = true,\r\n children,\r\n variant = 'success',\r\n animation = 'border',\r\n ...props\r\n}: PropsWithChildren<LoaderProps & Omit<SpinnerProps, 'animation'>>) {\r\n if (!loading) {\r\n return null;\r\n }\r\n\r\n if (children) {\r\n children = <p className='mt-3 text-secondary'>{children}</p>;\r\n }\r\n\r\n return <Dimmer inverted active>\r\n <Spinner animation={animation} variant={variant} {...props} />\r\n {children}\r\n </Dimmer>;\r\n}\r\n","import axios, { AxiosRequestConfig } from 'axios';\r\nimport * as rax from 'retry-axios';\r\n\r\nexport type Errors = string | {\r\n [key: string]: string\r\n}\r\n\r\ndeclare module 'axios' {\r\n interface AxiosError {\r\n errors: Errors;\r\n }\r\n}\r\n\r\nrax.attach();\r\naxios.defaults.raxConfig = {\r\n retryDelay: 2000,\r\n backoffType: 'static',\r\n shouldRetry: (err) => {\r\n return (\r\n err.config.method?.toUpperCase() === 'GET'\r\n && err.response?.status === 449\r\n );\r\n }\r\n};\r\naxios.defaults.baseURL = '/api';\r\naxios.interceptors.request.use(\r\n config => {\r\n const token = sessionStorage.getItem('authorization');\r\n\r\n if (token) {\r\n config.headers.Authorization = `Bearer ${token}`;\r\n }\r\n return config;\r\n },\r\n error => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\naxios.interceptors.response.use(\r\n response => {\r\n if (response.status === 201 && response.data.location) {\r\n window.location.href = response.data.location;\r\n response.data = undefined;\r\n }\r\n\r\n return response;\r\n },\r\n e => {\r\n if (axios.isAxiosError(e)) {\r\n if (e.response) {\r\n const { data, status } = e.response;\r\n if (status === 401) {\r\n const { url } = data;\r\n if (url) {\r\n const redirectUri = window.location.origin + '/login';\r\n window.location.href = `${url}&redirect_uri=${redirectUri}`;\r\n }\r\n e.errors = 'Unauthorized';\r\n } else {\r\n let errors: Errors = {};\r\n if (status === 422 && typeof data === 'object') {\r\n for (let name in data) {\r\n errors[name] = data[name];\r\n }\r\n } else if ((typeof data === 'object') && ('message' in data)) {\r\n errors = data['message'];\r\n } else {\r\n errors = data;\r\n }\r\n e.errors = errors;\r\n }\r\n }\r\n }\r\n return Promise.reject(e);\r\n }\r\n);\r\n\r\nexport type Config = AxiosRequestConfig | string\r\n\r\nconst request = async function <T = any>(config: Config) {\r\n config = typeof config === 'string' ? { url: config } : config;\r\n\r\n const { data } = await axios.request<T>({\r\n ...config\r\n });\r\n\r\n return data;\r\n};\r\n\r\nexport default request;\r\n","import React, { PropsWithChildren, useEffect } from 'react';\r\nimport { BrowserRouter, Navigate, Route, Routes, useLocation } from 'react-router-dom';\r\nimport queryString from 'query-string';\r\nimport Loader from './loader';\r\nimport request from '../request';\r\n\r\nfunction Login() {\r\n\r\n const location = useLocation();\r\n\r\n const parsed = queryString.parse(location.hash.substr(1));\r\n\r\n sessionStorage.setItem('authorization', parsed.access_token as string);\r\n\r\n return <Navigate to='/' replace />;\r\n}\r\n\r\nfunction Logout() {\r\n\r\n useEffect(() => {\r\n request('/logout').catch(() => {\r\n sessionStorage.removeItem('authorization');\r\n });\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n\r\nexport default function Root({ children }: PropsWithChildren<any>) {\r\n\r\n return <React.StrictMode>\r\n <BrowserRouter>\r\n <Routes>\r\n <Route path='*' element={children} />\r\n <Route path='login' element={<Login />} />\r\n <Route path='logout' element={<Logout />} />\r\n </Routes>\r\n </BrowserRouter>\r\n </React.StrictMode>;\r\n}\r\n","import { PropsWithChildren } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Card as BsCard, CardProps as BsCardProps } from 'react-bootstrap';\r\n\r\ninterface CardProps extends BsCardProps {\r\n title?: string;\r\n}\r\n\r\nconst Wrap = styled(BsCard)`\r\n margin-bottom: 1rem;\r\n`;\r\n\r\nexport default function Card({ children, title, border = 'light', ...props }: PropsWithChildren<CardProps>) {\r\n\r\n return <Wrap border={border} {...props}>\r\n <div className='card-body'>\r\n {title && <div className='card-title h5'>{title}</div>}\r\n {children}\r\n </div>\r\n </Wrap>;\r\n}\r\n","import { Alert } from 'react-bootstrap';\r\nimport { Errors } from '../request';\r\n\r\nexport default function Error({ errors }: { errors?: Errors }) {\r\n if (!errors) {\r\n return null;\r\n }\r\n return <Alert variant='danger'>\r\n <ul className='mb-0'>\r\n {typeof errors === 'string'\r\n ? <li>{errors}</li>\r\n : Object.entries(errors).map(([name, error]) => <li key={name}>{error}</li>)\r\n }\r\n </ul>\r\n </Alert>;\r\n}\r\n","import React, { useContext } from 'react';\r\n\r\nexport interface User {\r\n id: number\r\n name: string\r\n email: string\r\n mobile: string\r\n is_certified: boolean\r\n roles: []\r\n}\r\n\r\nconst UserContext = React.createContext<User | null>(null);\r\n\r\nconst UserProvider = UserContext.Provider;\r\n\r\nexport function useUser() {\r\n const user = useContext(UserContext);\r\n if (!user) {\r\n throw new Error('please use `useUser` in UserContext');\r\n }\r\n\r\n return user;\r\n}\r\n\r\nexport default UserProvider;\r\n","import { ReactNode } from 'react';\r\nimport { intersection } from 'lodash';\r\nimport { User, useUser } from './user-provider';\r\n\r\nexport interface AccessProps {\r\n require?: string | string[] | ((user: User) => boolean)\r\n fallback?: ReactNode\r\n children: ReactNode\r\n}\r\n\r\nexport default function Access({\r\n require,\r\n children,\r\n fallback\r\n}: AccessProps) {\r\n const user = useUser();\r\n let passed = false;\r\n if (typeof require === 'function') {\r\n passed = require(user);\r\n } else {\r\n if (typeof require === 'string') {\r\n require = [require];\r\n }\r\n passed = intersection(user.roles, require).length > 0;\r\n }\r\n if (!passed) {\r\n children = fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n","import { Children, ReactNode } from 'react';\r\nimport styled from 'styled-components';\r\n\r\ninterface SpaceProps {\r\n children: ReactNode;\r\n size?: 'small' | 'middle' | 'large' | number;\r\n}\r\n\r\n\r\nexport default function Space({ children, size = 'small' }: SpaceProps) {\r\n\r\n if (typeof size === 'string') {\r\n size = {\r\n small: 8,\r\n middle: 16,\r\n large: 24\r\n }[size];\r\n }\r\n\r\n const items = Children.map(children, (child) => {\r\n return <Item size={size as number}>{child}</Item>;\r\n });\r\n\r\n return <Container>\r\n {items}\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.div`\r\n display: inline-flex;\r\n align-items: center;\r\n`;\r\n\r\nconst Item = styled.div<{ size: number }>`\r\n margin-right: ${props => props.size}px;\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n`;\r\n","import { useMemo } from 'react';\r\n\r\ninterface Props {\r\n value: number;\r\n currency?: boolean;\r\n locale?: string;\r\n}\r\n\r\nexport default function NumberFormat({ value, locale = 'zh-CN', currency = true }: Props) {\r\n\r\n const formatter = useMemo(() => {\r\n\r\n let options = {};\r\n\r\n if (currency) {\r\n options = {\r\n style: 'currency',\r\n currency: 'CNY',\r\n ...options\r\n };\r\n } else {\r\n options = {\r\n minimumFractionDigits: 2,\r\n };\r\n }\r\n\r\n return new Intl.NumberFormat(locale, options);\r\n }, [currency, locale]);\r\n\r\n return <>{formatter.format(value)}</>;\r\n}\r\n","import { Button, ButtonProps } from 'react-bootstrap';\r\n\r\ninterface CustomButtonProps extends ButtonProps {\r\n loading: boolean\r\n}\r\n\r\nexport default function LoadingButton({ loading, children, ...props }: CustomButtonProps) {\r\n\r\n return <Button {...props} disabled={loading}>\r\n {loading ? 'Loading…' : children}\r\n </Button>;\r\n}\r\n","import { Button, ButtonProps } from 'react-bootstrap';\r\nimport request, { Config } from '../request';\r\nimport { createElement, useCallback, useState, MouseEvent } from 'react';\r\nimport Message from '../utils/message';\r\nimport axios, { AxiosRequestConfig } from 'axios';\r\n\r\ninterface Props extends ButtonProps {\r\n url: Config;\r\n method?: AxiosRequestConfig['method'];\r\n confirm?: string;\r\n onSuccess?: (result: any) => void;\r\n}\r\n\r\nexport default function RequestButton({ url, method, confirm, onSuccess, children, as = Button, ...props }: Props) {\r\n\r\n const [disabled, setDisabled] = useState(false);\r\n\r\n const handleClick = useCallback(async (e: MouseEvent) => {\r\n e.preventDefault();\r\n try {\r\n setDisabled(true);\r\n if (confirm) {\r\n if (!await Message.confirm({ text: confirm })) {\r\n return;\r\n }\r\n }\r\n\r\n const config = typeof url === 'string' ? { url, method } : { method, ...url };\r\n\r\n const result = await request(config);\r\n\r\n if (onSuccess) {\r\n onSuccess(result);\r\n }\r\n } catch (e) {\r\n if (axios.isAxiosError(e)) {\r\n let errors = e.errors;\r\n if (typeof e.errors !== 'string') {\r\n errors = Object.values(e.errors).join('<br />');\r\n }\r\n Message.error({ text: errors as string });\r\n } else {\r\n throw e;\r\n }\r\n } finally {\r\n setDisabled(false);\r\n }\r\n }, [url, method]);\r\n\r\n return createElement(as, {\r\n ...props,\r\n disabled,\r\n onClick: handleClick\r\n }, children);\r\n}\r\n","import JsonForm, { JsonFormProps, JsonFormType } from '@topthink/json-form';\r\nimport * as React from 'react';\r\nimport { forwardRef, ForwardRefExoticComponent, PropsWithoutRef, RefAttributes, useCallback, useState } from 'react';\r\nimport axios, { AxiosError, Method } from 'axios';\r\nimport LoadingButton from './loading-button';\r\nimport request from '../request';\r\nimport { mapValues } from 'lodash';\r\nimport { AjvError, ISubmitEvent } from '@rjsf/core';\r\n\r\nconst localize = require('ajv-i18n/localize/zh');\r\n\r\nexport interface FormProps<T = any> extends JsonFormProps<T> {\r\n onSuccess?: (data: any) => void;\r\n method?: Method;\r\n}\r\n\r\ntype Error = {\r\n __errors: string[]\r\n}\r\n\r\ntype Errors = Error | {\r\n [key: string]: Error\r\n}\r\n\r\nconst toExtraErrors = (error: AxiosError): Errors => {\r\n const errors = error.errors;\r\n if (typeof errors === 'string') {\r\n return {\r\n __errors: [errors]\r\n };\r\n }\r\n return mapValues(errors, (e) => {\r\n return {\r\n __errors: [e]\r\n };\r\n });\r\n};\r\n\r\nexport interface FormType extends JsonFormType {\r\n\r\n}\r\n\r\ntype Form<T = any> = ForwardRefExoticComponent<PropsWithoutRef<FormProps<T>> & RefAttributes<FormType>>\r\n\r\nconst Form: Form = forwardRef(({\r\n action,\r\n method = 'post',\r\n onSuccess,\r\n formData,\r\n onSubmit,\r\n children,\r\n ...props\r\n}, ref) => {\r\n\r\n const [extraErrors, setExtraErrors] = useState<Errors>();\r\n const [loading, setLoading] = useState(false);\r\n const [data, setData] = useState(formData);\r\n\r\n const handleSubmit = useCallback(async (e: ISubmitEvent<any>, nativeEvent: React.FormEvent<HTMLFormElement>) => {\r\n try {\r\n setLoading(true);\r\n if (action) {\r\n const { formData } = e;\r\n try {\r\n const data = await request({\r\n url: action,\r\n method,\r\n data: formData\r\n });\r\n setExtraErrors(undefined);\r\n if (onSuccess) {\r\n await onSuccess(data);\r\n }\r\n } catch (e) {\r\n if (axios.isAxiosError(e)) {\r\n setExtraErrors(toExtraErrors(e));\r\n }\r\n\r\n throw e;\r\n }\r\n } else if (onSubmit) {\r\n await onSubmit(e, nativeEvent);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [action, method, onSubmit]);\r\n\r\n const handleChange = useCallback(({ formData }: ISubmitEvent<any>) => {\r\n setData(formData);\r\n }, [setData]);\r\n\r\n const transformErrors = useCallback((errors: AjvError[]) => {\r\n errors = errors.map(error => ({\r\n keyword: error.name,\r\n dataPath: error.property,\r\n ...error\r\n }));\r\n\r\n localize(errors);\r\n\r\n return errors;\r\n }, []);\r\n\r\n return <JsonForm\r\n ref={ref}\r\n extraErrors={extraErrors}\r\n onSubmit={handleSubmit}\r\n transformErrors={transformErrors}\r\n noHtml5Validate\r\n noValidate\r\n {...props}\r\n formData={data}\r\n onChange={handleChange}\r\n >\r\n {children || <div className='col-12'>\r\n <LoadingButton loading={loading} type='submit' variant='primary'>提交</LoadingButton>\r\n </div>}\r\n </JsonForm>;\r\n});\r\n\r\nexport default Form;\r\n","import styled from 'styled-components';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\n\r\nconst Container = styled.div`\r\n width: 100%;\r\n`;\r\n\r\nconst Header = styled.div`\r\n background-color: #fff;\r\n display: flex;\r\n\r\n .container {\r\n padding: 0 24px;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n }\r\n`;\r\n\r\nconst Body = styled.div`\r\n margin-top: 24px;\r\n`;\r\n\r\nconst Title = styled.div`\r\n font-size: 22px;\r\n line-height: 64px;\r\n height: 64px;\r\n`;\r\n\r\nconst Extra = styled.div`\r\n\r\n`;\r\n\r\ninterface ContentProps {\r\n title: string\r\n extra?: ReactNode\r\n}\r\n\r\nexport default function Content({ title, children, extra }: PropsWithChildren<ContentProps>) {\r\n return <Container>\r\n <Header>\r\n <div className='container'>\r\n <Title>{title}</Title>\r\n <Extra>{extra}</Extra>\r\n </div>\r\n </Header>\r\n <Body className='container'>\r\n {children}\r\n </Body>\r\n </Container>;\r\n};\r\n","import { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { Pagination as BsPagination } from 'react-bootstrap';\r\n\r\nfunction noop() {\r\n}\r\n\r\n\r\nfunction isInteger(value: any): value is number {\r\n return (\r\n typeof value === 'number' && isFinite(value) && Math.floor(value) === value\r\n );\r\n}\r\n\r\nexport interface PaginationProps {\r\n className?: string\r\n total: number\r\n current?: number\r\n defaultCurrent?: number\r\n pageSize?: number\r\n defaultPageSize?: number,\r\n onChange?: (current: number, pageSize: number) => void\r\n}\r\n\r\nexport default function Pagination({\r\n total = 0,\r\n onChange = noop,\r\n defaultCurrent = 1,\r\n defaultPageSize = 10,\r\n className,\r\n ...props\r\n}: PaginationProps) {\r\n\r\n const [current, setCurrent] = useState(defaultCurrent);\r\n const [pageSize, setPageSize] = useState(defaultPageSize);\r\n\r\n useEffect(() => {\r\n if (isInteger(props.current)) {\r\n setCurrent(props.current);\r\n }\r\n }, [props.current]);\r\n\r\n useEffect(() => {\r\n if (isInteger(props.pageSize)) {\r\n setPageSize(props.pageSize);\r\n }\r\n }, [props.pageSize]);\r\n\r\n const allPages = useMemo(() => {\r\n return Math.floor((total - 1) / pageSize) + 1;\r\n }, [total, pageSize]);\r\n\r\n const handleChange = useCallback((p: number) => {\r\n return () => {\r\n if (p !== current) {\r\n setCurrent(p);\r\n onChange(p, pageSize);\r\n }\r\n };\r\n }, [onChange, current, pageSize]);\r\n\r\n const pageBufferSize = 2;\r\n const prevPage = current - 1 > 0 ? current - 1 : 0;\r\n const nextPage = current + 1 < allPages ? current + 1 : allPages;\r\n\r\n const pagerList = [];\r\n let jumpPrev = null;\r\n let jumpNext = null;\r\n let firstPager = null;\r\n let lastPager = null;\r\n\r\n if (allPages <= 3 + pageBufferSize * 2) {\r\n for (let i = 1; i <= allPages; i += 1) {\r\n const active = current === i;\r\n pagerList.push(\r\n <BsPagination.Item key={i} active={active} onClick={handleChange(i)}>{i}</BsPagination.Item>\r\n );\r\n }\r\n } else {\r\n lastPager = <BsPagination.Last onClick={handleChange(allPages)} />;\r\n firstPager = <BsPagination.First onClick={handleChange(1)} />;\r\n jumpPrev = <BsPagination.Prev onClick={handleChange(prevPage)} />;\r\n jumpNext = <BsPagination.Next onClick={handleChange(nextPage)} />;\r\n\r\n let left = Math.max(1, current - pageBufferSize);\r\n let right = Math.min(current + pageBufferSize, allPages);\r\n\r\n if (current - 1 <= pageBufferSize) {\r\n right = 1 + pageBufferSize * 2;\r\n }\r\n\r\n if (allPages - current <= pageBufferSize) {\r\n left = allPages - pageBufferSize * 2;\r\n }\r\n\r\n for (let i = left; i <= right; i += 1) {\r\n const active = current === i;\r\n pagerList.push(\r\n <BsPagination.Item key={i} active={active} onClick={handleChange(i)}>{i}</BsPagination.Item>\r\n );\r\n }\r\n\r\n if (current - 1 >= pageBufferSize * 2 && current !== 1 + 2) {\r\n pagerList.unshift(jumpPrev);\r\n }\r\n if (\r\n allPages - current >= pageBufferSize * 2 &&\r\n current !== allPages - 2\r\n ) {\r\n pagerList.push(jumpNext);\r\n }\r\n\r\n if (left !== 1) {\r\n pagerList.unshift(firstPager);\r\n }\r\n if (right !== allPages) {\r\n pagerList.push(lastPager);\r\n }\r\n }\r\n\r\n return <BsPagination className={className}>\r\n {pagerList}\r\n </BsPagination>;\r\n\r\n}\r\n","import RcTable from 'rc-table';\r\nimport { TableProps as RcTableProps } from 'rc-table/lib/Table';\r\nimport { ColumnGroupType, ColumnsType, ColumnType as BsColumnType, RenderedCell } from 'rc-table/lib/interface';\r\nimport { Table as BsTable, TableProps as BsTableProps } from 'react-bootstrap';\r\nimport {\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithChildren,\r\n PropsWithoutRef,\r\n ReactNode,\r\n RefAttributes,\r\n useCallback,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState\r\n} from 'react';\r\nimport Pagination from './pagination';\r\nimport styled from 'styled-components';\r\nimport request from '../request';\r\nimport Card from './card';\r\nimport Loader from './loader';\r\nimport Space from './space';\r\n\r\nexport interface TableType {\r\n reload: () => void;\r\n}\r\n\r\ninterface ColumnType<RecordType> extends Omit<BsColumnType<RecordType>, 'render'> {\r\n render?: (data: { value: any, record: RecordType, index: number, action: TableType }) => ReactNode | RenderedCell<RecordType>;\r\n}\r\n\r\nexport type Columns<RecordType = any> = (ColumnGroupType<RecordType> | ColumnType<RecordType>)[]\r\n\r\nconst CustomTable = (props: BsTableProps) => {\r\n return <BsTable {...props} className='align-middle table-hover' />;\r\n};\r\n\r\nconst components: RcTableProps['components'] = {\r\n table: CustomTable,\r\n};\r\n\r\nexport interface PaginationType<T = any> {\r\n total: number;\r\n current_page: number;\r\n per_page: number;\r\n last_page: number;\r\n data: T[];\r\n}\r\n\r\nconst CustomPagination = styled(Pagination)`\r\n margin-bottom: 0;\r\n justify-content: flex-end;\r\n`;\r\n\r\nfunction isPagination<T>(data: any): data is PaginationType<T> {\r\n return 'current_page' in data;\r\n}\r\n\r\nexport interface TableProps<RecordType = any> extends Omit<RcTableProps<RecordType>, 'children' | 'columns'> {\r\n source: string | (() => Promise<any>);\r\n paginate?: boolean;\r\n columns: Columns<RecordType>;\r\n toolBarRender?: (action: TableType) => ReactNode;\r\n}\r\n\r\ntype Params = {\r\n page?: number;\r\n sortField?: string;\r\n sortOrder?: number;\r\n [key: string]: any;\r\n};\r\n\r\ntype CustomTableType<T = any> = ForwardRefExoticComponent<PropsWithoutRef<PropsWithChildren<TableProps<T>>>\r\n & RefAttributes<TableType>>\r\n\r\nconst Table: CustomTableType = forwardRef((\r\n { source, rowKey = 'id', paginate = true, toolBarRender, columns = [], ...props },\r\n ref\r\n) => {\r\n const [data, setData] = useState<any[]>([]);\r\n const [pagination, setPagination] = useState(paginate ? { total: 0, current: 1, pageSize: 10 } : null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const fetchData = useCallback(async (options: Params = {}) => {\r\n setLoading(true);\r\n try {\r\n let result;\r\n if (typeof source === 'string') {\r\n const params: any = {};\r\n if (pagination) {\r\n params.page = options.page || pagination.current;\r\n }\r\n result = await request({\r\n url: source,\r\n params\r\n });\r\n } else {\r\n result = await source();\r\n }\r\n\r\n if (paginate && isPagination<any>(result)) {\r\n setPagination({\r\n total: result.total,\r\n current: result.current_page,\r\n pageSize: result.per_page\r\n });\r\n result = result.data;\r\n }\r\n setData(result);\r\n } catch (e) {\r\n\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [source, setData, pagination]);\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, []);\r\n\r\n const action = useRef<TableType>({\r\n reload: fetchData\r\n });\r\n\r\n useEffect(() => {\r\n action.current = {\r\n reload: fetchData\r\n };\r\n }, [fetchData]);\r\n\r\n useImperativeHandle(ref, () => action.current);\r\n\r\n const customColumns = useMemo(() => {\r\n return columns.map((column) => {\r\n const customColumn: BsColumnType<any> = { ...column, render: undefined };\r\n\r\n if ('render' in column && column.render) {\r\n const defaultRender = column.render;\r\n customColumn.render = (value, record, index) => {\r\n return defaultRender({ value, record, index, action: action.current });\r\n };\r\n }\r\n return customColumn;\r\n }) as ColumnsType<any>;\r\n }, [columns, action]);\r\n\r\n const handlePageChange = useCallback((current: number) => {\r\n fetchData({\r\n page: current\r\n });\r\n }, []);\r\n\r\n return <Card>\r\n <Loader loading={loading} />\r\n <Header>\r\n <LeftTools>\r\n {toolBarRender && toolBarRender(action.current)}\r\n </LeftTools>\r\n <RightTools>\r\n <Action onClick={action.current.reload}><i className='bi bi-arrow-repeat' /></Action>\r\n </RightTools>\r\n </Header>\r\n <RcTable {...props} rowKey={rowKey} columns={customColumns} components={components} data={data} />\r\n {pagination && <CustomPagination {...pagination} onChange={handlePageChange} />}\r\n </Card>;\r\n});\r\n\r\nexport default Table;\r\n\r\nconst Header = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n padding-bottom: 1rem;\r\n`;\r\n\r\nconst RightTools = styled(Space)`\r\n\r\n`;\r\nconst LeftTools = styled(Space)`\r\n\r\n`;\r\n\r\nconst Action = styled.span`\r\n cursor: pointer;\r\n font-size: 20px;\r\n line-height: 1;\r\n\r\n &:hover {\r\n color: var(--bs-primary);\r\n }\r\n`;\r\n","import {\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithChildren,\r\n PropsWithoutRef,\r\n RefAttributes,\r\n useImperativeHandle,\r\n useState\r\n} from 'react';\r\nimport { Button, ButtonProps, Modal, ModalProps } from 'react-bootstrap';\r\nimport LoadingButton from './loading-button';\r\n\r\nexport interface ModalButtonProps extends ModalProps {\r\n text: string;\r\n variant?: ButtonProps['variant'];\r\n header?: string;\r\n onOk?: () => any;\r\n footer?: boolean;\r\n}\r\n\r\nexport interface ModalType {\r\n close: () => void;\r\n}\r\n\r\ntype ModalButtonType = ForwardRefExoticComponent<PropsWithoutRef<PropsWithChildren<ModalButtonProps>>\r\n & RefAttributes<ModalType>>\r\n\r\nconst ModalButton: ModalButtonType = forwardRef(({\r\n text,\r\n variant = 'primary',\r\n header = text,\r\n footer = true,\r\n onOk,\r\n size,\r\n children\r\n}, ref) => {\r\n\r\n const [show, setShow] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const handleClose = () => setShow(false);\r\n const handleShow = () => setShow(true);\r\n\r\n useImperativeHandle(ref, () => ({\r\n close: handleClose\r\n }));\r\n\r\n const handleOk = async () => {\r\n if (onOk) {\r\n setLoading(true);\r\n const result = await onOk();\r\n setLoading(false);\r\n if (result === false) {\r\n return;\r\n }\r\n }\r\n handleClose();\r\n };\r\n\r\n return <>\r\n <Button variant={variant} onClick={handleShow}>{text}</Button>\r\n <Modal size={size} show={show} onHide={handleClose}>\r\n {header && <Modal.Header closeButton>\r\n <Modal.Title as='h5'>{header}</Modal.Title>\r\n </Modal.Header>}\r\n <Modal.Body>{children}</Modal.Body>\r\n {footer && <Modal.Footer>\r\n <Button variant='secondary' onClick={handleClose}>\r\n 取消\r\n </Button>\r\n <LoadingButton loading={loading} variant='primary' onClick={handleOk}>\r\n 确定\r\n </LoadingButton>\r\n </Modal.Footer>}\r\n </Modal>\r\n </>;\r\n});\r\n\r\nexport default ModalButton;\r\n","import ModalButton, { ModalButtonProps, ModalType } from './modal-button';\r\nimport { Fragment, useCallback, useRef } from 'react';\r\nimport Form, { FormProps, FormType } from './form';\r\n\r\nexport type ModalFormProps<T = any> =\r\n Pick<ModalButtonProps, 'text' | 'variant' | 'header' | 'size'> &\r\n Pick<FormProps<T>, 'schema' | 'formData' | 'uiSchema' | 'action' | 'method' | 'onSuccess'>\r\n\r\nexport default function ModalForm<T = any>({\r\n text,\r\n header,\r\n schema,\r\n uiSchema,\r\n action,\r\n method,\r\n formData,\r\n variant,\r\n onSuccess,\r\n size\r\n}: ModalFormProps<T>) {\r\n\r\n const form = useRef<FormType>(null);\r\n const modal = useRef<ModalType>(null);\r\n\r\n const handleOk = useCallback(async () => {\r\n try {\r\n const result = await form.current?.submit();\r\n if (onSuccess) {\r\n onSuccess(result);\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }, []);\r\n\r\n return <ModalButton ref={modal} text={text} onOk={handleOk} header={header} variant={variant} size={size}>\r\n <Form\r\n ref={form}\r\n schema={schema}\r\n uiSchema={uiSchema}\r\n action={action}\r\n method={method}\r\n formData={formData}\r\n >\r\n <Fragment />\r\n </Form>\r\n </ModalButton>;\r\n}\r\n","import { useAsyncCallback, UseAsyncCallbackOptions } from 'react-async-hook';\r\nimport request, { Config } from '../request';\r\nimport { DependencyList, useCallback, useEffect } from 'react';\r\nimport { AxiosRequestConfig } from 'axios';\r\n\r\ntype UseRequestOptions<T> = {\r\n manual?: boolean\r\n refreshDeps?: DependencyList;\r\n} & UseAsyncCallbackOptions<T>;\r\n\r\nexport default function useRequest<T = any>(config: Config, {\r\n manual,\r\n refreshDeps,\r\n ...options\r\n}: UseRequestOptions<T> = {}) {\r\n const { execute, currentParams, error, ...others } = useAsyncCallback(async (params?: AxiosRequestConfig) => {\r\n\r\n config = typeof config === 'string' ? { url: config } : config;\r\n\r\n return await request<T>({\r\n ...config,\r\n ...params\r\n });\r\n }, options);\r\n\r\n useEffect(() => {\r\n if (!manual && !refreshDeps) {\r\n execute();\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (refreshDeps) {\r\n refresh();\r\n }\r\n }, refreshDeps);\r\n\r\n\r\n const refresh = useCallback(() => {\r\n if (currentParams) {\r\n execute(...currentParams);\r\n } else {\r\n execute();\r\n }\r\n }, [execute, currentParams]);\r\n\r\n return {\r\n refresh,\r\n execute,\r\n ...others\r\n };\r\n}\r\n"],"names":["FooterWrapper","styled","footer","FooterInner","div","FooterLinks","ul","Copyright","Footer","_jsx","_jsxs","className","src","height","href","formatRelativePath","routes","parent","menus","route","meta","_route$meta","hideInMenu","title","_route$meta2","path","replace","menu","children","_route$meta3","hideChildrenInMenu","length","push","Container","Sidebar","nav","Header","Content","Main","main","Menu","RcMenu","renderMenuItems","items","map","item","SubMenu","MenuItem","Link","to","SiderLayout","basename","useRoutes","useMemo","base","getMenuData","pathname","useLocation","openKeys","keys","split","reduce","pre","curr","join","mode","defaultOpenKeys","selectedKeys","CustomSwal","withReactContent","Swal","defaultOptions","confirmButtonText","cancelButtonText","Message","confirm","async","isConfirmed","fire","icon","showCancelButton","options","error","toast","position","timer","showConfirmButton","Icon","Title","Extra","IconMap","success","info","warning","Result","status","extra","Avatar","a","Dropdown","navbar","Toggle","as","Dimmer","props","active","inverted","Loader","loading","variant","animation","Spinner","rax","attach","axios","defaults","raxConfig","retryDelay","backoffType","shouldRetry","err","config","method","toUpperCase","response","baseURL","interceptors","request","use","token","sessionStorage","getItem","headers","Authorization","Promise","reject","data","location","window","undefined","e","isAxiosError","url","redirectUri","origin","errors","name","Login","parsed","queryString","parse","hash","substr","setItem","access_token","Navigate","Logout","useEffect","catch","removeItem","Root","React","StrictMode","BrowserRouter","Routes","Route","element","Wrap","BsCard","Card","border","Error","Alert","Object","entries","UserContext","createContext","UserProvider","Provider","useUser","user","useContext","Access","require","fallback","passed","intersection","roles","Space","size","small","middle","large","Children","child","Item","NumberFormat","value","locale","currency","formatter","style","minimumFractionDigits","Intl","format","LoadingButton","Button","disabled","RequestButton","onSuccess","setDisabled","useState","handleClick","useCallback","preventDefault","text","result","values","createElement","onClick","localize","Form","forwardRef","action","formData","onSubmit","ref","extraErrors","setExtraErrors","setLoading","setData","handleSubmit","nativeEvent","__errors","mapValues","toExtraErrors","handleChange","transformErrors","keyword","dataPath","property","JsonForm","noHtml5Validate","noValidate","onChange","type","Body","noop","isInteger","isFinite","Math","floor","components","table","BsTable","CustomPagination","total","defaultCurrent","defaultPageSize","current","setCurrent","pageSize","setPageSize","allPages","p","prevPage","nextPage","pagerList","jumpPrev","jumpNext","firstPager","lastPager","i","BsPagination","Last","First","Prev","Next","left","max","right","min","pageBufferSize","unshift","Table","source","rowKey","paginate","toolBarRender","columns","pagination","setPagination","fetchData","params","page","isPagination","current_page","per_page","useRef","reload","useImperativeHandle","customColumns","column","customColumn","render","defaultRender","record","index","handlePageChange","LeftTools","RightTools","Action","RcTable","span","ModalButton","header","onOk","show","setShow","handleClose","close","Modal","onHide","closeButton","ModalForm","schema","uiSchema","form","modal","handleOk","_form$current","submit","Fragment","useRequest","manual","refreshDeps","execute","currentParams","others","useAsyncCallback","refresh"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/footer.tsx","../src/images/logo_dark.svg","../src/utils/get-menu-data.ts","../src/layout/sider.tsx","../src/utils/message.ts","../src/components/result.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/dimmer.tsx","../src/components/loader.tsx","../src/request.ts","../src/components/root.tsx","../src/components/card.tsx","../src/components/error.tsx","../src/components/user-provider.tsx","../src/components/access.tsx","../src/components/space.tsx","../src/components/number-format.tsx","../src/components/loading-button.tsx","../src/components/request-button.tsx","../src/components/form.tsx","../src/components/content.tsx","../src/components/pagination.tsx","../src/components/table.tsx","../src/components/modal-button.tsx","../src/components/modal-form.tsx","../src/hooks/use-request.ts"],"sourcesContent":["import styled from 'styled-components';\r\nimport logo from '../images/logo_dark.svg';\r\n\r\nconst FooterWrapper = styled.footer`\r\n background-color: #505050;\r\n color: #9f9f9f;\r\n padding: 65px 0 30px 0;\r\n\r\n .container {\r\n padding: 0 100px;\r\n }\r\n`;\r\n\r\nconst FooterInner = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n`;\r\n\r\nconst FooterLinks = styled.ul`\r\n display: flex;\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n\r\n li {\r\n margin-left: 60px;\r\n\r\n a {\r\n text-decoration: none;\r\n color: #9f9f9f;\r\n font-size: 20px;\r\n }\r\n }\r\n`;\r\n\r\nconst Copyright = styled.div`\r\n text-align: center;\r\n margin-top: 75px;\r\n`;\r\n\r\n\r\nexport default function Footer() {\r\n return <FooterWrapper>\r\n <div className='container'>\r\n <FooterInner>\r\n <img src={logo} height='40' />\r\n <FooterLinks>\r\n <li><a href='#'>关于我们</a></li>\r\n <li><a href='#'>联系我们</a></li>\r\n <li><a href='#'>加入我们</a></li>\r\n <li><a href='#'>合作伙伴</a></li>\r\n </FooterLinks>\r\n </FooterInner>\r\n <Copyright>\r\n © 2021 上海顶想信息科技有限公司 沪ICP备12007941号-1\r\n </Copyright>\r\n </div>\r\n </FooterWrapper>;\r\n}\r\n","var img = \"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%239f9f9f%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import { PartialRouteObject } from 'react-router';\r\n\r\nexport interface MenuData {\r\n path: string\r\n title: string\r\n children: MenuData[]\r\n}\r\n\r\nconst formatRelativePath = (\r\n routes: PartialRouteObject[],\r\n parent: string = '/',\r\n): MenuData[] => {\r\n\r\n const menus: MenuData[] = [];\r\n\r\n for (const route of routes) {\r\n\r\n if (route.meta?.hideInMenu) {\r\n continue;\r\n }\r\n\r\n const title = route.meta?.title;\r\n if (!title) {\r\n continue;\r\n }\r\n\r\n let path = route.path || '';\r\n\r\n path = `${parent}/${path}`;\r\n\r\n path = path.replace(/\\/+/, '/').replace(/\\/$/, '');\r\n\r\n const menu: MenuData = {\r\n title,\r\n path,\r\n children: []\r\n };\r\n\r\n if (!route.meta?.hideChildrenInMenu) {\r\n if (route.children && route.children.length > 0) {\r\n menu.children = formatRelativePath(route.children, path);\r\n }\r\n }\r\n\r\n menus.push(menu);\r\n }\r\n\r\n return menus;\r\n};\r\n\r\nexport default function getMenuData(routes: PartialRouteObject[], base: string = '/'): MenuData[] {\r\n return formatRelativePath(routes, base);\r\n}\r\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\r\nimport Footer from '../components/footer';\r\nimport { Link, useLocation, useRoutes } from 'react-router-dom';\r\nimport { useMemo } from 'react';\r\nimport styled from 'styled-components';\r\nimport 'rc-menu/assets/index.css';\r\nimport type { PartialRouteObject } from 'react-router';\r\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\r\nimport type { CSSMotionProps } from 'rc-motion';\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-wrap: nowrap;\r\n width: 100%;\r\n`;\r\n\r\nconst Sidebar = styled.nav`\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 100;\r\n padding: 60px 0 0;\r\n border-right: 1px solid #e3e3e3;\r\n width: 230px;\r\n background-color: #f5f5f5;\r\n`;\r\n\r\nconst Header = styled.div`\r\n padding-top: 10px;\r\n height: 54px;\r\n line-height: 44px;\r\n text-indent: 24px;\r\n`;\r\n\r\nconst Content = styled.div`\r\n margin-left: 230px;\r\n flex: 1;\r\n`;\r\n\r\nconst Main = styled.main`\r\n min-height: calc(100vh - 60px);\r\n position: relative;\r\n`;\r\n\r\nconst Menu = styled(RcMenu)`\r\n border: none;\r\n box-shadow: none;\r\n padding: 10px 0;\r\n\r\n .rc-menu-item {\r\n display: flex;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n\r\n a {\r\n flex: 1;\r\n text-decoration: none;\r\n color: inherit;\r\n }\r\n }\r\n\r\n .rc-menu-sub {\r\n background-color: #eee;\r\n border-top: 1px solid #eee;\r\n border-bottom: 1px solid #eee;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 4px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 4px;\r\n }\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #eee;\r\n color: var(--bs-primary);\r\n }\r\n\r\n .rc-menu-item-active {\r\n background-color: #eee;\r\n }\r\n\r\n .rc-menu-item {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-submenu {\r\n & > .rc-menu-submenu-title {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #eee;\r\n }\r\n\r\n .rc-menu-item,\r\n .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding: 0 8px 0 24px;\r\n font-size: 14px;\r\n line-height: 36px;\r\n cursor: pointer;\r\n }\r\n\r\n .rc-menu-sub > .rc-menu-item,\r\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding-top: 0;\r\n padding-bottom: 0;\r\n padding-right: 0;\r\n }\r\n\r\n .rc-menu-submenu-arrow {\r\n line-height: 38px;\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #f5f5f5;\r\n color: var(--bs-primary);\r\n }\r\n\r\n .rc-menu-submenu-selected {\r\n background-color: #eee;\r\n\r\n .rc-menu-submenu-title {\r\n color: var(--bs-primary);\r\n font-weight: 500;\r\n }\r\n }\r\n\r\n & > .rc-menu-item {\r\n line-height: 38px;\r\n }\r\n\r\n & > .rc-menu-submenu {\r\n &.rc-menu-submenu-selected {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-submenu-title {\r\n line-height: 38px;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n }\r\n\r\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-sub {\r\n border-top: 1px solid #e6e6e6;\r\n border-bottom: 1px solid #e6e6e6;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 9px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 9px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n`;\r\n\r\ninterface Props {\r\n title: string;\r\n routes: PartialRouteObject[];\r\n basename: string;\r\n}\r\n\r\nconst renderMenuItems = (items: MenuData[]) => {\r\n return items.map((item) => {\r\n if (item.children.length > 0) {\r\n return <SubMenu title={item.title} key={item.path}>\r\n {renderMenuItems(item.children)}\r\n </SubMenu>;\r\n } else {\r\n return <MenuItem key={item.path}>\r\n <Link to={item.path}>{item.title}</Link>\r\n </MenuItem>;\r\n }\r\n });\r\n};\r\n\r\nconst collapseNode = () => {\r\n return { height: 0 };\r\n};\r\nconst expandNode = (node: HTMLElement) => {\r\n return { height: node.scrollHeight };\r\n};\r\n\r\nconst motion: CSSMotionProps = {\r\n motionName: 'rc-menu-collapse',\r\n motionAppear: true,\r\n onAppearStart: collapseNode,\r\n onAppearActive: expandNode,\r\n onEnterStart: collapseNode,\r\n onEnterActive: expandNode,\r\n onLeaveStart: expandNode,\r\n onLeaveActive: collapseNode,\r\n};\r\n\r\n\r\nexport default function SiderLayout({ routes, basename, title }: Props) {\r\n\r\n const children = useRoutes(routes);\r\n\r\n const menu = useMemo(() => getMenuData(routes, basename), [routes, basename]);\r\n\r\n const { pathname } = useLocation();\r\n\r\n const openKeys = useMemo(() => {\r\n const keys: string[] = [];\r\n const parts = pathname.split('/');\r\n parts.reduce<string[]>((pre, curr) => {\r\n if (pre.length > 1) {\r\n keys.push(pre.join('/'));\r\n }\r\n return [...pre, curr];\r\n }, []);\r\n\r\n return keys;\r\n }, []);\r\n\r\n return <Container>\r\n <Sidebar>\r\n <Header>{title}</Header>\r\n <Menu mode='inline' motion={motion} defaultOpenKeys={openKeys} selectedKeys={[pathname]}>\r\n {renderMenuItems(menu)}\r\n </Menu>\r\n </Sidebar>\r\n <Content>\r\n <Main>{children}</Main>\r\n <Footer />\r\n </Content>\r\n </Container>;\r\n}\r\n","import Swal from 'sweetalert2/dist/sweetalert2.js';\r\nimport withReactContent from 'sweetalert2-react-content';\r\n\r\nconst CustomSwal = withReactContent(Swal);\r\n\r\ninterface MessageOptions {\r\n title?: string;\r\n text?: string;\r\n}\r\n\r\nconst defaultOptions = {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消'\r\n};\r\n\r\nconst Message = {\r\n confirm: async (options: MessageOptions) => {\r\n const { isConfirmed } = await CustomSwal.fire({\r\n ...defaultOptions,\r\n icon: 'warning',\r\n showCancelButton: true,\r\n ...options\r\n });\r\n\r\n return isConfirmed;\r\n },\r\n error: (options: MessageOptions) => {\r\n CustomSwal.fire({\r\n ...defaultOptions,\r\n toast: true,\r\n position: 'top',\r\n icon: 'error',\r\n timer: 3000,\r\n showConfirmButton: false,\r\n ...options\r\n });\r\n }\r\n};\r\n\r\nexport default Message;\r\n","import { ReactNode } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nconst Container = styled.div`\r\n padding: 48px 32px;\r\n`;\r\n\r\nconst Icon = styled.div`\r\n margin-bottom: 24px;\r\n text-align: center;\r\n font-size: 72px;\r\n`;\r\n\r\nconst Title = styled.div`\r\n color: rgba(0, 0, 0, .85);\r\n font-size: 24px;\r\n line-height: 1.8;\r\n text-align: center;\r\n`;\r\n\r\nconst Extra = styled.div`\r\n margin-top: 32px;\r\n text-align: center;\r\n`;\r\n\r\nconst IconMap = {\r\n success: <i className='bi bi-check-circle-fill text-success' />,\r\n error: <i className='bi bi-exclamation-circle-fill text-danger' />,\r\n info: <i className='bi bi-info-circle-fill text-info' />,\r\n warning: <i className='bi bi-exclamation-triangle-fill text-warning' />,\r\n};\r\n\r\ninterface ResultProps {\r\n status?: keyof typeof IconMap\r\n icon?: ReactNode\r\n title?: string\r\n extra?: ReactNode;\r\n}\r\n\r\nexport default function Result({ status, title, icon, extra }: ResultProps) {\r\n\r\n if (!icon && status) {\r\n icon = IconMap[status];\r\n }\r\n\r\n return <Container>\r\n {icon && <Icon>{icon}</Icon>}\r\n {title && <Title>{title}</Title>}\r\n {extra && <Extra>{extra}</Extra>}\r\n </Container>;\r\n}\r\n","import logo from '../images/logo.svg';\r\nimport { Dropdown } from 'react-bootstrap';\r\nimport styled from 'styled-components';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\n\r\nconst Avatar = styled.a`\r\n cursor: pointer;\r\n`;\r\n\r\ninterface Props {\r\n menus: ReactNode\r\n}\r\n\r\nexport default function Header({ children, menus }: PropsWithChildren<Props>) {\r\n\r\n return <header className='navbar navbar-light bg-white border-bottom sticky-top'>\r\n <div className='container-fluid'>\r\n <a className='navbar-brand' href='https://www.topthink.com'>\r\n <img src={logo} height='30' />\r\n </a>\r\n {children}\r\n <div className='d-flex align-items-center'>\r\n <Dropdown navbar>\r\n <Dropdown.Toggle as={Avatar} className='nav-link'>\r\n <i className='bi bi-person-circle' />\r\n </Dropdown.Toggle>\r\n <Dropdown.Menu className={'shadow-sm'}>\r\n {menus}\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n </div>\r\n </header>;\r\n}\r\n","var img = \"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import styled from 'styled-components';\r\n\r\nexport const Dimmable = styled.div`\r\n position: relative;\r\n`;\r\n\r\ninterface DimmerProps {\r\n active?: boolean\r\n inverted?: boolean\r\n}\r\n\r\nconst Dimmer = styled.div<DimmerProps>`\r\n display: ${props => props.active ? 'flex' : 'none'};\r\n position: absolute;\r\n top: 0 !important;\r\n left: 0 !important;\r\n width: 100%;\r\n height: 100%;\r\n text-align: center;\r\n vertical-align: middle;\r\n padding: 1em;\r\n background-color: ${props => props.inverted ? 'rgba(255, 255, 255, .85)' : 'rgba(0, 0, 0, .85)'};\r\n opacity: ${props => props.active ? 1 : 0};\r\n line-height: 1;\r\n animation-fill-mode: both;\r\n animation-duration: .5s;\r\n transition: background-color .5s linear;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n user-select: none;\r\n will-change: opacity;\r\n z-index: 990;\r\n`;\r\n\r\nexport default Dimmer;\r\n","import { PropsWithChildren } from 'react';\r\nimport { Spinner, SpinnerProps } from 'react-bootstrap';\r\nimport Dimmer from './dimmer';\r\n\r\ninterface LoaderProps {\r\n loading?: boolean\r\n animation?: SpinnerProps['animation']\r\n}\r\n\r\nexport default function Loader({\r\n loading = true,\r\n children,\r\n variant = 'success',\r\n animation = 'border',\r\n ...props\r\n}: PropsWithChildren<LoaderProps & Omit<SpinnerProps, 'animation'>>) {\r\n if (!loading) {\r\n return null;\r\n }\r\n\r\n if (children) {\r\n children = <p className='mt-3 text-secondary'>{children}</p>;\r\n }\r\n\r\n return <Dimmer inverted active>\r\n <Spinner animation={animation} variant={variant} {...props} />\r\n {children}\r\n </Dimmer>;\r\n}\r\n","import axios, { AxiosRequestConfig } from 'axios';\r\nimport * as rax from 'retry-axios';\r\n\r\nexport type Errors = string | {\r\n [key: string]: string\r\n}\r\n\r\ndeclare module 'axios' {\r\n interface AxiosError {\r\n errors: Errors;\r\n }\r\n}\r\n\r\nrax.attach();\r\naxios.defaults.raxConfig = {\r\n retryDelay: 2000,\r\n backoffType: 'static',\r\n shouldRetry: (err) => {\r\n return (\r\n err.config.method?.toUpperCase() === 'GET'\r\n && err.response?.status === 449\r\n );\r\n }\r\n};\r\naxios.defaults.baseURL = '/api';\r\naxios.interceptors.request.use(\r\n config => {\r\n const token = sessionStorage.getItem('authorization');\r\n\r\n if (token) {\r\n config.headers.Authorization = `Bearer ${token}`;\r\n }\r\n return config;\r\n },\r\n error => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\naxios.interceptors.response.use(\r\n response => {\r\n if (response.status === 201 && response.data.location) {\r\n window.location.href = response.data.location;\r\n response.data = undefined;\r\n }\r\n\r\n return response;\r\n },\r\n e => {\r\n if (axios.isAxiosError(e)) {\r\n if (e.response) {\r\n const { data, status } = e.response;\r\n if (status === 401) {\r\n const { url } = data;\r\n if (url) {\r\n const redirectUri = window.location.origin + '/login';\r\n window.location.href = `${url}&redirect_uri=${redirectUri}`;\r\n }\r\n e.errors = 'Unauthorized';\r\n } else {\r\n let errors: Errors = {};\r\n if (status === 422 && typeof data === 'object') {\r\n for (let name in data) {\r\n errors[name] = data[name];\r\n }\r\n } else if ((typeof data === 'object') && ('message' in data)) {\r\n errors = data['message'];\r\n } else {\r\n errors = data;\r\n }\r\n e.errors = errors;\r\n }\r\n }\r\n }\r\n return Promise.reject(e);\r\n }\r\n);\r\n\r\nexport type Config = AxiosRequestConfig | string\r\n\r\nconst request = async function <T = any>(config: Config) {\r\n config = typeof config === 'string' ? { url: config } : config;\r\n\r\n const { data } = await axios.request<T>({\r\n ...config\r\n });\r\n\r\n return data;\r\n};\r\n\r\nexport default request;\r\n","import { PropsWithChildren, useEffect } from 'react';\r\nimport { BrowserRouter, Navigate, Route, Routes, useLocation } from 'react-router-dom';\r\nimport queryString from 'query-string';\r\nimport Loader from './loader';\r\nimport request from '../request';\r\n\r\nfunction Login() {\r\n\r\n const location = useLocation();\r\n\r\n const parsed = queryString.parse(location.hash.substr(1));\r\n\r\n sessionStorage.setItem('authorization', parsed.access_token as string);\r\n\r\n return <Navigate to='/' replace />;\r\n}\r\n\r\nfunction Logout() {\r\n\r\n useEffect(() => {\r\n request('/logout').catch(() => {\r\n sessionStorage.removeItem('authorization');\r\n });\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n\r\nexport default function Root({ children }: PropsWithChildren<any>) {\r\n\r\n return <BrowserRouter>\r\n <Routes>\r\n <Route path='*' element={children} />\r\n <Route path='login' element={<Login />} />\r\n <Route path='logout' element={<Logout />} />\r\n </Routes>\r\n </BrowserRouter>;\r\n}\r\n","import { PropsWithChildren } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Card as BsCard, CardProps as BsCardProps } from 'react-bootstrap';\r\n\r\ninterface CardProps extends BsCardProps {\r\n title?: string;\r\n}\r\n\r\nconst Wrap = styled(BsCard)`\r\n margin-bottom: 1rem;\r\n`;\r\n\r\nexport default function Card({ children, title, border = 'light', ...props }: PropsWithChildren<CardProps>) {\r\n\r\n return <Wrap border={border} {...props}>\r\n <div className='card-body'>\r\n {title && <div className='card-title h5'>{title}</div>}\r\n {children}\r\n </div>\r\n </Wrap>;\r\n}\r\n","import { Alert } from 'react-bootstrap';\r\nimport { Errors } from '../request';\r\n\r\nexport default function Error({ errors }: { errors?: Errors }) {\r\n if (!errors) {\r\n return null;\r\n }\r\n return <Alert variant='danger'>\r\n <ul className='mb-0'>\r\n {typeof errors === 'string'\r\n ? <li>{errors}</li>\r\n : Object.entries(errors).map(([name, error]) => <li key={name}>{error}</li>)\r\n }\r\n </ul>\r\n </Alert>;\r\n}\r\n","import React, { useContext } from 'react';\r\n\r\nexport interface User {\r\n id: number\r\n name: string\r\n email: string\r\n mobile: string\r\n is_certified: boolean\r\n roles: []\r\n}\r\n\r\nconst UserContext = React.createContext<User | null>(null);\r\n\r\nconst UserProvider = UserContext.Provider;\r\n\r\nexport function useUser() {\r\n const user = useContext(UserContext);\r\n if (!user) {\r\n throw new Error('please use `useUser` in UserContext');\r\n }\r\n\r\n return user;\r\n}\r\n\r\nexport default UserProvider;\r\n","import { ReactNode } from 'react';\r\nimport { intersection } from 'lodash';\r\nimport { User, useUser } from './user-provider';\r\n\r\nexport interface AccessProps {\r\n require?: string | string[] | ((user: User) => boolean)\r\n fallback?: ReactNode\r\n children: ReactNode\r\n}\r\n\r\nexport default function Access({\r\n require,\r\n children,\r\n fallback\r\n}: AccessProps) {\r\n const user = useUser();\r\n let passed = false;\r\n if (typeof require === 'function') {\r\n passed = require(user);\r\n } else {\r\n if (typeof require === 'string') {\r\n require = [require];\r\n }\r\n passed = intersection(user.roles, require).length > 0;\r\n }\r\n if (!passed) {\r\n children = fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n","import { Children, ReactNode } from 'react';\r\nimport styled from 'styled-components';\r\n\r\ninterface SpaceProps {\r\n children: ReactNode;\r\n size?: 'small' | 'middle' | 'large' | number;\r\n}\r\n\r\n\r\nexport default function Space({ children, size = 'small' }: SpaceProps) {\r\n\r\n if (typeof size === 'string') {\r\n size = {\r\n small: 8,\r\n middle: 16,\r\n large: 24\r\n }[size];\r\n }\r\n\r\n const items = Children.map(children, (child) => {\r\n return <Item size={size as number}>{child}</Item>;\r\n });\r\n\r\n return <Container>\r\n {items}\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.div`\r\n display: inline-flex;\r\n align-items: center;\r\n`;\r\n\r\nconst Item = styled.div<{ size: number }>`\r\n margin-right: ${props => props.size}px;\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n`;\r\n","import { useMemo } from 'react';\r\n\r\ninterface Props {\r\n value: number;\r\n currency?: boolean;\r\n locale?: string;\r\n}\r\n\r\nexport default function NumberFormat({ value, locale = 'zh-CN', currency = true }: Props) {\r\n\r\n const formatter = useMemo(() => {\r\n\r\n let options = {};\r\n\r\n if (currency) {\r\n options = {\r\n style: 'currency',\r\n currency: 'CNY',\r\n ...options\r\n };\r\n } else {\r\n options = {\r\n minimumFractionDigits: 2,\r\n };\r\n }\r\n\r\n return new Intl.NumberFormat(locale, options);\r\n }, [currency, locale]);\r\n\r\n return <>{formatter.format(value)}</>;\r\n}\r\n","import { Button, ButtonProps } from 'react-bootstrap';\r\n\r\ninterface CustomButtonProps extends ButtonProps {\r\n loading: boolean\r\n}\r\n\r\nexport default function LoadingButton({ loading, children, ...props }: CustomButtonProps) {\r\n\r\n return <Button {...props} disabled={loading}>\r\n {loading ? 'Loading…' : children}\r\n </Button>;\r\n}\r\n","import { Button, ButtonProps } from 'react-bootstrap';\r\nimport request, { Config } from '../request';\r\nimport { createElement, useCallback, useState, MouseEvent } from 'react';\r\nimport Message from '../utils/message';\r\nimport axios, { AxiosRequestConfig } from 'axios';\r\n\r\ninterface Props extends ButtonProps {\r\n url: Config;\r\n method?: AxiosRequestConfig['method'];\r\n confirm?: string;\r\n onSuccess?: (result: any) => void;\r\n}\r\n\r\nexport default function RequestButton({ url, method, confirm, onSuccess, children, as = Button, ...props }: Props) {\r\n\r\n const [disabled, setDisabled] = useState(false);\r\n\r\n const handleClick = useCallback(async (e: MouseEvent) => {\r\n e.preventDefault();\r\n try {\r\n setDisabled(true);\r\n if (confirm) {\r\n if (!await Message.confirm({ text: confirm })) {\r\n return;\r\n }\r\n }\r\n\r\n const config = typeof url === 'string' ? { url, method } : { method, ...url };\r\n\r\n const result = await request(config);\r\n\r\n if (onSuccess) {\r\n onSuccess(result);\r\n }\r\n } catch (e) {\r\n if (axios.isAxiosError(e)) {\r\n let errors = e.errors;\r\n if (typeof e.errors !== 'string') {\r\n errors = Object.values(e.errors).join('<br />');\r\n }\r\n Message.error({ text: errors as string });\r\n } else {\r\n throw e;\r\n }\r\n } finally {\r\n setDisabled(false);\r\n }\r\n }, [url, method]);\r\n\r\n return createElement(as, {\r\n ...props,\r\n disabled,\r\n onClick: handleClick\r\n }, children);\r\n}\r\n","import JsonForm, { JsonFormProps, JsonFormType } from '@topthink/json-form';\r\nimport * as React from 'react';\r\nimport { forwardRef, ForwardRefExoticComponent, PropsWithoutRef, RefAttributes, useCallback, useState } from 'react';\r\nimport axios, { AxiosError, Method } from 'axios';\r\nimport LoadingButton from './loading-button';\r\nimport request from '../request';\r\nimport { mapValues } from 'lodash';\r\nimport { AjvError, ISubmitEvent } from '@rjsf/core';\r\n\r\nconst localize = require('ajv-i18n/localize/zh');\r\n\r\nexport interface FormProps<T = any> extends JsonFormProps<T> {\r\n onSuccess?: (data: any) => void;\r\n method?: Method;\r\n}\r\n\r\ntype Error = {\r\n __errors: string[]\r\n}\r\n\r\ntype Errors = Error | {\r\n [key: string]: Error\r\n}\r\n\r\nconst toExtraErrors = (error: AxiosError): Errors => {\r\n const errors = error.errors;\r\n if (typeof errors === 'string') {\r\n return {\r\n __errors: [errors]\r\n };\r\n }\r\n return mapValues(errors, (e) => {\r\n return {\r\n __errors: [e]\r\n };\r\n });\r\n};\r\n\r\nexport interface FormType extends JsonFormType {\r\n\r\n}\r\n\r\ntype Form<T = any> = ForwardRefExoticComponent<PropsWithoutRef<FormProps<T>> & RefAttributes<FormType>>\r\n\r\nconst Form: Form = forwardRef(({\r\n action,\r\n method = 'post',\r\n onSuccess,\r\n formData,\r\n onSubmit,\r\n children,\r\n ...props\r\n}, ref) => {\r\n\r\n const [extraErrors, setExtraErrors] = useState<Errors>();\r\n const [loading, setLoading] = useState(false);\r\n const [data, setData] = useState(formData);\r\n\r\n const handleSubmit = useCallback(async (e: ISubmitEvent<any>, nativeEvent: React.FormEvent<HTMLFormElement>) => {\r\n try {\r\n setLoading(true);\r\n if (action) {\r\n const { formData } = e;\r\n try {\r\n const data = await request({\r\n url: action,\r\n method,\r\n data: formData\r\n });\r\n setExtraErrors(undefined);\r\n if (onSuccess) {\r\n await onSuccess(data);\r\n }\r\n } catch (e) {\r\n if (axios.isAxiosError(e)) {\r\n setExtraErrors(toExtraErrors(e));\r\n }\r\n\r\n throw e;\r\n }\r\n } else if (onSubmit) {\r\n await onSubmit(e, nativeEvent);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [action, method, onSubmit]);\r\n\r\n const handleChange = useCallback(({ formData }: ISubmitEvent<any>) => {\r\n setData(formData);\r\n }, [setData]);\r\n\r\n const transformErrors = useCallback((errors: AjvError[]) => {\r\n errors = errors.map(error => ({\r\n keyword: error.name,\r\n dataPath: error.property,\r\n ...error\r\n }));\r\n\r\n localize(errors);\r\n\r\n return errors;\r\n }, []);\r\n\r\n return <JsonForm\r\n ref={ref}\r\n extraErrors={extraErrors}\r\n onSubmit={handleSubmit}\r\n transformErrors={transformErrors}\r\n noHtml5Validate\r\n noValidate\r\n {...props}\r\n formData={data}\r\n onChange={handleChange}\r\n >\r\n {children || <div className='col-12'>\r\n <LoadingButton loading={loading} type='submit' variant='primary'>提交</LoadingButton>\r\n </div>}\r\n </JsonForm>;\r\n});\r\n\r\nexport default Form;\r\n","import styled from 'styled-components';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\n\r\nconst Container = styled.div`\r\n width: 100%;\r\n`;\r\n\r\nconst Header = styled.div`\r\n background-color: #fff;\r\n display: flex;\r\n\r\n .container {\r\n padding: 0 24px;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n }\r\n`;\r\n\r\nconst Body = styled.div`\r\n margin-top: 24px;\r\n`;\r\n\r\nconst Title = styled.div`\r\n font-size: 22px;\r\n line-height: 64px;\r\n height: 64px;\r\n`;\r\n\r\nconst Extra = styled.div`\r\n\r\n`;\r\n\r\ninterface ContentProps {\r\n title: string\r\n extra?: ReactNode\r\n}\r\n\r\nexport default function Content({ title, children, extra }: PropsWithChildren<ContentProps>) {\r\n return <Container>\r\n <Header>\r\n <div className='container'>\r\n <Title>{title}</Title>\r\n <Extra>{extra}</Extra>\r\n </div>\r\n </Header>\r\n <Body className='container'>\r\n {children}\r\n </Body>\r\n </Container>;\r\n};\r\n","import { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { Pagination as BsPagination } from 'react-bootstrap';\r\n\r\nfunction noop() {\r\n}\r\n\r\n\r\nfunction isInteger(value: any): value is number {\r\n return (\r\n typeof value === 'number' && isFinite(value) && Math.floor(value) === value\r\n );\r\n}\r\n\r\nexport interface PaginationProps {\r\n className?: string\r\n total: number\r\n current?: number\r\n defaultCurrent?: number\r\n pageSize?: number\r\n defaultPageSize?: number,\r\n onChange?: (current: number, pageSize: number) => void\r\n}\r\n\r\nexport default function Pagination({\r\n total = 0,\r\n onChange = noop,\r\n defaultCurrent = 1,\r\n defaultPageSize = 10,\r\n className,\r\n ...props\r\n}: PaginationProps) {\r\n\r\n const [current, setCurrent] = useState(defaultCurrent);\r\n const [pageSize, setPageSize] = useState(defaultPageSize);\r\n\r\n useEffect(() => {\r\n if (isInteger(props.current)) {\r\n setCurrent(props.current);\r\n }\r\n }, [props.current]);\r\n\r\n useEffect(() => {\r\n if (isInteger(props.pageSize)) {\r\n setPageSize(props.pageSize);\r\n }\r\n }, [props.pageSize]);\r\n\r\n const allPages = useMemo(() => {\r\n return Math.floor((total - 1) / pageSize) + 1;\r\n }, [total, pageSize]);\r\n\r\n const handleChange = useCallback((p: number) => {\r\n return () => {\r\n if (p !== current) {\r\n setCurrent(p);\r\n onChange(p, pageSize);\r\n }\r\n };\r\n }, [onChange, current, pageSize]);\r\n\r\n const pageBufferSize = 2;\r\n const prevPage = current - 1 > 0 ? current - 1 : 0;\r\n const nextPage = current + 1 < allPages ? current + 1 : allPages;\r\n\r\n const pagerList = [];\r\n let jumpPrev = null;\r\n let jumpNext = null;\r\n let firstPager = null;\r\n let lastPager = null;\r\n\r\n if (allPages <= 3 + pageBufferSize * 2) {\r\n for (let i = 1; i <= allPages; i += 1) {\r\n const active = current === i;\r\n pagerList.push(\r\n <BsPagination.Item key={i} active={active} onClick={handleChange(i)}>{i}</BsPagination.Item>\r\n );\r\n }\r\n } else {\r\n lastPager = <BsPagination.Last key='last' onClick={handleChange(allPages)} />;\r\n firstPager = <BsPagination.First key='first' onClick={handleChange(1)} />;\r\n jumpPrev = <BsPagination.Prev key='prev' onClick={handleChange(prevPage)} />;\r\n jumpNext = <BsPagination.Next key='next' onClick={handleChange(nextPage)} />;\r\n\r\n let left = Math.max(1, current - pageBufferSize);\r\n let right = Math.min(current + pageBufferSize, allPages);\r\n\r\n if (current - 1 <= pageBufferSize) {\r\n right = 1 + pageBufferSize * 2;\r\n }\r\n\r\n if (allPages - current <= pageBufferSize) {\r\n left = allPages - pageBufferSize * 2;\r\n }\r\n\r\n for (let i = left; i <= right; i += 1) {\r\n const active = current === i;\r\n pagerList.push(\r\n <BsPagination.Item key={i} active={active} onClick={handleChange(i)}>{i}</BsPagination.Item>\r\n );\r\n }\r\n\r\n if (current - 1 >= pageBufferSize * 2 && current !== 1 + 2) {\r\n pagerList.unshift(jumpPrev);\r\n }\r\n if (\r\n allPages - current >= pageBufferSize * 2 &&\r\n current !== allPages - 2\r\n ) {\r\n pagerList.push(jumpNext);\r\n }\r\n\r\n if (left !== 1) {\r\n pagerList.unshift(firstPager);\r\n }\r\n if (right !== allPages) {\r\n pagerList.push(lastPager);\r\n }\r\n }\r\n\r\n return <BsPagination className={className}>\r\n {pagerList}\r\n </BsPagination>;\r\n\r\n}\r\n","import RcTable from 'rc-table';\r\nimport { TableProps as RcTableProps } from 'rc-table/lib/Table';\r\nimport { ColumnGroupType, ColumnsType, ColumnType as BsColumnType, RenderedCell } from 'rc-table/lib/interface';\r\nimport { Table as BsTable, TableProps as BsTableProps } from 'react-bootstrap';\r\nimport {\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithChildren,\r\n PropsWithoutRef,\r\n ReactNode,\r\n RefAttributes,\r\n useCallback,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState\r\n} from 'react';\r\nimport Pagination from './pagination';\r\nimport styled from 'styled-components';\r\nimport request from '../request';\r\nimport Card from './card';\r\nimport Loader from './loader';\r\nimport Space from './space';\r\n\r\nexport interface TableType {\r\n reload: () => void;\r\n}\r\n\r\ninterface ColumnType<RecordType> extends Omit<BsColumnType<RecordType>, 'render'> {\r\n render?: (data: { value: any, record: RecordType, index: number, action: TableType }) => ReactNode | RenderedCell<RecordType>;\r\n}\r\n\r\nexport type Columns<RecordType = any> = (ColumnGroupType<RecordType> | ColumnType<RecordType>)[]\r\n\r\nconst CustomTable = (props: BsTableProps) => {\r\n return <BsTable {...props} className='align-middle table-hover' />;\r\n};\r\n\r\nconst components: RcTableProps['components'] = {\r\n table: CustomTable,\r\n};\r\n\r\nexport interface PaginationType<T = any> {\r\n total: number;\r\n current_page: number;\r\n per_page: number;\r\n last_page: number;\r\n data: T[];\r\n}\r\n\r\nconst CustomPagination = styled(Pagination)`\r\n margin-bottom: 0;\r\n justify-content: flex-end;\r\n`;\r\n\r\nfunction isPagination<T>(data: any): data is PaginationType<T> {\r\n return 'current_page' in data;\r\n}\r\n\r\nexport interface TableProps<RecordType = any> extends Omit<RcTableProps<RecordType>, 'children' | 'columns'> {\r\n source: string | (() => Promise<any>);\r\n paginate?: boolean;\r\n columns: Columns<RecordType>;\r\n toolBarRender?: (action: TableType) => ReactNode;\r\n}\r\n\r\ntype Params = {\r\n page?: number;\r\n sortField?: string;\r\n sortOrder?: number;\r\n [key: string]: any;\r\n};\r\n\r\ntype CustomTableType<T = any> = ForwardRefExoticComponent<PropsWithoutRef<PropsWithChildren<TableProps<T>>>\r\n & RefAttributes<TableType>>\r\n\r\nconst Table: CustomTableType = forwardRef((\r\n { source, rowKey = 'id', paginate = true, toolBarRender, columns = [], ...props },\r\n ref\r\n) => {\r\n const [data, setData] = useState<any[]>([]);\r\n const [pagination, setPagination] = useState(paginate ? { total: 0, current: 1, pageSize: 10 } : null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const fetchData = useCallback(async (options: Params = {}) => {\r\n setLoading(true);\r\n try {\r\n let result;\r\n if (typeof source === 'string') {\r\n const params: any = {};\r\n if (pagination) {\r\n params.page = options.page || pagination.current;\r\n }\r\n result = await request({\r\n url: source,\r\n params\r\n });\r\n } else {\r\n result = await source();\r\n }\r\n\r\n if (paginate && isPagination<any>(result)) {\r\n setPagination({\r\n total: result.total,\r\n current: result.current_page,\r\n pageSize: result.per_page\r\n });\r\n result = result.data;\r\n }\r\n setData(result);\r\n } catch (e) {\r\n\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [source, setData, pagination]);\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, []);\r\n\r\n const action = useRef<TableType>({\r\n reload: fetchData\r\n });\r\n\r\n useEffect(() => {\r\n action.current = {\r\n reload: fetchData\r\n };\r\n }, [fetchData]);\r\n\r\n useImperativeHandle(ref, () => action.current);\r\n\r\n const customColumns = useMemo(() => {\r\n return columns.map((column) => {\r\n const customColumn: BsColumnType<any> = { ...column, render: undefined };\r\n\r\n if ('render' in column && column.render) {\r\n const defaultRender = column.render;\r\n customColumn.render = (value, record, index) => {\r\n return defaultRender({ value, record, index, action: action.current });\r\n };\r\n }\r\n return customColumn;\r\n }) as ColumnsType<any>;\r\n }, [columns, action]);\r\n\r\n const handlePageChange = useCallback((current: number) => {\r\n fetchData({\r\n page: current\r\n });\r\n }, []);\r\n\r\n return <Card>\r\n <Loader loading={loading} />\r\n <Header>\r\n <LeftTools>\r\n {toolBarRender && toolBarRender(action.current)}\r\n </LeftTools>\r\n <RightTools>\r\n <Action onClick={action.current.reload}><i className='bi bi-arrow-repeat' /></Action>\r\n </RightTools>\r\n </Header>\r\n <RcTable {...props} rowKey={rowKey} columns={customColumns} components={components} data={data} />\r\n {pagination && <CustomPagination {...pagination} onChange={handlePageChange} />}\r\n </Card>;\r\n});\r\n\r\nexport default Table;\r\n\r\nconst Header = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n padding-bottom: 1rem;\r\n`;\r\n\r\nconst RightTools = styled(Space)`\r\n\r\n`;\r\nconst LeftTools = styled(Space)`\r\n\r\n`;\r\n\r\nconst Action = styled.span`\r\n cursor: pointer;\r\n font-size: 20px;\r\n line-height: 1;\r\n\r\n &:hover {\r\n color: var(--bs-primary);\r\n }\r\n`;\r\n","import {\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithChildren,\r\n PropsWithoutRef,\r\n RefAttributes,\r\n useImperativeHandle,\r\n useState\r\n} from 'react';\r\nimport { Button, ButtonProps, Modal, ModalProps } from 'react-bootstrap';\r\nimport LoadingButton from './loading-button';\r\n\r\nexport interface ModalButtonProps extends ModalProps {\r\n text: string;\r\n variant?: ButtonProps['variant'];\r\n header?: string;\r\n onOk?: () => any;\r\n footer?: boolean;\r\n}\r\n\r\nexport interface ModalType {\r\n close: () => void;\r\n}\r\n\r\ntype ModalButtonType = ForwardRefExoticComponent<PropsWithoutRef<PropsWithChildren<ModalButtonProps>>\r\n & RefAttributes<ModalType>>\r\n\r\nconst ModalButton: ModalButtonType = forwardRef(({\r\n text,\r\n variant = 'primary',\r\n header = text,\r\n footer = true,\r\n onOk,\r\n size,\r\n children\r\n}, ref) => {\r\n\r\n const [show, setShow] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const handleClose = () => setShow(false);\r\n const handleShow = () => setShow(true);\r\n\r\n useImperativeHandle(ref, () => ({\r\n close: handleClose\r\n }));\r\n\r\n const handleOk = async () => {\r\n if (onOk) {\r\n setLoading(true);\r\n const result = await onOk();\r\n setLoading(false);\r\n if (result === false) {\r\n return;\r\n }\r\n }\r\n handleClose();\r\n };\r\n\r\n return <>\r\n <Button variant={variant} onClick={handleShow}>{text}</Button>\r\n <Modal size={size} show={show} onHide={handleClose}>\r\n {header && <Modal.Header closeButton>\r\n <Modal.Title as='h5'>{header}</Modal.Title>\r\n </Modal.Header>}\r\n <Modal.Body>{children}</Modal.Body>\r\n {footer && <Modal.Footer>\r\n <Button variant='secondary' onClick={handleClose}>\r\n 取消\r\n </Button>\r\n <LoadingButton loading={loading} variant='primary' onClick={handleOk}>\r\n 确定\r\n </LoadingButton>\r\n </Modal.Footer>}\r\n </Modal>\r\n </>;\r\n});\r\n\r\nexport default ModalButton;\r\n","import ModalButton, { ModalButtonProps, ModalType } from './modal-button';\r\nimport { Fragment, useCallback, useRef } from 'react';\r\nimport Form, { FormProps, FormType } from './form';\r\n\r\nexport type ModalFormProps<T = any> =\r\n Pick<ModalButtonProps, 'text' | 'variant' | 'header' | 'size'> &\r\n Pick<FormProps<T>, 'schema' | 'formData' | 'uiSchema' | 'action' | 'method' | 'onSuccess'>\r\n\r\nexport default function ModalForm<T = any>({\r\n text,\r\n header,\r\n schema,\r\n uiSchema,\r\n action,\r\n method,\r\n formData,\r\n variant,\r\n onSuccess,\r\n size\r\n}: ModalFormProps<T>) {\r\n\r\n const form = useRef<FormType>(null);\r\n const modal = useRef<ModalType>(null);\r\n\r\n const handleOk = useCallback(async () => {\r\n try {\r\n const result = await form.current?.submit();\r\n if (onSuccess) {\r\n onSuccess(result);\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }, []);\r\n\r\n return <ModalButton ref={modal} text={text} onOk={handleOk} header={header} variant={variant} size={size}>\r\n <Form\r\n ref={form}\r\n schema={schema}\r\n uiSchema={uiSchema}\r\n action={action}\r\n method={method}\r\n formData={formData}\r\n >\r\n <Fragment />\r\n </Form>\r\n </ModalButton>;\r\n}\r\n","import { useAsyncCallback, UseAsyncCallbackOptions } from 'react-async-hook';\r\nimport request, { Config } from '../request';\r\nimport { DependencyList, useCallback, useEffect } from 'react';\r\nimport { AxiosRequestConfig } from 'axios';\r\n\r\ntype UseRequestOptions<T> = {\r\n manual?: boolean\r\n refreshDeps?: DependencyList;\r\n} & UseAsyncCallbackOptions<T>;\r\n\r\nexport default function useRequest<T = any>(config: Config, {\r\n manual,\r\n refreshDeps,\r\n ...options\r\n}: UseRequestOptions<T> = {}) {\r\n const { execute, currentParams, error, ...others } = useAsyncCallback(async (params?: AxiosRequestConfig) => {\r\n\r\n config = typeof config === 'string' ? { url: config } : config;\r\n\r\n return await request<T>({\r\n ...config,\r\n ...params\r\n });\r\n }, options);\r\n\r\n useEffect(() => {\r\n if (!manual && !refreshDeps) {\r\n execute();\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (refreshDeps) {\r\n refresh();\r\n }\r\n }, refreshDeps);\r\n\r\n\r\n const refresh = useCallback(() => {\r\n if (currentParams) {\r\n execute(...currentParams);\r\n } else {\r\n execute();\r\n }\r\n }, [execute, currentParams]);\r\n\r\n return {\r\n refresh,\r\n execute,\r\n ...others\r\n };\r\n}\r\n"],"names":["FooterWrapper","styled","footer","FooterInner","div","FooterLinks","ul","Copyright","Footer","_jsx","_jsxs","className","src","height","href","formatRelativePath","routes","parent","menus","route","meta","_route$meta","hideInMenu","title","_route$meta2","path","replace","menu","children","_route$meta3","hideChildrenInMenu","length","push","Container","Sidebar","nav","Header","Content","Main","main","Menu","RcMenu","renderMenuItems","items","map","item","SubMenu","MenuItem","Link","to","collapseNode","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","basename","useRoutes","useMemo","base","getMenuData","pathname","useLocation","openKeys","keys","split","reduce","pre","curr","join","mode","defaultOpenKeys","selectedKeys","CustomSwal","withReactContent","Swal","defaultOptions","confirmButtonText","cancelButtonText","Message","confirm","async","isConfirmed","fire","icon","showCancelButton","options","error","toast","position","timer","showConfirmButton","Icon","Title","Extra","IconMap","success","info","warning","Result","status","extra","Avatar","a","Dropdown","navbar","Toggle","as","Dimmer","props","active","inverted","Loader","loading","variant","animation","Spinner","rax","attach","axios","defaults","raxConfig","retryDelay","backoffType","shouldRetry","err","config","method","toUpperCase","response","baseURL","interceptors","request","use","token","sessionStorage","getItem","headers","Authorization","Promise","reject","data","location","window","undefined","e","isAxiosError","url","redirectUri","origin","errors","name","Login","parsed","queryString","parse","hash","substr","setItem","access_token","Navigate","Logout","useEffect","catch","removeItem","Root","BrowserRouter","Routes","Route","element","Wrap","BsCard","Card","border","Error","Alert","Object","entries","UserContext","React","createContext","UserProvider","Provider","useUser","user","useContext","Access","require","fallback","passed","intersection","roles","Space","size","small","middle","large","Children","child","Item","NumberFormat","value","locale","currency","formatter","style","minimumFractionDigits","Intl","format","LoadingButton","Button","disabled","RequestButton","onSuccess","setDisabled","useState","handleClick","useCallback","preventDefault","text","result","values","createElement","onClick","localize","Form","forwardRef","action","formData","onSubmit","ref","extraErrors","setExtraErrors","setLoading","setData","handleSubmit","nativeEvent","__errors","mapValues","toExtraErrors","handleChange","transformErrors","keyword","dataPath","property","JsonForm","noHtml5Validate","noValidate","onChange","type","Body","noop","isInteger","isFinite","Math","floor","components","table","BsTable","CustomPagination","total","defaultCurrent","defaultPageSize","current","setCurrent","pageSize","setPageSize","allPages","p","prevPage","nextPage","pagerList","jumpPrev","jumpNext","firstPager","lastPager","i","BsPagination","Last","First","Prev","Next","left","max","right","min","pageBufferSize","unshift","Table","source","rowKey","paginate","toolBarRender","columns","pagination","setPagination","fetchData","params","page","isPagination","current_page","per_page","useRef","reload","useImperativeHandle","customColumns","column","customColumn","render","defaultRender","record","index","handlePageChange","LeftTools","RightTools","Action","RcTable","span","ModalButton","header","onOk","show","setShow","handleClose","close","Modal","onHide","closeButton","ModalForm","schema","uiSchema","form","modal","handleOk","_form$current","submit","Fragment","useRequest","manual","refreshDeps","execute","currentParams","others","useAsyncCallback","refresh"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@topthink/common",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.12",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"build": "rollup -c --environment NODE_ENV:production",
|
|
6
6
|
"build:dev": "rollup -c",
|
|
@@ -15,9 +15,8 @@
|
|
|
15
15
|
"scss"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@rjsf/core": "^3.0.0",
|
|
19
18
|
"@topthink/bootstrap": "^1.0.4",
|
|
20
|
-
"@topthink/json-form": "^1.0.
|
|
19
|
+
"@topthink/json-form": "^1.0.5",
|
|
21
20
|
"@types/lodash": "^4.14.161",
|
|
22
21
|
"ajv-i18n": "^4.0.0",
|
|
23
22
|
"axios": "^0.21.1",
|
|
@@ -65,5 +64,5 @@
|
|
|
65
64
|
},
|
|
66
65
|
"author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
|
|
67
66
|
"license": "MIT",
|
|
68
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "33306ae25be41d8fb8eba7aa6b2caca0b771be0c"
|
|
69
68
|
}
|
package/types/layout/sider.d.ts
CHANGED