| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- import React, { Component } from 'react';
- import PropTypes from 'prop-types';
- import './index.scss';
- import { Icon, Layout, Tooltip, message, Row, Popconfirm } from 'antd';
- const { Content, Sider } = Layout;
- import ProjectEnvContent from './ProjectEnvContent.js';
- import { connect } from 'react-redux';
- import { updateEnv, getProject, getEnv } from '../../../../reducer/modules/project';
- import EasyDragSort from '../../../../components/EasyDragSort/EasyDragSort.js';
- @connect(
- state => {
- return {
- projectMsg: state.project.currProject
- };
- },
- {
- updateEnv,
- getProject,
- getEnv
- }
- )
- class ProjectEnv extends Component {
- static propTypes = {
- projectId: PropTypes.number,
- updateEnv: PropTypes.func,
- getProject: PropTypes.func,
- projectMsg: PropTypes.object,
- onOk: PropTypes.func,
- getEnv: PropTypes.func
- };
- constructor(props) {
- super(props);
- this.state = {
- env: [],
- _id: null,
- currentEnvMsg: {},
- delIcon: null,
- currentKey: -2
- };
- }
- initState(curdata, id) {
- let newValue = {};
- newValue['env'] = [].concat(curdata);
- newValue['_id'] = id;
- this.setState({
- ...this.state,
- ...newValue
- });
- }
- async componentWillMount() {
- this._isMounted = true;
- await this.props.getProject(this.props.projectId);
- const { env, _id } = this.props.projectMsg;
- this.initState(env, _id);
- this.handleClick(0, env[0]);
- }
- componentWillUnmount() {
- this._isMounted = false;
- }
- handleClick = (key, data) => {
- this.setState({
- currentEnvMsg: data,
- currentKey: key
- });
- };
- // 增加环境变量项
- addParams = (name, data) => {
- let newValue = {};
- data = { name: '新环境', domain: '', header: [] };
- newValue[name] = [].concat(data, this.state[name]);
- this.setState(newValue);
- this.handleClick(0, data);
- };
- // 删除提示信息
- showConfirm(key, name) {
- let assignValue = this.delParams(key, name);
- this.onSave(assignValue);
- }
- // 删除环境变量项
- delParams = (key, name) => {
- let curValue = this.state.env;
- let newValue = {};
- newValue[name] = curValue.filter((val, index) => {
- return index !== key;
- });
- this.setState(newValue);
- this.handleClick(0, newValue[name][0]);
- newValue['_id'] = this.state._id;
- return newValue;
- };
- enterItem = key => {
- this.setState({ delIcon: key });
- };
- // 保存设置
- async onSave(assignValue) {
- await this.props
- .updateEnv(assignValue)
- .then(res => {
- if (res.payload.data.errcode == 0) {
- this.props.getProject(this.props.projectId);
- this.props.getEnv(this.props.projectId);
- message.success('修改成功! ');
- if(this._isMounted) {
- this.setState({ ...assignValue });
- }
- }
- })
- .catch(() => {
- message.error('环境设置不成功 ');
- });
- }
- // 提交保存信息
- onSubmit = (value, index) => {
- let assignValue = {};
- assignValue['env'] = [].concat(this.state.env);
- assignValue['env'].splice(index, 1, value['env']);
- assignValue['_id'] = this.state._id;
- this.onSave(assignValue);
- this.props.onOk && this.props.onOk(assignValue['env'], index);
- };
- // 动态修改环境名称
- handleInputChange = (value, currentKey) => {
- let newValue = [].concat(this.state.env);
- newValue[currentKey].name = value || '新环境';
- this.setState({ env: newValue });
- };
- // 侧边栏拖拽
- handleDragMove = name => {
- return (data, from, to) => {
- let newValue = {
- [name]: data
- };
- this.setState(newValue);
- newValue['_id'] = this.state._id;
- this.handleClick(to, newValue[name][to]);
- this.onSave(newValue);
- };
- };
- render() {
- const { env, currentKey } = this.state;
- const envSettingItems = env.map((item, index) => {
- return (
- <Row
- key={index}
- className={'menu-item ' + (index === currentKey ? 'menu-item-checked' : '')}
- onClick={() => this.handleClick(index, item)}
- onMouseEnter={() => this.enterItem(index)}
- >
- <span className="env-icon-style">
- <span className="env-name" style={{ color: item.name === '新环境' && '#2395f1' }}>
- {item.name}
- </span>
- <Popconfirm
- title="您确认删除此环境变量?"
- onConfirm={e => {
- e.stopPropagation();
- this.showConfirm(index, 'env');
- }}
- okText="确定"
- cancelText="取消"
- >
- <Icon
- type="delete"
- className="interface-delete-icon"
- style={{
- display: this.state.delIcon == index && env.length - 1 !== 0 ? 'block' : 'none'
- }}
- />
- </Popconfirm>
- </span>
- </Row>
- );
- });
- return (
- <div className="m-env-panel">
- <Layout className="project-env">
- <Sider width={195} style={{ background: '#fff' }}>
- <div style={{ height: '100%', borderRight: 0 }}>
- <Row className="first-menu-item menu-item">
- <div className="env-icon-style">
- <h3>
- 环境列表 <Tooltip placement="top" title="在这里添加项目的环境配置">
- <Icon type="question-circle-o" />
- </Tooltip>
- </h3>
- <Tooltip title="添加环境变量">
- <Icon type="plus" onClick={() => this.addParams('env')} />
- </Tooltip>
- </div>
- </Row>
- <EasyDragSort data={() => env} onChange={this.handleDragMove('env')}>
- {envSettingItems}
- </EasyDragSort>
- </div>
- </Sider>
- <Layout className="env-content">
- <Content style={{ background: '#fff', padding: 24, margin: 0, minHeight: 280 }}>
- <ProjectEnvContent
- projectMsg={this.state.currentEnvMsg}
- onSubmit={e => this.onSubmit(e, currentKey)}
- handleEnvInput={e => this.handleInputChange(e, currentKey)}
- />
- </Content>
- </Layout>
- </Layout>
- </div>
- );
- }
- }
- export default ProjectEnv;
|