Skip to content

Commit f9245e0

Browse files
committed
Final fixes before 2.0.0 release
1 parent a668b28 commit f9245e0

17 files changed

+162
-38
lines changed

src/application/Application.tsx

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import NeoNotificationModal from '../modal/NotificationModal';
1010
import NeoWelcomeScreenModal from '../modal/WelcomeScreenModal';
1111
import { removeReportRequest } from '../page/PageThunks';
1212
import { connect } from 'react-redux';
13-
import { applicationGetConnection, applicationGetShareDetails, applicationGetOldDashboard, applicationHasNeo4jDesktopConnection, applicationHasAboutModalOpen, applicationHasCachedDashboard, applicationHasConnectionModalOpen, applicationIsConnected } from '../application/ApplicationSelectors';
14-
import { createConnectionThunk, createConnectionFromDesktopIntegrationThunk, setDatabaseFromNeo4jDesktopIntegrationThunk, handleSharedDashboardsThunk } from '../application/ApplicationThunks';
15-
import { clearDesktopConnectionProperties, clearNotification, resetShareDetails, setAboutModalOpen, setConnected, setConnectionModalOpen, setOldDashboard } from '../application/ApplicationActions';
13+
import { applicationGetConnection, applicationGetShareDetails, applicationGetOldDashboard, applicationHasNeo4jDesktopConnection, applicationHasAboutModalOpen, applicationHasCachedDashboard, applicationHasConnectionModalOpen, applicationIsConnected, applicationHasWelcomeScreenOpen } from '../application/ApplicationSelectors';
14+
import { createConnectionThunk, createConnectionFromDesktopIntegrationThunk, setDatabaseFromNeo4jDesktopIntegrationThunk, handleSharedDashboardsThunk, onConfirmLoadSharedDashboardThunk } from '../application/ApplicationThunks';
15+
import { clearDesktopConnectionProperties, clearNotification, resetShareDetails, setAboutModalOpen, setConnected, setConnectionModalOpen, setDashboardToLoadAfterConnecting, setOldDashboard, setStandAloneMode, setWelcomeScreenOpen } from '../application/ApplicationActions';
1616
import { resetDashboardState } from '../dashboard/DashboardActions';
1717
import { NeoDashboardPlaceholder } from '../dashboard/DashboardPlaceholder';
1818
import NeoConnectionModal from '../modal/ConnectionModal';
@@ -28,9 +28,9 @@ import { NeoLoadSharedDashboardModal } from '../modal/LoadSharedDashboardModal';
2828
*/
2929
const Application = ({ connection, connected, hasCachedDashboard, oldDashboard, clearOldDashboard,
3030
connectionModalOpen, aboutModalOpen, loadDashboard, hasNeo4jDesktopConnection, shareDetails,
31-
createConnection, createConnectionFromDesktopIntegration, onResetShareDetails,
31+
createConnection, createConnectionFromDesktopIntegration, onResetShareDetails, onConfirmLoadSharedDashboard,
3232
initializeApplication, resetDashboard, onAboutModalOpen, onAboutModalClose,
33-
onConnectionModalOpen, onConnectionModalClose }) => {
33+
welcomeScreenOpen, setWelcomeScreenOpen, onConnectionModalOpen, onConnectionModalClose }) => {
3434

3535
const [initialized, setInitialized] = React.useState(false);
3636

@@ -56,6 +56,8 @@ const Application = ({ connection, connected, hasCachedDashboard, oldDashboard,
5656
createConnection={createConnection}
5757
onConnectionModalClose={onConnectionModalClose} ></NeoConnectionModal>
5858
<NeoWelcomeScreenModal
59+
welcomeScreenOpen={welcomeScreenOpen}
60+
setWelcomeScreenOpen={setWelcomeScreenOpen}
5961
hasCachedDashboard={hasCachedDashboard}
6062
hasNeo4jDesktopConnection={hasNeo4jDesktopConnection}
6163
onConnectionModalOpen={onConnectionModalOpen}
@@ -70,7 +72,8 @@ const Application = ({ connection, connected, hasCachedDashboard, oldDashboard,
7072
</NeoUpgradeOldDashboardModal>
7173
<NeoLoadSharedDashboardModal
7274
shareDetails={shareDetails}
73-
onResetShareDetails={onResetShareDetails}>
75+
onResetShareDetails={onResetShareDetails}
76+
onConfirmLoadSharedDashboard={onConfirmLoadSharedDashboard}>
7477
</NeoLoadSharedDashboardModal>
7578
<NeoNotificationModal></NeoNotificationModal>
7679
</div>
@@ -84,6 +87,7 @@ const mapStateToProps = state => ({
8487
oldDashboard: applicationGetOldDashboard(state),
8588
connectionModalOpen: applicationHasConnectionModalOpen(state),
8689
aboutModalOpen: applicationHasAboutModalOpen(state),
90+
welcomeScreenOpen: applicationHasWelcomeScreenOpen(state),
8791
hasCachedDashboard: applicationHasCachedDashboard(state),
8892
hasNeo4jDesktopConnection: applicationHasNeo4jDesktopConnection(state),
8993
});
@@ -100,7 +104,6 @@ const mapDispatchToProps = dispatch => ({
100104
loadDashboard: text => {
101105
dispatch(clearNotification());
102106
dispatch(loadDashboardThunk(text));
103-
104107
},
105108
resetDashboard: _ => dispatch(resetDashboardState()),
106109
clearOldDashboard: _ => dispatch(setOldDashboard(null)),
@@ -110,14 +113,22 @@ const mapDispatchToProps = dispatch => ({
110113
const old = localStorage.getItem('neodash-dashboard');
111114
dispatch(setOldDashboard(old));
112115
dispatch(setConnected(false));
116+
dispatch(setDashboardToLoadAfterConnecting(null));
117+
dispatch(setStandAloneMode(false));
118+
dispatch(setWelcomeScreenOpen(true));
113119
dispatch(clearNotification());
114120
dispatch(handleSharedDashboardsThunk());
115121
dispatch(setConnectionModalOpen(false));
116122
},
117-
onResetShareDetails: _ => dispatch(resetShareDetails()),
123+
onResetShareDetails: _ => {
124+
dispatch(setWelcomeScreenOpen(true));
125+
dispatch(resetShareDetails());
126+
},
127+
onConfirmLoadSharedDashboard: _ => dispatch(onConfirmLoadSharedDashboardThunk()),
118128
onConnectionModalOpen: _ => dispatch(setConnectionModalOpen(true)),
119129
onConnectionModalClose: _ => dispatch(setConnectionModalOpen(false)),
120130
onAboutModalOpen: _ => dispatch(setAboutModalOpen(true)),
131+
setWelcomeScreenOpen: open => dispatch(setWelcomeScreenOpen(open)),
121132
onAboutModalClose: _ => dispatch(setAboutModalOpen(false)),
122133
});
123134

src/application/ApplicationActions.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ export const setAboutModalOpen = (open: boolean) => ({
3030
payload: { open },
3131
});
3232

33+
export const SET_WELCOME_SCREEN_OPEN = 'APPLICATION/SET_WELCOME_SCREEN_OPEN';
34+
export const setWelcomeScreenOpen = (open: boolean) => ({
35+
type: SET_WELCOME_SCREEN_OPEN,
36+
payload: { open },
37+
});
3338
export const SET_CONNECTION_PROPERTIES = 'APPLICATION/SET_CONNECTION_PROPERTIES';
3439
export const setConnectionProperties = (protocol: string, url: string, port: string, database: string, username: string, password: string) => ({
3540
type: SET_CONNECTION_PROPERTIES,
@@ -66,4 +71,16 @@ export const SET_SHARE_DETAILS_FROM_URL = 'APPLICATION/SET_SHARE_DETAILS_FROM_UR
6671
export const setShareDetailsFromUrl = (type: string, id: string, standalone: boolean, protocol: string, url: string, port: string, database: string, username: string, password: string) => ({
6772
type: SET_SHARE_DETAILS_FROM_URL,
6873
payload: { type, id, standalone, protocol, url, port, database, username, password },
74+
});
75+
76+
export const SET_STANDALONE_MODE = 'APPLICATION/SET_STANDALONE_MODE';
77+
export const setStandAloneMode = (standalone: boolean) => ({
78+
type: SET_STANDALONE_MODE,
79+
payload: { standalone },
80+
});
81+
82+
export const SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING = 'APPLICATION/SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING';
83+
export const setDashboardToLoadAfterConnecting = (id: any) => ({
84+
type: SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING,
85+
payload: { id },
6986
});

src/application/ApplicationReducer.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import {
66
CLEAR_DESKTOP_CONNECTION_PROPERTIES, CLEAR_NOTIFICATION, CREATE_NOTIFICATION, RESET_SHARE_DETAILS, SET_ABOUT_MODAL_OPEN, SET_CONNECTED,
7-
SET_CONNECTION_MODAL_OPEN, SET_CONNECTION_PROPERTIES, SET_DESKTOP_CONNECTION_PROPERTIES, SET_OLD_DASHBOARD, SET_SHARE_DETAILS_FROM_URL
7+
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_STANDALONE_MODE, SET_WELCOME_SCREEN_OPEN
88
} from "./ApplicationActions";
99

1010
const update = (state, mutations) =>
@@ -15,6 +15,7 @@ const initialState =
1515
notificationTitle: null,
1616
notificationMessage: null,
1717
connectionModalOpen: false,
18+
welcomeScreenOpen: true,
1819
aboutModalOpen: false,
1920
connection: {
2021
protocol: "neo4j",
@@ -26,7 +27,9 @@ const initialState =
2627
},
2728
shareDetails: undefined,
2829
desktopConnection: null,
29-
connected: false
30+
connected: false,
31+
dashboardToLoadAfterConnecting: null,
32+
standalone: false
3033
}
3134
export const applicationReducer = (state = initialState, action: { type: any; payload: any; }) => {
3235
const { type, payload } = action;
@@ -61,11 +64,26 @@ export const applicationReducer = (state = initialState, action: { type: any; pa
6164
state = update(state, { aboutModalOpen: open })
6265
return state;
6366
}
67+
case SET_WELCOME_SCREEN_OPEN: {
68+
const { open } = payload;
69+
state = update(state, { welcomeScreenOpen: open })
70+
return state;
71+
}
72+
case SET_STANDALONE_MODE: {
73+
const { standalone } = payload;
74+
state = update(state, { standalone: standalone })
75+
return state;
76+
}
6477
case SET_OLD_DASHBOARD: {
6578
const { text } = payload;
6679
state = update(state, { oldDashboard: text })
6780
return state;
6881
}
82+
case SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING: {
83+
const { id } = payload;
84+
state = update(state, { dashboardToLoadAfterConnecting: id })
85+
return state;
86+
}
6987
case SET_CONNECTION_PROPERTIES: {
7088
const { protocol, url, port, database, username, password } = payload;
7189
state = update(state, {

src/application/ApplicationSelectors.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ export const applicationGetShareDetails = (state: any) => {
2525
return state.application.shareDetails;
2626
}
2727

28+
export const applicationIsStandalone = (state: any) => {
29+
return state.application.standalone;
30+
}
31+
2832
export const applicationHasNeo4jDesktopConnection = (state: any) => {
2933
return state.application.desktopConnection != null;
3034
}
@@ -41,6 +45,9 @@ export const applicationHasAboutModalOpen = (state: any) => {
4145
return state.application.aboutModalOpen;
4246
}
4347

48+
export const applicationHasWelcomeScreenOpen = (state: any) => {
49+
return state.application.welcomeScreenOpen;
50+
}
4451

4552
export const applicationHasCachedDashboard = (state: any) => {
4653
// Avoid this expensive check when the application is connected, as it's only for the welcome screen.

src/application/ApplicationThunks.tsx

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import { createDriver } from "use-neo4j";
2+
import { loadDashboardFromNeo4jThunk, loadDashboardThunk } from "../dashboard/DashboardThunks";
23
import { createNotificationThunk } from "../page/PageThunks";
34
import { QueryStatus, runCypherQuery } from "../report/CypherQueryRunner";
4-
import { setConnected, setConnectionModalOpen, setConnectionProperties, setDesktopConnectionProperties, resetShareDetails, setShareDetailsFromUrl } from "./ApplicationActions";
5+
import {
6+
setConnected, setConnectionModalOpen, setConnectionProperties, setDesktopConnectionProperties,
7+
resetShareDetails, setShareDetailsFromUrl, setWelcomeScreenOpen, setStandAloneMode, setDashboardToLoadAfterConnecting
8+
} from "./ApplicationActions";
59

610

711
export const createConnectionThunk = (protocol, url, port, database, username, password) => (dispatch: any, getState: any) => {
812
try {
13+
console.log(protocol, url, port, database, username, password);
914
const driver = createDriver(protocol, url, port, username, password)
1015
console.log("Attempting to connect...")
1116
const validateConnection = (records) => {
@@ -17,6 +22,22 @@ export const createConnectionThunk = (protocol, url, port, database, username, p
1722
dispatch(setConnectionProperties(protocol, url, port, database, username, password));
1823
dispatch(setConnectionModalOpen(false));
1924
dispatch(setConnected(true));
25+
26+
// If we have remembered to load a specific dashboard after connecting to the database, take care of it here.
27+
const application = getState().application;
28+
if (application.dashboardToLoadAfterConnecting && application.dashboardToLoadAfterConnecting.startsWith("http")) {
29+
fetch(application.dashboardToLoadAfterConnecting)
30+
.then(response => response.text())
31+
.then(data => dispatch(loadDashboardThunk(data)));
32+
dispatch(setDashboardToLoadAfterConnecting(null));
33+
} else if (application.dashboardToLoadAfterConnecting) {
34+
const setDashboardAfterLoadingFromDatabase = (value) => {
35+
dispatch(loadDashboardThunk(value));
36+
}
37+
dispatch(loadDashboardFromNeo4jThunk(driver, application.dashboardToLoadAfterConnecting, setDashboardAfterLoadingFromDatabase));
38+
dispatch(setDashboardToLoadAfterConnecting(null));
39+
}
40+
2041
} else {
2142
dispatch(createNotificationThunk("Unknown Connection Error", "Check the browser console."));
2243
}
@@ -84,7 +105,7 @@ export const handleSharedDashboardsThunk = () => (dispatch: any, getState: any)
84105
const id = decodeURIComponent(urlParams.get("id"));
85106
const type = urlParams.get("type");
86107
const standalone = urlParams.get("standalone") == "yes";
87-
if(urlParams.get("credentials")){
108+
if (urlParams.get("credentials")) {
88109
const connection = decodeURIComponent(urlParams.get("credentials"));
89110
const protocol = connection.split("://")[0];
90111
const username = connection.split("://")[1].split(":")[0];
@@ -93,13 +114,34 @@ export const handleSharedDashboardsThunk = () => (dispatch: any, getState: any)
93114
const url = connection.split("@")[1].split(":")[1];
94115
const port = connection.split("@")[1].split(":")[2];
95116
dispatch(setShareDetailsFromUrl(type, id, standalone, protocol, url, port, database, username, password));
96-
}else{
117+
} else {
97118
dispatch(setShareDetailsFromUrl(type, id, undefined, undefined, undefined, undefined, undefined, undefined, undefined));
98119
}
99-
120+
100121
}
101122

102123
} catch (e) {
103-
dispatch(createNotificationThunk("Unable to load shared dashboard", "You have specified an invalid/incomplete share URL. Try regenerating the URL from the sharing window."));
124+
dispatch(createNotificationThunk("Unable to load shared dashboard", "You have specified an invalid/incomplete share URL. Try regenerating the share URL from the sharing window."));
125+
}
126+
}
127+
128+
129+
export const onConfirmLoadSharedDashboardThunk = () => (dispatch: any, getState: any) => {
130+
try {
131+
const state = getState();
132+
const shareDetails = state.application.shareDetails;
133+
dispatch(setWelcomeScreenOpen(false));
134+
dispatch(setDashboardToLoadAfterConnecting(shareDetails.id));
135+
if (shareDetails.url) {
136+
dispatch(createConnectionThunk(shareDetails.protocol, shareDetails.url, shareDetails.port, shareDetails.database, shareDetails.username, shareDetails.password));
137+
} else {
138+
dispatch(setConnectionModalOpen(true));
139+
}
140+
if (shareDetails.standalone == true) {
141+
dispatch(setStandAloneMode(true));
142+
}
143+
dispatch(resetShareDetails());
144+
} catch (e) {
145+
dispatch(createNotificationThunk("Unable to load shared dashboard", "The provided connection or dashboard identifiers are invalid. Try regenerating the share URL from the sharing window."));
104146
}
105147
}

src/chart/GraphChart.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ const NeoGraphChart = (props: ChartProps) => {
158158
}
159159

160160
const generateTooltip = (value) => {
161-
const tooltip = <div><b> {value.labels ? (value.labels.length > 0 ? value.labels.join(", ") : "Node") : value.type}</b><table><tbody>{Object.keys(value.properties).length == 0 ? <tr><td>(No properties)</td></tr> : Object.keys(value.properties).map((k, i) => <tr key={i}><td key={0}>{k.toString()}:</td><td key={1}>{value.properties[k].toString()}</td></tr>)}</tbody></table></div>;
161+
const tooltip = <div><b> {value.labels ? (value.labels.length > 0 ? value.labels.join(", ") : "Node") : value.type}</b><table><tbody>{Object.keys(value.properties).length == 0 ? <tr><td>(No properties)</td></tr> : Object.keys(value.properties).map((k, i) => <tr key={i}><td key={0}>{k.toString()}:</td><td key={1}>{(value.properties[k].toString().length <= 30) ? value.properties[k].toString() : value.properties[k].toString().substring(0,40) +"..."}</td></tr>)}</tbody></table></div>;
162162
return ReactDOMServer.renderToString(tooltip);
163163
}
164164

src/chart/SingleValueChart.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import { ChartProps } from './Chart';
77
const NeoSingleValueChart = (props: ChartProps) => {
88
const records = props.records;
99
const fontSize = props.settings && props.settings.fontSize ? props.settings.fontSize : 32;
10+
const marginTop = props.settings && props.settings.marginTop ? props.settings.marginTop : 0;
1011
const color = props.settings && props.settings.color ? props.settings.color : "rgba(0, 0, 0, 0.87)";
12+
const textAlign = props.settings && props.settings.textAlign ? props.settings.textAlign : "left";
1113

1214
const value = (records && records[0] && records[0]["_fields"]) ? records[0]["_fields"][0].toString() : "";
13-
return <div style={{marginTop: "0px", marginLeft: "15px"}}>
15+
return <div style={{marginTop: marginTop, textAlign: textAlign, marginLeft: "15px", marginRight: "15px"}}>
1416
<span style={{fontSize: fontSize, color: color}}>{value}</span>
1517
</div >;
1618
}

src/config/ReportConfig.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ export const REPORT_TYPES = {
245245
"line": {
246246
label: "Line Chart",
247247
component: NeoLineChart,
248-
helperText: <div>A line chart expects two fields: an <code>x</code> value and a <code>y</code> value.</div>,
248+
helperText: <div>A line chart expects two fields: an <code>x</code> value and a <code>y</code> value. Values are automatically selected from your query results.</div>,
249249
selection: {
250250
"x": {
251251
label: "X-value",
@@ -433,7 +433,18 @@ export const REPORT_TYPES = {
433433
label: "Color",
434434
type: SELECTION_TYPES.TEXT,
435435
default: "rgba(0, 0, 0, 0.87)"
436-
}
436+
},
437+
"textAlign": {
438+
label: "Text Align",
439+
type: SELECTION_TYPES.LIST,
440+
values: ["left", "center", "right"],
441+
default: "left"
442+
},
443+
"marginTop": {
444+
label: "Margin Top (px)",
445+
type: SELECTION_TYPES.NUMBER,
446+
default: 0
447+
},
437448
}
438449
},
439450
"json": {

src/dashboard/DashboardDrawer.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import NeoLoadModal from "../modal/LoadModal";
99
import NeoShareModal from "../modal/ShareModal";
1010
import { NeoAboutModal } from "../modal/AboutModal";
1111
import { NeoDocumentationModal } from "../modal/DocumentationModal";
12-
import { applicationGetConnection, applicationHasAboutModalOpen } from '../application/ApplicationSelectors';
12+
import { applicationGetConnection, applicationHasAboutModalOpen, applicationIsStandalone } from '../application/ApplicationSelectors';
1313
import { connect } from 'react-redux';
1414
import { setAboutModalOpen } from '../application/ApplicationActions';
1515
import NeoSettingsModal from "../settings/SettingsModal";
@@ -18,9 +18,14 @@ import { getDashboardSettings } from "./DashboardSelectors";
1818
import { updateDashboardSetting } from "../settings/SettingsActions";
1919

2020

21-
export const NeoDrawer = ({ open, connection, dashboardSettings, updateDashboardSetting,
21+
export const NeoDrawer = ({ open, hidden, connection, dashboardSettings, updateDashboardSetting,
2222
handleDrawerClose, aboutModalOpen, onShareModalOpen, onAboutModalOpen }) => {
2323

24+
// Override to hide the drawer when the application is in standalone mode.
25+
if (hidden) {
26+
return <></>;
27+
}
28+
2429
const content = (
2530
<Drawer
2631
variant="permanent"
@@ -97,6 +102,7 @@ export const NeoDrawer = ({ open, connection, dashboardSettings, updateDashboard
97102

98103
const mapStateToProps = state => ({
99104
dashboardSettings: getDashboardSettings(state),
105+
hidden: applicationIsStandalone(state),
100106
aboutModalOpen: applicationHasAboutModalOpen(state),
101107
connection: applicationGetConnection(state)
102108
});

0 commit comments

Comments
 (0)