1- import React from 'react' ;
1+ import React , { useContext } from 'react' ;
22import Button from '@material-ui/core/Button' ;
33import Dialog from '@material-ui/core/Dialog' ;
44import DialogContent from '@material-ui/core/DialogContent' ;
@@ -14,7 +14,10 @@ import { connect } from "react-redux";
1414import SystemUpdateAltIcon from '@material-ui/icons/SystemUpdateAlt' ;
1515import PostAddIcon from '@material-ui/icons/PostAdd' ;
1616import StorageIcon from '@material-ui/icons/Storage' ;
17- import { loadDashboardThunk } from '../dashboard/DashboardThunks' ;
17+ import { loadDashboardFromNeo4jThunk , loadDashboardThunk } from '../dashboard/DashboardThunks' ;
18+ import { DataGrid } from '@mui/x-data-grid' ;
19+ import { Neo4jContext , Neo4jContextState } from "use-neo4j/dist/neo4j.context" ;
20+
1821/**
1922 * A modal to save a dashboard as a JSON text string.
2023 * The button to open the modal is intended to use in a drawer at the side of the page.
@@ -24,25 +27,37 @@ const styles = {
2427
2528} ;
2629
27- export const NeoLoadModal = ( { loadDashboard } ) => {
28- const [ open , setOpen ] = React . useState ( false ) ;
30+ export const NeoLoadModal = ( { loadDashboard, loadDashboardFromNeo4j, connection } ) => {
31+ const [ loadModalOpen , setLoadModalOpen ] = React . useState ( false ) ;
32+ const [ loadFromNeo4jModalOpen , setLoadFromNeo4jModalOpen ] = React . useState ( false ) ;
2933 const [ text , setText ] = React . useState ( "" ) ;
34+ const [ rows , setRows ] = React . useState ( [ ] ) ;
35+ const { driver } = useContext < Neo4jContextState > ( Neo4jContext ) ;
3036
3137 const handleClickOpen = ( ) => {
32- setOpen ( true ) ;
38+ setLoadModalOpen ( true ) ;
3339 } ;
3440
3541 const handleClose = ( ) => {
36- setOpen ( false ) ;
42+ setLoadModalOpen ( false ) ;
3743 } ;
3844
3945
4046 const handleCloseAndLoad = ( ) => {
41- setOpen ( false ) ;
47+ setLoadModalOpen ( false ) ;
4248 loadDashboard ( text ) ;
4349 setText ( "" ) ;
4450 } ;
4551
52+ function handleDashboardLoadedFromNeo4j ( result ) {
53+ setText ( result ) ;
54+ setLoadFromNeo4jModalOpen ( false ) ;
55+ }
56+
57+ function handleGetDashboardListLoadedFromNeo4j ( result ) {
58+ setRows ( result ) ;
59+ }
60+
4661 const reader = new FileReader ( ) ;
4762 reader . onload = async ( e ) => {
4863 setText ( e . target . result ) ;
@@ -51,9 +66,29 @@ export const NeoLoadModal = ({ loadDashboard }) => {
5166 const uploadDashboard = async ( e ) => {
5267 e . preventDefault ( ) ;
5368 reader . readAsText ( e . target . files [ 0 ] ) ;
54-
5569 }
5670
71+ const columns = [
72+ { field : 'id' , hide : true , headerName : 'ID' , width : 150 } ,
73+ { field : 'date' , headerName : 'Date' , width : 200 } ,
74+ { field : 'title' , headerName : 'Title' , width : 270 } ,
75+ { field : 'author' , headerName : 'Author' , width : 160 } ,
76+ {
77+ field : 'load' , headerName : ' ' , renderCell : ( c ) => {
78+ return < Button onClick = { ( e ) => { loadDashboardFromNeo4j ( driver , c . id , handleDashboardLoadedFromNeo4j ) } } style = { { float : "right" } } variant = "contained" size = "medium" endIcon = { < PlayArrow /> } > Select</ Button >
79+ } , width : 120
80+ } ,
81+ ]
82+
83+ // const rows = [
84+ // { id: '6c7a822c-243b-4ed5-ac2d-1ab9d84ae8e0', title: 'My Covid Dashboard Name', date: 'Nov 27 2021 21:08:09', author: 'neo4j', load: <b>Load</b> },
85+ // { id: '6c7a822c-243b-4ed5-ac2d-1ab9d84ae8e1', title: 'Mark', date: 'Nov 27 2021 21:07:09', author: 'neo4j', load: <b>Load</b> },
86+ // { id: '6c7a822c-243b-4ed5-ac2d-1ab9d84ae8e2', title: 'Mark', date: 'Nov 27 2021 21:07:09', author: 'neo4j', load: <b>Load</b> },
87+ // { id: '6c7a822c-243b-4ed5-ac2d-1ab9d84ae8e3', title: 'Mark', date: 'Nov 27 2021 21:07:09', author: 'neo4j', load: <b>Load</b> },
88+ // { id: '6c7a822c-243b-4ed5-ac2d-1ab9d84ae8e4', title: 'Mark', date: 'Nov 27 2021 21:07:09', author: 'neo4j', load: <b>Load</b> },
89+ // { id: '6c7a822c-243b-4ed5-ac2d-1ab9d84ae8e5', title: 'Mark', date: 'Nov 27 2021 21:07:09', author: 'neo4j', load: <b>Load</b> },
90+ // ];
91+
5792 return (
5893 < div >
5994 < ListItem button onClick = { handleClickOpen } >
@@ -65,7 +100,7 @@ export const NeoLoadModal = ({ loadDashboard }) => {
65100 < ListItemText primary = "Load" />
66101 </ ListItem >
67102
68- < Dialog maxWidth = { "lg" } open = { open } onClose = { handleClose } aria-labelledby = "form-dialog-title" >
103+ < Dialog maxWidth = { "lg" } open = { loadModalOpen } onClose = { handleClose } aria-labelledby = "form-dialog-title" >
69104 < DialogTitle id = "form-dialog-title" >
70105 < SystemUpdateAltIcon style = { {
71106 height : "30px" ,
@@ -101,17 +136,13 @@ export const NeoLoadModal = ({ loadDashboard }) => {
101136 </ Button >
102137 < Button
103138 component = "label"
104- // onClick={(e)=>uploadDashboard(e )}
139+ onClick = { ( e ) => setLoadFromNeo4jModalOpen ( true ) }
105140 style = { { marginLeft : "10px" , marginBottom : "10px" , backgroundColor : "white" } }
106141 color = "default"
107142 variant = "contained"
108143 size = "medium"
109144 endIcon = { < StorageIcon /> } >
110- < input
111- type = "file"
112- onChange = { ( e ) => uploadDashboard ( e ) }
113- hidden
114- />
145+
115146 Select From Neo4j
116147 </ Button >
117148 < Button onClick = { ( text . length > 0 ) ? handleCloseAndLoad : null }
@@ -137,16 +168,45 @@ export const NeoLoadModal = ({ loadDashboard }) => {
137168 { /* <DialogActions> */ }
138169 { /* </DialogActions> */ }
139170 </ Dialog >
171+ < Dialog maxWidth = { "lg" } open = { loadFromNeo4jModalOpen } onClose = { ( e ) => { setLoadFromNeo4jModalOpen ( false ) } } aria-labelledby = "form-dialog-title" >
172+ < DialogTitle id = "form-dialog-title" >
173+ Load From Neo4j
174+ < IconButton onClick = { ( e ) => { setLoadFromNeo4jModalOpen ( false ) } } style = { { padding : "3px" , float : "right" } } >
175+ < Badge badgeContent = { "" } >
176+ < CloseIcon />
177+ </ Badge >
178+ </ IconButton >
179+ </ DialogTitle >
180+ < DialogContent style = { { width : "800px" } } >
181+ < DialogContentText > If dashboards are saved in your current database, choose a dashboard below.
182+ </ DialogContentText >
183+
184+ < div style = { { height : "360px" } } >
185+ < DataGrid
186+ rows = { rows }
187+ columns = { columns }
188+ pageSize = { 5 }
189+ rowsPerPageOptions = { [ 5 ] }
190+ disableSelectionOnClick
191+ components = { {
192+ ColumnSortedDescendingIcon : ( ) => < > </ > ,
193+ ColumnSortedAscendingIcon : ( ) => < > </ > ,
194+ } }
195+ /> </ div >
196+
197+ </ DialogContent >
198+ </ Dialog >
140199 </ div >
141200 ) ;
142201}
143202
144203const mapStateToProps = state => ( {
145-
146204} ) ;
147205
148206const mapDispatchToProps = dispatch => ( {
149207 loadDashboard : text => dispatch ( loadDashboardThunk ( text ) ) ,
208+ loadDashboardFromNeo4j : ( driver , uuid , callback ) => dispatch ( loadDashboardFromNeo4jThunk ( driver , uuid , callback ) ) ,
209+ loadDashboardListFromNeo4j : ( driver , callback ) => dispatch ( loadDashboardListFromNeo4jThunk ( driver , callback ) ) ,
150210} ) ;
151211
152212//
0 commit comments