Skip to content

Commit 238a959

Browse files
authored
Merge pull request #167 from UgnisSoftware/UGN-369
feat UGN-369 - Improve performance for large files
2 parents 36f52c1 + 6eb1845 commit 238a959

3 files changed

Lines changed: 41 additions & 24 deletions

File tree

src/steps/UploadStep/components/DropZone.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ export const DropZone = ({ onContinue, isLoading }: DropZoneProps) => {
3939
onDrop: async ([file]) => {
4040
setLoading(true)
4141
const arrayBuffer = await readFileAsync(file)
42-
const workbook = XLSX.read(arrayBuffer, { cellDates: true, dateNF: dateFormat, raw: parseRaw })
42+
const workbook = XLSX.read(arrayBuffer, {
43+
cellDates: true,
44+
dateNF: dateFormat,
45+
raw: parseRaw,
46+
dense: true,
47+
})
4348
setLoading(false)
4449
onContinue(workbook)
4550
},

src/steps/ValidationStep/ValidationStep.tsx

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,25 @@ export const ValidationStep = <T extends string>({ initialData }: Props<T>) => {
7575

7676
const rowKeyGetter = useCallback((row: Data<T> & Meta) => row.__index, [])
7777

78-
const submitData = () => {
79-
const all = data.map(({ __index, __errors, ...value }) => ({ ...value })) as unknown as Data<T>[]
80-
const validData = all.filter((value, index) => {
81-
const originalValue = data[index]
82-
if (originalValue?.__errors) {
83-
return !Object.values(originalValue.__errors)?.filter((err) => err.level === "error").length
84-
}
85-
return true
86-
})
87-
const invalidData = all.filter((value) => !validData.includes(value))
88-
onSubmit({ validData, invalidData, all: data })
78+
const submitData = async () => {
79+
const calculatedData = data.reduce(
80+
(acc, value) => {
81+
const { __index, __errors, ...values } = value
82+
if (__errors) {
83+
for (const key in __errors) {
84+
if (__errors[key].level === "error") {
85+
acc.invalidData.push(values as unknown as Data<T>)
86+
return acc
87+
}
88+
}
89+
}
90+
acc.validData.push(values as unknown as Data<T>)
91+
return acc
92+
},
93+
{ validData: [] as Data<T>[], invalidData: [] as Data<T>[], all: data },
94+
)
95+
onSubmit(calculatedData)
96+
setShowSubmitAlert(false)
8997
onClose()
9098
}
9199
const onContinue = () => {
@@ -104,14 +112,7 @@ export const ValidationStep = <T extends string>({ initialData }: Props<T>) => {
104112

105113
return (
106114
<>
107-
<SubmitDataAlert
108-
isOpen={showSubmitAlert}
109-
onClose={() => setShowSubmitAlert(false)}
110-
onConfirm={() => {
111-
setShowSubmitAlert(false)
112-
submitData()
113-
}}
114-
/>
115+
<SubmitDataAlert isOpen={showSubmitAlert} onClose={() => setShowSubmitAlert(false)} onConfirm={submitData} />
115116
<ModalBody pb={0}>
116117
<Box display="flex" justifyContent="space-between" alignItems="center" mb="2rem" flexWrap="wrap" gap="8px">
117118
<Heading sx={styles.heading}>{translations.validationStep.title}</Heading>

src/stories/Default.stories.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import { ReactSpreadsheetImport } from "../ReactSpreadsheetImport"
22
import { Box, Link, Code, Button, useDisclosure } from "@chakra-ui/react"
33
import { mockRsiValues } from "./mockRsiValues"
44
import { useState } from "react"
5+
import type { Result } from "src/types"
56

67
export default {
78
title: "React spreadsheet import",
89
}
910

1011
export const Basic = () => {
11-
const [data, setData] = useState<any>(null)
12+
const [data, setData] = useState<Result<any> | null>(null)
1213
const { isOpen, onOpen, onClose } = useDisclosure()
1314
return (
1415
<>
@@ -22,9 +23,9 @@ export const Basic = () => {
2223
Download example file
2324
</Link>
2425
<ReactSpreadsheetImport {...mockRsiValues} isOpen={isOpen} onClose={onClose} onSubmit={setData} />
25-
{data && (
26+
{!!data && (
2627
<Box pt={64} display="flex" gap="8px" flexDirection="column">
27-
<b>Returned data:</b>
28+
<b>Returned data (showing first 100 rows):</b>
2829
<Code
2930
display="flex"
3031
alignItems="center"
@@ -34,7 +35,17 @@ export const Basic = () => {
3435
color="white"
3536
p={32}
3637
>
37-
<pre>{JSON.stringify(data, undefined, 4)}</pre>
38+
<pre>
39+
{JSON.stringify(
40+
{
41+
validData: data.validData.slice(0, 100),
42+
invalidData: data.invalidData.slice(0, 100),
43+
all: data.all.slice(0, 100),
44+
},
45+
undefined,
46+
4,
47+
)}
48+
</pre>
3849
</Code>
3950
</Box>
4051
)}

0 commit comments

Comments
 (0)