@topthink/common 1.1.2 → 1.1.4

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 CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as n,Fragment as c}from"react/jsx-runtime";import t,{SubMenu as r,MenuItem as i}from"rc-menu";import o from"styled-components";export{createGlobalStyle,css,keyframes,default as styled}from"styled-components";import{useRoutes as a,useLocation as s,Link as l,Navigate as d,BrowserRouter as u,Routes as h,Route as m,useNavigate as g}from"react-router-dom";export{Link,useRoutes}from"react-router-dom";import*as p from"react";import f,{useMemo as v,useState as b,useEffect as x,useContext as y,Children as w,useCallback as _,createElement as k,forwardRef as z,useRef as C,useImperativeHandle as S,Fragment as N}from"react";import j from"sweetalert2/dist/sweetalert2.js";import E from"sweetalert2-react-content";import{Spinner as L,Alert as U,Dropdown as O,Card as A,Button as I,Pagination as P,Table as D,Form as B,Modal as F,OverlayTrigger as R,Tooltip as T}from"react-bootstrap";import{useAsync as q,useAsyncCallback as M}from"react-async-hook";import H from"query-string";import K from"axios";import*as G from"retry-axios";import V from"rc-notification";import*as W from"path";import Y from"classnames";import{intersection as $,mapValues as J,debounce as Q,values as X,uniqueId as Z}from"lodash";import ee from"rc-steps";import"rc-steps/assets/index.css";import ne,{getRegistry as ce}from"@topthink/json-form";import te from"rc-table";export{Navigate,Outlet,useLocation,useNavigate,useOutlet,useParams}from"react-router";function re(e,n){return n||(n=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}var ie;const oe=o.footer(ie||(ie=re(["\n\n"])));function ae(){return e(oe,{children:e("div",{className:"container"})})}const se=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";const c=[];for(const a of e){var t,r,i,o;if(null!==(t=a.meta)&&void 0!==t&&t.hideInMenu)continue;const e=null===(r=a.meta)||void 0===r?void 0:r.title;if(!e)continue;let s=a.path||"";s="".concat(n,"/").concat(s),s=s.replace(/\/+/,"/").replace(/\/$/,"");const l={title:e,icon:null===(i=a.meta)||void 0===i?void 0:i.icon,path:s,children:[]};null!==(o=a.meta)&&void 0!==o&&o.hideChildrenInMenu||a.children&&a.children.length>0&&(l.children=se(a.children,s)),c.push(l)}return c};var le,de,ue,he,me,ge;const pe=c=>c.map((c=>c.children.length>0?e(r,{title:c.title,children:pe(c.children)},c.path):e(i,{children:n(l,{to:c.path,children:[c.icon&&e("i",{className:"bi bi-".concat(c.icon)}),c.title]})},c.path))),fe=()=>({height:0}),ve=e=>({height:e.scrollHeight}),be={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:fe,onAppearActive:ve,onEnterStart:fe,onEnterActive:ve,onLeaveStart:ve,onLeaveActive:fe};function xe(c){let{routes:t,basename:r,title:i}=c;const o=a(t),l=v((()=>function(e){return se(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/")}(t,r)),[t,r]),{pathname:d}=s(),u=v((()=>{const e=[];return d.split("/").reduce(((n,c)=>(n.length>1&&e.push(n.join("/")),[...n,c])),[]),e.push(d),e}),[d]),[h,m]=b([]);x((()=>{m(u.slice(0,-1))}),[u]);return n(ye,{children:[n(we,{children:[e(_e,{children:i}),e(Ce,{mode:"inline",motion:be,openKeys:h,onOpenChange:e=>{const n=e[e.length-1];m(e.filter((e=>n.startsWith(e))))},selectedKeys:u,children:pe(l)})]}),n(ke,{children:[e(ze,{children:o}),e(ae,{})]})]})}const ye=o.div(le||(le=re(["\n display: flex;\n flex-wrap: nowrap;\n width: 100%;\n"]))),we=o.nav(de||(de=re(["\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n z-index: 100;\n padding: 54px 0 0;\n border-right: 1px solid #e3e3e3;\n width: 230px;\n background-color: #f5f5f5;\n"]))),_e=o.div(ue||(ue=re(["\n padding: 10px 0;\n height: 64px;\n line-height: 44px;\n text-indent: 24px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n font-size: 16px;\n"]))),ke=o.div(he||(he=re(["\n margin-left: 230px;\n flex: 1;\n"]))),ze=o.main(me||(me=re(["\n min-height: calc(100vh - 54px);\n position: relative;\n"]))),Ce=o(t)(ge||(ge=re(["\n border: none;\n box-shadow: none;\n padding: 0;\n\n .rc-menu-item {\n display: flex;\n\n &:hover {\n background-color: #f0f0f0;\n }\n\n a {\n flex: 1;\n text-decoration: none;\n color: dimgray;\n\n .bi {\n font-size: 16px;\n line-height: 18px;\n margin-right: 9px;\n min-width: 19px;\n text-align: center;\n vertical-align: text-bottom;\n }\n }\n }\n\n .rc-menu-sub {\n background-color: #eee;\n border-top: 1px solid #eee;\n border-bottom: 1px solid #eee;\n\n & > li {\n &:first-child {\n margin-top: 4px;\n }\n\n &:last-child {\n margin-bottom: 4px;\n }\n }\n\n .rc-menu-item-selected {\n background-color: #eee;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-item-active {\n background-color: #eee;\n }\n\n .rc-menu-item {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-submenu {\n & > .rc-menu-submenu-title {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #eee;\n }\n\n .rc-menu-item,\n .rc-menu-submenu > .rc-menu-submenu-title {\n padding: 0 8px 0 24px;\n font-size: 14px;\n line-height: 36px;\n cursor: pointer;\n }\n\n .rc-menu-sub > .rc-menu-item,\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\n padding-top: 0;\n padding-bottom: 0;\n padding-right: 0;\n }\n\n .rc-menu-submenu-arrow {\n line-height: 38px;\n }\n\n .rc-menu-item-selected {\n background-color: #f5f5f5;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-submenu-selected {\n background-color: #eee;\n\n .rc-menu-submenu-title {\n color: var(--bs-primary);\n font-weight: 500;\n }\n }\n\n & > .rc-menu-item {\n line-height: 38px;\n }\n\n & > .rc-menu-submenu {\n &.rc-menu-submenu-selected {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-submenu-title {\n line-height: 38px;\n\n &:hover {\n background-color: #f0f0f0;\n }\n }\n\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-sub {\n border-top: 1px solid #e6e6e6;\n border-bottom: 1px solid #e6e6e6;\n\n & > li {\n &:first-child {\n margin-top: 9px;\n }\n\n &:last-child {\n margin-bottom: 9px;\n }\n }\n }\n }\n\n"]))),Se=E(j),Ne={confirmButtonText:"确定",cancelButtonText:"取消"},je={confirm:async e=>{const{isConfirmed:n}=await Se.fire({...Ne,icon:"warning",showCancelButton:!0,...e});return n},error:e=>{Se.fire({...Ne,toast:!0,position:"top",icon:"error",timer:3e3,showConfirmButton:!1,...e})}};var Ee,Le,Ue,Oe;const Ae=o.div(Ee||(Ee=re(["\n padding: 48px 32px;\n"]))),Ie=o.div(Le||(Le=re(["\n margin-bottom: 24px;\n text-align: center;\n font-size: 72px;\n"]))),Pe=o.div(Ue||(Ue=re(["\n color: rgba(0, 0, 0, .85);\n font-size: 24px;\n line-height: 1.8;\n text-align: center;\n"]))),De=o.div(Oe||(Oe=re(["\n margin-top: 32px;\n text-align: center;\n"]))),Be={success:e("i",{className:"bi bi-check-circle-fill text-success"}),error:e("i",{className:"bi bi-exclamation-circle-fill text-danger"}),info:e("i",{className:"bi bi-info-circle-fill text-info"}),warning:e("i",{className:"bi bi-exclamation-triangle-fill text-warning"})};function Fe(c){let{status:t,title:r,icon:i,extra:o}=c;return!i&&t&&(i=Be[t]),n(Ae,{children:[i&&e(Ie,{children:i}),r&&e(Pe,{children:r}),o&&e(De,{children:o})]})}var Re,Te;o.div(Re||(Re=re(["\n position: relative;\n"])));const qe=o.div(Te||(Te=re(["\n display: ",";\n position: absolute;\n top: 0 !important;\n left: 0 !important;\n width: 100%;\n height: 100%;\n text-align: center;\n vertical-align: middle;\n padding: 1em;\n background-color: ",";\n opacity: ",";\n line-height: 1;\n animation-fill-mode: both;\n animation-duration: .5s;\n transition: background-color .5s linear;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n user-select: none;\n will-change: opacity;\n z-index: 990;\n"])),(e=>e.active?"flex":"none"),(e=>e.inverted?"rgba(255, 255, 255, .85)":"rgba(0, 0, 0, .85)"),(e=>e.active?1:0));var Me;function He(c){let{loading:t=!0,children:r,variant:i="success",animation:o="border",wrap:a,...s}=c;return t?(r&&(r=e("p",{className:"mt-3 text-secondary",children:r})),r=n(qe,{inverted:!0,active:!0,children:[e(L,{animation:o,variant:i,...s}),r]}),a?e(Ke,{height:"number"==typeof a?a:150,children:r}):r):null}const Ke=o.div(Me||(Me=re(["\n position: relative;\n height: ",";\n"])),(e=>"".concat(e.height,"px")));class Ge extends Error{constructor(e){var n,c,t;super("Unauthorized"),t=void 0,(c="url")in(n=this)?Object.defineProperty(n,c,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[c]=t,this.url=e}}function Ve(n){let{onLogin:c}=n;const{result:t}=q((async()=>{await c();const e=sessionStorage.getItem("redirect_uri");return e&&sessionStorage.removeItem("redirect_uri"),e||"/"}),[]);return t?e(d,{to:t,replace:!0}):e(He,{})}function We(n){let{onLogout:c}=n;return q((async()=>{await c()}),[]),e(He,{})}let Ye;const $e=n=>{let{type:c,...t}=n;!function(e){if(Ye)return e(Ye);V.newInstance({prefixCls:"notification",maxCount:5,style:{top:20,right:20}},(n=>{Ye?e(Ye):(Ye=n,e(n))}))}((n=>{if("error"===c)t.content=e(U,{variant:"danger",children:t.content}),t.closable?t.duration=0:t.duration=5;n.notice(t)}))};let Je={};["error"].forEach((e=>{Je[e]=(n,c)=>{$e({...c,type:e,content:n})}})),G.attach(),K.defaults.raxConfig={retryDelay:2e3,backoffType:"static",shouldRetry:e=>{var n,c;return"GET"===(null===(n=e.config.method)||void 0===n?void 0:n.toUpperCase())&&449===(null===(c=e.response)||void 0===c?void 0:c.status)}},K.defaults.maxContentLength=1/0,K.defaults.maxBodyLength=1/0,K.defaults.baseURL="/api",K.interceptors.request.use((e=>{const n=sessionStorage.getItem("authorization");return n&&(e.headers={...e.headers,Authorization:"Bearer ".concat(n)}),e}),(e=>Promise.reject(e)));const Qe=e=>e&&"object"==typeof e;K.interceptors.response.use((e=>(201===e.status&&e.data.location&&(window.location.href=e.data.location,e.data=void 0),e)),(e=>{if(K.isAxiosError(e)&&e.response){const{data:n,status:c}=e.response;401===c?(e.errors="Unauthorized",Qe(n)&&n.url&&(e=new Ge(n.url)),Je.error("Unauthorized")):Qe(n)?422===c?e.errors=n:"message"in n&&(e.errors=n.message):e.errors=n}return Promise.reject(e)}));const Xe=K.isAxiosError,Ze=async function(e){e="string"==typeof e?{url:e}:e;const{data:n}=await K.request({paramsSerializer:function(e){return H.stringify(e,{sort:!1,skipNull:!0,skipEmptyString:!0})},...e});return n};Ze.defaults=K.defaults,Ze.interceptors=K.interceptors;const en=f.createContext({});function nn(c){const{basename:t="/",onLogin:r,onLogout:i,authentication:o,baseURL:a,userResolver:s}=c;a&&(Ze.defaults.baseURL=a),"token"===o&&Ze.interceptors.request.use((e=>{const n=sessionStorage.getItem("authorization");return n&&(e.headers={...e.headers,Authorization:"Bearer ".concat(n)}),e}));const l=e=>{window.location.pathname!==W.join(t,"/logout")&&sessionStorage.setItem("redirect_uri",function(e,n){return"/"===n?e:e.slice(n.length)}(window.location.pathname+window.location.search,t));const n=window.location.origin+W.join(t,"/login");window.location.href=H.stringifyUrl({url:e.url,query:{redirect_uri:n}})},d=async()=>{let e;if(r)e=await r();else{const n=H.parse(window.location.hash.substr(1));n.access_token&&(e=n.access_token)}"token"===o&&e&&sessionStorage.setItem("authorization",e)},g=async()=>{if(i)try{await i()}catch(e){e instanceof Ge&&l(e)}"token"===o&&sessionStorage.removeItem("authorization")};return function(c){let{children:r}=c;return e(en.Provider,{value:{userResolver:s,onUnauthorized:l},children:e(u,{basename:t,children:n(h,{children:[e(m,{path:"*",element:r}),e(m,{path:"login",element:e(Ve,{onLogin:d})}),e(m,{path:"logout",element:e(We,{onLogout:g})})]})})})}}const cn=f.createContext(null),tn=function(n){let{children:c}=n;const[t,r]=b(null),{userResolver:i,onUnauthorized:o}=y(en);return q((async()=>{if(i)return i()}),[],{onError(e){e instanceof Ge&&o&&o(e)},onSuccess(e){e&&r(e)}}),t?e(cn.Provider,{value:[t,r],children:c}):e(He,{})};function rn(){const e=y(cn);if(!e)throw new Error("please use `useUser` in UserContext");return e}var on,an;const sn=o.a(on||(on=re(["\n cursor: pointer;\n"])));function ln(c){let{children:t,menus:r,className:i,logo:o=!0}=c;const[a]=rn();return e(dn,{className:Y("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",i),children:n("div",{className:"container-fluid",children:[o&&e("a",{className:"navbar-brand",href:"https://www.topthink.com",children:e("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"})}),t,n(O,{navbar:!0,children:[e(O.Toggle,{as:sn,className:"nav-link",children:e("img",{className:"rounded-circle",width:"25",height:"25",src:a.avatar})}),e(O.Menu,{className:"shadow",children:r})]})]})})}const dn=o.header(an||(an=re(["\n height: 54px;\n"])));function un(t){let{children:r,title:i,className:o,...a}=t;return e(A,{className:Y("border-0 shadow-sm mb-3",o),...a,children:n("div",{className:"card-body",children:[i&&n(c,{children:[e("h5",{children:i}),e("hr",{})]}),r]})})}function hn(n){let{errors:c}=n;return c?e(U,{variant:"danger",children:e("ul",{className:"mb-0",children:"string"==typeof c?e("li",{children:c}):Object.entries(c).map((n=>{let[c,t]=n;return e("li",{children:t},c)}))})}):null}function mn(n){let{require:t,children:r,fallback:i}=n;const[o]=rn();let a=!1;return"function"==typeof t?a=t(o):("string"==typeof t&&(t=[t]),a=$(o.roles,t).length>0),a||(r=i),e(c,{children:r})}var gn,pn;function fn(n){let{children:c,size:t="small"}=n;"string"==typeof t&&(t={small:8,middle:16,large:24}[t]);const r=w.map(c,(n=>{if(n)return e(bn,{children:n})}));return e(vn,{size:t,children:r})}const vn=o.div(gn||(gn=re(["\n display: inline-flex;\n align-items: center;\n gap: ","px;\n"])),(e=>e.size)),bn=o.div(pn||(pn=re(["\n\n"])));var xn;function yn(){return yn=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var c=arguments[n];for(var t in c)Object.prototype.hasOwnProperty.call(c,t)&&(e[t]=c[t])}return e},yn.apply(this,arguments)}const wn=e=>p.createElement("svg",yn({className:"step_check_svg__icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentColor"},e),xn||(xn=p.createElement("path",{d:"M887.904 298.208c-12.864-12.064-33.152-11.488-45.216 1.408L415.936 753.984l-233.12-229.696c-12.608-12.416-32.864-12.288-45.28.32-12.416 12.576-12.256 32.864.352 45.248l256.48 252.672c.096.096.224.128.32.224s.128.224.224.32c2.016 1.92 4.448 3.008 6.784 4.288 1.152.672 2.144 1.664 3.36 2.144 3.776 1.472 7.776 2.24 11.744 2.24 4.192 0 8.384-.832 12.288-2.496 1.312-.544 2.336-1.664 3.552-2.368 2.4-1.408 4.896-2.592 6.944-4.672.096-.096.128-.256.224-.352.064-.096.192-.128.288-.224L889.28 343.424c12.16-12.832 11.488-33.088-1.376-45.216z"})));var _n;function kn(n){return e(zn,{icons:{finish:e(wn,{}),error:e(c,{})},...n})}kn.Step=ee.Step;const zn=o(ee)(_n||(_n=re(["\n .rc-steps-item-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n & > .rc-steps-icon {\n top: 0;\n }\n }\n\n .rc-steps-item-process {\n .rc-steps-item-icon {\n background: var(--bs-primary);\n border-color: var(--bs-primary);\n }\n }\n\n .rc-steps-item-finish {\n .rc-steps-item-icon {\n border-color: var(--bs-primary);\n\n & > .rc-steps-icon {\n color: var(--bs-primary);\n }\n }\n\n .rc-steps-item-title:after {\n background-color: var(--bs-primary);\n }\n }\n\n"])));function Cn(n){let{className:t,value:r,locale:i="zh-CN",currency:o=!0}=n;const a=v((()=>{let e={};return e=o?{style:"currency",currency:"CNY",...e}:{minimumFractionDigits:2},new Intl.NumberFormat(i,e)}),[o,i]);return t?e("span",{className:t,children:a.format(r)}):e(c,{children:a.format(r)})}function Sn(n){let{loading:c,children:t,...r}=n;return e(I,{...r,disabled:c,children:c?"Loading…":t})}function Nn(e){let{url:n,method:c,confirm:t,onSuccess:r,children:i,disabled:o,as:a=I,...s}=e;const[l,d]=b(!1),u=_((async e=>{e.preventDefault();try{if(d(!0),t&&!await je.confirm({text:t}))return;const e="string"==typeof n?{url:n,method:c}:{method:c,...n},i=await Ze(e);r&&r(i)}catch(e){if(!K.isAxiosError(e))throw e;{let n=e.errors;"string"!=typeof e.errors&&(n=Object.values(e.errors).join("<br />")),je.error({text:n})}}finally{d(!1)}}),[n,c,d]);return k(a,{...s,disabled:o||l,onClick:u},i)}function jn(n){let{to:c,replace:t,...r}=n,i=g();return e(I,{...r,onClick:e=>{e.preventDefault(),i(c,{replace:t})}})}const En=require("ajv-i18n/localize/zh"),Ln={upload:function(n){const{widgets:c}=ce(),t={...n.options,async onUpload(e){if(n.options.onUpload instanceof Function)return await n.options.onUpload.call(e);if(n.options.endpoint){const c=new FormData;c.set("file",e);const{url:t}=await Ze({url:n.options.endpoint,method:"post",data:c});return t}}};return e(c.upload,{...n,options:t})}},Un=z(((n,c)=>{let{action:t,method:r="post",onSuccess:i,formData:o,onSubmit:a,onChange:s,submitText:l="提交",children:d,...u}=n;const[h,m]=b(),[g,p]=b(!1),[f,v]=b(o),x=_((async(e,n)=>{try{if(p(!0),t){const{formData:n}=e;try{const e=await Ze({url:t,method:r,data:n});m(void 0),i&&await i(e)}catch(e){throw K.isAxiosError(e)&&m((e=>{const n=e.errors;return"string"==typeof n?{__errors:[n]}:J(n,(e=>({__errors:[e]})))})(e)),e}}else a&&await a(e,n)}finally{p(!1)}}),[t,r,a]),y=_((e=>{const{formData:n}=e;v(n),s&&s(e)}),[v,s]),w=_((e=>(e=e.map((e=>({keyword:e.name,dataPath:e.property,...e}))),En(e),e)),[]),k=e(Sn,{loading:g,type:"submit",variant:"primary",children:l});return"function"==typeof d&&(d=d({submit:k,loading:g})),e(ne,{ref:c,extraErrors:h,onSubmit:x,transformErrors:w,noHtml5Validate:!0,noValidate:!0,...u,formData:f,onChange:y,widgets:Ln,children:d||e("div",{className:"col-12",children:k})})}));var On,An,In,Pn,Dn;function Bn(c){let{title:t,children:r,extra:i}=c;return n(Fn,{children:[e(Rn,{children:n("div",{className:"container",children:[e(qn,{children:t}),e(Mn,{children:i})]})}),e(Tn,{className:"container",children:r})]})}const Fn=o.div(On||(On=re(["\n width: 100%;\n"]))),Rn=o.div(An||(An=re(["\n background-color: #fff;\n display: flex;\n\n .container {\n padding: 0 24px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n"]))),Tn=o.div(In||(In=re(["\n margin-top: 24px;\n"]))),qn=o.div(Pn||(Pn=re(["\n font-size: 22px;\n line-height: 64px;\n height: 64px;\n"]))),Mn=o.div(Dn||(Dn=re(["\n\n"])));function Hn(){}function Kn(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}const Gn=function(n){let{indeterminate:c=!1,...t}=n;const r=C(null);return x((()=>{r.current&&(r.current.indeterminate=c)}),[c]),e("input",{ref:r,...t,className:"form-check-input",type:"checkbox"})};var Vn,Wn,Yn,$n,Jn,Qn;const Xn=o(D)(Vn||(Vn=re(["\n .rc-table-thead {\n border-top: none;\n }\n"]))),Zn={table:n=>e(Xn,{...n,className:"align-middle table-hover"})},ec=o((function(n){let{total:c=0,onChange:t=Hn,defaultCurrent:r=1,defaultPageSize:i=10,className:o,...a}=n;const[s,l]=b(r),[d,u]=b(i);x((()=>{Kn(a.current)&&l(a.current)}),[a.current]),x((()=>{Kn(a.pageSize)&&u(a.pageSize)}),[a.pageSize]);const h=v((()=>Math.floor((c-1)/d)+1),[c,d]),m=_((e=>()=>{e!==s&&(l(e),t(e,d))}),[t,s,d]),g=s-1>0?s-1:0,p=s+1<h?s+1:h,f=[];let y=null,w=null,k=null,z=null;if(h<=7)for(let n=1;n<=h;n+=1){const c=s===n;f.push(e(P.Item,{active:c,onClick:m(n),children:n},n))}else{z=e(P.Last,{onClick:m(h)},"last"),k=e(P.First,{onClick:m(1)},"first"),y=e(P.Prev,{onClick:m(g)},"prev"),w=e(P.Next,{onClick:m(p)},"next");let n=Math.max(1,s-2),c=Math.min(s+2,h);s-1<=2&&(c=5),h-s<=2&&(n=h-4);for(let t=n;t<=c;t+=1){const n=s===t;f.push(e(P.Item,{active:n,onClick:m(t),children:t},t))}s-1>=4&&3!==s&&f.unshift(y),h-s>=4&&s!==h-2&&f.push(w),1!==n&&f.unshift(k),c!==h&&f.push(z)}return e(P,{className:o,children:f})}))(Wn||(Wn=re(["\n margin-bottom: 0;\n justify-content: flex-end;\n"])));function nc(e){return"current_page"in e}const cc=z(((t,r)=>{let{source:i,rowKey:o="id",paginate:a=!0,toolBarRender:s,columns:l=[],search:d,rowSelection:u,card:h=!0,...m}=t;const[g,p]=b([]),[f,y]=b(a?{total:0,current:1,pageSize:10}:null),[w,k]=b(!0),[z,N]=b(""),j=_((async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};k(!0);try{let n;if("string"==typeof i){const c={q:z};f&&(c.page=e.page||f.current),n=await Ze({url:i,params:c})}else n=await i();a&&nc(n)&&(y({total:n.total,current:n.current_page,pageSize:n.per_page}),n=n.data),p(n)}catch(e){}finally{k(!1)}}),[i,p,f,z]);x((()=>{j()}),[z]);const E=C({reload:j});x((()=>{E.current={reload:j}}),[j]),S(r,(()=>E.current));const[L]=function(n,c,t){const[r,i]=b((()=>new Set((null==n?void 0:n.selectedRowKeys)||[]))),o=e=>"string"==typeof c?e[c]:c(e),a=e=>t.find((n=>o(n)===e)),s=_((e=>{i(e);const c=Array.from(e),t=c.map((function(e){return a(e)}));null!=n&&n.onChange&&(null==n||n.onChange(c,t))}),[a]);return[_((c=>{if(!n)return c;const i=t.map(o),a=i.every((function(e){return r.has(e)})),l=i.some((function(e){return r.has(e)}));return[{key:"selection",title:e(Gn,{checked:a,indeterminate:!a&&l,onChange:()=>{a?i.forEach((function(e){r.delete(e)})):i.forEach((function(e){r.add(e)})),s(new Set(r))}}),width:30,align:"center",render(n){let{record:c}=n;const t=o(c),i=r.has(t);return e(Gn,{checked:i,onChange:()=>{i?r.delete(t):r.add(t),s(new Set(r))}})}},...c]}),[t,n,r])]}(u,o,g),U=v((()=>L(l).map((e=>{const n={...e,render:void 0};if("render"in e&&e.render){const c=e.render;n.render=(e,n,t)=>c({value:e,record:n,index:t,action:E.current})}return n}))),[l,L,E]),O=function(e,n,c){const t=C(e),r=C(Q(e,n,c));return x((()=>{t.current=e})),x((()=>{r.current=Q((function(){t.current(...arguments)}),n,c)}),[n,c]),r.current}((e=>{N(e.target.value)}),500),A=n(c,{children:[e(He,{loading:w}),!1!==s&&n(tc,{children:[e(ic,{size:12,children:s&&s(E.current)}),n(rc,{size:12,children:[d&&e(B.Control,{onChange:O,type:"search",placeholder:"Search..."}),e(oc,{onClick:E.current.reload,children:e("i",{className:"bi bi-arrow-repeat"})})]})]}),e(te,{...m,rowKey:o,columns:U,components:Zn,data:g}),f&&e(ec,{...f,onChange:e=>{j({page:e})}})]});return h?e(un,{children:A}):A})),tc=o.div(Yn||(Yn=re(["\n display: flex;\n justify-content: space-between;\n padding-bottom: 1rem;\n height: 48px;\n border-bottom: 2px solid #212529;\n"]))),rc=o(fn)($n||($n=re(["\n\n"]))),ic=o(fn)(Jn||(Jn=re(["\n\n"]))),oc=o.span(Qn||(Qn=re(["\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n\n &:hover {\n color: var(--bs-primary);\n }\n"]))),ac=z(((t,r)=>{let{text:i,variant:o,header:a=i,footer:s=!0,onOk:l,size:d,onShow:u,children:h,as:m=I}=t;const[g,p]=b(!1),[f,v]=b(!1),x=()=>p(!1);S(r,(()=>({close:x})));const y=k(m,{variant:o,onClick:()=>p(!0)},i);return n(c,{children:[y,n(F,{size:d,show:g,onHide:x,onShow:u,children:[a&&e(F.Header,{closeButton:!0,children:e(F.Title,{as:"h5",children:a})}),e(F.Body,{children:h}),s&&n(F.Footer,{children:[e(I,{variant:"secondary",onClick:x,children:"取消"}),e(Sn,{loading:f,variant:"primary",onClick:async()=>{if(l){v(!0);const e=await l();if(v(!1),!1===e)return}x()},children:"确定"})]})]})]})}));function sc(n){let{text:c,header:t,schema:r,uiSchema:i,action:o,method:a,formData:s,variant:l,onSuccess:d,onChange:u,fields:h,size:m,as:g}=n;const p=C(null),f=_((async()=>{try{var e;return await(null===(e=p.current)||void 0===e?void 0:e.submit()),!0}catch{return!1}}),[]);return e(ac,{as:g,text:c,onOk:f,header:t,variant:l,size:m,children:e(Un,{ref:p,schema:r,uiSchema:i,action:o,method:a,formData:s,fields:h,onChange:u,onSuccess:d,children:e(N,{})})})}function lc(e){let{manual:n,refreshDeps:c,...t}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{execute:r,currentParams:i,error:o,...a}=M((async n=>(e="string"==typeof e?{url:e}:e,await Ze({...e,...n}))),t);x((()=>{n||c||r()}),[]),x((()=>{c&&s()}),c);const s=_((()=>{i?r(...i):r()}),[r,i]);if(o&&Xe(o)){const e=o.errors;o=new Error("string"==typeof e?e:X(e).join(""))}return{refresh:s,execute:r,error:o,...a}}let dc=0;function uc(){let{onHide:e,onShow:n}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const[c,t]=b(!1),[r,i]=b("visible-".concat(dc)),o=_((()=>{t(!1),e&&e()}),[t,e]),a=_((()=>{i("visible-".concat(++dc))}),[i,dc]),s=_((()=>{t(!0),n&&n()}),[t,n]),l={show:c,onHide:o,onExited:a,key:r};return{visible:c,show:s,hide:o,state:l}}function hc(n){let{tooltip:c,children:t,placement:r="bottom"}=n;return e(R,{placement:r,overlay:e(T,{id:Z(),children:c}),children:t})}export{mn as Access,un as Card,Bn as Content,hn as Error,ae as Footer,Un as Form,ln as Header,jn as LinkButton,He as Loader,Sn as LoadingButton,je as Message,ac as ModalButton,sc as ModalForm,Cn as NumberFormat,Nn as RequestButton,Fe as Result,xe as SiderLayout,fn as Space,kn as Steps,cc as Table,hc as Tooltip,tn as UserProvider,nn as createApplication,Xe as isRequestError,Ze as request,uc as useOverlayState,lc as useRequest,rn as useUser};
1
+ import{jsx as e,jsxs as n,Fragment as c}from"react/jsx-runtime";import t,{SubMenu as r,MenuItem as i}from"rc-menu";import o from"styled-components";export{createGlobalStyle,css,keyframes,default as styled}from"styled-components";import{useRoutes as a,useLocation as s,Link as l,Navigate as d,BrowserRouter as u,Routes as h,Route as m,useNavigate as g}from"react-router-dom";export{Link,useRoutes}from"react-router-dom";import*as p from"react";import f,{useMemo as v,useState as b,useEffect as x,useContext as y,Children as w,useCallback as k,createElement as _,forwardRef as z,useRef as C,useImperativeHandle as S,Fragment as N}from"react";import j from"sweetalert2/dist/sweetalert2.js";import E from"sweetalert2-react-content";import{Alert as L,Spinner as U,Dropdown as O,Card as A,Pagination as I,Button as P,Table as D,Form as B,Modal as F,OverlayTrigger as R,Tooltip as T}from"react-bootstrap";import q from"rc-notification";import{useAsync as M,useAsyncCallback as H}from"react-async-hook";import K from"query-string";import G from"axios";import*as V from"retry-axios";import*as W from"path";import Y from"classnames";import{intersection as $,mapValues as J,debounce as Q,values as X,uniqueId as Z}from"lodash";import ee from"rc-steps";import"rc-steps/assets/index.css";import ne,{getRegistry as ce}from"@topthink/json-form";import te from"rc-table";export{Navigate,Outlet,useLocation,useNavigate,useOutlet,useParams}from"react-router";function re(e,n){return n||(n=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}var ie;const oe=o.footer(ie||(ie=re(["\n\n"])));function ae(){return e(oe,{children:e("div",{className:"container"})})}const se=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";const c=[];for(const a of e){var t,r,i,o;if(null!==(t=a.meta)&&void 0!==t&&t.hideInMenu)continue;const e=null===(r=a.meta)||void 0===r?void 0:r.title;if(!e)continue;let s=a.path||"";s="".concat(n,"/").concat(s),s=s.replace(/\/+/,"/").replace(/\/$/,"");const l={title:e,icon:null===(i=a.meta)||void 0===i?void 0:i.icon,path:s,children:[]};null!==(o=a.meta)&&void 0!==o&&o.hideChildrenInMenu||a.children&&a.children.length>0&&(l.children=se(a.children,s)),c.push(l)}return c};var le,de,ue,he,me,ge;const pe=c=>c.map((c=>c.children.length>0?e(r,{title:c.title,children:pe(c.children)},c.path):e(i,{children:n(l,{to:c.path,children:[c.icon&&e("i",{className:"bi bi-".concat(c.icon)}),c.title]})},c.path))),fe=()=>({height:0}),ve=e=>({height:e.scrollHeight}),be={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:fe,onAppearActive:ve,onEnterStart:fe,onEnterActive:ve,onLeaveStart:ve,onLeaveActive:fe};function xe(c){let{routes:t,basename:r,title:i}=c;const o=a(t),l=v((()=>function(e){return se(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/")}(t,r)),[t,r]),{pathname:d}=s(),u=v((()=>{const e=[];return d.split("/").reduce(((n,c)=>(n.length>1&&e.push(n.join("/")),[...n,c])),[]),e.push(d),e}),[d]),[h,m]=b([]);x((()=>{m(u.slice(0,-1))}),[u]);return n(ye,{children:[n(we,{children:[e(ke,{children:i}),e(Ce,{mode:"inline",motion:be,openKeys:h,onOpenChange:e=>{const n=e[e.length-1];m(e.filter((e=>n.startsWith(e))))},selectedKeys:u,children:pe(l)})]}),n(_e,{children:[e(ze,{children:o}),e(ae,{})]})]})}const ye=o.div(le||(le=re(["\n display: flex;\n flex-wrap: nowrap;\n width: 100%;\n"]))),we=o.nav(de||(de=re(["\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n z-index: 100;\n padding: 54px 0 0;\n border-right: 1px solid #e3e3e3;\n width: 230px;\n background-color: #f5f5f5;\n"]))),ke=o.div(ue||(ue=re(["\n padding: 10px 0;\n height: 64px;\n line-height: 44px;\n text-indent: 24px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n font-size: 16px;\n"]))),_e=o.div(he||(he=re(["\n margin-left: 230px;\n flex: 1;\n"]))),ze=o.main(me||(me=re(["\n min-height: calc(100vh - 54px);\n position: relative;\n"]))),Ce=o(t)(ge||(ge=re(["\n border: none;\n box-shadow: none;\n padding: 0;\n\n .rc-menu-item {\n display: flex;\n\n &:hover {\n background-color: #f0f0f0;\n }\n\n a {\n flex: 1;\n text-decoration: none;\n color: dimgray;\n\n .bi {\n font-size: 16px;\n line-height: 18px;\n margin-right: 9px;\n min-width: 19px;\n text-align: center;\n vertical-align: text-bottom;\n }\n }\n }\n\n .rc-menu-sub {\n background-color: #eee;\n border-top: 1px solid #eee;\n border-bottom: 1px solid #eee;\n\n & > li {\n &:first-child {\n margin-top: 4px;\n }\n\n &:last-child {\n margin-bottom: 4px;\n }\n }\n\n .rc-menu-item-selected {\n background-color: #eee;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-item-active {\n background-color: #eee;\n }\n\n .rc-menu-item {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-submenu {\n & > .rc-menu-submenu-title {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #eee;\n }\n\n .rc-menu-item,\n .rc-menu-submenu > .rc-menu-submenu-title {\n padding: 0 8px 0 24px;\n font-size: 14px;\n line-height: 36px;\n cursor: pointer;\n }\n\n .rc-menu-sub > .rc-menu-item,\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\n padding-top: 0;\n padding-bottom: 0;\n padding-right: 0;\n }\n\n .rc-menu-submenu-arrow {\n line-height: 38px;\n }\n\n .rc-menu-item-selected {\n background-color: #f5f5f5;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-submenu-selected {\n background-color: #eee;\n\n .rc-menu-submenu-title {\n color: var(--bs-primary);\n font-weight: 500;\n }\n }\n\n & > .rc-menu-item {\n line-height: 38px;\n }\n\n & > .rc-menu-submenu {\n &.rc-menu-submenu-selected {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-submenu-title {\n line-height: 38px;\n\n &:hover {\n background-color: #f0f0f0;\n }\n }\n\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-sub {\n border-top: 1px solid #e6e6e6;\n border-bottom: 1px solid #e6e6e6;\n\n & > li {\n &:first-child {\n margin-top: 9px;\n }\n\n &:last-child {\n margin-bottom: 9px;\n }\n }\n }\n }\n\n"]))),Se=E(j),Ne={confirmButtonText:"确定",cancelButtonText:"取消"},je={confirm:async e=>{const{isConfirmed:n}=await Se.fire({...Ne,icon:"warning",showCancelButton:!0,...e});return n},error:e=>{Se.fire({...Ne,toast:!0,position:"top",icon:"error",timer:3e3,showConfirmButton:!1,...e})}};let Ee;const Le=n=>{let{type:c,...t}=n;!function(e){if(Ee)return e(Ee);q.newInstance({prefixCls:"notification",maxCount:5,style:{top:20,right:20}},(n=>{Ee?e(Ee):(Ee=n,e(n))}))}((n=>{t.duration=3;let r=c;if("error"===c)r="danger",t.duration=t.closable?0:5;t.content=e(L,{variant:r,children:t.content}),n.notice(t)}))};let Ue={};var Oe,Ae,Ie,Pe;["error","success","info"].forEach((e=>{Ue[e]=(n,c)=>{Le({...c,type:e,content:n})}}));const De=o.div(Oe||(Oe=re(["\n padding: 48px 32px;\n"]))),Be=o.div(Ae||(Ae=re(["\n margin-bottom: 24px;\n text-align: center;\n font-size: 72px;\n"]))),Fe=o.div(Ie||(Ie=re(["\n color: rgba(0, 0, 0, .85);\n font-size: 24px;\n line-height: 1.8;\n text-align: center;\n"]))),Re=o.div(Pe||(Pe=re(["\n margin-top: 32px;\n text-align: center;\n"]))),Te={success:e("i",{className:"bi bi-check-circle-fill text-success"}),error:e("i",{className:"bi bi-exclamation-circle-fill text-danger"}),info:e("i",{className:"bi bi-info-circle-fill text-info"}),warning:e("i",{className:"bi bi-exclamation-triangle-fill text-warning"})};function qe(c){let{status:t,title:r,icon:i,extra:o}=c;return!i&&t&&(i=Te[t]),n(De,{children:[i&&e(Be,{children:i}),r&&e(Fe,{children:r}),o&&e(Re,{children:o})]})}var Me,He;o.div(Me||(Me=re(["\n position: relative;\n"])));const Ke=o.div(He||(He=re(["\n display: ",";\n position: absolute;\n top: 0 !important;\n left: 0 !important;\n width: 100%;\n height: 100%;\n text-align: center;\n vertical-align: middle;\n padding: 1em;\n background-color: ",";\n opacity: ",";\n line-height: 1;\n animation-fill-mode: both;\n animation-duration: .5s;\n transition: background-color .5s linear;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n user-select: none;\n will-change: opacity;\n z-index: 990;\n"])),(e=>e.active?"flex":"none"),(e=>e.inverted?"rgba(255, 255, 255, .85)":"rgba(0, 0, 0, .85)"),(e=>e.active?1:0));var Ge;function Ve(c){let{loading:t=!0,children:r,variant:i="success",animation:o="border",wrap:a,...s}=c;return t?(r&&(r=e("p",{className:"mt-3 text-secondary",children:r})),r=n(Ke,{inverted:!0,active:!0,children:[e(U,{animation:o,variant:i,...s}),r]}),a?e(We,{height:"number"==typeof a?a:150,children:r}):r):null}const We=o.div(Ge||(Ge=re(["\n position: relative;\n height: ",";\n"])),(e=>"".concat(e.height,"px")));class Ye extends Error{constructor(e){var n,c,t;super("Unauthorized"),t=void 0,(c="url")in(n=this)?Object.defineProperty(n,c,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[c]=t,this.url=e}}function $e(n){let{onLogin:c}=n;const{result:t}=M((async()=>{await c();const e=sessionStorage.getItem("redirect_uri");return e&&sessionStorage.removeItem("redirect_uri"),e||"/"}),[]);return t?e(d,{to:t,replace:!0}):e(Ve,{})}function Je(n){let{onLogout:c}=n;return M((async()=>{await c()}),[]),e(Ve,{})}V.attach(),G.defaults.raxConfig={retryDelay:2e3,backoffType:"static",shouldRetry:e=>{var n,c;return"GET"===(null===(n=e.config.method)||void 0===n?void 0:n.toUpperCase())&&449===(null===(c=e.response)||void 0===c?void 0:c.status)}},G.defaults.maxContentLength=1/0,G.defaults.maxBodyLength=1/0,G.defaults.baseURL="/api",G.interceptors.request.use((e=>{const n=sessionStorage.getItem("authorization");return n&&(e.headers={...e.headers,Authorization:"Bearer ".concat(n)}),e}),(e=>Promise.reject(e)));const Qe=e=>e&&"object"==typeof e;G.interceptors.response.use((e=>(201===e.status&&e.data.location&&(window.location.href=e.data.location,e.data=void 0),e)),(e=>{if(G.isAxiosError(e)&&e.response){const{data:n,status:c}=e.response;401===c?(e.errors="Unauthorized",Qe(n)&&n.url&&(e=new Ye(n.url)),Ue.error("Unauthorized")):Qe(n)?422===c?e.errors=n:"message"in n&&(e.errors=n.message):e.errors=n}return Promise.reject(e)}));const Xe=G.isAxiosError,Ze=async function(e){e="string"==typeof e?{url:e}:e;const{data:n}=await G.request({paramsSerializer:function(e){return K.stringify(e,{sort:!1,skipNull:!0,skipEmptyString:!0})},...e});return n};Ze.defaults=G.defaults,Ze.interceptors=G.interceptors;const en=f.createContext({});function nn(c){const{basename:t="/",onLogin:r,onLogout:i,authentication:o,baseURL:a,userResolver:s}=c;a&&(Ze.defaults.baseURL=a),"token"===o&&Ze.interceptors.request.use((e=>{const n=sessionStorage.getItem("authorization");return n&&(e.headers={...e.headers,Authorization:"Bearer ".concat(n)}),e}));const l=e=>{window.location.pathname!==W.join(t,"/logout")&&sessionStorage.setItem("redirect_uri",function(e,n){return"/"===n?e:e.slice(n.length)}(window.location.pathname+window.location.search,t));const n=window.location.origin+W.join(t,"/login");window.location.href=K.stringifyUrl({url:e.url,query:{redirect_uri:n}})},d=async()=>{let e;if(r)e=await r();else{const n=K.parse(window.location.hash.substr(1));n.access_token&&(e=n.access_token)}"token"===o&&e&&sessionStorage.setItem("authorization",e)},g=async()=>{if(i)try{await i()}catch(e){e instanceof Ye&&l(e)}"token"===o&&sessionStorage.removeItem("authorization")};return function(c){let{children:r}=c;return e(en.Provider,{value:{userResolver:s,onUnauthorized:l},children:e(u,{basename:t,children:n(h,{children:[e(m,{path:"*",element:r}),e(m,{path:"login",element:e($e,{onLogin:d})}),e(m,{path:"logout",element:e(Je,{onLogout:g})})]})})})}}const cn=f.createContext(null),tn=function(n){let{children:c}=n;const[t,r]=b(null),{userResolver:i,onUnauthorized:o}=y(en);return M((async()=>{if(i)return i()}),[],{onError(e){e instanceof Ye&&o&&o(e)},onSuccess(e){e&&r(e)}}),t?e(cn.Provider,{value:[t,r],children:c}):e(Ve,{})};function rn(){const e=y(cn);if(!e)throw new Error("please use `useUser` in UserContext");return e}var on,an;const sn=o.a(on||(on=re(["\n cursor: pointer;\n"])));function ln(c){let{children:t,menus:r,className:i,logo:o=!0}=c;const[a]=rn();return e(dn,{className:Y("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",i),children:n("div",{className:"container-fluid",children:[o&&e("a",{className:"navbar-brand",href:"https://www.topthink.com",children:e("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"})}),t,n(O,{navbar:!0,children:[e(O.Toggle,{as:sn,className:"nav-link",children:e("img",{className:"rounded-circle",width:"25",height:"25",src:a.avatar})}),e(O.Menu,{className:"shadow",children:r})]})]})})}const dn=o.header(an||(an=re(["\n height: 54px;\n"])));function un(t){let{children:r,title:i,className:o,...a}=t;return e(A,{className:Y("border-0 shadow-sm mb-3",o),...a,children:n("div",{className:"card-body",children:[i&&n(c,{children:[e("h5",{children:i}),e("hr",{})]}),r]})})}function hn(n){let{errors:c}=n;return c?e(L,{variant:"danger",children:e("ul",{className:"mb-0",children:"string"==typeof c?e("li",{children:c}):Object.entries(c).map((n=>{let[c,t]=n;return e("li",{children:t},c)}))})}):null}function mn(n){let{require:t,children:r,fallback:i}=n;const[o]=rn();let a=!1;return"function"==typeof t?a=t(o):("string"==typeof t&&(t=[t]),a=$(o.roles,t).length>0),a||(r=i),e(c,{children:r})}var gn,pn;function fn(n){let{children:c,size:t="small"}=n;"string"==typeof t&&(t={small:8,middle:16,large:24}[t]);const r=w.map(c,(n=>{if(n)return e(bn,{children:n})}));return e(vn,{size:t,children:r})}const vn=o.div(gn||(gn=re(["\n display: inline-flex;\n align-items: center;\n gap: ","px;\n"])),(e=>e.size)),bn=o.div(pn||(pn=re(["\n\n"])));var xn;function yn(){return yn=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var c=arguments[n];for(var t in c)Object.prototype.hasOwnProperty.call(c,t)&&(e[t]=c[t])}return e},yn.apply(this,arguments)}const wn=e=>p.createElement("svg",yn({className:"step_check_svg__icon",viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentColor"},e),xn||(xn=p.createElement("path",{d:"M887.904 298.208c-12.864-12.064-33.152-11.488-45.216 1.408L415.936 753.984l-233.12-229.696c-12.608-12.416-32.864-12.288-45.28.32-12.416 12.576-12.256 32.864.352 45.248l256.48 252.672c.096.096.224.128.32.224s.128.224.224.32c2.016 1.92 4.448 3.008 6.784 4.288 1.152.672 2.144 1.664 3.36 2.144 3.776 1.472 7.776 2.24 11.744 2.24 4.192 0 8.384-.832 12.288-2.496 1.312-.544 2.336-1.664 3.552-2.368 2.4-1.408 4.896-2.592 6.944-4.672.096-.096.128-.256.224-.352.064-.096.192-.128.288-.224L889.28 343.424c12.16-12.832 11.488-33.088-1.376-45.216z"})));var kn;function _n(n){return e(zn,{icons:{finish:e(wn,{}),error:e(c,{})},...n})}_n.Step=ee.Step;const zn=o(ee)(kn||(kn=re(["\n .rc-steps-item-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n & > .rc-steps-icon {\n top: 0;\n }\n }\n\n .rc-steps-item-process {\n .rc-steps-item-icon {\n background: var(--bs-primary);\n border-color: var(--bs-primary);\n }\n }\n\n .rc-steps-item-finish {\n .rc-steps-item-icon {\n border-color: var(--bs-primary);\n\n & > .rc-steps-icon {\n color: var(--bs-primary);\n }\n }\n\n .rc-steps-item-title:after {\n background-color: var(--bs-primary);\n }\n }\n\n"])));function Cn(){}function Sn(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}function Nn(n){let{total:c=0,onChange:t=Cn,defaultCurrent:r=1,defaultPageSize:i=10,className:o,...a}=n;const[s,l]=b(r),[d,u]=b(i);x((()=>{Sn(a.current)&&l(a.current)}),[a.current]),x((()=>{Sn(a.pageSize)&&u(a.pageSize)}),[a.pageSize]);const h=v((()=>Math.floor((c-1)/d)+1),[c,d]),m=k((e=>()=>{e!==s&&(l(e),t(e,d))}),[t,s,d]),g=s-1>0?s-1:0,p=s+1<h?s+1:h,f=[];let y=null,w=null,_=null,z=null;if(h<=7)for(let n=1;n<=h;n+=1){const c=s===n;f.push(e(I.Item,{active:c,onClick:m(n),children:n},n))}else{z=e(I.Last,{onClick:m(h)},"last"),_=e(I.First,{onClick:m(1)},"first"),y=e(I.Prev,{onClick:m(g)},"prev"),w=e(I.Next,{onClick:m(p)},"next");let n=Math.max(1,s-2),c=Math.min(s+2,h);s-1<=2&&(c=5),h-s<=2&&(n=h-4);for(let t=n;t<=c;t+=1){const n=s===t;f.push(e(I.Item,{active:n,onClick:m(t),children:t},t))}s-1>=4&&3!==s&&f.unshift(y),h-s>=4&&s!==h-2&&f.push(w),1!==n&&f.unshift(_),c!==h&&f.push(z)}return e(I,{className:o,children:f})}function jn(n){let{className:t,value:r,locale:i="zh-CN",currency:o=!0}=n;const a=v((()=>{let e={};return e=o?{style:"currency",currency:"CNY",...e}:{minimumFractionDigits:2},new Intl.NumberFormat(i,e)}),[o,i]);return t?e("span",{className:t,children:a.format(r)}):e(c,{children:a.format(r)})}function En(n){let{loading:c,children:t,...r}=n;return e(P,{...r,disabled:c,children:c?"Loading…":t})}function Ln(e){let{url:n,method:c,confirm:t,onSuccess:r,children:i,disabled:o,as:a=P,...s}=e;const[l,d]=b(!1),u=k((async e=>{e.preventDefault();try{if(d(!0),t&&!await je.confirm({text:t}))return;const e="string"==typeof n?{url:n,method:c}:{method:c,...n},i=await Ze(e);r&&r(i)}catch(e){if(!G.isAxiosError(e))throw e;{let n=e.errors;"string"!=typeof e.errors&&(n=Object.values(e.errors).join("<br />")),je.error({text:n})}}finally{d(!1)}}),[n,c,d]);return _(a,{...s,disabled:o||l,onClick:u},i)}function Un(n){let{to:c,replace:t,...r}=n,i=g();return e(P,{...r,onClick:e=>{e.preventDefault(),i(c,{replace:t})}})}const On=require("ajv-i18n/localize/zh"),An={upload:function(n){const{widgets:c}=ce(),t={...n.options,async onUpload(e){if(n.options.onUpload instanceof Function)return await n.options.onUpload.call(e);if(n.options.endpoint){const c=new FormData;c.set("file",e);const{url:t}=await Ze({url:n.options.endpoint,method:"post",data:c});return t}}};return e(c.upload,{...n,options:t})}},In=z(((n,c)=>{let{action:t,method:r="post",onSuccess:i,formData:o,onSubmit:a,onChange:s,submitText:l="提交",children:d,...u}=n;const[h,m]=b(),[g,p]=b(!1),[f,v]=b(o),x=k((async(e,n)=>{try{if(p(!0),t){const{formData:n}=e;try{const e=await Ze({url:t,method:r,data:n});m(void 0),i&&await i(e)}catch(e){throw G.isAxiosError(e)&&m((e=>{const n=e.errors;return"string"==typeof n?{__errors:[n]}:J(n,(e=>({__errors:[e]})))})(e)),e}}else a&&await a(e,n)}finally{p(!1)}}),[t,r,a]),y=k((e=>{const{formData:n}=e;v(n),s&&s(e)}),[v,s]),w=k((e=>(e=e.map((e=>({keyword:e.name,dataPath:e.property,...e}))),On(e),e)),[]),_=e(En,{loading:g,type:"submit",variant:"primary",children:l});return"function"==typeof d&&(d=d({submit:_,loading:g})),e(ne,{ref:c,extraErrors:h,onSubmit:x,transformErrors:w,noHtml5Validate:!0,noValidate:!0,...u,formData:f,onChange:y,widgets:An,children:d||e("div",{className:"col-12",children:_})})}));var Pn,Dn,Bn,Fn,Rn;function Tn(c){let{title:t,children:r,extra:i}=c;return n(qn,{children:[e(Mn,{children:n("div",{className:"container",children:[e(Kn,{children:t}),e(Gn,{children:i})]})}),e(Hn,{className:"container",children:r})]})}const qn=o.div(Pn||(Pn=re(["\n width: 100%;\n"]))),Mn=o.div(Dn||(Dn=re(["\n background-color: #fff;\n display: flex;\n\n .container {\n padding: 0 24px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n"]))),Hn=o.div(Bn||(Bn=re(["\n margin-top: 24px;\n"]))),Kn=o.div(Fn||(Fn=re(["\n font-size: 22px;\n line-height: 64px;\n height: 64px;\n"]))),Gn=o.div(Rn||(Rn=re(["\n\n"])));const Vn=function(n){let{indeterminate:c=!1,...t}=n;const r=C(null);return x((()=>{r.current&&(r.current.indeterminate=c)}),[c]),e("input",{ref:r,...t,className:"form-check-input",type:"checkbox"})};var Wn,Yn,$n,Jn,Qn,Xn;const Zn=o(D)(Wn||(Wn=re(["\n .rc-table-thead {\n border-top: none;\n }\n"]))),ec={table:n=>e(Zn,{...n,className:"align-middle table-hover"})},nc=o(Nn)(Yn||(Yn=re(["\n margin-bottom: 0;\n justify-content: flex-end;\n"])));function cc(e){return"current_page"in e}const tc=z(((t,r)=>{let{source:i,rowKey:o="id",paginate:a=!0,toolBarRender:s,columns:l=[],search:d,rowSelection:u,card:h=!0,...m}=t;const[g,p]=b([]),[f,y]=b(a?{total:0,current:1,pageSize:10}:null),[w,_]=b(!0),[z,N]=b(""),j=k((async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};_(!0);try{let n;if("string"==typeof i){const c={q:z};f&&(c.page=e.page||f.current),n=await Ze({url:i,params:c})}else n=await i();a&&cc(n)&&(y({total:n.total,current:n.current_page,pageSize:n.per_page}),n=n.data),p(n)}catch(e){}finally{_(!1)}}),[i,p,f,z]);x((()=>{j()}),[z]);const E=C({reload:j});x((()=>{E.current={reload:j}}),[j]),S(r,(()=>E.current));const[L]=function(n,c,t){const[r,i]=b((()=>new Set((null==n?void 0:n.selectedRowKeys)||[]))),o=e=>"string"==typeof c?e[c]:c(e),a=e=>t.find((n=>o(n)===e)),s=k((e=>{i(e);const c=Array.from(e),t=c.map((function(e){return a(e)}));null!=n&&n.onChange&&(null==n||n.onChange(c,t))}),[a]);return[k((c=>{if(!n)return c;const i=t.map(o),a=i.every((function(e){return r.has(e)})),l=i.some((function(e){return r.has(e)}));return[{key:"selection",title:e(Vn,{checked:a,indeterminate:!a&&l,onChange:()=>{a?i.forEach((function(e){r.delete(e)})):i.forEach((function(e){r.add(e)})),s(new Set(r))}}),width:30,align:"center",render(n){let{record:c}=n;const t=o(c),i=r.has(t);return e(Vn,{checked:i,onChange:()=>{i?r.delete(t):r.add(t),s(new Set(r))}})}},...c]}),[t,n,r])]}(u,o,g),U=v((()=>L(l).map((e=>{const n={...e,render:void 0};if("render"in e&&e.render){const c=e.render;n.render=(e,n,t)=>c({value:e,record:n,index:t,action:E.current})}return n}))),[l,L,E]),O=function(e,n,c){const t=C(e),r=C(Q(e,n,c));return x((()=>{t.current=e})),x((()=>{r.current=Q((function(){t.current(...arguments)}),n,c)}),[n,c]),r.current}((e=>{N(e.target.value)}),500),A=n(c,{children:[e(Ve,{loading:w}),!1!==s&&n(rc,{children:[e(oc,{size:12,children:s&&s(E.current)}),n(ic,{size:12,children:[d&&e(B.Control,{onChange:O,type:"search",placeholder:"Search..."}),e(ac,{onClick:E.current.reload,children:e("i",{className:"bi bi-arrow-repeat"})})]})]}),e(te,{...m,rowKey:o,columns:U,components:ec,data:g}),f&&e(nc,{...f,onChange:e=>{j({page:e})}})]});return h?e(un,{children:A}):A})),rc=o.div($n||($n=re(["\n display: flex;\n justify-content: space-between;\n padding-bottom: 1rem;\n height: 48px;\n border-bottom: 2px solid #212529;\n"]))),ic=o(fn)(Jn||(Jn=re(["\n\n"]))),oc=o(fn)(Qn||(Qn=re(["\n\n"]))),ac=o.span(Xn||(Xn=re(["\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n\n &:hover {\n color: var(--bs-primary);\n }\n"]))),sc=z(((t,r)=>{let{text:i,variant:o,header:a=i,footer:s=!0,onOk:l,size:d,okText:u="确定",onShow:h,children:m,as:g=P}=t;const[p,f]=b(!1),[v,x]=b(!1),y=()=>f(!1);S(r,(()=>({close:y})));const w=_(g,{variant:o,onClick:()=>f(!0)},i);return n(c,{children:[w,n(F,{size:d,show:p,onHide:y,onShow:h,children:[a&&e(F.Header,{closeButton:!0,children:e(F.Title,{as:"h5",children:a})}),e(F.Body,{children:m}),s&&n(F.Footer,{children:[e(P,{variant:"secondary",onClick:y,children:"取消"}),e(En,{loading:v,variant:"primary",onClick:async()=>{if(l){x(!0);const e=await l();if(x(!1),!1===e)return}y()},children:u})]})]})]})}));function lc(n){let{text:c,header:t,schema:r,uiSchema:i,action:o,method:a,formData:s,variant:l,onSuccess:d,onChange:u,fields:h,size:m,as:g}=n;const p=C(null),f=k((async()=>{try{var e;return await(null===(e=p.current)||void 0===e?void 0:e.submit()),!0}catch{return!1}}),[]);return e(sc,{as:g,text:c,onOk:f,header:t,variant:l,size:m,children:e(In,{ref:p,schema:r,uiSchema:i,action:o,method:a,formData:s,fields:h,onChange:u,onSuccess:d,children:e(N,{})})})}function dc(e){let{manual:n,refreshDeps:c,...t}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{execute:r,currentParams:i,error:o,...a}=H((async n=>(e="string"==typeof e?{url:e}:e,await Ze({...e,...n}))),t);x((()=>{n||c||r()}),[]),x((()=>{c&&s()}),c);const s=k((()=>{i?r(...i):r()}),[r,i]);if(o&&Xe(o)){const e=o.errors;o=new Error("string"==typeof e?e:X(e).join(""))}return{refresh:s,execute:r,error:o,...a}}let uc=0;function hc(){let{onHide:e,onShow:n}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const[c,t]=b(!1),[r,i]=b("visible-".concat(uc)),o=k((()=>{t(!1),e&&e()}),[t,e]),a=k((()=>{i("visible-".concat(++uc))}),[i,uc]),s=k((()=>{t(!0),n&&n()}),[t,n]),l={show:c,onHide:o,onExited:a,key:r};return{visible:c,show:s,hide:o,state:l}}function mc(n){let{tooltip:c,children:t,placement:r="bottom"}=n;return e(R,{placement:r,overlay:e(T,{id:Z(),children:c}),children:t})}export{mn as Access,un as Card,Tn as Content,hn as Error,ae as Footer,In as Form,ln as Header,Un as LinkButton,Ve as Loader,En as LoadingButton,je as Message,sc as ModalButton,lc as ModalForm,jn as NumberFormat,Nn as Pagination,Ln as RequestButton,qe as Result,xe as SiderLayout,fn as Space,_n as Steps,tc as Table,Ue as Toast,mc as Tooltip,tn as UserProvider,nn as createApplication,Xe as isRequestError,Ze as request,hc as useOverlayState,dc as useRequest,rn as useUser};
2
2
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","../src/components/footer.tsx","../src/utils/get-menu-data.ts","../src/layout/sider.tsx","../src/utils/message.ts","../src/components/result.tsx","../src/images/logo.svg","../src/components/dimmer.tsx","../src/components/loader.tsx","../src/errors/unauthorized.ts","../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../src/pages/login.tsx","../src/pages/logout.tsx","../src/utils/toast.tsx","../src/request.ts","../src/utils/create-application.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/components/card.tsx","../src/components/error.tsx","../src/components/access.tsx","../src/components/space.tsx","../src/images/step_check.svg","../src/components/steps.tsx","../src/components/number-format.tsx","../src/components/loading-button.tsx","../src/components/request-button.tsx","../src/components/link-button.tsx","../src/components/form.tsx","../src/components/content.tsx","../src/components/pagination.tsx","../src/components/table/use-selection.tsx","../src/components/table/index.tsx","../src/hooks/use-debounce.ts","../src/components/modal-button.tsx","../src/components/modal-form.tsx","../src/hooks/use-request.ts","../src/hooks/use-overlay-state.ts","../src/components/tooltip.tsx"],"sourcesContent":["export default function _taggedTemplateLiteral(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n return Object.freeze(Object.defineProperties(strings, {\n raw: {\n value: Object.freeze(raw)\n }\n }));\n}","import styled from 'styled-components';\r\n\r\nconst FooterWrapper = styled.footer`\r\n\r\n`;\r\n\r\n\r\nexport default function Footer() {\r\n return <FooterWrapper>\r\n <div className='container'>\r\n\r\n </div>\r\n </FooterWrapper>;\r\n}\r\n","import type { RouteObject } from 'react-router';\r\n\r\nexport interface MenuData {\r\n path: string;\r\n title: string;\r\n icon?: string;\r\n children: MenuData[];\r\n}\r\n\r\nconst formatRelativePath = (\r\n routes: RouteObject[],\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 icon = route.meta?.icon;\r\n\r\n const menu: MenuData = {\r\n title,\r\n icon,\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: RouteObject[], 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 { useEffect, useMemo, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport type { RouteObject } from 'react-router';\r\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\r\nimport type { CSSMotionProps } from 'rc-motion';\r\n\r\ninterface Props {\r\n title: string;\r\n routes: RouteObject[];\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}>\r\n {item.icon && <i className={`bi bi-${item.icon}`} />}\r\n {item.title}\r\n </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 selectedKeys = 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 keys.push(pathname);\r\n return keys;\r\n }, [pathname]);\r\n\r\n const [openKeys, setOpenKeys] = useState<string[]>([]);\r\n\r\n useEffect(() => {\r\n setOpenKeys(selectedKeys.slice(0, -1));\r\n }, [selectedKeys]);\r\n\r\n const onOpenChange = (openKeys: string[]) => {\r\n const currentKey = openKeys[openKeys.length - 1];\r\n setOpenKeys(openKeys.filter(key => currentKey.startsWith(key)));\r\n };\r\n\r\n return <Container>\r\n <Sidebar>\r\n <Header>{title}</Header>\r\n <Menu\r\n mode='inline'\r\n motion={motion}\r\n openKeys={openKeys}\r\n onOpenChange={onOpenChange}\r\n selectedKeys={selectedKeys}\r\n >\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\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: 54px 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: 10px 0;\r\n height: 64px;\r\n line-height: 44px;\r\n text-indent: 24px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n font-size: 16px;\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 - 54px);\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: 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: dimgray;\r\n\r\n .bi {\r\n font-size: 16px;\r\n line-height: 18px;\r\n margin-right: 9px;\r\n min-width: 19px;\r\n text-align: center;\r\n vertical-align: text-bottom;\r\n }\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 & > a {\r\n color: var(--bs-primary);\r\n }\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 & > a {\r\n color: var(--bs-primary);\r\n }\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","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","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\nimport styled from 'styled-components';\r\n\r\ninterface LoaderProps {\r\n loading?: boolean;\r\n animation?: SpinnerProps['animation'];\r\n wrap?: boolean;\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 wrap,\r\n ...props\r\n}: PropsWithChildren<LoaderProps & Omit<SpinnerProps, 'animation'>>): JSX.Element | null {\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 children = <Dimmer inverted active>\r\n <Spinner animation={animation} variant={variant} {...props} />\r\n {children}\r\n </Dimmer>;\r\n\r\n if (wrap) {\r\n return <Wrap height={typeof wrap === 'number' ? wrap : 150}>\r\n {children}\r\n </Wrap>;\r\n }\r\n\r\n return children as JSX.Element;\r\n}\r\n\r\nconst Wrap = styled.div<{ height: number }>`\r\n position: relative;\r\n height: ${props => `${props.height}px`};\r\n`;\r\n","export default class Unauthorized extends Error {\r\n\r\n url: string;\r\n\r\n constructor(url: string) {\r\n super('Unauthorized');\r\n this.url = url;\r\n }\r\n}\r\n","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import { useAsync } from 'react-async-hook';\r\nimport { Navigate } from 'react-router-dom';\r\nimport Loader from '../components/loader';\r\n\r\ninterface LoginProps {\r\n onLogin: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Login({ onLogin }: LoginProps) {\r\n const { result } = useAsync(async () => {\r\n await onLogin();\r\n\r\n const redirectUri = sessionStorage.getItem('redirect_uri');\r\n if (redirectUri) {\r\n sessionStorage.removeItem('redirect_uri');\r\n }\r\n return redirectUri || '/';\r\n }, []);\r\n\r\n if (result) {\r\n return <Navigate to={result} replace />;\r\n }\r\n\r\n return <Loader />;\r\n}\r\n","import { useAsync } from 'react-async-hook';\r\nimport Loader from '../components/loader';\r\n\r\ninterface LogoutProps {\r\n onLogout: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Logout({ onLogout }: LogoutProps) {\r\n useAsync(async () => {\r\n await onLogout();\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n","import { Alert } from 'react-bootstrap';\r\nimport { NoticeContent, NotificationInstance } from 'rc-notification/lib/Notification';\r\nimport Notification from 'rc-notification';\r\n\r\nlet noticeInstance: NotificationInstance | null;\r\n\r\nfunction getNoticeInstance(callback: (instance: NotificationInstance) => void) {\r\n if (noticeInstance) {\r\n return callback(noticeInstance);\r\n }\r\n\r\n Notification.newInstance({\r\n prefixCls: 'notification',\r\n maxCount: 5,\r\n style: {\r\n top: 20,\r\n right: 20\r\n }\r\n }, (instance) => {\r\n if (noticeInstance) {\r\n callback(noticeInstance);\r\n return;\r\n }\r\n noticeInstance = instance;\r\n callback(instance);\r\n });\r\n}\r\n\r\nconst types = ['error'];\r\n\r\nconst notice = ({ type, ...options }: { type: string } & NoticeContent) => {\r\n getNoticeInstance((instance) => {\r\n switch (type) {\r\n case 'error':\r\n options.content = <Alert variant='danger'>{options.content}</Alert>;\r\n if (options.closable) {\r\n options.duration = 0;\r\n } else {\r\n options.duration = 5;\r\n }\r\n break;\r\n }\r\n\r\n instance.notice(options);\r\n });\r\n};\r\n\r\n\r\nlet Toast: {\r\n [index in typeof types[number]]: (content: string, options?: NoticeContent) => void\r\n} = {};\r\n\r\ntypes.forEach((type) => {\r\n Toast[type] = (content, options) => {\r\n notice({\r\n ...options,\r\n type,\r\n content\r\n });\r\n };\r\n});\r\n\r\nexport default Toast;\r\n","import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';\r\nimport queryString from 'query-string';\r\nimport * as rax from 'retry-axios';\r\nimport { RetryConfig } from 'retry-axios';\r\nimport Unauthorized from './errors/unauthorized';\r\nimport Toast from './utils/toast';\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 interface AxiosRequestConfig {\r\n raxConfig?: RetryConfig;\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.maxContentLength = Infinity;\r\naxios.defaults.maxBodyLength = Infinity;\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 = {\r\n ...config.headers,\r\n Authorization: `Bearer ${token}`\r\n };\r\n }\r\n return config;\r\n },\r\n error => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nconst isRecord = (data: any): data is Record<string, string> => {\r\n return data && (typeof data === 'object');\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 e.errors = 'Unauthorized';\r\n if (isRecord(data) && data.url) {\r\n e = new Unauthorized(data.url);\r\n }\r\n Toast.error('Unauthorized');\r\n } else {\r\n if (isRecord(data)) {\r\n if (status === 422) {\r\n e.errors = data;\r\n } else if ('message' in data) {\r\n e.errors = data['message'];\r\n }\r\n } else {\r\n e.errors = data as string;\r\n }\r\n }\r\n }\r\n }\r\n return Promise.reject(e);\r\n }\r\n);\r\n\r\nexport type RequestConfig = AxiosRequestConfig | string\r\nexport type RequestInstance = AxiosInstance\r\nexport const isRequestError = axios.isAxiosError;\r\n\r\nconst request = async function <T = any>(config: RequestConfig) {\r\n config = typeof config === 'string' ? { url: config } : config;\r\n\r\n const { data } = await axios.request<T>({\r\n paramsSerializer: function(params) {\r\n return queryString.stringify(params, {\r\n sort: false,\r\n skipNull: true,\r\n skipEmptyString: true\r\n });\r\n },\r\n ...config\r\n });\r\n\r\n return data;\r\n};\r\n\r\nrequest.defaults = axios.defaults;\r\nrequest.interceptors = axios.interceptors;\r\n\r\nexport default request;\r\n","import Unauthorized from '../errors/unauthorized';\r\nimport { BrowserRouter, Route, Routes } from 'react-router-dom';\r\nimport React, { PropsWithChildren } from 'react';\r\nimport Login from '../pages/login';\r\nimport Logout from '../pages/logout';\r\nimport queryString from 'query-string';\r\nimport request from '../request';\r\nimport { User } from './types';\r\nimport * as path from 'path';\r\n\r\ntype UserResolver = () => User | Promise<User>\r\n\r\nexport const AppContext = React.createContext<{ userResolver?: UserResolver, onUnauthorized?: (error: Unauthorized) => void }>({});\r\n\r\nfunction stripBasename(pathname: string, basename: string) {\r\n if (basename === '/') return pathname;\r\n\r\n return pathname.slice(basename.length);\r\n}\r\n\r\ninterface Options {\r\n baseURL?: string;\r\n basename?: string;\r\n authentication?: 'cookie' | 'token';\r\n onLogout?: () => void | Promise<void>;\r\n onLogin?: () => (void | string) | Promise<void | string>;\r\n userResolver?: UserResolver;\r\n}\r\n\r\nexport default function createApplication(options: Options) {\r\n const { basename = '/', onLogin, onLogout, authentication, baseURL, userResolver } = options;\r\n\r\n if (baseURL) {\r\n request.defaults.baseURL = baseURL;\r\n }\r\n\r\n if (authentication === 'token') {\r\n request.interceptors.request.use(\r\n config => {\r\n const token = sessionStorage.getItem('authorization');\r\n\r\n if (token) {\r\n config.headers = {\r\n ...config.headers,\r\n Authorization: `Bearer ${token}`\r\n };\r\n }\r\n return config;\r\n }\r\n );\r\n }\r\n\r\n const onUnauthorized = (error: Unauthorized) => {\r\n if (window.location.pathname !== path.join(basename, '/logout')) {\r\n sessionStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\r\n }\r\n const redirectUri = window.location.origin + path.join(basename, '/login');\r\n\r\n window.location.href = queryString.stringifyUrl({\r\n url: error.url,\r\n query: { redirect_uri: redirectUri }\r\n });\r\n };\r\n\r\n const handleLogin = async () => {\r\n let token: string | void;\r\n if (onLogin) {\r\n token = await onLogin();\r\n } else {\r\n const parsed = queryString.parse(window.location.hash.substr(1));\r\n if (parsed.access_token) {\r\n token = parsed.access_token as string;\r\n }\r\n }\r\n\r\n if (authentication === 'token' && token) {\r\n sessionStorage.setItem('authorization', token);\r\n }\r\n };\r\n\r\n const handleLogout = async () => {\r\n if (onLogout) {\r\n try {\r\n await onLogout();\r\n } catch (e) {\r\n if (e instanceof Unauthorized) {\r\n onUnauthorized(e);\r\n }\r\n }\r\n }\r\n\r\n if (authentication === 'token') {\r\n sessionStorage.removeItem('authorization');\r\n }\r\n };\r\n\r\n return function({ children }: PropsWithChildren<any>) {\r\n return <AppContext.Provider value={{ userResolver, onUnauthorized }}>\r\n <BrowserRouter basename={basename}>\r\n <Routes>\r\n <Route path='*' element={children} />\r\n <Route path='login' element={<Login onLogin={handleLogin} />} />\r\n <Route path='logout' element={<Logout onLogout={handleLogout} />} />\r\n </Routes>\r\n </BrowserRouter>\r\n </AppContext.Provider>;\r\n };\r\n}\r\n","import React, { PropsWithChildren, useContext, useState } from 'react';\r\nimport Loader from './loader';\r\nimport { User } from '../utils/types';\r\nimport { AppContext } from '../utils/create-application';\r\nimport { useAsync } from 'react-async-hook';\r\nimport Unauthorized from '../errors/unauthorized';\r\n\r\nexport const UserContext = React.createContext<[User, ((user: User) => void)] | null>(null);\r\n\r\nconst UserProvider = function({ children }: PropsWithChildren<any>) {\r\n const [state, setState] = useState<User | null>(null);\r\n\r\n const { userResolver, onUnauthorized } = useContext(AppContext);\r\n\r\n useAsync(async () => {\r\n if (userResolver) {\r\n return userResolver();\r\n }\r\n }, [], {\r\n onError(e) {\r\n if (e instanceof Unauthorized && onUnauthorized) {\r\n onUnauthorized(e);\r\n }\r\n },\r\n onSuccess(user) {\r\n if (user) {\r\n setState(user);\r\n }\r\n }\r\n });\r\n\r\n if (!state) {\r\n return <Loader />;\r\n }\r\n\r\n return <UserContext.Provider value={[state, setState]}>\r\n {children}\r\n </UserContext.Provider>;\r\n};\r\n\r\nexport function useUser() {\r\n const context = useContext(UserContext);\r\n if (!context) {\r\n throw new Error('please use `useUser` in UserContext');\r\n }\r\n\r\n return context;\r\n}\r\n\r\nexport default UserProvider;\r\n","import logoSrc from '../images/logo.svg';\r\nimport { Dropdown } from 'react-bootstrap';\r\nimport styled from 'styled-components';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\nimport { useUser } from './user-provider';\r\nimport classNames from 'classnames';\r\n\r\nconst Avatar = styled.a`\r\n cursor: pointer;\r\n`;\r\n\r\ninterface Props {\r\n menus: ReactNode;\r\n className?: string;\r\n logo?: boolean;\r\n}\r\n\r\nexport default function Header({ children, menus, className, logo = true }: PropsWithChildren<Props>) {\r\n const [user] = useUser();\r\n\r\n return <Container\r\n className={classNames('navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top', className)}>\r\n <div className='container-fluid'>\r\n {logo && <a className='navbar-brand' href='https://www.topthink.com'>\r\n <img src={logoSrc} height='30' />\r\n </a>}\r\n {children}\r\n <Dropdown navbar>\r\n <Dropdown.Toggle as={Avatar} className='nav-link'>\r\n <img className='rounded-circle' width='25' height='25' src={user.avatar} />\r\n </Dropdown.Toggle>\r\n <Dropdown.Menu className={'shadow'}>\r\n {menus}\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.header`\r\n height: 54px;\r\n`;\r\n","import { PropsWithChildren } from 'react';\r\nimport { Card as BsCard, CardProps as BsCardProps } from 'react-bootstrap';\r\nimport classNames from 'classnames';\r\n\r\ninterface CardProps extends BsCardProps {\r\n title?: string;\r\n}\r\n\r\nexport default function Card({ children, title, className, ...props }: PropsWithChildren<CardProps>) {\r\n\r\n return <BsCard className={classNames('border-0 shadow-sm mb-3', className)} {...props}>\r\n <div className='card-body'>\r\n {title && <>\r\n <h5>{title}</h5>\r\n <hr />\r\n </>}\r\n {children}\r\n </div>\r\n </BsCard>;\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 { ReactNode } from 'react';\r\nimport { intersection } from 'lodash';\r\nimport { useUser } from './user-provider';\r\nimport { User } from '../utils/types';\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 if (child) {\r\n return <Item>{child}</Item>;\r\n }\r\n });\r\n\r\n return <Container size={size}>\r\n {items}\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.div<{ size: number }>`\r\n display: inline-flex;\r\n align-items: center;\r\n gap: ${props => props.size}px;\r\n`;\r\n\r\nconst Item = styled.div`\r\n\r\n`;\r\n","var img = \"data:image/svg+xml,%3csvg t='1651217947509' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='2548' width='16px' height='16px' fill='currentColor'%3e %3cpath d='M887.904 298.208c-12.864-12.064-33.152-11.488-45.216 1.408L415.936 753.984l-233.12-229.696C170.208 511.872 149.952 512 137.536 524.608c-12.416 12.576-12.256 32.864 0.352 45.248l256.48 252.672c0.096 0.096 0.224 0.128 0.32 0.224 0.096 0.096 0.128 0.224 0.224 0.32 2.016 1.92 4.448 3.008 6.784 4.288 1.152 0.672 2.144 1.664 3.36 2.144 3.776 1.472 7.776 2.24 11.744 2.24 4.192 0 8.384-0.832 12.288-2.496 1.312-0.544 2.336-1.664 3.552-2.368 2.4-1.408 4.896-2.592 6.944-4.672 0.096-0.096 0.128-0.256 0.224-0.352 0.064-0.096 0.192-0.128 0.288-0.224l449.184-478.208C901.44 330.592 900.768 310.336 887.904 298.208z' p-id='2549'%3e%3c/path%3e%3c/svg%3e\";\n export default img;","import RcSteps from 'rc-steps';\r\nimport 'rc-steps/assets/index.css';\r\nimport styled from 'styled-components';\r\nimport { ComponentProps } from 'react';\r\nimport { ReactComponent as CheckIcon } from '../images/step_check.svg';\r\n\r\nexport default function Steps(props: ComponentProps<typeof RcSteps>) {\r\n return <CustomRcSteps\r\n icons={{\r\n finish: <CheckIcon />,\r\n error: <></>\r\n }}\r\n {...props}\r\n />;\r\n}\r\n\r\nSteps.Step = RcSteps.Step;\r\n\r\nconst CustomRcSteps = styled(RcSteps)`\r\n .rc-steps-item-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n & > .rc-steps-icon {\r\n top: 0;\r\n }\r\n }\r\n\r\n .rc-steps-item-process {\r\n .rc-steps-item-icon {\r\n background: var(--bs-primary);\r\n border-color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-steps-item-finish {\r\n .rc-steps-item-icon {\r\n border-color: var(--bs-primary);\r\n\r\n & > .rc-steps-icon {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-steps-item-title:after {\r\n background-color: var(--bs-primary);\r\n }\r\n }\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 className?: string;\r\n}\r\n\r\nexport default function NumberFormat({ className, 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 if (className) {\r\n return <span className={className}>{formatter.format(value)}</span>;\r\n }\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, { RequestConfig } from '../request';\r\nimport { createElement, ElementType, MouseEvent, useCallback, useState } from 'react';\r\nimport Message from '../utils/message';\r\nimport axios, { AxiosRequestConfig } from 'axios';\r\n\r\ninterface Props extends Omit<ButtonProps, 'as'> {\r\n url: RequestConfig;\r\n method?: AxiosRequestConfig['method'];\r\n confirm?: string;\r\n onSuccess?: (result: any) => void;\r\n as?: ElementType | ButtonProps['as'];\r\n}\r\n\r\nexport default function RequestButton({\r\n url,\r\n method,\r\n confirm,\r\n onSuccess,\r\n children,\r\n disabled,\r\n as = Button,\r\n ...props\r\n}: Props) {\r\n\r\n const [fetching, setFetching] = useState(false);\r\n\r\n const handleClick = useCallback(async (e: MouseEvent) => {\r\n e.preventDefault();\r\n try {\r\n setFetching(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 setFetching(false);\r\n }\r\n }, [url, method, setFetching]);\r\n\r\n return createElement(as, {\r\n ...props,\r\n disabled: disabled || fetching,\r\n onClick: handleClick\r\n }, children);\r\n}\r\n","import { Button, ButtonProps } from 'react-bootstrap';\r\nimport { LinkProps, useNavigate } from 'react-router-dom';\r\n\r\ninterface Props extends ButtonProps, Pick<LinkProps, 'to' | 'replace'> {\r\n\r\n}\r\n\r\nexport default function LinkButton({ to, replace, ...props }: Props) {\r\n let navigate = useNavigate();\r\n\r\n return <Button {...props} onClick={(e) => {\r\n e.preventDefault();\r\n navigate(to, { replace });\r\n }} />;\r\n}\r\n","import JsonForm, { JsonFormProps, JsonFormType, getRegistry } from '@topthink/json-form';\r\nimport * as React from 'react';\r\nimport {\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithoutRef,\r\n ReactNode,\r\n RefAttributes,\r\n useCallback,\r\n useState\r\n} 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, WidgetProps } 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 children?: ReactNode | ((props: { submit: ReactNode, loading: boolean }) => ReactNode);\r\n submitText?: string;\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\nconst widgets = {\r\n upload: function(props: WidgetProps) {\r\n const { widgets } = getRegistry();\r\n\r\n const options = {\r\n ...props.options,\r\n async onUpload(file: File) {\r\n if (props.options.onUpload instanceof Function) {\r\n return await props.options.onUpload.call(file);\r\n }\r\n if (props.options.endpoint) {\r\n const data = new FormData();\r\n\r\n data.set('file', file);\r\n\r\n const { url } = await request({\r\n url: props.options.endpoint as string,\r\n method: 'post',\r\n data\r\n });\r\n\r\n return url;\r\n }\r\n }\r\n };\r\n\r\n return <widgets.upload {...props} options={options} />;\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 onChange,\r\n submitText = '提交',\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 //todo 包含File对象需转FormData\r\n try {\r\n const result = 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(result);\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((e: ISubmitEvent<any>) => {\r\n const { formData } = e;\r\n setData(formData);\r\n if (onChange) {\r\n onChange(e);\r\n }\r\n }, [setData, onChange]);\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 const submit = <LoadingButton loading={loading} type='submit' variant='primary'>{submitText}</LoadingButton>;\r\n\r\n if (typeof children === 'function') {\r\n children = children({ submit, loading });\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 widgets={widgets}\r\n >\r\n {children || <div className='col-12'>\r\n {submit}\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\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\r\n\r\n return <Container>\r\n <Header>\r\n <div className='container'>\r\n <Title>\r\n {title}\r\n </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\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","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 { Columns, TableProps, TableRowSelection } from './index';\r\nimport { InputHTMLAttributes, Key, useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nconst Checkbox = function({\r\n indeterminate = false,\r\n ...props\r\n}: InputHTMLAttributes<HTMLInputElement> & { indeterminate?: boolean }) {\r\n\r\n const ref = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n if (ref.current) {\r\n ref.current.indeterminate = indeterminate;\r\n }\r\n }, [indeterminate]);\r\n\r\n return <input\r\n ref={ref}\r\n {...props}\r\n className='form-check-input'\r\n type='checkbox'\r\n />;\r\n};\r\n\r\nexport default function useSelection<T = any>(\r\n rowSelection: TableRowSelection<T> | undefined,\r\n rowKey: Required<TableProps<T>>['rowKey'],\r\n data: T[]\r\n) {\r\n const [keys, setKeys] = useState(() => new Set(rowSelection?.selectedRowKeys || []));\r\n\r\n const getRowKey = (record: T) => {\r\n if (typeof rowKey === 'string') {\r\n // @ts-ignore\r\n return record[rowKey];\r\n } else {\r\n return rowKey(record);\r\n }\r\n };\r\n\r\n const getRecordByKey = (key: Key) => {\r\n return data.find((record) => {\r\n return getRowKey(record) === key;\r\n })!;\r\n };\r\n\r\n const setSelectedKeys = useCallback((keys: Set<Key>) => {\r\n setKeys(keys);\r\n const changedKeys = Array.from(keys);\r\n\r\n const records = changedKeys.map(function(key) {\r\n return getRecordByKey(key);\r\n });\r\n\r\n if (rowSelection?.onChange) {\r\n rowSelection?.onChange(changedKeys, records);\r\n }\r\n }, [getRecordByKey]);\r\n\r\n const transformColumns = useCallback((columns: Columns): Columns => {\r\n if (!rowSelection) {\r\n return columns;\r\n }\r\n\r\n const recordKeys = data.map(getRowKey);\r\n\r\n const checkedCurrentAll = recordKeys.every(function(key) {\r\n return keys.has(key);\r\n });\r\n const checkedCurrentSome = recordKeys.some(function(key) {\r\n return keys.has(key);\r\n });\r\n\r\n return [{\r\n key: 'selection',\r\n title: <Checkbox\r\n checked={checkedCurrentAll}\r\n indeterminate={!checkedCurrentAll && checkedCurrentSome}\r\n onChange={() => {\r\n if (checkedCurrentAll) {\r\n recordKeys.forEach(function(key) {\r\n keys.delete(key);\r\n });\r\n } else {\r\n recordKeys.forEach(function(key) {\r\n keys.add(key);\r\n });\r\n }\r\n setSelectedKeys(new Set(keys));\r\n }}\r\n />,\r\n width: 30,\r\n align: 'center',\r\n render({ record }) {\r\n const key = getRowKey(record);\r\n const checked = keys.has(key);\r\n return <Checkbox\r\n checked={checked}\r\n onChange={() => {\r\n if (checked) {\r\n keys.delete(key);\r\n } else {\r\n keys.add(key);\r\n }\r\n setSelectedKeys(new Set(keys));\r\n }}\r\n />;\r\n }\r\n }, ...columns];\r\n }, [data, rowSelection, keys]);\r\n\r\n return [transformColumns];\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 { Form, Table as BsTable, TableProps as BsTableProps } from 'react-bootstrap';\r\nimport {\r\n ChangeEvent,\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n Key,\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\nimport useDebounce from '../../hooks/use-debounce';\r\nimport useSelection from './use-selection';\r\nimport { PaginationType } from '../../utils/types';\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 = styled(BsTable)`\r\n .rc-table-thead {\r\n border-top: none;\r\n }\r\n`;\r\n\r\nconst components: RcTableProps['components'] = {\r\n table: (props: BsTableProps) => {\r\n return <CustomTable {...props} className='align-middle table-hover' />;\r\n },\r\n};\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 TableRowSelection<RecordType = any> {\r\n selectedRowKeys?: Key[];\r\n onChange?: (selectedRowKeys: Key[], selectedRows: RecordType[]) => void;\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) | false;\r\n search?: boolean | string;\r\n rowSelection?: TableRowSelection<RecordType>;\r\n card?: boolean;\r\n}\r\n\r\ntype Params = {\r\n page?: number;\r\n sortField?: string;\r\n sortOrder?: number;\r\n q?: string;\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 {\r\n source,\r\n rowKey = 'id',\r\n paginate = true,\r\n toolBarRender,\r\n columns = [],\r\n search,\r\n rowSelection,\r\n card = true,\r\n ...props\r\n },\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 const [keyword, setKeyword] = useState('');\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: Params = {\r\n q: keyword\r\n };\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, keyword]);\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, [keyword]);\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 //多选\r\n const [transformColumns] = useSelection(rowSelection, rowKey, data);\r\n\r\n const customColumns = useMemo(() => {\r\n return transformColumns(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, transformColumns, action]);\r\n\r\n const handlePageChange = (current: number) => {\r\n fetchData({\r\n page: current\r\n });\r\n };\r\n\r\n const handleSearch = useDebounce((e: ChangeEvent<HTMLInputElement>) => {\r\n setKeyword(e.target.value);\r\n }, 500);\r\n\r\n const children = <>\r\n <Loader loading={loading} />\r\n {toolBarRender !== false && <Header>\r\n <LeftTools size={12}>\r\n {toolBarRender && toolBarRender(action.current)}\r\n </LeftTools>\r\n <RightTools size={12}>\r\n {search &&\r\n <Form.Control onChange={handleSearch} type={'search'} placeholder={'Search...'} />}\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 </>;\r\n\r\n if (card) {\r\n return <Card>\r\n {children}\r\n </Card>;\r\n }\r\n return children;\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 height: 48px;\r\n border-bottom: 2px solid #212529;\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 { debounce, DebouncedFunc } from 'lodash';\r\nimport { useEffect, useRef } from 'react';\r\n\r\nexport default function useDebounce<T extends (...args: any) => any>(callback: T, wait: number, options?: {}): DebouncedFunc<T> {\r\n const callbackRef = useRef<T>(callback);\r\n const debouncedCallbackRef = useRef<DebouncedFunc<T>>(\r\n debounce(callback, wait, options)\r\n );\r\n\r\n useEffect(() => {\r\n callbackRef.current = callback;\r\n });\r\n\r\n useEffect(() => {\r\n debouncedCallbackRef.current = debounce((...args: any) => {\r\n callbackRef.current(...args);\r\n }, wait, options);\r\n }, [wait, options]);\r\n\r\n return debouncedCallbackRef.current;\r\n}\r\n","import {\r\n createElement,\r\n ElementType,\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithChildren,\r\n PropsWithoutRef,\r\n ReactNode,\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: ReactNode;\r\n variant?: ButtonProps['variant'];\r\n header?: string;\r\n onOk?: () => any;\r\n footer?: boolean;\r\n as?: ElementType | ButtonProps['as'];\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,\r\n header = text,\r\n footer = true,\r\n onOk,\r\n size,\r\n onShow,\r\n children,\r\n as = Button\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 const button = createElement(as, {\r\n variant,\r\n onClick: handleShow\r\n }, text);\r\n\r\n return <>\r\n {button}\r\n <Modal size={size} show={show} onHide={handleClose} onShow={onShow}>\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 } 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' | 'as'> &\r\n Pick<FormProps<T>, 'schema' | 'formData' | 'uiSchema' | 'action' | 'method' | 'onSuccess' | 'onChange' | 'fields' | 'formContext'>\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 onChange,\r\n fields,\r\n size,\r\n as\r\n}: ModalFormProps<T>) {\r\n\r\n const form = useRef<FormType>(null);\r\n\r\n const handleOk = useCallback(async () => {\r\n try {\r\n await form.current?.submit();\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }, []);\r\n\r\n return <ModalButton as={as} 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 fields={fields}\r\n onChange={onChange}\r\n onSuccess={onSuccess}\r\n >\r\n {/*TODO 支持回车提交并同步按钮loading状态*/}\r\n <Fragment />\r\n </Form>\r\n </ModalButton>;\r\n}\r\n","import { useAsyncCallback, UseAsyncCallbackOptions } from 'react-async-hook';\r\nimport request, { isRequestError, RequestConfig } from '../request';\r\nimport { DependencyList, useCallback, useEffect } from 'react';\r\nimport { AxiosRequestConfig } from 'axios';\r\nimport { values } from 'lodash';\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: RequestConfig, {\r\n manual,\r\n refreshDeps,\r\n ...options\r\n}: UseRequestOptions<T> = {}) {\r\n let { 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 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 if (error && isRequestError(error)) {\r\n const errors = error.errors;\r\n error = new Error(typeof errors === 'string' ? errors : values(errors).join(''));\r\n }\r\n\r\n return {\r\n refresh,\r\n execute,\r\n error,\r\n ...others\r\n };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\ninterface Options {\r\n onHide?: () => void;\r\n onShow?: () => void;\r\n}\r\n\r\nlet id = 0;\r\n\r\nexport default function useOverlayState({ onHide, onShow }: Options = {}) {\r\n const [visible, setVisible] = useState(false);\r\n\r\n const [key, setKey] = useState(`visible-${id}`);\r\n\r\n const hide = useCallback(() => {\r\n setVisible(false);\r\n if (onHide) {\r\n onHide();\r\n }\r\n }, [setVisible, onHide]);\r\n\r\n const exit = useCallback(() => {\r\n setKey(`visible-${++id}`);\r\n }, [setKey, id]);\r\n\r\n const show = useCallback(() => {\r\n setVisible(true);\r\n if (onShow) {\r\n onShow();\r\n }\r\n }, [setVisible, onShow]);\r\n\r\n const state = {\r\n show: visible,\r\n onHide: hide,\r\n onExited: exit,\r\n key\r\n };\r\n\r\n return {\r\n visible,\r\n show,\r\n hide,\r\n state\r\n };\r\n}\r\n","import { OverlayTrigger, OverlayTriggerProps, Tooltip as BsTooltip } from 'react-bootstrap';\r\nimport { uniqueId } from 'lodash';\r\n\r\ninterface TooltipProps {\r\n tooltip: string;\r\n children: OverlayTriggerProps['children'];\r\n placement?: OverlayTriggerProps['placement'];\r\n}\r\n\r\nexport default function Tooltip({ tooltip, children, placement = 'bottom' }: TooltipProps) {\r\n\r\n return <OverlayTrigger\r\n placement={placement}\r\n overlay={\r\n <BsTooltip id={uniqueId()}>\r\n {tooltip}\r\n </BsTooltip>\r\n }\r\n >\r\n {children}\r\n </OverlayTrigger>;\r\n}\r\n"],"names":["_taggedTemplateLiteral","strings","raw","slice","Object","freeze","defineProperties","value","FooterWrapper","styled","footer","Footer","_jsx","className","formatRelativePath","routes","parent","menus","route","meta","_route$meta","hideInMenu","title","_route$meta2","path","replace","menu","icon","_route$meta3","children","_route$meta4","hideChildrenInMenu","length","push","renderMenuItems","items","map","item","SubMenu","MenuItem","_jsxs","Link","to","collapseNode","height","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","basename","useRoutes","useMemo","getMenuData","pathname","useLocation","selectedKeys","keys","split","reduce","pre","curr","join","openKeys","setOpenKeys","useState","useEffect","Container","Sidebar","Header","Menu","mode","onOpenChange","currentKey","filter","key","startsWith","Content","Main","div","nav","main","RcMenu","CustomSwal","withReactContent","Swal","defaultOptions","confirmButtonText","cancelButtonText","Message","confirm","async","isConfirmed","fire","showCancelButton","options","error","toast","position","timer","showConfirmButton","Icon","Title","Extra","IconMap","success","info","warning","Result","status","extra","Dimmer","props","active","inverted","Loader","loading","variant","animation","wrap","Spinner","Wrap","Unauthorized","Error","constructor","url","obj","defineProperty","enumerable","configurable","writable","Login","onLogin","result","useAsync","redirectUri","sessionStorage","getItem","removeItem","Navigate","Logout","onLogout","noticeInstance","notice","_ref","type","callback","Notification","newInstance","prefixCls","maxCount","style","top","right","instance","getNoticeInstance","content","Alert","closable","duration","Toast","forEach","rax","attach","axios","defaults","raxConfig","retryDelay","backoffType","shouldRetry","err","config","method","toUpperCase","response","maxContentLength","Infinity","maxBodyLength","baseURL","interceptors","request","use","token","headers","Authorization","Promise","reject","isRecord","data","location","window","href","undefined","e","isAxiosError","errors","isRequestError","paramsSerializer","params","queryString","stringify","sort","skipNull","skipEmptyString","AppContext","React","createContext","createApplication","authentication","userResolver","onUnauthorized","setItem","stripBasename","search","origin","stringifyUrl","query","redirect_uri","handleLogin","parsed","parse","hash","substr","access_token","handleLogout","Provider","BrowserRouter","Routes","Route","element","UserContext","UserProvider","state","setState","useContext","onError","onSuccess","user","useUser","context","Avatar","a","logo","classNames","src","Dropdown","navbar","Toggle","as","width","avatar","header","Card","BsCard","entries","_ref2","name","Access","require","fallback","passed","intersection","roles","Space","size","small","middle","large","Children","child","Item","_path","_extends","assign","target","i","arguments","source","prototype","hasOwnProperty","call","apply","this","SvgStepCheck","createElement","viewBox","xmlns","fill","d","Steps","CustomRcSteps","icons","finish","CheckIcon","Step","RcSteps","NumberFormat","locale","currency","formatter","minimumFractionDigits","Intl","format","LoadingButton","Button","disabled","RequestButton","fetching","setFetching","handleClick","useCallback","preventDefault","text","values","onClick","LinkButton","navigate","useNavigate","localize","widgets","upload","getRegistry","file","onUpload","Function","endpoint","FormData","set","Form","forwardRef","ref","action","formData","onSubmit","onChange","submitText","extraErrors","setExtraErrors","setLoading","setData","handleSubmit","nativeEvent","__errors","mapValues","toExtraErrors","handleChange","transformErrors","keyword","dataPath","property","submit","JsonForm","noHtml5Validate","noValidate","Body","noop","isInteger","isFinite","Math","floor","Checkbox","indeterminate","useRef","current","CustomTable","BsTable","components","table","CustomPagination","total","defaultCurrent","defaultPageSize","setCurrent","pageSize","setPageSize","allPages","p","prevPage","nextPage","pagerList","jumpPrev","jumpNext","firstPager","lastPager","BsPagination","Last","First","Prev","Next","left","max","min","pageBufferSize","unshift","isPagination","Table","rowKey","paginate","toolBarRender","columns","rowSelection","card","pagination","setPagination","setKeyword","fetchData","q","page","current_page","per_page","reload","useImperativeHandle","transformColumns","setKeys","Set","selectedRowKeys","getRowKey","record","getRecordByKey","find","setSelectedKeys","changedKeys","Array","from","records","recordKeys","checkedCurrentAll","every","has","checkedCurrentSome","some","checked","delete","add","align","render","useSelection","customColumns","column","customColumn","defaultRender","index","handleSearch","wait","callbackRef","debouncedCallbackRef","debounce","useDebounce","LeftTools","RightTools","Control","placeholder","Action","RcTable","span","ModalButton","onOk","onShow","show","setShow","handleClose","close","button","Modal","onHide","closeButton","ModalForm","schema","uiSchema","fields","form","handleOk","_form$current","Fragment","useRequest","manual","refreshDeps","execute","currentParams","others","useAsyncCallback","refresh","id","useOverlayState","visible","setVisible","setKey","hide","exit","onExited","Tooltip","tooltip","placement","OverlayTrigger","overlay","BsTooltip","uniqueId"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","../src/components/footer.tsx","../src/utils/get-menu-data.ts","../src/layout/sider.tsx","../src/utils/message.ts","../src/utils/toast.tsx","../src/components/result.tsx","../src/images/logo.svg","../src/components/dimmer.tsx","../src/components/loader.tsx","../src/errors/unauthorized.ts","../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../src/pages/login.tsx","../src/pages/logout.tsx","../src/request.ts","../src/utils/create-application.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/components/card.tsx","../src/components/error.tsx","../src/components/access.tsx","../src/components/space.tsx","../src/images/step_check.svg","../src/components/steps.tsx","../src/components/pagination.tsx","../src/components/number-format.tsx","../src/components/loading-button.tsx","../src/components/request-button.tsx","../src/components/link-button.tsx","../src/components/form.tsx","../src/components/content.tsx","../src/components/table/use-selection.tsx","../src/components/table/index.tsx","../src/hooks/use-debounce.ts","../src/components/modal-button.tsx","../src/components/modal-form.tsx","../src/hooks/use-request.ts","../src/hooks/use-overlay-state.ts","../src/components/tooltip.tsx"],"sourcesContent":["export default function _taggedTemplateLiteral(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n return Object.freeze(Object.defineProperties(strings, {\n raw: {\n value: Object.freeze(raw)\n }\n }));\n}","import styled from 'styled-components';\r\n\r\nconst FooterWrapper = styled.footer`\r\n\r\n`;\r\n\r\n\r\nexport default function Footer() {\r\n return <FooterWrapper>\r\n <div className='container'>\r\n\r\n </div>\r\n </FooterWrapper>;\r\n}\r\n","import type { RouteObject } from 'react-router';\r\n\r\nexport interface MenuData {\r\n path: string;\r\n title: string;\r\n icon?: string;\r\n children: MenuData[];\r\n}\r\n\r\nconst formatRelativePath = (\r\n routes: RouteObject[],\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 icon = route.meta?.icon;\r\n\r\n const menu: MenuData = {\r\n title,\r\n icon,\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: RouteObject[], 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 { useEffect, useMemo, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport type { RouteObject } from 'react-router';\r\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\r\nimport type { CSSMotionProps } from 'rc-motion';\r\n\r\ninterface Props {\r\n title: string;\r\n routes: RouteObject[];\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}>\r\n {item.icon && <i className={`bi bi-${item.icon}`} />}\r\n {item.title}\r\n </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 selectedKeys = 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 keys.push(pathname);\r\n return keys;\r\n }, [pathname]);\r\n\r\n const [openKeys, setOpenKeys] = useState<string[]>([]);\r\n\r\n useEffect(() => {\r\n setOpenKeys(selectedKeys.slice(0, -1));\r\n }, [selectedKeys]);\r\n\r\n const onOpenChange = (openKeys: string[]) => {\r\n const currentKey = openKeys[openKeys.length - 1];\r\n setOpenKeys(openKeys.filter(key => currentKey.startsWith(key)));\r\n };\r\n\r\n return <Container>\r\n <Sidebar>\r\n <Header>{title}</Header>\r\n <Menu\r\n mode='inline'\r\n motion={motion}\r\n openKeys={openKeys}\r\n onOpenChange={onOpenChange}\r\n selectedKeys={selectedKeys}\r\n >\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\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: 54px 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: 10px 0;\r\n height: 64px;\r\n line-height: 44px;\r\n text-indent: 24px;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n font-size: 16px;\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 - 54px);\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: 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: dimgray;\r\n\r\n .bi {\r\n font-size: 16px;\r\n line-height: 18px;\r\n margin-right: 9px;\r\n min-width: 19px;\r\n text-align: center;\r\n vertical-align: text-bottom;\r\n }\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 & > a {\r\n color: var(--bs-primary);\r\n }\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 & > a {\r\n color: var(--bs-primary);\r\n }\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","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 { Alert } from 'react-bootstrap';\r\nimport { NoticeContent, NotificationInstance } from 'rc-notification/lib/Notification';\r\nimport Notification from 'rc-notification';\r\n\r\nlet noticeInstance: NotificationInstance | null;\r\n\r\nfunction getNoticeInstance(callback: (instance: NotificationInstance) => void) {\r\n if (noticeInstance) {\r\n return callback(noticeInstance);\r\n }\r\n\r\n Notification.newInstance({\r\n prefixCls: 'notification',\r\n maxCount: 5,\r\n style: {\r\n top: 20,\r\n right: 20\r\n }\r\n }, (instance) => {\r\n if (noticeInstance) {\r\n callback(noticeInstance);\r\n return;\r\n }\r\n noticeInstance = instance;\r\n callback(instance);\r\n });\r\n}\r\n\r\nconst types = ['error', 'success', 'info'];\r\n\r\nconst notice = ({ type, ...options }: { type: string } & NoticeContent) => {\r\n getNoticeInstance((instance) => {\r\n options.duration = 3;\r\n let variant = type;\r\n switch (type) {\r\n case 'error':\r\n variant = 'danger';\r\n options.duration = options.closable ? 0 : 5;\r\n break;\r\n }\r\n\r\n options.content = <Alert variant={variant}>{options.content}</Alert>;\r\n\r\n instance.notice(options);\r\n });\r\n};\r\n\r\n\r\nlet Toast: {\r\n [index in typeof types[number]]: (content: string, options?: NoticeContent) => void\r\n} = {};\r\n\r\ntypes.forEach((type) => {\r\n Toast[type] = (content, options) => {\r\n notice({\r\n ...options,\r\n type,\r\n content\r\n });\r\n };\r\n});\r\n\r\nexport default Toast;\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","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\nimport styled from 'styled-components';\r\n\r\ninterface LoaderProps {\r\n loading?: boolean;\r\n animation?: SpinnerProps['animation'];\r\n wrap?: boolean;\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 wrap,\r\n ...props\r\n}: PropsWithChildren<LoaderProps & Omit<SpinnerProps, 'animation'>>): JSX.Element | null {\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 children = <Dimmer inverted active>\r\n <Spinner animation={animation} variant={variant} {...props} />\r\n {children}\r\n </Dimmer>;\r\n\r\n if (wrap) {\r\n return <Wrap height={typeof wrap === 'number' ? wrap : 150}>\r\n {children}\r\n </Wrap>;\r\n }\r\n\r\n return children as JSX.Element;\r\n}\r\n\r\nconst Wrap = styled.div<{ height: number }>`\r\n position: relative;\r\n height: ${props => `${props.height}px`};\r\n`;\r\n","export default class Unauthorized extends Error {\r\n\r\n url: string;\r\n\r\n constructor(url: string) {\r\n super('Unauthorized');\r\n this.url = url;\r\n }\r\n}\r\n","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import { useAsync } from 'react-async-hook';\r\nimport { Navigate } from 'react-router-dom';\r\nimport Loader from '../components/loader';\r\n\r\ninterface LoginProps {\r\n onLogin: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Login({ onLogin }: LoginProps) {\r\n const { result } = useAsync(async () => {\r\n await onLogin();\r\n\r\n const redirectUri = sessionStorage.getItem('redirect_uri');\r\n if (redirectUri) {\r\n sessionStorage.removeItem('redirect_uri');\r\n }\r\n return redirectUri || '/';\r\n }, []);\r\n\r\n if (result) {\r\n return <Navigate to={result} replace />;\r\n }\r\n\r\n return <Loader />;\r\n}\r\n","import { useAsync } from 'react-async-hook';\r\nimport Loader from '../components/loader';\r\n\r\ninterface LogoutProps {\r\n onLogout: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Logout({ onLogout }: LogoutProps) {\r\n useAsync(async () => {\r\n await onLogout();\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n","import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';\r\nimport queryString from 'query-string';\r\nimport * as rax from 'retry-axios';\r\nimport { RetryConfig } from 'retry-axios';\r\nimport Unauthorized from './errors/unauthorized';\r\nimport Toast from './utils/toast';\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 interface AxiosRequestConfig {\r\n raxConfig?: RetryConfig;\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.maxContentLength = Infinity;\r\naxios.defaults.maxBodyLength = Infinity;\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 = {\r\n ...config.headers,\r\n Authorization: `Bearer ${token}`\r\n };\r\n }\r\n return config;\r\n },\r\n error => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nconst isRecord = (data: any): data is Record<string, string> => {\r\n return data && (typeof data === 'object');\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 e.errors = 'Unauthorized';\r\n if (isRecord(data) && data.url) {\r\n e = new Unauthorized(data.url);\r\n }\r\n Toast.error('Unauthorized');\r\n } else {\r\n if (isRecord(data)) {\r\n if (status === 422) {\r\n e.errors = data;\r\n } else if ('message' in data) {\r\n e.errors = data['message'];\r\n }\r\n } else {\r\n e.errors = data as string;\r\n }\r\n }\r\n }\r\n }\r\n return Promise.reject(e);\r\n }\r\n);\r\n\r\nexport type RequestConfig = AxiosRequestConfig | string\r\nexport type RequestInstance = AxiosInstance\r\nexport const isRequestError = axios.isAxiosError;\r\n\r\nconst request = async function <T = any>(config: RequestConfig) {\r\n config = typeof config === 'string' ? { url: config } : config;\r\n\r\n const { data } = await axios.request<T>({\r\n paramsSerializer: function(params) {\r\n return queryString.stringify(params, {\r\n sort: false,\r\n skipNull: true,\r\n skipEmptyString: true\r\n });\r\n },\r\n ...config\r\n });\r\n\r\n return data;\r\n};\r\n\r\nrequest.defaults = axios.defaults;\r\nrequest.interceptors = axios.interceptors;\r\n\r\nexport default request;\r\n","import Unauthorized from '../errors/unauthorized';\r\nimport { BrowserRouter, Route, Routes } from 'react-router-dom';\r\nimport React, { PropsWithChildren } from 'react';\r\nimport Login from '../pages/login';\r\nimport Logout from '../pages/logout';\r\nimport queryString from 'query-string';\r\nimport request from '../request';\r\nimport { User } from './types';\r\nimport * as path from 'path';\r\n\r\ntype UserResolver = () => User | Promise<User>\r\n\r\nexport const AppContext = React.createContext<{ userResolver?: UserResolver, onUnauthorized?: (error: Unauthorized) => void }>({});\r\n\r\nfunction stripBasename(pathname: string, basename: string) {\r\n if (basename === '/') return pathname;\r\n\r\n return pathname.slice(basename.length);\r\n}\r\n\r\ninterface Options {\r\n baseURL?: string;\r\n basename?: string;\r\n authentication?: 'cookie' | 'token';\r\n onLogout?: () => void | Promise<void>;\r\n onLogin?: () => (void | string) | Promise<void | string>;\r\n userResolver?: UserResolver;\r\n}\r\n\r\nexport default function createApplication(options: Options) {\r\n const { basename = '/', onLogin, onLogout, authentication, baseURL, userResolver } = options;\r\n\r\n if (baseURL) {\r\n request.defaults.baseURL = baseURL;\r\n }\r\n\r\n if (authentication === 'token') {\r\n request.interceptors.request.use(\r\n config => {\r\n const token = sessionStorage.getItem('authorization');\r\n\r\n if (token) {\r\n config.headers = {\r\n ...config.headers,\r\n Authorization: `Bearer ${token}`\r\n };\r\n }\r\n return config;\r\n }\r\n );\r\n }\r\n\r\n const onUnauthorized = (error: Unauthorized) => {\r\n if (window.location.pathname !== path.join(basename, '/logout')) {\r\n sessionStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\r\n }\r\n const redirectUri = window.location.origin + path.join(basename, '/login');\r\n\r\n window.location.href = queryString.stringifyUrl({\r\n url: error.url,\r\n query: { redirect_uri: redirectUri }\r\n });\r\n };\r\n\r\n const handleLogin = async () => {\r\n let token: string | void;\r\n if (onLogin) {\r\n token = await onLogin();\r\n } else {\r\n const parsed = queryString.parse(window.location.hash.substr(1));\r\n if (parsed.access_token) {\r\n token = parsed.access_token as string;\r\n }\r\n }\r\n\r\n if (authentication === 'token' && token) {\r\n sessionStorage.setItem('authorization', token);\r\n }\r\n };\r\n\r\n const handleLogout = async () => {\r\n if (onLogout) {\r\n try {\r\n await onLogout();\r\n } catch (e) {\r\n if (e instanceof Unauthorized) {\r\n onUnauthorized(e);\r\n }\r\n }\r\n }\r\n\r\n if (authentication === 'token') {\r\n sessionStorage.removeItem('authorization');\r\n }\r\n };\r\n\r\n return function({ children }: PropsWithChildren<any>) {\r\n return <AppContext.Provider value={{ userResolver, onUnauthorized }}>\r\n <BrowserRouter basename={basename}>\r\n <Routes>\r\n <Route path='*' element={children} />\r\n <Route path='login' element={<Login onLogin={handleLogin} />} />\r\n <Route path='logout' element={<Logout onLogout={handleLogout} />} />\r\n </Routes>\r\n </BrowserRouter>\r\n </AppContext.Provider>;\r\n };\r\n}\r\n","import React, { PropsWithChildren, useContext, useState } from 'react';\r\nimport Loader from './loader';\r\nimport { User } from '../utils/types';\r\nimport { AppContext } from '../utils/create-application';\r\nimport { useAsync } from 'react-async-hook';\r\nimport Unauthorized from '../errors/unauthorized';\r\n\r\nexport const UserContext = React.createContext<[User, ((user: User) => void)] | null>(null);\r\n\r\nconst UserProvider = function({ children }: PropsWithChildren<any>) {\r\n const [state, setState] = useState<User | null>(null);\r\n\r\n const { userResolver, onUnauthorized } = useContext(AppContext);\r\n\r\n useAsync(async () => {\r\n if (userResolver) {\r\n return userResolver();\r\n }\r\n }, [], {\r\n onError(e) {\r\n if (e instanceof Unauthorized && onUnauthorized) {\r\n onUnauthorized(e);\r\n }\r\n },\r\n onSuccess(user) {\r\n if (user) {\r\n setState(user);\r\n }\r\n }\r\n });\r\n\r\n if (!state) {\r\n return <Loader />;\r\n }\r\n\r\n return <UserContext.Provider value={[state, setState]}>\r\n {children}\r\n </UserContext.Provider>;\r\n};\r\n\r\nexport function useUser() {\r\n const context = useContext(UserContext);\r\n if (!context) {\r\n throw new Error('please use `useUser` in UserContext');\r\n }\r\n\r\n return context;\r\n}\r\n\r\nexport default UserProvider;\r\n","import logoSrc from '../images/logo.svg';\r\nimport { Dropdown } from 'react-bootstrap';\r\nimport styled from 'styled-components';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\nimport { useUser } from './user-provider';\r\nimport classNames from 'classnames';\r\n\r\nconst Avatar = styled.a`\r\n cursor: pointer;\r\n`;\r\n\r\ninterface Props {\r\n menus: ReactNode;\r\n className?: string;\r\n logo?: boolean;\r\n}\r\n\r\nexport default function Header({ children, menus, className, logo = true }: PropsWithChildren<Props>) {\r\n const [user] = useUser();\r\n\r\n return <Container\r\n className={classNames('navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top', className)}>\r\n <div className='container-fluid'>\r\n {logo && <a className='navbar-brand' href='https://www.topthink.com'>\r\n <img src={logoSrc} height='30' />\r\n </a>}\r\n {children}\r\n <Dropdown navbar>\r\n <Dropdown.Toggle as={Avatar} className='nav-link'>\r\n <img className='rounded-circle' width='25' height='25' src={user.avatar} />\r\n </Dropdown.Toggle>\r\n <Dropdown.Menu className={'shadow'}>\r\n {menus}\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.header`\r\n height: 54px;\r\n`;\r\n","import { PropsWithChildren } from 'react';\r\nimport { Card as BsCard, CardProps as BsCardProps } from 'react-bootstrap';\r\nimport classNames from 'classnames';\r\n\r\ninterface CardProps extends BsCardProps {\r\n title?: string;\r\n}\r\n\r\nexport default function Card({ children, title, className, ...props }: PropsWithChildren<CardProps>) {\r\n\r\n return <BsCard className={classNames('border-0 shadow-sm mb-3', className)} {...props}>\r\n <div className='card-body'>\r\n {title && <>\r\n <h5>{title}</h5>\r\n <hr />\r\n </>}\r\n {children}\r\n </div>\r\n </BsCard>;\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 { ReactNode } from 'react';\r\nimport { intersection } from 'lodash';\r\nimport { useUser } from './user-provider';\r\nimport { User } from '../utils/types';\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 if (child) {\r\n return <Item>{child}</Item>;\r\n }\r\n });\r\n\r\n return <Container size={size}>\r\n {items}\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.div<{ size: number }>`\r\n display: inline-flex;\r\n align-items: center;\r\n gap: ${props => props.size}px;\r\n`;\r\n\r\nconst Item = styled.div`\r\n\r\n`;\r\n","var img = \"data:image/svg+xml,%3csvg t='1651217947509' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='2548' width='16px' height='16px' fill='currentColor'%3e %3cpath d='M887.904 298.208c-12.864-12.064-33.152-11.488-45.216 1.408L415.936 753.984l-233.12-229.696C170.208 511.872 149.952 512 137.536 524.608c-12.416 12.576-12.256 32.864 0.352 45.248l256.48 252.672c0.096 0.096 0.224 0.128 0.32 0.224 0.096 0.096 0.128 0.224 0.224 0.32 2.016 1.92 4.448 3.008 6.784 4.288 1.152 0.672 2.144 1.664 3.36 2.144 3.776 1.472 7.776 2.24 11.744 2.24 4.192 0 8.384-0.832 12.288-2.496 1.312-0.544 2.336-1.664 3.552-2.368 2.4-1.408 4.896-2.592 6.944-4.672 0.096-0.096 0.128-0.256 0.224-0.352 0.064-0.096 0.192-0.128 0.288-0.224l449.184-478.208C901.44 330.592 900.768 310.336 887.904 298.208z' p-id='2549'%3e%3c/path%3e%3c/svg%3e\";\n export default img;","import RcSteps from 'rc-steps';\r\nimport 'rc-steps/assets/index.css';\r\nimport styled from 'styled-components';\r\nimport { ComponentProps } from 'react';\r\nimport { ReactComponent as CheckIcon } from '../images/step_check.svg';\r\n\r\nexport default function Steps(props: ComponentProps<typeof RcSteps>) {\r\n return <CustomRcSteps\r\n icons={{\r\n finish: <CheckIcon />,\r\n error: <></>\r\n }}\r\n {...props}\r\n />;\r\n}\r\n\r\nSteps.Step = RcSteps.Step;\r\n\r\nconst CustomRcSteps = styled(RcSteps)`\r\n .rc-steps-item-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n & > .rc-steps-icon {\r\n top: 0;\r\n }\r\n }\r\n\r\n .rc-steps-item-process {\r\n .rc-steps-item-icon {\r\n background: var(--bs-primary);\r\n border-color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-steps-item-finish {\r\n .rc-steps-item-icon {\r\n border-color: var(--bs-primary);\r\n\r\n & > .rc-steps-icon {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-steps-item-title:after {\r\n background-color: var(--bs-primary);\r\n }\r\n }\r\n\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 { useMemo } from 'react';\r\n\r\ninterface Props {\r\n value: number;\r\n currency?: boolean;\r\n locale?: string;\r\n className?: string;\r\n}\r\n\r\nexport default function NumberFormat({ className, 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 if (className) {\r\n return <span className={className}>{formatter.format(value)}</span>;\r\n }\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, { RequestConfig } from '../request';\r\nimport { createElement, ElementType, MouseEvent, useCallback, useState } from 'react';\r\nimport Message from '../utils/message';\r\nimport axios, { AxiosRequestConfig } from 'axios';\r\n\r\ninterface Props extends Omit<ButtonProps, 'as'> {\r\n url: RequestConfig;\r\n method?: AxiosRequestConfig['method'];\r\n confirm?: string;\r\n onSuccess?: (result: any) => void;\r\n as?: ElementType | ButtonProps['as'];\r\n}\r\n\r\nexport default function RequestButton({\r\n url,\r\n method,\r\n confirm,\r\n onSuccess,\r\n children,\r\n disabled,\r\n as = Button,\r\n ...props\r\n}: Props) {\r\n\r\n const [fetching, setFetching] = useState(false);\r\n\r\n const handleClick = useCallback(async (e: MouseEvent) => {\r\n e.preventDefault();\r\n try {\r\n setFetching(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 setFetching(false);\r\n }\r\n }, [url, method, setFetching]);\r\n\r\n return createElement(as, {\r\n ...props,\r\n disabled: disabled || fetching,\r\n onClick: handleClick\r\n }, children);\r\n}\r\n","import { Button, ButtonProps } from 'react-bootstrap';\r\nimport { LinkProps, useNavigate } from 'react-router-dom';\r\n\r\ninterface Props extends ButtonProps, Pick<LinkProps, 'to' | 'replace'> {\r\n\r\n}\r\n\r\nexport default function LinkButton({ to, replace, ...props }: Props) {\r\n let navigate = useNavigate();\r\n\r\n return <Button {...props} onClick={(e) => {\r\n e.preventDefault();\r\n navigate(to, { replace });\r\n }} />;\r\n}\r\n","import JsonForm, { JsonFormProps, JsonFormType, getRegistry } from '@topthink/json-form';\r\nimport * as React from 'react';\r\nimport {\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithoutRef,\r\n ReactNode,\r\n RefAttributes,\r\n useCallback,\r\n useState\r\n} 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, WidgetProps } 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 children?: ReactNode | ((props: { submit: ReactNode, loading: boolean }) => ReactNode);\r\n submitText?: string;\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\nconst widgets = {\r\n upload: function(props: WidgetProps) {\r\n const { widgets } = getRegistry();\r\n\r\n const options = {\r\n ...props.options,\r\n async onUpload(file: File) {\r\n if (props.options.onUpload instanceof Function) {\r\n return await props.options.onUpload.call(file);\r\n }\r\n if (props.options.endpoint) {\r\n const data = new FormData();\r\n\r\n data.set('file', file);\r\n\r\n const { url } = await request({\r\n url: props.options.endpoint as string,\r\n method: 'post',\r\n data\r\n });\r\n\r\n return url;\r\n }\r\n }\r\n };\r\n\r\n return <widgets.upload {...props} options={options} />;\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 onChange,\r\n submitText = '提交',\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 //todo 包含File对象需转FormData\r\n try {\r\n const result = 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(result);\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((e: ISubmitEvent<any>) => {\r\n const { formData } = e;\r\n setData(formData);\r\n if (onChange) {\r\n onChange(e);\r\n }\r\n }, [setData, onChange]);\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 const submit = <LoadingButton loading={loading} type='submit' variant='primary'>{submitText}</LoadingButton>;\r\n\r\n if (typeof children === 'function') {\r\n children = children({ submit, loading });\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 widgets={widgets}\r\n >\r\n {children || <div className='col-12'>\r\n {submit}\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\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\r\n\r\n return <Container>\r\n <Header>\r\n <div className='container'>\r\n <Title>\r\n {title}\r\n </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\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","import { Columns, TableProps, TableRowSelection } from './index';\r\nimport { InputHTMLAttributes, Key, useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nconst Checkbox = function({\r\n indeterminate = false,\r\n ...props\r\n}: InputHTMLAttributes<HTMLInputElement> & { indeterminate?: boolean }) {\r\n\r\n const ref = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n if (ref.current) {\r\n ref.current.indeterminate = indeterminate;\r\n }\r\n }, [indeterminate]);\r\n\r\n return <input\r\n ref={ref}\r\n {...props}\r\n className='form-check-input'\r\n type='checkbox'\r\n />;\r\n};\r\n\r\nexport default function useSelection<T = any>(\r\n rowSelection: TableRowSelection<T> | undefined,\r\n rowKey: Required<TableProps<T>>['rowKey'],\r\n data: T[]\r\n) {\r\n const [keys, setKeys] = useState(() => new Set(rowSelection?.selectedRowKeys || []));\r\n\r\n const getRowKey = (record: T) => {\r\n if (typeof rowKey === 'string') {\r\n // @ts-ignore\r\n return record[rowKey];\r\n } else {\r\n return rowKey(record);\r\n }\r\n };\r\n\r\n const getRecordByKey = (key: Key) => {\r\n return data.find((record) => {\r\n return getRowKey(record) === key;\r\n })!;\r\n };\r\n\r\n const setSelectedKeys = useCallback((keys: Set<Key>) => {\r\n setKeys(keys);\r\n const changedKeys = Array.from(keys);\r\n\r\n const records = changedKeys.map(function(key) {\r\n return getRecordByKey(key);\r\n });\r\n\r\n if (rowSelection?.onChange) {\r\n rowSelection?.onChange(changedKeys, records);\r\n }\r\n }, [getRecordByKey]);\r\n\r\n const transformColumns = useCallback((columns: Columns): Columns => {\r\n if (!rowSelection) {\r\n return columns;\r\n }\r\n\r\n const recordKeys = data.map(getRowKey);\r\n\r\n const checkedCurrentAll = recordKeys.every(function(key) {\r\n return keys.has(key);\r\n });\r\n const checkedCurrentSome = recordKeys.some(function(key) {\r\n return keys.has(key);\r\n });\r\n\r\n return [{\r\n key: 'selection',\r\n title: <Checkbox\r\n checked={checkedCurrentAll}\r\n indeterminate={!checkedCurrentAll && checkedCurrentSome}\r\n onChange={() => {\r\n if (checkedCurrentAll) {\r\n recordKeys.forEach(function(key) {\r\n keys.delete(key);\r\n });\r\n } else {\r\n recordKeys.forEach(function(key) {\r\n keys.add(key);\r\n });\r\n }\r\n setSelectedKeys(new Set(keys));\r\n }}\r\n />,\r\n width: 30,\r\n align: 'center',\r\n render({ record }) {\r\n const key = getRowKey(record);\r\n const checked = keys.has(key);\r\n return <Checkbox\r\n checked={checked}\r\n onChange={() => {\r\n if (checked) {\r\n keys.delete(key);\r\n } else {\r\n keys.add(key);\r\n }\r\n setSelectedKeys(new Set(keys));\r\n }}\r\n />;\r\n }\r\n }, ...columns];\r\n }, [data, rowSelection, keys]);\r\n\r\n return [transformColumns];\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 { Form, Table as BsTable, TableProps as BsTableProps } from 'react-bootstrap';\r\nimport {\r\n ChangeEvent,\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n Key,\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\nimport useDebounce from '../../hooks/use-debounce';\r\nimport useSelection from './use-selection';\r\nimport { PaginationType } from '../../utils/types';\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 = styled(BsTable)`\r\n .rc-table-thead {\r\n border-top: none;\r\n }\r\n`;\r\n\r\nconst components: RcTableProps['components'] = {\r\n table: (props: BsTableProps) => {\r\n return <CustomTable {...props} className='align-middle table-hover' />;\r\n },\r\n};\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 TableRowSelection<RecordType = any> {\r\n selectedRowKeys?: Key[];\r\n onChange?: (selectedRowKeys: Key[], selectedRows: RecordType[]) => void;\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) | false;\r\n search?: boolean | string;\r\n rowSelection?: TableRowSelection<RecordType>;\r\n card?: boolean;\r\n}\r\n\r\ntype Params = {\r\n page?: number;\r\n sortField?: string;\r\n sortOrder?: number;\r\n q?: string;\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 {\r\n source,\r\n rowKey = 'id',\r\n paginate = true,\r\n toolBarRender,\r\n columns = [],\r\n search,\r\n rowSelection,\r\n card = true,\r\n ...props\r\n },\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 const [keyword, setKeyword] = useState('');\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: Params = {\r\n q: keyword\r\n };\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, keyword]);\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, [keyword]);\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 //多选\r\n const [transformColumns] = useSelection(rowSelection, rowKey, data);\r\n\r\n const customColumns = useMemo(() => {\r\n return transformColumns(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, transformColumns, action]);\r\n\r\n const handlePageChange = (current: number) => {\r\n fetchData({\r\n page: current\r\n });\r\n };\r\n\r\n const handleSearch = useDebounce((e: ChangeEvent<HTMLInputElement>) => {\r\n setKeyword(e.target.value);\r\n }, 500);\r\n\r\n const children = <>\r\n <Loader loading={loading} />\r\n {toolBarRender !== false && <Header>\r\n <LeftTools size={12}>\r\n {toolBarRender && toolBarRender(action.current)}\r\n </LeftTools>\r\n <RightTools size={12}>\r\n {search &&\r\n <Form.Control onChange={handleSearch} type={'search'} placeholder={'Search...'} />}\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 </>;\r\n\r\n if (card) {\r\n return <Card>\r\n {children}\r\n </Card>;\r\n }\r\n return children;\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 height: 48px;\r\n border-bottom: 2px solid #212529;\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 { debounce, DebouncedFunc } from 'lodash';\r\nimport { useEffect, useRef } from 'react';\r\n\r\nexport default function useDebounce<T extends (...args: any) => any>(callback: T, wait: number, options?: {}): DebouncedFunc<T> {\r\n const callbackRef = useRef<T>(callback);\r\n const debouncedCallbackRef = useRef<DebouncedFunc<T>>(\r\n debounce(callback, wait, options)\r\n );\r\n\r\n useEffect(() => {\r\n callbackRef.current = callback;\r\n });\r\n\r\n useEffect(() => {\r\n debouncedCallbackRef.current = debounce((...args: any) => {\r\n callbackRef.current(...args);\r\n }, wait, options);\r\n }, [wait, options]);\r\n\r\n return debouncedCallbackRef.current;\r\n}\r\n","import {\r\n createElement,\r\n ElementType,\r\n forwardRef,\r\n ForwardRefExoticComponent,\r\n PropsWithChildren,\r\n PropsWithoutRef,\r\n ReactNode,\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: ReactNode;\r\n variant?: ButtonProps['variant'];\r\n header?: string;\r\n onOk?: () => any;\r\n okText?: ReactNode;\r\n footer?: boolean;\r\n as?: ElementType | ButtonProps['as'];\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,\r\n header = text,\r\n footer = true,\r\n onOk,\r\n size,\r\n okText = '确定',\r\n onShow,\r\n children,\r\n as = Button\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 const button = createElement(as, {\r\n variant,\r\n onClick: handleShow\r\n }, text);\r\n\r\n return <>\r\n {button}\r\n <Modal size={size} show={show} onHide={handleClose} onShow={onShow}>\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 {okText}\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 } 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' | 'as'> &\r\n Pick<FormProps<T>, 'schema' | 'formData' | 'uiSchema' | 'action' | 'method' | 'onSuccess' | 'onChange' | 'fields' | 'formContext'>\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 onChange,\r\n fields,\r\n size,\r\n as\r\n}: ModalFormProps<T>) {\r\n\r\n const form = useRef<FormType>(null);\r\n\r\n const handleOk = useCallback(async () => {\r\n try {\r\n await form.current?.submit();\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }, []);\r\n\r\n return <ModalButton as={as} 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 fields={fields}\r\n onChange={onChange}\r\n onSuccess={onSuccess}\r\n >\r\n {/*TODO 支持回车提交并同步按钮loading状态*/}\r\n <Fragment />\r\n </Form>\r\n </ModalButton>;\r\n}\r\n","import { useAsyncCallback, UseAsyncCallbackOptions } from 'react-async-hook';\r\nimport request, { isRequestError, RequestConfig } from '../request';\r\nimport { DependencyList, useCallback, useEffect } from 'react';\r\nimport { AxiosRequestConfig } from 'axios';\r\nimport { values } from 'lodash';\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: RequestConfig, {\r\n manual,\r\n refreshDeps,\r\n ...options\r\n}: UseRequestOptions<T> = {}) {\r\n let { 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 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 if (error && isRequestError(error)) {\r\n const errors = error.errors;\r\n error = new Error(typeof errors === 'string' ? errors : values(errors).join(''));\r\n }\r\n\r\n return {\r\n refresh,\r\n execute,\r\n error,\r\n ...others\r\n };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\ninterface Options {\r\n onHide?: () => void;\r\n onShow?: () => void;\r\n}\r\n\r\nlet id = 0;\r\n\r\nexport default function useOverlayState({ onHide, onShow }: Options = {}) {\r\n const [visible, setVisible] = useState(false);\r\n\r\n const [key, setKey] = useState(`visible-${id}`);\r\n\r\n const hide = useCallback(() => {\r\n setVisible(false);\r\n if (onHide) {\r\n onHide();\r\n }\r\n }, [setVisible, onHide]);\r\n\r\n const exit = useCallback(() => {\r\n setKey(`visible-${++id}`);\r\n }, [setKey, id]);\r\n\r\n const show = useCallback(() => {\r\n setVisible(true);\r\n if (onShow) {\r\n onShow();\r\n }\r\n }, [setVisible, onShow]);\r\n\r\n const state = {\r\n show: visible,\r\n onHide: hide,\r\n onExited: exit,\r\n key\r\n };\r\n\r\n return {\r\n visible,\r\n show,\r\n hide,\r\n state\r\n };\r\n}\r\n","import { OverlayTrigger, OverlayTriggerProps, Tooltip as BsTooltip } from 'react-bootstrap';\r\nimport { uniqueId } from 'lodash';\r\n\r\ninterface TooltipProps {\r\n tooltip: string;\r\n children: OverlayTriggerProps['children'];\r\n placement?: OverlayTriggerProps['placement'];\r\n}\r\n\r\nexport default function Tooltip({ tooltip, children, placement = 'bottom' }: TooltipProps) {\r\n\r\n return <OverlayTrigger\r\n placement={placement}\r\n overlay={\r\n <BsTooltip id={uniqueId()}>\r\n {tooltip}\r\n </BsTooltip>\r\n }\r\n >\r\n {children}\r\n </OverlayTrigger>;\r\n}\r\n"],"names":["_taggedTemplateLiteral","strings","raw","slice","Object","freeze","defineProperties","value","FooterWrapper","styled","footer","Footer","_jsx","className","formatRelativePath","routes","parent","menus","route","meta","_route$meta","hideInMenu","title","_route$meta2","path","replace","menu","icon","_route$meta3","children","_route$meta4","hideChildrenInMenu","length","push","renderMenuItems","items","map","item","SubMenu","MenuItem","_jsxs","Link","to","collapseNode","height","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","basename","useRoutes","useMemo","getMenuData","pathname","useLocation","selectedKeys","keys","split","reduce","pre","curr","join","openKeys","setOpenKeys","useState","useEffect","Container","Sidebar","Header","Menu","mode","onOpenChange","currentKey","filter","key","startsWith","Content","Main","div","nav","main","RcMenu","CustomSwal","withReactContent","Swal","defaultOptions","confirmButtonText","cancelButtonText","Message","confirm","async","isConfirmed","fire","showCancelButton","options","error","toast","position","timer","showConfirmButton","noticeInstance","notice","_ref","type","callback","Notification","newInstance","prefixCls","maxCount","style","top","right","instance","getNoticeInstance","duration","variant","closable","content","Alert","Toast","forEach","Icon","Title","Extra","IconMap","success","info","warning","Result","status","extra","Dimmer","props","active","inverted","Loader","loading","animation","wrap","Spinner","Wrap","Unauthorized","Error","constructor","url","obj","defineProperty","enumerable","configurable","writable","Login","onLogin","result","useAsync","redirectUri","sessionStorage","getItem","removeItem","Navigate","Logout","onLogout","rax","attach","axios","defaults","raxConfig","retryDelay","backoffType","shouldRetry","err","config","method","toUpperCase","response","maxContentLength","Infinity","maxBodyLength","baseURL","interceptors","request","use","token","headers","Authorization","Promise","reject","isRecord","data","location","window","href","undefined","e","isAxiosError","errors","isRequestError","paramsSerializer","params","queryString","stringify","sort","skipNull","skipEmptyString","AppContext","React","createContext","createApplication","authentication","userResolver","onUnauthorized","setItem","stripBasename","search","origin","stringifyUrl","query","redirect_uri","handleLogin","parsed","parse","hash","substr","access_token","handleLogout","Provider","BrowserRouter","Routes","Route","element","UserContext","UserProvider","state","setState","useContext","onError","onSuccess","user","useUser","context","Avatar","a","logo","classNames","src","Dropdown","navbar","Toggle","as","width","avatar","header","Card","BsCard","entries","_ref2","name","Access","require","fallback","passed","intersection","roles","Space","size","small","middle","large","Children","child","Item","_path","_extends","assign","target","i","arguments","source","prototype","hasOwnProperty","call","apply","this","SvgStepCheck","createElement","viewBox","xmlns","fill","d","Steps","CustomRcSteps","icons","finish","CheckIcon","Step","RcSteps","noop","isInteger","isFinite","Math","floor","Pagination","total","onChange","defaultCurrent","defaultPageSize","current","setCurrent","pageSize","setPageSize","allPages","handleChange","useCallback","p","prevPage","nextPage","pagerList","jumpPrev","jumpNext","firstPager","lastPager","BsPagination","onClick","Last","First","Prev","Next","left","max","min","pageBufferSize","unshift","NumberFormat","locale","currency","formatter","minimumFractionDigits","Intl","format","LoadingButton","Button","disabled","RequestButton","fetching","setFetching","handleClick","preventDefault","text","values","LinkButton","navigate","useNavigate","localize","widgets","upload","getRegistry","file","onUpload","Function","endpoint","FormData","set","Form","forwardRef","ref","action","formData","onSubmit","submitText","extraErrors","setExtraErrors","setLoading","setData","handleSubmit","nativeEvent","__errors","mapValues","toExtraErrors","transformErrors","keyword","dataPath","property","submit","JsonForm","noHtml5Validate","noValidate","Body","Checkbox","indeterminate","useRef","CustomTable","BsTable","components","table","CustomPagination","isPagination","Table","rowKey","paginate","toolBarRender","columns","rowSelection","card","pagination","setPagination","setKeyword","fetchData","q","page","current_page","per_page","reload","useImperativeHandle","transformColumns","setKeys","Set","selectedRowKeys","getRowKey","record","getRecordByKey","find","setSelectedKeys","changedKeys","Array","from","records","recordKeys","checkedCurrentAll","every","has","checkedCurrentSome","some","checked","delete","add","align","render","useSelection","customColumns","column","customColumn","defaultRender","index","handleSearch","wait","callbackRef","debouncedCallbackRef","debounce","useDebounce","LeftTools","RightTools","Control","placeholder","Action","RcTable","span","ModalButton","onOk","okText","onShow","show","setShow","handleClose","close","button","Modal","onHide","closeButton","ModalForm","schema","uiSchema","fields","form","handleOk","_form$current","Fragment","useRequest","manual","refreshDeps","execute","currentParams","others","useAsyncCallback","refresh","id","useOverlayState","visible","setVisible","setKey","hide","exit","onExited","Tooltip","tooltip","placement","OverlayTrigger","overlay","BsTooltip","uniqueId"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topthink/common",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "scripts": {
5
5
  "build": "rollup -c --environment NODE_ENV:production",
6
6
  "build:dev": "rollup -c",
@@ -16,7 +16,7 @@
16
16
  ],
17
17
  "dependencies": {
18
18
  "@topthink/bootstrap": "^1.0.11",
19
- "@topthink/json-form": "^1.0.14",
19
+ "@topthink/json-form": "^1.0.15",
20
20
  "ajv-i18n": "^4.0.0",
21
21
  "axios": "^0.27.2",
22
22
  "classnames": "^2.3.1",
@@ -63,5 +63,5 @@
63
63
  },
64
64
  "author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
65
65
  "license": "MIT",
66
- "gitHead": "cf73373a5dbcdde9ba265fc9f4179f9ba12ccbb8"
66
+ "gitHead": "4886dabfc685c6f09669984b0182bb006e5830e6"
67
67
  }
@@ -5,6 +5,7 @@ export interface ModalButtonProps extends ModalProps {
5
5
  variant?: ButtonProps['variant'];
6
6
  header?: string;
7
7
  onOk?: () => any;
8
+ okText?: ReactNode;
8
9
  footer?: boolean;
9
10
  as?: ElementType | ButtonProps['as'];
10
11
  }
package/types/index.d.ts CHANGED
@@ -10,6 +10,7 @@ declare module 'react-router' {
10
10
  }
11
11
  export { default as SiderLayout } from './layout/sider';
12
12
  export { default as Message } from './utils/message';
13
+ export { default as Toast } from './utils/toast';
13
14
  export { default as Result } from './components/result';
14
15
  export { default as Header } from './components/header';
15
16
  export { default as Footer } from './components/footer';
@@ -19,6 +20,7 @@ export { default as Error } from './components/error';
19
20
  export { default as Access } from './components/access';
20
21
  export { default as Space } from './components/space';
21
22
  export { default as Steps } from './components/steps';
23
+ export { default as Pagination } from './components/pagination';
22
24
  export { default as NumberFormat } from './components/number-format';
23
25
  export { default as LoadingButton } from './components/loading-button';
24
26
  export { default as RequestButton } from './components/request-button';