From ac4bbd400f580c8c0917a843c7297777f0c7c17a Mon Sep 17 00:00:00 2001 From: HenryShan <zshan2@illinois.edu> Date: Tue, 16 Mar 2021 10:28:46 +0800 Subject: [PATCH] assignment-2.2 ver3.0: basic functions loaded --- DataBase/mongoDB.py | 24 +- ManualTest.md | 0 Server/SimpleServer.py | 180 ++++++++------ web/app/src/App.js | 300 ++++++++++++++++++----- web/app/src/Components/AuthorDisplay.js | 16 -- web/app/src/Components/BookDisplay.js | 9 - web/app/src/Components/ElementDisplay.js | 24 ++ 7 files changed, 385 insertions(+), 168 deletions(-) create mode 100644 ManualTest.md delete mode 100644 web/app/src/Components/AuthorDisplay.js delete mode 100644 web/app/src/Components/BookDisplay.js create mode 100644 web/app/src/Components/ElementDisplay.js diff --git a/DataBase/mongoDB.py b/DataBase/mongoDB.py index ef437fc..ec67880 100644 --- a/DataBase/mongoDB.py +++ b/DataBase/mongoDB.py @@ -16,9 +16,9 @@ def get_db(): def insert_document(docu, opt): db = get_db() if opt == 0: - records = db.test_books + records = db.books elif opt == 1: - records = db.test_authors + records = db.authors else: print("failed to get json file: wrong opt for selecting collection") return @@ -34,9 +34,9 @@ def insert_dicts(dictionary, opt): """ db = get_db() if opt == 0: - records = db.test_books + records = db.books elif opt == 1: - records = db.test_authors + records = db.authors else: print("failed to get json file: wrong opt for selecting collection") return @@ -58,9 +58,9 @@ def update_dicts(opt, identifier, content): """ db = get_db() if opt == 0: - records = db.test_books + records = db.books elif opt == 1: - records = db.test_authors + records = db.authors else: print("failed to get json file: wrong opt for selecting collection") return @@ -82,9 +82,9 @@ def get_documents_json(opt, identifier): """ db = get_db() if opt == 0: - records = db.test_books + records = db.books elif opt == 1: - records = db.test_authors + records = db.authors else: print("failed to get json file: wrong opt for selecting collection") return json.dumps({}) @@ -127,10 +127,10 @@ def clean(opt, identifier): """ db = get_db() if opt == 0: - records = db.test_books + records = db.books elif opt == 1: - records = db.test_authors + records = db.authors else: print("failed to get json file: wrong opt for selecting collection") - return - records.delete_many(identifier) + return 0 + return records.delete_many(identifier).deleted_count diff --git a/ManualTest.md b/ManualTest.md new file mode 100644 index 0000000..e69de29 diff --git a/Server/SimpleServer.py b/Server/SimpleServer.py index bdc8d5c..fa38ae7 100644 --- a/Server/SimpleServer.py +++ b/Server/SimpleServer.py @@ -2,106 +2,144 @@ import DataBase.mongoDB as DataBase import RegularExpressionParser.Parser as Parser import re import Crawler.Scrape as Scrape +import json from flask import Flask from flask import request from flask import abort from flask import jsonify from urllib.parse import urlparse, parse_qs -from flask_cors import CORS +from flask_cors import CORS, cross_origin app = Flask(__name__) cors = CORS(app) -# app.config["DEBUG"] = True +# cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) - -@app.route("/", methods=['GET']) -def home(): - """ homepage of server """ - return "200: successfully connected to home page\n" - - -@app.route("/api/<collection>/", methods=["GET", "PUT", "POST", "DELETE"]) -def data_base(collection): +@app.route("/api/book/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) +def data_base_book(): + print(request.url) """ data base page of server """ if request.method == "GET": - if collection == "book": - url_parsed = urlparse(request.url) - qs_parsed = parse_qs(url_parsed.query) - if qs_parsed == {}: - return DataBase.get_documents_json(0, {}) - result = search_document(["book.id:" + qs_parsed["id"][0]]) - if result == {"wrong": "True"}: - abort(400, "Bad Request") - else: - return result - elif collection == "author": - url_parsed = urlparse(request.url) - qs_parsed = parse_qs(url_parsed.query) - if qs_parsed == {}: - return DataBase.get_documents_json(1, {}) - result = search_document(["author.id:" + qs_parsed["id"][0]]) - if result == {"wrong": "True"}: - abort(400, "Bad Request") - else: - return result - elif collection == "search": - url_parsed = urlparse(request.url) - query = Parser.parse_url_to_query(url_parsed.query) - qs_parsed = query.replace("q=", "") - result = search_document(qs_parsed.split("&")) - if result == {"wrong": "True"}: - abort(400, "Bad Request") - else: - return result - else: + url_parsed = urlparse(request.url) + qs_parsed = parse_qs(url_parsed.query) + if qs_parsed == {}: + return DataBase.get_documents_json(0, {}) + result = search_document(["book.id:" + qs_parsed["id"][0]]) + if result == {"wrong": "True"}: abort(400, "Bad Request") + elif result == json.dumps({'books': []}): + abort(400, "Book not found") + else: + return result elif request.method == "PUT": if request.headers["Content-Type"] != "application/json": - abort(415) + abort(415, "content should be JSON file") + print(request) json_update_info = request.json - if collection == "book": - opt = 0 - elif collection == "author": - opt = 1 - else: - abort(400, "Bad Request") + print(request) + print(json_update_info) + print(request.args.to_dict()) + opt = 0 DataBase.update_dicts(opt, request.args.to_dict(), json_update_info) return "200: PUT succeeded" elif request.method == "POST": if request.headers["Content-Type"] != "application/json": abort(415, "content should be JSON file") + print(request) json_file = request.json - if collection == "books": - DataBase.insert_dicts(json_file, 0) - elif collection == "authors": - DataBase.insert_dicts(json_file, 1) - elif collection == "book": - DataBase.insert_document(json_file, 0) - elif collection == "author": - DataBase.insert_document(json_file, 1) - elif collection == "scrape": - param = request.args.to_dict() - url = param["url"] - max_book = param["max_book"] - max_author = param["max_author"] - Scrape.scrape_api(url, max_book, max_author) - return "200: new data has been added to database" + print(request) + print(json_file) + DataBase.insert_document(json_file, 0) + return "200: POST succeeded" + elif request.method == "DELETE": + identifier = request.args.to_dict() + print(identifier) + opt=0 + deleted_count = DataBase.clean(opt, identifier) + if deleted_count > 0: + return "200: DELETE succeeded" else: + abort(400, "Failed to delete: target not found") + elif request.method == "OPTIONS": + return '200 OK' + + +@app.route("/api/author/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) +def data_base_author(): + print(request.url) + """ data base page of server """ + if request.method == "GET": + url_parsed = urlparse(request.url) + qs_parsed = parse_qs(url_parsed.query) + if qs_parsed == {}: + return DataBase.get_documents_json(1, {}) + result = search_document(["author.id:" + qs_parsed["id"][0]]) + if result == {"wrong": "True"}: abort(400, "Bad Request") + elif result == json.dumps({'authors': []}): + abort(400, "Author not found") + else: + return result + elif request.method == "PUT": + if request.headers["Content-Type"] != "application/json": + abort(415, "content should be JSON file") + json_update_info = request.json + opt = 1 + DataBase.update_dicts(opt, request.args.to_dict(), json_update_info) + return "200: PUT succeeded" + elif request.method == "POST": + if request.headers["Content-Type"] != "application/json": + abort(415, "content should be JSON file") + json_file = request.json + DataBase.insert_document(json_file, 1) return "200: POST succeeded" elif request.method == "DELETE": identifier = request.args.to_dict() print(identifier) - if collection == "book": - opt = 0 - elif collection == "author": - opt = 1 + opt=1 + deleted_count = DataBase.clean(opt, identifier) + if deleted_count > 0: + return "200: DELETE succeeded" else: - abort(400, "Unknown Collection to DELETE") # 400 cz 404 is for non-existing directory! - DataBase.clean(opt, identifier) - return "200: DELETE succeeded" + abort(400, "Failed to delete: target not found") + elif request.method == "OPTIONS": + return '200 OK' + + +@app.route("/api/scrape/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) +def data_base_scrape(): + print(request.url) + param = request.args.to_dict() + print(param) + url = param["url"] + max_book = param["max_book"] + max_author = param["max_author"] + Scrape.scrape_api(url, max_book, max_author) + return "200: new data has been added to database" +@app.route("/api/search/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) +def data_base_search(): + print(request.url) + url_parsed = urlparse(request.url) + query = Parser.parse_url_to_query(url_parsed.query) + qs_parsed = query.replace("q=", "") + result = search_document(qs_parsed.split("&")) + if result == {"wrong": "True"}: + abort(400, "Bad Request") + elif result == json.dumps({'books': []}): + abort(400, "Target not found") + else: + return result + +# @app.route("/api/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) +# def data_api(): +# print('====================') +# print(request.url) +# print(request.collection) +# print('====================') + +# return '200: nice!' + def search_document(identifiers): """ function used to find one or several document in database """ if len(identifiers) == 1: @@ -145,5 +183,7 @@ def search_document(identifiers): return {} + + if __name__ == "__main__": app.run() diff --git a/web/app/src/App.js b/web/app/src/App.js index a219b6e..2ef831a 100644 --- a/web/app/src/App.js +++ b/web/app/src/App.js @@ -1,46 +1,49 @@ -//import logo from './logo.svg'; -//import './App.css'; -// -//function App() { -// return ( -// <div className="App"> -// <header className="App-header"> -// <img src={logo} className="App-logo" alt="logo" /> -// <p> -// Edit <code>src/App.js</code> and save to reload. -// </p> -// <a -// className="App-link" -// href="https://reactjs.org" -// target="_blank" -// rel="noopener noreferrer" -// > -// Learn React -// </a> -// </header> -// </div> -// ); -//} -// -//export default App; - -import React, { useState } from 'react'; +import React from 'react'; import FourButtons from './Components/FourButtons'; import { Dialog } from 'react-overlay-pack'; import CorrectSign from './material/sign_correct.png'; import ErrorSign from './material/sign_error.png'; +import ElementDisplay from './Components/ElementDisplay'; function App() { const { useState } = React; + const [queryStr, setQueryStr] = useState('') const [sign, setSign] = useState(CorrectSign) const [text, setText] = useState('This area shows the result of requests..') const [formState, setFormState] = useState('hide') const [dialogState, setDialogState] = useState(false) + const [renderState, setRenderState] = useState(false) + + const [bookURLState, setBookURLState] = useState('') + const [bookTitleState, setBookTitleState] = useState('') + const [bookIDState, setBookIDState] = useState('') + const [bookISBNState, setBookISBNState] = useState('') + const [bookAuthorState, setBookAuthorState] = useState('') + const [bookAuthorURLState, setBookAuthorURLState] = useState('') + const [bookRatingState, setBookRatingState] = useState('') + const [bookRatingCountState, setBookRatingCountState] = useState('') + const [bookReviewCountState, setBookReviewCountState] = useState('') + const [bookImageURLState, setBookImageURLState] = useState('') + const [bookSimilarBooksState, setBookSimilarBooksState] = useState('') + const [authorNameState, setAuthorNameState] = useState('') + const [authorURLState, setAuthorURLState] = useState('') + const [authorIDState, setAuthorIDState] = useState('') + const [authorRatingState, setAuthorRatingState] = useState('') + const [authorRatingCountState, setAuthorRatingCountState] = useState('') + const [authorReviewCountState, setAuthorReviewCountState] = useState('') + const [authorImageURLState, setAuthorImageURLState] = useState('') + const [authorRelatedAuthorsState, setAuthorRelatedAuthorsState] = useState('') + const [authorAuthorBooksState, setAuthorAuthorBooksState] = useState('') + + const [dataState, setDataState] = useState({}) + + const axios = require('axios').default; var center = {display: 'flex', justifyContent: 'center', alignItems: 'center'} + function get() { axios.get('http://127.0.0.1:5000/api/' + queryStr) .then(function (response) { @@ -48,24 +51,69 @@ function App() { setSign(CorrectSign) showDialog() document.getElementById('dialog').value = response.status + ":\n" + response.statusText - document.getElementById('board').value = JSON.stringify(response.data) + if (queryStr.includes('book')) { + setDataState(response.data['books'][0]) + } else { + setDataState(response.data['authors'][0]) + } + setRenderState(true) }) .catch(function (error) { // handle error setSign(ErrorSign) showDialog() - document.getElementById('dialog').value = error + document.getElementById('dialog').value = error //.response.status + ":\n" + error.response.statusText }) } - function put() { - changeFormState() + + function createJson() { + var bookData = {} + bookData.type = 'book' + if(bookURLState !== '') {bookData.book_url = bookURLState} + if(bookTitleState !== '') {bookData.title = bookTitleState} + if(bookIDState !== '') {bookData.id = bookIDState} + if(bookISBNState !== '') {bookData.ISBN = bookISBNState} + if(bookAuthorURLState !== '') {bookData.author_url = bookAuthorURLState} + if(bookAuthorState !== '') {bookData.author = bookAuthorState} + if(bookRatingState !== '') {bookData.rating = parseFloat(bookRatingState)} + if(bookRatingCountState !== '') {bookData.rating_count = parseInt(bookRatingCountState)} + if(bookReviewCountState !== '') {bookData.review_count = parseInt(bookReviewCountState)} + if(bookSimilarBooksState !== '') {bookData.similar_books = bookSimilarBooksState.split(', ')} + setDataState(bookData) + return bookData + } + + function createJsonAuthor() { + var authorData = {} + authorData.type = 'author' + if(authorNameState !== '') {authorData.name = authorNameState} + if(authorURLState !== '') {authorData.author_url = authorURLState} + if(authorIDState !== '') {authorData.id = authorIDState} + if(authorRatingState !== '') {authorData.rating = parseFloat(authorRatingState)} + if(authorRatingCountState !== '') {authorData.rating_count = parseInt(authorRatingCountState)} + if(authorReviewCountState !== '') {authorData.review_count = parseInt(authorReviewCountState)} + if(authorImageURLState !== '') {authorData.image_url = authorImageURLState} + if(authorRelatedAuthorsState !== '') {authorData.related_authors = authorRelatedAuthorsState.split(', ')} + if(authorAuthorBooksState !== '') {authorData.author_books = authorAuthorBooksState.split(',')} + setDataState(authorData) + return authorData + } + function hideForm() { + setFormState('hide') } - function mesg() { - document.getElementById('board').value = 'Hello there!' + + function changeFormStateBook() { + setRenderState(false) + if (formState === 'hide') { + setFormState('showBook') + } else { + setFormState('hide') + } } - function changeFormState() { + function changeFormStateAuthor() { + setRenderState(false) if (formState === 'hide') { - setFormState('show') + setFormState('showAuthor') } else { setFormState('hide') } @@ -73,17 +121,91 @@ function App() { function showDialog() { setDialogState(true) } + + function put() { + setRenderState(false) + hideForm() + var data; + if (queryStr === 'book') { + data = createJson() + } else { + data = createJsonAuthor() + } + let config = { + headers: { + 'Content-Type': 'application/json', + } + } + axios.put('http://127.0.0.1:5000/api/' + queryStr, JSON.stringify(data), config) + .then(function (response) { + // handle success + setSign(CorrectSign) + showDialog() + document.getElementById('dialog').value = response.status + ":\n" + response.statusText + }) + .catch(function (error) { + // handle error + setSign(ErrorSign) + showDialog() + document.getElementById('dialog').value = error //.response.status + ":\n" + error.response.statusText + }) + } + function post() { + setRenderState(false) + let config = { + headers: { + 'Content-Type': 'application/json', + } + } + hideForm() + var data; + if (queryStr === 'book') { + data = createJson() + } else { + data = createJsonAuthor() + } + axios.post('http://127.0.0.1:5000/api/' + queryStr, JSON.stringify(data), config) + .then(function (response) { + // handle success + setSign(CorrectSign) + showDialog() + document.getElementById('dialog').value = response.status + ":\n" + response.statusText + }) + .catch(function (error) { + // handle error + setSign(ErrorSign); + showDialog(); + document.getElementById('dialog').value = error //.response.status + ":\n" + error.response.statusText + }) + } + function delete_data() { + setRenderState(false) + axios.delete('http://127.0.0.1:5000/api/' + queryStr) + .then(function (response) { + // handle success + setSign(CorrectSign) + showDialog() + document.getElementById('dialog').value = response.status + ":\n" + response.statusText + }) + .catch(function (error) { + // handle error + setSign(ErrorSign) + showDialog() + document.getElementById('dialog').value = error //.response.status + ":\n" + error.response.statusText + }) + } + return ( <div> {dialogState === true && - <Dialog + <Dialog //Warning, not responsive! show={dialogState} onOutsideClick={() => setDialogState(false)}> <div style={{marginTop:'20%'}}> <div style={{ marginLeft: '35%' }}> - <img src={sign}/> + <img alt='responseStatus' src={sign}/> </div> <div> <textarea id='dialog' @@ -101,7 +223,6 @@ function App() { </div> </div> </Dialog>} - <form name='mainform'> <h1 style={center}> Welcome to the home page of GoodReads Crawler! </h1> <h3 style={center}> Please input your query string:</h3> @@ -109,7 +230,7 @@ function App() { <input id='queryString' type='text' - placeholder='example: book?id=12345678' + placeholder='example: book/?id=12345678' size='40' value={queryStr} onChange={(e) => setQueryStr(e.target.value)} @@ -118,27 +239,84 @@ function App() { <h3 style={center}> Please input your data for uploading (only effective for POST and PUT):</h3> {formState === 'hide' && <div style={center}> - <button style={{width:60}} onClick={changeFormState}> + <button style={{width:60}} onClick={changeFormStateBook}> book </button> - <button style={{marginLeft:10, width:60}} onClick={changeFormState}> + <button style={{marginLeft:10, width:60}} onClick={changeFormStateAuthor}> author </button> </div>} - {formState === 'show' && - <form style={center}> - <table border="1" style="width:100%;"> - <tr> - <td>Cell 1</td> - <input/> - </tr> - <tr> - <td>Cell 3</td> - <input/> - </tr> - </table> - </form>} - </form> + {formState === 'showBook' && + <form style={{border:'2px solid silver', marginLeft:'180px', marginRight: '180px'}}> + <div style={center}> + <input id='bookURL' style={center} type='text' size='40' value={bookURLState} placeholder='bookURL' onChange={(e) => setBookURLState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookTtile' style={center} type='text' size='40' value={bookTitleState} placeholder='bookTtile' onChange={(e) => setBookTitleState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookID' type='text' size='40' value={bookIDState} placeholder='bookID' onChange={(e) => setBookIDState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookISBN' type='text' size='40' value={bookISBNState} placeholder='bookISBN' onChange={(e) => setBookISBNState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookAuthorURL' type='text' size='40' value={bookAuthorURLState} placeholder='bookAuthorURL' onChange={(e) => setBookAuthorURLState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookAuthor' type='text' size='40' value={bookAuthorState} placeholder='bookAuthor' onChange={(e) => setBookAuthorState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookRating' type='text' size='40' value={bookRatingState} placeholder='bookRating' onChange={(e) => setBookRatingState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookRatingCount' type='text' size='40' value={bookRatingCountState} placeholder='bookRatingCount' onChange={(e) => setBookRatingCountState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookReviewCount' type='text' size='40' value={bookReviewCountState} placeholder='bookReviewCount' onChange={(e) => setBookReviewCountState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookImageURL' type='text' size='40' value={bookImageURLState} placeholder='bookImageURL' onChange={(e) => setBookImageURLState(e.target.value)}/> + </div> + <div style={center}> + <input id='bookSimilarBooks' type='text' size='40' value={bookSimilarBooksState} placeholder='bookSimilarBooks' onChange={(e) => setBookSimilarBooksState(e.target.value)}/> + </div> + </form> + } + {formState === 'showAuthor' && + <form style={{border:'2px solid silver', marginLeft:'180px', marginRight: '180px'}}> + <div style={center}> + <input id='authorName' style={center} type='text' size='40' value={authorNameState} placeholder='authorName' onChange={(e) => setAuthorNameState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorURL' style={center} type='text' size='40' value={authorURLState} placeholder='authorURL' onChange={(e) => setAuthorURLState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorID' type='text' size='40' value={authorIDState} placeholder='authorID' onChange={(e) => setAuthorIDState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorRating' type='text' size='40' value={authorRatingState} placeholder='authorRating' onChange={(e) => setAuthorRatingState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorRatingCount' type='text' size='40' value={authorRatingCountState} placeholder='authorRatingCount' onChange={(e) => setAuthorRatingCountState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorReviewCount' type='text' size='40' value={authorReviewCountState} placeholder='authorReviewCount' onChange={(e) => setAuthorReviewCountState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorImageURL' type='text' size='40' value={authorImageURLState} placeholder='authorImageURL' onChange={(e) => setAuthorImageURLState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorRelatedAuthors' type='text' size='40' value={authorRelatedAuthorsState} placeholder='authorRelatedAuthors' onChange={(e) => setAuthorRelatedAuthorsState(e.target.value)}/> + </div> + <div style={center}> + <input id='authorBooks' type='text' size='40' value={authorAuthorBooksState} placeholder='authorBooks' onChange={(e) => setAuthorAuthorBooksState(e.target.value)}/> + </div> + </form> + } + {formState !== 'hide' && + <button style={{marginLeft:600, width:60}} onClick={hideForm}> back </button> + } <div style={{marginTop:20, display: 'flex', justifyContent: 'center', alignItems: 'center'}}> <FourButtons backColor='blue' @@ -157,18 +335,18 @@ function App() { borderColor='seagreen' leftMargin={20} text='POST' - func={showDialog} /> + func={post} /> <FourButtons backColor='red' borderColor='indianred' leftMargin={20} text='DELETE' - func={mesg} /> - </div> - <div style={{marginTop:20, display: 'flex', justifyContent: 'center', alignItems: 'center'}}> - <textarea id="board" name="returnData" rows="6" cols="50" value={text} readOnly={true}> - </textarea> + func={delete_data} /> </div> + {renderState === true && + <div> + <ElementDisplay data={dataState}/> + </div>} </div> ); } diff --git a/web/app/src/Components/AuthorDisplay.js b/web/app/src/Components/AuthorDisplay.js deleted file mode 100644 index 0e5d074..0000000 --- a/web/app/src/Components/AuthorDisplay.js +++ /dev/null @@ -1,16 +0,0 @@ -const AuthorDisplay = (authorFile) => { - return ( - <table border="1" style="width:100%;"> - <tr> - <td>Cell 1</td> - <td>Cell 2</td> - </tr> - <tr> - <td>Cell 3</td> - <td>Cell 4</td> - </tr> - </table> - ) -} - -export default AuthorDisplay diff --git a/web/app/src/Components/BookDisplay.js b/web/app/src/Components/BookDisplay.js deleted file mode 100644 index 3bdaeca..0000000 --- a/web/app/src/Components/BookDisplay.js +++ /dev/null @@ -1,9 +0,0 @@ -const Display = (bookFile) => { - return ( - <div> - - </div> - ) -} - -export default Display diff --git a/web/app/src/Components/ElementDisplay.js b/web/app/src/Components/ElementDisplay.js new file mode 100644 index 0000000..05945fa --- /dev/null +++ b/web/app/src/Components/ElementDisplay.js @@ -0,0 +1,24 @@ +import MUIDataTable from "mui-datatables"; + +const ElementDisplay = (props) => { + + var fields = Object.keys(props.data) + var values = Object.values(props.data) + console.log(Object.values(props.data)) + console.log(Object.keys(props.data)) + const columns = fields + const data = [values] + const options = { + 'responsive':'vertical' + } + return ( + <MUIDataTable + title={"GET Data"} + data={data} + columns={columns} + options={options} + /> + ) +} + +export default ElementDisplay -- GitLab