Skip to content

Commit 69dbf15

Browse files
authored
Merge pull request #571 from neo4j-labs/task/SideBarRemote
Remote Sidebar Import + Fixes
2 parents bde3cc0 + 1718a70 commit 69dbf15

File tree

79 files changed

+263
-2744
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+263
-2744
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
"@codemirror/lang-markdown": "^6.1.1",
3939
"@dnd-kit/core": "^6.0.8",
4040
"@dnd-kit/sortable": "^7.0.2",
41-
"@mui/icons-material": "^5.11.16",
4241
"@mui/material": "^5.12.3",
4342
"@mui/styles": "^5.12.3",
4443
"@mui/x-data-grid": "5.17.26",
@@ -135,6 +134,7 @@
135134
"typescript": "^4.8.4",
136135
"webpack": "^5.77.0",
137136
"webpack-cli": "^4.9.1",
138-
"webpack-dev-server": "^4.7.3"
137+
"webpack-dev-server": "^4.7.3",
138+
"circular-dependency-plugin": "^5.2.2"
139139
}
140140
}

src/application/Application.tsx

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import React, { useEffect } from 'react';
2-
import NeoNotificationModal from '../modal/NotificationModal';
1+
import React, { Suspense, useEffect } from 'react';
32
import NeoWelcomeScreenModal from '../modal/WelcomeScreenModal';
43
import { connect } from 'react-redux';
54
import {
@@ -39,17 +38,20 @@ import {
3938
import { resetDashboardState } from '../dashboard/DashboardActions';
4039
import { NeoDashboardPlaceholder } from '../dashboard/placeholder/DashboardPlaceholder';
4140
import NeoConnectionModal from '../modal/ConnectionModal';
42-
import Dashboard from '../dashboard/Dashboard';
43-
import NeoAboutModal from '../modal/AboutModal';
44-
import { NeoUpgradeOldDashboardModal } from '../modal/UpgradeOldDashboardModal';
41+
4542
import { loadDashboardThunk } from '../dashboard/DashboardThunks';
46-
import { NeoLoadSharedDashboardModal } from '../modal/LoadSharedDashboardModal';
4743
import { downloadComponentAsImage } from '../chart/ChartUtils';
48-
import NeoReportHelpModal from '../modal/ReportHelpModal';
4944
import '@neo4j-ndl/base/lib/neo4j-ds-styles.css';
5045
import { resetSessionStorage } from '../sessionStorage/SessionStorageActions';
5146
import { getDashboardTheme } from '../dashboard/DashboardSelectors';
5247

48+
const NeoUpgradeOldDashboardModal = React.lazy(() => import('../modal/UpgradeOldDashboardModal'));
49+
const NeoLoadSharedDashboardModal = React.lazy(() => import('../modal/LoadSharedDashboardModal'));
50+
const NeoReportHelpModal = React.lazy(() => import('../modal/ReportHelpModal'));
51+
const NeoNotificationModal = React.lazy(() => import('../modal/NotificationModal'));
52+
const NeoAboutModal = React.lazy(() => import('../modal/AboutModal'));
53+
const Dashboard = React.lazy(() => import('../dashboard/Dashboard'));
54+
5355
/**
5456
* This is the main application component for NeoDash.
5557
* It contains:
@@ -122,16 +124,20 @@ const Application = ({
122124
className={`n-bg-palette-neutral-bg-default n-h-screen n-w-screen n-flex n-flex-col n-overflow-hidden`}
123125
>
124126
{connected ? (
125-
<Dashboard
126-
onDownloadDashboardAsImage={(_) => downloadComponentAsImage(ref)}
127-
onAboutModalOpen={onAboutModalOpen}
128-
resetApplication={resetApplication}
129-
></Dashboard>
127+
<Suspense fallback=''>
128+
<Dashboard
129+
onDownloadDashboardAsImage={(_) => downloadComponentAsImage(ref)}
130+
onAboutModalOpen={onAboutModalOpen}
131+
resetApplication={resetApplication}
132+
></Dashboard>
133+
</Suspense>
130134
) : (
131135
<NeoDashboardPlaceholder></NeoDashboardPlaceholder>
132136
)}
133137
{/* TODO - move all models into a pop-ups (or modals) component. */}
134-
<NeoAboutModal open={aboutModalOpen} handleClose={onAboutModalClose} getDebugState={getDebugState} />
138+
<Suspense fallback=''>
139+
<NeoAboutModal open={aboutModalOpen} handleClose={onAboutModalClose} getDebugState={getDebugState} />
140+
</Suspense>
135141
<NeoConnectionModal
136142
open={connectionModalOpen}
137143
dismissable={connected}
@@ -154,19 +160,27 @@ const Application = ({
154160
onAboutModalOpen={onAboutModalOpen}
155161
resetDashboard={resetDashboard}
156162
></NeoWelcomeScreenModal>
157-
<NeoUpgradeOldDashboardModal
158-
open={oldDashboard}
159-
text={oldDashboard}
160-
loadDashboard={loadDashboard}
161-
clearOldDashboard={clearOldDashboard}
162-
/>
163-
<NeoLoadSharedDashboardModal
164-
shareDetails={shareDetails}
165-
onResetShareDetails={onResetShareDetails}
166-
onConfirmLoadSharedDashboard={onConfirmLoadSharedDashboard}
167-
/>
168-
<NeoReportHelpModal open={reportHelpModalOpen} handleClose={onReportHelpModalClose} />
169-
<NeoNotificationModal></NeoNotificationModal>
163+
<Suspense fallback=''>
164+
<NeoUpgradeOldDashboardModal
165+
open={oldDashboard}
166+
text={oldDashboard}
167+
loadDashboard={loadDashboard}
168+
clearOldDashboard={clearOldDashboard}
169+
/>
170+
</Suspense>
171+
<Suspense fallback=''>
172+
<NeoLoadSharedDashboardModal
173+
shareDetails={shareDetails}
174+
onResetShareDetails={onResetShareDetails}
175+
onConfirmLoadSharedDashboard={onConfirmLoadSharedDashboard}
176+
/>
177+
</Suspense>
178+
<Suspense fallback=''>
179+
<NeoReportHelpModal open={reportHelpModalOpen} handleClose={onReportHelpModalClose} />
180+
</Suspense>
181+
<Suspense fallback=''>
182+
<NeoNotificationModal></NeoNotificationModal>
183+
</Suspense>
170184
</div>
171185
);
172186
};

src/application/ApplicationThunks.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
loadDashboardThunk,
1010
upgradeDashboardVersion,
1111
} from '../dashboard/DashboardThunks';
12-
import { setExtensionSidebarOpen } from '../extensions/sidebar/state/SidebarActions';
1312
import { createNotificationThunk } from '../page/PageThunks';
1413
import { runCypherQuery } from '../report/ReportQueryRunner';
1514
import {
@@ -395,8 +394,6 @@ export const loadApplicationConfigThunk = () => async (dispatch: any, getState:
395394
)
396395
);
397396
dispatch(setConnectionModalOpen(false));
398-
// TODO - generalize this, close all drawer-based extensions on app startup.
399-
dispatch(setExtensionSidebarOpen(false));
400397

