Commit da0db9e7 by guomingpang
parents e817f6d4 60f0950c
......@@ -10,6 +10,8 @@ import Service from '@/common/js/service';
// import _ from 'underscore';
import './ChooseMembersModal.less';
import User from '@/common/js/user'
import { XMTable } from '@/components';
import college from '@/common/lottie/college';
const { Search } = Input;
......@@ -203,10 +205,8 @@ class ChooseMembersModal extends React.Component {
title: '全选', // 实际为头像,但在表格上这行要求显示为全选
key: 'avatar',
dataIndex: 'avatar',
width: '40%',
render: (value, record) => {
const { adminName } = record;
return (
<div className='avatar'>
{
......@@ -232,7 +232,7 @@ class ChooseMembersModal extends React.Component {
title: '学员名',
key: 'adminNameRight',
dataIndex: 'adminName',
width: '70%',
width: '65%',
render: (value, record) => {
const { adminName = '', avatar } = record;
return (
......@@ -293,16 +293,19 @@ class ChooseMembersModal extends React.Component {
enterButton={<span className="icon iconfont">&#xe832;</span>}
/>
<div className='container-left-body-table'>
<Table
<XMTable
renderEmpty={{
image: college,
description: '暂无数据'
}}
rowKey={(record) => record.userId}
dataSource={allUserList}
columns={this.selectedColumnsLeft()}
pagination={false}
scroll={{ y: 290}}
// bordered={true}
size={'small'}
rowSelection={{
columnWidth : 24,
columnWidth : 63,
selectedRowKeys,
onChange : this.onChangeRow,
getCheckboxProps : this.getCheckboxProps,
......@@ -326,7 +329,11 @@ class ChooseMembersModal extends React.Component {
<span className={ (selectUserList.length > 0) ? 'span-right-l' : null }>清空</span>
</div>
<div className='container-right-body'>
<Table
<XMTable
renderEmpty={{
image: college,
description: '暂无数据'
}}
rowKey={(record) => record.userId}
dataSource={selectUserList}
columns={this.selectedColumnsRight()}
......
......@@ -37,7 +37,7 @@
>tr >td {
border-bottom: none;
background-color: #fff !important;
padding:8px 8px !important;
}
}
}
......@@ -45,6 +45,14 @@
.ant-empty-normal {
margin: 100px 0 !important;
}
.ant-empty {
margin-top: 60px;
}
.ant-empty-description {
color: #999;
}
.avatar{
display: flex;
align-items: center;
......@@ -119,6 +127,13 @@
margin: 144px 0 !important;
}
.ant-empty {
margin-top: 60px;
}
.ant-empty-description {
color: #999;
}
.avatar{
display: flex;
align-items: center;
......
......@@ -8,7 +8,7 @@ import React from 'react';
import { Modal, Button, Breadcrumb, Radio, message } from 'antd';
import Service from '@/common/js/service';
import { FILE_TYPE_ICON_MAP, DEFAULT_SIZE_UNIT } from "@/domains/resource-disk/constants";
import { LottieIcon } from 'xiaomai-b-components';
import LottieIcon from '@/components/LottieIcon';
import _ from 'underscore';
import { getEllipsText } from "@/domains/basic-domain/utils";
import * as lodash from 'lodash';
......@@ -334,6 +334,8 @@ class CopyFileModal extends React.Component {
<div className="lottie-box">
<LottieIcon
title={<span className="desc">这个文件夹是空的</span>}
type="college"
size={150}
/>
</div>
}
......
......@@ -57,12 +57,17 @@
}
}
.lottie-box {
border:1px solid #E8E8E8;
border-radius:4px;
height: 320px;
.copy-body {
.lottie-box {
border:1px solid #E8E8E8;
border-radius:4px;
height: 320px;
}
.lottie-icon{
margin: 70px 0 !important;
.lottie-icon__title {
color: #999;
}
}
}
.lottie-icon{
margin: 100px 0;
}
\ No newline at end of file
......@@ -35,6 +35,9 @@
.ant-table-row{
background-color: #fff !important;
}
tr:first-child{
display: none;
}
.ant-table-row:hover{
background-color: #E9E9E9;
}
......
......@@ -10,7 +10,7 @@ import React from 'react';
import { Modal, Button, Radio, Checkbox, message, Tooltip } from 'antd';
import _ from 'underscore';
import * as lodash from 'lodash';
import { LottieIcon } from 'xiaomai-b-components';
import LottieIcon from '@/components/LottieIcon';
import Service from '@/common/js/service';
import { getEllipsText } from "@/domains/basic-domain/utils";
......@@ -647,6 +647,8 @@ class SelectPrepareFileModal extends React.Component {
<Otherwise>
<LottieIcon
title={<span className="desc">这个文件夹是空的</span>}
type="college"
size={150}
/>
</Otherwise>
</Choose>
......
......@@ -4,10 +4,10 @@
}
.lottie-icon {
margin: 12px 0 0 0;
margin: 0;
border: 1px solid #E8E8E8;
border-radius: 4px;
padding: 100px 0;
padding: 69px 0 59px 0;
.desc {
color: #999;
......
.lottie-icon{
text-align: center;
margin-top: 200px;
margin-bottom: 50px;
&__title{
font-size:14px;
font-family:PingFangSC-Regular;
font-weight:400;
color:#999;
line-height:20px;
margin-top: 20px;
}
}
\ No newline at end of file
/*
* @Author: wufan
* @Date: 2021-06-15 13:48:35
* @LastEditors: wufan
* @LastEditTime: 2021-06-15 14:24:57
* @Description: Description
*/
import React from 'react';
import Lottie from 'react-lottie';
import student from '@/common/lottie/student.json';
import activity from '@/common/lottie/activity.json';
import teacher from '@/common/lottie/teacher.json';
import college from '@/common/lottie/college.json';
import './LottieIcon.less';
interface LottieIconInterface {
size: number,
type: string,
title: string,
isStopped: boolean,
isPaused: boolean,
}
const ANIMATION_DATA_MAP: {
[key: string]: any,
} = {
student,
activity,
teacher,
college
}
function LottieIcon(props: LottieIconInterface) {
const {
title,
size = 90,
type = 'student',
isPaused = true,
isStopped = true,
} = props;
const options = {
loop: true,
autoplay: true,
animationData: ANIMATION_DATA_MAP[type],
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice'
}
}
return (
<div className="lottie-icon">
<Lottie
options={options}
width={size}
height={size}
isPaused={isPaused}
isStopped={isStopped}
/>
<div className="lottie-icon__title">{title}</div>
</div>
)
}
export default LottieIcon;
\ No newline at end of file
/*
* @Author: wufan
* @Date: 2021-05-26 10:29:56
* @LastEditors: wufan
* @LastEditTime: 2021-06-17 14:15:00
* @Description: Description
*/
import React from "react";
import { Tag } from 'antd'
import "./WatchDataHeader.less";
interface WatchDataHeaderProps {
......
......@@ -210,7 +210,6 @@ class ChooseMembersModal extends React.Component {
title: '全选', // 实际为头像,但在表格上这行要求显示为全选
key: 'avatar',
dataIndex: 'avatar',
width: '40%',
render: (value, record) => {
const { name } = record;
......@@ -328,7 +327,7 @@ class ChooseMembersModal extends React.Component {
}}
size={'small'}
rowSelection={{
columnWidth : 24,
columnWidth : 63,
selectedRowKeys,
onChange : this.onChangeRow,
getCheckboxProps : this.getCheckboxProps,
......
......@@ -2,7 +2,7 @@
* @Author: 吴文洁
* @Date: 2020-08-05 10:12:45
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-15 11:22:25
* @LastEditTime: 2021-06-21 11:24:29
* @Description: 视频课-列表模块
* @Copyright: 杭州杰竞科技有限公司 版权所有
*/
......
......@@ -4,15 +4,15 @@
* @Last Modified by: chenshu
* @Last Modified time: 2021-06-08 18:18:46
*/
import React, { useEffect, useState } from 'react';
import { Modal, Button, Table, Progress, message, Tooltip, Spin, Popconfirm } from 'antd';
import React from 'react';
import { Modal, Button, Table, message, Tooltip, Spin, Popconfirm } from 'antd';
import { QuestionCircleOutlined,LoadingOutlined} from "@ant-design/icons";
import _ from 'underscore';
import moment from 'moment';
import Lottie from "lottie-web";
import User from '@/common/js/user';
import { suffixType, DEFAULT_SIZE_UNIT, SupportFileType } from '@/common/constants/academic/liveEnum';
import { FileVerifyMap, FileTypeIcon, DISK_MAP } from '@/common/constants/academic/lessonEnum';
import { suffixType, DEFAULT_SIZE_UNIT } from '@/common/constants/academic/liveEnum';
import { FileVerifyMap, FileTypeIcon } from '@/common/constants/academic/lessonEnum';
import ScanFileModal from '@/modules/prepare-lesson/modal/ScanFileModal'
import SelectPrepareFileModal from '@/modules/prepare-lesson/modal/SelectPrepareFileModal';
import Service from '@/common/js/service';
......@@ -229,14 +229,18 @@ class ManageCoursewareModal extends React.Component {
const antIcon = <LoadingOutlined/>;
const type = FileVerifyMap[fileType].type;
return <div className="courseware-name" onClick={() => this.handleScanFile(item)}>
{(type === 'JPG' || type === 'PNG') && item.progress ?
<Spin indicator={antIcon} />
:<img
src={FileTypeIcon[FileVerifyMap[fileType].type] || (item.docUrls[0] || {}).conversionFileUrl}
alt=""
className="item-img"
/>
}
<Choose>
<When condition={(type === 'JPG' || type === 'PNG') && item.progress}>
<Spin indicator={antIcon} />
</When>
<Otherwise>
<img
src={FileTypeIcon[FileVerifyMap[fileType].type] || (item.docUrls[0] || {}).conversionFileUrl}
alt=""
className="item-img"
/>
</Otherwise>
</Choose>
<Tooltip title={item.fileName}><span className="name">{item.fileName}</span></Tooltip>
</div>
},
......@@ -270,7 +274,7 @@ class ManageCoursewareModal extends React.Component {
width: "16%",
dataIndex: "control",
render: (_value, item) => {
const { uploadObject, failObject, cancelObject } = this.state;
const { failObject } = this.state;
const uploadFail = failObject[item.id];
// 上课前45分钟/上课中/已结束的情况下都不可操作
......@@ -295,7 +299,7 @@ class ManageCoursewareModal extends React.Component {
const {
list, scanFileModal, editData, cancelObject,
showSelectFileModal, selectedFileList,
diskList, currentRootDisk, isLessonPermission
diskList
} = this.state;
const _list = _.reject(list, (item) => cancelObject[item.id]);
return (
......
import React from 'react';
import { Button } from 'antd';
import { withRouter } from 'react-router-dom';
import User from '@/common/js/user';
import './ExpiredCourseList.less';
function ExpiredCourseList(props) {
......
......@@ -7,23 +7,20 @@
*/
import React from 'react';
import { Modal, Button, Radio, Checkbox, Spin, Upload, message, Tooltip } from 'antd';
import InfiniteScroll from 'react-infinite-scroller';
import { Modal, Button, Radio, Checkbox, message, Tooltip } from 'antd';
import User from '@/common/js/user';
import { getEllipsText } from "@/core/util";
import DefaultIcon from '@/modules/common/DefaultIcon';
import UploadProgressModal from './UploadProgressModal';
import NonCompliantFileModal from './NonCompliantFileModal';
import Service from '@/common/js/service';
import _ from 'underscore';
import {
DEFAULT_SIZE_UNIT, FileTypeIcon, NonCompliantFileMap,
DISK_LIST, SupportFileType, LocalFileType,FileVerifyMap
DEFAULT_SIZE_UNIT, FileTypeIcon,
SupportFileType, FileVerifyMap
} from "@/common/constants/academic/lessonEnum";
import { getFileTypeByName } from '../components/FolderManage';
import LottieIcon from '@/components/LottieIcon';
import './SelectPrepareFileModal.less';
const defaultQuery = {
......@@ -660,9 +657,10 @@ class SelectPrepareFileModal extends React.Component {
}
</div>
</div> :
<DefaultIcon
type='student'
<LottieIcon
title={<span className="desc">这个文件夹是空的</span>}
type="college"
size={150}
/>
}
......
......@@ -9,8 +9,7 @@
import React from 'react';
import { Table, Menu, Dropdown, Modal, message,Tooltip } from 'antd';
import _ from 'underscore';
// import * as lodash from 'lodash';
import { PageControl, LottieIcon } from 'xiaomai-b-components';
import { PageControl } from 'xiaomai-b-components';
import { XMTable } from '@/components';
import Service from '@/common/js/service';
import { formatDate } from '@/domains/basic-domain/utils';
......
......@@ -13,7 +13,7 @@ import _ from 'underscore';
import Service from '@/common/js/service';
import { getEllipsText } from '@/domains/basic-domain/utils';
import { DEFAULT_SIZE_UNIT, LOCAL_FILE_TYPE_MAP,FILR_VERIFY_MAP,SUPPORT_FILE_TYPE_MAP} from '@/domains/resource-disk/constants';
import { DEFAULT_SIZE_UNIT,FILR_VERIFY_MAP,SUPPORT_FILE_TYPE_MAP} from '@/domains/resource-disk/constants';
import { getFileTypeByName } from '@/domains/resource-disk/utils';
import UploadProgressModal from '@/bu-components/UploadProgressModal';
......
......@@ -29,25 +29,6 @@ class PrepareLessonPage extends React.Component {
}
}
componentWillMount() {
// this.handleFetchDiskList();
}
handleFetchDiskList = async () => {
const res = await Service.Hades('public/apollo/getUserDisk', {});
const { result = [] } = res;
const diskList = result.map((item) => {
return {
...item,
folderName: DISK_MAP[item.disk]
}
});
this.setState({
diskList,
currentRootDisk: diskList[0] || defaultRootDisk
});
}
handleChangeDisk = (disk) => {
this.setState({
currentRootDisk: disk
......
import React from 'react';
import { Modal, Input, Form, message } from 'antd';
import ShowTips from '@/bu-components/ShowTip';
import { Modal, Input, Form } from 'antd';
import './CreateFolderModal.less';
class CreateFolderModal extends React.Component {
......@@ -107,5 +106,4 @@ class CreateFolderModal extends React.Component {
}
}
// export default Form.create()(CreateFolderModal);
export default CreateFolderModal;
\ No newline at end of file
......@@ -116,7 +116,6 @@ const App: React.FC = (props: any) => {
setMenuType(!menuType);
}
if (!storeUserId) {
return <div></div>
}
......@@ -127,7 +126,7 @@ const App: React.FC = (props: any) => {
<ConfigProvider locale={zhCN} autoInsertSpaceInButton={false}>
<Main menuType={menuType} />
</ConfigProvider>
<Menu menuType={menuType} handleMenuType={handleMenuType}/>
<Menu menuType={menuType} handleMenuType={handleMenuType} />
</div>
)
}
......
......@@ -179,6 +179,7 @@ export default class CollegeManagePage extends React.Component {
return null;
};
User.setStoreId(item.id);
User.setStoreUserId(item.storeUserId);
window.RCHistory.push('/home')
}}
>
......@@ -196,6 +197,7 @@ export default class CollegeManagePage extends React.Component {
e.preventDefault();
e.stopPropagation();
User.setStoreId(item.id);
User.setStoreUserId(item.storeUserId);
window.RCHistory.push('/college-info')
}}
>编辑</span>
......@@ -250,6 +252,7 @@ export default class CollegeManagePage extends React.Component {
return null;
};
User.setStoreId(item.id);
User.setStoreUserId(item.storeUserId);
window.RCHistory.push('/home')
}}
>
......@@ -267,6 +270,7 @@ export default class CollegeManagePage extends React.Component {
e.preventDefault();
e.stopPropagation();
User.setStoreId(item.id);
User.setStoreUserId(item.storeUserId);
window.RCHistory.push('/college-info')
}}
>编辑</span>
......
......@@ -10,6 +10,7 @@ import './CreateCollege.less';
let cutFlag = false;
export default class CreateCollege extends React.Component {
constructor(props) {
super(props);
this.state = {
......@@ -18,6 +19,7 @@ export default class CreateCollege extends React.Component {
name: '',
enterpriseId: User.getEnterpriseId(),
};
this.loginInputRef = React.createRef()
}
componentDidMount() {
......@@ -200,11 +202,11 @@ export default class CreateCollege extends React.Component {
</div>
<div className="create-box">
<div className="image-box">
<img className="image" src="https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png"/>
<img className="image" src={logo}/>
<div className="image-mask">
<span
className="icon iconfont"
onClick={() => this.refs.logoInput.click()}
onClick={() => this.loginInputRef.current.click()}
>&#xe6f5;</span>
<span
className="icon iconfont"
......@@ -241,7 +243,7 @@ export default class CreateCollege extends React.Component {
type="file"
accept="image/*"
value={""}
ref="logoInput"
ref={this.loginInputRef}
style={{ display: "none" }}
onChange={this.handleSelectCover}
/>
......
......@@ -35,12 +35,13 @@ function Header(props) {
const [list, setList] = useState([]);
const [openDropdown, setOpenDropdown] = useState(false);
const [instScroll, setInstScroll] = useState(false);
const [topLeftLogo, setTopLeftLogo] = useState("https://image.xiaomaiketang.com/xm/WEsMPAYxAs.png")
const ctx = useContext(XMContext);
const htmlUrl = `${LIVE_SHARE}store/index?id=${User.getStoreId()}&userId=${User.getUserId()}&from=work_weixin`;
const storeUserId = User.getStoreUserId();
const enterpriseId = User.getEnterpriseId();
const messageHelpRef = useRef(null)
const domRef = useRef(null);
const listRef = useRef(list);
......@@ -50,13 +51,23 @@ function Header(props) {
setStoreName(value);
});
getStoreList();
getTopLeftLogo()
}, []);
useEffect(() => {
storeUserId && getUserInfo();
enterpriseId ? getEnterpriseUser() : User.setIsAdmin(false);
}, [storeUserId]);
useEffect(()=> {
if (!messageHelpRef.current) {
return
}
if (menuType) {
messageHelpRef.current.style.marginLeft = "194px"
} else {
messageHelpRef.current.style.marginLeft = "76px"
}
},[menuType])
function getUserInfo() {
const param = {
......@@ -81,15 +92,6 @@ function Header(props) {
});
}
function getTopLeftLogo() {
if (User.getToken()) {
StoreService.getStoreDetail({storeId:User.getStoreId()})
.then(res=> {
setTopLeftLogo(res.result.logo)
})
}
}
function getStoreList() {
if (!enterpriseId) return null;
const params = {
......@@ -231,10 +233,10 @@ function Header(props) {
return (
<div id="top-container" className="top-container">
<div className="top top-nav">
<div>
{/* <div>
<img src={topLeftLogo} className="logo" alt="" />
</div>
<div className="message-help">
</div> */}
<div className="message-help" ref={messageHelpRef}>
{list.length ? (
<ClickOutside
onClickOutside={() => {
......
@import '../../core/variables.less';
@top-height: 60px;
@top-height: 0px;
@menu-bakg: #FFF;
@active-color: #2966FF;
.left-container {
......@@ -12,6 +12,23 @@
width: @xm-left-width;
background: @menu-bakg;
color: #333;
.topLogo {
height: 62px;
background: rgba(255, 255, 255, 0.5);
.img1 {
width: 138px;
height: 35px;
margin-left: 19px;
margin-top: 13px;
}
.img0 {
display: none;
width: 35px;
height: 35px;
margin-left: 10px;
margin-top: 13px;
}
}
.menu-type-icon{
margin:4px 0 0px 150px;
cursor: pointer;
......
import React, { useContext, useEffect, useState } from 'react';
import React, { useContext, useEffect, useRef, useState } from 'react';
import {
withRouter,
} from 'react-router-dom';
import { Menu} from 'antd';
import { menuList } from '../../routes//config/menuList'
import { XMContext } from '../../store/context';
import Service from "@/common/js/service";
import StoreService from "@/domains/store-domain/storeService";
import User from "@/common/js/user";
import _ from 'underscore';
import "./Menu.less";
console.log('2021-06-17')
const { SubMenu } = Menu;
function Aside(props: any) {
......@@ -14,6 +18,9 @@ function Aside(props: any) {
const ctx: any = useContext(XMContext);
const [selectKey, setSelectKey] = useState();
const [openKeys, setOpenKeys] = useState(['']);
const [topLogoUrl, setTopLogoUrl] = useState("")
const logoImg0Ref = useRef<any>()
const logoImg1Ref = useRef<any>()
const rootSubmenuKeys = _.pluck(menuList, 'groupCode');
useEffect(() => {
const link = props.location.pathname;
......@@ -31,6 +38,22 @@ function Aside(props: any) {
return item;
})
}, [props.location.pathname])
useEffect(()=> {
getTopLeftLogo()
})
function getTopLeftLogo() {
if (User.getToken()) {
StoreService.getStoreDetail({storeId:User.getStoreId()})
.then(res=> {
if (_.isEmpty(res.result.logo)) {
setTopLogoUrl("https://image.xiaomaiketang.com/xm/fe4NCjr7XF.png")
} else {
setTopLogoUrl(res.result.logo)
}
})
}
}
function toggleMenu(item: any) {
window.RCHistory.push(item.link)
}
......@@ -44,6 +67,23 @@ function Aside(props: any) {
function handleMenu() {
handleMenuType();
}
useEffect(()=> {
if (!logoImg0Ref.current || !logoImg1Ref.current) {
return
}
if (!menuType) {
if (topLogoUrl.indexOf("xiaomaiketang.com") < 0) {
logoImg0Ref.current.style.display = "none"
logoImg1Ref.current.style.display = "none"
} else {
logoImg0Ref.current.style.display = "inline"
logoImg1Ref.current.style.display = "none"
}
} else {
logoImg0Ref.current.style.display = "none"
logoImg1Ref.current.style.display = "inline"
}
},[menuType])
return (
<div
......@@ -54,6 +94,10 @@ function Aside(props: any) {
: "left-container left-container-vertical"
}
>
<div className="topLogo">
<img ref={logoImg0Ref} src="https://image.xiaomaiketang.com/xm/c4KiP2epBP.png" alt="" className="img0"></img>
<img ref={logoImg1Ref} src={topLogoUrl} alt="" className="img1"></img>
</div>
<div className="menu-type-icon" onClick={handleMenu}>
{menuType ? (
<span
......
......@@ -2,7 +2,7 @@
* @Author: yuananting
* @Date: 2021-02-23 18:28:50
* @LastEditors: fusanqiasng
* @LastEditTime: 2021-06-16 09:59:04
* @LastEditTime: 2021-06-16 17:35:55
* @Description: 助学工具-课程分类
* @Copyrigh: © 2020 杭州杰竞科技有限公司 版权所有
*/
......@@ -484,15 +484,7 @@ class CourseCategoryManage extends Component {
};
let movedCategory = this.movedNodeFind(newTreeData, info.dragNode.id);
let parentCategory = movedCategory.parentId === '0' ? firstParentNode : this.movedNodeFind(newTreeData, targetParentId);
// let params = {
// movedCategory,
// parentCategory,
// source: 0,
// tenantId: User.getStoreId(),
// userId: User.getStoreUserId(),
// };
let params = {
categoryList: newTreeData,
movedCategory,
parentCategory,
source: 0,
......
import React from 'react';
import { Modal, Button, message } from 'antd';
import { Modal, message } from 'antd';
import html2canvas from 'html2canvas';
import User from "../../../common/js/user";
import QRCode from '../../../libs/qrcode/qrcode';
......@@ -27,7 +27,6 @@ class ExamShareModal extends React.Component {
handleConvertShortUrl = () => {
const longUrl = `${LIVE_SHARE}test_detail/${this.props.data.examId}?id=${User.getStoreId()}`
console.log(longUrl)
// 发请求
Service.Sales('public/businessShow/convertShortUrls', {
urls: [longUrl]
......
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