This commit is contained in:
罗松柏 2022-07-20 18:39:11 +08:00
parent 2117b9ae6f
commit 64311d8e06
63 changed files with 4679 additions and 131 deletions

9
config-overrides.js Normal file
View File

@ -0,0 +1,9 @@
const { override, fixBabelImports } = require('customize-cra')
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: 'css',
})
)

View File

@ -6,15 +6,22 @@
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1",
"antd": "^4.20.7",
"babel-plugin-import": "^1.13.5",
"customize-cra": "^1.0.0",
"less": "^4.1.2",
"less-loader": "^11.0.0",
"react": "^18.1.0",
"react-app-rewired": "^2.2.1",
"react-dom": "^18.1.0",
"react-router-dom": "^6.3.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
},
"eslintConfig": {

BIN
public/images/jiantou.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -9,35 +9,11 @@
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
<title>乐谷人事管理系统</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -1,25 +0,0 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View File

@ -1,3 +0,0 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

View File

@ -1,38 +1,120 @@
.App {
text-align: center;
#root {
height: 100%;
}
.trigger {
padding: 0 24px;
font-size: 18px;
line-height: 64px;
cursor: pointer;
transition: color 0.3s;
}
.App-logo {
height: 40vmin;
pointer-events: none;
.trigger:hover {
color: #1890ff;
}
.appcontent { min-height: 280px; overflow-y: auto;}
.divdisplay { display: flex; }
.logo_box {
display: flex;
align-items: center;
margin: 16px;
}
.logo_box .logo {
height: 40px;
width: 40px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.3);
}
.logo_box .logo_txt {
height: 40px;
}
.logo_box .logo_txt p {
margin-bottom: 0;
margin-left: 10px;
}
.logo_box .introduction {
font-size: 12px;
color: #c1c5cc;
}
.logo_box .role {
font-size: 16px;
color: #fff;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
.ant-layout {
height: 100%;
}
.site-layout .site-layout-background {
background: #fff;
}
.ant-layout-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid rgba(217, 217, 217, 0.75);
}
.ant-modal {
overflow: hidden;
max-height: calc(100% - 100px);
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
::-webkit-scrollbar {
width:8px;
height:8px;
background-color:#F5F5F5;
}
/* 滚动条上的按钮 (上下箭头). */
::-webkit-scrollbar-button {
height: 0px;
width: 0px;
}
/* 滚动条上的滚动滑块. */
::-webkit-scrollbar-thumb {
background-color:#e6e6e6;
border-radius: 50px;
}
/* 滚动条轨道. */
::-webkit-scrollbar-track {
-webkit-box-shadow:inset 0 0 6px rgba(0, 142, 255, 1);
box-shadow:inset 0 0 6px rgba(0, 142, 255, 1, 1);
background-color:#F5F5F5;
}
/* 滚动条没有滑块的轨道部分 */
::-webkit-scrollbar-track-piece {
background-color: #fff;
}
/* 当同时有垂直滚动条和水平滚动条时交汇的部分. */
::-webkit-scrollbar-corner {
background:transparent;
}
.App-link {
color: #61dafb;
}
.fontweight{font-weight: bold;}
.margintop5{ margin-top: 5px; }
.margintop20{ margin-top: 20px; }
.margintop50 { margin-top: 50px; }
.marginright5 { margin-right: 5px;}
.marginright10{ margin-right: 10px; }
.marginright24{ margin-right: 24px; }
.cursor { cursor: pointer; }
.font-size12 { font-size: 12px; margin-bottom: 0;}
.font-size14 {font-size: 14px;}
.fontsize28 { font-size: 28px; }
.fontsize24 { font-size: 24px; }
.lineheight24{line-height: 24px;}
.color0 { color: #575d6a; }
.color1 { color: #75777d; }
.color2 { color: #5c5f6c; }
.color3 { color: #f49300; }
.color4 { color: #0c8cf6; }
.coloc5 { color: #312b2e; }
.color6 { color: #f47f76; }
.color7 { color: #5b524b; }
.border3 { border-color: #f49300 !important; }
.border6 { border-color: #f47f76 !important; }
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

View File

@ -1,25 +1,16 @@
import logo from './logo.svg';
import './App.css';
import React from 'react'
import GlobalRouter from './routes/GlobalRouter'
import './App.css'
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
// const App = () => {
// return <GlobalRouter/>
// }
// export default App
class App extends React.Component{
render(){
return <GlobalRouter/>
}
}
export default App;
export default App

153
src/AppLayOut.jsx Normal file
View File

@ -0,0 +1,153 @@
import React, { useState, useEffect } from 'react'
import { Layout, Menu } from 'antd'
import { Outlet, useNavigate, useLocation } from 'react-router-dom'
import NavHeader from './components/NavHeader'
import HeadLeftTtile from './components/HeadLeftTtile'
import './App.css'
import {
AppstoreOutlined,
UsergroupAddOutlined,
CalendarOutlined,
RestOutlined,
ShoppingOutlined,
PieChartOutlined,
SettingOutlined,
} from '@ant-design/icons'
// import GlobalRouter from './routes/GlobalRouter'
const { Header, Sider, Content } = Layout
function AppLayOut() {
const location = useLocation()
const navigate = useNavigate()
const [collapsed, setCollapsed] = useState(true)
const [headtitle, setHeadtitle] = useState('总览')
const [headnav,setHeadnav] = useState('')
const [defaultSelectedKeys,setdefaultSelectedKeys] = useState('/')
//
const click = (e) => {
navigate(e.key)
}
const select = (e) => {
const { title } = e.item.props
// console.log(title)
setHeadtitle(title)
}
//
const handlMouseEnter = () => {
setCollapsed(false)
}
//
const handlMouseLeave = () => {
setCollapsed(true)
}
useEffect(() => {
// return ()=>{
const pathname = location.pathname;
const pathurl = pathname.split('/')[2];
setHeadnav(pathurl)
setdefaultSelectedKeys(pathname)
// }
// const routes = matchRoutes(GlobalRouter, location.pathname);
// console.log(routes);
}, [location.pathname])
return (
<Layout>
<Sider
trigger={null}
collapsible
collapsed={collapsed}
onMouseLeave={handlMouseLeave}
onMouseEnter={handlMouseEnter}
>
{/* <div className="logo" /> */}
<div className="logo_box">
<div className="logo" />
<div
className="logo_txt"
style={{ display: collapsed ? 'none' : 'block' }}
>
<p className="introduction">Moka</p>
<p className="role">用人经理端</p>
</div>
</div>
<Menu
theme="dark"
mode="inline"
selectedKeys={defaultSelectedKeys}
defaultSelectedKeys={defaultSelectedKeys}
items={[
{
key: '/',
icon: <AppstoreOutlined />,
label: '总览',
title: '总览',
},
{
key: '/admin/candidate',
icon: <UsergroupAddOutlined />,
label: '候选人管理',
title: '候选人管理',
},
{
key: '/admin/interview',
icon: <CalendarOutlined />,
label: '面试安排',
title: '面试安排',
},
{
key: '/admin/position',
icon: <ShoppingOutlined />,
label: '职位管理',
title: '职位管理',
},
{
key: '/admin/talentpool',
icon: <RestOutlined />,
label: '人才库',
title: '人才库',
},
{
key: '/admin/reportforms',
icon: <PieChartOutlined />,
label: '报表中心',
title: '报表中心',
},
{
key: '/admin/setup',
icon: <SettingOutlined />,
label: '设置',
title: '设置',
},
]}
onClick={click}
onSelect={select}
/>
</Sider>
<Layout className="site-layout">
<Header
className="site-layout-background"
style={{
padding: 0,
}}
>
<HeadLeftTtile headtitle={headtitle} />
<NavHeader headnav={headnav}/>
</Header>
<Content
className='appcontent'
>
<Outlet />
</Content>
</Layout>
</Layout>
)
}
export default AppLayOut

View File

@ -0,0 +1,15 @@
.CandidateTable-box {}
.CandidateTable-list-box { width: 100%; padding: 14px; border-bottom: 1px solid #f4f4f5; display: flex; justify-content: space-between; }
.CandidateTable-list-box:hover { background-color: #f9f9fa; }
.CandidateTable-info-box { width: 510px; display: flex;}
.CandidateTable-info { margin-left: 45px; color: #575d6a; }
.CandidateTable-action { width: 420px; position: relative; }
.CandidateTable-info .name { font-size: 16px; font-weight: bold; color: #000; margin-right: 5px; }
.CandidateTable-info div { height: 28px; line-height: 28px; }
.but-box { width: 100%; display: flex; position: absolute; bottom: 0; }
.qxcheck-box { color: #c1c5cc; border: 1px solid #c1c5cc; width: 46px; text-align: center; margin-left: 14px; }
.qxcheck-box .ant-checkbox + span { padding-right: 0; }
.CandidateTable-table-action { border-bottom: 1px solid #f4f4f5; padding: 10px 0;}

View File

@ -0,0 +1,122 @@
import React from 'react'
import './index.css'
import { Checkbox, Tag, Button } from 'antd'
import {
ShoppingFilled,
BankOutlined,
SendOutlined,
RightOutlined,
} from '@ant-design/icons'
export default function CandidateTable() {
const onChange = (e) => {
console.log(`checked = ${e.target.checked}`)
}
const data = [
{
interview_name: '张四',
interview_type: 0,
interview_sign: 1,
feedback: 0,
interview_round: 1,
star_time: '2022-07-11T10:30:00',
end_time: '2022-07-11T11:00:00',
event_time: '2022-07-01T10:00:00',
uid: '1234567890',
name: '李五',
phone: '13789923799',
job_name: 'python开发',
hr_name: '王六',
work_exp: '2年',
interview_stage: 1,
owner_name: 2,
education: 1,
work_undergo: '',
school: '武汉大学',
specialty: '计算机专业',
mmended_state: 0,
mail: '250213000@qq.com',
account: '湖北武汉',
id_card: '421202199986750339',
gender: '男',
interview_state: 2,
graduate_time: '2022-07-01T08:00:00',
counts: 1,
},
]
return (
<div className="CandidateTable-box">
<div className="CandidateTable-table-action">
<div className="qxcheck-box">
<Checkbox onChange={onChange}>
<RightOutlined style={{ color: '#c1c5cc' }} />
</Checkbox>
</div>
{/* <div>
</div> */}
</div>
<div>
{data.map((item, key) => {
return (
<div className="CandidateTable-list-box">
<div className="CandidateTable-info-box">
<div>
<Checkbox onChange={onChange}></Checkbox>
</div>
<div className="CandidateTable-info">
<div>
<span className="time">
2022-05-16申请 |
</span>
<span> {item.job_name}</span>
</div>
<div>
<span className="name">{item.name}</span>
<span> {item.gender} |</span> <span> 25 |</span>
<span> {item.work_exp}工作经验</span>
</div>
<div>
<ShoppingFilled />
<span>{item.account} |</span>
<span> 2021-06至2022-05</span>
</div>
<div>
<BankOutlined /> <span> {item.school} |</span>
<span> {item.specialty} | </span> <span> 硕士 |</span>
<span> {item.graduate_time}</span>
</div>
<div>
<Tag color="processing">硕士</Tag>
<Tag color="warning">空白经历</Tag>
</div>
</div>
</div>
<div className="CandidateTable-owner">
候选人所有者:<span>张三</span>
</div>
<div className="CandidateTable-action">
推荐状态
<Tag icon={<SendOutlined />} color="default">
未推荐
</Tag>
<div className="but-box">
<Button type="primary">
进入 下一阶段
</Button>
<Button>淘汰</Button>
<Button>备注</Button>
<Button>推荐给用人部门</Button>
</div>
</div>
</div>
)
})}
</div>
</div>
)
}

View File

@ -0,0 +1,38 @@
.upload-box{
background-color: #f0f0f0;
padding: 24px;
display: flex;
align-items: center;
}
.upload-head-box {
/* text-align: center; */
}
/* .upload-head { text-align: center; } */
.upload-head-box span {
font-size: 12px;
color: #75777d;
}
.upload-head-title {
display: inline-block;
width: 104px;
font-size: 14px;
text-align: center;
font-weight: bold;
}
.upload-head-box div{
/* width: 60px;
height: 60px;
border-radius: 50%;
border: 1px solid #d9d9d9; */
}
.upload-head-box label { color: #75777d; font-size: 12px; margin-top: 5px; }
.Editresume-box .ant-tabs-content-holder {
max-height: 557px !important;
}
.upload-button-box {
margin: 24px;
}
.upload-button-box .ant-upload {width: 100%;}
.upload-button-box .ant-upload-list {display: none;}

View File

@ -0,0 +1,894 @@
import React, { useState } from 'react'
import {
Form,
Input,
Modal,
Radio,
Row,
Col,
Select,
DatePicker,
Tabs,
Divider,
Button,
message,
Upload,
Space,
Checkbox,
} from 'antd'
import {
MinusCircleOutlined,
LoadingOutlined,
PlusOutlined,
} from '@ant-design/icons'
import 'moment/locale/zh-cn'
import locale from 'antd/es/date-picker/locale/zh_CN'
import './index.css'
const { Option } = Select
const { TabPane } = Tabs
const { RangePicker } = DatePicker
const { TextArea } = Input
const getBase64 = (img, callback) => {
const reader = new FileReader()
reader.addEventListener('load', () => callback(reader.result))
reader.readAsDataURL(img)
}
const beforeUpload = (file) => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
if (!isJpgOrPng) {
message.error('You can only upload JPG/PNG file!')
}
const isLt2M = file.size / 1024 / 1024 < 2
if (!isLt2M) {
message.error('Image must smaller than 2MB!')
}
return isJpgOrPng && isLt2M
}
export default function Editresume({ visible, onCreate, onCancel }) {
console.log(visible)
const [form] = Form.useForm()
const onChange = (key) => {
console.log(key)
}
const onTimeChange = (date, dateString) => {
console.log(date, dateString)
}
const onSoFarChange = (e) => {
console.log(`checked = ${e.target.checked}`)
}
const [loading, setLoading] = useState(false)
const [imageUrl, setImageUrl] = useState()
const handleChange = (info) => {
if (info.file.status === 'uploading') {
setLoading(true)
return
}
if (info.file.status === 'done') {
// Get this url from response in real world.
getBase64(info.file.originFileObj, (url) => {
setLoading(false)
setImageUrl(url)
})
}
}
const uploadButton = (
<div>
{loading ? <LoadingOutlined /> : <PlusOutlined />}
<div
style={{
marginTop: 8,
}}
>
上传照片
</div>
</div>
)
const props = {
action: 'https://www.mocky.io/v2/5cc8019d300000980a055e76',
onChange({ file, fileList }) {
if (file.status !== 'uploading') {
console.log(file, fileList);
}
}
};
return (
<div>
<Modal
visible={visible}
onCancel={onCancel}
closable={false}
okText="确定"
cancelText="取消"
width={1200}
>
<div className="Editresume-box">
<Form
form={form}
layout="vertical"
name="form_in_modal"
initialValues={{
modifier: 'public',
}}
>
<Row gutter={24}>
<Col span={6}>
<Form.Item
name="title"
rules={[
{
required: true,
message: '填写姓名',
},
]}
>
<Input placeholder="填写姓名" />
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="position">
<Input
type="textarea"
placeholder="填写岗位"
/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="sex">
<Select
placeholder="选择性别"
optionFilterProp="children"
>
<Option value="1"></Option>
<Option value="2"></Option>
</Select>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="age">
<DatePicker locale={locale} />
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="phone"
rules={[
{
required: true,
message: '请输入手机号',
},
]}
>
<Input
addonBefore={'+86'}
style={{
width: '100%',
}}
/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="email"
rules={[
{
type: 'email',
message: '邮箱格式错误!',
},
{
required: true,
message: '请输入邮箱!',
},
]}
>
<Input />
</Form.Item>
</Col>
<Col span={4}>
<Form.Item name="workingyears">
<Select
placeholder="选择工作年限"
optionFilterProp="children"
>
<Option value="1">应届生</Option>
<Option value="2">1-3</Option>
<Option value="3">3-5</Option>
<Option value="4">5年以上</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item name="education">
<Select
placeholder="选择学历"
optionFilterProp="children"
>
<Option value="1">高中及以下</Option>
<Option value="2">专科</Option>
<Option value="3">本科</Option>
<Option value="4">硕士</Option>
<Option value="5">博士</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item
name="address"
rules={[
{
required: true,
message: '填写现住地址',
},
]}
>
<Input placeholder="填写现住地址" />
</Form.Item>
</Col>
</Row>
<div className="resume-energy-box">
<Tabs defaultActiveKey="2" onChange={onChange}>
<TabPane tab="原始简历" key="1">
原始简历
</TabPane>
<TabPane tab="标准简历" key="2">
{/* <StandardResume /> */}
<div className="marginright24">
<Divider orientation="left">
上传
</Divider>
<div className="upload-box">
<div className="upload-head-box">
<div className="upload-head">
<span className="upload-head-title">
上传照片
</span>
<Upload
name="avatar"
listType="picture-card"
className="avatar-uploader"
showUploadList={false}
action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
beforeUpload={
beforeUpload
}
onChange={handleChange}
>
{imageUrl ? (
<img
src={imageUrl}
alt="avatar"
style={{
width: '100%',
}}
/>
) : (
uploadButton
)}
</Upload>
</div>
<label>
支持JPG,JPEG,PNG等图片格式不超过2M
</label>
</div>
</div>
<Divider orientation="left">
个人信息
</Divider>
<Row gutter={24}>
<Col span={12}>
<Form.Item
label="最近公司"
required
>
<Input />
</Form.Item>
</Col>
</Row>
<Divider orientation="left">
求职意向
</Divider>
<Row gutter={24}>
<Col span={12}>
<Form.Item
label="当前薪资"
name="xingz"
required
>
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="期望薪资"
required
>
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="期望城市"
required
>
<Input />
</Form.Item>
</Col>
</Row>
<Divider orientation="left">
工作经历
</Divider>
<Form.List name="users">
{(fields, { add, remove }) => (
<>
{fields.map(
({
key,
name,
...restField
}) => (
<div
key={key}
name
align="baseline"
>
<Row
gutter={24}
>
<Col
span={
24
}
>
<Form.Item
{...restField}
name={[
name,
'time',
]}
label="起止时间"
rules={[
{
required: true,
message:
'请输入起止时间',
},
]}
>
<RangePicker
picker="month"
locale={
locale
}
onChange={
onTimeChange
}
/>
<div
style={{
float: 'right',
}}
>
<Checkbox
onChange={
onSoFarChange
}
>
至今
</Checkbox>
<MinusCircleOutlined
onClick={() =>
remove(
name
)
}
/>
</div>
</Form.Item>
</Col>
</Row>
<Row
gutter={24}
>
<Col
span={
12
}
>
<Form.Item
{...restField}
name={[
name,
'name',
]}
label="项目名称"
rules={[
{
required: true,
message:
'请填写项目名称',
},
]}
>
<Input />
</Form.Item>
</Col>
<Col
span={
12
}
>
<Form.Item
{...restField}
name={[
name,
'post',
]}
label="职务"
rules={[
{
required: true,
message:
'请填写职务',
},
]}
>
<Input />
</Form.Item>
</Col>
</Row>
<Form.Item
{...restField}
name={[
name,
'describe',
]}
label="项目描述"
rules={[
{
required: true,
message:
'请填写职务',
},
]}
>
<TextArea
rows={4}
placeholder="内容"
/>
</Form.Item>
<Form.Item
{...restField}
name={[
name,
'duty',
]}
label="项目中职责"
rules={[
{
required: true,
message:
'项目中职责',
},
]}
>
<TextArea
rows={4}
placeholder="内容"
/>
</Form.Item>
</div>
)
)}
<Form.Item>
<Button
type="dashed"
onClick={() =>
add()
}
block
icon={
<PlusOutlined />
}
>
添加
</Button>
</Form.Item>
</>
)}
</Form.List>
<Divider orientation="left">
语言能力
</Divider>
<Form.List name="language">
{(fields, { add, remove }) => (
<>
{fields.map(
({
key,
name,
...restField
}) => (
<div
key={key}
name
align="baseline"
>
<Row
gutter={24}
>
<Col
span={
12
}
>
<Form.Item
{...restField}
name={[
name,
'languagetype',
]}
label="语言类型"
rules={[
{
required: true,
message:
'语言类型不能为空',
},
]}
>
<Input placeholder="请输入掌握语言类型" />
</Form.Item>
</Col>
<Col
span={
12
}
>
<Form.Item
{...restField}
name={[
name,
'proficiency',
]}
label="掌握程度"
rules={[
{
required: true,
message:
'熟练度不能为空',
},
]}
>
<Select
placeholder="请选择"
optionFilterProp="children"
>
<Option value="1">
初级
</Option>
<Option value="2">
中级
</Option>
<Option value="3">
高级
</Option>
</Select>
</Form.Item>
</Col>
<Col
span={
12
}
>
<Form.Item
{...restField}
name={[
name,
'hear',
]}
label="听说"
rules={[
{
required: true,
message:
'听说类型不能为空',
},
]}
>
<Select
placeholder="请选择"
optionFilterProp="children"
>
<Option value="1">
初级
</Option>
<Option value="2">
中级
</Option>
<Option value="3">
高级
</Option>
</Select>
</Form.Item>
</Col>
<Col
span={
12
}
>
<Form.Item
{...restField}
name={[
name,
'Readwrit',
]}
label="读写"
rules={[
{
required: true,
message:
'读写类型不能为空',
},
]}
>
<Select
placeholder="请选择"
optionFilterProp="children"
>
<Option value="1">
初级
</Option>
<Option value="2">
中级
</Option>
<Option value="3">
高级
</Option>
</Select>
</Form.Item>
</Col>
</Row>
<div
style={{
textAlign:
'right',
}}
>
<MinusCircleOutlined
onClick={() => {
remove(
name
)
}}
/>
</div>
</div>
)
)}
<Form.Item>
<Button
type="dashed"
onClick={() =>
add()
}
block
icon={
<PlusOutlined />
}
>
添加
</Button>
</Form.Item>
</>
)}
</Form.List>
<Divider orientation="left">
自我描述
</Divider>
<Form.Item
name="mydescribe"
label="自我描述"
rules={[
{
required: true,
message: '请填写自我描述',
},
]}
>
<TextArea
rows={4}
placeholder="自我描述"
/>
</Form.Item>
<Divider orientation="left">
获奖经历
</Divider>
<Form.List name="award">
{(fields, { add, remove }) => (
<>
{fields.map(
({
key,
name,
...restField
}) => (
<div
key={key}
name
align="baseline"
>
<Row
gutter={24}
>
<Col
span={8}
>
<Form.Item
{...restField}
name={[
name,
'year',
]}
label="语言类型"
rules={[
{
required: true,
message:
'语言类型不能为空',
},
]}
>
<DatePicker
onChange={
onChange
}
picker="year"
locale={
locale
}
/>
</Form.Item>
</Col>
<Col
span={8}
>
<Form.Item
{...restField}
name={[
name,
'month',
]}
label="掌握程度"
rules={[
{
required: true,
message:
'熟练度不能为空',
},
]}
>
<DatePicker
onChange={
onChange
}
picker="month"
locale={
locale
}
/>
</Form.Item>
</Col>
<Col
span={8}
>
<Form.Item
{...restField}
name={[
name,
'awardname',
]}
label="奖项名称"
rules={[
{
required: true,
message:
'请输入奖项名称',
},
]}
>
<Input placeholder="请输入奖项名称" />
</Form.Item>
</Col>
</Row>
<div
style={{
textAlign:
'right',
}}
>
<MinusCircleOutlined
onClick={() => {
remove(
name
)
}}
/>
</div>
</div>
)
)}
<Form.Item>
<Button
type="dashed"
onClick={() =>
add()
}
block
icon={
<PlusOutlined />
}
>
添加
</Button>
</Form.Item>
</>
)}
</Form.List>
</div>
</TabPane>
</Tabs>
<div className="resume-right-box">
<div className='upload-button-box'>
<Upload {...props}>
<Button type="primary">
重新上传简历
</Button>
</Upload>
</div>
</div>
</div>
</Form>
</div>
</Modal>
</div>
)
}

View File

@ -0,0 +1,4 @@
.exportform-time-box {
width: 88px;
margin: 24px auto 0 auto;
}

View File

@ -0,0 +1,103 @@
import React, { useState, useEffect } from 'react'
import { Modal, DatePicker, Form, Radio, Button } from 'antd'
import './index.css'
import moment from 'moment'
import 'moment/locale/zh-cn'
import locale from 'antd/es/date-picker/locale/zh_CN'
const { RangePicker } = DatePicker
const dateFormat = 'YYYY/MM/DD'
export default function ExportForm({ visible, onCreate, onCancel }) {
const today = [
moment(
moment(Math.round(new Date() / 1000) * 1000).format('YYYY-MM-DD'),
dateFormat
),
moment(
moment(Math.round(new Date() / 1000) * 1000).format('YYYY-MM-DD'),
dateFormat
),
]
const yestoday = [
moment(
moment((Math.round(new Date() / 1000) + 86400) * 1000).format(
'YYYY-MM-DD'
),
dateFormat
),
moment(
moment((Math.round(new Date() / 1000) + 86400) * 1000).format(
'YYYY-MM-DD'
),
dateFormat
),
]
//
const day = [
moment(Math.round(new Date() / 1000) * 1000).format('YYYY-MM-DD'),
moment(Math.round(new Date() / 1000) * 1000).format('YYYY-MM-DD')
]
//
const yesday = [
moment((Math.round(new Date() / 1000) + 86400) * 1000).format(
'YYYY-MM-DD'
),
moment((Math.round(new Date() / 1000) + 86400) * 1000).format(
'YYYY-MM-DD'
),
]
const [date, setDate] = useState('today')
const [dataArr, setdataArr] = useState(today)
const [time,setTime] = useState(day)
return (
<div>
<Modal
visible={visible}
title="导出全部面试安排"
okText="确定"
cancelText="取消"
onCancel={onCancel}
onOk={() => {
console.log(time)
}}
>
<h5>最多可导出连续7天的面试</h5>
<div>
<label>选择时间段包括起止日</label>
<RangePicker
format={dateFormat}
locale={locale}
value={dataArr}
onChange={(dates, dateStrings) => {
setdataArr(dates)
console.log(dateStrings)
setTime(dateStrings)
}}
/>
</div>
<div className="exportform-time-box">
<Radio.Group
value={date}
onChange={(e) => {
setDate(e.target.value)
if (e.target.value === 'today') {
setdataArr(today)
setTime(day)
} else {
setdataArr(yestoday)
setTime(yesday)
}
}}
size="small"
buttonStyle="solid"
>
<Radio.Button value="today">今天</Radio.Button>
<Radio.Button value="tomorrow">明天</Radio.Button>
</Radio.Group>
</div>
</Modal>
</div>
)
}

View File

@ -0,0 +1,5 @@
.HeadLeftTitle-box {
font-size: 17px;
font-weight: bold;
padding: 0 18px;
}

View File

@ -0,0 +1,13 @@
import React,{Component} from 'react'
import "./index.css"
// import { withRouter } from 'react-router-dom'
class HeadLeftTtile extends Component {
render() {
const { headtitle } = this.props
return <div className="HeadLeftTitle-box">{headtitle}</div>
}
}
export default HeadLeftTtile

View File

@ -0,0 +1,27 @@
import React, { useState } from 'react'
import { Button } from 'antd'
import ResumeUpload from '../../pages/ResumeUpload'
import {PlusOutlined} from '@ant-design/icons'
export default function InterviewUploadPop() {
return (
<div>
<Button
type="primary"
// onClick={() => {
// setVisible(true)
// }}
>
<PlusOutlined />上传
</Button>
{/* <ResumeUpload
visible={visible}
onCreate={onCreate}
onCancel={() => {
setVisible(false)
}}
/> */}
</div>
)
}

View File

@ -0,0 +1,3 @@
.EnclosureTabs-box {
margin: 24px 24px 24px 0;
}

View File

@ -0,0 +1,49 @@
import React from 'react'
import './index.css'
import { UploadOutlined } from '@ant-design/icons'
import { Button, message, Upload,Input } from 'antd'
const props = {
name: 'file',
action: 'https://www.mocky.io/v2/5cc8019d300000980a055e76',
headers: {
authorization: 'authorization-text',
},
onChange(info) {
if (info.file.status !== 'uploading') {
console.log(info.file, info.fileList)
}
if (info.file.status === 'done') {
message.success(`${info.file.name} file uploaded successfully`)
} else if (info.file.status === 'error') {
message.error(`${info.file.name} file upload failed.`)
}
},
}
export default function EnclosureTabs() {
return (
<div className="EnclosureTabs-box">
<h2>附件</h2>
<Upload {...props}>
<Button icon={<UploadOutlined />}>附件上传</Button>
</Upload>
<p>
支持文档图片压缩包视频音频设计文件等格式文件单次上传文件总量请小于50MB
</p>
<h2>个人链接</h2>
<Input.Group compact>
<Input
style={{
width: 'calc(100% - 70px)',
}}
defaultValue="请输入"
/>
<Button type="primary">保存</Button>
</Input.Group>
</div>
)
}

View File

@ -0,0 +1,19 @@
.InterviewTabs-box {margin-right: 24px;}
.InterviewTabs-box .InterviewTabs-top-buttom-box {
text-align: center;
}
.InterviewTabs-box .InterviewTabs-top-buttom-box label{ float: right; }
.InterviewTabs-content-box { margin-top: 24px; }
.InterviewTabs-content-list-box {
display: flex;
height: 35px;
line-height: 35px;
}
.InterviewTabs-content-list-box label { width: 160px; }
.InterviewTabs-content-list-actionbar { margin-top: 10px; padding: 0 10px; display: flex; justify-content: space-between; align-items: center; background-color: #f0f0f0; height: 35px; line-height: 35px; }

View File

@ -0,0 +1,127 @@
import React from 'react'
import { Button, Collapse, Divider, Tag } from 'antd'
import './index.css'
import {
CalendarFilled,
SettingOutlined,
WarningFilled,
} from '@ant-design/icons'
const { Panel } = Collapse
export default function InterviewTabs() {
const onChange = (key) => {
console.log(key)
}
const data = [
{
title: '2022年5月16日 星期一·现场面试',
place: '武汉市洪山区野芷湖西路创意天地5号楼2层',
pic: '张三',
rounds: 0,
time: '12:00',
duration: '30分钟',
},
{
title: '2022年5月16日 星期一·现场面试',
place: '武汉市洪山区野芷湖西路创意天地5号楼2层',
pic: '张三',
rounds: 0,
time: '12:00',
duration: '30分钟',
},
{
title: '2022年5月16日 星期一·现场面试',
place: '武汉市洪山区野芷湖西路创意天地5号楼2层',
pic: '张三',
rounds: 0,
time: '12:00',
duration: '30分钟',
},
{
title: '2022年5月16日 星期一·现场面试',
place: '武汉市洪山区野芷湖西路创意天地5号楼2层',
pic: '张三',
rounds: 0,
time: '12:00',
duration: '30分钟',
},
{
title: '2022年5月16日 星期一·现场面试',
place: '武汉市洪山区野芷湖西路创意天地5号楼2层',
pic: '张三',
rounds: 0,
time: '12:00',
duration: '30分钟',
},
{
title: '2022年5月16日 星期一·现场面试',
place: '武汉市洪山区野芷湖西路创意天地5号楼2层',
pic: '张三',
rounds: 0,
time: '12:00',
duration: '30分钟',
},
]
const genExtra = () => (
<SettingOutlined
onClick={(event) => {
// If you don't want click extra trigger collapse, you can prevent this:
event.stopPropagation()
}}
/>
)
return (
<div className="InterviewTabs-box">
<div className="InterviewTabs-top-buttom-box">
<Button size="Large">添加面试</Button>
<label>导出面试反馈</label>
</div>
<div className="InterviewTabs-content-box">
<Collapse defaultActiveKey="0" onChange={onChange}>
{data.map((item, key) => {
return (
<Panel
header={item.title}
key={key}
extra={genExtra()}
>
<div className="InterviewTabs-content-list-box">
<label className="color2">面试地点</label>
<span>{item.place}</span>
</div>
<div className="InterviewTabs-content-list-box">
<label className="color2">面试负责人</label>
<span>{item.pic}</span>
</div>
<Divider />
<div className="InterviewTabs-content-list-box">
<label className="color2">面试信息</label>
<span>
{' '}
<Tag color="#22b8cf">初试</Tag>{' '}
{item.time} 时长{item.duration}
</span>
</div>
<div className="InterviewTabs-content-list-actionbar">
<div>{item.pic}</div>
<div>
<WarningFilled style={{color:'#f57527'}}/>
为评估
</div>
<div>
<Button type="link">催促反馈</Button>
<Button type="link">填写反馈</Button>
<Button type="link">面试未进行</Button>
</div>
</div>
</Panel>
)
})}
</Collapse>
</div>
</div>
)
}

View File

@ -0,0 +1,18 @@
.OfferTabs-box { margin-right: 24px; }
.OfferTabs-title-box { font-size: 16px; font-weight: bold; border-left: 4px solid #0c8cf6; text-align: left; text-indent: 10px; margin-top: 30px; }
.OfferTabs-title-box span { color: #0c8cf6; font-size: 14px; cursor: pointer; font-weight: 400; }
.OfferTabs-border-box { border: 1px solid #dddfe3; padding: 16px; margin-top: 16px; text-align: left; }
.display { display: flex; justify-content: space-between; align-items: center; }
.Approval-box { text-align: left; }
.Approval-box .title {font-weight: bold;}
.Approval-box span { color: #0c8cf6; }
.but-box { display: flex; justify-content: space-between; align-items: center; margin-top: 16px;}
.Offer-info-top-box { display: flex; justify-content: space-between; align-items: center; text-align: left; }
.Offer-info-box { text-align: left; margin: 16px 24px; }
.label-box { background-color: #dddfe3; padding: 8px 5px; color: #6e7686; }
.generate-box { display: flex; justify-content: space-between; align-items: center; margin: 16px 0; }
.generate-box span { margin-left: 10px; color: #0c8cf6; cursor: pointer; }

View File

@ -0,0 +1,159 @@
import React from 'react'
import './index.css'
import { Button, Dropdown, Menu, Tag } from 'antd'
import {
RightOutlined,
EllipsisOutlined,
DownOutlined,
} from '@ant-design/icons'
export default function OfferTabs() {
const onMenuClick = (e) => {
console.log('click', e)
}
const menu = (
<Menu
onClick={onMenuClick}
items={[
{
key: '1',
label: '操作一',
},
{
key: '2',
label: '操作二',
},
{
key: '3',
label: '操作三',
},
]}
/>
)
return (
<div className="OfferTabs-box">
<div style={{ textAlign: 'center' }}>
<Dropdown.Button overlay={menu}>导出offer信息</Dropdown.Button>
<div className="OfferTabs-title-box">入职记录</div>
<div className="OfferTabs-border-box display">
<span>尚未确定候选人是否入职</span>
<div className="">
<Button>确认入职</Button>
<Button>放弃入职</Button>
</div>
</div>
<div className="OfferTabs-title-box">Offer审批</div>
<div className="but-box">
<Button>重新发起审批</Button>
<Button>修改审批流程</Button>
</div>
<div className="OfferTabs-border-box display">
<div className="Approval-box">
<div className="title">通用审批流程</div>
<div>
2022-05-16 发起 · <span>查看Offer详情</span>
</div>
</div>
<div className="">
<Tag color="#37b24d">已通过</Tag>
<RightOutlined />
</div>
</div>
<div className="OfferTabs-title-box">Offer发送记录</div>
<div className="but-box">
<Button>重新发送</Button>
</div>
<div className="OfferTabs-border-box display">
<div className="Approval-box">
<div className="title">杨女士的Offer邮件</div>
<div>2022-05-16 发起</div>
</div>
<div className="">
<Tag color="#f79f00">候选人未决定Offer</Tag>
<EllipsisOutlined />
</div>
</div>
<div className="OfferTabs-title-box display">
Offer详情
<span>编辑</span>
</div>
<div className="OfferTabs-border-box">
<div className="Offer-info-top-box">
<span>杨女士的Offer</span>
<DownOutlined />
</div>
<div className="Offer-info-box">
<h4 className="fontweight">offer详情</h4>
{/* <div>
<span>薪资待遇</span>
</div> */}
</div>
</div>
<div className="OfferTabs-title-box display">
Offer邮件及短信
<span>编辑</span>
</div>
<h4 className="fontweight">邮件信息</h4>
<div className="OfferTabs-border-box">
<p>
<label className='label-box'>杨女士</label>,你好
</p>
<p>
感谢关注<label className='label-box'>武汉乐谷在线科技有限公司</label>!
跟高兴的通知您通过了我们的面试真诚的邀请您加入我们的团队
<br />
</p>
<p>
职位 <label className='label-box'>高级游戏测试工程师</label>
</p>
<p>
入职时间<label className='label-box'>2022-05-26</label>
</p>
<p>
薪酬<label className='label-box'>月薪</label>
</p>
<p>
<label className='label-box'>111111</label>
</p>
<p>
入职地点<label className='label-box'>xxx</label>
</p>
<p>
联系人<label className='label-box'>张三</label>
</p>
<p>
联系电话<label className='label-box'>123568875145</label>
</p>
<p>
联系邮箱<label className='label-box'>123659@163.com</label>
</p>
<p>如有问题请用以上联系方式及时与我们沟通谢谢</p>
<p>系统邮件请勿直接回复</p>
</div>
<div className='generate-box'>
<label>生成Offer附件</label>
<a href='#'>杨女士录用通知函.pdf</a>
<div>
<span>下载</span>
<span>预览</span>
</div>
</div>
</div>
</div>
)
}

View File

@ -0,0 +1,3 @@
.OperatiolistTabs-box {
margin: 24px 24px 24px 0;
}

View File

@ -0,0 +1,36 @@
import React from 'react'
import './index.css'
import { Timeline, Divider } from 'antd'
export default function OperatiolistTabs() {
return (
<div className="OperatiolistTabs-box ">
<Timeline>
<Timeline.Item>
<p className="fontweight">2022-05-15 16:06:35</p>
<p className="">候选人更新信息</p>
<p className="color1">由管理员 王二狗操作</p>
<Divider />
</Timeline.Item>
<Timeline.Item>
<p className="fontweight">2022-05-15 16:06:35</p>
<p className="">候选人更新信息</p>
<p className="color1">由管理员 王二狗操作</p>
<Divider />
</Timeline.Item>
<Timeline.Item>
<p className="fontweight">2022-05-15 16:06:35</p>
<p className="">候选人更新信息</p>
<p className="color1">由管理员 王二狗操作</p>
<Divider />
</Timeline.Item>
<Timeline.Item>
<p className="fontweight">2022-05-15 16:06:35</p>
<p className="">候选人更新信息</p>
<p className="color1">由管理员 王二狗操作</p>
<Divider />
</Timeline.Item>
</Timeline>
</div>
)
}

View File

@ -0,0 +1,17 @@
.RemarksTabs-top-box { display: flex; justify-content: space-between; align-items: center; margin-right: 24px; }
.remarks-title { font-size: 18px; font-weight: bold; margin-top: 30px; }
.remarks-list-box { border: 1px solid #f0f0f0; border-radius: 10px; margin: 24px 24px 0 0; }
.remarks-list { display: flex; margin: 8px; padding: 6px 10px; border-radius: 8px;
/* border: 1px solid #000; */
justify-content: space-between; }
.remarks-list .head-box { width: 30px; height: 30px; border-radius: 50%; background-color: #f06595; text-align: center; line-height: 30px; color: #fff; }
.remarks-list-userinfo-box { display: flex; justify-content: space-between; align-items: center; }
.remarks-list-right-box { width: calc(100% - 40px); }
.remarks-list-name { font-weight: bold; height: 32px; line-height: 32px;}
.remarks-list-time { color: #75777d; height: 32px; line-height: 32px; }
.operation-box { display: flex; align-items: center; }
.remarks-list-userinfo-box p { margin-bottom: 0; }
.operation-box button{ display: none; }
.remarks-list:hover { background-color: #f9f9fa; }
.remarks-list:hover .operation-box button{ display: block !important; }

View File

@ -0,0 +1,70 @@
import React from 'react'
import './index.css'
import { Checkbox, Button } from 'antd'
export default function RemarksTabs() {
const onChange=(e)=>{
console.log(e);
}
return (
<div>
<div className="RemarksTabs-top-box">
<Checkbox onChange={onChange}>设为私密</Checkbox>
<Button type="primary">添加</Button>
</div>
<div className='remarks-title'>查看备注</div>
<div className='remarks-list-box'>
<div className='remarks-list'>
<div className='head-box'></div>
<div className='remarks-list-right-box'>
<div className='remarks-list-userinfo-box'>
<p className='remarks-list-name'>刘大哥 </p>
<div className='operation-box'>
<Button type="link" danger>删除</Button>
<p className='remarks-list-time'>2022-07-07</p>
</div>
</div>
<div className='color1'>
呵呵哈哈哈或或
</div>
</div>
</div>
<div className='remarks-list'>
<div className='head-box'></div>
<div className='remarks-list-right-box'>
<div className='remarks-list-userinfo-box'>
<p className='remarks-list-name'>刘大哥 </p>
<div className='operation-box'>
<Button type="link" danger>删除</Button>
<p className='remarks-list-time'>2022-07-07</p>
</div>
</div>
<div className='color1'>
呵呵哈哈哈或或
</div>
</div>
</div>
<div className='remarks-list'>
<div className='head-box'></div>
<div className='remarks-list-right-box'>
<div className='remarks-list-userinfo-box'>
<p className='remarks-list-name'>刘大哥 </p>
<div className='operation-box'>
<Button type="link" danger>删除</Button>
<p className='remarks-list-time'>2022-07-07</p>
</div>
</div>
<div className='color1'>
呵呵哈哈哈或或
</div>
</div>
</div>
</div>
</div>
)
}

View File

@ -0,0 +1,38 @@
.InterviewerInfoPop-top-box { display: flex; justify-content: space-between; }
.InterviewerInfoPop-top-box .divdisplay{
align-items: center;
}
.InterviewerInfoPop-name { font-size: 22px; font-weight: bold; }
.InterviewerInfoPop-label { border: 1px solid #000; font-size: 14px; margin-left: 10px; width: 24px; height: 24px; text-align: center; line-height: 24px; }
.InterviewerInfoPop-apply-num { margin-left: 10px; background-color: #0086ff; height: 24px; line-height: 24px; font-size: 14px; color: #fff; padding: 0 6px; border-radius: 4px; }
.operationbutton div{ font-size: 18px; cursor: pointer; margin-left: 20px; color: #91989f; }
.operationbutton { display: flex; }
.resume-top-info{
width: 98%;
border: 1px solid #eee;
border-radius: 20px;
display: flex;
padding: 50px 0 10px 0;
}
.resume-head { width: 90px; height: 90px; overflow: hidden; border-radius: 50%; border: 1px solid #000; margin-left: 24px; box-shadow: 0 0px 10px rgba(000, 000, 000, 0.2); }
.resume-info { margin-left: 14px; }
.resume-info-name { font-size: 22px; font-weight: bold; margin-bottom: 30px; }
.xian { width: 60px; height: 4px; background-color: #dddfe0; }
.personal-information-box {margin: 20px 100px; }
/* .personal-info-box { padding-bottom: 30px; } */
.personal-information-box label{ white-space: nowrap; }
/* .information-box { overflow-y: auto; } */
.work-experience-box { width: 98%; border-left: 2px solid #a4a5a7; background-color: #f0f0f0; padding: 12px 48px; }
.side-action-bar-box {width: calc(100% - 850px); height: auto; background-color: #f4f4f4; margin-top: 45px; border-top: 1px solid #f0f0f0;}
.InterviewerInfoPop-box .ant-tabs { width: 100% !important; }
.side-action-bar-box .button-box {padding: 0 24px;}
.button-box button {margin-top: 16px;}
.InterviewerInfoPop-box .ant-tabs-content-holder {
overflow-y: auto;
height: 33vw;
}

View File

@ -0,0 +1,265 @@
import React, { useState, useEffect } from 'react'
import { Button, Form, Input, Modal, Tabs, Badge } from 'antd'
import Steptone from '../Steptone'
import InterviewTabs from './InterviewTabs'
import OperatiolistTabs from './OperatiolistTabs'
import EnclosureTabs from './EnclosureTabs'
import RemarksTabs from './RemarksTabs'
import OfferTabs from './OfferTabs'
import './index.css'
import {
UserOutlined,
PhoneOutlined,
MailOutlined,
ShoppingOutlined,
ReadOutlined,
SendOutlined,
DeleteOutlined,
EditOutlined,
CloseOutlined,
} from '@ant-design/icons'
export default function InterviewerInfoPop({
visible,
onCreate,
data,
onCancel,
onEditresume,
}) {
const [form] = Form.useForm()
const { TabPane } = Tabs
const onChange = (key) => {
console.log(key)
}
return (
<div>
<Modal
visible={visible}
onCancel={onCancel}
footer={null}
closable={false}
width={1200}
>
<div className="InterviewerInfoPop-box">
<div className="InterviewerInfoPop-top-box">
<div className="">
<div className="divdisplay">
<span className="InterviewerInfoPop-name coloc5">
张三
</span>
<div className="InterviewerInfoPop-label color6 border6">
</div>
<div className="InterviewerInfoPop-label color3 border3">
<UserOutlined />
</div>
<div className="InterviewerInfoPop-apply-num">
已申请1次
</div>
</div>
<div
className="divdisplay"
style={{ marginTop: 10 }}
>
<div className="color1 font-size14 marginright10">
<UserOutlined /> · 24
</div>
<div className="color1 font-size14 marginright10">
<PhoneOutlined /> 15369874569(上海)
</div>
<div className="color1 font-size14 marginright10">
<MailOutlined /> 212365748@qq.com
</div>
<div className="color1 font-size14 marginright10">
<ShoppingOutlined /> 1
</div>
<div className="color1 font-size14 marginright10">
<ReadOutlined /> 硕士
</div>
<div className="color1 font-size14 marginright10">
<SendOutlined /> 湖北省-武汉市
</div>
</div>
</div>
<div className="operationbutton">
<div className="">
<DeleteOutlined />
</div>
<div className="">
<EditOutlined
onClick={() => onEditresume({ data })}
/>
</div>
<div className="">
<CloseOutlined onClick={onCreate} />
</div>
</div>
</div>
<div className="divdisplay">
<div style={{ width: '850px' }}>
<Tabs defaultActiveKey="1" onChange={onChange}>
<TabPane tab="基本信息" key="1">
<div className="information-box">
<div className="resume-top-info">
<div className="resume-head"></div>
<div className="resume-info">
<div className="resume-info-name coloc5">
张三
</div>
<div>
<span className="fontsize14 color1 marginright10">
{' '}
<PhoneOutlined className="marginright5" />{' '}
<span>
15369874569(上海)
</span>{' '}
</span>
<span className="fontsize14 color1">
{' '}
<MailOutlined className="marginright5" />{' '}
<span>
212365748@qq.com
</span>{' '}
</span>
</div>
<div className="fontsize14 color1 margintop5">
·24·1年工作经验·硕士·湖北-武汉
</div>
</div>
</div>
<div className="fontsize24 fontweight margintop50 coloc5">
个人信息
<div className="xian margintop20"></div>
</div>
<div className="personal-info-box">
<div className="divdisplay personal-information-box lineheight24">
<label className="color1 marginright24">
最近公司
</label>
<p className="coloc5">
武汉掌游科技有限公司
</p>
</div>
</div>
<div className="fontsize24 fontweight margintop50 coloc5">
工作经历
<div className="xian margintop20"></div>
</div>
<div className="personal-info-box">
<div>
<div className="work-experience-box margintop20 divdisplay">
<label className="color7 marginright24">
2122-11 - 2022-02
</label>
<div className="coloc5 fontweight">
武汉xxx有限公司
</div>
</div>
<div className="divdisplay personal-information-box lineheight24">
<label className="color1 marginright24">
职位名称
</label>
<p className="coloc5">
计算会计
</p>
</div>
<div className="divdisplay personal-information-box lineheight24">
<label className="color1 marginright24">
工作职责
</label>
<p className="coloc5">
安守本分挥洒的回访客户萨迪克返回空上岛咖啡哈师大放开手大富科技阿士大夫卡啥打开就发生接口黄卡就收到回复交换空间撒大黄蜂尽快哈萨克东方红卡上的反馈
</p>
</div>
</div>
<div>
<div className="work-experience-box margintop20 divdisplay">
<label className="color7 marginright24">
2122-11 - 2022-02
</label>
<div className="coloc5 fontweight">
武汉xxx有限公司
</div>
</div>
<div className="divdisplay personal-information-box lineheight24">
<label className="color1 marginright24">
职位名称
</label>
<p className="coloc5">
计算会计
</p>
</div>
<div className="divdisplay personal-information-box lineheight24">
<label className="color1 marginright24">
工作职责
</label>
<p className="coloc5">
安守本分挥洒的回访客户萨迪克返回空上岛咖啡哈师大放开手大富科技阿士大夫卡啥打开就发生接口黄卡就收到回复交换空间撒大黄蜂尽快哈萨克东方红卡上的反馈
</p>
</div>
</div>
</div>
</div>
</TabPane>
<TabPane tab="面试" key="2">
<div className="information-box">
<InterviewTabs />
</div>
</TabPane>
<TabPane tab="考试/测评" key="3">
考试/测评
</TabPane>
<TabPane tab="Offer/录用" key="4">
<OfferTabs/>
</TabPane>
<TabPane
tab={
<Badge
size="small"
count="2"
color={'blue'}
>
<span>备注</span>
</Badge>
}
key="5"
>
<RemarksTabs/>
</TabPane>
<TabPane tab="附加信息" key="6">
<EnclosureTabs/>
</TabPane>
<TabPane tab="操作记录" key="7">
<OperatiolistTabs />
</TabPane>
</Tabs>
</div>
<div className="side-action-bar-box">
<div className="progress-bar-box">
{/* 步骤条组件 */}
<Steptone data="1" />
</div>
<div className="button-box">
<Button type="primary" block>
进入下一阶段
</Button>
<Button block>淘汰</Button>
<Button block>关注</Button>
<Button block>备注</Button>
</div>
</div>
</div>
</div>
</Modal>
</div>
)
}

View File

@ -0,0 +1,4 @@
.navheader-box { height: 32px; margin-right: 24px; display: flex; align-items: center; }
.navheader-box .ant-space-item{ line-height: 0; }
.navheader-box .navheader-biv{ margin-right: 16px; line-height: 0; cursor: pointer;}
.navheader-box .navheader-biv .headimg { width: 32px; height: 32px; border-radius: 50%; text-align: center; line-height: 32px; background-color: #0c8cf6; color: #fff; font-size: 12px; }

View File

@ -0,0 +1,103 @@
import React, { Component, useState } from 'react'
import ResumeUploadPop from '../ResumeUploadPop'
import InterviewUploadPop from '../InterviewUploadPop'
import './index.css'
import { Input, Space, Button, Badge, Menu, Dropdown } from 'antd'
import {
ShopOutlined,
QuestionCircleOutlined,
AlertOutlined,
} from '@ant-design/icons'
const { Search } = Input
// const suffix = (
// <AudioOutlined
// style={{
// fontSize: 16,
// color: '#1890ff',
// }}
// />
// )
const menu = (
<Menu
items={[
{
key: '1',
label: <p>1st menu item</p>,
},
{
key: '2',
label: <p>2nd menu item</p>,
},
{
key: '3',
label: <p>退出登录</p>,
},
]}
/>
)
const onSearch = (value) => console.log(value)
export default class NavHeader extends Component {
state = { component: '' }
componentDidMount(){
}
componentWillUpdate(){
const { headnav } = this.props
// console.log('NavHeader')
// switch (headnav) {
// case 'position':
// this.setState({
// component: <ResumeUploadPop />,
// })
// break
// case 'interview':
// this.setState({
// component: <InterviewUploadPop />,
// })
// break
// }
}
render() {
const { headnav } = this.props
return (
<div className="navheader-box">
<div className="navheader-biv">
<Space direction="vertical">
<Search
placeholder="搜索候选人"
onSearch={onSearch}
style={{
width: 200,
}}
/>
</Space>
</div>
<div className="navheader-biv">{headnav== 'position'? <ResumeUploadPop />: <InterviewUploadPop />}</div>
<div className="navheader-biv">
<ShopOutlined
style={{ fontSize: '20px', color: '#ff6b6b' }}
/>
</div>
<div className="navheader-biv">
<QuestionCircleOutlined style={{ fontSize: '20px' }} />
</div>
<div className="navheader-biv">
<Badge count={5} size={'small'}>
{/* <Avatar shape="square" size="large" /> */}
<AlertOutlined style={{ fontSize: '20px' }} />
</Badge>
</div>
<div className="navheader-biv">
<Dropdown overlay={menu} placement="bottomLeft" arrow>
<div className="headimg"></div>
</Dropdown>
</div>
</div>
)
}
}

View File

@ -0,0 +1,31 @@
import React, { useState } from 'react'
import { Button } from 'antd'
import ResumeUpload from '../../pages/ResumeUpload'
export default function ResumeUploadPop() {
const [visible, setVisible] = useState(false)
const onCreate = (values) => {
console.log('Received values of form: ', values)
setVisible(false)
}
return (
<div>
<Button
type="primary"
onClick={() => {
setVisible(true)
}}
>
上传简历
</Button>
<ResumeUpload
visible={visible}
onCreate={onCreate}
onCancel={() => {
setVisible(false)
}}
/>
</div>
)
}

View File

@ -0,0 +1,7 @@
.progress-bar-box { background-color: #edeff1; height: 70px; padding: 24px; position: relative; }
.progress-bar-bg { width: 100%; height: 6px; background-color: #fff; }
.progress-bar-yuan-mr { width: 100%; display: flex; justify-content: space-between; position: relative; top: -13px; }
.progress-bar-yuan-mr div { width: 20px; height: 20px; border-radius: 50%; background-color: #fff; text-align: center; line-height: 20px; color: #75777d; }
.progress-bar-complete { width: 23%; height: 6px; background-color: #40a9ff; }
.progress-bar-yuan-complete { background-color: #40a9ff !important; color: #fff !important; }
.progress-bar-complete-title { width: 60px; text-align: center; position: relative; left: -20px; top: -10px; font-size: 12px; color: #75777d; }

View File

@ -0,0 +1,45 @@
import React, { Component } from 'react'
import './index.css'
export class Steptone extends Component {
render() {
const { data } = this.props //
const dataArr = [1, 2, 3, 4, 5] //
const completetitlearr = [-20, 33, 84, 133, 185] //
return (
<div>
<div className="progress-bar-bg">
<div
className="progress-bar-complete"
style={{ width: (data - 1) * 23 + '%' }}
></div>
</div>
<div className="progress-bar-yuan-mr">
{dataArr.map((i) => {
return (
<div
className={
data >= i
? 'progress-bar-yuan-complete'
: ''
}
key={i}
>
{i}
</div>
)
})}
</div>
{/* -20 40 155 210 */}
<div
className="progress-bar-complete-title"
style={{ left: completetitlearr[data - 1] }}
>
沟通Offer
</div>
</div>
)
}
}
export default Steptone

View File

@ -1,17 +1,15 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import React from 'react'
import ReactDOM from 'react-dom/client'
import './index.css'
import App from './App'
import reportWebVitals from './reportWebVitals'
import { BrowserRouter } from 'react-router-dom'
const root = ReactDOM.createRoot(document.getElementById('root'));
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
<BrowserRouter>
<App />
</BrowserRouter>
)
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
reportWebVitals()

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

80
src/pages/Login.jsx Normal file
View File

@ -0,0 +1,80 @@
import React from 'react';
import { Form, Input, Button, Checkbox } from 'antd';
import {useNavigate} from 'react-router-dom';
import { UserOutlined, LockOutlined } from '@ant-design/icons';
import './login.css'
export default function Login() {
const navigator = useNavigate();
const onFinish = (values) => {
localStorage.setItem('token',"asdasdasd");
navigator('/')
// console.log('Received values of form: ', values);
};
return (
<div className='components-form-demo-normal-login'>
<Form
name="normal_login"
className="login-form"
initialValues={{
remember: true,
}}
onFinish={onFinish}
>
<Form.Item
name="username"
rules={[
{
required: true,
message: '请输入用户名!',
},
]}
>
<Input
prefix={
<UserOutlined className="site-form-item-icon" />
}
placeholder="用户名"
/>
</Form.Item>
<Form.Item
name="password"
rules={[
{
required: true,
message: '请输入密码!',
},
]}
>
<Input
prefix={
<LockOutlined className="site-form-item-icon" />
}
type="password"
placeholder="密码"
/>
</Form.Item>
<Form.Item>
<Form.Item name="remember" valuePropName="checked" noStyle>
<Checkbox>记住我</Checkbox>
</Form.Item>
{/* <a className="login-form-forgot" href="#">
忘记密码
</a> */}
</Form.Item>
<Form.Item>
<Button
type="primary"
htmlType="submit"
className="login-form-button"
>
登录
</Button>
</Form.Item>
</Form>
</div>
)
}

View File

@ -0,0 +1,7 @@
import React from 'react'
export default function PageNotFound() {
return (
<div>404</div>
)
}

View File

@ -0,0 +1,10 @@
import React from 'react'
export default function StandardResume() {
return (
<div>
StandardResume
</div>
)
}

View File

@ -0,0 +1,23 @@
.resume-pop-box {
display: flex;
justify-content: space-between;
}
.resume-img-box {
width: 40%;
}
.resume-content-box {
width: 55%;
}
.resume-energy-box {
width: 100%;
display: flex;
justify-content: space-around;
}
.ant-tabs {
width: 80%;
}
.resume-right-box {
width: 20%;
background-color: #eee;
margin-top: 46px;
}

View File

@ -0,0 +1,195 @@
import React from 'react';
import { Form, Input, Modal, Radio, Row ,Col, Select, DatePicker, Tabs } from 'antd';
import 'moment/locale/zh-cn';
import locale from 'antd/es/date-picker/locale/zh_CN';
import StandardResume from './StandardResume'
import './index.css'
const {Option} = Select
const { TabPane } = Tabs
export default function ResumeUpload({visible,onCancel,onCreate}) {
const [form] = Form.useForm();
const onChange = (key) => {
console.log(key);
};
return (
<div>
<Modal
width={'96%'}
visible={visible}
okText="确定"
cancelText="取消"
onCancel={onCancel}
closable= {false}
onOk={() => {
form
.validateFields()
.then((values) => {
form.resetFields();
onCreate(values);
})
.catch((info) => {
console.log('Validate Failed:', info);
});
}}
>
<div className='resume-pop-box'>
<div className='resume-img-box'>
</div>
<div className='resume-content-box'>
<Form
form={form}
layout="vertical"
name="form_in_modal"
initialValues={{
modifier: 'public',
}}
>
<Row gutter={24}>
<Col span={6}>
<Form.Item
name="title"
rules={[
{
required: true,
message: '填写姓名',
},
]}
>
<Input placeholder='填写姓名'/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="position">
<Input type="textarea" placeholder='填写岗位'/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="sex">
<Select
placeholder="选择性别"
optionFilterProp="children"
>
<Option value="1"></Option>
<Option value="2"></Option>
</Select>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="age">
<DatePicker locale={locale} />
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="phone"
rules={[
{
required: true,
message: '请输入手机号',
},
]}
>
<Input
addonBefore={'+86'}
style={{
width: '100%',
}}
/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="email"
rules={[
{
type: 'email',
message: '邮箱格式错误!',
},
{
required: true,
message: '请输入邮箱!',
},
]}
>
<Input />
</Form.Item>
</Col>
<Col span={4}>
<Form.Item name="workingyears">
<Select
placeholder="选择工作年限"
optionFilterProp="children"
>
<Option value="1">应届生</Option>
<Option value="2">1-3</Option>
<Option value="3">3-5</Option>
<Option value="4">5年以上</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item name="education">
<Select
placeholder="选择学历"
optionFilterProp="children"
>
<Option value="1">高中及以下</Option>
<Option value="2">专科</Option>
<Option value="3">本科</Option>
<Option value="4">硕士</Option>
<Option value="5">博士</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item
name="address"
rules={[
{
required: true,
message: '填写现住地址',
},
]}
>
<Input placeholder='填写现住地址'/>
</Form.Item>
</Col>
</Row>
</Form>
<div className='resume-energy-box'>
<Tabs defaultActiveKey="2" onChange={onChange}>
<TabPane tab="原始简历" key="1">
原始简历
</TabPane>
<TabPane tab="标准简历" key="2">
<StandardResume />
</TabPane>
</Tabs>
<div className='resume-right-box'>
</div>
</div>
</div>
</div>
</Modal>
</div>
)
}

View File

@ -0,0 +1,54 @@
.Candidate-box {
width: 100%;
height: 100%;
display: flex;
justify-content: space-between;
}
.Candidate-left-box {
width: 250px;
height: 100%;
}
.Candidate-right-box {
width: calc(100% - 250px);
background-color: #fff;
height: 100%;
}
.Candidate-tabs-box {
/* margin: 0 24px; */
}
.Candidate-tabs-box .ant-tabs {
width: 100% !important;
}
.Candidate-tabs-box .tabs-box {
width: 128px;
padding: 20px 56px 18px 25px;
color: #575d6a;
}
.tabs-border {
background: url('../../../../public/images/jiantou.png') no-repeat;
background-position-x: right;
}
.border0 { border: 0 !important; }
.Candidate-tabs-box .ant-tabs-tab-btn .tabs-box {
color: #121316 !important;
}
.Candidate-tabs-box .ant-tabs-tab + .ant-tabs-tab {
margin: 0;
}
.Candidate-tabs-box .ant-tabs-tab {
padding: 0;
}
.Candidate-tabs-box .ant-tabs-ink-bar {
width: 25px !important;
margin-left: 25px;
}
.shadowright{
box-shadow: 0 0 10px rgba(000, 000, 000, 0.3);
}
.Candidate-table-box {
margin: 24px;
}

View File

@ -0,0 +1,99 @@
import React, { Component } from 'react'
import { Button, Form, Input, Modal, Radio, Tabs } from 'antd'
import './index.css'
import CandidateTable from '../../../components/CandidateTable'
const { TabPane } = Tabs
export default class Candidate extends Component {
state = {
tjnum: 0,
csnum: 2,
fsnum: 3,
msnum: 4,
gtnum: 5,
drznum: 2,
}
render() {
return (
<div className="Candidate-box">
<div className="Candidate-left-box"></div>
<div className="Candidate-right-box">
<div className="Candidate-tabs-box">
<Tabs defaultActiveKey="1">
<TabPane
tab={
<div className='tabs-box shadowright'>
<div>{this.state.tjnum}</div>
<div>人才推荐</div>
</div>
}
key="1"
>
</TabPane>
<TabPane
tab={
<div className='tabs-box tabs-border'>
<div>{this.state.csnum}</div>
<div>处筛</div>
</div>
}
key="2"
>
</TabPane>
<TabPane
tab={
<div className='tabs-box tabs-border'>
<div>{this.state.fsnum}</div>
<div>用人部门复筛</div>
</div>
}
key="3"
>
</TabPane>
<TabPane
tab={
<div className='tabs-box tabs-border'>
<div>{this.state.msnum}</div>
<div>面试</div>
</div>
}
key="4"
>
</TabPane>
<TabPane
tab={
<div className='tabs-box tabs-border'>
<div>{this.state.gtnum}</div>
<div>沟通offer</div>
</div>
}
key="5"
>
</TabPane>
<TabPane
tab={
<div className='tabs-box border0'>
<div>{this.state.drznum}</div>
<div>待入职</div>
</div>
}
key="6"
>
</TabPane>
</Tabs>
</div>
<div className='Candidate-table-box'>
<CandidateTable/>
</div>
</div>
</div>
)
}
}

View File

@ -0,0 +1,11 @@
.Interview-bj { width: 100%; background-color: #fff;}
.Interview-box {
margin: 0px 180px;
padding-top: 45px;
}
.Interview-top-box { display: flex; justify-content: space-between; align-items: center; }
.allposition { background-color: #22b8cf; color: #fff; border-color: #22b8cf; }
.ant-radio-button-wrapper-checked {color: #fff !important; background-color: #1890ff !important;}
.Interview-querycriteria-box { margin-top: 25px; width: 80%; }
.Interview-table-title { font-size: 17px; font-weight: bold; color: #575d6a; margin: 20px 0; }

View File

@ -0,0 +1,424 @@
import React, { useState } from 'react'
import ExportForm from '../../../components/ExportForm'
import InterviewerInfoPop from '../../../components/InterviewerInfoPop'
import Editresume from '../../../components/Editresume'
import './index.css'
import {
Button,
Radio,
Space,
Dropdown,
Menu,
Form,
Select,
Row,
Col,
Table,
Tag,
} from 'antd'
import {
UnorderedListOutlined,
CalendarOutlined,
RightOutlined,
TeamOutlined,
CheckCircleTwoTone,
LikeOutlined,
WarningOutlined,
} from '@ant-design/icons'
const { Option } = Select
function Interview() {
const [tabPosition, setTabPosition] = useState('list')
const [visible, setVisible] = useState(false) //
const [interviewerInfo, setInterviewerInfo] = useState(false) //
const [editresume, setEditresume] = useState(false) //
const [candidateid,setcandidateid] = useState(0)
const [form] = Form.useForm()
const todaynum = 0
const tomorrow = 0
const yesterday = 0
const changeTabPosition = (e) => {
setTabPosition(e.target.value)
}
const onMenuClick = (e) => {
console.log('click', e)
}
const onExportFormCreate = (values) => {
console.log('Received values of form: ', values)
setVisible(false)
}
const handelFeedback = (record,index)=>{
console.log("催促反馈")
}
const handelInterviewerInfo = (record,index)=>{
console.log("查看信息")
setcandidateid(record.key)
setInterviewerInfo(true)
}
const onInterviewerInfo = (values) =>{
setInterviewerInfo(false)
}
const onEditresumeCreate = () =>{
setEditresume(false)
}
//
const onEditresume = (data)=>{
setInterviewerInfo(false)
console.log(data);
setTimeout(()=>{
setEditresume(true)
},500)
}
const menu = (
<Menu
onClick={onMenuClick}
items={[
{
key: '1',
label: '面试签到二维码',
},
{
key: '2',
label: '显示已取消的面试',
}
]}
/>
)
const columns = [
{
title: '面试信息',
dataIndex: 'info',
render: (text, record, index) => {
return (
<div className="basicdata-box">
<Tag color="#00d1db">
{text.rounds === 0
? '初试'
: text.rounds === 1
? '复试'
: '终试'}
</Tag>
<Tag color={text.type === 0 ? 'gold' : 'purple'}>
{text.type === 0 ? '视频' : '现场'}
</Tag>
<span>{text.time}</span>
</div>
)
},
},
{
title: '候选人',
dataIndex: 'candidate',
render: (text, record, index) => (
<div className="font-size14 color0">
{text.type ? (
<CheckCircleTwoTone twoToneColor="#51cf66" />
) : (
''
)}
<span style={{ marginLeft: 2 }}>{text.name}</span>
</div>
),
},
{
title: '联系方式',
dataIndex: 'tel',
render: (text, record, index) => (
<div className="font-size14 color0">
<span>{text}</span>
</div>
),
},
{
title: '应聘职位',
dataIndex: 'position',
render: (text, record, index) => (
<div className="font-size14 color1">{text}</div>
),
},
{
title: '面试地点',
dataIndex: 'address',
render: (text, record, index) => (
<div className="font-size14 color1">{text}</div>
),
},
{
title: '面试负责人',
dataIndex: 'principal',
render: (text, record, index) => (
<div className="font-size14 color1">{text}</div>
),
},
{
title: '状态',
dataIndex: 'type',
render: (text, record, index) => (
<div className="font-size14 color1">
{text.type === 0 ? (
<LikeOutlined style={{ color: '#51cf66' }} />
) : (
<WarningOutlined style={{ color: '#f59f00' }} />
)}
{text.name}
</div>
),
},
{
title: '',
dataIndex: 'setup',
render: (text, record, index) => (
<div className="font-size14 color4 ">
<span className='cursor' style={{'margin':'0px 5px'}} onClick={()=>handelInterviewerInfo(record,index)}>查看详情</span>
<span className='cursor' style={{'margin':'0px 5px'}} onClick={()=>handelFeedback(record,index)}>{text.type === 0 ? '催促反馈' : ''}</span>
</div>
),
},
]
const data = [
{
key: 0,
info: {
rounds: 0,
type: 0,
time: '5云17日 0930 - 10:00',
},
candidate: {
type: true,
name: '张三',
},
tel: 18563265489,
position: '前端工程师',
address: '武汉 创意天地',
principal: '李四',
type: {
type: 0,
name: '王五',
},
setup: {
type: 0,
},
},
{
key: 1,
info: {
rounds: 1,
type: 1,
time: '5云17日 0930 - 10:00',
},
candidate: {
type: false,
name: '张三',
},
tel: 18563265489,
position: '前端工程师',
address: '武汉 创意天地',
principal: '李四',
type: {
type: 1,
name: '王五',
},
setup: {
type: 1,
},
},
]
const [hasData, setHasData] = useState(true)
const tableColumns = columns.map((item) => ({ ...item }))
return (
<div className="Interview-bj">
<div className="Interview-box">
<div className="Interview-top-box">
<div>
<Space size={10}>
<Radio.Group
value={tabPosition}
onChange={changeTabPosition}
>
<Radio.Button value="list" size="large">
<UnorderedListOutlined />
</Radio.Button>
<Radio.Button value="bottom" size="large">
<CalendarOutlined />
</Radio.Button>
</Radio.Group>
<Button className="allposition">
<TeamOutlined /> 全部职位
<RightOutlined />
</Button>
</Space>
</div>
<div>
<Dropdown.Button
overlay={menu}
onClick={() => {
setVisible(true)
}}
>
导出面试安排
</Dropdown.Button>
<ExportForm
visible={visible}
onCreate={onExportFormCreate}
onCancel={() => {
setVisible(false)
}}
/>
</div>
</div>
<div className="Interview-querycriteria-box">
<Form form={form} layout="vertical">
<Row gutter={12}>
<Col span={4}>
<Form.Item label="职位">
<Select defaultValue="0">
<Option value="0">全部职位</Option>
<Option value="1">职位一</Option>
<Option value="2">职位二</Option>
<Option value="3">职位三</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item label="面试负责人">
<Select defaultValue="0">
<Option value="0">全部职位</Option>
<Option value="1">职位一</Option>
<Option value="2">职位二</Option>
<Option value="3">职位三</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item label="面试官">
<Select defaultValue="0">
<Option value="0">全部职位</Option>
<Option value="1">职位一</Option>
<Option value="2">职位二</Option>
<Option value="3">职位三</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item label="面试类型">
<Select defaultValue="0">
<Option value="0">全部职位</Option>
<Option value="1">职位一</Option>
<Option value="2">职位二</Option>
<Option value="3">职位三</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item label="面试地点">
<Select defaultValue="0">
<Option value="0">全部职位</Option>
<Option value="1">职位一</Option>
<Option value="2">职位二</Option>
<Option value="3">职位三</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item label="面试签到">
<Select defaultValue="0">
<Option value="0">全部职位</Option>
<Option value="1">职位一</Option>
<Option value="2">职位二</Option>
<Option value="3">职位三</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item label="面反馈">
<Select defaultValue="0">
<Option value="0">全部职位</Option>
<Option value="1">职位一</Option>
<Option value="2">职位二</Option>
<Option value="3">职位三</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item label="面试轮次">
<Select defaultValue="0">
<Option value="0">全部轮次</Option>
<Option value="1">初试</Option>
<Option value="2">复试</Option>
<Option value="3">终试</Option>
</Select>
</Form.Item>
</Col>
</Row>
</Form>
</div>
{/* 今天面试 */}
<div className="Interview-table-title">
今天的面试{todaynum}
</div>
<Table
bordered
columns={tableColumns}
dataSource={hasData ? data : []}
/>
{/* 明天及之后的面试 */}
<div className="Interview-table-title">
明天及之后的面试{tomorrow}
</div>
<Table
bordered
columns={tableColumns}
dataSource={hasData ? data : []}
/>
{/* 昨天及之前的面试 */}
<div className="Interview-table-title">
昨天及之前的面试{yesterday}
</div>
<Table
bordered
columns={tableColumns}
dataSource={hasData ? data : []}
/>
{/* 查看面试人信息弹窗 */}
<InterviewerInfoPop
visible={interviewerInfo}
onCreate={onInterviewerInfo}
data={candidateid}
onCancel={() => {
setInterviewerInfo(false);
}}
onEditresume={onEditresume}
/>
{/* 编辑候选人信息弹窗 */}
<Editresume
visible={editresume}
onCreate={onEditresumeCreate}
onCancel={()=>{
setEditresume(false)
}}
/>
</div>
</div>
)
}
export default Interview

View File

@ -0,0 +1,9 @@
import React from 'react'
function Overview() {
return (
<div>总览</div>
)
}
export default Overview

View File

@ -0,0 +1,3 @@
.Endrecruitment {
margin: 16px;
}

View File

@ -0,0 +1,123 @@
import React, { useState } from 'react'
import { Table, } from 'antd'
import './index.css'
const columns = [
{
title: '基本资料',
dataIndex: 'basicdata',
render: (text, record, index) => (
<div className='basicdata-box'>
<p className='basicdata-post'>
{text.post}
<span>({text.id})</span>
</p>
<p className='basicdata-des'> {text.des} </p>
</div>
),
},
{
title: '招聘负责人',
dataIndex: 'principal',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '招聘渠道',
dataIndex: 'channel',
render: (text, record, index) => (
// console.log(text)
text.map((item,key)=>{
return <span key={key} className='font-size12 color1 '>{item}</span>
})
),
},
{
title: '职位来源',
dataIndex: 'source',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '候选人总数',
dataIndex: 'candidatenum',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '入职人数',
dataIndex: 'inductionnum',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '招聘人数',
dataIndex: 'recruitingnumbers',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '候选人满意度',
dataIndex: 'satisfaction',
render: (text, record, index) => (
<div className='satisfaction-box'>
<p className='font-size12 color1'> <span className='font-size14 color3'>{text.satisfaction}</span>/5</p>
<p className='font-size12 color2'>{text.des}条评价</p>
</div>
),
},
]
const data = []
for (let i = 1; i <= 3; i++) {
data.push({
key: i,
basicdata: {
post: '高级游戏测试工程师',
id: 'MJ0000005',
des: '海外其他·技术部',
},
principal: '张三',
channel: ['BOSS'],
source: '手动添加',
candidatenum: '13',
inductionnum: '0',
recruitingnumbers: '3',
satisfaction: { satisfaction: 0, des: 0 },
})
}
const Endrecruitment = () => {
const [hasData, setHasData] = useState(true)
const tableColumns = columns.map((item) => ({ ...item }))
const tableProps = {
showHeader: true,
rowSelection: true,
Size: 'Small',
}
const handleClickRows = (index)=>{
console.log(index);
}
return (
<div className='Endrecruitment'>
<Table
{...tableProps}
columns={tableColumns}
dataSource={hasData ? data : []}
onRow={(record,index)=>{return {
onClick:event=>{handleClickRows(index)}
}}}
/>
</div>
)
}
export default Endrecruitment

View File

@ -0,0 +1,22 @@
.Inrecruitment {
margin: 16px;
}
.basicdata-box .basicdata-post {
font-size: 12px;
font-weight: bold;
color: #292b28;
margin-bottom: 0;
}
.basicdata-box .basicdata-post span{
font-size: 12px;
font-weight: bolder;
color: #75777d;
}
.basicdata-des {
font-size: 12px;
color: #736f6a;
margin-bottom: 0;
}
.satisfaction-box p {
margin-bottom: 0;
}

View File

@ -0,0 +1,115 @@
import React, { useState } from 'react'
import { Table, } from 'antd'
import './index.css'
const columns = [
{
title: '基本资料',
dataIndex: 'basicdata',
render: (text, record, index) => (
<div className='basicdata-box'>
<p className='basicdata-post'>
{text.post}
<span>({text.id})</span>
</p>
<p className='basicdata-des'> {text.des} </p>
</div>
),
},
{
title: '招聘负责人',
dataIndex: 'principal',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '招聘渠道',
dataIndex: 'channel',
render: (text, record, index) => (
// console.log(text)
text.map((item,key)=>{
return <span key={key} className='font-size12 color1 '>{item}</span>
})
),
},
{
title: '职位来源',
dataIndex: 'source',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '候选人总数',
dataIndex: 'candidatenum',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '入职人数',
dataIndex: 'inductionnum',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '招聘人数',
dataIndex: 'recruitingnumbers',
render: (text, record, index) => (
<p className='font-size12 color1'>{text}</p>
),
},
{
title: '候选人满意度',
dataIndex: 'satisfaction',
render: (text, record, index) => (
<div className='satisfaction-box'>
<p className='font-size12 color1'> <span className='font-size14 color3'>{text.satisfaction}</span>/5</p>
<p className='font-size12 color2'>{text.des}条评价</p>
</div>
),
},
]
const data = []
for (let i = 1; i <= 3; i++) {
data.push({
key: i,
basicdata: {
post: '高级游戏测试工程师',
id: 'MJ0000005',
des: '海外其他·技术部',
},
principal: '张三',
channel: ['BOSS'],
source: '手动添加',
candidatenum: '13',
inductionnum: '0',
recruitingnumbers: '3',
satisfaction: { satisfaction: 0, des: 0 },
})
}
const Inrecruitment = () => {
const [hasData, setHasData] = useState(true)
const tableColumns = columns.map((item) => ({ ...item }))
console.log(tableColumns)
const tableProps = {
showHeader: true,
rowSelection: true,
Size: 'Small',
}
return (
<div className='Inrecruitment'>
<Table
{...tableProps}
columns={tableColumns}
dataSource={hasData ? data : []}
/>
</div>
)
}
export default Inrecruitment

View File

@ -0,0 +1,63 @@
.Position-box {
display: flex;
justify-content: space-between;
height: 100%;
}
.Position-left-box {
width: 250px;
height: 100%;
}
.Position-right-box {
width: calc(100% - 250px);
background-color: #fff;
height: 100%;
}
.Position-menu-box {
margin: 16px;
display: flex;
justify-content: space-between;
}
.Position-menu-box div {
width: 100px;
height: 60px;
background-color: #fff;
color: #928f92;
border-radius: 4px;
text-align: center;
padding: 0 15px;
border-bottom: 3px solid #e0e0e0;
cursor: pointer;
}
.Position-left-box div p {
font-size: 20px;
margin-bottom: 0;
text-align: left;
}
.Position-menu-box div a {
color: #928f92;
font-size: 13px;
}
.Position-menu-box .on-menu-box{
color: #001529;
border-bottom: 3px solid #1a5e92;
}
.Position-left-box .on-menu-box p{
color: #001529;
}
.Position-menu-box .on-menu-box a {
color: #001529;
}
.Position-left-box .screen-form-box {
margin: 16px;
}
.Position-left-box .screen-form-box .title {
font-size: 12px;
margin: .5rem 0 .2rem 0;
}
.screen-form-box h4 {
font-weight: bold;
margin-bottom: 0;
}
.screen-form-box .setfilteritem { margin-top: 1.5rem; }

View File

@ -0,0 +1,130 @@
import React, { useState, useEffect } from 'react'
import { Outlet, useNavigate, useLocation } from 'react-router-dom'
import { Input, Space, Select, Button } from 'antd'
import './index.css'
const { Search } = Input
const { Option } = Select
export default function Position() {
const [onmenu, setonmenu] = useState(true)
const navigate = useNavigate()
const location = useLocation()
const handelSwitchNav = (e, path) => {
navigate(path)
setonmenu((onmenu) => !onmenu)
}
const onSearch = (value) => {
console.log(value)
}
useEffect(() => {
if (location.pathname.indexOf('Endrecruitment') >= 0) {
setonmenu((onmenu) => false)
} else {
setonmenu((onmenu) => true)
}
}, [location.pathname])
return (
<div className="Position-box">
<div className="Position-left-box">
<div className="Position-menu-box">
<div
className={onmenu ? 'on-menu-box' : ''}
onClick={(e) => handelSwitchNav(e, '/admin/position')}
>
{/* <Link to="/admin/position"> */}
<p>1</p>
<span>招聘中职位</span>
{/* </Link> */}
</div>
<div
className={onmenu ? '' : 'on-menu-box'}
onClick={(e) =>
handelSwitchNav(e, '/admin/position/Endrecruitment')
}
>
{/* <Link to="/admin/position/Endrecruitment"> */}
<p>2</p>
<span>已关闭职位</span>
{/* </Link> */}
</div>
</div>
<div className="screen-form-box">
<h4>职位信息</h4>
<p className="title">职位名称筛选</p>
<Space direction="vertical">
<Search
placeholder="根据职位名称或职位编码搜索"
onSearch={onSearch}
style={{
width: 219,
}}
/>
</Space>
<p className="title">职位部门筛选</p>
<Select
style={{ width: 219 }}
showSearch
defaultValue="all"
optionFilterProp="children"
filterOption={(input, option) =>
option.children
.toLowerCase()
.includes(input.toLowerCase())
}
>
<Option value="all">全部负责人</Option>
<Option value="jack">Jack</Option>
<Option value="lucy">Lucy</Option>
<Option value="tom">Tom</Option>
</Select>
<p className="title">渠道筛选</p>
<Select
style={{ width: 219 }}
showSearch
defaultValue="all"
optionFilterProp="children"
filterOption={(input, option) =>
option.children
.toLowerCase()
.includes(input.toLowerCase())
}
>
<Option value="all">全部负责人</Option>
<Option value="jack">Jack</Option>
<Option value="lucy">Lucy</Option>
<Option value="tom">Tom</Option>
</Select>
<p className="title">负责人筛选</p>
<Select
style={{ width: 219 }}
showSearch
defaultValue="all"
optionFilterProp="children"
filterOption={(input, option) =>
option.children
.toLowerCase()
.includes(input.toLowerCase())
}
>
<Option value="all">全部负责人</Option>
<Option value="jack">Jack</Option>
<Option value="lucy">Lucy</Option>
<Option value="tom">Tom</Option>
</Select>
<Button className='setfilteritem' block>设置筛选项</Button>
</div>
</div>
<div className="Position-right-box">
<Outlet />
</div>
</div>
)
}

View File

@ -0,0 +1,9 @@
import React from 'react'
function Report_forms() {
return (
<div>报表中心</div>
)
}
export default Report_forms

View File

@ -0,0 +1,9 @@
import React from 'react'
function Set_up() {
return (
<div>设置</div>
)
}
export default Set_up

View File

@ -0,0 +1,9 @@
import React from 'react'
function Talent_pool() {
return (
<div>人才库</div>
)
}
export default Talent_pool

14
src/pages/login.css Normal file
View File

@ -0,0 +1,14 @@
.components-form-demo-normal-login { width: 300px; height: 222px; position: fixed; top: 0; bottom: 0; left: 0; right: 0; margin: auto; }
.components-form-demo-normal-login .login-form {
max-width: 300px;
}
.components-form-demo-normal-login .login-form-forgot {
float: right;
}
.components-form-demo-normal-login .ant-col-rtl .login-form-forgot {
float: left;
}
.components-form-demo-normal-login .login-form-button {
width: 100%;
}

View File

@ -0,0 +1,8 @@
// tokentoken访
import React from 'react'
import Redirect from './Redirect'
export default function AuthComponent({children }) {
const islogin = localStorage.getItem("token");
return islogin ? children : <Redirect to="/login" />
}

View File

@ -0,0 +1,42 @@
import React from 'react'
import {useRoutes, Navigate} from 'react-router-dom'
import AppLayOut from '../AppLayOut'
import AuthComponent from './AuthComponent'
import Login from '../pages/Login'
import Candidate from '../pages/admin/Candidate'
import Interview from '../pages/admin/Interview'
import Overview from '../pages/admin/Overview'
import Position from '../pages/admin/Position'
import ReportForms from '../pages/admin/Report_forms'
import SetUp from '../pages/admin/Set_up'
import TalentPool from '../pages/admin/Talent_pool'
import Endrecruitment from '../pages/admin/Position/Endrecruitment'
import Inrecruitment from '../pages/admin/Position/Inrecruitment'
// import PageNotFound from '../pages/PageNotFound'
function GlobalRouter() {
return useRoutes([
{
path: '/',
element: <AuthComponent> <AppLayOut /> </AuthComponent> ,
children: [
{ path: '/', element: <Overview /> },
{ path: '/admin/candidate',element: <Candidate />,},
{ path: '/admin/interview', element: <Interview /> },
{ path: '/admin/position', element: <Position />, children:[
{ index:true, element: <Inrecruitment /> },
{ path: '/admin/position/Endrecruitment', element: <Endrecruitment /> }
]},
{ path: '/admin/reportforms', element: <ReportForms /> },
{ path: '/admin/setup', element: <SetUp /> },
{ path: '/admin/talentPool', element: <TalentPool /> },
],
},
{ path: '/login', element: <Login /> },
])
}
export default GlobalRouter

12
src/routes/Redirect.jsx Normal file
View File

@ -0,0 +1,12 @@
import {useEffect} from "react";
import { useNavigate } from "react-router-dom";
function Redirect({to}){
const navigate = useNavigate();
useEffect(()=>{
navigate(to,{replace: true})
})
return null;
}
export default Redirect

691
yarn.lock
View File

@ -10,6 +10,40 @@
"@jridgewell/gen-mapping" "^0.1.0"
"@jridgewell/trace-mapping" "^0.3.9"
"@ant-design/colors@^6.0.0":
version "6.0.0"
resolved "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298"
integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==
dependencies:
"@ctrl/tinycolor" "^3.4.0"
"@ant-design/icons-svg@^4.2.1":
version "4.2.1"
resolved "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a"
integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==
"@ant-design/icons@^4.7.0":
version "4.7.0"
resolved "https://registry.npmmirror.com/@ant-design/icons/-/icons-4.7.0.tgz#8c3cbe0a556ba92af5dc7d1e70c0b25b5179af0f"
integrity sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==
dependencies:
"@ant-design/colors" "^6.0.0"
"@ant-design/icons-svg" "^4.2.1"
"@babel/runtime" "^7.11.2"
classnames "^2.2.6"
rc-util "^5.9.4"
"@ant-design/react-slick@~0.28.1":
version "0.28.4"
resolved "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-0.28.4.tgz#8b296b87ad7c7ae877f2a527b81b7eebd9dd29a9"
integrity sha512-j9eAHTn7GxbXUFNknJoHS2ceAsqrQi2j8XykjZE1IXCD8kJF+t28EvhBLniDpbOsBk/3kjalnhriTfZcjBHNqg==
dependencies:
"@babel/runtime" "^7.10.4"
classnames "^2.2.5"
json2mq "^0.2.0"
lodash "^4.17.21"
resize-observer-polyfill "^1.5.0"
"@apideck/better-ajv-errors@^0.3.1":
version "0.3.4"
resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.4.tgz#f89924dd4efd04a51835db7eb549a7177e0ca727"
@ -164,7 +198,7 @@
dependencies:
"@babel/types" "^7.17.0"
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
@ -1026,7 +1060,7 @@
core-js-pure "^3.20.2"
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.18.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4"
integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==
@ -1161,6 +1195,11 @@
resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz#91c560df2ed8d9700e4c7ed4ac21a3a322c9d975"
integrity sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw==
"@ctrl/tinycolor@^3.4.0":
version "3.4.1"
resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32"
integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==
"@eslint/eslintrc@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
@ -2422,6 +2461,56 @@ ansi-styles@^5.0.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
antd@^4.20.7:
version "4.20.7"
resolved "https://registry.npmmirror.com/antd/-/antd-4.20.7.tgz#7f4e2f5f3620044323355386091967045cfe2c24"
integrity sha512-X2lP1AiN9K9se9ZuQvgpeku7Z1G7KqKTuJVt0lpwWzei4aRReG+hJWMSOAsy0HonRWI2nDc9XMIK+o/kul8EXQ==
dependencies:
"@ant-design/colors" "^6.0.0"
"@ant-design/icons" "^4.7.0"
"@ant-design/react-slick" "~0.28.1"
"@babel/runtime" "^7.12.5"
"@ctrl/tinycolor" "^3.4.0"
classnames "^2.2.6"
copy-to-clipboard "^3.2.0"
lodash "^4.17.21"
memoize-one "^6.0.0"
moment "^2.29.2"
rc-cascader "~3.5.0"
rc-checkbox "~2.3.0"
rc-collapse "~3.1.0"
rc-dialog "~8.8.1"
rc-drawer "~4.4.2"
rc-dropdown "~3.5.0"
rc-field-form "~1.26.1"
rc-image "~5.6.0"
rc-input "~0.0.1-alpha.5"
rc-input-number "~7.3.0"
rc-mentions "~1.7.0"
rc-menu "~9.5.5"
rc-motion "^2.5.1"
rc-notification "~4.6.0"
rc-pagination "~3.1.9"
rc-picker "~2.6.4"
rc-progress "~3.2.1"
rc-rate "~2.9.0"
rc-resize-observer "^1.2.0"
rc-segmented "~2.1.0 "
rc-select "~14.1.1"
rc-slider "~10.0.0"
rc-steps "~4.1.0"
rc-switch "~3.2.0"
rc-table "~7.24.0"
rc-tabs "~11.13.0"
rc-textarea "~0.3.0"
rc-tooltip "~5.1.1"
rc-tree "~5.5.0"
rc-tree-select "~5.3.0"
rc-trigger "^5.2.10"
rc-upload "~4.3.0"
rc-util "^5.20.0"
scroll-into-view-if-needed "^2.2.25"
anymatch@^3.0.3, anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
@ -2481,6 +2570,11 @@ array-includes@^3.1.4, array-includes@^3.1.5:
get-intrinsic "^1.1.1"
is-string "^1.0.7"
array-tree-filter@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190"
integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
@ -2527,6 +2621,11 @@ ast-types-flow@^0.0.7:
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==
async-validator@^4.1.0:
version "4.1.1"
resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.1.1.tgz#3cd1437faa2de64743f7d56649dd904c946a18fe"
integrity sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==
async@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
@ -2600,6 +2699,13 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies:
object.assign "^4.1.0"
babel-plugin-import@^1.13.5:
version "1.13.5"
resolved "https://registry.npmmirror.com/babel-plugin-import/-/babel-plugin-import-1.13.5.tgz#42eed1c5afd9a35ee1b1f8fe922b07c44077d753"
integrity sha512-IkqnoV+ov1hdJVofly9pXRJmeDm9EtROfrc5i6eII0Hix2xMs5FEm8FG3ExMvazbnZBbgHIt6qdO8And6lCloQ==
dependencies:
"@babel/helper-module-imports" "^7.0.0"
babel-plugin-istanbul@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
@ -2976,6 +3082,11 @@ cjs-module-lexer@^1.0.0:
resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1:
version "2.3.1"
resolved "https://registry.npmmirror.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
clean-css@^5.2.2:
version "5.3.0"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59"
@ -3102,6 +3213,11 @@ compression@^1.7.4:
safe-buffer "5.1.2"
vary "~1.1.2"
compute-scroll-into-view@^1.0.17:
version "1.0.17"
resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@ -3146,6 +3262,20 @@ cookie@0.5.0:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
copy-anything@^2.0.1:
version "2.0.6"
resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
dependencies:
is-what "^3.14.1"
copy-to-clipboard@^3.2.0:
version "3.3.1"
resolved "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae"
integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==
dependencies:
toggle-selection "^1.0.6"
core-js-compat@^3.21.0, core-js-compat@^3.22.1:
version "3.22.7"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.7.tgz#8359eb66ecbf726dd0cfced8e48d5e73f3224239"
@ -3409,6 +3539,13 @@ csstype@^3.0.2:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2"
integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==
customize-cra@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/customize-cra/-/customize-cra-1.0.0.tgz#73286563631aa08127ad4d30a2e3c89cf4e93c8d"
integrity sha512-DbtaLuy59224U+xCiukkxSq8clq++MOtJ1Et7LED1fLszWe88EoblEYFBJ895sB1mC6B4uu3xPT/IjClELhMbA==
dependencies:
lodash.flow "^3.5.0"
damerau-levenshtein@^1.0.7:
version "1.0.8"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
@ -3423,6 +3560,16 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
date-fns@2.x:
version "2.28.0"
resolved "https://registry.npmmirror.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2"
integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==
dayjs@1.x:
version "1.11.2"
resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.2.tgz#fa0f5223ef0d6724b3d8327134890cfe3d72fbe5"
integrity sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==
debug@2.6.9, debug@^2.6.0, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -3437,7 +3584,7 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
dependencies:
ms "2.1.2"
debug@^3.2.7:
debug@^3.2.6, debug@^3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@ -3594,6 +3741,11 @@ dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9:
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56"
integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==
dom-align@^1.7.0:
version "1.12.3"
resolved "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.3.tgz#a36d02531dae0eefa2abb0c4db6595250526f103"
integrity sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==
dom-converter@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
@ -3742,6 +3894,13 @@ entities@^2.0.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
errno@^0.1.1:
version "0.1.8"
resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
dependencies:
prr "~1.0.1"
error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
@ -4617,6 +4776,13 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
history@^5.2.0:
version "5.3.0"
resolved "https://registry.npmmirror.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b"
integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==
dependencies:
"@babel/runtime" "^7.7.6"
hoopy@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
@ -4756,7 +4922,7 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
iconv-lite@0.4.24:
iconv-lite@0.4.24, iconv-lite@^0.4.4:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -4792,6 +4958,11 @@ ignore@^5.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
image-size@~0.5.0:
version "0.5.5"
resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
immer@^9.0.7:
version "9.0.14"
resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.14.tgz#e05b83b63999d26382bb71676c9d827831248a48"
@ -5031,6 +5202,11 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
is-what@^3.14.1:
version "3.14.1"
resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
@ -5661,6 +5837,13 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
json2mq@^0.2.0:
version "0.2.0"
resolved "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a"
integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==
dependencies:
string-convert "^0.2.0"
json5@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
@ -5722,6 +5905,30 @@ language-tags@^1.0.5:
dependencies:
language-subtag-registry "~0.3.2"
less-loader@^11.0.0:
version "11.0.0"
resolved "https://registry.npmmirror.com/less-loader/-/less-loader-11.0.0.tgz#a31b2bc5cdfb62f1c7de9b2d01cd944c22b1a024"
integrity sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==
dependencies:
klona "^2.0.4"
less@^4.1.2:
version "4.1.2"
resolved "https://registry.npmmirror.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0"
integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==
dependencies:
copy-anything "^2.0.1"
parse-node-version "^1.0.1"
tslib "^2.3.0"
optionalDependencies:
errno "^0.1.1"
graceful-fs "^4.1.2"
image-size "~0.5.0"
make-dir "^2.1.0"
mime "^1.4.1"
needle "^2.5.2"
source-map "~0.6.0"
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
@ -5807,6 +6014,11 @@ lodash.debounce@^4.0.8:
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
lodash.flow@^3.5.0:
version "3.5.0"
resolved "https://registry.npmmirror.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a"
integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==
lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
@ -5865,6 +6077,14 @@ magic-string@^0.25.0, magic-string@^0.25.7:
dependencies:
sourcemap-codec "^1.4.8"
make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
dependencies:
pify "^4.0.1"
semver "^5.6.0"
make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
@ -5901,6 +6121,11 @@ memfs@^3.1.2, memfs@^3.4.3:
dependencies:
fs-monkey "1.0.3"
memoize-one@^6.0.0:
version "6.0.0"
resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@ -5941,7 +6166,7 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17,
dependencies:
mime-db "1.52.0"
mime@1.6.0:
mime@1.6.0, mime@^1.4.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@ -6001,6 +6226,11 @@ mkdirp@~0.5.1:
dependencies:
minimist "^1.2.6"
moment@^2.24.0, moment@^2.29.2:
version "2.29.3"
resolved "https://registry.npmmirror.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3"
integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@ -6034,6 +6264,15 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
needle@^2.5.2:
version "2.9.1"
resolved "https://registry.npmmirror.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684"
integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==
dependencies:
debug "^3.2.6"
iconv-lite "^0.4.4"
sax "^1.2.4"
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
@ -6339,6 +6578,11 @@ parse-json@^5.0.0, parse-json@^5.2.0:
json-parse-even-better-errors "^2.3.0"
lines-and-columns "^1.1.6"
parse-node-version@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
parse5@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
@ -6412,6 +6656,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pify@^4.0.1:
version "4.0.1"
resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
pirates@^4.0.4:
version "4.0.5"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
@ -7046,6 +7295,11 @@ proxy-addr@~2.0.7:
forwarded "0.2.0"
ipaddr.js "1.9.1"
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
psl@^1.1.33:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@ -7107,6 +7361,373 @@ raw-body@2.5.1:
iconv-lite "0.4.24"
unpipe "1.0.0"
rc-align@^4.0.0:
version "4.0.12"
resolved "https://registry.npmmirror.com/rc-align/-/rc-align-4.0.12.tgz#065b5c68a1cc92a00800c9239320d9fdf5f16207"
integrity sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "2.x"
dom-align "^1.7.0"
lodash "^4.17.21"
rc-util "^5.3.0"
resize-observer-polyfill "^1.5.1"
rc-cascader@~3.5.0:
version "3.5.0"
resolved "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.5.0.tgz#a49b632bc2d0c8ef31b212c8ddd0bea346e64877"
integrity sha512-rpXnWCfvk7Frh2dBzMoA0c7i0nn6aJU7L2NZo8R8pNkrT0sKgytQSpdtPWP+Pq8IkvwbEd8BU8Z8OnOljcqgZg==
dependencies:
"@babel/runtime" "^7.12.5"
array-tree-filter "^2.1.0"
classnames "^2.3.1"
rc-select "~14.1.0"
rc-tree "~5.5.0"
rc-util "^5.6.1"
rc-checkbox@~2.3.0:
version "2.3.2"
resolved "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-2.3.2.tgz#f91b3678c7edb2baa8121c9483c664fa6f0aefc1"
integrity sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.1"
rc-collapse@~3.1.0:
version "3.1.4"
resolved "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.1.4.tgz#063e33fcc427a378e63da757898cd1fba6269679"
integrity sha512-WayrhswKMwuJab9xbqFxXTgV0m6X8uOPEO6zm/GJ5YJiJ/wIh/Dd2VtWeI06HYUEnTFv0HNcYv+zWbB+p6OD2A==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "2.x"
rc-motion "^2.3.4"
rc-util "^5.2.1"
shallowequal "^1.1.0"
rc-dialog@~8.8.0, rc-dialog@~8.8.1:
version "8.8.1"
resolved "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-8.8.1.tgz#cd8897fbee1de0eab6d237a6abe1e4db8d09dd72"
integrity sha512-7M1WKZCjfIABKEaJVskdYvb80z+RX7I11PeSjPVfLOOaJAmIepvDEd0alBtOZvOL3fZFWlMs4JVZtp9LZgONxA==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.6"
rc-motion "^2.3.0"
rc-util "^5.21.0"
rc-drawer@~4.4.2:
version "4.4.3"
resolved "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-4.4.3.tgz#2094937a844e55dc9644236a2d9fba79c344e321"
integrity sha512-FYztwRs3uXnFOIf1hLvFxIQP9MiZJA+0w+Os8dfDh/90X7z/HqP/Yg+noLCIeHEbKln1Tqelv8ymCAN24zPcfQ==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.6"
rc-util "^5.7.0"
rc-dropdown@~3.5.0:
version "3.5.2"
resolved "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-3.5.2.tgz#2f1f4eeb36c07fb67cd599c0cb8e861da3de5527"
integrity sha512-Ty4LsXjkspZuFJSRx3blCLLCDicXM5qds6F1odgEa+jcjC+OJKHQGnvE4FqtoljPaqWm4wG78pbgXH6Ddh2DkA==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.6"
rc-trigger "^5.0.4"
rc-util "^5.17.0"
rc-field-form@~1.26.1:
version "1.26.6"
resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.26.6.tgz#00c526831db287421ae761a6fae079b68e9f3229"
integrity sha512-N7nx/9Zk3innxZWTa4GPUV3j78OCgXacl2Lgi6agmP7ziz6BHoZYZ1djOt5UW50kK7UoVMAPtue5I1XgQO24MA==
dependencies:
"@babel/runtime" "^7.18.0"
async-validator "^4.1.0"
rc-util "^5.8.0"
rc-image@~5.6.0:
version "5.6.2"
resolved "https://registry.npmmirror.com/rc-image/-/rc-image-5.6.2.tgz#31892b0b22aa5122fd9b1a067e9a4ba627004214"
integrity sha512-qhKOVvivCZkd6CrzS/4ST2+Auu16mtPSFVqVzwE7sELWfuvzcLGTzGv8UsVvm6qRNIz6SeaueUetqi4Ii16XQA==
dependencies:
"@babel/runtime" "^7.11.2"
classnames "^2.2.6"
rc-dialog "~8.8.0"
rc-util "^5.0.6"
rc-input-number@~7.3.0:
version "7.3.4"
resolved "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-7.3.4.tgz#674aea98260250287d36e330a7e065b174486e9d"
integrity sha512-W9uqSzuvJUnz8H8vsVY4kx+yK51SsAxNTwr8SNH4G3XqQNocLVmKIibKFRjocnYX1RDHMND9FFbgj2h7E7nvGA==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.5"
rc-util "^5.9.8"
rc-input@~0.0.1-alpha.5:
version "0.0.1-alpha.7"
resolved "https://registry.npmmirror.com/rc-input/-/rc-input-0.0.1-alpha.7.tgz#53e3f13871275c21d92b51f80b698f389ad45dd3"
integrity sha512-eozaqpCYWSY5LBMwlHgC01GArkVEP+XlJ84OMvdkwUnJBSv83Yxa15pZpn7vACAj84uDC4xOA2CoFdbLuqB08Q==
dependencies:
"@babel/runtime" "^7.11.1"
classnames "^2.2.1"
rc-util "^5.18.1"
rc-mentions@~1.7.0:
version "1.7.1"
resolved "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-1.7.1.tgz#480ad04af4460ee01b6ccd9137fcea23067aa9be"
integrity sha512-JbCS9bTqt6BYN2vfTPythlScLuc42rIlX85n7975RnkfawXlJjskHOlR3o8EpD4asl4KuA2jKTy0dj39DtSVqg==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.6"
rc-menu "~9.5.1"
rc-textarea "^0.3.0"
rc-trigger "^5.0.4"
rc-util "^5.0.1"
rc-menu@~9.5.1, rc-menu@~9.5.5:
version "9.5.5"
resolved "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.5.5.tgz#aa2f151d4191ed089dc1a8141fe365c9b77d61a9"
integrity sha512-wj2y2BAKwSMyWXO3RBf9sNN5V+DFWxFl45Ma6qQEHA5nwwh7p07bNgc6AAJc+L1+LAz+rWz3AU8PYyT17hMHCw==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "2.x"
rc-motion "^2.4.3"
rc-overflow "^1.2.0"
rc-trigger "^5.1.2"
rc-util "^5.12.0"
shallowequal "^1.1.0"
rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.5.1:
version "2.6.0"
resolved "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.6.0.tgz#c60c3e7f15257f55a8cd7794a539f0e2cc751399"
integrity sha512-1MDWA9+i174CZ0SIDenSYm2Wb9YbRkrexjZWR0CUFu7D6f23E8Y0KsTgk9NGOLJsGak5ELZK/Y5lOlf5wQdzbw==
dependencies:
"@babel/runtime" "^7.11.1"
classnames "^2.2.1"
rc-util "^5.21.0"
rc-notification@~4.6.0:
version "4.6.0"
resolved "https://registry.npmmirror.com/rc-notification/-/rc-notification-4.6.0.tgz#4e76fc2d0568f03cc93ac18c9e20763ebe29fa46"
integrity sha512-xF3MKgIoynzjQAO4lqsoraiFo3UXNYlBfpHs0VWvwF+4pimen9/H1DYLN2mfRWhHovW6gRpla73m2nmyIqAMZQ==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "2.x"
rc-motion "^2.2.0"
rc-util "^5.20.1"
rc-overflow@^1.0.0, rc-overflow@^1.2.0:
version "1.2.6"
resolved "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.2.6.tgz#e99fabea04ce4fb13f0dd8835aef4e4cdd4c15a2"
integrity sha512-YqbocgzuQxfq2wZy72vdAgrgzzEuM/5d4gF9TBEodCpXPbUeXGrUXNm1J6G1MSkCU2N0ePIgCEu5qD/0Ldi63Q==
dependencies:
"@babel/runtime" "^7.11.1"
classnames "^2.2.1"
rc-resize-observer "^1.0.0"
rc-util "^5.19.2"
rc-pagination@~3.1.9:
version "3.1.16"
resolved "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-3.1.16.tgz#b0082108cf027eded18ed61d818d31897c343e81"
integrity sha512-GFcHXJ7XxeJDf9B+ndP4PRDt46maSSgYhiwofBMiIGKIlBhJ0wfu8DMCEvaWJJLpI2u4Gb6zF1dHpiqPFrosPg==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.1"
rc-picker@~2.6.4:
version "2.6.9"
resolved "https://registry.npmmirror.com/rc-picker/-/rc-picker-2.6.9.tgz#2f2f82c5340adbe3b30875a25e015c120eb88c9c"
integrity sha512-yH3UYXCADf7REtOAB5cwe1cyFKtB0p204RCN8JdZGG4uuSOZ1IPTkk/GJS6HOpxspZeJCLGzzajuQMDwck9dsw==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.1"
date-fns "2.x"
dayjs "1.x"
moment "^2.24.0"
rc-trigger "^5.0.4"
rc-util "^5.4.0"
shallowequal "^1.1.0"
rc-progress@~3.2.1:
version "3.2.4"
resolved "https://registry.npmmirror.com/rc-progress/-/rc-progress-3.2.4.tgz#4036acdae2566438545bc4df2203248babaf7549"
integrity sha512-M9WWutRaoVkPUPIrTpRIDpX0SPSrVHzxHdCRCbeoBFrd9UFWTYNWRlHsruJM5FH1AZI+BwB4wOJUNNylg/uFSw==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.6"
rc-util "^5.16.1"
rc-rate@~2.9.0:
version "2.9.2"
resolved "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.9.2.tgz#4a58965d1ecf91896ebae01d458b59056df0b4ea"
integrity sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.5"
rc-util "^5.0.1"
rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.2.0.tgz#9f46052f81cdf03498be35144cb7c53fd282c4c7"
integrity sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.1"
rc-util "^5.15.0"
resize-observer-polyfill "^1.5.1"
"rc-segmented@~2.1.0 ":
version "2.1.0"
resolved "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.1.0.tgz#0e0afe646c1a0e44a0e18785f518c42633ec8efc"
integrity sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw==
dependencies:
"@babel/runtime" "^7.11.1"
classnames "^2.2.1"
rc-motion "^2.4.4"
rc-util "^5.17.0"
rc-select@~14.1.0, rc-select@~14.1.1:
version "14.1.4"
resolved "https://registry.npmmirror.com/rc-select/-/rc-select-14.1.4.tgz#486b632dfcaee36a3f0ba6a214e2d546f9d3666b"
integrity sha512-vU2DlROjv33nbYxcPrT/3yk1m53qsxVXhLv1u9lD7H2G5XkUR1p75KMiHU/5l/1VSw9I2IfMsFJoHkpUGNAkdQ==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "2.x"
rc-motion "^2.0.1"
rc-overflow "^1.0.0"
rc-trigger "^5.0.4"
rc-util "^5.16.1"
rc-virtual-list "^3.2.0"
rc-slider@~10.0.0:
version "10.0.0"
resolved "https://registry.npmmirror.com/rc-slider/-/rc-slider-10.0.0.tgz#8ffe1dd3c8799c9d1f81ac808976f18af3dca206"
integrity sha512-Bk54UIKWW4wyhHcL8ehAxt+wX+n69dscnHTX6Uv0FMxSke/TGrlkZz1LSIWblCpfE2zr/dwR2Ca8nZGk3U+Tbg==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.5"
rc-tooltip "^5.0.1"
rc-util "^5.18.1"
shallowequal "^1.1.0"
rc-steps@~4.1.0:
version "4.1.4"
resolved "https://registry.npmmirror.com/rc-steps/-/rc-steps-4.1.4.tgz#0ba82db202d59ca52d0693dc9880dd145b19dc23"
integrity sha512-qoCqKZWSpkh/b03ASGx1WhpKnuZcRWmvuW+ZUu4mvMdfvFzVxblTwUM+9aBd0mlEUFmt6GW8FXhMpHkK3Uzp3w==
dependencies:
"@babel/runtime" "^7.10.2"
classnames "^2.2.3"
rc-util "^5.0.1"
rc-switch@~3.2.0:
version "3.2.2"
resolved "https://registry.npmmirror.com/rc-switch/-/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8"
integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.1"
rc-util "^5.0.1"
rc-table@~7.24.0:
version "7.24.2"
resolved "https://registry.npmmirror.com/rc-table/-/rc-table-7.24.2.tgz#fbccf5ef4b84cdb38c8a0b416365de157483bf51"
integrity sha512-yefqhtc4V3BeWG2bnDhWYxWX1MOckvW2KU1J55pntZmIGrov5Hx8tQn2gcs6OM0fJ6NgEwUvVEknsCsWI24zUg==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.5"
rc-resize-observer "^1.1.0"
rc-util "^5.14.0"
shallowequal "^1.1.0"
rc-tabs@~11.13.0:
version "11.13.0"
resolved "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-11.13.0.tgz#083eed578f8ad02dc0d462d73da487fe32e3a573"
integrity sha512-aUw1Pq0B1a2zGX4o/m3yrQycZcCLgDp6gKwn8IAU07q148RRONsVGxi0oLVVe5SE51kOB+j0bk1RX43ZBdZNgA==
dependencies:
"@babel/runtime" "^7.11.2"
classnames "2.x"
rc-dropdown "~3.5.0"
rc-menu "~9.5.1"
rc-resize-observer "^1.0.0"
rc-util "^5.5.0"
rc-textarea@^0.3.0, rc-textarea@~0.3.0:
version "0.3.7"
resolved "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-0.3.7.tgz#987142891efdedb774883c07e2f51b318fde5a11"
integrity sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "^2.2.1"
rc-resize-observer "^1.0.0"
rc-util "^5.7.0"
shallowequal "^1.1.0"
rc-tooltip@^5.0.1, rc-tooltip@~5.1.1:
version "5.1.1"
resolved "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154"
integrity sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA==
dependencies:
"@babel/runtime" "^7.11.2"
rc-trigger "^5.0.0"
rc-tree-select@~5.3.0:
version "5.3.0"
resolved "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.3.0.tgz#6edd19d1066ad2bfa212f043c3ff701b93828026"
integrity sha512-UN6CUBulmch+CsihnJ73+DtWijEB1hVTC8sdVxq6E0teVAkHQZUvDj+cwZShtShAKvWwXy73PZ1hIHEUrmVcKw==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "2.x"
rc-select "~14.1.0"
rc-tree "~5.5.0"
rc-util "^5.16.1"
rc-tree@~5.5.0:
version "5.5.0"
resolved "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.5.0.tgz#ba7c8aea2ad29f40a9c7168e490300f7a50c0f22"
integrity sha512-vpKeFsDyj7weik8UPseCTaSNAPt939qn1dQd8goSbRDajbjJEja0v/WFXyRhOiF1HLemNTfqMz4MYc9qlqyNXg==
dependencies:
"@babel/runtime" "^7.10.1"
classnames "2.x"
rc-motion "^2.0.1"
rc-util "^5.16.1"
rc-virtual-list "^3.4.2"
rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10:
version "5.3.1"
resolved "https://registry.npmmirror.com/rc-trigger/-/rc-trigger-5.3.1.tgz#acafadf3eaf384e7f466c303bfa0f34c8137d7b8"
integrity sha512-5gaFbDkYSefZ14j2AdzucXzlWgU2ri5uEjkHvsf1ynRhdJbKxNOnw4PBZ9+FVULNGFiDzzlVF8RJnR9P/xrnKQ==
dependencies:
"@babel/runtime" "^7.18.3"
classnames "^2.2.6"
rc-align "^4.0.0"
rc-motion "^2.0.0"
rc-util "^5.19.2"
rc-upload@~4.3.0:
version "4.3.4"
resolved "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.3.4.tgz#83ff7d3867631c37adbfd72ea3d1fd7e97ca84af"
integrity sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==
dependencies:
"@babel/runtime" "^7.18.3"
classnames "^2.2.5"
rc-util "^5.2.0"
rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.12.0, rc-util@^5.14.0, rc-util@^5.15.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.20.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8:
version "5.21.5"
resolved "https://registry.npmmirror.com/rc-util/-/rc-util-5.21.5.tgz#6e2a5699f820ba915f43f11a4b7dfb0b0672d0fa"
integrity sha512-ip7HqX37Cy/RDl9MlrFp+FbcKnsWZ22sF5MS5eSpYLtg5MpC0TMqGb5ukBatoOhgjnLL+eJGR6e7YAJ/dhK09A==
dependencies:
"@babel/runtime" "^7.18.3"
react-is "^16.12.0"
shallowequal "^1.1.0"
rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.2:
version "3.4.8"
resolved "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.4.8.tgz#c24c10c6940546b7e2a5e9809402c6716adfd26c"
integrity sha512-qSN+Rv4i/E7RCTvTMr1uZo7f3crJJg/5DekoCagydo9zsXrxj07zsFSxqizqW+ldGA16lwa8So/bIbV9Ofjddg==
dependencies:
classnames "^2.2.6"
rc-resize-observer "^1.0.0"
rc-util "^5.15.0"
react-app-polyfill@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7"
@ -7119,6 +7740,13 @@ react-app-polyfill@^3.0.0:
regenerator-runtime "^0.13.9"
whatwg-fetch "^3.6.2"
react-app-rewired@^2.2.1:
version "2.2.1"
resolved "https://registry.npmmirror.com/react-app-rewired/-/react-app-rewired-2.2.1.tgz#84901ee1e3f26add0377ebec0b41bcdfce9fc211"
integrity sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==
dependencies:
semver "^5.6.0"
react-dev-utils@^12.0.1:
version "12.0.1"
resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73"
@ -7162,7 +7790,7 @@ react-error-overlay@^6.0.11:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
react-is@^16.13.1:
react-is@^16.12.0, react-is@^16.13.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@ -7182,6 +7810,21 @@ react-refresh@^0.11.0:
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046"
integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==
react-router-dom@^6.3.0:
version "6.3.0"
resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d"
integrity sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==
dependencies:
history "^5.2.0"
react-router "6.3.0"
react-router@6.3.0:
version "6.3.0"
resolved "https://registry.npmmirror.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557"
integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==
dependencies:
history "^5.2.0"
react-scripts@5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003"
@ -7386,6 +8029,11 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
resize-observer-polyfill@^1.5.0, 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"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
resolve-cwd@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
@ -7505,7 +8153,7 @@ sass-loader@^12.3.0:
klona "^2.0.4"
neo-async "^2.6.2"
sax@~1.2.4:
sax@^1.2.4, sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@ -7561,6 +8209,13 @@ schema-utils@^4.0.0:
ajv-formats "^2.1.1"
ajv-keywords "^5.0.0"
scroll-into-view-if-needed@^2.2.25:
version "2.2.29"
resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz#551791a84b7e2287706511f8c68161e4990ab885"
integrity sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==
dependencies:
compute-scroll-into-view "^1.0.17"
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@ -7578,6 +8233,11 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
semver@^5.6.0:
version "5.7.1"
resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@ -7656,6 +8316,11 @@ setprototypeof@1.2.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
shallowequal@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@ -7823,6 +8488,11 @@ statuses@2.0.1:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
string-convert@^0.2.0:
version "0.2.1"
resolved "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97"
integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==
string-length@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
@ -8165,6 +8835,11 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
toggle-selection@^1.0.6:
version "1.0.6"
resolved "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
toidentifier@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
@ -8213,7 +8888,7 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.0.3:
tslib@^2.0.3, tslib@^2.3.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==