This commit is contained in:
linfeng 2025-03-19 21:33:26 +08:00
parent 57e438efd1
commit e186c77f61
3 changed files with 210 additions and 135 deletions

View File

@ -15,7 +15,7 @@
"@ag-grid-community/react": "~32.3.2", "@ag-grid-community/react": "~32.3.2",
"@ag-grid-enterprise/clipboard": "~32.3.2", "@ag-grid-enterprise/clipboard": "~32.3.2",
"@ag-grid-enterprise/column-tool-panel": "~32.3.2", "@ag-grid-enterprise/column-tool-panel": "~32.3.2",
"@ag-grid-enterprise/core": "~32.3.2", "@ag-grid-enterprise/core": "~32.3.3",
"@ag-grid-enterprise/filter-tool-panel": "~32.3.2", "@ag-grid-enterprise/filter-tool-panel": "~32.3.2",
"@ag-grid-enterprise/master-detail": "~32.3.2", "@ag-grid-enterprise/master-detail": "~32.3.2",
"@ag-grid-enterprise/menu": "~32.3.2", "@ag-grid-enterprise/menu": "~32.3.2",
@ -43,9 +43,10 @@
"@trpc/server": "11.0.0-rc.456", "@trpc/server": "11.0.0-rc.456",
"@types/xlsx": "^0.0.36", "@types/xlsx": "^0.0.36",
"@xyflow/react": "^12.3.6", "@xyflow/react": "^12.3.6",
"ag-grid-community": "~32.3.2", "ag-grid-community": "~32.0.0",
"ag-grid-enterprise": "~32.3.2", "ag-grid-enterprise": "~32.3.2",
"ag-grid-react": "~32.3.2", "ag-grid-react": "~32.3.2",
"ag-grid.i18n.zh-CN.json": "link:ag-grid-community/dist/locale/ag-grid.i18n.zh-CN.json",
"antd": "^5.23.0", "antd": "^5.23.0",
"axios": "^1.7.2", "axios": "^1.7.2",
"browser-image-compression": "^2.0.2", "browser-image-compression": "^2.0.2",

View File

