Commit e3535b19 by maolipeng

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

# Conflicts:
#	src/common/js/wechatApi.js
#	src/index.html
#	src/modules/root/CollegeManagePage.jsx
#	src/modules/root/Header.jsx
#	src/routes/config/mainRoutes.tsx
parents dbf813cd f73223bc
......@@ -2,7 +2,7 @@
module.exports = {
isWeiXin() {
const ua = navigator.userAgent.toLowerCase();
return ua.indexOf('micromessenger') > 0;
return (ua.indexOf('micromessenger') > 0) && !(/wxwork/i.test(navigator.userAgent));
},
isWorkWx (){
return /wxwork/i.test(navigator.userAgent)
......
......@@ -2,7 +2,7 @@
* @Author: wufan
* @Date: 2021-05-11 10:21:37
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-10 18:00:56
* @LastEditTime: 2021-07-21 14:25:37
* @Description: 企业微信api
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*
......@@ -36,6 +36,7 @@ export default class WechatApi {
url: params.url,
}).then((result2) => {
const res2 = result2.result;
setTimeout(() => {
this.agentConfig({
corpid: res2.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
agentid: res2.agentid, // 必填,企业微信的应用id (e.g. 1000247)
......@@ -54,6 +55,8 @@ export default class WechatApi {
reject(err);
},
});
}, 500)
});
})
......@@ -150,7 +153,7 @@ export default class WechatApi {
wx.ready(() => {
wx.invoke('startLiving', {
"livingId": id,
}, function(res) {
}, function (res) {
if (res.err_msg === "startLiving:ok") {
resolve(true)
} else {
......@@ -165,8 +168,7 @@ export default class WechatApi {
wx.ready(() => {
wx.invoke('replayLiving', {
"livingId": id,
}, function(res) {
console.log("WorkWXAPI 进入直播间",res)
}, function (res) {
if (res.err_msg === "replayLiving:ok") {
resolve(true)
} else {
......
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: 陈剑宇
* @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
* @Description:
* @FilePath: /wheat-web-demo/src/domains/basic-domain/constants.ts
......
......@@ -3,7 +3,7 @@ export const BRAND: any = process.env.BRAND;
const BrandNameMap: any = {
xiaomai: '小麦企学院',
syoo: '云课堂'
syoo: '商有云课堂'
}
const BrandIconMap: any = {
......@@ -43,7 +43,10 @@ const XF_RWM_MAP: any = {
syoo: 'https://image.xiaomaiketang.com/xm/Z2X2GTmKdj.png'
}
const LiveNameMap: any = {
xiaomai: '小麦直播',
syoo: '商有直播'
}
export const brandName: string = BrandNameMap[BRAND];
......@@ -54,5 +57,6 @@ export const path: string = PATH_MAP[BRAND];
export const live: string = LIVE_SHARE_MAP[BRAND];
export const corpType: string = CorpType_MAP[BRAND];
export const xfrwm: string = XF_RWM_MAP[BRAND]
export const brandLiveName: string = LiveNameMap[BRAND]
window.brandName = BrandNameMap[BRAND];
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2020-08-20 09:21:40
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-11 15:17:56
* @LastEditTime: 2021-08-11 22:50:48
* @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
......
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2020-08-24 12:20:57
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-10 16:37:37
* @LastEditTime: 2021-08-11 20:25:11
* @Description:
* @Copyright: 杭州杰竞科技有限公司 版权所有
-->
......
......@@ -24,6 +24,6 @@
white-space: nowrap;
}
.edit-disable{
color:#666 !important;
color:#CCC !important;
}
}
\ No newline at end of file
......@@ -182,9 +182,6 @@ function EmployeeManage() {
if(record.depNameList.length === 0){
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 <span><WWOpenDataCom type="departmentName" openid={item}/>{index<(record.depNameList.length -1)?';':''}</span>
})}
......
/*
* @Author: your name
* @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
* @Description: In User Settings Edit
* @FilePath: /xiaomai-cloud-class-web/src/modules/college-manage/LimitTip.tsx
......
......@@ -2,7 +2,7 @@
* @Author: wufan
* @Date: 2020-11-30 10:47:38
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-03 16:04:30
* @LastEditTime: 2021-08-11 20:31:26
* @Description: 学员管理页面
* @@Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -11,9 +11,7 @@ import React, { useEffect, useState } from "react";
import { withRouter } from "react-router-dom";
import _ from "underscore";
import {Tabs,Input,Tree,Button} from "antd";
import CustomGroupTabCon from './components/CustomGroupTabCon';
import DepartMentTabCon from './components/DepartMentTabCon';
import PostGroupTabCon from './components/PostGroupTabCon';
import "./NewUsersManagePage.less";
const { TabPane } = Tabs;
......
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);
......@@ -123,7 +123,6 @@ function DepartMentTabCon(props) {
<div className="operate">
{props.currentTab==='departMentTab'?
<span>-</span>
// <div className="operate__item" onClick={()=>delUser('single',item.userId)}>删除</div>
:
(selectDep.depLevel > 0 ?
<div className="operate__item" onClick={()=>delUser('single',item.userId)}>移出</div>
......
import React, { useEffect, useState } from "react";
import React, { useEffect, useState, useRef } from "react";
import { withRouter } from "react-router-dom";
import { Tree, Input, Dropdown, Menu,Button,Modal,message,AutoComplete,Tooltip} from "antd";
import { Tree, Input, Dropdown, Menu, Button, Modal, message, AutoComplete, Tooltip } from "antd";
import AddOrEditPostGroupModal from "../modal/AddOrEditPostGroupModal";
import User from '@/common/js/user'
import StoreService from "@/domains/store-domain/storeService";
......@@ -13,51 +13,59 @@ const { Search } = Input;
const { DirectoryTree } = Tree;
const { Option } = AutoComplete;
function LeftStructureTree(props) {
const {treeType} = props;
const [treeData,setTreeData]=useState([]);
const { treeType } = props;
const [treeData, setTreeData] = useState([]);
const [addOrEditPostGroupShow, setAddOrEditPostGroupShow] = useState(false);
const [postGroupModalLevel, setPostGroupModalLevel] = useState("");
const [operatePostGroupModalType,setOperatePostGroupModalType] = useState("");
const [postGroupModalTitle,setPostGroupModalTitle] = useState("");
const [postGroupModalLable,setPostGroupModalLable] = useState("");
const [operatePostGroupModalType, setOperatePostGroupModalType] = useState("");
const [postGroupModalTitle, setPostGroupModalTitle] = useState("");
const [postGroupModalLable, setPostGroupModalLable] = useState("");
const [postGroupName, setPostGroupName] = useState("");
const [currentGroupData,setCurrentGroupData] = useState({});
const [completeOptions,setCompleteOption] = useState([]);
const [selectedKeys,setSelectedKeys]= useState([]); // 设置选中的部门key值
const [queryName,setQueryName] = useState(''); // 搜索框内的值
const [selctQueryName,setSelctQueryName]= useState(''); // 搜索出结果后最终选择的名字
const [postGroupTreeData,setPostGroupTreeData] = useState([]); // 为了判定创建和编辑时的数据会不会重明
const [open,setOpen]=useState(false);
useEffect(()=>{
const [currentGroupData, setCurrentGroupData] = useState({});
const [completeOptions, setCompleteOption] = useState([]);
const [selectedKeys, setSelectedKeys] = useState([]); // 设置选中的部门key值
const [queryName, setQueryName] = useState(''); // 搜索框内的值
const [selctQueryName, setSelctQueryName] = useState(''); // 搜索出结果后最终选择的名字
const [postGroupTreeData, setPostGroupTreeData] = useState([]); // 为了判定创建和编辑时的数据会不会重明
const [open, setOpen] = useState(false);
const timer = useRef(null)
const queryNameRef = useRef(null)
useEffect(() => {
queryNameRef.current = queryName
}, [
queryName
])
useEffect(() => {
setQueryName(''); //切换tab时搜索置空
setCompleteOption([]);
setOpen(false); //切换tab时搜索的下拉框置为空
getTreeData().then((res)=>{
getTreeData().then((res) => {
const _defaultSelectedKeys = [];
if(res.length > 0){
if (res.length > 0) {
_defaultSelectedKeys.push(res[0].id);
setSelectedKeys(_defaultSelectedKeys);
props.onChangeSelectDep(res[0])
props.searchUserList(res[0],treeType,1);
}else{
props.searchUserList({id:null},treeType,1);
props.searchUserList(res[0], treeType, 1);
} else {
props.searchUserList({ id: null }, treeType, 1);
}
});
},[props.treeType]);
useEffect(()=>{
Bus.bind("addCustomer",(record)=>{addCustomer(record.treeType,record.query)})
},[]);
useEffect(()=>{
Bus.bind("changeTreeData",(record)=>{getTreeData(record.treeType)})
},[]);
}, [props.treeType]);
useEffect(() => {
Bus.bind("addCustomer", (record) => { addCustomer(record.treeType, record.query) })
}, []);
useEffect(() => {
Bus.bind("changeTreeData", (record) => { getTreeData(record.treeType) })
}, []);
const renderTitle = (title) => (
<span className="catalog-title">
{title}
</span>
);
const renderItem = (record,type) => ({
const renderItem = (record, type) => ({
value: record.userName || record.name,
label: (
<div
......@@ -70,19 +78,26 @@ function LeftStructureTree(props) {
type={type}
>
{type === 'user'?
{type === 'user' ?
<div className="search-result-item__left">
<span className="icon iconfont title-icon">&#xe603;</span>
<WWOpenDataCom type="userName" openid={record.userName}/>
<WWOpenDataCom type="userName" openid={record.userName} />
</div>
:
<div className="search-result-item__left"><WWOpenDataCom type="departmentName" openid={record.name}/></div>
<div className="search-result-item__left">
{props.treeType === 'departMentTab' ?
<WWOpenDataCom type="departmentName" openid={record.name} />
:
<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>
{record.depNamesList.map((item, index) => {
return <span><WWOpenDataCom type="departmentName" openid={item} />{index < (record.depNamesList.length - 1) ? ';' : ''}</span>
})}
</Tooltip>
</div>
......@@ -94,21 +109,21 @@ function LeftStructureTree(props) {
),
});
const notFoundContentNode = ()=>{
const notFoundContentNode = () => {
return <div className="empty-con">
<img src="https://image.xiaomaiketang.com/xm/wRDrb2pJFb.png" className="empty-img"/>
<img src="https://image.xiaomaiketang.com/xm/wRDrb2pJFb.png" className="empty-img" />
<div className="empty-text">暂无数据</div>
</div>
}
function handleDepName(depArray){
function handleDepName(depArray) {
const depArrayDom = depArray.map((item, index) => {
return <span><WWOpenDataCom type="departmentName" openid={item}/></span>
return <span><WWOpenDataCom type="departmentName" openid={item} /></span>
});
return depArrayDom;
};
function handlePlaceHolder(){
function handlePlaceHolder() {
let placeholder = '';
switch (props.treeType){
switch (props.treeType) {
case 'departMentTab':
placeholder = '搜索学员姓名、部门';
break;
......@@ -123,89 +138,89 @@ function LeftStructureTree(props) {
}
return placeholder
}
function confirmSearchSelect(value,option){
function confirmSearchSelect(value, option) {
const param = {}
setOpen(false);
setQueryName(value);
if(option.label.props.type === 'user'){
if (option.label.props.type === 'user') {
param.queryName = value;
}else{
} else {
param.id = option.label.props.depId;
}
props.searchUserList(param,treeType,1);
props.searchUserList(param, treeType, 1);
}
// 获取关键词的搜索结果
function getCompleteOptionData(value){
function getCompleteOptionData(value) {
// setQueryName(value);
setCompleteOption([]);
if(!value){
if (!value) {
return
}
const params = {
depType:DepType[props.treeType],
queryName:value,
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:false,
distinct:false,
queryType:'CUSTOMER'
depType: DepType[props.treeType],
queryName: value,
enterpriseId: User.getEnterpriseId(),
source: 0,//0代表来自企培
storeId: User.getStoreId(),
userId: User.getUserId(),
whetherCount: false,
distinct: false,
queryType: 'CUSTOMER'
}
StoreService.getDepartmentUser(params).then((res) => {
const _completeOptions = [];
const userObj = {};
const departmentGroupObj = {};
const postobj = {};
const { result = {}} = res;
const {departmentUserVOList=[],departmentVOList=[],subLevelDepartmentVOList=[]} = result;
if(departmentUserVOList.length>0){
userObj.label=renderTitle('学员');
userObj.options=departmentUserVOList.map((item,index)=>{
return renderItem(item,'user');
const { result = {} } = res;
const { departmentUserVOList = [], departmentVOList = [], subLevelDepartmentVOList = [] } = result;
if (departmentUserVOList.length > 0) {
userObj.label = renderTitle('学员');
userObj.options = departmentUserVOList.map((item, index) => {
return renderItem(item, 'user');
})
}
if(departmentVOList.length>0){
switch (props.treeType){
if (departmentVOList.length > 0) {
switch (props.treeType) {
case 'departMentTab':
departmentGroupObj.label=renderTitle('部门');
departmentGroupObj.label = renderTitle('部门');
break;
case 'postGrouptab':
departmentGroupObj.label=renderTitle('岗位组');
departmentGroupObj.label = renderTitle('岗位组');
break;
case 'customGroupTab':
departmentGroupObj.label=renderTitle('分组集合');
departmentGroupObj.label = renderTitle('分组集合');
break;
default:
break;
}
departmentGroupObj.options=departmentVOList.map((item,index)=>{
return renderItem(item,'group');
departmentGroupObj.options = departmentVOList.map((item, index) => {
return renderItem(item, 'group');
})
}
if(subLevelDepartmentVOList.length>0){
switch (props.treeType){
if (subLevelDepartmentVOList.length > 0) {
switch (props.treeType) {
case 'postGrouptab':
postobj.label=renderTitle('岗位');
postobj.label = renderTitle('岗位');
break;
case 'customGroupTab':
postobj.label=renderTitle('分组');
postobj.label = renderTitle('分组');
break;
default:
break;
}
postobj.options=subLevelDepartmentVOList.map((item,index)=>{
return renderItem(item,'post');
postobj.options = subLevelDepartmentVOList.map((item, index) => {
return renderItem(item, 'post');
})
}
if(Object.keys(userObj).length !==0){
if (Object.keys(userObj).length !== 0) {
_completeOptions.push(userObj);
}
if(Object.keys(departmentGroupObj).length !==0){
if (Object.keys(departmentGroupObj).length !== 0) {
_completeOptions.push(departmentGroupObj);
}
if(Object.keys(postobj).length !==0){
if (Object.keys(postobj).length !== 0) {
_completeOptions.push(postobj);
}
setCompleteOption(_completeOptions);
......@@ -213,23 +228,23 @@ function LeftStructureTree(props) {
}
async function addCustomer(treeType,query){
async function addCustomer(treeType, query) {
await getTreeData(treeType);
props.searchUserList(query,treeType,1);
props.searchUserList(query, treeType, 1);
}
function getTreeData(treeType){
return new Promise((resolve,reject)=>{
function getTreeData(treeType) {
return new Promise((resolve, reject) => {
const params = {
departmentTypeEnum:DepType[treeType] || DepType[props.treeType],
enterpriseId:User.getEnterpriseId(),
source:0,//0代表来自企培
storeId:User.getStoreId(),
userId:User.getUserId(),
whetherCount:true
departmentTypeEnum: DepType[treeType] || DepType[props.treeType],
enterpriseId: User.getEnterpriseId(),
source: 0,//0代表来自企培
storeId: User.getStoreId(),
userId: User.getUserId(),
whetherCount: true
}
StoreService.queryDepartmentTree(params).then((res) => {
const { result = []} = res
let { departmentVOList=[] } =result;
const { result = [] } = res
let { departmentVOList = [] } = result;
let _treeData = handleData(result);
setTreeData(_treeData);
resolve(result);
......@@ -238,11 +253,11 @@ function LeftStructureTree(props) {
})
}
function handleData(dataArray){
const _dataArray = dataArray.map((item,index)=>{
function handleData(dataArray) {
const _dataArray = dataArray.map((item, index) => {
item.title = "";
item.key=item.id;
if(item.sonDepartmentVOList){
item.key = item.id;
if (item.sonDepartmentVOList) {
item.children = item.sonDepartmentVOList;
handleData(item.sonDepartmentVOList)
}
......@@ -258,15 +273,15 @@ function LeftStructureTree(props) {
const moreOpenGroupOperate = (record) => (
<Menu>
<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>
{record.depLevel ===0 &&
{record.depLevel === 0 &&
<Menu.Item key="add" >
<span onClick={()=>{props.treeType==='postGrouptab'?addPostGroup(1,record):addCustomGroup(1,record)}}>
{props.treeType==='postGrouptab' &&
<span onClick={() => { props.treeType === 'postGrouptab' ? addPostGroup(1, record) : addCustomGroup(1, record) }}>
{props.treeType === 'postGrouptab' &&
<span>新建岗位</span>
}
{props.treeType==='customGroupTab' &&
{props.treeType === 'customGroupTab' &&
<span>新建分组</span>
}
</span>
......@@ -274,7 +289,7 @@ function LeftStructureTree(props) {
}
{/* { (record.departmentCount === 0 || !record.departmentCount) && */}
<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>
......@@ -286,16 +301,16 @@ function LeftStructureTree(props) {
}
//添加岗位组/岗位
function addPostGroup(level,record) {
if(level===0){
function addPostGroup(level, record) {
if (level === 0) {
if (treeData.length > 9) {
message.error("岗位组数量已达10个上限");
return;
}
}
if(level===1){
if(record.sonDepartmentVOList){
if(record.sonDepartmentVOList.length > 19){
if (level === 1) {
if (record.sonDepartmentVOList) {
if (record.sonDepartmentVOList.length > 19) {
message.error("岗位数量已达20个上限");
return;
}
......@@ -307,30 +322,30 @@ function LeftStructureTree(props) {
setOperatePostGroupModalType("add");
setPostGroupModalLevel(level);
setCurrentGroupData(record);
console.log('treeData',record);
if(level===0){
console.log('treeData', record);
if (level === 0) {
setPostGroupModalTitle('添加岗位组');
setPostGroupModalLable('岗位组');
setPostGroupTreeData(treeData);
}else{
} else {
setPostGroupModalTitle('添加岗位'); // sub代表岗位
setPostGroupModalLable('岗位');
setPostGroupTreeData(record.sonDepartmentVOList || []);
}
}
//编辑岗位组/岗位
function editPostGroup(record){
function editPostGroup(record) {
setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("edit");
//level为0的时候编辑的是岗位组 大于0的时候
setPostGroupModalLevel(record.depLevel);
setCurrentGroupData(record);
console.log('treeData',record);
if(record.depLevel===0){
console.log('treeData', record);
if (record.depLevel === 0) {
setPostGroupModalTitle('编辑岗位组');
setPostGroupModalLable('岗位组');
setPostGroupTreeData(treeData);
}else{
} else {
setPostGroupModalTitle('编辑岗位');
setPostGroupModalLable('岗位');
setPostGroupTreeData(getParentChildernData(record.parentId));
......@@ -338,23 +353,23 @@ function LeftStructureTree(props) {
}
// 获取父节点下的所有的子级数据
function getParentChildernData(parentId){
function getParentChildernData(parentId) {
let _parentChildernData = []
treeData.map((item,index)=>{
if( parentId=== item.id){
treeData.map((item, index) => {
if (parentId === item.id) {
_parentChildernData = item.sonDepartmentVOList
}
})
return _parentChildernData
}
function delPostGroup(record){
function delPostGroup(record) {
let title = '确认删除该岗位组吗?';
let content= '删除后,该岗位组下的岗位及也将全部删除。';
if(record.departmentCount && record.departmentCount>0 ){
let content = '删除后,该岗位组下的岗位及也将全部删除。';
if (record.departmentCount && record.departmentCount > 0) {
title = '删除失败';
if(record.depLevel>0){
if (record.depLevel > 0) {
content = `${record.name}存在学员,不能删除该岗位`;
}else{
} else {
content = `${record.name}存在学员,不能删除该岗位组`;
}
Modal.warning({
......@@ -365,7 +380,7 @@ function LeftStructureTree(props) {
})
return
}
if(record.level>0){
if (record.level > 0) {
title = '确认删除该岗位吗?';
content = '删除后,不可恢复';
}
......@@ -381,13 +396,13 @@ function LeftStructureTree(props) {
},
});
}
function delGroup(record){
function delGroup(record) {
let parmas = {
departmentId:record.id,
enterpriseId:User.getEnterpriseId(),
source:0,
storeId:User.getStoreId(),
userId:User.getUserId()
departmentId: record.id,
enterpriseId: User.getEnterpriseId(),
source: 0,
storeId: User.getStoreId(),
userId: User.getUserId()
}
StoreService.delDepartment(parmas).then((res) => {
message.success(`删除成功`)
......@@ -398,16 +413,16 @@ function LeftStructureTree(props) {
//添加自定义分组集合/分组
function addCustomGroup(level,record) {
if(level===0){
function addCustomGroup(level, record) {
if (level === 0) {
if (treeData.length > 9) {
message.error("自定义分组集合数量已达10个上限");
return;
}
}
if(level===1){
if(record.sonDepartmentVOList){
if(record.sonDepartmentVOList.length > 19){
if (level === 1) {
if (record.sonDepartmentVOList) {
if (record.sonDepartmentVOList.length > 19) {
message.error("自定义分组数量已达20个上限");
return;
}
......@@ -418,41 +433,41 @@ function LeftStructureTree(props) {
setOperatePostGroupModalType("add");
setPostGroupModalLevel(level);
setCurrentGroupData(record)
if(level===0){
if (level === 0) {
setPostGroupModalTitle('添加分组集合');
setPostGroupModalLable('分组集合');
setPostGroupTreeData(treeData);
}else{
} else {
setPostGroupModalTitle('添加分组'); // sub代表岗位
setPostGroupModalLable('分组');
setPostGroupTreeData(record.sonDepartmentVOList || []);
}
}
//编辑自定义分组集合/分组
function editCustomGroup(record){
function editCustomGroup(record) {
setAddOrEditPostGroupShow(true);
setOperatePostGroupModalType("edit");
setPostGroupModalLevel(record.level);
setCurrentGroupData(record)
//level为0的时候编辑的是岗位组 大于0的时候
if(record.depLevel===0){
if (record.depLevel === 0) {
setPostGroupModalTitle('编辑分组集合');
setPostGroupModalLable('分组集合');
setPostGroupTreeData(treeData);
}else{
} else {
setPostGroupModalTitle('编辑分组');
setPostGroupModalLable('分组');
setPostGroupTreeData(getParentChildernData(record.parentId));
}
}
function delCustomGroup(record){
function delCustomGroup(record) {
let title = '确认删除该分组集合吗?';
let content= '删除后,该分组集合下的岗位及也将全部删除。';
if(record.departmentCount && record.departmentCount>0 ){
let content = '删除后,该分组集合下的岗位及也将全部删除。';
if (record.departmentCount && record.departmentCount > 0) {
title = '删除失败';
if(record.level>0){
if (record.level > 0) {
content = `${record.name}存在学员,不能删除该分组`;
}else{
} else {
content = `${record.name}存在学员,不能删除该分组集合`;
}
Modal.warning({
......@@ -463,7 +478,7 @@ function LeftStructureTree(props) {
})
return
}
if(record.level>0){
if (record.level > 0) {
title = '确认删除该分组吗?';
content = '删除后,不可恢复';
}
......@@ -486,30 +501,39 @@ function LeftStructureTree(props) {
getTreeData()
}
function selectUserList(record,e){
function selectUserList(record, e) {
const _selectKeys = [];
_selectKeys.push(e.selectedNodes[0].id)
setSelectedKeys(_selectKeys);
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 (
<div className="left-structure-tree">
<div className="organization">
<div className="search-con">
{/* <Complete/> */}
<AutoComplete
{/* <AutoComplete
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={250}
allowClear
onChange={(value)=>{setQueryName(value);setOpen(true);getCompleteOptionData(value)}}
onChange={changeName}
// onSearch={(value)=>{getCompleteOptionData(value)}}
notFoundContent={notFoundContentNode()}
value={queryName}
open={open}
onFocus={()=>{setOpen(true)}}
onBlur={()=>{setOpen(false)}}
onFocus={() => { setOpen(true) }}
onBlur={() => { setOpen(false) }}
style={{
width: 250,
}}
......@@ -521,11 +545,11 @@ function LeftStructureTree(props) {
style={{ width: 250 }}
enterButton={<span className='icon iconfont'>&#xe832;</span>}
/>
</AutoComplete>
</AutoComplete> */}
</div>
{ (props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab') && (
{(props.treeType === 'postGrouptab' || props.treeType === 'customGroupTab') && (
<div className="operate">
{props.treeType==='postGrouptab' &&
{props.treeType === 'postGrouptab' &&
<Button
className="add-btn"
onClick={() => {
......@@ -535,7 +559,7 @@ function LeftStructureTree(props) {
添加岗位组
</Button>
}
{props.treeType==='customGroupTab' &&
{props.treeType === 'customGroupTab' &&
<Button
className="add-btn"
onClick={() => {
......@@ -560,7 +584,7 @@ function LeftStructureTree(props) {
<div
className="node-title-div"
onMouseOver={(e) => {
if((props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab')){
if ((props.treeType === 'postGrouptab' || props.treeType === 'customGroupTab')) {
if (nodeData.key === "null") return;
let moreDiv = e.currentTarget.getElementsByClassName(
"item-more"
......@@ -577,7 +601,7 @@ function LeftStructureTree(props) {
}
}}
onMouseOut={(e) => {
if((props.treeType==='postGrouptab' || props.treeType=== 'customGroupTab')){
if ((props.treeType === 'postGrouptab' || props.treeType === 'customGroupTab')) {
if (nodeData.key === "null") return;
let moreDiv = e.currentTarget.getElementsByClassName(
"item-more"
......@@ -608,14 +632,14 @@ function LeftStructureTree(props) {
: "78%",
}}
>
{ props.treeType==='departMentTab'?
<span><WWOpenDataCom type="departmentName" openid={nodeData.name}/></span>
{props.treeType === 'departMentTab' ?
<span><WWOpenDataCom type="departmentName" openid={nodeData.name} /></span>
:
<span>{nodeData.name}</span>
}
</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)}>
<div className="item-more icon iconfont">&#xe927;</div>
</Dropdown>
......@@ -628,10 +652,10 @@ function LeftStructureTree(props) {
<div>
{/* { (props.treeType==='departMentTab') && */}
<div>
{ selctQueryName.type==='userName'?
<WWOpenDataCom type="userName" openid={selctQueryName.openid}/>
{selctQueryName.type === 'userName' ?
<WWOpenDataCom type="userName" openid={selctQueryName.openid} />
:
<WWOpenDataCom type="departmentName" openid={selctQueryName.openid}/>
<WWOpenDataCom type="departmentName" openid={selctQueryName.openid} />
}
</div>
......
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;
}
}
}
}
......@@ -58,14 +58,14 @@ function SearchUser(props) {
};
return (
<div className="search-user" style={{width:'300px'}} id="search-user">
<Search
{/* <Search
placeholder='搜索成员'
enterButton={<span className="icon iconfont">&#xe832;</span>}
onFocus={(e)=>{onFocus(e)}}
onChange={(e)=>{onChange(e)}}
className="search-input-item"
// onBlur={()=>{onBlur()}}
/>
/> */}
{dropDownVisible &&
<div className="drop-down">
<div className="drop-down__list">
......
......@@ -106,6 +106,7 @@ class AddLiveBasic extends React.Component {
<span className='label'>
<span className='require'>*</span>课程名称:
</span>
<div id="courseName" style={{display:"inline-block"}}>
<Input
className={_.find(this.props.exItems,(item)=>{return item === "courseName"})?"err":""}
value={courseName}
......@@ -117,6 +118,7 @@ class AddLiveBasic extends React.Component {
}}
/>
</div>
</div>
<div className='course-cover'>
<span className='label'>封面图:</span>
......@@ -146,6 +148,7 @@ class AddLiveBasic extends React.Component {
<span className='label'>
<span className='require'>*</span>课程分类:
</span>
<div id="categoryId" style={{display:"inline-block"}}>
<CourseCatalogSelect
className={_.find(this.props.exItems,(item)=>{return item === "categoryId"})?"err":""}
value={categoryId}
......@@ -154,6 +157,7 @@ class AddLiveBasic extends React.Component {
}}
/>
</div>
</div>
{showSelectFileModal && (
<SelectPrepareFileModal
key='basic'
......
......@@ -214,7 +214,7 @@ function CreateWorkWXCourse() {
if (User.getExpirationTime() && moment().valueOf() > Number(User.getExpirationTime())) {
Modal.warning({
title: '服务已到期',
content: '当前企业购买的小麦企学院服务已到期,如需继续使用学院功能,请尽快续费购买',
content: `当前企业购买的${window.brandName}服务已到期,如需继续使用学院功能,请尽快续费购买`,
okText: '我知道了',
});
return;
......@@ -441,7 +441,7 @@ function CreateWorkWXCourse() {
<Breadcrumbs navList={type === 'add' ? '新建直播课' : '编辑直播课'} goBack={handleGoBack} />
<div className='box'>
<div className='show-tips'>
<ShowTips message='请遵守国家相关规定,切勿上传低俗色情、暴力恐怖、谣言诈骗、侵权盗版等相关内容,小麦企学院保有依据国家规定及平台规则进行处理的权利' />
<ShowTips message={`请遵守国家相关规定,切勿上传低俗色情、暴力恐怖、谣言诈骗、侵权盗版等相关内容,${window.brandName}保有依据国家规定及平台规则进行处理的权利`} />
</div>
<div className='add-live-page__form'>
<div className='basic-info__wrap'>
......
......@@ -14,6 +14,7 @@ import moment from 'moment'
import StoreService from '@/domains/store-domain/storeService'
import User from '@/common/js/user'
import './LiveCourseFilter.less'
import { brandLiveName } from '@/domains/brand/constants'
const { Search } = Input
const { Option } = Select
......@@ -325,7 +326,7 @@ class LiveCourseFilter extends React.Component {
</span>
}>
<Option value='WECHAT'>企微直播</Option>
<Option value='TENCENT'>小麦直播</Option>
<Option value='TENCENT'>{brandLiveName}</Option>
</Select>
</div>
)}
......
......@@ -26,6 +26,7 @@ import RelatedPlanModal from '../modal/RelatedPlanModal';
import ShareLiveModal from '../modal/ShareLiveModal';
import Bus from '@/core/bus';
import './LiveCourseList.less';
import { brandLiveName } from '@/domains/brand/constants';
const { confirm } = Modal
const courseStateShow = {
......@@ -234,7 +235,7 @@ class LiveCourseList extends React.Component {
key: 'couseCatalog',
dataIndex: 'couseCatalog',
render: (val, item) => {
return <div>{item.thirdPartType === "WECHAT" ? "企微直播":"小麦直播"}</div>;
return <div>{item.thirdPartType === "WECHAT" ? "企微直播":`${brandLiveName}`}</div>;
},
},
{
......@@ -248,7 +249,7 @@ class LiveCourseList extends React.Component {
},
{
title: '课件管理',
width: '8%',
width: '75px',
key: 'courseware',
dataIndex: 'courseware',
render: (val, item) => {
......@@ -367,7 +368,7 @@ class LiveCourseList extends React.Component {
(item.teacherId === User.getUserId() || _.pluck(item.admins, 'adminId').includes(User.getUserId())) && (
<>
{
isMac()?(
isMac() && item.thirdPartType === "WECHAT" ? (
<Tooltip title="请使用windows电脑进入直播间" placement="left">
<div style={{fontSize:"14px",color:"#999999"}}>
进入直播间
......@@ -700,7 +701,7 @@ class LiveCourseList extends React.Component {
}
{
(item.courseState === "STARTING" || ((now > item.startTime && now < item.endTime) && item.courseState !== "FINISH")) &&
<Tooltip placement="left" title="直播进行中,不能删除">
<Tooltip placement="left" title={item.courseState === "STARTING"?"直播进行中,不能删除":"已到预定时间,无法删除"}>
<Menu.Item style={{color:"#999999"}}>
删除
</Menu.Item>
......@@ -895,7 +896,7 @@ class LiveCourseList extends React.Component {
})
return
}
if (item.startTime + 15*60*1000 < new Date().getTime()) {
if (item.startTime + 15*24*60*60*1000 < new Date().getTime()) {
Modal.warning({
title: '提示',
content: "该直播课的回放视频已失效",
......
import React, { useState } from "react";
import "./LiveModeSelect.less"
import { createPortal } from "react-dom";
import { brandLiveName } from "@/domains/brand/constants";
interface LiveModeSelectProps {
isShow: boolean;
......@@ -32,8 +33,8 @@ export default function LiveModeSelect(props: LiveModeSelectProps) {
<div className="content">
<div className="item xiaomai-logo">
<div className="logo"></div>
<div className="item-title">小麦直播</div>
<div className="des">通过小麦企学院“PC客户<br/>端”进行直播</div>
<div className="item-title">{brandLiveName}</div>
<div className="des">通过{window.brandName}“PC客户<br/>端”进行直播</div>
<div className="button" onClick={handleSelect0}>立即创建</div>
</div>
<div className="item qiwei-logo">
......
......@@ -88,9 +88,9 @@ function ExpirationPopover(props) {
<div className="title">{props.surplusDayTime === 0 ? "服务已到期" : "服务到期提醒"}</div>
{
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>
)
}
......@@ -236,9 +236,6 @@ export default class CollegeManagePage extends React.Component {
User.removeToken();
User.removeEnterpriseId();
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;
});
}
......@@ -395,7 +392,6 @@ export default class CollegeManagePage extends React.Component {
}}
>
<div className="header">
<img className="image" src={item.logo || brandLogo} />
<span className="tag">{roleMap[item.userRole]}</span>
</div>
......
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2019-09-10 18:26:03
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-09 15:40:53
* @LastEditTime: 2021-08-11 20:26:53
* @Description:
*/
import React, { useRef, useContext, useEffect, useState } from 'react';
......
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2020-04-29 10:26:32
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-08-09 15:41:27
* @LastEditTime: 2021-08-11 20:27:02
* @Description: 内容线路由配置
*/
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