Skip to content

Commit cbd2c32

Browse files
committed
feat: ✨ V1 of the component
0 parents  commit cbd2c32

24 files changed

+15026
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

.storybook/main.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
"stories": [
3+
"../stories/**/*.stories.mdx",
4+
"../stories/**/*.stories.@(js|jsx|ts|tsx)"
5+
],
6+
"addons": [
7+
"@storybook/addon-links",
8+
"@storybook/addon-essentials"
9+
]
10+
}

.storybook/preview.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const parameters = {
2+
actions: { argTypesRegex: "^on[A-Z].*" },
3+
controls: {
4+
matchers: {
5+
color: /(background|color)$/i,
6+
date: /Date$/,
7+
},
8+
},
9+
}

dist/index.es.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

+14,787
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"name": "react-multy-csv-viewer",
3+
"version": "1.0.0",
4+
"description": "'component to visualize a csv file for react app'",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1",
8+
"storybook": "start-storybook -p 6006",
9+
"build-storybook": "build-storybook",
10+
"build-lib": "rollup -c"
11+
},
12+
"author": "Ibrahima Diama ka",
13+
"license": "ISC",
14+
"devDependencies": {
15+
"@babel/core": "^7.14.6",
16+
"@babel/preset-react": "^7.14.5",
17+
"@rollup/plugin-node-resolve": "^13.0.0",
18+
"@storybook/addon-actions": "^6.3.2",
19+
"@storybook/addon-essentials": "^6.3.2",
20+
"@storybook/addon-links": "^6.3.2",
21+
"@storybook/react": "^6.3.2",
22+
"antd": "^4.16.6",
23+
"babel-loader": "^8.2.2",
24+
"papaparse": "^5.3.1",
25+
"react": "^17.0.2",
26+
"react-dom": "^17.0.2",
27+
"rollup": "^2.52.7",
28+
"rollup-plugin-babel": "^4.4.0",
29+
"rollup-plugin-peer-deps-external": "^2.2.4",
30+
"rollup-plugin-terser": "^7.0.2"
31+
},
32+
"peerDependencies": {
33+
"antd": "^4.16.6",
34+
"papaparse": "^5.3.1",
35+
"react": "^17.0.2",
36+
"react-dom": "^17.0.2"
37+
},
38+
"dependencies": {}
39+
}

rollup.config.js

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import babel from "rollup-plugin-babel";
2+
import resolve from "@rollup/plugin-node-resolve";
3+
import external from "rollup-plugin-peer-deps-external";
4+
import { terser } from "rollup-plugin-terser";
5+
// import postcss from 'rollup-plugin-postcss';
6+
7+
export default [
8+
{
9+
input: "./src/index.js",
10+
output: [
11+
{
12+
file: "dist/index.js",
13+
format: "cjs",
14+
},
15+
{
16+
file: "dist/index.es.js",
17+
format: "es",
18+
exports: "named",
19+
},
20+
],
21+
plugins: [
22+
// postcss({
23+
// plugins: [],
24+
// minimize: true,
25+
// }),
26+
babel({
27+
exclude: "node_modules/**",
28+
presets: ["@babel/preset-react"],
29+
}),
30+
external(),
31+
resolve(),
32+
terser(),
33+
],
34+
},
35+
];
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import React from "react";
2+
import { UploadFile } from "../upload";
3+
4+
export const MultipleCsvViewer = () => {
5+
return (
6+
<div>
7+
<UploadFile />
8+
</div>
9+
);
10+
};

src/components/Main/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./MultipleCsvViewer";

src/components/tabs/DisplayData.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React from "react";
2+
import { Row, Col, Table, Tabs } from "antd";
3+
import "antd/dist/antd.css";
4+
5+
const { TabPane } = Tabs;
6+
7+
export const DisplayData = ({ dataTransformed }) => {
8+
return (
9+
<Row>
10+
<Col span={24}>
11+
<Tabs defaultActiveKey="1" centered>
12+
{dataTransformed.map(({ name, data, colomns }, index) => {
13+
return (
14+
<TabPane key={index + 1} tab={name}>
15+
<Table dataSource={data} columns={colomns} />
16+
</TabPane>
17+
);
18+
})}
19+
</Tabs>
20+
</Col>
21+
</Row>
22+
);
23+
};

src/components/tabs/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./DisplayData";

src/components/upload/UploadFile.js

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import React, { useState } from "react";
2+
import { Row, Col, Upload, Button } from "antd";
3+
import * as Papa from "papaparse";
4+
import "antd/dist/antd.css";
5+
6+
import { DisplayData } from "../tabs";
7+
8+
export const UploadFile = () => {
9+
const [fileTransformed, setFileTransformed] = useState([]);
10+
const handleUploadFile = async (file) => {
11+
let fileTransformed = [];
12+
const { fileList } = file;
13+
for (let file of fileList) {
14+
const { originFileObj, name } = file;
15+
const csvString = await readUploadedFileAsText(originFileObj);
16+
const [data, colomns] = transformCsvToArray(csvString);
17+
18+
fileTransformed.push({ name, data, colomns });
19+
}
20+
//console.log(fileTransformed);
21+
setFileTransformed(fileTransformed);
22+
};
23+
24+
const transformCsvToArray = (csvString) => {
25+
const { data } = Papa.parse(csvString, {
26+
header: true,
27+
});
28+
const colomns = makeColomn(data[0]);
29+
return [data, colomns];
30+
};
31+
32+
const makeColomn = (object) => {
33+
let colonmsField = [];
34+
for (const [key] of Object.entries(object)) {
35+
colonmsField.push(key);
36+
}
37+
38+
const colomns = colonmsField.map((colomn) => {
39+
return {
40+
title: colomn.toUpperCase(),
41+
dataIndex: colomn,
42+
key: colomn,
43+
};
44+
});
45+
46+
return colomns;
47+
};
48+
49+
const readUploadedFileAsText = (inputFile) => {
50+
const temporaryFileReader = new FileReader();
51+
52+
return new Promise((resolve, reject) => {
53+
temporaryFileReader.onerror = () => {
54+
temporaryFileReader.abort();
55+
reject(new DOMException("Problem parsing input file."));
56+
};
57+
58+
temporaryFileReader.onload = () => {
59+
resolve(temporaryFileReader.result);
60+
};
61+
temporaryFileReader.readAsText(inputFile);
62+
});
63+
};
64+
65+
return (
66+
<Row gutter={[48, 0]}>
67+
<Col span={24}>
68+
<Upload
69+
accept=".txt, .csv"
70+
onChange={handleUploadFile}
71+
multiple={true}
72+
action={false}
73+
//showUploadList={{ showRemoveIcon: false }}
74+
showUploadList={false}
75+
>
76+
<Button>Choose File</Button>
77+
</Upload>
78+
</Col>
79+
{fileTransformed.length && (
80+
<Col span={24}>
81+
<DisplayData dataTransformed={fileTransformed} />
82+
</Col>
83+
)}
84+
</Row>
85+
);
86+
};
87+
88+
//export default UploadFile;

src/components/upload/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./UploadFile";

src/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./components/Main";

stories/UploadFile.stories.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import React from "react";
2+
import { storiesOf } from "@storybook/react";
3+
4+
import { MultipleCsvViewer } from "../src/components/Main";
5+
6+
const stories = storiesOf("App test", module);
7+
8+
stories.add("App", () => {
9+
return <MultipleCsvViewer />;
10+
});

stories/assets/code-brackets.svg

+1
Loading

stories/assets/colors.svg

+1
Loading

0 commit comments

Comments
 (0)