From 4269c7fe8167d4f54cb16c1e883fdd0c551e25b5 Mon Sep 17 00:00:00 2001 From: Daniel Stefan Date: Tue, 25 Jan 2022 20:22:44 +0200 Subject: [PATCH] feat: refactor staging table --- src/components/blocks/StagingDataGroups.js | 298 +++++++++++++++++++++ src/components/blocks/StagingDataTable.js | 8 +- src/components/blocks/index.js | 1 + src/pages/Projects/index.js | 6 +- 4 files changed, 307 insertions(+), 6 deletions(-) create mode 100644 src/components/blocks/StagingDataGroups.js diff --git a/src/components/blocks/StagingDataGroups.js b/src/components/blocks/StagingDataGroups.js new file mode 100644 index 00000000..27b7ff1a --- /dev/null +++ b/src/components/blocks/StagingDataGroups.js @@ -0,0 +1,298 @@ +/* eslint-disable */ +import React, { useEffect, useRef, useState } from 'react'; +import { useSelector } from 'react-redux'; +import styled, { withTheme } from 'styled-components'; +import { TableCellHeaderText, TableCellText } from '../typography'; +import { convertPascalCaseToSentenceCase } from '../../utils/stringUtils'; +import { Modal, MinusIcon, Body } from '..'; +import { TableDrawer } from '.'; +import { useWindowSize } from '../hooks/useWindowSize'; + +const StyledChangeGroup = styled('div')` + background: #f0f2f5; + margin: 20px 20px 20px 20px; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + position: relative; + flex-wrap: wrap; + padding: 40px 1%; +`; + +const StyledChangeCard = styled('div')` + background-color: white; + width: 33%; + min-width: 300px; + max-width: 500px; + border-radius: 5px; + cursor: pointer; +`; + +const StyledChangeCardTitle = styled('div')` + ${props => + props.displayInRed + ? ` background-color: #ffebee; + border: 2px solid #f5222d; + body { + color: #f5222d; + }` + : ` background-color: #ECF8E6; + border: 2px solid #52C41A; + body { + color: #52C41A; + }`} + padding: 15px 5px 8px 17px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +`; + +const StyledChangeCardBody = styled('div')` + padding: 8px 17px; +`; + +const StyledCardBodyItem = styled('div')` + padding: 4px; +`; + +const StyledDeleteGroupIcon = styled('div')` + position: absolute; + top: 20px; + right: 20px; + cursor: pointer; +`; + +const StagingDataGroupsContainer = styled('div')` + height: 100%; +`; + +const ChangeGroupHeader = ({ headings, appStore }) => { + return ( + + + {headings && + headings.map((heading, index) => ( + + + {convertPascalCaseToSentenceCase(heading)} + + + ))} + + + + + + + ); +}; + +const ChangeGroupItem = ({ + headings, + data, + appStore, + color, + onClick, + onDeleteStaging, +}) => { + return ( + <> + + {headings.map((key, index) => ( + + + {data[key] ? data[key].toString() : '--'} + + + ))} + + {onDeleteStaging && ( +
+ + + +
+ )} + + + + + + + ); +}; + +const InvalidChangeGroup = ({ onDeleteStaging, appStore, headings }) => { + return ( + <> + + + + + This change request has been corrupted, click here to remove. + + + + + {onDeleteStaging && ( +
+ + + +
+ )} + + + + ); +}; + +const ChangeCard = ({ headings, data, appStore, displayInRed, onClick }) => { + return ( + + + Project Details + + + {headings && + headings.map((heading, index) => ( + + + {convertPascalCaseToSentenceCase(heading)} + + {data[heading] ? data[heading] : '--'} + + ))} + + + ); +}; + +const StagingDataGroups = withTheme(({ headings, data, deleteStagingData }) => { + const appStore = useSelector(state => state.app); + const [getRecord, setRecord] = useState(null); + const [deleteFromStaging, setDeleteFromStaging] = useState(false); + const [deleteUUID, setDeleteUUID] = useState(); + const ref = useRef(null); + const [height, setHeight] = useState(0); + const windowSize = useWindowSize(); + + const changeGroupIsValid = changeGroup => { + if (!changeGroup.diff) { + return false; + } + + if (!changeGroup.diff.original || !changeGroup.diff.change) { + return false; + } + + if (changeGroup.diff.change.length === 1 && !changeGroup.diff.change[0]) { + return false; + } + + if ( + changeGroup.diff.change.length === 2 && + (!changeGroup.diff.change[0] || !changeGroup.diff.change[1]) + ) { + return false; + } + + return true; + }; + + useEffect(() => { + setHeight(windowSize.height - ref.current.getBoundingClientRect().top - 20); + }, [ref.current, windowSize.height, data]); + + const onDeleteStaging = uuid => { + if (!deleteStagingData) return null; + return () => { + deleteStagingData(uuid); + setDeleteFromStaging(false); + }; + }; + + console.log(data); + + return ( + +
+ {data && + headings && + data.map((changeGroup, index) => ( + <> + {changeGroupIsValid(changeGroup) && ( + + +
{ + setDeleteUUID(changeGroup.uuid); + setDeleteFromStaging(true); + }} + > + +
+
+ {changeGroup.action === 'DELETE' && ( + setRecord(changeGroup.diff.original)} + displayInRed + /> + )} + {changeGroup.action === 'INSERT' && ( + setRecord(changeGroup.diff.change[0])} + /> + )} + {changeGroup.action === 'UPDATE' && ( + setRecord(changeGroup.diff.original)} + displayInRed + /> + )} + {changeGroup.action === 'UPDATE' && + changeGroup.diff.change.map((change, index) => ( + setRecord(change)} + /> + ))} +
+ )} + + ))} + setRecord(null)} /> + {deleteFromStaging && ( + setDeleteFromStaging(false)} + onOk={onDeleteStaging(deleteUUID)} + /> + )} +
+
+ ); +}); + +export { StagingDataGroups }; diff --git a/src/components/blocks/StagingDataTable.js b/src/components/blocks/StagingDataTable.js index 1d083f00..c587e046 100644 --- a/src/components/blocks/StagingDataTable.js +++ b/src/components/blocks/StagingDataTable.js @@ -121,7 +121,8 @@ const ChangeGroupItem = ({ style={{ textAlign: 'right', paddingRight: '10px', - }}> + }} + > @@ -153,7 +154,8 @@ const InvalidChangeGroup = ({ onDeleteStaging, appStore, headings }) => { style={{ textAlign: 'right', paddingRight: '10px', - }}> + }} + > @@ -235,7 +237,7 @@ const StagingDataTable = withTheme(({ headings, data, deleteStagingData }) => { headings={headings} appStore={appStore} color={'red'} - onClick={setRecord(changeGroup.diff.original)} + onClick={() => setRecord(changeGroup.diff.original)} onDeleteStaging={() => { setDeleteUUID(changeGroup.uuid); setDeleteFromStaging(true); diff --git a/src/components/blocks/index.js b/src/components/blocks/index.js index 5f4161f4..c9223569 100644 --- a/src/components/blocks/index.js +++ b/src/components/blocks/index.js @@ -23,3 +23,4 @@ export * from './Message'; export * from './DateSelect'; export * from './LocalMessage'; export * from './UploadCSV'; +export * from './StagingDataGroups'; diff --git a/src/pages/Projects/index.js b/src/pages/Projects/index.js index 0e56744e..44de878b 100644 --- a/src/pages/Projects/index.js +++ b/src/pages/Projects/index.js @@ -13,7 +13,7 @@ import { AddIcon, SearchInput, PrimaryButton, - StagingDataTable, + StagingDataGroups, Tab, Tabs, TabPanel, @@ -327,7 +327,7 @@ const Projects = withRouter(() => { )} {climateWarehouseStore.stagingData && ( - @@ -347,7 +347,7 @@ const Projects = withRouter(() => { )} {climateWarehouseStore.stagingData && ( -