Commit 374c13ad authored by Maofei94's avatar Maofei94

merge: merge

parents a3bf4073 7213e1ef
......@@ -9,7 +9,7 @@ module.exports = options => ({
output: Object.assign(
{
path: path.resolve(process.cwd(), 'build'),
publicPath: process.env.PUBLIC_PATH || '/reactOMS',
publicPath: process.env.PUBLIC_PATH || '/CivManage',
},
options.output,
), // Merge with env dependent settings
......
......@@ -18,8 +18,8 @@ module.exports = require('./webpack.base.babel')({
// Utilize long-term caching by adding content hashes (not compilation hashes) to compiled assets
output: {
filename: 'static/[name].[chunkhash].js',
chunkFilename: 'static/[name].[chunkhash].chunk.js',
filename: 'static/[name].[chunkhash:8].js',
chunkFilename: 'static/[name].[chunkhash:8].chunk.js',
},
optimization: {
......
import React, { useState, useEffect } from 'react';
import { Spin, Button, Empty } from 'antd';
import { Spin, Checkbox, Button, Empty } from 'antd';
import _ from 'lodash';
import ListCardItem from './ItemCard';
import styles from './ItemCard.less';
......@@ -60,6 +60,32 @@ const ListCard = props => {
// console.timeEnd('updateValueList:');
};
const checkAll = e => {
if (e.target.checked) {
const result = dataList.map(item => getAllID(item)).flat(Infinity);
setValueList(result);
// eslint-disable-next-line no-unused-expressions
onChange && onChange(result);
} else {
setValueList([]);
// eslint-disable-next-line no-unused-expressions
onChange && onChange([]);
}
};
const getAllID = item => {
let result = [];
const haveChildren =
Array.isArray(item.children) && item.children.length > 0;
// 统一使用 getId
result.push(getId(item));
if (haveChildren) {
// 每次递归result被置空,所以要另外保存
result = [...item.children.map(i => getAllID(i)), ...result];
}
return result;
};
return (
<div>
{loading ? (
......@@ -77,6 +103,7 @@ const ListCard = props => {
/>
) : (
<>
<Checkbox onChange={checkAll}>全选/全不选</Checkbox>
{dataList && dataList.length > 0 ? (
dataList
.filter(d => d.type === 'widgetGroup' || 'widget')
......
......@@ -17,7 +17,21 @@
background-size: 75px 75px, 75px 75px, 15px 15px, 15px 15px;
}
}
.modal {
.ant-tabs-content{
height: 100%;
.ant-tabs-tabpane{
padding-left: 0 !important;
}
}
.ant-tabs-content-holder{
padding: 5px 0;
}
.ant-modal-body{
padding-top: 0;
padding-bottom: 0;
}
}
.wallBtn {
position: absolute;
left: 140px;
......@@ -42,9 +56,15 @@
.imgBox {
display: flex;
flex-wrap: wrap;
max-height: 520px;
max-height: calc(100% - 40px);
overflow: auto;
.ant-collapse-content-box{
display: flex;
flex-wrap: wrap;
}
.ant-collapse{
width: 100%;
}
.imgItem {
flex: 0 0 75px;
position: relative;
......
import React from 'react';
import { Upload, Modal, message, Tabs, Result, Input } from 'antd';
import { Upload, Modal, message, Tabs, Result, Input, Collapse } from 'antd';
import { PlusOutlined, CheckCircleFilled } from '@ant-design/icons';
import ImgCrop from 'antd-img-crop';
import classnames from 'classnames';
......@@ -47,6 +47,7 @@ interface PicturesWallType {
value?: string | string[],
uploadContext: any,
search: string,
actives: any,
}
class PicturesWall extends React.Component<PicturesWallType> {
......@@ -59,6 +60,7 @@ class PicturesWall extends React.Component<PicturesWallType> {
curSelectedImg: '',
prevProps:{},
search: '',
actives: {},
fileList: this.props.value ? Array.isArray(this.props.value) ? this.props.value.map((v) => ({
url: v,
uid: uuid(8, 16),
......@@ -100,9 +102,12 @@ class PicturesWall extends React.Component<PicturesWallType> {
}
}
if(imgBed != state.prevProps.uploadContext?.imgBed){
const activeKeys = {};
imgBed.forEach(item => activeKeys[item.moduleName] = item.child.map(c => c.moduleName));
return {
prevProps: props,
imgBed
imgBed,
actives: activeKeys,
}
}
return {
......@@ -234,6 +239,57 @@ class PicturesWall extends React.Component<PicturesWallType> {
return match&&match[1]||''
}
renderImgItem(url){
const fileName = this.getFileName(url)
const {curSelectedImg, search} = this.state;
return (
<div
className={classnames({
[styles.imgItem]:true,
[styles.hide]: !fileName.includes(search)
})}
key={url}
onClick={() => this.handleImgSelected(url)}>
<div
className={classnames(
curSelectedImg === url ? styles.seleted : '',
)}
>
<img
className={classnames({
[styles.svgGray]: /\.svg$/.test(url)
})}
src={this.getImageUrl(url)}
title={url}
alt="熊猫运维中台系统" />
<span className={styles.iconBtn}>
<CheckCircleFilled />
</span>
</div>
<span>{fileName}</span>
</div>
);
}
renderCollapse(module){
const { Panel } = Collapse;
const items = module.fileUrls.map(url =>this.renderImgItem(url))
return items.length>0&&<Panel
forceRender
header={module.moduleName}
key={module.moduleName}>
{items}
</Panel>
}
handleCollapseChange(v, moduleName){
const activeKeys = {...this.state.actives}
activeKeys[moduleName] = v;
this.setState({
actives: activeKeys
})
}
render() {
const {
previewVisible,
......@@ -242,6 +298,7 @@ class PicturesWall extends React.Component<PicturesWallType> {
previewTitle,
wallModalVisible,
imgBed,
actives,
curSelectedImg,
} = this.state;
const {
......@@ -328,11 +385,12 @@ class PicturesWall extends React.Component<PicturesWallType> {
width={860}
onCancel={this.handleModalCancel}
onOk={this.handleModalOk}
className={styles.modal}
>
<Tabs defaultActiveKey={imgBed[0]?.moduleName} tabPosition="left" style={{ height: 520 }}>
{imgBed.map((item, i) => {
return (
<TabPane tab={tabNames[item.moduleName]} key={item.moduleName}>
<TabPane tab={tabNames[item.moduleName]||item.moduleName} key={item.moduleName}>
<Input
placeholder="搜索图库"
className={styles.search}
......@@ -341,30 +399,12 @@ class PicturesWall extends React.Component<PicturesWallType> {
onChange={e => this.setState({search: e.target.value})}
allowClear/>
<div className={styles.imgBox}>
{item.child?.map(m => m.fileUrls).flat(Infinity).map((item: string, i: number) => {
const fileName = this.getFileName(item)
return (
<div
className={classnames({
[styles.imgItem]:true,
[styles.hide]: !fileName.includes(this.state.search)
})}
key={i}
onClick={() => this.handleImgSelected(item)}>
<div
className={classnames(
curSelectedImg === item ? styles.seleted : '',
)}
>
<img className={classnames({[styles.svgGray]: /\.svg$/.test(item)})} src={this.getImageUrl(item)} title={item} alt="熊猫运维中台系统" />
<span className={styles.iconBtn}>
<CheckCircleFilled />
</span>
</div>
<span>{fileName}</span>
</div>
);
})}
<Collapse
bordered
activeKey={actives[item.moduleName]}
onChange={(v) => this.handleCollapseChange(v, item.moduleName)}>
{item.child?.map(child => this.renderCollapse(child))}
</Collapse>
</div>
</TabPane>
);
......
......@@ -59,10 +59,13 @@ const Login = props => {
}
}
if (userMode === USER_MODE.COMMON) {
const authority = [AUTHORITY.LOGIN, AUTHORITY.COMMON];
setAuthority(authority);
setAuth(authority);
history.push(`/userCenter/UserManage`);
// const authority = [AUTHORITY.LOGIN, AUTHORITY.COMMON];
// setAuthority(authority);
// setAuth(authority);
// history.push(`/userCenter/UserManage`);
notification.warning({
message: msg || '没有权限!',
});
}
} else {
notification.warning({
......
......@@ -496,7 +496,7 @@ const UserManage = () => {
const changePassword = record => {
setPasswordVisible(true);
passwordForm.setFieldsValue({
oldpassword: record.password,
oldPassword: record.password,
newPassword: '',
passwordConfirm: '',
});
......@@ -867,7 +867,7 @@ const UserManage = () => {
});
// 提交-修改密码
const submitChangePassword = () => {
const password = passwordForm.getFieldValue('password');
const oldPassword = passwordForm.getFieldValue('oldPassword');
const newPassword = passwordForm.getFieldValue('newPassword');
const passwordConfirm = passwordForm.getFieldValue('passwordConfirm');
if (
......@@ -877,14 +877,13 @@ const UserManage = () => {
newPassword.length >= 6 &&
newPassword === passwordConfirm
) {
updateUserPassword(
currentUser.userID,
password,
newPassword,
passwordConfirm,
)
updateUserPassword({
UserId: +currentUser.userID,
OldPassWord: oldPassword,
NewPassWord: newPassword,
})
.then(res => {
if (res.success) {
if (res.code === 0) {
setPasswordVisible(false);
notification.success({
message: '提交成功',
......@@ -1404,7 +1403,7 @@ const UserManage = () => {
cancelText="取消"
>
<Form form={passwordForm} labelCol={{ span: 4 }}>
<Form.Item name="oldpassword" label="原始密码">
<Form.Item name="oldPassword" label="原始密码">
<Input disabled />
</Form.Item>
<Form.Item
......
......@@ -185,6 +185,7 @@
.ant-tree-switcher{
line-height: 1;
color:#1890FF;
margin-right: 0px !important;
}
.ant-checkbox-group .ant-checkbox-group-item {
margin-right: 0px !important;
......
......@@ -110,20 +110,8 @@ export const addToOrgs = (userIDs, orgIDs, newOrgID) =>
newGroupId: newOrgID,
});
export const updateUserPassword = (
userID,
oldpassword,
newPassword,
passwordConfirm,
) =>
get(`${CITY_SERVICE}/OMS.svc/U_UpdatePassword`, {
_version: 9999,
_dc: Date.now(),
userID,
oldpassword,
newPassword,
passwordConfirm,
});
export const updateUserPassword = params =>
post(`${PUBLISH_SERVICE}/UserCenter/UpdateUserPassword`, params);
export const editUser = (userID, loginName, userName, phone, email) =>
get(`${CITY_SERVICE}/OMS.svc/U_EditUser`, {
......
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