fix
This commit is contained in:
@@ -16,26 +16,32 @@
|
||||
"@dnd-kit/modifiers": "^9.0.0",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@heroicons/react": "^2.2.0",
|
||||
"@mantine/code-highlight": "^7.15.2",
|
||||
"@mantine/core": "^7.15.2",
|
||||
"@mantine/hooks": "^7.15.2",
|
||||
"@material-tailwind/react": "^2.1.10",
|
||||
"@monaco-editor/react": "^4.6.0",
|
||||
"@supabase/supabase-js": "^2.38.4",
|
||||
"ai": "^4.0.22",
|
||||
"antd": "^5.11.0",
|
||||
"apexcharts": "^4.3.0",
|
||||
"code-highlight": "^1.0.0",
|
||||
"dayjs": "^1.11.13",
|
||||
"dnd-kit": "^0.0.2",
|
||||
"heroicons": "^2.2.0",
|
||||
"html2canvas": "^1.4.1",
|
||||
"jspdf": "^2.5.2",
|
||||
"lodash": "^4.17.21",
|
||||
"react": "^18.2.0",
|
||||
"react-apexcharts": "^1.7.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-icons": "^5.4.0",
|
||||
"react-infinite-scroll-component": "^6.1.0",
|
||||
"react-router-dom": "^6.18.0",
|
||||
"react-use": "^17.6.0",
|
||||
"recharts": "^2.9.0",
|
||||
"recharts": "^2.15.0",
|
||||
"remixicon": "^4.6.0",
|
||||
"styled-components": "^6.1.0",
|
||||
"uuid": "^11.0.3",
|
||||
"zod": "^3.24.1"
|
||||
|
||||
111
src/components/Barchart/index.jsx
Normal file
111
src/components/Barchart/index.jsx
Normal file
@@ -0,0 +1,111 @@
|
||||
import {
|
||||
Card,
|
||||
CardBody,
|
||||
CardHeader,
|
||||
Typography,
|
||||
} from "@material-tailwind/react";
|
||||
import Chart from "react-apexcharts";
|
||||
const chartConfig = {
|
||||
type: "bar",
|
||||
height: 240,
|
||||
series: [
|
||||
{
|
||||
name: "Sales",
|
||||
data: [50, 40, 300, 320, 500, 350, 200, 230, 500],
|
||||
},
|
||||
],
|
||||
options: {
|
||||
chart: {
|
||||
toolbar: {
|
||||
show: false,
|
||||
},
|
||||
},
|
||||
title: {
|
||||
show: "",
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false,
|
||||
},
|
||||
colors: ["#020617"],
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: "40%",
|
||||
borderRadius: 2,
|
||||
},
|
||||
},
|
||||
xaxis: {
|
||||
axisTicks: {
|
||||
show: false,
|
||||
},
|
||||
axisBorder: {
|
||||
show: false,
|
||||
},
|
||||
labels: {
|
||||
style: {
|
||||
colors: "#616161",
|
||||
fontSize: "12px",
|
||||
fontFamily: "inherit",
|
||||
fontWeight: 400,
|
||||
},
|
||||
},
|
||||
categories: [
|
||||
"Apr",
|
||||
"May",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Oct",
|
||||
"Nov",
|
||||
"Dec",
|
||||
],
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
style: {
|
||||
colors: "#616161",
|
||||
fontSize: "12px",
|
||||
fontFamily: "inherit",
|
||||
fontWeight: 400,
|
||||
},
|
||||
},
|
||||
},
|
||||
grid: {
|
||||
show: true,
|
||||
borderColor: "#dddddd",
|
||||
strokeDashArray: 5,
|
||||
xaxis: {
|
||||
lines: {
|
||||
show: true,
|
||||
},
|
||||
},
|
||||
padding: {
|
||||
top: 5,
|
||||
right: 20,
|
||||
},
|
||||
},
|
||||
fill: {
|
||||
opacity: 0.8,
|
||||
},
|
||||
tooltip: {
|
||||
theme: "dark",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default function Example(props) {
|
||||
return (
|
||||
<Card {...props}>
|
||||
<CardHeader
|
||||
floated={false}
|
||||
shadow={false}
|
||||
color="transparent"
|
||||
className="flex flex-col gap-4 rounded-none md:flex-row md:items-center"
|
||||
>
|
||||
</CardHeader>
|
||||
<CardBody className="px-2 pb-0">
|
||||
<Chart {...chartConfig} />
|
||||
</CardBody>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
@@ -1,220 +0,0 @@
|
||||
import { Button, Drawer, Input, Space, message } from 'antd';
|
||||
import { useChat } from "ai/react";
|
||||
import { CodeHighlight } from "@mantine/code-highlight";
|
||||
import { DownloadOutlined, EditOutlined, CheckOutlined, CloseOutlined } from '@ant-design/icons';
|
||||
import { useRef, useEffect, useState } from 'react';
|
||||
import { useSessionStorage } from 'react-use';
|
||||
import Editor from "@monaco-editor/react";
|
||||
|
||||
export default function ChatAIDrawer({ open, onClose, onExport }) {
|
||||
const STORAGE_KEY = 'chat_history';
|
||||
const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, []);
|
||||
|
||||
const { messages, input, handleSubmit, handleInputChange, isLoading, setMessages } = useChat({
|
||||
api: "https://test-ai-quirkyai.vercel.app/api/chat",
|
||||
initialMessages: storedMessages.length>0? JSON.parse(storedMessages):[],
|
||||
});
|
||||
|
||||
const messagesEndRef = useRef(null);
|
||||
useEffect(() => {
|
||||
setStoredMessages(JSON.stringify(messages));
|
||||
}, [messages, setStoredMessages]);
|
||||
|
||||
// 新消息时自动滚动到底部
|
||||
useEffect(() => {
|
||||
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
|
||||
}, [messages]);
|
||||
|
||||
// 修改导出函数,接收单条消息内容
|
||||
const handleExport = (content) => {
|
||||
try {
|
||||
const jsonContent = JSON.parse(content);
|
||||
onExport?.(jsonContent);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
message.error('导出失败,请重试');
|
||||
}
|
||||
};
|
||||
|
||||
const [editingMessageId, setEditingMessageId] = useState(null);
|
||||
const [editingContent, setEditingContent] = useState('');
|
||||
|
||||
// 优化编辑处理函数
|
||||
const handleEdit = (message) => {
|
||||
if(isLoading) return;
|
||||
setEditingContent(message.content);
|
||||
setEditingMessageId(message.id);
|
||||
};
|
||||
|
||||
const handleSaveEdit = () => {
|
||||
try {
|
||||
JSON.parse(editingContent);
|
||||
setMessages(messages.map(msg =>
|
||||
msg.id === editingMessageId
|
||||
? { ...msg, content: editingContent }
|
||||
: msg
|
||||
));
|
||||
setEditingMessageId(null);
|
||||
message.success('编辑成功');
|
||||
} catch (error) {
|
||||
message.error('请输入有效的 JSON 格式');
|
||||
}
|
||||
};
|
||||
|
||||
const handleCancelEdit = () => {
|
||||
setEditingMessageId(null);
|
||||
setEditingContent('');
|
||||
};
|
||||
|
||||
return (
|
||||
<Drawer
|
||||
title={
|
||||
<div className="flex justify-between items-center">
|
||||
<span className="text-lg font-medium text-gray-800">AI 助手</span>
|
||||
<Button
|
||||
size="small"
|
||||
className="hover:bg-gray-100"
|
||||
onClick={() => {
|
||||
setMessages([]);
|
||||
setStoredMessages('[]');
|
||||
message.success('历史记录已清空');
|
||||
}}
|
||||
>
|
||||
清空历史
|
||||
</Button>
|
||||
</div>
|
||||
}
|
||||
placement="right"
|
||||
width={800}
|
||||
open={open}
|
||||
onClose={onClose}
|
||||
>
|
||||
<div className="flex flex-col h-[calc(100vh-108px)]">
|
||||
<div className="flex-1 overflow-y-auto px-4 space-y-6">
|
||||
{messages.map((message) => (
|
||||
<div
|
||||
key={message.id}
|
||||
className={`rounded-lg p-4 transition-all ${
|
||||
message.role === 'assistant'
|
||||
? 'bg-blue-50 hover:bg-blue-100'
|
||||
: 'bg-gray-50 hover:bg-gray-100'
|
||||
}`}
|
||||
>
|
||||
<div className="flex justify-between items-center mb-3">
|
||||
<span className={`font-medium ${
|
||||
message.role === 'assistant' ? 'text-blue-600' : 'text-gray-600'
|
||||
}`}>
|
||||
{message.role === 'assistant' ? 'AI 助手' : '用户'}
|
||||
</span>
|
||||
{message.role === 'assistant' && (
|
||||
<Space>
|
||||
<Button
|
||||
type="text"
|
||||
size="small"
|
||||
icon={<EditOutlined />}
|
||||
disabled={isLoading}
|
||||
onClick={() => handleEdit(message)}
|
||||
className="text-gray-500 hover:text-blue-600"
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
type="text"
|
||||
size="small"
|
||||
icon={<DownloadOutlined />}
|
||||
onClick={() => handleExport(message.content)}
|
||||
className="text-gray-500 hover:text-blue-600"
|
||||
>
|
||||
导出
|
||||
</Button>
|
||||
</Space>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{message.role === "assistant" ? (
|
||||
<div className="relative">
|
||||
{editingMessageId === message.id ? (
|
||||
<div className="rounded-lg border border-blue-200">
|
||||
<Editor
|
||||
height="300px"
|
||||
defaultLanguage="json"
|
||||
value={editingContent}
|
||||
theme="vs-light"
|
||||
options={{
|
||||
minimap: { enabled: false },
|
||||
scrollBeyondLastLine: false,
|
||||
fontSize: 14,
|
||||
lineNumbers: 'on',
|
||||
renderLineHighlight: 'none',
|
||||
roundedSelection: true,
|
||||
}}
|
||||
onChange={setEditingContent}
|
||||
onMount={(editor) => {
|
||||
editor.getModel()?.updateOptions({ tabSize: 2 });
|
||||
editor.focus();
|
||||
}}
|
||||
/>
|
||||
<div className="flex justify-end gap-2 p-2 bg-gray-50 border-t">
|
||||
<Button
|
||||
size="small"
|
||||
icon={<CloseOutlined />}
|
||||
onClick={handleCancelEdit}
|
||||
className="hover:bg-gray-200"
|
||||
>
|
||||
取消
|
||||
</Button>
|
||||
<Button
|
||||
type="primary"
|
||||
size="small"
|
||||
icon={<CheckOutlined />}
|
||||
onClick={handleSaveEdit}
|
||||
className="bg-blue-600 hover:bg-blue-700"
|
||||
>
|
||||
保存
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<CodeHighlight
|
||||
code={message.content}
|
||||
language="json"
|
||||
copyLabel="复制代码"
|
||||
copiedLabel="已复制!"
|
||||
withLineNumbers
|
||||
className="rounded-lg"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
) : (
|
||||
<div className="text-gray-700 whitespace-pre-wrap break-words">
|
||||
{message.content}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
<div ref={messagesEndRef} />
|
||||
</div>
|
||||
|
||||
<div className="border-t bg-white p-4">
|
||||
<form onSubmit={handleSubmit} className="flex gap-2">
|
||||
<Input
|
||||
value={input}
|
||||
placeholder="请输入您的问题..."
|
||||
onChange={handleInputChange}
|
||||
disabled={isLoading}
|
||||
className="flex-1 rounded-md "
|
||||
/>
|
||||
<Button
|
||||
type="primary"
|
||||
htmlType="submit"
|
||||
loading={isLoading}
|
||||
className="rounded-md"
|
||||
>
|
||||
发送
|
||||
</Button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</Drawer>
|
||||
);
|
||||
}
|
||||
@@ -66,11 +66,7 @@ const Sidebar = ({ collapsed }) => {
|
||||
<Menu
|
||||
theme={isDarkMode ? "dark" : "light"}
|
||||
mode="inline"
|
||||
<<<<<<< HEAD
|
||||
selectedKeys={getSelectedKeys}
|
||||
=======
|
||||
selectedKeys={[selectedKey]}
|
||||
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
|
||||
defaultOpenKeys={defaultOpenKeys}
|
||||
items={menuClient}
|
||||
onClick={handleMenuClick}
|
||||
|
||||
49
src/components/Piechart/index.jsx
Normal file
49
src/components/Piechart/index.jsx
Normal file
@@ -0,0 +1,49 @@
|
||||
import React from 'react'
|
||||
import {
|
||||
Card,
|
||||
CardBody,
|
||||
CardHeader,
|
||||
Typography,
|
||||
} from "@material-tailwind/react";
|
||||
import Chart from "react-apexcharts";
|
||||
|
||||
export default function index(props) {
|
||||
const chartConfig = {
|
||||
type: "pie",
|
||||
width: 280,
|
||||
height: 280,
|
||||
series: [44, 55, 13, 43, 22],
|
||||
options: {
|
||||
chart: {
|
||||
toolbar: {
|
||||
show: false,
|
||||
},
|
||||
},
|
||||
title: {
|
||||
show: "",
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false,
|
||||
},
|
||||
colors: ["#020617", "#ff8f00", "#00897b", "#1e88e5", "#d81b60"],
|
||||
legend: {
|
||||
show: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
return (
|
||||
|
||||
<Card {...props}>
|
||||
<CardHeader
|
||||
floated={false}
|
||||
shadow={false}
|
||||
color="transparent"
|
||||
className="flex flex-col gap-4 rounded-none md:flex-row md:items-center"
|
||||
>
|
||||
</CardHeader>
|
||||
<CardBody className="px-2 pb-0">
|
||||
<Chart {...chartConfig} />
|
||||
</CardBody>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
@@ -29,7 +29,7 @@ export const ProtectedRoute = ({ children }) => {
|
||||
});
|
||||
|
||||
if (!hasPermission) {
|
||||
return <Navigate to="/home" replace />;
|
||||
return <Navigate to="/dashboard" replace />;
|
||||
}
|
||||
|
||||
return children;
|
||||
|
||||
@@ -8,31 +8,33 @@ const StatCard = ({ icon, title, count, amount, color = '#1677ff' }) => {
|
||||
<Card
|
||||
styles={{
|
||||
body: {
|
||||
padding: '20px',
|
||||
padding: '0',
|
||||
height: '100%',
|
||||
background: 'var(--color-bg-container)',
|
||||
}
|
||||
}}
|
||||
className="h-full hover:shadow-md transition-shadow duration-300"
|
||||
>
|
||||
<div className="flex items-start gap-4">
|
||||
<div
|
||||
className="w-12 h-12 rounded-full flex items-center justify-center text-lg"
|
||||
style={{
|
||||
backgroundColor: `${color}15`,
|
||||
}}
|
||||
>
|
||||
<span style={{ color }}>{icon}</span>
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<h3 className="text-base text-gray-500 dark:text-gray-400 m-0">
|
||||
{title}
|
||||
</h3>
|
||||
<div className="text-sm text-gray-400 dark:text-gray-500 mt-1">
|
||||
{count} invoices
|
||||
<div className="p-3 sm:p-5">
|
||||
<div className="flex items-start gap-2 sm:gap-4">
|
||||
<div
|
||||
className="w-10 h-10 sm:w-12 sm:h-12 rounded-full flex items-center justify-center text-base sm:text-lg"
|
||||
style={{
|
||||
backgroundColor: `${color}15`,
|
||||
}}
|
||||
>
|
||||
<span style={{ color }}>{icon}</span>
|
||||
</div>
|
||||
<div className="text-xl font-semibold mt-2 dark:text-white">
|
||||
{formatCurrency(amount)}
|
||||
<div className="flex-1">
|
||||
<h3 className="text-sm sm:text-base text-gray-500 dark:text-gray-400 m-0">
|
||||
{title}
|
||||
</h3>
|
||||
<div className="text-xs sm:text-sm text-gray-400 dark:text-gray-500 mt-0.5 sm:mt-1">
|
||||
{count} invoices
|
||||
</div>
|
||||
<div className="text-lg sm:text-xl font-semibold mt-1 sm:mt-2 dark:text-white">
|
||||
{formatCurrency(amount)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -42,7 +42,7 @@ const stats = [
|
||||
|
||||
const StatisticsOverview = () => {
|
||||
return (
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-5 gap-4">
|
||||
{stats.map((stat, index) => (
|
||||
<StatCard key={index} {...stat} />
|
||||
))}
|
||||
|
||||
@@ -29,8 +29,6 @@ export default function DifyChatDrawer({ open, onClose, onExport }) {
|
||||
|
||||
useEffect(() => {
|
||||
if (storedMessages && storedMessages.length > 0) {
|
||||
console.log(storedMessages,'storedMessages');
|
||||
|
||||
setMessages(storedMessages);
|
||||
}
|
||||
}, []);
|
||||
@@ -106,6 +104,7 @@ export default function DifyChatDrawer({ open, onClose, onExport }) {
|
||||
width={800}
|
||||
open={open}
|
||||
onClose={onClose}
|
||||
className="rounded-l-xl"
|
||||
>
|
||||
<div className="flex flex-col h-[calc(100vh-108px)]">
|
||||
<div className="flex-1 overflow-y-auto px-4 space-y-6">
|
||||
@@ -215,20 +214,20 @@ export default function DifyChatDrawer({ open, onClose, onExport }) {
|
||||
<div ref={messagesEndRef} />
|
||||
</div>
|
||||
|
||||
<div className="border-t dark:border-gray-700 p-4">
|
||||
<div className="border-t dark:border-gray-700 bg-white dark:bg-gray-800 p-4">
|
||||
<form onSubmit={handleSendMessage} className="flex gap-2">
|
||||
<Input
|
||||
value={input}
|
||||
placeholder="请输入您的问题..."
|
||||
onChange={(e) => setInput(e.target.value)}
|
||||
disabled={isLoading}
|
||||
className="flex-1 rounded-md "
|
||||
className="flex-1 rounded-lg border-gray-300 dark:border-gray-600 hover:border-blue-400 dark:hover:border-blue-500 focus:border-blue-600 dark:focus:border-blue-500 focus:shadow-blue-100 dark:focus:shadow-blue-900 dark:bg-gray-700 dark:text-gray-200"
|
||||
/>
|
||||
<Button
|
||||
type="primary"
|
||||
htmlType="submit"
|
||||
loading={isLoading}
|
||||
className="rounded-md "
|
||||
className="rounded-lg bg-blue-600 hover:bg-blue-700 dark:bg-blue-700 dark:hover:bg-blue-800"
|
||||
>
|
||||
发送
|
||||
</Button>
|
||||
|
||||
@@ -126,8 +126,7 @@ export const AuthProvider = ({ children }) => {
|
||||
// 如果有重定向路径,则导航到该路径
|
||||
navigate(decodeURIComponent(redirectTo), { replace: true });
|
||||
} else {
|
||||
// 如果没有重定向路径,则导航到首页
|
||||
navigate("/home", { replace: true });
|
||||
navigate("/dashboard", { replace: true });
|
||||
}
|
||||
|
||||
return data;
|
||||
@@ -142,7 +141,7 @@ export const AuthProvider = ({ children }) => {
|
||||
const signInWithGoogle = async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const redirectTo = searchParams.get("redirectTo") || "/home";
|
||||
const redirectTo = searchParams.get("redirectTo") || "/dashboard";
|
||||
|
||||
const { data, error } = await supabase.auth.signInWithOAuth({
|
||||
provider: "google",
|
||||
|
||||
@@ -9,7 +9,7 @@ const STORAGE_KEY = 'dify_chat_history';
|
||||
const CONVERSATION_ID_KEY = 'dify_conversation_id';
|
||||
|
||||
export function useDifyChat() {
|
||||
const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, []);
|
||||
const [storedMessages, setStoredMessages] = useSessionStorage(STORAGE_KEY, '[]');
|
||||
const [conversationId, setConversationId] = useSessionStorage(CONVERSATION_ID_KEY, '');
|
||||
const [messages, setMessages] = useState([]);
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
@@ -18,7 +18,7 @@ export function useDifyChat() {
|
||||
|
||||
const clearHistory = () => {
|
||||
setMessages([]);
|
||||
setStoredMessages([]);
|
||||
setStoredMessages('[]');
|
||||
setConversationId('');
|
||||
message.success('历史记录已清空');
|
||||
};
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import React from 'react';
|
||||
import { Card } from 'antd';
|
||||
import StatisticsOverview from '@/components/dashboard/StatisticsOverview';
|
||||
|
||||
import Bar from '@/components/Barchart'
|
||||
import Pie from '@/components/Piechart'
|
||||
const Dashboard = () => {
|
||||
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
<Card
|
||||
@@ -14,8 +16,13 @@ const Dashboard = () => {
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div>测试:member可见,最低权限</div>
|
||||
{/* <StatisticsOverview /> */}
|
||||
<StatisticsOverview />
|
||||
<div className='flex w-full mt-20 gap-5'>
|
||||
|
||||
<Bar className="flex-1 flex justify-center items-center"/>
|
||||
<Pie className="flex-1 flex justify-center items-center"/>
|
||||
|
||||
</div>
|
||||
</Card>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -22,7 +22,6 @@ import { useNavigate, useParams, useSearchParams } from "react-router-dom";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
import SectionList from '@/components/SectionList'
|
||||
import DifyChatDrawer from '@/components/difyChatAi';
|
||||
import ChatAIDrawer from '@/components/ChatAi';
|
||||
const { Title } = Typography;
|
||||
|
||||
// 添加货币符号映射
|
||||
@@ -59,27 +58,25 @@ const QuotationForm = () => {
|
||||
|
||||
// 计算小节总额
|
||||
const calculateSectionTotal = useMemo(
|
||||
() =>
|
||||
(items = []) => {
|
||||
if (!Array.isArray(items)) return 0;
|
||||
return items.reduce((sum, item) => {
|
||||
if (!item) return sum;
|
||||
return sum + calculateItemAmount(item.quantity, item.price);
|
||||
}, 0);
|
||||
},
|
||||
() => (items = []) => {
|
||||
if (!Array.isArray(items)) return 0;
|
||||
return items.reduce((sum, item) => {
|
||||
if (!item) return sum;
|
||||
return sum + calculateItemAmount(item.quantity, item.price);
|
||||
}, 0);
|
||||
},
|
||||
[calculateItemAmount]
|
||||
);
|
||||
|
||||
// 计算总金额
|
||||
const calculateTotalAmount = useMemo(
|
||||
() =>
|
||||
(sections = []) => {
|
||||
if (!Array.isArray(sections)) return 0;
|
||||
return sections.reduce((sum, section) => {
|
||||
if (!section) return sum;
|
||||
return sum + calculateSectionTotal(section.items);
|
||||
}, 0);
|
||||
},
|
||||
() => (sections = []) => {
|
||||
if (!sections || !Array.isArray(sections)) return 0;
|
||||
return sections.reduce((sum, section) => {
|
||||
if (!section || !section.items) return sum;
|
||||
return sum + calculateSectionTotal(section.items);
|
||||
}, 0);
|
||||
},
|
||||
[calculateSectionTotal]
|
||||
);
|
||||
|
||||
@@ -318,47 +315,55 @@ const QuotationForm = () => {
|
||||
const [vercelOpen, setVercelOpen] = useState(false);
|
||||
|
||||
const handleExport = (data) => {
|
||||
if(data?.activityName&&data?.currency){
|
||||
const quotationData = {
|
||||
quataName: data.activityName,
|
||||
description: data.description,
|
||||
currency: data.currency || "TWD",
|
||||
sections: data.sections.map((section) => ({
|
||||
key: uuidv4(),
|
||||
sectionName: section.sectionName,
|
||||
items: section.items.map((item) => ({
|
||||
try {
|
||||
const jsonData = typeof data === 'string' ? JSON.parse(data) : data;
|
||||
|
||||
if (jsonData?.quataName && jsonData?.currency) {
|
||||
const quotationData = {
|
||||
quataName: jsonData.quataName,
|
||||
description: jsonData.description || '',
|
||||
currency: jsonData.currency || "TWD",
|
||||
sections: jsonData.sections.map((section) => ({
|
||||
key: uuidv4(),
|
||||
name: item.name,
|
||||
quantity: item.quantity,
|
||||
price: item.price,
|
||||
description: item.description,
|
||||
unit: item.unit,
|
||||
sectionName: section.sectionName,
|
||||
items: section.items.map((item) => ({
|
||||
key: uuidv4(),
|
||||
name: item.name,
|
||||
quantity: Number(item.quantity) || 0,
|
||||
price: Number(item.price) || 0,
|
||||
description: item.description || "",
|
||||
unit: item.unit || "",
|
||||
})),
|
||||
})),
|
||||
})),
|
||||
};
|
||||
setCurrentCurrency(data.currency || "TWD");
|
||||
form.setFieldsValue(quotationData);
|
||||
setFormValues(quotationData);
|
||||
setTaxRate(data.taxRate || 0);
|
||||
message.success('已添加报价单');
|
||||
|
||||
}else{
|
||||
const _data={
|
||||
...data,
|
||||
key: uuidv4(),
|
||||
};
|
||||
setCurrentCurrency(jsonData.currency || "TWD");
|
||||
form.setFieldsValue(quotationData);
|
||||
setFormValues(quotationData);
|
||||
setTaxRate(Number(jsonData.taxRate) || 0);
|
||||
message.success('已添加报价单');
|
||||
} else {
|
||||
const newSection = {
|
||||
...jsonData,
|
||||
key: uuidv4(),
|
||||
};
|
||||
const currentSections = form.getFieldValue('sections') || [];
|
||||
const newSections = [...currentSections, newSection];
|
||||
|
||||
form.setFieldValue('sections', newSections);
|
||||
const currentFormValues = form.getFieldsValue();
|
||||
setFormValues({
|
||||
...currentFormValues,
|
||||
sections: newSections
|
||||
});
|
||||
message.success('已添加新的服务项目');
|
||||
}
|
||||
const newSections = [...formValues.sections, _data];
|
||||
form.setFieldValue('sections', newSections);
|
||||
const currentFormValues = form.getFieldsValue();
|
||||
setFormValues({
|
||||
...currentFormValues,
|
||||
sections: newSections
|
||||
});
|
||||
message.success('已添加新的服务项目');
|
||||
|
||||
setDifyOpen(false);
|
||||
setVercelOpen(false);
|
||||
} catch (error) {
|
||||
console.error('Export error:', error);
|
||||
message.error('导出失败:数据格式错误');
|
||||
}
|
||||
|
||||
setDifyOpen(false);
|
||||
setVercelOpen(false);
|
||||
};
|
||||
|
||||
return (
|
||||
@@ -401,9 +406,9 @@ const QuotationForm = () => {
|
||||
<Button onClick={() => setDifyOpen(true)}>
|
||||
AI for Dify
|
||||
</Button>
|
||||
<Button onClick={() => setVercelOpen(true)}>
|
||||
{/* <Button onClick={() => setVercelOpen(true)}>
|
||||
AI for Vercel
|
||||
</Button>
|
||||
</Button> */}
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -511,11 +516,7 @@ const QuotationForm = () => {
|
||||
onClose={() => setDifyOpen(false)}
|
||||
onExport={handleExport}
|
||||
/>
|
||||
<ChatAIDrawer
|
||||
open={vercelOpen}
|
||||
onClose={() => setVercelOpen(false)}
|
||||
onExport={handleExport}
|
||||
/>
|
||||
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
1
src/pages/quotation/index.jsx
Normal file
1
src/pages/quotation/index.jsx
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
@@ -69,7 +69,7 @@ const AppRoutes = () => {
|
||||
path="/login"
|
||||
element={
|
||||
user?.id ? (
|
||||
<Navigate to="/home" replace />
|
||||
<Navigate to="/dashboard" replace />
|
||||
) : (
|
||||
<Login />
|
||||
)
|
||||
@@ -86,7 +86,7 @@ const AppRoutes = () => {
|
||||
>
|
||||
<Route
|
||||
index
|
||||
element={<Navigate to="/home" replace />}
|
||||
element={<Navigate to="/dashboard" replace />}
|
||||
/>
|
||||
{renderRoutes(allRoutes)}
|
||||
<Route path="*" element={<NotFound />} />
|
||||
|
||||
@@ -82,23 +82,14 @@ export const allRoutes = [
|
||||
key: "company/quotaInfo",
|
||||
},
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
path: "quotaInfo/preview/:id?", // 添加可选的 id 参数
|
||||
=======
|
||||
path: "quotaInfo/preview/:id?",
|
||||
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
|
||||
hidden: true,
|
||||
component: lazy(() => import("@/pages/company/quotation/view")),
|
||||
name: "报价单预览",
|
||||
icon: "file",
|
||||
<<<<<<< HEAD
|
||||
key:'company/quotaInfo/preview'
|
||||
},
|
||||
=======
|
||||
key: "company/quotaInfo/preview",
|
||||
},
|
||||
|
||||
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
|
||||
{
|
||||
path: "project",
|
||||
component: lazy(() => import("@/pages/company/project")),
|
||||
@@ -135,10 +126,6 @@ export const allRoutes = [
|
||||
name: "服务模版详情",
|
||||
icon: "container",
|
||||
key: "company/serviceTemplateInfo",
|
||||
<<<<<<< HEAD
|
||||
|
||||
=======
|
||||
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
|
||||
},
|
||||
{
|
||||
path: "supplier",
|
||||
@@ -176,11 +163,7 @@ export const allRoutes = [
|
||||
component: lazy(() => import("@/pages/company/service/itemsManange")),
|
||||
name: "资源类型",
|
||||
icon: "container",
|
||||
<<<<<<< HEAD
|
||||
key:'company/templateItemManage'
|
||||
=======
|
||||
key: "company/templateItem",
|
||||
>>>>>>> 8dccf8e554eefcfa832eca45be35be4dddad3cb8
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
const withMT = require("@material-tailwind/react/utils/withMT");
|
||||
|
||||
module.exports = withMT({
|
||||
content: [
|
||||
"./index.html",
|
||||
"./src/**/*.{js,ts,jsx,tsx}",
|
||||
@@ -133,4 +135,4 @@ export default {
|
||||
corePlugins: {
|
||||
preflight: false,
|
||||
},
|
||||
}
|
||||
})
|
||||
@@ -1,9 +1,8 @@
|
||||
import { defineConfig } from 'vite';
|
||||
import react from '@vitejs/plugin-react';
|
||||
import path from 'path';
|
||||
|
||||
// 使用 __dirname 需要添加 import.meta.url 的支持
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
@@ -19,13 +18,13 @@ export default defineConfig({
|
||||
'@contexts': path.resolve(__dirname, 'src/contexts'),
|
||||
'@assets': path.resolve(__dirname, 'src/assets'),
|
||||
},
|
||||
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'] // 添加文件扩展名自动解析
|
||||
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json']
|
||||
},
|
||||
server: {
|
||||
port: 3000,
|
||||
open: true,
|
||||
host: true,
|
||||
strictPort: true,
|
||||
optimizeDeps: {
|
||||
include: ['react-apexcharts', 'apexcharts'],
|
||||
esbuildOptions: {
|
||||
target: 'es2020',
|
||||
},
|
||||
},
|
||||
build: {
|
||||
outDir: 'dist',
|
||||
@@ -34,8 +33,19 @@ export default defineConfig({
|
||||
output: {
|
||||
manualChunks: {
|
||||
vendor: ['react', 'react-dom', 'react-router-dom', 'antd'],
|
||||
charts: ['react-apexcharts', 'apexcharts'],
|
||||
},
|
||||
},
|
||||
},
|
||||
target: 'es2020',
|
||||
commonjsOptions: {
|
||||
include: [/node_modules/],
|
||||
},
|
||||
},
|
||||
server: {
|
||||
port: 3000,
|
||||
open: true,
|
||||
host: true,
|
||||
strictPort: true,
|
||||
},
|
||||
});
|
||||
273
yarn.lock
273
yarn.lock
@@ -537,6 +537,18 @@
|
||||
dependencies:
|
||||
"@emotion/memoize" "^0.8.1"
|
||||
|
||||
"@emotion/is-prop-valid@^0.8.2":
|
||||
version "0.8.8"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a"
|
||||
integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==
|
||||
dependencies:
|
||||
"@emotion/memoize" "0.7.4"
|
||||
|
||||
"@emotion/memoize@0.7.4":
|
||||
version "0.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
|
||||
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
|
||||
|
||||
"@emotion/memoize@^0.8.1":
|
||||
version "0.8.1"
|
||||
resolved "https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
|
||||
@@ -709,6 +721,21 @@
|
||||
"@floating-ui/core" "^1.6.0"
|
||||
"@floating-ui/utils" "^0.2.8"
|
||||
|
||||
"@floating-ui/dom@^1.2.1":
|
||||
version "1.6.13"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34"
|
||||
integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==
|
||||
dependencies:
|
||||
"@floating-ui/core" "^1.6.0"
|
||||
"@floating-ui/utils" "^0.2.9"
|
||||
|
||||
"@floating-ui/react-dom@^1.2.2":
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-1.3.0.tgz#4d35d416eb19811c2b0e9271100a6aa18c1579b3"
|
||||
integrity sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==
|
||||
dependencies:
|
||||
"@floating-ui/dom" "^1.2.1"
|
||||
|
||||
"@floating-ui/react-dom@^2.1.2":
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31"
|
||||
@@ -716,6 +743,15 @@
|
||||
dependencies:
|
||||
"@floating-ui/dom" "^1.0.0"
|
||||
|
||||
"@floating-ui/react@0.19.0":
|
||||
version "0.19.0"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.19.0.tgz#d8e19a3fcfaa0684d5ec3f335232b4e0ac0c87e1"
|
||||
integrity sha512-fgYvN4ksCi5OvmPXkyOT8o5a8PSKHMzPHt+9mR6KYWdF16IAjWRLZPAAziI2sznaWT23drRFrYw64wdvYqqaQw==
|
||||
dependencies:
|
||||
"@floating-ui/react-dom" "^1.2.2"
|
||||
aria-hidden "^1.1.3"
|
||||
tabbable "^6.0.1"
|
||||
|
||||
"@floating-ui/react@^0.26.28":
|
||||
version "0.26.28"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7"
|
||||
@@ -730,6 +766,16 @@
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62"
|
||||
integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
|
||||
|
||||
"@floating-ui/utils@^0.2.9":
|
||||
version "0.2.9"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
|
||||
integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
|
||||
|
||||
"@heroicons/react@^2.2.0":
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.2.0.tgz#0c05124af50434a800773abec8d3af6a297d904b"
|
||||
integrity sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==
|
||||
|
||||
"@humanwhocodes/config-array@^0.13.0":
|
||||
version "0.13.0"
|
||||
resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
|
||||
@@ -818,6 +864,21 @@
|
||||
resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-7.15.2.tgz#f583ecfb7b92cad17c67f7825f20f23b72e6d7ff"
|
||||
integrity sha512-p8dsW0fdJxzYhULbm1noFYRHuBvJHleYviC0BlwbkVySC8AsvFI8AmC3sMssWV3dQ3yQ/SidYo9U+K/czpDpZw==
|
||||
|
||||
"@material-tailwind/react@^2.1.10":
|
||||
version "2.1.10"
|
||||
resolved "https://registry.yarnpkg.com/@material-tailwind/react/-/react-2.1.10.tgz#e4ff8b8a5cf1a39209d408dda3217f632c080e9a"
|
||||
integrity sha512-xGU/mLDKDBp/qZ8Dp2XR7fKcTpDuFeZEBqoL9Bk/29kakKxNxjUGYSRHEFLsyOFf4VIhU6WGHdIS7tOA3QGJHA==
|
||||
dependencies:
|
||||
"@floating-ui/react" "0.19.0"
|
||||
classnames "2.3.2"
|
||||
deepmerge "4.2.2"
|
||||
framer-motion "6.5.1"
|
||||
material-ripple-effects "2.0.1"
|
||||
prop-types "15.8.1"
|
||||
react "18.2.0"
|
||||
react-dom "18.2.0"
|
||||
tailwind-merge "1.8.1"
|
||||
|
||||
"@monaco-editor/loader@^1.4.0":
|
||||
version "1.4.0"
|
||||
resolved "https://registry.npmmirror.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558"
|
||||
@@ -832,6 +893,59 @@
|
||||
dependencies:
|
||||
"@monaco-editor/loader" "^1.4.0"
|
||||
|
||||
"@motionone/animation@^10.12.0":
|
||||
version "10.18.0"
|
||||
resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.18.0.tgz#868d00b447191816d5d5cf24b1cafa144017922b"
|
||||
integrity sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==
|
||||
dependencies:
|
||||
"@motionone/easing" "^10.18.0"
|
||||
"@motionone/types" "^10.17.1"
|
||||
"@motionone/utils" "^10.18.0"
|
||||
tslib "^2.3.1"
|
||||
|
||||
"@motionone/dom@10.12.0":
|
||||
version "10.12.0"
|
||||
resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.12.0.tgz#ae30827fd53219efca4e1150a5ff2165c28351ed"
|
||||
integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==
|
||||
dependencies:
|
||||
"@motionone/animation" "^10.12.0"
|
||||
"@motionone/generators" "^10.12.0"
|
||||
"@motionone/types" "^10.12.0"
|
||||
"@motionone/utils" "^10.12.0"
|
||||
hey-listen "^1.0.8"
|
||||
tslib "^2.3.1"
|
||||
|
||||
"@motionone/easing@^10.18.0":
|
||||
version "10.18.0"
|
||||
resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.18.0.tgz#7b82f6010dfee3a1bb0ee83abfbaff6edae0c708"
|
||||
integrity sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==
|
||||
dependencies:
|
||||
"@motionone/utils" "^10.18.0"
|
||||
tslib "^2.3.1"
|
||||
|
||||
"@motionone/generators@^10.12.0":
|
||||
version "10.18.0"
|
||||
resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.18.0.tgz#fe09ab5cfa0fb9a8884097feb7eb60abeb600762"
|
||||
integrity sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==
|
||||
dependencies:
|
||||
"@motionone/types" "^10.17.1"
|
||||
"@motionone/utils" "^10.18.0"
|
||||
tslib "^2.3.1"
|
||||
|
||||
"@motionone/types@^10.12.0", "@motionone/types@^10.17.1":
|
||||
version "10.17.1"
|
||||
resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.1.tgz#cf487badbbdc9da0c2cb86ffc1e5d11147c6e6fb"
|
||||
integrity sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==
|
||||
|
||||
"@motionone/utils@^10.12.0", "@motionone/utils@^10.18.0":
|
||||
version "10.18.0"
|
||||
resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.18.0.tgz#a59ff8932ed9009624bca07c56b28ef2bb2f885e"
|
||||
integrity sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==
|
||||
dependencies:
|
||||
"@motionone/types" "^10.17.1"
|
||||
hey-listen "^1.0.8"
|
||||
tslib "^2.3.1"
|
||||
|
||||
"@nodelib/fs.scandir@2.1.5":
|
||||
version "2.1.5"
|
||||
resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
|
||||
@@ -1096,6 +1210,33 @@
|
||||
"@supabase/realtime-js" "2.11.2"
|
||||
"@supabase/storage-js" "2.7.1"
|
||||
|
||||
"@svgdotjs/svg.draggable.js@^3.0.4":
|
||||
version "3.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.5.tgz#804fa627cbe850a137350009bd03d2c8423b39a7"
|
||||
integrity sha512-ljL/fB0tAjRfFOJGhXpr7rEx9DJ6D7Pxt3AXvgxjEM17g6wK3Ho9nXhntraOMx8JLZdq4NBMjokeXMvnQzJVYA==
|
||||
|
||||
"@svgdotjs/svg.filter.js@^3.0.8":
|
||||
version "3.0.8"
|
||||
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.8.tgz#998cb2481a871fa70d7dbaa891c886b335c562d7"
|
||||
integrity sha512-YshF2YDaeRA2StyzAs5nUPrev7npQ38oWD0eTRwnsciSL2KrRPMoUw8BzjIXItb3+dccKGTX3IQOd2NFzmHkog==
|
||||
dependencies:
|
||||
"@svgdotjs/svg.js" "^3.1.1"
|
||||
|
||||
"@svgdotjs/svg.js@^3.1.1", "@svgdotjs/svg.js@^3.2.4":
|
||||
version "3.2.4"
|
||||
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz#4716be92a64c66b29921b63f7235fcfb953fb13a"
|
||||
integrity sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==
|
||||
|
||||
"@svgdotjs/svg.resize.js@^2.0.2":
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz#732e4cae15d09ad3021adeac63bc9fad0dc7255a"
|
||||
integrity sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==
|
||||
|
||||
"@svgdotjs/svg.select.js@^4.0.1":
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz#80a10409e6c73206218690eac5c9f94f8c8909b5"
|
||||
integrity sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==
|
||||
|
||||
"@types/babel__core@^7.20.5":
|
||||
version "7.20.5"
|
||||
resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
|
||||
@@ -1268,6 +1409,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d"
|
||||
integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==
|
||||
|
||||
"@yr/monotone-cubic-spline@^1.0.3":
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz#7272d89f8e4f6fb7a1600c28c378cc18d3b577b9"
|
||||
integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==
|
||||
|
||||
acorn-jsx@^5.3.2:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||
@@ -1398,6 +1544,18 @@ anymatch@~3.1.2:
|
||||
normalize-path "^3.0.0"
|
||||
picomatch "^2.0.4"
|
||||
|
||||
apexcharts@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-4.3.0.tgz#eccf28e830ce1b5e018cfc0e99d1c6af0076c9c7"
|
||||
integrity sha512-PfvZQpv91T68hzry9l5zP3Gip7sQvF0nFK91uCBrswIKX7rbIdbVNS4fOks9m9yP3Ppgs6LHgU2M/mjoG4NM0A==
|
||||
dependencies:
|
||||
"@svgdotjs/svg.draggable.js" "^3.0.4"
|
||||
"@svgdotjs/svg.filter.js" "^3.0.8"
|
||||
"@svgdotjs/svg.js" "^3.2.4"
|
||||
"@svgdotjs/svg.resize.js" "^2.0.2"
|
||||
"@svgdotjs/svg.select.js" "^4.0.1"
|
||||
"@yr/monotone-cubic-spline" "^1.0.3"
|
||||
|
||||
arg@^5.0.2:
|
||||
version "5.0.2"
|
||||
resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
|
||||
@@ -1408,6 +1566,13 @@ argparse@^2.0.1:
|
||||
resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
|
||||
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
|
||||
|
||||
aria-hidden@^1.1.3:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522"
|
||||
integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==
|
||||
dependencies:
|
||||
tslib "^2.0.0"
|
||||
|
||||
array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b"
|
||||
@@ -1655,6 +1820,11 @@ chokidar@^4.0.0:
|
||||
dependencies:
|
||||
readdirp "^4.0.1"
|
||||
|
||||
classnames@2.3.2:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
|
||||
integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
|
||||
|
||||
classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1:
|
||||
version "2.5.1"
|
||||
resolved "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
|
||||
@@ -1889,6 +2059,11 @@ deep-is@^0.1.3:
|
||||
resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
|
||||
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
|
||||
|
||||
deepmerge@4.2.2:
|
||||
version "4.2.2"
|
||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
|
||||
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
|
||||
|
||||
define-data-property@^1.0.1, define-data-property@^1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
|
||||
@@ -2403,6 +2578,27 @@ fraction.js@^4.3.7:
|
||||
resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
|
||||
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
|
||||
|
||||
framer-motion@6.5.1:
|
||||
version "6.5.1"
|
||||
resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-6.5.1.tgz#802448a16a6eb764124bf36d8cbdfa6dd6b931a7"
|
||||
integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==
|
||||
dependencies:
|
||||
"@motionone/dom" "10.12.0"
|
||||
framesync "6.0.1"
|
||||
hey-listen "^1.0.8"
|
||||
popmotion "11.0.3"
|
||||
style-value-types "5.0.0"
|
||||
tslib "^2.1.0"
|
||||
optionalDependencies:
|
||||
"@emotion/is-prop-valid" "^0.8.2"
|
||||
|
||||
framesync@6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.0.1.tgz#5e32fc01f1c42b39c654c35b16440e07a25d6f20"
|
||||
integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==
|
||||
dependencies:
|
||||
tslib "^2.1.0"
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
@@ -2581,6 +2777,16 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
|
||||
dependencies:
|
||||
function-bind "^1.1.2"
|
||||
|
||||
heroicons@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/heroicons/-/heroicons-2.2.0.tgz#f1f554155152b4ec4d1b7165363d7c583690f77d"
|
||||
integrity sha512-yOwvztmNiBWqR946t+JdgZmyzEmnRMC2nxvHFC90bF1SUttwB6yJKYeme1JeEcBfobdOs827nCyiWBS2z/brog==
|
||||
|
||||
hey-listen@^1.0.8:
|
||||
version "1.0.8"
|
||||
resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68"
|
||||
integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==
|
||||
|
||||
highlight.js@^11.10.0:
|
||||
version "11.11.1"
|
||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.11.1.tgz#fca06fa0e5aeecf6c4d437239135fabc15213585"
|
||||
@@ -3033,6 +3239,11 @@ lru-cache@^5.1.1:
|
||||
dependencies:
|
||||
yallist "^3.0.2"
|
||||
|
||||
material-ripple-effects@2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/material-ripple-effects/-/material-ripple-effects-2.0.1.tgz#47803d2ab1561698d930e2524a7a9a19fb2829b7"
|
||||
integrity sha512-hHlUkZAuXbP94lu02VgrPidbZ3hBtgXBtjlwR8APNqOIgDZMV8MCIcsclL8FmGJQHvnORyvoQgC965vPsiyXLQ==
|
||||
|
||||
math-intrinsics@^1.0.0, math-intrinsics@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
|
||||
@@ -3302,6 +3513,16 @@ pirates@^4.0.1:
|
||||
resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
|
||||
integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
|
||||
|
||||
popmotion@11.0.3:
|
||||
version "11.0.3"
|
||||
resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.3.tgz#565c5f6590bbcddab7a33a074bb2ba97e24b0cc9"
|
||||
integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==
|
||||
dependencies:
|
||||
framesync "6.0.1"
|
||||
hey-listen "^1.0.8"
|
||||
style-value-types "5.0.0"
|
||||
tslib "^2.1.0"
|
||||
|
||||
possible-typed-array-names@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
|
||||
@@ -3374,7 +3595,7 @@ prelude-ls@^1.2.1:
|
||||
resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
||||
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
|
||||
|
||||
prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.8.1:
|
||||
prop-types@15.8.1, prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.8.1:
|
||||
version "15.8.1"
|
||||
resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
|
||||
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
||||
@@ -3771,6 +3992,21 @@ rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2:
|
||||
rc-resize-observer "^1.0.0"
|
||||
rc-util "^5.36.0"
|
||||
|
||||
react-apexcharts@^1.7.0:
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/react-apexcharts/-/react-apexcharts-1.7.0.tgz#bbd08425674224adb27c9f2c62477d43bd5de539"
|
||||
integrity sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA==
|
||||
dependencies:
|
||||
prop-types "^15.8.1"
|
||||
|
||||
react-dom@18.2.0:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
|
||||
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
scheduler "^0.23.0"
|
||||
|
||||
react-dom@^18.2.0:
|
||||
version "18.3.1"
|
||||
resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
|
||||
@@ -3911,6 +4147,13 @@ react-use@^17.6.0:
|
||||
ts-easing "^0.2.0"
|
||||
tslib "^2.1.0"
|
||||
|
||||
react@18.2.0:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
|
||||
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
|
||||
react@^18.2.0:
|
||||
version "18.3.1"
|
||||
resolved "https://registry.npmmirror.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
|
||||
@@ -3951,9 +4194,9 @@ recharts-scale@^0.4.4:
|
||||
dependencies:
|
||||
decimal.js-light "^2.4.1"
|
||||
|
||||
recharts@^2.9.0:
|
||||
recharts@^2.15.0:
|
||||
version "2.15.0"
|
||||
resolved "https://registry.npmmirror.com/recharts/-/recharts-2.15.0.tgz#0b77bff57a43885df9769ae649a14cb1a7fe19aa"
|
||||
resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.15.0.tgz#0b77bff57a43885df9769ae649a14cb1a7fe19aa"
|
||||
integrity sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==
|
||||
dependencies:
|
||||
clsx "^2.0.0"
|
||||
@@ -3999,6 +4242,11 @@ regexp.prototype.flags@^1.5.3:
|
||||
es-errors "^1.3.0"
|
||||
set-function-name "^2.0.2"
|
||||
|
||||
remixicon@^4.6.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/remixicon/-/remixicon-4.6.0.tgz#f2adafd18aaa983d61f8c9f7274fa17706da4ddc"
|
||||
integrity sha512-bKM5odjqE1yzVxEZGJE7F79WHhNrJFIKHXR+GG+P1IWXn8AnJZhl8SbIRDJsNAvIqx4VPkNwjuHfc42tutMDpQ==
|
||||
|
||||
resize-observer-polyfill@^1.5.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
|
||||
@@ -4101,7 +4349,7 @@ sass@^1.69.5:
|
||||
optionalDependencies:
|
||||
"@parcel/watcher" "^2.4.1"
|
||||
|
||||
scheduler@^0.23.2:
|
||||
scheduler@^0.23.0, scheduler@^0.23.2:
|
||||
version "0.23.2"
|
||||
resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
|
||||
integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
|
||||
@@ -4390,6 +4638,14 @@ strip-json-comments@^3.1.1:
|
||||
resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||
|
||||
style-value-types@5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.0.0.tgz#76c35f0e579843d523187989da866729411fc8ad"
|
||||
integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==
|
||||
dependencies:
|
||||
hey-listen "^1.0.8"
|
||||
tslib "^2.1.0"
|
||||
|
||||
styled-components@^6.1.0:
|
||||
version "6.1.13"
|
||||
resolved "https://registry.npmmirror.com/styled-components/-/styled-components-6.1.13.tgz#2d777750b773b31469bd79df754a32479e9f475e"
|
||||
@@ -4453,11 +4709,16 @@ swr@^2.0.0, swr@^2.2.5:
|
||||
dequal "^2.0.3"
|
||||
use-sync-external-store "^1.4.0"
|
||||
|
||||
tabbable@^6.0.0:
|
||||
tabbable@^6.0.0, tabbable@^6.0.1:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
|
||||
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
||||
|
||||
tailwind-merge@1.8.1:
|
||||
version "1.8.1"
|
||||
resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.8.1.tgz#0e56c8afbab2491f72e06381043ffec8b720ba04"
|
||||
integrity sha512-+fflfPxvHFr81hTJpQ3MIwtqgvefHZFUHFiIHpVIRXvG/nX9+gu2P7JNlFu2bfDMJ+uHhi/pUgzaYacMoXv+Ww==
|
||||
|
||||
tailwindcss@^3.3.5:
|
||||
version "3.4.17"
|
||||
resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63"
|
||||
@@ -4574,7 +4835,7 @@ tslib@2.6.2:
|
||||
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
|
||||
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
|
||||
|
||||
tslib@^2.0.0, tslib@^2.1.0:
|
||||
tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1:
|
||||
version "2.8.1"
|
||||
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
|
||||
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
|
||||
|
||||
Reference in New Issue
Block a user