rate mobile fixes

This commit is contained in:
merelendor 2023-08-29 15:30:38 +03:00
parent 41a4d824e8
commit 3c34e9fb2c
17 changed files with 753 additions and 589 deletions

View File

@ -4,7 +4,10 @@ import Router from 'next/router';
import moment from 'moment';
import { nSQL } from "@nano-sql/core";
/*
import * as actionTypes from '../constants/actionTypes';
import * as currentState from '../reducers/initialState';
/*DEALS_LIST
/lk/ConsiderationOpportunity/quote
[{
@ -24,24 +27,76 @@ import { nSQL } from "@nano-sql/core";
"model_name": "Touareg",
"object_count": 1,
}]
[{
"opp_number": "780",
"statuscode_id": 107,
"statuscode_name": " ",
"comment": null,
}, {
"opp_number": "37197",
"statuscode_id": 101,
"statuscode_name": " ",
"comment": null,
}]
opp_number- номер Лизинговой сделки
statuscode_id - номер этапа
statuscode_name - имя этапа
comment - сопроводительный текст для данного этапа, который надо выводить
*/
export const getDeals = ({ dispatch }) =>
{
//console.log("ACTION", "support", "getAppeals()", `${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/support/appeals`);
console.log("ACTION", "deals", "getDeals()", `${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/deals`);
return new Promise((resolve, reject) =>
{
axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/deals/list`, {}, {
console.log("??????????????????????? WTF");
axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/deals`, {}, {
withCredentials: true,
})
.then((response) =>
{
//console.log("ACTION", "support", "getAppeals()", "response", response.data);
dispatch({ type: actionTypes.DEALS, data: {} });
console.log("!!!!!!!!!!!!!!!!!!!!!!!!! GOOOOOOD");
console.log("ACTION", "deals", "getDeals()", "response", response.data);
dispatch({
type: actionTypes.DEALS_LIST,
data: {
list: [{
"opp_number": "780",
"statuscode_id": 107,
"statuscode_name": " ",
"comment": null,
}, {
"opp_number": "37197",
"statuscode_id": 101,
"statuscode_name": " ",
"comment": null,
}]
}
});
resolve();
})
.catch((error) =>
{
console.log("!!!!!!!!!!!!!!!!!!!!!!!!! ERROR", { action: actionTypes.DEALS_LIST });
dispatch({
type: actionTypes.DEALS_LIST,
data: {
list: [{
"opp_number": "780",
"statuscode_id": 107,
"statuscode_name": " ",
"comment": null,
}, {
"opp_number": "37197",
"statuscode_id": 101,
"statuscode_name": " ",
"comment": null,
}]
}
});
console.error(error);
reject();
});

View File

@ -13,4 +13,5 @@ export * from './supportActions';
export * from './adminActions';
export * from './suggestsActions';
export * from './questionnaireActions';
export * from './feedbackActions';
export * from './feedbackActions';
export * from './dealsActions';

View File

@ -0,0 +1,45 @@
import React from "react";
import DealsListDeal from "./DealsListDeal";
import SingleDeal from "./SingleDeal";
export default class DealsList extends React.Component
{
constructor(props)
{
super(props);
}
render()
{
const { deals, dealSelected } = this.props;
console.log({ deals });
return (
<div className="contractStatus_list">
{ deals.list !== undefined && deals.list !== null && deals.list.map((deal, index) =>
{
if(index === dealSelected)
{
return (<SingleDeal
key={ index }
close={() => {
this._handleModalToggle("current")
}}
/>)
}
else
{
return (
<DealsListDeal
key={ index }
index={ index }
{ ...deal }
/>
)
}
} )}
</div>
)
}
}

View File

@ -0,0 +1,55 @@
import React from "react";
import pluralize from 'pluralize-ru';
const statuses = [
{
title: "Сбор пакета документов",
icon: "/assets/images/status/1.svg",
}
];
export default class DealsListDeal extends React.Component
{
constructor(props)
{
super(props)
}
render()
{
const { index, comment, opp_number, statuscode_id, statuscode_name } = this.props;
const step = statuscode_id - 100;
console.log("deal list item", { props: this.props });
return (
<div className="list_item">
<div>
<p>Сделка { index + 1 }</p>
</div>
<div>
<p>
{ step === 0 ? "Не начата" : `${ step } ${ pluralize(step, 'этапа', 'этап', 'этапа', 'этапов') } ${ pluralize(step, 'пройдено', 'пройден', 'пройдено', 'пройдено') }` }
{/*}
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#8E94A7" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75" />
</svg>
{*/}
</p>
</div>
<div>
<img src="/assets/images/status/1.svg" width="50" height="50" />
<p>Сбор пакета документов</p>
</div>
<div>
<button className="button" onClick={() => { this._handleModalToggle("all") }} >
Еще 4 этапа
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#1C01A9" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75" />
</svg>
</button>
</div>
</div>
)
}
}

View File

@ -0,0 +1,308 @@
import React from "react"
export default class SingleDeal extends React.Component
{
constructor(props)
{
super(props);
}
render()
{
const { close } = this.props;
return (
<div className="contractStatus_modal">
{/*}
<div className="modal_header">
<p className="modal_title">Статус сделки</p>
<button className="modal_close" onClick={close}></button>
</div>
{*/}
<div className="modal_body single_status">
<div className="current">
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_1"></i>
<p>Выбор КП</p>
</div>
<div className="wrap">
<table>
<thead>
<tr>
<th></th>
<th></th>
<th>Стоимость</th>
<th>Первый платеж, р.</th>
<th>Первый платеж, %</th>
<th>Марка</th>
<th>Модель</th>
<th>Объектов лизинга</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div className="form_field checkbox">
<input type="checkbox" name="row" id="row" checked="" onChange={ () => {} }/>
<label htmlFor="row"></label>
</div>
</td>
<td>1</td>
<td>5 600 000 р.</td>
<td>560 000 р.</td>
<td>10 %</td>
<td>Audi</td>
<td>A8</td>
<td>1</td>
<td>
<div className="dosc_list">
<div className="row">
<div className="small-icon">
<p className="doc_name i-pdf">
КП
<span>1</span>
</p>
</div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div className="form_field checkbox">
<input type="checkbox" name="row" id="row" checked="" onChange={ () => {} }/>
<label htmlFor="row"></label>
</div>
</td>
<td>1</td>
<td>5 600 000 р.</td>
<td>560 000 р.</td>
<td>10 %</td>
<td>Audi</td>
<td>A8</td>
<td>1</td>
<td>
<div className="dosc_list">
<div className="row">
<div className="small-icon">
<p className="doc_name i-pdf">
КП
<span>1</span>
</p>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_2"></i>
<p className="header">Программа финансирования</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_3"></i>
<p>Сборка пакета документов</p>
</div>
<div className="wrap">
<div className="message ok">
<p>Вам не требуется актуализация данных анкеты Клиента</p>
</div>
<div className="message alert">
<p>Требуется обновить данные в анкете</p>
<button className="button button-blue">Актуализировать данные</button>
</div>
<div className="message wait">
<p>Проводится проверка анкеты Вашей организации</p>
</div>
<p><b>Устав организации</b></p>
<div className="attach_file">
<label>
<input type="file" hidden onChange={ () => {} }/>
Прикрепить скан документов
</label>
</div>
<div className="message documents">
<div className="doc_list">
<div className="dosc_list medium-icon">
<div className="row">
<p className="doc_name i-pdf i-medium">123/2023 от 01.01.2023</p>
</div>
</div>
<div className="dosc_list medium-icon">
<div className="row">
<p className="doc_name i-pdf i-medium">123/2023 от 01.01.2023</p>
</div>
</div>
</div>
<p>Документы, отправленные Вами принадлежат другой организации бла бла коммент от менеджера</p>
</div>
<div className="attach_file">
<label>
<input type="file" hidden onChange={ () => {} }/>
Прикрепить ещё
</label>
</div>
<p><b>Другое название документа</b></p>
<div className="attach_file">
<label>
<input type="file" hidden onChange={ () => {} }/>
Прикрепить скан документов
</label>
</div>
</div>
</div>
</div>
<div className="">
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_4"></i>
<p>Проверка документов</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_5"></i>
<p>Принятие решения по заявке</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_6"></i>
<p>Оформление лизинга</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_7"></i>
<p>Выбор типа подписания</p>
</div>
<div className="wrap">
<div className="block-column">
<div className="dropdown_block open" >
<div className="block_header default">
<p><b>Подготовлено 3 из 12</b></p>
</div>
</div>
<div className="dosc_list acts_list-checkbox medium-icon">
<div className="row">
<p className="doc_name i-doc i-medium" >
<input type="checkbox" name="" id="" checked="" onChange={ () => {} }/>
<label htmlFor="">2022_6875 от 28.06.2022</label>
</p>
</div>
</div>
<div className="block_footer_btn">
<button className="button button-blue">Подписать в ЭДО</button>
<button className="button button-blue">Подписать в бумажном виде</button>
</div>
</div>
<div className="block-column">
<div className="dropdown_block open" >
<div className="block_header default">
<p><b>К подписанию 3 из 12</b></p>
</div>
</div>
<div className="dosc_list medium-icon">
<div className="row flex-start">
<p className="doc_name i-doc i-medium" >
123/2023 от 01.01.2023
</p>
<button className="button">Перейти в ЭДО</button>
</div>
<div className="row flex-start">
<p className="doc_name i-doc i-medium" >
123/2023 от 01.01.2023
</p>
<button className="button">Скачать документ</button>
<button className="button">Загрузить подписанный экземпляр</button>
</div>
</div>
</div>
<div className="block-column">
<div className="dropdown_block open" >
<div className="block_header default">
<p><b>Подписано 3 из 12</b></p>
</div>
</div>
<div className="dosc_list medium-icon">
<div className="row">
<p className="doc_name i-doc i-medium" >
<a href="#">Скачать 129/2023 от 01.01.2023 - Ожидание оплаты</a>
</p>
</div>
</div>
</div>
<div className="block-column">
<div className="dropdown_block open">
<div className="block_header default">
<p><b>Подготовлено 3 из 12</b></p>
</div>
</div>
<div className="dosc_list medium-icon">
<div className="row">
<p className="doc_name i-doc i-medium">
123/2023 от 01.01.2023
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
}

View File

@ -1,310 +1,8 @@
import React from "react"
import { connect } from "react-redux"
class SingleDeal extends React.Component
{
constructor(props)
{
super(props);
}
render()
{
const { close } = this.props;
return (
<div className="contractStatus_modal">
<div className="modal_header">
<p className="modal_title">Статус сделки</p>
<button className="modal_close" onClick={close}></button>
</div>
<div className="modal_body single_status">
<div className="current">
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_1"></i>
<p>Выбор КП</p>
</div>
<div className="wrap">
<table>
<thead>
<tr>
<th></th>
<th></th>
<th>Стоимость</th>
<th>Первый платеж, р.</th>
<th>Первый платеж, %</th>
<th>Марка</th>
<th>Модель</th>
<th>Объектов лизинга</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div className="form_field checkbox">
<input type="checkbox" name="row" id="row" checked="" onChange={ () => {} }/>
<label htmlFor="row"></label>
</div>
</td>
<td>1</td>
<td>5 600 000 р.</td>
<td>560 000 р.</td>
<td>10 %</td>
<td>Audi</td>
<td>A8</td>
<td>1</td>
<td>
<div className="dosc_list">
<div className="row">
<div className="small-icon">
<p className="doc_name i-pdf">
КП
<span>1</span>
</p>
</div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div className="form_field checkbox">
<input type="checkbox" name="row" id="row" checked="" onChange={ () => {} }/>
<label htmlFor="row"></label>
</div>
</td>
<td>1</td>
<td>5 600 000 р.</td>
<td>560 000 р.</td>
<td>10 %</td>
<td>Audi</td>
<td>A8</td>
<td>1</td>
<td>
<div className="dosc_list">
<div className="row">
<div className="small-icon">
<p className="doc_name i-pdf">
КП
<span>1</span>
</p>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_2"></i>
<p className="header">Программа финансирования</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_3"></i>
<p>Сборка пакета документов</p>
</div>
<div className="wrap">
<div className="message ok">
<p>Вам не требуется актуализация данных анкеты Клиента</p>
</div>
<div className="message alert">
<p>Требуется обновить данные в анкете</p>
<button className="button button-blue">Актуализировать данные</button>
</div>
<div className="message wait">
<p>Проводится проверка анкеты Вашей организации</p>
</div>
<p><b>Устав организации</b></p>
<div className="attach_file">
<label>
<input type="file" hidden onChange={ () => {} }/>
Прикрепить скан документов
</label>
</div>
<div class="message documents">
<div className="doc_list">
<div class="dosc_list medium-icon">
<div class="row">
<p class="doc_name i-pdf i-medium">123/2023 от 01.01.2023</p>
</div>
</div>
<div class="dosc_list medium-icon">
<div class="row">
<p class="doc_name i-pdf i-medium">123/2023 от 01.01.2023</p>
</div>
</div>
</div>
<p>Документы, отправленные Вами принадлежат другой организации бла бла коммент от менеджера</p>
</div>
<div className="attach_file">
<label>
<input type="file" hidden onChange={ () => {} }/>
Прикрепить ещё
</label>
</div>
<p><b>Другое название документа</b></p>
<div className="attach_file">
<label>
<input type="file" hidden onChange={ () => {} }/>
Прикрепить скан документов
</label>
</div>
</div>
</div>
</div>
<div className="">
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_4"></i>
<p>Проверка документов</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_5"></i>
<p>Принятие решения по заявке</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_6"></i>
<p>Оформление лизинга</p>
</div>
<div className="wrap">
<div className="single_text">
<p>Статусный текст о том что выбирается программа финансированияи может быть по центру иконочка часиков или слева от статусного текста иконочка часиков</p>
</div>
</div>
</div>
</div>
<div>
<p>Сделка 1</p>
<span></span>
<div className="status_body">
<div className="status_header">
<i className="status_7"></i>
<p>Выбор типа подписания</p>
</div>
<div className="wrap">
<div className="block-column">
<div className="dropdown_block open" >
<div className="block_header default">
<p><b>Подготовлено 3 из 12</b></p>
</div>
</div>
<div className="dosc_list acts_list-checkbox medium-icon">
<div className="row">
<p className="doc_name i-doc i-medium" >
<input type="checkbox" name="" id="" checked="" onChange={ () => {} }/>
<label for="">2022_6875 от 28.06.2022</label>
</p>
</div>
</div>
<div className="block_footer_btn">
<button className="button button-blue">Подписать в ЭДО</button>
<button className="button button-blue">Подписать в бумажном виде</button>
</div>
</div>
<div className="block-column">
<div className="dropdown_block open" >
<div className="block_header default">
<p><b>К подписанию 3 из 12</b></p>
</div>
</div>
<div className="dosc_list medium-icon">
<div className="row flex-start">
<p className="doc_name i-doc i-medium" >
123/2023 от 01.01.2023
</p>
<button className="button">Перейти в ЭДО</button>
</div>
<div className="row flex-start">
<p className="doc_name i-doc i-medium" >
123/2023 от 01.01.2023
</p>
<button className="button">Скачать документ</button>
<button className="button">Загрузить подписанный экземпляр</button>
</div>
</div>
</div>
<div className="block-column">
<div className="dropdown_block open" >
<div className="block_header default">
<p><b>Подписано 3 из 12</b></p>
</div>
</div>
<div className="dosc_list medium-icon">
<div className="row">
<p className="doc_name i-doc i-medium" >
<a href="#">Скачать 129/2023 от 01.01.2023 - Ожидание оплаты</a>
</p>
</div>
</div>
</div>
<div className="block-column">
<div className="dropdown_block open">
<div className="block_header default">
<p><b>Подготовлено 3 из 12</b></p>
</div>
</div>
<div className="dosc_list medium-icon">
<div className="row">
<p className="doc_name i-doc i-medium">
123/2023 от 01.01.2023
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
}
import DealsList from "./DealsList";
import SingleDeal from "./SingleDeal";
import { getDeals } from "../../actions";
class AllContractsModal extends React.Component
{
@ -378,105 +76,33 @@ class AllContractsModal extends React.Component
}
}
class DealsList extends React.Component
{
constructor(props)
{
super(props)
}
render()
{
return (
<div className="contractStatus_list">
<div className="list_item">
<div>
<p>Сделка 1</p>
</div>
<div>
<p>
2 этапа пройдено
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#8E94A7" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75" />
</svg>
</p>
</div>
<div>
<img src="/assets/images/status/1.svg" width="50" height="50" />
<p>Сбор пакета документов</p>
</div>
<div>
<p>
еще 4 этапа
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#8E94A7" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75" />
</svg>
</p>
</div>
<div>
<button className="button" onClick={() => { this._handleModalToggle("all") }} >
Все сделки
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#1C01A9" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75" />
</svg>
</button>
</div>
</div>
<div className="list_item">
<div>
<p>Сделка 1</p>
</div>
<div>
<p onClick={() => { this._handleModalToggle("current") }} >
2 этапа пройдено
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#8E94A7" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75"/>
</svg>
</p>
</div>
<div>
<img src="/assets/images/status/3.svg" width="50" height="50" />
<p>Сбор пакета документов</p>
</div>
<div>
<p onClick={() => { this._handleModalToggle("current") }} >
еще 4 этапа
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#8E94A7" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75" />
</svg>
</p>
</div>
<div>
<button className="button" onClick={() => { this._handleModalToggle("all") }}>
Все сделки
<svg xmlns="http://www.w3.org/2000/svg" width={18} height={18} fill="none">
<path stroke="#1C01A9" strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14.625 6.75 9 12.375 3.375 6.75" />
</svg>
</button>
</div>
</div>
</div>
)
}
}
class DealsStatus extends React.Component
{
constructor(props)
{
super(props)
this.state = {
currentContractModalOpened: false,
allContractModalOpened: false,
currentSelected: null
currentContractModalOpened: false,
allContractModalOpened: false,
currentSelected: null,
dealSelected: false,
deals: undefined,
}
}
static getDerivedStateFromProps(nextProps, prevState) {
return {}
static getDerivedStateFromProps(nextProps, prevState)
{
console.log("DealsStatus", "getDerivedStateFromProps", { nextProps });
return {
deals: nextProps.deals,
}
}
componentDidMount() { }
componentDidMount()
{
const { dispatch } = this.props;
getDeals({ dispatch });
}
componentDidUpdate(prevProps, prevState) { }
@ -505,17 +131,14 @@ class DealsStatus extends React.Component
render()
{
const { currentContractModalOpened, allContractModalOpened, currentSelected } = this.state
const { currentContractModalOpened, allContractModalOpened, currentSelected, dealSelected, deals } = this.state
return (
<>
<DealsList/>
<SingleDeal
close={() => {
this._handleModalToggle("current")
}}
/>
<div>
<p className="deals_list_title">Статусы сделок</p>
</div>
<DealsList deals={ deals } dealSelected={ dealSelected }/>
{/*}
<AllContractsModal
open={allContractModalOpened}
@ -533,7 +156,10 @@ class DealsStatus extends React.Component
function mapStateToProps(state, ownProps)
{
return {}
console.log({ "DealsStatus.state": state });
return {
deals: state.deals,
}
}
export default connect(mapStateToProps)(DealsStatus)

View File

@ -3610,6 +3610,12 @@ main .dropdown_blocks_list .dropdown_block .block_body .fines_detail ul li {
margin-bottom: -80px;
}
}
@media all and (max-width: 360px) {
.helpBox_wrapper.rate_opened {
width: 100vw;
margin: 0px;
}
}
.helpBox_wrapper .helpBox {
max-width: 730px;
background: #FFFFFF;
@ -3813,6 +3819,12 @@ main .dropdown_blocks_list .dropdown_block .block_body .fines_detail ul li {
justify-content: center;
animation: rate_body_shrink 0.25s normal forwards ease-in-out;
}
@media all and (max-width: 360px) {
.rate_us.opened .rate_body {
width: 100vw;
margin: 0px;
}
}
@keyframes rate_opened {
from {
width: 250px;
@ -5287,7 +5299,7 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
display: block !important;
}
.contractStatus_list {
margin: 50px 0;
margin: 20px 0;
}
.contractStatus_list .list_item {
display: flex;
@ -5371,13 +5383,11 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
background: url("/assets/images/status/line_2.jpg") repeat-x left center;
background-size: auto 13px;
}
.contractStatus_list .list_item div:nth-child(4) p {
.contractStatus_list .list_item div:nth-child(4) {
width: 150px;
cursor: pointer;
}
.contractStatus_list .list_item div:nth-child(5) {
width: 150px;
}
.contractStatus_list .list_item div:nth-child(5) button {
.contractStatus_list .list_item div:nth-child(4) button {
white-space: nowrap;
gap: 0 8px;
}
@ -5385,7 +5395,7 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block .block_body .fines_
margin-bottom: 5px;
}
.contractStatus_list .list_item:not(:last-child) div:nth-child(5) {
visibility: hidden;
/*visibility: hidden;*/
}
.opened .contractStatus_modal {
transform: translateY(0);

View File

@ -4032,6 +4032,13 @@ main .dropdown_blocks_list .dropdown_block .block_body {
margin-bottom: -80px;
}
&.rate_opened {
@media all and (max-width: 360px) {
width: 100vw;
margin: 0px;
}
}
.helpBox {
max-width: 730px;
background: #FFFFFF;
@ -4259,6 +4266,11 @@ main .dropdown_blocks_list .dropdown_block .block_body {
animation: rate_body_shrink 0.25s normal forwards ease-in-out;
}
@media all and (max-width: 360px) {
width: 100vw;
margin: 0px;
}
}
animation: rate_opened 0.25s normal forwards ease-in-out;
}
@ -6084,13 +6096,8 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block {
}
&:nth-child(4) {
p {
cursor: pointer;
}
}
&:nth-child(5) {
width: 150px;
cursor: pointer;
button {
white-space: nowrap;
@ -6103,7 +6110,7 @@ main .dropdown_blocks_list.zero-margin.gibdd .dropdown_block {
margin-bottom: 5px;
div:nth-child(5) {
visibility: hidden;
/*visibility: hidden;*/
}
}
}

View File

@ -625,6 +625,13 @@ div {
right: 5px;
}
}
.deals_list_title {
font-size: 26px;
font-weight: 700;
line-height: 35px;
margin-top: 35px;
margin-bottom: 15px;
}
.contracts_list_title {
font-size: 26px;
font-weight: 700;

View File

@ -669,6 +669,14 @@ div {
}
}
.deals_list_title {
font-size: 26px;
font-weight: 700;
line-height: 35px;
margin-top: 35px;
margin-bottom: 15px;
}
.contracts_list_title {
font-size: 26px;
font-weight: 700;

View File

@ -14,58 +14,71 @@ export default async function handler(req, res)
{
await cors(req, res);
if(req.headers.cookie !== undefined)
return new Promise(async (resolve) =>
{
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
console.log("req.body");
console.log(req.body);
if(cookies.jwt !== undefined && cookies.jwt !== null)
if(req.headers.cookie !== undefined)
{
console.log("cookies.jwt");
console.log(cookies.jwt);
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
var crm_jwt = jwt.sign(client_jwt_decoded, process.env.JWT_SECRET_CRM, { noTimestamp: true });
console.log("req.body");
console.log(req.body);
console.log("client_jwt_decoded", client_jwt_decoded);
console.log("crm_jwt", crm_jwt);
const url = `${ process.env.CRM_API_HOST }/lk/ConsiderationOpportunity`;
console.log({ url });
try
if(cookies.jwt !== undefined && cookies.jwt !== null)
{
await axios.get(url, {
params: { ...client_jwt_decoded, },
headers: {
"Authorization": `Bearer ${ crm_jwt }`,
},
withCredentials: true,
})
.then((crm_response) =>
{
console.log("API", "contract", "crm_response.data");
//console.log("API", "contract", crm_response.data);
console.log("cookies.jwt");
console.log(cookies.jwt);
res.status(200).json(crm_response.data);
})
.catch((error) =>
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
const crm_payload = { acc_number: client_jwt_decoded.acc_number };
var crm_jwt = jwt.sign(crm_payload, process.env.JWT_SECRET_CRM, { noTimestamp: true });
console.log("client_jwt_decoded", client_jwt_decoded);
console.log("crm_jwt", crm_jwt);
const url = `${ process.env.CRM_API_HOST }/lk/ConsiderationOpportunity`;
console.log({ url });
try
{
console.error(error);
res.status(500);
});
await axios.get(url, {
params: crm_payload,
headers: {
"Authorization": `Bearer ${ crm_jwt }`,
},
withCredentials: true,
})
.then((crm_response) =>
{
console.log("API", "contract", "crm_response.data");
//console.log("API", "contract", crm_response.data);
res.status(200).json(crm_response.data);
resolve();
})
.catch((error) =>
{
console.error(error);
res.status(500).send();
resolve();
});
}
catch(e)
{
console.error(e);
res.status(500).send();
resolve();
}
}
catch(e)
else
{
console.error(e);
res.status(500);
res.status(403).send();
resolve();
}
}
else
{
res.status(403);
res.status(403).send();
resolve();
}
}
});
}

View File

@ -4,132 +4,149 @@ import { SpinnerCircular } from "spinners-react"
import Rating from "../Rating"
import { getImage } from "../../../actions"
class Manager extends React.Component {
constructor(props) {
super(props)
this.state = {
company: {},
photo: undefined,
loading: true,
full: false
}
}
class Manager extends React.Component
{
constructor(props)
{
super(props)
this.state = {
company: {},
photo: undefined,
loading: true,
full: false,
rate: false,
}
}
static getDerivedStateFromProps(nextProps, prevState) {
return {
company: nextProps.company
}
}
static getDerivedStateFromProps(nextProps, prevState) {
return {
company: nextProps.company
}
}
componentDidMount() {
const { company } = this.state
componentDidMount()
{
const { company } = this.state;
this._loadManagerAvatar();
}
this._loadManagerAvatar()
}
componentDidUpdate(prevProps, prevState)
{
if (prevState.company.manager_photo === undefined && this.state.company.manager_photo !== undefined)
{
this._loadManagerAvatar();
}
}
componentDidUpdate(prevProps, prevState) {
if (prevState.company.manager_photo === undefined && this.state.company.manager_photo !== undefined) {
this._loadManagerAvatar()
}
}
_loadManagerAvatar = () =>
{
const { company } = this.state
_loadManagerAvatar = () => {
const { company } = this.state
if (company.manager_photo !== undefined && company.manager_photo !== null && company.manager_photo !== "")
{
getImage({ id: company.manager_photo }).then((result) => {
this.setState({ photo: result, loading: false });
});
}
else
{
if (company.manager_photo !== undefined) {
this.setState({ photo: null, loading: false });
}
}
}
if (company.manager_photo !== undefined && company.manager_photo !== null && company.manager_photo !== "") {
getImage({ id: company.manager_photo }).then((result) => {
this.setState({ photo: result, loading: false })
})
} else {
if (company.manager_photo !== undefined) {
this.setState({ photo: null, loading: false })
}
}
}
_handle_onFull = () =>
{
this.setState({ full: this.state.full ? false : true });
}
_handle_onFull = () => {
this.setState({ full: this.state.full ? false : true })
}
_handle_onRate = (rate) =>
{
this.setState({ rate });
}
render() {
const { company, loading, photo, full } = this.state
render()
{
const { company, loading, photo, full, rate } = this.state
return (
<div className="helpBox_wrapper">
<div className={`helpBox ${!full ? "hidden" : ""}`}>
<div className="avatar">
{loading ? (
<SpinnerCircular
size={24}
thickness={51}
speed={100}
color="rgba(28, 1, 169, 1)"
secondaryColor="rgba(236, 239, 244, 1)"
/>
) : (
<img
src={photo !== null ? photo : `/assets/images/icons/avatar.svg`}
loading="lazy"
alt={company.manager_fio}
/>
)}
</div>
<div className="content">
<p className="message">Помогу выбрать новый автомобиль</p>
<p className="name">{company.manager_fio}</p>
<p className="position">{company.manager_jobtitle}</p>
<div className="info">
<a href={`mailto:${company.manager_email}`}>{company.manager_email}</a>
{company.manager_mobilephone !== undefined &&
company.manager_mobilephone !== null &&
company.manager_mobilephone !== "" && (
<a href={`tel:+${company.manager_mobilephone.replace(/[^\d]/gm, "")}`}>
{company.manager_mobilephone}
</a>
)}
{company.manager_telegram !== undefined &&
company.manager_telegram !== null &&
company.manager_telegram !== "" && (
<a
href={`https://telegram.me/${company.manager_telegram.replace("@", "")}`}
target="_blank"
>{`@${company.manager_telegram.replace("@", "")}`}</a>
)}
</div>
</div>
<div className="button" onClick={this._handle_onFull}></div>
</div>
<div className={`helpBox_small interactive ${full ? "hidden" : ""}`} onClick={this._handle_onFull}>
<div className="avatar">
{loading ? (
<SpinnerCircular
size={24}
thickness={51}
speed={100}
color="rgba(28, 1, 169, 1)"
secondaryColor="rgba(236, 239, 244, 1)"
/>
) : (
<img
src={photo !== null ? photo : `/assets/images/icons/avatar.svg`}
loading="lazy"
alt={company.manager_fio}
/>
)}
</div>
</div>
return (
<div className={ `helpBox_wrapper ${ rate && "rate_opened" }` }>
<div className={`helpBox ${!full ? "hidden" : ""}`}>
<div className="avatar">
{ loading ? (
<SpinnerCircular
size={24}
thickness={51}
speed={100}
color="rgba(28, 1, 169, 1)"
secondaryColor="rgba(236, 239, 244, 1)"
/>
) : (
<img
src={photo !== null ? photo : `/assets/images/icons/avatar.svg`}
loading="lazy"
alt={company.manager_fio}
/>
) }
</div>
<div className="content">
<p className="message">Помогу выбрать новый автомобиль</p>
<p className="name">{company.manager_fio}</p>
<p className="position">{company.manager_jobtitle}</p>
<div className="info">
<a href={`mailto:${company.manager_email}`}>{company.manager_email}</a>
{ company.manager_mobilephone !== undefined &&
company.manager_mobilephone !== null &&
company.manager_mobilephone !== "" && (
<a href={`tel:+${company.manager_mobilephone.replace(/[^\d]/gm, "")}`}>
{company.manager_mobilephone}
</a>
) }
{ company.manager_telegram !== undefined &&
company.manager_telegram !== null &&
company.manager_telegram !== "" && (
<a
href={`https://telegram.me/${company.manager_telegram.replace("@", "")}`}
target="_blank"
>{`@${company.manager_telegram.replace("@", "")}`}</a>
) }
</div>
</div>
<div className="button" onClick={this._handle_onFull}></div>
</div>
<div className={`helpBox_small interactive ${full ? "hidden" : ""}`} onClick={this._handle_onFull}>
<div className="avatar">
{loading ? (
<SpinnerCircular
size={24}
thickness={51}
speed={100}
color="rgba(28, 1, 169, 1)"
secondaryColor="rgba(236, 239, 244, 1)"
/>
) : (
<img
src={photo !== null ? photo : `/assets/images/icons/avatar.svg`}
loading="lazy"
alt={company.manager_fio}
/>
)}
</div>
</div>
{/* Оценка */}
<Rating />
</div>
)
}
{/* Оценка */}
<Rating onRate={ this._handle_onRate }/>
</div>
)
}
}
function mapStateToProps(state, ownProps) {
return {
company: state.company
}
function mapStateToProps(state, ownProps)
{
return {
company: state.company
}
}
export default connect(mapStateToProps)(Manager)
export default connect(mapStateToProps)(Manager);

View File

@ -66,6 +66,8 @@ class Rating extends React.Component
hovered: newRating,
opened: true,
});
this.props.onRate(true);
}
_handle_onFieldChange = (field, value) =>
@ -95,6 +97,7 @@ class Rating extends React.Component
setTimeout(() => {
this.setState({ hidden: true })
this.props.onRate(false);
}, 1000);
setTimeout(() => {

View File

@ -547,13 +547,14 @@ class IndexPage extends React.Component
}
}
function mapStateToProps(state, ownProps) {
return {
company: state.company,
contracts: state.contracts.list,
page: state.contracts.page,
pages: state.contracts.pages
}
function mapStateToProps(state, ownProps)
{
return {
company: state.company,
contracts: state.contracts.list,
page: state.contracts.page,
pages: state.contracts.pages
}
}
export const getServerSideProps = reduxWrapper.getServerSideProps((store) => async ({ req, res, query }) => {

View File

@ -17,6 +17,12 @@ const dealsReducer = (state = initialState.deals, action) =>
case actionTypes.DEALS_LIST:
{
console.log("actionTypes.DEALS_LIST", actionTypes.DEALS_LIST, { action });
console.log({
...state,
list: action.data.list,
});
return {
...state,
list: action.data.list,

View File

@ -235,18 +235,18 @@ export const defaultState = {
deals:
{
loaded: false,
list: undefined,
list: null,
deal: {
loaded: false,
offers: {
list: undefined,
filtered: undefined,
list: null,
filtered: null,
},
documents: {
list: undefined,
list: null,
},
contracts: {
list: undefined,
list: null,
},
},
},

View File

@ -15,6 +15,7 @@ import contractsInfoReducer from '../reducers/contractsInfoReducer';
import contractEventsReducer from '../reducers/contractEventsReducer';
import contractFinesReducer from '../reducers/contractFinesReducer';
import questionnaireReducer from '../reducers/questionnaireReducer';
import dealsReducer from '../reducers/dealsReducer';
const combinedReducer = combineReducers({
auth: authReducer,
@ -31,6 +32,7 @@ const combinedReducer = combineReducers({
contract_events: contractEventsReducer,
contract_fines: contractFinesReducer,
questionnaire: questionnaireReducer,
deals: dealsReducer,
});
const makeStore = (context) =>