@fudanda/admin-antd 2.20261107.1-beta.1 → 2.20261109.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/ApiTokensPage-w3JGRNQC.js +2 -0
- package/dist/chunks/ApiTokensPage-w3JGRNQC.js.map +1 -0
- package/dist/chunks/{App-BF96TQ_D.js → App-nh6_qOo8.js} +5 -5
- package/dist/chunks/{App-BF96TQ_D.js.map → App-nh6_qOo8.js.map} +1 -1
- package/dist/chunks/{AppModal-CLkMJ-96.js → AppModal-CEouaU03.js} +2 -2
- package/dist/chunks/{AppModal-CLkMJ-96.js.map → AppModal-CEouaU03.js.map} +1 -1
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js → ArcBaseAdmin-CX7fQz4x.js} +2 -2
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js.map → ArcBaseAdmin-CX7fQz4x.js.map} +1 -1
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js → DepartmentsPage-BdD9VfDI.js} +2 -2
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js.map → DepartmentsPage-BdD9VfDI.js.map} +1 -1
- package/dist/chunks/{DictsPage-uV3Uukwc.js → DictsPage-fxBdV1-3.js} +2 -2
- package/dist/chunks/{DictsPage-uV3Uukwc.js.map → DictsPage-fxBdV1-3.js.map} +1 -1
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js → EntityContextRuntime-CMhoj6qe.js} +2 -2
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js.map → EntityContextRuntime-CMhoj6qe.js.map} +1 -1
- package/dist/chunks/EntityContextRuntime-Dc89ZSnM.js +1 -0
- package/dist/chunks/{ExportButton-e2ybxuHb.js → ExportButton-DGxB2tcu.js} +2 -2
- package/dist/chunks/{ExportButton-e2ybxuHb.js.map → ExportButton-DGxB2tcu.js.map} +1 -1
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js → FileViewerPreviewPanel-BMZ7FdKV.js} +3 -3
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js.map → FileViewerPreviewPanel-BMZ7FdKV.js.map} +1 -1
- package/dist/chunks/{FilesPage-BI35mStl.js → FilesPage-DrgWELKy.js} +3 -3
- package/dist/chunks/{FilesPage-BI35mStl.js.map → FilesPage-DrgWELKy.js.map} +1 -1
- package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js +9 -0
- package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js.map +1 -0
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js → LogStatsScaffold-DaB0JeAN.js} +2 -2
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js.map → LogStatsScaffold-DaB0JeAN.js.map} +1 -1
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js → LoginLogsPage-VmYC7i6q.js} +2 -2
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js.map → LoginLogsPage-VmYC7i6q.js.map} +1 -1
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js → LoginLogsTable-CULcc_e8.js} +2 -2
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js.map → LoginLogsTable-CULcc_e8.js.map} +1 -1
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js → MarkdownPreviewPanel-CBcPc7Wv.js} +2 -2
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js.map → MarkdownPreviewPanel-CBcPc7Wv.js.map} +1 -1
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js → MasterDetailLayout-ByIBpmkZ.js} +2 -2
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js.map → MasterDetailLayout-ByIBpmkZ.js.map} +1 -1
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js → McpSettingsPage-C5V_rj2V.js} +2 -2
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js.map → McpSettingsPage-C5V_rj2V.js.map} +1 -1
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js → MemberAssignmentSheet-DL0fg1Yf.js} +2 -2
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js.map → MemberAssignmentSheet-DL0fg1Yf.js.map} +1 -1
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js → MenuCommandPalette-C2PvK3Gh.js} +2 -2
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js.map → MenuCommandPalette-C2PvK3Gh.js.map} +1 -1
- package/dist/chunks/{MenusPage-Dd7OLQYT.js → MenusPage-Bytd1HlW.js} +2 -2
- package/dist/chunks/{MenusPage-Dd7OLQYT.js.map → MenusPage-Bytd1HlW.js.map} +1 -1
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js → MonacoPreviewPanel-BZrNIcFZ.js} +2 -2
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js.map → MonacoPreviewPanel-BZrNIcFZ.js.map} +1 -1
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js → NavListPanel-zwUDIYSP.js} +2 -2
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js.map → NavListPanel-zwUDIYSP.js.map} +1 -1
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js → OperationLogsPage-D2BQdGNp.js} +2 -2
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js.map → OperationLogsPage-D2BQdGNp.js.map} +1 -1
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js → OperationLogsTable-DaaON4QR.js} +3 -3
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js.map → OperationLogsTable-DaaON4QR.js.map} +1 -1
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js → PDFPreviewPanel-CMmnWBKW.js} +3 -3
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js.map → PDFPreviewPanel-CMmnWBKW.js.map} +1 -1
- package/dist/chunks/{PositionsPage-BIKYQDB5.js → PositionsPage-CBZITssT.js} +2 -2
- package/dist/chunks/{PositionsPage-BIKYQDB5.js.map → PositionsPage-CBZITssT.js.map} +1 -1
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js → PreferencesSheetBody-B0poTPEA.js} +2 -2
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js.map → PreferencesSheetBody-B0poTPEA.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DLftC6KZ.js → ProfilePage-DLhacdWt.js} +2 -2
- package/dist/chunks/{ProfilePage-DLftC6KZ.js.map → ProfilePage-DLhacdWt.js.map} +1 -1
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js → ProjectInfoPage-CJpGxpu5.js} +2 -2
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js.map → ProjectInfoPage-CJpGxpu5.js.map} +1 -1
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js → RelationPanel-BsbfEDo2.js} +2 -2
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js.map → RelationPanel-BsbfEDo2.js.map} +1 -1
- package/dist/chunks/{RolesPage-BhltU2Qm.js → RolesPage-46dzdiah.js} +2 -2
- package/dist/chunks/{RolesPage-BhltU2Qm.js.map → RolesPage-46dzdiah.js.map} +1 -1
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js → SessionConflictModal-Bm38eExL.js} +2 -2
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js.map → SessionConflictModal-Bm38eExL.js.map} +1 -1
- package/dist/chunks/SettingModuleDetail-BjxUJeH5.js +17 -0
- package/dist/chunks/SettingModuleDetail-BjxUJeH5.js.map +1 -0
- package/dist/chunks/{SettingsPage-DMzeDrnc.js → SettingsPage-C32Vuizm.js} +2 -2
- package/dist/chunks/{SettingsPage-DMzeDrnc.js.map → SettingsPage-C32Vuizm.js.map} +1 -1
- package/dist/chunks/{StatCard-C0xSZyiS.js → StatCard-CRPfkSBY.js} +2 -2
- package/dist/chunks/{StatCard-C0xSZyiS.js.map → StatCard-CRPfkSBY.js.map} +1 -1
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js → UserGroupsPage-08G5MdGm.js} +2 -2
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js.map → UserGroupsPage-08G5MdGm.js.map} +1 -1
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js → UserLogsPanels-nbIrMym9.js} +2 -2
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js.map → UserLogsPanels-nbIrMym9.js.map} +1 -1
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js → UserTransferSelect-C8betaWG.js} +2 -2
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js.map → UserTransferSelect-C8betaWG.js.map} +1 -1
- package/dist/chunks/{UsersPage--p68X2Yr.js → UsersPage-BjTiNEqF.js} +2 -2
- package/dist/chunks/{UsersPage--p68X2Yr.js.map → UsersPage-BjTiNEqF.js.map} +1 -1
- package/dist/chunks/{browser-BKLM0ThC-3Xar5rZw.js → browser-BKLM0ThC-Cp7Gi4-F.js} +1 -1
- package/dist/chunks/{code-P0HJS_q1.js → code-LswxAr98.js} +1 -1
- package/dist/chunks/{direct-engine-BYEscsGg.js → direct-engine-Dv_6v4sx.js} +1 -1
- package/dist/chunks/{html-B__1Vr_C.js → html-BokjxlLb.js} +1 -1
- package/dist/chunks/{line-DzLRZVEq.js → line-Bqh6atHH.js} +1 -1
- package/dist/chunks/{lrc-kf-TilFB.js → lrc-T5e1svZG.js} +1 -1
- package/dist/chunks/{markdown-xIo-vnKK.js → markdown-BpWokN1s.js} +1 -1
- package/dist/chunks/{patch-BEaX-xYV.js → patch-BYVX5C9G.js} +1 -1
- package/dist/chunks/{worker-engine-FCdIQLzN.js → worker-engine-CtUAeI4G.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-D6UlLiVN.js} +2 -2
- package/dist/{src-C8_bzBi4.js.map → src-D6UlLiVN.js.map} +1 -1
- package/package.json +9 -9
- package/dist/chunks/ApiTokensPage-DiRMgViD.js +0 -2
- package/dist/chunks/ApiTokensPage-DiRMgViD.js.map +0 -1
- 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
- package/dist/chunks/SettingModuleDetail-Dppk9An1.js +0 -17
- package/dist/chunks/SettingModuleDetail-Dppk9An1.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenusPage-Dd7OLQYT.js","mappings":"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","names":["IconPicker","search","setSearch","useState","visible","setVisible","currentPage","setCurrentPage","allIconNames","useAllIconNames","filteredNames","useMemo","q","name","pageNames","PAGE_SIZE","handleSearchChange","v","handleVisibleChange","handleSelect","onChange","handleClear","panelContent","Input","Search","List","value","renderLucideIcon","Pagination","page","Popover","X","ChevronDown","FormStatusRadioGroup","useDictItems","Form","items","item","assertWebMcpMenuValues","values","type","record","external","visibleFields","suppliedFields","field","MenusPage","usePermission","createParentIdRef","useRef","parentId","setParentId","iconValue","setIconValue","menuType","setMenuType","isExternalVal","setIsExternalVal","useListSearch","defaultSearchParams","menuKeys","menuTypeItems","statusItems","menuVisibleItems","menuTreeQuery","useMenuTree","data","saveMutation","useSaveMenu","menuModal","useEditModal","formSaveMutation","menuContract","useMenuDetail","menu","optionalText","key","editing","toggleStatusMutation","deleteMutation","useDeleteMenu","useStandardWebMcpCrudAdapter","submittedParams","isEdit","useEffect","detail","filterTree","useCallback","filteredChildren","kw","st","titleMatch","textMatches","statusMatch","mergedChildren","acc","statusFilter","pinyinReady","usePinyinReady","filteredData","keyword","useTreeExpansion","setExpandedRowKeys","allRowKeys","handleResetAndCollapse","handleReset","buildTreeSelectData","m","parentTreeData","openCreate","nextParentId","pid","openEdit","status","useStatusToggle","enabled","hasPermission","operationColumn","useCrudOperationColumn","row","columns","expandIcon","options","indentText","val","DictTag","renderEllipsis","createdAtColumn","EMPTY_PLACEHOLDER","renderExpandButton","Button","jsx","isAllExpanded","ChevronsDownUp","ChevronsUpDown","toggleExpandAll","Banner","ConfigurableTable","buildTableSearch","KeywordInput","bindKeyword","StatusSelect","bind","handleSearch","CreateButton","EditFormModal","Radio","i","TreeSelect","Row","Col","Tooltip"],"ignoreList":[],"sources":["../../src/components/IconPicker.tsx","../../src/components/FormStatusRadioGroup.tsx","../../src/pages/system/menus/webmcp-values.ts","../../src/pages/system/menus/MenusPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { Popover, Input, List, Pagination } from \"@/ui\";\nimport { Search, ChevronDown, X } from 'lucide-react';\nimport { useAllIconNames, renderLucideIcon } from \"@/utils/icons\";\nimport \"@/components/IconPicker.css\";\ninterface IconPickerProps {\n value?: string;\n onChange?: (icon: string) => void;\n style?: React.CSSProperties;\n}\n/** 每页显示图标数(8 列 × 7 行) */\nconst PAGE_SIZE = 56;\nexport default function IconPicker({ value, onChange, style }: Readonly<IconPickerProps>) {\n const [search, setSearch] = useState('');\n const [visible, setVisible] = useState(false);\n const [currentPage, setCurrentPage] = useState(1);\n const allIconNames = useAllIconNames();\n const filteredNames = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q)\n return allIconNames;\n return allIconNames.filter((name) => name.toLowerCase().includes(q));\n }, [search, allIconNames]);\n const pageNames = useMemo(() => filteredNames.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE), [filteredNames, currentPage]);\n const handleSearchChange = (v: string) => {\n setSearch(v);\n setCurrentPage(1);\n };\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n if (v) {\n setCurrentPage(1);\n setSearch('');\n }\n };\n const handleSelect = (name: string) => {\n onChange?.(name);\n setVisible(false);\n setSearch('');\n };\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange?.('');\n };\n const panelContent = (<div className=\"icon-picker-panel\">\n <Input size=\"small\" prefix={<Search size={13}/>} placeholder={`搜索图标(共 ${allIconNames.length} 个)…`} value={search} onChange={handleSearchChange} className=\"icon-picker-search\" style={{ marginBottom: 8 }}/>\n <div className=\"icon-picker-grid-wrap\">\n <List size=\"small\" split={false} grid={{ span: 3, gutter: 4 }} dataSource={pageNames} emptyContent={<div className=\"icon-picker-empty-result\">无匹配图标</div>} renderItem={(name) => (<List.Item style={{ padding: 0 }}>\n <button type=\"button\" className={`icon-picker-cell${value === name ? ' icon-picker-cell--active' : ''}`} onClick={() => handleSelect(name)} title={name}>\n {renderLucideIcon(name, 18)}\n </button>\n </List.Item>)}/>\n </div>\n {filteredNames.length > PAGE_SIZE && (<div className=\"icon-picker-pagination\">\n <Pagination size=\"small\" hoverShowPageSelect total={filteredNames.length} pageSize={PAGE_SIZE} currentPage={currentPage} onPageChange={(page) => setCurrentPage(page)} showSizeChanger={false}/>\n </div>)}\n </div>);\n return (<Popover content={panelContent} visible={visible} onVisibleChange={handleVisibleChange} trigger=\"click\" position=\"bottomLeft\" showArrow={false}>\n <div className={`icon-picker-trigger ${visible ? 'icon-picker-trigger--open' : ''}`} style={style}>\n <span className=\"icon-picker-preview\">\n {value ? renderLucideIcon(value, 16) : null}\n </span>\n <span className={`icon-picker-label ${value ? '' : 'icon-picker-label--placeholder'}`}>\n {value || '点击选择图标'}\n </span>\n {value ? (<button type=\"button\" className=\"icon-picker-arrow icon-picker-arrow--clear\" onClick={handleClear}>\n <X size={13}/>\n </button>) : (<span className=\"icon-picker-arrow\">\n <ChevronDown size={13}/>\n </span>)}\n </div>\n </Popover>);\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { Form } from \"@/ui\";\nimport { useDictItems } from \"@fudanda/react-core/hooks/useDictItems\";\ninterface FormStatusRadioGroupProps {\n field?: string;\n label?: string;\n disabled?: boolean;\n /** Semi RadioGroup 外观(默认圆点,`button` 为按钮组) */\n type?: 'default' | 'button' | 'card' | 'pureCard';\n /** 字段下方的说明文字 */\n extraText?: ReactNode;\n /** 透传给 Form.RadioGroup 的校验规则 */\n rules?: ComponentProps<typeof Form.RadioGroup>['rules'];\n}\n/**\n * 通用启用 / 禁用单选组:选项与文案来自字典 `common_status`,\n * 与筛选栏 `StatusSelect`、状态标签同源;页面内禁止再写「启用 / 停用」字面量选项。\n */\nexport function FormStatusRadioGroup({ field = 'status', label = '状态', disabled, type, extraText, rules }: Readonly<FormStatusRadioGroupProps>) {\n const { items } = useDictItems('common_status');\n return (<Form.RadioGroup field={field} label={label} disabled={disabled} type={type} extraText={extraText} rules={rules}>\n {items.map((item) => (<Form.Radio key={item.value} value={item.value}>{item.label}</Form.Radio>))}\n </Form.RadioGroup>);\n}\nexport default FormStatusRadioGroup;\n","/** Reject fields hidden by the ordinary menu editor instead of ignoring them. */\nexport function assertWebMcpMenuValues(values: Record<string, unknown>, record?: { type?: string; isExternal?: boolean }, suppliedFields: readonly string[] = Object.keys(values)): void {\n const type = values.type ?? record?.type ?? 'menu';\n const external = values.isExternal ?? record?.isExternal ?? false;\n const visibleFields: Record<string, boolean> = {\n icon: type !== 'button', visible: type !== 'button',\n path: type !== 'button', query: type !== 'button', isExternal: type !== 'button',\n component: type === 'menu' && !external, name: type === 'menu' && !external,\n permission: type === 'button', keepAlive: type === 'menu',\n embed: type !== 'button' && Boolean(external),\n };\n if (suppliedFields.some(field => visibleFields[field] === false)) throw new Error('输入包含当前菜单类型或外链模式下不可编辑的字段');\n}\n","import type { ApiMenu } from '@fudanda/shared/api/menus';\nimport { menuContract } from '@fudanda/react-core/lib/native-operations';\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { Button, Form, Radio, TreeSelect, Row, Col, Tooltip, Banner } from \"@/ui\";\nimport type { TreeNodeData } from \"@/ui\";\nimport { ChevronsDownUp, ChevronsUpDown } from 'lucide-react';\nimport type { Menu } from '@fudanda/shared/identity';\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { renderLucideIcon } from \"@/utils/icons\";\nimport IconPicker from \"@/components/IconPicker\";\nimport { usePermission } from \"@fudanda/react-core/hooks/usePermission\";\nimport { useEditModal, formSaveMutation } from \"@/hooks/useEditModal\";\nimport { useListSearch } from \"@fudanda/react-core/hooks/useListSearch\";\nimport { usePinyinReady } from \"@fudanda/react-core/hooks/usePinyinReady\";\nimport { textMatches } from \"@fudanda/react-core/utils/pinyin\";\nimport { useTreeExpansion } from \"@fudanda/react-core/hooks/useTreeExpansion\";\nimport DictTag from \"@/components/DictTag\";\nimport { FormStatusRadioGroup } from \"@/components/FormStatusRadioGroup\";\nimport { useDictItems } from \"@fudanda/react-core/hooks/useDictItems\";\nimport type { ColumnProps } from \"@/ui\";\nimport { createdAtColumn, EMPTY_PLACEHOLDER, renderEllipsis } from \"@/utils/table-columns\";\nimport { menuKeys, useDeleteMenu, useMenuDetail, useMenuTree, useSaveMenu } from \"@fudanda/react-core/hooks/queries/menus\";\nimport { CreateButton } from \"@/components/toolbar-controls\";\nimport { KeywordInput, StatusSelect } from \"@/components/search-filters\";\nimport { buildTableSearch, useStatusToggle, useCrudOperationColumn } from \"@/components/list-page/index\";\nimport { EditFormModal } from \"@/components/EditFormModal\";\nimport { useStandardWebMcpCrudAdapter } from '@/webmcp-crud';\nimport { assertWebMcpMenuValues } from './webmcp-values';\ninterface SearchParams {\n keyword: string;\n status?: string;\n}\nconst defaultSearchParams: SearchParams = { keyword: '', status: undefined };\nexport default function MenusPage() {\n const { hasPermission } = usePermission();\n const createParentIdRef = useRef<number>(0);\n const [parentId, setParentId] = useState<number | null>(null);\n const [iconValue, setIconValue] = useState('');\n const [menuType, setMenuType] = useState<string>('menu');\n const [isExternalVal, setIsExternalVal] = useState<boolean>(false);\n // 树形列表不分页:只取草稿 / 已提交双状态与「查询 / 重置必回源」,submitted 进客户端过滤谓词\n const { bind, bindKeyword, submittedParams, handleSearch, handleReset } = useListSearch<SearchParams>({\n defaults: defaultSearchParams,\n listKey: menuKeys.tree,\n });\n const { items: menuTypeItems } = useDictItems('menu_type');\n const { items: statusItems } = useDictItems('common_status');\n const { items: menuVisibleItems } = useDictItems('menu_visible');\n const menuTreeQuery = useMenuTree();\n const data = useMemo(() => menuTreeQuery.data ?? [], [menuTreeQuery.data]);\n const saveMutation = useSaveMenu();\n const menuModal = useEditModal<ApiMenu, Record<string, unknown>, Record<string, unknown>>({\n entityName: '菜单',\n save: formSaveMutation(saveMutation, { create: menuContract.create.input.shape.body, update: menuContract.update.input.shape.body }),\n useDetail: useMenuDetail,\n defaults: () => ({\n type: 'menu',\n status: 'enabled',\n visible: 'show',\n sort: 0,\n parentId: createParentIdRef.current,\n isExternal: false,\n embed: false,\n keepAlive: false,\n }),\n toValues: (menu) => ({\n title: menu.title, type: menu.type, name: menu.name, path: menu.path, component: menu.component,\n permission: menu.permission, query: menu.query, icon: menu.icon, parentId: menu.parentId,\n sort: menu.sort, status: menu.status, visible: menu.visible ? 'show' : 'hidden',\n isExternal: menu.isExternal, embed: menu.embed, keepAlive: menu.keepAlive,\n }),\n beforeSave: (values, { editing }) => {\n const optionalText = (key: string) => typeof values[key] === 'string' && values[key] ? values[key] : undefined;\n return {\n title: values.title, type: values.type, sort: values.sort, status: values.status,\n parentId: parentId ?? 0, icon: iconValue || undefined,\n name: optionalText('name'), path: optionalText('path'), component: optionalText('component'),\n permission: optionalText('permission'), query: optionalText('query'),\n visible: values.visible === undefined ? true : values.visible === 'show',\n isExternal: values.isExternal, embed: values.isExternal ? values.embed ?? false : false, keepAlive: values.keepAlive,\n ...(editing ? { clearFields: [...['name', 'path', 'component', 'permission', 'query'].filter(key => !optionalText(key)), ...(!iconValue ? ['icon'] : [])] } : {}),\n };\n },\n });\n const toggleStatusMutation = useSaveMenu();\n const deleteMutation = useDeleteMenu();\n useStandardWebMcpCrudAdapter<ApiMenu>({ resource: 'menus', title: '菜单', permission: 'system:menu', hasPermission, modal: menuModal,\n list: menuContract.tree, detail: menuContract.detail, create: menuContract.create.input.shape.body, update: menuContract.update.input.shape.body,\n fields: ['id', 'parentId', 'title', 'name', 'path', 'component', 'permission', 'type', 'icon', 'query', 'sort', 'status', 'visible', 'isExternal', 'embed', 'keepAlive'],\n guardValues: assertWebMcpMenuValues,\n filters: { ...submittedParams }, remove: id => deleteMutation.mutateAsync({ params: { id } }), deleteContent: '子菜单也将一并删除',\n toForm: values => ({ ...values, ...('visible' in values ? { visible: values.visible ? 'show' : 'hidden' } : {}) }),\n applyValues: (values, { isEdit }) => { if (!isEdit || 'parentId' in values) setParentId(values.parentId as number ?? 0); if (!isEdit || 'icon' in values) setIconValue(values.icon as string ?? ''); if (!isEdit || 'type' in values) setMenuType(values.type as string ?? 'menu'); if (!isEdit || 'isExternal' in values) setIsExternalVal(Boolean(values.isExternal)); } });\n useEffect(() => {\n const detail = menuModal.editing;\n if (!detail || !menuModal.visible)\n return;\n setParentId(detail.parentId ?? 0);\n setIconValue(detail.icon ?? '');\n setMenuType(detail.type);\n setIsExternalVal(detail.isExternal ?? false);\n }, [menuModal.editing, menuModal.visible]);\n // 递归过滤树节点(标题子串 + 拼音首字母 / 全拼)\n const filterTree = useCallback((items: Menu[], kw: string, st: string): Menu[] => {\n return items.reduce<Menu[]>((acc, item) => {\n const filteredChildren = item.children?.length ? filterTree(item.children, kw, st) : [];\n const titleMatch = !kw || textMatches(item.title, kw);\n const statusMatch = !st || item.status === st;\n let mergedChildren: Menu[] = [];\n if (filteredChildren.length > 0) {\n mergedChildren = filteredChildren;\n }\n else if (item.children?.length) {\n mergedChildren = [];\n }\n if ((titleMatch && statusMatch) || filteredChildren.length > 0) {\n acc.push({ ...item, children: mergedChildren });\n }\n return acc;\n }, []);\n }, []);\n const { keyword, status: statusFilter = '' } = submittedParams;\n // 拼音词典就绪后重算过滤,补上已提交关键字的拼音命中\n const pinyinReady = usePinyinReady();\n const filteredData = useMemo(() => (keyword || statusFilter ? filterTree(data, keyword, statusFilter) : data),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data, keyword, statusFilter, filterTree, pinyinReady]);\n // 展开态跟随**表格实际渲染的** filteredData:跟未筛选的全量树比较会让筛选后\n // 已全部展开的表格仍显示「全部展开」,点击后可见区域毫无变化\n const { expandedRowKeys, setExpandedRowKeys, allRowKeys, isAllExpanded, toggleExpandAll, onExpandedRowsChange, } = useTreeExpansion(filteredData);\n // 有过滤条件时,数据变化后自动展开匹配节点\n useEffect(() => {\n if (keyword || statusFilter) {\n setExpandedRowKeys(allRowKeys);\n }\n }, [keyword, statusFilter, allRowKeys, setExpandedRowKeys]);\n // 重置除清条件外还要收起全部节点;useTreeExpansion 依赖 filteredData,声明在 useListSearch 之后,故在此组合\n const handleResetAndCollapse = () => {\n handleReset();\n setExpandedRowKeys([]);\n };\n // Semi Table 原生支持 children 字段树形展示,无需手动 flatten\n // 递归构建 TreeSelect 数据(过滤掉按钮类型)\n function buildTreeSelectData(items: Menu[]): TreeNodeData[] {\n return items\n .filter((m) => m.type !== 'button')\n .map((m) => ({\n label: m.title,\n value: m.id,\n key: String(m.id),\n children: m.children?.length ? buildTreeSelectData(m.children) : undefined,\n }));\n }\n const parentTreeData: TreeNodeData[] = [\n { label: '顶级', value: 0, key: '0' },\n ...buildTreeSelectData(data),\n ];\n const openCreate = (pid?: number) => {\n const nextParentId = pid ?? 0;\n createParentIdRef.current = nextParentId;\n setParentId(nextParentId);\n setIconValue('');\n setMenuType('menu');\n setIsExternalVal(false);\n menuModal.openCreate();\n };\n const openEdit = (menu: Menu) => {\n setParentId(menu.parentId ?? 0);\n setIconValue(menu.icon ?? '');\n setMenuType(menu.type);\n setIsExternalVal(menu.isExternal ?? false);\n menuModal.openEdit(menu);\n };\n const status = useStatusToggle<Menu>({\n toggle: (menu, enabled) => toggleStatusMutation.mutateAsync({ id: menu.id, values: { status: enabled ? 'enabled' : 'disabled' } }),\n confirmDisable: (menu) => ({ danger: true, title: `确认禁用菜单「${menu.title}」?`, content: '禁用后该菜单将不可访问。', okText: '确认禁用' }),\n disabled: !hasPermission('system:menu:update'),\n });\n const operationColumn = useCrudOperationColumn<Menu>({\n permission: 'system:menu',\n edit: openEdit,\n remove: (row) => deleteMutation.mutateAsync({ params: { id: row.id } }),\n title: '确认删除此菜单?',\n content: '子菜单也将一并删除',\n extra: (row) => [\n {\n key: 'child',\n label: '子项',\n hidden: row.type === 'button' || !hasPermission('system:menu:create'),\n onClick: () => openCreate(row.id),\n },\n ],\n width: 210,\n desktopInlineKeys: ['child', 'edit', 'delete'],\n });\n const columns: ColumnProps<Menu>[] = [\n {\n title: '菜单名称',\n dataIndex: 'title',\n minWidth: 280,\n useFullRender: true,\n render: (val, row, _index, options) => {\n const expandIcon = options?.expandIcon;\n const indentText = options?.indentText;\n return (<span style={{ display: 'flex', alignItems: 'center', minWidth: 0 }}>\n {indentText}\n {expandIcon}\n {row.icon && (<span style={{ marginRight: 6, marginLeft: 4, display: 'flex', alignItems: 'center', color: 'var(--arc-antd-color-text-1)', flexShrink: 0 }}>\n {renderLucideIcon(row.icon, 15)}\n </span>)}\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={String(val)}>{val}</span>\n </span>);\n },\n },\n {\n title: '类型',\n dataIndex: 'type',\n width: 90,\n render: (val: string) => <DictTag dictCode=\"menu_type\" value={val}/>,\n },\n {\n title: '路由路径',\n dataIndex: 'path',\n width: 180,\n render: renderEllipsis,\n },\n {\n title: '组件路径',\n dataIndex: 'component',\n width: 250,\n render: renderEllipsis,\n },\n {\n title: '权限标识',\n dataIndex: 'permission',\n width: 200,\n render: renderEllipsis,\n },\n {\n title: '排序',\n dataIndex: 'sort',\n width: 70,\n align: 'center',\n },\n createdAtColumn,\n {\n title: '状态',\n dataIndex: 'status',\n width: 80,\n fixed: 'right',\n render: (_val: string, row: Menu) => row.type === 'button' ? EMPTY_PLACEHOLDER : status.renderSwitch(row),\n },\n {\n title: '显示',\n dataIndex: 'visible',\n width: 80,\n align: 'center',\n fixed: 'right',\n render: (val: boolean, row: Menu) => row.type === 'button' ? EMPTY_PLACEHOLDER : <DictTag dictCode=\"menu_visible\" value={val ? 'show' : 'hidden'}/>,\n },\n operationColumn,\n ];\n const renderExpandButton = () => (<Button type=\"primary\" icon={isAllExpanded ? <ChevronsDownUp size={14}/> : <ChevronsUpDown size={14}/>} onClick={toggleExpandAll}>\n {isAllExpanded ? '全部折叠' : '全部展开'}\n </Button>);\n return (<div className=\"page-container\" style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n\n\n {menuTreeQuery.isError && (<Banner fullMode={false} type=\"danger\" bordered closeIcon={null} description=\"菜单数据加载失败,请检查网络后点击表格右上角刷新重试\" style={{ marginBottom: 12 }}/>)}\n\n <div style={{ flex: 1, minHeight: 0 }}>\n <ConfigurableTable searchConfig={buildTableSearch({\n keyword: (<KeywordInput placeholder=\"菜单名称\" {...bindKeyword('keyword')} width={200}/>),\n filters: (<StatusSelect items={statusItems} {...bind('status')}/>),\n onSearch: (handleSearch),\n onReset: (handleResetAndCollapse),\n create: (<CreateButton permission=\"system:menu:create\" onClick={() => openCreate()}/>),\n actions: (renderExpandButton()),\n filterTitle: \"菜单筛选\",\n actionTitle: \"菜单操作\"\n })} bordered columns={columns} dataSource={filteredData} rowKey=\"id\" loading={menuTreeQuery.isFetching} onRefresh={() => void menuTreeQuery.refetch()} refreshLoading={menuTreeQuery.isFetching} pagination={false} expandedRowKeys={expandedRowKeys} onExpandedRowsChange={onExpandedRowsChange} childrenRecordName=\"children\" virtualized/>\n </div>\n\n <EditFormModal modal={menuModal} width={680}>\n <Form.RadioGroup field=\"type\" label=\"菜单类型\" rules={[{ required: true }]} onChange={(e) => setMenuType((e.target as HTMLInputElement).value)} type=\"button\">\n {menuTypeItems.map((i) => (<Radio key={i.value} value={i.value}>{i.label}</Radio>))}\n </Form.RadioGroup>\n\n <Form.Slot label={{ text: '父级菜单' }}>\n <TreeSelect treeData={parentTreeData} value={parentId ?? 0} onChange={(val) => setParentId(val as number)} style={{ width: '100%' }} placeholder=\"请选择父级菜单\" filterTreeNode showFilteredOnly virtualize={{ height: 300, itemSize: 36 }}/>\n </Form.Slot>\n\n <Row gutter={16}>\n <Col span={12}>\n <Form.Input field=\"title\" label=\"菜单名称\" placeholder=\"请输入菜单名称\" rules={[{ required: true, message: '请输入菜单名称' }]}/>\n </Col>\n {menuType !== 'button' && (<Col span={12}>\n <Form.Slot label={{ text: '图标' }}>\n <IconPicker value={iconValue} onChange={setIconValue}/>\n </Form.Slot>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && (<Col span={12}>\n <Form.Input field=\"path\" label=\"路由路径\" placeholder=\"请输入路由路径\" rules={menuType === 'menu' ? [{ required: true, message: '请输入路由路径' }] : undefined}/>\n </Col>)}\n {menuType === 'menu' && !isExternalVal && (<Col span={12}>\n <Form.Input field=\"component\" label=\"组件路径\" placeholder=\"例如: users/UsersPage\" rules={[{ required: true, message: '请输入组件路径' }]}/>\n </Col>)}\n {menuType === 'menu' && !isExternalVal && (<Col span={12}>\n <Form.Input field=\"name\" label=\"组件名\" placeholder=\"前端组件Name\"/>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && (<Col span={12}>\n <Form.Input field=\"query\" label={<Tooltip content='访问路由的默认传递参数,如:{\"id\": 1, \"name\": \"ry\"}'>路由参数</Tooltip>} placeholder='如:{\"id\": 1, \"name\": \"ry\"}'/>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && (<Col span={12}>\n <Form.RadioGroup field=\"isExternal\" label={<Tooltip content=\"选择是外链则路由地址需要以 http(s):// 开头\">是否外链</Tooltip>} type=\"button\" onChange={(e) => setIsExternalVal((e.target as HTMLInputElement).value as unknown as boolean)}>\n <Radio value={true}>是</Radio>\n <Radio value={false}>否</Radio>\n </Form.RadioGroup>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && isExternalVal && (<Col span={12}>\n <Form.RadioGroup field=\"embed\" label={<Tooltip content=\"内嵌:在系统内以 iframe 打开外链,保留侧边栏与页签;新窗口:浏览器新标签页打开\">打开方式</Tooltip>} type=\"button\">\n <Radio value={false}>新窗口</Radio>\n <Radio value={true}>内嵌</Radio>\n </Form.RadioGroup>\n </Col>)}\n {menuType === 'menu' && (<Col span={12}>\n <Form.RadioGroup field=\"keepAlive\" label={<Tooltip content=\"开启后,多页签模式下切换页签保留该页面状态(搜索条件、滚动位置等),关闭页签时释放\">页面缓存</Tooltip>} type=\"button\">\n <Radio value={true}>开启</Radio>\n <Radio value={false}>关闭</Radio>\n </Form.RadioGroup>\n </Col>)}\n {menuType === 'button' && (<Col span={12}>\n <Form.Input field=\"permission\" label=\"权限标识\" placeholder=\"如:system:user:list\" rules={[{ required: true, message: '请输入权限标识' }]}/>\n </Col>)}\n <Col span={12}>\n <Form.InputNumber field=\"sort\" label=\"排序\" placeholder=\"请输入排序\" min={0} style={{ width: '100%' }}/>\n </Col>\n </Row>\n\n <Row gutter={16}>\n <Col span={12}>\n <FormStatusRadioGroup type=\"button\" rules={[{ required: true }]}/>\n </Col>\n {menuType !== 'button' && (<Col span={12}>\n <Form.RadioGroup field=\"visible\" label=\"显示状态\" type=\"button\" rules={[{ required: true }]}>\n {menuVisibleItems.map((i) => (<Radio key={i.value} value={i.value}>{i.label}</Radio>))}\n </Form.RadioGroup>\n </Col>)}\n </Row>\n </EditFormModal>\n </div>);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MenusPage-Bytd1HlW.js","mappings":"qrDAYA,SAAwBA,GAAW,CAAE,QAAO,WAAU,SAAoC,CACtF,GAAM,CAACC,EAAQC,GAAaC,EAAS,EAAE,EACjC,CAACC,EAASC,GAAcF,EAAS,EAAK,EACtC,CAACG,EAAaC,GAAkBJ,EAAS,CAAC,EAC1CK,EAAeC,EAAgB,EAC/BC,EAAgBC,MAAc,CAChC,IAAMC,EAAIX,EAAO,KAAK,CAAC,CAAC,YAAY,EAGpC,OAFKW,EAEEJ,EAAa,OAAQ,GAASK,EAAK,YAAY,CAAC,CAAC,SAASD,CAAC,CAAC,EADxDJ,CAEf,EAAG,CAACP,EAAQO,CAAY,CAAC,EACnBM,EAAYH,MAAcD,EAAc,OAAOJ,EAAc,GAAKS,EAAWT,EAAcS,CAAS,EAAG,CAACL,EAAeJ,CAAW,CAAC,EACnIU,EAAsB,GAAc,CACtCd,EAAUe,CAAC,EACXV,EAAe,CAAC,CACpB,EACMW,EAAuB,GAAe,CACxCb,EAAWY,CAAC,EACRA,IACAV,EAAe,CAAC,EAChBL,EAAU,EAAE,EAEpB,EACMiB,EAAgB,GAAiB,CACnCC,IAAWP,CAAI,EACfR,EAAW,EAAK,EAChBH,EAAU,EAAE,CAChB,EACMmB,EAAe,GAAwB,CACzC,EAAE,gBAAgB,EAClBD,IAAW,EAAE,CACjB,EACME,EAAgB,kBAAC,MAAD,CAAK,UAAU,oBAAf,UACpB,kBAACC,EAAD,CAAO,KAAK,QAAQ,OAAQ,kBAACC,EAAD,CAAQ,KAAM,EAAI,GAAG,YAAa,UAAUhB,EAAa,OAAO,MAAO,MAAOP,EAAQ,SAAUe,EAAoB,UAAU,qBAAqB,MAAO,CAAE,aAAc,CAAE,CAAG,GAC3M,kBAAC,MAAD,CAAK,UAAU,wBACb,2BAACS,EAAD,CAAM,KAAK,QAAQ,MAAO,GAAO,KAAM,CAAE,KAAM,EAAG,OAAQ,CAAE,EAAG,WAAYX,EAAW,aAAc,kBAAC,MAAD,CAAK,UAAU,2BAA2B,gBAAU,GAAG,WAAa,GAAU,kBAACW,EAAK,KAAN,CAAW,MAAO,CAAE,QAAS,CAAE,EAC3M,2BAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,mBAAmBC,IAAUb,EAAO,4BAA8B,KAAM,YAAeM,EAAaN,CAAI,EAAG,MAAOA,EAChJ,SAAAc,EAAiBd,EAAM,EAAE,CACpB,EACC,EAAI,EAChB,GACJH,EAAc,OAASK,GAAc,kBAAC,MAAD,CAAK,UAAU,yBACjD,2BAACa,EAAD,CAAY,KAAK,QAAQ,uBAAoB,MAAOlB,EAAc,OAAQ,SAAUK,EAAwB,cAAa,aAAe,GAASR,EAAesB,CAAI,EAAG,gBAAiB,EAAO,EAC5L,EACJ,C,GACL,MAAQ,kBAACC,EAAD,CAAS,QAASR,EAAuB,UAAS,gBAAiBJ,EAAqB,QAAQ,QAAQ,SAAS,aAAa,UAAW,GAC/I,2BAAC,MAAD,CAAK,UAAW,uBAAuBd,EAAU,4BAA8B,KAAa,QAA5F,UACE,kBAAC,OAAD,CAAM,UAAU,sBACb,SAAAsB,EAAQC,EAAiBD,EAAO,EAAE,EAAI,IACnC,GACN,kBAAC,OAAD,CAAM,UAAW,qBAAqBA,EAAQ,GAAK,mCAChD,SAAAA,GAAS,QACN,GACLA,EAAS,kBAAC,SAAD,CAAQ,KAAK,SAAS,UAAU,6CAA6C,QAASL,EAC5F,2BAACU,EAAD,CAAG,KAAM,EAAI,EACP,GAAM,kBAAC,OAAD,CAAM,UAAU,oBAC5B,2BAACC,EAAD,CAAa,KAAM,EAAI,EACnB,EACL,C,EACE,EACb,C,wDA7DM,EAAY,E,OCOlB,SAAgBC,GAAqB,CAAE,QAAQ,SAAU,QAAQ,KAAM,WAAU,OAAM,YAAW,SAA8C,CAC5I,GAAM,CAAE,SAAUC,EAAa,eAAe,EAC9C,MAAQ,kBAACC,EAAK,WAAN,CAAwB,QAAc,QAAiB,WAAgB,OAAiB,YAAkB,QAC/G,SAAAC,EAAM,IAAK,GAAU,kBAACD,EAAK,MAAN,CAA6B,MAAOE,EAAK,MAAQ,SAAAA,EAAK,KAAkB,EAAvDA,EAAK,KAAkD,CAAE,CACjF,EACrB,C,wCCtBA,SAAgBC,GAAuB,EAAiC,EAAkD,EAAoC,OAAO,KAAKC,CAAM,EAAS,CACrL,IAAMC,EAAOD,EAAO,MAAQE,GAAQ,MAAQ,OACtCC,EAAWH,EAAO,YAAcE,GAAQ,YAAc,GACtDE,EAAyC,CAC3C,KAAMH,IAAS,SAAU,QAASA,IAAS,SAC3C,KAAMA,IAAS,SAAU,MAAOA,IAAS,SAAU,WAAYA,IAAS,SACxE,UAAWA,IAAS,QAAU,CAACE,EAAU,KAAMF,IAAS,QAAU,CAACE,EACnE,WAAYF,IAAS,SAAU,UAAWA,IAAS,OACnD,MAAOA,IAAS,UAAY,EAAQE,CACxC,EACA,GAAIE,EAAe,KAAK,GAASD,EAAcE,KAAW,EAAK,EAAG,MAAU,MAAM,yBAAyB,CAC/G,CCqBA,SAAwBC,GAAY,CAChC,GAAM,CAAE,iBAAkBC,GAAc,EAClCC,EAAoBC,GAAe,CAAC,EACpC,CAACC,EAAUC,GAAehD,EAAwB,IAAI,EACtD,CAACiD,EAAWC,GAAgBlD,EAAS,EAAE,EACvC,CAACmD,EAAUC,GAAepD,EAAiB,MAAM,EACjD,CAACqD,EAAeC,GAAoBtD,EAAkB,EAAK,EAE3D,CAAE,OAAM,cAAa,kBAAiB,eAAc,eAAgBuD,GAA4B,CAClG,SAAUC,GACV,QAASC,GAAS,IACtB,CAAC,EACK,CAAE,MAAOC,IAAkB3B,EAAa,WAAW,EACnD,CAAE,MAAO4B,IAAgB5B,EAAa,eAAe,EACrD,CAAE,MAAO6B,GAAqB7B,EAAa,cAAc,EACzD8B,EAAgBC,GAAY,EAC5BC,EAAOvD,MAAcqD,EAAc,MAAQ,CAAC,EAAG,CAACA,EAAc,IAAI,CAAC,EACnEG,EAAeC,EAAY,EAC3BC,EAAYC,GAAwE,CACtF,WAAY,KACZ,KAAMC,GAAiBJ,EAAc,CAAE,OAAQK,EAAa,OAAO,MAAM,MAAM,KAAM,OAAQA,EAAa,OAAO,MAAM,MAAM,IAAK,CAAC,EACnI,UAAWC,GACX,cAAiB,CACb,KAAM,OACN,OAAQ,UACR,QAAS,OACT,KAAM,EACN,SAAUzB,EAAkB,QAC5B,WAAY,GACZ,MAAO,GACP,UAAW,EACf,GACA,SAAW,IAAU,CACjB,MAAO0B,EAAK,MAAO,KAAMA,EAAK,KAAM,KAAMA,EAAK,KAAM,KAAMA,EAAK,KAAM,UAAWA,EAAK,UACtF,WAAYA,EAAK,WAAY,MAAOA,EAAK,MAAO,KAAMA,EAAK,KAAM,SAAUA,EAAK,SAChF,KAAMA,EAAK,KAAM,OAAQA,EAAK,OAAQ,QAASA,EAAK,QAAU,OAAS,SACvE,WAAYA,EAAK,WAAY,MAAOA,EAAK,MAAO,UAAWA,EAAK,SACpE,GACA,YAAa,EAAQ,CAAE,aAAc,CACjC,IAAMC,EAAgB,GAAgB,OAAOpC,EAAOqC,IAAS,UAAYrC,EAAOqC,GAAOrC,EAAOqC,GAAO,OACrG,MAAO,CACH,MAAOrC,EAAO,MAAO,KAAMA,EAAO,KAAM,KAAMA,EAAO,KAAM,OAAQA,EAAO,OAC1E,SAAUW,GAAY,EAAG,KAAME,GAAa,OAC5C,KAAMuB,EAAa,MAAM,EAAG,KAAMA,EAAa,MAAM,EAAG,UAAWA,EAAa,WAAW,EAC3F,WAAYA,EAAa,YAAY,EAAG,MAAOA,EAAa,OAAO,EACnE,QAASpC,EAAO,UAAY,QAAmBA,EAAO,UAAY,OAClE,WAAYA,EAAO,WAAY,MAAOA,EAAO,WAAaA,EAAO,OAAS,GAAQ,GAAO,UAAWA,EAAO,UAC3G,GAAIsC,EAAU,CAAE,YAAa,CAAC,GAAG,CAAC,OAAQ,OAAQ,YAAa,aAAc,OAAO,CAAC,CAAC,OAAO,GAAO,CAACF,EAAaC,CAAG,CAAC,EAAG,GAAKxB,EAAuB,CAAC,EAAZ,CAAC,MAAM,CAAO,CAAE,EAAI,CAAC,CACnK,CACJ,CACJ,CAAC,EACK0B,EAAuBV,EAAY,EACnCW,EAAiBC,GAAc,EACrCC,GAAsC,CAAE,SAAU,QAAS,MAAO,KAAM,WAAY,cAAe,gBAAe,MAAOZ,EACrH,KAAMG,EAAa,KAAM,OAAQA,EAAa,OAAQ,OAAQA,EAAa,OAAO,MAAM,MAAM,KAAM,OAAQA,EAAa,OAAO,MAAM,MAAM,KAC5I,OAAQ,CAAC,KAAM,WAAY,QAAS,OAAQ,OAAQ,YAAa,aAAc,OAAQ,OAAQ,QAAS,OAAQ,SAAU,UAAW,aAAc,QAAS,WAAW,EACvK,YAAalC,GACb,QAAS,CAAE,GAAG4C,CAAgB,EAAG,OAAQ,GAAMH,EAAe,YAAY,CAAE,OAAQ,CAAE,IAAG,CAAE,CAAC,EAAG,cAAe,YAC9G,OAAQ,IAAW,CAAE,GAAGxC,EAAQ,GAAI,YAAaA,EAAS,CAAE,QAASA,EAAO,QAAU,OAAS,QAAS,EAAI,CAAC,CAAG,GAChH,aAAc,EAAQ,CAAE,YAAa,EAAM,CAAC4C,GAAU,aAAc5C,IAAQY,EAAYZ,EAAO,UAAsB,CAAC,GAAO,CAAC4C,GAAU,SAAU5C,IAAQc,EAAad,EAAO,MAAkB,EAAE,GAAO,CAAC4C,GAAU,SAAU5C,IAAQgB,EAAYhB,EAAO,MAAkB,MAAM,GAAO,CAAC4C,GAAU,eAAgB5C,IAAQkB,EAAiB,EAAQlB,EAAO,UAAW,CAAG,CAAE,CAAC,EAChX6C,MAAgB,CACZ,IAAMC,EAAShB,EAAU,QACpBgB,GAAWhB,EAAU,UAE1BlB,EAAYkC,EAAO,UAAY,CAAC,EAChChC,EAAagC,EAAO,MAAQ,EAAE,EAC9B9B,EAAY8B,EAAO,IAAI,EACvB5B,EAAiB4B,EAAO,YAAc,EAAK,EAC/C,EAAG,CAAChB,EAAU,QAASA,EAAU,OAAO,CAAC,EAEzC,IAAMiB,EAAaC,IAAa,EAAe,EAAY,IAChDnD,EAAM,QAAgB,EAAK,IAAS,CACvC,IAAMoD,EAAmBnD,EAAK,UAAU,OAASiD,EAAWjD,EAAK,SAAUoD,EAAIC,CAAE,EAAI,CAAC,EAChFC,EAAa,CAACF,GAAMG,GAAYvD,EAAK,MAAOoD,CAAE,EAC9CI,EAAc,CAACH,GAAMrD,EAAK,SAAWqD,EACvCI,EAAyB,CAAC,EAU9B,OATIN,EAAiB,OAAS,EAC1B,EAAiBA,EAEZnD,EAAK,UAAU,SACpB,EAAiB,CAAC,IAEjBsD,GAAcE,GAAgBL,EAAiB,OAAS,IACzDO,EAAI,KAAK,CAAE,GAAG1D,EAAM,SAAUyD,CAAe,CAAC,EAE3CC,CACX,EAAG,CAAC,CAAC,EACN,CAAC,CAAC,EACC,CAAE,UAAS,OAAQC,EAAe,IAAOd,EAEzCe,EAAcC,GAAe,EAC7BC,EAAexF,MAAeyF,GAAWJ,EAAeV,EAAWpB,EAAMkC,EAASJ,CAAY,EAAI9B,EAExG,CAACA,EAAMkC,EAASJ,EAAcV,EAAYW,CAAW,CAAC,EAGhD,CAAE,kBAAiB,qBAAoB,aAAY,iBAAe,mBAAiB,yBAA0BI,GAAiBF,CAAY,EAEhJf,MAAgB,EACRgB,GAAWJ,IACXM,EAAmBC,CAAU,CAErC,EAAG,CAACH,EAASJ,EAAcO,EAAYD,CAAkB,CAAC,EAE1D,IAAME,OAA+B,CACjCC,EAAY,EACZH,EAAmB,CAAC,CAAC,CACzB,EAGA,SAASI,GAAoB,EAA+B,CACxD,OAAOtE,EACF,OAAQ,GAAMuE,EAAE,OAAS,QAAQ,CAAC,CAClC,IAAK,IAAO,CACb,MAAOA,EAAE,MACT,MAAOA,EAAE,GACT,IAAK,OAAOA,EAAE,EAAE,EAChB,SAAUA,EAAE,UAAU,OAASD,GAAoBC,EAAE,QAAQ,EAAI,MACrE,EAAE,CACN,CACA,IAAMC,GAAiC,CACnC,CAAE,MAAO,KAAM,MAAO,EAAG,IAAK,GAAI,EAClC,GAAGF,GAAoBxC,CAAI,CAC/B,EACM2C,EAAc,GAAiB,CACjC,IAAMC,EAAeC,GAAO,EAC5B,EAAkB,QAAUD,EAC5B3D,EAAY2D,CAAY,EACxBzD,EAAa,EAAE,EACfE,EAAY,MAAM,EAClBE,EAAiB,EAAK,EACtBY,EAAU,WAAW,CACzB,EACM2C,GAAY,GAAe,CAC7B7D,EAAYuB,EAAK,UAAY,CAAC,EAC9BrB,EAAaqB,EAAK,MAAQ,EAAE,EAC5BnB,EAAYmB,EAAK,IAAI,EACrBjB,EAAiBiB,EAAK,YAAc,EAAK,EACzCL,EAAU,SAASK,CAAI,CAC3B,EACMuC,GAASC,GAAsB,CACjC,QAAS,EAAM,IAAYpC,EAAqB,YAAY,CAAE,GAAIJ,EAAK,GAAI,OAAQ,CAAE,OAAQyC,EAAU,UAAY,UAAW,CAAE,CAAC,EACjI,eAAiB,IAAU,CAAE,OAAQ,GAAM,MAAO,UAAUzC,EAAK,MAAM,IAAK,QAAS,eAAgB,OAAQ,MAAO,GACpH,SAAU,CAAC0C,EAAc,oBAAoB,CACjD,CAAC,EACKC,GAAkBC,GAA6B,CACjD,WAAY,cACZ,KAAMN,GACN,OAAS,GAAQjC,EAAe,YAAY,CAAE,OAAQ,CAAE,GAAIwC,EAAI,EAAG,CAAE,CAAC,EACtE,MAAO,WACP,QAAS,YACT,MAAQ,GAAQ,CACZ,CACI,IAAK,QACL,MAAO,KACP,OAAQA,EAAI,OAAS,UAAY,CAACH,EAAc,oBAAoB,EACpE,YAAeP,EAAWU,EAAI,EAAE,CACpC,CACJ,EACA,MAAO,IACP,kBAAmB,CAAC,QAAS,OAAQ,QAAQ,CACjD,CAAC,EACKC,GAA+B,CACjC,CACI,MAAO,OACP,UAAW,QACX,SAAU,IACV,cAAe,GACf,QAAS,EAAK,EAAK,EAAQ,IAAY,CACnC,IAAMC,EAAaC,GAAS,WACtBC,EAAaD,GAAS,WAC5B,MAAQ,kBAAC,OAAD,CAAM,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,SAAU,CAAE,EAAlE,UACXC,EACAF,EACAF,EAAI,MAAS,kBAAC,OAAD,CAAM,MAAO,CAAE,YAAa,EAAG,WAAY,EAAG,QAAS,OAAQ,WAAY,SAAU,MAAO,+BAAgC,WAAY,CAAE,EACnJ,SAAA5F,EAAiB4F,EAAI,KAAM,EAAE,CAC1B,GACR,kBAAC,OAAD,CAAM,MAAO,CAAE,SAAU,SAAU,aAAc,WAAY,WAAY,QAAS,EAAG,MAAO,OAAOK,CAAG,EAAI,SAAAA,CAAU,EAChH,C,EACJ,CACJ,EACA,CACI,MAAO,KACP,UAAW,OACX,MAAO,GACP,OAAS,GAAgB,kBAACC,EAAD,CAAS,SAAS,YAAY,MAAOD,CAAK,EACvE,EACA,CACI,MAAO,OACP,UAAW,OACX,MAAO,IACP,OAAQE,CACZ,EACA,CACI,MAAO,OACP,UAAW,YACX,MAAO,IACP,OAAQA,CACZ,EACA,CACI,MAAO,OACP,UAAW,aACX,MAAO,IACP,OAAQA,CACZ,EACA,CACI,MAAO,KACP,UAAW,OACX,MAAO,GACP,MAAO,QACX,EACAC,GACA,CACI,MAAO,KACP,UAAW,SACX,MAAO,GACP,MAAO,QACP,QAAS,EAAc,IAAcR,EAAI,OAAS,SAAWS,GAAoBf,GAAO,aAAaM,CAAG,CAC5G,EACA,CACI,MAAO,KACP,UAAW,UACX,MAAO,GACP,MAAO,SACP,MAAO,QACP,QAAS,EAAc,IAAcA,EAAI,OAAS,SAAWS,GAAoB,kBAACH,EAAD,CAAS,SAAS,eAAe,MAAOD,EAAM,OAAS,QAAU,EACtJ,EACAP,EACJ,EACMY,OAA4B,kBAACC,EAAD,CAAQ,KAAK,UAAU,KAAsBC,EAAhBC,GAAiBC,GAA8BC,GAA/B,CAAgB,KAAM,EAAI,CAA8B,EAAG,QAASC,GAChJ,SAAAH,GAAgB,OAAS,MACpB,GACR,MAAQ,kBAAC,MAAD,CAAK,UAAU,iBAAiB,MAAO,CAAE,OAAQ,OAAQ,QAAS,OAAQ,cAAe,QAAS,EAAlG,UAGLpE,EAAc,SAAY,kBAACwE,EAAD,CAAQ,SAAU,GAAO,KAAK,SAAS,YAAS,UAAW,KAAM,YAAY,6BAA6B,MAAO,CAAE,aAAc,EAAG,CAAG,GAElK,kBAAC,MAAD,CAAK,MAAO,CAAE,KAAM,EAAG,UAAW,CAAE,EAClC,2BAACC,GAAD,CAAmB,aAAcC,EAAiB,CAC9C,QAAU,kBAACC,EAAD,CAAc,YAAY,OAAO,GAAIC,EAAY,SAAS,EAAG,MAAO,GAAK,GACnF,QAAU,kBAACC,EAAD,CAAc,MAAO/E,GAAa,GAAIgF,EAAK,QAAQ,CAAG,GAChE,SAAWC,EACX,QAAUvC,GACV,OAAS,kBAACwC,EAAD,CAAc,WAAW,qBAAqB,YAAenC,EAAW,CAAG,GACpF,QAAUoB,GAAmB,EAC7B,YAAa,OACb,YAAa,MACjB,CAAC,EAAG,YAAkB,WAAS,WAAY9B,EAAc,OAAO,KAAK,QAASnC,EAAc,WAAY,cAAiB,KAAKA,EAAc,QAAQ,EAAG,eAAgBA,EAAc,WAAY,WAAY,GAAwB,kBAAuC,wBAAsB,mBAAmB,WAAW,cAAY,EACzU,GAEL,kBAACiF,GAAD,CAAe,MAAO5E,EAAW,MAAO,IAAxC,UACE,kBAAClC,EAAK,WAAN,CAAiB,MAAM,OAAO,MAAM,OAAO,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EAAG,SAAW,GAAMoB,EAAa,EAAE,OAA4B,KAAK,EAAG,KAAK,SAC9I,SAAAM,GAAc,IAAK,GAAO,kBAACqF,EAAD,CAAqB,MAAOC,EAAE,MAAQ,SAAAA,EAAE,KAAa,EAAzCA,EAAE,KAAuC,CAAE,CACnE,GAEjB,kBAAChH,EAAK,KAAN,CAAW,MAAO,CAAE,KAAM,MAAO,EAC/B,2BAACiH,EAAD,CAAY,SAAUxC,GAAgB,MAAO1D,GAAY,EAAG,SAAW,GAAQC,EAAYyE,CAAa,EAAG,MAAO,CAAE,MAAO,MAAO,EAAG,YAAY,UAAU,kBAAe,oBAAiB,WAAY,CAAE,OAAQ,IAAK,SAAU,EAAG,CAAG,EAC7N,GAEX,kBAACyB,EAAD,CAAK,OAAQ,GAAb,UACE,kBAACC,EAAD,CAAK,KAAM,GACT,2BAACnH,EAAK,MAAN,CAAY,MAAM,QAAQ,MAAM,OAAO,YAAY,UAAU,MAAO,CAAC,CAAE,SAAU,GAAM,QAAS,SAAU,CAAC,CAAG,EAC3G,GACJmB,IAAa,UAAa,kBAACgG,EAAD,CAAK,KAAM,GAClC,2BAACnH,EAAK,KAAN,CAAW,MAAO,CAAE,KAAM,IAAK,EAC7B,2BAACnC,GAAD,CAAY,MAAOoD,EAAW,SAAUC,CAAc,EAC7C,EACR,IACLC,IAAa,QAAUA,IAAa,cAAiB,kBAACgG,EAAD,CAAK,KAAM,GAC9D,2BAACnH,EAAK,MAAN,CAAY,MAAM,OAAO,MAAM,OAAO,YAAY,UAAU,MAAOmB,IAAa,OAAS,CAAC,CAAE,SAAU,GAAM,QAAS,SAAU,CAAC,EAAI,MAAW,EAC5I,GACNA,IAAa,QAAU,CAACE,GAAkB,kBAAC8F,EAAD,CAAK,KAAM,GAClD,2BAACnH,EAAK,MAAN,CAAY,MAAM,YAAY,MAAM,OAAO,YAAY,sBAAsB,MAAO,CAAC,CAAE,SAAU,GAAM,QAAS,SAAU,CAAC,CAAG,EAC3H,GACNmB,IAAa,QAAU,CAACE,GAAkB,kBAAC8F,EAAD,CAAK,KAAM,GAClD,2BAACnH,EAAK,MAAN,CAAY,MAAM,OAAO,MAAM,MAAM,YAAY,UAAW,EACzD,IACLmB,IAAa,QAAUA,IAAa,cAAiB,kBAACgG,EAAD,CAAK,KAAM,GAC9D,2BAACnH,EAAK,MAAN,CAAY,MAAM,QAAQ,MAAO,kBAACoH,EAAD,CAAS,QAAQ,wCAAwC,eAAa,GAAG,YAAY,2BAA4B,EAC/I,IACLjG,IAAa,QAAUA,IAAa,cAAiB,kBAACgG,EAAD,CAAK,KAAM,GAC9D,2BAACnH,EAAK,WAAN,CAAiB,MAAM,aAAa,MAAO,kBAACoH,EAAD,CAAS,QAAQ,8BAA8B,eAAa,GAAG,KAAK,SAAS,SAAW,GAAM9F,EAAkB,EAAE,OAA4B,KAA2B,EAApN,UACE,kBAACyF,EAAD,CAAO,MAAO,GAAM,YAAQ,GAC5B,kBAACA,EAAD,CAAO,MAAO,GAAO,YAAQ,EACd,C,EACd,IACL5F,IAAa,QAAUA,IAAa,cAAgBE,GAAkB,kBAAC8F,EAAD,CAAK,KAAM,GAC/E,2BAACnH,EAAK,WAAN,CAAiB,MAAM,QAAQ,MAAO,kBAACoH,EAAD,CAAS,QAAQ,8CAA8C,eAAa,GAAG,KAAK,SAA1H,UACE,kBAACL,EAAD,CAAO,MAAO,GAAO,cAAU,GAC/B,kBAACA,EAAD,CAAO,MAAO,GAAM,aAAS,EACd,C,EACd,GACN5F,IAAa,QAAW,kBAACgG,EAAD,CAAK,KAAM,GAChC,2BAACnH,EAAK,WAAN,CAAiB,MAAM,YAAY,MAAO,kBAACoH,EAAD,CAAS,QAAQ,4CAA4C,eAAa,GAAG,KAAK,SAA5H,UACE,kBAACL,EAAD,CAAO,MAAO,GAAM,aAAS,GAC7B,kBAACA,EAAD,CAAO,MAAO,GAAO,aAAS,EACf,C,EACd,GACN5F,IAAa,UAAa,kBAACgG,EAAD,CAAK,KAAM,GAClC,2BAACnH,EAAK,MAAN,CAAY,MAAM,aAAa,MAAM,OAAO,YAAY,qBAAqB,MAAO,CAAC,CAAE,SAAU,GAAM,QAAS,SAAU,CAAC,CAAG,EAC3H,GACP,kBAACmH,EAAD,CAAK,KAAM,GACT,2BAACnH,EAAK,YAAN,CAAkB,MAAM,OAAO,MAAM,KAAK,YAAY,QAAQ,IAAK,EAAG,MAAO,CAAE,MAAO,MAAO,CAAG,EAC7F,EACF,C,GAEL,kBAACkH,EAAD,CAAK,OAAQ,GAAb,UACE,kBAACC,EAAD,CAAK,KAAM,GACT,2BAACrH,GAAD,CAAsB,KAAK,SAAS,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,CAAG,EAC9D,GACJqB,IAAa,UAAa,kBAACgG,EAAD,CAAK,KAAM,GAClC,2BAACnH,EAAK,WAAN,CAAiB,MAAM,UAAU,MAAM,OAAO,KAAK,SAAS,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EACnF,SAAA4B,EAAiB,IAAK,GAAO,kBAACmF,EAAD,CAAqB,MAAOC,EAAE,MAAQ,SAAAA,EAAE,KAAa,EAAzCA,EAAE,KAAuC,CAAE,CACtE,EACd,EACJ,C,EACQ,C,EACZ,C,EACT,C,2GA/TM,GAAoC,CAAE,QAAS,GAAI,OAAQ,MAAU,C","names":["IconPicker","search","setSearch","useState","visible","setVisible","currentPage","setCurrentPage","allIconNames","useAllIconNames","filteredNames","useMemo","q","name","pageNames","PAGE_SIZE","handleSearchChange","v","handleVisibleChange","handleSelect","onChange","handleClear","panelContent","Input","Search","List","value","renderLucideIcon","Pagination","page","Popover","X","ChevronDown","FormStatusRadioGroup","useDictItems","Form","items","item","assertWebMcpMenuValues","values","type","record","external","visibleFields","suppliedFields","field","MenusPage","usePermission","createParentIdRef","useRef","parentId","setParentId","iconValue","setIconValue","menuType","setMenuType","isExternalVal","setIsExternalVal","useListSearch","defaultSearchParams","menuKeys","menuTypeItems","statusItems","menuVisibleItems","menuTreeQuery","useMenuTree","data","saveMutation","useSaveMenu","menuModal","useEditModal","formSaveMutation","menuContract","useMenuDetail","menu","optionalText","key","editing","toggleStatusMutation","deleteMutation","useDeleteMenu","useStandardWebMcpCrudAdapter","submittedParams","isEdit","useEffect","detail","filterTree","useCallback","filteredChildren","kw","st","titleMatch","textMatches","statusMatch","mergedChildren","acc","statusFilter","pinyinReady","usePinyinReady","filteredData","keyword","useTreeExpansion","setExpandedRowKeys","allRowKeys","handleResetAndCollapse","handleReset","buildTreeSelectData","m","parentTreeData","openCreate","nextParentId","pid","openEdit","status","useStatusToggle","enabled","hasPermission","operationColumn","useCrudOperationColumn","row","columns","expandIcon","options","indentText","val","DictTag","renderEllipsis","createdAtColumn","EMPTY_PLACEHOLDER","renderExpandButton","Button","jsx","isAllExpanded","ChevronsDownUp","ChevronsUpDown","toggleExpandAll","Banner","ConfigurableTable","buildTableSearch","KeywordInput","bindKeyword","StatusSelect","bind","handleSearch","CreateButton","EditFormModal","Radio","i","TreeSelect","Row","Col","Tooltip"],"ignoreList":[],"sources":["../../src/components/IconPicker.tsx","../../src/components/FormStatusRadioGroup.tsx","../../src/pages/system/menus/webmcp-values.ts","../../src/pages/system/menus/MenusPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { Popover, Input, List, Pagination } from \"@/ui\";\nimport { Search, ChevronDown, X } from 'lucide-react';\nimport { useAllIconNames, renderLucideIcon } from \"@/utils/icons\";\nimport \"@/components/IconPicker.css\";\ninterface IconPickerProps {\n value?: string;\n onChange?: (icon: string) => void;\n style?: React.CSSProperties;\n}\n/** 每页显示图标数(8 列 × 7 行) */\nconst PAGE_SIZE = 56;\nexport default function IconPicker({ value, onChange, style }: Readonly<IconPickerProps>) {\n const [search, setSearch] = useState('');\n const [visible, setVisible] = useState(false);\n const [currentPage, setCurrentPage] = useState(1);\n const allIconNames = useAllIconNames();\n const filteredNames = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q)\n return allIconNames;\n return allIconNames.filter((name) => name.toLowerCase().includes(q));\n }, [search, allIconNames]);\n const pageNames = useMemo(() => filteredNames.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE), [filteredNames, currentPage]);\n const handleSearchChange = (v: string) => {\n setSearch(v);\n setCurrentPage(1);\n };\n const handleVisibleChange = (v: boolean) => {\n setVisible(v);\n if (v) {\n setCurrentPage(1);\n setSearch('');\n }\n };\n const handleSelect = (name: string) => {\n onChange?.(name);\n setVisible(false);\n setSearch('');\n };\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange?.('');\n };\n const panelContent = (<div className=\"icon-picker-panel\">\n <Input size=\"small\" prefix={<Search size={13}/>} placeholder={`搜索图标(共 ${allIconNames.length} 个)…`} value={search} onChange={handleSearchChange} className=\"icon-picker-search\" style={{ marginBottom: 8 }}/>\n <div className=\"icon-picker-grid-wrap\">\n <List size=\"small\" split={false} grid={{ span: 3, gutter: 4 }} dataSource={pageNames} emptyContent={<div className=\"icon-picker-empty-result\">无匹配图标</div>} renderItem={(name) => (<List.Item style={{ padding: 0 }}>\n <button type=\"button\" className={`icon-picker-cell${value === name ? ' icon-picker-cell--active' : ''}`} onClick={() => handleSelect(name)} title={name}>\n {renderLucideIcon(name, 18)}\n </button>\n </List.Item>)}/>\n </div>\n {filteredNames.length > PAGE_SIZE && (<div className=\"icon-picker-pagination\">\n <Pagination size=\"small\" hoverShowPageSelect total={filteredNames.length} pageSize={PAGE_SIZE} currentPage={currentPage} onPageChange={(page) => setCurrentPage(page)} showSizeChanger={false}/>\n </div>)}\n </div>);\n return (<Popover content={panelContent} visible={visible} onVisibleChange={handleVisibleChange} trigger=\"click\" position=\"bottomLeft\" showArrow={false}>\n <div className={`icon-picker-trigger ${visible ? 'icon-picker-trigger--open' : ''}`} style={style}>\n <span className=\"icon-picker-preview\">\n {value ? renderLucideIcon(value, 16) : null}\n </span>\n <span className={`icon-picker-label ${value ? '' : 'icon-picker-label--placeholder'}`}>\n {value || '点击选择图标'}\n </span>\n {value ? (<button type=\"button\" className=\"icon-picker-arrow icon-picker-arrow--clear\" onClick={handleClear}>\n <X size={13}/>\n </button>) : (<span className=\"icon-picker-arrow\">\n <ChevronDown size={13}/>\n </span>)}\n </div>\n </Popover>);\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { Form } from \"@/ui\";\nimport { useDictItems } from \"@fudanda/react-core/hooks/useDictItems\";\ninterface FormStatusRadioGroupProps {\n field?: string;\n label?: string;\n disabled?: boolean;\n /** Semi RadioGroup 外观(默认圆点,`button` 为按钮组) */\n type?: 'default' | 'button' | 'card' | 'pureCard';\n /** 字段下方的说明文字 */\n extraText?: ReactNode;\n /** 透传给 Form.RadioGroup 的校验规则 */\n rules?: ComponentProps<typeof Form.RadioGroup>['rules'];\n}\n/**\n * 通用启用 / 禁用单选组:选项与文案来自字典 `common_status`,\n * 与筛选栏 `StatusSelect`、状态标签同源;页面内禁止再写「启用 / 停用」字面量选项。\n */\nexport function FormStatusRadioGroup({ field = 'status', label = '状态', disabled, type, extraText, rules }: Readonly<FormStatusRadioGroupProps>) {\n const { items } = useDictItems('common_status');\n return (<Form.RadioGroup field={field} label={label} disabled={disabled} type={type} extraText={extraText} rules={rules}>\n {items.map((item) => (<Form.Radio key={item.value} value={item.value}>{item.label}</Form.Radio>))}\n </Form.RadioGroup>);\n}\nexport default FormStatusRadioGroup;\n","/** Reject fields hidden by the ordinary menu editor instead of ignoring them. */\nexport function assertWebMcpMenuValues(values: Record<string, unknown>, record?: { type?: string; isExternal?: boolean }, suppliedFields: readonly string[] = Object.keys(values)): void {\n const type = values.type ?? record?.type ?? 'menu';\n const external = values.isExternal ?? record?.isExternal ?? false;\n const visibleFields: Record<string, boolean> = {\n icon: type !== 'button', visible: type !== 'button',\n path: type !== 'button', query: type !== 'button', isExternal: type !== 'button',\n component: type === 'menu' && !external, name: type === 'menu' && !external,\n permission: type === 'button', keepAlive: type === 'menu',\n embed: type !== 'button' && Boolean(external),\n };\n if (suppliedFields.some(field => visibleFields[field] === false)) throw new Error('输入包含当前菜单类型或外链模式下不可编辑的字段');\n}\n","import type { ApiMenu } from '@fudanda/shared/api/menus';\nimport { menuContract } from '@fudanda/react-core/lib/native-operations';\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { Button, Form, Radio, TreeSelect, Row, Col, Tooltip, Banner } from \"@/ui\";\nimport type { TreeNodeData } from \"@/ui\";\nimport { ChevronsDownUp, ChevronsUpDown } from 'lucide-react';\nimport type { Menu } from '@fudanda/shared/identity';\nimport ConfigurableTable from \"@/components/ConfigurableTable\";\nimport { renderLucideIcon } from \"@/utils/icons\";\nimport IconPicker from \"@/components/IconPicker\";\nimport { usePermission } from \"@fudanda/react-core/hooks/usePermission\";\nimport { useEditModal, formSaveMutation } from \"@/hooks/useEditModal\";\nimport { useListSearch } from \"@fudanda/react-core/hooks/useListSearch\";\nimport { usePinyinReady } from \"@fudanda/react-core/hooks/usePinyinReady\";\nimport { textMatches } from \"@fudanda/react-core/utils/pinyin\";\nimport { useTreeExpansion } from \"@fudanda/react-core/hooks/useTreeExpansion\";\nimport DictTag from \"@/components/DictTag\";\nimport { FormStatusRadioGroup } from \"@/components/FormStatusRadioGroup\";\nimport { useDictItems } from \"@fudanda/react-core/hooks/useDictItems\";\nimport type { ColumnProps } from \"@/ui\";\nimport { createdAtColumn, EMPTY_PLACEHOLDER, renderEllipsis } from \"@/utils/table-columns\";\nimport { menuKeys, useDeleteMenu, useMenuDetail, useMenuTree, useSaveMenu } from \"@fudanda/react-core/hooks/queries/menus\";\nimport { CreateButton } from \"@/components/toolbar-controls\";\nimport { KeywordInput, StatusSelect } from \"@/components/search-filters\";\nimport { buildTableSearch, useStatusToggle, useCrudOperationColumn } from \"@/components/list-page/index\";\nimport { EditFormModal } from \"@/components/EditFormModal\";\nimport { useStandardWebMcpCrudAdapter } from '@/webmcp-crud';\nimport { assertWebMcpMenuValues } from './webmcp-values';\ninterface SearchParams {\n keyword: string;\n status?: string;\n}\nconst defaultSearchParams: SearchParams = { keyword: '', status: undefined };\nexport default function MenusPage() {\n const { hasPermission } = usePermission();\n const createParentIdRef = useRef<number>(0);\n const [parentId, setParentId] = useState<number | null>(null);\n const [iconValue, setIconValue] = useState('');\n const [menuType, setMenuType] = useState<string>('menu');\n const [isExternalVal, setIsExternalVal] = useState<boolean>(false);\n // 树形列表不分页:只取草稿 / 已提交双状态与「查询 / 重置必回源」,submitted 进客户端过滤谓词\n const { bind, bindKeyword, submittedParams, handleSearch, handleReset } = useListSearch<SearchParams>({\n defaults: defaultSearchParams,\n listKey: menuKeys.tree,\n });\n const { items: menuTypeItems } = useDictItems('menu_type');\n const { items: statusItems } = useDictItems('common_status');\n const { items: menuVisibleItems } = useDictItems('menu_visible');\n const menuTreeQuery = useMenuTree();\n const data = useMemo(() => menuTreeQuery.data ?? [], [menuTreeQuery.data]);\n const saveMutation = useSaveMenu();\n const menuModal = useEditModal<ApiMenu, Record<string, unknown>, Record<string, unknown>>({\n entityName: '菜单',\n save: formSaveMutation(saveMutation, { create: menuContract.create.input.shape.body, update: menuContract.update.input.shape.body }),\n useDetail: useMenuDetail,\n defaults: () => ({\n type: 'menu',\n status: 'enabled',\n visible: 'show',\n sort: 0,\n parentId: createParentIdRef.current,\n isExternal: false,\n embed: false,\n keepAlive: false,\n }),\n toValues: (menu) => ({\n title: menu.title, type: menu.type, name: menu.name, path: menu.path, component: menu.component,\n permission: menu.permission, query: menu.query, icon: menu.icon, parentId: menu.parentId,\n sort: menu.sort, status: menu.status, visible: menu.visible ? 'show' : 'hidden',\n isExternal: menu.isExternal, embed: menu.embed, keepAlive: menu.keepAlive,\n }),\n beforeSave: (values, { editing }) => {\n const optionalText = (key: string) => typeof values[key] === 'string' && values[key] ? values[key] : undefined;\n return {\n title: values.title, type: values.type, sort: values.sort, status: values.status,\n parentId: parentId ?? 0, icon: iconValue || undefined,\n name: optionalText('name'), path: optionalText('path'), component: optionalText('component'),\n permission: optionalText('permission'), query: optionalText('query'),\n visible: values.visible === undefined ? true : values.visible === 'show',\n isExternal: values.isExternal, embed: values.isExternal ? values.embed ?? false : false, keepAlive: values.keepAlive,\n ...(editing ? { clearFields: [...['name', 'path', 'component', 'permission', 'query'].filter(key => !optionalText(key)), ...(!iconValue ? ['icon'] : [])] } : {}),\n };\n },\n });\n const toggleStatusMutation = useSaveMenu();\n const deleteMutation = useDeleteMenu();\n useStandardWebMcpCrudAdapter<ApiMenu>({ resource: 'menus', title: '菜单', permission: 'system:menu', hasPermission, modal: menuModal,\n list: menuContract.tree, detail: menuContract.detail, create: menuContract.create.input.shape.body, update: menuContract.update.input.shape.body,\n fields: ['id', 'parentId', 'title', 'name', 'path', 'component', 'permission', 'type', 'icon', 'query', 'sort', 'status', 'visible', 'isExternal', 'embed', 'keepAlive'],\n guardValues: assertWebMcpMenuValues,\n filters: { ...submittedParams }, remove: id => deleteMutation.mutateAsync({ params: { id } }), deleteContent: '子菜单也将一并删除',\n toForm: values => ({ ...values, ...('visible' in values ? { visible: values.visible ? 'show' : 'hidden' } : {}) }),\n applyValues: (values, { isEdit }) => { if (!isEdit || 'parentId' in values) setParentId(values.parentId as number ?? 0); if (!isEdit || 'icon' in values) setIconValue(values.icon as string ?? ''); if (!isEdit || 'type' in values) setMenuType(values.type as string ?? 'menu'); if (!isEdit || 'isExternal' in values) setIsExternalVal(Boolean(values.isExternal)); } });\n useEffect(() => {\n const detail = menuModal.editing;\n if (!detail || !menuModal.visible)\n return;\n setParentId(detail.parentId ?? 0);\n setIconValue(detail.icon ?? '');\n setMenuType(detail.type);\n setIsExternalVal(detail.isExternal ?? false);\n }, [menuModal.editing, menuModal.visible]);\n // 递归过滤树节点(标题子串 + 拼音首字母 / 全拼)\n const filterTree = useCallback((items: Menu[], kw: string, st: string): Menu[] => {\n return items.reduce<Menu[]>((acc, item) => {\n const filteredChildren = item.children?.length ? filterTree(item.children, kw, st) : [];\n const titleMatch = !kw || textMatches(item.title, kw);\n const statusMatch = !st || item.status === st;\n let mergedChildren: Menu[] = [];\n if (filteredChildren.length > 0) {\n mergedChildren = filteredChildren;\n }\n else if (item.children?.length) {\n mergedChildren = [];\n }\n if ((titleMatch && statusMatch) || filteredChildren.length > 0) {\n acc.push({ ...item, children: mergedChildren });\n }\n return acc;\n }, []);\n }, []);\n const { keyword, status: statusFilter = '' } = submittedParams;\n // 拼音词典就绪后重算过滤,补上已提交关键字的拼音命中\n const pinyinReady = usePinyinReady();\n const filteredData = useMemo(() => (keyword || statusFilter ? filterTree(data, keyword, statusFilter) : data),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data, keyword, statusFilter, filterTree, pinyinReady]);\n // 展开态跟随**表格实际渲染的** filteredData:跟未筛选的全量树比较会让筛选后\n // 已全部展开的表格仍显示「全部展开」,点击后可见区域毫无变化\n const { expandedRowKeys, setExpandedRowKeys, allRowKeys, isAllExpanded, toggleExpandAll, onExpandedRowsChange, } = useTreeExpansion(filteredData);\n // 有过滤条件时,数据变化后自动展开匹配节点\n useEffect(() => {\n if (keyword || statusFilter) {\n setExpandedRowKeys(allRowKeys);\n }\n }, [keyword, statusFilter, allRowKeys, setExpandedRowKeys]);\n // 重置除清条件外还要收起全部节点;useTreeExpansion 依赖 filteredData,声明在 useListSearch 之后,故在此组合\n const handleResetAndCollapse = () => {\n handleReset();\n setExpandedRowKeys([]);\n };\n // Semi Table 原生支持 children 字段树形展示,无需手动 flatten\n // 递归构建 TreeSelect 数据(过滤掉按钮类型)\n function buildTreeSelectData(items: Menu[]): TreeNodeData[] {\n return items\n .filter((m) => m.type !== 'button')\n .map((m) => ({\n label: m.title,\n value: m.id,\n key: String(m.id),\n children: m.children?.length ? buildTreeSelectData(m.children) : undefined,\n }));\n }\n const parentTreeData: TreeNodeData[] = [\n { label: '顶级', value: 0, key: '0' },\n ...buildTreeSelectData(data),\n ];\n const openCreate = (pid?: number) => {\n const nextParentId = pid ?? 0;\n createParentIdRef.current = nextParentId;\n setParentId(nextParentId);\n setIconValue('');\n setMenuType('menu');\n setIsExternalVal(false);\n menuModal.openCreate();\n };\n const openEdit = (menu: Menu) => {\n setParentId(menu.parentId ?? 0);\n setIconValue(menu.icon ?? '');\n setMenuType(menu.type);\n setIsExternalVal(menu.isExternal ?? false);\n menuModal.openEdit(menu);\n };\n const status = useStatusToggle<Menu>({\n toggle: (menu, enabled) => toggleStatusMutation.mutateAsync({ id: menu.id, values: { status: enabled ? 'enabled' : 'disabled' } }),\n confirmDisable: (menu) => ({ danger: true, title: `确认禁用菜单「${menu.title}」?`, content: '禁用后该菜单将不可访问。', okText: '确认禁用' }),\n disabled: !hasPermission('system:menu:update'),\n });\n const operationColumn = useCrudOperationColumn<Menu>({\n permission: 'system:menu',\n edit: openEdit,\n remove: (row) => deleteMutation.mutateAsync({ params: { id: row.id } }),\n title: '确认删除此菜单?',\n content: '子菜单也将一并删除',\n extra: (row) => [\n {\n key: 'child',\n label: '子项',\n hidden: row.type === 'button' || !hasPermission('system:menu:create'),\n onClick: () => openCreate(row.id),\n },\n ],\n width: 210,\n desktopInlineKeys: ['child', 'edit', 'delete'],\n });\n const columns: ColumnProps<Menu>[] = [\n {\n title: '菜单名称',\n dataIndex: 'title',\n minWidth: 280,\n useFullRender: true,\n render: (val, row, _index, options) => {\n const expandIcon = options?.expandIcon;\n const indentText = options?.indentText;\n return (<span style={{ display: 'flex', alignItems: 'center', minWidth: 0 }}>\n {indentText}\n {expandIcon}\n {row.icon && (<span style={{ marginRight: 6, marginLeft: 4, display: 'flex', alignItems: 'center', color: 'var(--arc-antd-color-text-1)', flexShrink: 0 }}>\n {renderLucideIcon(row.icon, 15)}\n </span>)}\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={String(val)}>{val}</span>\n </span>);\n },\n },\n {\n title: '类型',\n dataIndex: 'type',\n width: 90,\n render: (val: string) => <DictTag dictCode=\"menu_type\" value={val}/>,\n },\n {\n title: '路由路径',\n dataIndex: 'path',\n width: 180,\n render: renderEllipsis,\n },\n {\n title: '组件路径',\n dataIndex: 'component',\n width: 250,\n render: renderEllipsis,\n },\n {\n title: '权限标识',\n dataIndex: 'permission',\n width: 200,\n render: renderEllipsis,\n },\n {\n title: '排序',\n dataIndex: 'sort',\n width: 70,\n align: 'center',\n },\n createdAtColumn,\n {\n title: '状态',\n dataIndex: 'status',\n width: 80,\n fixed: 'right',\n render: (_val: string, row: Menu) => row.type === 'button' ? EMPTY_PLACEHOLDER : status.renderSwitch(row),\n },\n {\n title: '显示',\n dataIndex: 'visible',\n width: 80,\n align: 'center',\n fixed: 'right',\n render: (val: boolean, row: Menu) => row.type === 'button' ? EMPTY_PLACEHOLDER : <DictTag dictCode=\"menu_visible\" value={val ? 'show' : 'hidden'}/>,\n },\n operationColumn,\n ];\n const renderExpandButton = () => (<Button type=\"primary\" icon={isAllExpanded ? <ChevronsDownUp size={14}/> : <ChevronsUpDown size={14}/>} onClick={toggleExpandAll}>\n {isAllExpanded ? '全部折叠' : '全部展开'}\n </Button>);\n return (<div className=\"page-container\" style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n\n\n {menuTreeQuery.isError && (<Banner fullMode={false} type=\"danger\" bordered closeIcon={null} description=\"菜单数据加载失败,请检查网络后点击表格右上角刷新重试\" style={{ marginBottom: 12 }}/>)}\n\n <div style={{ flex: 1, minHeight: 0 }}>\n <ConfigurableTable searchConfig={buildTableSearch({\n keyword: (<KeywordInput placeholder=\"菜单名称\" {...bindKeyword('keyword')} width={200}/>),\n filters: (<StatusSelect items={statusItems} {...bind('status')}/>),\n onSearch: (handleSearch),\n onReset: (handleResetAndCollapse),\n create: (<CreateButton permission=\"system:menu:create\" onClick={() => openCreate()}/>),\n actions: (renderExpandButton()),\n filterTitle: \"菜单筛选\",\n actionTitle: \"菜单操作\"\n })} bordered columns={columns} dataSource={filteredData} rowKey=\"id\" loading={menuTreeQuery.isFetching} onRefresh={() => void menuTreeQuery.refetch()} refreshLoading={menuTreeQuery.isFetching} pagination={false} expandedRowKeys={expandedRowKeys} onExpandedRowsChange={onExpandedRowsChange} childrenRecordName=\"children\" virtualized/>\n </div>\n\n <EditFormModal modal={menuModal} width={680}>\n <Form.RadioGroup field=\"type\" label=\"菜单类型\" rules={[{ required: true }]} onChange={(e) => setMenuType((e.target as HTMLInputElement).value)} type=\"button\">\n {menuTypeItems.map((i) => (<Radio key={i.value} value={i.value}>{i.label}</Radio>))}\n </Form.RadioGroup>\n\n <Form.Slot label={{ text: '父级菜单' }}>\n <TreeSelect treeData={parentTreeData} value={parentId ?? 0} onChange={(val) => setParentId(val as number)} style={{ width: '100%' }} placeholder=\"请选择父级菜单\" filterTreeNode showFilteredOnly virtualize={{ height: 300, itemSize: 36 }}/>\n </Form.Slot>\n\n <Row gutter={16}>\n <Col span={12}>\n <Form.Input field=\"title\" label=\"菜单名称\" placeholder=\"请输入菜单名称\" rules={[{ required: true, message: '请输入菜单名称' }]}/>\n </Col>\n {menuType !== 'button' && (<Col span={12}>\n <Form.Slot label={{ text: '图标' }}>\n <IconPicker value={iconValue} onChange={setIconValue}/>\n </Form.Slot>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && (<Col span={12}>\n <Form.Input field=\"path\" label=\"路由路径\" placeholder=\"请输入路由路径\" rules={menuType === 'menu' ? [{ required: true, message: '请输入路由路径' }] : undefined}/>\n </Col>)}\n {menuType === 'menu' && !isExternalVal && (<Col span={12}>\n <Form.Input field=\"component\" label=\"组件路径\" placeholder=\"例如: users/UsersPage\" rules={[{ required: true, message: '请输入组件路径' }]}/>\n </Col>)}\n {menuType === 'menu' && !isExternalVal && (<Col span={12}>\n <Form.Input field=\"name\" label=\"组件名\" placeholder=\"前端组件Name\"/>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && (<Col span={12}>\n <Form.Input field=\"query\" label={<Tooltip content='访问路由的默认传递参数,如:{\"id\": 1, \"name\": \"ry\"}'>路由参数</Tooltip>} placeholder='如:{\"id\": 1, \"name\": \"ry\"}'/>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && (<Col span={12}>\n <Form.RadioGroup field=\"isExternal\" label={<Tooltip content=\"选择是外链则路由地址需要以 http(s):// 开头\">是否外链</Tooltip>} type=\"button\" onChange={(e) => setIsExternalVal((e.target as HTMLInputElement).value as unknown as boolean)}>\n <Radio value={true}>是</Radio>\n <Radio value={false}>否</Radio>\n </Form.RadioGroup>\n </Col>)}\n {(menuType === 'menu' || menuType === 'directory') && isExternalVal && (<Col span={12}>\n <Form.RadioGroup field=\"embed\" label={<Tooltip content=\"内嵌:在系统内以 iframe 打开外链,保留侧边栏与页签;新窗口:浏览器新标签页打开\">打开方式</Tooltip>} type=\"button\">\n <Radio value={false}>新窗口</Radio>\n <Radio value={true}>内嵌</Radio>\n </Form.RadioGroup>\n </Col>)}\n {menuType === 'menu' && (<Col span={12}>\n <Form.RadioGroup field=\"keepAlive\" label={<Tooltip content=\"开启后,多页签模式下切换页签保留该页面状态(搜索条件、滚动位置等),关闭页签时释放\">页面缓存</Tooltip>} type=\"button\">\n <Radio value={true}>开启</Radio>\n <Radio value={false}>关闭</Radio>\n </Form.RadioGroup>\n </Col>)}\n {menuType === 'button' && (<Col span={12}>\n <Form.Input field=\"permission\" label=\"权限标识\" placeholder=\"如:system:user:list\" rules={[{ required: true, message: '请输入权限标识' }]}/>\n </Col>)}\n <Col span={12}>\n <Form.InputNumber field=\"sort\" label=\"排序\" placeholder=\"请输入排序\" min={0} style={{ width: '100%' }}/>\n </Col>\n </Row>\n\n <Row gutter={16}>\n <Col span={12}>\n <FormStatusRadioGroup type=\"button\" rules={[{ required: true }]}/>\n </Col>\n {menuType !== 'button' && (<Col span={12}>\n <Form.RadioGroup field=\"visible\" label=\"显示状态\" type=\"button\" rules={[{ required: true }]}>\n {menuVisibleItems.map((i) => (<Radio key={i.value} value={i.value}>{i.label}</Radio>))}\n </Form.RadioGroup>\n </Col>)}\n </Row>\n </EditFormModal>\n </div>);\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{At as t,kt as n}from"./clipboard-dpqHdCyy.js";import{c as r,s as i}from"./App-
|
|
2
|
-
//# sourceMappingURL=MonacoPreviewPanel-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{At as t,kt as n}from"./clipboard-dpqHdCyy.js";import{c as r,s as i}from"./App-nh6_qOo8.js";import{jsx as a}from"react/jsx-runtime";import{monacoLanguageByExt as o}from"@fudanda/admin-antd/core/utils/monaco-language";function s({content:e,fileName:t,style:i}){let{isDark:s}=r(),c=o(t?.split(`.`).pop()??``);return/* @__PURE__ */ a(`div`,{style:{flex:1,minHeight:0,...i},children:/* @__PURE__ */ a(n,{value:e,language:c,theme:s?`vs-dark`:`light`,options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:`on`,fontSize:13,lineNumbers:`on`,folding:!0,renderLineHighlight:`none`,automaticLayout:!0,contextmenu:!1,scrollbar:{vertical:`auto`,horizontal:`auto`}},height:`100%`})})}function c(){return(c=e((()=>{t(),i()})))()}c();export{s as default};
|
|
2
|
+
//# sourceMappingURL=MonacoPreviewPanel-BZrNIcFZ.js.map
|
package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js.map → MonacoPreviewPanel-BZrNIcFZ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonacoPreviewPanel-
|
|
1
|
+
{"version":3,"file":"MonacoPreviewPanel-BZrNIcFZ.js","mappings":"kRAgBA,SAAwBA,EAAmB,CAAE,UAAS,WAAU,SAA4C,CACxG,GAAM,CAAE,UAAWC,EAAmB,EAChCC,EAAWC,EAAoBC,GAAU,MAAM,GAAG,CAAC,CAAC,IAAI,GAAK,EAAE,EACrE,MAAQ,kBAAC,MAAD,CAAK,MAAO,CAAE,KAAM,EAAG,UAAW,EAAG,GAAGC,CAAM,EACpD,2BAACC,EAAD,CAAQ,MAAOC,EAAmB,WAAU,MAAOC,EAAS,UAAY,QAAS,QAAS,CACpF,SAAU,GACV,QAAS,CAAE,QAAS,EAAM,EAC1B,qBAAsB,GACtB,SAAU,KACV,SAAU,GACV,YAAa,KACb,QAAS,GACT,oBAAqB,OACrB,gBAAiB,GACjB,YAAa,GACb,UAAW,CAAE,SAAU,OAAQ,WAAY,MAAO,CACtD,EAAG,OAAO,MAAO,EAChB,EACT,C","names":["MonacoPreviewPanel","useThemeController","language","monacoLanguageByExt","fileName","style","Editor","content","isDark"],"ignoreList":[],"sources":["../../src/components/MonacoPreviewPanel.tsx"],"sourcesContent":["/**\n * Monaco Editor 只读预览面板。\n * 用于在 FilePreviewModal 中替换 MarkdownPreviewPanel rawText 模式,\n * 提供带语法高亮的代码文件预览。\n */\nimport type { CSSProperties } from 'react';\nimport Editor from './MonacoEditor';\nimport { useThemeController } from \"@/providers/theme-controller\";\nimport { monacoLanguageByExt } from \"@fudanda/react-core/utils/monaco-language\";\ninterface MonacoPreviewPanelProps {\n /** 文件内容 */\n readonly content: string;\n /** 文件名,用于自动检测语言 */\n readonly fileName?: string;\n readonly style?: CSSProperties;\n}\nexport default function MonacoPreviewPanel({ content, fileName, style }: Readonly<MonacoPreviewPanelProps>) {\n const { isDark } = useThemeController();\n const language = monacoLanguageByExt(fileName?.split('.').pop() ?? '');\n return (<div style={{ flex: 1, minHeight: 0, ...style }}>\n <Editor value={content} language={language} theme={isDark ? 'vs-dark' : 'light'} options={{\n readOnly: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n wordWrap: 'on',\n fontSize: 13,\n lineNumbers: 'on',\n folding: true,\n renderLineHighlight: 'none',\n automaticLayout: true,\n contextmenu: false,\n scrollbar: { vertical: 'auto', horizontal: 'auto' },\n }} height=\"100%\"/>\n </div>);\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{E as t,I as n,M as r,_t as i,ct as a,gt as o,lt as s,m as c,y as l,zt as u}from"./clipboard-dpqHdCyy.js";import{n as d,t as f}from"./MasterDetailLayout-
|
|
2
|
-
//# sourceMappingURL=NavListPanel-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Bruge11p.js";import{E as t,I as n,M as r,_t as i,ct as a,gt as o,lt as s,m as c,y as l,zt as u}from"./clipboard-dpqHdCyy.js";import{n as d,t as f}from"./MasterDetailLayout-ByIBpmkZ.js";import{i as p,r as m}from"./App-nh6_qOo8.js";import{Children as h,Fragment as g}from"react";import{Fragment as _,jsx as v,jsxs as y}from"react/jsx-runtime";function b({title:e,headerExtra:r,search:i,loading:o,emptyText:s=`暂无数据`,footer:c,dataSource:l,renderItem:d,children:p,style:g,bodyNoPadding:b,rawBody:x}){let S=l!==void 0,C=(S?0:h.count(p))>0?p:null,w=i?/* @__PURE__ */ v(u,{prefix:/* @__PURE__ */ v(a,{size:14}),placeholder:i.placeholder??`搜索`,value:i.value,onChange:i.onChange,onEnterPress:i.onEnterPress,showClear:!0,size:`small`}):null;return/* @__PURE__ */ y(`div`,{className:`nav-list-panel`,style:g,children:[(e!==void 0||r!==void 0)&&/* @__PURE__ */ y(`div`,{className:`nav-list-panel__header`,children:[e!==void 0&&/* @__PURE__ */ v(`span`,{className:`nav-list-panel__title`,children:e}),/* @__PURE__ */ y(`div`,{className:`nav-list-panel__header-extra${e===void 0?` nav-list-panel__header-extra--full`:``}`,children:[r,/* @__PURE__ */ v(`span`,{className:`nav-list-panel__side-toggle`,children:/* @__PURE__ */ v(f.SideToggle,{})})]})]}),w!==null&&/* @__PURE__ */ v(`div`,{className:`nav-list-panel__search`,children:w}),/* @__PURE__ */ v(m,{className:`nav-list-panel__body${b?` nav-list-panel__body--no-padding`:``}`,role:`region`,"aria-label":typeof e==`string`?e:`导航列表`,children:x?/* @__PURE__ */ y(_,{children:[o&&/* @__PURE__ */ v(`div`,{style:{display:`flex`,justifyContent:`center`,padding:24},children:/* @__PURE__ */ v(t,{})}),!o&&p]}):/* @__PURE__ */ v(n,{split:!1,loading:o,emptyContent:/* @__PURE__ */ v(`div`,{className:`nav-list-panel__empty`,children:s}),dataSource:S?l:void 0,renderItem:S?d:void 0,className:`nav-list-panel__list`,children:S?null:C})}),c!=null&&/* @__PURE__ */ v(`div`,{className:`nav-list-panel__footer`,children:c})]})}function x({items:e}){let t=e.filter(e=>!e.hidden);return t.length===0?null:/* @__PURE__ */ v(l,{trigger:`click`,position:`bottomRight`,clickToHide:!0,render:/* @__PURE__ */ v(l.Menu,{children:t.map((e,t)=>/* @__PURE__ */ y(g,{children:[e.dividerBefore&&t>0?/* @__PURE__ */ v(l.Divider,{}):null,/* @__PURE__ */ v(l.Item,{type:e.danger?`danger`:void 0,disabled:e.disabled,onClick:t=>{t.stopPropagation(),e.onClick()},children:/* @__PURE__ */ y(`span`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[e.icon,e.label]})})]},e.key))}),children:/* @__PURE__ */ v(c,{"aria-label":`更多操作`,theme:`borderless`,size:`small`,icon:/* @__PURE__ */ v(o,{size:14}),onClick:e=>e.stopPropagation()})})}function S(){return(S=e((()=>{r(),i(),s(),d(),p()})))()}export{b as n,S as r,x as t};
|
|
2
|
+
//# sourceMappingURL=NavListPanel-zwUDIYSP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavListPanel-Iz1RCkVw.js","names":["_Fragment","MoreHorizontal","__esmMin","Spin","List","init_ui","init_ellipsis","Search","Ellipsis","init_search","Button","Dropdown","Input","init_MasterDetailLayout","MasterDetailLayout","init_ScrollArea","ScrollArea","Fragment$1","NavListPanel","usingDataSource","dataSource","childrenContent","Children","children","searchInput","search","title","headerExtra","bodyNoPadding","rawBody","loading","emptyText","renderItem","footer","NavListItemActions","visible","items","item","Fragment","index","e","init_NavListPanel$1"],"sources":["../../src/components/NavListPanel.css","../../src/components/NavListPanel.tsx"],"sourcesContent":["/* ─── NavListPanel:左侧导航列表面板容器 ────────────────────────────────── */\n\n.nav-list-panel {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--surface-card);\n}\n\n.nav-list-panel__header {\n flex-shrink: 0;\n min-height: 44px;\n padding: 8px 12px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--arc-antd-color-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.nav-list-panel__title {\n font-size: 13px;\n font-weight: 600;\n color: var(--arc-antd-color-text-0);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.nav-list-panel__header-extra {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.nav-list-panel__header-extra--full {\n flex: 1;\n min-width: 0;\n}\n\n.nav-list-panel__side-toggle {\n display: inline-flex;\n margin-left: auto;\n}\n\n.nav-list-panel__search {\n flex-shrink: 0;\n padding: 10px 12px;\n border-bottom: 1px solid var(--arc-antd-color-border);\n}\n\n.nav-list-panel__body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 8px;\n box-sizing: border-box;\n}\n\n.nav-list-panel__body--no-padding {\n padding: 0;\n}\n\n/* 滚动由独立的 body 承载,不依赖 Ant List 内部的 Spin 结构。 */\n.nav-list-panel__list {\n font: inherit;\n}\n\n.nav-list-panel__list .ant-list-items {\n margin: 0;\n list-style: none;\n}\n\n.nav-list-panel__footer {\n flex-shrink: 0;\n padding: 8px 10px;\n border-top: 1px solid var(--arc-antd-color-border);\n overflow-x: auto;\n display: flex;\n justify-content: center;\n box-sizing: border-box;\n}\n\n.nav-list-panel__empty {\n padding: 28px 0;\n text-align: center;\n color: var(--arc-antd-color-text-2);\n font-size: 13px;\n}\n\n/* ─── NavListItem:导航列表条目(字典管理风格:圆角卡片 + hover/active 状态)── */\n.nav-list-panel .nav-list-item.ant-list-item {\n display: flex;\n flex-wrap: nowrap;\n align-items: flex-start;\n gap: 8px;\n padding: 8px;\n margin: 0 0 4px;\n border-radius: var(--arc-antd-border-radius-medium);\n cursor: pointer;\n transition: background 0.15s;\n user-select: none;\n box-sizing: border-box;\n font-family: inherit;\n color: inherit;\n width: 100%;\n}\n\n.nav-list-panel .nav-list-item > .ant-list-item-main {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.nav-list-panel .ant-listy-item:last-child .nav-list-item {\n margin-bottom: 0;\n}\n\n.nav-list-panel .nav-list-item:hover,\n.nav-list-panel .nav-list-item:focus-within {\n background: var(--arc-antd-color-fill-0);\n}\n\n.nav-list-panel .nav-list-item.nav-list-item--active {\n background: var(--arc-antd-color-primary-light-default);\n}\n\nbody[theme-mode='light'] .nav-list-panel .nav-list-item:hover,\nbody[theme-mode='light'] .nav-list-panel .nav-list-item:focus-within {\n background: var(--arc-antd-color-fill-1);\n}\n\nbody[theme-mode='light'] .nav-list-panel .nav-list-item.nav-list-item--active {\n position: relative;\n background: var(--arc-antd-color-primary-light-hover);\n}\n\nbody[theme-mode='light'] .nav-list-panel .nav-list-item--active .nav-list-item__primary {\n color: var(--arc-antd-color-primary);\n}\n\n.nav-list-item__select {\n display: flex;\n flex: 1;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n padding: 0;\n border: 0;\n border-radius: var(--arc-antd-border-radius-small);\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n}\n\nbutton.nav-list-item__select { cursor: pointer; }\n.nav-list-item__select:focus-visible { outline: 2px solid var(--arc-antd-color-primary); outline-offset: 3px; }\n\n.nav-list-item__icon {\n flex-shrink: 0;\n margin-top: 2px;\n color: var(--arc-antd-color-primary);\n}\n\n.nav-list-item__body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.nav-list-item__row1 {\n display: flex;\n align-items: baseline;\n gap: 0;\n line-height: 1.4;\n min-width: 0;\n overflow: hidden;\n}\n\n.nav-list-item__primary {\n font-size: 13px;\n font-weight: 600;\n color: var(--arc-antd-color-text-0);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.nav-list-item__sep {\n flex-shrink: 0;\n margin: 0 4px;\n font-size: 11px;\n color: var(--arc-antd-color-text-3);\n}\n\n.nav-list-item__secondary {\n font-size: 12px;\n color: var(--arc-antd-color-text-2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.nav-list-item__meta {\n font-size: 11px;\n color: var(--arc-antd-color-text-3);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n/* extra 区域:默认隐藏,hover / 激活时显示 */\n.nav-list-item__extra {\n flex-shrink: 0;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.15s, visibility 0.15s;\n}\n\n.nav-list-item--active .nav-list-item__extra,\n.nav-list-item:hover .nav-list-item__extra,\n.nav-list-item:focus-within .nav-list-item__extra,\n.nav-list-item .nav-list-item__extra--visible {\n opacity: 1;\n visibility: visible;\n}\n","import { Children, Fragment } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { Button, Dropdown, Input, List, Spin } from \"@/ui\";\nimport { MoreHorizontal, Search } from 'lucide-react';\nimport \"@/components/NavListPanel.css\";\nimport { MasterDetailLayout } from \"@/components/MasterDetailLayout\";\nimport ScrollArea from './ScrollArea';\n/* ─────────────────────────── NavListPanel ──────────────────────────────── */\nexport interface NavListPanelSearchProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n onEnterPress?: () => void;\n}\nexport interface NavListPanelProps<T = unknown> {\n /** 标题栏左侧文字 */\n title?: ReactNode;\n /** 标题栏右侧操作区(按钮/下拉菜单等) */\n headerExtra?: ReactNode;\n /** 如果提供,在标题栏下方渲染搜索输入框 */\n search?: NavListPanelSearchProps;\n /** 列表加载中 */\n loading?: boolean;\n /** 空状态文字 */\n emptyText?: string;\n /** 底部插槽(分页等) */\n footer?: ReactNode;\n /**\n * 数据源(Ant List 的 `dataSource` + `renderItem` 模式,优先于 `children`)。\n * 配合 `renderItem` 使用,空数组时自动显示 `emptyText`。\n */\n dataSource?: T[];\n /** 渲染每个条目,配合 `dataSource` 使用 */\n renderItem?: (item: T, index: number) => ReactNode;\n /** 列表条目(与 `dataSource` 二选一) */\n children?: ReactNode;\n style?: CSSProperties;\n /** 是否去掉 body 的 padding(用于 Collapse 分组等场景) */\n bodyNoPadding?: boolean;\n /**\n * 原样渲染 children,不套内置的 `<List>` 容器(用于分组 Collapse 等自定义布局,\n * 由调用方自行组合 `<List>` 与空状态)。默认 false:会把扁平 children 包进 `<List>`。\n */\n rawBody?: boolean;\n}\nexport function NavListPanel<T = unknown>({ title, headerExtra, search, loading, emptyText = '暂无数据', footer, dataSource, renderItem, children, style, bodyNoPadding, rawBody, }: Readonly<NavListPanelProps<T>>) {\n const usingDataSource = dataSource !== undefined;\n const childCount = usingDataSource ? 0 : Children.count(children);\n const childrenContent = childCount > 0 ? children : null;\n // 面板搜索框跟随容器宽度;列表滚动时搜索和分页留在原位。\n const searchInput = search ? (<Input prefix={<Search size={14}/>} placeholder={search.placeholder ?? '搜索'} value={search.value} onChange={search.onChange} onEnterPress={search.onEnterPress} showClear size=\"small\"/>) : null;\n return (<div className=\"nav-list-panel\" style={style}>\n {(title !== undefined || headerExtra !== undefined) && (<div className=\"nav-list-panel__header\">\n {title !== undefined && (<span className=\"nav-list-panel__title\">{title}</span>)}\n <div className={`nav-list-panel__header-extra${title === undefined ? ' nav-list-panel__header-extra--full' : ''}`}>\n {headerExtra}\n <span className=\"nav-list-panel__side-toggle\">\n <MasterDetailLayout.SideToggle />\n </span>\n </div>\n </div>)}\n\n {searchInput !== null && <div className=\"nav-list-panel__search\">{searchInput}</div>}\n <ScrollArea className={`nav-list-panel__body${bodyNoPadding ? ' nav-list-panel__body--no-padding' : ''}`} role=\"region\" aria-label={typeof title === 'string' ? title : '导航列表'}>\n {rawBody ? <>\n {loading && (<div style={{ display: 'flex', justifyContent: 'center', padding: 24 }}>\n <Spin />\n </div>)}\n {!loading && children}\n </> : (<List split={false} loading={loading} emptyContent={<div className=\"nav-list-panel__empty\">{emptyText}</div>} dataSource={usingDataSource ? dataSource : undefined} renderItem={usingDataSource ? (renderItem as (item: unknown, index: number) => ReactNode) : undefined} className=\"nav-list-panel__list\">\n {usingDataSource ? null : childrenContent}\n </List>)}\n </ScrollArea>\n {footer != null && <div className=\"nav-list-panel__footer\">{footer}</div>}\n </div>);\n}\n/* ─────────────────────────── NavListItem ───────────────────────────────── */\nexport interface NavListItemProps {\n /** 高亮激活状态 */\n active?: boolean;\n onClick?: () => void;\n /** 主标题(加粗) */\n primary: ReactNode;\n /** 副标题(主标题后 · 分隔,省略样式) */\n secondary?: ReactNode;\n /** 底部元信息行(日期/大小/标签等,颜色更淡) */\n meta?: ReactNode;\n /** 左侧图标 */\n icon?: ReactNode;\n /**\n * 右侧操作区,默认 hover/active 时才可见。\n * 如需始终显示,设置 `extraAlwaysVisible`。\n */\n extra?: ReactNode;\n /** 让 extra 区域始终可见(不随 hover 隐藏) */\n extraAlwaysVisible?: boolean;\n style?: CSSProperties;\n className?: string;\n}\nexport function NavListItem({ active, onClick, primary, secondary, meta, icon, extra, extraAlwaysVisible, style, className, }: Readonly<NavListItemProps>) {\n const content = <>\n {icon && <span className=\"nav-list-item__icon\">{icon}</span>}\n <span className=\"nav-list-item__body\">\n <span className=\"nav-list-item__row1\">\n <span className=\"nav-list-item__primary\">{primary}</span>\n {secondary !== undefined && <><span className=\"nav-list-item__sep\">·</span><span className=\"nav-list-item__secondary\">{secondary}</span></>}\n </span>\n {meta !== undefined && <span className=\"nav-list-item__meta\">{meta}</span>}\n </span>\n </>;\n return (<List.Item className={[\n 'nav-list-item',\n active ? 'nav-list-item--active' : '',\n className ?? '',\n ].filter(Boolean).join(' ')} style={style}>\n {onClick ? <button type=\"button\" className=\"nav-list-item__select\" aria-current={active ? 'true' : undefined} onClick={onClick}>{content}</button>\n : <div className=\"nav-list-item__select\">{content}</div>}\n\n {extra !== undefined && (<div className={`nav-list-item__extra${extraAlwaysVisible ? ' nav-list-item__extra--visible' : ''}`}>\n {extra}\n </div>)}\n </List.Item>);\n}\n/* ─────────────────────────── NavListItemActions ────────────────────────── */\nexport interface NavListItemAction {\n key: string;\n label: ReactNode;\n /** 菜单项前的小图标,按 14px 传入(如 `<Pencil size={14} />`) */\n icon?: ReactNode;\n /** 危险动作(删除等)用红色文字 */\n danger?: boolean;\n /** 在该项前插入分隔线(通常用于把删除与其它动作分开) */\n dividerBefore?: boolean;\n /** 无权限时不渲染该项 */\n hidden?: boolean;\n disabled?: boolean;\n onClick: () => void;\n}\n/**\n * 列表条目右侧的「更多」菜单(`NavListItem` 的 `extra` 槽):借用 `Dropdown` 承载编辑 / 删除等低频动作,\n * 触发按钮与菜单项都阻止冒泡(菜单经 portal 渲染,React 事件仍会冒泡到条目)以免顺带选中条目。全部动作都隐藏时不渲染。\n *\n * @example\n * extra={<NavListItemActions items={[\n * { key: 'edit', label: '编辑', icon: <Pencil size={14} />, hidden: !canManage, onClick: () => openEdit(item) },\n * { key: 'delete', label: '删除', icon: <Trash2 size={14} />, danger: true, dividerBefore: true, hidden: !canManage, onClick: () => remove(item) },\n * ]} />}\n */\nexport function NavListItemActions({ items }: Readonly<{\n items: readonly NavListItemAction[];\n}>) {\n const visible = items.filter((item) => !item.hidden);\n if (visible.length === 0)\n return null;\n return (<Dropdown trigger=\"click\" position=\"bottomRight\" clickToHide render={(<Dropdown.Menu>\n {visible.map((item, index) => (<Fragment key={item.key}>\n {item.dividerBefore && index > 0 ? <Dropdown.Divider /> : null}\n <Dropdown.Item type={item.danger ? 'danger' : undefined} disabled={item.disabled} onClick={(e) => { e.stopPropagation(); item.onClick(); }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {item.icon}{item.label}\n </span>\n </Dropdown.Item>\n </Fragment>))}\n </Dropdown.Menu>)}>\n <Button aria-label=\"更多操作\" theme=\"borderless\" size=\"small\" icon={<MoreHorizontal size={14}/>} onClick={(e) => e.stopPropagation()}/>\n </Dropdown>);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NavListPanel-zwUDIYSP.js","names":["_Fragment","MoreHorizontal","__esmMin","Spin","List","init_ui","init_ellipsis","Search","Ellipsis","init_search","Button","Dropdown","Input","init_MasterDetailLayout","MasterDetailLayout","init_ScrollArea","ScrollArea","Fragment$1","NavListPanel","usingDataSource","dataSource","childrenContent","Children","children","searchInput","search","title","headerExtra","bodyNoPadding","rawBody","loading","emptyText","renderItem","footer","NavListItemActions","visible","items","item","Fragment","index","e","init_NavListPanel$1"],"sources":["../../src/components/NavListPanel.css","../../src/components/NavListPanel.tsx"],"sourcesContent":["/* ─── NavListPanel:左侧导航列表面板容器 ────────────────────────────────── */\n\n.nav-list-panel {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--surface-card);\n}\n\n.nav-list-panel__header {\n flex-shrink: 0;\n min-height: 44px;\n padding: 8px 12px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--arc-antd-color-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.nav-list-panel__title {\n font-size: 13px;\n font-weight: 600;\n color: var(--arc-antd-color-text-0);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.nav-list-panel__header-extra {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.nav-list-panel__header-extra--full {\n flex: 1;\n min-width: 0;\n}\n\n.nav-list-panel__side-toggle {\n display: inline-flex;\n margin-left: auto;\n}\n\n.nav-list-panel__search {\n flex-shrink: 0;\n padding: 10px 12px;\n border-bottom: 1px solid var(--arc-antd-color-border);\n}\n\n.nav-list-panel__body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 8px;\n box-sizing: border-box;\n}\n\n.nav-list-panel__body--no-padding {\n padding: 0;\n}\n\n/* 滚动由独立的 body 承载,不依赖 Ant List 内部的 Spin 结构。 */\n.nav-list-panel__list {\n font: inherit;\n}\n\n.nav-list-panel__list .ant-list-items {\n margin: 0;\n list-style: none;\n}\n\n.nav-list-panel__footer {\n flex-shrink: 0;\n padding: 8px 10px;\n border-top: 1px solid var(--arc-antd-color-border);\n overflow-x: auto;\n display: flex;\n justify-content: center;\n box-sizing: border-box;\n}\n\n.nav-list-panel__empty {\n padding: 28px 0;\n text-align: center;\n color: var(--arc-antd-color-text-2);\n font-size: 13px;\n}\n\n/* ─── NavListItem:导航列表条目(字典管理风格:圆角卡片 + hover/active 状态)── */\n.nav-list-panel .nav-list-item.ant-list-item {\n display: flex;\n flex-wrap: nowrap;\n align-items: flex-start;\n gap: 8px;\n padding: 8px;\n margin: 0 0 4px;\n border-radius: var(--arc-antd-border-radius-medium);\n cursor: pointer;\n transition: background 0.15s;\n user-select: none;\n box-sizing: border-box;\n font-family: inherit;\n color: inherit;\n width: 100%;\n}\n\n.nav-list-panel .nav-list-item > .ant-list-item-main {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.nav-list-panel .ant-listy-item:last-child .nav-list-item {\n margin-bottom: 0;\n}\n\n.nav-list-panel .nav-list-item:hover,\n.nav-list-panel .nav-list-item:focus-within {\n background: var(--arc-antd-color-fill-0);\n}\n\n.nav-list-panel .nav-list-item.nav-list-item--active {\n background: var(--arc-antd-color-primary-light-default);\n}\n\nbody[theme-mode='light'] .nav-list-panel .nav-list-item:hover,\nbody[theme-mode='light'] .nav-list-panel .nav-list-item:focus-within {\n background: var(--arc-antd-color-fill-1);\n}\n\nbody[theme-mode='light'] .nav-list-panel .nav-list-item.nav-list-item--active {\n position: relative;\n background: var(--arc-antd-color-primary-light-hover);\n}\n\nbody[theme-mode='light'] .nav-list-panel .nav-list-item--active .nav-list-item__primary {\n color: var(--arc-antd-color-primary);\n}\n\n.nav-list-item__select {\n display: flex;\n flex: 1;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n padding: 0;\n border: 0;\n border-radius: var(--arc-antd-border-radius-small);\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n}\n\nbutton.nav-list-item__select { cursor: pointer; }\n.nav-list-item__select:focus-visible { outline: 2px solid var(--arc-antd-color-primary); outline-offset: 3px; }\n\n.nav-list-item__icon {\n flex-shrink: 0;\n margin-top: 2px;\n color: var(--arc-antd-color-primary);\n}\n\n.nav-list-item__body {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.nav-list-item__row1 {\n display: flex;\n align-items: baseline;\n gap: 0;\n line-height: 1.4;\n min-width: 0;\n overflow: hidden;\n}\n\n.nav-list-item__primary {\n font-size: 13px;\n font-weight: 600;\n color: var(--arc-antd-color-text-0);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.nav-list-item__sep {\n flex-shrink: 0;\n margin: 0 4px;\n font-size: 11px;\n color: var(--arc-antd-color-text-3);\n}\n\n.nav-list-item__secondary {\n font-size: 12px;\n color: var(--arc-antd-color-text-2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.nav-list-item__meta {\n font-size: 11px;\n color: var(--arc-antd-color-text-3);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n/* extra 区域:默认隐藏,hover / 激活时显示 */\n.nav-list-item__extra {\n flex-shrink: 0;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.15s, visibility 0.15s;\n}\n\n.nav-list-item--active .nav-list-item__extra,\n.nav-list-item:hover .nav-list-item__extra,\n.nav-list-item:focus-within .nav-list-item__extra,\n.nav-list-item .nav-list-item__extra--visible {\n opacity: 1;\n visibility: visible;\n}\n","import { Children, Fragment } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { Button, Dropdown, Input, List, Spin } from \"@/ui\";\nimport { MoreHorizontal, Search } from 'lucide-react';\nimport \"@/components/NavListPanel.css\";\nimport { MasterDetailLayout } from \"@/components/MasterDetailLayout\";\nimport ScrollArea from './ScrollArea';\n/* ─────────────────────────── NavListPanel ──────────────────────────────── */\nexport interface NavListPanelSearchProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n onEnterPress?: () => void;\n}\nexport interface NavListPanelProps<T = unknown> {\n /** 标题栏左侧文字 */\n title?: ReactNode;\n /** 标题栏右侧操作区(按钮/下拉菜单等) */\n headerExtra?: ReactNode;\n /** 如果提供,在标题栏下方渲染搜索输入框 */\n search?: NavListPanelSearchProps;\n /** 列表加载中 */\n loading?: boolean;\n /** 空状态文字 */\n emptyText?: string;\n /** 底部插槽(分页等) */\n footer?: ReactNode;\n /**\n * 数据源(Ant List 的 `dataSource` + `renderItem` 模式,优先于 `children`)。\n * 配合 `renderItem` 使用,空数组时自动显示 `emptyText`。\n */\n dataSource?: T[];\n /** 渲染每个条目,配合 `dataSource` 使用 */\n renderItem?: (item: T, index: number) => ReactNode;\n /** 列表条目(与 `dataSource` 二选一) */\n children?: ReactNode;\n style?: CSSProperties;\n /** 是否去掉 body 的 padding(用于 Collapse 分组等场景) */\n bodyNoPadding?: boolean;\n /**\n * 原样渲染 children,不套内置的 `<List>` 容器(用于分组 Collapse 等自定义布局,\n * 由调用方自行组合 `<List>` 与空状态)。默认 false:会把扁平 children 包进 `<List>`。\n */\n rawBody?: boolean;\n}\nexport function NavListPanel<T = unknown>({ title, headerExtra, search, loading, emptyText = '暂无数据', footer, dataSource, renderItem, children, style, bodyNoPadding, rawBody, }: Readonly<NavListPanelProps<T>>) {\n const usingDataSource = dataSource !== undefined;\n const childCount = usingDataSource ? 0 : Children.count(children);\n const childrenContent = childCount > 0 ? children : null;\n // 面板搜索框跟随容器宽度;列表滚动时搜索和分页留在原位。\n const searchInput = search ? (<Input prefix={<Search size={14}/>} placeholder={search.placeholder ?? '搜索'} value={search.value} onChange={search.onChange} onEnterPress={search.onEnterPress} showClear size=\"small\"/>) : null;\n return (<div className=\"nav-list-panel\" style={style}>\n {(title !== undefined || headerExtra !== undefined) && (<div className=\"nav-list-panel__header\">\n {title !== undefined && (<span className=\"nav-list-panel__title\">{title}</span>)}\n <div className={`nav-list-panel__header-extra${title === undefined ? ' nav-list-panel__header-extra--full' : ''}`}>\n {headerExtra}\n <span className=\"nav-list-panel__side-toggle\">\n <MasterDetailLayout.SideToggle />\n </span>\n </div>\n </div>)}\n\n {searchInput !== null && <div className=\"nav-list-panel__search\">{searchInput}</div>}\n <ScrollArea className={`nav-list-panel__body${bodyNoPadding ? ' nav-list-panel__body--no-padding' : ''}`} role=\"region\" aria-label={typeof title === 'string' ? title : '导航列表'}>\n {rawBody ? <>\n {loading && (<div style={{ display: 'flex', justifyContent: 'center', padding: 24 }}>\n <Spin />\n </div>)}\n {!loading && children}\n </> : (<List split={false} loading={loading} emptyContent={<div className=\"nav-list-panel__empty\">{emptyText}</div>} dataSource={usingDataSource ? dataSource : undefined} renderItem={usingDataSource ? (renderItem as (item: unknown, index: number) => ReactNode) : undefined} className=\"nav-list-panel__list\">\n {usingDataSource ? null : childrenContent}\n </List>)}\n </ScrollArea>\n {footer != null && <div className=\"nav-list-panel__footer\">{footer}</div>}\n </div>);\n}\n/* ─────────────────────────── NavListItem ───────────────────────────────── */\nexport interface NavListItemProps {\n /** 高亮激活状态 */\n active?: boolean;\n onClick?: () => void;\n /** 主标题(加粗) */\n primary: ReactNode;\n /** 副标题(主标题后 · 分隔,省略样式) */\n secondary?: ReactNode;\n /** 底部元信息行(日期/大小/标签等,颜色更淡) */\n meta?: ReactNode;\n /** 左侧图标 */\n icon?: ReactNode;\n /**\n * 右侧操作区,默认 hover/active 时才可见。\n * 如需始终显示,设置 `extraAlwaysVisible`。\n */\n extra?: ReactNode;\n /** 让 extra 区域始终可见(不随 hover 隐藏) */\n extraAlwaysVisible?: boolean;\n style?: CSSProperties;\n className?: string;\n}\nexport function NavListItem({ active, onClick, primary, secondary, meta, icon, extra, extraAlwaysVisible, style, className, }: Readonly<NavListItemProps>) {\n const content = <>\n {icon && <span className=\"nav-list-item__icon\">{icon}</span>}\n <span className=\"nav-list-item__body\">\n <span className=\"nav-list-item__row1\">\n <span className=\"nav-list-item__primary\">{primary}</span>\n {secondary !== undefined && <><span className=\"nav-list-item__sep\">·</span><span className=\"nav-list-item__secondary\">{secondary}</span></>}\n </span>\n {meta !== undefined && <span className=\"nav-list-item__meta\">{meta}</span>}\n </span>\n </>;\n return (<List.Item className={[\n 'nav-list-item',\n active ? 'nav-list-item--active' : '',\n className ?? '',\n ].filter(Boolean).join(' ')} style={style}>\n {onClick ? <button type=\"button\" className=\"nav-list-item__select\" aria-current={active ? 'true' : undefined} onClick={onClick}>{content}</button>\n : <div className=\"nav-list-item__select\">{content}</div>}\n\n {extra !== undefined && (<div className={`nav-list-item__extra${extraAlwaysVisible ? ' nav-list-item__extra--visible' : ''}`}>\n {extra}\n </div>)}\n </List.Item>);\n}\n/* ─────────────────────────── NavListItemActions ────────────────────────── */\nexport interface NavListItemAction {\n key: string;\n label: ReactNode;\n /** 菜单项前的小图标,按 14px 传入(如 `<Pencil size={14} />`) */\n icon?: ReactNode;\n /** 危险动作(删除等)用红色文字 */\n danger?: boolean;\n /** 在该项前插入分隔线(通常用于把删除与其它动作分开) */\n dividerBefore?: boolean;\n /** 无权限时不渲染该项 */\n hidden?: boolean;\n disabled?: boolean;\n onClick: () => void;\n}\n/**\n * 列表条目右侧的「更多」菜单(`NavListItem` 的 `extra` 槽):借用 `Dropdown` 承载编辑 / 删除等低频动作,\n * 触发按钮与菜单项都阻止冒泡(菜单经 portal 渲染,React 事件仍会冒泡到条目)以免顺带选中条目。全部动作都隐藏时不渲染。\n *\n * @example\n * extra={<NavListItemActions items={[\n * { key: 'edit', label: '编辑', icon: <Pencil size={14} />, hidden: !canManage, onClick: () => openEdit(item) },\n * { key: 'delete', label: '删除', icon: <Trash2 size={14} />, danger: true, dividerBefore: true, hidden: !canManage, onClick: () => remove(item) },\n * ]} />}\n */\nexport function NavListItemActions({ items }: Readonly<{\n items: readonly NavListItemAction[];\n}>) {\n const visible = items.filter((item) => !item.hidden);\n if (visible.length === 0)\n return null;\n return (<Dropdown trigger=\"click\" position=\"bottomRight\" clickToHide render={(<Dropdown.Menu>\n {visible.map((item, index) => (<Fragment key={item.key}>\n {item.dividerBefore && index > 0 ? <Dropdown.Divider /> : null}\n <Dropdown.Item type={item.danger ? 'danger' : undefined} disabled={item.disabled} onClick={(e) => { e.stopPropagation(); item.onClick(); }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {item.icon}{item.label}\n </span>\n </Dropdown.Item>\n </Fragment>))}\n </Dropdown.Menu>)}>\n <Button aria-label=\"更多操作\" theme=\"borderless\" size=\"small\" icon={<MoreHorizontal size={14}/>} onClick={(e) => e.stopPropagation()}/>\n </Dropdown>);\n}\n"],"mappings":"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"}
|