import React, { useEffect, useMemo, useState, useContext } from "react"; import { createPortal } from "react-dom"; import './../../../css/components/entityHistory.css'; import { HistoryContext } from "../../contexts/HistoryContext"; //Тип с параметрами сущности, история по которой будет выводиться export type EntityHistoryProps = { changeAction: string, //Совершенное действие: создание, удаление, редактирование, архивирование и т.д. changeAuthor: string, //Автор изменения: логин, сервисная УЗ changeDate: Date //Объект даты изменения. В объекте будет либо время (тогда показываем), либо время будет отсутствовать (тогда не показываем) //что будем передавать? объект new Date или библиотечный объект для работы с датами? changeTime?: string //Время изменений. Передавать не нужно, на этабе сборки компонента будет формироваться на основе пропса changeDate // changeDetails?: HistoryEntityElDetails[] //Массив объектов с деталями изменений формата: изменяемое свойство(поле, например) - значение изменяемого свойства changeDetails?: Record //Массив объектов с деталями изменений формата: изменяемое свойство(поле, например) - значение изменяемого свойства }; //Тип с деталями изменений // type HistoryEntityElDetails = { // propName: string, //Имя измененного свойства // propValue: string //Значение измененного свойства // } //Компонент отображения истории изменений сущности export default function EntityHistory () { //ГАВРИЛОВ //ИДЕНТИЧНЫЙ СПРАВОЧНИК УКАЗАН НА СТОРОНЕ ЛАРАВЕЛЬ APP/ENUMS/LOGBUSINESSEVENTS. ЕСТЬ ВОЗМОЖНОСТЬ ОБЪЕДИНИТЬ ИХ? const HistoryActions = { create: 'создание', edit: 'редактирование', archive: 'архивация', restore: 'восстановление', delete: 'удаление', cancel: 'отмена', } const historyContext = useContext(HistoryContext); //Перестраиваем объект с изменениями, группируя их по датам const groupDataByDate = useMemo( () => { let changesByDate = {}, historyContent = historyContext.content.length ? historyContext.content : [] //Сортируем все изменения от большего к меньшему по дате и времени //ГАВРИЛОВ. или нужно отсортировать от меньшего к большему? мы хотим сверху самые актуальные данные а ниже менее актуальные или наоборот? //ПРОВЕРИТЬ СОРТИРУЕТСЯ ЛИ ПО ДАТАМ historyContent.sort( (a, b) => {return b.changeDate - a.changeDate} ) //console.log(historyContext) historyContent.forEach( (changeEl: EntityHistoryProps) => { let dateToString = changeEl.changeDate.toLocaleString('ru-RU').split(',')[0]; if ( !(dateToString in changesByDate) ) { changesByDate[dateToString] = []; } changesByDate[dateToString].push(changeEl); }); return changesByDate; }, [historyContext.content]); //Сокрытие блока показа истории function hideHistoryBlock(){ historyContext.hideHistory() } return ( historyContext.content && historyContext.visible ? createPortal(

{ historyContext.headerText.length ? historyContext.headerText : `История изменений запроса ${historyContext.entityId}` }

{Object.entries(groupDataByDate).map( (dateChanges, dateIndex) =>
{ dateChanges[0] }
{ dateChanges[1].map( (changeEl: EntityHistoryProps, elIndex: number) =>
{ HistoryActions[changeEl.changeAction] }
{ changeEl.changeAuthor }
{ changeEl.changeTime }
{Object.entries(changeEl.changeDetails).map( (detail, detailIndex) =>
{ (historyContext.dataFields && historyContext.dataFields[detail[0]]) ? historyContext.dataFields[detail[0]] : detail[0] }
{ detail[1] }
)}
)}
)}
, document.body ) : '' ) }