diff --git a/.vscode/settings.json b/.vscode/settings.json index a2c76e4..d955e5f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "marscode.chatLanguage": "cn" + "marscode.chatLanguage": "cn", + "marscode.codeCompletionPro": { + "enableCodeCompletionPro": true + } } \ No newline at end of file diff --git a/apps/server/src/auth/auth.controller.ts b/apps/server/src/auth/auth.controller.ts index 490e25e..7b78c5f 100755 --- a/apps/server/src/auth/auth.controller.ts +++ b/apps/server/src/auth/auth.controller.ts @@ -14,6 +14,7 @@ import { UnauthorizedException, Logger, } from '@nestjs/common'; +import { Request } from '@nestjs/common'; import { AuthService } from './auth.service'; import { AuthSchema, JwtPayload } from '@nice/common'; import { AuthGuard } from './auth.guard'; diff --git a/apps/server/src/models/staff/staff.controller.ts b/apps/server/src/models/staff/staff.controller.ts index 7a590e9..7e29040 100755 --- a/apps/server/src/models/staff/staff.controller.ts +++ b/apps/server/src/models/staff/staff.controller.ts @@ -27,11 +27,14 @@ export class StaffController { } @Get('find-by-dept') async findByDept( - @Query('dept-id') deptId: string, + @Query('dept-id') deptId: string | null, @Query('domain-id') domainId: string, ) { try { - const result = await this.staffService.findByDept({ deptId, domainId }); + const result = await this.staffService.findByDept({ + deptId: deptId || null, + domainId: domainId, + }); return { data: result, errmsg: 'success', diff --git a/apps/server/src/models/staff/staff.service.ts b/apps/server/src/models/staff/staff.service.ts index 9ebbf7b..3f1b459 100755 --- a/apps/server/src/models/staff/staff.service.ts +++ b/apps/server/src/models/staff/staff.service.ts @@ -72,6 +72,8 @@ const StaffSelect = { @Injectable() export class StaffService extends BaseService { + //索引 + [x: string]: any; constructor(private readonly departmentService: DepartmentService) { super(db, ObjectType.STAFF, true); } @@ -83,7 +85,7 @@ export class StaffService extends BaseService { async findByDept(data: z.infer) { const { deptId, domainId } = data; const childDepts = await this.departmentService.getDescendantIds( - deptId, + deptId || null, true, ); const result = await db.staff.findMany({ diff --git a/apps/server/src/models/train-situation/trainSituation.router.ts b/apps/server/src/models/train-situation/trainSituation.router.ts index 9cad9e1..a76c5d9 100644 --- a/apps/server/src/models/train-situation/trainSituation.router.ts +++ b/apps/server/src/models/train-situation/trainSituation.router.ts @@ -39,6 +39,7 @@ export class TrainSituationRouter { deptId: z.string().optional(), domainId: z.string().optional(), trainContentId: z.string().optional(), + date: z.string().optional(), }), ) .query(async ({ input }) => { diff --git a/apps/server/src/models/train-situation/trainSituation.service.ts b/apps/server/src/models/train-situation/trainSituation.service.ts index 795a844..9e4c2c5 100644 --- a/apps/server/src/models/train-situation/trainSituation.service.ts +++ b/apps/server/src/models/train-situation/trainSituation.service.ts @@ -18,13 +18,13 @@ export class TrainSituationService extends BaseService { - const staffs = await this.staffService.findByDept({ - deptId: args.deptId, - domainId: args.domainId, - }); + const { deptId, domainId, trainContentId, date } = params; + + // 构建查询条件 + const where: Prisma.TrainSituationWhereInput = {}; + + if (deptId) { + const staffs = await this.staffService.findManyByDeptId(deptId); + where.staffId = { in: staffs.map((s) => s.id) }; + } + + if (trainContentId) { + where.trainContentId = trainContentId; + } + + // 添加日期过滤条件 + if (date) { + // 创建日期的开始时间(当天的00:00:00) + const startDate = new Date(date); + startDate.setHours(0, 0, 0, 0); + + // 创建日期的结束时间(当天的23:59:59.999) + const endDate = new Date(date); + endDate.setHours(23, 59, 59, 999); + + // 设置createdAt字段在指定的日期范围内 + where.createdAt = { + gte: startDate, + lte: endDate, + }; + + // 日志输出,方便调试 + console.log( + `Filtering train situations between ${startDate.toISOString()} and ${endDate.toISOString()}`, + ); + } + + // 查询结果并包含关联数据 const result = await super.findMany({ - where: { - staffId: { - in: staffs.map((staff) => staff.id), + where, + include: { + staff: { + include: { + department: true, + position: true, + }, }, - ...(args.trainContentId ? { trainContentId: args.trainContentId } : {}), + trainContent: true, + }, + orderBy: { + createdAt: 'desc', // 按创建时间倒序排列,最新的记录在前 }, }); return result; diff --git a/apps/web/src/App.css b/apps/web/src/App.css index f309ab4..32a298f 100755 --- a/apps/web/src/App.css +++ b/apps/web/src/App.css @@ -1,42 +1,77 @@ .ag-theme-alpine { - --ag-primary-color: var(--color-primary); - --ag-alpine-active-color: var(--color-primary); - --ag-background-color: var(--color-bg-container); - --ag-foreground-color: var(--colorText); - --ag-borders-critical: solid 1px; - --ag-critical-border-color: var(--color-border-secondary); - --ag-borders: 1px solid; - --ag-borders-input: solid 1px; - --ag-border-color: var(--color-border-secondary); - --ag-secondary-border-color: var(--color-border-secondary); - --ag-secondary-foreground-color: var(--color-text-tertiary); - /* --ag-border-radius: 2px; */ - --ag-header-column-separator-display: block; - --ag-header-column-separator-height: 30%; - --ag-header-column-separator-width: 2px; - --ag-header-column-separator-color: var(--color-fill-secondary); - --ag-font-size: var(--fontSize); - --ag-header-background-color: white; - --ag-selected-row-background-color: var(--color-border-primary); - --ag-range-selection-border-color: var(--color-border-primary); - --ag-header-font-size: var(--fontSize); - --ag-header-font-weight: 600; - --ag-header-foreground-color: var(--color-primary); - --ag-row-border-style: solid; - --ag-row-border-width: 1px; - --ag-row-border-color: var(--color-border-secondary); - --ag-row-hover-color: var(--color-bg-text-hover); - --ag-padding-horizontal: 0.7rem; - --ag-padding-vertical: 0.9rem; - --ag-side-panel-border-width: 1px; - --ag-side-panel-border-color: var(--color-border-secondary); - --ag-spacing: 6px; - --ag-odd-row-background-color: var(--color-fill-quaternary); - --ag-wrapper-border-width: 0px; - /* --ag-wrapper-border-color: var(--color-border-secondary); */ - /* --ag-wrapper-border-radius: 10px; */ + --ag-primary-color: var(--color-primary); + --ag-alpine-active-color: var(--color-primary); + --ag-background-color: var(--color-bg-container); + --ag-foreground-color: var(--colorText); + --ag-borders-critical: solid 1px; + --ag-critical-border-color: var(--color-border-secondary); + --ag-borders: 1px solid; + --ag-borders-input: solid 1px; + --ag-border-color: var(--color-border-secondary); + --ag-secondary-border-color: var(--color-border-secondary); + --ag-secondary-foreground-color: var(--color-text-tertiary); + /* --ag-border-radius: 2px; */ + --ag-header-column-separator-display: block; + --ag-header-column-separator-height: 30%; + --ag-header-column-separator-width: 2px; + --ag-header-column-separator-color: var(--color-fill-secondary); + --ag-font-size: var(--fontSize); + --ag-header-background-color: white; + --ag-selected-row-background-color: var(--color-border-primary); + --ag-range-selection-border-color: var(--color-border-primary); + --ag-header-font-size: var(--fontSize); + --ag-header-font-weight: 600; + --ag-header-foreground-color: var(--color-primary); + --ag-row-border-style: solid; + --ag-row-border-width: 1px; + --ag-row-border-color: var(--color-border-secondary); + --ag-row-hover-color: var(--color-bg-text-hover); + --ag-padding-horizontal: 0.7rem; + --ag-padding-vertical: 0.9rem; + --ag-side-panel-border-width: 1px; + --ag-side-panel-border-color: var(--color-border-secondary); + --ag-spacing: 6px; + --ag-odd-row-background-color: var(--color-fill-quaternary); + --ag-wrapper-border-width: 0px; + /* --ag-wrapper-border-color: var(--color-border-secondary); */ + /* --ag-wrapper-border-radius: 10px; */ } .ag-root-wrapper { - border: 0px; -} \ No newline at end of file + border: 0px; +} +.assessment-standard-table .ant-table { + border: 1px solid #e5e7eb; +} + +.assessment-standard-table .ant-table-thead > tr > th { + background-color: #f9fafb; + font-weight: 500; + color: #374151; + text-align: center; + padding: 12px 8px; + border: 1px solid #e5e7eb; +} + +.assessment-standard-table .ant-table-tbody > tr > td { + text-align: center; + padding: 12px 8px; + border: 1px solid #e5e7eb; +} + +.assessment-standard-table .ant-table-tbody > tr:hover > td { + background-color: #f9fafb; +} + +.assessment-standard-table .ant-input { + text-align: center; + border: 1px solid #d1d5db; + border-radius: 4px; + padding: 4px 8px; + width: 80px; +} + +.assessment-standard-table .ant-input:focus { + border-color: #9ca3af; + box-shadow: none; +} diff --git a/apps/web/src/app/admin/assessmentstandard/assessment-modal.tsx b/apps/web/src/app/admin/assessmentstandard/assessment-modal.tsx index 150772a..ee1692a 100644 --- a/apps/web/src/app/admin/assessmentstandard/assessment-modal.tsx +++ b/apps/web/src/app/admin/assessmentstandard/assessment-modal.tsx @@ -6,7 +6,7 @@ export default function AssessmentModal() {
@@ -19,10 +19,9 @@ export default function AssessmentModal() { - diff --git a/apps/web/src/app/admin/assessmentstandard/assessment-standard-provider.tsx b/apps/web/src/app/admin/assessmentstandard/assessment-standard-provider.tsx index f035184..555dd7f 100644 --- a/apps/web/src/app/admin/assessmentstandard/assessment-standard-provider.tsx +++ b/apps/web/src/app/admin/assessmentstandard/assessment-standard-provider.tsx @@ -57,7 +57,6 @@ export function AssessmentStandardProvider({ children }: AssessmentStandardProvi const showAgeModal = () => { setIsAgeModalVisible(true); }; - // 处理年龄范围模态框确定 const handleAgeOk = (values: any) => { console.log('values',values) @@ -68,10 +67,8 @@ export function AssessmentStandardProvider({ children }: AssessmentStandardProvi label: end ? `${start}-${end}岁` : `${start}岁以上`, }; setAgeRanges([...ageRanges, newRange]); - setIsAgeModalVisible(false); }; - // 处理年龄范围模态框取消 const handleAgeCancel = () => { setIsAgeModalVisible(false); @@ -81,7 +78,6 @@ export function AssessmentStandardProvider({ children }: AssessmentStandardProvi const showScoreModal = () => { setIsScoreModalVisible(true); }; - // 处理分数标准模态框确定 const handleScoreOk = async (values: any) => { const { score, standards } = values; diff --git a/apps/web/src/app/admin/assessmentstandard/sport-create-content.tsx b/apps/web/src/app/admin/assessmentstandard/sport-create-content.tsx index 11584af..fa2ede9 100644 --- a/apps/web/src/app/admin/assessmentstandard/sport-create-content.tsx +++ b/apps/web/src/app/admin/assessmentstandard/sport-create-content.tsx @@ -1,9 +1,9 @@ -import { Button, Form, Input, Select, Skeleton } from "antd"; +import { Button, Form, Input, Select, Skeleton, Pagination } from "antd"; import { useAssessmentStandardContext } from "./assessment-standard-provider"; import { api, useSport } from "@nice/client"; import toast from "react-hot-toast"; -import create from "@ant-design/icons/lib/components/IconFont"; - +import { useState } from 'react'; +const { Search } = Input; export default function SportCreateContent() { const { form, sportProjectList, sportProjectLoading } = useAssessmentStandardContext(); const { createSportProject, softDeleteByIds } = useSport(); @@ -13,6 +13,9 @@ export default function SportCreateContent() { title: "体能考核" } }) + const [searchValue, setSearchValue] = useState(''); + const [currentPage, setCurrentPage] = useState(1); + const [pageSize, setPageSize] = useState(10); const handleCreateProject = async () => { if (form.getFieldsValue().createProjectName && form.getFieldsValue().unit) { await createSportProject.mutateAsync({ @@ -37,16 +40,20 @@ export default function SportCreateContent() { } } const handleDeleteProject = async (id: string) => { - console.log(id) + // console.log(id) await softDeleteByIds.mutateAsync({ ids: [id] } as any) toast.success("删除项目成功") } + const handleSearch = (value) => { + setSearchValue(value); + setCurrentPage(1); + }; return ( <>
-
+
@@ -64,16 +71,48 @@ export default function SportCreateContent() {
{sportProjectLoading ? : -
+
{sportProjectList?.filter(item=>item.deletedAt === null)?.map((item) => ( -
-
{item.name}({item.unit})
- handleDeleteProject(item.id)}>删除 +
+
+ +
+ {item.name} + ({item.unit}) +
+
+
))}
} + {/* { + if (!e.target.value) { + setSearchValue(''); + setCurrentPage(1); + } else { + setSearchValue(e.target.value); + } + }} + onSearch={handleSearch} + style={{ width: 200 }} + /> */} ) } \ No newline at end of file diff --git a/apps/web/src/app/admin/assessmentstandard/standard-create-content.tsx b/apps/web/src/app/admin/assessmentstandard/standard-create-content.tsx index c193166..0dd3ef3 100644 --- a/apps/web/src/app/admin/assessmentstandard/standard-create-content.tsx +++ b/apps/web/src/app/admin/assessmentstandard/standard-create-content.tsx @@ -3,6 +3,7 @@ import { useAssessmentStandardContext } from "./assessment-standard-provider"; import toast from "react-hot-toast"; import { api, useSport } from "@nice/client"; import { useEffect, useMemo } from "react"; +import '../../../App.css' export default function StandardCreateContent() { const {form,sportProjectList,ageRanges,records,showAgeModal,showScoreModal,setRecords,setAgeRanges,isStandardCreate,setIsStandardCreate} = useAssessmentStandardContext(); const { createSportStandard,updateSportStandard } = useSport(); @@ -28,6 +29,9 @@ export default function StandardCreateContent() { dataIndex: 'score', key: 'score', width: 100, + render: (score: number) => ( + {score} + ) }, ...ageRanges.map((range, index) => ({ title: range.label, @@ -35,7 +39,6 @@ export default function StandardCreateContent() { key: `standard[${index}]`, render: (_: any, record: any) => ( { const inputValue = e.target.value; @@ -113,10 +116,8 @@ export default function StandardCreateContent() { setRecords(records) } }, [data]) - return (
- - ({ + label: `${staff.showname || staff.username || '未知'} ${staff.positionId || '无职务'})}`, + value: staff.id + }))} + /> + + {/* + + */} + + + handleSearch(e.target.value)} + className="pl-10 w-full border" + /> + +
+ +
+ + +
+
+ + + ); +} \ No newline at end of file diff --git a/apps/web/src/app/main/daily/DailyTable.tsx b/apps/web/src/app/main/daily/DailyTable.tsx new file mode 100644 index 0000000..d6e3018 --- /dev/null +++ b/apps/web/src/app/main/daily/DailyTable.tsx @@ -0,0 +1,143 @@ +import { Button, Table, Modal } from "antd"; +import { api } from "@nice/client"; +import { useMainContext } from "../layout/MainProvider"; +import dayjs from "dayjs"; +import { useState } from "react"; + + +// 定义 editRecord 的类型接口 +interface EditRecord { + id: string; + staffId?: string; + staffName?: string; + position?: string; + trainContentId?: string; + content?: string; + isPresent: boolean; +} + +export default function DailyTable() { + const { form, setVisible, searchValue, formValue } = useMainContext(); + const [editingRecord, setEditingRecord] = useState(null); + const { data: trainSituations, isLoading, refetch } = + api.trainSituation.findMany.useQuery({ + where: { + ...(searchValue ? { + staff: { + showname: { + contains: searchValue + } + } + } : {}) + }, + include: { + staff: { + include: { + position: true, + department: true + } + }, + trainContent: true, + + } + }); + // console.log('data', trainSituations); + + // 基于日期过滤数据(如果后端不支持日期过滤) + const filteredTrainSituations = trainSituations?.filter(situation => { + // 检查是否有日期条件 + if (!formValue.date) return true; + + // 将记录日期转换为YYYY-MM-DD格式 + const situationDate = dayjs(situation.createdAt).format('YYYY-MM-DD'); + return situationDate === formValue.date; + }) || []; + + + const columns = [ + { + title: "人员姓名", + dataIndex: ["staff", "showname"], + key: "showname", + render: (name, record) => name || record.staff?.showname || "未知" + }, + { + title: "单位", + dataIndex: ["staff", "department", "name"], + key: "dept", + render: (name) => name || "未知单位" + }, + { + title: "职务", + dataIndex: ["staff", "position", "type"], + key: "position", + render: (type, record) => type || "无职务" + }, + { + title: "训练内容", + dataIndex: ["trainContent", "title"], + key: "trainContent", + render: (title, record) => title || record.value || "未知内容" + }, + { + title: "在位情况", + dataIndex: "alreadyTrainTime", + key: "isPresent", + render: (alreadyTrainTime) => alreadyTrainTime > 0 ? "在位" : "不在位" + }, + { + title: "操作", + key: "action", + render: (_, record) => ( +
+ +
+ ), + } + ]; + + const handleEdit = (record: any) => { + console.log(record); + + const editRecord: EditRecord = { + id: record.id, + staffId: record.staff?.id, + staffName: record.staff?.showname, + position: record.staff?.position?.type, + trainContentId: record.trainContent?.id, + content: record.value, + isPresent: record.alreadyTrainTime > 0, + }; + + setEditingRecord(editRecord); + form.setFieldsValue(editRecord); + setVisible(true); + refetch(); + }; + + return ( + <> + {isLoading ? ( +
加载中...
+ ) : ( + + )} + + ); +} \ No newline at end of file diff --git a/apps/web/src/app/main/daily/dailytable/page.tsx b/apps/web/src/app/main/daily/dailytable/page.tsx new file mode 100644 index 0000000..3283a34 --- /dev/null +++ b/apps/web/src/app/main/daily/dailytable/page.tsx @@ -0,0 +1,6 @@ +import React from 'react'; +import { Button, Table, Modal } from "antd"; +import { api } from "@nice/client"; +import { useEffect, useState } from "react"; +import toast from "react-hot-toast"; +import dayjs from "dayjs"; \ No newline at end of file diff --git a/apps/web/src/app/main/daily/page.tsx b/apps/web/src/app/main/daily/page.tsx index 1c5ac4e..bc846e0 100644 --- a/apps/web/src/app/main/daily/page.tsx +++ b/apps/web/src/app/main/daily/page.tsx @@ -1,10 +1,78 @@ -import DailyContext from "@web/src/components/models/trainPlan/TrainPlanContext"; -import DailyLayout from "@web/src/components/models/trainPlan/TrainPlanLayout"; +import { MagnifyingGlassIcon } from "@heroicons/react/24/outline"; +import { Button, Form, Input, DatePicker } from "antd"; +import { useCallback, useEffect } from "react"; +import _ from "lodash"; +import { useMainContext } from "../layout/MainProvider"; +import DailyTable from "./DailyTable"; +import DailyModal from "./DailyModal"; +import dayjs from "dayjs"; -export default function DailyPage(){ - return <> - - - - +export default function DailyReport() { + const { form, formValue, setFormValue, setVisible, setSearchValue, editingRecord } = useMainContext(); + + useEffect(() => { + setFormValue({ + staffId: "", + trainContentId: "", + content: "", + isPresent: true, + date: dayjs().format('YYYY-MM-DD') + }); + }, []); + + const handleNew = () => { + form.setFieldsValue(formValue); + setVisible(true); + }; + + const handleSearch = useCallback( + _.debounce((value: string) => { + setSearchValue(value); + }, 500), + [] + ); + + const handleDateChange = (date) => { + if (!date) return; + // 更新当前选择的日期 + const newFormValue = { ...formValue, date: date.format('YYYY-MM-DD') }; + setFormValue(newFormValue); + }; + + return ( +
+
+
+
+
+
每日训练填报
+ +
+ handleSearch(e.target.value)} + className="pl-10 w-full border" + /> + +
+ +
+ + +
+
+ +
+ ); } \ No newline at end of file diff --git a/apps/web/src/app/main/home/page.tsx b/apps/web/src/app/main/home/page.tsx index 8fe2638..344592d 100755 --- a/apps/web/src/app/main/home/page.tsx +++ b/apps/web/src/app/main/home/page.tsx @@ -1,34 +1,642 @@ -import { Button } from "antd" -import { api } from "@nice/client" -import React from "react" -import { useSport } from "@nice/client" -export default function Dashboard() { - const { createSportStandard } = useSport() - const handleCreateSportStandard = async () => { - const res = await createSportStandard.mutateAsync({ - data: { - projectId: "cm8o6jzp908bp846bv513aqvo", - gender: true, - personType: "STAFF", - ageRanges: [ - { start: null, end: 24, label: "24岁以下" }, - { start: 24, end: 27, label: "25-27岁" }, - { start: 27, end: 30, label: "28-30岁" }, - { start: 30, end: null, label: "30岁以上" } - ], - scoreTable: { - "100": [85, 81, 79, 77], - "95": [74, 70, 68, 66], - "90": [65, 61, 59, 57] +import React, { useState } from 'react'; +import { Card, Row, Col, Divider } from 'antd'; +import ReactEcharts from 'echarts-for-react'; + +const Dashboard = () => { + // 在这里获取你的项目数据 + const [data, setData] = useState({ + projectInfo: { + name: '训练管理系统', + type: '软件开发', + status: '进行中', + department: '技术研发中心', + client: '软件小组', + supervisor: '项目监理公司', + contractor: '开发团队', + planStartDate: '2023-10-01', + planEndDate: '2024-03-31', + actualStartDate: '2023-10-05', + actualEndDate: '待定' + }, + attendance: { + personnel: { present: 15, absent: 5, leave: 2 } + }, + training: { + // 参训内容数据 + contents: [ + { value: 8, name: '岗位训练' }, + { value: 6, name: '共同科目' }, + { value: 4, name: '通用四项' }, + { value: 2, name: '其他' } + ], + // 参训时长数据 + hours: [ + { value: 25, name: '已完成' }, + { value: 10, name: '进行中' }, + { value: 5, name: '未开始' } + ] + }, + materials: { + planned: [10, 15, 20], + actual: [5, 8, 12] + } + }); + + // 人员出勤率图表配置 - 优化样式 + const personnelAttendanceOption = { + tooltip: { + trigger: 'item', + backgroundColor: 'rgba(0,21,41,0.8)', + borderColor: 'rgba(32,120,160,0.8)', + textStyle: { color: '#fff' }, + formatter: '{a}
{b}: {c}人 ({d}%)' + }, + legend: { + orient: 'vertical', + right: 10, + top: 'center', + icon: 'circle', + itemWidth: 8, + itemHeight: 8, + textStyle: { color: '#fff', fontSize: 14 } + }, + series: [{ + name: '人员出勤率', + type: 'pie', + radius: ['50%', '70%'], + center: ['35%', '50%'], + avoidLabelOverlap: true, + itemStyle: { + borderRadius: 0, + borderWidth: 1, + borderColor: 'rgba(32,120,160,0.8)', + }, + label: { + show: true, + position: 'inside', + formatter: '{d}%', + fontSize: 10, + color: '#fff', + }, + labelLine: { + show: false + }, + emphasis: { + label: { + show: true, + fontSize: 12, + fontWeight: 'bold' + } + }, + data: [ + { + value: data.attendance.personnel.present, + name: '在位', + itemStyle: { color: '#3DD598' } + }, + { + value: data.attendance.personnel.absent, + name: '不在位', + itemStyle: { color: '#FFB076' } + }, + { + value: data.attendance.personnel.leave, + name: '请假', + itemStyle: { color: '#FC5A5A' } + } + ] + }] + }; + // 参训内容饼图配置 + const trainingContentsOption = { + tooltip: { + trigger: 'item', + backgroundColor: 'rgba(0,21,41,0.8)', + borderColor: 'rgba(32,120,160,0.8)', + textStyle: { color: '#fff' }, + formatter: '{a}
{b}: {c}项 ({d}%)' + }, + legend: { + orient: 'vertical', + right: 10, + top: 'center', + itemWidth: 8, + itemHeight: 8, + icon: 'circle', + textStyle: { color: '#fff', fontSize: 14 } + }, + series: [{ + name: '参训内容', + type: 'pie', + radius: ['50%', '70%'], + center: ['35%', '50%'], + avoidLabelOverlap: true, + itemStyle: { + borderRadius: 0, + borderWidth: 1, + borderColor: 'rgba(32,120,160,0.8)', + }, + label: { + show: true, + position: 'inside', + formatter: '{d}%', + fontSize: 10, + color: '#fff' + }, + labelLine: { + show: false + }, + emphasis: { + label: { + show: true, + fontSize: 12, + fontWeight: 'bold' + } + }, + data: [ + { + value: data.training.contents[0].value, + name: data.training.contents[0].name, + itemStyle: { color: '#4FDFFF' } + }, + { + value: data.training.contents[1].value, + name: data.training.contents[1].name, + itemStyle: { color: '#FFCA28' } + }, + { + value: data.training.contents[2].value, + name: data.training.contents[2].name, + itemStyle: { color: '#3DD598' } + }, + { + value: data.training.contents[3].value, + name: data.training.contents[3].name, + itemStyle: { color: '#FC5A5A' } + } + ] + }] + }; + // 参训时长饼图配置 + const trainingHoursOption = { + tooltip: { + trigger: 'item', + backgroundColor: 'rgba(0,21,41,0.8)', + borderColor: 'rgba(32,120,160,0.8)', + textStyle: { color: '#fff' }, + formatter: '{a}
{b}: {c}小时 ({d}%)' + }, + legend: { + orient: 'vertical', + right: 10, + top: 'center', + itemWidth: 8, + itemHeight: 8, + icon: 'circle', + textStyle: { color: '#fff', fontSize: 14 } + }, + series: [{ + name: '参训时长', + type: 'pie', + radius: ['50%', '70%'], + center: ['35%', '50%'], + avoidLabelOverlap: true, + itemStyle: { + borderRadius: 0, + borderWidth: 1, + borderColor: 'rgba(32,120,160,0.8)', + }, + label: { + show: true, + position: 'inside', + formatter: '{d}%', + fontSize: 10, + color: '#fff' + }, + labelLine: { + show: false + }, + emphasis: { + label: { + show: true, + fontSize: 12, + fontWeight: 'bold' + } + }, + data: [ + { + value: data.training.hours[0].value, + name: data.training.hours[0].name, + itemStyle: { color: '#4FDFFF' } + }, + { + value: data.training.hours[1].value, + name: data.training.hours[1].name, + itemStyle: { color: '#FFB076' } + }, + { + value: data.training.hours[2].value, + name: data.training.hours[2].name, + itemStyle: { color: '#FC5A5A' } + } + ] + }] + }; + // 任务完成情况柱状图配置 + const materialsOption = { + tooltip: { + trigger: 'axis', + backgroundColor: 'rgba(0,21,41,0.8)', + borderColor: 'rgba(32,120,160,0.8)', + textStyle: { color: '#fff' }, + axisPointer: { + type: 'shadow' + } + }, + legend: { + data: ['上半年', '下半年'], + right: 10, + top: 10, + textStyle: { + color: '#fff', + fontSize: 10 + } + }, + grid: { + left: '3%', + right: '4%', + bottom: '3%', + top: '22%', + containLabel: true + }, + xAxis: { + type: 'category', + data: ['任务A', '任务B', '任务C'], + axisLine: { + lineStyle: { + color: 'rgba(255,255,255,0.3)' + } + }, + axisLabel: { + color: '#fff', + fontSize: 10 + } + }, + yAxis: { + type: 'value', + axisLine: { + show: true, + lineStyle: { + color: 'rgba(255,255,255,0.3)' + } + }, + splitLine: { + lineStyle: { + color: 'rgba(255,255,255,0.1)', + type: 'dashed' + } + }, + axisLabel: { + color: '#fff', + fontSize: 10 + } + }, + series: [ + { + name: '上半年', + type: 'bar', + barWidth: '25%', + itemStyle: { + color: '#4FDFFF' + }, + emphasis: { + itemStyle: { + color: '#6ab0f0' + } + }, + data: data.materials.planned + }, + { + name: '下半年', + type: 'bar', + barWidth: '25%', + itemStyle: { + color: '#FFCA28' + }, + emphasis: { + itemStyle: { + color: '#FFB75C' + } + }, + data: data.materials.actual + } + ] + }; + // 项目进度甘特图配置 + const ganttChartOption = { + backgroundColor: 'transparent', + tooltip: { + trigger: 'item', + formatter: function (params) { + if (params.seriesName === '实际完成' || params.seriesName === '计划完成') { + return `${params.name}
${params.seriesName}: ${params.value[0]} ~ ${params.value[1]}`; + } + return params.name; + }, + backgroundColor: 'rgba(0,21,41,0.8)', + borderColor: 'rgba(32,120,160,0.8)', + textStyle: { color: '#fff'} + }, + legend: { + data: ['计划完成', '实际完成', '超时完成'], + top: 0, + right: 10, + textStyle: { color: '#fff', fontSize: 12 }, + itemWidth: 15, + itemHeight: 10 + }, + grid: { + top: 30, + bottom: 30, + left: 100, + right: 20 + }, + xAxis: { + type: 'time', + axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } }, + axisLabel: { + color: '#fff', + fontSize: 10, + formatter: '{yyyy}.{MM}.{dd}', + rotate: 45, + margin: 8, + align: 'center', + interval: 'auto', + hideOverlap: true + }, + splitLine: { + show: true, + lineStyle: { color: 'rgba(255,255,255,0.1)', type: 'dashed' } + }, + min: '2019-02-01', + max: '2019-04-30' + }, + yAxis: { + type: 'category', + data: ['岗位训练', '共同科目', '通用四项'], + axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } }, + axisLabel: { + color: '#fff', + fontSize: 12, + margin: 20 + }, + inverse: true + }, + series: [ + { + name: '计划完成', + type: 'bar', + stack: 'same', + itemStyle: { color: '#FFCA28' }, + barWidth: 20, + data: [ + { + name: '岗位训练', + value: ['2019-03-08', '2019-04-17'] + }, + { + name: '共同科目', + value: ['2019-02-20', '2019-03-07'] + }, + { + name: '通用四项', + value: ['2019-02-05', '2019-02-26'] + } + ] + }, + { + name: '实际完成', + type: 'bar', + stack: 'same', + itemStyle: { color: '#4FDFFF' }, + barWidth: 20, + data: [ + { + }, + { + name: '共同科目', + value: ['2019-02-20', '2019-03-05'] + }, + {} + ] + }, + { + name: '超时完成', + type: 'bar', + stack: 'same', + itemStyle: { color: '#FC5A5A' }, + barWidth: 20, + data: [ + // 空数据 + {}, + {}, + { + name: '通用四项', + value: ['2019-02-26', '2019-02-27'] + } + ] + }, + // 添加当前日期标记 + { + name: '当前日期', + type: 'line', + markLine: { + symbol: ['none', 'none'], + label: { + show: false + }, + lineStyle: { + color: '#fff', + type: 'dashed', + width: 1 + }, + data: [ + { + xAxis: '2019-02-27' + } + ] } } - } as any) - console.log(res) - } + ] + }; + + // 六边形背景SVG + const hexagonBg = ` + + + + + + + + + `; + + // 卡片通用样式 + const cardStyle = { + backgroundColor: 'rgba(0,21,41,0.7)', + color: 'white', + border: '1px solid rgba(32,120,160,0.8)', + boxShadow: '0 0 15px rgba(0,100,200,0.3)' + }; + + const headerStyle = { + color: '#4FDFFF', + borderBottom: '1px solid rgba(32,120,160,0.8)', + fontSize: '16px', + fontWeight: 'bold' + }; + return ( -
- 数据看板(待开发) - +
+ {/* 六边形背景 */} +
+ +
+

训练管理系统数据看板

+ +
+ {new Date().toLocaleString()} 星期{['日', '一', '二', '三', '四', '五', '六'][new Date().getDay()]} +
+ + +
+ +
+ {/*
+ +
+
+ +
+
+ +
*/} +
+ 工程名称: + {data.projectInfo.name} +
+
+ 开发单位: + {data.projectInfo.client} +
+
+ 计划开始: + {data.projectInfo.planStartDate} +
+
+ 计划结束: + {data.projectInfo.planEndDate} +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ) -} \ No newline at end of file + ); +}; + +export default Dashboard; \ No newline at end of file diff --git a/apps/web/src/app/main/layout/NavigationMenu.tsx b/apps/web/src/app/main/layout/NavigationMenu.tsx index 9afe424..23bec3f 100644 --- a/apps/web/src/app/main/layout/NavigationMenu.tsx +++ b/apps/web/src/app/main/layout/NavigationMenu.tsx @@ -39,7 +39,7 @@ const items = [ ), getItem( "训练计划", - "/plan", + "/plan", , [ getItem("周训练计划", "/plan/weekplan", null, null, null), @@ -88,7 +88,7 @@ const NavigationMenu: React.FC = () => { "^/plan/monthplan": ["/plan"], // 添加考核成绩子路径的匹配规则 "^/assessment/positionassessment": ["/assessment"], - "^/assessment/commonassessment": ["/assessment"], + "^/assessment/commonassessment": ["/assessment"], "^/assessment/sportsassessment": ["/assessment"], "^/admin/base-setting": ["/admin"], "^/admin/department": ["/admin"], @@ -107,8 +107,7 @@ const NavigationMenu: React.FC = () => { location.pathname.startsWith("/assessment/") || location.pathname === "/plan/weekplan" || location.pathname === "/plan/monthplan" - ) - { + ) { setSelectedKeys([location.pathname]); setOpenKeys([location.pathname.split('/').slice(0, 2).join('/')]); } else if ( @@ -121,9 +120,9 @@ const NavigationMenu: React.FC = () => { setOpenKeys(openKeyMerge(location.pathname)); } }, [location.pathname]); - + const hit = (pathname: string): string[] => { - for (let p in children2Parent) { + for (const p in children2Parent) { if (pathname.search(p) >= 0) { return children2Parent[p]; } @@ -132,7 +131,7 @@ const NavigationMenu: React.FC = () => { }; const openKeyMerge = (pathname: string): string[] => { - let newOpenKeys = hit(pathname); + const newOpenKeys = hit(pathname); for (let i = 0; i < openKeys.length; i++) { let isIn = false; for (let j = 0; j < newOpenKeys.length; j++) { @@ -167,20 +166,20 @@ const NavigationMenu: React.FC = () => { useEffect(() => { setActiveMenus(items); // console.log(activeMenus) - },[items]) + }, [items]) // useEffect(() => { // checkMenuPermissions(items, permissions); // }, [items, permissions]); // const checkMenuPermissions = (items: any, permissions: any) => { - // let menus: any = []; + // const menus: any = []; // if (permissions.length === 0) { // setActiveMenus(menus); // return; // } - // for (let i in items) { - // let menuItem = items[i]; + // for (const i in items) { + // const menuItem = items[i]; // // 一级菜单=>没有子菜单&配置了权限 // if (menuItem.children === null) { // if ( @@ -192,10 +191,10 @@ const NavigationMenu: React.FC = () => { // menus.push(menuItem); // continue; // } - // let children = []; + // const children = []; - // for (let j in menuItem.children) { - // let childrenItem = menuItem.children[j]; + // for (const j in menuItem.children) { + // const childrenItem = menuItem.children[j]; // if ( // typeof permissions[childrenItem.permission] !== "undefined" || diff --git a/apps/web/src/app/main/plan/monthplan/page.tsx b/apps/web/src/app/main/plan/monthplan/page.tsx index e69de29..a988df2 100644 --- a/apps/web/src/app/main/plan/monthplan/page.tsx +++ b/apps/web/src/app/main/plan/monthplan/page.tsx @@ -0,0 +1,7 @@ +export default function MonthPlanPage() { + return ( +
+

MonthPlanPage

+
+ ) +} \ No newline at end of file diff --git a/apps/web/src/app/main/plan/weekplan/page.tsx b/apps/web/src/app/main/plan/weekplan/page.tsx index 2d870a5..4a1c19c 100644 --- a/apps/web/src/app/main/plan/weekplan/page.tsx +++ b/apps/web/src/app/main/plan/weekplan/page.tsx @@ -3,7 +3,7 @@ import * as XLSX from 'xlsx' import { Table, Select, Pagination } from 'antd' import type { ColumnsType, ColumnType } from 'antd/es/table' import { UploadOutlined } from '@ant-design/icons' - +import React from 'react'; interface TableData { key: string [key: string]: any @@ -25,7 +25,7 @@ export default function WeekPlanPage() { const data = new Uint8Array(e.target?.result as ArrayBuffer) const workbook = XLSX.read(data, { type: 'array' }) const firstSheet = workbook.Sheets[workbook.SheetNames[0]] - + // 处理合并单元格 if (firstSheet['!merges']) { firstSheet['!merges'].forEach(merge => { @@ -45,7 +45,7 @@ export default function WeekPlanPage() { }) } - const jsonData: any[] = XLSX.utils.sheet_to_json(firstSheet, { + const jsonData: any[] = XLSX.utils.sheet_to_json(firstSheet, { header: 1, defval: '', blankrows: false, @@ -79,7 +79,7 @@ export default function WeekPlanPage() { children: text, props: { rowSpan: calculateRowSpan(tableData, index, header), - style: { + style: { border: '1px solid #f0f0f0', borderBottom: '1px solid #f0f0f0' } @@ -158,7 +158,7 @@ export default function WeekPlanPage() { // 获取当前页应该显示的值 const currentValue = uniqueValues[(currentPage - 1)] - + // 返回第一列等于当前值的所有行 return data.filter(item => item[firstColumnName] === currentValue) } @@ -188,7 +188,7 @@ export default function WeekPlanPage() {

支持 .xlsx, .xls 格式的Excel文件

- + {data.length > 0 && ( <>
+ total={Array.from(new Set(data.map(item => item[(columns[0] as ColumnType)?.dataIndex as string] ))).filter(Boolean).length} pageSize={1} diff --git a/apps/web/src/app/main/positionassessment/page.tsx b/apps/web/src/app/main/positionassessment/page.tsx new file mode 100644 index 0000000..ae54229 --- /dev/null +++ b/apps/web/src/app/main/positionassessment/page.tsx @@ -0,0 +1,7 @@ +export default function PositionAssessmentPage() { + return ( +
+

PositionAssessmentPage

+
+ ) +} \ No newline at end of file diff --git a/apps/web/src/app/main/sport/page.tsx b/apps/web/src/app/main/sport/page.tsx index 71ba17b..1f3259b 100644 --- a/apps/web/src/app/main/sport/page.tsx +++ b/apps/web/src/app/main/sport/page.tsx @@ -1,7 +1,6 @@ import { Button, Table, Modal, Form, Upload, Skeleton } from "antd"; -import { useEffect, useState,} from "react"; +import { useEffect, useState, } from "react"; import toast from "react-hot-toast"; -import _ from "lodash"; import * as XLSX from 'xlsx'; import { UploadOutlined, DownloadOutlined } from '@ant-design/icons'; import { useSportPageContext } from "./sportPageProvider"; @@ -11,14 +10,14 @@ import { api, useTrainSituation } from "@nice/client"; export default function SportPage() { const [sportsData, setSportsData] = useState([]); const { sportProjectList, handlNewScoreOpen, staffsWithScore, staffsWithScoreLoading } = useSportPageContext() - const {deleteSameGroupTrainSituation} = useTrainSituation() + const { deleteSameGroupTrainSituation } = useTrainSituation() useEffect(() => { if (!staffsWithScore) return; const newSportsData = [] staffsWithScore.forEach(item => { const groupedTrainSituations = {}; item.trainSituations.forEach(train => { - if(train.groupId === null) return + if (train.groupId === null) return const groupId = train.groupId; if (!groupedTrainSituations[groupId]) { groupedTrainSituations[groupId] = { @@ -39,12 +38,12 @@ export default function SportPage() { age: item.age, unit: item.department?.name, situationIds: groupedTrainSituations[groupId].situations.map(train => train.id), - totalScore:groupedTrainSituations[groupId].totalScore, + totalScore: groupedTrainSituations[groupId].totalScore, ...groupedTrainSituations[groupId].trainScore, groupId }) }); - + }); console.log(newSportsData) setSportsData(newSportsData); @@ -70,12 +69,6 @@ export default function SportPage() { dataIndex: "unit", key: "unit", }, - ...sportProjectList?.filter(item=>item.deletedAt === null).map((item) => ({ - title: item.name, - dataIndex: item.name, - key: item.name, - editable: true, - })), { title: "BMI", dataIndex: "bodyType", @@ -115,7 +108,7 @@ export default function SportPage() { console.log(record) await deleteSameGroupTrainSituation.mutateAsync( { - groupId:record.groupId + groupId: record.groupId } ) toast.success("删除成功"); @@ -148,37 +141,35 @@ export default function SportPage() { // 导入成绩 const handleImport = (file) => { - const reader = new FileReader(); + // const reader = new FileReader(); + // reader.onload = (e) => { + // try { + // const data = new Uint8Array(e.target.result); + // const workbook = XLSX.read(data, { type: 'array' }); + // // 获取第一个工作表 + // const worksheet = workbook.Sheets[workbook.SheetNames[0]]; + // // 转换为JSON + // const jsonData = XLSX.utils.sheet_to_json(worksheet); + // // 添加id字段 + // const importedData = jsonData.map((item, index) => ({ + // id: sportsData.length + index + 1, + // ...item, + // // 确保totalScore是计算所有项目成绩的和 + // totalScore: calculateTotalScore(item) + // })); + // // 更新数据 + // setSportsData([...sportsData, ...importedData]); + // toast.success(`成功导入${importedData.length}条记录`); + // } catch (error) { + // console.error('导入失败:', error); + // toast.error("导入失败,请检查文件格式"); + // } + // }; - reader.onload = (e) => { - try { - const data = new Uint8Array(e.target.result); - const workbook = XLSX.read(data, { type: 'array' }); - // 获取第一个工作表 - const worksheet = workbook.Sheets[workbook.SheetNames[0]]; - // 转换为JSON - const jsonData = XLSX.utils.sheet_to_json(worksheet); - // 添加id字段 - const importedData = jsonData.map((item, index) => ({ - id: sportsData.length + index + 1, - ...item, - // 确保totalScore是计算所有项目成绩的和 - totalScore: calculateTotalScore(item) - })); + // reader.readAsArrayBuffer(file); - // 更新数据 - setSportsData([...sportsData, ...importedData]); - toast.success(`成功导入${importedData.length}条记录`); - } catch (error) { - console.error('导入失败:', error); - toast.error("导入失败,请检查文件格式"); - } - }; - - reader.readAsArrayBuffer(file); - - // 防止自动上传 - return false; + // // 防止自动上传 + // return false; }; return ( diff --git a/apps/web/src/app/main/sport/sportPageModal.tsx b/apps/web/src/app/main/sport/sportPageModal.tsx index c749d49..0d636df 100644 --- a/apps/web/src/app/main/sport/sportPageModal.tsx +++ b/apps/web/src/app/main/sport/sportPageModal.tsx @@ -51,7 +51,7 @@ export default function SportPageModal() {
{ + const { form, formValue, setFormValue, setVisible, setSearchValue, editingRecord } = useMainContext(); + useEffect(() => { setFormValue( { username: "", @@ -15,9 +15,9 @@ export default function StaffMessage() { absent: false, positionId: "", trainSituations: "", - } + } ) - },[]) + }, []) const handleNew = () => { form.setFieldsValue(formValue); console.log(editingRecord); @@ -54,7 +54,7 @@ export default function StaffMessage() { - + diff --git a/apps/web/src/app/main/staffpage/staffmodal/page.tsx b/apps/web/src/app/main/staffpage/staffmodal/page.tsx index 9aef8ff..4d6e760 100644 --- a/apps/web/src/app/main/staffpage/staffmodal/page.tsx +++ b/apps/web/src/app/main/staffpage/staffmodal/page.tsx @@ -7,18 +7,17 @@ import TrainContentTreeSelect from "@web/src/components/models/trainContent/trai import DepartmentChildrenSelect from "@web/src/components/models/department/department-children-select"; export default function StaffModal() { - const { data: traincontents} = api.trainSituation.findMany.useQuery({ - select:{ + const { data: traincontents } = api.trainSituation.findMany.useQuery({ + select: { id: true, - trainContent:{ - select:{ + trainContent: { + select: { id: true, title: true, type: true, } }, } - }); // useEffect(() => { // traincontents?.forEach((situation)=>{ @@ -76,7 +75,7 @@ export default function StaffModal() { data: staffData }); } - + toast.success("保存成功"); setVisible(false); setEditingRecord(null); @@ -94,15 +93,15 @@ export default function StaffModal() { }; useEffect(() => { - if (visible&&editingRecord) { + if (visible && editingRecord) { form.setFieldsValue(editingRecord); } - }, [visible,editingRecord]); + }, [visible, editingRecord]); return ( <> @@ -137,7 +136,7 @@ export default function StaffModal() { - + {(fields, { add, remove }) => ( <> @@ -149,7 +148,7 @@ export default function StaffModal() { label="培训内容" className="flex-1" > - + { - if (Array.isArray(dataIndex)) { - return dataIndex.reduce((obj, key) => obj?.[key], record); - } - return record[dataIndex]; + if (Array.isArray(dataIndex)) { + return dataIndex.reduce((obj, key) => obj?.[key], record); + } + return record[dataIndex]; }; export default function StaffTable() { - const{form, setVisible,searchValue} = useMainContext() - + const { form, setVisible, searchValue } = useMainContext() + const { data: staffs, isLoading } = api.staff.findMany.useQuery({ where: { deletedAt: null, @@ -44,7 +44,7 @@ export default function StaffTable() { console.log(staffs); }, [staffs]); const { softDeleteByIds } = useStaff(); - const {editingRecord, setEditingRecord} = useMainContext(); + const { editingRecord, setEditingRecord } = useMainContext(); const [isTrainingModalVisible, setIsTrainingModalVisible] = useState(false); const [selectedTrainings, setSelectedTrainings] = useState([]); @@ -70,7 +70,7 @@ export default function StaffTable() { title: "职务", dataIndex: ["position", "type"], key: "position", - render: (_, record) => record.position?.type || "无职务" + render: (_, record) => record.position?.type || "无职务" }, { title: "在位", @@ -84,7 +84,7 @@ export default function StaffTable() { key: "trainSituations", render: (situations) => { if (!situations?.length) return "无培训记录"; - + return (
{situations.slice(0, 2).map((s) => ( @@ -94,7 +94,7 @@ export default function StaffTable() {
))} {situations.length > 2 && ( - showTrainingDetails(situations)} > @@ -142,15 +142,15 @@ export default function StaffTable() { ]; useEffect(() => { if (editingRecord) { - form.setFieldsValue(editingRecord); - console.log(editingRecord); + form.setFieldsValue(editingRecord); + console.log(editingRecord); } - }, [editingRecord]); + }, [editingRecord]); const handleEdit = (record) => { setEditingRecord(record); form.setFieldsValue(record); // 修正为设置当前记录的值 setVisible(true); - }; + }; return ( <> { @@ -188,7 +188,7 @@ export default function StaffTable() { // 使用提取的函数处理嵌套字段
@@ -199,7 +199,7 @@ export default function StaffTable() {
{column.render?.( - getNestedValue(record, column.dataIndex), + getNestedValue(record, column.dataIndex), record ) || getNestedValue(record, column.dataIndex)}
) } - + diff --git a/apps/web/src/components/models/trainPlan/TrainPlanWrite.tsx b/apps/web/src/components/models/trainPlan/TrainPlanWrite.tsx index c3375c6..372b9dd 100644 --- a/apps/web/src/components/models/trainPlan/TrainPlanWrite.tsx +++ b/apps/web/src/components/models/trainPlan/TrainPlanWrite.tsx @@ -1,3 +1,3 @@ export default function TrainPlanWrite(){ - return
TrainPlanWrite
+ return
test
} \ No newline at end of file diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx index 4fc3085..b255660 100755 --- a/apps/web/src/routes/index.tsx +++ b/apps/web/src/routes/index.tsx @@ -17,6 +17,9 @@ import AdminLayout from "../components/layout/admin/AdminLayout"; import { adminRoute } from "./admin-route"; import SportPage from "../app/main/sport/page"; import { SportPageProvider } from "../app/main/sport/sportPageProvider"; +import PositionAssessmentPage from "../app/main/positionassessment/page"; +import CommonAssessmentPage from "../app/main/commonassessment/page"; +import MonthPlanPage from "../app/main/plan/monthplan/page"; interface CustomIndexRouteObject extends IndexRouteObject { name?: string; breadcrumb?: string; @@ -25,7 +28,6 @@ interface CustomIndexRouteObject extends IndexRouteObject { name?: string; breadcrumb?: string; } - export interface CustomNonIndexRouteObject extends NonIndexRouteObject { name?: string; children?: CustomRouteObject[]; @@ -53,45 +55,45 @@ export const routes: CustomRouteObject[] = [ children: [ { index: true, - element:, + element: , }, { path: "/staff", element: , }, { - path:"/plan", - children:[ + path: "/plan", + children: [ { - path:"weekplan", - element: + path: "weekplan", + element: }, { - path:"monthplan", - element: + path: "monthplan", + element: } ] }, { - path:"/daily", - element: + path: "/daily", + element: }, { - path:"/assessment", - children:[ + path: "/assessment", + children: [ { - path:"positionassessment", - element: + path: "positionassessment", + element: }, { - path:"commonassessment", - element: + path: "commonassessment", + element: }, { - path:"sportsassessment", - element: - - + path: "sportsassessment", + element: + + } ] }, @@ -100,13 +102,11 @@ export const routes: CustomRouteObject[] = [ element: , children: adminRoute.children, } - ], }, - ], }, - + { path: "/login", breadcrumb: "登录", diff --git a/config/nginx/conf.d/web.conf b/config/nginx/conf.d/web.conf index 2dd9d9e..eb29fb7 100755 --- a/config/nginx/conf.d/web.conf +++ b/config/nginx/conf.d/web.conf @@ -100,7 +100,7 @@ server { # 仅供内部使用 internal; # 代理到认证服务 - proxy_pass http://192.168.252.77:3000/auth/file; + proxy_pass http://192.168.252.77:3001/auth/file; # 请求优化:不传递请求体 proxy_pass_request_body off; diff --git a/package.json b/package.json index 8156253..64c4107 100755 --- a/package.json +++ b/package.json @@ -11,5 +11,11 @@ }, "keywords": [], "author": "insiinc", - "license": "ISC" + "license": "ISC", + "dependencies": { + "@antv/g6": "^5.0.44", + "antd": "^5.23.0", + "echarts": "^5.6.0", + "echarts-for-react": "^3.0.2" + } } \ No newline at end of file diff --git a/packages/common/prisma/schema.prisma b/packages/common/prisma/schema.prisma index 2436cfb..d23d96d 100755 --- a/packages/common/prisma/schema.prisma +++ b/packages/common/prisma/schema.prisma @@ -437,7 +437,6 @@ model Staff { age Int? @default(22) @map("age") sex Boolean? @default(true) @map("sex") absent Boolean? @default(false) @map("absent") - trainSituations TrainSituation[] position Position? @relation("StaffPosition", fields: [positionId], references: [id]) positionId String? @map("position_id") diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64409b0..0d52f9c 100755 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,20 @@ settings: importers: - .: {} + .: + dependencies: + '@antv/g6': + specifier: ^5.0.44 + version: 5.0.44(workerize-loader@2.0.2) + antd: + specifier: ^5.23.0 + version: 5.23.0(react-dom@18.2.0)(react@18.2.0) + echarts: + specifier: ^5.6.0 + version: 5.6.0 + echarts-for-react: + specifier: ^3.0.2 + version: 3.0.2(echarts@5.6.0)(react@18.2.0) apps/server: dependencies: @@ -1008,6 +1021,286 @@ packages: throttle-debounce: 5.0.2 dev: false + /@antv/algorithm@0.1.26: + resolution: {integrity: sha512-DVhcFSQ8YQnMNW34Mk8BSsfc61iC1sAnmcfYoXTAshYHuU50p/6b7x3QYaGctDNKWGvi1ub7mPcSY0bK+aN0qg==} + dependencies: + '@antv/util': 2.0.17 + tslib: 2.8.1 + dev: false + + /@antv/component@2.1.2: + resolution: {integrity: sha512-5nC9i9lh5rBHE+pk4TNnerLe4mn5874YHHhvv6EdL618UkgpdKJL0hJu4l7uAYjZ3g46VBK+IYT7md0FYv8f4w==} + dependencies: + '@antv/g': 6.1.21 + '@antv/scale': 0.4.16 + '@antv/util': 3.3.10 + svg-path-parser: 1.1.0 + dev: false + + /@antv/event-emitter@0.1.3: + resolution: {integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==} + dev: false + + /@antv/g-camera-api@2.0.35: + resolution: {integrity: sha512-z4WKmB6yN2fFi9EnapjuHbFVF0ilhMrWo2eZCxYXcb0dV5MiflU/WZi/bjs4WqVMJPNtYKx+yZhTyROncEiglw==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/g-canvas@2.0.40: + resolution: {integrity: sha512-Starh5g+ydOFKzfK/GpwnLwz+o6UZNHkyWBXdHx2ax/AJWHVXwjyCadt/6kkc2non0ts2ow/hpJaW7X3dgdDxQ==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/g-plugin-canvas-path-generator': 2.1.16 + '@antv/g-plugin-canvas-picker': 2.1.19 + '@antv/g-plugin-canvas-renderer': 2.2.19 + '@antv/g-plugin-dom-interaction': 2.1.21 + '@antv/g-plugin-html-renderer': 2.1.21 + '@antv/g-plugin-image-loader': 2.1.19 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + tslib: 2.8.1 + dev: false + + /@antv/g-dom-mutation-observer-api@2.0.32: + resolution: {integrity: sha512-50r7en1+doUtR9uXmFJk8YtENQ/+DFcj2g3a4XKu9xp58kmF2qBgtdst9n1deqGcL5s0ufX/Ck9rUhtHwka+Ow==} + dependencies: + '@antv/g-lite': 2.2.16 + '@babel/runtime': 7.27.0 + dev: false + + /@antv/g-lite@2.2.16: + resolution: {integrity: sha512-473r6S5srkxUiUxI3ZkrM74HMkgyO9+2HR1xtJ75yDOOuT8F6osdXDgy0Or5cWqOlsVjiN3L3DaPnQLHlUGO5A==} + dependencies: + '@antv/g-math': 3.0.0 + '@antv/util': 3.3.10 + '@antv/vendor': 1.0.10 + '@babel/runtime': 7.27.0 + eventemitter3: 5.0.1 + gl-matrix: 3.4.3 + rbush: 3.0.1 + tslib: 2.8.1 + dev: false + + /@antv/g-math@3.0.0: + resolution: {integrity: sha512-AkmiNIEL1vgqTPeGY2wtsMdBBqKFwF7SKSgs+D1iOS/rqYMsXdhp/HvtuQ5tx/HdawE/ZzTiicIYopc520ADZw==} + dependencies: + '@antv/util': 3.3.10 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/g-plugin-canvas-path-generator@2.1.16: + resolution: {integrity: sha512-E3/HUzWRv1/5QyKHLcXIgFJff0JBxDHz4NfHwYp6IOy5P/A1mbISsUjwafSl8JIVqx0J81CzgqpwU7pWHeXlaQ==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/g-math': 3.0.0 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + tslib: 2.8.1 + dev: false + + /@antv/g-plugin-canvas-picker@2.1.19: + resolution: {integrity: sha512-69G0m2v09FimmYSU+hO1wjft1FqM467Cf1jDpjBz6Y3caQ98Hrqpz/7Prko1hMOALCo92MDo65yTTnz/LhBiQA==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/g-math': 3.0.0 + '@antv/g-plugin-canvas-path-generator': 2.1.16 + '@antv/g-plugin-canvas-renderer': 2.2.19 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/g-plugin-canvas-renderer@2.2.19: + resolution: {integrity: sha512-3Ac0pjU0NAafu0rwTnthwWV/CV5kV9CpTf96v1CCXX0P3iPWtW72SatQNOt/v2aQ2NjYB34YuwYy9i0U1oS8rg==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/g-math': 3.0.0 + '@antv/g-plugin-canvas-path-generator': 2.1.16 + '@antv/g-plugin-image-loader': 2.1.19 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/g-plugin-dom-interaction@2.1.21: + resolution: {integrity: sha512-Vm8yeNjZ2aNgNH3LwDRExRChpuVv0Wv2zOblUGy5rgyRIh2Fkm8R89pKLmd3GlLo4AF1ZqAGWHiY2WOeMHEEIA==} + dependencies: + '@antv/g-lite': 2.2.16 + '@babel/runtime': 7.27.0 + tslib: 2.8.1 + dev: false + + /@antv/g-plugin-dragndrop@2.0.32: + resolution: {integrity: sha512-0Y9S/jx6Z7O3hEQhqrXGWNIcV1dBoRpokSP9gIMqTxOjCLzVUFYv8pFoI+Uyeow6PAWe+gdBQu+EJgVi223lJQ==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + tslib: 2.8.1 + dev: false + + /@antv/g-plugin-html-renderer@2.1.21: + resolution: {integrity: sha512-1PR9rYt4BgSx8LFnVPF+cPlcBYKfI7iWK/xPipEa3jZ4j/xftELQ5EEyZpfPnrTqu2PtKeMurx7oaM/HPsgaiQ==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/g-plugin-image-loader@2.1.19: + resolution: {integrity: sha512-ZjNs08RkzdDMLlEWGabJG1Lu1Q71afStSlhcIRhrDOLB4tH0UdYlq/f72tlzJ6KjtLnril/xQH3D7znPlfAoig==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/g-web-animations-api@2.1.21: + resolution: {integrity: sha512-EkIjeEH3QzHkDJn3sz1Mk83PqVQXGe5440mJV42QmnxuFuFcxGVJMi9vS8Te7kCUJl4eSb/eqnNi5AWfDMWm+w==} + dependencies: + '@antv/g-lite': 2.2.16 + '@antv/util': 3.3.10 + '@babel/runtime': 7.27.0 + tslib: 2.8.1 + dev: false + + /@antv/g6@5.0.44(workerize-loader@2.0.2): + resolution: {integrity: sha512-aYZB5ifySJU/XXu1pdA2AvzsLvxsn1qKmzxwFmWNJBubiPYLvMOD9BFhRgWRZmVciBdQSjcx1HQu3jpU3m/EqA==} + dependencies: + '@antv/algorithm': 0.1.26 + '@antv/component': 2.1.2 + '@antv/event-emitter': 0.1.3 + '@antv/g': 6.1.21 + '@antv/g-canvas': 2.0.40 + '@antv/g-plugin-dragndrop': 2.0.32 + '@antv/graphlib': 2.0.4 + '@antv/hierarchy': 0.6.14 + '@antv/layout': 1.2.14-beta.9(workerize-loader@2.0.2) + '@antv/util': 3.3.10 + bubblesets-js: 2.3.4 + hull.js: 1.0.6 + transitivePeerDependencies: + - workerize-loader + dev: false + + /@antv/g@6.1.21: + resolution: {integrity: sha512-3cWmsY1bYwDmVzsFmBeqN1tWVt+3JaWL6Uu54C1oF7qn1VXXa3V3KuXGEYCxuei8E8BMriN3D7fZosY5d+MQqw==} + dependencies: + '@antv/g-camera-api': 2.0.35 + '@antv/g-dom-mutation-observer-api': 2.0.32 + '@antv/g-lite': 2.2.16 + '@antv/g-web-animations-api': 2.1.21 + '@babel/runtime': 7.27.0 + dev: false + + /@antv/graphlib@2.0.4: + resolution: {integrity: sha512-zc/5oQlsdk42Z0ib1mGklwzhJ5vczLFiPa1v7DgJkTbgJ2YxRh9xdarf86zI49sKVJmgbweRpJs7Nu5bIiwv4w==} + dependencies: + '@antv/event-emitter': 0.1.3 + dev: false + + /@antv/hierarchy@0.6.14: + resolution: {integrity: sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ==} + dev: false + + /@antv/layout@1.2.14-beta.9(workerize-loader@2.0.2): + resolution: {integrity: sha512-wPlwBFMtq2lWZFc89/7Lzb8fjHnyKVZZ9zBb2h+zZIP0YWmVmHRE8+dqCiPKOyOGUXEdDtn813f1g107dCHZlg==} + dependencies: + '@antv/event-emitter': 0.1.3 + '@antv/graphlib': 2.0.4 + '@antv/util': 3.3.10 + '@naoak/workerize-transferable': 0.1.0(workerize-loader@2.0.2) + comlink: 4.4.2 + d3-force: 3.0.0 + d3-force-3d: 3.0.5 + d3-octree: 1.1.0 + d3-quadtree: 3.0.1 + dagre: 0.8.5 + ml-matrix: 6.12.1 + tslib: 2.8.1 + transitivePeerDependencies: + - workerize-loader + dev: false + + /@antv/scale@0.4.16: + resolution: {integrity: sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==} + dependencies: + '@antv/util': 3.3.10 + color-string: 1.9.1 + fecha: 4.2.3 + dev: false + + /@antv/util@2.0.17: + resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==} + dependencies: + csstype: 3.1.3 + tslib: 2.8.1 + dev: false + + /@antv/util@3.3.10: + resolution: {integrity: sha512-basGML3DFA3O87INnzvDStjzS+n0JLEhRnRsDzP9keiXz8gT1z/fTdmJAZFOzMMWxy+HKbi7NbSt0+8vz/OsBQ==} + dependencies: + fast-deep-equal: 3.1.3 + gl-matrix: 3.4.3 + tslib: 2.8.1 + dev: false + + /@antv/vendor@1.0.10: + resolution: {integrity: sha512-/llNfo0gyUAi+ZY3TAtkNPS66eXTMbNdaKd8qllyJUuXnpRHYd/LGU69ix6olGJEFBi61hO4f9eTY0zzNOlFlw==} + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-color': 3.1.3 + '@types/d3-dispatch': 3.0.6 + '@types/d3-dsv': 3.0.7 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-dsv: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-force-3d: 3.0.5 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-geo-projection: 4.0.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-regression: 1.3.10 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + /@aws-crypto/crc32@5.2.0: resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -3106,35 +3399,29 @@ packages: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - dev: true /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/source-map@0.3.6: resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - dev: true /@jridgewell/sourcemap-codec@1.5.0: resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - dev: true /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -3195,6 +3482,14 @@ packages: dev: false optional: true + /@naoak/workerize-transferable@0.1.0(workerize-loader@2.0.2): + resolution: {integrity: sha512-fDLfuP71IPNP5+zSfxFb52OHgtjZvauRJWbVnpzQ7G7BjcbLjTny0OW1d3ZO806XKpLWNKmeeW3MhE0sy8iwYQ==} + peerDependencies: + workerize-loader: '*' + dependencies: + workerize-loader: 2.0.2(webpack@5.98.0) + dev: false + /@nestjs/bull-shared@10.2.3(@nestjs/common@10.3.10)(@nestjs/core@10.0.0): resolution: {integrity: sha512-XcgAjNOgq6b5DVCytxhR5BKiwWo7hsusVeyE7sfFnlXRHeEtIuC2hYWBr/ZAtvL/RH0/O0tqtq0rVl972nbhJw==} peerDependencies: @@ -4767,26 +5062,98 @@ packages: dependencies: '@types/node': 20.3.1 + /@types/d3-array@3.2.1: + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + dev: false + /@types/d3-color@3.1.3: resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} dev: false + /@types/d3-dispatch@3.0.6: + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + dev: false + /@types/d3-drag@3.0.7: resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} dependencies: '@types/d3-selection': 3.0.11 dev: false + /@types/d3-dsv@3.0.7: + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + dev: false + + /@types/d3-fetch@3.0.7: + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + dependencies: + '@types/d3-dsv': 3.0.7 + dev: false + + /@types/d3-force@3.0.10: + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + dev: false + + /@types/d3-format@3.0.4: + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + dev: false + + /@types/d3-geo@3.1.0: + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + dependencies: + '@types/geojson': 7946.0.16 + dev: false + + /@types/d3-hierarchy@3.1.7: + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + dev: false + /@types/d3-interpolate@3.0.4: resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} dependencies: '@types/d3-color': 3.1.3 dev: false + /@types/d3-path@3.1.1: + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + dev: false + + /@types/d3-quadtree@3.0.6: + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + dev: false + + /@types/d3-random@3.0.3: + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + dev: false + + /@types/d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + dev: false + + /@types/d3-scale@4.0.9: + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + dependencies: + '@types/d3-time': 3.0.4 + dev: false + /@types/d3-selection@3.0.11: resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} dev: false + /@types/d3-shape@3.1.7: + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + dependencies: + '@types/d3-path': 3.1.1 + dev: false + + /@types/d3-time@3.0.4: + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + dev: false + + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: false + /@types/d3-transition@3.0.9: resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} dependencies: @@ -4815,18 +5182,15 @@ packages: dependencies: '@types/eslint': 9.6.1 '@types/estree': 1.0.7 - dev: true /@types/eslint@9.6.1: resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} dependencies: '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 - dev: true /@types/estree@1.0.7: resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - dev: true /@types/exceljs@1.3.0: resolution: {integrity: sha512-V3BOkD+eQVEFuYACksKiNEDP3QumTMMrPeXef/F5EAT/MquojQzUwEJt6vwsEwTOZFPfponJMyvdZ0NL71K76Q==} @@ -4859,6 +5223,10 @@ packages: '@types/node': 20.3.1 dev: true + /@types/geojson@7946.0.16: + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + dev: false + /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: @@ -4901,7 +5269,6 @@ packages: /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true /@types/jsonwebtoken@9.0.5: resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} @@ -5491,19 +5858,15 @@ packages: dependencies: '@webassemblyjs/helper-numbers': 1.13.2 '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - dev: true /@webassemblyjs/floating-point-hex-parser@1.13.2: resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - dev: true /@webassemblyjs/helper-api-error@1.13.2: resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - dev: true /@webassemblyjs/helper-buffer@1.14.1: resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - dev: true /@webassemblyjs/helper-numbers@1.13.2: resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} @@ -5511,11 +5874,9 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.13.2 '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/helper-wasm-bytecode@1.13.2: resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - dev: true /@webassemblyjs/helper-wasm-section@1.14.1: resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} @@ -5524,23 +5885,19 @@ packages: '@webassemblyjs/helper-buffer': 1.14.1 '@webassemblyjs/helper-wasm-bytecode': 1.13.2 '@webassemblyjs/wasm-gen': 1.14.1 - dev: true /@webassemblyjs/ieee754@1.13.2: resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} dependencies: '@xtuc/ieee754': 1.2.0 - dev: true /@webassemblyjs/leb128@1.13.2: resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} dependencies: '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/utf8@1.13.2: resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - dev: true /@webassemblyjs/wasm-edit@1.14.1: resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} @@ -5553,7 +5910,6 @@ packages: '@webassemblyjs/wasm-opt': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 '@webassemblyjs/wast-printer': 1.14.1 - dev: true /@webassemblyjs/wasm-gen@1.14.1: resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} @@ -5563,7 +5919,6 @@ packages: '@webassemblyjs/ieee754': 1.13.2 '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 - dev: true /@webassemblyjs/wasm-opt@1.14.1: resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} @@ -5572,7 +5927,6 @@ packages: '@webassemblyjs/helper-buffer': 1.14.1 '@webassemblyjs/wasm-gen': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - dev: true /@webassemblyjs/wasm-parser@1.14.1: resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} @@ -5583,22 +5937,18 @@ packages: '@webassemblyjs/ieee754': 1.13.2 '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 - dev: true /@webassemblyjs/wast-printer@1.14.1: resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} dependencies: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - dev: true /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true /@xyflow/react@12.3.6(@types/react@18.2.38)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-9GS+cz8hDZahpvTrVCmySAEgKUL8oN4b2q1DluHrKtkqhAMWfH2s7kblhbM4Y4Y4SUnH2lt4drXKZ/4/Lot/2Q==} @@ -5693,7 +6043,6 @@ packages: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /adler-32@1.3.1: resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} @@ -5759,7 +6108,6 @@ packages: optional: true dependencies: ajv: 8.17.1 - dev: true /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} @@ -5776,7 +6124,6 @@ packages: dependencies: ajv: 8.17.1 fast-deep-equal: 3.1.3 - dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -5803,7 +6150,6 @@ packages: fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - dev: true /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -6150,6 +6496,10 @@ packages: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: false + /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -6256,7 +6606,6 @@ packages: electron-to-chromium: 1.5.128 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) - dev: true /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -6271,6 +6620,10 @@ packages: node-int64: 0.4.0 dev: true + /bubblesets-js@2.3.4: + resolution: {integrity: sha512-DyMjHmpkS2+xcFNtyN00apJYL3ESdp9fTrkDr5+9Qg/GPqFmcWgGsK1akZnttE1XFxJ/VMy4DNNGMGYtmFp1Sg==} + dev: false + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -6385,7 +6738,6 @@ packages: /caniuse-lite@1.0.30001707: resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} - dev: true /cfb@1.2.2: resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} @@ -6466,7 +6818,6 @@ packages: /chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - dev: true /ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} @@ -6612,15 +6963,23 @@ packages: dependencies: delayed-stream: 1.0.0 + /comlink@4.4.2: + resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + dev: false + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false + /comment-json@4.2.3: resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} engines: {node: '>= 6'} @@ -6842,6 +7201,10 @@ packages: internmap: 2.0.3 dev: false + /d3-binarytree@1.0.2: + resolution: {integrity: sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==} + dev: false + /d3-color@3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} @@ -6869,11 +7232,70 @@ packages: d3-selection: 3.0.0 dev: false + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + dev: false + /d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} dev: false + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + dependencies: + d3-dsv: 3.0.1 + dev: false + + /d3-force-3d@3.0.5: + resolution: {integrity: sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg==} + engines: {node: '>=12'} + dependencies: + d3-binarytree: 1.0.2 + d3-dispatch: 3.0.1 + d3-octree: 1.1.0 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: false + + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-geo-projection@4.0.0: + resolution: {integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==} + engines: {node: '>=12'} + hasBin: true + dependencies: + commander: 7.2.0 + d3-array: 3.2.4 + d3-geo: 3.1.1 + dev: false + + /d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + /d3-hierarchy@3.1.2: resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} engines: {node: '>=12'} @@ -6886,11 +7308,74 @@ packages: d3-color: 3.1.0 dev: false + /d3-octree@1.1.0: + resolution: {integrity: sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==} + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + dev: false + + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + dev: false + + /d3-regression@1.3.10: + resolution: {integrity: sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw==} + dev: false + + /d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + /d3-selection@3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} dev: false + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + /d3-timer@3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} @@ -6921,6 +7406,13 @@ packages: d3-transition: 3.0.1(d3-selection@3.0.0) dev: false + /dagre@0.8.5: + resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} + dependencies: + graphlib: 2.1.8 + lodash: 4.17.21 + dev: false + /date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -7125,12 +7617,30 @@ packages: safe-buffer: 5.2.1 dev: false + /echarts-for-react@3.0.2(echarts@5.6.0)(react@18.2.0): + resolution: {integrity: sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==} + peerDependencies: + echarts: ^3.0.0 || ^4.0.0 || ^5.0.0 + react: ^15.0.0 || >=16.0.0 + dependencies: + echarts: 5.6.0 + fast-deep-equal: 3.1.3 + react: 18.2.0 + size-sensor: 1.0.2 + dev: false + + /echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + dev: false + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} /electron-to-chromium@1.5.128: resolution: {integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==} - dev: true /elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -7152,6 +7662,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: false + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -7201,7 +7716,6 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} @@ -7231,7 +7745,6 @@ packages: /es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - dev: true /es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -7404,7 +7917,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} @@ -7564,17 +8076,14 @@ packages: engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 - dev: true /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} - dev: true /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -7596,7 +8105,6 @@ packages: /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: true /exceljs@4.4.0: resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} @@ -7714,7 +8222,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true /fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} @@ -7743,7 +8250,6 @@ packages: /fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - dev: true /fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} @@ -7782,6 +8288,10 @@ packages: picomatch: 4.0.2 dev: true + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -8082,6 +8592,10 @@ packages: engines: {node: '>=10'} dev: true + /gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -8098,7 +8612,6 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true /glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} @@ -8203,6 +8716,12 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /graphlib@2.1.8: + resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} + dependencies: + lodash: 4.17.21 + dev: false + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -8263,6 +8782,11 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 + /hull.js@1.0.6: + resolution: {integrity: sha512-TC7e9sHYOaCVms0sn2hN7buxnaGfcl9h5EPVoVX9DTPoMpqQiS9bf3tmGDgiNaMVHBD91RAvWjCxrJ5Jx8BI5A==} + deprecated: This package is unmaintained and vulnerable. Do not use it. + dev: false + /human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -8279,6 +8803,13 @@ packages: dependencies: safer-buffer: 2.1.2 + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + /idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} dev: false @@ -8407,6 +8938,10 @@ packages: engines: {node: '>= 10'} dev: false + /is-any-array@2.0.1: + resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} + dev: false + /is-arguments@1.2.0: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} @@ -9013,7 +9548,6 @@ packages: '@types/node': 20.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true /jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} @@ -9090,7 +9624,6 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -9098,7 +9631,6 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -9114,7 +9646,6 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: true /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -9340,7 +9871,15 @@ packages: /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - dev: true + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + dev: false /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} @@ -9592,7 +10131,6 @@ packages: /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -9712,6 +10250,33 @@ packages: dependencies: minimist: 1.2.8 + /ml-array-max@1.2.4: + resolution: {integrity: sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==} + dependencies: + is-any-array: 2.0.1 + dev: false + + /ml-array-min@1.2.3: + resolution: {integrity: sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==} + dependencies: + is-any-array: 2.0.1 + dev: false + + /ml-array-rescale@1.3.7: + resolution: {integrity: sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==} + dependencies: + is-any-array: 2.0.1 + ml-array-max: 1.2.4 + ml-array-min: 1.2.3 + dev: false + + /ml-matrix@6.12.1: + resolution: {integrity: sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==} + dependencies: + is-any-array: 2.0.1 + ml-array-rescale: 1.3.7 + dev: false + /motion-dom@11.18.1: resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} dependencies: @@ -9817,7 +10382,6 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -9876,7 +10440,6 @@ packages: /node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - dev: true /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -10088,7 +10651,6 @@ packages: /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -10352,6 +10914,10 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + dev: false + /quill-delta@5.1.0: resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==} engines: {node: '>= 12.0.0'} @@ -10375,7 +10941,6 @@ packages: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - dev: true /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} @@ -10399,6 +10964,12 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 + /rbush@3.0.1: + resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + dependencies: + quickselect: 2.0.0 + dev: false + /rc-cascader@3.32.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-U1N1N3Pt6DGcVWhZTUYqnE0JeoyphrjIJQztXSgDd50DBfhbZrjTn/TMf/qKQnC7KTMDb4eNwvo/U9LOpFJ+DQ==} peerDependencies: @@ -11109,7 +11680,6 @@ packages: /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: true /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -11246,6 +11816,10 @@ packages: queue-microtask: 1.2.3 dev: true + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: @@ -11307,7 +11881,6 @@ packages: ajv: 8.17.1 ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) - dev: true /scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -11349,7 +11922,6 @@ packages: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 - dev: true /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} @@ -11533,6 +12105,10 @@ packages: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true + /size-sensor@1.0.2: + resolution: {integrity: sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==} + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -11602,12 +12178,10 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} @@ -11846,7 +12420,6 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - dev: true /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -11857,6 +12430,10 @@ packages: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} dev: true + /svg-path-parser@1.1.0: + resolution: {integrity: sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A==} + dev: false + /symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} @@ -11912,7 +12489,6 @@ packages: /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - dev: true /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -11970,7 +12546,6 @@ packages: serialize-javascript: 6.0.2 terser: 5.39.0 webpack: 5.98.0 - dev: true /terser@5.39.0: resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} @@ -11981,7 +12556,6 @@ packages: acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 - dev: true /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -12206,6 +12780,10 @@ packages: strip-bom: 3.0.0 dev: true + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + dev: false + /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} @@ -12371,7 +12949,6 @@ packages: browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 - dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -12520,7 +13097,6 @@ packages: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -12551,7 +13127,6 @@ packages: /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - dev: true /webpack@5.87.0: resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} @@ -12630,7 +13205,6 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -12698,6 +13272,15 @@ packages: resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} engines: {node: '>=0.8'} + /workerize-loader@2.0.2(webpack@5.98.0): + resolution: {integrity: sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ==} + peerDependencies: + webpack: '*' + dependencies: + loader-utils: 2.0.4 + webpack: 5.98.0 + dev: false + /wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} @@ -12897,6 +13480,12 @@ packages: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} dev: false + /zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + dependencies: + tslib: 2.3.0 + dev: false + /zustand@4.5.6(@types/react@18.2.38)(react@18.2.0): resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==} engines: {node: '>=12.7.0'}