@fudanda/admin-antd 2.20261109.1-beta.1 → 2.20261109.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/chunks/ApiTokensPage-w3JGRNQC.js +2 -0
  2. package/dist/chunks/ApiTokensPage-w3JGRNQC.js.map +1 -0
  3. package/dist/chunks/{App-CfQx7jWq.js → App-nh6_qOo8.js} +5 -5
  4. package/dist/chunks/{App-CfQx7jWq.js.map → App-nh6_qOo8.js.map} +1 -1
  5. package/dist/chunks/{AppModal-CVoUC2t3.js → AppModal-CEouaU03.js} +2 -2
  6. package/dist/chunks/{AppModal-CVoUC2t3.js.map → AppModal-CEouaU03.js.map} +1 -1
  7. package/dist/chunks/{ArcBaseAdmin-DQyddbFC.js → ArcBaseAdmin-CX7fQz4x.js} +2 -2
  8. package/dist/chunks/{ArcBaseAdmin-DQyddbFC.js.map → ArcBaseAdmin-CX7fQz4x.js.map} +1 -1
  9. package/dist/chunks/{DepartmentsPage-CQx53QGE.js → DepartmentsPage-BdD9VfDI.js} +2 -2
  10. package/dist/chunks/{DepartmentsPage-CQx53QGE.js.map → DepartmentsPage-BdD9VfDI.js.map} +1 -1
  11. package/dist/chunks/{DictsPage-BGnamkWk.js → DictsPage-fxBdV1-3.js} +2 -2
  12. package/dist/chunks/{DictsPage-BGnamkWk.js.map → DictsPage-fxBdV1-3.js.map} +1 -1
  13. package/dist/chunks/{EntityContextRuntime-CbzeMNXR.js → EntityContextRuntime-CMhoj6qe.js} +2 -2
  14. package/dist/chunks/{EntityContextRuntime-CbzeMNXR.js.map → EntityContextRuntime-CMhoj6qe.js.map} +1 -1
  15. package/dist/chunks/EntityContextRuntime-Dc89ZSnM.js +1 -0
  16. package/dist/chunks/{ExportButton-sMPAV2hd.js → ExportButton-DGxB2tcu.js} +2 -2
  17. package/dist/chunks/{ExportButton-sMPAV2hd.js.map → ExportButton-DGxB2tcu.js.map} +1 -1
  18. package/dist/chunks/{FileViewerPreviewPanel-Rti7pUhU.js → FileViewerPreviewPanel-BMZ7FdKV.js} +3 -3
  19. package/dist/chunks/{FileViewerPreviewPanel-Rti7pUhU.js.map → FileViewerPreviewPanel-BMZ7FdKV.js.map} +1 -1
  20. package/dist/chunks/{FilesPage-D_iYsUwl.js → FilesPage-DrgWELKy.js} +3 -3
  21. package/dist/chunks/{FilesPage-D_iYsUwl.js.map → FilesPage-DrgWELKy.js.map} +1 -1
  22. package/dist/chunks/{IdentitySecurityPage-rDYX5ksX.js → IdentitySecurityPage-BjTKvr-O.js} +2 -2
  23. package/dist/chunks/{IdentitySecurityPage-rDYX5ksX.js.map → IdentitySecurityPage-BjTKvr-O.js.map} +1 -1
  24. package/dist/chunks/{LogStatsScaffold-CMIz4z0a.js → LogStatsScaffold-DaB0JeAN.js} +2 -2
  25. package/dist/chunks/{LogStatsScaffold-CMIz4z0a.js.map → LogStatsScaffold-DaB0JeAN.js.map} +1 -1
  26. package/dist/chunks/{LoginLogsPage-Bv5pPJb2.js → LoginLogsPage-VmYC7i6q.js} +2 -2
  27. package/dist/chunks/{LoginLogsPage-Bv5pPJb2.js.map → LoginLogsPage-VmYC7i6q.js.map} +1 -1
  28. package/dist/chunks/{LoginLogsTable-DYcTx2oR.js → LoginLogsTable-CULcc_e8.js} +2 -2
  29. package/dist/chunks/{LoginLogsTable-DYcTx2oR.js.map → LoginLogsTable-CULcc_e8.js.map} +1 -1
  30. package/dist/chunks/{MarkdownPreviewPanel-lqs6AsoN.js → MarkdownPreviewPanel-CBcPc7Wv.js} +2 -2
  31. package/dist/chunks/{MarkdownPreviewPanel-lqs6AsoN.js.map → MarkdownPreviewPanel-CBcPc7Wv.js.map} +1 -1
  32. package/dist/chunks/{MasterDetailLayout-B5uqvh98.js → MasterDetailLayout-ByIBpmkZ.js} +2 -2
  33. package/dist/chunks/{MasterDetailLayout-B5uqvh98.js.map → MasterDetailLayout-ByIBpmkZ.js.map} +1 -1
  34. package/dist/chunks/{McpSettingsPage-Cdej9Evi.js → McpSettingsPage-C5V_rj2V.js} +2 -2
  35. package/dist/chunks/{McpSettingsPage-Cdej9Evi.js.map → McpSettingsPage-C5V_rj2V.js.map} +1 -1
  36. package/dist/chunks/{MemberAssignmentSheet-AKvLbbYW.js → MemberAssignmentSheet-DL0fg1Yf.js} +2 -2
  37. package/dist/chunks/{MemberAssignmentSheet-AKvLbbYW.js.map → MemberAssignmentSheet-DL0fg1Yf.js.map} +1 -1
  38. package/dist/chunks/{MenuCommandPalette-ia0pSIFg.js → MenuCommandPalette-C2PvK3Gh.js} +2 -2
  39. package/dist/chunks/{MenuCommandPalette-ia0pSIFg.js.map → MenuCommandPalette-C2PvK3Gh.js.map} +1 -1
  40. package/dist/chunks/{MenusPage-Bh55bvKH.js → MenusPage-Bytd1HlW.js} +2 -2
  41. package/dist/chunks/{MenusPage-Bh55bvKH.js.map → MenusPage-Bytd1HlW.js.map} +1 -1
  42. package/dist/chunks/{MonacoPreviewPanel-CT_sjf7Z.js → MonacoPreviewPanel-BZrNIcFZ.js} +2 -2
  43. package/dist/chunks/{MonacoPreviewPanel-CT_sjf7Z.js.map → MonacoPreviewPanel-BZrNIcFZ.js.map} +1 -1
  44. package/dist/chunks/{NavListPanel-DMIUMh7q.js → NavListPanel-zwUDIYSP.js} +2 -2
  45. package/dist/chunks/{NavListPanel-DMIUMh7q.js.map → NavListPanel-zwUDIYSP.js.map} +1 -1
  46. package/dist/chunks/{OperationLogsPage-7XVfmhxP.js → OperationLogsPage-D2BQdGNp.js} +2 -2
  47. package/dist/chunks/{OperationLogsPage-7XVfmhxP.js.map → OperationLogsPage-D2BQdGNp.js.map} +1 -1
  48. package/dist/chunks/{OperationLogsTable-gp-WZxiF.js → OperationLogsTable-DaaON4QR.js} +3 -3
  49. package/dist/chunks/{OperationLogsTable-gp-WZxiF.js.map → OperationLogsTable-DaaON4QR.js.map} +1 -1
  50. package/dist/chunks/{PDFPreviewPanel-CyfhyWav.js → PDFPreviewPanel-CMmnWBKW.js} +3 -3
  51. package/dist/chunks/{PDFPreviewPanel-CyfhyWav.js.map → PDFPreviewPanel-CMmnWBKW.js.map} +1 -1
  52. package/dist/chunks/{PositionsPage-Bwua1vNV.js → PositionsPage-CBZITssT.js} +2 -2
  53. package/dist/chunks/{PositionsPage-Bwua1vNV.js.map → PositionsPage-CBZITssT.js.map} +1 -1
  54. package/dist/chunks/{PreferencesSheetBody-C80D3dOM.js → PreferencesSheetBody-B0poTPEA.js} +2 -2
  55. package/dist/chunks/{PreferencesSheetBody-C80D3dOM.js.map → PreferencesSheetBody-B0poTPEA.js.map} +1 -1
  56. package/dist/chunks/{ProfilePage-DeTw-59a.js → ProfilePage-DLhacdWt.js} +2 -2
  57. package/dist/chunks/{ProfilePage-DeTw-59a.js.map → ProfilePage-DLhacdWt.js.map} +1 -1
  58. package/dist/chunks/{ProjectInfoPage-Bqn3gfXa.js → ProjectInfoPage-CJpGxpu5.js} +2 -2
  59. package/dist/chunks/{ProjectInfoPage-Bqn3gfXa.js.map → ProjectInfoPage-CJpGxpu5.js.map} +1 -1
  60. package/dist/chunks/{RelationPanel-Bio-ig-l.js → RelationPanel-BsbfEDo2.js} +2 -2
  61. package/dist/chunks/{RelationPanel-Bio-ig-l.js.map → RelationPanel-BsbfEDo2.js.map} +1 -1
  62. package/dist/chunks/{RolesPage-fwUSs2HR.js → RolesPage-46dzdiah.js} +2 -2
  63. package/dist/chunks/{RolesPage-fwUSs2HR.js.map → RolesPage-46dzdiah.js.map} +1 -1
  64. package/dist/chunks/{SessionConflictModal-Dw4opoNP.js → SessionConflictModal-Bm38eExL.js} +2 -2
  65. package/dist/chunks/{SessionConflictModal-Dw4opoNP.js.map → SessionConflictModal-Bm38eExL.js.map} +1 -1
  66. package/dist/chunks/SettingModuleDetail-BjxUJeH5.js +17 -0
  67. package/dist/chunks/SettingModuleDetail-BjxUJeH5.js.map +1 -0
  68. package/dist/chunks/{SettingsPage-Cy5-q-P6.js → SettingsPage-C32Vuizm.js} +2 -2
  69. package/dist/chunks/{SettingsPage-Cy5-q-P6.js.map → SettingsPage-C32Vuizm.js.map} +1 -1
  70. package/dist/chunks/{StatCard-BROG4NSp.js → StatCard-CRPfkSBY.js} +2 -2
  71. package/dist/chunks/{StatCard-BROG4NSp.js.map → StatCard-CRPfkSBY.js.map} +1 -1
  72. package/dist/chunks/{UserGroupsPage-CsTBkUPy.js → UserGroupsPage-08G5MdGm.js} +2 -2
  73. package/dist/chunks/{UserGroupsPage-CsTBkUPy.js.map → UserGroupsPage-08G5MdGm.js.map} +1 -1
  74. package/dist/chunks/{UserLogsPanels-3u8Z93YU.js → UserLogsPanels-nbIrMym9.js} +2 -2
  75. package/dist/chunks/{UserLogsPanels-3u8Z93YU.js.map → UserLogsPanels-nbIrMym9.js.map} +1 -1
  76. package/dist/chunks/{UserTransferSelect-ChLj4EkS.js → UserTransferSelect-C8betaWG.js} +2 -2
  77. package/dist/chunks/{UserTransferSelect-ChLj4EkS.js.map → UserTransferSelect-C8betaWG.js.map} +1 -1
  78. package/dist/chunks/{UsersPage-CfNnQJi4.js → UsersPage-BjTiNEqF.js} +2 -2
  79. package/dist/chunks/{UsersPage-CfNnQJi4.js.map → UsersPage-BjTiNEqF.js.map} +1 -1
  80. package/dist/chunks/{browser-BKLM0ThC-D0TgzKTC.js → browser-BKLM0ThC-Cp7Gi4-F.js} +1 -1
  81. package/dist/chunks/{code-BkkeN2fd.js → code-LswxAr98.js} +1 -1
  82. package/dist/chunks/{direct-engine-m32m22nx.js → direct-engine-Dv_6v4sx.js} +1 -1
  83. package/dist/chunks/{html-BGNWR_Bp.js → html-BokjxlLb.js} +1 -1
  84. package/dist/chunks/{line-CsTeuEcK.js → line-Bqh6atHH.js} +1 -1
  85. package/dist/chunks/{lrc-D6gjnGZ5.js → lrc-T5e1svZG.js} +1 -1
  86. package/dist/chunks/{markdown-BglUe9j8.js → markdown-BpWokN1s.js} +1 -1
  87. package/dist/chunks/{patch-C97Yl3jr.js → patch-BYVX5C9G.js} +1 -1
  88. package/dist/chunks/{worker-engine-B7_3qQVS.js → worker-engine-CtUAeI4G.js} +1 -1
  89. package/dist/index.js +1 -1
  90. package/dist/{src-DAkFn9SG.js → src-D6UlLiVN.js} +2 -2
  91. package/dist/{src-DAkFn9SG.js.map → src-D6UlLiVN.js.map} +1 -1
  92. package/package.json +9 -9
  93. package/dist/chunks/ApiTokensPage-DiRMgViD.js +0 -2
  94. package/dist/chunks/ApiTokensPage-DiRMgViD.js.map +0 -1
  95. package/dist/chunks/EntityContextRuntime-C9q95WDf.js +0 -1
  96. package/dist/chunks/SettingModuleDetail-I9CSJ-fh.js +0 -17
  97. package/dist/chunks/SettingModuleDetail-I9CSJ-fh.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,bt as n,j as r,m as i,xt as a}from"./clipboard-dpqHdCyy.js";import{i as o,r as s}from"./App-CfQx7jWq.js";import{createContext as c,useCallback as l,useContext as u,useEffect as d,useLayoutEffect as ee,useMemo as f,useRef as p,useState as m}from"react";import{jsx as h,jsxs as g}from"react/jsx-runtime";import{clamp as _}from"@fudanda/client/core";var v,y;function b(){return(b=e((()=>{
1
+ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,bt as n,j as r,m as i,xt as a}from"./clipboard-dpqHdCyy.js";import{i as o,r as s}from"./App-nh6_qOo8.js";import{createContext as c,useCallback as l,useContext as u,useEffect as d,useLayoutEffect as ee,useMemo as f,useRef as p,useState as m}from"react";import{jsx as h,jsxs as g}from"react/jsx-runtime";import{clamp as _}from"@fudanda/client/core";var v,y;function b(){return(b=e((()=>{
2
2
  /**
3
3
  * @license lucide-react v1.67.0 - ISC
4
4
  *
@@ -6,4 +6,4 @@ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,bt as n,j as r,
6
6
  * See the LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  a(),v={name:`arrow-left-right`,size:24,node:[[`path`,{d:`M8 3 4 7l4 4`,key:`9rb6wj`}],[`path`,{d:`M4 7h16`,key:`6tx8e3`}],[`path`,{d:`m16 21 4-4-4-4`,key:`siv7j2`}],[`path`,{d:`M20 17H4`,key:`h6l3hr`}]]},v.node,y=n(v)})))()}function x({onClick:e,label:t}){return/* @__PURE__ */ g(`button`,{type:`button`,onClick:e,style:{flexShrink:0,display:`flex`,alignItems:`center`,gap:6,padding:`8px 12px`,background:`transparent`,border:0,borderBottomColor:`var(--arc-antd-color-border)`,borderBottomStyle:`solid`,borderBottomWidth:1,cursor:`pointer`,color:`var(--arc-antd-color-text-2)`,fontSize:13,minHeight:40,boxSizing:`border-box`,width:`100%`},children:[/* @__PURE__ */ h(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:/* @__PURE__ */ h(`polyline`,{points:`15 18 9 12 15 6`})}),t]})}function te(e){if(!e)return null;try{let t=localStorage.getItem(O+e);if(!t)return null;let n=Number(t);return Number.isFinite(n)?n:null}catch{return null}}function S(e,t){if(e)try{localStorage.setItem(O+e,String(t))}catch{}}function ne(e){if(!e)return null;try{let t=localStorage.getItem(`${O}${e}.side`);return t===`left`||t===`right`?t:null}catch{return null}}function re(e,t){if(e)try{localStorage.setItem(`${O}${e}.side`,t)}catch{}}function C(e){let{master:t,detail:n,side:r,sideSwitchable:i=!0,onSideChange:a,defaultSize:o=260,minSize:s=180,maxSize:c=600,resizable:u=!0,persistKey:v,gap:y=0,bordered:b=!1,divider:C=!0,collapsed:w,onCollapseChange:T,collapsible:E=!0,responsiveBreakpoint:O=720,showDetail:k,onBack:A,onMasterBack:j,masterBackLabel:ie=`返回`,responsiveActive:ae,className:oe,style:se}=e,M=p(null),[N,P]=m(()=>ne(v)??r??`left`),F=p(r),I=a?r??N:N,[L,R]=m(()=>{let e=te(v);return _(e??o,s,c)}),[z,B]=m(0),[ce,le]=m(!1),V=w??ce,ue=l(e=>{T?T(e):le(e)},[T]),H=(E||!!T)&&C;d(()=>{F.current!==r&&(F.current=r,r!==void 0&&!a&&P(r))},[a,r]);let U=l(()=>{let e=I===`left`?`right`:`left`;a?a(e):P(e),re(v,e)},[a,v,I]);ee(()=>{let e=M.current;if(!e||(B(e.clientWidth),typeof ResizeObserver>`u`))return;let t=new ResizeObserver(e=>{for(let t of e)B(Math.floor(t.contentRect.width))});return t.observe(e),()=>t.disconnect()},[]);let W=p(!1),[de,G]=m(!1),K=p({x:0,size:0,currentSize:0}),q=p(null),J=l((e=!0)=>{if(!W.current)return;W.current=!1;let t=q.current;if(q.current=null,t){try{t.element.releasePointerCapture(t.pointerId)}catch{}document.body.style.cursor=t.cursor,document.body.style.userSelect=t.userSelect}S(v,K.current.currentSize),e&&G(!1)},[v]);d(()=>{let e=()=>J();return window.addEventListener(`blur`,e),()=>{window.removeEventListener(`blur`,e),J(!1)}},[J]);let fe=l(e=>{u&&e.button===0&&!W.current&&(e.preventDefault(),W.current=!0,G(!0),K.current={x:e.clientX,size:L,currentSize:L},q.current={element:e.currentTarget,pointerId:e.pointerId,cursor:document.body.style.cursor,userSelect:document.body.style.userSelect},e.currentTarget.setPointerCapture(e.pointerId),document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`)},[u,L]),pe=l(e=>{if(!W.current)return;let t=e.clientX-K.current.x,n=I===`left`?t:-t,r=_(K.current.size+n,s,c);K.current.currentSize=r,R(e=>e===r?e:r)},[I,s,c]),Y=l(()=>J(),[J]),me=l(e=>{if(W.current)return;let t,n=e.shiftKey?50:10,r=I===`left`?1:-1;if(e.key===`ArrowLeft`)t=L-n*r;else if(e.key===`ArrowRight`)t=L+n*r;else if(e.key===`Home`)t=s;else if(e.key===`End`)t=c;else return;e.preventDefault(),e.stopPropagation(),R(_(t,s,c))},[c,s,I,L]);d(()=>{v&&(W.current||S(v,L))},[v,L]);let X=O>0&&z>0&&z<O,{onResponsiveChange:Z}=e,Q=p(null);d(()=>{z!==0&&Q.current!==X&&(Q.current=X,Z?.(X))},[X,z,Z]);let he={display:`flex`,flexDirection:I===`left`?`row`:`row-reverse`,height:`100%`,width:`100%`,overflow:`hidden`,gap:y>0?y:void 0,...se},ge=f(()=>({pane:`master`,side:I,sideSwitchable:i,isResponsive:X,toggleSide:U}),[I,i,X,U]),_e=f(()=>({pane:`detail`,side:I,sideSwitchable:i,isResponsive:X,toggleSide:U}),[I,i,X,U]),ve=/* @__PURE__ */ h(D.Provider,{value:ge,children:t}),ye=/* @__PURE__ */ h(D.Provider,{value:_e,children:n}),be={flexShrink:0,display:`flex`,flexDirection:`column`,minWidth:0,overflow:`hidden`,boxSizing:`border-box`,...b?{border:`1px solid var(--arc-antd-color-border)`,borderRadius:`var(--arc-antd-border-radius-medium)`,background:`var(--surface-card)`}:null},$={flex:1,display:`flex`,flexDirection:`column`,minWidth:0,overflow:`hidden`,boxSizing:`border-box`,...b?{border:`1px solid var(--arc-antd-color-border)`,borderRadius:`var(--arc-antd-border-radius-medium)`,background:`var(--surface-card)`}:null};if(X){let e=k??ae===`detail`;return/* @__PURE__ */ g(`div`,{ref:M,className:oe,style:he,children:[/* @__PURE__ */ g(`div`,{style:{...be,width:`100%`,display:e?`none`:`flex`},children:[!e&&j&&/* @__PURE__ */ h(x,{onClick:j,label:ie}),ve]}),/* @__PURE__ */ g(`div`,{style:{...$,display:e?`flex`:`none`},children:[e&&A&&/* @__PURE__ */ h(x,{onClick:A,label:`返回`}),ye]})]})}let xe=H?/* @__PURE__ */ h(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),ue(!V)},onPointerDown:e=>e.stopPropagation(),title:`${V?`展开`:`收起`}${I===`left`?`左侧`:`右侧`}面板`,"aria-label":`${V?`展开`:`收起`}${I===`left`?`左侧`:`右侧`}面板`,"aria-expanded":!V,className:`arc-msdl-divider__toggle`,children:/* @__PURE__ */ h(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:(I===`left`?!V:V)?/* @__PURE__ */ h(`polyline`,{points:`15 18 9 12 15 6`}):/* @__PURE__ */ h(`polyline`,{points:`9 18 15 12 9 6`})})}):null,Se={...be,width:V?0:L,display:V?`none`:`flex`},Ce=C&&(!V||H)?/* @__PURE__ */ g(`div`,{className:`arc-msdl-divider${V?` arc-msdl-divider--collapsed`:``}${b?` arc-msdl-divider--bordered`:``}`,"data-dragging":de||void 0,style:{width:V?28:b?Math.max(y,1):1,...b&&y>0?{marginLeft:-y,marginRight:-y}:null},children:[/* @__PURE__ */ h(`span`,{className:`arc-msdl-divider__line`,"aria-hidden":`true`}),u&&!V&&/* @__PURE__ */ h(`div`,{className:`arc-msdl-divider__resize`,role:`separator`,"aria-label":`调整侧栏宽度`,"aria-orientation":`vertical`,"aria-valuemin":s,"aria-valuemax":c,"aria-valuenow":L,tabIndex:0,onKeyDown:me,onPointerDown:fe,onPointerMove:pe,onPointerUp:Y,onPointerCancel:Y,onLostPointerCapture:Y}),xe]}):null;return/* @__PURE__ */ g(`div`,{ref:M,className:oe,style:he,children:[/* @__PURE__ */ h(`div`,{style:Se,children:ve}),Ce,/* @__PURE__ */ h(`div`,{style:$,children:ye})]})}function w(){let e=u(D);if(!e||e.pane!==`master`||!e.sideSwitchable||e.isResponsive)return null;let t=`将侧栏移到${e.side===`left`?`右侧`:`左侧`}`;return/* @__PURE__ */ h(r,{content:t,position:`bottom`,children:/* @__PURE__ */ h(i,{size:`small`,theme:`borderless`,type:`tertiary`,icon:/* @__PURE__ */ h(y,{size:14}),"aria-label":t,onClick:e.toggleSide})})}function T({children:e,extra:t,className:n,style:r}){let i=u(D),a=i?.pane===`master`&&i.sideSwitchable&&!i.isResponsive;return/* @__PURE__ */ g(`div`,{className:n?`msdl-header ${n}`:`msdl-header`,style:{flexShrink:0,display:`flex`,alignItems:`center`,justifyContent:`space-between`,gap:8,padding:`8px 12px`,borderBottom:`1px solid var(--arc-antd-color-border)`,minHeight:44,boxSizing:`border-box`,...r},children:[/* @__PURE__ */ h(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,minWidth:0,flex:1},children:e}),t||a?/* @__PURE__ */ g(`div`,{style:{flexShrink:0,display:`flex`,alignItems:`center`,gap:8},children:[t,a?/* @__PURE__ */ h(w,{}):null]}):null]})}function E({children:e,scroll:t=`auto`,padding:n,className:r,style:i}){return/* @__PURE__ */ h(s,{horizontal:!0,scroll:t,tabIndex:t===`auto`?0:-1,className:r?`msdl-body ${r}`:`msdl-body`,style:{flex:1,minHeight:0,minWidth:0,overflow:t,padding:n,boxSizing:`border-box`,...i},children:e})}var D,O,k;function A(){return(A=e((()=>{t(),b(),o(),D=c(null),O=`mdLayout.`,k=Object.assign(C,{Header:T,Body:E,SideToggle:w})})))()}export{A as n,k as t};
9
- //# sourceMappingURL=MasterDetailLayout-B5uqvh98.js.map
9
+ //# sourceMappingURL=MasterDetailLayout-ByIBpmkZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MasterDetailLayout-B5uqvh98.js","mappings":"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","names":["__iconData","createLucideIcon","ResponsiveBackBar","label","readPersisted","key","v","STORAGE_PREFIX","writePersisted","value","readPersistedSide","writePersistedSide","side","MasterDetailLayoutImpl","sideProp","collapsedProp","props","rootRef","useRef","internalSide","setInternalSide","useState","persistKey","previousSidePropRef","onSideChange","size","setSize","persisted","clamp","defaultSize","minSize","maxSize","containerWidth","setContainerWidth","internalCollapsed","setInternalCollapsed","collapsed","handleCollapseToggle","useCallback","onCollapseChange","next","showCollapseToggle","collapsible","divider","useEffect","handleSideToggle","useLayoutEffect","el","ob","entry","entries","draggingRef","dragging","setDragging","dragStartRef","dragHandleRef","finishDrag","handle","updateState","onBlur","handlePointerDown","resizable","handlePointerMove","dx","delta","previous","handlePointerUp","handleResizeKeyDown","step","direction","isResponsive","responsiveBreakpoint","prevIsResponsiveRef","onResponsiveChange","rootStyle","gap","style","masterPaneContext","useMemo","sideSwitchable","detailPaneContext","masterContent","PaneContext","master","detailContent","detail","masterBaseStyle","bordered","detailBaseStyle","detailVisible","showDetail","responsiveActive","onMasterBack","masterBackLabel","onBack","collapseToggleBtn","masterStyle","dividerEl","_jsx","SideToggle","context","useContext","Tooltip","Button","ArrowLeftRight","Header","paneContext","showSideToggle","className","extra","Body","ScrollArea","scroll","createContext"],"ignoreList":[0],"sources":["../../../../node_modules/lucide-react/dist/esm/icons/arrow-left-right.mjs","../../src/components/MasterDetailLayout.tsx"],"sourcesContent":[null,"import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties, KeyboardEvent as ReactKeyboardEvent, PointerEvent as ReactPointerEvent, ReactNode } from 'react';\nimport { Button, Tooltip } from \"@/ui\";\nimport { ArrowLeftRight } from 'lucide-react';\nimport { clamp } from '@fudanda/shared/core';\nimport ScrollArea from './ScrollArea';\nimport \"@/components/MasterDetailLayout.css\";\ntype Side = 'left' | 'right';\ninterface PaneContextValue {\n pane: 'master' | 'detail';\n side: Side;\n sideSwitchable: boolean;\n isResponsive: boolean;\n toggleSide: () => void;\n}\nconst PaneContext = createContext<PaneContextValue | null>(null);\n/** 响应式单栏模式下的返回条,master / detail 两侧共用 */\nfunction ResponsiveBackBar({ onClick, label }: Readonly<{\n onClick: () => void;\n label: ReactNode;\n}>) {\n return (<button type=\"button\" onClick={onClick} style={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 12px',\n background: 'transparent',\n border: 0,\n borderBottomColor: 'var(--arc-antd-color-border)',\n borderBottomStyle: 'solid',\n borderBottomWidth: 1,\n cursor: 'pointer',\n color: 'var(--arc-antd-color-text-2)',\n fontSize: 13,\n minHeight: 40,\n boxSizing: 'border-box',\n width: '100%',\n }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"15 18 9 12 15 6\"/>\n </svg>\n {label}\n </button>);\n}\ninterface MasterDetailLayoutProps {\n readonly master: ReactNode;\n detail: ReactNode;\n /** 主侧位置,默认 'left';配合 onSideChange 时作为受控值 */\n side?: Side;\n /** 是否允许用户在桌面端调换主侧位置,默认 true */\n sideSwitchable?: boolean;\n /** 主侧位置变化回调;提供后由调用方更新 side */\n onSideChange?: (side: Side) => void;\n /** 主侧默认宽(px) */\n defaultSize?: number;\n minSize?: number;\n maxSize?: number;\n /** 是否可拖拽调整宽度,默认 true */\n resizable?: boolean;\n /** 设置后宽度持久化到 localStorage,key 为 `mdLayout.${persistKey}` */\n persistKey?: string;\n /** 两栏间距 px,默认 0 */\n gap?: number;\n /** 两侧各自加 1px 边框 + 圆角,默认 false */\n bordered?: boolean;\n /** 是否显示分隔线/分隔条,默认 true */\n divider?: boolean;\n /** 受控折叠状态:为 true 时主侧隐藏 */\n collapsed?: boolean;\n /** 折叠状态变化回调,提供后分隔线上会显示折叠/展开图标按钮 */\n onCollapseChange?: (collapsed: boolean) => void;\n /**\n * 启用内置折叠功能,分隔线上展示折叠按鈕。\n * 无需外部传入 collapsed/onCollapseChange,组件自管内部状态。\n */\n collapsible?: boolean;\n /**\n * 容器宽度小于此值时切换到单栏模式(移动端样式),默认 720。\n * 传 0 或 undefined 可禁用响应式,传极大值(如 99999)可强制单栏。\n *\n * 取 720 而非 768:断点比较的是容器宽度而非视口宽度,后台内容区还要\n * 扣除侧边栏。实测 992px 视口下容器仅 776px,若阈值取 768 只剩 8px 余量,\n * 用户略微缩窄窗口就会让桌面端意外掉入单栏;720 保留约 56px 余量。\n */\n responsiveBreakpoint?: number;\n /**\n * 响应式单栏模式下是否显示 detail 侧(优先级高于 responsiveActive)。\n * 通常与 onBack 配合:有选中项时传 true,onBack 重置选中项。\n */\n showDetail?: boolean;\n /**\n * 响应式返回回调:提供后,在响应式 detail 模式下自动显示返回按钮。\n * 点击时调用此回调,组件本身不管理状态。\n */\n onBack?: () => void;\n /**\n * 响应式 master 模式下的返回回调(master → detail)。\n *\n * 适用于「侧栏是筛选树、detail 才是页面主体」的场景(如用户管理的部门树):\n * 此类页面窄屏默认展示 detail,用户主动切到 master 后需要退回主体内容。\n * 与 onBack 分开是因为「列表 → 详情」型页面的 master 是根视图,不应出现返回。\n */\n onMasterBack?: () => void;\n /** onMasterBack 返回条的文案,默认「返回」 */\n masterBackLabel?: ReactNode;\n /**\n * 建议改用 showDetail。单栏模式下当前激活的面板('master' | 'detail'),默认 'master'。\n */\n responsiveActive?: 'master' | 'detail';\n /**\n * 容器进入/退出响应式单栏模式时触发,参数为 isResponsive。\n * 可用于父组件按需显示/隐藏与布局状态绑定的 UI。\n */\n onResponsiveChange?: (isResponsive: boolean) => void;\n className?: string;\n style?: CSSProperties;\n}\nconst STORAGE_PREFIX = 'mdLayout.';\nfunction readPersisted(key: string | undefined): number | null {\n if (!key)\n return null;\n try {\n const v = localStorage.getItem(STORAGE_PREFIX + key);\n if (!v)\n return null;\n const n = Number(v);\n return Number.isFinite(n) ? n : null;\n }\n catch {\n return null;\n }\n}\nfunction writePersisted(key: string | undefined, value: number) {\n if (!key)\n return;\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(value));\n }\n catch { /* No additional action. */ }\n}\nfunction readPersistedSide(key: string | undefined): Side | null {\n if (!key)\n return null;\n try {\n const value = localStorage.getItem(`${STORAGE_PREFIX}${key}.side`);\n return value === 'left' || value === 'right' ? value : null;\n }\n catch {\n return null;\n }\n}\nfunction writePersistedSide(key: string | undefined, side: Side) {\n if (!key)\n return;\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${key}.side`, side);\n }\n catch { /* No additional action. */ }\n}\nfunction MasterDetailLayoutImpl(props: Readonly<MasterDetailLayoutProps>) {\n const { master, detail, side: sideProp, sideSwitchable = true, onSideChange, defaultSize = 260, minSize = 180, maxSize = 600, resizable = true, persistKey, gap = 0, bordered = false, divider = true, collapsed: collapsedProp, onCollapseChange, collapsible = true, responsiveBreakpoint = 720, showDetail, onBack, onMasterBack, masterBackLabel = '返回', responsiveActive, className, style } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [internalSide, setInternalSide] = useState<Side>(() => readPersistedSide(persistKey) ?? sideProp ?? 'left');\n const previousSidePropRef = useRef(sideProp);\n const side = onSideChange ? (sideProp ?? internalSide) : internalSide;\n const [size, setSize] = useState<number>(() => {\n const persisted = readPersisted(persistKey);\n return clamp(persisted ?? defaultSize, minSize, maxSize);\n });\n const [containerWidth, setContainerWidth] = useState<number>(0);\n // 内部折叠状态(collapsible 模式下使用)\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n // 最终折叠状态:collapsedProp 优先(受控),否则用内部状态\n const collapsed = collapsedProp ?? internalCollapsed;\n // 切换折叠状态\n const handleCollapseToggle = useCallback((next: boolean) => {\n if (onCollapseChange) {\n onCollapseChange(next);\n }\n else {\n setInternalCollapsed(next);\n }\n }, [onCollapseChange]);\n const showCollapseToggle = (collapsible || !!onCollapseChange) && divider;\n useEffect(() => {\n if (previousSidePropRef.current === sideProp)\n return;\n previousSidePropRef.current = sideProp;\n if (sideProp !== undefined && !onSideChange)\n setInternalSide(sideProp);\n }, [onSideChange, sideProp]);\n const handleSideToggle = useCallback(() => {\n const next = side === 'left' ? 'right' : 'left';\n if (onSideChange)\n onSideChange(next);\n else\n setInternalSide(next);\n writePersistedSide(persistKey, next);\n }, [onSideChange, persistKey, side]);\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el)\n return;\n setContainerWidth(el.clientWidth);\n if (typeof ResizeObserver === 'undefined')\n return;\n const ob = new ResizeObserver((entries) => {\n for (const entry of entries)\n setContainerWidth(Math.floor(entry.contentRect.width));\n });\n ob.observe(el);\n return () => ob.disconnect();\n }, []);\n const draggingRef = useRef(false);\n const [dragging, setDragging] = useState(false);\n const dragStartRef = useRef({ x: 0, size: 0, currentSize: 0 });\n const dragHandleRef = useRef<{\n element: HTMLDivElement;\n pointerId: number;\n cursor: string;\n userSelect: string;\n } | null>(null);\n const finishDrag = useCallback((updateState = true) => {\n if (!draggingRef.current)\n return;\n draggingRef.current = false;\n const handle = dragHandleRef.current;\n dragHandleRef.current = null;\n if (handle) {\n try {\n handle.element.releasePointerCapture(handle.pointerId);\n }\n catch { /* capture may already be released */ } /* No additional action. */\n document.body.style.cursor = handle.cursor;\n document.body.style.userSelect = handle.userSelect;\n }\n writePersisted(persistKey, dragStartRef.current.currentSize);\n if (updateState)\n setDragging(false);\n }, [persistKey]);\n useEffect(() => {\n const onBlur = () => finishDrag();\n window.addEventListener('blur', onBlur);\n return () => {\n window.removeEventListener('blur', onBlur);\n finishDrag(false);\n };\n }, [finishDrag]);\n const handlePointerDown = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n if (!resizable || e.button !== 0 || draggingRef.current)\n return;\n e.preventDefault();\n draggingRef.current = true;\n setDragging(true);\n dragStartRef.current = { x: e.clientX, size, currentSize: size };\n dragHandleRef.current = { element: e.currentTarget, pointerId: e.pointerId, cursor: document.body.style.cursor, userSelect: document.body.style.userSelect };\n e.currentTarget.setPointerCapture(e.pointerId);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, [resizable, size]);\n const handlePointerMove = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current)\n return;\n const dx = e.clientX - dragStartRef.current.x;\n const delta = side === 'left' ? dx : -dx;\n const next = clamp(dragStartRef.current.size + delta, minSize, maxSize);\n dragStartRef.current.currentSize = next;\n setSize(previous => previous === next ? previous : next);\n }, [side, minSize, maxSize]);\n const handlePointerUp = useCallback(() => finishDrag(), [finishDrag]);\n const handleResizeKeyDown = useCallback((e: ReactKeyboardEvent<HTMLDivElement>) => {\n if (draggingRef.current)\n return;\n let next: number;\n const step = e.shiftKey ? 50 : 10;\n const direction = side === 'left' ? 1 : -1;\n if (e.key === 'ArrowLeft')\n next = size - step * direction;\n else if (e.key === 'ArrowRight')\n next = size + step * direction;\n else if (e.key === 'Home')\n next = minSize;\n else if (e.key === 'End')\n next = maxSize;\n else\n return;\n e.preventDefault();\n e.stopPropagation();\n setSize(clamp(next, minSize, maxSize));\n }, [maxSize, minSize, side, size]);\n // 持久化(拖拽中每次 pointermove 都会更新 size,此处跳过等 PointerUp 一次性落盘;\n // 仅覆盖非拖拽来源的 size 变化)\n useEffect(() => {\n if (!persistKey)\n return;\n if (draggingRef.current)\n return;\n writePersisted(persistKey, size);\n }, [persistKey, size]);\n const isResponsive = responsiveBreakpoint > 0 && containerWidth > 0 && containerWidth < responsiveBreakpoint;\n const { onResponsiveChange } = props;\n const prevIsResponsiveRef = useRef<boolean | null>(null);\n useEffect(() => {\n if (containerWidth === 0)\n return; // 初始化未完成,跳过\n if (prevIsResponsiveRef.current === isResponsive)\n return;\n prevIsResponsiveRef.current = isResponsive;\n onResponsiveChange?.(isResponsive);\n }, [isResponsive, containerWidth, onResponsiveChange]);\n const rootStyle: CSSProperties = {\n display: 'flex',\n flexDirection: side === 'left' ? 'row' : 'row-reverse',\n height: '100%',\n width: '100%',\n overflow: 'hidden',\n gap: gap > 0 ? gap : undefined,\n ...style,\n };\n // context value 保持稳定身份:布局因内部状态(拖拽 resize、容器宽度)高频重渲染时,\n // 避免 Header/SideToggle 等 consumer 跟着无谓重渲染\n const masterPaneContext = useMemo<PaneContextValue>(() => ({\n pane: 'master',\n side,\n sideSwitchable,\n isResponsive,\n toggleSide: handleSideToggle,\n }), [side, sideSwitchable, isResponsive, handleSideToggle]);\n const detailPaneContext = useMemo<PaneContextValue>(() => ({\n pane: 'detail',\n side,\n sideSwitchable,\n isResponsive,\n toggleSide: handleSideToggle,\n }), [side, sideSwitchable, isResponsive, handleSideToggle]);\n const masterContent = (<PaneContext.Provider value={masterPaneContext}>\n {master}\n </PaneContext.Provider>);\n const detailContent = (<PaneContext.Provider value={detailPaneContext}>\n {detail}\n </PaneContext.Provider>);\n const masterBaseStyle: CSSProperties = {\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n ...(bordered\n ? {\n border: '1px solid var(--arc-antd-color-border)',\n borderRadius: 'var(--arc-antd-border-radius-medium)',\n background: 'var(--surface-card)',\n }\n : null),\n };\n const detailBaseStyle: CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n ...(bordered\n ? {\n border: '1px solid var(--arc-antd-color-border)',\n borderRadius: 'var(--arc-antd-border-radius-medium)',\n background: 'var(--surface-card)',\n }\n : null),\n };\n // 响应式:单栏模式\n if (isResponsive) {\n // showDetail 优先;否则降级到旧的 responsiveActive\n const detailVisible = showDetail ?? (responsiveActive === 'detail');\n return (<div ref={rootRef} className={className} style={rootStyle}>\n <div style={{ ...masterBaseStyle, width: '100%', display: detailVisible ? 'none' : 'flex' }}>\n {!detailVisible && onMasterBack && (<ResponsiveBackBar onClick={onMasterBack} label={masterBackLabel}/>)}\n {masterContent}\n </div>\n <div style={{ ...detailBaseStyle, display: detailVisible ? 'flex' : 'none' }}>\n {detailVisible && onBack && <ResponsiveBackBar onClick={onBack} label=\"返回\"/>}\n {detailContent}\n </div>\n </div>);\n }\n // 箭头跟随侧栏位置,折叠后始终保留展开入口。\n const showLeftChevron = side === 'left' ? !collapsed : collapsed;\n const collapseToggleBtn = showCollapseToggle ? (<button type=\"button\" onClick={(e) => { e.stopPropagation(); handleCollapseToggle(!collapsed); }} onPointerDown={(e) => e.stopPropagation()} title={`${collapsed ? '展开' : '收起'}${side === 'left' ? '左侧' : '右侧'}面板`} aria-label={`${collapsed ? '展开' : '收起'}${side === 'left' ? '左侧' : '右侧'}面板`} aria-expanded={!collapsed} className=\"arc-msdl-divider__toggle\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {showLeftChevron\n ? <polyline points=\"15 18 9 12 15 6\"/>\n : <polyline points=\"9 18 15 12 9 6\"/>}\n </svg>\n </button>) : null;\n const masterStyle: CSSProperties = {\n ...masterBaseStyle,\n width: collapsed ? 0 : size,\n display: collapsed ? 'none' : 'flex',\n };\n const dividerEl = divider && (!collapsed || showCollapseToggle) ? (<div className={`arc-msdl-divider${collapsed ? ' arc-msdl-divider--collapsed' : ''}${bordered ? ' arc-msdl-divider--bordered' : ''}`} data-dragging={dragging || undefined} style={{\n width: collapsed ? 28 : bordered ? Math.max(gap, 1) : 1,\n ...(bordered && gap > 0 ? { marginLeft: -gap, marginRight: -gap } : null),\n }}>\n <span className=\"arc-msdl-divider__line\" aria-hidden=\"true\"/>\n {resizable && !collapsed && (<div className=\"arc-msdl-divider__resize\" role=\"separator\" aria-label=\"调整侧栏宽度\" aria-orientation=\"vertical\" aria-valuemin={minSize} aria-valuemax={maxSize} aria-valuenow={size} tabIndex={0} onKeyDown={handleResizeKeyDown} onPointerDown={handlePointerDown} onPointerMove={handlePointerMove} onPointerUp={handlePointerUp} onPointerCancel={handlePointerUp} onLostPointerCapture={handlePointerUp}/>)}\n {collapseToggleBtn}\n </div>) : null;\n const masterEl = <div style={masterStyle}>{masterContent}</div>;\n const detailEl = <div style={detailBaseStyle}>{detailContent}</div>;\n return (<div ref={rootRef} className={className} style={rootStyle}>\n {masterEl}\n {dividerEl}\n {detailEl}\n </div>);\n}\ninterface HeaderProps {\n readonly children?: ReactNode;\n readonly extra?: ReactNode;\n readonly className?: string;\n readonly style?: CSSProperties;\n}\nfunction SideToggle() {\n const context = useContext(PaneContext);\n if (!context || context.pane !== 'master' || !context.sideSwitchable || context.isResponsive)\n return null;\n const target = context.side === 'left' ? '右侧' : '左侧';\n const label = `将侧栏移到${target}`;\n // 双向箭头:明确表达“左右换边”,避免 Panel 风格图标被误读为“折叠/收起侧栏”\n return (<Tooltip content={label} position=\"bottom\">\n <Button size=\"small\" theme=\"borderless\" type=\"tertiary\" icon={<ArrowLeftRight size={14}/>} aria-label={label} onClick={context.toggleSide}/>\n </Tooltip>);\n}\nfunction Header({ children, extra, className, style }: HeaderProps) {\n const paneContext = useContext(PaneContext);\n const showSideToggle = paneContext?.pane === 'master'\n && paneContext.sideSwitchable\n && !paneContext.isResponsive;\n return (<div className={className ? `msdl-header ${className}` : 'msdl-header'} style={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n padding: '8px 12px',\n borderBottom: '1px solid var(--arc-antd-color-border)',\n minHeight: 44,\n boxSizing: 'border-box',\n ...style,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0, flex: 1 }}>{children}</div>\n {extra || showSideToggle ? (<div style={{ flexShrink: 0, display: 'flex', alignItems: 'center', gap: 8 }}>\n {extra}\n {showSideToggle ? <SideToggle /> : null}\n </div>) : null}\n </div>);\n}\ninterface BodyProps {\n readonly children?: ReactNode;\n /** auto: overflow auto(默认);hidden: overflow hidden(内部自管滚动);visible: overflow visible */\n readonly scroll?: 'auto' | 'hidden' | 'visible';\n readonly padding?: number | string;\n readonly className?: string;\n readonly style?: CSSProperties;\n}\nfunction Body({ children, scroll = 'auto', padding, className, style }: BodyProps) {\n // Keep one viewport and React subtree when a page switches between a table and statistics.\n return (<ScrollArea horizontal scroll={scroll} tabIndex={scroll === 'auto' ? 0 : -1} className={className ? `msdl-body ${className}` : 'msdl-body'} style={{\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n overflow: scroll,\n padding,\n boxSizing: 'border-box',\n ...style,\n }}>\n {children}\n </ScrollArea>);\n}\nexport const MasterDetailLayout = Object.assign(MasterDetailLayoutImpl, {\n Header,\n Body,\n SideToggle,\n});\nexport type { MasterDetailLayoutProps };\n"]}
1
+ {"version":3,"file":"MasterDetailLayout-ByIBpmkZ.js","mappings":"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","names":["__iconData","createLucideIcon","ResponsiveBackBar","label","readPersisted","key","v","STORAGE_PREFIX","writePersisted","value","readPersistedSide","writePersistedSide","side","MasterDetailLayoutImpl","sideProp","collapsedProp","props","rootRef","useRef","internalSide","setInternalSide","useState","persistKey","previousSidePropRef","onSideChange","size","setSize","persisted","clamp","defaultSize","minSize","maxSize","containerWidth","setContainerWidth","internalCollapsed","setInternalCollapsed","collapsed","handleCollapseToggle","useCallback","onCollapseChange","next","showCollapseToggle","collapsible","divider","useEffect","handleSideToggle","useLayoutEffect","el","ob","entry","entries","draggingRef","dragging","setDragging","dragStartRef","dragHandleRef","finishDrag","handle","updateState","onBlur","handlePointerDown","resizable","handlePointerMove","dx","delta","previous","handlePointerUp","handleResizeKeyDown","step","direction","isResponsive","responsiveBreakpoint","prevIsResponsiveRef","onResponsiveChange","rootStyle","gap","style","masterPaneContext","useMemo","sideSwitchable","detailPaneContext","masterContent","PaneContext","master","detailContent","detail","masterBaseStyle","bordered","detailBaseStyle","detailVisible","showDetail","responsiveActive","onMasterBack","masterBackLabel","onBack","collapseToggleBtn","masterStyle","dividerEl","_jsx","SideToggle","context","useContext","Tooltip","Button","ArrowLeftRight","Header","paneContext","showSideToggle","className","extra","Body","ScrollArea","scroll","createContext"],"ignoreList":[0],"sources":["../../../../node_modules/lucide-react/dist/esm/icons/arrow-left-right.mjs","../../src/components/MasterDetailLayout.tsx"],"sourcesContent":[null,"import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties, KeyboardEvent as ReactKeyboardEvent, PointerEvent as ReactPointerEvent, ReactNode } from 'react';\nimport { Button, Tooltip } from \"@/ui\";\nimport { ArrowLeftRight } from 'lucide-react';\nimport { clamp } from '@fudanda/shared/core';\nimport ScrollArea from './ScrollArea';\nimport \"@/components/MasterDetailLayout.css\";\ntype Side = 'left' | 'right';\ninterface PaneContextValue {\n pane: 'master' | 'detail';\n side: Side;\n sideSwitchable: boolean;\n isResponsive: boolean;\n toggleSide: () => void;\n}\nconst PaneContext = createContext<PaneContextValue | null>(null);\n/** 响应式单栏模式下的返回条,master / detail 两侧共用 */\nfunction ResponsiveBackBar({ onClick, label }: Readonly<{\n onClick: () => void;\n label: ReactNode;\n}>) {\n return (<button type=\"button\" onClick={onClick} style={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 12px',\n background: 'transparent',\n border: 0,\n borderBottomColor: 'var(--arc-antd-color-border)',\n borderBottomStyle: 'solid',\n borderBottomWidth: 1,\n cursor: 'pointer',\n color: 'var(--arc-antd-color-text-2)',\n fontSize: 13,\n minHeight: 40,\n boxSizing: 'border-box',\n width: '100%',\n }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"15 18 9 12 15 6\"/>\n </svg>\n {label}\n </button>);\n}\ninterface MasterDetailLayoutProps {\n readonly master: ReactNode;\n detail: ReactNode;\n /** 主侧位置,默认 'left';配合 onSideChange 时作为受控值 */\n side?: Side;\n /** 是否允许用户在桌面端调换主侧位置,默认 true */\n sideSwitchable?: boolean;\n /** 主侧位置变化回调;提供后由调用方更新 side */\n onSideChange?: (side: Side) => void;\n /** 主侧默认宽(px) */\n defaultSize?: number;\n minSize?: number;\n maxSize?: number;\n /** 是否可拖拽调整宽度,默认 true */\n resizable?: boolean;\n /** 设置后宽度持久化到 localStorage,key 为 `mdLayout.${persistKey}` */\n persistKey?: string;\n /** 两栏间距 px,默认 0 */\n gap?: number;\n /** 两侧各自加 1px 边框 + 圆角,默认 false */\n bordered?: boolean;\n /** 是否显示分隔线/分隔条,默认 true */\n divider?: boolean;\n /** 受控折叠状态:为 true 时主侧隐藏 */\n collapsed?: boolean;\n /** 折叠状态变化回调,提供后分隔线上会显示折叠/展开图标按钮 */\n onCollapseChange?: (collapsed: boolean) => void;\n /**\n * 启用内置折叠功能,分隔线上展示折叠按鈕。\n * 无需外部传入 collapsed/onCollapseChange,组件自管内部状态。\n */\n collapsible?: boolean;\n /**\n * 容器宽度小于此值时切换到单栏模式(移动端样式),默认 720。\n * 传 0 或 undefined 可禁用响应式,传极大值(如 99999)可强制单栏。\n *\n * 取 720 而非 768:断点比较的是容器宽度而非视口宽度,后台内容区还要\n * 扣除侧边栏。实测 992px 视口下容器仅 776px,若阈值取 768 只剩 8px 余量,\n * 用户略微缩窄窗口就会让桌面端意外掉入单栏;720 保留约 56px 余量。\n */\n responsiveBreakpoint?: number;\n /**\n * 响应式单栏模式下是否显示 detail 侧(优先级高于 responsiveActive)。\n * 通常与 onBack 配合:有选中项时传 true,onBack 重置选中项。\n */\n showDetail?: boolean;\n /**\n * 响应式返回回调:提供后,在响应式 detail 模式下自动显示返回按钮。\n * 点击时调用此回调,组件本身不管理状态。\n */\n onBack?: () => void;\n /**\n * 响应式 master 模式下的返回回调(master → detail)。\n *\n * 适用于「侧栏是筛选树、detail 才是页面主体」的场景(如用户管理的部门树):\n * 此类页面窄屏默认展示 detail,用户主动切到 master 后需要退回主体内容。\n * 与 onBack 分开是因为「列表 → 详情」型页面的 master 是根视图,不应出现返回。\n */\n onMasterBack?: () => void;\n /** onMasterBack 返回条的文案,默认「返回」 */\n masterBackLabel?: ReactNode;\n /**\n * 建议改用 showDetail。单栏模式下当前激活的面板('master' | 'detail'),默认 'master'。\n */\n responsiveActive?: 'master' | 'detail';\n /**\n * 容器进入/退出响应式单栏模式时触发,参数为 isResponsive。\n * 可用于父组件按需显示/隐藏与布局状态绑定的 UI。\n */\n onResponsiveChange?: (isResponsive: boolean) => void;\n className?: string;\n style?: CSSProperties;\n}\nconst STORAGE_PREFIX = 'mdLayout.';\nfunction readPersisted(key: string | undefined): number | null {\n if (!key)\n return null;\n try {\n const v = localStorage.getItem(STORAGE_PREFIX + key);\n if (!v)\n return null;\n const n = Number(v);\n return Number.isFinite(n) ? n : null;\n }\n catch {\n return null;\n }\n}\nfunction writePersisted(key: string | undefined, value: number) {\n if (!key)\n return;\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(value));\n }\n catch { /* No additional action. */ }\n}\nfunction readPersistedSide(key: string | undefined): Side | null {\n if (!key)\n return null;\n try {\n const value = localStorage.getItem(`${STORAGE_PREFIX}${key}.side`);\n return value === 'left' || value === 'right' ? value : null;\n }\n catch {\n return null;\n }\n}\nfunction writePersistedSide(key: string | undefined, side: Side) {\n if (!key)\n return;\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${key}.side`, side);\n }\n catch { /* No additional action. */ }\n}\nfunction MasterDetailLayoutImpl(props: Readonly<MasterDetailLayoutProps>) {\n const { master, detail, side: sideProp, sideSwitchable = true, onSideChange, defaultSize = 260, minSize = 180, maxSize = 600, resizable = true, persistKey, gap = 0, bordered = false, divider = true, collapsed: collapsedProp, onCollapseChange, collapsible = true, responsiveBreakpoint = 720, showDetail, onBack, onMasterBack, masterBackLabel = '返回', responsiveActive, className, style } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [internalSide, setInternalSide] = useState<Side>(() => readPersistedSide(persistKey) ?? sideProp ?? 'left');\n const previousSidePropRef = useRef(sideProp);\n const side = onSideChange ? (sideProp ?? internalSide) : internalSide;\n const [size, setSize] = useState<number>(() => {\n const persisted = readPersisted(persistKey);\n return clamp(persisted ?? defaultSize, minSize, maxSize);\n });\n const [containerWidth, setContainerWidth] = useState<number>(0);\n // 内部折叠状态(collapsible 模式下使用)\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n // 最终折叠状态:collapsedProp 优先(受控),否则用内部状态\n const collapsed = collapsedProp ?? internalCollapsed;\n // 切换折叠状态\n const handleCollapseToggle = useCallback((next: boolean) => {\n if (onCollapseChange) {\n onCollapseChange(next);\n }\n else {\n setInternalCollapsed(next);\n }\n }, [onCollapseChange]);\n const showCollapseToggle = (collapsible || !!onCollapseChange) && divider;\n useEffect(() => {\n if (previousSidePropRef.current === sideProp)\n return;\n previousSidePropRef.current = sideProp;\n if (sideProp !== undefined && !onSideChange)\n setInternalSide(sideProp);\n }, [onSideChange, sideProp]);\n const handleSideToggle = useCallback(() => {\n const next = side === 'left' ? 'right' : 'left';\n if (onSideChange)\n onSideChange(next);\n else\n setInternalSide(next);\n writePersistedSide(persistKey, next);\n }, [onSideChange, persistKey, side]);\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el)\n return;\n setContainerWidth(el.clientWidth);\n if (typeof ResizeObserver === 'undefined')\n return;\n const ob = new ResizeObserver((entries) => {\n for (const entry of entries)\n setContainerWidth(Math.floor(entry.contentRect.width));\n });\n ob.observe(el);\n return () => ob.disconnect();\n }, []);\n const draggingRef = useRef(false);\n const [dragging, setDragging] = useState(false);\n const dragStartRef = useRef({ x: 0, size: 0, currentSize: 0 });\n const dragHandleRef = useRef<{\n element: HTMLDivElement;\n pointerId: number;\n cursor: string;\n userSelect: string;\n } | null>(null);\n const finishDrag = useCallback((updateState = true) => {\n if (!draggingRef.current)\n return;\n draggingRef.current = false;\n const handle = dragHandleRef.current;\n dragHandleRef.current = null;\n if (handle) {\n try {\n handle.element.releasePointerCapture(handle.pointerId);\n }\n catch { /* capture may already be released */ } /* No additional action. */\n document.body.style.cursor = handle.cursor;\n document.body.style.userSelect = handle.userSelect;\n }\n writePersisted(persistKey, dragStartRef.current.currentSize);\n if (updateState)\n setDragging(false);\n }, [persistKey]);\n useEffect(() => {\n const onBlur = () => finishDrag();\n window.addEventListener('blur', onBlur);\n return () => {\n window.removeEventListener('blur', onBlur);\n finishDrag(false);\n };\n }, [finishDrag]);\n const handlePointerDown = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n if (!resizable || e.button !== 0 || draggingRef.current)\n return;\n e.preventDefault();\n draggingRef.current = true;\n setDragging(true);\n dragStartRef.current = { x: e.clientX, size, currentSize: size };\n dragHandleRef.current = { element: e.currentTarget, pointerId: e.pointerId, cursor: document.body.style.cursor, userSelect: document.body.style.userSelect };\n e.currentTarget.setPointerCapture(e.pointerId);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, [resizable, size]);\n const handlePointerMove = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current)\n return;\n const dx = e.clientX - dragStartRef.current.x;\n const delta = side === 'left' ? dx : -dx;\n const next = clamp(dragStartRef.current.size + delta, minSize, maxSize);\n dragStartRef.current.currentSize = next;\n setSize(previous => previous === next ? previous : next);\n }, [side, minSize, maxSize]);\n const handlePointerUp = useCallback(() => finishDrag(), [finishDrag]);\n const handleResizeKeyDown = useCallback((e: ReactKeyboardEvent<HTMLDivElement>) => {\n if (draggingRef.current)\n return;\n let next: number;\n const step = e.shiftKey ? 50 : 10;\n const direction = side === 'left' ? 1 : -1;\n if (e.key === 'ArrowLeft')\n next = size - step * direction;\n else if (e.key === 'ArrowRight')\n next = size + step * direction;\n else if (e.key === 'Home')\n next = minSize;\n else if (e.key === 'End')\n next = maxSize;\n else\n return;\n e.preventDefault();\n e.stopPropagation();\n setSize(clamp(next, minSize, maxSize));\n }, [maxSize, minSize, side, size]);\n // 持久化(拖拽中每次 pointermove 都会更新 size,此处跳过等 PointerUp 一次性落盘;\n // 仅覆盖非拖拽来源的 size 变化)\n useEffect(() => {\n if (!persistKey)\n return;\n if (draggingRef.current)\n return;\n writePersisted(persistKey, size);\n }, [persistKey, size]);\n const isResponsive = responsiveBreakpoint > 0 && containerWidth > 0 && containerWidth < responsiveBreakpoint;\n const { onResponsiveChange } = props;\n const prevIsResponsiveRef = useRef<boolean | null>(null);\n useEffect(() => {\n if (containerWidth === 0)\n return; // 初始化未完成,跳过\n if (prevIsResponsiveRef.current === isResponsive)\n return;\n prevIsResponsiveRef.current = isResponsive;\n onResponsiveChange?.(isResponsive);\n }, [isResponsive, containerWidth, onResponsiveChange]);\n const rootStyle: CSSProperties = {\n display: 'flex',\n flexDirection: side === 'left' ? 'row' : 'row-reverse',\n height: '100%',\n width: '100%',\n overflow: 'hidden',\n gap: gap > 0 ? gap : undefined,\n ...style,\n };\n // context value 保持稳定身份:布局因内部状态(拖拽 resize、容器宽度)高频重渲染时,\n // 避免 Header/SideToggle 等 consumer 跟着无谓重渲染\n const masterPaneContext = useMemo<PaneContextValue>(() => ({\n pane: 'master',\n side,\n sideSwitchable,\n isResponsive,\n toggleSide: handleSideToggle,\n }), [side, sideSwitchable, isResponsive, handleSideToggle]);\n const detailPaneContext = useMemo<PaneContextValue>(() => ({\n pane: 'detail',\n side,\n sideSwitchable,\n isResponsive,\n toggleSide: handleSideToggle,\n }), [side, sideSwitchable, isResponsive, handleSideToggle]);\n const masterContent = (<PaneContext.Provider value={masterPaneContext}>\n {master}\n </PaneContext.Provider>);\n const detailContent = (<PaneContext.Provider value={detailPaneContext}>\n {detail}\n </PaneContext.Provider>);\n const masterBaseStyle: CSSProperties = {\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n ...(bordered\n ? {\n border: '1px solid var(--arc-antd-color-border)',\n borderRadius: 'var(--arc-antd-border-radius-medium)',\n background: 'var(--surface-card)',\n }\n : null),\n };\n const detailBaseStyle: CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n ...(bordered\n ? {\n border: '1px solid var(--arc-antd-color-border)',\n borderRadius: 'var(--arc-antd-border-radius-medium)',\n background: 'var(--surface-card)',\n }\n : null),\n };\n // 响应式:单栏模式\n if (isResponsive) {\n // showDetail 优先;否则降级到旧的 responsiveActive\n const detailVisible = showDetail ?? (responsiveActive === 'detail');\n return (<div ref={rootRef} className={className} style={rootStyle}>\n <div style={{ ...masterBaseStyle, width: '100%', display: detailVisible ? 'none' : 'flex' }}>\n {!detailVisible && onMasterBack && (<ResponsiveBackBar onClick={onMasterBack} label={masterBackLabel}/>)}\n {masterContent}\n </div>\n <div style={{ ...detailBaseStyle, display: detailVisible ? 'flex' : 'none' }}>\n {detailVisible && onBack && <ResponsiveBackBar onClick={onBack} label=\"返回\"/>}\n {detailContent}\n </div>\n </div>);\n }\n // 箭头跟随侧栏位置,折叠后始终保留展开入口。\n const showLeftChevron = side === 'left' ? !collapsed : collapsed;\n const collapseToggleBtn = showCollapseToggle ? (<button type=\"button\" onClick={(e) => { e.stopPropagation(); handleCollapseToggle(!collapsed); }} onPointerDown={(e) => e.stopPropagation()} title={`${collapsed ? '展开' : '收起'}${side === 'left' ? '左侧' : '右侧'}面板`} aria-label={`${collapsed ? '展开' : '收起'}${side === 'left' ? '左侧' : '右侧'}面板`} aria-expanded={!collapsed} className=\"arc-msdl-divider__toggle\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {showLeftChevron\n ? <polyline points=\"15 18 9 12 15 6\"/>\n : <polyline points=\"9 18 15 12 9 6\"/>}\n </svg>\n </button>) : null;\n const masterStyle: CSSProperties = {\n ...masterBaseStyle,\n width: collapsed ? 0 : size,\n display: collapsed ? 'none' : 'flex',\n };\n const dividerEl = divider && (!collapsed || showCollapseToggle) ? (<div className={`arc-msdl-divider${collapsed ? ' arc-msdl-divider--collapsed' : ''}${bordered ? ' arc-msdl-divider--bordered' : ''}`} data-dragging={dragging || undefined} style={{\n width: collapsed ? 28 : bordered ? Math.max(gap, 1) : 1,\n ...(bordered && gap > 0 ? { marginLeft: -gap, marginRight: -gap } : null),\n }}>\n <span className=\"arc-msdl-divider__line\" aria-hidden=\"true\"/>\n {resizable && !collapsed && (<div className=\"arc-msdl-divider__resize\" role=\"separator\" aria-label=\"调整侧栏宽度\" aria-orientation=\"vertical\" aria-valuemin={minSize} aria-valuemax={maxSize} aria-valuenow={size} tabIndex={0} onKeyDown={handleResizeKeyDown} onPointerDown={handlePointerDown} onPointerMove={handlePointerMove} onPointerUp={handlePointerUp} onPointerCancel={handlePointerUp} onLostPointerCapture={handlePointerUp}/>)}\n {collapseToggleBtn}\n </div>) : null;\n const masterEl = <div style={masterStyle}>{masterContent}</div>;\n const detailEl = <div style={detailBaseStyle}>{detailContent}</div>;\n return (<div ref={rootRef} className={className} style={rootStyle}>\n {masterEl}\n {dividerEl}\n {detailEl}\n </div>);\n}\ninterface HeaderProps {\n readonly children?: ReactNode;\n readonly extra?: ReactNode;\n readonly className?: string;\n readonly style?: CSSProperties;\n}\nfunction SideToggle() {\n const context = useContext(PaneContext);\n if (!context || context.pane !== 'master' || !context.sideSwitchable || context.isResponsive)\n return null;\n const target = context.side === 'left' ? '右侧' : '左侧';\n const label = `将侧栏移到${target}`;\n // 双向箭头:明确表达“左右换边”,避免 Panel 风格图标被误读为“折叠/收起侧栏”\n return (<Tooltip content={label} position=\"bottom\">\n <Button size=\"small\" theme=\"borderless\" type=\"tertiary\" icon={<ArrowLeftRight size={14}/>} aria-label={label} onClick={context.toggleSide}/>\n </Tooltip>);\n}\nfunction Header({ children, extra, className, style }: HeaderProps) {\n const paneContext = useContext(PaneContext);\n const showSideToggle = paneContext?.pane === 'master'\n && paneContext.sideSwitchable\n && !paneContext.isResponsive;\n return (<div className={className ? `msdl-header ${className}` : 'msdl-header'} style={{\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n padding: '8px 12px',\n borderBottom: '1px solid var(--arc-antd-color-border)',\n minHeight: 44,\n boxSizing: 'border-box',\n ...style,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0, flex: 1 }}>{children}</div>\n {extra || showSideToggle ? (<div style={{ flexShrink: 0, display: 'flex', alignItems: 'center', gap: 8 }}>\n {extra}\n {showSideToggle ? <SideToggle /> : null}\n </div>) : null}\n </div>);\n}\ninterface BodyProps {\n readonly children?: ReactNode;\n /** auto: overflow auto(默认);hidden: overflow hidden(内部自管滚动);visible: overflow visible */\n readonly scroll?: 'auto' | 'hidden' | 'visible';\n readonly padding?: number | string;\n readonly className?: string;\n readonly style?: CSSProperties;\n}\nfunction Body({ children, scroll = 'auto', padding, className, style }: BodyProps) {\n // Keep one viewport and React subtree when a page switches between a table and statistics.\n return (<ScrollArea horizontal scroll={scroll} tabIndex={scroll === 'auto' ? 0 : -1} className={className ? `msdl-body ${className}` : 'msdl-body'} style={{\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n overflow: scroll,\n padding,\n boxSizing: 'border-box',\n ...style,\n }}>\n {children}\n </ScrollArea>);\n}\nexport const MasterDetailLayout = Object.assign(MasterDetailLayoutImpl, {\n Header,\n Body,\n SideToggle,\n});\nexport type { MasterDetailLayoutProps };\n"]}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-Bruge11p.js";import{E as t,M as n,b as r,f as i,m as a}from"./clipboard-dpqHdCyy.js";import{n as o,t as s}from"./SettingModuleDetail-I9CSJ-fh.js";import{jsx as c,jsxs as l}from"react/jsx-runtime";import{usePermission as u}from"@fudanda/admin-antd/core/hooks/usePermission";import{useSettingsModules as d}from"@fudanda/admin-antd/core/hooks/queries/settings";function f(){let{hasPermission:e}=u();return e(`system:setting:view`)?/* @__PURE__ */ c(p,{canWrite:e(`system:setting:update`)}):/* @__PURE__ */ c(`div`,{className:`page-container`,children:/* @__PURE__ */ c(r,{description:`无访问权限`})})}function p({canWrite:e}){let n=d();if(n.isLoading)return/* @__PURE__ */ c(`div`,{className:`page-container`,"aria-busy":`true`,"aria-label":`正在加载 MCP 设置`,children:/* @__PURE__ */ c(t,{})});if(n.error)return/* @__PURE__ */ c(`div`,{className:`page-container`,children:/* @__PURE__ */ c(i,{type:`danger`,closeIcon:null,description:/* @__PURE__ */ l(`span`,{children:[`MCP 设置加载失败。`,/* @__PURE__ */ c(a,{onClick:()=>void n.refetch(),children:`重试`})]})})});let o=n.data?.find(e=>e.module===`mcp`);return o?/* @__PURE__ */ c(`div`,{className:`page-container page-container--stretch`,children:/* @__PURE__ */ c(s,{module:`mcp`,meta:{...o,page:void 0,canWrite:o.canWrite&&e}})}):/* @__PURE__ */ c(`div`,{className:`page-container`,children:/* @__PURE__ */ c(r,{description:`当前宿主未提供 MCP 设置`})})}function m(){return(m=e((()=>{n(),o()})))()}m();export{f as default};
2
- //# sourceMappingURL=McpSettingsPage-Cdej9Evi.js.map
1
+ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{E as t,M as n,b as r,f as i,m as a}from"./clipboard-dpqHdCyy.js";import{n as o,t as s}from"./SettingModuleDetail-BjxUJeH5.js";import{jsx as c,jsxs as l}from"react/jsx-runtime";import{usePermission as u}from"@fudanda/admin-antd/core/hooks/usePermission";import{useSettingsModules as d}from"@fudanda/admin-antd/core/hooks/queries/settings";function f(){let{hasPermission:e}=u();return e(`system:setting:view`)?/* @__PURE__ */ c(p,{canWrite:e(`system:setting:update`)}):/* @__PURE__ */ c(`div`,{className:`page-container`,children:/* @__PURE__ */ c(r,{description:`无访问权限`})})}function p({canWrite:e}){let n=d();if(n.isLoading)return/* @__PURE__ */ c(`div`,{className:`page-container`,"aria-busy":`true`,"aria-label":`正在加载 MCP 设置`,children:/* @__PURE__ */ c(t,{})});if(n.error)return/* @__PURE__ */ c(`div`,{className:`page-container`,children:/* @__PURE__ */ c(i,{type:`danger`,closeIcon:null,description:/* @__PURE__ */ l(`span`,{children:[`MCP 设置加载失败。`,/* @__PURE__ */ c(a,{onClick:()=>void n.refetch(),children:`重试`})]})})});let o=n.data?.find(e=>e.module===`mcp`);return o?/* @__PURE__ */ c(`div`,{className:`page-container page-container--stretch`,children:/* @__PURE__ */ c(s,{module:`mcp`,meta:{...o,page:void 0,canWrite:o.canWrite&&e}})}):/* @__PURE__ */ c(`div`,{className:`page-container`,children:/* @__PURE__ */ c(r,{description:`当前宿主未提供 MCP 设置`})})}function m(){return(m=e((()=>{n(),o()})))()}m();export{f as default};
2
+ //# sourceMappingURL=McpSettingsPage-C5V_rj2V.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpSettingsPage-Cdej9Evi.js","mappings":"4YAKA,SAAwBA,GAAkB,CACtC,GAAM,CAAE,iBAAkBC,EAAc,EAGxC,OAFKC,EAAc,qBAAqB,EAEjC,kBAACC,EAAD,CAAoB,SAAUD,EAAc,uBAAuB,CAAI,GADnE,kBAAC,MAAD,CAAK,UAAU,iBAAiB,2BAACE,EAAD,CAAO,YAAY,OAAS,EAAM,EAEjF,CAEA,SAASD,EAAmB,CAAE,YAAmC,CAC7D,IAAME,EAAUC,EAAmB,EACnC,GAAID,EAAQ,UACR,MAAO,kBAAC,MAAD,CAAK,UAAU,iBAAiB,YAAU,OAAO,aAAW,cAAc,2BAACE,EAAD,CAAO,EAAM,GAClG,GAAIF,EAAQ,MACR,MAAO,kBAAC,MAAD,CAAK,UAAU,iBAAiB,2BAACG,EAAD,CAAQ,KAAK,SAAS,UAAW,KAAM,YAAa,kBAAC,OAAD,WAAM,cAAW,kBAACC,EAAD,CAAQ,YAAe,KAAKJ,EAAQ,QAAQ,EAAG,aAAU,EAAO,GAAI,EAAM,GAC1L,IAAMK,EAAOL,EAAQ,MAAM,KAAK,GAAQM,EAAK,SAAW,KAAK,EAG7D,OAFKD,EAEE,kBAAC,MAAD,CAAK,UAAU,yCACpB,2BAACE,EAAD,CAAqB,OAAO,MAAM,KAAM,CAAE,GAAGF,EAAM,KAAM,OAAW,SAAUA,EAAK,UAAYG,CAAS,CAAI,EACzG,GAHM,kBAAC,MAAD,CAAK,UAAU,iBAAiB,2BAACT,EAAD,CAAO,YAAY,gBAAkB,EAAM,EAI1F,C","names":["McpSettingsPage","usePermission","hasPermission","McpSettingsContent","Empty","modules","useSettingsModules","Spin","Banner","Button","meta","item","SettingModuleDetail","canWrite"],"ignoreList":[],"sources":["../../src/pages/system/mcp/McpSettingsPage.tsx"],"sourcesContent":["import { Banner, Button, Empty, Spin } from '@/ui';\nimport { usePermission } from '@fudanda/react-core/hooks/usePermission';\nimport { useSettingsModules } from '@fudanda/react-core/hooks/queries/settings';\nimport { SettingModuleDetail } from '../settings/SettingModuleDetail';\n\nexport default function McpSettingsPage() {\n const { hasPermission } = usePermission();\n if (!hasPermission('system:setting:view'))\n return <div className=\"page-container\"><Empty description=\"无访问权限\" /></div>;\n return <McpSettingsContent canWrite={hasPermission('system:setting:update')} />;\n}\n\nfunction McpSettingsContent({ canWrite }: { canWrite: boolean }) {\n const modules = useSettingsModules();\n if (modules.isLoading)\n return <div className=\"page-container\" aria-busy=\"true\" aria-label=\"正在加载 MCP 设置\"><Spin /></div>;\n if (modules.error)\n return <div className=\"page-container\"><Banner type=\"danger\" closeIcon={null} description={<span>MCP 设置加载失败。<Button onClick={() => void modules.refetch()}>重试</Button></span>} /></div>;\n const meta = modules.data?.find(item => item.module === 'mcp');\n if (!meta)\n return <div className=\"page-container\"><Empty description=\"当前宿主未提供 MCP 设置\" /></div>;\n return <div className=\"page-container page-container--stretch\">\n <SettingModuleDetail module=\"mcp\" meta={{ ...meta, page: undefined, canWrite: meta.canWrite && canWrite }} />\n </div>;\n}\n"]}
1
+ {"version":3,"file":"McpSettingsPage-C5V_rj2V.js","mappings":"4YAKA,SAAwBA,GAAkB,CACtC,GAAM,CAAE,iBAAkBC,EAAc,EAGxC,OAFKC,EAAc,qBAAqB,EAEjC,kBAACC,EAAD,CAAoB,SAAUD,EAAc,uBAAuB,CAAI,GADnE,kBAAC,MAAD,CAAK,UAAU,iBAAiB,2BAACE,EAAD,CAAO,YAAY,OAAS,EAAM,EAEjF,CAEA,SAASD,EAAmB,CAAE,YAAmC,CAC7D,IAAME,EAAUC,EAAmB,EACnC,GAAID,EAAQ,UACR,MAAO,kBAAC,MAAD,CAAK,UAAU,iBAAiB,YAAU,OAAO,aAAW,cAAc,2BAACE,EAAD,CAAO,EAAM,GAClG,GAAIF,EAAQ,MACR,MAAO,kBAAC,MAAD,CAAK,UAAU,iBAAiB,2BAACG,EAAD,CAAQ,KAAK,SAAS,UAAW,KAAM,YAAa,kBAAC,OAAD,WAAM,cAAW,kBAACC,EAAD,CAAQ,YAAe,KAAKJ,EAAQ,QAAQ,EAAG,aAAU,EAAO,GAAI,EAAM,GAC1L,IAAMK,EAAOL,EAAQ,MAAM,KAAK,GAAQM,EAAK,SAAW,KAAK,EAG7D,OAFKD,EAEE,kBAAC,MAAD,CAAK,UAAU,yCACpB,2BAACE,EAAD,CAAqB,OAAO,MAAM,KAAM,CAAE,GAAGF,EAAM,KAAM,OAAW,SAAUA,EAAK,UAAYG,CAAS,CAAI,EACzG,GAHM,kBAAC,MAAD,CAAK,UAAU,iBAAiB,2BAACT,EAAD,CAAO,YAAY,gBAAkB,EAAM,EAI1F,C","names":["McpSettingsPage","usePermission","hasPermission","McpSettingsContent","Empty","modules","useSettingsModules","Spin","Banner","Button","meta","item","SettingModuleDetail","canWrite"],"ignoreList":[],"sources":["../../src/pages/system/mcp/McpSettingsPage.tsx"],"sourcesContent":["import { Banner, Button, Empty, Spin } from '@/ui';\nimport { usePermission } from '@fudanda/react-core/hooks/usePermission';\nimport { useSettingsModules } from '@fudanda/react-core/hooks/queries/settings';\nimport { SettingModuleDetail } from '../settings/SettingModuleDetail';\n\nexport default function McpSettingsPage() {\n const { hasPermission } = usePermission();\n if (!hasPermission('system:setting:view'))\n return <div className=\"page-container\"><Empty description=\"无访问权限\" /></div>;\n return <McpSettingsContent canWrite={hasPermission('system:setting:update')} />;\n}\n\nfunction McpSettingsContent({ canWrite }: { canWrite: boolean }) {\n const modules = useSettingsModules();\n if (modules.isLoading)\n return <div className=\"page-container\" aria-busy=\"true\" aria-label=\"正在加载 MCP 设置\"><Spin /></div>;\n if (modules.error)\n return <div className=\"page-container\"><Banner type=\"danger\" closeIcon={null} description={<span>MCP 设置加载失败。<Button onClick={() => void modules.refetch()}>重试</Button></span>} /></div>;\n const meta = modules.data?.find(item => item.module === 'mcp');\n if (!meta)\n return <div className=\"page-container\"><Empty description=\"当前宿主未提供 MCP 设置\" /></div>;\n return <div className=\"page-container page-container--stretch\">\n <SettingModuleDetail module=\"mcp\" meta={{ ...meta, page: undefined, canWrite: meta.canWrite && canWrite }} />\n </div>;\n}\n"]}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-Bruge11p.js";import{E as t,M as n,a as r,b as i,i as a}from"./clipboard-dpqHdCyy.js";import{i as o,r as s}from"./feedback-B1UL2ETz.js";import{n as c,t as l}from"./users-BTMhbl7C.js";import{i as u,n as d,r as f,t as p}from"./UserTransferSelect-ChLj4EkS.js";import{jsx as m,jsxs as h}from"react/jsx-runtime";function g({title:e,visible:n,onCancel:r,users:c,value:u,onChange:d,departments:f,loading:g,canSave:_=!0,saveLoading:v,onSave:y,width:b=720,emptyTitle:x=`暂无用户`,emptyDescription:S=`请先创建用户`}){return/* @__PURE__ */ m(s,{title:/* @__PURE__ */ h(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:8},children:[/* @__PURE__ */ m(l,{size:16}),/* @__PURE__ */ m(`span`,{children:e})]}),visible:n,onCancel:r,width:b,footer:/* @__PURE__ */ m(a,{onCancel:r,onOk:async()=>{await y(),o.success(`保存成功`)},okText:`保存`,loading:v,disabled:!_}),children:g?/* @__PURE__ */ m(`div`,{style:{display:`flex`,justifyContent:`center`,padding:40},children:/* @__PURE__ */ m(t,{})}):c.length===0?/* @__PURE__ */ m(i,{title:x,description:S}):/* @__PURE__ */ m(p,{dataSource:c,value:u,onChange:d,departments:f})})}function _({title:e=`成员`,dataIndex:t,width:n,getPreview:r,getCount:i,getScope:a}){return{title:e,dataIndex:t,...n===void 0?{}:{width:n},render:(e,t)=>/* @__PURE__ */ m(f,{preview:r(t),count:i(t),scope:a?.(t)})}}function v(){return(v=e((()=>{n(),c(),u(),d(),r()})))()}export{v as n,_ as r,g as t};
2
- //# sourceMappingURL=MemberAssignmentSheet-AKvLbbYW.js.map
1
+ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{E as t,M as n,a as r,b as i,i as a}from"./clipboard-dpqHdCyy.js";import{i as o,r as s}from"./feedback-B1UL2ETz.js";import{n as c,t as l}from"./users-BTMhbl7C.js";import{i as u,n as d,r as f,t as p}from"./UserTransferSelect-C8betaWG.js";import{jsx as m,jsxs as h}from"react/jsx-runtime";function g({title:e,visible:n,onCancel:r,users:c,value:u,onChange:d,departments:f,loading:g,canSave:_=!0,saveLoading:v,onSave:y,width:b=720,emptyTitle:x=`暂无用户`,emptyDescription:S=`请先创建用户`}){return/* @__PURE__ */ m(s,{title:/* @__PURE__ */ h(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:8},children:[/* @__PURE__ */ m(l,{size:16}),/* @__PURE__ */ m(`span`,{children:e})]}),visible:n,onCancel:r,width:b,footer:/* @__PURE__ */ m(a,{onCancel:r,onOk:async()=>{await y(),o.success(`保存成功`)},okText:`保存`,loading:v,disabled:!_}),children:g?/* @__PURE__ */ m(`div`,{style:{display:`flex`,justifyContent:`center`,padding:40},children:/* @__PURE__ */ m(t,{})}):c.length===0?/* @__PURE__ */ m(i,{title:x,description:S}):/* @__PURE__ */ m(p,{dataSource:c,value:u,onChange:d,departments:f})})}function _({title:e=`成员`,dataIndex:t,width:n,getPreview:r,getCount:i,getScope:a}){return{title:e,dataIndex:t,...n===void 0?{}:{width:n},render:(e,t)=>/* @__PURE__ */ m(f,{preview:r(t),count:i(t),scope:a?.(t)})}}function v(){return(v=e((()=>{n(),c(),u(),d(),r()})))()}export{v as n,_ as r,g as t};
2
+ //# sourceMappingURL=MemberAssignmentSheet-DL0fg1Yf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemberAssignmentSheet-AKvLbbYW.js","names":["__esmMin","Spin","init_ui","init_ModalFooter","Empty","ModalFooter","Toast","SideSheet","init_users","Users","init_UserPreviewCell","init_UserTransferSelect","UserPreviewCell","UserTransferSelect","MemberAssignmentSheet","title","onSave","saveLoading","canSave","loading","users","emptyTitle","emptyDescription","memberPreviewColumn","width","getPreview","record","getCount","getScope","init_MemberAssignmentSheet"],"sources":["../../src/components/members/MemberAssignmentSheet.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport type { ReactNode } from 'react';\nimport { Empty, SideSheet, Spin, Toast } from \"@/ui\";\nimport type { ColumnProps, Data } from \"@/ui\";\nimport { Users } from 'lucide-react';\nimport { UserPreviewCell, type UserPreviewItem, type UserPreviewScope } from \"@/components/UserPreviewCell\";\nimport { UserTransferSelect, type UserTransferUser } from \"@/components/UserTransferSelect\";\nimport type { ApiDepartment as Department } from '@fudanda/shared/api/departments';\nimport ModalFooter from \"@/components/ModalFooter\";\nexport interface MemberAssignmentSheetProps<TUser extends UserTransferUser> {\n readonly title: ReactNode;\n readonly visible: boolean;\n readonly onCancel: () => void;\n readonly users: TUser[];\n readonly value: number[];\n readonly onChange: (ids: number[]) => void;\n readonly departments?: Department[];\n readonly loading?: boolean;\n readonly canSave?: boolean;\n readonly saveLoading?: boolean;\n readonly onSave: () => Promise<unknown> | unknown;\n readonly width?: number;\n readonly emptyTitle?: ReactNode;\n readonly emptyDescription?: ReactNode;\n}\n/** 成员分配抽屉:统一标题、候选用户穿梭框与右对齐保存页脚。 */\nexport function MemberAssignmentSheet<TUser extends UserTransferUser>({ title, visible, onCancel, users, value, onChange, departments, loading, canSave = true, saveLoading, onSave, width = 720, emptyTitle = '暂无用户', emptyDescription = '请先创建用户', }: MemberAssignmentSheetProps<TUser>) {\n const handleSave = async () => {\n await onSave();\n Toast.success('保存成功');\n };\n return (<SideSheet title={(<span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>\n <Users size={16}/>\n <span>{title}</span>\n </span>)} visible={visible} onCancel={onCancel} width={width} footer={<ModalFooter onCancel={onCancel} onOk={handleSave} okText=\"保存\" loading={saveLoading} disabled={!canSave}/>}>\n {loading ? (<div style={{ display: 'flex', justifyContent: 'center', padding: 40 }}>\n <Spin />\n </div>) : users.length === 0 ? (<Empty title={emptyTitle} description={emptyDescription}/>) : (<UserTransferSelect dataSource={users} value={value} onChange={onChange} departments={departments}/>)}\n </SideSheet>);\n}\nexport interface MemberPreviewColumnOptions<T extends Data> {\n readonly title?: ReactNode;\n readonly dataIndex: string;\n readonly width?: number;\n readonly getPreview: (record: T) => UserPreviewItem[] | null | undefined;\n readonly getCount: (record: T) => number | null | undefined;\n readonly getScope?: (record: T) => UserPreviewScope | undefined;\n}\n/** 成员预览列:头像组、成员数与按范围查看入口。 */\nexport function memberPreviewColumn<T extends Data>({ title = '成员', dataIndex, width, getPreview, getCount, getScope, }: MemberPreviewColumnOptions<T>): ColumnProps<T> {\n return {\n title,\n dataIndex,\n ...(width === undefined ? {} : { width }),\n render: (_: unknown, record: T) => (<UserPreviewCell preview={getPreview(record)} count={getCount(record)} scope={getScope?.(record)}/>),\n };\n}\n"],"mappings":"A,wVA0BA,SAAgBc,EAAsD,CAAE,QAAO,UAAS,WAAU,QAAO,QAAO,WAAU,cAAa,UAAS,UAAU,GAAM,cAAa,SAAQ,QAAQ,IAAK,aAAa,OAAQ,mBAAmB,UAAgD,CAKtR,MAAQ,kBAACP,EAAD,CAAW,MAAQ,kBAAC,OAAD,CAAM,MAAO,CAAE,QAAS,cAAe,WAAY,SAAU,IAAK,CAAE,EAApE,SAAA,CACrB,kBAACE,EAAD,CAAO,KAAM,EAAI,CAAA,EACjB,kBAAC,OAAD,CAAA,SAAOM,CAAY,CAAA,CACf,C,GAAa,UAAmB,WAAiB,QAAO,OAAQ,kBAACV,EAAD,CAAuB,WAAU,KAAM,SAPlF,CAC3B,MAAMW,EAAO,EACbV,EAAM,QAAQ,MAAM,CACxB,EAI6H,OAAO,KAAK,QAASW,EAAa,SAAU,CAACC,CAAS,CAAA,EAChL,SAAAC,EAAW,kBAAC,MAAD,CAAK,MAAO,CAAE,QAAS,OAAQ,eAAgB,SAAU,QAAS,EAAG,EAC7E,SAAA,kBAAClB,EAAD,CAAO,CAAA,CACJ,CAAA,EAAKmB,EAAM,SAAW,EAAK,kBAAChB,EAAD,CAAO,MAAOiB,EAAY,YAAaC,CAAkB,CAAA,EAAM,kBAACT,EAAD,CAAoB,WAAYO,EAAc,QAAiB,WAAuB,aAAa,CAAA,CAC3L,CAAA,CACf,CAUA,SAAgBG,EAAoC,CAAE,QAAQ,KAAM,YAAW,QAAO,aAAY,WAAU,YAA4D,CACpK,MAAO,CACH,QACA,YACA,GAAIC,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,OAAM,EACvC,QAAS,EAAY,IAAe,kBAACZ,EAAD,CAAiB,QAASa,EAAWC,CAAM,EAAG,MAAOC,EAASD,CAAM,EAAG,MAAOE,IAAWF,CAAM,CAAG,CAAA,CAC1I,CACJ,C"}
1
+ {"version":3,"file":"MemberAssignmentSheet-DL0fg1Yf.js","names":["__esmMin","Spin","init_ui","init_ModalFooter","Empty","ModalFooter","Toast","SideSheet","init_users","Users","init_UserPreviewCell","init_UserTransferSelect","UserPreviewCell","UserTransferSelect","MemberAssignmentSheet","title","onSave","saveLoading","canSave","loading","users","emptyTitle","emptyDescription","memberPreviewColumn","width","getPreview","record","getCount","getScope","init_MemberAssignmentSheet"],"sources":["../../src/components/members/MemberAssignmentSheet.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport type { ReactNode } from 'react';\nimport { Empty, SideSheet, Spin, Toast } from \"@/ui\";\nimport type { ColumnProps, Data } from \"@/ui\";\nimport { Users } from 'lucide-react';\nimport { UserPreviewCell, type UserPreviewItem, type UserPreviewScope } from \"@/components/UserPreviewCell\";\nimport { UserTransferSelect, type UserTransferUser } from \"@/components/UserTransferSelect\";\nimport type { ApiDepartment as Department } from '@fudanda/shared/api/departments';\nimport ModalFooter from \"@/components/ModalFooter\";\nexport interface MemberAssignmentSheetProps<TUser extends UserTransferUser> {\n readonly title: ReactNode;\n readonly visible: boolean;\n readonly onCancel: () => void;\n readonly users: TUser[];\n readonly value: number[];\n readonly onChange: (ids: number[]) => void;\n readonly departments?: Department[];\n readonly loading?: boolean;\n readonly canSave?: boolean;\n readonly saveLoading?: boolean;\n readonly onSave: () => Promise<unknown> | unknown;\n readonly width?: number;\n readonly emptyTitle?: ReactNode;\n readonly emptyDescription?: ReactNode;\n}\n/** 成员分配抽屉:统一标题、候选用户穿梭框与右对齐保存页脚。 */\nexport function MemberAssignmentSheet<TUser extends UserTransferUser>({ title, visible, onCancel, users, value, onChange, departments, loading, canSave = true, saveLoading, onSave, width = 720, emptyTitle = '暂无用户', emptyDescription = '请先创建用户', }: MemberAssignmentSheetProps<TUser>) {\n const handleSave = async () => {\n await onSave();\n Toast.success('保存成功');\n };\n return (<SideSheet title={(<span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>\n <Users size={16}/>\n <span>{title}</span>\n </span>)} visible={visible} onCancel={onCancel} width={width} footer={<ModalFooter onCancel={onCancel} onOk={handleSave} okText=\"保存\" loading={saveLoading} disabled={!canSave}/>}>\n {loading ? (<div style={{ display: 'flex', justifyContent: 'center', padding: 40 }}>\n <Spin />\n </div>) : users.length === 0 ? (<Empty title={emptyTitle} description={emptyDescription}/>) : (<UserTransferSelect dataSource={users} value={value} onChange={onChange} departments={departments}/>)}\n </SideSheet>);\n}\nexport interface MemberPreviewColumnOptions<T extends Data> {\n readonly title?: ReactNode;\n readonly dataIndex: string;\n readonly width?: number;\n readonly getPreview: (record: T) => UserPreviewItem[] | null | undefined;\n readonly getCount: (record: T) => number | null | undefined;\n readonly getScope?: (record: T) => UserPreviewScope | undefined;\n}\n/** 成员预览列:头像组、成员数与按范围查看入口。 */\nexport function memberPreviewColumn<T extends Data>({ title = '成员', dataIndex, width, getPreview, getCount, getScope, }: MemberPreviewColumnOptions<T>): ColumnProps<T> {\n return {\n title,\n dataIndex,\n ...(width === undefined ? {} : { width }),\n render: (_: unknown, record: T) => (<UserPreviewCell preview={getPreview(record)} count={getCount(record)} scope={getScope?.(record)}/>),\n };\n}\n"],"mappings":"A,wVA0BA,SAAgBc,EAAsD,CAAE,QAAO,UAAS,WAAU,QAAO,QAAO,WAAU,cAAa,UAAS,UAAU,GAAM,cAAa,SAAQ,QAAQ,IAAK,aAAa,OAAQ,mBAAmB,UAAgD,CAKtR,MAAQ,kBAACP,EAAD,CAAW,MAAQ,kBAAC,OAAD,CAAM,MAAO,CAAE,QAAS,cAAe,WAAY,SAAU,IAAK,CAAE,EAApE,SAAA,CACrB,kBAACE,EAAD,CAAO,KAAM,EAAI,CAAA,EACjB,kBAAC,OAAD,CAAA,SAAOM,CAAY,CAAA,CACf,C,GAAa,UAAmB,WAAiB,QAAO,OAAQ,kBAACV,EAAD,CAAuB,WAAU,KAAM,SAPlF,CAC3B,MAAMW,EAAO,EACbV,EAAM,QAAQ,MAAM,CACxB,EAI6H,OAAO,KAAK,QAASW,EAAa,SAAU,CAACC,CAAS,CAAA,EAChL,SAAAC,EAAW,kBAAC,MAAD,CAAK,MAAO,CAAE,QAAS,OAAQ,eAAgB,SAAU,QAAS,EAAG,EAC7E,SAAA,kBAAClB,EAAD,CAAO,CAAA,CACJ,CAAA,EAAKmB,EAAM,SAAW,EAAK,kBAAChB,EAAD,CAAO,MAAOiB,EAAY,YAAaC,CAAkB,CAAA,EAAM,kBAACT,EAAD,CAAoB,WAAYO,EAAc,QAAiB,WAAuB,aAAa,CAAA,CAC3L,CAAA,CACf,CAUA,SAAgBG,EAAoC,CAAE,QAAQ,KAAM,YAAW,QAAO,aAAY,WAAU,YAA4D,CACpK,MAAO,CACH,QACA,YACA,GAAIC,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,OAAM,EACvC,QAAS,EAAY,IAAe,kBAACZ,EAAD,CAAiB,QAASa,EAAWC,CAAM,EAAG,MAAOC,EAASD,CAAM,EAAG,MAAOE,IAAWF,CAAM,CAAG,CAAA,CAC1I,CACJ,C"}
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,bt as n,ct as r,lt as i,xt as a}from"./clipboard-dpqHdCyy.js";import{n as o}from"./feedback-B1UL2ETz.js";import{n as s,t as c}from"./clock-BQ6A9QKC.js";import{_ as l,g as u,l as d,u as f}from"./App-CfQx7jWq.js";import{useCallback as p,useEffect as m,useMemo as h,useRef as g,useState as _}from"react";import{Fragment as v,jsx as y,jsxs as b}from"react/jsx-runtime";import{useNavigate as x}from"react-router-dom";import{useIsMobile as S}from"@fudanda/admin-antd/core/hooks/useMediaQuery";import{textMatches as C}from"@fudanda/admin-antd/core/utils/pinyin";import{usePinyinReady as w}from"@fudanda/admin-antd/core/hooks/usePinyinReady";var T,E;function D(){return(D=e((()=>{
1
+ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,bt as n,ct as r,lt as i,xt as a}from"./clipboard-dpqHdCyy.js";import{n as o}from"./feedback-B1UL2ETz.js";import{n as s,t as c}from"./clock-BQ6A9QKC.js";import{_ as l,g as u,l as d,u as f}from"./App-nh6_qOo8.js";import{useCallback as p,useEffect as m,useMemo as h,useRef as g,useState as _}from"react";import{Fragment as v,jsx as y,jsxs as b}from"react/jsx-runtime";import{useNavigate as x}from"react-router-dom";import{useIsMobile as S}from"@fudanda/admin-antd/core/hooks/useMediaQuery";import{textMatches as C}from"@fudanda/admin-antd/core/utils/pinyin";import{usePinyinReady as w}from"@fudanda/admin-antd/core/hooks/usePinyinReady";var T,E;function D(){return(D=e((()=>{
2
2
  /**
3
3
  * @license lucide-react v1.67.0 - ISC
4
4
  *
@@ -6,4 +6,4 @@ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,bt as n,ct as r
6
6
  * See the LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  a(),T={name:`hash`,size:24,node:[[`line`,{x1:`4`,x2:`20`,y1:`9`,y2:`9`,key:`4lhtct`}],[`line`,{x1:`4`,x2:`20`,y1:`15`,y2:`15`,key:`vyu0kd`}],[`line`,{x1:`10`,x2:`8`,y1:`3`,y2:`21`,key:`1ggp8o`}],[`line`,{x1:`16`,x2:`14`,y1:`3`,y2:`21`,key:`weycgp`}]]},T.node,E=n(T)})))()}function O(e,t){if(e.icon){let t=f(e.icon,13);if(t)return t}return y(t?c:E,{size:13})}function k({menus:e,recentMenus:t,onClearRecents:n,onRemoveRecent:i,open:a,onClose:s}){let c=x(),l=S(),d=w(),[f,T]=_(``),[D,k]=_(0),A=g(null),j=g(null),M=h(()=>{if(!f.trim())return[];let t=f.trim().toLowerCase();return e.map((e,n)=>{let r=e.title.toLowerCase(),i=e.breadcrumb.some(e=>C(e,f));return{menu:e,score:r===t?0:r.startsWith(t)?1:r.includes(t)?2:i?3:d?4:5,index:n}}).filter(({menu:e})=>C(e.title,f)||e.breadcrumb.some(e=>C(e,f))).sort((e,t)=>e.score-t.score||e.index-t.index).slice(0,8).map(({menu:e})=>e)},[e,d,f]),N=h(()=>[...M.map(e=>({kind:`menu`,value:e}))],[M]),P=!f.trim(),F=P?t.map(e=>({kind:`menu`,value:e})):N;m(()=>{a&&(T(``),k(0),setTimeout(()=>A.current?.focus(),30))},[a]),m(()=>{k(0)},[f]),m(()=>{(j.current?.querySelector(`[data-search-index="${D}"]`))?.scrollIntoView({block:`nearest`})},[D]);let I=p(e=>{s(),c(e.value.path)},[c,s]),L=p(e=>{if(e.key===`Escape`)s();else if(e.key===`ArrowDown`)e.preventDefault(),k(e=>Math.min(e+1,Math.max(F.length-1,0)));else if(e.key===`ArrowUp`)e.preventDefault(),k(e=>Math.max(e-1,0));else if(e.key===`Enter`){let e=F[D];e&&I(e)}},[F,I,s,D]),R=(e,t,n)=>{let r=t===D,a=e.value.breadcrumb.join(` › `),o=/* @__PURE__ */ b(`button`,{type:`button`,id:`global-search-result-${t}`,role:`option`,"aria-selected":r,"data-search-index":t,onClick:()=>I(e),onMouseEnter:()=>k(t),style:{display:`flex`,alignItems:`center`,gap:10,width:`100%`,padding:n?`8px 44px 8px 16px`:`8px 16px`,border:`none`,background:r?`var(--arc-antd-color-primary-light-default)`:`transparent`,cursor:`pointer`,textAlign:`left`,transition:`background 0.1s`},children:[/* @__PURE__ */ y(`span`,{style:{width:28,height:28,display:`flex`,alignItems:`center`,justifyContent:`center`,flexShrink:0,borderRadius:`var(--arc-antd-border-radius-medium)`,background:r?`var(--arc-antd-color-primary)`:`var(--arc-antd-color-fill-1)`,color:r?`#fff`:`var(--arc-antd-color-primary)`},children:O(e.value,n)}),/* @__PURE__ */ b(`div`,{style:{flex:1,minWidth:0},children:[/* @__PURE__ */ y(`div`,{style:{fontSize:13,fontWeight:500,color:r?`var(--arc-antd-color-primary)`:`var(--arc-antd-color-text-0)`,lineHeight:1.4,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:e.value.title}),a&&/* @__PURE__ */ y(`div`,{style:{fontSize:11,color:`var(--arc-antd-color-text-2)`,lineHeight:1.3,marginTop:1,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:a})]}),r&&/* @__PURE__ */ y(`kbd`,{style:{fontSize:10,color:`var(--arc-antd-color-primary)`,background:`var(--arc-antd-color-primary-light-default)`,border:`1px solid var(--arc-antd-color-primary-light-hover)`,borderRadius:`var(--arc-antd-border-radius-small)`,padding:`1px 5px`,fontFamily:`monospace`,flexShrink:0},children:`↵`})]},`menu-${e.value.id}`);return n?/* @__PURE__ */ b(`div`,{style:{position:`relative`},children:[o,/* @__PURE__ */ y(`button`,{type:`button`,"aria-label":`移除${e.value.title}`,title:`移除最近访问`,onClick:t=>{t.stopPropagation(),i(e.value.id)},style:{position:`absolute`,right:12,top:`50%`,transform:`translateY(-50%)`,display:`flex`,alignItems:`center`,justifyContent:`center`,width:24,height:24,padding:0,border:`none`,borderRadius:`var(--arc-antd-border-radius-small)`,background:`transparent`,color:`var(--arc-antd-color-text-2)`,cursor:`pointer`},children:/* @__PURE__ */ y(u,{size:14})})]},`recent-${e.value.id}`):o};return/* @__PURE__ */ y(v,{children:/* @__PURE__ */ y(o,{visible:a,header:null,footer:null,closable:!1,onCancel:s,closeOnEsc:!1,maskClosable:!0,width:600,className:`cmd-palette-modal`,style:{margin:`12vh auto`,overflow:`hidden`,borderRadius:`var(--arc-antd-border-radius-large)`,padding:0},bodyStyle:{padding:0,overflow:`hidden`},zIndex:9999,keepDOM:!1,children:/* @__PURE__ */ b(`div`,{style:{display:`flex`,flexDirection:`column`,maxHeight:`60vh`},children:[/* @__PURE__ */ b(`div`,{style:{display:`flex`,alignItems:`center`,gap:10,padding:`12px 16px`,borderBottom:`1px solid var(--arc-antd-color-border)`},children:[/* @__PURE__ */ y(r,{size:17,style:{color:`var(--arc-antd-color-text-2)`,flexShrink:0}}),/* @__PURE__ */ y(`input`,{ref:A,value:f,onChange:e=>T(e.target.value),onKeyDown:L,placeholder:`全局搜索`,"aria-label":`全局搜索`,"aria-controls":`global-search-results`,"aria-activedescendant":F[D]?`global-search-result-${D}`:void 0,style:{flex:1,border:`none`,outline:`none`,background:`transparent`,fontSize:15,color:`var(--arc-antd-color-text-0)`,lineHeight:`22px`}}),f&&/* @__PURE__ */ y(`button`,{type:`button`,onClick:()=>T(``),style:{display:`flex`,alignItems:`center`,justifyContent:`center`,width:20,height:20,border:`none`,borderRadius:`var(--arc-antd-border-radius-small)`,background:`var(--arc-antd-color-fill-1)`,color:`var(--arc-antd-color-text-2)`,cursor:`pointer`,padding:0,flexShrink:0},children:/* @__PURE__ */ y(`span`,{style:{fontSize:12,lineHeight:1},children:`✕`})}),!l&&/* @__PURE__ */ y(`kbd`,{className:`cmd-palette-esc`,style:{fontSize:11,color:`var(--arc-antd-color-text-2)`,background:`var(--arc-antd-color-fill-0)`,border:`1px solid var(--arc-antd-color-border)`,borderRadius:`var(--arc-antd-border-radius-small)`,padding:`1px 5px`,fontFamily:`monospace`,flexShrink:0},children:`ESC`})]}),/* @__PURE__ */ b(`div`,{ref:j,id:`global-search-results`,role:`listbox`,"aria-label":`搜索结果`,style:{flex:1,overflowY:`auto`,padding:`6px 0`,minHeight:0},children:[P&&t.length>0&&/* @__PURE__ */ b(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`2px 16px 6px`,marginBottom:2},children:[/* @__PURE__ */ y(`span`,{style:{fontSize:11,fontWeight:600,color:`var(--arc-antd-color-text-2)`,textTransform:`uppercase`,letterSpacing:`0.06em`},children:`最近访问`}),/* @__PURE__ */ y(`button`,{type:`button`,onClick:n,style:{border:`none`,background:`none`,cursor:`pointer`,fontSize:11,color:`var(--arc-antd-color-text-2)`,padding:`0 2px`},children:`清除`})]}),P&&t.length===0&&/* @__PURE__ */ b(`div`,{style:{textAlign:`center`,padding:`32px 16px`,color:`var(--arc-antd-color-text-2)`,fontSize:13},children:[/* @__PURE__ */ y(E,{size:28,style:{margin:`0 auto 10px`,opacity:.35,display:`block`}}),`输入关键词搜索菜单`]}),!P&&M.length>0&&/* @__PURE__ */ y(`div`,{style:{padding:`4px 16px 3px`,fontSize:11,fontWeight:600,color:`var(--arc-antd-color-text-2)`},children:`菜单`}),P?t.map((e,t)=>R({kind:`menu`,value:e},t,!0)):M.map((e,t)=>R({kind:`menu`,value:e},t,!1))]}),!l&&/* @__PURE__ */ b(`div`,{className:`cmd-palette-footer`,style:{display:`flex`,alignItems:`center`,gap:12,padding:`7px 16px`,borderTop:`1px solid var(--arc-antd-color-border)`,fontSize:11,color:`var(--arc-antd-color-text-2)`},children:[/* @__PURE__ */ b(`span`,{children:[/* @__PURE__ */ y(`kbd`,{style:{fontFamily:`monospace`,fontSize:10,padding:`0 3px`,border:`1px solid var(--arc-antd-color-border)`,borderRadius:`var(--arc-antd-border-radius-small)`},children:`↑↓`}),` 导航`]}),/* @__PURE__ */ b(`span`,{children:[/* @__PURE__ */ y(`kbd`,{style:{fontFamily:`monospace`,fontSize:10,padding:`0 3px`,border:`1px solid var(--arc-antd-color-border)`,borderRadius:`var(--arc-antd-border-radius-small)`},children:`↵`}),` 跳转`]}),/* @__PURE__ */ b(`span`,{children:[/* @__PURE__ */ y(`kbd`,{style:{fontFamily:`monospace`,fontSize:10,padding:`0 3px`,border:`1px solid var(--arc-antd-color-border)`,borderRadius:`var(--arc-antd-border-radius-small)`},children:`ESC`}),` 关闭`]}),/* @__PURE__ */ b(`span`,{style:{marginLeft:`auto`},children:[/* @__PURE__ */ y(`kbd`,{style:{fontFamily:`monospace`,fontSize:10,padding:`0 3px`,border:`1px solid var(--arc-antd-color-border)`,borderRadius:`var(--arc-antd-border-radius-small)`},children:`Ctrl K`}),` 快速打开`]})]})]})})})}function A(){return(A=e((()=>{t(),i(),s(),D(),l(),d()})))()}A();export{k as default};
9
- //# sourceMappingURL=MenuCommandPalette-ia0pSIFg.js.map
9
+ //# sourceMappingURL=MenuCommandPalette-C2PvK3Gh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MenuCommandPalette-ia0pSIFg.js","mappings":";;;;;;;IASM,EAAa,CACjB,KAAM,OACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,KAAM,GAAI,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC/D,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAS,CAAC,EACjE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,IAAK,GAAI,IAAK,GAAI,KAAM,IAAK,QAAS,CAAC,EAChE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,IAAK,GAAI,KAAM,IAAK,QAAS,CAAC,CACnE,CACF,EACAA,EAAW,KACL,EAAOC,EAAiBD,CAAU,C,OCFxC,SAASE,EAAY,EAAoB,EAAmB,CACxD,GAAIC,EAAK,KAAM,CACX,IAAMC,EAAOC,EAAiBF,EAAK,KAAM,EAAE,EAC3C,GAAIC,EACA,OAAOA,CACf,CACA,OAAkBE,EAAXC,EAAYC,EAAqBC,EAAtB,CAAO,KAAM,EAAI,CAAoB,CAC3D,CACA,SAAwBC,EAAmB,CAAE,QAAO,cAAa,iBAAgB,iBAAgB,OAAM,WAAkB,CACrH,IAAMC,EAAWC,EAAY,EACvBC,EAAWC,EAAY,EACvBC,EAAcC,EAAe,EAC7B,CAACC,EAAOC,GAAYC,EAAS,EAAE,EAC/B,CAACC,EAAeC,GAAoBF,EAAS,CAAC,EAC9CG,EAAWC,EAAyB,IAAI,EACxCC,EAAUD,EAAuB,IAAI,EACrCE,EAAcC,MAAc,CAC9B,GAAI,CAACT,EAAM,KAAK,EACZ,MAAO,CAAC,EACZ,IAAMU,EAAaV,EAAM,KAAK,CAAC,CAAC,YAAY,EAC5C,OAAOW,EACF,KAAK,EAAM,IAAU,CACtB,IAAMC,EAAQC,EAAK,MAAM,YAAY,EAC/BC,EAAaD,EAAK,WAAW,KAAM,GAASE,EAAY7B,EAAMc,CAAK,CAAC,EAE1E,MAAO,CAAE,OAAM,MADDY,IAAUF,EAAa,EAAIE,EAAM,WAAWF,CAAU,EAAI,EAAIE,EAAM,SAASF,CAAU,EAAI,EAAII,EAAa,EAAIhB,EAAc,EAAI,EAC1H,OAAM,CAChC,CAAC,CAAC,CACG,QAAQ,CAAE,UAAWiB,EAAYF,EAAK,MAAOb,CAAK,GAAKa,EAAK,WAAW,KAAM,GAASE,EAAY7B,EAAMc,CAAK,CAAC,CAAC,CAAC,CAChH,MAAM,EAAG,IAAMgB,EAAE,MAAQC,EAAE,OAASD,EAAE,MAAQC,EAAE,KAAK,CAAC,CACtD,MAAM,EAAG,CAAC,CAAC,CACX,KAAK,CAAE,UAAWJ,CAAI,CAC/B,EAAG,CAACF,EAAOb,EAAaE,CAAK,CAAC,EACxBkB,EAAeT,MAA6B,CAC9C,GAAGD,EAAY,IAAK,IAAW,CAAE,KAAM,OAAiB,OAAM,EAAE,CACpE,EAAG,CAACA,CAAW,CAAC,EACVW,EAAkB,CAACnB,EAAM,KAAK,EAC9BoB,EAAeD,EAAkBE,EAAY,IAAK,IAAW,CAAE,KAAM,OAAiB,OAAM,EAAE,EAAIH,EACxGI,MAAgB,CACRC,IACAtB,EAAS,EAAE,EACXG,EAAiB,CAAC,EAClB,eAAiBC,EAAS,SAAS,MAAM,EAAG,EAAE,EAEtD,EAAG,CAACkB,CAAI,CAAC,EACTD,MAAgB,CACZlB,EAAiB,CAAC,CACtB,EAAG,CAACJ,CAAK,CAAC,EACVsB,MAAgB,EACDf,EAAQ,SAAS,cAAc,uBAAuBJ,EAAc,GAAG,IAC9E,eAAe,CAAE,MAAO,SAAU,CAAC,CAC3C,EAAG,CAACA,CAAa,CAAC,EAClB,IAAMqB,EAAeC,EAAa,GAAsB,CAAEC,EAAQ,EAAGhC,EAASR,EAAK,MAAM,IAAI,CAAG,EAAG,CAACQ,EAAUgC,CAAO,CAAC,EAChHC,EAAgBF,EAAa,GAA2B,CAC1D,GAAI,EAAE,MAAQ,SACVC,EAAQ,OAGZ,GAAI,EAAE,MAAQ,YACV,EAAE,eAAe,EACjBtB,EAAkB,GAAM,KAAK,IAAIwB,EAAI,EAAG,KAAK,IAAIR,EAAa,OAAS,EAAG,CAAC,CAAC,CAAC,OAGjF,GAAI,EAAE,MAAQ,UACV,EAAE,eAAe,EACjBhB,EAAkB,GAAM,KAAK,IAAIwB,EAAI,EAAG,CAAC,CAAC,OAG9C,GAAI,EAAE,MAAQ,QAAS,CACnB,IAAM1C,EAAOkC,EAAajB,GACtBjB,GACAsC,EAAatC,CAAI,CACzB,CACJ,EAAG,CAACkC,EAAcI,EAAcE,EAASvB,CAAa,CAAC,EACjD0B,GAAc,EAAmB,EAAe,IAAsB,CACxE,IAAMC,EAAaC,IAAU5B,EACvB6B,EAAW9C,EAAK,MAAM,WAAW,KAAK,KAAK,EAC3C+C,EAAO,kBAAC,SAAD,CAAsC,KAAK,SAAS,GAAI,wBAAwBF,IAAS,KAAK,SAAS,gBAAeD,EAAY,oBAAmBC,EAAO,YAAeP,EAAatC,CAAI,EAAG,iBAAoBkB,EAAiB2B,CAAK,EAAG,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,MAAO,OAAQ,QAASzC,EAAW,oBAAsB,WAAY,OAAQ,OAAQ,WAAYwC,EAAa,8CAAgD,cAAe,OAAQ,UAAW,UAAW,OAAQ,WAAY,iBAAkB,EAAthB,UACb,kBAAC,OAAD,CAAM,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,WAAY,EAAG,aAAc,uCAAwC,WAAYA,EAAa,gCAAkC,+BAAgC,MAAOA,EAAa,OAAS,+BAAgC,EACjU,SAAA7C,EAAYC,EAAK,MAAOI,CAAQ,CAC7B,GACN,kBAAC,MAAD,CAAK,MAAO,CAAE,KAAM,EAAG,SAAU,CAAE,EAAnC,UACE,kBAAC,MAAD,CAAK,MAAO,CAAE,SAAU,GAAI,WAAY,IAAK,MAAOwC,EAAa,gCAAkC,+BAAgC,WAAY,IAAK,WAAY,SAAU,SAAU,SAAU,aAAc,UAAW,EAAI,SAAA5C,EAAK,MAAM,KAAW,GAChP8C,GAAY,kBAAC,MAAD,CAAK,MAAO,CAAE,SAAU,GAAI,MAAO,+BAAgC,WAAY,IAAK,UAAW,EAAG,WAAY,SAAU,SAAU,SAAU,aAAc,UAAW,EAAI,SAAAA,CAAc,EACjM,C,GACJF,GAAc,kBAAC,MAAD,CAAK,MAAO,CAAE,SAAU,GAAI,MAAO,gCAAiC,WAAY,8CAA+C,OAAQ,sDAAuD,aAAc,sCAAuC,QAAS,UAAW,WAAY,YAAa,WAAY,CAAE,EAAG,YAAM,EAChU,CAToB,UAAQ5C,EAAK,MAAM,IASvC,EAGN,OAFKI,EAEG,kBAAC,MAAD,CAAqC,MAAO,CAAE,SAAU,UAAW,EAAnE,UACP2C,EACD,kBAAC,SAAD,CAAQ,KAAK,SAAS,aAAY,KAAK/C,EAAK,MAAM,QAAS,MAAM,SAAS,QAAU,GAAU,CACtFgD,EAAM,gBAAgB,EACtBC,EAAejD,EAAK,MAAM,EAAE,CAChC,EAAG,MAAO,CAAE,SAAU,WAAY,MAAO,GAAI,IAAK,MAAO,UAAW,mBAAoB,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,MAAO,GAAI,OAAQ,GAAI,QAAS,EAAG,OAAQ,OAAQ,aAAc,sCAAuC,WAAY,cAAe,MAAO,+BAAgC,OAAQ,SAAU,EACvV,2BAACkD,EAAD,CAAG,KAAM,EAAI,EACP,EACL,CARe,YAAUlD,EAAK,MAAM,IAQpC,EATQ+C,CAUf,EACA,MAAQ,kBAAAI,EAAA,UACR,kBAACC,EAAD,CAAO,QAASf,EAAM,OAAQ,KAAM,OAAQ,KAAM,SAAU,GAAO,SAAUG,EAAS,WAAY,GAAO,gBAAa,MAAO,IAAK,UAAU,oBAAoB,MAAO,CAAE,OAAQ,YAAa,SAAU,SAAU,aAAc,sCAAuC,QAAS,CAAE,EAAG,UAAW,CAAE,QAAS,EAAG,SAAU,QAAS,EAAG,OAAQ,KAAM,QAAS,GACzV,2BAAC,MAAD,CAAK,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,UAAW,MAAO,EAA1E,UACE,kBAAC,MAAD,CAAK,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,QAAS,YAAa,aAAc,wCAAyC,EAA3I,UACE,kBAACa,EAAD,CAAQ,KAAM,GAAI,MAAO,CAAE,MAAO,+BAAgC,WAAY,CAAE,CAAG,GACnF,kBAAC,QAAD,CAAO,IAAKlC,EAAU,MAAOL,EAAO,SAAW,GAAMC,EAAS,EAAE,OAAO,KAAK,EAAG,UAAW0B,EAAe,YAAY,OAAO,aAAW,OAAO,gBAAc,wBAAwB,wBAAuBP,EAAajB,GAAiB,wBAAwBA,IAAkB,OAAW,MAAO,CAAE,KAAM,EAAG,OAAQ,OAAQ,QAAS,OAAQ,WAAY,cAAe,SAAU,GAAI,MAAO,+BAAgC,WAAY,MAAO,CAAG,GACtbH,GAAS,kBAAC,SAAD,CAAQ,KAAK,SAAS,YAAeC,EAAS,EAAE,EAAG,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,eAAgB,SAAU,MAAO,GAAI,OAAQ,GAAI,OAAQ,OAAQ,aAAc,sCAAuC,WAAY,+BAAgC,MAAO,+BAAgC,OAAQ,UAAW,QAAS,EAAG,WAAY,CAAE,EAAG,2BAAC,OAAD,CAAM,MAAO,CAAE,SAAU,GAAI,WAAY,CAAE,EAAG,YAAO,EAAS,GACna,CAACL,GAAY,kBAAC,MAAD,CAAK,UAAU,kBAAkB,MAAO,CAAE,SAAU,GAAI,MAAO,+BAAgC,WAAY,+BAAgC,OAAQ,yCAA0C,aAAc,sCAAuC,QAAS,UAAW,WAAY,YAAa,WAAY,CAAE,EAAG,cAAQ,EACnU,C,GAEL,kBAAC,MAAD,CAAK,IAAKW,EAAS,GAAG,wBAAwB,KAAK,UAAU,aAAW,OAAO,MAAO,CAAE,KAAM,EAAG,UAAW,OAAQ,QAAS,QAAS,UAAW,CAAE,EAAnJ,UACGY,GAAmBE,EAAY,OAAS,GAAK,kBAAC,MAAD,CAAK,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,eAAgB,gBAAiB,QAAS,eAAgB,aAAc,CAAE,EAA/H,UAAkI,kBAAC,OAAD,CAAM,MAAO,CAAE,SAAU,GAAI,WAAY,IAAK,MAAO,+BAAgC,cAAe,YAAa,cAAe,QAAS,EAAG,eAAU,GAAC,kBAAC,SAAD,CAAQ,KAAK,SAAS,QAASmB,EAAgB,MAAO,CAAE,OAAQ,OAAQ,WAAY,OAAQ,OAAQ,UAAW,SAAU,GAAI,MAAO,+BAAgC,QAAS,OAAQ,EAAG,aAAU,EAAM,C,GAC9gBrB,GAAmBE,EAAY,SAAW,GAAK,kBAAC,MAAD,CAAK,MAAO,CAAE,UAAW,SAAU,QAAS,YAAa,MAAO,+BAAgC,SAAU,EAAG,EAA7G,UAAgH,kBAAC7B,EAAD,CAAM,KAAM,GAAI,MAAO,CAAE,OAAQ,cAAe,QAAS,IAAM,QAAS,OAAQ,CAAG,GAAC,WAAc,C,GACjQ,CAAC2B,GAAmBX,EAAY,OAAS,GAAK,kBAAC,MAAD,CAAK,MAAO,CAAE,QAAS,eAAgB,SAAU,GAAI,WAAY,IAAK,MAAO,8BAA+B,EAAG,aAAO,GACpKW,EAAkBE,EAAY,KAAK,EAAM,IAAUQ,EAAW,CAAE,KAAM,OAAQ,MAAO3C,CAAK,EAAG6C,EAAO,EAAI,CAAC,EAAIvB,EAAY,KAAK,EAAM,IAAUqB,EAAW,CAAE,KAAM,OAAQ,MAAO3C,CAAK,EAAG6C,EAAO,EAAK,CAAC,CACnM,C,GAEJ,CAACnC,GAAY,kBAAC,MAAD,CAAK,UAAU,qBAAqB,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,QAAS,WAAY,UAAW,yCAA0C,SAAU,GAAI,MAAO,8BAA+B,EAA3N,UAA8N,kBAAC,OAAD,WAAM,kBAAC,MAAD,CAAK,MAAO,CAAE,WAAY,YAAa,SAAU,GAAI,QAAS,QAAS,OAAQ,yCAA0C,aAAc,qCAAsC,EAAG,aAAO,GAAC,KAAS,IAAC,kBAAC,OAAD,WAAM,kBAAC,MAAD,CAAK,MAAO,CAAE,WAAY,YAAa,SAAU,GAAI,QAAS,QAAS,OAAQ,yCAA0C,aAAc,qCAAsC,EAAG,YAAM,GAAC,KAAS,IAAC,kBAAC,OAAD,WAAM,kBAAC,MAAD,CAAK,MAAO,CAAE,WAAY,YAAa,SAAU,GAAI,QAAS,QAAS,OAAQ,yCAA0C,aAAc,qCAAsC,EAAG,cAAQ,GAAC,KAAS,IAAC,kBAAC,OAAD,CAAM,MAAO,CAAE,WAAY,MAAO,EAAlC,UAAqC,kBAAC,MAAD,CAAK,MAAO,CAAE,WAAY,YAAa,SAAU,GAAI,QAAS,QAAS,OAAQ,yCAA0C,aAAc,qCAAsC,EAAG,iBAAW,GAAC,OAAW,C,EAAM,C,EACnjC,C,EACA,EACL,EACN,C","names":["__iconData","createLucideIcon","getMenuIcon","item","icon","renderLucideIcon","jsx","isRecent","Clock","Hash","MenuCommandPalette","navigate","useNavigate","isMobile","useIsMobile","pinyinReady","usePinyinReady","query","setQuery","useState","selectedIndex","setSelectedIndex","inputRef","useRef","listRef","menuResults","useMemo","normalized","menus","title","menu","breadcrumb","textMatches","a","b","paletteItems","isShowingRecent","displayItems","recentMenus","useEffect","open","handleSelect","useCallback","onClose","handleKeyDown","i","renderItem","isSelected","index","subtitle","row","event","onRemoveRecent","X","_Fragment","Modal","Search","onClearRecents"],"ignoreList":[0],"sources":["../../../../node_modules/lucide-react/dist/esm/icons/hash.mjs","../../src/components/MenuCommandPalette.tsx"],"sourcesContent":[null,"import { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Modal } from \"@/ui\";\nimport { textMatches } from \"@fudanda/react-core/utils/pinyin\";\nimport { Search, Clock, Hash, X } from 'lucide-react';\nimport { renderLucideIcon } from \"@/utils/icons\";\nimport { useIsMobile } from \"@fudanda/react-core/hooks/useMediaQuery\";\nimport { usePinyinReady } from \"@fudanda/react-core/hooks/usePinyinReady\";\nimport type { FlatMenuItem } from \"@/components/MenuSearchInput\";\ninterface Props {\n readonly menus: FlatMenuItem[];\n readonly recentMenus: FlatMenuItem[];\n readonly onClearRecents: () => void;\n readonly onRemoveRecent: (menuId: number) => void;\n readonly open: boolean;\n readonly onClose: () => void;\n}\ntype PaletteItem = { kind: 'menu'; value: FlatMenuItem };\nfunction getMenuIcon(item: FlatMenuItem, isRecent: boolean) {\n if (item.icon) {\n const icon = renderLucideIcon(item.icon, 13);\n if (icon)\n return icon;\n }\n return isRecent ? <Clock size={13}/> : <Hash size={13}/>;\n}\nexport default function MenuCommandPalette({ menus, recentMenus, onClearRecents, onRemoveRecent, open, onClose }: Props) {\n const navigate = useNavigate();\n const isMobile = useIsMobile();\n const pinyinReady = usePinyinReady();\n const [query, setQuery] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const menuResults = useMemo(() => {\n if (!query.trim())\n return [];\n const normalized = query.trim().toLowerCase();\n return menus\n .map((menu, index) => {\n const title = menu.title.toLowerCase();\n const breadcrumb = menu.breadcrumb.some((item) => textMatches(item, query));\n const score = title === normalized ? 0 : title.startsWith(normalized) ? 1 : title.includes(normalized) ? 2 : breadcrumb ? 3 : pinyinReady ? 4 : 5;\n return { menu, score, index };\n })\n .filter(({ menu }) => textMatches(menu.title, query) || menu.breadcrumb.some((item) => textMatches(item, query)))\n .sort((a, b) => a.score - b.score || a.index - b.index)\n .slice(0, 8)\n .map(({ menu }) => menu);\n }, [menus, pinyinReady, query]);\n const paletteItems = useMemo<PaletteItem[]>(() => [\n ...menuResults.map((value) => ({ kind: 'menu' as const, value })),\n ], [menuResults]);\n const isShowingRecent = !query.trim();\n const displayItems = isShowingRecent ? recentMenus.map((value) => ({ kind: 'menu' as const, value })) : paletteItems;\n useEffect(() => {\n if (open) {\n setQuery('');\n setSelectedIndex(0);\n setTimeout(() => inputRef.current?.focus(), 30);\n }\n }, [open]);\n useEffect(() => {\n setSelectedIndex(0);\n }, [query]);\n useEffect(() => {\n const el = listRef.current?.querySelector(`[data-search-index=\"${selectedIndex}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedIndex]);\n const handleSelect = useCallback((item: PaletteItem) => { onClose(); navigate(item.value.path); }, [navigate, onClose]);\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex((i) => Math.min(i + 1, Math.max(displayItems.length - 1, 0)));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === 'Enter') {\n const item = displayItems[selectedIndex];\n if (item)\n handleSelect(item);\n }\n }, [displayItems, handleSelect, onClose, selectedIndex]);\n const renderItem = (item: PaletteItem, index: number, isRecent: boolean) => {\n const isSelected = index === selectedIndex;\n const subtitle = item.value.breadcrumb.join(' › ');\n const row = (<button key={`menu-${item.value.id}`} type=\"button\" id={`global-search-result-${index}`} role=\"option\" aria-selected={isSelected} data-search-index={index} onClick={() => handleSelect(item)} onMouseEnter={() => setSelectedIndex(index)} style={{ display: 'flex', alignItems: 'center', gap: 10, width: '100%', padding: isRecent ? '8px 44px 8px 16px' : '8px 16px', border: 'none', background: isSelected ? 'var(--arc-antd-color-primary-light-default)' : 'transparent', cursor: 'pointer', textAlign: 'left', transition: 'background 0.1s' }}>\n <span style={{ width: 28, height: 28, display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, borderRadius: 'var(--arc-antd-border-radius-medium)', background: isSelected ? 'var(--arc-antd-color-primary)' : 'var(--arc-antd-color-fill-1)', color: isSelected ? '#fff' : 'var(--arc-antd-color-primary)' }}>\n {getMenuIcon(item.value, isRecent)}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 13, fontWeight: 500, color: isSelected ? 'var(--arc-antd-color-primary)' : 'var(--arc-antd-color-text-0)', lineHeight: 1.4, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{item.value.title}</div>\n {subtitle && <div style={{ fontSize: 11, color: 'var(--arc-antd-color-text-2)', lineHeight: 1.3, marginTop: 1, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{subtitle}</div>}\n </div>\n {isSelected && <kbd style={{ fontSize: 10, color: 'var(--arc-antd-color-primary)', background: 'var(--arc-antd-color-primary-light-default)', border: '1px solid var(--arc-antd-color-primary-light-hover)', borderRadius: 'var(--arc-antd-border-radius-small)', padding: '1px 5px', fontFamily: 'monospace', flexShrink: 0 }}>↵</kbd>}\n </button>);\n if (!isRecent)\n return row;\n return (<div key={`recent-${item.value.id}`} style={{ position: 'relative' }}>\n {row}\n <button type=\"button\" aria-label={`移除${item.value.title}`} title=\"移除最近访问\" onClick={(event) => {\n event.stopPropagation();\n onRemoveRecent(item.value.id);\n }} style={{ position: 'absolute', right: 12, top: '50%', transform: 'translateY(-50%)', display: 'flex', alignItems: 'center', justifyContent: 'center', width: 24, height: 24, padding: 0, border: 'none', borderRadius: 'var(--arc-antd-border-radius-small)', background: 'transparent', color: 'var(--arc-antd-color-text-2)', cursor: 'pointer' }}>\n <X size={14}/>\n </button>\n </div>);\n };\n return (<>\n <Modal visible={open} header={null} footer={null} closable={false} onCancel={onClose} closeOnEsc={false} maskClosable width={600} className=\"cmd-palette-modal\" style={{ margin: '12vh auto', overflow: 'hidden', borderRadius: 'var(--arc-antd-border-radius-large)', padding: 0 }} bodyStyle={{ padding: 0, overflow: 'hidden' }} zIndex={9999} keepDOM={false}>\n <div style={{ display: 'flex', flexDirection: 'column', maxHeight: '60vh' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '12px 16px', borderBottom: '1px solid var(--arc-antd-color-border)' }}>\n <Search size={17} style={{ color: 'var(--arc-antd-color-text-2)', flexShrink: 0 }}/>\n <input ref={inputRef} value={query} onChange={(e) => setQuery(e.target.value)} onKeyDown={handleKeyDown} placeholder=\"全局搜索\" aria-label=\"全局搜索\" aria-controls=\"global-search-results\" aria-activedescendant={displayItems[selectedIndex] ? `global-search-result-${selectedIndex}` : undefined} style={{ flex: 1, border: 'none', outline: 'none', background: 'transparent', fontSize: 15, color: 'var(--arc-antd-color-text-0)', lineHeight: '22px' }}/>\n {query && <button type=\"button\" onClick={() => setQuery('')} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', width: 20, height: 20, border: 'none', borderRadius: 'var(--arc-antd-border-radius-small)', background: 'var(--arc-antd-color-fill-1)', color: 'var(--arc-antd-color-text-2)', cursor: 'pointer', padding: 0, flexShrink: 0 }}><span style={{ fontSize: 12, lineHeight: 1 }}>✕</span></button>}\n {!isMobile && <kbd className=\"cmd-palette-esc\" style={{ fontSize: 11, color: 'var(--arc-antd-color-text-2)', background: 'var(--arc-antd-color-fill-0)', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)', padding: '1px 5px', fontFamily: 'monospace', flexShrink: 0 }}>ESC</kbd>}\n </div>\n\n <div ref={listRef} id=\"global-search-results\" role=\"listbox\" aria-label=\"搜索结果\" style={{ flex: 1, overflowY: 'auto', padding: '6px 0', minHeight: 0 }}>\n {isShowingRecent && recentMenus.length > 0 && <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '2px 16px 6px', marginBottom: 2 }}><span style={{ fontSize: 11, fontWeight: 600, color: 'var(--arc-antd-color-text-2)', textTransform: 'uppercase', letterSpacing: '0.06em' }}>最近访问</span><button type=\"button\" onClick={onClearRecents} style={{ border: 'none', background: 'none', cursor: 'pointer', fontSize: 11, color: 'var(--arc-antd-color-text-2)', padding: '0 2px' }}>清除</button></div>}\n {isShowingRecent && recentMenus.length === 0 && <div style={{ textAlign: 'center', padding: '32px 16px', color: 'var(--arc-antd-color-text-2)', fontSize: 13 }}><Hash size={28} style={{ margin: '0 auto 10px', opacity: 0.35, display: 'block' }}/>输入关键词搜索菜单</div>}\n {!isShowingRecent && menuResults.length > 0 && <div style={{ padding: '4px 16px 3px', fontSize: 11, fontWeight: 600, color: 'var(--arc-antd-color-text-2)' }}>菜单</div>}\n {isShowingRecent ? recentMenus.map((item, index) => renderItem({ kind: 'menu', value: item }, index, true)) : menuResults.map((item, index) => renderItem({ kind: 'menu', value: item }, index, false))}\n </div>\n\n {!isMobile && <div className=\"cmd-palette-footer\" style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '7px 16px', borderTop: '1px solid var(--arc-antd-color-border)', fontSize: 11, color: 'var(--arc-antd-color-text-2)' }}><span><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>↑↓</kbd> 导航</span><span><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>↵</kbd> 跳转</span><span><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>ESC</kbd> 关闭</span><span style={{ marginLeft: 'auto' }}><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>Ctrl K</kbd> 快速打开</span></div>}\n </div>\n </Modal>\n </>);\n}\n"]}
1
+ {"version":3,"file":"MenuCommandPalette-C2PvK3Gh.js","mappings":"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","names":["__iconData","createLucideIcon","getMenuIcon","item","icon","renderLucideIcon","jsx","isRecent","Clock","Hash","MenuCommandPalette","navigate","useNavigate","isMobile","useIsMobile","pinyinReady","usePinyinReady","query","setQuery","useState","selectedIndex","setSelectedIndex","inputRef","useRef","listRef","menuResults","useMemo","normalized","menus","title","menu","breadcrumb","textMatches","a","b","paletteItems","isShowingRecent","displayItems","recentMenus","useEffect","open","handleSelect","useCallback","onClose","handleKeyDown","i","renderItem","isSelected","index","subtitle","row","event","onRemoveRecent","X","_Fragment","Modal","Search","onClearRecents"],"ignoreList":[0],"sources":["../../../../node_modules/lucide-react/dist/esm/icons/hash.mjs","../../src/components/MenuCommandPalette.tsx"],"sourcesContent":[null,"import { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Modal } from \"@/ui\";\nimport { textMatches } from \"@fudanda/react-core/utils/pinyin\";\nimport { Search, Clock, Hash, X } from 'lucide-react';\nimport { renderLucideIcon } from \"@/utils/icons\";\nimport { useIsMobile } from \"@fudanda/react-core/hooks/useMediaQuery\";\nimport { usePinyinReady } from \"@fudanda/react-core/hooks/usePinyinReady\";\nimport type { FlatMenuItem } from \"@/components/MenuSearchInput\";\ninterface Props {\n readonly menus: FlatMenuItem[];\n readonly recentMenus: FlatMenuItem[];\n readonly onClearRecents: () => void;\n readonly onRemoveRecent: (menuId: number) => void;\n readonly open: boolean;\n readonly onClose: () => void;\n}\ntype PaletteItem = { kind: 'menu'; value: FlatMenuItem };\nfunction getMenuIcon(item: FlatMenuItem, isRecent: boolean) {\n if (item.icon) {\n const icon = renderLucideIcon(item.icon, 13);\n if (icon)\n return icon;\n }\n return isRecent ? <Clock size={13}/> : <Hash size={13}/>;\n}\nexport default function MenuCommandPalette({ menus, recentMenus, onClearRecents, onRemoveRecent, open, onClose }: Props) {\n const navigate = useNavigate();\n const isMobile = useIsMobile();\n const pinyinReady = usePinyinReady();\n const [query, setQuery] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const menuResults = useMemo(() => {\n if (!query.trim())\n return [];\n const normalized = query.trim().toLowerCase();\n return menus\n .map((menu, index) => {\n const title = menu.title.toLowerCase();\n const breadcrumb = menu.breadcrumb.some((item) => textMatches(item, query));\n const score = title === normalized ? 0 : title.startsWith(normalized) ? 1 : title.includes(normalized) ? 2 : breadcrumb ? 3 : pinyinReady ? 4 : 5;\n return { menu, score, index };\n })\n .filter(({ menu }) => textMatches(menu.title, query) || menu.breadcrumb.some((item) => textMatches(item, query)))\n .sort((a, b) => a.score - b.score || a.index - b.index)\n .slice(0, 8)\n .map(({ menu }) => menu);\n }, [menus, pinyinReady, query]);\n const paletteItems = useMemo<PaletteItem[]>(() => [\n ...menuResults.map((value) => ({ kind: 'menu' as const, value })),\n ], [menuResults]);\n const isShowingRecent = !query.trim();\n const displayItems = isShowingRecent ? recentMenus.map((value) => ({ kind: 'menu' as const, value })) : paletteItems;\n useEffect(() => {\n if (open) {\n setQuery('');\n setSelectedIndex(0);\n setTimeout(() => inputRef.current?.focus(), 30);\n }\n }, [open]);\n useEffect(() => {\n setSelectedIndex(0);\n }, [query]);\n useEffect(() => {\n const el = listRef.current?.querySelector(`[data-search-index=\"${selectedIndex}\"]`) as HTMLElement | null;\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedIndex]);\n const handleSelect = useCallback((item: PaletteItem) => { onClose(); navigate(item.value.path); }, [navigate, onClose]);\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex((i) => Math.min(i + 1, Math.max(displayItems.length - 1, 0)));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === 'Enter') {\n const item = displayItems[selectedIndex];\n if (item)\n handleSelect(item);\n }\n }, [displayItems, handleSelect, onClose, selectedIndex]);\n const renderItem = (item: PaletteItem, index: number, isRecent: boolean) => {\n const isSelected = index === selectedIndex;\n const subtitle = item.value.breadcrumb.join(' › ');\n const row = (<button key={`menu-${item.value.id}`} type=\"button\" id={`global-search-result-${index}`} role=\"option\" aria-selected={isSelected} data-search-index={index} onClick={() => handleSelect(item)} onMouseEnter={() => setSelectedIndex(index)} style={{ display: 'flex', alignItems: 'center', gap: 10, width: '100%', padding: isRecent ? '8px 44px 8px 16px' : '8px 16px', border: 'none', background: isSelected ? 'var(--arc-antd-color-primary-light-default)' : 'transparent', cursor: 'pointer', textAlign: 'left', transition: 'background 0.1s' }}>\n <span style={{ width: 28, height: 28, display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, borderRadius: 'var(--arc-antd-border-radius-medium)', background: isSelected ? 'var(--arc-antd-color-primary)' : 'var(--arc-antd-color-fill-1)', color: isSelected ? '#fff' : 'var(--arc-antd-color-primary)' }}>\n {getMenuIcon(item.value, isRecent)}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 13, fontWeight: 500, color: isSelected ? 'var(--arc-antd-color-primary)' : 'var(--arc-antd-color-text-0)', lineHeight: 1.4, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{item.value.title}</div>\n {subtitle && <div style={{ fontSize: 11, color: 'var(--arc-antd-color-text-2)', lineHeight: 1.3, marginTop: 1, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{subtitle}</div>}\n </div>\n {isSelected && <kbd style={{ fontSize: 10, color: 'var(--arc-antd-color-primary)', background: 'var(--arc-antd-color-primary-light-default)', border: '1px solid var(--arc-antd-color-primary-light-hover)', borderRadius: 'var(--arc-antd-border-radius-small)', padding: '1px 5px', fontFamily: 'monospace', flexShrink: 0 }}>↵</kbd>}\n </button>);\n if (!isRecent)\n return row;\n return (<div key={`recent-${item.value.id}`} style={{ position: 'relative' }}>\n {row}\n <button type=\"button\" aria-label={`移除${item.value.title}`} title=\"移除最近访问\" onClick={(event) => {\n event.stopPropagation();\n onRemoveRecent(item.value.id);\n }} style={{ position: 'absolute', right: 12, top: '50%', transform: 'translateY(-50%)', display: 'flex', alignItems: 'center', justifyContent: 'center', width: 24, height: 24, padding: 0, border: 'none', borderRadius: 'var(--arc-antd-border-radius-small)', background: 'transparent', color: 'var(--arc-antd-color-text-2)', cursor: 'pointer' }}>\n <X size={14}/>\n </button>\n </div>);\n };\n return (<>\n <Modal visible={open} header={null} footer={null} closable={false} onCancel={onClose} closeOnEsc={false} maskClosable width={600} className=\"cmd-palette-modal\" style={{ margin: '12vh auto', overflow: 'hidden', borderRadius: 'var(--arc-antd-border-radius-large)', padding: 0 }} bodyStyle={{ padding: 0, overflow: 'hidden' }} zIndex={9999} keepDOM={false}>\n <div style={{ display: 'flex', flexDirection: 'column', maxHeight: '60vh' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '12px 16px', borderBottom: '1px solid var(--arc-antd-color-border)' }}>\n <Search size={17} style={{ color: 'var(--arc-antd-color-text-2)', flexShrink: 0 }}/>\n <input ref={inputRef} value={query} onChange={(e) => setQuery(e.target.value)} onKeyDown={handleKeyDown} placeholder=\"全局搜索\" aria-label=\"全局搜索\" aria-controls=\"global-search-results\" aria-activedescendant={displayItems[selectedIndex] ? `global-search-result-${selectedIndex}` : undefined} style={{ flex: 1, border: 'none', outline: 'none', background: 'transparent', fontSize: 15, color: 'var(--arc-antd-color-text-0)', lineHeight: '22px' }}/>\n {query && <button type=\"button\" onClick={() => setQuery('')} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', width: 20, height: 20, border: 'none', borderRadius: 'var(--arc-antd-border-radius-small)', background: 'var(--arc-antd-color-fill-1)', color: 'var(--arc-antd-color-text-2)', cursor: 'pointer', padding: 0, flexShrink: 0 }}><span style={{ fontSize: 12, lineHeight: 1 }}>✕</span></button>}\n {!isMobile && <kbd className=\"cmd-palette-esc\" style={{ fontSize: 11, color: 'var(--arc-antd-color-text-2)', background: 'var(--arc-antd-color-fill-0)', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)', padding: '1px 5px', fontFamily: 'monospace', flexShrink: 0 }}>ESC</kbd>}\n </div>\n\n <div ref={listRef} id=\"global-search-results\" role=\"listbox\" aria-label=\"搜索结果\" style={{ flex: 1, overflowY: 'auto', padding: '6px 0', minHeight: 0 }}>\n {isShowingRecent && recentMenus.length > 0 && <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '2px 16px 6px', marginBottom: 2 }}><span style={{ fontSize: 11, fontWeight: 600, color: 'var(--arc-antd-color-text-2)', textTransform: 'uppercase', letterSpacing: '0.06em' }}>最近访问</span><button type=\"button\" onClick={onClearRecents} style={{ border: 'none', background: 'none', cursor: 'pointer', fontSize: 11, color: 'var(--arc-antd-color-text-2)', padding: '0 2px' }}>清除</button></div>}\n {isShowingRecent && recentMenus.length === 0 && <div style={{ textAlign: 'center', padding: '32px 16px', color: 'var(--arc-antd-color-text-2)', fontSize: 13 }}><Hash size={28} style={{ margin: '0 auto 10px', opacity: 0.35, display: 'block' }}/>输入关键词搜索菜单</div>}\n {!isShowingRecent && menuResults.length > 0 && <div style={{ padding: '4px 16px 3px', fontSize: 11, fontWeight: 600, color: 'var(--arc-antd-color-text-2)' }}>菜单</div>}\n {isShowingRecent ? recentMenus.map((item, index) => renderItem({ kind: 'menu', value: item }, index, true)) : menuResults.map((item, index) => renderItem({ kind: 'menu', value: item }, index, false))}\n </div>\n\n {!isMobile && <div className=\"cmd-palette-footer\" style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '7px 16px', borderTop: '1px solid var(--arc-antd-color-border)', fontSize: 11, color: 'var(--arc-antd-color-text-2)' }}><span><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>↑↓</kbd> 导航</span><span><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>↵</kbd> 跳转</span><span><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>ESC</kbd> 关闭</span><span style={{ marginLeft: 'auto' }}><kbd style={{ fontFamily: 'monospace', fontSize: 10, padding: '0 3px', border: '1px solid var(--arc-antd-color-border)', borderRadius: 'var(--arc-antd-border-radius-small)' }}>Ctrl K</kbd> 快速打开</span></div>}\n </div>\n </Modal>\n </>);\n}\n"]}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,G as n,I as r,M as i,Q as a,R as o,S as s,Vt as c,ct as l,f as u,h as d,it as f,j as p,lt as m,m as h,ot as g,q as _,st as v,w as y,zt as b}from"./clipboard-dpqHdCyy.js";import{r as x,s as S}from"./toolbar-controls-CrM8hKZg.js";import{i as C,n as w,r as ee,t as te}from"./chevrons-up-down-CDj3bN7O.js";import{n as ne,t as T}from"./useStatusToggle-D7g3Ew35.js";import{n as re,t as E}from"./useCrudOperationColumn-CPAzNGXp.js";import{i as ie,n as ae,s as D,t as oe}from"./table-columns-CvT6OHd2.js";import{a as se,i as ce,o as le,r as O,t as ue}from"./EditFormModal-DVQksS9R.js";import{n as k,t as de}from"./ConfigurableTable-8sYmeul2.js";import{B as A,V as j,_ as M,d as N,g as P,l as F,u as I}from"./App-CfQx7jWq.js";import{n as L,t as R}from"./DictTag-ChBs3uuY.js";import{n as fe,t as z}from"./webmcp-crud-D-Dz8BY4.js";import{useCallback as pe,useEffect as B,useMemo as V,useRef as me,useState as H}from"react";import{jsx as U,jsxs as W}from"react/jsx-runtime";import{useDictItems as G}from"@fudanda/admin-antd/core/hooks/useDictItems";import{menuContract as K}from"@fudanda/admin-antd/core/lib/native-operations";import{usePermission as he}from"@fudanda/admin-antd/core/hooks/usePermission";import{useListSearch as ge}from"@fudanda/admin-antd/core/hooks/useListSearch";import{menuKeys as _e,useDeleteMenu as ve,useMenuDetail as ye,useMenuTree as be,useSaveMenu as q}from"@fudanda/admin-antd/core/hooks/queries/menus";import{textMatches as xe}from"@fudanda/admin-antd/core/utils/pinyin";import{usePinyinReady as Se}from"@fudanda/admin-antd/core/hooks/usePinyinReady";import{useTreeExpansion as Ce}from"@fudanda/admin-antd/core/hooks/useTreeExpansion";function we({value:e,onChange:t,style:n}){let[i,a]=H(``),[o,c]=H(!1),[u,d]=H(1),f=N(),p=V(()=>{let e=i.trim().toLowerCase();return e?f.filter(t=>t.toLowerCase().includes(e)):f},[i,f]),m=V(()=>p.slice((u-1)*J,u*J),[p,u]),h=e=>{a(e),d(1)},g=e=>{c(e),e&&(d(1),a(``))},v=e=>{t?.(e),c(!1),a(``)},y=e=>{e.stopPropagation(),t?.(``)},x=/* @__PURE__ */ W(`div`,{className:`icon-picker-panel`,children:[/* @__PURE__ */ U(b,{size:`small`,prefix:/* @__PURE__ */ U(l,{size:13}),placeholder:`搜索图标(共 ${f.length} 个)…`,value:i,onChange:h,className:`icon-picker-search`,style:{marginBottom:8}}),/* @__PURE__ */ U(`div`,{className:`icon-picker-grid-wrap`,children:/* @__PURE__ */ U(r,{size:`small`,split:!1,grid:{span:3,gutter:4},dataSource:m,emptyContent:/* @__PURE__ */ U(`div`,{className:`icon-picker-empty-result`,children:`无匹配图标`}),renderItem:t=>/* @__PURE__ */ U(r.Item,{style:{padding:0},children:/* @__PURE__ */ U(`button`,{type:`button`,className:`icon-picker-cell${e===t?` icon-picker-cell--active`:``}`,onClick:()=>v(t),title:t,children:I(t,18)})})})}),p.length>J&&/* @__PURE__ */ U(`div`,{className:`icon-picker-pagination`,children:/* @__PURE__ */ U(_,{size:`small`,hoverShowPageSelect:!0,total:p.length,pageSize:J,currentPage:u,onPageChange:e=>d(e),showSizeChanger:!1})})]});return/* @__PURE__ */ U(s,{content:x,visible:o,onVisibleChange:g,trigger:`click`,position:`bottomLeft`,showArrow:!1,children:/* @__PURE__ */ W(`div`,{className:`icon-picker-trigger ${o?`icon-picker-trigger--open`:``}`,style:n,children:[/* @__PURE__ */ U(`span`,{className:`icon-picker-preview`,children:e?I(e,16):null}),/* @__PURE__ */ U(`span`,{className:`icon-picker-label ${e?``:`icon-picker-label--placeholder`}`,children:e||`点击选择图标`}),e?/* @__PURE__ */ U(`button`,{type:`button`,className:`icon-picker-arrow icon-picker-arrow--clear`,onClick:y,children:/* @__PURE__ */ U(P,{size:13})}):/* @__PURE__ */ U(`span`,{className:`icon-picker-arrow`,children:/* @__PURE__ */ U(A,{size:13})})]})})}var J;function Y(){return(Y=e((()=>{i(),m(),j(),M(),F(),J=56})))()}function Te({field:e=`status`,label:t=`状态`,disabled:n,type:r,extraText:i,rules:a}){let{items:s}=G(`common_status`);return/* @__PURE__ */ U(o.RadioGroup,{field:e,label:t,disabled:n,type:r,extraText:i,rules:a,children:s.map(e=>/* @__PURE__ */ U(o.Radio,{value:e.value,children:e.label},e.value))})}function X(){return(X=e((()=>{i()})))()}function Ee(e,t,n=Object.keys(e)){let r=e.type??t?.type??`menu`,i=e.isExternal??t?.isExternal??!1,a={icon:r!==`button`,visible:r!==`button`,path:r!==`button`,query:r!==`button`,isExternal:r!==`button`,component:r===`menu`&&!i,name:r===`menu`&&!i,permission:r===`button`,keepAlive:r===`menu`,embed:r!==`button`&&!!i};if(n.some(e=>a[e]===!1))throw Error(`输入包含当前菜单类型或外链模式下不可编辑的字段`)}function Z(){let{hasPermission:e}=he(),t=me(0),[r,i]=H(null),[s,l]=H(``),[m,_]=H(`menu`),[v,b]=H(!1),{bind:S,bindKeyword:C,submittedParams:w,handleSearch:T,handleReset:E}=ge({defaults:De,listKey:_e.tree}),{items:ie}=G(`menu_type`),{items:se}=G(`common_status`),{items:O}=G(`menu_visible`),k=be(),A=V(()=>k.data??[],[k.data]),j=q(),M=le({entityName:`菜单`,save:ce(j,{create:K.create.input.shape.body,update:K.update.input.shape.body}),useDetail:ye,defaults:()=>({type:`menu`,status:`enabled`,visible:`show`,sort:0,parentId:t.current,isExternal:!1,embed:!1,keepAlive:!1}),toValues:e=>({title:e.title,type:e.type,name:e.name,path:e.path,component:e.component,permission:e.permission,query:e.query,icon:e.icon,parentId:e.parentId,sort:e.sort,status:e.status,visible:e.visible?`show`:`hidden`,isExternal:e.isExternal,embed:e.embed,keepAlive:e.keepAlive}),beforeSave:(e,{editing:t})=>{let n=t=>typeof e[t]==`string`&&e[t]?e[t]:void 0;return{title:e.title,type:e.type,sort:e.sort,status:e.status,parentId:r??0,icon:s||void 0,name:n(`name`),path:n(`path`),component:n(`component`),permission:n(`permission`),query:n(`query`),visible:e.visible===void 0||e.visible===`show`,isExternal:e.isExternal,embed:e.isExternal?e.embed??!1:!1,keepAlive:e.keepAlive,...t?{clearFields:[...[`name`,`path`,`component`,`permission`,`query`].filter(e=>!n(e)),...s?[]:[`icon`]]}:{}}}}),N=q(),P=ve();fe({resource:`menus`,title:`菜单`,permission:`system:menu`,hasPermission:e,modal:M,list:K.tree,detail:K.detail,create:K.create.input.shape.body,update:K.update.input.shape.body,fields:[`id`,`parentId`,`title`,`name`,`path`,`component`,`permission`,`type`,`icon`,`query`,`sort`,`status`,`visible`,`isExternal`,`embed`,`keepAlive`],guardValues:Ee,filters:{...w},remove:e=>P.mutateAsync({params:{id:e}}),deleteContent:`子菜单也将一并删除`,toForm:e=>({...e,...`visible`in e?{visible:e.visible?`show`:`hidden`}:{}}),applyValues:(e,{isEdit:t})=>{(!t||`parentId`in e)&&i(e.parentId??0),(!t||`icon`in e)&&l(e.icon??``),(!t||`type`in e)&&_(e.type??`menu`),(!t||`isExternal`in e)&&b(!!e.isExternal)}}),B(()=>{let e=M.editing;e&&M.visible&&(i(e.parentId??0),l(e.icon??``),_(e.type),b(e.isExternal??!1))},[M.editing,M.visible]);let F=pe((e,t,n)=>e.reduce((e,r)=>{let i=r.children?.length?F(r.children,t,n):[],a=!t||xe(r.title,t),o=!n||r.status===n,s=[];return i.length>0?s=i:r.children?.length&&(s=[]),(a&&o||i.length>0)&&e.push({...r,children:s}),e},[]),[]),{keyword:L,status:z=``}=w,J=Se(),Y=V(()=>L||z?F(A,L,z):A,[A,L,z,F,J]),{expandedRowKeys:X,setExpandedRowKeys:Z,allRowKeys:Q,isAllExpanded:Oe,toggleExpandAll:ke,onExpandedRowsChange:Ae}=Ce(Y);B(()=>{(L||z)&&Z(Q)},[L,z,Q,Z]);let je=()=>{E(),Z([])};function Me(e){return e.filter(e=>e.type!==`button`).map(e=>({label:e.title,value:e.id,key:String(e.id),children:e.children?.length?Me(e.children):void 0}))}let Ne=[{label:`顶级`,value:0,key:`0`},...Me(A)],$=e=>{let n=e??0;t.current=n,i(n),l(``),_(`menu`),b(!1),M.openCreate()},Pe=e=>{i(e.parentId??0),l(e.icon??``),_(e.type),b(e.isExternal??!1),M.openEdit(e)},Fe=ne({toggle:(e,t)=>N.mutateAsync({id:e.id,values:{status:t?`enabled`:`disabled`}}),confirmDisable:e=>({danger:!0,title:`确认禁用菜单「${e.title}」?`,content:`禁用后该菜单将不可访问。`,okText:`确认禁用`}),disabled:!e(`system:menu:update`)}),Ie=re({permission:`system:menu`,edit:Pe,remove:e=>P.mutateAsync({params:{id:e.id}}),title:`确认删除此菜单?`,content:`子菜单也将一并删除`,extra:t=>[{key:`child`,label:`子项`,hidden:t.type===`button`||!e(`system:menu:create`),onClick:()=>$(t.id)}],width:210,desktopInlineKeys:[`child`,`edit`,`delete`]}),Le=[{title:`菜单名称`,dataIndex:`title`,minWidth:280,useFullRender:!0,render:(e,t,n,r)=>{let i=r?.expandIcon,a=r?.indentText;return/* @__PURE__ */ W(`span`,{style:{display:`flex`,alignItems:`center`,minWidth:0},children:[a,i,t.icon&&/* @__PURE__ */ U(`span`,{style:{marginRight:6,marginLeft:4,display:`flex`,alignItems:`center`,color:`var(--arc-antd-color-text-1)`,flexShrink:0},children:I(t.icon,15)}),/* @__PURE__ */ U(`span`,{style:{overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:String(e),children:e})]})}},{title:`类型`,dataIndex:`type`,width:90,render:e=>/* @__PURE__ */ U(R,{dictCode:`menu_type`,value:e})},{title:`路由路径`,dataIndex:`path`,width:180,render:D},{title:`组件路径`,dataIndex:`component`,width:250,render:D},{title:`权限标识`,dataIndex:`permission`,width:200,render:D},{title:`排序`,dataIndex:`sort`,width:70,align:`center`},ae,{title:`状态`,dataIndex:`status`,width:80,fixed:`right`,render:(e,t)=>t.type===`button`?oe:Fe.renderSwitch(t)},{title:`显示`,dataIndex:`visible`,width:80,align:`center`,fixed:`right`,render:(e,t)=>t.type===`button`?oe:/* @__PURE__ */ U(R,{dictCode:`menu_visible`,value:e?`show`:`hidden`})},Ie],Re=()=>/* @__PURE__ */ U(h,{type:`primary`,icon:U(Oe?ee:te,{size:14}),onClick:ke,children:Oe?`全部折叠`:`全部展开`});return/* @__PURE__ */ W(`div`,{className:`page-container`,style:{height:`100%`,display:`flex`,flexDirection:`column`},children:[k.isError&&/* @__PURE__ */ U(u,{fullMode:!1,type:`danger`,bordered:!0,closeIcon:null,description:`菜单数据加载失败,请检查网络后点击表格右上角刷新重试`,style:{marginBottom:12}}),/* @__PURE__ */ U(`div`,{style:{flex:1,minHeight:0},children:/* @__PURE__ */ U(de,{searchConfig:a({keyword:/* @__PURE__ */ U(f,{placeholder:`菜单名称`,...C(`keyword`),width:200}),filters:/* @__PURE__ */ U(g,{items:se,...S(`status`)}),onSearch:T,onReset:je,create:/* @__PURE__ */ U(x,{permission:`system:menu:create`,onClick:()=>$()}),actions:Re(),filterTitle:`菜单筛选`,actionTitle:`菜单操作`}),bordered:!0,columns:Le,dataSource:Y,rowKey:`id`,loading:k.isFetching,onRefresh:()=>void k.refetch(),refreshLoading:k.isFetching,pagination:!1,expandedRowKeys:X,onExpandedRowsChange:Ae,childrenRecordName:`children`,virtualized:!0})}),/* @__PURE__ */ W(ue,{modal:M,width:680,children:[/* @__PURE__ */ U(o.RadioGroup,{field:`type`,label:`菜单类型`,rules:[{required:!0}],onChange:e=>_(e.target.value),type:`button`,children:ie.map(e=>/* @__PURE__ */ U(c,{value:e.value,children:e.label},e.value))}),/* @__PURE__ */ U(o.Slot,{label:{text:`父级菜单`},children:/* @__PURE__ */ U(n,{treeData:Ne,value:r??0,onChange:e=>i(e),style:{width:`100%`},placeholder:`请选择父级菜单`,filterTreeNode:!0,showFilteredOnly:!0,virtualize:{height:300,itemSize:36}})}),/* @__PURE__ */ W(y,{gutter:16,children:[/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`title`,label:`菜单名称`,placeholder:`请输入菜单名称`,rules:[{required:!0,message:`请输入菜单名称`}]})}),m!==`button`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Slot,{label:{text:`图标`},children:/* @__PURE__ */ U(we,{value:s,onChange:l})})}),(m===`menu`||m===`directory`)&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`path`,label:`路由路径`,placeholder:`请输入路由路径`,rules:m===`menu`?[{required:!0,message:`请输入路由路径`}]:void 0})}),m===`menu`&&!v&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`component`,label:`组件路径`,placeholder:`例如: users/UsersPage`,rules:[{required:!0,message:`请输入组件路径`}]})}),m===`menu`&&!v&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`name`,label:`组件名`,placeholder:`前端组件Name`})}),(m===`menu`||m===`directory`)&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`query`,label:/* @__PURE__ */ U(p,{content:`访问路由的默认传递参数,如:{"id": 1, "name": "ry"}`,children:`路由参数`}),placeholder:`如:{"id": 1, "name": "ry"}`})}),(m===`menu`||m===`directory`)&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ W(o.RadioGroup,{field:`isExternal`,label:/* @__PURE__ */ U(p,{content:`选择是外链则路由地址需要以 http(s):// 开头`,children:`是否外链`}),type:`button`,onChange:e=>b(e.target.value),children:[/* @__PURE__ */ U(c,{value:!0,children:`是`}),/* @__PURE__ */ U(c,{value:!1,children:`否`})]})}),(m===`menu`||m===`directory`)&&v&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ W(o.RadioGroup,{field:`embed`,label:/* @__PURE__ */ U(p,{content:`内嵌:在系统内以 iframe 打开外链,保留侧边栏与页签;新窗口:浏览器新标签页打开`,children:`打开方式`}),type:`button`,children:[/* @__PURE__ */ U(c,{value:!1,children:`新窗口`}),/* @__PURE__ */ U(c,{value:!0,children:`内嵌`})]})}),m===`menu`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ W(o.RadioGroup,{field:`keepAlive`,label:/* @__PURE__ */ U(p,{content:`开启后,多页签模式下切换页签保留该页面状态(搜索条件、滚动位置等),关闭页签时释放`,children:`页面缓存`}),type:`button`,children:[/* @__PURE__ */ U(c,{value:!0,children:`开启`}),/* @__PURE__ */ U(c,{value:!1,children:`关闭`})]})}),m===`button`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`permission`,label:`权限标识`,placeholder:`如:system:user:list`,rules:[{required:!0,message:`请输入权限标识`}]})}),/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.InputNumber,{field:`sort`,label:`排序`,placeholder:`请输入排序`,min:0,style:{width:`100%`}})})]}),/* @__PURE__ */ W(y,{gutter:16,children:[/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(Te,{type:`button`,rules:[{required:!0}]})}),m!==`button`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.RadioGroup,{field:`visible`,label:`显示状态`,type:`button`,rules:[{required:!0}],children:O.map(e=>/* @__PURE__ */ U(c,{value:e.value,children:e.label},e.value))})})]})]})]})}var De;function Q(){return(Q=e((()=>{i(),C(),w(),k(),F(),Y(),se(),L(),X(),ie(),S(),v(),t(),T(),E(),O(),z(),De={keyword:``,status:void 0}})))()}Q();export{Z as default};
2
- //# sourceMappingURL=MenusPage-Bh55bvKH.js.map
1
+ import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,G as n,I as r,M as i,Q as a,R as o,S as s,Vt as c,ct as l,f as u,h as d,it as f,j as p,lt as m,m as h,ot as g,q as _,st as v,w as y,zt as b}from"./clipboard-dpqHdCyy.js";import{r as x,s as S}from"./toolbar-controls-CrM8hKZg.js";import{i as C,n as w,r as ee,t as te}from"./chevrons-up-down-CDj3bN7O.js";import{n as ne,t as T}from"./useStatusToggle-D7g3Ew35.js";import{n as re,t as E}from"./useCrudOperationColumn-CPAzNGXp.js";import{i as ie,n as ae,s as D,t as oe}from"./table-columns-CvT6OHd2.js";import{a as se,i as ce,o as le,r as O,t as ue}from"./EditFormModal-DVQksS9R.js";import{n as k,t as de}from"./ConfigurableTable-8sYmeul2.js";import{B as A,V as j,_ as M,d as N,g as P,l as F,u as I}from"./App-nh6_qOo8.js";import{n as L,t as R}from"./DictTag-ChBs3uuY.js";import{n as fe,t as z}from"./webmcp-crud-D-Dz8BY4.js";import{useCallback as pe,useEffect as B,useMemo as V,useRef as me,useState as H}from"react";import{jsx as U,jsxs as W}from"react/jsx-runtime";import{useDictItems as G}from"@fudanda/admin-antd/core/hooks/useDictItems";import{menuContract as K}from"@fudanda/admin-antd/core/lib/native-operations";import{usePermission as he}from"@fudanda/admin-antd/core/hooks/usePermission";import{useListSearch as ge}from"@fudanda/admin-antd/core/hooks/useListSearch";import{menuKeys as _e,useDeleteMenu as ve,useMenuDetail as ye,useMenuTree as be,useSaveMenu as q}from"@fudanda/admin-antd/core/hooks/queries/menus";import{textMatches as xe}from"@fudanda/admin-antd/core/utils/pinyin";import{usePinyinReady as Se}from"@fudanda/admin-antd/core/hooks/usePinyinReady";import{useTreeExpansion as Ce}from"@fudanda/admin-antd/core/hooks/useTreeExpansion";function we({value:e,onChange:t,style:n}){let[i,a]=H(``),[o,c]=H(!1),[u,d]=H(1),f=N(),p=V(()=>{let e=i.trim().toLowerCase();return e?f.filter(t=>t.toLowerCase().includes(e)):f},[i,f]),m=V(()=>p.slice((u-1)*J,u*J),[p,u]),h=e=>{a(e),d(1)},g=e=>{c(e),e&&(d(1),a(``))},v=e=>{t?.(e),c(!1),a(``)},y=e=>{e.stopPropagation(),t?.(``)},x=/* @__PURE__ */ W(`div`,{className:`icon-picker-panel`,children:[/* @__PURE__ */ U(b,{size:`small`,prefix:/* @__PURE__ */ U(l,{size:13}),placeholder:`搜索图标(共 ${f.length} 个)…`,value:i,onChange:h,className:`icon-picker-search`,style:{marginBottom:8}}),/* @__PURE__ */ U(`div`,{className:`icon-picker-grid-wrap`,children:/* @__PURE__ */ U(r,{size:`small`,split:!1,grid:{span:3,gutter:4},dataSource:m,emptyContent:/* @__PURE__ */ U(`div`,{className:`icon-picker-empty-result`,children:`无匹配图标`}),renderItem:t=>/* @__PURE__ */ U(r.Item,{style:{padding:0},children:/* @__PURE__ */ U(`button`,{type:`button`,className:`icon-picker-cell${e===t?` icon-picker-cell--active`:``}`,onClick:()=>v(t),title:t,children:I(t,18)})})})}),p.length>J&&/* @__PURE__ */ U(`div`,{className:`icon-picker-pagination`,children:/* @__PURE__ */ U(_,{size:`small`,hoverShowPageSelect:!0,total:p.length,pageSize:J,currentPage:u,onPageChange:e=>d(e),showSizeChanger:!1})})]});return/* @__PURE__ */ U(s,{content:x,visible:o,onVisibleChange:g,trigger:`click`,position:`bottomLeft`,showArrow:!1,children:/* @__PURE__ */ W(`div`,{className:`icon-picker-trigger ${o?`icon-picker-trigger--open`:``}`,style:n,children:[/* @__PURE__ */ U(`span`,{className:`icon-picker-preview`,children:e?I(e,16):null}),/* @__PURE__ */ U(`span`,{className:`icon-picker-label ${e?``:`icon-picker-label--placeholder`}`,children:e||`点击选择图标`}),e?/* @__PURE__ */ U(`button`,{type:`button`,className:`icon-picker-arrow icon-picker-arrow--clear`,onClick:y,children:/* @__PURE__ */ U(P,{size:13})}):/* @__PURE__ */ U(`span`,{className:`icon-picker-arrow`,children:/* @__PURE__ */ U(A,{size:13})})]})})}var J;function Y(){return(Y=e((()=>{i(),m(),j(),M(),F(),J=56})))()}function Te({field:e=`status`,label:t=`状态`,disabled:n,type:r,extraText:i,rules:a}){let{items:s}=G(`common_status`);return/* @__PURE__ */ U(o.RadioGroup,{field:e,label:t,disabled:n,type:r,extraText:i,rules:a,children:s.map(e=>/* @__PURE__ */ U(o.Radio,{value:e.value,children:e.label},e.value))})}function X(){return(X=e((()=>{i()})))()}function Ee(e,t,n=Object.keys(e)){let r=e.type??t?.type??`menu`,i=e.isExternal??t?.isExternal??!1,a={icon:r!==`button`,visible:r!==`button`,path:r!==`button`,query:r!==`button`,isExternal:r!==`button`,component:r===`menu`&&!i,name:r===`menu`&&!i,permission:r===`button`,keepAlive:r===`menu`,embed:r!==`button`&&!!i};if(n.some(e=>a[e]===!1))throw Error(`输入包含当前菜单类型或外链模式下不可编辑的字段`)}function Z(){let{hasPermission:e}=he(),t=me(0),[r,i]=H(null),[s,l]=H(``),[m,_]=H(`menu`),[v,b]=H(!1),{bind:S,bindKeyword:C,submittedParams:w,handleSearch:T,handleReset:E}=ge({defaults:De,listKey:_e.tree}),{items:ie}=G(`menu_type`),{items:se}=G(`common_status`),{items:O}=G(`menu_visible`),k=be(),A=V(()=>k.data??[],[k.data]),j=q(),M=le({entityName:`菜单`,save:ce(j,{create:K.create.input.shape.body,update:K.update.input.shape.body}),useDetail:ye,defaults:()=>({type:`menu`,status:`enabled`,visible:`show`,sort:0,parentId:t.current,isExternal:!1,embed:!1,keepAlive:!1}),toValues:e=>({title:e.title,type:e.type,name:e.name,path:e.path,component:e.component,permission:e.permission,query:e.query,icon:e.icon,parentId:e.parentId,sort:e.sort,status:e.status,visible:e.visible?`show`:`hidden`,isExternal:e.isExternal,embed:e.embed,keepAlive:e.keepAlive}),beforeSave:(e,{editing:t})=>{let n=t=>typeof e[t]==`string`&&e[t]?e[t]:void 0;return{title:e.title,type:e.type,sort:e.sort,status:e.status,parentId:r??0,icon:s||void 0,name:n(`name`),path:n(`path`),component:n(`component`),permission:n(`permission`),query:n(`query`),visible:e.visible===void 0||e.visible===`show`,isExternal:e.isExternal,embed:e.isExternal?e.embed??!1:!1,keepAlive:e.keepAlive,...t?{clearFields:[...[`name`,`path`,`component`,`permission`,`query`].filter(e=>!n(e)),...s?[]:[`icon`]]}:{}}}}),N=q(),P=ve();fe({resource:`menus`,title:`菜单`,permission:`system:menu`,hasPermission:e,modal:M,list:K.tree,detail:K.detail,create:K.create.input.shape.body,update:K.update.input.shape.body,fields:[`id`,`parentId`,`title`,`name`,`path`,`component`,`permission`,`type`,`icon`,`query`,`sort`,`status`,`visible`,`isExternal`,`embed`,`keepAlive`],guardValues:Ee,filters:{...w},remove:e=>P.mutateAsync({params:{id:e}}),deleteContent:`子菜单也将一并删除`,toForm:e=>({...e,...`visible`in e?{visible:e.visible?`show`:`hidden`}:{}}),applyValues:(e,{isEdit:t})=>{(!t||`parentId`in e)&&i(e.parentId??0),(!t||`icon`in e)&&l(e.icon??``),(!t||`type`in e)&&_(e.type??`menu`),(!t||`isExternal`in e)&&b(!!e.isExternal)}}),B(()=>{let e=M.editing;e&&M.visible&&(i(e.parentId??0),l(e.icon??``),_(e.type),b(e.isExternal??!1))},[M.editing,M.visible]);let F=pe((e,t,n)=>e.reduce((e,r)=>{let i=r.children?.length?F(r.children,t,n):[],a=!t||xe(r.title,t),o=!n||r.status===n,s=[];return i.length>0?s=i:r.children?.length&&(s=[]),(a&&o||i.length>0)&&e.push({...r,children:s}),e},[]),[]),{keyword:L,status:z=``}=w,J=Se(),Y=V(()=>L||z?F(A,L,z):A,[A,L,z,F,J]),{expandedRowKeys:X,setExpandedRowKeys:Z,allRowKeys:Q,isAllExpanded:Oe,toggleExpandAll:ke,onExpandedRowsChange:Ae}=Ce(Y);B(()=>{(L||z)&&Z(Q)},[L,z,Q,Z]);let je=()=>{E(),Z([])};function Me(e){return e.filter(e=>e.type!==`button`).map(e=>({label:e.title,value:e.id,key:String(e.id),children:e.children?.length?Me(e.children):void 0}))}let Ne=[{label:`顶级`,value:0,key:`0`},...Me(A)],$=e=>{let n=e??0;t.current=n,i(n),l(``),_(`menu`),b(!1),M.openCreate()},Pe=e=>{i(e.parentId??0),l(e.icon??``),_(e.type),b(e.isExternal??!1),M.openEdit(e)},Fe=ne({toggle:(e,t)=>N.mutateAsync({id:e.id,values:{status:t?`enabled`:`disabled`}}),confirmDisable:e=>({danger:!0,title:`确认禁用菜单「${e.title}」?`,content:`禁用后该菜单将不可访问。`,okText:`确认禁用`}),disabled:!e(`system:menu:update`)}),Ie=re({permission:`system:menu`,edit:Pe,remove:e=>P.mutateAsync({params:{id:e.id}}),title:`确认删除此菜单?`,content:`子菜单也将一并删除`,extra:t=>[{key:`child`,label:`子项`,hidden:t.type===`button`||!e(`system:menu:create`),onClick:()=>$(t.id)}],width:210,desktopInlineKeys:[`child`,`edit`,`delete`]}),Le=[{title:`菜单名称`,dataIndex:`title`,minWidth:280,useFullRender:!0,render:(e,t,n,r)=>{let i=r?.expandIcon,a=r?.indentText;return/* @__PURE__ */ W(`span`,{style:{display:`flex`,alignItems:`center`,minWidth:0},children:[a,i,t.icon&&/* @__PURE__ */ U(`span`,{style:{marginRight:6,marginLeft:4,display:`flex`,alignItems:`center`,color:`var(--arc-antd-color-text-1)`,flexShrink:0},children:I(t.icon,15)}),/* @__PURE__ */ U(`span`,{style:{overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:String(e),children:e})]})}},{title:`类型`,dataIndex:`type`,width:90,render:e=>/* @__PURE__ */ U(R,{dictCode:`menu_type`,value:e})},{title:`路由路径`,dataIndex:`path`,width:180,render:D},{title:`组件路径`,dataIndex:`component`,width:250,render:D},{title:`权限标识`,dataIndex:`permission`,width:200,render:D},{title:`排序`,dataIndex:`sort`,width:70,align:`center`},ae,{title:`状态`,dataIndex:`status`,width:80,fixed:`right`,render:(e,t)=>t.type===`button`?oe:Fe.renderSwitch(t)},{title:`显示`,dataIndex:`visible`,width:80,align:`center`,fixed:`right`,render:(e,t)=>t.type===`button`?oe:/* @__PURE__ */ U(R,{dictCode:`menu_visible`,value:e?`show`:`hidden`})},Ie],Re=()=>/* @__PURE__ */ U(h,{type:`primary`,icon:U(Oe?ee:te,{size:14}),onClick:ke,children:Oe?`全部折叠`:`全部展开`});return/* @__PURE__ */ W(`div`,{className:`page-container`,style:{height:`100%`,display:`flex`,flexDirection:`column`},children:[k.isError&&/* @__PURE__ */ U(u,{fullMode:!1,type:`danger`,bordered:!0,closeIcon:null,description:`菜单数据加载失败,请检查网络后点击表格右上角刷新重试`,style:{marginBottom:12}}),/* @__PURE__ */ U(`div`,{style:{flex:1,minHeight:0},children:/* @__PURE__ */ U(de,{searchConfig:a({keyword:/* @__PURE__ */ U(f,{placeholder:`菜单名称`,...C(`keyword`),width:200}),filters:/* @__PURE__ */ U(g,{items:se,...S(`status`)}),onSearch:T,onReset:je,create:/* @__PURE__ */ U(x,{permission:`system:menu:create`,onClick:()=>$()}),actions:Re(),filterTitle:`菜单筛选`,actionTitle:`菜单操作`}),bordered:!0,columns:Le,dataSource:Y,rowKey:`id`,loading:k.isFetching,onRefresh:()=>void k.refetch(),refreshLoading:k.isFetching,pagination:!1,expandedRowKeys:X,onExpandedRowsChange:Ae,childrenRecordName:`children`,virtualized:!0})}),/* @__PURE__ */ W(ue,{modal:M,width:680,children:[/* @__PURE__ */ U(o.RadioGroup,{field:`type`,label:`菜单类型`,rules:[{required:!0}],onChange:e=>_(e.target.value),type:`button`,children:ie.map(e=>/* @__PURE__ */ U(c,{value:e.value,children:e.label},e.value))}),/* @__PURE__ */ U(o.Slot,{label:{text:`父级菜单`},children:/* @__PURE__ */ U(n,{treeData:Ne,value:r??0,onChange:e=>i(e),style:{width:`100%`},placeholder:`请选择父级菜单`,filterTreeNode:!0,showFilteredOnly:!0,virtualize:{height:300,itemSize:36}})}),/* @__PURE__ */ W(y,{gutter:16,children:[/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`title`,label:`菜单名称`,placeholder:`请输入菜单名称`,rules:[{required:!0,message:`请输入菜单名称`}]})}),m!==`button`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Slot,{label:{text:`图标`},children:/* @__PURE__ */ U(we,{value:s,onChange:l})})}),(m===`menu`||m===`directory`)&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`path`,label:`路由路径`,placeholder:`请输入路由路径`,rules:m===`menu`?[{required:!0,message:`请输入路由路径`}]:void 0})}),m===`menu`&&!v&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`component`,label:`组件路径`,placeholder:`例如: users/UsersPage`,rules:[{required:!0,message:`请输入组件路径`}]})}),m===`menu`&&!v&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`name`,label:`组件名`,placeholder:`前端组件Name`})}),(m===`menu`||m===`directory`)&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`query`,label:/* @__PURE__ */ U(p,{content:`访问路由的默认传递参数,如:{"id": 1, "name": "ry"}`,children:`路由参数`}),placeholder:`如:{"id": 1, "name": "ry"}`})}),(m===`menu`||m===`directory`)&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ W(o.RadioGroup,{field:`isExternal`,label:/* @__PURE__ */ U(p,{content:`选择是外链则路由地址需要以 http(s):// 开头`,children:`是否外链`}),type:`button`,onChange:e=>b(e.target.value),children:[/* @__PURE__ */ U(c,{value:!0,children:`是`}),/* @__PURE__ */ U(c,{value:!1,children:`否`})]})}),(m===`menu`||m===`directory`)&&v&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ W(o.RadioGroup,{field:`embed`,label:/* @__PURE__ */ U(p,{content:`内嵌:在系统内以 iframe 打开外链,保留侧边栏与页签;新窗口:浏览器新标签页打开`,children:`打开方式`}),type:`button`,children:[/* @__PURE__ */ U(c,{value:!1,children:`新窗口`}),/* @__PURE__ */ U(c,{value:!0,children:`内嵌`})]})}),m===`menu`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ W(o.RadioGroup,{field:`keepAlive`,label:/* @__PURE__ */ U(p,{content:`开启后,多页签模式下切换页签保留该页面状态(搜索条件、滚动位置等),关闭页签时释放`,children:`页面缓存`}),type:`button`,children:[/* @__PURE__ */ U(c,{value:!0,children:`开启`}),/* @__PURE__ */ U(c,{value:!1,children:`关闭`})]})}),m===`button`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.Input,{field:`permission`,label:`权限标识`,placeholder:`如:system:user:list`,rules:[{required:!0,message:`请输入权限标识`}]})}),/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.InputNumber,{field:`sort`,label:`排序`,placeholder:`请输入排序`,min:0,style:{width:`100%`}})})]}),/* @__PURE__ */ W(y,{gutter:16,children:[/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(Te,{type:`button`,rules:[{required:!0}]})}),m!==`button`&&/* @__PURE__ */ U(d,{span:12,children:/* @__PURE__ */ U(o.RadioGroup,{field:`visible`,label:`显示状态`,type:`button`,rules:[{required:!0}],children:O.map(e=>/* @__PURE__ */ U(c,{value:e.value,children:e.label},e.value))})})]})]})]})}var De;function Q(){return(Q=e((()=>{i(),C(),w(),k(),F(),Y(),se(),L(),X(),ie(),S(),v(),t(),T(),E(),O(),z(),De={keyword:``,status:void 0}})))()}Q();export{Z as default};
2
+ //# sourceMappingURL=MenusPage-Bytd1HlW.js.map