358 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from "react";
import Head from 'next/head';
import Image from 'next/image';
import Link from "next/link";
import cookie from 'cookie';
import { connect } from "react-redux";
import numeral from "numeral";
import pluralize from 'pluralize-ru';
import { SpinnerCircular } from 'spinners-react';
import { withRouter } from 'next/router';
import { reduxWrapper } from '../../store';
import InnerMenu from "./components/InnerMenu";
import Header from '../components/Header';
import Footer from '../components/Footer';
import Pagination from '../components/Pagination';
import Company from "../components/Company";
import { getUsers, sendPhoneChangeNumber, sendPhoneChangeNumberSmsCode, setUserPhone } from '../../actions';
class Form extends React.Component
{
constructor(props)
{
super(props);
this.state = {
name: "",
email: "",
selection: false,
selected_companies_all: false,
selected_companies_list: [],
};
}
_handle_onChange = (field, value) =>
{
this.setState({ [ field ]: value });
}
_handle_onCompaniesSelection = () =>
{
this.setState({ selection: this.state.selection ? false : true });
}
_handle_onChangeCompanies_all = () =>
{
const { selected_companies_all } = this.state;
this.setState({ selected_companies_all: selected_companies_all ? false : true });
}
_handle_onCompanySelect = (company) =>
{
const { selected_companies_list } = this.state;
const selected_companies = [];
let add = true;
for(let i in selected_companies_list)
{
if(selected_companies_list[i].inn !== company.inn)
{
selected_companies.push(selected_companies_list[i]);
}
else
{
add = false;
}
}
if(add)
{
selected_companies.push(company);
}
this.setState({ selected_companies_list: selected_companies });
}
render()
{
const { companies } = this.props;
const { name, email, selection, selected_companies_all, selected_companies_list, } = this.state;
return (
<div className="table_row editable">
<div className="table_cell" data-title="ФИО пользователя">
<input type="text" placeholder="Введите ФИО" value={ name } onChange={ (event) => { this._handle_onChange("name", event.target.value) } }/>
</div>
<div className="table_cell" data-title="Почта">
<input type="email" placeholder="Введите почту" value={ email } onChange={ (event) => { this._handle_onChange("email", event.target.value) } }/>
</div>
<div className="table_cell" data-title="Роль">Пользователь</div>
<div className="table_cell" data-title="Доступные организации">
<button className="settings_dropdown" data-selected="false" onClick={ this._handle_onCompaniesSelection }>{ selected_companies_all || selected_companies_list.length > 0 ? selected_companies_all ? "Все организации" : selected_companies_list.map((company, index) => <p key={ index }>{ company.title }</p>) : "Выберите организацию" }</button>
<div className={ `dropdown_list ${ selection ? 'opened' : '' }` }>
<div className="list_item">
<input type="checkbox" value="" name="companies_list" id="company_1" hidden checked={ selected_companies_all } onChange={ this._handle_onChangeCompanies_all }/>
<label htmlFor="company_1">
Все организации
</label>
</div>
{ companies !== undefined && companies !== null && companies.map((company, index) => (
<div className="list_item">
<input type="checkbox" value={ company.inn } name="companies_list" id={ `company_${ index }` } hidden onChange={ () => this._handle_onCompanySelect(company) }/>
<label htmlFor={ `company_${ index }` }>
{ company.title }
<span>ИНН: { company.inn } { company.kpp !== undefined && company.kpp !== null && `КПП: ${ company.kpp }` }</span>
</label>
</div>
)) }
</div>
</div>
<div className="table_cell" data-title="Статус">-</div>
<div className="table_cell delete" style={{ position: 'relative' }}>
<button className="delete_user" title="Удалить пользователя"></button>
</div>
</div>
)
}
}
class AdminPage extends React.Component
{
constructor(props)
{
super(props);
this.state = {
loading: false,
user: {},
users: null,
companies: null,
add: false,
edit: false,
};
}
static getDerivedStateFromProps(nextProps, prevState)
{
return {
user: nextProps.user,
users: nextProps.users,
companies: nextProps.companies,
};
}
componentDidMount()
{
this.setState({ loading: true }, () =>
{
getUsers({ dispatch: this.props.dispatch })
.then(() =>
{
this.setState({ loading: false, })
})
.catch(() =>
{
});
});
}
_handle_onAdd = () =>
{
this.setState({ add: true });
}
_handle_onEdit = () =>
{
this.setState({ edit: true });
}
_handle_onSave = () =>
{
this.setState({ add: false, edit: false });
}
render()
{
const { user, users, companies, add, edit } = this.state;
console.log("users");
console.log(users);
console.log(".".repeat(100));
console.log("user");
console.log(user);
console.log(".".repeat(100));
console.log("companies");
console.log(companies);
return (
<React.Fragment>
<Head>
<title>ЛК Эволюция автолизинга</title>
<meta
name="description"
content="ЛК Эволюция автолизинга"
/>
</Head>
<Header { ...this.props }/>
<main>
<section>
<div className="clear"></div>
<div className="container">
<div className="title_wrapper">
<div className="left">
<h1 className="section_title">Личный кабинет</h1>
</div>
<Company { ...this.props }/>
</div>
<div className="aside_container about">
<InnerMenu { ...this.props }/>
<article>
<div className="settings_user_control">
<p>Настройки доступа к личному кабинету</p>
<div>
{ add || edit ? (
<button className="button button-blue" onClick={ this._handle_onSave }>Сохранить</button>
) : (
<>
<button className="button button-blue" onClick={ this._handle_onAdd }>Добавить пользователя</button>
<button className="button button-blue" onClick={ this._handle_onEdit }>Редактировать</button>
</>
) }
</div>
</div>
<div className="settings_table editable">
<div className="table_header table_row">
<div className="table_cell">ФИО пользователя</div>
<div className="table_cell">Почта</div>
<div className="table_cell">Роль</div>
<div className="table_cell">Доступные организации</div>
<div className="table_cell">Статус</div>
<div className="table_cell"></div>
</div>
{ users !== undefined && users !== null && users.map((entry, index) =>
{
if(entry.email === user.email)
{
return (
<div className="table_row" key={ index }>
<div className="table_cell" data-title="ФИО пользователя">{ entry.name } (Вы)</div>
<div className="table_cell" data-title="Почта">{ entry.email }</div>
<div className="table_cell" data-title="Роль">Администратор</div>
<div className="table_cell" data-title="Доступные организации">Все организации</div>
<div className="table_cell" data-title="Статус">Активен</div>
<div className="table_cell delete" style={{ position: 'relative' }}>
</div>
</div>
)
}
return null;
}) }
{ users !== undefined && users !== null && users.map((entry, index) =>
{
if(entry.email !== user.email)
{
return (
<div className="table_row" key={ index }>
<div className="table_cell" data-title="ФИО пользователя">{ entry.name }</div>
<div className="table_cell" data-title="Почта">{ entry.email }</div>
<div className="table_cell" data-title="Роль">Администратор</div>
<div className="table_cell" data-title="Доступные организации">{ entry.companies.map((company, c_index) => (
<p key={ c_index }>{ company.title }</p>
)) }</div>
<div className="table_cell" data-title="Статус">Активен</div>
<div className="table_cell delete" style={{ position: 'relative' }}>
</div>
</div>
)
}
return null;
}) }
{/*}
{ user !== undefined && user !== null && user.email !== undefined && user.email !== null && (
<div className="table_row">
<div className="table_cell" data-title="ФИО пользователя">{ `${ user.lastname } ${ user.name } ${ user.secondname }` }</div>
<div className="table_cell" data-title="Почта">{ user.email }</div>
<div className="table_cell" data-title="Роль">Администратор</div>
<div className="table_cell" data-title="Доступные организации">Все организации</div>
<div className="table_cell" data-title="Статус">Активен</div>
<div className="table_cell delete" style={{ position: 'relative' }}>
</div>
</div>
) }
{*/}
{/*}
<div className="table_row">
<div className="table_cell" data-title="ФИО пользователя">Иванов Иван Иванович</div>
<div className="table_cell" data-title="Почта">iivanov@mail.com</div>
<div className="table_cell" data-title="Роль">Администратор</div>
<div className="table_cell" data-title="Доступные организации">Все организации</div>
<div className="table_cell" data-title="Статус">Активен</div>
<div className="table_cell delete" style={{ position: 'relative' }}>
<button className="delete_user" title="Удалить пользователя"></button>
</div>
</div>
{*/}
{ add && (
<Form companies={ companies }/>
) }
{/*}
{*/}
</div>
</article>
</div>
</div>
</section>
</main>
<Footer authenticated={ true }/>
</React.Fragment>
)
}
}
function mapStateToProps(state, ownProps)
{
return {
user: state.user,
users: state.admin.users,
companies: state.companies.list,
}
}
export const getServerSideProps = reduxWrapper.getServerSideProps(store =>
async ({ req, res, query }) =>
{
let props = {};
if(req.headers.cookie !== undefined)
{
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
if(cookies.jwt === undefined || cookies.jwt === null)
{
res.statusCode = 302;
res.setHeader('Location', `/login`);
}
else
{
//const tokenValid = await checkToken(cookies.jwt);
const tokenValid = true;
if(!tokenValid)
{
res.statusCode = 302;
res.setHeader('Location', `/login`);
}
}
}
else
{
res.statusCode = 302;
res.setHeader('Location', `/login`);
}
return { props: props };
}
);
export default withRouter(connect(mapStateToProps)(AdminPage));