正在显示
14 个修改的文件
包含
531 行增加
和
358 行删除
| @@ -16,9 +16,8 @@ import { | @@ -16,9 +16,8 @@ import { | ||
| 16 | } from "echarts/charts"; | 16 | } from "echarts/charts"; |
| 17 | import { CanvasRenderer } from "echarts/renderers"; | 17 | import { CanvasRenderer } from "echarts/renderers"; |
| 18 | import { useRef, useEffect, useState } from "react"; | 18 | import { useRef, useEffect, useState } from "react"; |
| 19 | -import { ChartComponentProps, ChartData } from "./getChartData"; | 19 | +import { ChartComponentProps, ChartData, ValueItem } from "./getChartData"; |
| 20 | 20 | ||
| 21 | -// 注册必要的组件 | ||
| 22 | echarts.use([ | 21 | echarts.use([ |
| 23 | GridComponent, | 22 | GridComponent, |
| 24 | TooltipComponent, | 23 | TooltipComponent, |
| @@ -40,15 +39,17 @@ const tabList = [ | @@ -40,15 +39,17 @@ const tabList = [ | ||
| 40 | { key: "line", label: "折线图" }, | 39 | { key: "line", label: "折线图" }, |
| 41 | ]; | 40 | ]; |
| 42 | 41 | ||
| 43 | -// 图表配置生成器 | ||
| 44 | const getOption = (type: string, data: ChartData): EChartsOption => { | 42 | const getOption = (type: string, data: ChartData): EChartsOption => { |
| 45 | const commonOption = { | 43 | const commonOption = { |
| 46 | title: { text: `${tabList.find((t) => t.key === type)?.label}` }, | 44 | title: { text: `${tabList.find((t) => t.key === type)?.label}` }, |
| 47 | tooltip: { trigger: "item" }, | 45 | tooltip: { trigger: "item" }, |
| 48 | }; | 46 | }; |
| 49 | 47 | ||
| 50 | - // 提取数值数组 | ||
| 51 | - const values = data.values.map((item) => item.value); | 48 | + const getValue = (item: number | ValueItem): number => |
| 49 | + typeof item === "number" ? item : item.value; | ||
| 50 | + | ||
| 51 | + const getItemStyle = (item: number | ValueItem) => | ||
| 52 | + typeof item === "object" ? item.itemStyle : undefined; | ||
| 52 | 53 | ||
| 53 | switch (type) { | 54 | switch (type) { |
| 54 | case "bar": | 55 | case "bar": |
| @@ -56,7 +57,22 @@ const getOption = (type: string, data: ChartData): EChartsOption => { | @@ -56,7 +57,22 @@ const getOption = (type: string, data: ChartData): EChartsOption => { | ||
| 56 | ...commonOption, | 57 | ...commonOption, |
| 57 | xAxis: { type: "category", data: data.categories }, | 58 | xAxis: { type: "category", data: data.categories }, |
| 58 | yAxis: { type: "value" }, | 59 | yAxis: { type: "value" }, |
| 59 | - series: [{ data: values, type: "bar" }], | 60 | + series: [ |
| 61 | + { | ||
| 62 | + data: data.values, | ||
| 63 | + type: "bar", | ||
| 64 | + itemStyle: { | ||
| 65 | + color: (params) => { | ||
| 66 | + const dataItem = params.data as ValueItem | number; | ||
| 67 | + if (typeof dataItem === "object" && dataItem.itemStyle?.color) { | ||
| 68 | + return dataItem.itemStyle.color; | ||
| 69 | + } | ||
| 70 | + // 返回一个默认颜色,比如 ECharts 默认色系中的颜色 | ||
| 71 | + return "#5470c6"; | ||
| 72 | + }, | ||
| 73 | + }, | ||
| 74 | + }, | ||
| 75 | + ], | ||
| 60 | }; | 76 | }; |
| 61 | case "pie": | 77 | case "pie": |
| 62 | return { | 78 | return { |
| @@ -64,9 +80,10 @@ const getOption = (type: string, data: ChartData): EChartsOption => { | @@ -64,9 +80,10 @@ const getOption = (type: string, data: ChartData): EChartsOption => { | ||
| 64 | series: [ | 80 | series: [ |
| 65 | { | 81 | { |
| 66 | type: "pie", | 82 | type: "pie", |
| 67 | - data: data.categories.map((name, i) => ({ | ||
| 68 | - name, | ||
| 69 | - value: values[i], | 83 | + data: data.values.map((item, i) => ({ |
| 84 | + name: data.categories[i], | ||
| 85 | + value: getValue(item), | ||
| 86 | + itemStyle: getItemStyle(item), | ||
| 70 | })), | 87 | })), |
| 71 | radius: "50%", | 88 | radius: "50%", |
| 72 | }, | 89 | }, |
| @@ -79,15 +96,25 @@ const getOption = (type: string, data: ChartData): EChartsOption => { | @@ -79,15 +96,25 @@ const getOption = (type: string, data: ChartData): EChartsOption => { | ||
| 79 | yAxis: { type: "value" }, | 96 | yAxis: { type: "value" }, |
| 80 | series: [ | 97 | series: [ |
| 81 | { | 98 | { |
| 82 | - data: values, | 99 | + data: data.values.map(getValue), |
| 83 | type: "line", | 100 | type: "line", |
| 84 | smooth: true, | 101 | smooth: true, |
| 85 | areaStyle: {}, | 102 | areaStyle: {}, |
| 103 | + itemStyle: { | ||
| 104 | + color: (params) => { | ||
| 105 | + const dataItem = params.data as ValueItem | number; | ||
| 106 | + if (typeof dataItem === "object" && dataItem.itemStyle?.color) { | ||
| 107 | + return dataItem.itemStyle.color; | ||
| 108 | + } | ||
| 109 | + // 返回一个默认颜色,比如 ECharts 默认色系中的颜色 | ||
| 110 | + return "#5470c6"; | ||
| 111 | + }, | ||
| 112 | + }, | ||
| 86 | }, | 113 | }, |
| 87 | ], | 114 | ], |
| 88 | }; | 115 | }; |
| 89 | default: | 116 | default: |
| 90 | - return {}; | 117 | + return commonOption; |
| 91 | } | 118 | } |
| 92 | }; | 119 | }; |
| 93 | 120 | ||
| @@ -101,30 +128,31 @@ export function ChartComponent({ | @@ -101,30 +128,31 @@ export function ChartComponent({ | ||
| 101 | useEffect(() => { | 128 | useEffect(() => { |
| 102 | if (!chartRef.current) return; | 129 | if (!chartRef.current) return; |
| 103 | 130 | ||
| 104 | - // 数据校验 | ||
| 105 | if ( | 131 | if ( |
| 106 | !data?.categories?.length || | 132 | !data?.categories?.length || |
| 107 | !data?.values?.length || | 133 | !data?.values?.length || |
| 108 | - data.values.some((item) => typeof item.value !== "number") | 134 | + data.values.some( |
| 135 | + (item) => | ||
| 136 | + typeof item !== "number" && | ||
| 137 | + (typeof (item as ValueItem).value !== "number" || | ||
| 138 | + ((item as ValueItem).itemStyle && | ||
| 139 | + typeof (item as ValueItem).itemStyle?.color !== "string")), | ||
| 140 | + ) | ||
| 109 | ) { | 141 | ) { |
| 110 | console.warn("Invalid chart data"); | 142 | console.warn("Invalid chart data"); |
| 111 | return; | 143 | return; |
| 112 | } | 144 | } |
| 113 | 145 | ||
| 114 | - // 销毁旧实例 | ||
| 115 | if (chartInstance.current) { | 146 | if (chartInstance.current) { |
| 116 | chartInstance.current.dispose(); | 147 | chartInstance.current.dispose(); |
| 117 | } | 148 | } |
| 118 | 149 | ||
| 119 | - // 初始化新图表 | ||
| 120 | chartInstance.current = echarts.init(chartRef.current); | 150 | chartInstance.current = echarts.init(chartRef.current); |
| 121 | chartInstance.current.setOption(getOption(activeTabKey, data)); | 151 | chartInstance.current.setOption(getOption(activeTabKey, data)); |
| 122 | 152 | ||
| 123 | - // 窗口resize监听 | ||
| 124 | const resizeHandler = () => chartInstance.current?.resize(); | 153 | const resizeHandler = () => chartInstance.current?.resize(); |
| 125 | window.addEventListener("resize", resizeHandler); | 154 | window.addEventListener("resize", resizeHandler); |
| 126 | 155 | ||
| 127 | - // 清理函数 | ||
| 128 | return () => { | 156 | return () => { |
| 129 | window.removeEventListener("resize", resizeHandler); | 157 | window.removeEventListener("resize", resizeHandler); |
| 130 | chartInstance.current?.dispose(); | 158 | chartInstance.current?.dispose(); |
| @@ -133,7 +161,7 @@ export function ChartComponent({ | @@ -133,7 +161,7 @@ export function ChartComponent({ | ||
| 133 | 161 | ||
| 134 | return ( | 162 | return ( |
| 135 | <Card | 163 | <Card |
| 136 | - style={{ width: "100%", minHeight: 400 }} | 164 | + style={{ width: "auto", minHeight: 400 }} |
| 137 | tabList={tabList} | 165 | tabList={tabList} |
| 138 | activeTabKey={activeTabKey} | 166 | activeTabKey={activeTabKey} |
| 139 | onTabChange={setActiveTabKey} | 167 | onTabChange={setActiveTabKey} |
| @@ -145,6 +173,7 @@ export function ChartComponent({ | @@ -145,6 +173,7 @@ export function ChartComponent({ | ||
| 145 | width: "100%", | 173 | width: "100%", |
| 146 | height: 400, | 174 | height: 400, |
| 147 | minHeight: 400, | 175 | minHeight: 400, |
| 176 | + alignItems: "center", | ||
| 148 | }} | 177 | }} |
| 149 | /> | 178 | /> |
| 150 | </Card> | 179 | </Card> |
| @@ -7,21 +7,21 @@ export interface ValueItem { | @@ -7,21 +7,21 @@ export interface ValueItem { | ||
| 7 | 7 | ||
| 8 | export interface ChartData { | 8 | export interface ChartData { |
| 9 | categories: string[]; | 9 | categories: string[]; |
| 10 | - values: ValueItem[]; | 10 | + values: Array<number | ValueItem>; |
| 11 | } | 11 | } |
| 12 | + | ||
| 12 | export interface ChartComponentProps { | 13 | export interface ChartComponentProps { |
| 13 | data: { | 14 | data: { |
| 14 | categories: string[]; | 15 | categories: string[]; |
| 15 | - values: ValueItem[]; | 16 | + values: Array<number | ValueItem>; |
| 16 | }; | 17 | }; |
| 17 | } | 18 | } |
| 18 | 19 | ||
| 19 | export function extractDataFromText(text: string): ChartComponentProps | null { | 20 | export function extractDataFromText(text: string): ChartComponentProps | null { |
| 20 | - const startMarkers = ["```javascript", "```json"]; | 21 | + const startMarkers = ["```javascript", "```json", "```typescript"]; |
| 21 | let dataStartIndex = -1; | 22 | let dataStartIndex = -1; |
| 22 | let markerLength = 0; | 23 | let markerLength = 0; |
| 23 | 24 | ||
| 24 | - // 查找有效的数据块起始标记 | ||
| 25 | for (const marker of startMarkers) { | 25 | for (const marker of startMarkers) { |
| 26 | const index = text.indexOf(marker); | 26 | const index = text.indexOf(marker); |
| 27 | if (index !== -1) { | 27 | if (index !== -1) { |
| @@ -33,20 +33,16 @@ export function extractDataFromText(text: string): ChartComponentProps | null { | @@ -33,20 +33,16 @@ export function extractDataFromText(text: string): ChartComponentProps | null { | ||
| 33 | 33 | ||
| 34 | let parsedData: any = null; | 34 | let parsedData: any = null; |
| 35 | 35 | ||
| 36 | - // 如果找到有效数据块 | ||
| 37 | if (dataStartIndex !== -1) { | 36 | if (dataStartIndex !== -1) { |
| 38 | - // 查找数据块结束标记 | ||
| 39 | const dataEndIndex = text.indexOf("```", dataStartIndex + markerLength); | 37 | const dataEndIndex = text.indexOf("```", dataStartIndex + markerLength); |
| 40 | if (dataEndIndex !== -1) { | 38 | if (dataEndIndex !== -1) { |
| 41 | - // 提取并清理数据块内容 | ||
| 42 | const dataBlock = text | 39 | const dataBlock = text |
| 43 | .slice(dataStartIndex + markerLength, dataEndIndex) | 40 | .slice(dataStartIndex + markerLength, dataEndIndex) |
| 44 | .trim() | 41 | .trim() |
| 45 | - .replace(/'/g, '"') // 转换单引号为双引号 | ||
| 46 | - .replace(/(\w+)(?=\s*:)/g, '"$1"'); // 为键添加双引号 | 42 | + .replace(/'/g, '"') |
| 43 | + .replace(/(\w+)(?=\s*:)/g, '"$1"'); | ||
| 47 | 44 | ||
| 48 | try { | 45 | try { |
| 49 | - // 尝试安全解析数据块内容 | ||
| 50 | parsedData = JSON.parse(dataBlock); | 46 | parsedData = JSON.parse(dataBlock); |
| 51 | } catch (error) { | 47 | } catch (error) { |
| 52 | return null; | 48 | return null; |
| @@ -54,11 +50,9 @@ export function extractDataFromText(text: string): ChartComponentProps | null { | @@ -54,11 +50,9 @@ export function extractDataFromText(text: string): ChartComponentProps | null { | ||
| 54 | } | 50 | } |
| 55 | } | 51 | } |
| 56 | 52 | ||
| 57 | - // 如果没有找到数据块,尝试将整个文本解析为 ChartData | ||
| 58 | if (!parsedData) { | 53 | if (!parsedData) { |
| 59 | try { | 54 | try { |
| 60 | const potentialData: any = JSON.parse(text); | 55 | const potentialData: any = JSON.parse(text); |
| 61 | - // 验证解析后的数据是否符合 ChartData 结构 | ||
| 62 | if ( | 56 | if ( |
| 63 | potentialData && | 57 | potentialData && |
| 64 | Array.isArray(potentialData.categories) && | 58 | Array.isArray(potentialData.categories) && |
| @@ -66,32 +60,33 @@ export function extractDataFromText(text: string): ChartComponentProps | null { | @@ -66,32 +60,33 @@ export function extractDataFromText(text: string): ChartComponentProps | null { | ||
| 66 | Array.isArray(potentialData.values) && | 60 | Array.isArray(potentialData.values) && |
| 67 | potentialData.values.every( | 61 | potentialData.values.every( |
| 68 | (v: any) => | 62 | (v: any) => |
| 69 | - typeof v?.value === "number" && | ||
| 70 | - v?.itemStyle && | ||
| 71 | - typeof v.itemStyle?.color === "string", | 63 | + typeof v === "number" || |
| 64 | + (typeof v?.value === "number" && | ||
| 65 | + (v.itemStyle === undefined || | ||
| 66 | + typeof v.itemStyle?.color === "string")), | ||
| 72 | ) | 67 | ) |
| 73 | ) { | 68 | ) { |
| 74 | parsedData = potentialData; | 69 | parsedData = potentialData; |
| 75 | } | 70 | } |
| 76 | } catch (error) { | 71 | } catch (error) { |
| 77 | - return null; // 如果解析失败,返回 null | 72 | + return null; |
| 78 | } | 73 | } |
| 79 | } | 74 | } |
| 80 | 75 | ||
| 81 | - // 如果成功解析了数据并且符合 ChartData 类型,返回 | ||
| 82 | if ( | 76 | if ( |
| 83 | parsedData && | 77 | parsedData && |
| 84 | Array.isArray(parsedData.categories) && | 78 | Array.isArray(parsedData.categories) && |
| 85 | Array.isArray(parsedData.values) && | 79 | Array.isArray(parsedData.values) && |
| 86 | parsedData.values.every( | 80 | parsedData.values.every( |
| 87 | (v: any) => | 81 | (v: any) => |
| 88 | - typeof v?.value === "number" && | ||
| 89 | - v?.itemStyle && | ||
| 90 | - typeof v.itemStyle?.color === "string", | 82 | + typeof v === "number" || |
| 83 | + (typeof v?.value === "number" && | ||
| 84 | + (v.itemStyle === undefined || | ||
| 85 | + typeof v.itemStyle?.color === "string")), | ||
| 91 | ) | 86 | ) |
| 92 | ) { | 87 | ) { |
| 93 | return { data: parsedData as ChartData }; | 88 | return { data: parsedData as ChartData }; |
| 94 | } | 89 | } |
| 95 | 90 | ||
| 96 | - return null; // 如果未满足条件,则返回 null | 91 | + return null; |
| 97 | } | 92 | } |
| 1 | @import "../styles/animation.scss"; | 1 | @import "../styles/animation.scss"; |
| 2 | 2 | ||
| 3 | +.disabled { | ||
| 4 | + opacity: 0.5; | ||
| 5 | + cursor: not-allowed !important; | ||
| 6 | + pointer-events: none; /* 可选,禁用所有鼠标事件 */ | ||
| 7 | +} | ||
| 8 | + | ||
| 9 | +.message-file{ | ||
| 10 | + align-items: center; | ||
| 11 | + padding: 6px 12px; | ||
| 12 | + background-color: var(--white); | ||
| 13 | + border: 1px solid rgba(136, 136, 136, 0.2); | ||
| 14 | + border-radius: 5px; | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | + | ||
| 18 | +.attach-file { | ||
| 19 | + position: absolute; | ||
| 20 | + left: 30px; | ||
| 21 | + bottom: 32px; | ||
| 22 | + display: flex; | ||
| 23 | + align-items: center; | ||
| 24 | + padding: 6px 12px; | ||
| 25 | + background-color: var(--white); | ||
| 26 | + border: 1px solid rgba(136, 136, 136, 0.2); | ||
| 27 | + border-radius: 5px; | ||
| 28 | + cursor: default; | ||
| 29 | + gap: 8px; | ||
| 30 | + | ||
| 31 | + &:hover .delete-file { | ||
| 32 | + opacity: 1; | ||
| 33 | + } | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +.file-name { | ||
| 37 | + max-width: 200px; | ||
| 38 | + overflow: hidden; | ||
| 39 | + text-overflow: ellipsis; | ||
| 40 | + white-space: nowrap; | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +.delete-file { | ||
| 44 | + opacity: 0; | ||
| 45 | + transition: opacity 0.2s ease; | ||
| 46 | + cursor: pointer; | ||
| 47 | + display: flex; | ||
| 48 | + padding: 4px; | ||
| 49 | + border-radius: 4px; | ||
| 50 | + | ||
| 51 | + &:hover { | ||
| 52 | + background-color: rgba(0, 0, 0, 0.1); | ||
| 53 | + } | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | + | ||
| 3 | .attach-images { | 57 | .attach-images { |
| 4 | position: absolute; | 58 | position: absolute; |
| 5 | left: 30px; | 59 | left: 30px; |
| @@ -655,9 +709,6 @@ | @@ -655,9 +709,6 @@ | ||
| 655 | min-height: 68px; | 709 | min-height: 68px; |
| 656 | } | 710 | } |
| 657 | 711 | ||
| 658 | -.chat-input:focus { | ||
| 659 | -} | ||
| 660 | - | ||
| 661 | .chat-input-send { | 712 | .chat-input-send { |
| 662 | background-color: var(--primary); | 713 | background-color: var(--primary); |
| 663 | color: white; | 714 | color: white; |
| @@ -54,6 +54,7 @@ import ExcelIcon from "../icons/excel.svg"; | @@ -54,6 +54,7 @@ import ExcelIcon from "../icons/excel.svg"; | ||
| 54 | import WordIcon from "../icons/word.svg"; | 54 | import WordIcon from "../icons/word.svg"; |
| 55 | import MindIcon from "../icons/mind.svg"; | 55 | import MindIcon from "../icons/mind.svg"; |
| 56 | import PptIcon from "../icons/ppt.svg"; | 56 | import PptIcon from "../icons/ppt.svg"; |
| 57 | +import FileIcon from "../icons/file.svg"; | ||
| 57 | 58 | ||
| 58 | import { | 59 | import { |
| 59 | BOT_HELLO, | 60 | BOT_HELLO, |
| @@ -135,9 +136,10 @@ import clsx from "clsx"; | @@ -135,9 +136,10 @@ import clsx from "clsx"; | ||
| 135 | import { getAvailableClientsCount, isMcpEnabled } from "../mcp/actions"; | 136 | import { getAvailableClientsCount, isMcpEnabled } from "../mcp/actions"; |
| 136 | 137 | ||
| 137 | //20250317新增 | 138 | //20250317新增 |
| 138 | -import { toExcel } from "../utils/excelAndWordUtils/export2Excel"; | 139 | +import { getExcelData, toExcel } from "../utils/excelAndWordUtils/export2Excel"; |
| 139 | import { exportWord } from "../utils/excelAndWordUtils/word"; | 140 | import { exportWord } from "../utils/excelAndWordUtils/word"; |
| 140 | import { getMindPrompt } from "../utils/prompt"; | 141 | import { getMindPrompt } from "../utils/prompt"; |
| 142 | +import { message } from "antd"; | ||
| 141 | const localStorage = safeLocalStorage(); | 143 | const localStorage = safeLocalStorage(); |
| 142 | 144 | ||
| 143 | const ttsPlayer = createTTSPlayer(); | 145 | const ttsPlayer = createTTSPlayer(); |
| @@ -436,6 +438,7 @@ export function ChatAction(props: { | @@ -436,6 +438,7 @@ export function ChatAction(props: { | ||
| 436 | text: string; | 438 | text: string; |
| 437 | icon: JSX.Element; | 439 | icon: JSX.Element; |
| 438 | onClick: () => void; | 440 | onClick: () => void; |
| 441 | + disabled?: boolean; | ||
| 439 | }) { | 442 | }) { |
| 440 | const iconRef = useRef<HTMLDivElement>(null); | 443 | const iconRef = useRef<HTMLDivElement>(null); |
| 441 | const textRef = useRef<HTMLDivElement>(null); | 444 | const textRef = useRef<HTMLDivElement>(null); |
| @@ -444,6 +447,8 @@ export function ChatAction(props: { | @@ -444,6 +447,8 @@ export function ChatAction(props: { | ||
| 444 | icon: 16, | 447 | icon: 16, |
| 445 | }); | 448 | }); |
| 446 | 449 | ||
| 450 | + const { disabled = false } = props; | ||
| 451 | + | ||
| 447 | function updateWidth() { | 452 | function updateWidth() { |
| 448 | if (!iconRef.current || !textRef.current) return; | 453 | if (!iconRef.current || !textRef.current) return; |
| 449 | const getWidth = (dom: HTMLDivElement) => dom.getBoundingClientRect().width; | 454 | const getWidth = (dom: HTMLDivElement) => dom.getBoundingClientRect().width; |
| @@ -457,8 +462,13 @@ export function ChatAction(props: { | @@ -457,8 +462,13 @@ export function ChatAction(props: { | ||
| 457 | 462 | ||
| 458 | return ( | 463 | return ( |
| 459 | <div | 464 | <div |
| 460 | - className={clsx(styles["chat-input-action"], "clickable")} | 465 | + className={clsx( |
| 466 | + styles["chat-input-action"], | ||
| 467 | + !disabled && "clickable", | ||
| 468 | + disabled && styles["disabled"], | ||
| 469 | + )} | ||
| 461 | onClick={() => { | 470 | onClick={() => { |
| 471 | + if (disabled) return; | ||
| 462 | props.onClick(); | 472 | props.onClick(); |
| 463 | setTimeout(updateWidth, 1); | 473 | setTimeout(updateWidth, 1); |
| 464 | }} | 474 | }} |
| @@ -523,6 +533,7 @@ function useScrollToBottom( | @@ -523,6 +533,7 @@ function useScrollToBottom( | ||
| 523 | } | 533 | } |
| 524 | 534 | ||
| 525 | export function ChatActions(props: { | 535 | export function ChatActions(props: { |
| 536 | + uploadFile: () => void; | ||
| 526 | uploadImage: () => void; | 537 | uploadImage: () => void; |
| 527 | setAttachImages: (images: string[]) => void; | 538 | setAttachImages: (images: string[]) => void; |
| 528 | setUploading: (uploading: boolean) => void; | 539 | setUploading: (uploading: boolean) => void; |
| @@ -660,6 +671,11 @@ export function ChatActions(props: { | @@ -660,6 +671,11 @@ export function ChatActions(props: { | ||
| 660 | /> | 671 | /> |
| 661 | )} | 672 | )} |
| 662 | <ChatAction | 673 | <ChatAction |
| 674 | + onClick={props.uploadFile} | ||
| 675 | + text="上传文件" | ||
| 676 | + icon={props.uploading ? <LoadingButtonIcon /> : <FileIcon />} | ||
| 677 | + /> | ||
| 678 | + <ChatAction | ||
| 663 | onClick={nextTheme} | 679 | onClick={nextTheme} |
| 664 | text={Locale.Chat.InputActions.Theme[theme]} | 680 | text={Locale.Chat.InputActions.Theme[theme]} |
| 665 | icon={ | 681 | icon={ |
| @@ -1135,10 +1151,15 @@ function _Chat() { | @@ -1135,10 +1151,15 @@ function _Chat() { | ||
| 1135 | 1151 | ||
| 1136 | const doSubmit = (userInput: string) => { | 1152 | const doSubmit = (userInput: string) => { |
| 1137 | if (userInput.trim() === "" && isEmpty(attachImages)) return; | 1153 | if (userInput.trim() === "" && isEmpty(attachImages)) return; |
| 1154 | + if (fileData) { | ||
| 1155 | + userInput = fileData + userInput; | ||
| 1156 | + } | ||
| 1138 | const matchCommand = chatCommands.match(userInput); | 1157 | const matchCommand = chatCommands.match(userInput); |
| 1139 | if (matchCommand.matched) { | 1158 | if (matchCommand.matched) { |
| 1140 | setUserInput(""); | 1159 | setUserInput(""); |
| 1141 | setPromptHints([]); | 1160 | setPromptHints([]); |
| 1161 | + setFileData(""); | ||
| 1162 | + setFileName(""); | ||
| 1142 | matchCommand.invoke(); | 1163 | matchCommand.invoke(); |
| 1143 | return; | 1164 | return; |
| 1144 | } | 1165 | } |
| @@ -1148,7 +1169,10 @@ function _Chat() { | @@ -1148,7 +1169,10 @@ function _Chat() { | ||
| 1148 | .then(() => setIsLoading(false)); | 1169 | .then(() => setIsLoading(false)); |
| 1149 | setAttachImages([]); | 1170 | setAttachImages([]); |
| 1150 | chatStore.setLastInput(userInput); | 1171 | chatStore.setLastInput(userInput); |
| 1172 | + | ||
| 1151 | setUserInput(""); | 1173 | setUserInput(""); |
| 1174 | + setFileData(""); | ||
| 1175 | + setFileName(""); | ||
| 1152 | setPromptHints([]); | 1176 | setPromptHints([]); |
| 1153 | if (!isMobileScreen) inputRef.current?.focus(); | 1177 | if (!isMobileScreen) inputRef.current?.focus(); |
| 1154 | setAutoScroll(true); | 1178 | setAutoScroll(true); |
| @@ -1584,6 +1608,7 @@ function _Chat() { | @@ -1584,6 +1608,7 @@ function _Chat() { | ||
| 1584 | ); | 1608 | ); |
| 1585 | 1609 | ||
| 1586 | async function uploadImage() { | 1610 | async function uploadImage() { |
| 1611 | + if (fileData) return; | ||
| 1587 | const images: string[] = []; | 1612 | const images: string[] = []; |
| 1588 | images.push(...attachImages); | 1613 | images.push(...attachImages); |
| 1589 | 1614 | ||
| @@ -1744,7 +1769,40 @@ function _Chat() { | @@ -1744,7 +1769,40 @@ function _Chat() { | ||
| 1744 | function toPowerpoint(pptMessage: string) { | 1769 | function toPowerpoint(pptMessage: string) { |
| 1745 | navigate("/powerpoint", { state: { msg: true, pptMessage: pptMessage } }); | 1770 | navigate("/powerpoint", { state: { msg: true, pptMessage: pptMessage } }); |
| 1746 | } | 1771 | } |
| 1747 | - | 1772 | + //20250402新增上传文件 |
| 1773 | + const [fileData, setFileData] = useState(""); | ||
| 1774 | + const [fileName, setFileName] = useState(""); | ||
| 1775 | + | ||
| 1776 | + async function uploadFile() { | ||
| 1777 | + // 创建一个隐藏的文件输入框 | ||
| 1778 | + const fileInput = document.createElement("input"); | ||
| 1779 | + fileInput.type = "file"; | ||
| 1780 | + fileInput.accept = ".xlsx, .xls"; | ||
| 1781 | + fileInput.multiple = false; | ||
| 1782 | + fileInput.onchange = (event: Event) => { | ||
| 1783 | + const target = event.target as HTMLInputElement; | ||
| 1784 | + const files = target.files; | ||
| 1785 | + if (files && files.length > 0) { | ||
| 1786 | + const file = files[0]; // 获取第一个文件 | ||
| 1787 | + getExcelData(file) | ||
| 1788 | + .then((data) => { | ||
| 1789 | + const value = `'''filedata | ||
| 1790 | + ${file.name} | ||
| 1791 | + ${JSON.stringify(data)} | ||
| 1792 | + '''filedata | ||
| 1793 | + `; | ||
| 1794 | + setFileData(value); | ||
| 1795 | + setFileName(file.name); | ||
| 1796 | + console.log(value); | ||
| 1797 | + }) | ||
| 1798 | + .catch((error) => { | ||
| 1799 | + message.error("上传失败"); | ||
| 1800 | + }); | ||
| 1801 | + } | ||
| 1802 | + fileInput.remove(); | ||
| 1803 | + }; | ||
| 1804 | + fileInput.click(); | ||
| 1805 | + } | ||
| 1748 | return ( | 1806 | return ( |
| 1749 | <> | 1807 | <> |
| 1750 | <div className={styles.chat} key={session.id}> | 1808 | <div className={styles.chat} key={session.id}> |
| @@ -1992,7 +2050,7 @@ function _Chat() { | @@ -1992,7 +2050,7 @@ function _Chat() { | ||
| 1992 | </> | 2050 | </> |
| 1993 | )} */} | 2051 | )} */} |
| 1994 | <ChatAction | 2052 | <ChatAction |
| 1995 | - text={Locale.Chat.Actions.Excel} | 2053 | + text={Locale.Export.Excel} |
| 1996 | icon={<ExcelIcon />} | 2054 | icon={<ExcelIcon />} |
| 1997 | onClick={() => | 2055 | onClick={() => |
| 1998 | toExcel( | 2056 | toExcel( |
| @@ -2005,7 +2063,7 @@ function _Chat() { | @@ -2005,7 +2063,7 @@ function _Chat() { | ||
| 2005 | ) && ( | 2063 | ) && ( |
| 2006 | <> | 2064 | <> |
| 2007 | <ChatAction | 2065 | <ChatAction |
| 2008 | - text={Locale.Chat.Actions.Word} | 2066 | + text={Locale.Export.Word} |
| 2009 | icon={<WordIcon />} | 2067 | icon={<WordIcon />} |
| 2010 | onClick={() => | 2068 | onClick={() => |
| 2011 | exportWord( | 2069 | exportWord( |
| @@ -2014,7 +2072,7 @@ function _Chat() { | @@ -2014,7 +2072,7 @@ function _Chat() { | ||
| 2014 | } | 2072 | } |
| 2015 | /> | 2073 | /> |
| 2016 | <ChatAction | 2074 | <ChatAction |
| 2017 | - text={Locale.Chat.Actions.Mind} | 2075 | + text={Locale.Export.Mind.title} |
| 2018 | icon={<MindIcon />} | 2076 | icon={<MindIcon />} |
| 2019 | onClick={() => { | 2077 | onClick={() => { |
| 2020 | toMind( | 2078 | toMind( |
| @@ -2026,7 +2084,7 @@ function _Chat() { | @@ -2026,7 +2084,7 @@ function _Chat() { | ||
| 2026 | </> | 2084 | </> |
| 2027 | )} | 2085 | )} |
| 2028 | <ChatAction | 2086 | <ChatAction |
| 2029 | - text={Locale.Chat.Actions.Ppt} | 2087 | + text={Locale.Export.Ppt} |
| 2030 | icon={<PptIcon />} | 2088 | icon={<PptIcon />} |
| 2031 | onClick={() => | 2089 | onClick={() => |
| 2032 | toPowerpoint( | 2090 | toPowerpoint( |
| @@ -2168,6 +2226,7 @@ function _Chat() { | @@ -2168,6 +2226,7 @@ function _Chat() { | ||
| 2168 | /> | 2226 | /> |
| 2169 | 2227 | ||
| 2170 | <ChatActions | 2228 | <ChatActions |
| 2229 | + uploadFile={uploadFile} | ||
| 2171 | uploadImage={uploadImage} | 2230 | uploadImage={uploadImage} |
| 2172 | setAttachImages={setAttachImages} | 2231 | setAttachImages={setAttachImages} |
| 2173 | setUploading={setUploading} | 2232 | setUploading={setUploading} |
| @@ -2193,7 +2252,7 @@ function _Chat() { | @@ -2193,7 +2252,7 @@ function _Chat() { | ||
| 2193 | <label | 2252 | <label |
| 2194 | className={clsx(styles["chat-input-panel-inner"], { | 2253 | className={clsx(styles["chat-input-panel-inner"], { |
| 2195 | [styles["chat-input-panel-inner-attach"]]: | 2254 | [styles["chat-input-panel-inner-attach"]]: |
| 2196 | - attachImages.length !== 0, | 2255 | + attachImages.length !== 0 || fileName, |
| 2197 | })} | 2256 | })} |
| 2198 | htmlFor="chat-input" | 2257 | htmlFor="chat-input" |
| 2199 | > | 2258 | > |
| @@ -2238,6 +2297,20 @@ function _Chat() { | @@ -2238,6 +2297,20 @@ function _Chat() { | ||
| 2238 | })} | 2297 | })} |
| 2239 | </div> | 2298 | </div> |
| 2240 | )} | 2299 | )} |
| 2300 | + {fileName && ( | ||
| 2301 | + <div className={styles["attach-file"]}> | ||
| 2302 | + <span className={styles["file-name"]}>{fileName}</span> | ||
| 2303 | + <div | ||
| 2304 | + className={styles["delete-file"]} | ||
| 2305 | + onClick={() => { | ||
| 2306 | + setFileData(""); | ||
| 2307 | + setFileName(""); | ||
| 2308 | + }} | ||
| 2309 | + > | ||
| 2310 | + <DeleteIcon /> | ||
| 2311 | + </div> | ||
| 2312 | + </div> | ||
| 2313 | + )} | ||
| 2241 | <IconButton | 2314 | <IconButton |
| 2242 | icon={<SendWhiteIcon />} | 2315 | icon={<SendWhiteIcon />} |
| 2243 | text={Locale.Chat.Send} | 2316 | text={Locale.Chat.Send} |
| @@ -27,7 +27,7 @@ import clsx from "clsx"; | @@ -27,7 +27,7 @@ import clsx from "clsx"; | ||
| 27 | 27 | ||
| 28 | import { ChartComponentProps, extractDataFromText } from "./chart/getChartData"; | 28 | import { ChartComponentProps, extractDataFromText } from "./chart/getChartData"; |
| 29 | import { ChartComponent } from "./chart"; | 29 | import { ChartComponent } from "./chart"; |
| 30 | - | 30 | +import styles from "./chat.module.scss"; |
| 31 | export function Mermaid(props: { code: string }) { | 31 | export function Mermaid(props: { code: string }) { |
| 32 | const ref = useRef<HTMLDivElement>(null); | 32 | const ref = useRef<HTMLDivElement>(null); |
| 33 | const [hasError, setHasError] = useState(false); | 33 | const [hasError, setHasError] = useState(false); |
| @@ -110,16 +110,11 @@ export function PreCode(props: { children: any }) { | @@ -110,16 +110,11 @@ export function PreCode(props: { children: any }) { | ||
| 110 | useEffect(() => { | 110 | useEffect(() => { |
| 111 | if (ref.current) { | 111 | if (ref.current) { |
| 112 | const textContent = ref.current.innerText; | 112 | const textContent = ref.current.innerText; |
| 113 | - if (textContent) { | ||
| 114 | - console.log("有textContent"); | ||
| 115 | - console.log(textContent); | ||
| 116 | - const data = extractDataFromText(textContent); | ||
| 117 | - console.log(data); | ||
| 118 | - if (data) { | ||
| 119 | - console.log("data"); | ||
| 120 | - setChartData(data); | ||
| 121 | - } | ||
| 122 | - } | 113 | + |
| 114 | + textContent && | ||
| 115 | + extractDataFromText(textContent) && | ||
| 116 | + setChartData(extractDataFromText(textContent)); | ||
| 117 | + | ||
| 123 | const codeElements = ref.current.querySelectorAll( | 118 | const codeElements = ref.current.querySelectorAll( |
| 124 | "code", | 119 | "code", |
| 125 | ) as NodeListOf<HTMLElement>; | 120 | ) as NodeListOf<HTMLElement>; |
| @@ -281,11 +276,138 @@ function tryWrapHtmlCode(text: string) { | @@ -281,11 +276,138 @@ function tryWrapHtmlCode(text: string) { | ||
| 281 | }, | 276 | }, |
| 282 | ); | 277 | ); |
| 283 | } | 278 | } |
| 279 | +// 首先定义完善的类型 | ||
| 280 | +type FileMatch = { | ||
| 281 | + fullMatch: string; | ||
| 282 | + fileName: string; | ||
| 283 | + start: number; | ||
| 284 | + end: number; | ||
| 285 | +}; | ||
| 284 | 286 | ||
| 285 | function _MarkDownContent(props: { content: string }) { | 287 | function _MarkDownContent(props: { content: string }) { |
| 286 | const escapedContent = useMemo(() => { | 288 | const escapedContent = useMemo(() => { |
| 287 | return tryWrapHtmlCode(escapeBrackets(props.content)); | 289 | return tryWrapHtmlCode(escapeBrackets(props.content)); |
| 288 | }, [props.content]); | 290 | }, [props.content]); |
| 291 | + | ||
| 292 | + type TextSegment = { | ||
| 293 | + type: "text"; | ||
| 294 | + content: string; | ||
| 295 | + start: number; | ||
| 296 | + end: number; | ||
| 297 | + }; | ||
| 298 | + | ||
| 299 | + type ElementSegment = { | ||
| 300 | + type: "element"; | ||
| 301 | + node: React.ReactElement; | ||
| 302 | + }; | ||
| 303 | + | ||
| 304 | + type Segment = TextSegment | ElementSegment; | ||
| 305 | + | ||
| 306 | + // 将子节点转换为可分析的段落段 | ||
| 307 | + function parseChildrenToSegments(children: React.ReactNode): Segment[] { | ||
| 308 | + const segments: Segment[] = []; | ||
| 309 | + let textBuffer = ""; | ||
| 310 | + let globalIndex = 0; | ||
| 311 | + | ||
| 312 | + React.Children.forEach(children, (child) => { | ||
| 313 | + if (typeof child === "string") { | ||
| 314 | + // 合并连续文本节点 | ||
| 315 | + textBuffer += child; | ||
| 316 | + globalIndex += child.length; | ||
| 317 | + } else { | ||
| 318 | + // 遇到非文本节点时,先提交缓冲的文本 | ||
| 319 | + if (textBuffer) { | ||
| 320 | + segments.push({ | ||
| 321 | + type: "text", | ||
| 322 | + content: textBuffer, | ||
| 323 | + start: globalIndex - textBuffer.length, | ||
| 324 | + end: globalIndex, | ||
| 325 | + }); | ||
| 326 | + textBuffer = ""; | ||
| 327 | + } | ||
| 328 | + // 记录元素节点 | ||
| 329 | + segments.push({ | ||
| 330 | + type: "element", | ||
| 331 | + node: child as React.ReactElement, | ||
| 332 | + }); | ||
| 333 | + } | ||
| 334 | + }); | ||
| 335 | + | ||
| 336 | + // 提交最后缓冲的文本 | ||
| 337 | + if (textBuffer) { | ||
| 338 | + segments.push({ | ||
| 339 | + type: "text", | ||
| 340 | + content: textBuffer, | ||
| 341 | + start: globalIndex - textBuffer.length, | ||
| 342 | + end: globalIndex, | ||
| 343 | + }); | ||
| 344 | + } | ||
| 345 | + | ||
| 346 | + return segments; | ||
| 347 | + } | ||
| 348 | + | ||
| 349 | + // 主处理函数 | ||
| 350 | + function CustomParagraph({ children }: { children: React.ReactNode }) { | ||
| 351 | + const segments = parseChildrenToSegments(children); | ||
| 352 | + const fullText = segments | ||
| 353 | + .filter((s): s is TextSegment => s.type === "text") | ||
| 354 | + .map((s) => s.content) | ||
| 355 | + .join(""); | ||
| 356 | + const regex = /'''filedata\s+([^\n]+)[\s\S]*?'''filedata/g; | ||
| 357 | + const matches: Array<{ | ||
| 358 | + fileName: string; | ||
| 359 | + start: number; | ||
| 360 | + end: number; | ||
| 361 | + }> = []; | ||
| 362 | + | ||
| 363 | + let match; | ||
| 364 | + while ((match = regex.exec(fullText)) !== null) { | ||
| 365 | + matches.push({ | ||
| 366 | + fileName: match[1].trim(), | ||
| 367 | + start: match.index, | ||
| 368 | + end: match.index + match[0].length, | ||
| 369 | + }); | ||
| 370 | + } | ||
| 371 | + const newChildren: React.ReactNode[] = []; | ||
| 372 | + let lastPos = 0; | ||
| 373 | + let currentSegmentIndex = 0; | ||
| 374 | + matches.forEach((match) => { | ||
| 375 | + while (currentSegmentIndex < segments.length) { | ||
| 376 | + const segment = segments[currentSegmentIndex]; | ||
| 377 | + if (segment.type === "element") { | ||
| 378 | + newChildren.push(segment.node); | ||
| 379 | + currentSegmentIndex++; | ||
| 380 | + continue; | ||
| 381 | + } | ||
| 382 | + const segmentEnd = segment.end; | ||
| 383 | + if (segmentEnd <= match.start) { | ||
| 384 | + newChildren.push(segment.content.slice(lastPos - segment.start)); | ||
| 385 | + lastPos = segmentEnd; | ||
| 386 | + currentSegmentIndex++; | ||
| 387 | + } else { | ||
| 388 | + break; | ||
| 389 | + } | ||
| 390 | + } | ||
| 391 | + newChildren.push( | ||
| 392 | + <div key={`file-${match.start}`} className={styles["message-file"]}> | ||
| 393 | + <span>{match.fileName}</span> | ||
| 394 | + </div>, | ||
| 395 | + ); | ||
| 396 | + lastPos = match.end; | ||
| 397 | + }); | ||
| 398 | + while (currentSegmentIndex < segments.length) { | ||
| 399 | + const segment = segments[currentSegmentIndex]; | ||
| 400 | + if (segment.type === "element") { | ||
| 401 | + newChildren.push(segment.node); | ||
| 402 | + } else { | ||
| 403 | + newChildren.push(segment.content.slice(lastPos - segment.start)); | ||
| 404 | + } | ||
| 405 | + currentSegmentIndex++; | ||
| 406 | + } | ||
| 407 | + | ||
| 408 | + return <p dir="auto">{newChildren}</p>; | ||
| 409 | + } | ||
| 410 | + | ||
| 289 | return ( | 411 | return ( |
| 290 | <ReactMarkdown | 412 | <ReactMarkdown |
| 291 | remarkPlugins={[RemarkMath, RemarkGfm, RemarkBreaks]} | 413 | remarkPlugins={[RemarkMath, RemarkGfm, RemarkBreaks]} |
| @@ -302,7 +424,7 @@ function _MarkDownContent(props: { content: string }) { | @@ -302,7 +424,7 @@ function _MarkDownContent(props: { content: string }) { | ||
| 302 | components={{ | 424 | components={{ |
| 303 | pre: PreCode, | 425 | pre: PreCode, |
| 304 | code: CustomCode, | 426 | code: CustomCode, |
| 305 | - p: (pProps) => <p {...pProps} dir="auto" />, | 427 | + p: CustomParagraph, |
| 306 | a: (aProps) => { | 428 | a: (aProps) => { |
| 307 | const href = aProps.href || ""; | 429 | const href = aProps.href || ""; |
| 308 | if (/\.(aac|mp3|opus|wav)$/.test(href)) { | 430 | if (/\.(aac|mp3|opus|wav)$/.test(href)) { |
| @@ -160,13 +160,13 @@ export function WritingPage() { | @@ -160,13 +160,13 @@ export function WritingPage() { | ||
| 160 | )} | 160 | )} |
| 161 | 161 | ||
| 162 | <ChatAction | 162 | <ChatAction |
| 163 | - text={Locale.Chat.Actions.Pdf} | 163 | + text={Locale.Export.Pdf} |
| 164 | icon={<PdfIcon />} | 164 | icon={<PdfIcon />} |
| 165 | onClick={() => {}} | 165 | onClick={() => {}} |
| 166 | /> | 166 | /> |
| 167 | {htmlCode && ( | 167 | {htmlCode && ( |
| 168 | <ChatAction | 168 | <ChatAction |
| 169 | - text={Locale.Chat.Actions.Word} | 169 | + text={Locale.Export.Word} |
| 170 | icon={<WordIcon />} | 170 | icon={<WordIcon />} |
| 171 | onClick={() => { | 171 | onClick={() => { |
| 172 | exportWord(htmlCode); | 172 | exportWord(htmlCode); |
| @@ -174,17 +174,18 @@ export function WritingPage() { | @@ -174,17 +174,18 @@ export function WritingPage() { | ||
| 174 | /> | 174 | /> |
| 175 | )} | 175 | )} |
| 176 | <ChatAction | 176 | <ChatAction |
| 177 | - text={Locale.Chat.Actions.Excel} | 177 | + text={Locale.Export.Excel} |
| 178 | icon={<ExcelIcon />} | 178 | icon={<ExcelIcon />} |
| 179 | onClick={() => {}} | 179 | onClick={() => {}} |
| 180 | + disabled={true} | ||
| 180 | /> | 181 | /> |
| 181 | <ChatAction | 182 | <ChatAction |
| 182 | - text={Locale.Chat.Actions.Ppt} | 183 | + text={Locale.Export.Ppt} |
| 183 | icon={<PptIcon />} | 184 | icon={<PptIcon />} |
| 184 | onClick={() => {}} | 185 | onClick={() => {}} |
| 185 | /> | 186 | /> |
| 186 | <ChatAction | 187 | <ChatAction |
| 187 | - text={Locale.Chat.Actions.Mind} | 188 | + text={Locale.Export.Mind.title} |
| 188 | icon={<MindIcon />} | 189 | icon={<MindIcon />} |
| 189 | onClick={() => {}} | 190 | onClick={() => {}} |
| 190 | /> | 191 | /> |
app/icons/chart.svg
0 → 100644
| 1 | +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1743555941264" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4341" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M213.333333 853.333333a42.666667 42.666667 0 0 1-85.333333 0v-256a42.666667 42.666667 0 0 1 85.333333 0v256z m213.333334 0a42.666667 42.666667 0 0 1-85.333334 0v-384a42.666667 42.666667 0 0 1 85.333334 0v384z m213.333333 0a42.666667 42.666667 0 0 1-85.333333 0v-341.333333a42.666667 42.666667 0 0 1 85.333333 0v341.333333z m213.333333 0a42.666667 42.666667 0 0 1-85.333333 0V384a42.666667 42.666667 0 0 1 85.333333 0v469.333333zM197.333333 459.946667a42.666667 42.666667 0 1 1-53.333333-66.56l213.333333-170.666667a42.666667 42.666667 0 0 1 42.496-6.314667l192.512 76.970667 237.312-158.208a42.666667 42.666667 0 0 1 47.36 70.997333l-256 170.666667a42.666667 42.666667 0 0 1-39.509333 4.096l-190.293333-76.074667-193.877334 155.136z" p-id="4342"></path></svg> |
app/icons/file.svg
0 → 100644
| 1 | +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1743564801418" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2502" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M973.44 420.906667a42.666667 42.666667 0 0 0-32.853333-15.573334h-53.333334v-85.333333a85.333333 85.333333 0 0 0-85.333333-85.333333H533.333333l-93.866666-112.64A42.666667 42.666667 0 0 0 407.253333 106.666667h-277.333333a85.333333 85.333333 0 0 0-85.333333 85.333333v682.666667a37.333333 37.333333 0 0 0 0 8.533333v2.346667c0 2.133333 1.28 4.053333 2.133333 6.186666l1.28 2.56a27.306667 27.306667 0 0 0 3.2 5.333334v1.493333a47.573333 47.573333 0 0 0 5.546667 5.76 33.92 33.92 0 0 0 7.466666 4.693333h2.133334l5.973333 2.133334h782.933333a42.666667 42.666667 0 0 0 42.666667-34.346667l85.333333-426.666667a42.666667 42.666667 0 0 0-9.813333-31.786666zM387.2 192l93.866667 112.64a42.666667 42.666667 0 0 0 32.853333 15.36h288v85.333333H189.866667A42.666667 42.666667 0 0 0 149.333333 437.973333l-18.346666 77.013334V192z" fill="#363636" p-id="2503"></path></svg> |
| @@ -59,13 +59,8 @@ const cn = { | @@ -59,13 +59,8 @@ const cn = { | ||
| 59 | Speech: "朗读", | 59 | Speech: "朗读", |
| 60 | StopSpeech: "停止", | 60 | StopSpeech: "停止", |
| 61 | //20250317新增 | 61 | //20250317新增 |
| 62 | - Word: "导出Word", | ||
| 63 | - Excel: "下载Excel", | ||
| 64 | - Pdf: "导出PDF", | ||
| 65 | - Ppt: "导出PPT", | ||
| 66 | - Mind: "生成思维导图", | ||
| 67 | - Drag: "拖动模式", | ||
| 68 | ReWrite: "重写", | 62 | ReWrite: "重写", |
| 63 | + Chart: "查看图表", | ||
| 69 | }, | 64 | }, |
| 70 | Commands: { | 65 | Commands: { |
| 71 | new: "新建聊天", | 66 | new: "新建聊天", |
| @@ -145,9 +140,14 @@ const cn = { | @@ -145,9 +140,14 @@ const cn = { | ||
| 145 | Error: "分享失败", | 140 | Error: "分享失败", |
| 146 | }, | 141 | }, |
| 147 | Mind: { | 142 | Mind: { |
| 143 | + title: "生成思维导图", | ||
| 148 | ExportPng: "导出为PNG图片", | 144 | ExportPng: "导出为PNG图片", |
| 149 | ExportSvg: "导出为SVG", | 145 | ExportSvg: "导出为SVG", |
| 150 | }, | 146 | }, |
| 147 | + Word: "导出Word", | ||
| 148 | + Excel: "下载Excel", | ||
| 149 | + Pdf: "导出PDF", | ||
| 150 | + Ppt: "导出PPT", | ||
| 151 | }, | 151 | }, |
| 152 | Select: { | 152 | Select: { |
| 153 | Search: "搜索消息", | 153 | Search: "搜索消息", |
| @@ -884,7 +884,6 @@ const cn = { | @@ -884,7 +884,6 @@ const cn = { | ||
| 884 | generateBg: "生成背景", | 884 | generateBg: "生成背景", |
| 885 | promptTitle: "背景提示词", | 885 | promptTitle: "背景提示词", |
| 886 | }, | 886 | }, |
| 887 | - Thinking: "AI思考中", | ||
| 888 | }; | 887 | }; |
| 889 | 888 | ||
| 890 | type DeepPartial<T> = T extends object | 889 | type DeepPartial<T> = T extends object |
| @@ -10,13 +10,13 @@ const en: LocaleType = { | @@ -10,13 +10,13 @@ const en: LocaleType = { | ||
| 10 | Error: { | 10 | Error: { |
| 11 | Unauthorized: isApp | 11 | Unauthorized: isApp |
| 12 | ? `😆 Oops, there's an issue. No worries: | 12 | ? `😆 Oops, there's an issue. No worries: |
| 13 | - \\ 1️⃣ New here? [Click to start chatting now 🚀](${SAAS_CHAT_UTM_URL}) | ||
| 14 | - \\ 2️⃣ Want to use your own OpenAI resources? [Click here](/#/settings) to change settings ⚙️` | 13 | + \\ 1️⃣ New here? [Click to start chatting now 🚀](${SAAS_CHAT_UTM_URL}) |
| 14 | + \\ 2️⃣ Want to use your own OpenAI resources? [Click here](/#/settings) to change settings ⚙️` | ||
| 15 | : `😆 Oops, there's an issue. Let's fix it: | 15 | : `😆 Oops, there's an issue. Let's fix it: |
| 16 | - \ 1️⃣ New here? [Click to start chatting now 🚀](${SAAS_CHAT_UTM_URL}) | ||
| 17 | - \ 2️⃣ Using a private setup? [Click here](/#/auth) to enter your key 🔑 | ||
| 18 | - \ 3️⃣ Want to use your own OpenAI resources? [Click here](/#/settings) to change settings ⚙️ | ||
| 19 | - `, | 16 | + \ 1️⃣ New here? [Click to start chatting now 🚀](${SAAS_CHAT_UTM_URL}) |
| 17 | + \ 2️⃣ Using a private setup? [Click here](/#/auth) to enter your key 🔑 | ||
| 18 | + \ 3️⃣ Want to use your own OpenAI resources? [Click here](/#/settings) to change settings ⚙️ | ||
| 19 | + `, | ||
| 20 | }, | 20 | }, |
| 21 | Auth: { | 21 | Auth: { |
| 22 | Return: "Return", | 22 | Return: "Return", |
| @@ -59,8 +59,8 @@ const en: LocaleType = { | @@ -59,8 +59,8 @@ const en: LocaleType = { | ||
| 59 | RefreshToast: "Title refresh request sent", | 59 | RefreshToast: "Title refresh request sent", |
| 60 | Speech: "Play", | 60 | Speech: "Play", |
| 61 | StopSpeech: "Stop", | 61 | StopSpeech: "Stop", |
| 62 | - Word: "ExportWord", | ||
| 63 | - Excel: "ToExcel" | 62 | + ReWrite: "ReWrite", |
| 63 | + Chart: "Chart", | ||
| 64 | }, | 64 | }, |
| 65 | Commands: { | 65 | Commands: { |
| 66 | new: "Start a new chat", | 66 | new: "Start a new chat", |
| @@ -139,6 +139,15 @@ const en: LocaleType = { | @@ -139,6 +139,15 @@ const en: LocaleType = { | ||
| 139 | Title: "Share Artifacts", | 139 | Title: "Share Artifacts", |
| 140 | Error: "Share Error", | 140 | Error: "Share Error", |
| 141 | }, | 141 | }, |
| 142 | + Mind: { | ||
| 143 | + title: "Generate Mind Map", | ||
| 144 | + ExportPng: "Export as PNG Image", | ||
| 145 | + ExportSvg: "Export as SVG", | ||
| 146 | + }, | ||
| 147 | + Word: "Export Word", | ||
| 148 | + Excel: "Download Excel", | ||
| 149 | + Pdf: "Export PDF", | ||
| 150 | + Ppt: "Export PPT", | ||
| 142 | }, | 151 | }, |
| 143 | Select: { | 152 | Select: { |
| 144 | Search: "Search", | 153 | Search: "Search", |
| @@ -861,6 +870,28 @@ const en: LocaleType = { | @@ -861,6 +870,28 @@ const en: LocaleType = { | ||
| 861 | GenerateParams: "Generate Params", | 870 | GenerateParams: "Generate Params", |
| 862 | Detail: "Detail", | 871 | Detail: "Detail", |
| 863 | }, | 872 | }, |
| 873 | + BgRemoval: { | ||
| 874 | + Title: "Smart Background Removal", | ||
| 875 | + subTitle: "AI Background Removal", | ||
| 876 | + error: { | ||
| 877 | + reqErr: "Request Failed", | ||
| 878 | + selectImg: "Please Select an Image", | ||
| 879 | + code: "Please Enter the Access Password First", | ||
| 880 | + prompt: "Please Enter the Prompt", | ||
| 881 | + resultErr: "Failed to Load Result Image", | ||
| 882 | + downLoadErr: "Please Complete Image Processing First", | ||
| 883 | + statuErr: "Status Query Failed", | ||
| 884 | + timeoutErr: "Processing Timed Out, Please Try Again Later", | ||
| 885 | + imgLoadingErr: "Image Loading Failed", | ||
| 886 | + }, | ||
| 887 | + success: | ||
| 888 | + "Image Processing Successful, Please Save the Image Within One Hour!", | ||
| 889 | + generateImg: "Generate Image", | ||
| 890 | + bgRemoveBtn: "One-Click Background Removal", | ||
| 891 | + downloadImg: "Download Image", | ||
| 892 | + generateBg: "Generate Background", | ||
| 893 | + promptTitle: "Background Prompt", | ||
| 894 | + }, | ||
| 864 | }; | 895 | }; |
| 865 | 896 | ||
| 866 | export default en; | 897 | export default en; |
| @@ -55,9 +55,8 @@ const tw = { | @@ -55,9 +55,8 @@ const tw = { | ||
| 55 | Edit: "編輯", | 55 | Edit: "編輯", |
| 56 | RefreshTitle: "重新整理標題", | 56 | RefreshTitle: "重新整理標題", |
| 57 | RefreshToast: "已傳送重新整理標題請求", | 57 | RefreshToast: "已傳送重新整理標題請求", |
| 58 | - //20250317新增 | ||
| 59 | - Word: "導出Word", | ||
| 60 | - Excel: "下載Excel" | 58 | + ReWrite: "重寫", |
| 59 | + Chart: "查看圖表", | ||
| 61 | }, | 60 | }, |
| 62 | Commands: { | 61 | Commands: { |
| 63 | new: "新建聊天", | 62 | new: "新建聊天", |
| @@ -129,6 +128,15 @@ const tw = { | @@ -129,6 +128,15 @@ const tw = { | ||
| 129 | Toast: "正在產生截圖", | 128 | Toast: "正在產生截圖", |
| 130 | Modal: "長按或按右鍵儲存圖片", | 129 | Modal: "長按或按右鍵儲存圖片", |
| 131 | }, | 130 | }, |
| 131 | + Mind: { | ||
| 132 | + title: "生成思維導圖", | ||
| 133 | + ExportPng: "導出為PNG圖片", | ||
| 134 | + ExportSvg: "導出為SVG", | ||
| 135 | + }, | ||
| 136 | + Word: "導出Word", | ||
| 137 | + Excel: "下載Excel", | ||
| 138 | + Pdf: "導出PDF", | ||
| 139 | + Ppt: "導出PPT", | ||
| 132 | }, | 140 | }, |
| 133 | Select: { | 141 | Select: { |
| 134 | Search: "查詢訊息", | 142 | Search: "查詢訊息", |
| @@ -536,6 +544,27 @@ const tw = { | @@ -536,6 +544,27 @@ const tw = { | ||
| 536 | Topic: "主題", | 544 | Topic: "主題", |
| 537 | Time: "時間", | 545 | Time: "時間", |
| 538 | }, | 546 | }, |
| 547 | + BgRemoval: { | ||
| 548 | + Title: "智能扣圖", | ||
| 549 | + subTitle: "AI扣圖", | ||
| 550 | + error: { | ||
| 551 | + reqErr: "請求失敗", | ||
| 552 | + selectImg: "請選擇圖片", | ||
| 553 | + code: "請先輸入訪問密碼", | ||
| 554 | + prompt: "請輸入提示詞", | ||
| 555 | + resultErr: "結果圖片加載失敗", | ||
| 556 | + downLoadErr: "請先完成圖片處理", | ||
| 557 | + statuErr: "狀態查詢失敗", | ||
| 558 | + timeoutErr: "處理超時,請稍後重試", | ||
| 559 | + imgLoadingErr: "圖片加載失敗", | ||
| 560 | + }, | ||
| 561 | + success: "圖片處理成功,請在一小時內保存圖片!", | ||
| 562 | + generateImg: "生成圖片", | ||
| 563 | + bgRemoveBtn: "一鍵扣圖", | ||
| 564 | + downloadImg: "下載圖片", | ||
| 565 | + generateBg: "生成背景", | ||
| 566 | + promptTitle: "背景提示詞", | ||
| 567 | + }, | ||
| 539 | }; | 568 | }; |
| 540 | 569 | ||
| 541 | type DeepPartial<T> = T extends object | 570 | type DeepPartial<T> = T extends object |
| 1 | /* eslint-disable */ | 1 | /* eslint-disable */ |
| 2 | -import * as XLSX from 'xlsx'; | 2 | +import * as XLSX from "xlsx"; |
| 3 | 3 | ||
| 4 | export function toExcel(content: string) { | 4 | export function toExcel(content: string) { |
| 5 | - let sheetName = 'result'; // 默认表名 | ||
| 6 | - let tableContent = ''; | ||
| 7 | - | ||
| 8 | - // 查找标题内容(以 ** 或 ## 或 ### 开头) | ||
| 9 | - const titleMatch = content.match(/^(#{2,3}|\*\*)\s*(.*)/m); | ||
| 10 | - if (titleMatch) { | ||
| 11 | - sheetName = titleMatch[2].trim().replace(/\s+/g, '_'); // 使用标题作为表名 | ||
| 12 | - // 提取表格内容(跳过标题部分) | ||
| 13 | - tableContent = content.substring(titleMatch[0].length).trim(); | ||
| 14 | - } else { | ||
| 15 | - tableContent = content; | 5 | + let sheetName = "result"; // 默认表名 |
| 6 | + let tableContent = ""; | ||
| 7 | + | ||
| 8 | + // 查找标题内容(以 ** 或 ## 或 ### 开头) | ||
| 9 | + const titleMatch = content.match(/^(#{2,3}|\*\*)\s*(.*)/m); | ||
| 10 | + if (titleMatch) { | ||
| 11 | + sheetName = titleMatch[2].trim().replace(/\s+/g, "_"); // 使用标题作为表名 | ||
| 12 | + // 提取表格内容(跳过标题部分) | ||
| 13 | + tableContent = content.substring(titleMatch[0].length).trim(); | ||
| 14 | + } else { | ||
| 15 | + tableContent = content; | ||
| 16 | + } | ||
| 17 | + | ||
| 18 | + // 查找表格的起始位置(第一行以 | 开头且以 | 结尾) | ||
| 19 | + let tableStartIndex = -1; | ||
| 20 | + const lines = tableContent.split("\n"); | ||
| 21 | + for (let i = 0; i < lines.length; i++) { | ||
| 22 | + if (lines[i].trim().startsWith("|") && lines[i].trim().endsWith("|")) { | ||
| 23 | + tableStartIndex = i; | ||
| 24 | + break; | ||
| 16 | } | 25 | } |
| 26 | + } | ||
| 17 | 27 | ||
| 18 | - // 查找表格的起始位置(第一行以 | 开头且以 | 结尾) | ||
| 19 | - let tableStartIndex = -1; | ||
| 20 | - const lines = tableContent.split('\n'); | ||
| 21 | - for (let i = 0; i < lines.length; i++) { | ||
| 22 | - if (lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|')) { | ||
| 23 | - tableStartIndex = i; | ||
| 24 | - break; | ||
| 25 | - } | 28 | + if (tableStartIndex === -1) { |
| 29 | + console.error("表格内容未找到"); | ||
| 30 | + return; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + // 查找表格的结束位置(遇到不以 | 开头或者不以 | 结尾的行) | ||
| 34 | + let tableEndIndex = -1; | ||
| 35 | + for (let i = tableStartIndex; i < lines.length; i++) { | ||
| 36 | + if (!lines[i].trim().startsWith("|") || !lines[i].trim().endsWith("|")) { | ||
| 37 | + tableEndIndex = i; | ||
| 38 | + break; | ||
| 26 | } | 39 | } |
| 40 | + } | ||
| 41 | + | ||
| 42 | + if (tableEndIndex === -1) { | ||
| 43 | + tableEndIndex = lines.length; | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + // 提取表格内容 | ||
| 47 | + const tableData = lines | ||
| 48 | + .slice(tableStartIndex, tableEndIndex) | ||
| 49 | + .join("\n") | ||
| 50 | + .trim(); | ||
| 27 | 51 | ||
| 28 | - if (tableStartIndex === -1) { | ||
| 29 | - console.error('表格内容未找到'); | ||
| 30 | - return; | 52 | + // 解析表格内容 |
| 53 | + const rows = tableData.split("\n"); | ||
| 54 | + const data: any[] = []; | ||
| 55 | + let headers: string[] = []; | ||
| 56 | + | ||
| 57 | + rows.forEach((row, rowIndex) => { | ||
| 58 | + // 去掉行首尾的 | 符号,并按 | 分割 | ||
| 59 | + const cells = row | ||
| 60 | + .replace(/^\s*\|/g, "") | ||
| 61 | + .replace(/\|\s*$/g, "") | ||
| 62 | + .split(/\s*\|\s*/); | ||
| 63 | + | ||
| 64 | + // 跳过分隔线(假设分隔线的每个单元格都是由短横线组成) | ||
| 65 | + if ( | ||
| 66 | + rowIndex > 0 && | ||
| 67 | + cells.every( | ||
| 68 | + (cell) => cell.trim().replace(/-/g, "").length === 0, // 检查单元格内容是否只包含短横线 | ||
| 69 | + ) | ||
| 70 | + ) { | ||
| 71 | + return; | ||
| 31 | } | 72 | } |
| 32 | 73 | ||
| 33 | - // 查找表格的结束位置(遇到不以 | 开头或者不以 | 结尾的行) | ||
| 34 | - let tableEndIndex = -1; | ||
| 35 | - for (let i = tableStartIndex; i < lines.length; i++) { | ||
| 36 | - if (!lines[i].trim().startsWith('|') || !lines[i].trim().endsWith('|')) { | ||
| 37 | - tableEndIndex = i; | ||
| 38 | - break; | 74 | + if (rowIndex === 0) { |
| 75 | + // 第一行是表头 | ||
| 76 | + headers = cells.map((cell) => cell.trim()); | ||
| 77 | + } else { | ||
| 78 | + // 数据行 | ||
| 79 | + const rowData: any = {}; | ||
| 80 | + cells.forEach((cell, cellIndex) => { | ||
| 81 | + if (cellIndex < headers.length) { | ||
| 82 | + rowData[headers[cellIndex]] = cell.trim(); | ||
| 39 | } | 83 | } |
| 84 | + }); | ||
| 85 | + data.push(rowData); | ||
| 40 | } | 86 | } |
| 87 | + }); | ||
| 41 | 88 | ||
| 42 | - if (tableEndIndex === -1) { | ||
| 43 | - tableEndIndex = lines.length; | ||
| 44 | - } | 89 | + // 创建工作表 |
| 90 | + const ws = XLSX.utils.json_to_sheet(data); | ||
| 91 | + const wb = XLSX.utils.book_new(); | ||
| 92 | + XLSX.utils.book_append_sheet(wb, ws, sheetName); | ||
| 45 | 93 | ||
| 46 | - // 提取表格内容 | ||
| 47 | - const tableData = lines.slice(tableStartIndex, tableEndIndex).join('\n').trim(); | ||
| 48 | - | ||
| 49 | - // 解析表格内容 | ||
| 50 | - const rows = tableData.split('\n'); | ||
| 51 | - const data: any[] = []; | ||
| 52 | - let headers: string[] = []; | ||
| 53 | - | ||
| 54 | - rows.forEach((row, rowIndex) => { | ||
| 55 | - // 去掉行首尾的 | 符号,并按 | 分割 | ||
| 56 | - const cells = row.replace(/^\s*\|/g, '').replace(/\|\s*$/g, '').split(/\s*\|\s*/); | ||
| 57 | - | ||
| 58 | - // 跳过分隔线(假设分隔线的每个单元格都是由短横线组成) | ||
| 59 | - if ( | ||
| 60 | - rowIndex > 0 && | ||
| 61 | - cells.every(cell => | ||
| 62 | - cell.trim().replace(/-/g, '').length === 0 // 检查单元格内容是否只包含短横线 | ||
| 63 | - ) | ||
| 64 | - ) { | ||
| 65 | - return; | ||
| 66 | - } | 94 | + // 生成文件并下载 |
| 95 | + XLSX.writeFile(wb, `${sheetName}.xlsx`); | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +export function getExcelData(file: File): Promise<any[][]> { | ||
| 99 | + return new Promise((resolve, reject) => { | ||
| 100 | + const reader = new FileReader(); | ||
| 67 | 101 | ||
| 68 | - if (rowIndex === 0) { | ||
| 69 | - // 第一行是表头 | ||
| 70 | - headers = cells.map(cell => cell.trim()); | ||
| 71 | - } else { | ||
| 72 | - // 数据行 | ||
| 73 | - const rowData: any = {}; | ||
| 74 | - cells.forEach((cell, cellIndex) => { | ||
| 75 | - if (cellIndex < headers.length) { | ||
| 76 | - rowData[headers[cellIndex]] = cell.trim(); | ||
| 77 | - } | ||
| 78 | - }); | ||
| 79 | - data.push(rowData); | 102 | + reader.onload = (e) => { |
| 103 | + try { | ||
| 104 | + const data = e.target?.result; | ||
| 105 | + if (!data) { | ||
| 106 | + reject(new Error("Failed to read file data")); | ||
| 107 | + return; | ||
| 80 | } | 108 | } |
| 81 | - }); | ||
| 82 | 109 | ||
| 83 | - // 创建工作表 | ||
| 84 | - const ws = XLSX.utils.json_to_sheet(data); | ||
| 85 | - const wb = XLSX.utils.book_new(); | ||
| 86 | - XLSX.utils.book_append_sheet(wb, ws, sheetName); | 110 | + const workbook = XLSX.read(data, { type: "array" }); |
| 111 | + const firstSheetName = workbook.SheetNames[0]; | ||
| 112 | + const worksheet = workbook.Sheets[firstSheetName]; | ||
| 113 | + | ||
| 114 | + // 使用类型断言将 unknown[] 转换为 any[][] | ||
| 115 | + const jsonData = XLSX.utils.sheet_to_json(worksheet, { | ||
| 116 | + header: 1, | ||
| 117 | + }) as any[][]; | ||
| 118 | + resolve(jsonData.slice(0, 100)); | ||
| 119 | + } catch (error) { | ||
| 120 | + reject(error); | ||
| 121 | + } | ||
| 122 | + }; | ||
| 123 | + reader.onerror = (error) => { | ||
| 124 | + reject(error); | ||
| 125 | + }; | ||
| 87 | 126 | ||
| 88 | - // 生成文件并下载 | ||
| 89 | - XLSX.writeFile(wb, `${sheetName}.xlsx`); | ||
| 90 | -} | ||
| 127 | + reader.readAsArrayBuffer(file); | ||
| 128 | + }); | ||
| 129 | +} |
| @@ -33,7 +33,6 @@ | @@ -33,7 +33,6 @@ | ||
| 33 | "@xyflow/react": "^12.4.4", | 33 | "@xyflow/react": "^12.4.4", |
| 34 | "antd": "^5.24.4", | 34 | "antd": "^5.24.4", |
| 35 | "axios": "^1.7.5", | 35 | "axios": "^1.7.5", |
| 36 | - "chart.js": "^4.4.8", | ||
| 37 | "cheerio": "^1.0.0", | 36 | "cheerio": "^1.0.0", |
| 38 | "clsx": "^2.1.1", | 37 | "clsx": "^2.1.1", |
| 39 | "docx": "^9.3.0", | 38 | "docx": "^9.3.0", |
| @@ -43,8 +42,6 @@ | @@ -43,8 +42,6 @@ | ||
| 43 | "file-saver": "^2.0.5", | 42 | "file-saver": "^2.0.5", |
| 44 | "fuse.js": "^7.0.0", | 43 | "fuse.js": "^7.0.0", |
| 45 | "heic2any": "^0.0.4", | 44 | "heic2any": "^0.0.4", |
| 46 | - "html-docx-js": "^0.3.1", | ||
| 47 | - "html-docx-js-typescript": "^0.1.5", | ||
| 48 | "html-to-image": "^1.11.11", | 45 | "html-to-image": "^1.11.11", |
| 49 | "idb-keyval": "^6.2.1", | 46 | "idb-keyval": "^6.2.1", |
| 50 | "lodash-es": "^4.17.21", | 47 | "lodash-es": "^4.17.21", |
| @@ -58,7 +55,6 @@ | @@ -58,7 +55,6 @@ | ||
| 58 | "openapi-client-axios": "^7.5.5", | 55 | "openapi-client-axios": "^7.5.5", |
| 59 | "rc-tooltip": "^6.4.0", | 56 | "rc-tooltip": "^6.4.0", |
| 60 | "react": "^18.2.0", | 57 | "react": "^18.2.0", |
| 61 | - "react-chartjs-2": "^5.3.0", | ||
| 62 | "react-dom": "^18.2.0", | 58 | "react-dom": "^18.2.0", |
| 63 | "react-markdown": "^8.0.7", | 59 | "react-markdown": "^8.0.7", |
| 64 | "react-quill": "^2.0.0", | 60 | "react-quill": "^2.0.0", |
| @@ -109,7 +105,6 @@ | @@ -109,7 +105,6 @@ | ||
| 109 | "ts-node": "^10.9.2", | 105 | "ts-node": "^10.9.2", |
| 110 | "tsx": "^4.16.0", | 106 | "tsx": "^4.16.0", |
| 111 | "typescript": "5.2.2", | 107 | "typescript": "5.2.2", |
| 112 | - "vue-loader": "^17.3.1", | ||
| 113 | "watch": "^1.0.2", | 108 | "watch": "^1.0.2", |
| 114 | "webpack": "^5.0.0-rc.6" | 109 | "webpack": "^5.0.0-rc.6" |
| 115 | }, | 110 | }, |
| @@ -1841,11 +1841,6 @@ | @@ -1841,11 +1841,6 @@ | ||
| 1841 | "@jridgewell/resolve-uri" "^3.1.0" | 1841 | "@jridgewell/resolve-uri" "^3.1.0" |
| 1842 | "@jridgewell/sourcemap-codec" "^1.4.14" | 1842 | "@jridgewell/sourcemap-codec" "^1.4.14" |
| 1843 | 1843 | ||
| 1844 | -"@kurkle/color@^0.3.0": | ||
| 1845 | - version "0.3.4" | ||
| 1846 | - resolved "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.4.tgz" | ||
| 1847 | - integrity sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w== | ||
| 1848 | - | ||
| 1849 | "@modelcontextprotocol/sdk@^1.0.4": | 1844 | "@modelcontextprotocol/sdk@^1.0.4": |
| 1850 | version "1.0.4" | 1845 | version "1.0.4" |
| 1851 | resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.0.4.tgz" | 1846 | resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.0.4.tgz" |
| @@ -3353,11 +3348,6 @@ braces@^3.0.2, braces@~3.0.2: | @@ -3353,11 +3348,6 @@ braces@^3.0.2, braces@~3.0.2: | ||
| 3353 | dependencies: | 3348 | dependencies: |
| 3354 | fill-range "^7.0.1" | 3349 | fill-range "^7.0.1" |
| 3355 | 3350 | ||
| 3356 | -browser-or-node@^1.2.1: | ||
| 3357 | - version "1.3.0" | ||
| 3358 | - resolved "https://registry.npmmirror.com/browser-or-node/-/browser-or-node-1.3.0.tgz" | ||
| 3359 | - integrity sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg== | ||
| 3360 | - | ||
| 3361 | browserslist@^4.14.3, browserslist@^4.21.3, browserslist@^4.21.5, browserslist@^4.23.1: | 3351 | browserslist@^4.14.3, browserslist@^4.21.3, browserslist@^4.21.5, browserslist@^4.23.1: |
| 3362 | version "4.24.4" | 3352 | version "4.24.4" |
| 3363 | resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.4.tgz" | 3353 | resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.4.tgz" |
| @@ -3507,13 +3497,6 @@ character-entities@^2.0.0: | @@ -3507,13 +3497,6 @@ character-entities@^2.0.0: | ||
| 3507 | resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" | 3497 | resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" |
| 3508 | integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== | 3498 | integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== |
| 3509 | 3499 | ||
| 3510 | -chart.js@^4.4.8: | ||
| 3511 | - version "4.4.8" | ||
| 3512 | - resolved "https://registry.npmmirror.com/chart.js/-/chart.js-4.4.8.tgz#54645b638e9d585099bc16b892947b5e6cd2a552" | ||
| 3513 | - integrity sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA== | ||
| 3514 | - dependencies: | ||
| 3515 | - "@kurkle/color" "^0.3.0" | ||
| 3516 | - | ||
| 3517 | cheerio-select@^2.1.0: | 3500 | cheerio-select@^2.1.0: |
| 3518 | version "2.1.0" | 3501 | version "2.1.0" |
| 3519 | resolved "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz" | 3502 | resolved "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz" |
| @@ -5506,11 +5489,6 @@ has@^1.0.3: | @@ -5506,11 +5489,6 @@ has@^1.0.3: | ||
| 5506 | dependencies: | 5489 | dependencies: |
| 5507 | function-bind "^1.1.1" | 5490 | function-bind "^1.1.1" |
| 5508 | 5491 | ||
| 5509 | -hash-sum@^2.0.0: | ||
| 5510 | - version "2.0.0" | ||
| 5511 | - resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz" | ||
| 5512 | - integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== | ||
| 5513 | - | ||
| 5514 | hash.js@^1.1.7: | 5492 | hash.js@^1.1.7: |
| 5515 | version "1.1.7" | 5493 | version "1.1.7" |
| 5516 | resolved "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz" | 5494 | resolved "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz" |
| @@ -5631,24 +5609,6 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: | @@ -5631,24 +5609,6 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: | ||
| 5631 | dependencies: | 5609 | dependencies: |
| 5632 | react-is "^16.7.0" | 5610 | react-is "^16.7.0" |
| 5633 | 5611 | ||
| 5634 | -html-docx-js-typescript@^0.1.5: | ||
| 5635 | - version "0.1.5" | ||
| 5636 | - resolved "https://registry.npmmirror.com/html-docx-js-typescript/-/html-docx-js-typescript-0.1.5.tgz" | ||
| 5637 | - integrity sha512-GNojWFDYbpHSIgKml6/0oAom8mtHrHRTWKMyLRdeJQHO/CyeM6H39DYgzYvPp4OhBp2Ti8dxMKFq0/FkpYD4bg== | ||
| 5638 | - dependencies: | ||
| 5639 | - browser-or-node "^1.2.1" | ||
| 5640 | - jszip "^3.4.0" | ||
| 5641 | - tslib "^1.13.0" | ||
| 5642 | - | ||
| 5643 | -html-docx-js@^0.3.1: | ||
| 5644 | - version "0.3.1" | ||
| 5645 | - resolved "https://registry.npmmirror.com/html-docx-js/-/html-docx-js-0.3.1.tgz" | ||
| 5646 | - integrity sha512-QSrMiRhxesqxYCa3f+2Z3ttIHPzSjDOL1tCOmIDIEET7HdabxXND6tAbsFMXAgRG4RADQ3wbl74ydMmjidaDPA== | ||
| 5647 | - dependencies: | ||
| 5648 | - jszip "^2.3.0" | ||
| 5649 | - lodash.escape "^3.0.0" | ||
| 5650 | - lodash.merge "^3.2.0" | ||
| 5651 | - | ||
| 5652 | html-encoding-sniffer@^3.0.0: | 5612 | html-encoding-sniffer@^3.0.0: |
| 5653 | version "3.0.0" | 5613 | version "3.0.0" |
| 5654 | resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" | 5614 | resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" |
| @@ -6591,7 +6551,7 @@ json5@^2.2.2, json5@^2.2.3: | @@ -6591,7 +6551,7 @@ json5@^2.2.2, json5@^2.2.3: | ||
| 6591 | array-includes "^3.1.5" | 6551 | array-includes "^3.1.5" |
| 6592 | object.assign "^4.1.3" | 6552 | object.assign "^4.1.3" |
| 6593 | 6553 | ||
| 6594 | -jszip@*, jszip@^3.10.1, jszip@^3.4.0: | 6554 | +jszip@*, jszip@^3.10.1: |
| 6595 | version "3.10.1" | 6555 | version "3.10.1" |
| 6596 | resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz" | 6556 | resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz" |
| 6597 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== | 6557 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== |
| @@ -6601,13 +6561,6 @@ jszip@*, jszip@^3.10.1, jszip@^3.4.0: | @@ -6601,13 +6561,6 @@ jszip@*, jszip@^3.10.1, jszip@^3.4.0: | ||
| 6601 | readable-stream "~2.3.6" | 6561 | readable-stream "~2.3.6" |
| 6602 | setimmediate "^1.0.5" | 6562 | setimmediate "^1.0.5" |
| 6603 | 6563 | ||
| 6604 | -jszip@^2.3.0: | ||
| 6605 | - version "2.7.0" | ||
| 6606 | - resolved "https://registry.npmmirror.com/jszip/-/jszip-2.7.0.tgz" | ||
| 6607 | - integrity sha512-JIsRKRVC3gTRo2vM4Wy9WBC3TRcfnIZU8k65Phi3izkvPH975FowRYtKGT6PxevA0XnJ/yO8b0QwV0ydVyQwfw== | ||
| 6608 | - dependencies: | ||
| 6609 | - pako "~1.0.2" | ||
| 6610 | - | ||
| 6611 | katex@^0.13.0: | 6564 | katex@^0.13.0: |
| 6612 | version "0.13.24" | 6565 | version "0.13.24" |
| 6613 | resolved "https://registry.npmjs.org/katex/-/katex-0.13.24.tgz" | 6566 | resolved "https://registry.npmjs.org/katex/-/katex-0.13.24.tgz" |
| @@ -6746,148 +6699,21 @@ lodash-es@^4.17.21: | @@ -6746,148 +6699,21 @@ lodash-es@^4.17.21: | ||
| 6746 | resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz" | 6699 | resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz" |
| 6747 | integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== | 6700 | integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== |
| 6748 | 6701 | ||
| 6749 | -lodash._arraycopy@^3.0.0: | ||
| 6750 | - version "3.0.0" | ||
| 6751 | - resolved "https://registry.npmmirror.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz" | ||
| 6752 | - integrity sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A== | ||
| 6753 | - | ||
| 6754 | -lodash._arrayeach@^3.0.0: | ||
| 6755 | - version "3.0.0" | ||
| 6756 | - resolved "https://registry.npmmirror.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz" | ||
| 6757 | - integrity sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ== | ||
| 6758 | - | ||
| 6759 | -lodash._basecopy@^3.0.0: | ||
| 6760 | - version "3.0.1" | ||
| 6761 | - resolved "https://registry.npmmirror.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" | ||
| 6762 | - integrity sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ== | ||
| 6763 | - | ||
| 6764 | -lodash._basefor@^3.0.0: | ||
| 6765 | - version "3.0.3" | ||
| 6766 | - resolved "https://registry.npmmirror.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz" | ||
| 6767 | - integrity sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A== | ||
| 6768 | - | ||
| 6769 | -lodash._bindcallback@^3.0.0: | ||
| 6770 | - version "3.0.1" | ||
| 6771 | - resolved "https://registry.npmmirror.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" | ||
| 6772 | - integrity sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ== | ||
| 6773 | - | ||
| 6774 | -lodash._createassigner@^3.0.0: | ||
| 6775 | - version "3.1.1" | ||
| 6776 | - resolved "https://registry.npmmirror.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz" | ||
| 6777 | - integrity sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw== | ||
| 6778 | - dependencies: | ||
| 6779 | - lodash._bindcallback "^3.0.0" | ||
| 6780 | - lodash._isiterateecall "^3.0.0" | ||
| 6781 | - lodash.restparam "^3.0.0" | ||
| 6782 | - | ||
| 6783 | -lodash._getnative@^3.0.0: | ||
| 6784 | - version "3.9.1" | ||
| 6785 | - resolved "https://registry.npmmirror.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz" | ||
| 6786 | - integrity sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA== | ||
| 6787 | - | ||
| 6788 | -lodash._isiterateecall@^3.0.0: | ||
| 6789 | - version "3.0.9" | ||
| 6790 | - resolved "https://registry.npmmirror.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" | ||
| 6791 | - integrity sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ== | ||
| 6792 | - | ||
| 6793 | -lodash._root@^3.0.0: | ||
| 6794 | - version "3.0.1" | ||
| 6795 | - resolved "https://registry.npmmirror.com/lodash._root/-/lodash._root-3.0.1.tgz" | ||
| 6796 | - integrity sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ== | ||
| 6797 | - | ||
| 6798 | lodash.debounce@^4.0.8: | 6702 | lodash.debounce@^4.0.8: |
| 6799 | version "4.0.8" | 6703 | version "4.0.8" |
| 6800 | resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" | 6704 | resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" |
| 6801 | integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== | 6705 | integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== |
| 6802 | 6706 | ||
| 6803 | -lodash.escape@^3.0.0: | ||
| 6804 | - version "3.2.0" | ||
| 6805 | - resolved "https://registry.npmmirror.com/lodash.escape/-/lodash.escape-3.2.0.tgz" | ||
| 6806 | - integrity sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ== | ||
| 6807 | - dependencies: | ||
| 6808 | - lodash._root "^3.0.0" | ||
| 6809 | - | ||
| 6810 | lodash.escape@^4.0.1: | 6707 | lodash.escape@^4.0.1: |
| 6811 | version "4.0.1" | 6708 | version "4.0.1" |
| 6812 | resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" | 6709 | resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" |
| 6813 | integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== | 6710 | integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== |
| 6814 | 6711 | ||
| 6815 | -lodash.isarguments@^3.0.0: | ||
| 6816 | - version "3.1.0" | ||
| 6817 | - resolved "https://registry.npmmirror.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz" | ||
| 6818 | - integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== | ||
| 6819 | - | ||
| 6820 | -lodash.isarray@^3.0.0: | ||
| 6821 | - version "3.0.4" | ||
| 6822 | - resolved "https://registry.npmmirror.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz" | ||
| 6823 | - integrity sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ== | ||
| 6824 | - | ||
| 6825 | -lodash.isplainobject@^3.0.0: | ||
| 6826 | - version "3.2.0" | ||
| 6827 | - resolved "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz" | ||
| 6828 | - integrity sha512-P4wZnho5curNqeEq/x292Pb57e1v+woR7DJ84DURelKB46lby8aDEGVobSaYtzHdQBWQrJSdxcCwjlGOvvdIyg== | ||
| 6829 | - dependencies: | ||
| 6830 | - lodash._basefor "^3.0.0" | ||
| 6831 | - lodash.isarguments "^3.0.0" | ||
| 6832 | - lodash.keysin "^3.0.0" | ||
| 6833 | - | ||
| 6834 | -lodash.istypedarray@^3.0.0: | ||
| 6835 | - version "3.0.6" | ||
| 6836 | - resolved "https://registry.npmmirror.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz" | ||
| 6837 | - integrity sha512-lGWJ6N8AA3KSv+ZZxlTdn4f6A7kMfpJboeyvbFdE7IU9YAgweODqmOgdUHOA+c6lVWeVLysdaxciFXi+foVsWw== | ||
| 6838 | - | ||
| 6839 | -lodash.keys@^3.0.0: | ||
| 6840 | - version "3.1.2" | ||
| 6841 | - resolved "https://registry.npmmirror.com/lodash.keys/-/lodash.keys-3.1.2.tgz" | ||
| 6842 | - integrity sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ== | ||
| 6843 | - dependencies: | ||
| 6844 | - lodash._getnative "^3.0.0" | ||
| 6845 | - lodash.isarguments "^3.0.0" | ||
| 6846 | - lodash.isarray "^3.0.0" | ||
| 6847 | - | ||
| 6848 | -lodash.keysin@^3.0.0: | ||
| 6849 | - version "3.0.8" | ||
| 6850 | - resolved "https://registry.npmmirror.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz" | ||
| 6851 | - integrity sha512-YDB/5xkL3fBKFMDaC+cfGV00pbiJ6XoJIfRmBhv7aR6wWtbCW6IzkiWnTfkiHTF6ALD7ff83dAtB3OEaSoyQPg== | ||
| 6852 | - dependencies: | ||
| 6853 | - lodash.isarguments "^3.0.0" | ||
| 6854 | - lodash.isarray "^3.0.0" | ||
| 6855 | - | ||
| 6856 | -lodash.merge@^3.2.0: | ||
| 6857 | - version "3.3.2" | ||
| 6858 | - resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-3.3.2.tgz" | ||
| 6859 | - integrity sha512-ZgGZpRhWLjivGUbjtApZR4HyLv/UAyoYqESVYkK4aLBJVHRrbFpG+GNnE9JPijliME4LkKM0SFI/WyOiBiv1+w== | ||
| 6860 | - dependencies: | ||
| 6861 | - lodash._arraycopy "^3.0.0" | ||
| 6862 | - lodash._arrayeach "^3.0.0" | ||
| 6863 | - lodash._createassigner "^3.0.0" | ||
| 6864 | - lodash._getnative "^3.0.0" | ||
| 6865 | - lodash.isarguments "^3.0.0" | ||
| 6866 | - lodash.isarray "^3.0.0" | ||
| 6867 | - lodash.isplainobject "^3.0.0" | ||
| 6868 | - lodash.istypedarray "^3.0.0" | ||
| 6869 | - lodash.keys "^3.0.0" | ||
| 6870 | - lodash.keysin "^3.0.0" | ||
| 6871 | - lodash.toplainobject "^3.0.0" | ||
| 6872 | - | ||
| 6873 | lodash.merge@^4.6.2: | 6712 | lodash.merge@^4.6.2: |
| 6874 | version "4.6.2" | 6713 | version "4.6.2" |
| 6875 | resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" | 6714 | resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" |
| 6876 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== | 6715 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== |
| 6877 | 6716 | ||
| 6878 | -lodash.restparam@^3.0.0: | ||
| 6879 | - version "3.6.1" | ||
| 6880 | - resolved "https://registry.npmmirror.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz" | ||
| 6881 | - integrity sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw== | ||
| 6882 | - | ||
| 6883 | -lodash.toplainobject@^3.0.0: | ||
| 6884 | - version "3.0.0" | ||
| 6885 | - resolved "https://registry.npmmirror.com/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz" | ||
| 6886 | - integrity sha512-wMI0Ju1bvSmnBS3EcRRH/3zDnZOPpDtMtNDzbbNMKuTrEpALsf+sPyMeogmv63Y11qZQO7H1xFzohIEGRMjPYA== | ||
| 6887 | - dependencies: | ||
| 6888 | - lodash._basecopy "^3.0.0" | ||
| 6889 | - lodash.keysin "^3.0.0" | ||
| 6890 | - | ||
| 6891 | lodash.unescape@^4.0.1: | 6717 | lodash.unescape@^4.0.1: |
| 6892 | version "4.0.1" | 6718 | version "4.0.1" |
| 6893 | resolved "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz" | 6719 | resolved "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz" |
| @@ -8485,11 +8311,6 @@ rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: | @@ -8485,11 +8311,6 @@ rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: | ||
| 8485 | rc-resize-observer "^1.0.0" | 8311 | rc-resize-observer "^1.0.0" |
| 8486 | rc-util "^5.36.0" | 8312 | rc-util "^5.36.0" |
| 8487 | 8313 | ||
| 8488 | -react-chartjs-2@^5.3.0: | ||
| 8489 | - version "5.3.0" | ||
| 8490 | - resolved "https://registry.npmmirror.com/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz#2d3286339a742bc7f77b5829c33ebab215f714cc" | ||
| 8491 | - integrity sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw== | ||
| 8492 | - | ||
| 8493 | react-dom@^18.2.0: | 8314 | react-dom@^18.2.0: |
| 8494 | version "18.2.0" | 8315 | version "18.2.0" |
| 8495 | resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" | 8316 | resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" |
| @@ -9557,11 +9378,6 @@ tslib@2.3.0: | @@ -9557,11 +9378,6 @@ tslib@2.3.0: | ||
| 9557 | resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" | 9378 | resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" |
| 9558 | integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== | 9379 | integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== |
| 9559 | 9380 | ||
| 9560 | -tslib@^1.13.0: | ||
| 9561 | - version "1.14.1" | ||
| 9562 | - resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz" | ||
| 9563 | - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== | ||
| 9564 | - | ||
| 9565 | tslib@^2.1.0, tslib@^2.4.0: | 9381 | tslib@^2.1.0, tslib@^2.4.0: |
| 9566 | version "2.5.0" | 9382 | version "2.5.0" |
| 9567 | resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" | 9383 | resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" |
| @@ -9860,15 +9676,6 @@ vfile@^5.0.0: | @@ -9860,15 +9676,6 @@ vfile@^5.0.0: | ||
| 9860 | unist-util-stringify-position "^3.0.0" | 9676 | unist-util-stringify-position "^3.0.0" |
| 9861 | vfile-message "^3.0.0" | 9677 | vfile-message "^3.0.0" |
| 9862 | 9678 | ||
| 9863 | -vue-loader@^17.3.1: | ||
| 9864 | - version "17.3.1" | ||
| 9865 | - resolved "https://registry.npmmirror.com/vue-loader/-/vue-loader-17.3.1.tgz" | ||
| 9866 | - integrity sha512-nmVu7KU8geOyzsStyyaxID/uBGDMS8BkPXb6Lu2SNkMawriIbb+hYrNtgftHMKxOSkjjjTF5OSSwPo3KP59egg== | ||
| 9867 | - dependencies: | ||
| 9868 | - chalk "^4.1.0" | ||
| 9869 | - hash-sum "^2.0.0" | ||
| 9870 | - watchpack "^2.4.0" | ||
| 9871 | - | ||
| 9872 | w3c-xmlserializer@^4.0.0: | 9679 | w3c-xmlserializer@^4.0.0: |
| 9873 | version "4.0.0" | 9680 | version "4.0.0" |
| 9874 | resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" | 9681 | resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" |
| @@ -9891,7 +9698,7 @@ watch@^1.0.2: | @@ -9891,7 +9698,7 @@ watch@^1.0.2: | ||
| 9891 | exec-sh "^0.2.0" | 9698 | exec-sh "^0.2.0" |
| 9892 | minimist "^1.2.0" | 9699 | minimist "^1.2.0" |
| 9893 | 9700 | ||
| 9894 | -watchpack@^2.0.0, watchpack@^2.4.0: | 9701 | +watchpack@^2.0.0: |
| 9895 | version "2.4.2" | 9702 | version "2.4.2" |
| 9896 | resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz" | 9703 | resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz" |
| 9897 | integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== | 9704 | integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== |
-
请 注册 或 登录 后发表评论