"use strict";(self.webpackChunkant_design_pro=self.webpackChunkant_design_pro||[]).push([[6388],{50727:function(Ee,oe,r){var _=r(4942),ie=r(97685),A=r(45987),Q=r(55850),Y=r(15861),f=r(1413),se=r(24969),ce=r(97462),k=r(952),q=r(10915),ee=r(48171),de=r(53914),ne=r(22270),w=r(60249),ue=r(83622),F=r(99859),p=r(21770),V=r(88306),te=r(8880),E=r(67294),ve=r(65385),C=r(85893),fe=["onTableChange","maxLength","formItemProps","recordCreatorProps","rowKey","controlled","defaultValue","onChange","editableFormRef"],ge=["record","position","creatorButtonText","newRecordType","parentKey","style"],re=E.createContext(void 0);function K(n){var D=n.children,j=n.record,e=n.position,o=n.newRecordType,c=n.parentKey,t=(0,E.useContext)(re);return E.cloneElement(D,(0,f.Z)((0,f.Z)({},D.props),{},{onClick:function(){var a=(0,Y.Z)((0,Q.Z)().mark(function h(S){var P,$,y,T;return(0,Q.Z)().wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return m.next=2,(P=($=D.props).onClick)===null||P===void 0?void 0:P.call($,S);case 2:if(T=m.sent,T!==!1){m.next=5;break}return m.abrupt("return");case 5:t==null||(y=t.current)===null||y===void 0||y.addEditRecord(j,{position:e,newRecordType:o,parentKey:c});case 6:case"end":return m.stop()}},h)}));function b(h){return a.apply(this,arguments)}return b}()}))}function le(n){var D,j,e=(0,q.YB)(),o=n.onTableChange,c=n.maxLength,t=n.formItemProps,a=n.recordCreatorProps,b=n.rowKey,h=n.controlled,S=n.defaultValue,P=n.onChange,$=n.editableFormRef,y=(0,A.Z)(n,fe),T=(0,E.useRef)(void 0),R=(0,E.useRef)(),m=(0,E.useRef)();(0,E.useImperativeHandle)(y.actionRef,function(){return R.current},[R.current]);var z=(0,p.Z)(function(){return n.value||S||[]},{value:n.value,onChange:n.onChange}),M=(0,ie.Z)(z,2),u=M[0],W=M[1],Z=E.useMemo(function(){return typeof b=="function"?b:function(i,v){return i[b]||v}},[b]),U=(0,ee.J)(function(i){if(typeof i=="number"&&!n.name){if(i>=u.length)return i;var v=u&&u[i];return Z==null?void 0:Z(v,i)}if((typeof i=="string"||i>=u.length)&&n.name){var s=u.findIndex(function(l,d){var g;return(Z==null||(g=Z(l,d))===null||g===void 0?void 0:g.toString())===(i==null?void 0:i.toString())});if(s!==-1)return s}return i});(0,E.useImperativeHandle)($,function(){var i=function(l){var d,g;if(l==null)throw new Error("rowIndex is required");var O=U(l),B=[n.name,(d=O==null?void 0:O.toString())!==null&&d!==void 0?d:""].flat(1).filter(Boolean);return(g=m.current)===null||g===void 0?void 0:g.getFieldValue(B)},v=function(){var l,d=[n.name].flat(1).filter(Boolean);if(Array.isArray(d)&&d.length===0){var g,O=(g=m.current)===null||g===void 0?void 0:g.getFieldsValue();return Array.isArray(O)?O:Object.keys(O).map(function(B){return O[B]})}return(l=m.current)===null||l===void 0?void 0:l.getFieldValue(d)};return(0,f.Z)((0,f.Z)({},m.current),{},{getRowData:i,getRowsData:v,setRowData:function(l,d){var g,O;if(l==null)throw new Error("rowIndex is required");var B=U(l),G=[n.name,(g=B==null?void 0:B.toString())!==null&&g!==void 0?g:""].flat(1).filter(Boolean),Oe=Object.assign({},(0,f.Z)((0,f.Z)({},i(l)),d||{})),Pe=(0,te.Z)({},G,Oe);return(O=m.current)===null||O===void 0||O.setFieldsValue(Pe),!0}})},[U,n.name,m.current]),(0,E.useEffect)(function(){n.controlled&&(u||[]).forEach(function(i,v){var s;(s=m.current)===null||s===void 0||s.setFieldsValue((0,_.Z)({},"".concat(Z(i,v)),i))},{})},[(0,de.ZP)(u),n.controlled]),(0,E.useEffect)(function(){if(n.name){var i;m.current=n==null||(i=n.editable)===null||i===void 0?void 0:i.form}},[(D=n.editable)===null||D===void 0?void 0:D.form,n.name]);var I=a||{},H=I.record,J=I.position,x=I.creatorButtonText,me=I.newRecordType,Ce=I.parentKey,he=I.style,be=(0,A.Z)(I,ge),X=J==="top",L=(0,E.useMemo)(function(){return typeof c=="number"&&c<=(u==null?void 0:u.length)?!1:a!==!1&&(0,C.jsx)(K,{record:(0,ne.h)(H,u==null?void 0:u.length,u)||{},position:J,parentKey:(0,ne.h)(Ce,u==null?void 0:u.length,u),newRecordType:me,children:(0,C.jsx)(ue.ZP,(0,f.Z)((0,f.Z)({type:"dashed",style:(0,f.Z)({display:"block",margin:"10px 0",width:"100%"},he),icon:(0,C.jsx)(se.Z,{})},be),{},{children:x||e.getMessage("editableTable.action.add","\u6DFB\u52A0\u4E00\u884C\u6570\u636E")}))})},[a,c,u==null?void 0:u.length]),_e=(0,E.useMemo)(function(){return L?X?{components:{header:{wrapper:function(v){var s,l=v.className,d=v.children;return(0,C.jsxs)("thead",{className:l,children:[d,(0,C.jsxs)("tr",{style:{position:"relative"},children:[(0,C.jsx)("td",{colSpan:0,style:{visibility:"hidden"},children:L}),(0,C.jsx)("td",{style:{position:"absolute",left:0,width:"100%"},colSpan:(s=y.columns)===null||s===void 0?void 0:s.length,children:L})]})]})}}}}:{tableViewRender:function(v,s){var l,d;return(0,C.jsxs)(C.Fragment,{children:[(l=(d=n.tableViewRender)===null||d===void 0?void 0:d.call(n,v,s))!==null&&l!==void 0?l:s,L]})}}:{}},[X,L]),N=(0,f.Z)({},n.editable),ye=(0,ee.J)(function(i,v){var s,l,d;if((s=n.editable)===null||s===void 0||(l=s.onValuesChange)===null||l===void 0||l.call(s,i,v),(d=n.onValuesChange)===null||d===void 0||d.call(n,v,i),n.controlled){var g;n==null||(g=n.onChange)===null||g===void 0||g.call(n,v)}});return(n!=null&&n.onValuesChange||(j=n.editable)!==null&&j!==void 0&&j.onValuesChange||n.controlled&&n!==null&&n!==void 0&&n.onChange)&&(N.onValuesChange=ye),(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(re.Provider,{value:R,children:(0,C.jsx)(ve.Z,(0,f.Z)((0,f.Z)((0,f.Z)({search:!1,options:!1,pagination:!1,rowKey:b,revalidateOnFocus:!1},y),_e),{},{tableLayout:"fixed",actionRef:R,onChange:o,editable:(0,f.Z)((0,f.Z)({},N),{},{formProps:(0,f.Z)({formRef:m},N.formProps)}),dataSource:u,onDataSourceChange:function(v){if(W(v),n.name&&J==="top"){var s,l=(0,te.Z)({},[n.name].flat(1).filter(Boolean),v);(s=m.current)===null||s===void 0||s.setFieldsValue(l)}}}))}),n.name?(0,C.jsx)(ce.Z,{name:[n.name],children:function(v){var s,l;if(!T.current)return T.current=u,null;var d=(0,V.Z)(v,[n.name].flat(1)),g=d==null?void 0:d.find(function(O,B){var G;return!(0,w.A)(O,(G=T.current)===null||G===void 0?void 0:G[B])});return T.current=u,g&&(n==null||(s=n.editable)===null||s===void 0||(l=s.onValuesChange)===null||l===void 0||l.call(s,g,d)),null}}):null]})}function ae(n){var D=k.ZP.useFormInstance();return n.name?(0,C.jsx)(F.Z.Item,(0,f.Z)((0,f.Z)({style:{maxWidth:"100%"},shouldUpdate:function(e,o){var c=[n.name].flat(1);try{return JSON.stringify((0,V.Z)(e,c))!==JSON.stringify((0,V.Z)(o,c))}catch(t){return!0}}},n==null?void 0:n.formItemProps),{},{name:n.name,children:(0,C.jsx)(le,(0,f.Z)((0,f.Z)({tableLayout:"fixed",scroll:{x:"max-content"}},n),{},{editable:(0,f.Z)((0,f.Z)({},n.editable),{},{form:D})}))})):(0,C.jsx)(le,(0,f.Z)({tableLayout:"fixed",scroll:{x:"max-content"}},n))}ae.RecordCreator=K,oe.Z=ae},66309:function(Ee,oe,r){r.d(oe,{Z:function(){return j}});var _=r(67294),ie=r(93967),A=r.n(ie),Q=r(98423),Y=r(98787),f=r(69760),se=r(96159),ce=r(45353),k=r(53124),q=r(11568),ee=r(15063),de=r(14747),ne=r(83262),w=r(83559);const ue=e=>{const{paddingXXS:o,lineWidth:c,tagPaddingHorizontal:t,componentCls:a,calc:b}=e,h=b(t).sub(c).equal(),S=b(o).sub(c).equal();return{[a]:Object.assign(Object.assign({},(0,de.Wf)(e)),{display:"inline-block",height:"auto",marginInlineEnd:e.marginXS,paddingInline:h,fontSize:e.tagFontSize,lineHeight:e.tagLineHeight,whiteSpace:"nowrap",background:e.defaultBg,border:`${(0,q.bf)(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadiusSM,opacity:1,transition:`all ${e.motionDurationMid}`,textAlign:"start",position:"relative",[`&${a}-rtl`]:{direction:"rtl"},"&, a, a:hover":{color:e.defaultColor},[`${a}-close-icon`]:{marginInlineStart:S,fontSize:e.tagIconSize,color:e.colorTextDescription,cursor:"pointer",transition:`all ${e.motionDurationMid}`,"&:hover":{color:e.colorTextHeading}},[`&${a}-has-color`]:{borderColor:"transparent",[`&, a, a:hover, ${e.iconCls}-close, ${e.iconCls}-close:hover`]:{color:e.colorTextLightSolid}},"&-checkable":{backgroundColor:"transparent",borderColor:"transparent",cursor:"pointer",[`&:not(${a}-checkable-checked):hover`]:{color:e.colorPrimary,backgroundColor:e.colorFillSecondary},"&:active, &-checked":{color:e.colorTextLightSolid},"&-checked":{backgroundColor:e.colorPrimary,"&:hover":{backgroundColor:e.colorPrimaryHover}},"&:active":{backgroundColor:e.colorPrimaryActive}},"&-hidden":{display:"none"},[`> ${e.iconCls} + span, > span + ${e.iconCls}`]:{marginInlineStart:h}}),[`${a}-borderless`]:{borderColor:"transparent",background:e.tagBorderlessBg}}},F=e=>{const{lineWidth:o,fontSizeIcon:c,calc:t}=e,a=e.fontSizeSM;return(0,ne.IX)(e,{tagFontSize:a,tagLineHeight:(0,q.bf)(t(e.lineHeightSM).mul(a).equal()),tagIconSize:t(c).sub(t(o).mul(2)).equal(),tagPaddingHorizontal:8,tagBorderlessBg:e.defaultBg})},p=e=>({defaultBg:new ee.t(e.colorFillQuaternary).onBackground(e.colorBgContainer).toHexString(),defaultColor:e.colorText});var V=(0,w.I$)("Tag",e=>{const o=F(e);return ue(o)},p),te=function(e,o){var c={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&o.indexOf(t)<0&&(c[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,t=Object.getOwnPropertySymbols(e);a<t.length;a++)o.indexOf(t[a])<0&&Object.prototype.propertyIsEnumerable.call(e,t[a])&&(c[t[a]]=e[t[a]]);return c},ve=_.forwardRef((e,o)=>{const{prefixCls:c,style:t,className:a,checked:b,onChange:h,onClick:S}=e,P=te(e,["prefixCls","style","className","checked","onChange","onClick"]),{getPrefixCls:$,tag:y}=_.useContext(k.E_),T=W=>{h==null||h(!b),S==null||S(W)},R=$("tag",c),[m,z,M]=V(R),u=A()(R,`${R}-checkable`,{[`${R}-checkable-checked`]:b},y==null?void 0:y.className,a,z,M);return m(_.createElement("span",Object.assign({},P,{ref:o,style:Object.assign(Object.assign({},t),y==null?void 0:y.style),className:u,onClick:T})))}),C=r(98719);const fe=e=>(0,C.Z)(e,(o,c)=>{let{textColor:t,lightBorderColor:a,lightColor:b,darkColor:h}=c;return{[`${e.componentCls}${e.componentCls}-${o}`]:{color:t,background:b,borderColor:a,"&-inverse":{color:e.colorTextLightSolid,background:h,borderColor:h},[`&${e.componentCls}-borderless`]:{borderColor:"transparent"}}}});var ge=(0,w.bk)(["Tag","preset"],e=>{const o=F(e);return fe(o)},p);function re(e){return typeof e!="string"?e:e.charAt(0).toUpperCase()+e.slice(1)}const K=(e,o,c)=>{const t=re(c);return{[`${e.componentCls}${e.componentCls}-${o}`]:{color:e[`color${c}`],background:e[`color${t}Bg`],borderColor:e[`color${t}Border`],[`&${e.componentCls}-borderless`]:{borderColor:"transparent"}}}};var le=(0,w.bk)(["Tag","status"],e=>{const o=F(e);return[K(o,"success","Success"),K(o,"processing","Info"),K(o,"error","Error"),K(o,"warning","Warning")]},p),ae=function(e,o){var c={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&o.indexOf(t)<0&&(c[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,t=Object.getOwnPropertySymbols(e);a<t.length;a++)o.indexOf(t[a])<0&&Object.prototype.propertyIsEnumerable.call(e,t[a])&&(c[t[a]]=e[t[a]]);return c};const D=_.forwardRef((e,o)=>{const{prefixCls:c,className:t,rootClassName:a,style:b,children:h,icon:S,color:P,onClose:$,bordered:y=!0,visible:T}=e,R=ae(e,["prefixCls","className","rootClassName","style","children","icon","color","onClose","bordered","visible"]),{getPrefixCls:m,direction:z,tag:M}=_.useContext(k.E_),[u,W]=_.useState(!0),Z=(0,Q.Z)(R,["closeIcon","closable"]);_.useEffect(()=>{T!==void 0&&W(T)},[T]);const U=(0,Y.o2)(P),I=(0,Y.yT)(P),H=U||I,J=Object.assign(Object.assign({backgroundColor:P&&!H?P:void 0},M==null?void 0:M.style),b),x=m("tag",c),[me,Ce,he]=V(x),be=A()(x,M==null?void 0:M.className,{[`${x}-${P}`]:H,[`${x}-has-color`]:P&&!H,[`${x}-hidden`]:!u,[`${x}-rtl`]:z==="rtl",[`${x}-borderless`]:!y},t,a,Ce,he),X=v=>{v.stopPropagation(),$==null||$(v),!v.defaultPrevented&&W(!1)},[,L]=(0,f.Z)((0,f.w)(e),(0,f.w)(M),{closable:!1,closeIconRender:v=>{const s=_.createElement("span",{className:`${x}-close-icon`,onClick:X},v);return(0,se.wm)(v,s,l=>({onClick:d=>{var g;(g=l==null?void 0:l.onClick)===null||g===void 0||g.call(l,d),X(d)},className:A()(l==null?void 0:l.className,`${x}-close-icon`)}))}}),_e=typeof R.onClick=="function"||h&&h.type==="a",N=S||null,ye=N?_.createElement(_.Fragment,null,N,h&&_.createElement("span",null,h)):h,i=_.createElement("span",Object.assign({},Z,{ref:o,className:be,style:J}),ye,L,U&&_.createElement(ge,{key:"preset",prefixCls:x}),I&&_.createElement(le,{key:"status",prefixCls:x}));return me(_e?_.createElement(ce.Z,{component:"Tag"},i):i)});D.CheckableTag=ve;var j=D}}]);
