@@ -41,13 +41,15 @@ import NeoDashboardSidebarShareModal from './modal/DashboardSidebarShareModal';
41
41
import LegacyShareModal from './modal/legacy/LegacyShareModal' ;
42
42
import { NEODASH_VERSION } from '../DashboardReducer' ;
43
43
44
+ // Which (small) pop-up menu is currently open for the sidebar.
44
45
enum Menu {
45
46
DASHBOARD = 0 ,
46
47
DATABASE = 1 ,
47
48
CREATE = 2 ,
48
49
NONE = 3 ,
49
50
}
50
51
52
+ // Which (large) pop-up modal is currently open for the sidebar.
51
53
enum Modal {
52
54
CREATE = 0 ,
53
55
IMPORT = 1 ,
@@ -61,6 +63,9 @@ enum Modal {
61
63
NONE = 9 ,
62
64
}
63
65
66
+ // We use "index = -1" to represent a non-saved draft dashboard in the sidebar's dashboard list.
67
+ const UNSAVED_DASHBOARD_INDEX = - 1 ;
68
+
64
69
/**
65
70
* A component responsible for rendering the sidebar on the left of the screen.
66
71
*/
@@ -83,10 +88,10 @@ export const NeoDashboardSidebar = ({
83
88
} ) => {
84
89
const { driver } = useContext < Neo4jContextState > ( Neo4jContext ) ;
85
90
const [ expanded , setOnExpanded ] = useState ( false ) ;
86
- const [ selectedDashboardIndex , setSelectedDashboardIndex ] = React . useState ( - 1 ) ;
91
+ const [ selectedDashboardIndex , setSelectedDashboardIndex ] = React . useState ( UNSAVED_DASHBOARD_INDEX ) ;
87
92
const [ dashboardDatabase , setDashboardDatabase ] = React . useState ( database ? database : 'neo4j' ) ;
88
93
const [ databases , setDatabases ] = useState ( [ ] ) ;
89
- const [ inspectedIndex , setInspectedIndex ] = useState ( - 1 ) ;
94
+ const [ inspectedIndex , setInspectedIndex ] = useState ( UNSAVED_DASHBOARD_INDEX ) ;
90
95
const [ searchText , setSearchText ] = useState ( '' ) ;
91
96
const [ menuAnchor , setMenuAnchor ] = useState < HTMLElement | null > ( null ) ;
92
97
const [ menuOpen , setMenuOpen ] = useState ( Menu . NONE ) ;
@@ -103,7 +108,7 @@ export const NeoDashboardSidebar = ({
103
108
if ( dashboard && dashboard . uuid ) {
104
109
const index = list . findIndex ( ( element ) => element . uuid == dashboard . uuid ) ;
105
110
setSelectedDashboardIndex ( index ) ;
106
- if ( index == - 1 ) {
111
+ if ( index == UNSAVED_DASHBOARD_INDEX ) {
107
112
// If we can't find the currently dashboard in the database, we are drafting a new one.
108
113
setDraft ( true ) ;
109
114
}
@@ -121,8 +126,9 @@ export const NeoDashboardSidebar = ({
121
126
// Creates new dashboard in draft state (not yet saved to Neo4j)
122
127
deleteDashboardFromNeo4j ( driver , dashboardDatabase , uuid , ( ) => {
123
128
if ( uuid == dashboard . uuid ) {
124
- setSelectedDashboardIndex ( 0 ) ;
129
+ setSelectedDashboardIndex ( UNSAVED_DASHBOARD_INDEX ) ;
125
130
resetLocalDashboard ( ) ;
131
+ loadDashboardListFromNeo4j ( ) ;
126
132
setDraft ( true ) ;
127
133
}
128
134
setTimeout ( ( ) => {
@@ -154,19 +160,27 @@ export const NeoDashboardSidebar = ({
154
160
}
155
161
) ;
156
162
} }
163
+ overwrite = { selectedDashboardIndex >= 0 }
157
164
handleClose = { ( ) => setModalOpen ( Modal . NONE ) }
158
165
/>
159
166
160
167
< NeoDashboardSidebarLoadModal
161
168
open = { modalOpen == Modal . LOAD }
162
169
onConfirm = { ( ) => {
163
- setModalOpen ( Modal . LOAD ) ;
164
- const { uuid } = dashboards [ inspectedIndex ] ;
165
- loadDashboardFromNeo4j ( driver , dashboardDatabase , uuid , ( file ) => {
166
- setDraft ( false ) ;
167
- loadDashboard ( uuid , file ) ;
168
- setSelectedDashboardIndex ( inspectedIndex ) ;
169
- } ) ;
170
+ if ( inspectedIndex == UNSAVED_DASHBOARD_INDEX ) {
171
+ // Someone attempted to load the unsaved draft dashboard... this isn't possible, we create a fresh one.
172
+ setSelectedDashboardIndex ( UNSAVED_DASHBOARD_INDEX ) ;
173
+ createDashboard ( ) ;
174
+ } else {
175
+ // Load one of the dashboards from the database.
176
+ setModalOpen ( Modal . LOAD ) ;
177
+ const { uuid } = dashboards [ inspectedIndex ] ;
178
+ loadDashboardFromNeo4j ( driver , dashboardDatabase , uuid , ( file ) => {
179
+ setDraft ( false ) ;
180
+ loadDashboard ( uuid , file ) ;
181
+ setSelectedDashboardIndex ( inspectedIndex ) ;
182
+ } ) ;
183
+ }
170
184
} }
171
185
handleClose = { ( ) => setModalOpen ( Modal . NONE ) }
172
186
/>
@@ -190,6 +204,7 @@ export const NeoDashboardSidebar = ({
190
204
onConfirm = { ( ) => {
191
205
setModalOpen ( Modal . NONE ) ;
192
206
createDashboard ( ) ;
207
+ setSelectedDashboardIndex ( UNSAVED_DASHBOARD_INDEX ) ;
193
208
} }
194
209
handleClose = { ( ) => setModalOpen ( Modal . NONE ) }
195
210
/>
@@ -211,6 +226,7 @@ export const NeoDashboardSidebar = ({
211
226
onImport = { ( text ) => {
212
227
setModalOpen ( Modal . NONE ) ;
213
228
setDraft ( true ) ;
229
+ setSelectedDashboardIndex ( UNSAVED_DASHBOARD_INDEX ) ;
214
230
loadDashboard ( createUUID ( ) , text ) ;
215
231
} }
216
232
handleClose = { ( ) => setModalOpen ( Modal . NONE ) }
@@ -271,6 +287,7 @@ export const NeoDashboardSidebar = ({
271
287
} }
272
288
/>
273
289
< NeoDashboardSidebarDashboardMenu
290
+ draft = { draft && selectedDashboardIndex == inspectedIndex }
274
291
open = { menuOpen == Menu . DASHBOARD }
275
292
anchorEl = { menuAnchor }
276
293
handleInfoClicked = { ( ) => {
@@ -281,6 +298,14 @@ export const NeoDashboardSidebar = ({
281
298
} ) ;
282
299
setModalOpen ( Modal . INFO ) ;
283
300
} }
301
+ handleDiscardClicked = { ( ) => {
302
+ setMenuOpen ( Menu . NONE ) ;
303
+ setModalOpen ( Modal . LOAD ) ;
304
+ } }
305
+ handleSaveClicked = { ( ) => {
306
+ setMenuOpen ( Menu . NONE ) ;
307
+ setModalOpen ( Modal . SAVE ) ;
308
+ } }
284
309
handleLoadClicked = { ( ) => {
285
310
setMenuOpen ( Menu . NONE ) ;
286
311
if ( draft ) {
@@ -323,6 +348,7 @@ export const NeoDashboardSidebar = ({
323
348
if ( draft ) {
324
349
setModalOpen ( Modal . CREATE ) ;
325
350
} else {
351
+ setSelectedDashboardIndex ( UNSAVED_DASHBOARD_INDEX ) ;
326
352
createDashboard ( ) ;
327
353
}
328
354
} }
@@ -425,15 +451,18 @@ export const NeoDashboardSidebar = ({
425
451
onChange = { ( e ) => setSearchText ( e . target . value ) }
426
452
/>
427
453
</ SideNavigationGroupHeader >
428
- { draft && ! readonly ? (
454
+ { draft && selectedDashboardIndex == UNSAVED_DASHBOARD_INDEX && ! readonly ? (
429
455
< DashboardSidebarListItem
430
456
version = { NEODASH_VERSION }
431
457
selected = { draft }
432
458
title = { title }
433
459
saved = { false }
434
460
onSelect = { ( ) => { } }
435
- onSave = { ( ) => setModalOpen ( Modal . SAVE ) }
436
- onSettingsOpen = { ( ) => { } }
461
+ onSettingsOpen = { ( event ) => {
462
+ setInspectedIndex ( UNSAVED_DASHBOARD_INDEX ) ;
463
+ setMenuOpen ( Menu . DASHBOARD ) ;
464
+ setMenuAnchor ( event . currentTarget ) ;
465
+ } }
437
466
/>
438
467
) : (
439
468
< > </ >
@@ -444,13 +473,13 @@ export const NeoDashboardSidebar = ({
444
473
// index stored in list
445
474
return (
446
475
< DashboardSidebarListItem
447
- selected = { ! draft && selectedDashboardIndex == d . index }
448
- title = { d . title }
476
+ selected = { selectedDashboardIndex == d . index }
477
+ title = { draft && selectedDashboardIndex == d . index ? title : d . title }
449
478
version = { d . version }
450
- saved = { true }
479
+ saved = { ! ( draft && selectedDashboardIndex == d . index ) }
451
480
readonly = { readonly }
452
481
onSelect = { ( ) => {
453
- if ( draft ) {
482
+ if ( draft && d . index !== selectedDashboardIndex ) {
454
483
setInspectedIndex ( d . index ) ;
455
484
setModalOpen ( Modal . LOAD ) ;
456
485
} else {
@@ -460,7 +489,6 @@ export const NeoDashboardSidebar = ({
460
489
} ) ;
461
490
}
462
491
} }
463
- onSave = { ( ) => { } }
464
492
onSettingsOpen = { ( event ) => {
465
493
setInspectedIndex ( d . index ) ;
466
494
setMenuOpen ( Menu . DASHBOARD ) ;
0 commit comments