Commit e723d3fe by maolipeng

Merge branch 'feature/zhujian/0726/qwLiving' into dev

# Conflicts:
#	src/common/js/wechatApi.js
#	src/index.html
#	src/modules/course-manage/components/LiveCourseList.jsx
#	src/modules/root/App.tsx
#	src/modules/root/CollegeManagePage.jsx
#	src/modules/root/Header.jsx
#	src/routes/config/mainRoutes.tsx
parents e7c8b2b9 a300cd4d
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
module.exports = { module.exports = {
isWeiXin() { isWeiXin() {
const ua = navigator.userAgent.toLowerCase(); const ua = navigator.userAgent.toLowerCase();
return ua.indexOf('micromessenger') > 0; return (ua.indexOf('micromessenger') > 0) && !(/wxwork/i.test(navigator.userAgent));
}, },
isWorkWx (){ isWorkWx (){
return /wxwork/i.test(navigator.userAgent) return /wxwork/i.test(navigator.userAgent)
......
...@@ -36,24 +36,27 @@ export default class WechatApi { ...@@ -36,24 +36,27 @@ export default class WechatApi {
url: params.url, url: params.url,
}).then((result2) => { }).then((result2) => {
const res2 = result2.result; const res2 = result2.result;
this.agentConfig({ setTimeout(() => {
corpid: res2.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致 this.agentConfig({
agentid: res2.agentid, // 必填,企业微信的应用id (e.g. 1000247) corpid: res2.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
timestamp: res2.timestamp, // 必填,生成签名的时间戳 agentid: res2.agentid, // 必填,企业微信的应用id (e.g. 1000247)
nonceStr: res2.nonceStr, // 必填,生成签名的随机串 timestamp: res2.timestamp, // 必填,生成签名的时间戳
signature: res2.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法 nonceStr: res2.nonceStr, // 必填,生成签名的随机串
jsApiList: ['selectExternalContact', 'getCurExternalContact', 'getContext', 'shareToExternalContact', 'sendChatMessage', 'shareToExternalChat', 'startLiving', 'replayLiving'], signature: res2.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
success: (res) => { jsApiList: ['selectExternalContact', 'getCurExternalContact', 'getContext', 'shareToExternalContact', 'sendChatMessage', 'shareToExternalChat', 'startLiving', 'replayLiving'],
console.log(res, 'res-agentconfig'); success: (res) => {
console.info('window.WWOpenData', window.WWOpenData); console.log(res, 'res-agentconfig');
resolve(res); console.info('window.WWOpenData', window.WWOpenData);
}, resolve(res);
fail: (err) => { },
console.log(1213545344545) fail: (err) => {
console.log(err, 'err-agentconfig'); console.log(1213545344545)
reject(err); console.log(err, 'err-agentconfig');
}, reject(err);
}); },
});
}, 500)
}); });
}) })
...@@ -150,13 +153,13 @@ export default class WechatApi { ...@@ -150,13 +153,13 @@ export default class WechatApi {
wx.ready(() => { wx.ready(() => {
wx.invoke('startLiving', { wx.invoke('startLiving', {
"livingId": id, "livingId": id,
}, function(res) { }, function (res) {
if (res.err_msg === "startLiving:ok") { if (res.err_msg === "startLiving:ok") {
resolve(true) resolve(true)
} else { } else {
reject(res.err_msg); //错误处理 reject(res.err_msg); //错误处理
} }
}); });
}); });
}) })
} }
...@@ -190,7 +193,7 @@ export default class WechatApi { ...@@ -190,7 +193,7 @@ export default class WechatApi {
} }
reject(err); //错误处理 reject(err); //错误处理
} }
}); });
}); });
}) })
} }
......
...@@ -41,7 +41,7 @@ module.exports = { ...@@ -41,7 +41,7 @@ module.exports = {
}, },
isMac() { isMac() {
const ua = navigator.platform.toLowerCase(); const ua = navigator.platform.toLowerCase();
return ua.indexOf("mac") > 0 return ua.indexOf("mac") >= 0
} }
}; };
\ No newline at end of file
import Platform from './platform';
import Service from "@/common/js/service";
import User from '@/common/js/user';
export default class WechatApi {
static initShareConfig() {
// if (Platform.isWeiXin()) {
const data = { url: window.location.href.split('#')[0], storeId: User.getStoreId(), }
Service.Hades('anon/hades/getWxWorkJSAPISignature', data).then((result) => {
const res = result.result;
const conf ={
corpid: res.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
agentid: res.agentid, // 必填,企业微信的应用id (e.g. 1000247)
timestamp: res.timestamp, // 必填,生成签名的时间戳
nonceStr: res.nonceStr,// 必填,生成签名的随机串
signature: res.signature,
jsApiList: ['startLiving','downloadLivingReplay'],
success: function(res) {
console.log('agentConfig注册成功')
console.log(res,'agentConfig')
},
fail: function(res) {
console.log(res,' agentConfig1 错误')
if(res.errMsg.indexOf('function not exist') > -1){
alert('版本过低请升级')
}
},
complete:(res)=>{
console.log(res,' agentConfig2 错误')
}
}
console.log(conf)
wx.agentConfig(conf);
});
// }
}
}
\ No newline at end of file
/* /*
* @Author: 陈剑宇 * @Author: 陈剑宇
* @Date: 2020-05-07 14:43:01 * @Date: 2020-05-07 14:43:01
* @LastEditTime: 2021-06-22 16:49:06 * @LastEditTime: 2021-08-11 22:52:04
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: * @Description:
* @FilePath: /wheat-web-demo/src/domains/basic-domain/constants.ts * @FilePath: /wheat-web-demo/src/domains/basic-domain/constants.ts
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-08-20 09:21:40 * @Date: 2020-08-20 09:21:40
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-11 15:17:56 * @LastEditTime: 2021-08-11 22:50:48
* @Description: * @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有 * @Copyright: 杭州杰竞科技有限公司 版权所有
*/ */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-08-24 12:20:57 * @Date: 2020-08-24 12:20:57
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-10 19:26:36 * @LastEditTime: 2021-08-11 20:25:11
* @Description: * @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有 * @Copyright: 杭州杰竞科技有限公司 版权所有
--> -->
......
...@@ -23,4 +23,7 @@ ...@@ -23,4 +23,7 @@
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.edit-disable{
color:#CCC !important;
}
} }
\ No newline at end of file
...@@ -186,9 +186,6 @@ function EmployeeManage() { ...@@ -186,9 +186,6 @@ function EmployeeManage() {
if(record.depNameList.length === 0){ if(record.depNameList.length === 0){
return <span>-</span> return <span>-</span>
} }
// return record.depNameList.map((item,index)=>{
// return <span><WWOpenDataCom type="departmentName" openid={item}/>{index<(record.depNameList.length -1)?';':''}</span>;
// })
return <Tooltip title={<div>{handleDepName(record.depNameList)}</div>} placement='top' arrowPointAtCenter><div className="post-name"> {record.depNameList.map((item:any, index:any) => { return <Tooltip title={<div>{handleDepName(record.depNameList)}</div>} placement='top' arrowPointAtCenter><div className="post-name"> {record.depNameList.map((item:any, index:any) => {
return <span><WWOpenDataCom type="departmentName" openid={item}/>{index<(record.depNameList.length -1)?';':''}</span> return <span><WWOpenDataCom type="departmentName" openid={item}/>{index<(record.depNameList.length -1)?';':''}</span>
})} })}
...@@ -213,11 +210,20 @@ function EmployeeManage() { ...@@ -213,11 +210,20 @@ function EmployeeManage() {
<div className="no-operate">-</div> <div className="no-operate">-</div>
) : ( ) : (
<div className="operation"> <div className="operation">
{!record.depNameList &&
<span className="edit edit-disable">
编辑
</span>
}
{record.depNameList && {record.depNameList &&
(record.depNameList.length > 0 && (record.depNameList.length > 0 ?
<span className="edit" onClick={() => handleEditEmployee(record)}> <span className="edit" onClick={() => handleEditEmployee(record)}>
编辑 编辑
</span> </span>
:
<span className="edit edit-disable">
编辑
</span>
) )
} }
<span className="divider-line">{" | "}</span> <span className="divider-line">{" | "}</span>
...@@ -329,7 +335,7 @@ function EmployeeManage() { ...@@ -329,7 +335,7 @@ function EmployeeManage() {
if(num<3){ if(num<3){
return confirm({ return confirm({
title: "确定更新列表数据吗?", title: "确定更新列表数据吗?",
content: `员工数据来源企微通讯录,一天只能更新3次,今日还能更新${3-num}次。`, content: <span>员工数据来源企微通讯录,一天只能更新3次,今日还能更新<span style={{color:'#2966FF'}}>{3-num}</span>次。</span>,
icon: ( icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span> <span className="icon iconfont default-confirm-icon">&#xe839; </span>
), ),
...@@ -343,7 +349,7 @@ function EmployeeManage() { ...@@ -343,7 +349,7 @@ function EmployeeManage() {
Modal.warning({ Modal.warning({
title: '提示', title: '提示',
okText: '我知道了', okText: '我知道了',
content: '员工数据今日更新次数已达上限(3次),无法继续更新。', content: <span>员工数据今日更新次数已达上限<span style={{color:'#2966FF'}}>(3次)</span>,无法继续更新。</span>,
icon: ( icon: (
<span className='icon iconfont default-confirm-icon' style={{ color: '#FFBB54 !important' }}> <span className='icon iconfont default-confirm-icon' style={{ color: '#FFBB54 !important' }}>
&#xe834; &#xe834;
...@@ -470,7 +476,7 @@ function EmployeeManage() { ...@@ -470,7 +476,7 @@ function EmployeeManage() {
<Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button> <Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button>
<span className="origin-text">数据来源企业微信通讯录</span> <span className="origin-text">数据来源企业微信通讯录</span>
<a <a
href="https://www.yuque.com/wangzhong-zkqw0/qixue" href="https://www.yuque.com/docs/share/8c66333f-ed62-469d-909e-b36389a115ea?#"
target="_blank" target="_blank"
> >
<span className="view-text">查看数据更新说明</span> <span className="view-text">查看数据更新说明</span>
......
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-08-04 15:21:36 * @Date: 2021-08-04 15:21:36
* @LastEditTime: 2021-08-04 15:23:37 * @LastEditTime: 2021-08-11 20:25:26
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: /xiaomai-cloud-class-web/src/modules/college-manage/LimitTip.tsx * @FilePath: /xiaomai-cloud-class-web/src/modules/college-manage/LimitTip.tsx
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: wufan * @Author: wufan
* @Date: 2020-11-30 10:47:38 * @Date: 2020-11-30 10:47:38
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-03 16:04:30 * @LastEditTime: 2021-08-11 20:31:26
* @Description: 学员管理页面 * @Description: 学员管理页面
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有 * @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/ */
...@@ -11,9 +11,7 @@ import React, { useEffect, useState } from "react"; ...@@ -11,9 +11,7 @@ import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import _ from "underscore"; import _ from "underscore";
import {Tabs,Input,Tree,Button} from "antd"; import {Tabs,Input,Tree,Button} from "antd";
import CustomGroupTabCon from './components/CustomGroupTabCon';
import DepartMentTabCon from './components/DepartMentTabCon'; import DepartMentTabCon from './components/DepartMentTabCon';
import PostGroupTabCon from './components/PostGroupTabCon';
import "./NewUsersManagePage.less"; import "./NewUsersManagePage.less";
const { TabPane } = Tabs; const { TabPane } = Tabs;
......
.new-user-manage-page{
.ant-tabs-tab + .ant-tabs-tab{
margin:0;
}
}
\ No newline at end of file
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Button, Input, message } from "antd";
import LeftStructureTree from "./LeftStructureTree";
import AddOrEditPostGroupModal from "../modal/AddOrEditPostGroupModal";
import UserTable from "./UserTable";
import "./PostGroupTabCon.less";
const { Search } = Input;
function CustomGroupTabCon() {
const [postGroupTreeData, setPostGroupTreeData] = useState([]);
return (
<div className="post-group-tab-con">
<LeftStructureTree
treeData={postGroupTreeData}
treeType={"customGroupTab"}
editPostGroup={(record)=>editPostGroup(record)}
addPostGroup={(record)=>addPostGroup(record)}
/>
<div className="table-con">
<div className="operate-area">
<Button type="primary" className="add-user-btn">
添加学员
</Button>
<Button className="del-user-btn">移出学员</Button>
</div>
<UserTable />
</div>
</div>
);
}
export default withRouter(CustomGroupTabCon);
...@@ -36,7 +36,6 @@ function DepartMentTabCon(props) { ...@@ -36,7 +36,6 @@ function DepartMentTabCon(props) {
title: "学员", title: "学员",
dataIndex: "nickName", dataIndex: "nickName",
width: 220, width: 220,
fixed: 'left',
render: (val, item) => { render: (val, item) => {
return ( return (
<div> <div>
...@@ -60,9 +59,9 @@ function DepartMentTabCon(props) { ...@@ -60,9 +59,9 @@ function DepartMentTabCon(props) {
{ {
title: "真实姓名", title: "真实姓名",
dataIndex: "realName", dataIndex: "realName",
width: "15%", width: 180,
render: (val, record) => { render: (val, record) => {
return <span>{val}</span>; return <span>{val}</span>
}, },
}, },
{ {
...@@ -118,16 +117,19 @@ function DepartMentTabCon(props) { ...@@ -118,16 +117,19 @@ function DepartMentTabCon(props) {
title: "操作", title: "操作",
key: "operate", key: "operate",
dataIndex: "operate", dataIndex: "operate",
width: "15%", width: 60,
fixed: 'right', fixed: 'right',
render: (val, item) => { render: (val, item) => {
return ( return (
<div className="operate"> <div className="operate">
{props.currentTab==='departMentTab'? {props.currentTab==='departMentTab'?
<span>-</span> <span>-</span>
// <div className="operate__item" onClick={()=>delUser('single',item.userId)}>删除</div>
: :
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>移出</div> (selectDep.depLevel > 0 ?
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>移出</div>
:
<span>-</span>
)
} }
</div> </div>
); );
...@@ -201,7 +203,7 @@ function DepartMentTabCon(props) { ...@@ -201,7 +203,7 @@ function DepartMentTabCon(props) {
idList = _.pluck(selectUser,'userId'); idList = _.pluck(selectUser,'userId');
} }
if(idList.length===0){ if(idList.length===0){
message.warning('请先选择要删除的学员') message.warning('请先选择要移出的学员')
return; return;
} }
switch (props.currentTab){ switch (props.currentTab){
...@@ -291,7 +293,7 @@ function DepartMentTabCon(props) { ...@@ -291,7 +293,7 @@ function DepartMentTabCon(props) {
if(num<3){ if(num<3){
return confirm({ return confirm({
title: "确定更新列表数据吗?", title: "确定更新列表数据吗?",
content: `学员数据来源企微通讯录,一天只能更新3次,今日还能更新${3-num}次。`, content: <span>学员数据来源企微通讯录,一天只能更新3次,今日还能更新<span style={{color:'#2966FF'}}>{3-num}</span>次。</span>,
icon: ( icon: (
<span className="icon iconfont default-confirm-icon">&#xe839; </span> <span className="icon iconfont default-confirm-icon">&#xe839; </span>
), ),
...@@ -305,7 +307,7 @@ function DepartMentTabCon(props) { ...@@ -305,7 +307,7 @@ function DepartMentTabCon(props) {
Modal.warning({ Modal.warning({
title: '提示', title: '提示',
okText: '我知道了', okText: '我知道了',
content: '学员数据今日更新次数已达上限(3次),无法继续更新。', content: <span>学员数据今日更新次数已达上限<span style={{color:'#2966FF'}}>(3次)</span>,无法继续更新。</span>,
icon: ( icon: (
<span className='icon iconfont default-confirm-icon' style={{ color: '#FFBB54 !important' }}> <span className='icon iconfont default-confirm-icon' style={{ color: '#FFBB54 !important' }}>
&#xe834; &#xe834;
...@@ -356,7 +358,7 @@ function DepartMentTabCon(props) { ...@@ -356,7 +358,7 @@ function DepartMentTabCon(props) {
<Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button> <Button className="update-user-btn" onClick={()=>{updateListData()}}>更新列表数据</Button>
<span className="origin-text">数据来源企业微信通讯录</span> <span className="origin-text">数据来源企业微信通讯录</span>
<a <a
href="https://www.yuque.com/wangzhong-zkqw0/qixue" href="https://www.yuque.com/docs/share/8c66333f-ed62-469d-909e-b36389a115ea?#"
target="_blank" target="_blank"
> >
<span className="view-text">查看数据更新说明</span> <span className="view-text">查看数据更新说明</span>
...@@ -380,7 +382,9 @@ function DepartMentTabCon(props) { ...@@ -380,7 +382,9 @@ function DepartMentTabCon(props) {
添加学员 添加学员
</Button> </Button>
} }
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>移出学员</Button> {selectDep.depLevel > 0 &&
<Button className="del-user-btn" onClick={()=>delUser('multiple')}>移出学员</Button>
}
</div> </div>
)} )}
<div className="user-table"> <div className="user-table">
...@@ -389,7 +393,7 @@ function DepartMentTabCon(props) { ...@@ -389,7 +393,7 @@ function DepartMentTabCon(props) {
image: college, image: college,
description: "暂无数据", description: "暂无数据",
}} }}
scroll={{ x: 1500 }} scroll={{ x: 1200 }}
bordered bordered
size="middle" size="middle"
pagination={false} pagination={false}
......
.department-tab-con{ .department-tab-con{
display: flex; display: flex;
.table-con{ .table-con{
margin-left:16px;
flex:1; flex:1;
max-width: calc(100% - 290px);
.post-name{ .post-name{
max-width: 200px; max-width: 200px;
overflow: hidden; overflow: hidden;
......
import React, { useEffect, useState } from "react"; import React, { useEffect, useState, useRef } from "react";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import { Tree, Input, Dropdown, Menu,Button,Modal,message,AutoComplete} from "antd"; import { Tree, Input, Dropdown, Menu, Button, Modal, message, AutoComplete, Tooltip } from "antd";
import AddOrEditPostGroupModal from "../modal/AddOrEditPostGroupModal"; import AddOrEditPostGroupModal from "../modal/AddOrEditPostGroupModal";
import User from '@/common/js/user' import User from '@/common/js/user'
import StoreService from "@/domains/store-domain/storeService"; import StoreService from "@/domains/store-domain/storeService";
import { DepType } from '@/domains/store-domain/constants'; import { DepType } from '@/domains/store-domain/constants';
import Bus from '@/core/bus'; import Bus from '@/core/bus';
import WWOpenDataCom from '@/components/WWOpenDataCom'; import WWOpenDataCom from '@/components/WWOpenDataCom';
import "./LeftStructureTree.less"; import "./LeftStructureTree.less";
...@@ -13,69 +13,95 @@ const { Search } = Input; ...@@ -13,69 +13,95 @@ const { Search } = Input;
const { DirectoryTree } = Tree; const { DirectoryTree } = Tree;
const { Option } = AutoComplete; const { Option } = AutoComplete;
function LeftStructureTree(props) { function LeftStructureTree(props) {
const {treeType} = props; const { treeType } = props;
const [treeData,setTreeData]=useState([]); const [treeData, setTreeData] = useState([]);
const [addOrEditPostGroupShow, setAddOrEditPostGroupShow] = useState(false); const [addOrEditPostGroupShow, setAddOrEditPostGroupShow] = useState(false);
const [postGroupModalLevel, setPostGroupModalLevel] = useState(""); const [postGroupModalLevel, setPostGroupModalLevel] = useState("");
const [operatePostGroupModalType,setOperatePostGroupModalType] = useState(""); const [operatePostGroupModalType, setOperatePostGroupModalType] = useState("");
const [postGroupModalTitle,setPostGroupModalTitle] = useState(""); const [postGroupModalTitle, setPostGroupModalTitle] = useState("");
const [postGroupModalLable,setPostGroupModalLable] = useState(""); const [postGroupModalLable, setPostGroupModalLable] = useState("");
const [postGroupName, setPostGroupName] = useState(""); const [postGroupName, setPostGroupName] = useState("");
const [currentGroupData,setCurrentGroupData] = useState({}); const [currentGroupData, setCurrentGroupData] = useState({});
const [completeOptions,setCompleteOption] = useState([]); const [completeOptions, setCompleteOption] = useState([]);
const [selectedKeys,setSelectedKeys]= useState([]); // 设置选中的部门key值 const [selectedKeys, setSelectedKeys] = useState([]); // 设置选中的部门key值
const [queryName,setQueryName] = useState(''); // 搜索框内的值 const [queryName, setQueryName] = useState(''); // 搜索框内的值
const [selctQueryName,setSelctQueryName]= useState(''); // 搜索出结果后最终选择的名字 const [selctQueryName, setSelctQueryName] = useState(''); // 搜索出结果后最终选择的名字
const [postGroupTreeData,setPostGroupTreeData] = useState([]); // 为了判定创建和编辑时的数据会不会重明 const [postGroupTreeData, setPostGroupTreeData] = useState([]); // 为了判定创建和编辑时的数据会不会重明
const [open,setOpen]=useState(false); const [open, setOpen] = useState(false);
const timer = useRef(null)
useEffect(()=>{ const queryNameRef = useRef(null)
useEffect(() => {
queryNameRef.current = queryName
}, [
queryName
])
useEffect(() => {
setQueryName(''); //切换tab时搜索置空 setQueryName(''); //切换tab时搜索置空
setCompleteOption([]); setCompleteOption([]);
setOpen(false); //切换tab时搜索的下拉框置为空 setOpen(false); //切换tab时搜索的下拉框置为空
getTreeData().then((res)=>{ getTreeData().then((res) => {
const _defaultSelectedKeys = []; const _defaultSelectedKeys = [];
if(res.length > 0){ if (res.length > 0) {
_defaultSelectedKeys.push(res[0].id); _defaultSelectedKeys.push(res[0].id);
setSelectedKeys(_defaultSelectedKeys); setSelectedKeys(_defaultSelectedKeys);
props.onChangeSelectDep(res[0]) props.onChangeSelectDep(res[0])
props.searchUserList(res[0],treeType,1); props.searchUserList(res[0], treeType, 1);
}else{ } else {
props.searchUserList({id:null},treeType,1); props.searchUserList({ id: null }, treeType, 1);
} }
}); });
},[props.treeType]); }, [props.treeType]);
useEffect(()=>{ useEffect(() => {
Bus.bind("addCustomer",(record)=>{addCustomer(record.treeType,record.query)}) Bus.bind("addCustomer", (record) => { addCustomer(record.treeType, record.query) })
},[]); }, []);
useEffect(()=>{ useEffect(() => {
Bus.bind("changeTreeData",(record)=>{getTreeData(record.treeType)}) Bus.bind("changeTreeData", (record) => { getTreeData(record.treeType) })
},[]); }, []);
const renderTitle = (title) => ( const renderTitle = (title) => (
<span> <span className="catalog-title">
{title} {title}
</span> </span>
); );
const renderItem = (record,type) => ({ const renderItem = (record, type) => ({
value: record.userName || record.name, value: record.userName || record.name,
label: ( label: (
<div <div
className="search-result-item"
style={{ style={{
display: 'flex', display: 'flex',
justifyContent: 'space-between', justifyContent: 'space-between',
}} }}
depId={record.id}
type={type}
> >
{type === 'user'? {type === 'user' ?
<div><WWOpenDataCom type="userName" openid={record.userName}/></div> <div className="search-result-item__left">
<span className="icon iconfont title-icon">&#xe603;</span>
<WWOpenDataCom type="userName" openid={record.userName} />
</div>
: :
<div><WWOpenDataCom type="departmentName" openid={record.name}/></div> <div className="search-result-item__left">
} {props.treeType === 'departMentTab' ?
{type === 'user' && <WWOpenDataCom type="departmentName" openid={record.name} />
record.postDepNamesList.map((item,index)=>{ :
return <span><WWOpenDataCom type="departmentName" openid={item}/></span> <span>{record.name}</span>
}) }
</div>
} }
{type === 'user' && (
<div className="search-result-item__right">
<Tooltip title={<div>{handleDepName(record.depNamesList)}</div>} placement='top' arrowPointAtCenter>
{record.depNamesList.map((item, index) => {
return <span><WWOpenDataCom type="departmentName" openid={item} />{index < (record.depNamesList.length - 1) ? ';' : ''}</span>
})}
</Tooltip>
</div>
)}
{type === 'post' && {type === 'post' &&
<span type='post' openid={record.parentName}>{record.parentName}</span> <span type='post' openid={record.parentName}>{record.parentName}</span>
} }
...@@ -83,140 +109,155 @@ function LeftStructureTree(props) { ...@@ -83,140 +109,155 @@ function LeftStructureTree(props) {
), ),
}); });
const notFoundContentNode = ()=>{ const notFoundContentNode = () => {
return <span>暂无数据</span> return <div className="empty-con">
<img src="https://image.xiaomaiketang.com/xm/wRDrb2pJFb.png" className="empty-img" />
<div className="empty-text">暂无数据</div>
</div>
} }
function handlePlaceHolder(){ function handleDepName(depArray) {
const depArrayDom = depArray.map((item, index) => {
return <span><WWOpenDataCom type="departmentName" openid={item} /></span>
});
return depArrayDom;
};
function handlePlaceHolder() {
let placeholder = ''; let placeholder = '';
switch (props.treeType){ switch (props.treeType) {
case 'departMentTab': case 'departMentTab':
placeholder = '搜索学员姓名、部门'; placeholder = '搜索学员姓名、部门';
break; break;
case 'postGrouptab': case 'postGrouptab':
placeholder = '搜索学员姓名/岗位/岗位组'; placeholder = '搜索学员姓名/岗位/岗位组';
break; break;
case 'customGroupTab': case 'customGroupTab':
placeholder = '搜索学员姓名/自定义分组集合/自定义分组'; placeholder = '搜索学员姓名/自定义分组集合/自定义分组';
break; break;
default: default:
break; break;
} }
return placeholder return placeholder
} }
function confirmSearchSelect(value,option){ function confirmSearchSelect(value, option) {
const param = {}
setOpen(false); setOpen(false);
setQueryName(value); setQueryName(value);
console.log('option',option); if (option.label.props.type === 'user') {
console.log('_option',option); param.queryName = value;
// setSelctQueryName(option.label.props.children[0].props.children.props); } else {
props.searchUserList({queryName:value},treeType,1); param.id = option.label.props.depId;
}
props.searchUserList(param, treeType, 1);
} }
// 获取关键词的搜索结果 // 获取关键词的搜索结果
function getCompleteOptionData(value){ function getCompleteOptionData(value) {
// setQueryName(value); // setQueryName(value);
console.log("treeType",props.treeType); setCompleteOption([]);
if (!value) {
return
}
const params = { const params = {
depType:DepType[props.treeType], depType: DepType[props.treeType],
queryName:value, queryName: value,
enterpriseId:User.getEnterpriseId(), enterpriseId: User.getEnterpriseId(),
source:0,//0代表来自企培 source: 0,//0代表来自企培
storeId:User.getStoreId(), storeId: User.getStoreId(),
userId:User.getUserId(), userId: User.getUserId(),
whetherCount:false, whetherCount: false,
distinct:false, distinct: false,
queryType:'CUSTOMER' queryType: 'CUSTOMER'
} }
StoreService.getDepartmentUser(params).then((res) => { StoreService.getDepartmentUser(params).then((res) => {
const _completeOptions = []; const _completeOptions = [];
const userObj = {}; const userObj = {};
const departmentGroupObj = {}; const departmentGroupObj = {};
const postobj = {}; const postobj = {};
const { result = {}} = res; const { result = {} } = res;
const {departmentUserVOList=[],departmentVOList=[],subLevelDepartmentVOList=[]} = result; const { departmentUserVOList = [], departmentVOList = [], subLevelDepartmentVOList = [] } = result;
if(departmentUserVOList.length>0){ if (departmentUserVOList.length > 0) {
userObj.label=renderTitle('学员'); userObj.label = renderTitle('学员');
userObj.options=departmentUserVOList.map((item,index)=>{ userObj.options = departmentUserVOList.map((item, index) => {
return renderItem(item,'user'); return renderItem(item, 'user');
}) })
} }
if(departmentVOList.length>0){ if (departmentVOList.length > 0) {
switch (props.treeType){ switch (props.treeType) {
case 'departMentTab': case 'departMentTab':
departmentGroupObj.label=renderTitle('部门'); departmentGroupObj.label = renderTitle('部门');
break; break;
case 'postGrouptab': case 'postGrouptab':
departmentGroupObj.label=renderTitle('岗位组'); departmentGroupObj.label = renderTitle('岗位组');
break; break;
case 'customGroupTab': case 'customGroupTab':
departmentGroupObj.label=renderTitle('分组集合'); departmentGroupObj.label = renderTitle('分组集合');
break; break;
default: default:
break; break;
} }
departmentGroupObj.options=departmentVOList.map((item,index)=>{ departmentGroupObj.options = departmentVOList.map((item, index) => {
return renderItem(item,'group'); return renderItem(item, 'group');
}) })
} }
if(subLevelDepartmentVOList.length>0){ if (subLevelDepartmentVOList.length > 0) {
switch (props.treeType){ switch (props.treeType) {
case 'postGrouptab': case 'postGrouptab':
postobj.label=renderTitle('岗位'); postobj.label = renderTitle('岗位');
break; break;
case 'customGroupTab': case 'customGroupTab':
postobj.label=renderTitle('分组'); postobj.label = renderTitle('分组');
break; break;
default: default:
break; break;
} }
postobj.options=subLevelDepartmentVOList.map((item,index)=>{ postobj.options = subLevelDepartmentVOList.map((item, index) => {
return renderItem(item,'post'); return renderItem(item, 'post');
}) })
} }
if(Object.keys(userObj).length !==0){ if (Object.keys(userObj).length !== 0) {
_completeOptions.push(userObj); _completeOptions.push(userObj);
} }
if(Object.keys(departmentGroupObj).length !==0){ if (Object.keys(departmentGroupObj).length !== 0) {
_completeOptions.push(departmentGroupObj); _completeOptions.push(departmentGroupObj);
} }
if(Object.keys(postobj).length !==0){ if (Object.keys(postobj).length !== 0) {
_completeOptions.push(postobj); _completeOptions.push(postobj);
} }
setCompleteOption(_completeOptions); setCompleteOption(_completeOptions);
}); });
} }
async function addCustomer(treeType,query){ async function addCustomer(treeType, query) {
await getTreeData(treeType); await getTreeData(treeType);
props.searchUserList(query,treeType,1); props.searchUserList(query, treeType, 1);
} }
function getTreeData(treeType){ function getTreeData(treeType) {
return new Promise((resolve,reject)=>{ return new Promise((resolve, reject) => {
const params = { const params = {
departmentTypeEnum:DepType[treeType] || DepType[props.treeType], departmentTypeEnum: DepType[treeType] || DepType[props.treeType],
enterpriseId:User.getEnterpriseId(), enterpriseId: User.getEnterpriseId(),
source:0,//0代表来自企培 source: 0,//0代表来自企培
storeId:User.getStoreId(), storeId: User.getStoreId(),
userId:User.getUserId(), userId: User.getUserId(),
whetherCount:true whetherCount: true
} }
StoreService.queryDepartmentTree(params).then((res) => { StoreService.queryDepartmentTree(params).then((res) => {
const { result = []} = res const { result = [] } = res
let { departmentVOList=[] } =result; let { departmentVOList = [] } = result;
let _treeData = handleData(result); let _treeData = handleData(result);
setTreeData(_treeData); setTreeData(_treeData);
resolve(result); resolve(result);
}); });
}) })
} }
function handleData(dataArray){ function handleData(dataArray) {
const _dataArray = dataArray.map((item,index)=>{ const _dataArray = dataArray.map((item, index) => {
item.title = ""; item.title = "";
item.key=item.id; item.key = item.id;
if(item.sonDepartmentVOList){ if (item.sonDepartmentVOList) {
item.children = item.sonDepartmentVOList; item.children = item.sonDepartmentVOList;
handleData(item.sonDepartmentVOList) handleData(item.sonDepartmentVOList)
} }
...@@ -232,24 +273,24 @@ function LeftStructureTree(props) { ...@@ -232,24 +273,24 @@ function LeftStructureTree(props) {
const moreOpenGroupOperate = (record) => ( const moreOpenGroupOperate = (record) => (
<Menu> <Menu>
<Menu.Item key="edit"> <Menu.Item key="edit">
<span onClick={()=>{props.treeType==='postGrouptab'?editPostGroup(record):editCustomGroup(record)}}>编辑</span> <span onClick={() => { props.treeType === 'postGrouptab' ? editPostGroup(record) : editCustomGroup(record) }}>编辑</span>
</Menu.Item> </Menu.Item>
{record.depLevel ===0 && {record.depLevel === 0 &&
<Menu.Item key="add" > <Menu.Item key="add" >
<span onClick={()=>{props.treeType==='postGrouptab'?addPostGroup(1,record):addCustomGroup(1,record)}}> <span onClick={() => { props.treeType === 'postGrouptab' ? addPostGroup(1, record) : addCustomGroup(1, record) }}>
{props.treeType==='postGrouptab' && {props.treeType === 'postGrouptab' &&
<span>新建岗位</span> <span>新建岗位</span>
} }
{props.treeType==='customGroupTab' && {props.treeType === 'customGroupTab' &&
<span>新建分组</span> <span>新建分组</span>
} }
</span> </span>
</Menu.Item> </Menu.Item>
} }
{/* { (record.departmentCount === 0 || !record.departmentCount) && */} {/* { (record.departmentCount === 0 || !record.departmentCount) && */}
<Menu.Item key="del"> <Menu.Item key="del">
<span onClick={()=>{props.treeType==='postGrouptab'?delPostGroup(record):delCustomGroup(record)}}>删除</span> <span onClick={() => { props.treeType === 'postGrouptab' ? delPostGroup(record) : delCustomGroup(record) }}>删除</span>
</Menu.Item> </Menu.Item>
{/* } */} {/* } */}
</Menu> </Menu>
); );
...@@ -260,75 +301,75 @@ function LeftStructureTree(props) { ...@@ -260,75 +301,75 @@ function LeftStructureTree(props) {
} }
//添加岗位组/岗位 //添加岗位组/岗位
function addPostGroup(level,record) { function addPostGroup(level, record) {
if(level===0){ if (level === 0) {
if (treeData.length > 9) { if (treeData.length > 9) {
message.error("岗位组数量已达10个上限"); message.error("岗位组数量已达10个上限");
return; return;
} }
} }
if(level===1){ if (level === 1) {
if(record.sonDepartmentVOList){ if (record.sonDepartmentVOList) {
if(record.sonDepartmentVOList.length > 19){ if (record.sonDepartmentVOList.length > 19) {
message.error("岗位数量已达20个上限"); message.error("岗位数量已达20个上限");
return; return;
} }
} }
} }
setCurrentGroupData({}); setCurrentGroupData({});
setAddOrEditPostGroupShow(true); setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("add"); setOperatePostGroupModalType("add");
setPostGroupModalLevel(level); setPostGroupModalLevel(level);
setCurrentGroupData(record); setCurrentGroupData(record);
console.log('treeData',record); console.log('treeData', record);
if(level===0){ if (level === 0) {
setPostGroupModalTitle('添加岗位组'); setPostGroupModalTitle('添加岗位组');
setPostGroupModalLable('岗位组'); setPostGroupModalLable('岗位组');
setPostGroupTreeData(treeData); setPostGroupTreeData(treeData);
}else{ } else {
setPostGroupModalTitle('添加岗位'); // sub代表岗位 setPostGroupModalTitle('添加岗位'); // sub代表岗位
setPostGroupModalLable('岗位'); setPostGroupModalLable('岗位');
setPostGroupTreeData(record.sonDepartmentVOList || []); setPostGroupTreeData(record.sonDepartmentVOList || []);
} }
} }
//编辑岗位组/岗位 //编辑岗位组/岗位
function editPostGroup(record){ function editPostGroup(record) {
setAddOrEditPostGroupShow(true); setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("edit"); setOperatePostGroupModalType("edit");
//level为0的时候编辑的是岗位组 大于0的时候 //level为0的时候编辑的是岗位组 大于0的时候
setPostGroupModalLevel(record.depLevel); setPostGroupModalLevel(record.depLevel);
setCurrentGroupData(record); setCurrentGroupData(record);
console.log('treeData',record); console.log('treeData', record);
if(record.depLevel===0){ if (record.depLevel === 0) {
setPostGroupModalTitle('编辑岗位组'); setPostGroupModalTitle('编辑岗位组');
setPostGroupModalLable('岗位组'); setPostGroupModalLable('岗位组');
setPostGroupTreeData(treeData); setPostGroupTreeData(treeData);
}else{ } else {
setPostGroupModalTitle('编辑岗位'); setPostGroupModalTitle('编辑岗位');
setPostGroupModalLable('岗位'); setPostGroupModalLable('岗位');
setPostGroupTreeData(getParentChildernData(record.parentId)); setPostGroupTreeData(getParentChildernData(record.parentId));
} }
} }
// 获取父节点下的所有的子级数据 // 获取父节点下的所有的子级数据
function getParentChildernData(parentId){ function getParentChildernData(parentId) {
let _parentChildernData = [] let _parentChildernData = []
treeData.map((item,index)=>{ treeData.map((item, index) => {
if( parentId=== item.id){ if (parentId === item.id) {
_parentChildernData = item.sonDepartmentVOList _parentChildernData = item.sonDepartmentVOList
} }
}) })
return _parentChildernData return _parentChildernData
} }
function delPostGroup(record){ function delPostGroup(record) {
let title = '确认删除该岗位组吗?'; let title = '确认删除该岗位组吗?';
let content= '删除后,该岗位组下的岗位及也将全部删除。'; let content = '删除后,该岗位组下的岗位及也将全部删除。';
if(record.departmentCount && record.departmentCount>0 ){ if (record.departmentCount && record.departmentCount > 0) {
title = '删除失败'; title = '删除失败';
if(record.level>0){ if (record.depLevel > 0) {
content = `${record.name}存在学员,不能删除该岗位`; content = `${record.name}存在学员,不能删除该岗位`;
}else{ } else {
content = `${record.name}存在学员,不能删除该岗位组`; content = `${record.name}存在学员,不能删除该岗位组`;
} }
Modal.warning({ Modal.warning({
...@@ -339,29 +380,29 @@ function LeftStructureTree(props) { ...@@ -339,29 +380,29 @@ function LeftStructureTree(props) {
}) })
return return
} }
if(record.level>0){ if (record.level > 0) {
title = '确认删除该岗位吗?'; title = '确认删除该岗位吗?';
content = '删除后,不可恢复'; content = '删除后,不可恢复';
} }
Modal.confirm({ Modal.confirm({
title, title,
content, content,
icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>, icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>,
okText: '确定', okText: '确定',
okType: 'danger', okType: 'danger',
cancelText: '取消', cancelText: '取消',
onOk: () => { onOk: () => {
delGroup(record); delGroup(record);
}, },
}); });
} }
function delGroup(record){ function delGroup(record) {
let parmas = { let parmas = {
departmentId:record.id, departmentId: record.id,
enterpriseId:User.getEnterpriseId(), enterpriseId: User.getEnterpriseId(),
source:0, source: 0,
storeId:User.getStoreId(), storeId: User.getStoreId(),
userId:User.getUserId() userId: User.getUserId()
} }
StoreService.delDepartment(parmas).then((res) => { StoreService.delDepartment(parmas).then((res) => {
message.success(`删除成功`) message.success(`删除成功`)
...@@ -372,16 +413,16 @@ function LeftStructureTree(props) { ...@@ -372,16 +413,16 @@ function LeftStructureTree(props) {
//添加自定义分组集合/分组 //添加自定义分组集合/分组
function addCustomGroup(level,record) { function addCustomGroup(level, record) {
if(level===0){ if (level === 0) {
if (treeData.length > 9) { if (treeData.length > 9) {
message.error("自定义分组集合数量已达10个上限"); message.error("自定义分组集合数量已达10个上限");
return; return;
} }
} }
if(level===1){ if (level === 1) {
if(record.sonDepartmentVOList){ if (record.sonDepartmentVOList) {
if(record.sonDepartmentVOList.length > 19){ if (record.sonDepartmentVOList.length > 19) {
message.error("自定义分组数量已达20个上限"); message.error("自定义分组数量已达20个上限");
return; return;
} }
...@@ -392,41 +433,41 @@ function LeftStructureTree(props) { ...@@ -392,41 +433,41 @@ function LeftStructureTree(props) {
setOperatePostGroupModalType("add"); setOperatePostGroupModalType("add");
setPostGroupModalLevel(level); setPostGroupModalLevel(level);
setCurrentGroupData(record) setCurrentGroupData(record)
if(level===0){ if (level === 0) {
setPostGroupModalTitle('添加分组集合'); setPostGroupModalTitle('添加分组集合');
setPostGroupModalLable('分组集合'); setPostGroupModalLable('分组集合');
setPostGroupTreeData(treeData); setPostGroupTreeData(treeData);
}else{ } else {
setPostGroupModalTitle('添加分组'); // sub代表岗位 setPostGroupModalTitle('添加分组'); // sub代表岗位
setPostGroupModalLable('分组'); setPostGroupModalLable('分组');
setPostGroupTreeData(record.sonDepartmentVOList || []); setPostGroupTreeData(record.sonDepartmentVOList || []);
} }
} }
//编辑自定义分组集合/分组 //编辑自定义分组集合/分组
function editCustomGroup(record){ function editCustomGroup(record) {
setAddOrEditPostGroupShow(true); setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("edit"); setOperatePostGroupModalType("edit");
setPostGroupModalLevel(record.level); setPostGroupModalLevel(record.level);
setCurrentGroupData(record) setCurrentGroupData(record)
//level为0的时候编辑的是岗位组 大于0的时候 //level为0的时候编辑的是岗位组 大于0的时候
if(record.depLevel===0){ if (record.depLevel === 0) {
setPostGroupModalTitle('编辑分组集合'); setPostGroupModalTitle('编辑分组集合');
setPostGroupModalLable('分组集合'); setPostGroupModalLable('分组集合');
setPostGroupTreeData(treeData); setPostGroupTreeData(treeData);
}else{ } else {
setPostGroupModalTitle('编辑分组'); setPostGroupModalTitle('编辑分组');
setPostGroupModalLable('分组'); setPostGroupModalLable('分组');
setPostGroupTreeData(getParentChildernData(record.parentId)); setPostGroupTreeData(getParentChildernData(record.parentId));
} }
} }
function delCustomGroup(record){ function delCustomGroup(record) {
let title = '确认删除该分组集合吗?'; let title = '确认删除该分组集合吗?';
let content= '删除后,该分组集合下的岗位及也将全部删除。'; let content = '删除后,该分组集合下的岗位及也将全部删除。';
if(record.departmentCount && record.departmentCount>0 ){ if (record.departmentCount && record.departmentCount > 0) {
title = '删除失败'; title = '删除失败';
if(record.level>0){ if (record.level > 0) {
content = `${record.name}存在学员,不能删除该分组`; content = `${record.name}存在学员,不能删除该分组`;
}else{ } else {
content = `${record.name}存在学员,不能删除该分组集合`; content = `${record.name}存在学员,不能删除该分组集合`;
} }
Modal.warning({ Modal.warning({
...@@ -437,22 +478,22 @@ function LeftStructureTree(props) { ...@@ -437,22 +478,22 @@ function LeftStructureTree(props) {
}) })
return return
} }
if(record.level>0){ if (record.level > 0) {
title = '确认删除该分组吗?'; title = '确认删除该分组吗?';
content = '删除后,不可恢复'; content = '删除后,不可恢复';
} }
Modal.confirm({ Modal.confirm({
title, title,
content, content,
icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>, icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>,
okText: '确定', okText: '确定',
okType: 'danger', okType: 'danger',
cancelText: '取消', cancelText: '取消',
onOk: () => { onOk: () => {
delGroup(record) delGroup(record)
}, },
}); });
} }
function confirmAddOrEditPostGroup() { function confirmAddOrEditPostGroup() {
...@@ -460,66 +501,79 @@ function LeftStructureTree(props) { ...@@ -460,66 +501,79 @@ function LeftStructureTree(props) {
getTreeData() getTreeData()
} }
function selectUserList(record,e){ function selectUserList(record, e) {
const _selectKeys = []; const _selectKeys = [];
_selectKeys.push(e.selectedNodes[0].id) _selectKeys.push(e.selectedNodes[0].id)
setSelectedKeys(_selectKeys); setSelectedKeys(_selectKeys);
props.onChangeSelectDep(e.selectedNodes[0]); props.onChangeSelectDep(e.selectedNodes[0]);
props.searchUserList(e.selectedNodes[0],treeType,1); props.searchUserList(e.selectedNodes[0], treeType, 1);
} }
function changeName(value) {
setQueryName(value); setOpen(true);
clearTimeout(timer.current)
timer.current = setTimeout(() => {
getCompleteOptionData(queryNameRef.current)
}, 500)
}
return ( return (
<div className="left-structure-tree"> <div className="left-structure-tree">
<div className="organization"> <div className="organization">
<div className="search-con"> <div className="search-con">
{/* <Complete/> */} {/* <Complete/> */}
<AutoComplete {/* <AutoComplete
dropdownClassName="certain-category-search-dropdown" dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={250} dropdownMatchSelectWidth={250}
allowClear allowClear
onChange={(value)=>setQueryName(value)} onChange={changeName}
onSearch={(value)=>{getCompleteOptionData(value)}} // onSearch={(value)=>{getCompleteOptionData(value)}}
notFoundContent={notFoundContentNode()} notFoundContent={notFoundContentNode()}
value={queryName} value={queryName}
open={open} open={open}
onFocus={()=>{setOpen(true)}} onFocus={() => { setOpen(true) }}
onBlur={()=>{setOpen(false)}} onBlur={() => { setOpen(false) }}
style={{ style={{
width: 250, width: 250,
}} }}
options={completeOptions} options={completeOptions}
onSelect={confirmSearchSelect} onSelect={confirmSearchSelect}
placeholder={handlePlaceHolder()} placeholder={handlePlaceHolder()}
> >
</AutoComplete> <Search
style={{ width: 250 }}
enterButton={<span className='icon iconfont'>&#xe832;</span>}
/>
</AutoComplete> */}
</div>
{(props.treeType === 'postGrouptab' || props.treeType === 'customGroupTab') && (
<div className="operate">
{props.treeType === 'postGrouptab' &&
<Button
className="add-btn"
onClick={() => {
addPostGroup(0)
}}
>
添加岗位组
</Button>
}
{props.treeType === 'customGroupTab' &&
<Button
className="add-btn"
onClick={() => {
addCustomGroup(0)
}}
>
添加自定义分组
</Button>
}
</div> </div>
{ (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') && ( )}
<div className="operate">
{props.treeType==='postGrouptab' &&
<Button
className="add-btn"
onClick={() => {
addPostGroup(0)
}}
>
添加岗位组
</Button>
}
{props.treeType==='customGroupTab' &&
<Button
className="add-btn"
onClick={() => {
addCustomGroup(0)
}}
>
添加自定义分组
</Button>
}
</div>
)}
<div className="tree-con"> <div className="tree-con">
{!selctQueryName ? {!selctQueryName ?
<DirectoryTree <DirectoryTree
defaultExpandAll defaultExpandAll
showIcon={false} showIcon={false}
treeData={treeData} treeData={treeData}
...@@ -530,7 +584,7 @@ function LeftStructureTree(props) { ...@@ -530,7 +584,7 @@ function LeftStructureTree(props) {
<div <div
className="node-title-div" className="node-title-div"
onMouseOver={(e) => { onMouseOver={(e) => {
if((props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab')){ if ((props.treeType === 'postGrouptab' || props.treeType === 'customGroupTab')) {
if (nodeData.key === "null") return; if (nodeData.key === "null") return;
let moreDiv = e.currentTarget.getElementsByClassName( let moreDiv = e.currentTarget.getElementsByClassName(
"item-more" "item-more"
...@@ -547,7 +601,7 @@ function LeftStructureTree(props) { ...@@ -547,7 +601,7 @@ function LeftStructureTree(props) {
} }
}} }}
onMouseOut={(e) => { onMouseOut={(e) => {
if((props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab')){ if ((props.treeType === 'postGrouptab' || props.treeType === 'customGroupTab')) {
if (nodeData.key === "null") return; if (nodeData.key === "null") return;
let moreDiv = e.currentTarget.getElementsByClassName( let moreDiv = e.currentTarget.getElementsByClassName(
"item-more" "item-more"
...@@ -565,7 +619,7 @@ function LeftStructureTree(props) { ...@@ -565,7 +619,7 @@ function LeftStructureTree(props) {
}} }}
> >
<div className="item-icon"> <div className="item-icon">
<span className="icon iconfont title-icon">&#xe604;</span> <span className="icon iconfont title-icon">&#xe604;</span>
</div> </div>
<div <div
className="item-title" className="item-title"
...@@ -574,18 +628,18 @@ function LeftStructureTree(props) { ...@@ -574,18 +628,18 @@ function LeftStructureTree(props) {
leftBoxWidth <= "240px" leftBoxWidth <= "240px"
? "35%" ? "35%"
: leftBoxWidth <= "304px" : leftBoxWidth <= "304px"
? "60%" ? "60%"
: "78%", : "78%",
}} }}
> >
{ props.treeType==='departMentTab'? {props.treeType === 'departMentTab' ?
<span><WWOpenDataCom type="departmentName" openid={nodeData.name}/></span> <span><WWOpenDataCom type="departmentName" openid={nodeData.name} /></span>
: :
<span>{nodeData.name}</span> <span>{nodeData.name}</span>
} }
</div> </div>
<div className="item-count">({nodeData.departmentCount || 0})</div> <div className="item-count">({nodeData.departmentCount || 0})</div>
{ (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') && ( {(props.treeType === 'postGrouptab' || props.treeType === 'customGroupTab') && (
<Dropdown overlay={moreOpenGroupOperate(nodeData)}> <Dropdown overlay={moreOpenGroupOperate(nodeData)}>
<div className="item-more icon iconfont">&#xe927;</div> <div className="item-more icon iconfont">&#xe927;</div>
</Dropdown> </Dropdown>
...@@ -597,13 +651,13 @@ function LeftStructureTree(props) { ...@@ -597,13 +651,13 @@ function LeftStructureTree(props) {
: :
<div> <div>
{/* { (props.treeType==='departMentTab') && */} {/* { (props.treeType==='departMentTab') && */}
<div> <div>
{ selctQueryName.type==='userName'? {selctQueryName.type === 'userName' ?
<WWOpenDataCom type="userName" openid={selctQueryName.openid}/> <WWOpenDataCom type="userName" openid={selctQueryName.openid} />
: :
<WWOpenDataCom type="departmentName" openid={selctQueryName.openid}/> <WWOpenDataCom type="departmentName" openid={selctQueryName.openid} />
} }
</div> </div>
{/* } */} {/* } */}
{/* { (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') && {/* { (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') &&
...@@ -618,7 +672,7 @@ function LeftStructureTree(props) { ...@@ -618,7 +672,7 @@ function LeftStructureTree(props) {
} */} } */}
</div> </div>
} }
</div> </div>
</div> </div>
......
.left-structure-tree { .left-structure-tree {
margin-right: 24px; margin-right: 17px;
width:260px; width:260px;
flex-shrink: 0;
height: calc(~'100vh - 260px'); height: calc(~'100vh - 260px');
overflow: scroll; overflow: scroll;
flex-shrink: 0; border-right:1px solid #eee;
.organization{ .organization{
overflow: scroll;
.search-con{ .search-con{
margin-bottom: 10px; margin-bottom: 10px;
} }
...@@ -70,7 +70,45 @@ ...@@ -70,7 +70,45 @@
color: #666666; color: #666666;
} }
} }
} }
} }
.certain-category-search-dropdown{
.catalog-title{
font-size:14px;
color:#666;
margin-bottom:14px;
}
.search-result-item{
padding:14px 0;
color:#333;
.title-icon{
color:#999;
margin-right:3px;
}
.search-result-item__left{
font-size:14px;
}
.search-result-item__right{
font-size:14px;
width:84px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color:#999;
text-align:right;
}
}
.empty-con{
text-align:center;
.empty-img{
width:150px;
height:150px;
}
.empty-text{
color:#666;
}
}
}
\ No newline at end of file
...@@ -3,7 +3,12 @@ ...@@ -3,7 +3,12 @@
color:#666; color:#666;
font-size:14px; font-size:14px;
.title-icon{ .title-icon{
font-size:14px;
color:#999;
margin-right:8px; margin-right:8px;
} }
} }
.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover::before, .ant-tree.ant-tree-directory .ant-tree-treenode-selected::before{
background: none;
}
} }
\ No newline at end of file
import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import { Button, Input, message,Modal} from "antd";
import LeftStructureTree from "./LeftStructureTree";
import UserTable from "./UserTable";
import "./PostGroupTabCon.less";
const { Search } = Input;
function PostGroupTabCon() {
// const [addOrEditPostGroupShow, setAddOrEditPostGroupShow] = useState(false);
// const [postGroupModalType, setPostGroupModalType] = useState("");
// const [operatePostGroupModalType,setOperatePostGroupModalType] = useState("");
// const [postGroupModalTitle,setPostGroupModalTitle] = useState("");
// const [postGroupModalLable,setPostGroupModalLable] = useState("");
const [postGroupTreeData, setPostGroupTreeData] = useState([]);
// function closeAddOrEditPostGroupModal() {
// setAddOrEditPostGroupShow(false);
// }
// //添加岗位组/岗位
// function addPostGroup(type) {
// if (postGroupTreeData.length === 10) {
// message.error("岗位组数量已达10个上限");
// return;
// }
// setAddOrEditPostGroupShow(true);
// setOperatePostGroupModalType("add");
// if(type==='parentGroup'){
// setPostGroupModalType('parentGroup'); //parentGroup 代表岗位组
// setPostGroupModalTitle('添加岗位组');
// setPostGroupModalLable('岗位组');
// }else{
// setPostGroupModalType('sub');
// setPostGroupModalTitle('添加岗位'); // sub代表岗位
// setPostGroupModalLable('岗位');
// }
// }
// //编辑岗位组/岗位
// function editPostGroup(record){
// setAddOrEditPostGroupShow(true);
// setOperatePostGroupModalType("edit");
// //level为0的时候编辑的是岗位组 大于0的时候
// if(record.level===0){
// setPostGroupModalType('parentGroup');
// setPostGroupModalTitle('编辑岗位组');
// setPostGroupModalLable('岗位组');
// }else{
// setPostGroupModalType('sub');
// setPostGroupModalTitle('编辑岗位');
// setPostGroupModalLable('岗位');
// }
// }
// function delPostGroup(record){
// let title = '确认删除该岗位组吗?';
// let content= '删除后,该岗位组下的岗位及也将全部删除。';
// if(record.level>0){
// title = '确认删除该岗位吗?';
// content = '删除后,不可恢复';
// }
// Modal.confirm({
// title,
// content,
// icon: <span className='icon iconfont default-confirm-icon'>&#xe6f4;</span>,
// okText: '确定',
// okType: 'danger',
// cancelText: '取消',
// onOk: () => {
// },
// });
// }
// function confirmAddOrEditPostGroup() {
// getPostGroupTreeData()
// }
return (
<div className="post-group-tab-con">
{/* <div className="organization">
<div className="search-con">
<Search
placeholder="搜索部门/学员姓名"
className="search search-input"
style={{ width: 245 }}
enterButton={<span className="icon iconfont">&#xe832;</span>}
/>
</div>
<div className="operate">
<Button
className="add-btn"
onClick={() => {
addPostGroup('postGroup');
}}
>
添加岗位组
</Button>
</div>
</div> */}
<LeftStructureTree
treeData={postGroupTreeData}
treeType={"postGrouptab"}
editPostGroup={(record)=>editPostGroup(record)}
addPostGroup={(record)=>addPostGroup(record)}
delPostGroup={(record)=>delPostGroup('record')}
/>
<div className="table-con">
<div className="operate-area">
<Button type="primary" className="add-user-btn">
添加学员
</Button>
<Button className="del-user-btn">移出学员</Button>
</div>
<UserTable />
</div>
{/* {addOrEditPostGroupShow && (
<AddOrEditPostGroupModal
onClose={() => {
closeAddOrEditPostGroupModal();
}}
onConfirm={() => {
confirmAddOrEditPostGroup();
}}
title={postGroupModalTitle}
modalType={postGroupModalType}
modalOperateType={operatePostGroupModalType}
postGroupName={postGroupName}
postGroupTreeData={postGroupTreeData}
label={postGroupModalLable}
/>
)} */}
</div>
);
}
export default withRouter(PostGroupTabCon);
.post-group-tab-con {
display: flex;
.table-con {
margin-left: 16px;
flex: 1;
.operate-area {
margin-bottom: 16px;
.add-user-btn {
margin-right: 8px;
}
.del-user-btn {
margin-right: 8px;
}
.update-user-btn {
margin-right: 8px;
}
.origin-text {
font-size: 14px;
color: #999;
}
.view-text {
font-size: 14px;
color: #5289fa;
}
}
}
}
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import { Input,Checkbox} from "antd"; import { Input,Checkbox,Tooltip} from "antd";
import StoreService from "@/domains/store-domain/storeService"; import StoreService from "@/domains/store-domain/storeService";
import User from '@/common/js/user'; import User from '@/common/js/user';
import WWOpenDataCom from '@/components/WWOpenDataCom'; import WWOpenDataCom from '@/components/WWOpenDataCom';
import $ from 'jquery'; import $ from 'jquery';
import _ from 'underscore';
import './SearchUser.less' import './SearchUser.less'
const { Search } = Input; const { Search } = Input;
function SearchUser(props) { function SearchUser(props) {
...@@ -21,9 +22,17 @@ function SearchUser(props) { ...@@ -21,9 +22,17 @@ function SearchUser(props) {
} }
function selectuser(e,item){ function selectuser(e,item){
if(e.target.checked){ if(e.target.checked){
let _record = [] let _record = props.selectUserList
_record.push(item) _record.push(item)
props.onSelect(_record,'user') props.onSelect(_record,'user')
}else{
let _record = props.selectUserList
_record.map((_item,index)=>{
if(item.userId === item.userId){
_record.splice(index,1)
}
})
props.onSelect(_record,'user')
} }
} }
function selectDep(e,item){ function selectDep(e,item){
...@@ -41,21 +50,27 @@ function SearchUser(props) { ...@@ -41,21 +50,27 @@ function SearchUser(props) {
}; };
} }
function handleDepName(depArray){
const depArrayDom = depArray.map((item, index) => {
return <span><WWOpenDataCom type="departmentName" openid={item}/></span>
});
return depArrayDom;
};
return ( return (
<div className="search-user" style={{width:'300px'}} id="search-user"> <div className="search-user" style={{width:'300px'}} id="search-user">
<Search {/* <Search
placeholder='搜索成员' placeholder='搜索成员'
enterButton={<span className="icon iconfont">&#xe832;</span>} enterButton={<span className="icon iconfont">&#xe832;</span>}
onFocus={(e)=>{onFocus(e)}} onFocus={(e)=>{onFocus(e)}}
onChange={(e)=>{onChange(e)}} onChange={(e)=>{onChange(e)}}
className="search-input-item" className="search-input-item"
// onBlur={()=>{onBlur()}} // onBlur={()=>{onBlur()}}
/> /> */}
{dropDownVisible && {dropDownVisible &&
<div className="drop-down"> <div className="drop-down">
<div className="drop-down__list"> <div className="drop-down__list">
{props.data.departmentUserVOList && {props.data.departmentUserVOList &&
<div> ( props.data.departmentUserVOList.length>0 && <div className="drop-down__item-user">
<div className="drop-down__item__title"> <div className="drop-down__item__title">
员工 员工
</div> </div>
...@@ -63,17 +78,19 @@ function SearchUser(props) { ...@@ -63,17 +78,19 @@ function SearchUser(props) {
<div> <div>
{props.data.departmentUserVOList.map((item,index)=>{ {props.data.departmentUserVOList.map((item,index)=>{
return <div> return <div>
<Checkbox onChange={(e)=>{selectuser(e,item)}} > <Checkbox onChange={(e)=>{selectuser(e,item)}} checked={_.pluck(props.selectUserList, 'userId').indexOf(item.userId)=== -1?false:true}>
<div className="drop-down__item__con__item"> <div className="drop-down__item__con__item">
<div className="drop-down__item__con__item__left"> <div className="drop-down__item__con__item__left">
<span className="icon iconfont title-icon">&#xe603;</span> <span className="icon iconfont title-icon">&#xe603;</span>
<WWOpenDataCom type="userName" openid={item.userName}/> <WWOpenDataCom type="userName" openid={item.userName}/>
</div> </div>
<div className="drop-down__item__con__item__right"> <div className="drop-down__item__con__item__right">
{item.depNamesList.map((_item,index)=>{ <Tooltip title={<div>{handleDepName(item.depNamesList)}</div>} placement='top' arrowPointAtCenter>
return <span> <WWOpenDataCom type="departmentName" openid={_item}/>{index<(item.depNamesList.length -1)?';':''}</span> {item.depNamesList.map((_item,index)=>{
}) return <span> <WWOpenDataCom type="departmentName" openid={_item}/>{index<(item.depNamesList.length -1)?';':''}</span>
} })
}
</Tooltip>
</div> </div>
</div> </div>
</Checkbox> </Checkbox>
...@@ -82,11 +99,11 @@ function SearchUser(props) { ...@@ -82,11 +99,11 @@ function SearchUser(props) {
} }
</div> </div>
</div> </div>
</div> </div>)
} }
{props.data.departmentVOList && {props.data.departmentVOList &&
<div> (props.data.departmentVOList.length>0 && <div>
<div className="drop-down__item__title"> <div className="drop-down__item__title drop-down__item__title-dep">
部门 部门
</div> </div>
<div className="drop-down__item__con"> <div className="drop-down__item__con">
...@@ -104,10 +121,21 @@ function SearchUser(props) { ...@@ -104,10 +121,21 @@ function SearchUser(props) {
} }
</div> </div>
</div> </div>
</div> </div>)
} }
{(!props.data.departmentUserVOList && !props.data.departmentVOList)&& {(!props.data.departmentUserVOList && !props.data.departmentVOList)&&
<div>暂无数据</div> <div className="empty-con">
<img src="https://image.xiaomaiketang.com/xm/wRDrb2pJFb.png" className="empty-img"/>
<div className="empty-text">暂无数据</div>
</div>
}
{ (props.data.departmentUserVOList && props.data.departmentVOList) &&(
(props.data.departmentUserVOList.length === 0 && props.data.departmentVOList.length ===0) &&
<div className="empty-con">
<img src="https://image.xiaomaiketang.com/xm/wRDrb2pJFb.png" className="empty-img"/>
<div className="empty-text">暂无数据</div>
</div>
)
} }
</div> </div>
</div> </div>
......
...@@ -10,14 +10,30 @@ ...@@ -10,14 +10,30 @@
box-shadow: 0px 2px 15px 6px rgba(0, 0, 0, 0.05); box-shadow: 0px 2px 15px 6px rgba(0, 0, 0, 0.05);
border-radius:2px; border-radius:2px;
width:270px; width:270px;
// .drop-down__item-user{
// margin-bottom:30px;
// }
.drop-down__item__title{
font-size:14px;
color:#666;
margin-bottom:14px;
}
.ant-checkbox-wrapper{ .ant-checkbox-wrapper{
width:100%; width:100%;
.drop-down__item__con__item{ .drop-down__item__con__item{
margin-bottom:24px;
display:flex; display:flex;
width:220px; width:220px;
justify-content:space-between; justify-content:space-between;
color:#333; color:#333;
font-size:14px; font-size:14px;
.drop-down__item__con__item__left{
.title-icon{
color:#999;
margin-right:3px;
}
}
.drop-down__item__con__item__right{ .drop-down__item__con__item__right{
width:84px; width:84px;
text-align:right; text-align:right;
...@@ -28,5 +44,15 @@ ...@@ -28,5 +44,15 @@
} }
} }
} }
.empty-con{
text-align:center;
.empty-img{
width:150px;
height:150px;
}
.empty-text{
color:#666;
}
}
} }
} }
\ No newline at end of file
...@@ -17,7 +17,7 @@ import { DepType } from "@/domains/store-domain/constants"; ...@@ -17,7 +17,7 @@ import { DepType } from "@/domains/store-domain/constants";
import StoreService from "@/domains/store-domain/storeService"; import StoreService from "@/domains/store-domain/storeService";
import SearchUser from "../components/SearchUser" import SearchUser from "../components/SearchUser"
import WWOpenDataCom from '@/components/WWOpenDataCom'; import WWOpenDataCom from '@/components/WWOpenDataCom';
import './ChooseMembersModal.less'; import './NewChooseMembersModal.less';
import _ from 'underscore'; import _ from 'underscore';
const { Search } = Input; const { Search } = Input;
...@@ -57,7 +57,7 @@ class NewChooseMembersModal extends React.Component { ...@@ -57,7 +57,7 @@ class NewChooseMembersModal extends React.Component {
<div className='avatar'> <div className='avatar'>
<span className="icon iconfont avatar-icon">&#xe84a;</span> <span className="icon iconfont avatar-icon">&#xe84a;</span>
<Tooltip title={<WWOpenDataCom type="userName" openid={userName}/>}> <Tooltip title={<WWOpenDataCom type="userName" openid={userName}/>}>
<span className='userImg'> <span className='userName'>
<WWOpenDataCom type="userName" openid={userName}/> <WWOpenDataCom type="userName" openid={userName}/>
{/* {userName} */} {/* {userName} */}
</span> </span>
...@@ -127,7 +127,6 @@ class NewChooseMembersModal extends React.Component { ...@@ -127,7 +127,6 @@ class NewChooseMembersModal extends React.Component {
} }
_item.enterpriseVisibleUserId = item.enterpriseUserId; _item.enterpriseVisibleUserId = item.enterpriseUserId;
_item.departmentId = this.props.selectDep.id; _item.departmentId = this.props.selectDep.id;
} }
return _item return _item
}) })
...@@ -138,6 +137,7 @@ class NewChooseMembersModal extends React.Component { ...@@ -138,6 +137,7 @@ class NewChooseMembersModal extends React.Component {
} }
Service.Hades('public/hades/addBatchUserAndDepartmentStoreCustomer', _params).then((res) => { Service.Hades('public/hades/addBatchUserAndDepartmentStoreCustomer', _params).then((res) => {
this.handleClose(); this.handleClose();
message.success('添加成功')
this.props.onConfirm(); this.props.onConfirm();
}) })
} }
...@@ -256,7 +256,7 @@ class NewChooseMembersModal extends React.Component { ...@@ -256,7 +256,7 @@ class NewChooseMembersModal extends React.Component {
confirmSearchSelect=(record,type)=>{ confirmSearchSelect=(record,type)=>{
const { selectUserList } = this.state; const { selectUserList } = this.state;
if(type==='user'){ if(type==='user'){
this.setState({selectUserList:[...selectUserList,...record]}); this.setState({selectUserList:[...record]});
}else{ }else{
let _list = []; let _list = [];
if(record.departmentUserVOList){ if(record.departmentUserVOList){
...@@ -267,20 +267,6 @@ class NewChooseMembersModal extends React.Component { ...@@ -267,20 +267,6 @@ class NewChooseMembersModal extends React.Component {
console.log('selectUserList',this.state.selectUserList); console.log('selectUserList',this.state.selectUserList);
}); });
} }
// }else{
// const params = {
// depType:this.props.treeDepType,
// enterpriseId: User.getEnterpriseId(),
// source: 0,
// storeId: User.getStoreId(),
// userId: User.getUserId(),
// departmentId:record.id
// }
// StoreService.getStoreCustomerAndDepNamePage(params).then((res) => {
// const { records = []} = res.result;
// this.setState({selectUserList:[...selectUserList,...records]});
// });
// }
} }
render() { render() {
...@@ -321,7 +307,7 @@ class NewChooseMembersModal extends React.Component { ...@@ -321,7 +307,7 @@ class NewChooseMembersModal extends React.Component {
enterButton={<span className="icon iconfont">&#xe832;</span>} enterButton={<span className="icon iconfont">&#xe832;</span>}
/> */} /> */}
{/* {this.Complete()} */} {/* {this.Complete()} */}
<SearchUser onChange={(value)=>{this.getCompleteOptionData(value)}} data={searchUserResultList} onSelect={(record,type)=>{this.confirmSearchSelect(record,type)}}/> <SearchUser onChange={(value)=>{this.getCompleteOptionData(value)}} data={searchUserResultList} onSelect={(record,type)=>{this.confirmSearchSelect(record,type)}} selectUserList={selectUserList}/>
<div className='container-left-body-table'> <div className='container-left-body-table'>
<MemberTree departmentId={id} treeDepType={treeDepType} nowTreeDepType={addDepType} onSelect={(record)=>{this.treeSelect(record)}} selectUserList={selectUserList} type={type}/> <MemberTree departmentId={id} treeDepType={treeDepType} nowTreeDepType={addDepType} onSelect={(record)=>{this.treeSelect(record)}} selectUserList={selectUserList} type={type}/>
</div> </div>
......
.choose-member-modal {
.member-container{
display: flex;
height: 417px;
.container-left{
width: 50%;
padding-right: 10px;
margin-left: 10px;
.container-left-header{
margin-bottom: 12px;
}
.container-left-body{
border: 1px solid #E9E9E9;
height: 100%;
.ant-table-thead > tr > th {
font-weight:400!important;
}
.search{
width: 305px;
padding: 7px 7px;
}
.container-left-body-table{
width: 300px;
height: 330px;
overflow: scroll;
.ant-table {
border: none;
min-height: 250px !important;
.ant-table-header{
margin-bottom: -7px !important;
>table > .ant-table-thead > tr > th {
background-color: #fff !important;
}
}
.ant-table-tbody{
>tr {
>td {
border-bottom: none;
background-color: #fff !important;
padding: 11px 0!important;
}
&:hover {
>td {
background: #F3F6FA !important;
}
}
}
}
}
.ant-empty-normal {
margin: 80px 0 !important;
}
.avatar{
display: flex;
align-items: center;
.avatar-icon {
font-size:14px;
color:#999;
margin-right: 6px;
}
.userName {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size:14px;
color:#333;
}
}
}
}
}
.container-right{
width: 50%;
border: 1px solid #E9E9E9;
.span-left{
line-height: 45px;
margin-left: 10px;
.span-left-l{
color: #2966FF;
cursor: pointer;
}
}
.span-right{
line-height: 45px;
float: right;
margin-right: 10px;
color: #999;
.span-right-l{
color: #2966FF;
cursor: pointer;
}
}
.container-right-body{
min-height:376px;
border-top: 1px solid #e8e8e8;
.edit {
.edit-icon {
color:#999;
font-size:14px;
}
}
.edit-img{
width: 16px;
height: 16px;
}
.ant-table .ant-table-body {
overflow: auto;
max-height: 376px!important;
}
.ant-table tbody {
tr{
background: #fff;
&:first-child {
display: block;
overflow: hidden;
}
td{
padding:12px 18px !important;
}
}
}
.ant-empty-normal {
margin: 120px 0 !important;
}
.ant-empty {
margin-top: 76px;
}
.avatar{
display: flex;
align-items: center;
.avatar-icon {
font-size:14px;
color:#999;
margin-right: 6px;
}
.userName {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size:14px;
color:#333;
}
}
.ant-table-tbody{
>tr >td {
border-bottom:none;
}
>tr .ant-table-selection-column{
width: 30px !important;
}
}
}
}
}
}
\ No newline at end of file
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
flex-shrink: 0; flex-shrink: 0;
} }
&.selected { &.selected {
background: rgba(255, 183, 20, 0.1); background:rgba(41, 102, 255,0.1);
&::after { &::after {
content: ''; content: '';
position: absolute; position: absolute;
......
...@@ -42,6 +42,7 @@ function CourseCatalogSelect(props) { ...@@ -42,6 +42,7 @@ function CourseCatalogSelect(props) {
return ( return (
<TreeSelect <TreeSelect
className={props.className}
treeNodeLabelProp='categoryName' treeNodeLabelProp='categoryName'
showSearch={showSearch} showSearch={showSearch}
treeNodeFilterProp={treeNodeFilterProp} treeNodeFilterProp={treeNodeFilterProp}
......
...@@ -374,6 +374,7 @@ class AddLive extends React.Component { ...@@ -374,6 +374,7 @@ class AddLive extends React.Component {
CourseService.createLiveCloudCourse(params).then((res) => { CourseService.createLiveCloudCourse(params).then((res) => {
if (res.success) { if (res.success) {
message.success('新建成功'); message.success('新建成功');
routeHook.cancel()
window.RCHistory.push({ window.RCHistory.push({
pathname: `/live-course`, pathname: `/live-course`,
}); });
...@@ -389,6 +390,7 @@ class AddLive extends React.Component { ...@@ -389,6 +390,7 @@ class AddLive extends React.Component {
CourseService.updateLiveCloudCourse(params).then((res) => { CourseService.updateLiveCloudCourse(params).then((res) => {
if (res.success) { if (res.success) {
message.success('更新成功'); message.success('更新成功');
routeHook.cancel()
window.RCHistory.push({ window.RCHistory.push({
pathname: `/live-course`, pathname: `/live-course`,
}); });
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
.title { .title {
font-size: 16px; font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC; font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500; font-weight: 600;
color: #333333; color: #333333;
margin-bottom: 16px; margin-bottom: 16px;
position: relative; position: relative;
...@@ -84,6 +84,7 @@ ...@@ -84,6 +84,7 @@
background: #ffffff; background: #ffffff;
border: 1px solid #e8e8e8; border: 1px solid #e8e8e8;
display: flex; display: flex;
justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 32px; margin-bottom: 32px;
.item-block { .item-block {
......
...@@ -106,8 +106,9 @@ class AddLiveBasic extends React.Component { ...@@ -106,8 +106,9 @@ class AddLiveBasic extends React.Component {
<span className='label'> <span className='label'>
<span className='require'>*</span>课程名称: <span className='require'>*</span>课程名称:
</span> </span>
<div id="courseName" style={_.find(this.props.exItems,(item)=>{return item === "courseName"})?{border:"1px solid red",display:"inline-block"}:{display:"inline-block"}}> <div id="courseName" style={{display:"inline-block"}}>
<Input <Input
className={_.find(this.props.exItems,(item)=>{return item === "courseName"})?"err":""}
value={courseName} value={courseName}
placeholder={`请输入直播名称(${this.state.courseNameLimit}字以内)`} placeholder={`请输入直播名称(${this.state.courseNameLimit}字以内)`}
maxLength={this.state.courseNameLimit} maxLength={this.state.courseNameLimit}
...@@ -147,8 +148,9 @@ class AddLiveBasic extends React.Component { ...@@ -147,8 +148,9 @@ class AddLiveBasic extends React.Component {
<span className='label'> <span className='label'>
<span className='require'>*</span>课程分类: <span className='require'>*</span>课程分类:
</span> </span>
<div style={_.find(this.props.exItems,(item)=>{return item === "categoryId"})?{border:"1px solid red",display:"inline-block"}:{display:"inline-block"}}> <div id="categoryId" style={{display:"inline-block"}}>
<CourseCatalogSelect <CourseCatalogSelect
className={_.find(this.props.exItems,(item)=>{return item === "categoryId"})?"err":""}
value={categoryId} value={categoryId}
onChange={(value, label) => { onChange={(value, label) => {
this.handleChangeCatalogList(value, label) this.handleChangeCatalogList(value, label)
......
...@@ -66,6 +66,30 @@ ...@@ -66,6 +66,30 @@
.course-catalog { .course-catalog {
margin: 20px 0 0 14px; margin: 20px 0 0 14px;
} }
//输入框异常项
.err.ant-input:hover {
border-color: #FF4F4F;
}
.err.ant-input:focus {
border-color: #FF4F4F !important;
box-shadow: 0 0 0 2px rgba(255,0,0,0.2);
}
.err.ant-input {
border-color: #FF4F4F;
}
//下拉选择异常项
.err.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector {
border-color: #FF4F4F;
box-shadow: 0 0 0 2px rgba(255,0,0,0.2);
}
.err.ant-select:not(.ant-select-disabled):hover {
.ant-select-selector {
border-color: #FF4F4F;
}
}
.err.ant-select:not(.ant-select-customize-input) .ant-select-selector {
border-color: #FF4F4F;
}
} }
.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled) { .ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled) {
font-weight: normal !important; font-weight: normal !important;
......
...@@ -209,8 +209,9 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -209,8 +209,9 @@ export default function AddLiveClassInfoWorkWX(props) {
<div className="AddLiveClassInfoWorkWX"> <div className="AddLiveClassInfoWorkWX">
<div className="begin-time item"> <div className="begin-time item">
<span className="label"><span className="require">*</span>开始时间:</span> <span className="label"><span className="require">*</span>开始时间:</span>
<div id="startTime" style={_.find(props.exItems,(item)=>{return item === "startTime"})?{border:"1px solid red",display:"inline-block"}:{display:"inline-block"}}> <div id="startTime" style={{display:"inline-block"}}>
<DatePicker <DatePicker
className={_.find(props.exItems,(item)=>{return item === "startTime"})?"err":""}
placeholder="请选择开始日期" placeholder="请选择开始日期"
value={beginDate===0?undefined:moment(beginDate)} value={beginDate===0?undefined:moment(beginDate)}
onChange={onBeginDateChange} onChange={onBeginDateChange}
...@@ -219,6 +220,7 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -219,6 +220,7 @@ export default function AddLiveClassInfoWorkWX(props) {
style={{width:"180px"}} style={{width:"180px"}}
/> />
<TimePicker <TimePicker
className={_.find(props.exItems,(item)=>{return item === "startTime"})?"err":""}
value={beginTime===0?undefined:moment(beginTime)} value={beginTime===0?undefined:moment(beginTime)}
onChange={onBeginTimeChange} onChange={onBeginTimeChange}
onOk={onBeginTimeOK} onOk={onBeginTimeOK}
...@@ -226,6 +228,7 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -226,6 +228,7 @@ export default function AddLiveClassInfoWorkWX(props) {
format="HH:mm" format="HH:mm"
style={{width:"120px"}} style={{width:"120px"}}
/> />
<div style={{position:"absolute"}}></div>
</div> </div>
</div> </div>
...@@ -234,8 +237,9 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -234,8 +237,9 @@ export default function AddLiveClassInfoWorkWX(props) {
cusTime || props.type === "edit" ? ( cusTime || props.type === "edit" ? (
<> <>
<span className="label"><span className="require">*</span>结束时间:</span> <span className="label"><span className="require">*</span>结束时间:</span>
<div id="endTime" style={_.find(props.exItems,(item)=>{return item === "endTime"})?{border:"1px solid red",display:"inline-block"}:{display:"inline-block"}}> <div id="endTime" style={{display:"inline-block"}}>
<DatePicker <DatePicker
className={_.find(props.exItems,(item)=>{return item === "endTime"})?"err":""}
placeholder="请选择结束日期" placeholder="请选择结束日期"
value={endDate===0?undefined:moment(endDate)} value={endDate===0?undefined:moment(endDate)}
onChange={onEndDateChange} onChange={onEndDateChange}
...@@ -246,6 +250,7 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -246,6 +250,7 @@ export default function AddLiveClassInfoWorkWX(props) {
style={{width:"180px"}} style={{width:"180px"}}
/> />
<TimePicker <TimePicker
className={_.find(props.exItems,(item)=>{return item === "endTime"})?"err":""}
value={endTime === 0?moment().add(5,'minutes'):moment(endTime)} value={endTime === 0?moment().add(5,'minutes'):moment(endTime)}
onChange={onEndTimeChange} onChange={onEndTimeChange}
onOk={onEndTimeOK} onOk={onEndTimeOK}
...@@ -258,7 +263,7 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -258,7 +263,7 @@ export default function AddLiveClassInfoWorkWX(props) {
) : ( ) : (
<> <>
<span className="label"><span className="require">*</span>时长:</span> <span className="label"><span className="require">*</span>时长:</span>
<Select onChange={onDurationChange} defaultValue={60} style={{width:"140px"}} getPopupContainer={()=> document.getElementById("odqboqwdq")}> <Select onChange={onDurationChange} defaultValue={60} style={{width:"300px"}} getPopupContainer={()=> document.getElementById("odqboqwdq")} className="eerr">
<Option value={30}>0.5小时</Option> <Option value={30}>0.5小时</Option>
<Option value={60}>1.0小时</Option> <Option value={60}>1.0小时</Option>
<Option value={120}>2.0小时</Option> <Option value={120}>2.0小时</Option>
...@@ -272,15 +277,17 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -272,15 +277,17 @@ export default function AddLiveClassInfoWorkWX(props) {
</div> </div>
<div className="teacher item" id="ieouwowerwe"> <div className="teacher item" id="ieouwowerwe">
<span className="label"><span className="require">*</span>讲师:</span> <span className="label"><span className="require">*</span>讲师:</span>
<div id="teacherId" style={{display:"inline-block"}}>
<Select <Select
value={teacherId} value={teacherId}
onChange={onTeacherChange} onChange={onTeacherChange}
style={_.find(props.exItems,(item)=>{return item === "teacherId"})?{width:"240px",border:"1px solid red"}:{width:"240px"}} className={_.find(props.exItems,(item)=>{return item === "teacherId"})?"err":""}
placeholder="请选择讲师" placeholder="请选择讲师"
disabled={!props.isEdit ? true: false} disabled={!props.isEdit ? true: false}
filterOption={(input, option) => option} filterOption={(input, option) => option}
getPopupContainer={()=> document.getElementById("ieouwowerwe")} getPopupContainer={()=> document.getElementById("ieouwowerwe")}
style={{width:"300px"}}
showSearch showSearch
allowClear allowClear
onPopupScroll={handleScrollTeacherList} onPopupScroll={handleScrollTeacherList}
...@@ -314,13 +321,14 @@ export default function AddLiveClassInfoWorkWX(props) { ...@@ -314,13 +321,14 @@ export default function AddLiveClassInfoWorkWX(props) {
}) })
} }
</Select> </Select>
</div>
</div> </div>
<div className="remind-time item" id="jfjfiemc"> <div className="remind-time item" id="jfjfiemc">
<span className="label"><span className="require">*</span>提醒时间:</span> <span className="label"><span className="require">*</span>提醒时间:</span>
<Select <Select
onChange={onRemindChange} onChange={onRemindChange}
placeholder={"15分钟前"} placeholder={"15分钟前"}
style={{width:"130px"}} style={{width:"180px"}}
getPopupContainer={()=> document.getElementById("jfjfiemc")} getPopupContainer={()=> document.getElementById("jfjfiemc")}
> >
<Option value={0}></Option> <Option value={0}></Option>
......
...@@ -17,11 +17,61 @@ ...@@ -17,11 +17,61 @@
color: red; color: red;
} }
} }
//日期时间选择异常项
.err.ant-picker-focused {
border-color: #FF4F4F;
box-shadow: 0 0 0 2px rgba(255,0,0,0.2);
}
.err.ant-picker:hover {
border-color: #FF4F4F;
}
.err.ant-picker {
border-color: #FF4F4F;
}
} }
.introduce { .introduce {
display: flex; display: flex;
} }
// .ant-select:not(.ant-select-disabled):hover .ant-select-selector{ .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {
// border: none; color: #2966FF;
}
// .eerr .ant-select-focused:not(.ant-select-disabled) .ant-select:not(.ant-select-customize-input) {
// .ant-select-selector {
// border-color: red;
// box-shadow: 0 0 0 2px rgba(255,0,0,0.2);
// }
// } // }
// .eerr .ant-select:not(.ant-select-disabled):hover {
// .ant-select-selector {
// border-color: red;
// }
// }
//下拉选择异常项
.err.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector {
border-color: #FF4F4F;
box-shadow: 0 0 0 2px rgba(255,0,0,0.2);
}
.err.ant-select:not(.ant-select-disabled):hover {
.ant-select-selector {
border-color: #FF4F4F;
}
}
.err.ant-select:not(.ant-select-customize-input) .ant-select-selector {
border-color: #FF4F4F;
}
//输入框异常项
.err.ant-input:hover {
border-color: #FF4F4F;
}
.err.ant-input:focus {
border-color: #FF4F4F;
box-shadow: 0 0 0 2px rgba(255,0,0,0.2);
}
.err.ant-input {
border-color: #FF4F4F;
}
} }
\ No newline at end of file
...@@ -17,7 +17,7 @@ import { LIVE_SHARE } from '@/domains/course-domain/constants'; ...@@ -17,7 +17,7 @@ import { LIVE_SHARE } from '@/domains/course-domain/constants';
import CourseService from '@/domains/course-domain/CourseService'; import CourseService from '@/domains/course-domain/CourseService';
import { QuestionCircleOutlined } from '@ant-design/icons'; import { QuestionCircleOutlined } from '@ant-design/icons';
import { Dropdown, message, Badge, Modal, Switch, Tooltip, Menu } from 'antd'; import { Dropdown, message, Badge, Modal, Switch, Tooltip, Menu } from 'antd';
import React from 'react'; import React, { Fragment } from 'react';
import { Route, withRouter } from 'react-router-dom'; import { Route, withRouter } from 'react-router-dom';
import _ from 'underscore'; import _ from 'underscore';
import DataList from '../DataList/DataList'; import DataList from '../DataList/DataList';
...@@ -131,7 +131,7 @@ class LiveCourseList extends React.Component { ...@@ -131,7 +131,7 @@ class LiveCourseList extends React.Component {
columns = [ columns = [
{ {
title: '直播课', title: '直播课',
width: '23%', width: '260px',
key: 'course', key: 'course',
fixed: 'left', fixed: 'left',
dataIndex: 'courseName', dataIndex: 'courseName',
...@@ -217,7 +217,7 @@ class LiveCourseList extends React.Component { ...@@ -217,7 +217,7 @@ class LiveCourseList extends React.Component {
}, },
{ {
title: '上课状态', title: '上课状态',
width: '10%', width: '115px',
key: 'couseCatalog', key: 'couseCatalog',
dataIndex: 'couseCatalog', dataIndex: 'couseCatalog',
render: (val, item) => { render: (val, item) => {
...@@ -248,7 +248,7 @@ class LiveCourseList extends React.Component { ...@@ -248,7 +248,7 @@ class LiveCourseList extends React.Component {
}, },
{ {
title: '课件管理', title: '课件管理',
width: '8%', width: '75px',
key: 'courseware', key: 'courseware',
dataIndex: 'courseware', dataIndex: 'courseware',
render: (val, item) => { render: (val, item) => {
...@@ -301,7 +301,7 @@ class LiveCourseList extends React.Component { ...@@ -301,7 +301,7 @@ class LiveCourseList extends React.Component {
</Tooltip> </Tooltip>
</span> </span>
), ),
width: '9%', width: '100px',
key: 'shelfState', key: 'shelfState',
dataIndex: 'shelfState', dataIndex: 'shelfState',
render: (val, item, index) => { render: (val, item, index) => {
...@@ -317,7 +317,7 @@ class LiveCourseList extends React.Component { ...@@ -317,7 +317,7 @@ class LiveCourseList extends React.Component {
}, },
{ {
title: '创建时间', title: '创建时间',
width: '9%', width: '170px',
key: 'created', key: 'created',
dataIndex: 'created', dataIndex: 'created',
sorter: true, sorter: true,
...@@ -366,30 +366,53 @@ class LiveCourseList extends React.Component { ...@@ -366,30 +366,53 @@ class LiveCourseList extends React.Component {
{(item.courseState === 'UN_START' || item.courseState === 'STARTING') && {(item.courseState === 'UN_START' || item.courseState === 'STARTING') &&
(item.teacherId === User.getUserId() || _.pluck(item.admins, 'adminId').includes(User.getUserId())) && ( (item.teacherId === User.getUserId() || _.pluck(item.admins, 'adminId').includes(User.getUserId())) && (
<> <>
<div {
key='enter_live_room1' isMac() && item.thirdPartType === "WECHAT" ? (
className='operate__item' <Tooltip title="请使用windows电脑进入直播间" placement="left">
onClick={() => { <div style={{fontSize:"14px",color:"#999999"}}>
this.handleEnterLiveRoom(item) 进入直播间
}}> </div>
进入直播间 </Tooltip>
</div>
):(
<div
key='enter_live_room1'
className='operate__item'
onClick={() => {
this.handleEnterLiveRoom(item)
}}>
进入直播间
</div>
)
}
<span className='operate__item split' key='view_play_back_split'> <span className='operate__item split' key='view_play_back_split'>
{' '} {' '}
|{' '} |{' '}
</span> </span>
</> </>
)} )}
{item.courseState === 'FINISH' && item.haveRecord === 'YES' && ( {item.courseState === 'FINISH' && (
<> <>
<div {
key='view_play_back' item.haveRecord === 'YES' ? (
className='operate__item' <div
onClick={() => { key='view_play_back'
this.handleViewPlayBack(item) className='operate__item'
}}> onClick={() => {
查看回放 this.handleViewPlayBack(item)
</div> }}>
查看回放
</div>
) : (
<Tooltip title="该直播未录制回放" placement="left">
<div style={{fontSize:"14px",color:"#999999"}}>
查看回放
</div>
</Tooltip>
)
}
<span className='operate__item split' key='view_play_back_split'> <span className='operate__item split' key='view_play_back_split'>
{' '} {' '}
|{' '} |{' '}
...@@ -440,7 +463,7 @@ class LiveCourseList extends React.Component { ...@@ -440,7 +463,7 @@ class LiveCourseList extends React.Component {
columns = [ columns = [
{ {
title: '直播课', title: '直播课',
width: '25%', width: '260px',
key: 'course', key: 'course',
dataIndex: 'courseName', dataIndex: 'courseName',
render: (val, record) => { render: (val, record) => {
...@@ -568,7 +591,7 @@ class LiveCourseList extends React.Component { ...@@ -568,7 +591,7 @@ class LiveCourseList extends React.Component {
}, },
{ {
title: '创建时间', title: '创建时间',
width: '9%', width: '170px',
key: 'created', key: 'created',
dataIndex: 'created', dataIndex: 'created',
sorter: true, sorter: true,
...@@ -634,79 +657,82 @@ class LiveCourseList extends React.Component { ...@@ -634,79 +657,82 @@ class LiveCourseList extends React.Component {
renderMoreOperate = (item) => { renderMoreOperate = (item) => {
let now = new Date().getTime() let now = new Date().getTime()
return ( if (item.thirdPartType === "WECHAT") {
<Menu return (
onClick={({key})=> { <Menu
if (key === "link") { onClick={({key})=> {
this.handleRelatedModalShow(item) if (key === "link") {
} else if (key === "edit") { this.handleRelatedModalShow(item)
this.toEditCoursePage(item) } else if (key === "edit") {
} else if (key === "del") { this.toEditCoursePage(item)
this.handleDelete(item) } else if (key === "del") {
} this.handleDelete(item)
}} }
> }}
{ >
item.thirdPartType === "WECHAT" && {
<Tooltip placement="left" title="企微直播,暂不支持关联培训任务"> item.thirdPartType === "WECHAT" &&
<Menu.Item style={{color:"#999999"}}> <Tooltip placement="left" title="企微直播,暂不支持关联培训任务">
<Menu.Item style={{color:"#999999"}}>
关联培训计划
</Menu.Item>
</Tooltip>
}
{
item.thirdPartType !== "WECHAT" &&
<Menu.Item disabled={!(User.getUserRole() === 'CloudManager' || User.getUserRole() === 'StoreManager')} key="link">
关联培训计划 关联培训计划
</Menu.Item> </Menu.Item>
</Tooltip> }
} {
{ (item.courseState === "STARTING" || item.courseState === "FINISH") &&
item.thirdPartType !== "WECHAT" && <Tooltip placement="left" title={`${item.courseState === "STARTING"?"直播已开始,不能编辑":"直播已结束,不能编辑"}`}>
<Menu.Item disabled={!(User.getUserRole() === 'CloudManager' || User.getUserRole() === 'StoreManager')} key="link"> <Menu.Item style={{color:"#999999"}}>
关联培训计划 编辑
</Menu.Item> </Menu.Item>
} </Tooltip>
{ }
(item.courseState === "STARTING" || item.courseState === "FINISH") && {
<Tooltip placement="left" title={`${item.courseState === "STARTING"?"直播已开始,不能编辑":"直播已结束,不能编辑"}`}> item.courseState !== "STARTING" && item.courseState !== "FINISH" &&
<Menu.Item style={{color:"#999999"}}> <Menu.Item key="edit">
编辑 编辑
</Menu.Item> </Menu.Item>
</Tooltip> }
} {
{ (item.courseState === "STARTING" || ((now > item.startTime && now < item.endTime) && item.courseState !== "FINISH")) &&
item.courseState !== "STARTING" && item.courseState !== "FINISH" && <Tooltip placement="left" title={item.courseState === "STARTING"?"直播进行中,不能删除":"已到预定时间,无法删除"}>
<Menu.Item key="edit"> <Menu.Item style={{color:"#999999"}}>
编辑 删除
</Menu.Item> </Menu.Item>
} </Tooltip>
{ }
(item.courseState === "STARTING" || ((now > item.startTime && now < item.endTime) && item.courseState !== "FINISH")) && {
<Tooltip placement="left" title="直播进行中,不能删除"> (item.courseState !== "STARTING" && ((now < item.startTime || now > item.endTime) || item.courseState === "FINISH")) &&
<Menu.Item style={{color:"#999999"}}> <Menu.Item key="del">
删除
</Menu.Item>
}
</Menu>
)
}
return (
<div className='live-course-more-menu'>
{(User.getUserRole() === 'CloudManager' || User.getUserRole() === 'StoreManager') && (
<div className='operate__item' onClick={() => this.handleRelatedModalShow(item)}>
关联培训计划
</div>
)}
<div className='operate__item' onClick={() => this.toEditCoursePage(item)}>
编辑
</div>
{item.courseState !== 'STARTING' && (
<div className='operate__item' onClick={() => this.handleDelete(item)}>
删除 删除
</Menu.Item> </div>
</Tooltip> )}
} </div>
{ );
(item.courseState !== "STARTING" && ((now < item.startTime || now > item.endTime) || item.courseState === "FINISH")) &&
<Menu.Item key="del">
删除
</Menu.Item>
}
</Menu>
)
// return (
// <div className='live-course-more-menu'>
// {(User.getUserRole() === 'CloudManager' || User.getUserRole() === 'StoreManager') && (
// <div className='operate__item' onClick={() => this.handleRelatedModalShow(item)}>
// 关联培训计划
// </div>
// )}
// <div className='operate__item' onClick={() => this.toEditCoursePage(item)}>
// 编辑
// </div>
// {item.courseState !== 'STARTING' && (
// <div className='operate__item' onClick={() => this.handleDelete(item)}>
// 删除
// </div>
// )}
// </div>
// );
}; };
handleDelete = (record) => { handleDelete = (record) => {
return confirm({ return confirm({
...@@ -767,7 +793,12 @@ class LiveCourseList extends React.Component { ...@@ -767,7 +793,12 @@ class LiveCourseList extends React.Component {
if (!isWorkWx()) { if (!isWorkWx()) {
Modal.warning({ Modal.warning({
title: '提示', title: '提示',
content: "请使用企业微信进入直播间" content: (
<Fragment>
<div>请使用企业微信进入直播间</div>
<div style={{color:"#999999"}}>备注:Mac版企业微信暂不支持进入直播间</div>
</Fragment>
)
}) })
return return
} }
...@@ -864,7 +895,7 @@ class LiveCourseList extends React.Component { ...@@ -864,7 +895,7 @@ class LiveCourseList extends React.Component {
}) })
return return
} }
if (item.startTime + 60*60*1000 < new Date().getTime()) { if (item.startTime + 15*24*60*60*1000 < new Date().getTime()) {
Modal.warning({ Modal.warning({
title: '提示', title: '提示',
content: "该直播课的回放视频已失效", content: "该直播课的回放视频已失效",
......
...@@ -60,10 +60,12 @@ ...@@ -60,10 +60,12 @@
.title__state { .title__state {
min-width: 40px; min-width: 40px;
height: 17px; height: 17px;
padding: 0px 8px; padding-left: 8px;
padding-right: 8px;
border-radius: 10px; border-radius: 10px;
margin-left: 6px; margin-left: 6px;
font-size: 12px; font-size: 12px;
line-height: 17px;
color: #FFF; color: #FFF;
background-color: #34B88B; background-color: #34B88B;
} }
......
...@@ -16,10 +16,10 @@ import User from '@/common/js/user'; ...@@ -16,10 +16,10 @@ import User from '@/common/js/user';
import BaseService from "@/domains/basic-domain/baseService"; import BaseService from "@/domains/basic-domain/baseService";
import moment from 'moment'; import moment from 'moment';
import { VersionContext, VersionInfo, XMContext } from '@/store/context'; import { VersionContext, VersionInfo, XMContext } from '@/store/context';
import WechatApi from '@/common/js/wechatApi';
import { setStoreGroupPermission, setStorePermission, setStoreGroupList, setStoreList, setWechatLogin } from '@/store/actions/index'; import { setStoreGroupPermission, setStorePermission, setStoreGroupList, setStoreList, setWechatLogin } from '@/store/actions/index';
import Service from "@/common/js/service"; import Service from "@/common/js/service";
import Bus from '@/core/tbus'; import Bus from '@/core/tbus';
import WechatApi from '@/common/js/wechatApi';
const { Footer, Sider, Content } = Layout; const { Footer, Sider, Content } = Layout;
......
...@@ -87,9 +87,9 @@ function ExpirationPopover(props) { ...@@ -87,9 +87,9 @@ function ExpirationPopover(props) {
<div className="title">{props.surplusDayTime === 0 ? "服务已到期" : "服务到期提醒"}</div> <div className="title">{props.surplusDayTime === 0 ? "服务已到期" : "服务到期提醒"}</div>
{ {
showType === 3 ? ( showType === 3 ? (
<div className="tip-text">当前企业购买的小麦企学院服务已于<span style={{ color: "#FF4F4F" }}>{moment(props.endTime).format("YYYY-MM-DD HH:mm:ss")}</span>到期,到期后仍可访问,但功能不可使用,建议尽快续费购买哦~</div> <div className="tip-text">当前企业购买的{`${window.brandName}`}服务已于<span style={{ color: "#FF4F4F" }}>{moment(props.endTime).format("YYYY-MM-DD HH:mm:ss")}</span>到期,到期后仍可访问,但功能不可使用,建议尽快续费购买哦~</div>
) : ( ) : (
<div className="tip-text">当前企业购买的小麦企学院服务 <span style={{ color: "#FF4F4F" }}>仅剩{props.surplusDayTime}</span>(于<span>{moment(props.endTime).format("YYYY-MM-DD")}</span>到期),为了不影响使用,建议尽快续费购买哦~</div> <div className="tip-text">当前企业购买的{`${window.brandName}`}服务 <span style={{ color: "#FF4F4F" }}>仅剩{props.surplusDayTime}</span>(于<span>{moment(props.endTime).format("YYYY-MM-DD")}</span>到期),为了不影响使用,建议尽快续费购买哦~</div>
) )
} }
...@@ -235,9 +235,6 @@ export default class CollegeManagePage extends React.Component { ...@@ -235,9 +235,6 @@ export default class CollegeManagePage extends React.Component {
User.removeToken(); User.removeToken();
User.removeEnterpriseId(); User.removeEnterpriseId();
window.RCHistory.replace('/login'); window.RCHistory.replace('/login');
// User.clearUserInfo();
// const htmlUrl = `${LIVE_SHARE}store/index?id=${User.getCustomerStoreId()||User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`;
// window.location.href = htmlUrl;
}); });
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2019-09-10 18:26:03 * @Date: 2019-09-10 18:26:03
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-09 15:29:46 * @LastEditTime: 2021-08-11 20:26:53
* @Description: * @Description:
*/ */
import React, { useRef, useContext, useEffect, useState } from 'react'; import React, { useRef, useContext, useEffect, useState } from 'react';
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* @Author: 吴文洁 * @Author: 吴文洁
* @Date: 2020-04-29 10:26:32 * @Date: 2020-04-29 10:26:32
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-03 14:34:27 * @LastEditTime: 2021-08-11 20:27:02
* @Description: 内容线路由配置 * @Description: 内容线路由配置
*/ */
import Home from '@/modules/home/Home'; import Home from '@/modules/home/Home';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment