@fudanda/admin-antd 2.20261107.1-beta.1 → 2.20261109.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{App-BF96TQ_D.js → App-CfQx7jWq.js} +4 -4
- package/dist/chunks/{App-BF96TQ_D.js.map → App-CfQx7jWq.js.map} +1 -1
- package/dist/chunks/{AppModal-CLkMJ-96.js → AppModal-CVoUC2t3.js} +2 -2
- package/dist/chunks/{AppModal-CLkMJ-96.js.map → AppModal-CVoUC2t3.js.map} +1 -1
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js → ArcBaseAdmin-DQyddbFC.js} +2 -2
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js.map → ArcBaseAdmin-DQyddbFC.js.map} +1 -1
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js → DepartmentsPage-CQx53QGE.js} +2 -2
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js.map → DepartmentsPage-CQx53QGE.js.map} +1 -1
- package/dist/chunks/{DictsPage-uV3Uukwc.js → DictsPage-BGnamkWk.js} +2 -2
- package/dist/chunks/{DictsPage-uV3Uukwc.js.map → DictsPage-BGnamkWk.js.map} +1 -1
- package/dist/chunks/EntityContextRuntime-C9q95WDf.js +1 -0
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js → EntityContextRuntime-CbzeMNXR.js} +2 -2
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js.map → EntityContextRuntime-CbzeMNXR.js.map} +1 -1
- package/dist/chunks/{ExportButton-e2ybxuHb.js → ExportButton-sMPAV2hd.js} +2 -2
- package/dist/chunks/{ExportButton-e2ybxuHb.js.map → ExportButton-sMPAV2hd.js.map} +1 -1
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js → FileViewerPreviewPanel-Rti7pUhU.js} +3 -3
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js.map → FileViewerPreviewPanel-Rti7pUhU.js.map} +1 -1
- package/dist/chunks/{FilesPage-BI35mStl.js → FilesPage-D_iYsUwl.js} +3 -3
- package/dist/chunks/{FilesPage-BI35mStl.js.map → FilesPage-D_iYsUwl.js.map} +1 -1
- package/dist/chunks/IdentitySecurityPage-rDYX5ksX.js +9 -0
- package/dist/chunks/IdentitySecurityPage-rDYX5ksX.js.map +1 -0
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js → LogStatsScaffold-CMIz4z0a.js} +2 -2
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js.map → LogStatsScaffold-CMIz4z0a.js.map} +1 -1
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js → LoginLogsPage-Bv5pPJb2.js} +2 -2
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js.map → LoginLogsPage-Bv5pPJb2.js.map} +1 -1
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js → LoginLogsTable-DYcTx2oR.js} +2 -2
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js.map → LoginLogsTable-DYcTx2oR.js.map} +1 -1
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js → MarkdownPreviewPanel-lqs6AsoN.js} +2 -2
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js.map → MarkdownPreviewPanel-lqs6AsoN.js.map} +1 -1
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js → MasterDetailLayout-B5uqvh98.js} +2 -2
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js.map → MasterDetailLayout-B5uqvh98.js.map} +1 -1
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js → McpSettingsPage-Cdej9Evi.js} +2 -2
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js.map → McpSettingsPage-Cdej9Evi.js.map} +1 -1
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js → MemberAssignmentSheet-AKvLbbYW.js} +2 -2
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js.map → MemberAssignmentSheet-AKvLbbYW.js.map} +1 -1
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js → MenuCommandPalette-ia0pSIFg.js} +2 -2
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js.map → MenuCommandPalette-ia0pSIFg.js.map} +1 -1
- package/dist/chunks/{MenusPage-Dd7OLQYT.js → MenusPage-Bh55bvKH.js} +2 -2
- package/dist/chunks/{MenusPage-Dd7OLQYT.js.map → MenusPage-Bh55bvKH.js.map} +1 -1
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js → MonacoPreviewPanel-CT_sjf7Z.js} +2 -2
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js.map → MonacoPreviewPanel-CT_sjf7Z.js.map} +1 -1
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js → NavListPanel-DMIUMh7q.js} +2 -2
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js.map → NavListPanel-DMIUMh7q.js.map} +1 -1
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js → OperationLogsPage-7XVfmhxP.js} +2 -2
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js.map → OperationLogsPage-7XVfmhxP.js.map} +1 -1
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js → OperationLogsTable-gp-WZxiF.js} +3 -3
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js.map → OperationLogsTable-gp-WZxiF.js.map} +1 -1
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js → PDFPreviewPanel-CyfhyWav.js} +3 -3
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js.map → PDFPreviewPanel-CyfhyWav.js.map} +1 -1
- package/dist/chunks/{PositionsPage-BIKYQDB5.js → PositionsPage-Bwua1vNV.js} +2 -2
- package/dist/chunks/{PositionsPage-BIKYQDB5.js.map → PositionsPage-Bwua1vNV.js.map} +1 -1
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js → PreferencesSheetBody-C80D3dOM.js} +2 -2
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js.map → PreferencesSheetBody-C80D3dOM.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DLftC6KZ.js → ProfilePage-DeTw-59a.js} +2 -2
- package/dist/chunks/{ProfilePage-DLftC6KZ.js.map → ProfilePage-DeTw-59a.js.map} +1 -1
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js → ProjectInfoPage-Bqn3gfXa.js} +2 -2
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js.map → ProjectInfoPage-Bqn3gfXa.js.map} +1 -1
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js → RelationPanel-Bio-ig-l.js} +2 -2
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js.map → RelationPanel-Bio-ig-l.js.map} +1 -1
- package/dist/chunks/{RolesPage-BhltU2Qm.js → RolesPage-fwUSs2HR.js} +2 -2
- package/dist/chunks/{RolesPage-BhltU2Qm.js.map → RolesPage-fwUSs2HR.js.map} +1 -1
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js → SessionConflictModal-Dw4opoNP.js} +2 -2
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js.map → SessionConflictModal-Dw4opoNP.js.map} +1 -1
- package/dist/chunks/{SettingModuleDetail-Dppk9An1.js → SettingModuleDetail-I9CSJ-fh.js} +2 -2
- package/dist/chunks/{SettingModuleDetail-Dppk9An1.js.map → SettingModuleDetail-I9CSJ-fh.js.map} +1 -1
- package/dist/chunks/{SettingsPage-DMzeDrnc.js → SettingsPage-Cy5-q-P6.js} +2 -2
- package/dist/chunks/{SettingsPage-DMzeDrnc.js.map → SettingsPage-Cy5-q-P6.js.map} +1 -1
- package/dist/chunks/{StatCard-C0xSZyiS.js → StatCard-BROG4NSp.js} +2 -2
- package/dist/chunks/{StatCard-C0xSZyiS.js.map → StatCard-BROG4NSp.js.map} +1 -1
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js → UserGroupsPage-CsTBkUPy.js} +2 -2
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js.map → UserGroupsPage-CsTBkUPy.js.map} +1 -1
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js → UserLogsPanels-3u8Z93YU.js} +2 -2
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js.map → UserLogsPanels-3u8Z93YU.js.map} +1 -1
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js → UserTransferSelect-ChLj4EkS.js} +2 -2
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js.map → UserTransferSelect-ChLj4EkS.js.map} +1 -1
- package/dist/chunks/{UsersPage--p68X2Yr.js → UsersPage-CfNnQJi4.js} +2 -2
- package/dist/chunks/{UsersPage--p68X2Yr.js.map → UsersPage-CfNnQJi4.js.map} +1 -1
- package/dist/chunks/{browser-BKLM0ThC-3Xar5rZw.js → browser-BKLM0ThC-D0TgzKTC.js} +1 -1
- package/dist/chunks/{code-P0HJS_q1.js → code-BkkeN2fd.js} +1 -1
- package/dist/chunks/{direct-engine-BYEscsGg.js → direct-engine-m32m22nx.js} +1 -1
- package/dist/chunks/{html-B__1Vr_C.js → html-BGNWR_Bp.js} +1 -1
- package/dist/chunks/{line-DzLRZVEq.js → line-CsTeuEcK.js} +1 -1
- package/dist/chunks/{lrc-kf-TilFB.js → lrc-D6gjnGZ5.js} +1 -1
- package/dist/chunks/{markdown-xIo-vnKK.js → markdown-BglUe9j8.js} +1 -1
- package/dist/chunks/{patch-BEaX-xYV.js → patch-C97Yl3jr.js} +1 -1
- package/dist/chunks/{worker-engine-FCdIQLzN.js → worker-engine-B7_3qQVS.js} +1 -1
- package/dist/core/hooks/queries/settings.d.ts +6 -0
- package/dist/core/hooks/queries/settings.d.ts.map +1 -1
- package/dist/core/hooks/queries/settings.js +34 -25
- package/dist/core/hooks/queries/settings.js.map +1 -1
- package/dist/core/hooks/useAuth.d.ts +2 -0
- package/dist/core/hooks/useAuth.d.ts.map +1 -1
- package/dist/core/hooks/useAuth.js.map +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/lib/go-auth-api.d.ts +1 -1
- package/dist/core/lib/go-auth-api.d.ts.map +1 -1
- package/dist/core/lib/go-auth-api.js +12 -8
- package/dist/core/lib/go-auth-api.js.map +1 -1
- package/dist/core/lib/native-operations.d.ts +85 -4
- package/dist/core/lib/native-operations.d.ts.map +1 -1
- package/dist/core/lib/native-operations.js +1 -0
- package/dist/core/lib/native-operations.js.map +1 -1
- package/dist/core/providers/GoAuthProvider.d.ts.map +1 -1
- package/dist/core/providers/GoAuthProvider.js +191 -142
- package/dist/core/providers/GoAuthProvider.js.map +1 -1
- package/dist/core/session-renewal.d.ts +15 -0
- package/dist/core/session-renewal.d.ts.map +1 -0
- package/dist/core/session-renewal.js +95 -0
- package/dist/core/session-renewal.js.map +1 -0
- package/dist/core/session-transition.d.ts +2 -0
- package/dist/core/session-transition.d.ts.map +1 -1
- package/dist/core/session-transition.js +20 -7
- package/dist/core/session-transition.js.map +1 -1
- package/dist/core/session.d.ts +4 -0
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +88 -61
- package/dist/core/session.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{src-C8_bzBi4.js → src-DAkFn9SG.js} +2 -2
- package/dist/{src-C8_bzBi4.js.map → src-DAkFn9SG.js.map} +1 -1
- package/package.json +9 -9
- package/dist/chunks/EntityContextRuntime-BOJySc1D.js +0 -1
- package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js +0 -9
- package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,ft as n,pt as r}from"./clipboard-dpqHdCyy.js";import{n as i}from"./feedback-B1UL2ETz.js";import{n as a,t as o}from"./useModalViewport-D49TXC25.js";import{A as s,_ as c,g as l,j as u}from"./App-
|
|
2
|
-
//# sourceMappingURL=AppModal-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{M as t,ft as n,pt as r}from"./clipboard-dpqHdCyy.js";import{n as i}from"./feedback-B1UL2ETz.js";import{n as a,t as o}from"./useModalViewport-D49TXC25.js";import{A as s,_ as c,g as l,j as u}from"./App-CfQx7jWq.js";import{useState as d}from"react";import{jsx as f,jsxs as p}from"react/jsx-runtime";import{useOptionalPreferences as m}from"@fudanda/admin-antd/core/hooks/usePreferences";function h({title:e,onCancel:t,fullscreenable:r=!1,restoreViewport:o=!0,fullscreen:c,onToggleFullscreen:u,maskClosable:h,children:g,afterClose:_,visible:v,...y}){let[b,x]=d(!1),S=a(v,o,_),C=m()?.preferences.modalClickMaskToClose??!1,w=h??C,T=c!==void 0,E=T?c:b;return/* @__PURE__ */ f(i,{closeOnEsc:!0,header:/* @__PURE__ */ p(`div`,{className:`app-modal-header`,children:[/* @__PURE__ */ f(`span`,{className:`app-modal-title`,children:e}),/* @__PURE__ */ p(`div`,{className:`app-modal-actions`,children:[r&&/* @__PURE__ */ f(`button`,{type:`button`,className:`app-modal-icon-btn`,"aria-label":E?`还原`:`全屏`,onClick:()=>{T?u?.():x(e=>!e)},children:f(E?s:n,{size:15})}),/* @__PURE__ */ f(`button`,{type:`button`,className:`app-modal-icon-btn`,"aria-label":`关闭`,onClick:e=>t?.(e),children:/* @__PURE__ */ f(l,{size:15})})]})]}),closable:!1,fullScreen:E,maskClosable:w,onCancel:t,afterClose:S,visible:v,...y,children:g})}function g(){return(g=e((()=>{o(),t(),r(),u(),c()})))()}export{g as n,h as t};
|
|
2
|
+
//# sourceMappingURL=AppModal-CVoUC2t3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppModal-
|
|
1
|
+
{"version":3,"file":"AppModal-CVoUC2t3.js","mappings":"ybA6BA,SAAgBA,EAAS,CAAE,QAAO,WAAU,iBAAiB,GAAO,kBAAkB,GAAM,WAAYC,EAAsB,qBAAoB,aAAcC,EAAkB,WAAU,aAAY,UAAS,GAAGC,GAAiC,CACjP,GAAM,CAACC,EAAoBC,GAAyBC,EAAS,EAAK,EAC5DC,EAAmBC,EAAiBC,EAASC,EAAiBC,CAAU,EAExEC,EAAwBC,EAAuB,CAAC,EAAE,YAAY,uBAAyB,GACvFC,EAAeZ,GAAoBU,EAEnCG,EAAed,IAAyB,OACxCe,EAAaD,EAAed,EAAuBG,EAoBzD,MAAQ,kBAACa,EAAD,CAAO,cAAmB,OAXlBC,kBAAC,MAAD,CAAK,UAAU,mBAAf,UACd,kBAAC,OAAD,CAAM,UAAU,kBAAmB,SAAAC,CAAY,GAC/C,kBAAC,MAAD,CAAK,UAAU,oBAAf,UACGC,GAAmB,kBAAC,SAAD,CAAQ,KAAK,SAAS,UAAU,qBAAqB,aAAYJ,EAAa,KAAO,KAAM,YAXxF,CACnBD,EACAM,IAAqB,EAGrBhB,EAAuB,GAAM,CAACiB,CAAC,CAEvC,EAKS,SAAaC,EAAbP,EAAcQ,EAAwBC,EAAzB,CAAU,KAAM,EAAI,CAAwB,CACpD,GACV,kBAAC,SAAD,CAAQ,KAAK,SAAS,UAAU,qBAAqB,aAAW,KAAK,QAAU,GAAMC,IAAW,CAAC,EAC/F,2BAACC,EAAD,CAAG,KAAM,EAAI,EACP,EACL,CACF,G,CAC6B,EAAQ,SAAU,GAAO,WAAYX,EAA0B,eAAwB,WAAU,WAAYT,EAA2B,UAAS,GAAIJ,EACpL,UACI,EACX,C","names":["AppModal","controlledFullscreen","maskClosableProp","rest","internalFullscreen","setInternalFullscreen","useState","handleAfterClose","useModalViewport","visible","restoreViewport","afterClose","modalClickMaskToClose","useOptionalPreferences","maskClosable","isControlled","fullscreen","Modal","_jsxs","title","fullscreenable","onToggleFullscreen","s","jsx","Minimize","Maximize","onCancel","X"],"ignoreList":[],"sources":["../../src/components/AppModal.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useModalViewport } from '@/hooks/useModalViewport';\nimport { Modal } from \"@/ui\";\nimport type { ModalReactProps } from \"@/ui\";\nimport { Maximize, Minimize, X } from 'lucide-react';\nimport { useOptionalPreferences } from \"@fudanda/react-core/hooks/usePreferences\";\nimport \"@/components/AppModal.css\";\nexport interface AppModalProps extends Omit<ModalReactProps, 'header' | 'closable' | 'closeIcon' | 'fullScreen'> {\n /** 是否显示全屏切换按钮,默认 false;大面积预览可显式启用 */\n fullscreenable?: boolean;\n /** 关闭后恢复后台共享内容区滚动位置,默认 true */\n restoreViewport?: boolean;\n /**\n * 受控全屏状态。传入时 AppModal 进入受控模式,全屏由外部管理。\n * 必须与 onToggleFullscreen 配合使用。\n */\n fullscreen?: boolean;\n /** 受控模式下的全屏切换回调 */\n onToggleFullscreen?: () => void;\n}\n/**\n * 带全屏切换能力的 Modal 封装。\n * 右上角默认仅展示「关闭」按钮;fullscreenable 可启用「全屏/还原」。\n * 所有 Semi Modal props(width、footer、onOk 等)均透传。\n *\n * 支持两种全屏控制模式:\n * - 非受控(默认):组件内部维护 fullscreen 状态,适合普通表单弹窗\n * - 受控:传入 `fullscreen` + `onToggleFullscreen`,适合需要外部感知全屏变化的场景(如文件预览)\n */\nexport function AppModal({ title, onCancel, fullscreenable = false, restoreViewport = true, fullscreen: controlledFullscreen, onToggleFullscreen, maskClosable: maskClosableProp, children, afterClose, visible, ...rest }: Readonly<AppModalProps>) {\n const [internalFullscreen, setInternalFullscreen] = useState(false);\n const handleAfterClose = useModalViewport(visible, restoreViewport, afterClose);\n // 弹窗点击遮罩关闭偏好:调用方显式传入时优先(如必填确认框强制 maskClosable=false)\n const modalClickMaskToClose = useOptionalPreferences()?.preferences.modalClickMaskToClose ?? false;\n const maskClosable = maskClosableProp ?? modalClickMaskToClose;\n // 受控模式:外部传入 fullscreen;非受控模式:使用内部 state\n const isControlled = controlledFullscreen !== undefined;\n const fullscreen = isControlled ? controlledFullscreen : internalFullscreen;\n const handleToggle = () => {\n if (isControlled) {\n onToggleFullscreen?.();\n }\n else {\n setInternalFullscreen((s) => !s);\n }\n };\n const header = (<div className=\"app-modal-header\">\n <span className=\"app-modal-title\">{title}</span>\n <div className=\"app-modal-actions\">\n {fullscreenable && (<button type=\"button\" className=\"app-modal-icon-btn\" aria-label={fullscreen ? '还原' : '全屏'} onClick={handleToggle}>\n {fullscreen ? <Minimize size={15}/> : <Maximize size={15}/>}\n </button>)}\n <button type=\"button\" className=\"app-modal-icon-btn\" aria-label=\"关闭\" onClick={(e) => onCancel?.(e)}>\n <X size={15}/>\n </button>\n </div>\n </div>);\n return (<Modal closeOnEsc header={header} closable={false} fullScreen={fullscreen} maskClosable={maskClosable} onCancel={onCancel} afterClose={handleAfterClose} visible={visible} {...rest}>\n {children}\n </Modal>);\n}\nexport default AppModal;\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-Bruge11p.js";import{n,t as r}from"./preload-helper-mKj9XlrD.js";import{a as i,o as a}from"../src-
|
|
2
|
-
//# sourceMappingURL=ArcBaseAdmin
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-Bruge11p.js";import{n,t as r}from"./preload-helper-mKj9XlrD.js";import{a as i,o as a}from"../src-DAkFn9SG.js";import{a as o,i as s}from"./feedback-B1UL2ETz.js";import{Component as c,Suspense as l,createContext as u,lazy as d,useContext as f,useEffect as p,useInsertionEffect as m,useMemo as h,useRef as g,useState as _}from"react";import{AdminOptionsContext as v,AdminPathsContext as y,normalizeAdminBasePath as b,normalizeAssetBasePath as x,reportAdminError as S,useAdminOptions as C,validateAdminOptions as w}from"@fudanda/admin-antd/core/admin/runtime";import{jsx as T}from"react/jsx-runtime";import{QueryClientProvider as E}from"@tanstack/react-query";import{GoaClient as D}from"@fudanda/client";import{installRequestFeedback as O}from"@fudanda/admin-antd/core/utils/request-toast";import{goTransport as k}from"@fudanda/admin-antd/core/lib/go-transport";import{BrowserRouter as A}from"react-router-dom";import{AdminNavigationGuardContext as j}from"@fudanda/admin-antd/core/admin/navigation-context";import{installScopedStorage as M}from"@fudanda/admin-antd/core/utils/storage";import{ArcBaseProvider as N}from"@fudanda/admin-antd/elements";import{usePublicSettings as P}from"@fudanda/admin-antd/core/hooks/queries/settings";import"antd/dist/reset.css";import{GoAuthProvider as F}from"@fudanda/admin-antd/core/providers/GoAuthProvider";import{createAdminQueryClient as I}from"@fudanda/admin-antd/core/lib/query";function L(){return f(R)}var R;function z(){return(z=e((()=>{R=u(void 0)})))()}function B(e){return/* @__PURE__ */ T(F,{...e,provider:N,loading:/* @__PURE__ */ T(i,{})})}function V(){return(V=e((()=>{a()})))()}function H({children:e}){let t=C(),{data:n}=P(),r=n?.website,[i,a]=_(null),o=h(()=>({...t,brand:{...t.brand,name:r?.name||t.brand?.name,logo:r?.logoUrl&&i!==r.logoUrl?/* @__PURE__ */ T(`img`,{src:k.resolveURL(r.logoUrl),alt:`${r.name||t.brand?.name||`网站`} Logo`,style:{width:`100%`,height:`100%`,objectFit:`contain`},onError:()=>a(r.logoUrl)}):t.brand?.logo}}),[t,r,i]);return/* @__PURE__ */ T(R.Provider,{value:t.brand,children:/* @__PURE__ */ T(v.Provider,{value:o,children:e})})}function U(){return(U=e((()=>{z()})))()}function W({children:e}){let t=g({});return m(()=>{let e=e=>t.current.onPop?.(e);return globalThis.addEventListener(`popstate`,e),()=>globalThis.removeEventListener(`popstate`,e)},[]),/* @__PURE__ */ T(j.Provider,{value:t.current,children:e})}function G(){return(G=e((()=>{})))()}var K=/* @__PURE__ */ t({ArcBaseAdmin:()=>J});function q(e){w(e);let[t]=_(()=>({client:e.client??new D,cache:e.queryClient??I(),paths:{basePath:b(e.basePath),assetBasePath:x(e.assetBasePath??`./`)},original:{client:e.client,queryClient:e.queryClient,authSession:e.authSession}})),[n,r]=_(!1),[a,o]=_(null);if(p(()=>{let e,n,i,a=document.body.getAttribute(`style`),c=document.documentElement.getAttribute(`style`),l=document.body.getAttribute(`data-reduce-motion`),u=document.body.getAttribute(`theme-mode`),d=document.title,f=document.documentElement.getAttribute(`lang`),p=document.querySelector(`link[rel="icon"]`),m=p?.getAttribute(`href`),h=p?.getAttribute(`type`);try{e=k.bind(t.client),i=M(),n=O({error:(e,t)=>s.error(t?e+` · 链路 ID:`+t:e),warning:s.warning}),r(!0)}catch(e){o(e instanceof Error?e:Error(String(e)))}return()=>{if(!e)return;e(),t.cache.cancelQueries(),t.cache.clear(),i?.(),n?.();let r=(e,t,n)=>{n===null?e.removeAttribute(t):e.setAttribute(t,n)};r(document.body,`style`,a),r(document.documentElement,`style`,c),r(document.body,`theme-mode`,u),r(document.body,`data-reduce-motion`,l),document.title=d,r(document.documentElement,`lang`,f),p?(r(p,`href`,m??null),r(p,`type`,h??null)):document.querySelector(`link[rel="icon"]`)?.remove()}},[t]),p(()=>{e.locale&&(document.documentElement.lang=e.locale)},[e.locale]),p(()=>{if(e.telemetry?.recordRequest)return t.client.subscribeRequests(t=>e.telemetry?.recordRequest?.(t))},[t,e.telemetry]),a)throw a;if(t.original.client!==e.client||t.original.queryClient!==e.queryClient||t.original.authSession!==e.authSession||t.paths.basePath!==b(e.basePath)||t.paths.assetBasePath!==x(e.assetBasePath??`./`))throw Error(`Remount ArcBaseAdmin to change its client, cache or paths`);return n?/* @__PURE__ */ T(v.Provider,{value:e,children:/* @__PURE__ */ T(y.Provider,{value:t.paths,children:/* @__PURE__ */ T(E,{client:t.cache,children:/* @__PURE__ */ T(H,{children:/* @__PURE__ */ T(B,{client:t.client,authSession:e.authSession,children:/* @__PURE__ */ T(W,{children:/* @__PURE__ */ T(A,{basename:t.paths.basePath,children:/* @__PURE__ */ T(l,{fallback:e.loading??/* @__PURE__ */ T(i,{}),children:/* @__PURE__ */ T(Y,{webmcp:e.webmcp,updates:e.updates})})})})})})})})}):e.loading??/* @__PURE__ */ T(i,{})}function J(e){return/* @__PURE__ */ T(X,{fallback:e.errorFallback,telemetry:e.telemetry,children:/* @__PURE__ */ T(q,{...e})})}var Y,X;function Z(){return(Z=e((()=>{o(),V(),a(),U(),G(),n(),Y=d(()=>r(()=>import(`./App-CfQx7jWq.js`).then(e=>(e.n(),e.t)).then(e=>({default:e.AntApp})),[],import.meta.url)),X=class extends c{state={error:null};static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){S(this.props.telemetry,e,t)}render(){return this.state.error?this.props.fallback?.(this.state.error)??/* @__PURE__ */ T(`div`,{role:`alert`,children:this.state.error.message}):this.props.children}}})))()}export{L as i,Z as n,z as r,K as t};
|
|
2
|
+
//# sourceMappingURL=ArcBaseAdmin-DQyddbFC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcBaseAdmin--xQxd4tg.js","mappings":"o7CAIA,SAAgBA,GAAe,CAAE,OAAOC,EAAWC,CAAgB,CAAG,C,oCADzD,EAAmBC,EAAwC,MAAS,C,OCCjF,SAAgBC,EAAe,EAA4C,CAAE,MAAO,kBAACC,EAAD,CAAc,GAAIC,EAAO,SAAUC,EAAiB,QAAS,kBAACC,EAAD,CAAc,EAAG,EAAG,C,wCCGrK,SAAgBC,EAAqB,CAAE,YAAqC,CAC1E,IAAMC,EAAWC,EAAgB,EAC3B,CAAE,QAASC,EAAkB,EAC7BC,EAAUC,GAAM,QAChB,CAACC,EAAYC,GAAiBC,EAAwB,IAAI,EAC1DC,EAAQC,OAAe,CAAE,GAAGT,EAAU,MAAO,CACjD,GAAGA,EAAS,MACZ,KAAMG,GAAS,MAAQH,EAAS,OAAO,KACvC,KAAMG,GAAS,SAAWE,IAAeF,EAAQ,QAC7C,kBAAC,MAAD,CAAK,IAAKO,EAAY,WAAWP,EAAQ,OAAO,EAAG,IAAK,GAAGA,EAAQ,MAAQH,EAAS,OAAO,MAAQ,KAAK,OAAQ,MAAO,CAAE,MAAO,OAAQ,OAAQ,OAAQ,UAAW,SAAU,EAAG,YAAeM,EAAcH,EAAQ,OAAO,CAAI,GAChOH,EAAS,OAAO,IACtB,CAAE,GAAI,CAACA,EAAUG,EAASE,CAAU,CAAC,EACrC,MAAO,kBAACb,EAAiB,SAAlB,CAA2B,MAAOQ,EAAS,MAAO,2BAACW,EAAoB,SAArB,CAAqC,QAAQ,UAAuC,EAA4B,EAC3K,C,wCChBA,SAAgBC,EAAwB,CAAE,YAA+B,CACrE,IAAMC,EAAaC,EAEhB,CAAC,CAAC,EAML,OALAC,MAAyB,CACrB,IAAMC,EAAY,GAAyBH,EAAW,QAAQ,QAAQI,CAAK,EAE3E,OADA,WAAW,iBAAiB,WAAYD,CAAQ,MACnC,WAAW,oBAAoB,WAAYA,CAAQ,CACpE,EAAG,CAAC,CAAC,EACE,kBAACE,EAA4B,SAA7B,CAAsC,MAAOL,EAAW,QAAU,UAA+C,EAC5H,C,mFCsBA,SAASM,EAAU,EAA0B,CACzCC,EAAqBxB,CAAK,EAC1B,GAAM,CAACyB,GAAWd,OAAgB,CAC9B,OAAQX,EAAM,QAAU,IAAI0B,EAC5B,MAAO1B,EAAM,aAAe2B,EAAuB,EACnD,MAAO,CAAE,SAAUC,EAAuB5B,EAAM,QAAQ,EAAG,cAAe6B,EAAuB7B,EAAM,mBAAyC,CAAE,EAClJ,SAAU,CAAE,OAAQA,EAAM,OAAQ,YAAaA,EAAM,YAAa,YAAaA,EAAM,WAAY,CACrG,EAAE,EACI,CAAC8B,EAAOC,GAAYpB,EAAS,EAAK,EAClC,CAACqB,EAAOC,GAAYtB,EAAuB,IAAI,EA2DrD,GA1DAuB,MAAgB,CACZ,IAAIC,EACAC,EACAC,EACEC,EAAY,SAAS,KAAK,aAAa,OAAO,EAC9CC,EAAY,SAAS,gBAAgB,aAAa,OAAO,EACzDC,EAAe,SAAS,KAAK,aAAa,oBAAoB,EAC9DC,EAAY,SAAS,KAAK,aAAa,YAAY,EACnDC,EAAQ,SAAS,MACjBC,EAAW,SAAS,gBAAgB,aAAa,MAAM,EACvDC,EAAU,SAAS,cAA+B,kBAAkB,EACpEC,EAAcD,GAAS,aAAa,MAAM,EAC1CE,EAAcF,GAAS,aAAa,MAAM,EAChD,GAAI,CACA,EAAU9B,EAAY,KAAKW,EAAQ,MAAM,EACzC,EAAiBsB,EAAqB,EACtC,EAAkBC,EAAuB,CAAE,OAAQ,EAAS,IAAOC,EAAM,MAAMC,EAAKC,EAAU,YAAcD,EAAKC,CAAO,EAAG,QAASF,EAAM,OAAQ,CAAC,EACnJlB,EAAS,EAAI,CACjB,OACOqB,EAAS,CACZnB,EAASmB,aAAmB,MAAQA,EAAc,MAAM,OAAOA,CAAO,CAAC,CAAC,CAC5E,CACA,UAAa,CACT,GAAI,CAACjB,EACD,OACJA,EAAQ,EACRV,EAAa,MAAM,cAAc,EACjCA,EAAQ,MAAM,MAAM,EACpBY,IAAiB,EACjBD,IAAkB,EAClB,IAAMiB,GAAW,EAAkB,EAAmB,IAAyB,CACvEzC,IAAU,KACV0C,EAAQ,gBAAgBC,CAAS,EAEjCD,EAAQ,aAAaC,EAAW3C,CAAK,CAC7C,EACAyC,EAAQ,SAAS,KAAM,QAASf,CAAS,EACzCe,EAAQ,SAAS,gBAAiB,QAASd,CAAS,EACpDc,EAAQ,SAAS,KAAM,aAAcZ,CAAS,EAC9CY,EAAQ,SAAS,KAAM,qBAAsBb,CAAY,EACzD,SAAS,MAAQE,EACjBW,EAAQ,SAAS,gBAAiB,OAAQV,CAAQ,EAC9CC,GACAS,EAAQT,EAAS,OAAQC,GAAe,IAAI,EAC5CQ,EAAQT,EAAS,OAAQE,GAAe,IAAI,GAG5C,SAAS,cAAc,kBAAkB,CAAC,EAAE,OAAO,CAC3D,CACJ,EAAG,CAACrB,CAAO,CAAC,EACZS,MAAgB,CACRlC,EAAM,SACN,SAAS,gBAAgB,KAAOA,EAAM,OAC9C,EAAG,CAACA,EAAM,MAAM,CAAC,EACjBkC,MAAgB,CACZ,GAAKlC,EAAM,WAAW,cACtB,OAAOyB,EAAQ,OAAO,kBAAkB,GAASzB,EAAM,WAAW,gBAAgBqB,CAAK,CAAC,CAC5F,EAAG,CAACI,EAASzB,EAAM,SAAS,CAAC,EACzBgC,EACA,MAAMA,EACV,GAAIP,EAAQ,SAAS,SAAWzB,EAAM,QAAUyB,EAAQ,SAAS,cAAgBzB,EAAM,aAChFyB,EAAQ,SAAS,cAAgBzB,EAAM,aACvCyB,EAAQ,MAAM,WAAaG,EAAuB5B,EAAM,QAAQ,GAChEyB,EAAQ,MAAM,gBAAkBI,EAAuB7B,EAAM,mBAAyC,EACzG,MAAU,MAAM,2DAA2D,EAG/E,OAFK8B,EAEG,kBAACf,EAAoB,SAArB,CAA8B,MAAOf,EAC7C,2BAACwD,EAAkB,SAAnB,CAA4B,MAAO/B,EAAQ,MACzC,2BAACgC,EAAD,CAAqB,OAAQhC,EAAQ,MACnC,2BAACtB,EAAD,UACA,kBAACL,EAAD,CAAgB,OAAQ2B,EAAQ,OAAQ,YAAazB,EAAM,YACzD,2BAACgB,EAAD,UAAyB,kBAAC0C,EAAD,CAAe,SAAUjC,EAAQ,MAAM,SAAU,2BAACkC,EAAD,CAAU,SAAU3D,EAAM,SAAW,kBAACE,EAAD,CAAc,GAAG,2BAAC0D,EAAD,CAAK,OAAQ5D,EAAM,OAAQ,QAASA,EAAM,OAAS,EAAW,EAAgB,EAA0B,EAC1N,EACM,EACH,EACK,EACE,GAXnBA,EAAM,SAAW,kBAACE,EAAD,CAAc,EAY9C,CAEA,SAAgB2D,EAAa,EAA0B,CACnD,MAAO,kBAACC,EAAD,CAAmB,SAAU9D,EAAM,cAAe,UAAWA,EAAM,UAAW,2BAACuB,EAAD,CAAW,GAAIvB,CAAO,EAAoB,EACnI,C,8DA7GM,EAAM+D,MAAAC,MAAW,OAAO,oBAAS,UAAAC,EAAA,IAAAA,EAAA,IAAC,KAAK,IAAW,CAAE,QAASC,EAAO,MAAO,EAAE,qBAAC,EAC9E,EAAN,cAAgCC,CAM7B,CACC,MAAQ,CAAE,MAAO,IAAqB,EACtC,OAAO,yBAAyB,EAAc,CAAE,MAAO,CAAE,OAAM,CAAG,CAClE,kBAAkB,EAAc,EAAwC,CAAEC,EAAiB,KAAK,MAAM,UAAWpC,EAAOqC,CAAI,CAAG,CAC/H,QAAS,CAGL,OAFI,KAAK,MAAM,MACJ,KAAK,MAAM,WAAW,KAAK,MAAM,KAAK,GAAK,kBAAC,MAAD,CAAK,KAAK,QAAS,cAAK,MAAM,MAAM,OAAa,GAChG,KAAK,MAAM,QACtB,CACJ,C","names":["useHostBrand","useContext","HostBrandContext","createContext","GoAuthProvider","CoreProvider","props","ArcBaseProvider","PageLoading","RuntimeBrandProvider","defaults","useAdminOptions","usePublicSettings","website","data","failedLogo","setFailedLogo","useState","value","useMemo","goTransport","AdminOptionsContext","AdminNavigationBoundary","controller","useRef","useInsertionEffect","listener","event","AdminNavigationGuardContext","AdminHost","validateAdminOptions","runtime","GoaClient","createAdminQueryClient","normalizeAdminBasePath","normalizeAssetBasePath","ready","setReady","error","setError","useEffect","release","releaseFeedback","releaseStorage","bodyStyle","rootStyle","reduceMotion","themeMode","title","language","favicon","faviconHref","faviconType","installScopedStorage","installRequestFeedback","Toast","id","message","problem","restore","element","attribute","AdminPathsContext","QueryClientProvider","BrowserRouter","Suspense","App","ArcBaseAdmin","HostErrorBoundary","lazy","__vitePreload","n","module","Component","reportAdminError","info"],"ignoreList":[],"sources":["../../src/admin/host-brand.ts","../../src/providers/GoAuthProvider.tsx","../../src/admin/RuntimeBrandProvider.tsx","../../src/admin/navigation.tsx","../../src/admin/ArcBaseAdmin.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { ArcBaseBrand } from '@fudanda/react-core/admin/types';\n\nexport const HostBrandContext = createContext<ArcBaseBrand | undefined>(undefined);\nexport function useHostBrand() { return useContext(HostBrandContext); }\n","import { GoAuthProvider as CoreProvider } from '@fudanda/react-core/providers/GoAuthProvider';\nimport { ArcBaseProvider } from '@fudanda/elements-antd';\nimport PageLoading from '@/components/PageLoading';\nimport type { ComponentProps } from 'react';\nexport function GoAuthProvider(props: ComponentProps<typeof CoreProvider>) { return <CoreProvider {...props} provider={ArcBaseProvider} loading={<PageLoading />}/>; }\n","import { useMemo, useState, type ReactNode } from 'react';\nimport { AdminOptionsContext, useAdminOptions } from '@fudanda/react-core/admin/runtime';\nimport { usePublicSettings } from '@fudanda/react-core/hooks/queries/settings';\nimport { goTransport } from '@fudanda/react-core/lib/go-transport';\nimport { HostBrandContext } from './host-brand';\n\n/** One public projection drives the login page, elements and authenticated shell. */\nexport function RuntimeBrandProvider({ children }: { children: ReactNode }) {\n const defaults = useAdminOptions();\n const { data } = usePublicSettings();\n const website = data?.website;\n const [failedLogo, setFailedLogo] = useState<string | null>(null);\n const value = useMemo(() => ({ ...defaults, brand: {\n ...defaults.brand,\n name: website?.name || defaults.brand?.name,\n logo: website?.logoUrl && failedLogo !== website.logoUrl\n ? <img src={goTransport.resolveURL(website.logoUrl)} alt={`${website.name || defaults.brand?.name || '网站'} Logo`} style={{ width: '100%', height: '100%', objectFit: 'contain' }} onError={() => setFailedLogo(website.logoUrl)} />\n : defaults.brand?.logo,\n } }), [defaults, website, failedLogo]);\n return <HostBrandContext.Provider value={defaults.brand}><AdminOptionsContext.Provider value={value}>{children}</AdminOptionsContext.Provider></HostBrandContext.Provider>;\n}\n","import { useInsertionEffect, useRef, type PropsWithChildren } from 'react';\nimport { AdminNavigationGuardContext } from \"@fudanda/react-core/admin/navigation-context\";\n/** Register before BrowserRouter's layout effect. Window-target events run\n * listeners in registration order, including listeners marked as capture. */\nexport function AdminNavigationBoundary({ children }: PropsWithChildren) {\n const controller = useRef<{\n onPop?: (event: PopStateEvent) => void;\n }>({});\n useInsertionEffect(() => {\n const listener = (event: PopStateEvent) => controller.current.onPop?.(event);\n globalThis.addEventListener('popstate', listener);\n return () => globalThis.removeEventListener('popstate', listener);\n }, []);\n return <AdminNavigationGuardContext.Provider value={controller.current}>{children}</AdminNavigationGuardContext.Provider>;\n}\n","import { BrowserRouter } from 'react-router-dom';\nimport { installRequestFeedback } from '@fudanda/react-core/utils/request-toast';\nimport { Toast } from '../ui/feedback';\nimport '../platform-polyfills';\nimport 'antd/dist/reset.css';\nimport '../styles.css';\nimport '../layout.css';\nimport { Component, lazy, Suspense, useEffect, useState, type ReactNode } from 'react';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { GoaClient } from '@fudanda/client';\nimport { GoAuthProvider } from '../providers/GoAuthProvider';\nimport { createAdminQueryClient } from '@fudanda/react-core/lib/query';\nimport { goTransport } from '@fudanda/react-core/lib/go-transport';\nimport { installScopedStorage } from '@fudanda/react-core/utils/storage';\nimport PageLoading from '../components/PageLoading';\nimport { AdminOptionsContext, AdminPathsContext, normalizeAdminBasePath, normalizeAssetBasePath, validateAdminOptions, reportAdminError } from '@fudanda/react-core/admin/runtime';\nimport type { ArcBaseAdminProps } from '../index';\nimport { RuntimeBrandProvider } from './RuntimeBrandProvider';\nimport { AdminNavigationBoundary } from './navigation';\nconst App = lazy(() => import('../App').then(module => ({ default: module.AntApp })));\nclass HostErrorBoundary extends Component<{\n children: ReactNode;\n fallback?: ArcBaseAdminProps['errorFallback'];\n telemetry?: ArcBaseAdminProps['telemetry'];\n}, {\n error: Error | null;\n}> {\n state = { error: null as Error | null };\n static getDerivedStateFromError(error: Error) { return { error }; }\n componentDidCatch(error: Error, info: {componentStack?: string | null}) { reportAdminError(this.props.telemetry, error, info); }\n render() {\n if (this.state.error)\n return this.props.fallback?.(this.state.error) ?? <div role=\"alert\">{this.state.error.message}</div>;\n return this.props.children;\n }\n}\nfunction AdminHost(props: ArcBaseAdminProps) {\n validateAdminOptions(props);\n const [runtime] = useState(() => ({\n client: props.client ?? new GoaClient(),\n cache: props.queryClient ?? createAdminQueryClient(),\n paths: { basePath: normalizeAdminBasePath(props.basePath), assetBasePath: normalizeAssetBasePath(props.assetBasePath ?? import.meta.env.BASE_URL) },\n original: { client: props.client, queryClient: props.queryClient, authSession: props.authSession },\n }));\n const [ready, setReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n useEffect(() => {\n let release: (() => void) | undefined;\n let releaseFeedback: (() => void) | undefined;\n let releaseStorage: (() => void) | undefined;\n const bodyStyle = document.body.getAttribute('style');\n const rootStyle = document.documentElement.getAttribute('style');\n const reduceMotion = document.body.getAttribute('data-reduce-motion');\n const themeMode = document.body.getAttribute('theme-mode');\n const title = document.title;\n const language = document.documentElement.getAttribute('lang');\n const favicon = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n const faviconHref = favicon?.getAttribute('href');\n const faviconType = favicon?.getAttribute('type');\n try {\n release = goTransport.bind(runtime.client);\n releaseStorage = installScopedStorage();\n releaseFeedback = installRequestFeedback({ error: (message, id) => Toast.error(id ? message + ' · 链路 ID:' + id : message), warning: Toast.warning });\n setReady(true);\n }\n catch (problem) {\n setError(problem instanceof Error ? problem : new Error(String(problem)));\n }\n return () => {\n if (!release)\n return;\n release();\n void runtime.cache.cancelQueries();\n runtime.cache.clear();\n releaseStorage?.();\n releaseFeedback?.();\n const restore = (element: Element, attribute: string, value: string | null) => {\n if (value === null)\n element.removeAttribute(attribute);\n else\n element.setAttribute(attribute, value);\n };\n restore(document.body, 'style', bodyStyle);\n restore(document.documentElement, 'style', rootStyle);\n restore(document.body, 'theme-mode', themeMode);\n restore(document.body, 'data-reduce-motion', reduceMotion);\n document.title = title;\n restore(document.documentElement, 'lang', language);\n if (favicon) {\n restore(favicon, 'href', faviconHref ?? null);\n restore(favicon, 'type', faviconType ?? null);\n }\n else\n document.querySelector('link[rel=\"icon\"]')?.remove();\n };\n }, [runtime]);\n useEffect(() => {\n if (props.locale)\n document.documentElement.lang = props.locale;\n }, [props.locale]);\n useEffect(() => {\n if (!props.telemetry?.recordRequest) return;\n return runtime.client.subscribeRequests(event => props.telemetry?.recordRequest?.(event));\n }, [runtime, props.telemetry]);\n if (error)\n throw error;\n if (runtime.original.client !== props.client || runtime.original.queryClient !== props.queryClient\n || runtime.original.authSession !== props.authSession\n || runtime.paths.basePath !== normalizeAdminBasePath(props.basePath)\n || runtime.paths.assetBasePath !== normalizeAssetBasePath(props.assetBasePath ?? import.meta.env.BASE_URL))\n throw new Error('Remount ArcBaseAdmin to change its client, cache or paths');\n if (!ready)\n return props.loading ?? <PageLoading />;\n return (<AdminOptionsContext.Provider value={props}>\n <AdminPathsContext.Provider value={runtime.paths}>\n <QueryClientProvider client={runtime.cache}>\n <RuntimeBrandProvider>\n <GoAuthProvider client={runtime.client} authSession={props.authSession}>\n <AdminNavigationBoundary><BrowserRouter basename={runtime.paths.basePath}><Suspense fallback={props.loading ?? <PageLoading />}><App webmcp={props.webmcp} updates={props.updates}/></Suspense></BrowserRouter></AdminNavigationBoundary>\n </GoAuthProvider>\n </RuntimeBrandProvider>\n </QueryClientProvider>\n </AdminPathsContext.Provider>\n </AdminOptionsContext.Provider>);\n}\n/** One full-page original ArcBase admin per document, with its own cache/lifetime. */\nexport function ArcBaseAdmin(props: ArcBaseAdminProps) {\n return <HostErrorBoundary fallback={props.errorFallback} telemetry={props.telemetry}><AdminHost {...props}/></HostErrorBoundary>;\n}\nexport type { ArcBaseAdminProps, ArcBaseBrand, ArcBaseLocale, ArcBaseTheme, ArcBaseSessionAdapter, ArcBaseAdminModule, ArcBaseAdminPage, ArcBasePageProps, ArcBaseVersionInfo } from '@fudanda/react-core/admin/types';\n"]}
|
|
1
|
+
{"version":3,"file":"ArcBaseAdmin-DQyddbFC.js","mappings":"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","names":["useHostBrand","useContext","HostBrandContext","createContext","GoAuthProvider","CoreProvider","props","ArcBaseProvider","PageLoading","RuntimeBrandProvider","defaults","useAdminOptions","usePublicSettings","website","data","failedLogo","setFailedLogo","useState","value","useMemo","goTransport","AdminOptionsContext","AdminNavigationBoundary","controller","useRef","useInsertionEffect","listener","event","AdminNavigationGuardContext","AdminHost","validateAdminOptions","runtime","GoaClient","createAdminQueryClient","normalizeAdminBasePath","normalizeAssetBasePath","ready","setReady","error","setError","useEffect","release","releaseFeedback","releaseStorage","bodyStyle","rootStyle","reduceMotion","themeMode","title","language","favicon","faviconHref","faviconType","installScopedStorage","installRequestFeedback","Toast","id","message","problem","restore","element","attribute","AdminPathsContext","QueryClientProvider","BrowserRouter","Suspense","App","ArcBaseAdmin","HostErrorBoundary","lazy","__vitePreload","n","module","Component","reportAdminError","info"],"ignoreList":[],"sources":["../../src/admin/host-brand.ts","../../src/providers/GoAuthProvider.tsx","../../src/admin/RuntimeBrandProvider.tsx","../../src/admin/navigation.tsx","../../src/admin/ArcBaseAdmin.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { ArcBaseBrand } from '@fudanda/react-core/admin/types';\n\nexport const HostBrandContext = createContext<ArcBaseBrand | undefined>(undefined);\nexport function useHostBrand() { return useContext(HostBrandContext); }\n","import { GoAuthProvider as CoreProvider } from '@fudanda/react-core/providers/GoAuthProvider';\nimport { ArcBaseProvider } from '@fudanda/elements-antd';\nimport PageLoading from '@/components/PageLoading';\nimport type { ComponentProps } from 'react';\nexport function GoAuthProvider(props: ComponentProps<typeof CoreProvider>) { return <CoreProvider {...props} provider={ArcBaseProvider} loading={<PageLoading />}/>; }\n","import { useMemo, useState, type ReactNode } from 'react';\nimport { AdminOptionsContext, useAdminOptions } from '@fudanda/react-core/admin/runtime';\nimport { usePublicSettings } from '@fudanda/react-core/hooks/queries/settings';\nimport { goTransport } from '@fudanda/react-core/lib/go-transport';\nimport { HostBrandContext } from './host-brand';\n\n/** One public projection drives the login page, elements and authenticated shell. */\nexport function RuntimeBrandProvider({ children }: { children: ReactNode }) {\n const defaults = useAdminOptions();\n const { data } = usePublicSettings();\n const website = data?.website;\n const [failedLogo, setFailedLogo] = useState<string | null>(null);\n const value = useMemo(() => ({ ...defaults, brand: {\n ...defaults.brand,\n name: website?.name || defaults.brand?.name,\n logo: website?.logoUrl && failedLogo !== website.logoUrl\n ? <img src={goTransport.resolveURL(website.logoUrl)} alt={`${website.name || defaults.brand?.name || '网站'} Logo`} style={{ width: '100%', height: '100%', objectFit: 'contain' }} onError={() => setFailedLogo(website.logoUrl)} />\n : defaults.brand?.logo,\n } }), [defaults, website, failedLogo]);\n return <HostBrandContext.Provider value={defaults.brand}><AdminOptionsContext.Provider value={value}>{children}</AdminOptionsContext.Provider></HostBrandContext.Provider>;\n}\n","import { useInsertionEffect, useRef, type PropsWithChildren } from 'react';\nimport { AdminNavigationGuardContext } from \"@fudanda/react-core/admin/navigation-context\";\n/** Register before BrowserRouter's layout effect. Window-target events run\n * listeners in registration order, including listeners marked as capture. */\nexport function AdminNavigationBoundary({ children }: PropsWithChildren) {\n const controller = useRef<{\n onPop?: (event: PopStateEvent) => void;\n }>({});\n useInsertionEffect(() => {\n const listener = (event: PopStateEvent) => controller.current.onPop?.(event);\n globalThis.addEventListener('popstate', listener);\n return () => globalThis.removeEventListener('popstate', listener);\n }, []);\n return <AdminNavigationGuardContext.Provider value={controller.current}>{children}</AdminNavigationGuardContext.Provider>;\n}\n","import { BrowserRouter } from 'react-router-dom';\nimport { installRequestFeedback } from '@fudanda/react-core/utils/request-toast';\nimport { Toast } from '../ui/feedback';\nimport '../platform-polyfills';\nimport 'antd/dist/reset.css';\nimport '../styles.css';\nimport '../layout.css';\nimport { Component, lazy, Suspense, useEffect, useState, type ReactNode } from 'react';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { GoaClient } from '@fudanda/client';\nimport { GoAuthProvider } from '../providers/GoAuthProvider';\nimport { createAdminQueryClient } from '@fudanda/react-core/lib/query';\nimport { goTransport } from '@fudanda/react-core/lib/go-transport';\nimport { installScopedStorage } from '@fudanda/react-core/utils/storage';\nimport PageLoading from '../components/PageLoading';\nimport { AdminOptionsContext, AdminPathsContext, normalizeAdminBasePath, normalizeAssetBasePath, validateAdminOptions, reportAdminError } from '@fudanda/react-core/admin/runtime';\nimport type { ArcBaseAdminProps } from '../index';\nimport { RuntimeBrandProvider } from './RuntimeBrandProvider';\nimport { AdminNavigationBoundary } from './navigation';\nconst App = lazy(() => import('../App').then(module => ({ default: module.AntApp })));\nclass HostErrorBoundary extends Component<{\n children: ReactNode;\n fallback?: ArcBaseAdminProps['errorFallback'];\n telemetry?: ArcBaseAdminProps['telemetry'];\n}, {\n error: Error | null;\n}> {\n state = { error: null as Error | null };\n static getDerivedStateFromError(error: Error) { return { error }; }\n componentDidCatch(error: Error, info: {componentStack?: string | null}) { reportAdminError(this.props.telemetry, error, info); }\n render() {\n if (this.state.error)\n return this.props.fallback?.(this.state.error) ?? <div role=\"alert\">{this.state.error.message}</div>;\n return this.props.children;\n }\n}\nfunction AdminHost(props: ArcBaseAdminProps) {\n validateAdminOptions(props);\n const [runtime] = useState(() => ({\n client: props.client ?? new GoaClient(),\n cache: props.queryClient ?? createAdminQueryClient(),\n paths: { basePath: normalizeAdminBasePath(props.basePath), assetBasePath: normalizeAssetBasePath(props.assetBasePath ?? import.meta.env.BASE_URL) },\n original: { client: props.client, queryClient: props.queryClient, authSession: props.authSession },\n }));\n const [ready, setReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n useEffect(() => {\n let release: (() => void) | undefined;\n let releaseFeedback: (() => void) | undefined;\n let releaseStorage: (() => void) | undefined;\n const bodyStyle = document.body.getAttribute('style');\n const rootStyle = document.documentElement.getAttribute('style');\n const reduceMotion = document.body.getAttribute('data-reduce-motion');\n const themeMode = document.body.getAttribute('theme-mode');\n const title = document.title;\n const language = document.documentElement.getAttribute('lang');\n const favicon = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n const faviconHref = favicon?.getAttribute('href');\n const faviconType = favicon?.getAttribute('type');\n try {\n release = goTransport.bind(runtime.client);\n releaseStorage = installScopedStorage();\n releaseFeedback = installRequestFeedback({ error: (message, id) => Toast.error(id ? message + ' · 链路 ID:' + id : message), warning: Toast.warning });\n setReady(true);\n }\n catch (problem) {\n setError(problem instanceof Error ? problem : new Error(String(problem)));\n }\n return () => {\n if (!release)\n return;\n release();\n void runtime.cache.cancelQueries();\n runtime.cache.clear();\n releaseStorage?.();\n releaseFeedback?.();\n const restore = (element: Element, attribute: string, value: string | null) => {\n if (value === null)\n element.removeAttribute(attribute);\n else\n element.setAttribute(attribute, value);\n };\n restore(document.body, 'style', bodyStyle);\n restore(document.documentElement, 'style', rootStyle);\n restore(document.body, 'theme-mode', themeMode);\n restore(document.body, 'data-reduce-motion', reduceMotion);\n document.title = title;\n restore(document.documentElement, 'lang', language);\n if (favicon) {\n restore(favicon, 'href', faviconHref ?? null);\n restore(favicon, 'type', faviconType ?? null);\n }\n else\n document.querySelector('link[rel=\"icon\"]')?.remove();\n };\n }, [runtime]);\n useEffect(() => {\n if (props.locale)\n document.documentElement.lang = props.locale;\n }, [props.locale]);\n useEffect(() => {\n if (!props.telemetry?.recordRequest) return;\n return runtime.client.subscribeRequests(event => props.telemetry?.recordRequest?.(event));\n }, [runtime, props.telemetry]);\n if (error)\n throw error;\n if (runtime.original.client !== props.client || runtime.original.queryClient !== props.queryClient\n || runtime.original.authSession !== props.authSession\n || runtime.paths.basePath !== normalizeAdminBasePath(props.basePath)\n || runtime.paths.assetBasePath !== normalizeAssetBasePath(props.assetBasePath ?? import.meta.env.BASE_URL))\n throw new Error('Remount ArcBaseAdmin to change its client, cache or paths');\n if (!ready)\n return props.loading ?? <PageLoading />;\n return (<AdminOptionsContext.Provider value={props}>\n <AdminPathsContext.Provider value={runtime.paths}>\n <QueryClientProvider client={runtime.cache}>\n <RuntimeBrandProvider>\n <GoAuthProvider client={runtime.client} authSession={props.authSession}>\n <AdminNavigationBoundary><BrowserRouter basename={runtime.paths.basePath}><Suspense fallback={props.loading ?? <PageLoading />}><App webmcp={props.webmcp} updates={props.updates}/></Suspense></BrowserRouter></AdminNavigationBoundary>\n </GoAuthProvider>\n </RuntimeBrandProvider>\n </QueryClientProvider>\n </AdminPathsContext.Provider>\n </AdminOptionsContext.Provider>);\n}\n/** One full-page original ArcBase admin per document, with its own cache/lifetime. */\nexport function ArcBaseAdmin(props: ArcBaseAdminProps) {\n return <HostErrorBoundary fallback={props.errorFallback} telemetry={props.telemetry}><AdminHost {...props}/></HostErrorBoundary>;\n}\nexport type { ArcBaseAdminProps, ArcBaseBrand, ArcBaseLocale, ArcBaseTheme, ArcBaseSessionAdapter, ArcBaseAdminModule, ArcBaseAdminPage, ArcBasePageProps, ArcBaseVersionInfo } from '@fudanda/react-core/admin/types';\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,M as n,Q as r,R as i,h as a,it as o,m as s,ot as ee,st as c,w as l}from"./clipboard-dpqHdCyy.js";import{r as te,s as u}from"./toolbar-controls-CrM8hKZg.js";import{i as d,n as f,r as p,t as m}from"./chevrons-up-down-CDj3bN7O.js";import{n as ne,t as h}from"./useStatusToggle-D7g3Ew35.js";import{n as re,t as g}from"./useCrudOperationColumn-CPAzNGXp.js";import{n as _}from"./listTableProps-BAghXGb4.js";import{i as v,n as y,s as b,t as x}from"./table-columns-CvT6OHd2.js";import{a as S,i as C,o as ie,r as w,t as ae}from"./EditFormModal-DVQksS9R.js";import{n as T,t as oe}from"./ConfigurableTable-8sYmeul2.js";import{n as E,t as se}from"./DictTag-ChBs3uuY.js";import{n as D,t as ce}from"./ExportButton-
|
|
2
|
-
//# sourceMappingURL=DepartmentsPage-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,M as n,Q as r,R as i,h as a,it as o,m as s,ot as ee,st as c,w as l}from"./clipboard-dpqHdCyy.js";import{r as te,s as u}from"./toolbar-controls-CrM8hKZg.js";import{i as d,n as f,r as p,t as m}from"./chevrons-up-down-CDj3bN7O.js";import{n as ne,t as h}from"./useStatusToggle-D7g3Ew35.js";import{n as re,t as g}from"./useCrudOperationColumn-CPAzNGXp.js";import{n as _}from"./listTableProps-BAghXGb4.js";import{i as v,n as y,s as b,t as x}from"./table-columns-CvT6OHd2.js";import{a as S,i as C,o as ie,r as w,t as ae}from"./EditFormModal-DVQksS9R.js";import{n as T,t as oe}from"./ConfigurableTable-8sYmeul2.js";import{n as E,t as se}from"./DictTag-ChBs3uuY.js";import{n as D,t as ce}from"./ExportButton-sMPAV2hd.js";import{n as O,r as k}from"./MemberAssignmentSheet-AKvLbbYW.js";import{n as A,t as j}from"./webmcp-crud-D-Dz8BY4.js";import{useMemo as M,useState as N}from"react";import{Fragment as P,jsx as F,jsxs as I}from"react/jsx-runtime";import{enumValueOf as L}from"@fudanda/client/core";import{useDictItems as R}from"@fudanda/admin-antd/core/hooks/useDictItems";import{departmentContract as z,userContract as B}from"@fudanda/admin-antd/core/lib/native-operations";import{usePermission as V}from"@fudanda/admin-antd/core/hooks/usePermission";import{useFilterQuery as H}from"@fudanda/admin-antd/core/hooks/useFilterQuery";import{useListSearch as U}from"@fudanda/admin-antd/core/hooks/useListSearch";import{useUserList as W}from"@fudanda/admin-antd/core/hooks/queries/users";import{compactParams as G}from"@fudanda/admin-antd/core/lib/query";import{DEPARTMENT_CATEGORIES as le}from"@fudanda/client/identity";import{useTreeExpansion as ue}from"@fudanda/admin-antd/core/hooks/useTreeExpansion";import{departmentKeys as de,departmentsToTreeData as fe,useDeleteDepartment as pe,useDepartmentDetail as me,useDepartmentTreeSearch as he,useFlatDepartments as ge,useSaveDepartment as K}from"@fudanda/admin-antd/core/hooks/queries/departments";function _e(e,t){let n=/* @__PURE__ */ new Set,r=[t];for(;r.length>0;){let t=r.shift();if(t!==void 0)for(let i of e)i.parentId===t&&(n.add(i.id),r.push(i.id))}return n}function q(){let{hasPermission:e}=V(),{bind:t,bindKeyword:n,submittedParams:c,handleSearch:u,handleReset:d}=U({defaults:J,listKey:de.tree}),{items:f,options:h}=R(`common_status`),g=M(()=>f.flatMap(e=>{let t=z.tree.query.shape.status.safeParse(e.value);return t.success&&t.data!==void 0?[{...e,value:t.data}]:[]}),[f]),{options:v}=R(`department_category`),S=H({keyword:c.keyword,status:c.status}),w=he(S),T=M(()=>w.data??[],[w.data]),E=ge(),D=M(()=>E.data??[],[E.data]),O=K(),j=ie({entityName:`部门`,save:C(O,{create:z.create.input.shape.body,update:z.update.input.shape.body}),useDetail:me,defaults:{parentId:0,category:`department`,sort:0,status:`enabled`},toValues:e=>({parentId:e.parentId,name:e.name,code:e.code,category:L(le,e.category)??`department`,leaderId:e.leaderId??void 0,phone:e.phone,email:e.email,sort:e.sort,status:e.status}),beforeSave:(e,{editing:t})=>({...e,leaderId:e.leaderId??void 0,phone:e.phone||void 0,email:e.email||void 0,...t?{clearFields:[...e.leaderId==null?[`leaderId`]:[],...e.phone?[]:[`phone`],...e.email?[]:[`email`]]}:{}})}),q=K(),Y=pe();A({resource:`departments`,title:`部门`,permission:`system:department`,hasPermission:e,modal:j,list:z.tree,detail:z.detail,create:z.create.input.shape.body,update:z.update.input.shape.body,fields:[`id`,`parentId`,`name`,`code`,`category`,`leaderId`,`phone`,`email`,`sort`,`status`,`createdAt`,`updatedAt`],filters:S,remove:e=>Y.mutateAsync({params:{id:e}}),lookups:[{name:`parents`,title:`上级部门`,operation:z.flat,permission:`system:department:list`,fields:[`id`,`parentId`,`name`]},{name:`leaders`,title:`负责人`,operation:B.list,permission:`system:user:list`,fields:[`id`,`username`,`nickname`]}]});let[ve,X]=N(``),Z=W({pageSize:50,...G({keyword:ve})},j.visible),ye=(Z.data?.list??[]).map(e=>({value:e.id,label:e.departmentName?`${e.nickname}-${e.departmentName}`:e.nickname})),{expandedRowKeys:be,isAllExpanded:Q,toggleExpandAll:$,onExpandedRowsChange:xe}=ue(T),Se=M(()=>{let e=j.editing?/* @__PURE__ */ new Set([j.editing.id,..._e(D,j.editing.id)]):/* @__PURE__ */ new Set;return[{label:`顶级部门`,value:0,key:`0`,children:fe(D,{excludeIds:e})}]},[D,j.editing]),Ce=()=>{X(``),j.openCreate()},we=e=>{j.openEdit(e)},Te=ne({toggle:(e,t)=>q.mutateAsync({id:e.id,values:{status:t?`enabled`:`disabled`}}),confirmDisable:e=>({danger:!0,title:`确认停用部门「${e.name}」?`,content:`停用后该部门将不可选择。`,okText:`确认停用`}),disabled:!e(`system:department:update`)}),Ee=re({permission:`system:department`,edit:e=>{we(e)},remove:e=>Y.mutateAsync({params:{id:e.id}}),title:`确定要删除该部门吗?`,width:150}),De=[{title:`部门名称`,dataIndex:`name`,minWidth:220},{title:`部门编码`,dataIndex:`code`,width:180,render:b},{title:`类别`,dataIndex:`category`,width:90,render:e=>/* @__PURE__ */ F(se,{dictCode:`department_category`,value:e})},{title:`负责人`,dataIndex:`leaderName`,width:120,render:e=>e||x},{title:`联系电话`,dataIndex:`phone`,width:140,render:e=>e||x},{title:`邮箱`,dataIndex:`email`,width:200,render:b},{title:`排序`,dataIndex:`sort`,width:90},k({dataIndex:`userPreview`,width:150,getPreview:e=>e.userPreview,getCount:e=>e.userCount,getScope:e=>({type:`department`,id:e.id,name:e.name})}),y,Te.column(),Ee],Oe=/* @__PURE__ */ F(s,{type:`primary`,icon:F(Q?p:m,{size:14}),onClick:$,children:Q?`全部折叠`:`全部展开`});return/* @__PURE__ */ I(`div`,{className:`page-container`,children:[/* @__PURE__ */ F(oe,{searchConfig:r({keyword:/* @__PURE__ */ F(o,{placeholder:`搜索部门名称/编码`,...n(`keyword`),width:240}),filters:/* @__PURE__ */ F(ee,{items:g,...t(`status`)}),onSearch:u,onReset:d,create:/* @__PURE__ */ F(te,{permission:`system:department:create`,onClick:Ce}),actions:/* @__PURE__ */ I(P,{children:[Oe,/* @__PURE__ */ F(ce,{entity:`system.departments`,query:S})]}),filterTitle:`部门筛选`,actionTitle:`部门操作`}),columns:De,..._(w,{empty:`暂无数据`}),expandedRowKeys:be,onExpandedRowsChange:xe}),/* @__PURE__ */ I(ae,{modal:j,width:660,children:[/* @__PURE__ */ F(i.TreeSelect,{field:`parentId`,label:`上级部门`,style:{width:`100%`},treeData:Se,placeholder:`请选择上级部门`,filterTreeNode:!0}),/* @__PURE__ */ I(l,{gutter:16,children:[/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.Input,{field:`name`,label:`部门名称`,placeholder:`请输入部门名称`,rules:[{required:!0,message:`请输入部门名称`}]})}),/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.Input,{field:`code`,label:`部门编码`,placeholder:`请输入部门编码`,rules:[{required:!0,message:`请输入部门编码`}]})})]}),/* @__PURE__ */ I(l,{gutter:16,children:[/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.Select,{field:`category`,label:`类别`,optionList:v,style:{width:`100%`},placeholder:`请选择类别`,rules:[{required:!0,message:`请选择类别`}]})}),/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.Select,{field:`leaderId`,label:`负责人`,placeholder:`请选择负责人`,showClear:!0,filter:!0,remote:!0,loading:Z.isFetching,optionList:ye,onSearch:X,style:{width:`100%`}})}),/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.Input,{field:`phone`,label:`联系电话`,placeholder:`请输入联系电话`})})]}),/* @__PURE__ */ I(l,{gutter:16,children:[/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.Input,{field:`email`,label:`邮箱`,placeholder:`请输入邮箱`})}),/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.InputNumber,{field:`sort`,label:`排序`,placeholder:`请输入排序`,min:0,style:{width:`100%`}})})]}),/* @__PURE__ */ F(l,{gutter:16,children:/* @__PURE__ */ F(a,{span:12,children:/* @__PURE__ */ F(i.Select,{field:`status`,label:`状态`,optionList:h,style:{width:`100%`},placeholder:`请选择状态`})})})]})]})}var J;function Y(){return(Y=e((()=>{n(),f(),d(),E(),S(),D(),T(),v(),u(),c(),t(),h(),g(),O(),w(),j(),J={keyword:``,status:void 0}})))()}Y();export{q as default};
|
|
2
|
+
//# sourceMappingURL=DepartmentsPage-CQx53QGE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DepartmentsPage-D6YVegPU.js","mappings":"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","names":["collectDescendantIds","descendants","queue","departmentId","currentId","item","items","DepartmentsPage","usePermission","useListSearch","defaultSearchParams","departmentKeys","statusItems","statusOptions","useDictItems","statusFilterItems","useMemo","parsed","departmentContract","categoryOptions","filterQuery","useFilterQuery","submittedParams","treeQuery","useDepartmentTreeSearch","data","flatDepartmentsQuery","useFlatDepartments","allDepartments","saveMutation","useSaveDepartment","modal","useEditModal","formSaveMutation","useDepartmentDetail","department","enumValueOf","DEPARTMENT_CATEGORIES","values","editing","toggleStatusMutation","deleteMutation","useDeleteDepartment","useStandardWebMcpCrudAdapter","userContract","leaderKeyword","setLeaderKeyword","useState","leaderOptionsQuery","useUserList","compactParams","leaderOptions","u","useTreeExpansion","parentTreeData","excludedIds","departmentsToTreeData","openCreate","openEdit","record","status","useStatusToggle","dept","enabled","hasPermission","operationColumn","useCrudOperationColumn","columns","renderEllipsis","DictTag","value","EMPTY_PLACEHOLDER","memberPreviewColumn","createdAtColumn","expandButton","Button","jsx","isAllExpanded","ChevronsDownUp","ChevronsUpDown","toggleExpandAll","ConfigurableTable","buildTableSearch","KeywordInput","bindKeyword","StatusSelect","bind","handleSearch","handleReset","CreateButton","_Fragment","ExportButton","listTableProps","EditFormModal","Form","Row","Col"],"ignoreList":[],"sources":["../../src/pages/system/departments/DepartmentsPage.tsx"],"sourcesContent":["import type { ApiDepartment } from '@fudanda/shared/api/departments';\nimport { departmentContract, userContract } from '@fudanda/react-core/lib/native-operations';\nimport { useMemo, useState } from 'react';\nimport { Button, Col, Form, Row } from \"@/ui\";\nimport { ChevronsUpDown, ChevronsDownUp } from 'lucide-react';\nimport { DEPARTMENT_CATEGORIES, type Department } from '@fudanda/shared/identity';\nimport { enumValueOf } from '@fudanda/shared/core';\nimport type { ColumnProps } from \"@/ui\";\nimport DictTag from \"@/components/DictTag\";\nimport { useDictItems } from \"@fudanda/react-core/hooks/useDictItems\";\nimport { useUserList } from \"@fudanda/react-core/hooks/queries/users\";\nimport { usePermission } from \"@fudanda/react-core/hooks/usePermission\";\nimport { useListSearch } from \"@fudanda/react-core/hooks/useListSearch\";\nimport { useTreeExpansion } from \"@fudanda/react-core/hooks/useTreeExpansion\";\nimport { useEditModal, formSaveMutation } from \"@/hooks/useEditModal\";\nimport ExportButton from \"@/components/ExportButton\";\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { createdAtColumn, EMPTY_PLACEHOLDER, renderEllipsis } from \"@/utils/table-columns\";\nimport { departmentKeys, departmentsToTreeData, useDeleteDepartment, useDepartmentDetail, type DepartmentFormValues, useDepartmentTreeSearch, useFlatDepartments, useSaveDepartment } from \"@fudanda/react-core/hooks/queries/departments\";\nimport { CreateButton } from \"@/components/toolbar-controls\";\nimport { KeywordInput, StatusSelect } from \"@/components/search-filters\";\nimport { buildTableSearch, listTableProps, useStatusToggle, useCrudOperationColumn } from \"@/components/list-page/index\";\nimport { memberPreviewColumn } from \"@/components/members/MemberAssignmentSheet\";\nimport { compactParams } from \"@fudanda/react-core/lib/query\";\nimport { useFilterQuery } from \"@fudanda/react-core/hooks/useFilterQuery\";\nimport { EditFormModal } from \"@/components/EditFormModal\";\nimport { useStandardWebMcpCrudAdapter } from '@/webmcp-crud';\ninterface SearchParams {\n keyword: string;\n status?: ApiDepartment['status'];\n}\nconst defaultSearchParams: SearchParams = {\n keyword: '',\n status: undefined,\n};\nfunction collectDescendantIds(items: ApiDepartment[], departmentId: number): Set<number> {\n const descendants = new Set<number>();\n const queue = [departmentId];\n while (queue.length > 0) {\n const currentId = queue.shift();\n if (currentId === undefined) {\n continue;\n }\n for (const item of items) {\n if (item.parentId === currentId) {\n descendants.add(item.id);\n queue.push(item.id);\n }\n }\n }\n return descendants;\n}\nexport default function DepartmentsPage() {\n const { hasPermission } = usePermission();\n const { bind, bindKeyword, submittedParams, handleSearch, handleReset, } = useListSearch<SearchParams>({ defaults: defaultSearchParams, listKey: departmentKeys.tree });\n const { items: statusItems, options: statusOptions } = useDictItems('common_status');\n const statusFilterItems = useMemo(() => statusItems.flatMap(item => {\n const parsed = departmentContract.tree.query.shape.status.safeParse(item.value);\n return parsed.success && parsed.data !== undefined ? [{ ...item, value: parsed.data }] : [];\n }), [statusItems]);\n const { options: categoryOptions } = useDictItems('department_category');\n // 已提交筛选 → 契约查询参数:树列表与导出共用同一份映射\n const filterQuery = useFilterQuery({\n keyword: submittedParams.keyword,\n status: submittedParams.status,\n });\n const treeQuery = useDepartmentTreeSearch(filterQuery);\n const data = useMemo(() => treeQuery.data ?? [], [treeQuery.data]);\n const flatDepartmentsQuery = useFlatDepartments();\n const allDepartments = useMemo(() => flatDepartmentsQuery.data ?? [], [flatDepartmentsQuery.data]);\n const saveMutation = useSaveDepartment();\n const modal = useEditModal<ApiDepartment, DepartmentFormValues>({\n entityName: '部门',\n save: formSaveMutation(saveMutation, { create: departmentContract.create.input.shape.body, update: departmentContract.update.input.shape.body }),\n useDetail: useDepartmentDetail,\n defaults: { parentId: 0, category: 'department', sort: 0, status: 'enabled' },\n toValues: (department) => ({\n parentId: department.parentId,\n name: department.name,\n code: department.code,\n category: enumValueOf(DEPARTMENT_CATEGORIES, department.category) ?? 'department',\n leaderId: department.leaderId ?? undefined,\n phone: department.phone,\n email: department.email,\n sort: department.sort,\n status: department.status,\n }),\n beforeSave: (values, { editing }) => ({ ...values, leaderId: values.leaderId ?? undefined, phone: values.phone || undefined, email: values.email || undefined,\n ...(editing ? { clearFields: [...(values.leaderId == null ? ['leaderId'] : []), ...(!values.phone ? ['phone'] : []), ...(!values.email ? ['email'] : [])] } : {}) }),\n });\n const toggleStatusMutation = useSaveDepartment();\n const deleteMutation = useDeleteDepartment();\n useStandardWebMcpCrudAdapter({ resource: 'departments', title: '部门', permission: 'system:department', hasPermission, modal,\n list: departmentContract.tree, detail: departmentContract.detail, create: departmentContract.create.input.shape.body, update: departmentContract.update.input.shape.body,\n fields: ['id', 'parentId', 'name', 'code', 'category', 'leaderId', 'phone', 'email', 'sort', 'status', 'createdAt', 'updatedAt'], filters: filterQuery,\n remove: id => deleteMutation.mutateAsync({ params: { id } }), lookups: [\n { name: 'parents', title: '上级部门', operation: departmentContract.flat, permission: 'system:department:list', fields: ['id', 'parentId', 'name'] },\n { name: 'leaders', title: '负责人', operation: userContract.list, permission: 'system:user:list', fields: ['id', 'username', 'nickname'] }] });\n const [leaderKeyword, setLeaderKeyword] = useState('');\n // 负责人下拉的远程搜索:边输边查,空关键字取前 50 条\n const leaderOptionsQuery = useUserList({ pageSize: 50, ...compactParams({ keyword: leaderKeyword }) }, modal.visible);\n const leaderOptions = (leaderOptionsQuery.data?.list ?? []).map((u) => ({\n value: u.id,\n label: u.departmentName ? `${u.nickname}-${u.departmentName}` : u.nickname,\n }));\n const { expandedRowKeys, isAllExpanded, toggleExpandAll, onExpandedRowsChange } = useTreeExpansion(data);\n const parentTreeData = useMemo(() => {\n const excludedIds = modal.editing\n ? new Set([modal.editing.id, ...collectDescendantIds(allDepartments, modal.editing.id)])\n : new Set<number>();\n return [\n {\n label: '顶级部门',\n value: 0,\n key: '0',\n children: departmentsToTreeData(allDepartments, { excludeIds: excludedIds }),\n },\n ];\n }, [allDepartments, modal.editing]);\n const openCreate = () => {\n setLeaderKeyword('');\n modal.openCreate();\n };\n const openEdit = (record: Department) => {\n modal.openEdit(record);\n };\n const status = useStatusToggle<Department>({\n toggle: (dept, enabled) => toggleStatusMutation.mutateAsync({ id: dept.id, values: { status: enabled ? 'enabled' : 'disabled' } }),\n confirmDisable: (dept) => ({ danger: true, title: `确认停用部门「${dept.name}」?`, content: '停用后该部门将不可选择。', okText: '确认停用' }),\n disabled: !hasPermission('system:department:update'),\n });\n const operationColumn = useCrudOperationColumn<Department>({\n permission: 'system:department',\n edit: (record) => { void openEdit(record); },\n remove: (record) => deleteMutation.mutateAsync({ params: { id: record.id } }),\n title: '确定要删除该部门吗?',\n width: 150,\n });\n const columns: ColumnProps<Department>[] = [\n { title: '部门名称', dataIndex: 'name', minWidth: 220 },\n { title: '部门编码', dataIndex: 'code', width: 180, render: renderEllipsis },\n { title: '类别', dataIndex: 'category', width: 90, render: (value: string) => <DictTag dictCode=\"department_category\" value={value}/> },\n { title: '负责人', dataIndex: 'leaderName', width: 120, render: (value) => value || EMPTY_PLACEHOLDER },\n { title: '联系电话', dataIndex: 'phone', width: 140, render: (value) => value || EMPTY_PLACEHOLDER },\n { title: '邮箱', dataIndex: 'email', width: 200, render: renderEllipsis },\n { title: '排序', dataIndex: 'sort', width: 90 },\n memberPreviewColumn<Department>({\n dataIndex: 'userPreview',\n width: 150,\n getPreview: (record) => record.userPreview,\n getCount: (record) => record.userCount,\n getScope: (record) => ({ type: 'department', id: record.id, name: record.name }),\n }),\n createdAtColumn,\n status.column(),\n operationColumn,\n ];\n // 移动端更多菜单内的按钮由容器 CSS 平铺,无需再传 borderless 版本\n const expandButton = (<Button type=\"primary\" icon={isAllExpanded ? <ChevronsDownUp size={14}/> : <ChevronsUpDown size={14}/>} onClick={toggleExpandAll}>\n {isAllExpanded ? '全部折叠' : '全部展开'}\n </Button>);\n return (<div className=\"page-container\">\n\n\n <ConfigurableTable searchConfig={buildTableSearch({\n keyword: (<KeywordInput placeholder=\"搜索部门名称/编码\" {...bindKeyword('keyword')} width={240}/>),\n filters: ((<StatusSelect items={statusFilterItems} {...bind('status')}/>)),\n onSearch: (handleSearch),\n onReset: (handleReset),\n create: (<CreateButton permission=\"system:department:create\" onClick={openCreate}/>),\n actions: ((<>\n {expandButton}\n <ExportButton entity=\"system.departments\" query={filterQuery}/>\n </>)),\n filterTitle: \"部门筛选\",\n actionTitle: \"部门操作\"\n })} columns={columns} {...listTableProps(treeQuery, { empty: '暂无数据' })} expandedRowKeys={expandedRowKeys} onExpandedRowsChange={onExpandedRowsChange}/>\n\n <EditFormModal modal={modal} width={660}>\n <Form.TreeSelect field=\"parentId\" label=\"上级部门\" style={{ width: '100%' }} treeData={parentTreeData} placeholder=\"请选择上级部门\" filterTreeNode/>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Input field=\"name\" label=\"部门名称\" placeholder=\"请输入部门名称\" rules={[{ required: true, message: '请输入部门名称' }]}/>\n </Col>\n <Col span={12}>\n <Form.Input field=\"code\" label=\"部门编码\" placeholder=\"请输入部门编码\" rules={[{ required: true, message: '请输入部门编码' }]}/>\n </Col>\n </Row>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Select field=\"category\" label=\"类别\" optionList={categoryOptions} style={{ width: '100%' }} placeholder=\"请选择类别\" rules={[{ required: true, message: '请选择类别' }]}/>\n </Col>\n <Col span={12}>\n <Form.Select field=\"leaderId\" label=\"负责人\" placeholder=\"请选择负责人\" showClear filter remote loading={leaderOptionsQuery.isFetching} optionList={leaderOptions} onSearch={setLeaderKeyword} style={{ width: '100%' }}/>\n </Col>\n <Col span={12}>\n <Form.Input field=\"phone\" label=\"联系电话\" placeholder=\"请输入联系电话\"/>\n </Col>\n </Row>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Input field=\"email\" label=\"邮箱\" placeholder=\"请输入邮箱\"/>\n </Col>\n <Col span={12}>\n <Form.InputNumber field=\"sort\" label=\"排序\" placeholder=\"请输入排序\" min={0} style={{ width: '100%' }}/>\n </Col>\n </Row>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Select field=\"status\" label=\"状态\" optionList={statusOptions} style={{ width: '100%' }} placeholder=\"请选择状态\"/>\n </Col>\n </Row>\n </EditFormModal>\n </div>);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DepartmentsPage-CQx53QGE.js","mappings":"+8DAmCA,SAASA,GAAqB,EAAwB,EAAmC,CACrF,IAAMC,kBAAc,IAAI,IAClBC,EAAQ,CAACC,CAAY,EAC3B,KAAOD,EAAM,OAAS,GAAG,CACrB,IAAME,EAAYF,EAAM,MAAM,EAC9B,GAAIE,IAAc,OAGlB,IAAK,IAAMC,KAAQC,EACXD,EAAK,WAAaD,IAClBH,EAAY,IAAII,EAAK,EAAE,EACvBH,EAAM,KAAKG,EAAK,EAAE,EAG9B,CACA,OAAOJ,CACX,CACA,SAAwBM,GAAkB,CACtC,GAAM,CAAE,iBAAkBC,EAAc,EAClC,CAAE,OAAM,cAAa,kBAAiB,eAAc,eAAiBC,EAA4B,CAAE,SAAUC,EAAqB,QAASC,GAAe,IAAK,CAAC,EAChK,CAAE,MAAOC,EAAa,QAASC,GAAkBC,EAAa,eAAe,EAC7EC,EAAoBC,MAAcJ,EAAY,QAAQ,GAAQ,CAChE,IAAMK,EAASC,EAAmB,KAAK,MAAM,MAAM,OAAO,UAAUb,EAAK,KAAK,EAC9E,OAAOY,EAAO,SAAWA,EAAO,OAAS,OAAY,CAAC,CAAE,GAAGZ,EAAM,MAAOY,EAAO,IAAK,CAAC,EAAI,CAAC,CAC9F,CAAC,EAAG,CAACL,CAAW,CAAC,EACX,CAAE,QAASO,GAAoBL,EAAa,qBAAqB,EAEjEM,EAAcC,EAAe,CAC/B,QAASC,EAAgB,QACzB,OAAQA,EAAgB,MAC5B,CAAC,EACKC,EAAYC,GAAwBJ,CAAW,EAC/CK,EAAOT,MAAcO,EAAU,MAAQ,CAAC,EAAG,CAACA,EAAU,IAAI,CAAC,EAC3DG,EAAuBC,GAAmB,EAC1CC,EAAiBZ,MAAcU,EAAqB,MAAQ,CAAC,EAAG,CAACA,EAAqB,IAAI,CAAC,EAC3FG,EAAeC,EAAkB,EACjCC,EAAQC,GAAkD,CAC5D,WAAY,KACZ,KAAMC,EAAiBJ,EAAc,CAAE,OAAQX,EAAmB,OAAO,MAAM,MAAM,KAAM,OAAQA,EAAmB,OAAO,MAAM,MAAM,IAAK,CAAC,EAC/I,UAAWgB,GACX,SAAU,CAAE,SAAU,EAAG,SAAU,aAAc,KAAM,EAAG,OAAQ,SAAU,EAC5E,SAAW,IAAgB,CACvB,SAAUC,EAAW,SACrB,KAAMA,EAAW,KACjB,KAAMA,EAAW,KACjB,SAAUC,EAAYC,GAAuBF,EAAW,QAAQ,GAAK,aACrE,SAAUA,EAAW,UAAY,OACjC,MAAOA,EAAW,MAClB,MAAOA,EAAW,MAClB,KAAMA,EAAW,KACjB,OAAQA,EAAW,MACvB,GACA,YAAa,EAAQ,CAAE,cAAe,CAAE,GAAGG,EAAQ,SAAUA,EAAO,UAAY,OAAW,MAAOA,EAAO,OAAS,OAAW,MAAOA,EAAO,OAAS,OAChJ,GAAIC,EAAU,CAAE,YAAa,CAAC,GAAID,EAAO,UAAY,KAAO,CAAC,UAAU,EAAI,CAAC,EAAI,GAAKA,EAAO,MAAoB,CAAC,EAAb,CAAC,OAAO,EAAS,GAAKA,EAAO,MAAoB,CAAC,EAAb,CAAC,OAAO,CAAO,CAAE,EAAI,CAAC,CAAG,EAC1K,CAAC,EACKE,EAAuBV,EAAkB,EACzCW,EAAiBC,GAAoB,EAC3CC,EAA6B,CAAE,SAAU,cAAe,MAAO,KAAM,WAAY,oBAAqB,gBAAe,QACjH,KAAMzB,EAAmB,KAAM,OAAQA,EAAmB,OAAQ,OAAQA,EAAmB,OAAO,MAAM,MAAM,KAAM,OAAQA,EAAmB,OAAO,MAAM,MAAM,KACpK,OAAQ,CAAC,KAAM,WAAY,OAAQ,OAAQ,WAAY,WAAY,QAAS,QAAS,OAAQ,SAAU,YAAa,WAAW,EAAG,QAASE,EAC3I,OAAQ,GAAMqB,EAAe,YAAY,CAAE,OAAQ,CAAE,IAAG,CAAE,CAAC,EAAG,QAAS,CACnE,CAAE,KAAM,UAAW,MAAO,OAAQ,UAAWvB,EAAmB,KAAM,WAAY,yBAA0B,OAAQ,CAAC,KAAM,WAAY,MAAM,CAAE,EAC/I,CAAE,KAAM,UAAW,MAAO,MAAO,UAAW0B,EAAa,KAAM,WAAY,mBAAoB,OAAQ,CAAC,KAAM,WAAY,UAAU,CAAE,CAAC,CAAE,CAAC,EAClJ,GAAM,CAACC,GAAeC,GAAoBC,EAAS,EAAE,EAE/CC,EAAqBC,EAAY,CAAE,SAAU,GAAI,GAAGC,EAAc,CAAE,QAASL,EAAc,CAAC,CAAE,EAAGd,EAAM,OAAO,EAC9GoB,IAAiBH,EAAmB,MAAM,MAAQ,CAAC,GAAG,IAAK,IAAO,CACpE,MAAOI,EAAE,GACT,MAAOA,EAAE,eAAiB,GAAGA,EAAE,SAAS,GAAGA,EAAE,iBAAmBA,EAAE,QACtE,EAAE,EACI,CAAE,mBAAiB,gBAAe,kBAAiB,yBAAyBC,GAAiB5B,CAAI,EACjG6B,GAAiBtC,MAAc,CACjC,IAAMuC,EAAcxB,EAAM,wBACpB,IAAI,IAAI,CAACA,EAAM,QAAQ,GAAI,GAAG/B,GAAqB4B,EAAgBG,EAAM,QAAQ,EAAE,CAAC,CAAC,kBACrF,IAAI,IACV,MAAO,CACH,CACI,MAAO,OACP,MAAO,EACP,IAAK,IACL,SAAUyB,GAAsB5B,EAAgB,CAAE,WAAY2B,CAAY,CAAC,CAC/E,CACJ,CACJ,EAAG,CAAC3B,EAAgBG,EAAM,OAAO,CAAC,EAC5B0B,OAAmB,CACrBX,EAAiB,EAAE,EACnBf,EAAM,WAAW,CACrB,EACM2B,GAAY,GAAuB,CACrC3B,EAAM,SAAS4B,CAAM,CACzB,EACMC,GAASC,GAA4B,CACvC,QAAS,EAAM,IAAYrB,EAAqB,YAAY,CAAE,GAAIsB,EAAK,GAAI,OAAQ,CAAE,OAAQC,EAAU,UAAY,UAAW,CAAE,CAAC,EACjI,eAAiB,IAAU,CAAE,OAAQ,GAAM,MAAO,UAAUD,EAAK,KAAK,IAAK,QAAS,eAAgB,OAAQ,MAAO,GACnH,SAAU,CAACE,EAAc,0BAA0B,CACvD,CAAC,EACKC,GAAkBC,GAAmC,CACvD,WAAY,oBACZ,KAAO,GAAW,CAAER,GAAcC,CAAM,CAAG,EAC3C,OAAS,GAAWlB,EAAe,YAAY,CAAE,OAAQ,CAAE,GAAIkB,EAAO,EAAG,CAAE,CAAC,EAC5E,MAAO,aACP,MAAO,GACX,CAAC,EACKQ,GAAqC,CACvC,CAAE,MAAO,OAAQ,UAAW,OAAQ,SAAU,GAAI,EAClD,CAAE,MAAO,OAAQ,UAAW,OAAQ,MAAO,IAAK,OAAQC,CAAe,EACvE,CAAE,MAAO,KAAM,UAAW,WAAY,MAAO,GAAI,OAAS,GAAkB,kBAACC,GAAD,CAAS,SAAS,sBAA6B,OAAO,EAAE,EACpI,CAAE,MAAO,MAAO,UAAW,aAAc,MAAO,IAAK,OAAS,GAAUC,GAASC,CAAkB,EACnG,CAAE,MAAO,OAAQ,UAAW,QAAS,MAAO,IAAK,OAAS,GAAUD,GAASC,CAAkB,EAC/F,CAAE,MAAO,KAAM,UAAW,QAAS,MAAO,IAAK,OAAQH,CAAe,EACtE,CAAE,MAAO,KAAM,UAAW,OAAQ,MAAO,EAAG,EAC5CI,EAAgC,CAC5B,UAAW,cACX,MAAO,IACP,WAAa,GAAWb,EAAO,YAC/B,SAAW,GAAWA,EAAO,UAC7B,SAAW,IAAY,CAAE,KAAM,aAAc,GAAIA,EAAO,GAAI,KAAMA,EAAO,IAAK,EAClF,CAAC,EACDc,EACAb,GAAO,OAAO,EACdK,EACJ,EAEMS,GAAgB,kBAACC,EAAD,CAAQ,KAAK,UAAU,KAAsBC,EAAhBC,EAAiBC,EAA8BC,EAA/B,CAAgB,KAAM,EAAI,CAA8B,EAAG,QAASC,EACpI,SAAAH,EAAgB,OAAS,MACpB,GACR,MAAQ,kBAAC,MAAD,CAAK,UAAU,iBAAf,UAGN,kBAACI,GAAD,CAAmB,aAAcC,EAAiB,CAC5C,QAAU,kBAACC,EAAD,CAAc,YAAY,YAAY,GAAIC,EAAY,SAAS,EAAG,MAAO,GAAK,GACxF,QAAW,kBAACC,GAAD,CAAc,MAAOtE,EAAmB,GAAIuE,EAAK,QAAQ,CAAG,GACvE,SAAWC,EACX,QAAUC,EACV,OAAS,kBAACC,GAAD,CAAc,WAAW,2BAA2B,QAAShC,EAAY,GAClF,QAAW,kBAAAiC,EAAA,WACVhB,GACD,kBAACiB,GAAD,CAAc,OAAO,qBAAqB,MAAOvE,CAAa,EAC9D,IACA,YAAa,OACb,YAAa,MACjB,CAAC,EAAY,WAAS,GAAIwE,EAAerE,EAAW,CAAE,MAAO,MAAO,CAAC,EAAoB,mBAAuC,uBAAsB,GAExJ,kBAACsE,GAAD,CAAsB,QAAO,MAAO,IAApC,UACE,kBAACC,EAAK,WAAN,CAAiB,MAAM,WAAW,MAAM,OAAO,MAAO,CAAE,MAAO,MAAO,EAAG,SAAUxC,GAAgB,YAAY,UAAU,iBAAe,GACxI,kBAACyC,EAAD,CAAK,OAAQ,GAAb,UACE,kBAACC,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,MAAN,CAAY,MAAM,OAAO,MAAM,OAAO,YAAY,UAAU,MAAO,CAAC,CAAE,SAAU,GAAM,QAAS,SAAU,CAAC,CAAG,EAC1G,GACL,kBAACE,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,MAAN,CAAY,MAAM,OAAO,MAAM,OAAO,YAAY,UAAU,MAAO,CAAC,CAAE,SAAU,GAAM,QAAS,SAAU,CAAC,CAAG,EAC1G,EACF,C,GACL,kBAACC,EAAD,CAAK,OAAQ,GAAb,UACE,kBAACC,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,OAAN,CAAa,MAAM,WAAW,MAAM,KAAK,WAAY3E,EAAiB,MAAO,CAAE,MAAO,MAAO,EAAG,YAAY,QAAQ,MAAO,CAAC,CAAE,SAAU,GAAM,QAAS,OAAQ,CAAC,CAAG,EAChK,GACL,kBAAC6E,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,OAAN,CAAa,MAAM,WAAW,MAAM,MAAM,YAAY,SAAS,aAAU,UAAO,UAAO,QAAS9C,EAAmB,WAAY,WAAYG,GAAe,SAAUL,EAAkB,MAAO,CAAE,MAAO,MAAO,CAAG,EAC7M,GACL,kBAACkD,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,MAAN,CAAY,MAAM,QAAQ,MAAM,OAAO,YAAY,SAAU,EAC1D,EACF,C,GACL,kBAACC,EAAD,CAAK,OAAQ,GAAb,UACE,kBAACC,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,MAAN,CAAY,MAAM,QAAQ,MAAM,KAAK,YAAY,OAAQ,EACtD,GACL,kBAACE,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,YAAN,CAAkB,MAAM,OAAO,MAAM,KAAK,YAAY,QAAQ,IAAK,EAAG,MAAO,CAAE,MAAO,MAAO,CAAG,EAC7F,EACF,C,GACL,kBAACC,EAAD,CAAK,OAAQ,GACX,2BAACC,EAAD,CAAK,KAAM,GACT,2BAACF,EAAK,OAAN,CAAa,MAAM,SAAS,MAAM,KAAK,WAAYjF,EAAe,MAAO,CAAE,MAAO,MAAO,EAAG,YAAY,OAAQ,EAC7G,EACF,EACQ,CACZ,G,EACT,C,oGAvLM,EAAoC,CACtC,QAAS,GACT,OAAQ,MACZ,C","names":["collectDescendantIds","descendants","queue","departmentId","currentId","item","items","DepartmentsPage","usePermission","useListSearch","defaultSearchParams","departmentKeys","statusItems","statusOptions","useDictItems","statusFilterItems","useMemo","parsed","departmentContract","categoryOptions","filterQuery","useFilterQuery","submittedParams","treeQuery","useDepartmentTreeSearch","data","flatDepartmentsQuery","useFlatDepartments","allDepartments","saveMutation","useSaveDepartment","modal","useEditModal","formSaveMutation","useDepartmentDetail","department","enumValueOf","DEPARTMENT_CATEGORIES","values","editing","toggleStatusMutation","deleteMutation","useDeleteDepartment","useStandardWebMcpCrudAdapter","userContract","leaderKeyword","setLeaderKeyword","useState","leaderOptionsQuery","useUserList","compactParams","leaderOptions","u","useTreeExpansion","parentTreeData","excludedIds","departmentsToTreeData","openCreate","openEdit","record","status","useStatusToggle","dept","enabled","hasPermission","operationColumn","useCrudOperationColumn","columns","renderEllipsis","DictTag","value","EMPTY_PLACEHOLDER","memberPreviewColumn","createdAtColumn","expandButton","Button","jsx","isAllExpanded","ChevronsDownUp","ChevronsUpDown","toggleExpandAll","ConfigurableTable","buildTableSearch","KeywordInput","bindKeyword","StatusSelect","bind","handleSearch","handleReset","CreateButton","_Fragment","ExportButton","listTableProps","EditFormModal","Form","Row","Col"],"ignoreList":[],"sources":["../../src/pages/system/departments/DepartmentsPage.tsx"],"sourcesContent":["import type { ApiDepartment } from '@fudanda/shared/api/departments';\nimport { departmentContract, userContract } from '@fudanda/react-core/lib/native-operations';\nimport { useMemo, useState } from 'react';\nimport { Button, Col, Form, Row } from \"@/ui\";\nimport { ChevronsUpDown, ChevronsDownUp } from 'lucide-react';\nimport { DEPARTMENT_CATEGORIES, type Department } from '@fudanda/shared/identity';\nimport { enumValueOf } from '@fudanda/shared/core';\nimport type { ColumnProps } from \"@/ui\";\nimport DictTag from \"@/components/DictTag\";\nimport { useDictItems } from \"@fudanda/react-core/hooks/useDictItems\";\nimport { useUserList } from \"@fudanda/react-core/hooks/queries/users\";\nimport { usePermission } from \"@fudanda/react-core/hooks/usePermission\";\nimport { useListSearch } from \"@fudanda/react-core/hooks/useListSearch\";\nimport { useTreeExpansion } from \"@fudanda/react-core/hooks/useTreeExpansion\";\nimport { useEditModal, formSaveMutation } from \"@/hooks/useEditModal\";\nimport ExportButton from \"@/components/ExportButton\";\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { createdAtColumn, EMPTY_PLACEHOLDER, renderEllipsis } from \"@/utils/table-columns\";\nimport { departmentKeys, departmentsToTreeData, useDeleteDepartment, useDepartmentDetail, type DepartmentFormValues, useDepartmentTreeSearch, useFlatDepartments, useSaveDepartment } from \"@fudanda/react-core/hooks/queries/departments\";\nimport { CreateButton } from \"@/components/toolbar-controls\";\nimport { KeywordInput, StatusSelect } from \"@/components/search-filters\";\nimport { buildTableSearch, listTableProps, useStatusToggle, useCrudOperationColumn } from \"@/components/list-page/index\";\nimport { memberPreviewColumn } from \"@/components/members/MemberAssignmentSheet\";\nimport { compactParams } from \"@fudanda/react-core/lib/query\";\nimport { useFilterQuery } from \"@fudanda/react-core/hooks/useFilterQuery\";\nimport { EditFormModal } from \"@/components/EditFormModal\";\nimport { useStandardWebMcpCrudAdapter } from '@/webmcp-crud';\ninterface SearchParams {\n keyword: string;\n status?: ApiDepartment['status'];\n}\nconst defaultSearchParams: SearchParams = {\n keyword: '',\n status: undefined,\n};\nfunction collectDescendantIds(items: ApiDepartment[], departmentId: number): Set<number> {\n const descendants = new Set<number>();\n const queue = [departmentId];\n while (queue.length > 0) {\n const currentId = queue.shift();\n if (currentId === undefined) {\n continue;\n }\n for (const item of items) {\n if (item.parentId === currentId) {\n descendants.add(item.id);\n queue.push(item.id);\n }\n }\n }\n return descendants;\n}\nexport default function DepartmentsPage() {\n const { hasPermission } = usePermission();\n const { bind, bindKeyword, submittedParams, handleSearch, handleReset, } = useListSearch<SearchParams>({ defaults: defaultSearchParams, listKey: departmentKeys.tree });\n const { items: statusItems, options: statusOptions } = useDictItems('common_status');\n const statusFilterItems = useMemo(() => statusItems.flatMap(item => {\n const parsed = departmentContract.tree.query.shape.status.safeParse(item.value);\n return parsed.success && parsed.data !== undefined ? [{ ...item, value: parsed.data }] : [];\n }), [statusItems]);\n const { options: categoryOptions } = useDictItems('department_category');\n // 已提交筛选 → 契约查询参数:树列表与导出共用同一份映射\n const filterQuery = useFilterQuery({\n keyword: submittedParams.keyword,\n status: submittedParams.status,\n });\n const treeQuery = useDepartmentTreeSearch(filterQuery);\n const data = useMemo(() => treeQuery.data ?? [], [treeQuery.data]);\n const flatDepartmentsQuery = useFlatDepartments();\n const allDepartments = useMemo(() => flatDepartmentsQuery.data ?? [], [flatDepartmentsQuery.data]);\n const saveMutation = useSaveDepartment();\n const modal = useEditModal<ApiDepartment, DepartmentFormValues>({\n entityName: '部门',\n save: formSaveMutation(saveMutation, { create: departmentContract.create.input.shape.body, update: departmentContract.update.input.shape.body }),\n useDetail: useDepartmentDetail,\n defaults: { parentId: 0, category: 'department', sort: 0, status: 'enabled' },\n toValues: (department) => ({\n parentId: department.parentId,\n name: department.name,\n code: department.code,\n category: enumValueOf(DEPARTMENT_CATEGORIES, department.category) ?? 'department',\n leaderId: department.leaderId ?? undefined,\n phone: department.phone,\n email: department.email,\n sort: department.sort,\n status: department.status,\n }),\n beforeSave: (values, { editing }) => ({ ...values, leaderId: values.leaderId ?? undefined, phone: values.phone || undefined, email: values.email || undefined,\n ...(editing ? { clearFields: [...(values.leaderId == null ? ['leaderId'] : []), ...(!values.phone ? ['phone'] : []), ...(!values.email ? ['email'] : [])] } : {}) }),\n });\n const toggleStatusMutation = useSaveDepartment();\n const deleteMutation = useDeleteDepartment();\n useStandardWebMcpCrudAdapter({ resource: 'departments', title: '部门', permission: 'system:department', hasPermission, modal,\n list: departmentContract.tree, detail: departmentContract.detail, create: departmentContract.create.input.shape.body, update: departmentContract.update.input.shape.body,\n fields: ['id', 'parentId', 'name', 'code', 'category', 'leaderId', 'phone', 'email', 'sort', 'status', 'createdAt', 'updatedAt'], filters: filterQuery,\n remove: id => deleteMutation.mutateAsync({ params: { id } }), lookups: [\n { name: 'parents', title: '上级部门', operation: departmentContract.flat, permission: 'system:department:list', fields: ['id', 'parentId', 'name'] },\n { name: 'leaders', title: '负责人', operation: userContract.list, permission: 'system:user:list', fields: ['id', 'username', 'nickname'] }] });\n const [leaderKeyword, setLeaderKeyword] = useState('');\n // 负责人下拉的远程搜索:边输边查,空关键字取前 50 条\n const leaderOptionsQuery = useUserList({ pageSize: 50, ...compactParams({ keyword: leaderKeyword }) }, modal.visible);\n const leaderOptions = (leaderOptionsQuery.data?.list ?? []).map((u) => ({\n value: u.id,\n label: u.departmentName ? `${u.nickname}-${u.departmentName}` : u.nickname,\n }));\n const { expandedRowKeys, isAllExpanded, toggleExpandAll, onExpandedRowsChange } = useTreeExpansion(data);\n const parentTreeData = useMemo(() => {\n const excludedIds = modal.editing\n ? new Set([modal.editing.id, ...collectDescendantIds(allDepartments, modal.editing.id)])\n : new Set<number>();\n return [\n {\n label: '顶级部门',\n value: 0,\n key: '0',\n children: departmentsToTreeData(allDepartments, { excludeIds: excludedIds }),\n },\n ];\n }, [allDepartments, modal.editing]);\n const openCreate = () => {\n setLeaderKeyword('');\n modal.openCreate();\n };\n const openEdit = (record: Department) => {\n modal.openEdit(record);\n };\n const status = useStatusToggle<Department>({\n toggle: (dept, enabled) => toggleStatusMutation.mutateAsync({ id: dept.id, values: { status: enabled ? 'enabled' : 'disabled' } }),\n confirmDisable: (dept) => ({ danger: true, title: `确认停用部门「${dept.name}」?`, content: '停用后该部门将不可选择。', okText: '确认停用' }),\n disabled: !hasPermission('system:department:update'),\n });\n const operationColumn = useCrudOperationColumn<Department>({\n permission: 'system:department',\n edit: (record) => { void openEdit(record); },\n remove: (record) => deleteMutation.mutateAsync({ params: { id: record.id } }),\n title: '确定要删除该部门吗?',\n width: 150,\n });\n const columns: ColumnProps<Department>[] = [\n { title: '部门名称', dataIndex: 'name', minWidth: 220 },\n { title: '部门编码', dataIndex: 'code', width: 180, render: renderEllipsis },\n { title: '类别', dataIndex: 'category', width: 90, render: (value: string) => <DictTag dictCode=\"department_category\" value={value}/> },\n { title: '负责人', dataIndex: 'leaderName', width: 120, render: (value) => value || EMPTY_PLACEHOLDER },\n { title: '联系电话', dataIndex: 'phone', width: 140, render: (value) => value || EMPTY_PLACEHOLDER },\n { title: '邮箱', dataIndex: 'email', width: 200, render: renderEllipsis },\n { title: '排序', dataIndex: 'sort', width: 90 },\n memberPreviewColumn<Department>({\n dataIndex: 'userPreview',\n width: 150,\n getPreview: (record) => record.userPreview,\n getCount: (record) => record.userCount,\n getScope: (record) => ({ type: 'department', id: record.id, name: record.name }),\n }),\n createdAtColumn,\n status.column(),\n operationColumn,\n ];\n // 移动端更多菜单内的按钮由容器 CSS 平铺,无需再传 borderless 版本\n const expandButton = (<Button type=\"primary\" icon={isAllExpanded ? <ChevronsDownUp size={14}/> : <ChevronsUpDown size={14}/>} onClick={toggleExpandAll}>\n {isAllExpanded ? '全部折叠' : '全部展开'}\n </Button>);\n return (<div className=\"page-container\">\n\n\n <ConfigurableTable searchConfig={buildTableSearch({\n keyword: (<KeywordInput placeholder=\"搜索部门名称/编码\" {...bindKeyword('keyword')} width={240}/>),\n filters: ((<StatusSelect items={statusFilterItems} {...bind('status')}/>)),\n onSearch: (handleSearch),\n onReset: (handleReset),\n create: (<CreateButton permission=\"system:department:create\" onClick={openCreate}/>),\n actions: ((<>\n {expandButton}\n <ExportButton entity=\"system.departments\" query={filterQuery}/>\n </>)),\n filterTitle: \"部门筛选\",\n actionTitle: \"部门操作\"\n })} columns={columns} {...listTableProps(treeQuery, { empty: '暂无数据' })} expandedRowKeys={expandedRowKeys} onExpandedRowsChange={onExpandedRowsChange}/>\n\n <EditFormModal modal={modal} width={660}>\n <Form.TreeSelect field=\"parentId\" label=\"上级部门\" style={{ width: '100%' }} treeData={parentTreeData} placeholder=\"请选择上级部门\" filterTreeNode/>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Input field=\"name\" label=\"部门名称\" placeholder=\"请输入部门名称\" rules={[{ required: true, message: '请输入部门名称' }]}/>\n </Col>\n <Col span={12}>\n <Form.Input field=\"code\" label=\"部门编码\" placeholder=\"请输入部门编码\" rules={[{ required: true, message: '请输入部门编码' }]}/>\n </Col>\n </Row>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Select field=\"category\" label=\"类别\" optionList={categoryOptions} style={{ width: '100%' }} placeholder=\"请选择类别\" rules={[{ required: true, message: '请选择类别' }]}/>\n </Col>\n <Col span={12}>\n <Form.Select field=\"leaderId\" label=\"负责人\" placeholder=\"请选择负责人\" showClear filter remote loading={leaderOptionsQuery.isFetching} optionList={leaderOptions} onSearch={setLeaderKeyword} style={{ width: '100%' }}/>\n </Col>\n <Col span={12}>\n <Form.Input field=\"phone\" label=\"联系电话\" placeholder=\"请输入联系电话\"/>\n </Col>\n </Row>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Input field=\"email\" label=\"邮箱\" placeholder=\"请输入邮箱\"/>\n </Col>\n <Col span={12}>\n <Form.InputNumber field=\"sort\" label=\"排序\" placeholder=\"请输入排序\" min={0} style={{ width: '100%' }}/>\n </Col>\n </Row>\n <Row gutter={16}>\n <Col span={12}>\n <Form.Select field=\"status\" label=\"状态\" optionList={statusOptions} style={{ width: '100%' }} placeholder=\"请选择状态\"/>\n </Col>\n </Row>\n </EditFormModal>\n </div>);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,Dt as n,G as r,M as i,O as a,Q as ee,R as o,T as te,Ut as ne,Wt as re,bt as s,c as ie,h as c,it as ae,l,m as oe,ot as se,q as ce,s as le,st as ue,w as u,xt as d}from"./clipboard-dpqHdCyy.js";import{i as de}from"./feedback-B1UL2ETz.js";import{n as fe,t as f}from"./MasterDetailLayout-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{$ as t,Dt as n,G as r,M as i,O as a,Q as ee,R as o,T as te,Ut as ne,Wt as re,bt as s,c as ie,h as c,it as ae,l,m as oe,ot as se,q as ce,s as le,st as ue,w as u,xt as d}from"./clipboard-dpqHdCyy.js";import{i as de}from"./feedback-B1UL2ETz.js";import{n as fe,t as f}from"./MasterDetailLayout-B5uqvh98.js";import{r as pe,s as me}from"./toolbar-controls-CrM8hKZg.js";import{i as he,n as ge,r as _e,t as ve}from"./chevrons-up-down-CDj3bN7O.js";import{n as ye,t as be}from"./plus-C_Qg8uc3.js";import{n as p,t as xe}from"./trash-Ay_Vtz4n.js";import{c as Se,l as Ce,s as m}from"./schemas-CVYuqWs9.js";import{n as we,t as h}from"./useStatusToggle-D7g3Ew35.js";import{n as Te,t as g}from"./useCrudOperationColumn-CPAzNGXp.js";import{n as _,t as v}from"./DateTimeText-DldSUPjX.js";import{i as y,n as Ee,s as b}from"./table-columns-CvT6OHd2.js";import{a as x,i as De,o as Oe,r as S,t as ke}from"./EditFormModal-DVQksS9R.js";import{n as C,t as Ae}from"./ConfigurableTable-8sYmeul2.js";import{D as w,E as je}from"./App-CfQx7jWq.js";import{n as Me,r as T,t as Ne}from"./NavListPanel-DMIUMh7q.js";import{n as Pe,t as Fe}from"./ExportButton-sMPAV2hd.js";import{n as Ie,t as E}from"./webmcp-crud-D-Dz8BY4.js";import{useEffect as D,useMemo as O,useRef as k,useState as A}from"react";import{Fragment as Le,jsx as j,jsxs as M}from"react/jsx-runtime";import{abortSubmit as Re}from"@fudanda/admin-antd/core/lib/abort-submit";import{CheckCard as ze}from"@ant-design/pro-components";import{useDictItems as Be}from"@fudanda/admin-antd/core/hooks/useDictItems";import{dictContract as N}from"@fudanda/admin-antd/core/lib/native-operations";import{api as Ve}from"@fudanda/admin-antd/core/lib/contract-query";import{usePermission as He}from"@fudanda/admin-antd/core/hooks/usePermission";import{useFilterQuery as Ue}from"@fudanda/admin-antd/core/hooks/useFilterQuery";import{useListSearch as We}from"@fudanda/admin-antd/core/hooks/useListSearch";import{useUrlSelectionState as Ge}from"@fudanda/admin-antd/core/hooks/useUrlSelectionState";import{useTreeExpansion as Ke}from"@fudanda/admin-antd/core/hooks/useTreeExpansion";import{dictKeys as qe,useCreateDictItem as Je,useDeleteDictItem as Ye,useDeleteDicts as Xe,useDictDetail as Ze,useDictItemDetail as P,useDictItemsById as Qe,useDictList as $e,useSaveDict as et,useUpdateDictItem as tt}from"@fudanda/admin-antd/core/hooks/queries/dicts";var F,nt;function rt(){return(rt=e((()=>{
|
|
2
2
|
/**
|
|
3
3
|
* @license lucide-react v1.67.0 - ISC
|
|
4
4
|
*
|
|
@@ -13,4 +13,4 @@ d(),F={name:`book-open`,size:24,node:[[`path`,{d:`M12 5v16`,key:`1f6ucr`}],[`pat
|
|
|
13
13
|
* See the LICENSE file in the root directory of this source tree.
|
|
14
14
|
*/
|
|
15
15
|
d(),I={name:`pencil`,size:24,node:[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]},I.node,it=s(I)})))()}function at(e,...t){return e===void 0?null:t.find(t=>t?.id===e)??null}async function ot(e,t,n){let r=()=>{t.assertActive(),n.assertCanSelect()};r();let i=await n.read(e,t.signal);if(r(),!i||i.id!==e)throw Error(`字典详情与选择目标不匹配`);n.commit(i);let a=Date.now()+2e4;for(;!n.isCommitted(e);){if(r(),Date.now()>=a)throw Error(`字典选择尚未完成`);await new Promise(e=>setTimeout(e,20))}return r(),{status:`selected`,id:e}}function st({dict:e,active:t,onSelect:n,extra:r}){let i=()=>n(e);return/* @__PURE__ */ j(ze,{className:`dict-check-card`,value:e.id,checked:t,onClick:i,style:e.status===`disabled`?{opacity:.55}:void 0,title:/* @__PURE__ */ j(`button`,{type:`button`,className:`dict-check-card__select`,"aria-label":`${e.name} ${e.code}`,"aria-current":t?`true`:void 0,onClick:e=>{e.stopPropagation(),i()},children:e.name}),subTitle:/* @__PURE__ */ j(`span`,{className:`dict-check-card__code`,children:e.code}),description:/* @__PURE__ */ M(`span`,{className:`dict-check-card__meta`,children:[/* @__PURE__ */ j(v,{value:e.createdAt}),e.status===`disabled`&&/* @__PURE__ */ j(a,{size:`small`,color:`grey`,children:`停用`})]}),extra:r===void 0?void 0:/* @__PURE__ */ j(`span`,{onClick:e=>e.stopPropagation(),children:r})})}function R(){return(R=e((()=>{i(),_()})))()}function ct(e,t,n){return P(n?.dictId,e,t)}function z(){let{hasPermission:e}=He(),t=k(null),[i,s]=A([]),{page:l,pageSize:ue,setPage:d,setPageSize:fe,draftParams:me,setField:he,submittedParams:ge,handleSearch:ye}=We({defaults:{keyword:``},listKey:qe.lists}),p=Ue({keyword:ge.keyword}),[m,h]=Ge(`dict`),[g,_]=A(null),v=k(0),[y,x]=A(null),[S,C]=A(null),[w,T]=A(`{}`),{items:Pe,options:E}=Be(`common_status`),P=e=>e,[F,rt]=A(!1),I=$e({page:l,pageSize:ue,...p}),L=I.data?.total??0,R=m===null?void 0:Number(m),z=R!==void 0&&Number.isInteger(R)&&R>0,B=z?i.find(e=>e.id===R)??null:null,V=at(R,g),ut=Ze(R,z&&!B&&!V),H=at(R,B,V,ut.data)??(F?null:i[0]??null),dt=k(H?.id),ft=k(H?.id);dt.current=H?.id,D(()=>{ft.current=H?.id},[H?.id]),D(()=>{g&&m!==String(g.id)&&_(null)},[g,m]);let U=()=>{v.current++,_(null),h(null)};D(()=>{m!==null&&(!z||!B&&!V&&ut.isError)&&h(null)},[m,z,B,V,ut.isError,h]);let W=Qe(H?.id),G=O(()=>W.data??[],[W.data]),K=We({defaults:lt,listKey:qe.items(H?.id)}),pt=et(),q=Oe({entityName:`字典`,save:De(pt,{create:N.create.input.shape.body,update:N.update.input.shape.body}),useDetail:Ze,defaults:{status:`enabled`},toValues:e=>({name:e.name,code:e.code,description:e.description,status:e.status}),beforeSave:(e,{editing:t})=>({...e,description:e.description||void 0,...t?{clearFields:e.description?[]:[`description`]}:{}})}),J=et(),Y=Xe(),X=Je(),mt=tt(),ht=tt(),gt=Ye(),_t=J.isPending?J.variables?.id??null:null,Z=Oe({entityName:`字典项`,save:{mutateAsync:({id:e,values:t})=>(H||Re(`validation`),e===void 0?X.mutateAsync({params:{id:H.id},body:N.createItem.input.shape.body.parse(t)}):mt.mutateAsync({params:{id:H.id,itemId:e},body:N.updateItem.input.shape.body.parse(t)})),isPending:X.isPending||mt.isPending},useDetail:ct,defaults:{status:`enabled`,sort:0},toValues:e=>({label:e.label,value:e.value,sort:e.sort,status:e.status,remark:e.remark??void 0}),beforeSave:(e,{editing:n})=>{let r,i=(t.current?.getValue()??w).trim();if(i&&i!==`{}`)try{r=JSON.parse(i)}catch{de.error(`元数据 JSON 格式有误,请检查后重试`),Re()}let a={...e,parentId:y??void 0,color:S||void 0,remark:e.remark||void 0,metadata:r};return n?N.updateItem.input.shape.body.parse({...a,clearFields:[...y==null?[`parentId`]:[],...S?[]:[`color`],...e.remark?[]:[`remark`],...r===void 0?[`metadata`]:[]]}):N.createItem.input.shape.body.parse(a)},labelWidth:72}),Q=Z.editing,vt=k(!1);vt.current=q.visible||Z.visible||q.footerProps.loading||Z.footerProps.loading||pt.isPending||X.isPending||mt.isPending||Y.isPending||gt.isPending||J.isPending||ht.isPending,Ie({resource:`dicts`,title:`字典`,permission:`system:dict`,hasPermission:e,modal:q,list:N.list,detail:N.detail,create:N.create.input.shape.body,update:N.update.input.shape.body,fields:[`id`,`name`,`code`,`description`,`status`,`createdAt`,`updatedAt`],filters:p,remove:e=>Y.mutateAsync([e]),onDeleted:U,extraTools:e(`system:dict:list`)?[{name:`arcbase_system_dicts_select`,description:`选择字典以操作其字典项`,kind:`read`,inputSchema:{type:`object`,properties:{id:{type:`integer`,minimum:1}},required:[`id`],additionalProperties:!1},parse:e=>Ce({id:Se().int().positive()}).strict().parse(e),execute:async(e,t)=>{let n=e.id,r=++v.current;return ot(n,t,{read:(e,t)=>Ve(N.detail,{params:{id:e}},{signal:t,silent:!0}),assertCanSelect:()=>{if(v.current!==r)throw Error(`字典选择已变更`);if(vt.current)throw Error(`请先关闭字典或字典项编辑器并等待保存完成`)},commit:e=>{_(e),h(String(e.id))},isCommitted:e=>dt.current===e&&ft.current===e})}}]:[]}),Ie({resource:`dict_items`,title:`字典项`,permission:`system:dict`,hasPermission:e,modal:Z,permissions:{list:`system:dict:list`,create:`system:dict:item`,update:`system:dict:item`,delete:`system:dict:item`},list:N.items,detail:N.itemDetail,create:N.createItem.input.shape.body,update:N.updateItem.input.shape.body,fields:[`id`,`dictId`,`parentId`,`label`,`value`,`sort`,`status`,`color`,`remark`,`metadata`,`createdAt`,`updatedAt`],scope:H?.id,disabled:!H,filters:{...K.submittedParams},params:e=>({id:H?.id,...e===void 0?{}:{itemId:e}}),assertScope:()=>{if(!H||dt.current!==H.id)throw Error(`字典已切换,请重新调用`)},remove:e=>gt.mutateAsync({params:{id:H.id,itemId:e}}),applyValues:(e,{isEdit:t})=>{(!t||`parentId`in e)&&x(e.parentId??null),(!t||`color`in e)&&C(e.color??null),(!t||`metadata`in e)&&T(e.metadata?JSON.stringify(e.metadata,null,2):`{}`)}}),D(()=>{I.data&&s(I.data.list)},[I.data]);let yt=k(null);D(()=>{Q&&(x(Q.parentId??null),C(Q.color??null),T(Q.metadata?JSON.stringify(Q.metadata,null,2):`{}`))},[Q]);let bt=e=>{d(e)},xt=e=>{d(1),fe(e)},St=e=>{H?.id!==e.id&&(v.current++,_(null),h(String(e.id)),K.handleReset())},$=O(()=>{let{keyword:e,status:t}=K.submittedParams;return G.filter(n=>!(e&&!n.label.includes(e)&&!n.value.includes(e)||t&&n.status!==t))},[G,K.submittedParams]),Ct=O(()=>{let e=new Set($.map(e=>e.id)),t=e=>$.filter(t=>t.parentId===e).map(e=>{let n=t(e.id);return n.length>0?{...e,children:n}:e});return $.filter(t=>!t.parentId||!e.has(t.parentId)).map(e=>{let n=t(e.id);return n.length>0?{...e,children:n}:e})},[$]),{expandedRowKeys:wt,setExpandedRowKeys:Tt,allRowKeys:Et,isAllExpanded:Dt,toggleExpandAll:Ot,onExpandedRowsChange:kt}=Ke(Ct);D(()=>{H&&W.data!==void 0&&yt.current!==H.id&&(yt.current=H.id,Tt(Et))},[H,W.data,Et,Tt]);let At=O(()=>{if(!Q)return/* @__PURE__ */ new Set;let e=/* @__PURE__ */ new Set([Q.id]),t=n=>{G.filter(e=>e.parentId===n).forEach(n=>{e.add(n.id),t(n.id)})};return t(Q.id),e},[Q,G]),jt=O(()=>{let e=t=>G.filter(e=>(e.parentId??null)===t).map(t=>({label:t.label,value:t.id,key:String(t.id),disabled:At.has(t.id),children:e(t.id)}));return[{label:`无(根项目)`,value:0,key:`0`},...e(null)]},[G,At]),Mt=e=>{q.openEdit(e)},Nt=async e=>{await Y.mutateAsync([e]),de.success(`删除成功`),m===String(e)&&U()},Pt=async e=>{H&&await gt.mutateAsync({params:{id:H.id,itemId:e}})},Ft=(e=null)=>{x(e),C(null),T(`{}`),Z.openCreate()},It=e=>Ft(e.id),Lt=e=>{H&&(x(e.parentId??null),C(e.color??null),T(e.metadata?JSON.stringify(e.metadata,null,2):`{}`),Z.openEdit(e))},Rt=we({toggle:(e,t)=>H?ht.mutateAsync({params:{id:H.id,itemId:e.id},body:{status:t?`enabled`:`disabled`}}):Promise.resolve(),confirmDisable:e=>({danger:!0,title:`确认禁用字典项「${e.label}」?`,okText:`确认禁用`}),disabled:!H||!e(`system:dict:item`)}),zt=async(e,t)=>{(t!==`disabled`||await le({title:`确认禁用字典「${e.name}」?`,okText:`确认禁用`}))&&(await J.mutateAsync({id:e.id,values:{status:t}}),de.success(t===`enabled`?`已启用`:`已禁用`))},Bt=/* @__PURE__ */ j(Me,{title:`字典列表`,headerExtra:/* @__PURE__ */ M(te,{spacing:6,children:[/* @__PURE__ */ j(Fe,{entity:`system.dicts`,query:p}),/* @__PURE__ */ j(Ne,{items:[{key:`refresh`,label:`刷新`,icon:/* @__PURE__ */ j(je,{size:14}),onClick:()=>void I.refetch()},{key:`create`,label:`新增字典`,icon:/* @__PURE__ */ j(be,{size:14}),hidden:!e(`system:dict:create`),onClick:q.openCreate}]})]}),search:{value:me.keyword,onChange:he(`keyword`),placeholder:`名称/编码`,onEnterPress:ye},loading:I.isLoading,footer:/* @__PURE__ */ j(ce,{size:`small`,hoverShowPageSelect:!0,total:L,currentPage:l,pageSize:ue,pageSizeOpts:[10,20,50,100],showSizeChanger:!0,showTotal:!0,onPageChange:bt,onPageSizeChange:xt}),rawBody:!0,children:i.length>0?/* @__PURE__ */ j(ze.Group,{className:`dict-check-card-group`,value:H?.id,multiple:!1,children:i.map(t=>{let n=H?.id===t.id;return/* @__PURE__ */ j(st,{dict:t,active:n,onSelect:St,extra:/* @__PURE__ */ j(Ne,{items:[{key:`edit`,label:`编辑`,icon:/* @__PURE__ */ j(it,{size:14}),hidden:!e(`system:dict:update`),onClick:()=>void Mt(t)},{key:`delete`,label:`删除`,icon:/* @__PURE__ */ j(xe,{size:14}),danger:!0,hidden:!e(`system:dict:delete`),onClick:()=>{ie({title:`确认删除此字典?`,content:`字典下的所有字典项也将一并删除`,onOk:()=>Nt(t.id)})}}]})},t.id)})}):/* @__PURE__ */ j(`div`,{className:`nav-list-panel__empty`,children:`暂无字典`})}),Vt=Te({permissions:{edit:`system:dict:item`,remove:`system:dict:item`},edit:Lt,remove:e=>Pt(e.id),title:`确认删除此字典项?`,extra:t=>[{key:`child`,label:`子项`,hidden:!e(`system:dict:item`),onClick:()=>It(t)}],width:210,desktopInlineKeys:[`child`,`edit`,`delete`]}),Ht=[{title:`标签`,dataIndex:`label`,width:160,render:(e,t)=>t.color?/* @__PURE__ */ j(a,{color:P(t.color),size:`small`,children:e}):b(e)},{title:`键值`,dataIndex:`value`,width:160,render:b},{title:`排序`,dataIndex:`sort`,width:70,align:`center`},{title:`备注`,dataIndex:`remark`,minWidth:200,render:b},Ee,Rt.column(),Vt],Ut=()=>Et.length>0?/* @__PURE__ */ j(oe,{type:`primary`,icon:j(Dt?_e:ve,{size:14}),onClick:Ot,disabled:!H,children:Dt?`全部折叠`:`全部展开`}):null,Wt=/* @__PURE__ */ M(Le,{children:[/* @__PURE__ */ j(f.Header,{children:H?/* @__PURE__ */ M(Le,{children:[/* @__PURE__ */ M(`div`,{className:`dict-detail-title`,children:[/* @__PURE__ */ j(nt,{size:16}),/* @__PURE__ */ j(`span`,{title:H.name,children:H.name})]}),/* @__PURE__ */ j(a,{size:`small`,color:`blue`,children:H.code}),/* @__PURE__ */ j(re,{size:`small`,checked:H.status===`enabled`,loading:_t===H.id,disabled:!e(`system:dict:update`),onChange:e=>void zt(H,e?`enabled`:`disabled`)})]}):/* @__PURE__ */ j(`span`,{className:`dict-detail-placeholder`,children:`请选择字典`})}),/* @__PURE__ */ j(f.Body,{children:/* @__PURE__ */ j(Ae,{searchConfig:ee({keyword:/* @__PURE__ */ j(ae,{placeholder:`标签/键值`,...K.bindKeyword(`keyword`),width:180,disabled:!H}),filters:/* @__PURE__ */ j(se,{items:Pe,...K.bind(`status`),disabled:!H}),onSearch:K.handleSearch,onReset:K.handleReset,create:/* @__PURE__ */ j(pe,{permission:`system:dict:item`,onClick:()=>Ft(),disabled:!H}),actions:Ut(),filterTitle:`字典项筛选`,actionTitle:`字典项操作`}),bordered:!0,columns:Ht,dataSource:Ct,rowKey:`id`,loading:W.isFetching,onRefresh:H?()=>void W.refetch():void 0,refreshLoading:W.isFetching,pagination:!1,size:`small`,empty:H?`暂无数据`:`请选择字典`,childrenRecordName:`children`,expandedRowKeys:wt,onExpandedRowsChange:kt})})]});return/* @__PURE__ */ M(`div`,{className:`page-container page-container--stretch`,children:[/* @__PURE__ */ j(f,{master:Bt,detail:Wt,defaultSize:300,minSize:260,maxSize:420,persistKey:`dicts`,showDetail:!!H,onBack:U,onResponsiveChange:rt,style:{flex:1,overflow:`hidden`}}),/* @__PURE__ */ M(ke,{modal:q,width:480,children:[/* @__PURE__ */ j(o.Input,{field:`name`,label:`字典名称`,placeholder:`请输入字典名称`,style:{width:`100%`},rules:[{required:!0,message:`请输入字典名称`}]}),/* @__PURE__ */ j(o.Input,{field:`code`,label:`字典编码`,placeholder:`小写字母和下划线`,style:{width:`100%`},rules:[{required:!0,message:`请输入字典编码`}],validate:e=>{let t=N.create.input.shape.body.safeParse({code:e});return(t.success?void 0:t.error.issues.find(e=>e.path[0]===`code`))?.message??``}}),/* @__PURE__ */ j(o.Input,{field:`description`,label:`描述`,placeholder:`请输入描述`,style:{width:`100%`}}),/* @__PURE__ */ j(o.Select,{field:`status`,label:`状态`,style:{width:`100%`},optionList:E,placeholder:`请选择状态`})]}),/* @__PURE__ */ M(ke,{modal:Z,width:600,children:[/* @__PURE__ */ M(u,{gutter:16,children:[/* @__PURE__ */ j(c,{span:12,children:/* @__PURE__ */ j(o.Input,{field:`label`,label:`标签`,placeholder:`请输入标签`,style:{width:`100%`},rules:[{required:!0,message:`请输入标签`}]})}),/* @__PURE__ */ j(c,{span:12,children:/* @__PURE__ */ j(o.Input,{field:`value`,label:`键值`,placeholder:`请输入键值`,style:{width:`100%`},rules:[{required:!0,message:`请输入键值`}]})})]}),/* @__PURE__ */ M(u,{gutter:16,children:[/* @__PURE__ */ j(c,{span:12,children:/* @__PURE__ */ j(o.InputNumber,{field:`sort`,label:`排序`,placeholder:`请输入排序`,min:0,style:{width:`100%`}})}),/* @__PURE__ */ j(c,{span:12,children:/* @__PURE__ */ j(o.Select,{field:`status`,label:`状态`,style:{width:`100%`},optionList:E,placeholder:`请选择状态`})})]}),/* @__PURE__ */ M(u,{gutter:16,children:[/* @__PURE__ */ j(c,{span:12,children:/* @__PURE__ */ j(o.Slot,{label:{text:`父级`},children:/* @__PURE__ */ j(r,{treeData:jt,value:y??0,onChange:e=>x(e===0?null:e),style:{width:`100%`},filterTreeNode:!0,expandAll:!0})})}),/* @__PURE__ */ j(c,{span:12,children:/* @__PURE__ */ j(o.Slot,{label:{text:`颜色`},children:(()=>{let e=[`amber`,`blue`,`cyan`,`green`,`grey`,`indigo`,`light-blue`,`light-green`,`lime`,`orange`,`pink`,`purple`,`red`,`teal`,`violet`,`yellow`,`white`],t={amber:`琥珀`,blue:`蓝色`,cyan:`青色`,green:`绿色`,grey:`灰色`,indigo:`靛蓝`,"light-blue":`浅蓝`,"light-green":`浅绿`,lime:`柠绿`,orange:`橙色`,pink:`粉色`,purple:`紫色`,red:`红色`,teal:`蓝绿`,violet:`紫罗兰`,yellow:`黄色`,white:`白色`};return/* @__PURE__ */ j(ne,{value:S??void 0,onChange:e=>C(e??null),placeholder:`无颜色`,showClear:!0,onClear:()=>C(null),style:{width:`100%`},renderSelectedItem:e=>/* @__PURE__ */ j(a,{color:P(e.value),size:`small`,style:{margin:`2px 0`},children:e.label}),renderOptionItem:({selected:e,style:t,onClick:n,value:r,label:i})=>/* @__PURE__ */ j(`button`,{type:`button`,onClick:n,style:{...t,display:`flex`,alignItems:`center`,gap:8,padding:`6px 12px`,cursor:`pointer`,width:`100%`,border:`none`,background:e?`var(--arc-antd-color-primary-light-default)`:`transparent`,textAlign:`left`},children:/* @__PURE__ */ j(a,{color:P(r),size:`small`,children:i})}),children:e.map(e=>/* @__PURE__ */ j(ne.Option,{value:e,label:t[e]??e,children:/* @__PURE__ */ j(a,{color:P(e),size:`small`,children:t[e]??e})},e))})})()})})]}),/* @__PURE__ */ j(u,{gutter:16,children:/* @__PURE__ */ j(c,{span:24,children:/* @__PURE__ */ j(o.Input,{field:`remark`,label:`备注`,placeholder:`请输入备注`,style:{width:`100%`}})})}),/* @__PURE__ */ j(u,{gutter:16,children:/* @__PURE__ */ j(c,{span:24,children:/* @__PURE__ */ j(o.Slot,{label:{text:`元数据`},children:/* @__PURE__ */ j(n,{ref:t,value:w,height:200,width:`100%`},w)})})})]})]})}var lt;function B(){return(B=e((()=>{i(),ye(),rt(),he(),ge(),w(),L(),p(),Pe(),C(),x(),fe(),T(),y(),me(),l(),t(),h(),g(),ue(),S(),E(),R(),m(),lt={keyword:``,status:void 0}})))()}B();export{z as default};
|
|
16
|
-
//# sourceMappingURL=DictsPage-
|
|
16
|
+
//# sourceMappingURL=DictsPage-BGnamkWk.js.map
|