diff --git a/package-lock.json b/package-lock.json index 74db3bbc..af42e204 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@testing-library/user-event": "^12.1.10", "electron": "^15.3.0", "http-proxy-middleware": "^0.19.1", + "json2csv": "^5.0.6", "lodash": "^4.17.21", "minisearch": "^3.1.0", "react": "^17.0.2", @@ -29,7 +30,7 @@ "react-scripts": "4.0.3", "redux": "^4.1.2", "redux-thunk": "^2.4.0", - "socket.io-client": "^4.4.0", + "socket.io-client": "^4.4.1", "styled-components": "^5.3.3", "updeep": "^1.2.1", "web-vitals": "^1.0.1" @@ -16195,6 +16196,31 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "devOptional": true }, + "node_modules/json2csv": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.6.tgz", + "integrity": "sha512-0/4Lv6IenJV0qj2oBdgPIAmFiKKnh8qh7bmLFJ+/ZZHLjSeiL3fKKGX3UryvKPbxFbhV+JcYo9KUC19GJ/Z/4A==", + "dependencies": { + "commander": "^6.1.0", + "jsonparse": "^1.3.1", + "lodash.get": "^4.4.2" + }, + "bin": { + "json2csv": "bin/json2csv.js" + }, + "engines": { + "node": ">= 10", + "npm": ">= 6.13.0" + } + }, + "node_modules/json2csv/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/json3": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", @@ -16226,7 +16252,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, "engines": [ "node >= 0.2.0" ] @@ -16677,8 +16702,7 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "node_modules/lodash.ismatch": { "version": "4.4.0", @@ -22943,9 +22967,9 @@ } }, "node_modules/socket.io-client": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.0.tgz", - "integrity": "sha512-g7riSEJXi7qCFImPow98oT8X++MSsHz6MMFRXkWNJ6uEROSHOa3kxdrsYWMq85dO+09CFMkcqlpjvbVXQl4z6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", + "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", "dependencies": { "@socket.io/component-emitter": "~3.0.0", "backo2": "~1.0.2", @@ -39745,6 +39769,23 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "devOptional": true }, + "json2csv": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.6.tgz", + "integrity": "sha512-0/4Lv6IenJV0qj2oBdgPIAmFiKKnh8qh7bmLFJ+/ZZHLjSeiL3fKKGX3UryvKPbxFbhV+JcYo9KUC19GJ/Z/4A==", + "requires": { + "commander": "^6.1.0", + "jsonparse": "^1.3.1", + "lodash.get": "^4.4.2" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + } + } + }, "json3": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", @@ -39769,8 +39810,7 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, "JSONStream": { "version": "1.3.5", @@ -40116,8 +40156,7 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "lodash.ismatch": { "version": "4.4.0", @@ -45071,9 +45110,9 @@ } }, "socket.io-client": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.0.tgz", - "integrity": "sha512-g7riSEJXi7qCFImPow98oT8X++MSsHz6MMFRXkWNJ6uEROSHOa3kxdrsYWMq85dO+09CFMkcqlpjvbVXQl4z6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", + "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", "requires": { "@socket.io/component-emitter": "~3.0.0", "backo2": "~1.0.2", diff --git a/package.json b/package.json index 9e788432..5f89f2b2 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@testing-library/user-event": "^12.1.10", "electron": "^15.3.0", "http-proxy-middleware": "^0.19.1", + "json2csv": "^5.0.6", "lodash": "^4.17.21", "minisearch": "^3.1.0", "react": "^17.0.2", @@ -30,6 +31,7 @@ "react-scripts": "4.0.3", "redux": "^4.1.2", "redux-thunk": "^2.4.0", + "socket.io-client": "^4.4.1", "styled-components": "^5.3.3", "updeep": "^1.2.1", "web-vitals": "^1.0.1" diff --git a/src/pages/Projects/index.js b/src/pages/Projects/index.js index 8315c94a..302a73ff 100644 --- a/src/pages/Projects/index.js +++ b/src/pages/Projects/index.js @@ -4,6 +4,7 @@ import { useSelector, useDispatch } from 'react-redux'; import { withRouter, useHistory } from 'react-router-dom'; import styled from 'styled-components'; import { FormattedMessage } from 'react-intl'; +import { jsonToCsv } from '../../utils/csvUtils'; import constants from '../../constants'; import { @@ -169,6 +170,17 @@ const Projects = withRouter(() => { return null; } + const downloadTxtFile = () => { + const element = document.createElement('a'); + const file = new Blob([jsonToCsv(climateWarehouseStore.projects)], { + type: 'text/plain', + }); + element.href = URL.createObjectURL(file); + element.download = 'climateWarehouse.csv'; + document.body.appendChild(element); // Required for this to work in FireFox + element.click(); + }; + return ( @@ -224,7 +236,9 @@ const Projects = withRouter(() => { })`} /> - +
+ +
diff --git a/src/pages/Units/index.js b/src/pages/Units/index.js index 160f9b08..6193f631 100644 --- a/src/pages/Units/index.js +++ b/src/pages/Units/index.js @@ -4,6 +4,7 @@ import { useSelector, useDispatch } from 'react-redux'; import { withRouter, useHistory } from 'react-router-dom'; import styled from 'styled-components'; import { FormattedMessage } from 'react-intl'; +import { jsonToCsv } from '../../utils/csvUtils'; import constants from '../../constants'; import { @@ -170,6 +171,17 @@ const Units = withRouter(() => { return null; } + const downloadTxtFile = () => { + const element = document.createElement('a'); + const file = new Blob([jsonToCsv(climateWarehouseStore.units)], { + type: 'text/plain', + }); + element.href = URL.createObjectURL(file); + element.download = 'climateWarehouse.csv'; + document.body.appendChild(element); // Required for this to work in FireFox + element.click(); + }; + return ( @@ -225,7 +237,9 @@ const Units = withRouter(() => { })`} /> - +
+ +
diff --git a/src/store/actions/climateWarehouseActions.js b/src/store/actions/climateWarehouseActions.js index 951aacbd..d265d450 100644 --- a/src/store/actions/climateWarehouseActions.js +++ b/src/store/actions/climateWarehouseActions.js @@ -58,6 +58,7 @@ const getClimateWarehouseTable = ( if (response.ok) { dispatch(setConnectionCheck(true)); const results = await response.json(); + dispatch({ type: action, payload: results, diff --git a/src/utils/csvUtils.js b/src/utils/csvUtils.js new file mode 100644 index 00000000..e88ad9dc --- /dev/null +++ b/src/utils/csvUtils.js @@ -0,0 +1,6 @@ +const { Parser } = require('json2csv'); + +export const jsonToCsv = json => { + const json2csvParser = new Parser(); + return json2csvParser.parse(json); +};