добавляю все изменения проекта на текущий момент

This commit is contained in:
vasya
2026-02-27 18:49:27 +03:00
parent e927910fda
commit 9c35f4e35e
303 changed files with 79434 additions and 2558 deletions
@@ -0,0 +1,387 @@
import { tr } from "date-fns/locale";
import React, { useEffect, useState, useMemo, useContext } from "react";
import { TaxiOrder_type, TaxiOrder_initial, TaxiOrder_fieldName, TaxiOrder_tableData } from '../types/taxiOrderType';
import { differenceInDays } from 'date-fns';
import { getCsrfToken } from "../../../../../resources/js/services/getCsrfService";
import { Button, TextInput, Select, Option } from '@SharePoint/rencredit_uikit';
import { EntityHistoryProps } from "../../../../../resources/js/components/entityHistory/EntityHistory";
import { HistoryProvider, HistoryContext } from "../../../../../resources/js/contexts/HistoryContext";
import { PopupContext } from "../../../../../resources/js/contexts/PopupContext";
import { PreloaderContext } from "../../../../../resources/js/contexts/PreloaderContext";
import api from "../../../../../resources/js/api";
type EmpSupervisorsData = {
emp_login: string,
emp_supervisor: string
}
export default function TaxiHome ()
{
//Массив полей для отображения в таблицах с заяками. Учитывается, в том числе, порядок
const rqstTableFields = ['id', 'emp_login', 'emp_supervisor', 'emp_phone', 'taxi_date', 'taxi_time', 'taxi_address_from', 'taxi_address_to', 'cancel_rqst'];
//Формируем объект с полями для таблицы
const rqstTableHeaderFields: Record<keyof TaxiOrder_tableData, string> = Object.assign({}, ...rqstTableFields.map( field => {return {[field]: TaxiOrder_fieldName[field]}}));
const rqstTableHeader:string[] = Object.keys(TaxiOrder_fieldName).map(rqstFieldName => TaxiOrder_fieldName[rqstFieldName]);
const [ccEmp, setCcEmp] = useState<string[]>([]);
//Стейт для руководителей сотрудников
const [empSupervisors, setEmpSupervisors] = useState<EmpSupervisorsData[]>([]);
const [allOrders, setAllOrders] = useState<TaxiOrder_type[]>([]);
const [filterOrders, setFilterOrders] = useState<TaxiOrder_type[]>([]);
const [startSearch, setStartSearch] = useState<boolean>(false);
const [rqstNumber, setRqstNumber] = useState<string>('');
const [rqstTime, setRqstTime] = useState<string>('');
const [rqstLogin, setRqstLogin] = useState<string>('');
const [orderTimePeriods, setOrderTimePeriods] = useState<[{time_period: string}]>([{time_period: ''}]);
const popupContext = useContext(PopupContext);
const preloaderContext = useContext(PreloaderContext);
useEffect ( () => {
api.get('/taxi/getTimePeriods',
).then(timePeriods_json => setOrderTimePeriods(timePeriods_json.data));
// fetch('/public/api/taxi/getTimePeriods', {
// method: 'GET',
// credentials: 'include',
// }).then(timePeriods_resp => timePeriods_resp.json().then( timePeriods_json => {
// setOrderTimePeriods(timePeriods_json);
// }));
setTimeout(() => {
popupContext.addPopupArrTest([
{message: 'для информации', timeOut: true, type: 'attention'}
])
popupContext.addPopupArrTest([
{message: 'ошибка', timeOut: true, type: 'error'}
])
}, 1000);
console.log(Object.keys(TaxiOrder_fieldName))
}, [])
//ГАВРИЛОВ
//ЕСЛИ ОБЪЕКТ СО ЗНАЧЕНИЯМИ ДЛЯ ПОИСКА ПУСТОЙ - НЕ ВЫПОЛНЯЕМ ПОИСК, ВОЗВРАЩАЕМ ОПОВЕЩЕНИЕ О ПУСТЫХ УСЛОВИЯХ
const getFilterOrders = () => {
console.log(rqstTime)
console.log(rqstNumber)
console.log(rqstLogin)
setStartSearch(true);
// ГАВРИЛОВ. проверь
api.post('/taxi/getFilterOrders', {
id: rqstNumber,
taxi_time: rqstTime,
emp_login: rqstLogin
}).then(filterOrdersJson => {
setFilterOrders(filterOrdersJson.data);
})
// fetch('/public/api/taxi/getFilterOrders', {
// credentials: 'include',
// method: 'POST',
// body: JSON.stringify({
// id: rqstNumber,
// taxi_time: rqstTime,
// emp_login: rqstLogin
// }),
// headers: {
// 'content-type': 'application/json'
// }
// }).then(filterOrdersRqst => filterOrdersRqst.json())
// .then(filterOrdersJson => {
// setFilterOrders(filterOrdersJson);
// })
}
const timePeriodOptions: Option<string>[] = useMemo(() => {
return orderTimePeriods.map((time: {time_period: string}) => {
return {
caption: time.time_period,
value: time.time_period,
id: time.time_period
}
})
}, [orderTimePeriods])
const empLoginOptions: Option<string>[] = useMemo(() => {
return ccEmp.map((empLogin: string) => {
return {
caption: empLogin,
value: empLogin,
id: empLogin
}
})
}, [ccEmp])
useEffect ( () => {
Promise.all(
[
// fetch('/public/api/taxi/getEmpInfo', {
// credentials: 'include',
// method: 'GET',
// }).then( empInfo_resp => empInfo_resp.json() ),
api.get('taxi/getEmpInfo'),
api.get('taxi/getActiveOrders'),
// fetch('/public/api/taxi/getActiveOrders', {
// credentials: 'include',
// method: 'GET',
// }).then( allOrders_resp => allOrders_resp.json() )
]
).then(
([
{data: empInfo_json},
{data: allOrders_json}
]) => {
setCcEmp(empInfo_json.map( (empInfoEl: {emp_login: String}) => empInfoEl.emp_login ));
setAllOrders(allOrders_json);
setEmpSupervisors(empInfo_json.map( (empInfoEl: {emp_login: String, emp_group: String}) => ({emp_login: empInfoEl.emp_login, emp_supervisor: empInfoEl.emp_group}) ));
}
)
}, [])
const isReady = ccEmp.length > 0 && orderTimePeriods.length > 0;
useEffect ( () => {
console.log(!isReady)
preloaderContext.setPreloaderVisible(!isReady)
// setPreloaderProp(!isReady);
// console.log(empSupervisors)
}, [isReady])
if (!ccEmp.length || !orderTimePeriods.length) {
//setIsReady(true);
return;
} else {
//setIsReady(false);
// console.log(allOrders);
console.log(ccEmp);
console.log(orderTimePeriods);
}
// ГАВРИЛОВ. ОФОРМИ РЕЗУЛЬТАТЫ ПОИСКА. ПОСЛЕ ПОИСКА ПЛАВНО ОПУСКАЙ ДО ТАБЛИЦЫ РЕЗУЛЬТАТЫ ПОИСКА, ТАКЖЕ ВЫВЕДИ ЗОТЯ БЫ ТЕКСТ "РЕЗУЛЬТАТЫ ПОИСКА, СЕЙЧАС ЭТО ПРОСТО ТАБЛИЦА"
//Гаврилов
//Реализовать подтягивание информации
//Реализовать переключение между БД (new and old Magic)
//console.log(sanctumToken())
let newDate = new Date('2024-06-05');
newDate.setHours(0, 0, 0);
// function callHistory(entityId) {
// console.log(entityId)
// return fakeObjArr;
// }
// let resultObj = {
// entityId: 1,
// entityProps: fakeObjArr
// }
return (
<div id='taxi-container'>
<Button
type = 'button'
text = 'Новая заявка'
onClick = {
() => document.location.href = 'createRqst'
}
className = "taxi-btn"
/>
<div className = "elem--title el-title--big">Активные заявки</div>
<div className='container__table-block' id='taxi__rqst--active'>
<HistoryProvider>
<RqstTable
allOrders={allOrders}
rqstTableHeader={rqstTableHeaderFields}
empSupervisors={empSupervisors}
/>
</HistoryProvider>
</div>
<div id="taxi__home__filter-form">
<div className = "elem--title el-title--big">Поиск заявки</div>
<form>
<input
type="hidden"
name="_token"
value={getCsrfToken()}
/>
<div>
<TextInput
labelText = 'Номер заявки'
value = {rqstNumber}
onChange = {(e: string) => setRqstNumber(e)}
/>
{/* <label htmlFor="">Номер заявки</label>
<input type="number" onChange={ e => {
setRqstNumber(e.target.value)
}}></input> */}
</div>
{/* <div>
<label htmlFor="">Дата с</label>
<input type="date" />
</div>
<div>
<label htmlFor="">Дата по</label>
<input type="date" />
</div> */}
<div>
<Select
labelText = "Время"
options = {timePeriodOptions}
size = '1'
onChange = { (e: string) => {
setRqstTime(e)
}}
/>
{/* <label htmlFor="">Время</label>
<select name="taxi_time" id="" onChange={ e => {
setRqstTime(e.target.value)
}}>
<option key='0' value=''></option>
{
orderTimePeriods.map( (timePeriodEl, timePeriodIndex ) =>
<option key={timePeriodIndex++} value={timePeriodEl.time_period}>{timePeriodEl.time_period}</option>
)
}
</select> */}
</div>
<div>
<Select
labelText = "Сотрудник"
options = {empLoginOptions}
size = '1'
onChange = { (e, selectedOption: {value: string}) => {
setRqstLogin(selectedOption.value)
}}
/>
{/* <label htmlFor="">Логин</label>
<select onChange={ e => setRqstLogin(e.target.value) }>
<option key="0" value=""></option>
{
ccEmp.map( (empDataEl: string, empDataIndex: number) =>
<option key={empDataIndex++} value={empDataEl}>{empDataEl}</option>
)
}
</select> */}
</div>
<Button
className = "taxi-btn"
type = 'button'
text = 'Искать'
onClick = { getFilterOrders }
size = 's'
ui = 'secondary'
/>
{/* <button type="button" onClick={getFilterOrders}>Искать</button> */}
</form>
</div>
<div id = "container__filter-rqst-table">
{
startSearch ?
<table>
<thead>
<tr>
{
rqstTableHeader.map( (headEl, headElIndex) =>
<th key={headElIndex} className = "table-header">
{headEl}
</th>)
}
</tr>
</thead>
<tbody>
{
filterOrders.length ?
filterOrders.map( (rqstData: TaxiOrder_type, rqstIndex: number) =>
<tr key={rqstIndex}>
{
Object.keys(TaxiOrder_initial).map(initField =>
<td>
{initField == 'cancel_rqst' ? (rqstData[initField] ? 'Нет' : 'Да') : rqstData[initField]}
</td>)
}
</tr>)
: <tr>
<td>Запросов не найдено</td>
</tr>
}
</tbody>
</table>
: ''
}
</div>
</div>
)
}
function RqstTable(props: {allOrders: TaxiOrder_type[], rqstTableHeader: Record<keyof TaxiOrder_tableData, string>, empSupervisors: EmpSupervisorsData[]}){
const historyContext = useContext(HistoryContext);
if (!historyContext) {
return null;
}
let newDate = new Date('2024-06-05');
newDate.setHours(0, 0, 0);
return (
props.allOrders.length ?
<table className="taxi-orders">
<thead>
<tr>
{
Object.entries(props.rqstTableHeader).map((el, index) =>
<th key={index} className="table-header">{el[1]}</th>
)
}
<th className = "table-header">Управление</th>
</tr>
</thead>
<tbody>
{
props.allOrders.map( (rqstData: TaxiOrder_type, rqstIndex: number) =>
<tr key = {rqstIndex}>
{
Object.entries(props.rqstTableHeader).map( el => {
return (
// Если поле - руководитель сотрудника - вычисляем значение, ориентируясь на список props.empSupervisors
el[0] === 'emp_supervisor' ?
<td key={el[0]}>{ props.empSupervisors.find(empData => empData.emp_login == rqstData.emp_login)?.emp_supervisor }</td>
: <td key={el[0]}>{ rqstData[el[0]] }</td>
)
})
}
<td className="taxi-orders__order-options">
{/* Можно взаимодействовать только с заявками на такси на сегодняшнюю, либо завтрашнюю дату */}
{differenceInDays(new Date(rqstData.taxi_date), new Date()) >= 0 && !rqstData.cancel_rqst ?
<>
<Button
type = 'button'
onClick = { () => { document.location.href = `editOrder/${rqstData.id}` } }
text = {'Редактировать'}
ui = 'secondaryPurple'
/>
<Button
type = 'button'
onClick = { () => { document.location.href = `cancelRqst/${rqstData.id}` } }
text = {'Отменить'}
ui = 'secondaryPurple'
/>
<Button
type = 'button'
onClick = { () => { historyContext.getHistoryFromMagic('taxi', rqstData.id, TaxiOrder_fieldName) } }
text = {'История'}
ui = 'secondaryPurple'
/>
</>
: ""
}
</td>
</tr>
)
}
</tbody>
</table>
: <div>Нет активных заявок</div>
)
}