封装供应商弹框详情组件
This commit is contained in:
@ -340,7 +340,6 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
|
||||
const updateDataSource = (newData: TableRowItem[]) => {
|
||||
// 确保每行都有唯一稳定的key
|
||||
const finalData = ensureUniqueKeys(newData);
|
||||
console.log('finalData', finalData);
|
||||
setDataSource(finalData);
|
||||
if (onChange) {
|
||||
// 转换回API格式再传递给父组件
|
||||
@ -369,7 +368,6 @@ const EvaluateTemplateTable: React.FC<EvaluateTemplateTableProps> = ({
|
||||
|
||||
// 处理输入变化
|
||||
const handleInputChange = (val: any, record: TableRowItem, field: string) => {
|
||||
console.log('handleInputChange', val, record, field);
|
||||
const newData = [...dataSource];
|
||||
const index = newData.findIndex((item) => item.key === record.key);
|
||||
if (index > -1) {
|
||||
|
12
src/components/SupplierDetailModalContext/SupplierDetail.tsx
Normal file
12
src/components/SupplierDetailModalContext/SupplierDetail.tsx
Normal file
@ -0,0 +1,12 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
|
||||
const SupplierDetail = ({ supplierId }: { supplierId: string | null }) => {
|
||||
const [supplierDetail, setSupplierDetail] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
console.log(supplierId);
|
||||
}, [supplierId]);
|
||||
return <div>SupplierDetail</div>;
|
||||
};
|
||||
|
||||
export default SupplierDetail;
|
@ -0,0 +1,25 @@
|
||||
import React, { useState } from 'react';
|
||||
import { Modal } from 'antd';
|
||||
import SupplierDetail from './SupplierDetail';
|
||||
|
||||
const SupplierDetailModalContext = React.createContext<((id: string) => void) | null>(null);
|
||||
export const useSupplierDetailModal = () => React.useContext(SupplierDetailModalContext);
|
||||
|
||||
export const SupplierDetailModalProvider = ({ children }: { children: React.ReactNode }) => {
|
||||
const [visible, setVisible] = useState(false);
|
||||
const [supplierId, setSupplierId] = useState<string | null>(null);
|
||||
|
||||
const showSupplierDetail = (id: string) => {
|
||||
setSupplierId(id);
|
||||
setVisible(true);
|
||||
};
|
||||
|
||||
return (
|
||||
<SupplierDetailModalContext.Provider value={showSupplierDetail}>
|
||||
{children}
|
||||
<Modal visible={visible} onCancel={() => setVisible(false)} footer={null}>
|
||||
<SupplierDetail supplierId={supplierId} />
|
||||
</Modal>
|
||||
</SupplierDetailModalContext.Provider>
|
||||
);
|
||||
};
|
3
src/components/SupplierDetailModalContext/readme.md
Normal file
3
src/components/SupplierDetailModalContext/readme.md
Normal file
@ -0,0 +1,3 @@
|
||||
// 任何页面/组件
|
||||
const showSupplierDetail = useSupplierDetailModal();
|
||||
<span onClick={() => showSupplierDetail(supplier.id)}>{supplier.name}</span>
|
@ -233,6 +233,11 @@ const SupplierSelector: React.FC<SupplierSelectorProps> = ({
|
||||
}));
|
||||
};
|
||||
|
||||
// 显示供应商详情
|
||||
const showSupplierDetail = (record: SupplierItem) => {
|
||||
console.log(record);
|
||||
};
|
||||
|
||||
// 表格列定义
|
||||
const columns = [
|
||||
{
|
||||
@ -240,9 +245,9 @@ const SupplierSelector: React.FC<SupplierSelectorProps> = ({
|
||||
dataIndex: 'supplierName',
|
||||
width: 120,
|
||||
ellipsis: true,
|
||||
render: (supplierName: string) => (
|
||||
render: (supplierName: string, record: SupplierItem) => (
|
||||
<Tooltip placement="topLeft" title={supplierName}>
|
||||
{supplierName}
|
||||
<span onClick={()=>showSupplierDetail(record)}>{supplierName}</span>
|
||||
</Tooltip>
|
||||
),
|
||||
},
|
||||
|
@ -8,8 +8,8 @@ import routes from '../../config/router.config'; // 引入你的自定义路由
|
||||
import { ConfigProvider, Breadcrumb } from 'antd';
|
||||
import HeaderComponent from './Header';
|
||||
import IconFont from '@/components/IconFont/IconFont';
|
||||
import { BreadcrumbState } from '@/models/breadcrumb';
|
||||
|
||||
import type { BreadcrumbState } from '@/models/breadcrumb';
|
||||
import { SupplierDetailModalProvider } from '@/components/SupplierDetailModalContext/SupplierDetailModalContext';
|
||||
|
||||
const MenuRender = (item: any, isSubMenu: boolean) => {
|
||||
const intl = useIntl();
|
||||
@ -35,10 +35,10 @@ const MenuRender = (item: any, isSubMenu: boolean) => {
|
||||
};
|
||||
|
||||
// 递归交集过滤函数
|
||||
function filterMenuByRouter(routes:any, menuRoutes:any) {
|
||||
return routes.reduce((result:any, route:any) => {
|
||||
function filterMenuByRouter(routes: any, menuRoutes: any) {
|
||||
return routes.reduce((result: any, route: any) => {
|
||||
// 只看有 name 的节点
|
||||
const menu = menuRoutes.find(m => m.name === route.name);
|
||||
const menu = menuRoutes.find((m) => m.name === route.name);
|
||||
if (menu) {
|
||||
// 匹配到后,递归处理 children
|
||||
let children = [];
|
||||
@ -56,7 +56,12 @@ function filterMenuByRouter(routes:any, menuRoutes:any) {
|
||||
}, []);
|
||||
}
|
||||
|
||||
const BreadcrumbRender = (routeBreadcrumb: any, intl: any, history: any, dynamicBreadcrumbName: string | null) => {
|
||||
const BreadcrumbRender = (
|
||||
routeBreadcrumb: any,
|
||||
intl: any,
|
||||
history: any,
|
||||
dynamicBreadcrumbName: string | null,
|
||||
) => {
|
||||
const breadcrumbRoutes = routeBreadcrumb?.routes;
|
||||
return (
|
||||
<Breadcrumb>
|
||||
@ -65,22 +70,17 @@ const BreadcrumbRender = (routeBreadcrumb: any, intl: any, history: any, dynamic
|
||||
history.push('/');
|
||||
}}
|
||||
>
|
||||
<span style={{ cursor: 'pointer' }}>
|
||||
{intl.formatMessage({ id: 'menu.首页' })}
|
||||
</span>
|
||||
<span style={{ cursor: 'pointer' }}>{intl.formatMessage({ id: 'menu.首页' })}</span>
|
||||
</Breadcrumb.Item>
|
||||
{breadcrumbRoutes?.map((item: any, index: number) => {
|
||||
// 判断是否是最后一个面包屑项且存在动态名称
|
||||
const isLastItem = index === (breadcrumbRoutes.length - 1);
|
||||
const displayName = (isLastItem && dynamicBreadcrumbName)
|
||||
? dynamicBreadcrumbName
|
||||
: intl.formatMessage({ id: `menu.${item.breadcrumbName}` || '' });
|
||||
const isLastItem = index === breadcrumbRoutes.length - 1;
|
||||
const displayName =
|
||||
isLastItem && dynamicBreadcrumbName
|
||||
? dynamicBreadcrumbName
|
||||
: intl.formatMessage({ id: `menu.${item.breadcrumbName}` || '' });
|
||||
|
||||
return (
|
||||
<Breadcrumb.Item key={item.path}>
|
||||
{displayName}
|
||||
</Breadcrumb.Item>
|
||||
);
|
||||
return <Breadcrumb.Item key={item.path}>{displayName}</Breadcrumb.Item>;
|
||||
})}
|
||||
</Breadcrumb>
|
||||
);
|
||||
@ -106,47 +106,47 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
|
||||
// routes是本地静态路由,menusFromApi是接口菜单
|
||||
const finalMenus = filterMenuByRouter(routes, menusFromApi);
|
||||
console.log(finalMenus);
|
||||
|
||||
|
||||
setMenuRoutes(finalMenus);
|
||||
}
|
||||
}, []);
|
||||
|
||||
|
||||
return (
|
||||
<ConfigProvider>
|
||||
<ProLayout
|
||||
{...defaultSettings}
|
||||
route={{ routes }}
|
||||
// route={{ routes: menuRoutes }}
|
||||
subMenuItemRender={(menuItemProps, defaultDom) => {
|
||||
return MenuRender(menuItemProps, true);
|
||||
}}
|
||||
menuItemRender={(item, dom) => {
|
||||
return MenuRender(item, false);
|
||||
}}
|
||||
location={location}
|
||||
fixSiderbar
|
||||
layout="mix"
|
||||
headerRender={() => {
|
||||
return <HeaderComponent />;
|
||||
}}
|
||||
>
|
||||
<PageContainer
|
||||
ghost={true}
|
||||
header={{
|
||||
title: false,
|
||||
breadcrumbRender: ({ breadcrumb: routeBreadcrumb }) =>
|
||||
BreadcrumbRender(routeBreadcrumb, intl, history, breadcrumb.breadcrumbName),
|
||||
<SupplierDetailModalProvider>
|
||||
<ProLayout
|
||||
{...defaultSettings}
|
||||
route={{ routes }}
|
||||
// route={{ routes: menuRoutes }}
|
||||
subMenuItemRender={(menuItemProps, defaultDom) => {
|
||||
return MenuRender(menuItemProps, true);
|
||||
}}
|
||||
menuItemRender={(item, dom) => {
|
||||
return MenuRender(item, false);
|
||||
}}
|
||||
location={location}
|
||||
fixSiderbar
|
||||
layout="mix"
|
||||
headerRender={() => {
|
||||
return <HeaderComponent />;
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</PageContainer>
|
||||
</ProLayout>
|
||||
<PageContainer
|
||||
ghost={true}
|
||||
header={{
|
||||
title: false,
|
||||
breadcrumbRender: ({ breadcrumb: routeBreadcrumb }) =>
|
||||
BreadcrumbRender(routeBreadcrumb, intl, history, breadcrumb.breadcrumbName),
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</PageContainer>
|
||||
</ProLayout>
|
||||
</SupplierDetailModalProvider>
|
||||
</ConfigProvider>
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ breadcrumb }: { breadcrumb: BreadcrumbState }) => ({
|
||||
breadcrumb
|
||||
breadcrumb,
|
||||
}))(BasicLayout);
|
||||
|
||||
|
@ -203,7 +203,6 @@ const supplierAnnualTaskManage: SupplierTaskModelType = {
|
||||
}
|
||||
// 处理评价人员更新 - 更新后要保留原有对象中的indicatorIds
|
||||
|
||||
console.log(updatedFormData)
|
||||
|
||||
// 保存更新后的表单数据
|
||||
yield put({ type: 'saveTaskFormData', payload: updatedFormData });
|
||||
|
@ -263,7 +263,6 @@ const SupplierTaskModel: SupplierTaskModelType = {
|
||||
if (payload.taskDeptWeightList) {
|
||||
updatedFormData.taskDeptWeightList = payload.taskDeptWeightList;
|
||||
}
|
||||
console.log(updatedFormData)
|
||||
|
||||
// 保存更新后的表单数据
|
||||
yield put({ type: 'saveTaskFormData', payload: updatedFormData });
|
||||
|
@ -310,7 +310,6 @@ const SupplierTemplateManageAdd: React.FC<PageProps> = ({ breadcrumb, dispatch }
|
||||
|
||||
// 处理指标数据变更
|
||||
const handleTemplateDataChange = (data: SupplierTemplateManage.IndicatorSt[]) => {
|
||||
console.log('handleTemplateDataChange', data);
|
||||
setTemplateData(data);
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user