Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.0.8 & 2.0.9 - Hotfix for missing config & custom transposed table types #74

Merged
merged 80 commits into from
Feb 12, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
9154fac
Updated version number
nielsdejong Dec 12, 2021
582de5b
Expandable charts when not in edit mode
Dec 15, 2021
d89d283
Merge pull request #44 from JipSogeti/expandable-charts-in-presentati…
nielsdejong Dec 16, 2021
451d72a
Apply global parameter value to selection chart
Dec 16, 2021
31e2438
Get parameter value earlier to apply as default state
Dec 16, 2021
9be8454
Minor fixes to chart interface, reorganized code to be able to avoid …
nielsdejong Dec 17, 2021
59deec3
Added example on how to use maps when returning dictionaries
nielsdejong Dec 19, 2021
28aaa1a
Made connection modal dismissable when connected to Neo4j
nielsdejong Dec 19, 2021
e0c608e
Made fullscreen reports work for maps and lines, now optionally avail…
nielsdejong Dec 19, 2021
523931b
Fixed load dashboard functionality to automatically pick up the selec…
nielsdejong Dec 19, 2021
c8bc604
Added button for returning to main menu screen
nielsdejong Dec 19, 2021
9117b82
Fixed z-index for fullscreen mode
nielsdejong Dec 19, 2021
d83ac1a
Revert some changes and add more comments
Dec 20, 2021
0815b54
Merge branch 'develop' into parameter-select-apply-value
Dec 20, 2021
cdf6097
Resolved rendering issues when loading parameter selection reports wi…
nielsdejong Dec 23, 2021
f593aab
Merged with latest develop branch
nielsdejong Dec 23, 2021
5e80068
Show placeholder when no query is specified
nielsdejong Dec 23, 2021
5ed29e2
Reset extra parameters on page load for parameter select report
nielsdejong Dec 23, 2021
b664d68
Merge pull request #47 from JipSogeti/parameter-select-apply-value
nielsdejong Dec 27, 2021
f099193
Pass Parameter Select value via hash to iframe without re-rendering (…
Dec 27, 2021
0f27f42
Cleanup of global dashboard settings menu
nielsdejong Dec 27, 2021
8f10729
Improved user interface and examples
nielsdejong Jan 2, 2022
e293981
Graph modal (#51)
Jan 2, 2022
e7f8110
Resolved bug in rendering graphs with node pairs that have relationsh…
nielsdejong Jan 2, 2022
a996dcf
Added option to manually specify node labels/property names in select…
nielsdejong Jan 2, 2022
61c5284
Updated release notes
nielsdejong Jan 2, 2022
33e0630
Added debug report button. Fixed table size issues by upgrading to la…
nielsdejong Jan 5, 2022
3a2d400
Fixed custom column width issue
nielsdejong Jan 5, 2022
23b37e4
Fixed example documentation with new styling
nielsdejong Jan 5, 2022
732a718
Support rendering native and custom types in Data Grid (#54)
Jan 7, 2022
9485dd9
Resolved error with slow queries for single value reports
nielsdejong Jan 7, 2022
bb7f681
Graph nodes stick after dragging, added option to store fixed graph l…
nielsdejong Jan 8, 2022
b61526e
Added experimental graph layouts
nielsdejong Jan 9, 2022
9b548fa
Merge branch 'master' into develop
nielsdejong Jan 9, 2022
3c0c200
Started adding manual timeout config, property selection for rel type…
nielsdejong Jan 17, 2022
a2fe46b
Finalized config for custom timeouts
nielsdejong Jan 17, 2022
41e59b1
Fixed invalid lowercasing of share URL generation
nielsdejong Jan 18, 2022
d3ca876
Added new types of parameter selection reports (relationship/free text)
nielsdejong Jan 23, 2022
b6c22e0
Updated all dependencies to latest version, made project work with no…
Jan 24, 2022
2e0aa1a
Fixed typo
nielsdejong Jan 24, 2022
831c03a
Merge branch 'develop' of github.com:nielsdejong/neodash into develop
nielsdejong Jan 24, 2022
9b88b8c
Updated README
nielsdejong Jan 25, 2022
4f39931
Sync with new dockerfile changes
nielsdejong Jan 25, 2022
3215186
Clean up of dependencies, removed merge artifacts
nielsdejong Jan 25, 2022
8cb5b06
Default fullscreen option for reports, graphs fit to canvas automatic…
nielsdejong Jan 25, 2022
e8aba2d
Added tiny report sizes
nielsdejong Jan 25, 2022
ece2d17
Fixed graph hover to match other app styling
nielsdejong Jan 25, 2022
17e32f9
Resolved merge artifacts
nielsdejong Jan 25, 2022
ecc5b9f
Added maximizing of card settings
nielsdejong Jan 25, 2022
51bf482
Added transposing option for tables
nielsdejong Jan 25, 2022
39a743b
Optimized cypher editor
nielsdejong Jan 25, 2022
3042db0
Updated dockerfile and bash scripts
nielsdejong Jan 26, 2022
097e6dc
Fixed incorrect pagesizes for tables
nielsdejong Jan 26, 2022
22f2272
Added pie charts. Improved styling for graph inspection modals
nielsdejong Jan 26, 2022
dbf2d0a
Updated release notes and README. Fixed deploy to AWS script
nielsdejong Jan 26, 2022
be74100
Fixed npm publish script to match new code structure
nielsdejong Jan 26, 2022
a615712
Added time chart support for line charts. Minor styling tweaks for th…
nielsdejong Jan 30, 2022
defee96
WIP on SSO framework. Added auto-run disabled reports. Fixed bug when…
nielsdejong Feb 2, 2022
216012f
Fixed autorun setting for reports, rendering values in transposed col…
nielsdejong Feb 7, 2022
483ea03
Changed base image to node
nielsdejong Feb 7, 2022
2ad2472
Updated dockerfile to create a smaller, security-vetted image
nielsdejong Feb 8, 2022
7e2fb92
Added docker file for creating ad-hoc standalone deployments
nielsdejong Feb 9, 2022
77e9bd0
cleaned up docker build/run files
nielsdejong Feb 9, 2022
6ffc8c0
Changed example values for docker run scripts
nielsdejong Feb 9, 2022
940005b
Changed example values for docker run scripts
nielsdejong Feb 9, 2022
0afb459
Updated README, clean up docker scripts
nielsdejong Feb 10, 2022
523a716
Fixed docker files, line chart views
nielsdejong Feb 11, 2022
cb0a9a7
Added drilldown FAB to graph view
nielsdejong Feb 11, 2022
7a26a98
Updated default font size for single number reports
nielsdejong Feb 11, 2022
285fe07
Added saving/loading dashboards to/from different databases
nielsdejong Feb 11, 2022
77193b1
Enabled loading/saving/sharing dashboards from other databases
nielsdejong Feb 11, 2022
84b97bd
Rebase from Master
nielsdejong Feb 11, 2022
d6253b1
Fixed merge artifacts that broke collection rendering in tables
nielsdejong Feb 12, 2022
7fbc3cc
updated release notes, permissions on bash files
nielsdejong Feb 12, 2022
2d73122
Hotfix for config reading in Neo4j Desktop
nielsdejong Feb 12, 2022
3950369
Hotfix for missing config in Neo4j Desktop
nielsdejong Feb 12, 2022
830fa67
2.0.8 hotfix
nielsdejong Feb 12, 2022
ab20f74
Hotfix for missing configuration check in 2.0.7
nielsdejong Feb 12, 2022
00d77f1
Sync with hotfix master branch
nielsdejong Feb 12, 2022
6201084
Hotfix for broken custom values in transposed table views
nielsdejong Feb 12, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fixed docker files, line chart views
  • Loading branch information
nielsdejong committed Feb 11, 2022
commit 523a716725f25cef50383dc0261c27add493bcab
6 changes: 6 additions & 0 deletions src/application/Application.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,13 @@ import { loadDashboardThunk } from '../dashboard/DashboardThunks';
import { NeoLoadSharedDashboardModal } from '../modal/LoadSharedDashboardModal';

/**
* This is the main application component for NeoDash.
* It contains:
* - The Dashboard component
* - A number of modals (pop-up windows) that handle connections, loading/saving dashboards, etc.
*
* Parts of the application state are retrieved here and passed to the relevant compoenents.
* State-changing actions are also dispatched from here. See `ApplicationThunks.tsx`, `ApplicationActions.tsx` and `ApplicationSelectors.tsx` for more info.
*/
const Application = ({ connection, connected, hasCachedDashboard, oldDashboard, clearOldDashboard,
connectionModalOpen, ssoSettings, standaloneSettings, aboutModalOpen, loadDashboard, hasNeo4jDesktopConnection, shareDetails,
Expand Down
3 changes: 3 additions & 0 deletions src/application/ApplicationActions.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/**
* This file contains all state-changing actions relevant for the main application.
*/

export const CLEAR_NOTIFICATION = 'APPLICATION/CLEAR_NOTIFICATION';
export const clearNotification = () => ({
Expand Down
8 changes: 5 additions & 3 deletions src/application/ApplicationReducer.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
/**
* Reducers define changes to the application state when a given action
* Reducers define changes to the application state when a given action is taken.
*/

import {
CLEAR_DESKTOP_CONNECTION_PROPERTIES, CLEAR_NOTIFICATION, CREATE_NOTIFICATION, RESET_SHARE_DETAILS, SET_ABOUT_MODAL_OPEN, SET_CONNECTED,
CLEAR_DESKTOP_CONNECTION_PROPERTIES, CLEAR_NOTIFICATION, CREATE_NOTIFICATION,
RESET_SHARE_DETAILS, SET_ABOUT_MODAL_OPEN, SET_CONNECTED,
SET_CONNECTION_MODAL_OPEN, SET_CONNECTION_PROPERTIES,
SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING, SET_DESKTOP_CONNECTION_PROPERTIES, SET_OLD_DASHBOARD, SET_SHARE_DETAILS_FROM_URL, SET_SSO_ENABLED, SET_STANDALONE_ENABLED, SET_STANDALONE_MODE, SET_WELCOME_SCREEN_OPEN
SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING, SET_DESKTOP_CONNECTION_PROPERTIES, SET_OLD_DASHBOARD,
SET_SHARE_DETAILS_FROM_URL, SET_SSO_ENABLED, SET_STANDALONE_ENABLED, SET_STANDALONE_MODE, SET_WELCOME_SCREEN_OPEN
} from "./ApplicationActions";

const update = (state, mutations) =>
Expand Down
4 changes: 4 additions & 0 deletions src/application/ApplicationSelectors.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { initialState } from "../dashboard/DashboardReducer";
import _ from 'lodash';

/**
* Selectors define a way to retrieve parts of the global application state for a sub-component.
*/

export const applicationHasNotification = (state: any) => {
return state.application.notificationMessage != null;
}
Expand Down
47 changes: 26 additions & 21 deletions src/application/ApplicationThunks.tsx
Original file line number Diff line number Diff line change
@@ -1,43 +1,48 @@
import { createDriver } from "use-neo4j";
import { loadDashboardFromNeo4jByNameThunk, loadDashboardFromNeo4jByUUIDThunk, loadDashboardThunk } from "../dashboard/DashboardThunks";
import { createNotificationThunk, createNotificationUndismissableThunk } from "../page/PageThunks";
import { createNotificationThunk } from "../page/PageThunks";
import { QueryStatus, runCypherQuery } from "../report/CypherQueryRunner";
import {
setConnected, setConnectionModalOpen, setConnectionProperties, setDesktopConnectionProperties,
resetShareDetails, setShareDetailsFromUrl, setWelcomeScreenOpen, setDashboardToLoadAfterConnecting, setOldDashboard, clearDesktopConnectionProperties, clearNotification, setSSOEnabled, setStandaloneEnabled, setAboutModalOpen, setStandaloneMode
resetShareDetails, setShareDetailsFromUrl, setWelcomeScreenOpen, setDashboardToLoadAfterConnecting,
setOldDashboard, clearDesktopConnectionProperties, clearNotification, setSSOEnabled, setStandaloneEnabled,
setAboutModalOpen, setStandaloneMode
} from "./ApplicationActions";

/**
* Application Thunks (https://redux.js.org/usage/writing-logic-thunks) handle complex state manipulations.
* Several actions/other thunks may be dispatched from here.
*/

export const createConnectionThunk = (protocol, url, port, database, username, password) => (dispatch: any, getState: any) => {
try {
const driver = createDriver(protocol, url, port, username, password)
console.log("Attempting to connect...")
const validateConnection = (records) => {
console.log("Confirming connection was established...")
console.log(protocol, url, port, database, username, password)
if (records && records[0] && records[0]["error"]) {
dispatch(createNotificationThunk("Unable to establish connection", records[0]["error"]));
} else if (records && records[0] && records[0].keys[0] == "connected") {

dispatch(setConnectionProperties(protocol, url, port, database, username, password));
dispatch(setConnectionModalOpen(false));
dispatch(setConnected(true));

// If we have remembered to load a specific dashboard after connecting to the database, take care of it here.
const application = getState().application;
if (application.dashboardToLoadAfterConnecting && application.dashboardToLoadAfterConnecting.startsWith("http")) {
if (application.dashboardToLoadAfterConnecting && application.dashboardToLoadAfterConnecting.startsWith("http")) {
fetch(application.dashboardToLoadAfterConnecting)
.then(response => response.text())
.then(data => dispatch(loadDashboardThunk(data)));
.then(response => response.text())
.then(data => dispatch(loadDashboardThunk(data)));
dispatch(setDashboardToLoadAfterConnecting(null));
} else if (application.dashboardToLoadAfterConnecting) {
const setDashboardAfterLoadingFromDatabase = (value) => {
dispatch(loadDashboardThunk(value));
}
// If we specify a dashboard by name, load the latest version of it
if(application.dashboardToLoadAfterConnecting.startsWith('name:')){
if (application.dashboardToLoadAfterConnecting.startsWith('name:')) {
dispatch(loadDashboardFromNeo4jByNameThunk(driver, application.dashboardToLoadAfterConnecting.substring(5), setDashboardAfterLoadingFromDatabase));
}else{
} else {
dispatch(loadDashboardFromNeo4jByUUIDThunk(driver, application.dashboardToLoadAfterConnecting, setDashboardAfterLoadingFromDatabase));
}
dispatch(setDashboardToLoadAfterConnecting(null));
Expand Down Expand Up @@ -117,12 +122,12 @@ export const handleSharedDashboardsThunk = () => (dispatch: any, getState: any)
const url = connection.split("@")[1].split(":")[1];
const port = connection.split("@")[1].split(":")[2];
dispatch(setShareDetailsFromUrl(type, id, standalone, protocol, url, port, database, username, password));
window.history.pushState({}, document.title, "/" );
window.history.pushState({}, document.title, "/");
} else {
dispatch(setShareDetailsFromUrl(type, id, undefined, undefined, undefined, undefined, undefined, undefined, undefined));
window.history.pushState({}, document.title, "/" );
window.history.pushState({}, document.title, "/");
}
}else{
} else {
// dispatch(resetShareDetails());
}

Expand Down Expand Up @@ -156,26 +161,26 @@ export const onConfirmLoadSharedDashboardThunk = () => (dispatch: any, getState:
export const loadApplicationConfigThunk = () => async (dispatch: any, getState: any) => {
try {
const config = await (await fetch("/config.json")).json();
dispatch(setSSOEnabled(config['ssoEnabled'], config["ssoDiscoveryUrl"]));
const state = getState();
const standalone = config['standalone'];// || (state.application.shareDetails !== undefined && state.application.shareDetails.standalone);
dispatch(setStandaloneEnabled(standalone, config['standaloneProtocol'], config['standaloneHost'], config['standalonePort'], config['standaloneDatabase'], config['standaloneDashboardName'], config['standaloneDashboardDatabase']))
if(standalone){
dispatch(setConnectionProperties(config['standaloneProtocol'], config['standaloneHost'], config['standalonePort'], config['standaloneDatabase'], state.application.connection.username ,state.application.connection.password));
dispatch(setSSOEnabled(config['ssoEnabled'], config["ssoDiscoveryUrl"]));
const state = getState();
const standalone = config['standalone'];// || (state.application.shareDetails !== undefined && state.application.shareDetails.standalone);
dispatch(setStandaloneEnabled(standalone, config['standaloneProtocol'], config['standaloneHost'], config['standalonePort'], config['standaloneDatabase'], config['standaloneDashboardName'], config['standaloneDashboardDatabase']))
if (standalone) {
dispatch(setConnectionProperties(config['standaloneProtocol'], config['standaloneHost'], config['standalonePort'], config['standaloneDatabase'], state.application.connection.username, state.application.connection.password));
dispatch(setConnectionModalOpen(true));
dispatch(setAboutModalOpen(false));
dispatch(setConnected(false));
dispatch(setWelcomeScreenOpen(false));
dispatch(setDashboardToLoadAfterConnecting("name:"+config['standaloneDashboardName']));
dispatch(setDashboardToLoadAfterConnecting("name:" + config['standaloneDashboardName']));
dispatch(clearNotification());
}else{
} else {
dispatch(clearDesktopConnectionProperties());
dispatch(setDatabaseFromNeo4jDesktopIntegrationThunk());
const old = localStorage.getItem('neodash-dashboard');
dispatch(setOldDashboard(old));
dispatch(setConnected(false));
dispatch(setDashboardToLoadAfterConnecting(null));
dispatch(setWelcomeScreenOpen(true));
dispatch(setWelcomeScreenOpen(true));
dispatch(clearNotification());
dispatch(handleSharedDashboardsThunk());
dispatch(setConnectionModalOpen(false));
Expand Down
2 changes: 1 addition & 1 deletion src/card/CardThunks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ export const updateFieldsThunk = (index, fields) => (dispatch: any, getState: an
// For multi selections, select the Nth item of the result fields as a single item array.
if (selectableFields[selection].multiple) {
// only update if the old selection no longer covers the new set of fields...
if(!oldSelection[selection].every(v => fields.includes(v))){
if(!oldSelection[selection] || !oldSelection[selection].every(v => fields.includes(v))){
dispatch(updateSelection(pagenumber, index, selection, [fields[Math.min(i, fields.length - 1)]]));
}

Expand Down
2 changes: 1 addition & 1 deletion src/card/view/CardViewFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ const NeoCardViewFooter = ({ fields, settings, selection, type, showOptionalSele
renderValue={(selected) => Array.isArray(selected) ? selected.join(', ') : selected}
value={(selection && selection[selectable]) ?
(selectableFields[selectable].multiple && !Array.isArray(selection[selectable])) ? [selection[selectable]] : selection[selectable]
: (selectableFields[selectable].multiple) ? ["(no data)"] : "(no data)"}>
: (selectableFields[selectable].multiple) ? (selection[selectable] && selection[selectable].length > 0 ? selection[selectable][0] : []): "(no data)"}>

{/* Render choices */}
{fieldsToRender.map((field) => {
Expand Down
3 changes: 2 additions & 1 deletion src/dashboard/Dashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import NeoDashboardConnectionUpdateHandler from './DashboardConnectionUpdateHand
import { forceRefreshPage } from '../page/PageActions';
import { getPageNumber } from '../settings/SettingsSelectors';
import { createNotification } from '../application/ApplicationActions';
import { createNotificationThunk } from '../page/PageThunks';



Expand Down Expand Up @@ -48,7 +49,7 @@ const mapStateToProps = state => ({

const mapDispatchToProps = dispatch => ({
onConnectionUpdate: pagenumber => {
dispatch(createNotification("Connection Updated", "You have updated your Neo4j connection, your reports have been reloaded."))
dispatch(createNotificationThunk("Connection Updated", "You have updated your Neo4j connection, your reports have been reloaded."))
dispatch(forceRefreshPage(pagenumber))
}
});
Expand Down
17 changes: 2 additions & 15 deletions src/dashboard/DashboardPlaceholder.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,6 @@
import { AppBar, Toolbar, IconButton, Typography, Badge, TextField, InputBase, CircularProgress } from "@material-ui/core";
import React, { useCallback, useEffect } from "react";
import NeoPageButton from "./DashboardHeaderPageButton";
import NeoPageAddButton from "./DashboardHeaderPageAddButton";
import { AppBar, Toolbar, IconButton, Typography, InputBase, CircularProgress } from "@material-ui/core";
import React, { } from "react";
import MenuIcon from '@material-ui/icons/Menu';
import ConnectionModal from '../modal/ConnectionModal';
import { withStyles } from "@material-ui/core/styles";
import { connect } from "react-redux";
import { setDashboardTitle, addPage, removePage } from "./DashboardActions";
import { getDashboardTitle, getPages, getPageNumber } from "./DashboardSelectors";
import debounce from 'lodash/debounce';
import { setPageTitle } from "../page/PageActions";
import { addPageThunk, removePageThunk } from "./DashboardThunks";




export const NeoDashboardPlaceholder = ({connected}) => {
const content = (
Expand Down
22 changes: 18 additions & 4 deletions src/dashboard/DashboardThunks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -121,22 +121,22 @@ export const loadDashboardThunk = (text) => (dispatch: any, getState: any) => {
}
}

export const saveDashboardToNeo4jThunk = (driver, dashboard, date, user) => (dispatch: any, getState: any) => {
export const saveDashboardToNeo4jThunk = (driver, database, dashboard, date, user) => (dispatch: any, getState: any) => {
try {
const uuid = createUUID();
const title = dashboard.title;
// const user = user;
// const date = date;
const version = dashboard.version;
const content = dashboard;
runCypherQuery(driver, getState().application.connection.database,
runCypherQuery(driver, database,
"CREATE (n:_Neodash_Dashboard) SET n.uuid = $uuid, n.title = $title, n.version = $version, n.user = $user, n.content = $content, n.date = datetime($date) RETURN $uuid as uuid",
{ uuid: uuid, title: title, version: version, user: user, content: JSON.stringify(dashboard, null, 2), date: date },
{}, ["uuid"], 1, () => { return }, (records) => {
if (records && records[0] && records[0]["_fields"] && records[0]["_fields"][0] && records[0]["_fields"][0] == uuid) {
dispatch(createNotificationThunk("🎉 Success!", "Your current dashboard was saved to Neo4j."));
} else {
dispatch(createNotificationThunk("Unable to save dashboard", "Do you have write access to the '" + getState().application.connection.database + "' database?"));
dispatch(createNotificationThunk("Unable to save dashboard", "Do you have write access to the '" + database + "' database?"));
}

});
Expand All @@ -163,7 +163,6 @@ export const loadDashboardFromNeo4jByUUIDThunk = (driver, uuid, callback) => (di
export const loadDashboardFromNeo4jByNameThunk = (driver, name, callback) => (dispatch: any, getState: any) => {
try {
runCypherQuery(driver, getState().application.connection.database, "MATCH (d:_Neodash_Dashboard) WHERE d.title = $name RETURN d.content as dashboard ORDER by d.date DESC LIMIT 1", { name: name }, {}, ["dashboard"], 1, () => { return }, (records) => {
console.log(records)
if (records.length == 0) {
dispatch(createNotificationThunk("Unable to load dashboard.", "A dashboard with the provided name could not be found."));
}
Expand All @@ -189,3 +188,18 @@ export const loadDashboardListFromNeo4jThunk = (driver, callback) => (dispatch:
}
}

export const loadDatabaseListFromNeo4jThunk = (driver, callback) => (dispatch: any, getState: any) => {
try {
runCypherQuery(driver, "system",
"SHOW DATABASES yield name RETURN name",
{}, {}, ["name"], 1000, () => { return }, (records) => {
const result = records.map(r => {
return r["_fields"][0];
});
callback(result);
})
} catch (e) {
dispatch(createNotificationThunk("Unable to list databases from Neo4j", e));
}
}

Loading