@ -1,21 +1,22 @@
'use client'; 'use client';
import { useState, useEffect, useImperativeHandle, forwardRef } from 'react'; import { useState } from 'react';
import { AgGridReact } from 'ag-grid-react'; import { AgGridReact } from '@ag-grid-community/react';
import { ColDef, ColGroupDef } from 'ag-grid-community'; import { ColDef, ColGroupDef } from '@ag-grid-community/core';
import { api } from '@nice/client'; import { SetFilterModule } from '@ag-grid-enterprise/set-filter';
import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-grid.css';
import 'ag-grid-community/styles/ag-theme-alpine.css'; import 'ag-grid-community/styles/ag-theme-alpine.css';
import { areaOptions } from '@web/src/app/main/staffinformation/area-options'; import { areaOptions } from '@web/src/app/main/staffinformation/area-options';
import type { CascaderProps } from 'antd/es/cascader'; import type { CascaderProps } from 'antd/es/cascader';
import { SetFilterModule } from '@ag-grid-enterprise/set-filter'; import { utils, writeFile } from 'xlsx';
// import { zhCN } from 'ag-grid-community/dist/ag-grid-community'; import { Modal, Input, Button } from 'antd';
import { api } from '@nice/client';
// 修改函数类型定义 // 修改函数类型定义
function getAreaName(codes: string[], level?: number): string { function getAreaName(codes: string[], level?: number): string {
const result: string[] = []; const result: string[] = [];
let currentLevel: CascaderProps['options'] = areaOptions; let currentLevel: CascaderProps['options'] = areaOptions;
for (const code of codes) { for (const code of codes) {
const found = currentLevel?.find(opt => opt.value === code); const found = currentLevel?.find(opt => opt.value === code);
if (!found) break; if (!found) break;
@ -24,116 +25,125 @@ function getAreaName(codes: string[], level?: number): string {
currentLevel = found.children || []; currentLevel = found.children || [];
if (level && result.length >= level) break; // 添加层级控制 if (level && result.length >= level) break; // 添加层级控制
} }
return level ? result[level - 1] || '' : result.join(' / ') || codes.join('/'); return level ? result[level - 1] || '' : result.join(' / ') || codes.join('/');
} }
// 自定义下拉过滤器组件
// interface ICustomFilterProps {
// column: {
// getColId: () => string;
// };
// api: {
// forEachNode: (callback: (node: any) => void) => void;
// };
// filterChangedCallback?: () => void; // 设置为可选属性
// }
// const CustomDropdownFilter = forwardRef((props: ICustomFilterProps, ref) => {
// const [selectedValue, setSelectedValue] = useState<string>('');
// const [uniqueValues, setUniqueValues] = useState<string[]>([]);
// useEffect(() => {
// const colId = props.column.getColId();
// const values = new Set<string>();
// props.api.forEachNode(node => {
// const value = node.data[colId];
// if (value != null) {
// values.add(String(value));
// }
// });
// setUniqueValues(Array.from(values).sort());
// }, [props.api, props.column]);
// useImperativeHandle(ref, () => ({
// isFilterActive: () => !!selectedValue,
// doesFilterPass: (params: any) => {
// const value = String(params.data[props.column.getColId()] || '');
// // 精确匹配选中的值
// return value === selectedValue;
// },
// getModel: () => {
// return selectedValue ? { value: selectedValue } : null;
// },
// setModel: (model: any) => {
// setSelectedValue(model?.value || '');
// }
// }));
// const handleChange = (value: string) => {
// setSelectedValue(value);
// // 立即触发过滤器更新
// if (props.filterChangedCallback) {
// props.filterChangedCallback();
// }
// };
// return (
// <div style={{ padding: '4px', width: '100%' }}>
// <Select
// value={selectedValue}
// onChange={handleChange}
// style={{ width: '100%' }}
// size="small"
// placeholder="选择筛选..."
// allowClear
// options={uniqueValues.map(value => ({
// value: value,
// label: value
// }))}
// onClear={() => handleChange('')}
// />
// </div>
// );
// });
export default function StaffTable() { export default function StaffTable() {
const { data: staffs, isLoading } = api.staff.findMany.useQuery({ const { data: staffs, isLoading } = api.staff.findMany.useQuery({
where: { deletedAt: null }, where: { deletedAt: null },
include: { // 添加关联查询
department: true
}
}); });
const [gridApi, setGridApi] = useState<any>(null); // 添加gridApi状态
const [confirmVisible, setConfirmVisible] = useState(false);
const [fileNameVisible, setFileNameVisible] = useState(false);
const [fileName, setFileName] = useState('');
const [defaultFileName] = useState(`员工数据_${new Date().toISOString().slice(0, 10)}`);
const handleExport = async () => {
setConfirmVisible(true);
};
const handleConfirm = async () => {
setConfirmVisible(false);
setFileNameVisible(true);
};
// 添加导出处理函数
const handleFileNameConfirm = () => {
setFileNameVisible(false)
if (!gridApi) return;
const finalFileName = fileName || defaultFileName;
const flattenColumns = (cols: any[]): any[] => {
return cols.flatMap(col =>
col.children ? flattenColumns(col.children) : col
);
};
const allColDefs = flattenColumns(gridApi.getColumnDefs());
const rowData = gridApi.getRenderedNodes().map((node: any) => {
const row: Record<string, any> = {};
allColDefs.forEach((colDef: any) => {
const field = colDef.field;
if (field) {
const value = node.data[field];
const formatter = colDef.valueFormatter;
const renderer = colDef.cellRenderer;
let renderedValue = value;
if (formatter) {
renderedValue = formatter({ value });
} else if (renderer) {
const renderResult = renderer({ value });
// 改进渲染结果处理
if (typeof renderResult === 'string') {
renderedValue = renderResult;
} else if (renderResult?.props?.children) { // 处理React元素文本内容
renderedValue = String(renderResult.props.children);
} else if (renderResult?.props?.dangerouslySetInnerHTML?.__html) {
const html = renderResult.props.dangerouslySetInnerHTML.__html;
renderedValue = html.replace(/<br\s*\/?>/gi, '\n');
}
}
// 增强布尔值处理逻辑
if (typeof renderedValue === 'boolean' ||
(typeof renderedValue === 'string' && ['true','false'].includes(renderedValue.toLowerCase()))) {
const boolValue = typeof renderedValue === 'boolean' ? renderedValue : renderedValue.toLowerCase() === 'true';
renderedValue = boolValue ? '是' : '否';
}
row[colDef.headerName] = renderedValue;
}
});
return row;
});
// 创建工作表并导出
const ws = utils.json_to_sheet(rowData);
const wb = utils.book_new();
utils.book_append_sheet(wb, ws, "Sheet1");
// 修改导出文件名生成方式
writeFile(wb, `${fileName || '未命名数据'}.xlsx`);
};
const columnDefs: (ColDef | ColGroupDef)[] = [ const columnDefs: (ColDef | ColGroupDef)[] = [
{ {
field: 'username', field: 'username',
headerName: '姓名', headerName: '姓名',
minWidth: 120, minWidth: 120,
pinned: 'left', pinned: 'left',
// floatingFilter: true // 确保启用浮动过滤器 // floatingFilter: true // 确保启用浮动过滤器
}, },
{ {
headerName: '个人基本信息', headerName: '个人基本信息',
children: [ children: [
{ {
field: 'idNumber', field: 'idNumber',
headerName: '身份证号', headerName: '身份证号',
minWidth: 180, minWidth: 180,
}, },
{ {
field: 'type', field: 'type',
headerName: '人员类型', headerName: '人员类型',
minWidth: 120, minWidth: 120,
}, },
{ field: 'officerId', headerName: '警号', minWidth: 120 }, { field: 'officerId', headerName: '警号', minWidth: 120 },
{ field: 'phoneNumber', headerName: '手机号', minWidth: 130 }, { field: 'phoneNumber', headerName: '手机号', minWidth: 130 },
{ field: 'age', headerName: '年龄', minWidth: 80 }, { field: 'age', headerName: '年龄', minWidth: 80 },
{ field: 'sex', headerName: '性别', minWidth: 80, {
cellRenderer: (params: any) => params.value ? '男' : '女' }, field: 'sex', headerName: '性别', minWidth: 80,
cellRenderer: (params: any) => params.value ? '男' : '女'
},
{ field: 'bloodType', headerName: '血型', minWidth: 80 }, { field: 'bloodType', headerName: '血型', minWidth: 80 },
{ {
field: 'birthplace', field: 'birthplace',
headerName: '籍贯', headerName: '籍贯',
minWidth: 200, minWidth: 200,
valueFormatter: (params) => params.value ? getAreaName(params.value.split('/')) : '', valueFormatter: (params) => params.value ? getAreaName(params.value.split('/')) : '',
}, },
@ -150,27 +160,39 @@ export default function StaffTable() {
{ {
headerName: '职务信息', headerName: '职务信息',
children: [ children: [
{field: 'deptId', headerName: '所属部门', minWidth: 200 }, { field: 'department.name', headerName: '所属部门', minWidth: 200 },
{ field: 'rank', headerName: '衔职级别', minWidth: 120 }, { field: 'rank', headerName: '衔职级别', minWidth: 120 },
{ field: 'rankDate', headerName: '衔职时间', minWidth: 120, {
valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : '' }, field: 'rankDate', headerName: '衔职时间', minWidth: 120,
valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : ''
},
{ field: 'proxyPosition', headerName: '代理职务', minWidth: 120 } { field: 'proxyPosition', headerName: '代理职务', minWidth: 120 }
] ]
}, },
{ {
headerName: '入职信息', headerName: '入职信息',
children: [ children: [
{ field: 'hireDate', headerName: '入职时间', minWidth: 120, {
valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : '' }, field: 'hireDate', headerName: '入职时间', minWidth: 120,
{ field: 'seniority', headerName: '工龄认定时间', minWidth: 140, valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : ''
valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : '' }, },
{
field: 'seniority', headerName: '工龄认定时间', minWidth: 140,
valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : ''
},
{ field: 'sourceType', headerName: '来源类型', minWidth: 120 }, { field: 'sourceType', headerName: '来源类型', minWidth: 120 },
{ field: 'isReentry', headerName: '是否二次入职', minWidth: 120, {
cellRenderer: (params: any) => params.value ? '是' : '否' }, field: 'isReentry', headerName: '是否二次入职', minWidth: 120,
{ field: 'isExtended', headerName: '是否延期服役', minWidth: 120, cellRenderer: (params: any) => params.value ? '是' : '否'
cellRenderer: (params: any) => params.value ? '是' : '否' }, },
{ field: 'currentPositionDate', headerName: '现岗位开始时间', minWidth: 140, {
valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : '' } field: 'isExtended', headerName: '是否延期服役', minWidth: 120,
cellRenderer: (params: any) => params.value ? '是' : '否'
},
{
field: 'currentPositionDate', headerName: '现岗位开始时间', minWidth: 140,
valueFormatter: (params: any) => params.value ? new Date(params.value).toLocaleDateString() : ''
}
] ]
}, },
{ {
@ -178,8 +200,10 @@ export default function StaffTable() {
children: [ children: [
{ field: 'education', headerName: '学历', minWidth: 100 }, { field: 'education', headerName: '学历', minWidth: 100 },
{ field: 'educationType', headerName: '学历形式', minWidth: 120 }, { field: 'educationType', headerName: '学历形式', minWidth: 120 },
{ field: 'isGraduated', headerName: '是否毕业', minWidth: 100, {
cellRenderer: (params: any) => params.value ? '是' : '否' }, field: 'isGraduated', headerName: '是否毕业', minWidth: 100,
cellRenderer: (params: any) => params.value ? '是' : '否'
},
{ field: 'major', headerName: '专业', minWidth: 150 }, { field: 'major', headerName: '专业', minWidth: 150 },
{ field: 'foreignLang', headerName: '外语能力', minWidth: 120 } { field: 'foreignLang', headerName: '外语能力', minWidth: 120 }
] ]
@ -190,8 +214,10 @@ export default function StaffTable() {
{ field: 'trainType', headerName: '培训类型', minWidth: 120 }, { field: 'trainType', headerName: '培训类型', minWidth: 120 },
{ field: 'trainInstitute', headerName: '培训机构', minWidth: 150 }, { field: 'trainInstitute', headerName: '培训机构', minWidth: 150 },
{ field: 'trainMajor', headerName: '培训专业', minWidth: 150 }, { field: 'trainMajor', headerName: '培训专业', minWidth: 150 },
{ field: 'hasTrain', headerName: '是否参加培训', minWidth: 120, {
cellRenderer: (params: any) => params.value ? '是' : '否' } field: 'hasTrain', headerName: '是否参加培训', minWidth: 120,
cellRenderer: (params: any) => params.value ? '是' : '否'
}
] ]
}, },
{ {
@ -199,31 +225,33 @@ export default function StaffTable() {
children: [ children: [
{ field: 'certRank', headerName: '鉴定等级', minWidth: 120 }, { field: 'certRank', headerName: '鉴定等级', minWidth: 120 },
{ field: 'certWork', headerName: '鉴定工种', minWidth: 120 }, { field: 'certWork', headerName: '鉴定工种', minWidth: 120 },
{ field: 'hasCert', headerName: '是否参加鉴定', minWidth: 120, {
cellRenderer: (params: any) => params.value ? '是' : '否' } field: 'hasCert', headerName: '是否参加鉴定', minWidth: 120,
cellRenderer: (params: any) => params.value ? '是' : '否'
}
] ]
}, },
{ {
headerName: '工作信息', headerName: '工作信息',
children: [ children: [
{ {
field: 'equipment', field: 'equipment',
headerName: '操作维护装备', headerName: '操作维护装备',
minWidth: 150, minWidth: 150,
cellRenderer: (params: any) => ( cellRenderer: (params: any) => (
<div <div
style={{ lineHeight: '24px' }} style={{ lineHeight: '24px' }}
dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }} dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }}
/> />
), ),
autoHeight: true autoHeight: true
}, },
{ {
field: 'projects', field: 'projects',
headerName: '演训任务经历', headerName: '演训任务经历',
minWidth: 150, minWidth: 150,
cellRenderer: (params: any) => ( cellRenderer: (params: any) => (
<div <div
style={{ lineHeight: '24px' }} style={{ lineHeight: '24px' }}
dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }} dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }}
/> />
@ -231,24 +259,24 @@ export default function StaffTable() {
autoHeight: true autoHeight: true
}, },
// 修改剩余两个字段的cellRenderer为相同结构 // 修改剩余两个字段的cellRenderer为相同结构
{ {
field: 'awards', field: 'awards',
headerName: '奖励信息', headerName: '奖励信息',
minWidth: 150, minWidth: 150,
cellRenderer: (params: any) => ( cellRenderer: (params: any) => (
<div <div
style={{ lineHeight: '24px' }} style={{ lineHeight: '24px' }}
dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }} dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }}
/> />
), ),
autoHeight: true autoHeight: true
}, },
{ {
field: 'punishments', field: 'punishments',
headerName: '处分信息', headerName: '处分信息',
minWidth: 150, minWidth: 150,
cellRenderer: (params: any) => ( cellRenderer: (params: any) => (
<div <div
style={{ lineHeight: '24px' }} style={{ lineHeight: '24px' }}
dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }} dangerouslySetInnerHTML={{ __html: params.value?.replace(/,/g, '<br/>') || '' }}
/> />
@ -259,21 +287,19 @@ export default function StaffTable() {
} }
]; ];
const defaultColDef: ColDef = { const defaultColDef: ColDef = {
sortable: true, sortable: true,
filter: 'agSetColumnFilter', filter: 'agSetColumnFilter',
// floatingFilter: true,
resizable: false, resizable: false,
flex: 1, flex: 1,
minWidth: 150, minWidth: 150,
maxWidth: 600, maxWidth: 600,
suppressMovable: true, suppressMovable: true,
cellStyle: { cellStyle: {
whiteSpace: 'normal', whiteSpace: 'normal',
overflowWrap: 'break-word' overflowWrap: 'break-word'
}, },
tooltipValueGetter: (params: any) => params.value,
wrapText: true, wrapText: true,
autoHeight: true autoHeight: true
}; };
@ -283,10 +309,43 @@ export default function StaffTable() {
style={{ style={{
width: '100%', width: '100%',
borderRadius: '12px', borderRadius: '12px',
overflow: 'hidden',
boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)' boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)'
}} }}
> >
{!isLoading && (
<Button
onClick={handleExport}
className="mb-2 bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600"
>
Excel
</Button>
)}
<Modal
title="确认导出"
open={confirmVisible}
onOk={handleConfirm}
onCancel={() => setConfirmVisible(false)}
okText="确认"
cancelText="取消"
>
<p></p>
</Modal>
<Modal
title="输入文件名"
open={fileNameVisible}
onOk={handleFileNameConfirm}
onCancel={() => setFileNameVisible(false)}
okText="导出"
cancelText="取消"
>
<Input
placeholder={`默认名称: ${defaultFileName}`}
value={fileName}
onChange={(e) => setFileName(e.target.value)}
/>
</Modal>
{isLoading ? ( {isLoading ? (
<div className="h-full flex items-center justify-center"> <div className="h-full flex items-center justify-center">
<div className="text-gray-600 text-xl">...</div> <div className="text-gray-600 text-xl">...</div>
@ -294,6 +353,7 @@ export default function StaffTable() {
) : ( ) : (
<AgGridReact <AgGridReact
modules={[SetFilterModule]} modules={[SetFilterModule]}
onGridReady={(params) => setGridApi(params.api)} // 添加gridApi回调
rowData={staffs} rowData={staffs}
columnDefs={columnDefs} columnDefs={columnDefs}
defaultColDef={{ defaultColDef={{
@ -302,7 +362,6 @@ export default function StaffTable() {
textCustomComparator: (_, value) => value !== '', textCustomComparator: (_, value) => value !== '',
} }
}} }}
// localeText={zhCN} // 注入中文语言包
enableCellTextSelection={true} enableCellTextSelection={true}
pagination={true} pagination={true}
paginationAutoPageSize={true} paginationAutoPageSize={true}

View File

@ -240,7 +240,7 @@ importers:
specifier: ~32.3.2 specifier: ~32.3.2
version: 32.3.3 version: 32.3.3
'@ag-grid-enterprise/core': '@ag-grid-enterprise/core':
specifier: ~32.3.2 specifier: ~32.3.3
version: 32.3.3 version: 32.3.3
'@ag-grid-enterprise/filter-tool-panel': '@ag-grid-enterprise/filter-tool-panel':
specifier: ~32.3.2 specifier: ~32.3.2
@ -324,14 +324,17 @@ importers:
specifier: ^12.3.6 specifier: ^12.3.6
version: 12.3.6(@types/react@18.2.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) version: 12.3.6(@types/react@18.2.38)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
ag-grid-community: ag-grid-community:
specifier: ~32.3.2 specifier: ~32.0.0
version: 32.3.3 version: 32.0.0
ag-grid-enterprise: ag-grid-enterprise:
specifier: ~32.3.2 specifier: ~32.3.2
version: 32.3.3 version: 32.3.3
ag-grid-react: ag-grid-react:
specifier: ~32.3.2 specifier: ~32.3.2
version: 32.3.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) version: 32.3.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
ag-grid.i18n.zh-CN.json:
specifier: link:ag-grid-community/dist/locale/ag-grid.i18n.zh-CN.json
version: link:ag-grid-community/dist/locale/ag-grid.i18n.zh-CN.json
antd: antd:
specifier: ^5.23.0 specifier: ^5.23.0
version: 5.23.0(date-fns@2.30.0)(luxon@3.5.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) version: 5.23.0(date-fns@2.30.0)(luxon@3.5.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@ -3512,9 +3515,15 @@ packages:
ag-charts-locale@10.3.3: ag-charts-locale@10.3.3:
resolution: {integrity: sha512-+ZAQYhkFHbdEwLYP1jZeF44X/8wwSH6SNiTykEIIk6EUuP6mm45X2YfQ0bvyekTkEJlLvFspvRQ+C6mspwLx4w==} resolution: {integrity: sha512-+ZAQYhkFHbdEwLYP1jZeF44X/8wwSH6SNiTykEIIk6EUuP6mm45X2YfQ0bvyekTkEJlLvFspvRQ+C6mspwLx4w==}
ag-charts-types@10.0.0:
resolution: {integrity: sha512-jjiwrzydERou4yp9WHiJeVK237B7BUP3/4j6tdycyHag266YVWa/BMNtTOThWJKGku+m+TC2qfaujLYixgcbrQ==}
ag-charts-types@10.3.3: ag-charts-types@10.3.3:
resolution: {integrity: sha512-8rmyquaTkwfP4Lzei/W/cbkq9wwEl8+grIo3z97mtxrMIXh9sHJK1oJipd/u08MmBZrca5Jjtn5F1+UNPu/4fQ==} resolution: {integrity: sha512-8rmyquaTkwfP4Lzei/W/cbkq9wwEl8+grIo3z97mtxrMIXh9sHJK1oJipd/u08MmBZrca5Jjtn5F1+UNPu/4fQ==}
ag-grid-community@32.0.0:
resolution: {integrity: sha512-H0I19/+SXTP/uMeG58nlm/Fj1rMKlX6mnbMW+MrfJ+e0/aguOtrOG+UGOn8f3CTmSwjOIQquCmu3gK8hBMqgtQ==}
ag-grid-community@32.3.3: ag-grid-community@32.3.3:
resolution: {integrity: sha512-KhSJ3B6mwRFA4cLjNjOZkDndJBh8o83794ZHl4Q7xP9MJf43oCN9qoZ8pyBanohgpVfLcP0scYYCr9xIlzjdiA==} resolution: {integrity: sha512-KhSJ3B6mwRFA4cLjNjOZkDndJBh8o83794ZHl4Q7xP9MJf43oCN9qoZ8pyBanohgpVfLcP0scYYCr9xIlzjdiA==}
@ -11245,8 +11254,14 @@ snapshots:
ag-charts-locale@10.3.3: {} ag-charts-locale@10.3.3: {}
ag-charts-types@10.0.0: {}
ag-charts-types@10.3.3: {} ag-charts-types@10.3.3: {}
ag-grid-community@32.0.0:
dependencies:
ag-charts-types: 10.0.0
ag-grid-community@32.3.3: ag-grid-community@32.3.3:
dependencies: dependencies:
ag-charts-types: 10.3.3 ag-charts-types: 10.3.3