401398
// Auto-upgrade the dashboard version if an old version is cached.
402399
if (state.dashboard && state.dashboard.version !== NEODASH_VERSION) {

src/card/CardReducer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
UPDATE_REPORT_DATABASE,
1616
} from './CardActions';
1717
import { TOGGLE_CARD_SETTINGS } from './CardActions';
18-
import { createUUID } from '../dashboard/DashboardThunks';
18+
import { createUUID } from '../utils/uuid';
1919

2020
const update = (state, mutations) => Object.assign({}, state, mutations);
2121

src/card/settings/CardSettingsContent.tsx

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@ import NeoCodeEditorComponent, {
77
} from '../../component/editor/CodeEditorComponent';
88
import { getReportTypes } from '../../extensions/ExtensionUtils';
99
import { Dropdown } from '@neo4j-ndl/react';
10-
import {
11-
EXTENSIONS_CARD_SETTINGS_COMPONENT,
12-
getExtensionCardSettingsComponents,
13-
} from '../../extensions/ExtensionConfig';
10+
import { EXTENSIONS_CARD_SETTINGS_COMPONENT } from '../../extensions/ExtensionConfig';
11+
import { update } from '../../utils/ObjectManipulation';
1412

1513
const NeoCardSettingsContent = ({
1614
pagenumber,
@@ -42,7 +40,8 @@ const NeoCardSettingsContent = ({
4240
}, [query]);
4341

4442
const reportTypes = getReportTypes(extensions);
45-
const SettingsComponent = reportTypes[type] && reportTypes[type].settingsComponent;
43+
const report = reportTypes[type];
44+
const SettingsComponent = report?.settingsComponent || {};
4645

4746
function hasExtensionComponents() {
4847
return (
@@ -85,13 +84,13 @@ const NeoCardSettingsContent = ({
8584
<NeoCodeEditorComponent
8685
value={queryText}
8786
editable={true}
88-
language={reportTypes[type] && reportTypes[type].inputMode ? reportTypes[type].inputMode : 'cypher'}
87+
language={report?.inputMode || 'cypher'}
8988
onChange={(value) => {
9089
updateCypherQuery(value);
9190
}}
9291
placeholder={`Enter Cypher here...`}
9392
/>
94-
<div style={DEFAULT_CARD_SETTINGS_HELPER_TEXT_STYLE}>{reportTypes[type] && reportTypes[type].helperText}</div>
93+
<div style={DEFAULT_CARD_SETTINGS_HELPER_TEXT_STYLE}>{report?.helperText || ''}</div>
9594
</>
9695
);
9796

@@ -105,20 +104,20 @@ const NeoCardSettingsContent = ({
105104
onChange: (newValue) =>
106105
newValue && onTypeUpdate(Object.keys(reportTypes).find((key) => reportTypes[key].label === newValue.value)),
107106
options: Object.keys(reportTypes).map((option) => ({
108-
label: reportTypes[type] && reportTypes[option].label,
109-
value: reportTypes[type] && reportTypes[option].label,
107+
label: report && reportTypes[option].label,
108+
value: report && reportTypes[option].label,
110109
})),
111110
value: {
112-
label: reportTypes[type] && reportTypes[type].label,
113-
value: reportTypes[type] && reportTypes[type].label,
111+
label: report?.label || '',
112+
value: report?.label || '',
114113
},
115114
menuPortalTarget: document.querySelector('body'),
116115
}}
117116
fluid
118117
style={{ marginLeft: '0px', marginRight: '10px', width: '47%', maxWidth: '200px', display: 'inline-block' }}
119118
/>
120119

121-
{reportTypes[type] && reportTypes[type].disableDatabaseSelector == undefined ? (
120+
{report?.disableDatabaseSelector == undefined ? (
122121
<Dropdown
123122
id='databaseSelector'
124123
label='Database'
@@ -146,11 +145,10 @@ const NeoCardSettingsContent = ({
146145
<br />
147146
<br />
148147
{/* Allow for overriding the code box with a custom component */}
149-
{reportTypes[type] && reportTypes[type].settingsComponent ? (
148+
{report && report.settingsComponent ? (
150149
<SettingsComponent
151-
type={type}
152150
onReportSettingUpdate={onReportSettingUpdate}
153-
settings={reportSettings}
151+
settings={update({ helperText: report.helperText, inputMode: report.inputMode }, reportSettings)}
154152
database={database}
155153
query={query}
156154
onQueryUpdate={onQueryUpdate}

src/card/settings/CardSettingsFooter.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
import { getReportTypes } from '../../extensions/ExtensionUtils';
1111
import { RULE_BASED_REPORT_ACTIONS_CUSTOMIZATIONS } from '../../extensions/actions/ActionsRuleCreationModal';
1212
import NeoCustomReportActionsModal from '../../extensions/actions/ActionsRuleCreationModal';
13-
import PlayCircleOutlineIcon from '@mui/icons-material/PlayCircleOutline';
1413
import { AdjustmentsHorizontalIconOutline, SparklesIconOutline } from '@neo4j-ndl/react/icons';
1514
import { IconButton, Switch } from '@neo4j-ndl/react';
1615

src/card/settings/custom/CardSettingsContentPropertySelect.tsx

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,10 @@ import { QueryStatus, runCypherQuery } from '../../../report/ReportQueryRunner';
66
import { Neo4jContext, Neo4jContextState } from 'use-neo4j/dist/neo4j.context';
77
import { Autocomplete, debounce, TextField } from '@mui/material';
88
import NeoField from '../../../component/field/Field';
9-
import { getReportTypes } from '../../../extensions/ExtensionUtils';
109
import { Dropdown } from '@neo4j-ndl/react';
1110
import NeoCodeEditorComponent from '../../../component/editor/CodeEditorComponent';
1211

13-
const NeoCardSettingsContentPropertySelect = ({
14-
query,
15-
type,
16-
database,
17-
settings,
18-
extensions,
19-
onReportSettingUpdate,
20-
onQueryUpdate,
21-
}) => {
12+
const NeoCardSettingsContentPropertySelect = ({ query, database, settings, onReportSettingUpdate, onQueryUpdate }) => {
2213
const { driver } = useContext<Neo4jContextState>(Neo4jContext);
2314
if (!driver) {
2415
throw new Error(
@@ -199,7 +190,8 @@ const NeoCardSettingsContentPropertySelect = ({
199190
// TODO: since this component is only rendered for parameter select, this is technically not needed
200191
const parameterSelectTypes = ['Node Property', 'Relationship Property', 'Free Text', 'Custom Query', 'Date Picker'];
201192
const selectedType = settings.type ? settings.type : 'Node Property';
202-
const reportTypes = getReportTypes(extensions);
193+
const helperText = settings?.helperText || '';
194+
const inputMode = settings?.inputMode || 'cypher';
203195
const overridePropertyDisplayName =
204196
settings.overridePropertyDisplayName !== undefined ? settings.overridePropertyDisplayName : false;
205197

@@ -213,7 +205,7 @@ const NeoCardSettingsContentPropertySelect = ({
213205
return (
214206
<div>
215207
<p style={{ color: 'grey', fontSize: 12, paddingLeft: '5px', border: '1px solid lightgrey', marginTop: '0px' }}>
216-
{reportTypes[type].helperText}
208+
{helperText}
217209
</p>
218210
<Dropdown
219211
id='type'
@@ -265,7 +257,7 @@ const NeoCardSettingsContentPropertySelect = ({
265257
<NeoCodeEditorComponent
266258
value={queryText}
267259
editable={true}
268-
language={reportTypes[type] && reportTypes[type].inputMode ? reportTypes[type].inputMode : 'cypher'}
260+
language={inputMode}
269261
onChange={(value) => {
270262
debouncedQueryUpdate(value);
271263
setQueryText(value);

src/card/view/CardView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import { CardContent } from '@mui/material';
66
import NeoCodeEditorComponent from '../../component/editor/CodeEditorComponent';
77

88
import { CARD_FOOTER_HEIGHT, CARD_HEADER_HEIGHT } from '../../config/CardConfig';
9-
import { extensionEnabled, getReportTypes } from '../../extensions/ExtensionUtils';
9+
import { getReportTypes } from '../../extensions/ExtensionUtils';
1010
import NeoCodeViewerComponent from '../../component/editor/CodeViewerComponent';
1111
import { NeoReportWrapper } from '../../report/ReportWrapper';
1212
import { identifyStyleRuleParameters } from '../../extensions/styling/StyleRuleEvaluator';
1313
import { ThemeProvider } from '@mui/material/styles';
1414
import { lightTheme, darkHeaderTheme, luma } from '../../component/theme/Themes';
1515
import { IconButton } from '@neo4j-ndl/react';
1616
import { PlayCircleIconSolid } from '@neo4j-ndl/react/icons';
17+
import { extensionEnabled } from '../../utils/ReportUtils';
1718

1819
const NeoCardView = ({
1920
id,

src/card/view/CardViewHeader.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React, { useEffect } from 'react';
22
import { Badge, CardHeader, Dialog, DialogContent, DialogTitle, TextField, Tooltip } from '@mui/material';
33
import debounce from 'lodash/debounce';
44
import { useCallback } from 'react';
5-
import { Close, ThirteenMp } from '@mui/icons-material';
65
import ReactMarkdown from 'react-markdown';
76
import gfm from 'remark-gfm';
87
import { replaceDashboardParameters } from '../../chart/ChartUtils';
@@ -16,6 +15,7 @@ import {
1615
ShrinkIcon,
1716
CameraIconSolid,
1817
InformationCircleIconOutline,
18+
XMarkIconOutline,
1919
} from '@neo4j-ndl/react/icons';
2020
import { createTheme, ThemeProvider } from '@mui/material/styles';
2121

@@ -81,7 +81,13 @@ const NeoCardViewHeader = ({
8181
<tr>
8282
{editable ? (
8383
<td>
84-
<IconButton className='n-mb-3 n-relative -n-left-3 drag-handle' clean size='medium' aria-label={'drag'}>
84+
<IconButton
85+
className='n-mb-3 n-relative -n-left-3 drag-handle'
86+
clean
87+
size='medium'
88+
aria-label={'drag'}
89+
onClick={() => {}}
90+
>
8591
<DragIcon />
8692
</IconButton>
8793
</td>
@@ -172,7 +178,7 @@ const NeoCardViewHeader = ({
172178
<>
173179
<Dialog
174180
maxWidth={'lg'}
175-
open={descriptionModalOpen == true}
181+
open={descriptionModalOpen}
176182
onClose={() => setDescriptionModalOpen(false)}
177183
aria-labelledby='form-dialog-title'
178184
>
@@ -182,10 +188,9 @@ const NeoCardViewHeader = ({
182188
onClick={() => setDescriptionModalOpen(false)}
183189
style={{ padding: '3px', float: 'right' }}
184190
aria-label={'rect badge'}
191+
clean
185192
>
186-
<Badge overlap='rectangular' badgeContent={''}>
187-
<Close />
188-
</Badge>
193+
<XMarkIconOutline />
189194
</IconButton>
190195
</DialogTitle>
191196
<DialogContent style={{ minWidth: '400px' }}>

src/chart/ChartUtils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,6 @@ export const downloadComponentAsImage = (ref) => {
247247

248248
import { QueryResult, Record as Neo4jRecord } from 'neo4j-driver';
249249
import { RenderSubValue } from '../report/ReportRecordProcessing';
250-
import { DEFAULT_NODE_LABELS } from '../config/ReportConfig';
251250

252251
/**
253252
* Function to cast a value received from the Neo4j Driver to its TS native type
@@ -442,3 +441,5 @@ export function getSelectionBasedOnFields(fields, oldSelection = {}, autoAssignS
442441
});
443442
return selection;
444443
}
444+
445+
export const DEFAULT_NODE_LABELS = ['name', 'title', 'label', 'id', 'uid', '(label)'];

0 commit comments

Comments
 (0)