Full Code of nielsdejong/neodash for AI

master 97c0be0b63b7 cached
384 files
1.5 MB
382.7k tokens
509 symbols
1 requests
Download .txt
Showing preview only (1,619K chars total). Download the full file or copy to clipboard to get everything.
Repository: nielsdejong/neodash
Branch: master
Commit: 97c0be0b63b7
Files: 384
Total size: 1.5 MB

Directory structure:
gitextract_84dlt97i/

├── .babelrc
├── .eslintrc.json
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   └── feature-request.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── develop-deployment.yml
│       ├── develop-test.yml
│       ├── master-deployment.yml
│       └── master-test.yml
├── .gitignore
├── .husky/
│   ├── common.sh
│   └── pre-commit
├── .lintstagedrc.json
├── .npmignore
├── .prettierignore
├── .prettierrc.json
├── Dockerfile
├── LICENSE
├── README.md
├── about.md
├── changelog.md
├── compose.yaml
├── conf/
│   └── default.conf.template
├── cypress/
│   ├── Page.js
│   ├── e2e/
│   │   ├── charts/
│   │   │   ├── array.cy.js
│   │   │   ├── bar.cy.js
│   │   │   └── table.cy.js
│   │   └── start_page.cy.js
│   ├── fixtures/
│   │   └── cypher_queries.js
│   ├── index.js
│   ├── plugins/
│   │   └── index.js
│   └── support/
│       ├── commands.js
│       └── e2e.ts
├── cypress.config.ts
├── docs/
│   ├── README.md
│   ├── antora.yml
│   ├── modules/
│   │   └── ROOT/
│   │       ├── nav.adoc
│   │       └── pages/
│   │           ├── banner.adoc
│   │           ├── developer-guide/
│   │           │   ├── adding-visualizations.adoc
│   │           │   ├── build-and-run.adoc
│   │           │   ├── component-overview.adoc
│   │           │   ├── configuration.adoc
│   │           │   ├── contributing.adoc
│   │           │   ├── deploy-a-build.adoc
│   │           │   ├── design.adoc
│   │           │   ├── index.adoc
│   │           │   ├── session-storage.adoc
│   │           │   ├── standalone-mode.adoc
│   │           │   ├── state-management.adoc
│   │           │   ├── style-configuration.adoc
│   │           │   └── testing.adoc
│   │           ├── index.adoc
│   │           ├── quickstart.adoc
│   │           └── user-guide/
│   │               ├── access-control.adoc
│   │               ├── bloom-integration.adoc
│   │               ├── dashboards.adoc
│   │               ├── extensions/
│   │               │   ├── access-control-management.adoc
│   │               │   ├── advanced-visualizations.adoc
│   │               │   ├── forms.adoc
│   │               │   ├── index.adoc
│   │               │   ├── natural-language-queries.adoc
│   │               │   ├── report-actions.adoc
│   │               │   ├── rule-based-styling.adoc
│   │               │   └── workflows.adoc
│   │               ├── faq.adoc
│   │               ├── index.adoc
│   │               ├── pages.adoc
│   │               ├── publishing.adoc
│   │               └── reports/
│   │                   ├── areamap.adoc
│   │                   ├── bar-chart.adoc
│   │                   ├── choropleth.adoc
│   │                   ├── circle-packing.adoc
│   │                   ├── form.adoc
│   │                   ├── gantt.adoc
│   │                   ├── gauge-chart.adoc
│   │                   ├── graph.adoc
│   │                   ├── graph3d.adoc
│   │                   ├── iframe.adoc
│   │                   ├── index.adoc
│   │                   ├── line-chart.adoc
│   │                   ├── map.adoc
│   │                   ├── markdown.adoc
│   │                   ├── parameter-select.adoc
│   │                   ├── pie-chart.adoc
│   │                   ├── radar.adoc
│   │                   ├── raw-json.adoc
│   │                   ├── sankey.adoc
│   │                   ├── single-value.adoc
│   │                   ├── sunburst.adoc
│   │                   ├── table.adoc
│   │                   └── treemap.adoc
│   ├── package.json
│   ├── preview.yml
│   └── server.js
├── gallery/
│   ├── .gitignore
│   ├── LICENSE
│   ├── README.md
│   ├── dashboards/
│   │   ├── assessment.json
│   │   ├── bom-english.json
│   │   ├── bom.json
│   │   ├── citation.json
│   │   ├── domains.json
│   │   ├── fraud.json
│   │   ├── jokes.json
│   │   ├── movies.json
│   │   ├── recommendations.json
│   │   ├── twitter.json
│   │   └── wine.json
│   ├── package.json
│   ├── postcss.config.js
│   ├── public/
│   │   ├── index.html
│   │   ├── manifest.json
│   │   └── robots.txt
│   ├── setup.md
│   ├── src/
│   │   ├── App.css
│   │   ├── App.tsx
│   │   ├── index.css
│   │   ├── index.tsx
│   │   ├── react-app-env.d.ts
│   │   ├── reportWebVitals.ts
│   │   └── setupTests.ts
│   ├── tailwind.config.js
│   └── tsconfig.json
├── k8s-deploy/
│   ├── neodash/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── NOTES.txt
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   ├── hpa.yaml
│   │   │   ├── ingress.yaml
│   │   │   ├── service.yaml
│   │   │   ├── serviceaccount.yaml
│   │   │   └── tests/
│   │   │       └── test-connection.yaml
│   │   └── values.yaml
│   └── sample-k8s-yamls/
│       ├── deployment.yaml
│       └── service.yaml
├── package.json
├── postcss.config.js
├── public/
│   ├── README.md
│   ├── config.json
│   ├── embed-test.html
│   ├── index.html
│   ├── manifest.json
│   ├── style.config.json
│   └── style.css
├── release-notes.md
├── scripts/
│   ├── config-entrypoint.sh
│   ├── docker-neo4j-initializer/
│   │   ├── docker-neo4j.sh
│   │   ├── movies.cypher
│   │   └── start-movies-db.sh
│   └── message-entrypoint.sh
├── src/
│   ├── application/
│   │   ├── Application.tsx
│   │   ├── ApplicationActions.ts
│   │   ├── ApplicationReducer.ts
│   │   ├── ApplicationSelectors.ts
│   │   ├── ApplicationThunks.ts
│   │   └── logging/
│   │       ├── LoggingActions.ts
│   │       ├── LoggingReducer.ts
│   │       ├── LoggingSelectors.ts
│   │       └── LoggingThunk.ts
│   ├── card/
│   │   ├── Card.tsx
│   │   ├── CardActions.ts
│   │   ├── CardAddButton.tsx
│   │   ├── CardReducer.ts
│   │   ├── CardSelectors.ts
│   │   ├── CardStyle.ts
│   │   ├── CardThunks.ts
│   │   ├── settings/
│   │   │   ├── CardSettings.tsx
│   │   │   ├── CardSettingsContent.tsx
│   │   │   ├── CardSettingsFooter.tsx
│   │   │   └── CardSettingsHeader.tsx
│   │   └── view/
│   │       ├── CardView.tsx
│   │       ├── CardViewFooter.tsx
│   │       └── CardViewHeader.tsx
│   ├── chart/
│   │   ├── Chart.ts
│   │   ├── ChartUtils.ts
│   │   ├── SettingsUtils.ts
│   │   ├── Utils.ts
│   │   ├── bar/
│   │   │   ├── BarChart.tsx
│   │   │   └── util.ts
│   │   ├── graph/
│   │   │   ├── GraphChart.tsx
│   │   │   ├── GraphChartVisualization.ts
│   │   │   ├── GraphChartVisualization2D.tsx
│   │   │   ├── GraphChartVisualizationBase.tsx
│   │   │   ├── component/
│   │   │   │   ├── GraphChartCanvas.tsx
│   │   │   │   ├── GraphChartContextMenu.tsx
│   │   │   │   ├── GraphChartEditModal.tsx
│   │   │   │   ├── GraphChartInspectModal.tsx
│   │   │   │   ├── GraphChartTooltip.tsx
│   │   │   │   ├── GraphEntityInspectionTable.tsx
│   │   │   │   ├── autocomplete/
│   │   │   │   │   ├── LabelTypeAutocomplete.tsx
│   │   │   │   │   └── PropertyNameAutocomplete.tsx
│   │   │   │   └── button/
│   │   │   │       ├── GraphChartDeepLinkButton.tsx
│   │   │   │       ├── GraphChartFitViewButton.tsx
│   │   │   │       ├── GraphChartLockButton.tsx
│   │   │   │       └── modal/
│   │   │   │           └── DeletePropertyButton.tsx
│   │   │   └── util/
│   │   │       ├── EditUtils.ts
│   │   │       ├── ExplorationUtils.ts
│   │   │       ├── NodeUtils.ts
│   │   │       ├── RecordUtils.ts
│   │   │       └── RelUtils.ts
│   │   ├── iframe/
│   │   │   └── IFrameChart.tsx
│   │   ├── json/
│   │   │   └── JSONChart.tsx
│   │   ├── line/
│   │   │   └── LineChart.tsx
│   │   ├── map/
│   │   │   ├── MapChart.tsx
│   │   │   ├── MapUtils.ts
│   │   │   └── layers/
│   │   │       ├── HeatmapLayer.tsx
│   │   │       ├── LineLayer.tsx
│   │   │       └── MarkerLayer.tsx
│   │   ├── markdown/
│   │   │   └── MarkdownChart.tsx
│   │   ├── parameter/
│   │   │   ├── ParameterSelectCardSettings.tsx
│   │   │   ├── ParameterSelectionChart.tsx
│   │   │   └── component/
│   │   │       ├── DateParameterSelect.tsx
│   │   │       ├── FreeTextParameterSelect.tsx
│   │   │       ├── NodePropertyParameterSelect.tsx
│   │   │       ├── ParameterSelect.ts
│   │   │       ├── QueryParameterSelect.tsx
│   │   │       ├── RelationshipPropertyParameterSelect.tsx
│   │   │       └── SelectionConfirmationButton.tsx
│   │   ├── pie/
│   │   │   └── PieChart.tsx
│   │   ├── scatter/
│   │   │   └── ScatterPlotChart.tsx
│   │   ├── single/
│   │   │   └── SingleValueChart.tsx
│   │   └── table/
│   │       ├── TableActionsHelper.ts
│   │       └── TableChart.tsx
│   ├── component/
│   │   ├── editor/
│   │   │   ├── CodeEditorComponent.tsx
│   │   │   └── CodeViewerComponent.tsx
│   │   ├── field/
│   │   │   ├── ColorPicker.tsx
│   │   │   ├── DateField.tsx
│   │   │   ├── Field.tsx
│   │   │   └── Setting.tsx
│   │   ├── misc/
│   │   │   └── DashboardConnectionUpdateHandler.tsx
│   │   ├── sso/
│   │   │   ├── SSOLoginButton.tsx
│   │   │   └── SSOUtils.ts
│   │   └── theme/
│   │       └── Themes.tsx
│   ├── config/
│   │   ├── ApplicationConfig.ts
│   │   ├── CardConfig.ts
│   │   ├── ColorConfig.ts
│   │   ├── DashboardConfig.ts
│   │   ├── ExampleConfig.ts
│   │   ├── PageConfig.ts
│   │   ├── ReportConfig.tsx
│   │   └── StyleConfig.tsx
│   ├── dashboard/
│   │   ├── Dashboard.tsx
│   │   ├── DashboardActions.ts
│   │   ├── DashboardReducer.ts
│   │   ├── DashboardSelectors.ts
│   │   ├── DashboardThunks.ts
│   │   ├── header/
│   │   │   ├── DashboardHeader.tsx
│   │   │   ├── DashboardHeaderAboutButton.tsx
│   │   │   ├── DashboardHeaderDownloadImageButton.tsx
│   │   │   ├── DashboardHeaderLogo.tsx
│   │   │   ├── DashboardHeaderLogoutButton.tsx
│   │   │   ├── DashboardHeaderPageList.tsx
│   │   │   ├── DashboardHeaderPageTitle.tsx
│   │   │   └── DashboardTitle.tsx
│   │   ├── placeholder/
│   │   │   └── DashboardPlaceholder.tsx
│   │   └── sidebar/
│   │       ├── DashboardSidebar.tsx
│   │       ├── DashboardSidebarListItem.tsx
│   │       ├── menu/
│   │       │   ├── DashboardSidebarCreateMenu.tsx
│   │       │   ├── DashboardSidebarDashboardMenu.tsx
│   │       │   └── DashboardSidebarDatabaseMenu.tsx
│   │       └── modal/
│   │           ├── DashboardSidebarAccessModal.tsx
│   │           ├── DashboardSidebarCreateModal.tsx
│   │           ├── DashboardSidebarDeleteModal.tsx
│   │           ├── DashboardSidebarExportModal.tsx
│   │           ├── DashboardSidebarImportModal.tsx
│   │           ├── DashboardSidebarInfoModal.tsx
│   │           ├── DashboardSidebarLoadModal.tsx
│   │           ├── DashboardSidebarSaveModal.tsx
│   │           ├── DashboardSidebarShareModal.tsx
│   │           └── legacy/
│   │               └── LegacyShareModal.tsx
│   ├── extensions/
│   │   ├── ExtensionConfig.tsx
│   │   ├── ExtensionUtils.ts
│   │   ├── ExtensionsModal.tsx
│   │   ├── actions/
│   │   │   └── ActionsRuleCreationModal.tsx
│   │   ├── advancedcharts/
│   │   │   ├── AdvancedChartsExampleConfig.ts
│   │   │   ├── AdvancedChartsReportConfig.tsx
│   │   │   ├── Utils.ts
│   │   │   ├── chart/
│   │   │   │   ├── areamap/
│   │   │   │   │   ├── AreaMapChart.tsx
│   │   │   │   │   ├── PolygonLayer.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   └── styles/
│   │   │   │   │       └── PolygonStyle.css
│   │   │   │   ├── choropleth/
│   │   │   │   │   └── ChoroplethMapChart.tsx
│   │   │   │   ├── circlepacking/
│   │   │   │   │   └── CirclePackingChart.tsx
│   │   │   │   ├── gantt/
│   │   │   │   │   ├── GanttChart.tsx
│   │   │   │   │   ├── Utils.ts
│   │   │   │   │   └── frappe/
│   │   │   │   │       ├── GanttVisualization.tsx
│   │   │   │   │       └── lib/
│   │   │   │   │           ├── arrow.ts
│   │   │   │   │           ├── bar.ts
│   │   │   │   │           ├── date_utils.js
│   │   │   │   │           ├── gantt.css
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── popup.ts
│   │   │   │   │           └── svg_utils.ts
│   │   │   │   ├── gauge/
│   │   │   │   │   └── GaugeChart.tsx
│   │   │   │   ├── graph3d/
│   │   │   │   │   ├── GraphChart3D.tsx
│   │   │   │   │   └── GraphChartVisualization3D.tsx
│   │   │   │   ├── radar/
│   │   │   │   │   └── RadarChart.tsx
│   │   │   │   ├── sankey/
│   │   │   │   │   └── SankeyChart.tsx
│   │   │   │   ├── sunburst/
│   │   │   │   │   └── SunburstChart.tsx
│   │   │   │   └── treemap/
│   │   │   │       └── TreeMapChart.tsx
│   │   │   └── component/
│   │   │       └── RefreshButton.tsx
│   │   ├── forms/
│   │   │   ├── FormsExampleConfig.tsx
│   │   │   ├── FormsReportConfig.tsx
│   │   │   ├── chart/
│   │   │   │   └── NeoForm.tsx
│   │   │   └── settings/
│   │   │       ├── NeoFormCardSettings.tsx
│   │   │       ├── NeoFormCardSettingsModal.tsx
│   │   │       └── list/
│   │   │           ├── NeoFormSortableItem.tsx
│   │   │           ├── NeoFormSortableList.tsx
│   │   │           └── NeoFormSortableOverlay.tsx
│   │   ├── query-translator/
│   │   │   └── component/
│   │   │       └── OverrideCardQueryEditor.tsx
│   │   ├── rbac/
│   │   │   ├── RBACManagementLabelButton.tsx
│   │   │   ├── RBACManagementMenu.tsx
│   │   │   ├── RBACManagementModal.tsx
│   │   │   └── RBACUtils.ts
│   │   ├── state/
│   │   │   ├── ExtensionActions.ts
│   │   │   ├── ExtensionReducer.ts
│   │   │   └── ExtensionSelectors.ts
│   │   ├── styling/
│   │   │   ├── StyleRuleCreationModal.tsx
│   │   │   └── StyleRuleEvaluator.ts
│   │   └── text2cypher/
│   │       ├── QueryTranslatorConfig.ts
│   │       ├── clients/
│   │       │   ├── AzureOpenAi/
│   │       │   │   └── AzureOpenAiClient.ts
│   │       │   ├── ModelClient.ts
│   │       │   ├── OpenAi/
│   │       │   │   └── OpenAiClient.ts
│   │       │   ├── VertexAiClient.ts
│   │       │   └── const.ts
│   │       ├── component/
│   │       │   ├── ClientSettings.tsx
│   │       │   ├── LoadingIcon.tsx
│   │       │   ├── OverrideCardQueryEditor.tsx
│   │       │   ├── QueryTranslatorButton.tsx
│   │       │   ├── QueryTranslatorSettingsModal.tsx
│   │       │   └── model-examples/
│   │       │       ├── ExampleDisplayTable.tsx
│   │       │       ├── ExampleEditorModal.tsx
│   │       │       ├── QueryTranslatorSettingsModelExamples.tsx
│   │       │       └── utils.ts
│   │       ├── state/
│   │       │   ├── QueryTranslatorActions.ts
│   │       │   ├── QueryTranslatorReducer.ts
│   │       │   ├── QueryTranslatorSelector.ts
│   │       │   └── QueryTranslatorThunks.ts
│   │       └── util/
│   │           ├── Status.ts
│   │           └── Util.ts
│   ├── index.pcss
│   ├── index.tsx
│   ├── modal/
│   │   ├── AboutModal.tsx
│   │   ├── ConnectionModal.tsx
│   │   ├── DeletePageModal.tsx
│   │   ├── ExportModal.tsx
│   │   ├── LoadSharedDashboardModal.tsx
│   │   ├── ModalSelectors.tsx
│   │   ├── ModalUtils.tsx
│   │   ├── NotificationModal.tsx
│   │   ├── ReportExamplesModal.tsx
│   │   ├── ReportHelpModal.tsx
│   │   ├── UpgradeOldDashboardModal.tsx
│   │   └── WelcomeScreenModal.tsx
│   ├── page/
│   │   ├── Page.tsx
│   │   ├── PageActions.ts
│   │   ├── PageReducer.ts
│   │   ├── PageSelectors.ts
│   │   └── PageThunks.ts
│   ├── report/
│   │   ├── Report.tsx
│   │   ├── ReportQueryRunner.ts
│   │   ├── ReportRecordProcessing.tsx
│   │   └── ReportWrapper.tsx
│   ├── sessionStorage/
│   │   ├── SessionStorageActions.ts
│   │   ├── SessionStorageReducer.ts
│   │   └── SessionStorageSelectors.ts
│   ├── settings/
│   │   ├── SettingsActions.ts
│   │   ├── SettingsModal.tsx
│   │   ├── SettingsReducer.ts
│   │   ├── SettingsSelectors.ts
│   │   └── SettingsThunks.ts
│   ├── store.ts
│   └── utils/
│       ├── ObjectManipulation.ts
│       ├── ReportUtils.ts
│       ├── accessibility.ts
│       ├── parameterUtils.ts
│       └── uuid.ts
├── ssl/
│   ├── Dockerfile
│   └── default.conf
├── tailwind.config.js
├── tsconfig.json
└── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .babelrc
================================================
{
    "presets": ["@babel/preset-env", "@babel/preset-react","@babel/preset-typescript"],
    "plugins": ["@babel/plugin-transform-runtime", "istanbul"]
}


================================================
FILE: .eslintrc.json
================================================
{
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint", "react"],
  "extends": ["eslint:recommended", "prettier", "plugin:@typescript-eslint/recommended"], // this is optional
  "env": {
    "browser": true,
    "node": true,
    "jest": true
  },
  "settings": {
    "react": {
      "version": "detect"
    }
  },
  "ignorePatterns": ["node_modules/**", "packages/**/dist/**", "packages/**/coverage/**"],
  "rules": {
    "@typescript-eslint/no-explicit-any": "off", // Off for v1
    "@typescript-eslint/ban-ts-comment": "off", // Off for v1
    "@typescript-eslint/no-empty-function": "off", // Off for v1
    "@typescript-eslint/no-unused-vars": [
      "error",
      { "vars": "all", "varsIgnorePattern": "^_*", "args": "after-used", "argsIgnorePattern": "^_" }
    ],
    "array-callback-return": "off", // Off for v1
    "arrow-body-style": "off",
    "block-scoped-var": "error",
    "camelcase": "off", // Off for v1
    "consistent-return": "off", // Off for v1
    "consistent-this": ["error", "self"],
    "constructor-super": "error",
    "curly": ["error", "all"],
    "default-case": "error",
    "default-param-last": "off", // Off for v1
    "dot-notation": "error",
    "eqeqeq": "off", // Off for v1
    "func-names": "error",
    "func-style": [
      "error",
      "declaration",
      {
        "allowArrowFunctions": true
      }
    ],
    "grouped-accessor-pairs": "error",
    "line-comment-position": "off", // Off for v1
    "lines-between-class-members": "error",
    "max-depth": "error",
    "max-len": [
      "off", // Off for v1
      {
        "code": 120,
        "comments": 120,
        "ignoreUrls": true,
        "ignoreTemplateLiterals": true
      }
    ],
    "max-lines-per-function": ["off"],
    "max-nested-callbacks": ["error", 5],
    "max-statements": ["off"],
    "max-statements-per-line": "error",
    "no-alert": "off", // Off for v1
    "no-array-constructor": "error",
    "no-await-in-loop": "off", // Off for v1
    "no-buffer-constructor": "error",
    "no-caller": "error",
    "no-confusing-arrow": "error",
    "no-console": "warn",
    "no-constructor-return": "error",
    "no-constant-condition": "error",
    "no-debugger": "warn",
    "no-dupe-else-if": "error",
    "no-else-return": "error",
    "no-empty-function": [
      "off", // Off for v1
      {
        "allow": ["constructors"]
      }
    ],
    "no-eq-null": "off", // Off for V1
    "no-eval": "error",
    "no-extend-native": "error",
    "no-extra-bind": "error",
    "no-extra-label": "error",
    "no-implicit-coercion": "error",
    "no-implicit-globals": "error",
    "no-implied-eval": "error",
    "no-import-assign": "error",
    "no-invalid-this": "off",
    "no-iterator": "error",
    "no-labels": "error",
    "no-lone-blocks": "error",
    "no-lonely-if": "error",
    "no-loop-func": "error",
    "no-magic-numbers": "off",
    "no-multi-assign": "error",
    "no-multi-str": "error",
    "no-nested-ternary": "off", // Off for v1
    "no-new": "error",
    "no-new-func": "error",
    "no-new-object": "error",
    "no-new-wrappers": "error",
    "no-octal-escape": "error",
    "no-param-reassign": "off", // Off for v1
    "no-path-concat": "error",
    "no-plusplus": [
      "error",
      {
        "allowForLoopAfterthoughts": true
      }
    ],
    "no-proto": "off", // Off for v1
    "no-restricted-globals": "error",
    "no-return-assign": "error",
    "no-return-await": "error",
    "no-self-compare": "error",
    "no-sequences": "error",
    "no-setter-return": "error",
    "no-sync": "error",
    "no-tabs": "error",
    "no-template-curly-in-string": "error",
    "no-underscore-dangle": "off", // Off for v1
    "no-unmodified-loop-condition": "error",
    "no-unneeded-ternary": "error",
    "no-unreachable": "error",
    "no-unused-expressions": "off", // Off for v1
    "no-useless-call": "error",
    "no-useless-computed-key": "error",
    "no-useless-concat": "off", // Off for v1
    "no-useless-rename": "error",
    "no-useless-return": "error",
    "no-var": "error",
    "no-void": ["error", { "allowAsStatement": true }],
    "one-var": ["error", "never"],
    "operator-assignment": "error",
    "padding-line-between-statements": "error",
    "prefer-arrow-callback": "warn",
    "prefer-const": "off", // Off for v1
    "prefer-destructuring": [
      // Off for v1
      "warn",
      {
        "VariableDeclarator": {
          "array": true,
          "object": true
        },
        "AssignmentExpression": {
          "array": false,
          "object": false
        }
      }
    ],
    "prefer-numeric-literals": "warn",
    "prefer-promise-reject-errors": "warn",
    "prefer-rest-params": "warn",
    "prefer-spread": "warn",
    "prefer-template": "warn",
    "radix": "off", // Off for v1
    "require-atomic-updates": "error",
    "require-await": "warn", // Warn for v1
    "sort-keys": "off",
    "spaced-comment": [
      "warn",
      "always",
      {
        "markers": ["/"]
      }
    ],
    "symbol-description": "error",
    "yoda": "error"
  },
  "globals": {
    "cy": "readonly",
    "Cypress": "readonly"
  }
}


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''

---

## Guidelines
Please note that GitHub issues are only meant for bug reports/feature requests. 


Before creating a new issue, please check whether someone else has raised the same issue. You may be able to add context to that issue instead of duplicating the report. However, each issue should also only be focussed on a _single_ problem, so do not describe new problems within an existing thread - these are very hard to track and manage, and your problem may be ignored. Finally, do not append comments to closed issues; if the same problem re-occurs, open a new issue, and include a link to the old one.

To help us understand your issue, please specify important details, primarily:

- NeoDash version: X.Y.Z
- Neo4j Database version: X.Y.Z (Community/Enterprise/Aura).

- **Steps to reproduce**
- Expected behavior
- Actual behavior

Additionally, include (as appropriate) screenshots, drawings, etc.


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: feature
assignees: ''

---

## Guidelines
Please note that GitHub issues are only meant for bug reports/feature requests.

## Feature request template

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.

================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: 'npm'
    directory: '/'
    schedule:
      interval: 'weekly'
    target-branch: 'develop'

  - package-ecosystem: 'npm'
    directory: '/gallery'
    schedule:
      interval: 'weekly'
    target-branch: 'develop'

  - package-ecosystem: 'npm'
    directory: '/docs'
    schedule:
      interval: 'weekly'
    target-branch: 'develop'


================================================
FILE: .github/workflows/develop-deployment.yml
================================================
name: Test/Deploy Develop

on:
  push:
    branches: [develop]

jobs:
  build-test:
    if: github.event.pull_request.draft == false
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - name: Creating Neo4j Container
        run: |
          chmod +x ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          sleep 30s
          chmod +x ./scripts/docker-neo4j-initializer/start-movies-db.sh
          ./scripts/docker-neo4j-initializer/start-movies-db.sh
      - run: yarn install
      - name: Eslint check
        run: yarn run lint
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          build: yarn run build
          start: yarn run prod
          wait-on: "http://localhost:3000"
          browser: chrome
  build-s3:
    needs: build-test
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - run: yarn install
      - run: yarn run build-minimal
      - name: Set AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-west-1
      - run: curl ${{ secrets.INDEX_HTML_DEPLOYMENT_URL }} > dist/index.html
      - run: aws s3 rm s3://neodash-test.graphapp.io/ --recursive && aws s3 sync dist s3://neodash-test.graphapp.io/ --acl public-read


================================================
FILE: .github/workflows/develop-test.yml
================================================
name: Test Develop

on:
  pull_request:
    branches: [develop]

jobs:
  build-test:
    if: github.event.pull_request.draft == false
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - name: Creating Neo4j Container
        run: |
          chmod +x ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          sleep 30s
          chmod +x ./scripts/docker-neo4j-initializer/start-movies-db.sh
          ./scripts/docker-neo4j-initializer/start-movies-db.sh
      - run: yarn install
      - name: Eslint check
        run: yarn run lint
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          build: yarn run build
          start: yarn run prod
          wait-on: 'http://localhost:3000'
          browser: chrome
      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v3


================================================
FILE: .github/workflows/master-deployment.yml
================================================
name: Test/Deploy Master

on:
  push:
    branches: [master]

jobs:
  build-test:
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - name: Creating Neo4j Container
        run: |
          chmod +x ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          sleep 30s
          chmod +x ./scripts/docker-neo4j-initializer/start-movies-db.sh
          ./scripts/docker-neo4j-initializer/start-movies-db.sh
      - run: yarn install
      - name: Eslint check
        run: yarn run lint
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          build: yarn run build
          start: yarn run dev
          wait-on: 'http://localhost:3000'
          browser: chrome
  build-s3:
    needs: build-test
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - run: rm -rf docs
      - run: yarn install
      - run: yarn run build-minimal
      - name: Set AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-west-1
      - run: curl ${{ secrets.INDEX_HTML_DEPLOYMENT_URL }} > dist/index.html
      # - run: curl https://gist.githubusercontent.com/nielsdejong/944d8f8f30dd2719f9b275e31df22f92/raw/f363cf5280eb5095e12e56a278f6616b6220adcf/config.json > dist/config.json
      - run: aws s3 rm s3://neodash.graphapp.io/ --recursive && aws s3 sync dist s3://neodash.graphapp.io/ --acl public-read
  build-docker:
    needs: build-test
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - name: run Docker
        uses: actions/checkout@v2
      - run: rm -rf docs
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_HUB_LABS_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_LABS_ACCESS_TOKEN }}
      - name: Set up Docker Build
        uses: docker/setup-buildx-action@v1
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_HUB_LABS_USERNAME }}/neodash:latest,${{ secrets.DOCKER_HUB_LABS_USERNAME }}/neodash:2.4.11
  build-docker-legacy:
    needs: build-test
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - name: run Docker
        uses: actions/checkout@v2
      - run: rm -rf docs
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_HUB_USERNAME }}/neodash:latest,${{ secrets.DOCKER_HUB_USERNAME }}/neodash:2.4.11
  deploy-gallery:
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - run: cd gallery && yarn install
      - run: cd gallery && yarn run build
      - name: Set AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-west-1
      - run: aws s3 rm s3://neodash-gallery.graphapp.io/ --recursive && aws s3 sync gallery/build s3://neodash-gallery.graphapp.io/ --acl public-read
  deploy-docs:
    needs: build-test
    runs-on: neodash-runners
    steps:
      - name: Trigger Developer Event
        uses: peter-evans/repository-dispatch@main
        with:
          token: ${{ secrets.DOCS_REFRESH_TOKEN }}
          repository: neo4j-documentation/docs-refresh
          event-type: labs
  build-npm:
    needs: build-test
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - run: rm -rf docs
      - run: yarn install
      - run: PRODUCTION=true && yarn run build-minimal
      - run: curl https://gist.githubusercontent.com/nielsdejong/944d8f8f30dd2719f9b275e31df22f92/raw/f363cf5280eb5095e12e56a278f6616b6220adcf/config.json > dist/config.json
      - run: curl ${{ secrets.INDEX_HTML_DEPLOYMENT_URL }} > dist/index.html
      - run: npm pack
      - run: rm -rf target
      - run: mkdir target
      - run: mv *.tgz target/
      - run: tar -xvf target/*.tgz
      - run: rm -f target/*.tgz
      - run: cp package/dist/favicon.ico package/favicon.ico
      - run: echo "${{ secrets.NEO4J_LABS_APP_KEY }}" > neo4j-labs-app.pem
      - run: echo "${{ secrets.NEO4J_LABS_APP_CERTIFICATE }}" > neo4j-labs-app.cert
      - run: npx @neo4j/code-signer --app ./package --private-key neo4j-labs-app.pem --cert neo4j-labs-app.cert --passphrase ${{ secrets.NEO4J_DESKTOP_PASSPHRASE }}
      - run: echo "${{ secrets.NEO4J_DESKTOP_CERTIFICATE }}" > neo4j_desktop.cert
      - run: npx @neo4j/code-signer --verify  --app ./package --root-cert neo4j_desktop.cert
      - run: cd package && npm pack
      - run: mv package/*.tgz .
      - run: rm -rf package
      - run: tar xvf *.tgz package
      - run: npx @neo4j/code-signer --verify  --app ./package --root-cert neo4j_desktop.cert
      - run: rm -rf package
      - run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc
      - name: Publish package to NPM 📦
        run: npm publish --access public neodash*.tgz


================================================
FILE: .github/workflows/master-test.yml
================================================
name: Test Master

on:
  pull_request:
    branches: [master]

jobs:
  build-test:
    runs-on: neodash-runners
    strategy:
      matrix:
        node-version: [18.x]
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      - name: Creating Neo4j Container
        run: |
          chmod +x ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          ./scripts/docker-neo4j-initializer/docker-neo4j.sh
          sleep 30s
          chmod +x ./scripts/docker-neo4j-initializer/start-movies-db.sh
          ./scripts/docker-neo4j-initializer/start-movies-db.sh
      - run: yarn install
      - name: Eslint check
        run: yarn run lint
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          build: yarn run build
          start: yarn run dev
          wait-on: "http://localhost:3000"
          browser: chrome


================================================
FILE: .gitignore
================================================
.idea
*.iml
*.pem
*.cert
*.passphrase
node_modules
build
target
/node_modules
/.pnp
.pnp.js
.vscode

# testing
/coverage
/.nyc_output
cypress/videos
cypress/screenshots
# production
/build
/dist

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
yarn-debug.log*
yarn-error.log*

# Ignore builds
*.tgz

# package directories
node_modules
jspm_packages

# Serverless directories
.serverless
# Sentry Auth Token
.env.sentry-build-plugin


================================================
FILE: .husky/common.sh
================================================
command_exists () {
  command -v "$1" >/dev/null 2>&1
}

# Workaround for Windows 10, Git Bash and Yarn
if command_exists winpty && test -t 1; then
  exec < /dev/tty
fi

================================================
FILE: .husky/pre-commit
================================================
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
. "$(dirname -- "$0")/common.sh"

yarn run lint-staged


================================================
FILE: .lintstagedrc.json
================================================
{
  "*.ts": ["prettier --write", "eslint --fix"],
  "*.tsx": ["prettier --write", "eslint --fix"],
  "*.json": ["prettier --write"],
  "*.js": ["prettier --write"]
}


================================================
FILE: .npmignore
================================================
public
src
.env
.env.hosted
.gitignore
tsconfig.json
yarn.lock
node_modules
*.tgz
desktop.passphrase
*.config.js
desktop-signer.sh

================================================
FILE: .prettierignore
================================================
coverage
dist
node_modules
docs

================================================
FILE: .prettierrc.json
================================================
{
  "printWidth": 120,
  "semi": true,
  "singleQuote": true,
  "jsxSingleQuote": true,
  "useTabs": false,
  "tabWidth": 2,
  "arrowParens": "always",
  "trailingComma": "es5",
  "bracketSpacing": true,
  "endOfLine": "lf"
}


================================================
FILE: Dockerfile
================================================
# build stage
FROM node:lts-alpine3.18 AS build-stage

RUN yarn global add typescript jest
WORKDIR /usr/local/src/neodash

# Pull source code if you have not cloned the repository
#RUN apk add --no-cache git
#RUN git clone https://github.com/neo4j-labs/neodash.git /usr/local/src/neodash

# Copy sources and install/build
COPY ./package.json /usr/local/src/neodash/package.json
COPY ./yarn.lock /usr/local/src/neodash/yarn.lock

RUN yarn install
COPY ./ /usr/local/src/neodash
RUN yarn run build-minimal

# production stage
FROM nginx:alpine3.18 AS neodash
RUN apk upgrade

ENV NGINX_PORT=5005

COPY --from=build-stage /usr/local/src/neodash/dist /usr/share/nginx/html
COPY ./conf/default.conf.template /etc/nginx/templates/
COPY ./scripts/config-entrypoint.sh /docker-entrypoint.d/config-entrypoint.sh
COPY ./scripts/message-entrypoint.sh /docker-entrypoint.d/message-entrypoint.sh

RUN chown -R nginx:nginx /var/cache/nginx && \
    chown -R nginx:nginx /var/log/nginx && \
    chown -R nginx:nginx /etc/nginx/conf.d && \
    chown -R nginx:nginx /etc/nginx/templates && \
    chown -R nginx:nginx /docker-entrypoint.d/config-entrypoint.sh && \
    chmod +x /docker-entrypoint.d/config-entrypoint.sh  && \
    chmod +x /docker-entrypoint.d/message-entrypoint.sh
RUN touch /var/run/nginx.pid && \
    chown -R nginx:nginx /var/run/nginx.pid
RUN chown -R nginx:nginx /usr/share/nginx/html/

## Launch webserver as non-root user.
USER nginx

EXPOSE $NGINX_PORT

HEALTHCHECK cmd curl --fail "http://localhost:$NGINX_PORT" || exit 1
LABEL version="2.4.11"


================================================
FILE: LICENSE
================================================
     Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2023 Niels de Jong

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: README.md
================================================
## NeoDash Labs
NeoDash is a dashboard builder for Neo4j, letting you build a graph dashboard in minutes.

**This project is no longer maintained, use at your own risk.** 

If you'd like to continue building dashboards, you have the following options:

1. For the best experience, [upgrade](https://console-preview.neo4j.io/tools/dashboards) to Dashboards in the Neo4j Console (free for everyone).
2. If you'd like to keep using NeoDash for free, you can fork this repository and [run NeoDash yourself](https://github.com/neo4j-labs/neodash/blob/master/about.md).
3. If you're in need of a supported version of NeoDash, you can [purchase](https://neo4j.com/docs/neodash-commercial/current/#_getting_access_to_neodash_commercial) a NeoDash commercial license together with a Neo4j Enterprise license.  



================================================
FILE: about.md
================================================
## About NeoDash Labs

> NeoDash Labs is an unmaintained and unsupported tool. Use at your own risk!

NeoDash is a web-based tool for visualizing your Neo4j data. It lets you group visualizations together as dashboards, and allow for interactions between reports.

Neodash supports presenting your data as tables, graphs, bar charts, line charts, maps and more. It contains a Cypher editor to directly write the Cypher queries that populate the reports. You can save dashboards to your database, and share them with others.

## Try NeoDash Labs
You can build NeoDash yourself, or pull the latest Docker image from Docker Hub.
```
# Run the application on http://localhost:5005
docker pull neo4jlabs/neodash:latest
docker run -it --rm -p 5005:5005 neo4jlabs/neodash
```

> Windows users may need to prefix the `docker run` command with `winpty`.



## Build and Run
This project uses `yarn` to install, run, build prettify and apply linting to the code.

To install dependencies:
```
yarn install
```

To run the application in development mode:
```
yarn run dev
```

To build the app for deployment:
```
yarn run build
```

To manually prettify all the project `.ts` and `.tsx` files, run:
```
yarn run format
```

To manually run linting of all your .ts and .tsx files, run:
```
yarn run lint
```

To manually run linting of all your .ts and .tsx staged files, run:
```
yarn run lint-staged
```

See the [Developer Guide](https://neo4j.com/labs/neodash/2.3/developer-guide/) for more on installing, building, and running the application.

### Pre-Commit Hook
While commiting, a pre-commit hook will be executed in order to prettify and run the Linter on your staged files. Linter warnings are currently accepted. The commands executed by this hook can be found in /.lintstagedrc.json.

There is also a dedicated linting step in the Github project pipeline in order to catch each potential inconsistency.

> Don't hesitate to setup your IDE formatting feature to use the Prettier module and our defined rules (.prettierrc.json).


## User Guide
NeoDash comes with built-in examples of dashboards and reports. For more details on the types of reports and how to customize them, see the [User Guide](
https://neo4j.com/labs/neodash/2.3/user-guide/).

## Publish Dashboards
After building a dashboard, you can chose to deploy a read-only, standalone instance for users. See [Publishing](https://neo4j.com/labs/neodash/2.3/user-guide/publishing/) for more on publishing dashboards.


> NeoDash Labs is a free and open-source tool developed by the Neo4j community - not an official Neo4j product. Use at your own risk!

================================================
FILE: changelog.md
================================================
## NeoDash 2.4.10 - Community contributions
This is a minor release containing bug fixes and improvements contributed by the NeoDash community.
- [#1039](https://github.com/neo4j-labs/neodash/pull/1039) - Fix default color scheme for bar charts
- [#1038](https://github.com/neo4j-labs/neodash/pull/1038) - Fix rule-based styling for line charts
- [#1036](https://github.com/neo4j-labs/neodash/pull/1036) - Fix table cell rule-based styling
- [#1029](https://github.com/neo4j-labs/neodash/pull/1029) - Fix rule-based styling for numeric values
- [#1028](https://github.com/neo4j-labs/neodash/pull/1028) - Fix OpenStreetMap leaflet display
- [#1020](https://github.com/neo4j-labs/neodash/pull/1020) - Fix boolean handling in parameter selection
- [#1014](https://github.com/neo4j-labs/neodash/pull/1014) - Remove autoPageSize flag (defaults to 0)
- [#1009](https://github.com/neo4j-labs/neodash/pull/1009) - Fix SSO parameters lost on browser redirect
- [#1008](https://github.com/neo4j-labs/neodash/pull/1008) - Fix existence check for `value.low`
- [#1005](https://github.com/neo4j-labs/neodash/pull/1005) - Replace Neo4j Logo
- [#1002](https://github.com/neo4j-labs/neodash/pull/1002) - Patch FAQ on supportability
- [#999](https://github.com/neo4j-labs/neodash/pull/999) - Fix dark mode table header styling
- [#956](https://github.com/neo4j-labs/neodash/pull/956) - Change default protocol to `neo4j+s`

## NeoDash 2.4.9
This release adds some minor changes to documentation and implements some community contributions.
- Added notice about project evolution: [#967](https://github.com/neo4j-labs/neodash/pull/967)
- Added community contributions and bug fixes: 
[#967](https://github.com/neo4j-labs/neodash/pull/967)
[#894](https://github.com/neo4j-labs/neodash/pull/894)
[#822](https://github.com/neo4j-labs/neodash/pull/822)
[#951](https://github.com/neo4j-labs/neodash/pull/951)
[#946](https://github.com/neo4j-labs/neodash/pull/946)
[#944](https://github.com/neo4j-labs/neodash/pull/944)
[#943](https://github.com/neo4j-labs/neodash/pull/943)
[#938](https://github.com/neo4j-labs/neodash/pull/938)
[#935](https://github.com/neo4j-labs/neodash/pull/935)
[#918](https://github.com/neo4j-labs/neodash/pull/918)
[#908](https://github.com/neo4j-labs/neodash/pull/908)
[#906](https://github.com/neo4j-labs/neodash/pull/906)
[#902](https://github.com/neo4j-labs/neodash/pull/902)
[#895](https://github.com/neo4j-labs/neodash/pull/895)
[#893](https://github.com/neo4j-labs/neodash/pull/893)

## NeoDash 2.4.8
This is a minor release containing an important fix and other minor fixes:

- Fixed a bug where loading a dashboard would reset parameters to null ([887](https://github.com/neo4j-labs/neodash/pull/887)).
- Fix relationship width parameter for Graph report ([889](https://github.com/neo4j-labs/neodash/pull/889)).
  
Thanks to all the contributors for this release: 
- [alfredorubin96](https://github.com/alfredorubin96),
- [nielsdejong](https://github.com/nielsdejong).

## NeoDash 2.4.7
This is a minor release containing a few critical fixes and general code quality improvements:

- Fix multiple parameter select ([881](https://github.com/neo4j-labs/neodash/pull/881)).
- Fix parameter casting error when loading dashboards([874](https://github.com/neo4j-labs/neodash/pull/874)).
- Fix the fraud demo in the [Example Gallery](https://neodash-gallery.graphapp.io/).
  
Thanks to all the contributors for this release: 
- [alfredorubin96](https://github.com/alfredorubin96),
- [MariusC](https://github.com/mariusconjeaud),
- [elizarp](https://github.com/elizarp).

## NeoDash 2.4.6
This is a minor release containing a few critical fixes and some extra style customizations:

- Fix bad text wrapping for arrays in tables ([868](https://github.com/neo4j-labs/neodash/pull/868)).
- Make wrapping in table optional, disabled by default ([872](https://github.com/neo4j-labs/neodash/pull/872)).
- Fixed issues where cross database dashboard sharing always reverted back to the default database ([873](https://github.com/neo4j-labs/neodash/pull/873)).
- Added option to define style config using environment variables for the Docker image ([876](https://github.com/neo4j-labs/neodash/pull/876)). 

## NeoDash 2.4.5
This is a small release containing a few fixes:
- Fixed rendering of string arrays inside tables, report titles, and report action buttons [849](https://github.com/neo4j-labs/neodash/pull/849)
- Allowed text to wrap in tables, preserving the number of rows [852](https://github.com/neo4j-labs/neodash/pull/852)
- Disabled auto-sorting of Cypher query-based Parameter Select ; use Cypher ORDER BY to control result order [857](https://github.com/neo4j-labs/neodash/pull/857)
- Updated role selector menu, and made user updates more robust [854](https://github.com/neo4j-labs/neodash/pull/854)

Thanks to all the contributors for this release: 
- [MariusC](https://github.com/mariusconjeaud),
- [LiamEdwardsLamarche](https://github.com/LiamEdwardsLamarche),
- [AleSim94](https://github.com/AleSim94)

## NeoDash 2.4.4
This is a hotfix release fixing some breaking issues in the 2.4.3:
- Fixed number parsing using newer versions of the Neo4j driver. [811](https://github.com/neo4j-labs/neodash/pull/811)
- Reverted new connection handler for auto-renewed SSO sessions. [815](https://github.com/neo4j-labs/neodash/pull/815)
- Improved handling of parameters in form extension, resolved local state issues. [813](https://github.com/neo4j-labs/neodash/pull/813)
- Updated Role management extension to no longer execute queries in parallel, improved UX and error handling [813](https://github.com/neo4j-labs/neodash/pull/813)

If you are currently using NeoDash version 2.4.3, we recommend updating as soon as possible.

## NeoDash 2.4.3
This release contains several improvements and additions to multi-dashboard management, as well as a bug fixes and a variety of quality-of-life improvements:

Dashboard management and access control:
- Added a UI for handling dashboard access using RBAC, as well as a new extension to simply access control.
- Added button to sidebar to refresh the list of dashboards saved in the database.
- Improved handling and detection of draft dashboards in the dashboard sidebar.

Other improvements:
- Changed CSV export functionality for tables to use UTF-8 format.
- Various improvements / fixes to the documentation to include new images, and up-to-date functionality.
- Added logic for handling refresh tokens when connected to NeoDash via SSO.
- Incorporated tooltips for bar charts with and without custom labels.

Bug fixes and testing:
- Implemented bug fixes on type casting for numeric parameter selectors.
- Fixed issue with report actions not functioning properly on node click events.
- Extended test suite with Cypress tests for advanced settings in the bar chart.

Thanks to all the contributors for this release: 
- [OskarDamkjaer](https://github.com/OskarDamkjaer)
- [alfredorubin96](https://github.com/alfredorubin96),
- [AleSim94](https://github.com/AleSim94),
- [BennuFire](https://github.com/BennuFire),
- [jacobbleakley-neo4j](https://github.com/jacobbleakley-neo4j),
- [josepmonclus](https://github.com/josepmonclus)
- [nielsdejong](https://github.com/nielsdejong)


## NeoDash 2.4.2
This is a release with a large amount of quality of life improvements, as well as some new features:

- Visualize graphs in 3D with the new 3D graph report. [#737](https://github.com/neo4j-labs/neodash/pull/737)
- Improved dashboard management sidebar and handling of drafts. [#734](https://github.com/neo4j-labs/neodash/pull/734)
- Added parameter select setting for autopopulating first selector value. [#746](https://github.com/neo4j-labs/neodash/pull/746)
- Improved UX for editing page names & dashboard titles. [#743](https://github.com/neo4j-labs/neodash/pull/743)
- Unified common settings for each report type. [#724](https://github.com/neo4j-labs/neodash/pull/724)
- Title of the browser tab NeoDash runs on is now automatically set to the dashboard name.  [#708](https://github.com/neo4j-labs/neodash/pull/708)
- Fixed issue where invisible table columns were not handled correctly. [#695](https://github.com/neo4j-labs/neodash/pull/695)
- Miscellaneous bug fixes, style improvements & stability fixes. [#744](https://github.com/neo4j-labs/neodash/pull/744)


## NeoDash 2.4.1
This is a patch release following 2.4.0. It contains several new features for self-hosted (standalone) NeoDash deployments, as well as a variety of UX improvements for dashboard editors.


Included:
- Improvements to customizability of the bar chart (styling, legend customization, report actions). [#689](https://github.com/neo4j-labs/neodash/pull/689)
- Improved dashboard settings interface, fixed alignment for table download button. [#729](https://github.com/neo4j-labs/neodash/pull/729)
- Adjusted ordering of suggested labels/properties for parameter selectors. [#728](https://github.com/neo4j-labs/neodash/pull/728)
- Better handling of date parameters when saving/loading dashboards. [#727](https://github.com/neo4j-labs/neodash/pull/727)
- Fixed incorrect z-index issue for form creation modals. [#726](https://github.com/neo4j-labs/neodash/pull/726)
- Adjusted filtering tooltip on tables to avoid hiding result data. [#712](https://github.com/neo4j-labs/neodash/pull/712)
- Fixed uncontrolled component issue for dashboard import modal. [#711](https://github.com/neo4j-labs/neodash/pull/711)
- Adjusted font color of graph context popups to use theme colors. [#699](https://github.com/neo4j-labs/neodash/pull/699)
- Adjust sidebar database selector to only show active databases. [#698](https://github.com/neo4j-labs/neodash/pull/698)
- Incorporated logging functionality for self-hosted NeoDash deployments. [#705](https://github.com/neo4j-labs/neodash/pull/705)
- Improved dashboard management in standalone-mode deployments. [#705](https://github.com/neo4j-labs/neodash/pull/705)
- Added Docker parameter for overriding the app's logo & custom header.  [#705](https://github.com/neo4j-labs/neodash/pull/705)
- Changed the dashboard 'save' action to a logical merge, rather than a delete + create, allowing to persist labels across saves. [#705](https://github.com/neo4j-labs/neodash/pull/705)
- Docker: Updated Alpine base image to mitigate CVE-2023-38039 & CVE-2023-4863. [#705](https://github.com/neo4j-labs/neodash/pull/705)


## NeoDash 2.4.0
NeoDash 2.4 is out! 🎂 This release packs a ton of new features, as well as improvements to the existing visualizations.

Key new features:
- A new sidebar with support for managing, save and load multiple dashboards directly from the UI.
   [#657](https://github.com/neo4j-labs/neodash/pull/657)
- Added **Forms** as a new extension. Forms let you combine multiple parameter selectors in one card and have users edit/submit data to Neo4j.  [#568](https://github.com/neo4j-labs/neodash/pull/568)
- Added a new advanced visualization type: Gantt charts. [#684](https://github.com/neo4j-labs/neodash/pull/684)
- Doubled the grid resolution for dashboards, giving you more freedom to arrange visualizations. [#682](https://github.com/neo4j-labs/neodash/pull/682)
- Several improvements for the natural language queries extension - including customizable prompting, and faster schema retrieval. [#600](https://github.com/neo4j-labs/neodash/pull/600)

Other improvements:
- Support for multiselect checkboxes as a report action for tables. [#688](https://github.com/neo4j-labs/neodash/pull/688/commits)
- Added keyboard shortcuts (CMD/CTRL+Enter) for running Cypher queries from the editor. [#694](https://github.com/neo4j-labs/neodash/pull/694/)
- Added new experimental graph layouts (trees in various directions), with customizable level distance. [#690](https://github.com/neo4j-labs/neodash/pull/690)
- Increased customizability for the Pie chart's styling.  [#638](https://github.com/neo4j-labs/neodash/pull/638/)
- Fixed issues with parameter selector: Better handling of integer / long parameters and processing external updates. [#641](https://github.com/neo4j-labs/neodash/pull/641/)
- Improvements on text readability for the experimental dark mode. [#668](https://github.com/neo4j-labs/neodash/pull/668/)
- UX improvements on database connection interface. [#675](https://github.com/neo4j-labs/neodash/pull/675/)
- Added option to provide a custom message when no data is returned by a report. [#683](https://github.com/neo4j-labs/neodash/pull/683/)
- Fixed issue where column names were not hidden correctly. [#685](https://github.com/neo4j-labs/neodash/pull/685/commits)

Thanks to all the contributors for this release: 
[alfredorubin96](https://github.com/alfredorubin96),
[AleSim94](https://github.com/AleSim94),
[BennuFire](https://github.com/BennuFire),
[jacobbleakley-neo4j](https://github.com/jacobbleakley-neo4j),
[hugorplobo](https://github.com/hugorplobo),
[brahmprakashMishra](https://github.com/brahmprakashMishra),
[m-o-n-i-s-h](https://github.com/m-o-n-i-s-h),
[JonanOribe](https://github.com/JonanOribe),
[nielsdejong](https://github.com/nielsdejong)

## NeoDash 2.3.5
This is a bugfix / stability release directly following 2.3.4.

Improvements:
- Fixed issue where orphan relationships prevented graph charts from working ([@BennuFire](https://github.com/BennuFire), [#586](https://github.com/neo4j-labs/neodash/pull/586))
- Fix issue where only one style rule was used a time on tables. ([@BennuFire](https://github.com/BennuFire), [#632](https://github.com/neo4j-labs/neodash/pull/632))
- Added information about source and target on Graph Chart information modal . ([@BennuFire](https://github.com/BennuFire), [#627](https://github.com/neo4j-labs/neodash/pull/627)) Based on [@brahmprakashMishra](https://github.com/brahmprakashMishra) PR
- Fixed issue where bar charts where displaying black bars instead of scheme colors. ([@BennuFire](https://github.com/BennuFire), [#626](https://github.com/neo4j-labs/neodash/pull/626))
- Added right subpath replacement on shared links redirection while in self deployments. ([@m-o-n-i-s-h](https://github.com/m-o-n-i-s-h), [#618](https://github.com/neo4j-labs/neodash/pull/618))
- Dark theme tweaks. ([@BennuFire](https://github.com/BennuFire), [#585](https://github.com/neo4j-labs/neodash/pull/585))
- Fixed parameter selector search where numbers were not found and sporadically displayed with decimal points. ([@BennuFire](https://github.com/BennuFire), [#633](https://github.com/neo4j-labs/neodash/pull/633))
- Added a configuration in order to list sso providers to be used whenever a database has more than one configured. ([@BennuFire](https://github.com/BennuFire), [#624](https://github.com/neo4j-labs/neodash/pull/624))
- Added 'Ignore undefined parameters' advanced setting support for optional parameters on a query. Now queries will assume a null value instead of returning the error 'Parameter not defined'.  ([@BennuFire](https://github.com/BennuFire), [#625](https://github.com/neo4j-labs/neodash/pull/625))

## NeoDash 2.3.3 & 2.3.4
This is a bugfix / stability release directly following 2.3.2.

Improvements:
- Cleaned up dependencies, add lazy loading and code splitting in the bundle file for faster loading times. ([@BennuFire](https://github.com/BennuFire), [#545](https://github.com/neo4j-labs/neodash/pull/571))
- Migrated all icons from Material UI to Needle icons. ([@BennuFire](https://github.com/BennuFire), [#545](https://github.com/neo4j-labs/neodash/pull/571))
- Improved contrast for light and dark theme. ([@nielsdejong](https://github.com/nielsdejong), [#545](https://github.com/neo4j-labs/neodash/pull/566))
- Fixed issue where dashboards were locked in read-only mode, after toggling in the dashboard settings. ([@nielsdejong](https://github.com/nielsdejong), [#545](https://github.com/neo4j-labs/neodash/pull/566))
- Fixed issue where editing the name of a non-selected page changed the wrong page data. ([@BennuFire](https://github.com/BennuFire), [#545](https://github.com/neo4j-labs/neodash/pull/571))
- Fixed issue where color picker was only working on popup selections. ([@BennuFire](https://github.com/BennuFire), [#579](https://github.com/neo4j-labs/neodash/pull/579))
- Add user agent to driver session for better logging of NeoDash queries. ([@nielsdejong](https://github.com/nielsdejong), [#545](https://github.com/neo4j-labs/neodash/pull/574))


## NeoDash 2.3.2
What's new in NeoDash 2.3.2? A few bug fixes, performance improvements and more important, it ships phase 2 of our migration to [Needle](https://neo4j.com/developer-blog/needle-neo4j-design-system/)  !

- Key Features:
  - UI updated to use the **[Neo4j Design Language](https://www.neo4j.design/)** phase 2, giving NeoDash a similar look-and-feel to other Neo4j tools. This includes the removal of the sidebar and a complete refactor on the header component. ([@mariusconjeaud](https://github.com/mariusconjeaud),[@konsalex](https://github.com/konsalex),[@BennuFire](https://github.com/bennufire), [#552](https://github.com/neo4j-labs/neodash/pull/552))
  - *Experimental* Support for **Dark Mode**.
- Parameter Selector Chart
  - New advanced setting 'Manual Parameter Save' allowing  dashboard parameters propagation on demand (instead of automatically on change) ([@BennuFire](https://github.com/bennufire), [#545](https://github.com/neo4j-labs/neodash/pull/545))
  - Fix delete button leading to inconsistent values on click. ([@BennuFire](https://github.com/bennufire), [#545](https://github.com/neo4j-labs/neodash/pull/545))
  
  - Fix search on numbers not being triggered. ([@BennuFire](https://github.com/bennufire), [#545](https://github.com/neo4j-labs/neodash/pull/545))

- Others
  - Fix performance degradation on schema calculation ([@BennuFire](https://github.com/bennufire), [#555](https://github.com/neo4j-labs/neodash/pull/555))
  - Fix standalone bug that prevent user from using username and password fields([@BennuFire](https://github.com/bennufire), [#551](https://github.com/neo4j-labs/neodash/pull/551))
  - Added Sentry Support on https://neodash.graphapp.io ([@mariusconjeaud](https://github.com/mariusconjeaud), [#546](https://github.com/neo4j-labs/neodash/pull/546))
  - Fix SSO redirection on editor mode ([@BennuFire](https://github.com/bennufire), [#543](https://github.com/neo4j-labs/neodash/pull/543))

## NeoDash 2.3.1
What's new in NeoDash 2.3.1? A few bug fixes, improvement of natural language queries with support of Azure Open AI and parameters, Graph Vizualization relationship styling and more below!

- Natural language queries
  - **Support of Azure Open AI** ([@BennuFire](https://github.com/bennufire), [#515](https://github.com/neo4j-labs/neodash/pull/515))
  - Support parameters on natural language queries ([@BennuFire](https://github.com/bennufire), [#514](https://github.com/neo4j-labs/neodash/pull/514))

- Graph Visualization
  - Added styling rules for relationship color ([@brahmprakashMishra](https://github.com/brahmprakashMishra) [@BennuFire](https://github.com/bennufire), [#537](https://github.com/neo4j-labs/neodash/pull/537))

- Table Chart
  - Update TableChart to use first returned row values as titles when transposed ([@bastienhubert](https://github.com/bastienhubert), [#513](https://github.com/neo4j-labs/neodash/pull/513))
  - Fix falsy boolean display on table ([@bastienhubert](https://github.com/bastienhubert), [#536](https://github.com/neo4j-labs/neodash/pull/536))

- Report Actions
  - Fix on Style and Action modal that was preventing from setting params on low resolutions ([@mariusconjeaud](https://github.com/mariusconjeaud), [#533](https://github.com/neo4j-labs/neodash/pull/533))

- Others
  - New setting for parameters selector to allow selection of multiple values instead of one + Fix multi selector on dates ([@BennuFire](https://github.com/bennufire), [#535](https://github.com/neo4j-labs/neodash/pull/535))
  - Fix bug where protocol was not set properly on share links ([@nielsdejong](https://github.com/nielsdejong), [#521](https://github.com/neo4j-labs/neodash/pull/521))
  - Update word-wrap from 1.2.3 to 1.2.4 ([@BennuFire](https://github.com/bennufire), [#526](https://github.com/neo4j-labs/neodash/pull/526) [#527](https://github.com/neo4j-labs/neodash/pull/527))

## NeoDash 2.3.0
NeoDash 2.3 is out! This release brings a brand new look-and-feel, improved speed for large dashboards, and a new extension for querying Neo4j with natural language (using LLMs).

Key features:
- Write **[Natural Language Queries](https://neo4j.com/labs/neodash/2.3/user-guide/extensions/natural-language-queries/)** and use OpenAI to generate Cypher queries for your visualizations.
- UI updated to use the **[Neo4j Design Language](https://www.neo4j.design/)**, giving NeoDash a similar look-and-feel to other Neo4j tools.
- Customize branding, colors dynamically with a new [Style Configuration File](https://neo4j.com/labs/neodash/2.3/developer-guide/style-configuration).
  
Other changes:
- Fixed issues with date picker / free-text parameter sometimes not initializing.
- Improved documentation by fixing broken links, and adding more details around complex concepts. 
- **Pro Extensions have evolved to open Expert Extensions.**
- Fixed issue where deep-linked parameters were not set from the URL.
- Added option to specify absolute width for table columns (in pixels or as percentages).
- Fixed map charts to auto-cluster markers when they collide, or are too close together.
- ... and dozens of other improvements!



Contributors to this release:
- [Alfredo Rubin](https://github.com/alfredorubin96)
- [Harold Agudelo](https://github.com/BennuFire)
- [Aleksandar Simeunovic](https://github.com/AleSim94)
- [Marius Conjeaud](https://github.com/mariusconjeaud)
- [Brahm Prakash Mishra](https://github.com/brahmprakashMishra)
- [Pierre Martignon](https://github.com/pierremartignon)
- [Kim Zachariassen](https://github.com/KiZach)
- [Paolo Baldini](https://github.com/8Rav3n)
- [Niels de Jong](https://github.com/nielsdejong/)


## NeoDash 2.2.5
This is a minor release with some small bug fixes, directly following the 2.2.4 release.
- Fixed replacement rules for parameters in iFrames/Markdown reports. [#417](https://github.com/neo4j-labs/neodash/pull/417)
- Added automatic header text color switch for reports with a dark background [#420](https://github.com/neo4j-labs/neodash/pull/420)
- Fixed handling right click events (for graph exploration) in Neo4j Desktop [#415](https://github.com/neo4j-labs/neodash/pull/415).
- Added support for unweighted Sankey charts [#419](https://github.com/neo4j-labs/neodash/pull/419)


## NeoDash 2.2.4
This release is a feature-rich package with a variety of new features and bug fixes. NeoDash 2.2.4 features new visualizations, as well as new features in existing visualization components. 


- Area Map - **New!** 
  - Added a new advanced chart interactive area map visualization for rendering geo json polygons. ([@alfredorubin96](https://github.com/alfredorubin96), [#401](https://github.com/neo4j-labs/neodash/pull/401))
  - Assign color scale automatically based on numeric values.
  - Assign colors to countries based on Alpha-2 and Alpha-3 codes, and area codes by ISO 3166 code.
  - Interactive drilldown by clicking on regions in a country.

- Graph Visualization
  - Added **lightweight, ad-hoc graph exploration** by relationship type and direction. ([@nielsdejong](https://github.com/nielsdejong), [#401](https://github.com/neo4j-labs/neodash/pull/401))
  - Added experimental graph editing: nodes and relationships, plus creating relationships between existing nodes. ([@nielsdejong](https://github.com/nielsdejong), [#401](https://github.com/neo4j-labs/neodash/pull/401))
  - Fixed incorrect assignment of chip colors in graph visualization footer. ([@BennuFire](https://github.com/bennufire), [#296](https://github.com/neo4j-labs/neodash/issues/296))
  - Added experimental CSV download button to graph visualizations. ([@JonanOribe](https://github.com/JonanOribe), [#288](https://github.com/neo4j-labs/neodash/issues/288), [#363](https://github.com/neo4j-labs/neodash/issues/363))
  - Fixed a bug where dashboard parameters were not dynamically injected into drilldown links. ([@nielsdejong](https://github.com/nielsdejong), [#397](https://github.com/neo4j-labs/neodash/pull/397))
  - Added setting to customize the size of the arrow head on an edge. Set to zero to disable directional rendering. ([@BennuFire](https://github.com/bennufire), [#410](https://github.com/neo4j-labs/neodash/pull/410))
 
- Single Value Chart
  - Added support for outputting dictionaries in YML format, and rendering new lines. ([@nielsdejong](https://github.com/nielsdejong), [#315](https://github.com/neo4j-labs/neodash/issues/315))

- Choropleth Map
  - Added polygon information for missing countries: France, Kosovo, and others. ([@BennuFire](https://github.com/bennufire), [#357](https://github.com/neo4j-labs/neodash/issues/357))

- Parameter Selector
  - Fixed bug where the parameter selector was not using the selected database to populate results. ([@BennuFire](https://github.com/bennufire), [#366](https://github.com/neo4j-labs/neodash/issues/366))
  - Added a date picker parameter selector type for natively specifying dates. ([@alfredorubin96](https://github.com/alfredorubin96), [#401](https://github.com/neo4j-labs/neodash/pull/401))
  - Added support for injecting custom queries as a populator for parameter selector suggestions. ([@BennuFire](https://github.com/bennufire), [#236](https://github.com/neo4j-labs/neodash/issues/236), [#369](https://github.com/neo4j-labs/neodash/issues/369))

- Table Chart
  - Added support for customizing the seperator in csv exports. ([@nielsdejong](https://github.com/nielsdejong), [#337](https://github.com/neo4j-labs/neodash/issues/337))
- Others
  - Added support for easily configurable branding/color schemes of the editor. ([@nielsdejong](https://github.com/nielsdejong), [#401](https://github.com/neo4j-labs/neodash/pull/401))
  - Added a new report action to switch pages based on a user interaction. ([@BennuFire](https://github.com/BennuFire), [#324](https://github.com/neo4j-labs/neodash/issues/324))
  - Added handler for mulitple report actions to be executed on the same event. ([@BennuFire](https://github.com/BennuFire), [#324](https://github.com/neo4j-labs/neodash/issues/324))
  - Integrated the official released version of the Neo4j Cypher editor component. ([@jharris4](https://github.com/jharris4), [#365](https://github.com/neo4j-labs/neodash/pull/365))
  - Fixed hot-module replacement inside webpack configuration.  ([@konsalex](https://github.com/konsalex), [#396](https://github.com/neo4j-labs/neodash/pull/396))
  - Fixed husky pre-commit hook not triggering correctly on Windows environments. ([@bastienhubert](https://github.com/bastienhubert), [#342](https://github.com/neo4j-labs/neodash/issues/342))
  - Add support for using complex objects in markdown, iframes and report titles. ([@BennuFire](https://github.com/bennufire), [#413](https://github.com/neo4j-labs/neodash/pull/413))


## NeoDash 2.2.3
This releases fixes a small set of bugs that slipped through the 2.2.3 release, and adds some minor features:
- Added support for scatter plots by overriding a parameter in the line chart.
- Added the ability to use dashboard parameter as filters in custom parameter selector queries.
- Fixed breaking bug in parameter selector settings causing a white-screen error.
- Fixed auto-coloring of bar charts (resolved back to logic of 2.2.1 and earlier).
- Added a quick fix for automatically resetting the parameter display value when the property display override is toggled.
- Upversioned outdated dashboards and in the NeoDash Gallery.

  
## NeoDash 2.2.2
The NeoDash 2.2.2 release is packed with a bunch of new usability features:
- Changed the built-in Cypher editor to a brand-new [CodeMirror Editor](https://github.com/neo4j-contrib/cypher-editor).
- Rebuilt the **Parameter Select** component from scratch for improved stability, performance and extendability:
  - Added an optional setting to the parameter selector to display a different property from the one that is set by the selector.
  - Use this to - for example - let users choose a name and set an ID for use by other reports.
  - Fields no longer reset randomly when parameters are changed.
  - Freetext fields are no longer slow - perform as fast as the other selectors.
- Add the option to use rule-based styling based on dashboard parameters.
- Changed rule-based styling on bar and pie charts to override color scheme instead of clear the scheme.
- Extended the [Example Gallery](https://neodash-gallery.graphapp.io/) with several new demos.
- Adding intermediate report error boundaries for improved app stability. 
- Changed docker image name to `neo4jlabs/neodash`.
- Improved documementation for developers.
- Fixed inconsistent styling between different pop-up screens, and fixed report title placeholders.

## NeoDash 2.2.1
This update provides a number of usability improves over the 2.2.0 release.
In addition, it entails various improvements to the codebase, including security patches on the dependencies.

Table:
- Column names prefixed with `__` are now hidden in the table view.
  
Map:
- Added documentation for adding a custom map provider.

Parameter selector:
- Added support for boolean parameters.

Editor:
- Parameters are now automatically replaced **inside report titles**.
- Image downloads now include the report title alongside the visualization.

Others:
- Applied security patches for dependencies.
- Set test container for release pipeline to fixed version of Neo4j.
- Aligned code style / linting with Neo4j product standards.
- Updated Docker setup to inject `standaloneDashboardURL` into the application config.

## NeoDash 2.2.0
This release marks the official arrival of **[Extensions](https://neo4j.com/labs/neodash/2.2/user-guide/extensions/)**, which provide a simple way of extending NeoDash with additional features. Adding your own features to NeoDash just became a lot easier!

NeoDash 2.2 comes with three in-built extensions.
- **Rule-Based Styling**
- **Advanced Visualizations**: These provide a means to enable complex visualizations in a dashboard. These were previously available as Radar charts, Treemaps, Circle Packing reports, Sankey charts, Choropleth and a Gauge Chart).
- **Report Actions**: Which let you create interactivity in dashboards, using the output of one report as input for another visualization. (Expert Extension)

You can enable extensions by clicking the 🧩 icon on the left sidebar of the screen.

Other changes include:
- New example dashboards available in the [Dashboard Gallery](https://neodash-gallery.graphapp.io).
- Customizable background colors for all report types.
- Fixing a bug where the Choropleth map chart was unable to parse country-codes.

## NeoDash 2.1.10
This is a minor update which adds some operational/styling improvements, and a bug fix for line charts.

Changes:
- Added customizable label positions for bar charts.
- Fixed bug where datetimes were not handled correctly by line charts. (https://github.com/neo4j-labs/neodash/issues/243)
- Added **session parameters**, set automatically and available to Cypher queries ([Documentation](https://neo4j.com/labs/neodash/2.1/user-guide/reports/)).
- Added option to restore debug reports in recovery mode.
- Added option to share dashboards from self-hosted deployments.

## NeoDash 2.1.8 & 2.1.9
New features:
- Added the [Dashboard Gallery](https://neodash-gallery.graphapp.io), a live gallery of example NeoDash dashboards.
- Added **Gauge Charts**, a contribution of the [BlueHound](https://github.com/zeronetworks/BlueHound) fork.
- Updated testing pipeline to work as an independent procedure.
- Added option to select a different Neo4j database for each report. ([#188](https://github.com/neo4j-labs/neodash/issues/118))
- Added **Report Actions**, a neodash extension (available in beta) only on [https://neodash.graphapp.io](https://neodash.graphapp.io). ([#27](https://github.com/neo4j-labs/neodash/issues/27))
 
Bug fixes:
- Fixed issue preventing dashboards to be shared with a non-standard database name.
- Fixed table chart breaking when returning a property called 'id' with a null value.
- Fixed bug not allowing users to select a different database when loading/saving a dashboard.
- **Added error handler for database list race condition in Neo4j Desktop**.


## NeoDash 2.1.6 & 2.1.7
New features:
- Added *Radar Charts/Spider Charts*.
- Added optional markdown description for each report, to be displayed via the header.

Extensions:
- Added option to provide a custom map provider for map charts.
- Added support for default values in parameter selectors.
- Added documentation on deep-linking into NeoDash.
- Added tick-rotation customization for line charts.
- Added option to have children in the sunburst chart inherit colors from their parents.

Improvements:
- Rewiring of the internal query/rendering engine - resulting in far fewer query executions and a smoother UX.
- Changed package manager from `npm` to `yarn`, and bumped node version to 18. Cleaned up `package.json`.
- Reduced flaky behaviour in parameter selectors.
- Added cycle-detection logic for sankey charts.
- Fixed report documentation pop-up to open link in a new window.

## NeoDash 2.1.5
Added *New* Sankey charts:
- Visualize nodes and relationships as a flow diagram.
- Select a customizable flow value from relationship properties.
- Configure a variety of style customizations.

Parameter select:
- Fixed bug where values would randomly be deleted after changing the parameter.
- Added option to customize the number of suggested values when a user enters (part of) a property value.
- Added option to customize search type (CONTAINS, STARTS WITH, or ENDS WITH).
- Added option to enable/disable case-sensitive search.
- Added option to enable/disable removing duplicate suggestions.

Miscellaneous:
- Extended documentation with examples on running NeoDash in Kubernetes.
- Fixed issue where duplicate database names were visible when running NeoDash on an on-prem Neo4j cluster.


## NeoDash 2.1.4
Added hotfix for missing function in map visualization (https://github.com/neo4j-labs/neodash/issues/183).


## NeoDash 2.1.3
The 2.1.3 release contains updates to the map visualization, as well as a new Choropleth map report type.
Several usability improvements were also added, including fixing all links into the new documentation pages.

- Extended the map visualization with a heatmap mode & marker clustering.
- Added a Choropleth map visualization report type.
- Added support for auto-linking into a predefined database from https://tools.neo4jlabs.com/.
- Added optional background color setting for reports.
- Added a new 'resize mode' for page layout creation.
- Added support for drawing dates on a time chart (in addition to existing datetime types).
- Fixed broken links in the documentation portal, all in-app links now point to this portal as well.


## NeoDash 2.1.2
The 2.1.2 release contains some bug fixes and minor improvements to the application.

Application changes:
- Added button to clone (duplicate) a report inside a dashboard.
- Added option to show/hide labels inside circle packing charts.
- Changed dashboard layout compaction strategy to be more natural.
- Fixed card headers not rendering correctly in read-only mode.
- Fixed rendering issues for table columns containing null values.

Operational changes:
- Added support for username/password environment variables in Docker.


## NeoDash 2.1.0, NeoDash 2.1.1
The 2.1 release is a major update to the NeoDash application.

Main updates:
- Added new drag-and-drop dashboard layout - reports can be **moved** and **resized** freely within the dashboard.
- Updated dashboard file format for new layout (2.0 dashboards are automatically migrated).
- Pages can now be reordered by dragging and dropping. 
- Added three new hierarchical report types:
  - Treemaps
  - Sunburst Charts
  - Circle Packing Charts
- Styling/usability improvements for pie charts.
- Improved image download (screenshot functionality) for all report types.
- Parameter select reports now resize the selector to fit the available space.

Other changes:
- Added continuous integration and deployment workflows.
- Created a new [User Guide](https://github.com/neo4j-labs/neodash/wiki/User-Guide) with documentation on all report customizations is available.
- Added a new [Developer Guide](https://github.com/neo4j-labs/neodash/wiki/Developer-Guide) with info on installing, building and extending the application.


## NeoDash 2.0.15
This is the final minor update before the 2.1 release.

Changes:
- Several stability improvements before the 2.1 release.
- Updated Dockerfile to make better use of caching, and pick up environment variables at run time.
- Added option to replace dashboard parameters in Markdown/iFrames to make them dynamic.
- Removed unneeded index column from the CSV download for tables.
- Added optional dashboard setting to enable image downloads for reports/the entire dashboard.


## NeoDash 2.0.14
Report features:
- Added optional "Download as CSV" button to table reports.
- Dashboard parameters can now be used in iFrames/Graph drilldown links, and they are automatically replaced when parameters get updated.
- Updating a dashboard parameter now only refreshes the reports that use the parameter.

Standalone mode:
- Enabled deploying standalone dashboards with a direct URL to the dashboard.
- Added functionality to deep link into a NeoDash dashboard with dashboard parameters (use ?neodash_variable_name=value in the URL).


Miscellaneous Bug fixes and improvements:
- Resolved crash caused by invalid geospatial properties in a Map visualization.
- Saving a dashboard now lets users override an existing dashboard with the same name (enabled by default).
- Increased the default row limits for line/bar/pie charts to 250. Added option to override the row limiter in the dashboard settings.
- Updated project README file to refer to the correct port number on Docker deployments.
- Enabled a configurable timeout for parameter selection reports, both a timeout for the suggestion retrieval and a timeout for updating the parameters.
- Fixed dependency issues when installing the application on Windows systems. Bumped suggested npm version to 8.6.

## NeoDash 2.0.13
This is a bug fix/minor usability update.

Changes:
- Resolved error where the float value 0.0 was rendered as 'null' in tables.
- Added alphabetical sorting to all node/relationship inspection pop-ups & parameter select reports.
- Resolved bug where switching pages quickly resulting in an error message.
- Resolved bug where rule-based styling would break on null values.
- Replaced margin-based styling on single value reports with a vertical alignment option.

## NeoDash 2.0.12
Added **rule-based styling**:
- Use the card settings to specify styling rules for tables, graphs, bar/pie/line charts and single values.
- Conditional rules are evaluated on each report render in order of priority.
- Rules can customize colors in tables, node colors & dynamically set the colors of components in your chart.

Minor improvements:
- Better handling of null values in tables.
- Tweaking/reorganization of the Docker file and deployment scripts.
- Renaming/restructuring of source code.

## NeoDash 2.0.8 / 2.0.9 / 2.0.10 / 2.0.11
Stability fixes to supplement 2.0.7:
- Hotfix for missing config file in Neo4j Desktop causing startup issue.
- Hotfix for application crashes caused by rendering custom data types in transposed table views.
- Hotfix for object rendering in tables & line-chart type detection.
- Fix for rendering dictionaries in tables/single value charts.
- Added resize handler for fullscreen map views.
- Added missing auto-run config to pie charts.
- Fixed broken value scale parameter for bar charts.

## NeoDash 2.0.7
Application functionality:
- Added standalone 'dashboard viewer' mode.
- Added option to save/load dashboards from other Neo4j databases.

Reports/Visualizations:
- Fixed bug in creating line charts.
- Added support for datetime axis in line charts.
- Added auto-locale formatting to number values in single value / table reports.
- Added unified renderer for value types.
- Updated default font size for single value reports.
- Added optional deep-link button for graph visualizations.
- Added option to disable auto-running a report, to let users explore the query first.
- Minor styling tweaks to the graph views.

For Developers:
- Added more documentation on extending the app.
- New security-vetted docker image available on Docker hub.


## NeoDash 2.0.6
Major version updates to all internal dependencies. 
NeoDash 2.0.6 uses Node 17+, react 17+ and recent versions of all visualization libraries.

Visualizations:
- Added pie charts (Including examples and new demo dashboard).
- Added setting to transpose table rows and columns.
- Improved styling on graph pop-up windows.
- Graph visualizations now auto-fit to the report size.
- Added button to reset the zoom on a graph report.

Parameter selection:
- Added relationship property / free text selection options.

Editor:
- Improved performance of inbuilt Cypher editor.
- Added button to maximize cards while in edit-mode.
- All reports are now maximizable by default.
- Added tiny report sizes.
- Added option to override the default query timeout of twenty seconds.

Other:
- Updated docker image build scripts.
- Fixed share link geneneration incorrectly removing capitals from usernames/passwords.

## NeoDash 2.0.5
Graph report:
- Fixed node position after dragging nodes.
- Added option to 'lock' graph views, storing the current positions of the nodes in the graph.
- Added experimental graph layouts.

Table:
- Fixed bug where the report freezes for very wide tables.
- Added support for rendering native/custom Neo4j types in the table.

Parameter select:
- Fixed issue where the dashboard crashes for slow connections.

Editor:
- Added button to create a debug file from the 'About' screen.


## NeoDash 2.0.4
New features:
- Added option dashboard setting to let users view reports in a fullscreen pop-up.
- Added inspection pop-up for graph visualizations.
- Added option to manually specify node labels/property names in parameter selection reports (for large databases).
- Added example of how to user map visualizations from derived properties.
- Added button to return to the welcome screen.
- iFrames can now take live parameter selections in the hash-part of the URL.

Bug fixes:
- Dashboards will now remember the active selection(s) made in parameter select reports.
- Graph visualizations will no longer draw overlapping lines when a pair of nodes shares bidirectional relationships.
- connection screen is now dismissable if an existing connection exists.
    
Special thanks to @JipSogeti for their contributions to this release.

## NeoDash 2.0.3
UX improvements + bug fixes.
- Parameter selection report:
    - fixed bug to allow for selecting properties from nodes with >5 distinct properties.
    - Added support for nodes and properties with spaces in their name.
- Sharing:
    - Removed persisted URL in share links to avoid getting stuck on shared dashboards
- Table:
    - Added option to specify relative column sizes
- Graph:
    - Changed node styling to use the last (most specific label) for applying customizations
    - Fixed error where incorrect properties were extracted from graphs with multi-labeled nodes
    - Fixed node display to hide "undefined" when a non-existing property is selected for that node.
    
## NeoDash 2.0.0, 2.0.1 & 2.0.2

**New & Improved Dashboard Editor**
- Added new Cypher editor with syntax highlighting / live syntax validation.
- Redesigned Cypher query runner to be 2x more performant.
- Easy custom styling of reports with the "advanced report settings" window.
- Added in-built documentation with example queries and visualizations.
- Updated dashboard layout to better use screen real estate.

**Visualizations**
- Table View
    - New table view with post-query sorting and filtering, and highlighting of native Neo4j types.
    - Fixed array property display in table reports.
    - Added automatic link generation from URL properties in the table report.
- Graph View
    - Updated graph visualization library to a canvas-based renderer, handling 4x larger graphs.
    - Added custom node/relationship styling with custom colors, width, and font-size.
    - Better property display on graph visualization hover.
- Bar/Line Chart
    - New bar/line chart visualizations based on the Charts graph app.
    - Added support for multi-line charts, stacked/grouped bar charts.
    - Added log scale + explicit limit setting to bar/line charts.
    - Line chart hover values are no longer rounded and incorrectly stacked.
- Map View
    - Added custom styling options to map visualizations.
    - Added dictionary-based point property rendering on maps.
    - Stability improvement of map views for offline deployments.
- Single Value Report
    - Improved single value report.
    - Custom styling (text alignment) of single value reports.
- Property Selection:
    - Improved property selection documentation.
    - Added optional "clear parameter" setting to parameter selection report.
    - property selector now uses the filter to gather more results.

**Saving, loading and sharing**
- Added setting to turn entire dashboard into 'Standalone mode' from a share link.
- Added option to save/load dashboards from both files and text.
- New "Try a demo" button on the welcome screen.
- added save/load to Neo4j database feature.
- Auto-convert older versions of NeoDash on load.





================================================
FILE: compose.yaml
================================================
services:
  neodash:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5005:5005"
    environment:
      - NGINX_PORT=5005


================================================
FILE: conf/default.conf.template
================================================
server {
    listen       ${NGINX_PORT};
    server_name  localhost;
    include      mime.types;
    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }
    # redirect server error pages to the static page /50x.html
    # Note: This is optional, depending on the implementation in React
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

================================================
FILE: cypress/Page.js
================================================
const DB_URL = 'localhost';
const DB_USERNAME = 'neo4j';
const DB_PASSWORD = 'test1234';

export class Page {
  constructor(cardSelector) {
    this.cardSelector = cardSelector;
  }

  init() {
    cy.viewport(1920, 1080);
    cy.visit('/', {
      onBeforeLoad(win) {
        win.localStorage.clear();
      },
    });
    return this;
  }

  createNewDashboard() {
    cy.get('#form-dialog-title').then(($div) => {
      const text = $div.text();
      if (text == 'NeoDash - Neo4j Dashboard Builder') {
        cy.wait(100);
        // Create new dashboard
        cy.contains('New Dashboard').click();
      }
    });
    return this;
  }

  connectToNeo4j() {
    cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'Connect to Neo4j');
    cy.get('#protocol').type('neo4j{enter}');
    cy.get('#url').clear().type(DB_URL);
    cy.get('#dbusername').clear().type(DB_USERNAME);
    cy.get('#dbpassword').type(DB_PASSWORD);
    cy.get('button').contains('Connect').click();
    cy.wait(100);
    return this;
  }

  enableReportActions() {
    cy.get('main button[aria-label="Extensions').should('be.visible').click();
    cy.get('#checkbox-actions').scrollIntoView();
    cy.get('#checkbox-actions').should('be.visible').click();
    cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
    cy.wait(100);
    return this;
  }

  enableAdvancedVisualizations() {
    cy.get('main button[aria-label="Extensions').should('be.visible').click();
    cy.get('#checkbox-advanced-charts').should('be.visible').click();
    cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
    cy.wait(100);
    return this;
  }

  enableFormsExtension() {
    cy.get('main button[aria-label="Extensions').should('be.visible').click();
    cy.get('#checkbox-forms').scrollIntoView();
    cy.get('#checkbox-forms').should('be.visible').click();
    cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click();
    cy.wait(100);
    return this;
  }

  selectReportOfType(type) {
    cy.get('main .react-grid-item button[aria-label="add report"]').should('be.visible').click();
    cy.get('main .react-grid-item')
      .contains('No query specified.')
      .parentsUntil('.react-grid-item')
      .find('button[aria-label="settings"]', { timeout: 2000 })
      .should('be.visible')
      .click();
    cy.get(`${this.cardSelector} #type`, { timeout: 2000 }).should('be.visible').click();
    cy.contains(type).click();
    cy.wait(100);
    return this;
  }

  createReportOfType(type, query, fast = false, run = true) {
    this.selectReportOfType(type);
    if (fast) {
      cy.get(`${this.cardSelector} .ReactCodeMirror`).type(query, {
        delay: 1,
        parseSpecialCharSequences: false,
      });
    } else {
      cy.get(`${this.cardSelector} .ReactCodeMirror`).type(query, { parseSpecialCharSequences: false });
    }
    cy.wait(400);

    if (run) {
      this.closeSettings();
    }

    cy.wait(100);
    return this;
  }

  openSettings() {
    cy.get(this.cardSelector).find('button[aria-label="settings"]', { WAITING_TIME: 2000 }).click();
    cy.wait(100);
    return this;
  }

  closeSettings() {
    cy.get(`${this.cardSelector} button[aria-label="run"]`).click();
    cy.wait(100);
    return this;
  }

  openAdvancedSettings() {
    this.openSettings();
    cy.get(this.cardSelector).contains('Advanced settings').click();
    cy.wait(100);
    return this;
  }

  closeAdvancedSettings() {
    cy.get(this.cardSelector).contains('Advanced settings').click();
    this.closeSettings();
    return this;
  }

  openReportActionsMenu() {
    this.openSettings();
    cy.get(this.cardSelector).find('button[aria-label="custom actions"]').click();
    cy.wait(100);
    return this;
  }

  updateDropdownAdvancedSetting(settingLabel, targetValue) {
    this.openAdvancedSettings();
    cy.get(`${this.cardSelector} .ndl-dropdown`).contains(settingLabel).siblings('div').click();
    cy.contains(targetValue).click();
    this.closeAdvancedSettings();
    return this;
  }

  updateChartQuery(query) {
    this.openSettings();

    cy.get(this.cardSelector)
      .find('.ndl-cypher-editor div[role="textbox"]')
      .should('be.visible')
      .click()
      .clear()
      .type(query);
    cy.wait(100);

    this.closeSettings();
    return this;
  }
}


================================================
FILE: cypress/e2e/charts/array.cy.js
================================================
import { stringArrayCypherQuery, intArrayCypherQuery, pathArrayCypherQuery } from '../../fixtures/cypher_queries';
import { Page } from '../../Page';

const CARD_SELECTOR = 'main .react-grid-item:eq(2)';
const page = new Page(CARD_SELECTOR);

// Ignore warnings that may appear when using the Cypress dev server
Cypress.on('uncaught:exception', (err, runnable) => {
  console.log(err, runnable);
  return false;
});

describe('Testing array rendering', () => {
  beforeEach('open neodash', () => {
    page.init().createNewDashboard().connectToNeo4j();
    cy.wait(100);
  });

  it('creates a table that contains string arrays', () => {
    cy.checkInitialState();
    page.enableReportActions();
    page.createReportOfType('Table', stringArrayCypherQuery, true, true);

    // Standard array, displays strings joined with comma and whitespace
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', 'initial, list');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', 'other, list');

    // Now, transpose the table
    page.updateDropdownAdvancedSetting('Transpose Rows & Columns', 'on');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`).should('have.text', 'initial,list');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', 'other, list');

    // Transpose back
    // And add a report action
    page.updateDropdownAdvancedSetting('Transpose Rows & Columns', 'off');
    page.openReportActionsMenu();
    cy.get('.ndl-modal').find('button[aria-label="add"]').click();
    cy.get('.ndl-modal').find('input:eq(2)').type('column');
    cy.get('.ndl-modal').find('input:eq(5)').type('test_param');
    cy.get('.ndl-modal').find('input:eq(6)').type('column');
    cy.get('.ndl-modal').find('button').contains('Save').click();
    page.closeSettings();
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`)
      .find('button')
      .should('be.visible')
      .should('have.text', 'initial, list')
      .click();

    // Previous step's click set a parameter from the array
    // Test that parameter rendering works
    cy.get(`${CARD_SELECTOR} .MuiCardHeader-root`).find('input').type('$neodash_test_param').blur();
    cy.get(`${CARD_SELECTOR} .MuiCardHeader-root`).find('input').should('have.value', 'initial, list');
  });

  it('creates a table that contains int arrays', () => {
    cy.checkInitialState();
    page.createReportOfType('Table', intArrayCypherQuery, true, true);

    // Standard array, displays strings joined with comma and whitespace
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', '1, 2');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', '3, 4');

    // Now, transpose the table
    page.updateDropdownAdvancedSetting('Transpose Rows & Columns', 'on');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`).should('have.text', '1,2');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', '3, 4');
  });

  it('creates a table that contains nodes and rels', () => {
    cy.checkInitialState();
    page.createReportOfType('Table', pathArrayCypherQuery, true, true);

    // Standard array, displays a path with two nodes and a relationship
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', 'PersonACTED_INMovie');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) button`).should('have.length', 2);
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) button:eq(0)`).should('have.text', 'Person');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) button:eq(1)`).should('have.text', 'Movie');
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) .MuiChip-root`).should('have.length', 1);
    cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0) .MuiChip-root`).should('have.text', 'ACTED_IN');
  });

  it('creates a single value report which is an array', () => {
    cy.checkInitialState();
    page.createReportOfType('Single Value', stringArrayCypherQuery, true, true);
    cy.get(CARD_SELECTOR).should('have.text', 'initial, list');
  });

  it('creates a multi parameter select', () => {
    cy.checkInitialState();
    page.selectReportOfType('Parameter Select');
    cy.get('main .react-grid-item:eq(2) label[for="Selection Type"]').siblings('div').click();
    // Set up the parameter select
    cy.contains('Node Property').click();
    cy.wait(100);
    cy.contains('Node Label').click();
    cy.contains('Node Label').siblings('div').find('input').type('Movie');
    cy.wait(1000);
    cy.get('.MuiAutocomplete-popper').contains('Movie').click();
    cy.contains('Property Name').click();
    cy.contains('Property Name').siblings('div').find('input').type('title');
    cy.wait(1000);
    cy.get('.MuiAutocomplete-popper').contains('title').click();
    // Enable multiple selection
    page.closeSettings();
    page.updateDropdownAdvancedSetting('Multiple Selection', 'on');
    // Finally, select a few values in the parameter select
    cy.get(CARD_SELECTOR).contains('Movie title').click();
    cy.get(CARD_SELECTOR).contains('Movie title').siblings('div').find('input').type('a');
    cy.get('.MuiAutocomplete-popper').contains('Apollo 13').click();
    cy.get(CARD_SELECTOR).contains('Movie title').siblings('div').find('input').type('t');
    cy.get('.MuiAutocomplete-popper').contains('The Matrix').click();
    cy.get(CARD_SELECTOR).contains('Apollo 13').should('be.visible');
    cy.get(CARD_SELECTOR).contains('The Matrix').should('be.visible');
  });
});


================================================
FILE: cypress/e2e/charts/bar.cy.js
================================================
import { barChartCypherQuery } from '../../fixtures/cypher_queries';
import { Page } from '../../Page';

const CARD_SELECTOR = '.react-grid-layout:eq(0) .MuiGrid-root:eq(2)';
const page = new Page(CARD_SELECTOR);

// Ignore warnings that may appear when using the Cypress dev server
Cypress.on('uncaught:exception', (err, runnable) => {
  console.log(err, runnable);
  return false;
});

describe('Testing bar chart', () => {
  beforeEach('open neodash', () => {
    page.init().createNewDashboard().connectToNeo4j().createReportOfType('Bar Chart', barChartCypherQuery);
  });

  it('Checking Colour Picker settings', () => {
    //Opens advanced settings
    cy.get('.react-grid-layout')
      .first()
      .within(() => {
        //Finds the 2nd card
        cy.get('.MuiGrid-root:eq(2)').within(() => {
          // Access advanced settings
          cy.get('button').eq(1).click();
          cy.get('[role="switch"]').click();
          cy.wait(200);
          // Changing setting for colour picker
          cy.get('[data-testid="colorpicker-input"]').find('input').click().type('{selectall}').type('red');
          cy.get('button[aria-label="run"]').click();
          // Checking that colour picker was applied correctly
          cy.get('.card-view').should('have.css', 'background-color', 'rgb(255, 0, 0)');
          cy.wait(200);
          // Changing colour back to white
          cy.get('button').eq(1).click();
          cy.get('[data-testid="colorpicker-input"]').find('input').click().type('{selectall}').type('white');
          cy.get('button[aria-label="run"]').click();
          // Checking colour has been set back to white
          cy.wait(200);
          cy.get('.card-view').should('have.css', 'background-color', 'rgb(255, 255, 255)');
        });
      });
  });

  it('Checking Selector Description', () => {
    //Opens first 2nd card
    cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(2)').within(() => {
      // Access advanced settings
      cy.get('button').eq(1).click();
      cy.get('[role="switch"]').click();
      cy.wait(200);
      // Changing Selector Description to 'Test'
      cy.get('.ndl-textarea').contains('span', 'Selector Description').click().type('Test');
      cy.get('button[aria-label="run"]').click();
      // Pressing Selector Description button
      cy.get('button[aria-label="details"]').click();
    });
    // Checking that Selector Description is behaving as expected
    cy.get('.MuiDialog-paper').should('be.visible').and('contain.text', 'Test');
    cy.wait(1000);

    // Click elsewhere on the page to close dialog box
    cy.get('div[role="dialog"]').parent().click(-100, -100, { force: true });
  });

  it('Checking full screen bar chart setting', () => {
    page.updateDropdownAdvancedSetting('Fullscreen enabled', 'on');
    cy.get('button[aria-label="maximize"]').click();
    // Checking existence of full-screen modal
    cy.get('.dialog-xxl').should('be.visible');
    // Action to close full-screen modal
    cy.get('button[aria-label="un-maximize"]').click();
    // Checking that fullscreen has un-maximized
    // Check that the div is no longer in the DOM
    cy.get('div[data-focus-lock-disabled="false"]').should('not.exist');
  });

  it('Checking "Autorun Query" works as intended', () => {
    page.updateDropdownAdvancedSetting('Auto-run query', 'off');
    cy.get('.MuiCardContent-root').find('.ndl-cypher-editor').should('be.visible');
    cy.get('.MuiCardContent-root').find('g').should('not.exist');
    cy.wait(100);
    cy.get('.MuiCardContent-root').find('button[aria-label="run"]').filter(':visible').click();
    cy.get('g').should('exist');
  });

  it('Checking Legend integration works as intended', () => {
    page.updateDropdownAdvancedSetting('Show Legend', 'on');
    // Checking that legend matches value specified: in the case - 'count'
    cy.get('svg g g text').last().contains(/count/i);

    page.updateDropdownAdvancedSetting('Show Legend', 'off');
    cy.get('svg g g text').last().contains(/count/i).should('not.exist');
  });

  it('Checking the stacked grouping function works as intended', () => {
    const TRANSLATE_REGEXP = /translate\(([0-9]{1,3}), [0-9]{1,3}\)/;

    page
      .updateChartQuery(
        'MATCH (p:Person)-[:DIRECTED]->(n:Movie) RETURN n.released AS released, p.name AS Director, count(n.title) AS count LIMIT 5'
      )
      .updateDropdownAdvancedSetting('Grouping', 'on');

    cy.get('.MuiGrid-root:eq(2)')
      .find('.ndl-dropdown:contains("Group")')
      .find('svg')
      .parent()
      .click()
      .type('Director{enter}');
    // Checking that the groups are stacked
    cy.get('.MuiGrid-root:eq(2)')
      .find('g')
      .children('g')
      .eq(3) // Get the fourth g element (index starts from 0)
      .invoke('attr', 'transform')
      .then((transformValue) => {
        // Captures the first number in the translate attribute using the parenthesis to capture the first digit and put it in the second value of the resulting array
        // if transformValue is translate(100,200), then it will produce an array like ["translate(100,200)", "100"],
        const match = transformValue.match(TRANSLATE_REGEXP);
        if (match?.[1]) {
          const xValue = match[1];
          // Now find sibling g elements with the same x transform value
          cy.get('.MuiCardContent-root')
            .find('g')
            .children('g')
            .filter((_, element) => {
              const siblingTransform = Cypress.$(element).attr('transform');
              return siblingTransform?.includes(`translate(${xValue},`);
            })
            .should('have.length', 3); // Check that there's at least one element
        } else {
          throw new Error('Transform attribute not found or invalid format');
        }
      });
    cy.get('.ndl-dropdown:contains("Group")').find('svg').parent().click().type('(none){enter}');
    //Checking that the stacked grouped elements do not exist
    cy.get('.MuiCardContent-root')
      .find('g')
      .children('g')
      .eq(3) // Get the fourth g element (index starts from 0)
      .invoke('attr', 'transform')
      .then((transformValue) => {
        // Captures the first number in the translate attribute using the parenthesis to capture the first digit and put it in the second value of the resulting array
        // if transformValue is translate(100,200), then it will produce an array like ["translate(100,200)", "100"],
        const match = transformValue.match(TRANSLATE_REGEXP);
        if (match?.[1]) {
          const xValue = match[1];
          // Now find sibling g elements with the same x transform value
          cy.get('.MuiCardContent-root')
            .find('g')
            .children('g')
            .filter((_, element) => {
              const siblingTransform = Cypress.$(element).attr('transform');
              return siblingTransform?.includes(`translate(${xValue},`);
            })
            .should('have.length', 1); // Check that there are no matching elements
        } else {
          throw new Error('Transform attribute not found or invalid format');
        }
      });
  });

  // How to properly test this?
  it.skip('Testing grouped grouping mode', () => {
    page
      .updateChartQuery(
        'MATCH (p:Person)-[:DIRECTED]->(n:Movie) RETURN n.released AS released, p.name AS Director, count(n.title) AS count LIMIT 5'
      )
      .updateDropdownAdvancedSetting('Grouping', 'on')
      .updateDropdownAdvancedSetting('Group Mode', 'grouped');
    cy.get('.ndl-dropdown:contains("Group")').find('svg').parent().click().type('Director{enter}');
  });

  it('Testing "Show Value on Bars"', () => {
    page.updateDropdownAdvancedSetting('Show Values On Bars', 'on');
    cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(2)').find('div svg > g > g > text').should('have.length', 5);

    page.updateDropdownAdvancedSetting('Show Values On Bars', 'off');
    cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(2)').find('div svg > g > g > text').should('not.exist');
  });

  describe('Y axis display', () => {
    it('Checking Y axis is displayed', () => {
      page.updateDropdownAdvancedSetting('Display Y axis', 'on');
      cy.get('.MuiCardContent-root svg > g > g:nth-child(3)')
        .invoke('attr', 'transform')
        .should('eq', 'translate(0,0)');
    });

    it('Checking Y axis is hidden', () => {
      page.updateDropdownAdvancedSetting('Display Y axis', 'off');
      cy.get('.MuiCardContent-root svg > g > g:nth-child(3)')
        .invoke('attr', 'transform')
        .should('not.eq', 'translate(0,0)');
    });
  });

  describe('Y grid lines display', () => {
    it('Checking Y grid lines are displayed', () => {
      page.updateDropdownAdvancedSetting('Display Y grid lines', 'on');
      cy.get('.MuiCardContent-root svg g > g > line').invoke('attr', 'stroke').should('eq', '#dddddd');
    });

    it('Checking Y grid lines are hidden', () => {
      page.updateDropdownAdvancedSetting('Display Y grid lines', 'off');
      cy.get('.MuiCardContent-root svg g > g > line').invoke('attr', 'stroke').should('not.eq', '#dddddd');
    });
  });
});


================================================
FILE: cypress/e2e/charts/table.cy.js
================================================
import { tableCypherQuery } from '../../fixtures/cypher_queries';
import { Page } from '../../Page';

const page = new Page();
// Ignore warnings that may appear when using the Cypress dev server
Cypress.on('uncaught:exception', (err, runnable) => {
  console.log(err, runnable);
  return false;
});

describe('Testing table', () => {
  beforeEach('open neodash', () => {
    page.init().createNewDashboard().connectToNeo4j();
    cy.wait(100);
  });

  it.skip('create a table', () => {
    //Opens the div containing all report cards
    cy.get('.react-grid-layout:eq(0)')
      .first()
      .within(() => {
        //Finds the 2nd card
        cy.get('.MuiGrid-root')
          .eq(1)
          .within(() => {
            //Clicks the 2nd button (opens settings)
            cy.get('button').eq(1).click();
            // cy.get('div[role="textbox"')
          });
      });
    cy.get('.react-grid-layout')
      .first()
      .within(() => {
        //Finds the 2nd card
        cy.get('.MuiGrid-root')
          .eq(1)
          .within(() => {
            //Opens the drop down
            cy.getDataTest('type-dropdown').click();
          });
      });
    // Selects the Table option
    cy.get('[id^="react-select-5-option"]').contains(/Table/).should('be.visible').click({ force: true });
    cy.get('.react-grid-layout .MuiGrid-root:eq(1) #type input[name="Type"]').should('have.value', 'Table');

    //Removes text in cypher editor and types new query
    cy.get('.react-grid-layout')
      .first()
      .within(() => {
        //Finds the 2nd card
        cy.get('.MuiGrid-root')
          .eq(1)
          .within(() => {
            //Replaces default query with new query
            cy.get('.ndl-cypher-editor div[role="textbox"]').clear().type(tableCypherQuery);
            cy.get('button[aria-label="run"]').click();
          });
      });
  });
});


================================================
FILE: cypress/e2e/start_page.cy.js
================================================
import {
  tableCypherQuery,
  barChartCypherQuery,
  mapChartCypherQuery,
  sunburstChartCypherQuery,
  iFrameText,
  markdownText,
  loadDashboardURL,
  sankeyChartCypherQuery,
  gaugeChartCypherQuery,
  formCypherQuery,
} from '../fixtures/cypher_queries';

import { Page } from '../Page';

const CARD_SELECTOR = 'main .react-grid-item:eq(2)';
const page = new Page(CARD_SELECTOR);

// Ignore warnings that may appear when using the Cypress dev server
Cypress.on('uncaught:exception', (err, runnable) => {
  console.log(err, runnable);
  return false;
});

describe('NeoDash E2E Tests', () => {
  beforeEach(() => {
    page.init().createNewDashboard().connectToNeo4j();
    cy.wait(100);
  });

  it('initializes the dashboard', () => {
    cy.checkInitialState();
  });

  it('creates a new card', () => {
    cy.checkInitialState();
    cy.createCard();
  });

  // Test each type of card
  it('creates a table report', () => {
    cy.checkInitialState();
    cy.get('main .react-grid-item button[aria-label="add report"]').should('be.visible').click();
    cy.get('main .react-grid-item')
      .contains('No query specified.')
      .parentsUntil('.react-grid-item')
      .find('button[aria-label="settings"]', { timeout: 2000 })
      .should('be.visible')
      .click();

    cy.get('main .react-grid-item:eq(2) #type input[name="Type"]').should('have.value', 'Table');
    cy.get('main .react-grid-item:eq(2) .ReactCodeMirror').type(tableCypherQuery);
    cy.wait(400);

    cy.get('main .react-grid-item:eq(2)').contains('Advanced settings').click();

    cy.get('main .react-grid-item:eq(2) button[aria-label="run"]').click();
    cy.get('main .react-grid-item:eq(2) .MuiDataGrid-columnHeaders')
      .should('contain', 'title')
      .and('contain', 'released')
      .and('not.contain', '__id');
    // cy.get('main .react-grid-item:eq(2) .MuiDataGrid-virtualScroller .MuiDataGrid-row').should('have.length', 8);
    // cy.get('main .react-grid-item:eq(2) .MuiDataGrid-footerContainer').should('contain', '1–8 of 8');
    // cy.get('main .react-grid-item:eq(2) .MuiDataGrid-footerContainer button[aria-label="Go to next page"]').click();
    // cy.get('main .react-grid-item:eq(2) .MuiDataGrid-virtualScroller .MuiDataGrid-row').should('have.length', 3);
    // cy.get('main .react-grid-item:eq(2) .MuiDataGrid-footerContainer').should('contain', '6–8 of 8');
  });

  it('creates a bar chart report', () => {
    cy.checkInitialState();
    page.createReportOfType('Bar Chart', barChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) #index input[name="Category"]').should('have.value', 'released');
    cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'count');
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 8);
  });

  it('creates a pie chart report', () => {
    cy.checkInitialState();
    page.createReportOfType('Pie Chart', barChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) #index input[name="Category"]').should('have.value', 'released');
    cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'count');
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 3);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g > path').should('have.length', 5);
  });

  it('creates a line chart report', () => {
    cy.checkInitialState();
    page.createReportOfType('Line Chart', barChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) #x input[name="X-value"]').should('have.value', 'released');
    cy.get('main .react-grid-item:eq(2) #value input[name="Y-value"]').should('have.value', 'count');
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 6);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g:nth-child(2) > line').should(
      'have.length',
      11
    );
  });

  it('creates a map chart report', () => {
    cy.checkInitialState();
    page.createReportOfType('Map', mapChartCypherQuery, true);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > path').should('have.length', 5);
  });

  it('creates a single value report', () => {
    cy.checkInitialState();
    page.createReportOfType('Single Value', barChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root > div > div:nth-child(2) > span')
      .invoke('text')
      .then((text) => {
        expect(text).to.be.oneOf(['1999', '1,999', '1 999']);
      });
  });

  it.skip('creates a gauge chart report', () => {
    page.enableAdvancedVisualizations();
    cy.checkInitialState();
    page.createReportOfType('Gauge Chart', gaugeChartCypherQuery);
    cy.get('.text-group > text').contains('69');
  });

  it('creates a sunburst chart report', () => {
    page.enableAdvancedVisualizations();
    cy.checkInitialState();
    page.createReportOfType('Sunburst Chart', sunburstChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) #index input[name="Path"]').should('have.value', 'x.path');
    cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'x.value');
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g:nth-child(1) > path').should('have.length', 5);
  });

  it('creates a circle packing report', () => {
    page.enableAdvancedVisualizations();
    cy.checkInitialState();
    page.createReportOfType('Circle Packing', sunburstChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) #index input[name="Path"]').should('have.value', 'x.path');
    cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'x.value');
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > circle').should('have.length', 6);
  });

  it('creates a tree map report', () => {
    page.enableAdvancedVisualizations();
    cy.checkInitialState();
    page.createReportOfType('Treemap', sunburstChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) #index input[name="Path"]').should('have.value', 'x.path');
    cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'x.value');
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 6);
  });

  it('creates a sankey chart report', () => {
    page.enableAdvancedVisualizations();
    cy.checkInitialState();
    page.createReportOfType('Sankey Chart', sankeyChartCypherQuery, true);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > path').should('have.attr', 'fill-opacity', 0.5);
  });

  it('creates a raw json report', () => {
    cy.checkInitialState();
    page.createReportOfType('Raw JSON', barChartCypherQuery);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root textarea:nth-child(1)', { timeout: 45000 }).should(
      ($div) => {
        const text = $div.text();
        expect(text.length).to.eq(1387);
      }
    );
  });

  it('creates a parameter select report', () => {
    cy.checkInitialState();
    page.selectReportOfType('Parameter Select');
    cy.wait(500);
    cy.get('#autocomplete-label-type').type('Movie');
    cy.get('#autocomplete-label-type-option-0').click();
    cy.wait(500);
    cy.get('#autocomplete-property').type('title');
    cy.get('#autocomplete-property-option-0').click();
    cy.get('main .react-grid-item:eq(2) button[aria-label="run"]').click();
    cy.get('#autocomplete').type('The Matrix');
    cy.get('#autocomplete-option-0').click();
  });

  it('creates an iframe report', () => {
    cy.checkInitialState();
    page.createReportOfType('iFrame', iFrameText);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root iframe', { timeout: 45000 }).should('be.visible');
  });

  it('creates a markdown report', () => {
    cy.checkInitialState();
    page.createReportOfType('Markdown', markdownText);
    cy.get('main .react-grid-item:eq(2) .MuiCardContent-root h1', { timeout: 45000 }).should('have.text', 'Hello');
  });

  it.skip('creates a form report', () => {
    page.enableFormsExtension();
    cy.checkInitialState();
    page.createReportOfType('Form', formCypherQuery, true, false);
    cy.get('main .react-grid-item:eq(2) .form-add-parameter').click();
    cy.wait(200);
    cy.get('#autocomplete-label-type').type('Movie');
    cy.get('#autocomplete-label-type-option-0').click();
    cy.wait(200);
    cy.get('#autocomplete-property').type('title');
    cy.get('#autocomplete-property-option-0').click();

    cy.get('.ndl-dialog-close').click();

    cy.get('main .react-grid-item:eq(2) button[aria-label="run"]').scrollIntoView().should('be.visible').click();
    cy.wait(500);
    cy.get('#form-submit').should('be.disabled');
    cy.get('#autocomplete').type('The Matrix');
    cy.get('#autocomplete-option-0').click();
    cy.get('#form-submit').should('not.be.disabled');
    cy.get('#form-submit').click();
    cy.wait(500);
    cy.get('.form-submitted-message').should('have.text', 'Form Submitted.Reset Form');
  });

  // Test load stress-test dashboard from file
  // TODO - this test is flaky, especially in GitHub actions environment.
  it.skip('test load dashboard from file and stress test report customizations', () => {
    try {
      const NUMBER_OF_PAGES_IN_STRESS_TEST_DASHBOARD = 5;
      const file = cy.request(loadDashboardURL).should((response) => {
        cy.get('#root .MuiDrawer-root .MuiIconButton-root:eq(2)').click();
        cy.get('.MuiDialog-root .MuiPaper-root .MuiDialogContent-root textarea:eq(0)')
          .invoke('val', response.body)
          .trigger('change');
        cy.get('.MuiDialog-root .MuiPaper-root .MuiDialogContent-root textarea:eq(0)').type(' ');
        cy.get('.MuiDialog-root .MuiDialogContent-root .MuiButtonBase-root:eq(2)').click();
        cy.wait(2500);

        // Click on each page and wait ~3 seconds for it to load completely
        for (let i = 1; i < NUMBER_OF_PAGES_IN_STRESS_TEST_DASHBOARD; i++) {
          cy.get('.MuiAppBar-root .react-grid-item:eq(' + i + ')').click();
          cy.wait(3000);
        }
      });
    } catch (e) {
      console.log('Unable to fetch test dashboard. Skipping test.');
    }
  });
});


================================================
FILE: cypress/fixtures/cypher_queries.js
================================================
// Cypher queries - for component testing
export const defaultCypherQuery = 'MATCH (n) RETURN n LIMIT 25';
export const tableCypherQuery =
  'MATCH (n:Movie) RETURN n.title AS title, n.released AS released, id(n) AS __id LIMIT 8';
export const barChartCypherQuery = 'MATCH (n:Movie) RETURN n.released AS released, count(n.title) AS count LIMIT 5';
export const mapChartCypherQuery =
  "UNWIND [{id: 'Tilburg', label: 'Cinema', point: point({latitude:51.59444886664065 , longitude:5.088862976119185})}, {id: 'Antwerp', label: 'Cinema', point: point({latitude:51.22065200961528  , longitude:4.414094044161085})}, \n" +
  "{id: 'Brussels', label: 'Cinema', point: point({latitude:50.854284724408664, longitude:4.344177490986771})},{id: 'Cologne', label: 'Cinema', point: point({latitude:50.94247712506476  , longitude:6.9699327434361855 })}, \n" +
  "{id: 'Nijmegen', label: 'Cinema', point: point({latitude:51.81283449474347 , longitude:5.866804797140869})},{start: 'Tilburg', end: 'Antwerp', type: 'ROUTE_TO', distance: '125km', id: 100}, {start: 'Antwerp', end: 'Brussels', type: 'ROUTE_TO', distance: '70km', id: 101}, \n" +
  "{start: 'Brussels', end: 'Cologne', type: 'ROUTE_TO', distance: '259km', id: 102},{start: 'Cologne', end: 'Nijmegen', type: 'ROUTE_TO', distance: '180km', id: 103},{start: 'Nijmegen', end: 'Tilburg', type: 'ROUTE_TO', distance: '92km', id: 104}] as value RETURN value//";
export const sunburstChartCypherQuery =
  "UNWIND [{path: ['a', 'b'], value: 3}, {path: ['a', 'c'], value: 5},{path: ['a', 'd', 'e'], value: 2},{path: ['a', 'd', 'f'], value: 3}] as x RETURN x.path, x.value";
export const sankeyChartCypherQuery =
  "WITH [ { path: {  start: {labels: ['Person'], identity: 1, properties: {name: 'Jim'}},  end:  {identity: 11},  length: 1, segments: [ { start: {labels: ['Person'], identity: 1, properties: {name: 'Jim'}}, relationship: {type: 'RATES', start: 1, end: 11, identity: 10001, properties: {value: 4.5}}, end: {labels: ['Movie'], identity: 11,properties: {title: 'The Matrix', released: 1999}} } ] }, person: 'Jim', movie: 'The Matrix', value: 4.5 }, { path: {  start: {labels: ['Person'], identity: 2, properties: {name: 'Mike'}},  end:  {identity: 11},  length: 1, segments: [ { start: {labels: ['Person'], identity: 2, properties: {name: 'Mike'}}, relationship: {type: 'RATES', start: 2, end: 11, identity: 10002, properties: {value: 3.8}}, end: {labels: ['Movie'], identity: 11,properties: {title: 'The Matrix', released: 1999}} } ] }, person: 'Mike', movie: 'The Matrix', value: 3.8 } ] as data UNWIND data as row RETURN row.path as Path";
export const gaugeChartCypherQuery = 'RETURN 69';
export const formCypherQuery = 'MATCH (n:Movie) WHERE n.title = $neodash_movie_title SET n.rating = 92';

// Cypher queries - for renderer testing
export const stringArrayCypherQuery = "RETURN ['initial', 'list'] AS column, ['other', 'list'] AS otherColumn";
export const intArrayCypherQuery = 'RETURN [1, 2] AS column, [3, 4] AS otherColumn';
export const pathArrayCypherQuery = 'MATCH p=(:Person)-[:ACTED_IN]->(:Movie) WITH p LIMIT 1 RETURN p';

// Other content fixtures
export const iFrameText = 'https://www.wikipedia.org/';
export const markdownText = '# Hello';
export const loadDashboardURL =
  'https://gist.githubusercontent.com/nielsdejong/ee33245256b471f92901ca4073b16ec1/raw/cfaae47e0fcdf430a5de6d0d8e3ac13cfd97742e/dashboard-cypress.json';


================================================
FILE: cypress/index.js
================================================
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************

// Import commands.js using ES2015 syntax:
import './support/commands';

// Alternatively you can use CommonJS syntax:
// require('./commands')


================================================
FILE: cypress/plugins/index.js
================================================
module.exports = (on, config) => {
  require('@cypress/code-coverage/task')(on, config);
  //Used to instrument code ran like unit tests
  on('file:preprocessor', require('@cypress/code-coverage/use-babelrc'));
  on('before:browser:launch', (browser, launchOptions) => {
    if (browser.family === 'chromium') {
      console.log('Adding Chrome flag: --disable-dev-shm-usage');
      launchOptions.args.push('--disable-dev-shm-usage');
    }
    return launchOptions;
  });
  return config;
};


================================================
FILE: cypress/support/commands.js
================================================
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
Cypress.Commands.add('getDataTest', (dataTestSelector) => {
  return cy.get(`[data-test="${dataTestSelector}"]`);
});

/**
 * Function to interact with a specific element and execute additional custom commands.
 * @param {Function} customAction - A callback function containing custom Cypress commands.
 */

//Used in start_page.cy.js
Cypress.Commands.add('checkInitialState', () => {
  // Check the starter cards
  cy.get('main .react-grid-item:eq(0)').should('contain', 'This is your first dashboard!');
  cy.get('main .react-grid-item:eq(1) .force-graph-container canvas').should('be.visible');
  cy.get('main .react-grid-item:eq(2) button').should('have.attr', 'aria-label', 'add report');
});

// Creates a card
const WAITING_TIME = 20000;
Cypress.Commands.add('createCard', () => {
  // Check the starter cards
  cy.get('main .react-grid-item button[aria-label="add report"]', { timeout: WAITING_TIME })
    .should('be.visible')
    .click();
  cy.wait(1000);
  cy.get('main .react-grid-item:eq(2)').should('contain', 'No query specified.');
});


================================================
FILE: cypress/support/e2e.ts
================================================
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************

// Import commands.js using ES2015 syntax:
import './commands';

// Alternatively you can use CommonJS syntax:
// require('./commands')

import '@cypress/code-coverage/support';


================================================
FILE: cypress.config.ts
================================================
/* eslint @typescript-eslint/no-var-requires: "off" */
import { defineConfig } from 'cypress';

export default defineConfig({
  projectId: 'a8nh14',
  video: false,
  e2e: {
    defaultCommandTimeout: 20000,
    experimentalMemoryManagement: true,
    numTestsKeptInMemory: 0,
    baseUrl: 'http://localhost:3000',
    setupNodeEvents(on, config) {
      return require('./cypress/plugins/index.js')(on, config);
    },
    retries: {
      runMode: 2,
      openMode: 2,
    },
  },
  env: {
    codeCoverage: {
      exclude: ['cypress/**/*.*'],
    },
  },
});


================================================
FILE: docs/README.md
================================================
# NeoDash Documentation

This folder contains the documentation for the NeoDash project. The pages are written in AsciiDoc, and generated into webpages by Antora.

An external workflow picks up this directory, embeds it into the Neo4j docs, and makes sure generated files are automatically deployed to:
```
https://neo4j.com/labs/neodash/{version}
```
For example: https://neo4j.com/labs/neodash/2.4

## Local Build
To compile and view the documentation locally, navigate to this (`./docs`) folder and run:
```
yarn install
yarn start
```

Then, open your browser and navigate to http://localhost:8000/.

================================================
FILE: docs/antora.yml
================================================
name: neodash
version: 2.4
title: NeoDash
start_page: ROOT:index.adoc
nav:
  - modules/ROOT/nav.adoc

asciidoc:
  attributes:
    docs-version: 2.4
    page-product: NeoDash
    page-type: NeoDash Manual
    page-canonical-root: /labs

================================================
FILE: docs/modules/ROOT/nav.adoc
================================================
* xref:index.adoc[Introduction]
* xref:quickstart.adoc[Quickstart]
* xref:user-guide/index.adoc[User Guide]
** xref:user-guide/dashboards.adoc[Dashboards]
** xref:user-guide/pages.adoc[Pages]
** xref:user-guide/reports/index.adoc[Reports]
*** xref:user-guide/reports/table.adoc[Table]
*** xref:user-guide/reports/graph.adoc[Graph]
*** xref:user-guide/reports/bar-chart.adoc[Bar Chart]
*** xref:user-guide/reports/pie-chart.adoc[Pie Chart]
*** xref:user-guide/reports/line-chart.adoc[Line Chart]
*** xref:user-guide/reports/graph3d.adoc[3D Graph]
*** xref:user-guide/reports/sunburst.adoc[Sunburst]
*** xref:user-guide/reports/circle-packing.adoc[Circle Packing]
*** xref:user-guide/reports/choropleth.adoc[Choropleth]
*** xref:user-guide/reports/areamap.adoc[Area Map]
*** xref:user-guide/reports/treemap.adoc[Treemap]
*** xref:user-guide/reports/radar.adoc[Radar Chart]
*** xref:user-guide/reports/sankey.adoc[Sankey Chart]
*** xref:user-guide/reports/gantt.adoc[Gantt Chart]
*** xref:user-guide/reports/map.adoc[Map]
*** xref:user-guide/reports/single-value.adoc[Single Value]
*** xref:user-guide/reports/gauge-chart.adoc[Gauge Chart]
*** xref:user-guide/reports/raw-json.adoc[Raw JSON]
*** xref:user-guide/reports/parameter-select.adoc[Parameter Select]
*** xref:user-guide/reports/form.adoc[Form]
*** xref:user-guide/reports/iframe.adoc[iFrame]
*** xref:user-guide/reports/markdown.adoc[Markdown]
** xref:user-guide/publishing.adoc[Publishing]
** xref:user-guide/bloom-integration.adoc[Bloom Integration]
** xref:user-guide/extensions/index.adoc[Extensions]
*** xref:user-guide/extensions/advanced-visualizations.adoc[Advanced Visualizations]
*** xref:user-guide/extensions/rule-based-styling.adoc[Rule-Based Styling]
*** xref:user-guide/extensions/report-actions.adoc[Report Actions]
*** xref:user-guide/extensions/natural-language-queries.adoc[Text2Cypher - Natural Language Queries]
*** xref:user-guide/extensions/forms.adoc[Forms]
*** xref:user-guide/extensions/access-control-management.adoc[Access Control Management]
** xref:user-guide/faq.adoc[FAQ]
* xref:developer-guide/index.adoc[Developer Guide]
** xref:developer-guide/build-and-run.adoc[Build & Run]
** xref:developer-guide/deploy-a-build.adoc[Deploy a Build]
** xref:developer-guide/configuration.adoc[Configuration]
** xref:developer-guide/standalone-mode.adoc[Standalone Mode]
** xref:developer-guide/component-overview.adoc[Component Overview]
** xref:developer-guide/design.adoc[Design]
** xref:developer-guide/style-configuration.adoc[Style Configuration]
** xref:developer-guide/adding-visualizations.adoc[Adding Visualizations]
** xref:developer-guide/state-management.adoc[State Management]
** xref:developer-guide/session-storage.adoc[Session Storage]
** xref:developer-guide/testing.adoc[Testing]
** xref:developer-guide/contributing.adoc[Contributing]



================================================
FILE: docs/modules/ROOT/pages/banner.adoc
================================================
[NOTE]
====
This documentation pertains to the unsupported version of NeoDash, as part of Neo4j Labs.
For users of the supported NeoDash offering, refer to https://neo4j.com/docs/neodash-commercial/[NeoDash commercial].

====

================================================
FILE: docs/modules/ROOT/pages/developer-guide/adding-visualizations.adoc
================================================
include::../banner.adoc[]

= Adding Visualizations

include::../banner.adoc[]

You can extend NeoDash with your own visualizations without diving deep
into the core application. Likewise, adding a new customization to an
existing report requires minimal changes.

== Add a Visualization

You can add a new chart to NeoDash in three steps:

[arabic]
. Make sure you have a local copy of NeoDash installed and running:

....
git clone git@github.com:neo4j-labs/neodash.git
git checkout develop
yarn install
yarn run dev
....

[arabic, start=2]
. Create a new file `src/charts/ABCChart.tsx`. In here, add a new object
that implements the `ChartProps` interface:

....
export interface ChartProps {
   records: Neo4jRecord[]; // Query output, Neo4j records as returned from the driver.
   selection?: Record<string, any>; // A dictionary with the selection made in the report footer.
   settings?: Record<string, any>; // A dictionary with the 'advanced settings' specified through the NeoDash interface.
   dimensions?: Number[]; // a 2D array with the dimensions of the report (likely not needed, charts automatically fill up space).
   fullscreen?: boolean; // flag indicating whether the report is rendered in a fullscreen view.
   queryCallback?: (query: string, parameters: Record<string, any>, records: Neo4jRecord[]) => null; // Optionally, a way for the report to read more data from Neo4j.
   setGlobalParameter?: (name: string, value: string) => void; // Allows a chart to update a global dashboard parameter to be used in Cypher queries for other reports.
   getGlobalParameter?: (name) => string; // Allows a chart to get a global dashboard parameter.
}
....

Note that the only mandatory property is `records`. This contains a list
of
https://neo4j.com/docs/api/javascript-driver/current/class/lib6/record.js~Record.html[records]
returned from the Cypher query specified by the user.

For inspiration, below is a basic example of a component that renders
all returned data as a list:

....
import React from 'react';
import { ChartProps } from './Chart';
import { renderValueByType } from '../report/ReportRecordProcessing';

const NeoListReport = (props: ChartProps) => {
   const records = props.records;
   return records.map(r => {
       return <div>{
           r["_fields"].map(value => {
               return <>{renderValueByType(value)},</>
           })}
       </div>
   })
}

export default NeoListReport;
....

[arabic, start=3]
. Make your component selectable. Now that you’ve created a new chart
type, you need to tell the card settings window that it can be chosen by
a user.

To accomplish this, open `config/ReportConfig.tsx`. Add a new entry to
the `REPORT_TYPES` dictionary:

....
export const REPORT_TYPES = {
   ...
   "list": {
       label: "List",
       helperText: "I'm a list",
       component: NeoListReport,
       maxRecords: 10,
       settings: {}
   },
   ...
}
....

Inspect the other entries for examples of the fields that each entry can
have. Restart the application, and you should be able to select your new
chart type. Finally, *Cypress* can be used to develop an end-to-end test
for your component in a matter of minutes. See Testing for more on
Cypress testing.

____
After you added a visualization or a new customization, consider
contributing it to the NeoDash project by creating a
https://github.com/neo4j-labs/neodash/pulls[Pull Request].
____


================================================
FILE: docs/modules/ROOT/pages/developer-guide/build-and-run.adoc
================================================
include::../banner.adoc[]

= Build & Run

include::../banner.adoc[]

To start developing the application, you will need to set up the
development environment.

== Run & Build using yarn

NeoDash is built with React. You will need `yarn` installed to run the web
app.

____
Use a recent version of `yarn` and `node` to build NeoDash. The
application has been tested with yarn 1.22.17 & node v18.8.0.
____

To run the application in development mode: 

- https://github.com/neo4j-labs/neodash[clone this repository.]
- open a terminal and navigate to the directory you just cloned. 
- run `yarn install` to install the necessary dependencies. 
- run `yarn run dev` to run the app in development mode. 
- the application should be available at http://localhost:3000.

To build the app for production: 

- follow the steps above to clone the repository and install dependencies. 
- execute `yarn run build`. This will create a `build` folder in your project directory. 
- deploy the contents of the build folder to a web server. You should then be able to run the web app.

== Run locally with Docker

Pull the latest image from Docker Hub to run the application locally:

....
# Run the application on http://localhost:5005
docker pull neo4jlabs/neodash:latest
docker run -it --rm -p 5005:5005 neo4jlabs/neodash

# If you want to run on a custom port, set an environment variable
export NGINX_PORT=5008
docker run -it --rm -e NGINX_PORT=5008 -p 5008:5008 neo4jlabs/neodash
....

____
Windows users may need to prefix the `docker run` command with `winpty`.
____

== Build Docker image

A pre-built Docker image is available
https://hub.docker.com/r/neo4jlabs/neodash[on DockerHub]. This image
is built using the default configuration (running in editor mode,
without SSO).

=== To build the image yourself:

Make sure you have a recent version of `docker` installed to build the
multi-stage NeoDash image and run it.

On Unix (Mac/Linux) systems:

....
docker build . -t neodash
....

If you use Windows, you might need to prefix the command with `winpty`:

....
winpty docker build . -t neodash
....

After building, you can run the image with:
....
docker run -it –rm -p 5005:5005 neodash
.... 

== Run on Kubernetes

=== To deploy using YAML files

YAML examples are available in the https://github.com/neo4j-labs/neodash[NeoDash repository]. Here is an example of a pod definition YAML file to create a NeoDash pod in a cluster:

....
apiVersion: v1
kind: Pod
metadata:
  name: neodash
  labels:
    project: neodash
spec:
  containers:
    - name: neodash
      image: neo4jlabs/neodash:latest
      ports:
        - containerPort: 5005
....


Creating a Kubernetes service to expose the application:
....
apiVersion: v1
kind: Service
metadata:
    name: neodash-svc
spec:
    type: LoadBalancer
    ports:
    - port: 5005
      targetPort: 5005
    selector:
      project: neodash
....

=== To deploy using a Helm Charts

A Kubernetes Helm chart is available in the https://github.com/neo4j-labs/neodash[the NeoDash repository] and here is the full example of the Helm chart values.yaml file,

....
# Name override or full name override
nameOverride: ''
fullnameOverride: neodash-test

# Number of pods
replicaCount: 1

# Image Details
image:
  repository: neo4jlabs/neodash
  pullPolicy: IfNotPresent
  tag: 'latest'
imagePullSecrets: [] # Image pull secret if any

# Pod annotations, labels and security context
podAnnotations: {}
podLabels: {}
podSecurityContext: {}

# Mode configuration using environment variables
# Set reader mode environment variables when enable_reader_mode is true
enable_reader_mode: true
env: 
  - name: "ssoEnabled"
    value: "false"
  - name: "standalone"
    value: "true"
  - name: "standaloneProtocol"
    value: "neo4j+s"
  - name: "standaloneHost"
    value: "localhost"
  - name: "standalonePort"
    value: "7687"
  - name: "standaloneDatabase"
    value: neo4j
  - name: "standaloneDashboardName"
    value: "test"
  - name: "standaloneDashboardDatabase"
    value: neo4j
  - name: "standaloneAllowLoad"
    value: "false"
  - name: "standaloneLoadFromOtherDatabases"
    value: "false"
  - name: "standaloneMultiDatabase"
    value: "false"

# Environment variable from secret
envFromSecrets: []
  # standaloneUsername: 
      # secretName: "neo4j-connection-secrets"
      # key: "username"
  # standalonePassword: 
      # secretName: "neo4j-connection-secrets"
      # key: "password"

# Service details
service:
  type: LoadBalancer # Can also be ClusterIP or NodePort  
  port: 5005 # For the service to listen in for Traffic
  targetPort: 5005 # Target port is the container port
  annotations: {} # Service annotations for the LoadBalance

# Ingress
ingress:
  enabled: false # Enable Kubernetes Ingress
  className: 'alb' # Class Name
  annotations: {} # Cloud LoadBalancer annotations
  hosts: []
    # - host: neodash.example.com
    #   paths:
    #     - path: '/'
    #       pathType: Prefix
  tls: []

# Pod resources request, limits and health check
resources: 
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"
livenessProbe:
  httpGet:
    path: /*
    port: 5005
readinessProbe:
  httpGet:
    path: /*
    port: 5005

# Pod Autoscaler
autoscaling:
  enabled: false
  # minReplicas: 1
  # maxReplicas: 100
  # targetCPUUtilizationPercentage: 80

# Pod Volumes
volumes: []
volumeMounts: []

# Service Account
serviceAccount:
  create: true
  automount: true
  # annotations: {}
  # name: ''
....

================================================
FILE: docs/modules/ROOT/pages/developer-guide/component-overview.adoc
================================================
include::../banner.adoc[]

= Component Overview

include::../banner.adoc[]

The image below contains a high-level overview of the component
hierarchy within the application. The following conceptual building
blocks are used to create the interface:

image::component-hierarchy.png[NeoDash Component Hierarchy]

* *Application* - highest level in the component structure. Handles all
application-level logic (e.g. initalizing the app).
* *Modals* - all pop-up windows used by the tool. (Connection modal,
save-dashboard modal, errors/warnings, etc.)
* *Drawer* - the sidebar on the left side of the screen. Contains
buttons to perform application-level actions.
* *The Dashboard* - Main dashboard component. Renders components
dynamically based on the current state.
* *Dashboard Header* - the textbox at the top of the screen that lets
you set a title for the dashboard, plus the page selector.
* *Pages* - a dashboard has one or more pages, each of which can have a
list of cards.
* *Cards* - a `block' inside a dashboard. Each card contains a `view'
window, and a `settings' window.
* *Card View* - the front of the card containing the selected report.
* *Card Settings* - the back of the card, containing the cypher editor
and advanced settings for the report.
* *Card View Header* - the header of the card, containing a text box
that acts as the name of the report.
* *Report* - the component inside the card view that handles query
execution and result parsing. Contains a single chart (visualization)
* *Card View Footer* - The footer of the card view. Depending on the
type, contains several `selectors' that modify the visualization.
* *Card Settings Header* - Header of the card settings, used for
moving/deleting the card.
* *Card Settings Content* - the component containing the main content of
the report. This is most often the Cypher query editor.
* *Card Settings Footer* - the `footer' of the card. This contains the
`advanced settings' window for reports.
* *Charts* - the different visualizations used by the application: bar
charts, tables, graphs, etc.


== A note on Cards v.s. Reports

Whereas a user might associate a Card in NeoDash to a report directly,
the application has a more nuanced seggration of responsibilities:

* The *Card* is responsible for positioning the component in a page.
* The *Card Content* is the core element of the card (exclusive of the
title header and any optional footer).
* A *Report* sits inside the card content, and handles the running of
queries and displaying errors.
* A *Chart* is rendered by the report and is solely responsible for
rendering a specific visualization.


================================================
FILE: docs/modules/ROOT/pages/developer-guide/configuration.adoc
================================================
include::../banner.adoc[]

= Configuration

include::../banner.adoc[]

When using a custom NeoDash deployment, there are several settings that
can be configured. These mostly relate to
link:../standalone-mode[Standalone Mode] and SSO configurations.

For a simple (non-Dockerized) deployment, these configuration parameters
can be changed by modifying `dist/config.json` after you have built the
application. When Docker image, these can be passed as environment
variables. See link:../standalone-mode[Standalone Mode] for more on
Docker deployments.

An example configuration for NeoDash (default, running in editor mode)
will look like this:

....
{
    "ssoEnabled": false,
    "ssoProviders": [],
    "ssoDiscoveryUrl": "https://example.com",
    "standalone": false,
    "standaloneProtocol": "neo4j+s",
    "standaloneHost": "localhost",
    "standalonePort": "7687",
    "standaloneDatabase": "neo4j",
    "standaloneDashboardName": "My Dashboard",
    "standaloneDashboardDatabase": "dashboards",
    "standaloneDashboardURL": "",
    "standaloneAllowLoad": false,
    "standaloneLoadFromOtherDatabases": false,
    "standaloneMultiDatabase": false,
    "standaloneDatabaseList": "neo4j"    
    "loggingMode": "0",
    "loggingDatabase": "logs",
    "customHeader": "",
}
....

== Configuration Options

[width="100%",cols="19%,17%,26%,38%",options="header",]
|===
|Name |Type |Default Value |Description
|ssoEnabled |boolean |false |If enabled, lets users connect to Neo4j
using SSO. This requires a
valid ssoDiscoveryUrl to be set.

|ssoProviders |List |[] |When using multiple SSO providers on the database, you can configure the list of providers (by id) to be used on Neodash. If empty, all providers will be displayed.

|ssoDiscoveryUrl |string |https://example.com |If ssoEnabled is true &
standalone mode is enabled, the URL to retrieve SSO auth config from.

|standalone |boolean |false |Determines whether to run NeoDash in editor
mode (false), or reader mode (true). The terms ``Reader mode'' and
``Standalone mode'' are used interchangibly.

|standaloneProtocol |string |neo4j |When running in standalone mode, the
protocol to used for the Neo4j driver. This should be set to one of
`neo4j`, `neo4j+s`, `neo4j+ssc`, `bolt`, `bolt+s`, or `bolt+ssc`.

|standaloneHost |string |localhost |When running in standalone mode, the
hostname to connect to. This should be *just* the hostname, no protocols
or ports.

|standalonePort |string |7687 |When running in standalone mode, the Bolt
port to connect to.

|standaloneDatabase |string |neo4j |When running in standalone mode, the
database to use for reporting. Cypher queries used in reports will read
data from this database.

|standaloneUsername ⚠️ |string |… |A hidden config parameter enables you
to set the username for standalone mode by default. Keep in mind this is
a security risk, as it exposes the Neo4j username to anyone who can
access the NeoDash deployment.

|standalonePassword ⚠️ |string |… |A hidden config parameter enables you
to set the password for standalone mode by default. If this value is set
connections are also made automatically. Keep in mind this is a security
risk, as it exposes the Neo4j username to anyone who can access the
NeoDash deployment.

|standaloneDashboardName |string |My Dashboard |The exact name
(case-sensitive) of the dashboard to be loaded when running in
standalone mode. This must be a dashboard that is saved as a node in the
graph.

|standaloneDashboardDatabase |string |neo4j |The name of the Neo4j
database that contains the saved dashboard node. This is neo4j by
default, _unless you are using Neo4j Enterprise Edition_, which lets you
use multiple databases.

|standaloneDashboardURL |string |neo4j |If you do not save a dashboard
inside Neo4j and would like to run a standalone mode deployment with a
dashboard from a URL, set this parameter to the complete URL pointing to
the dashboard JSON.

|standaloneAllowLoad |boolean |false |If set to yes the "Load Dashboard"
button will be enabled in standalone mode, allowing users to load
additional dashboards from Neo4J. This parameter is false by default 
_unless you are using Neo4j Enterprise Edition_, which lets you use multiple 
databases.
*NOTE*: when Load is enabled in standalone mode, only Database is available
as a source, not file.

|standaloneLoadFromOtherDatabases |boolean |false |If _standaloneAllowLoad_ is
set to true, this parmeter enables or not users to load dashboards from
other databases than the one deifned in _standaloneDashboardDatabase_. If
_standaloneAllowLoad_ is set to false this parameters has no effect.

|standaloneMultiDatabase |boolean |false |If this parameter set to true, the
standalone configuration will ignore the _standaloneDatabase_ parameter and
allow users to choose which database to connect to in the login screen, among
the ones provided in _standaloneDatabaseList_, with a dropdown list. This
parameter is false by default _unless you are using Neo4j Enterprise Edition_,
which lets you use multiple databases.

|standaloneDatabaseList |string |neo4j |If _standaloneMultiDatabase_ is
set to true, this parmeter must contain a comma separated list of database
names that will be displayed as options in the Database dropdown at user
login (e.g. 'neo4j,database1,database2' will populate the database dropdown
with the values 'neo4j','database1' and 'database2' in the connection screen).
If _standaloneMultiDatabase_ is set to false this parameters has no effect. 

|loggingMode |string |none |Determines whether neodash should create any
user activity logs. possible values include: `0` (no log is created), 
`1` (user login are tracked), `2` (tracks when a specific dashboard is 
accessed/loaded or saved by a user*). 

⚠️ Logs are created in Neo4J DB using the current user credentials 
(or standaloneUsername if configured); write access to the log database 
must be granted to enble any user to create logs.

⚠️ * Load/Save from/to file are not logged (only from/to Database)   

|loggingDatabase |string |logs |When loggingMode is set to anything 
else than '0', the database to use for logging. Log records (nodes)
will be created in this database.

|customHeader |string |none |When set the dashboard header will display
the prameter value as a fixed string, otherwise it will display the host 
and port of current connection.
|===

== Configuring SSO

NeoDash can use SSO as an alternative for password-based sign-in, if
your Neo4j database is enabled to use single sign on. To enable SSO, set
`ssoEnabled` to `true`. Then, set `ssoDiscoveryUrl` to the place where
your `discovery.json` is located (This will often be the hostname of
your database, appended by `/discovery.json`).

____
Note that SSO is only available when Standalone Mode is enabled.
____

== Auth Provider

To set up NeoDash to use an external identity provider, you can add a
/auth_provider resource to nginx (in `/conf/default.conf`):

....
location /auth_provider {
        default_type application/json;
        return 200 '{
                        "auth_config" : {
                            "oidc_providers" : [ ... ]
                        }
                    }';
    }
....

For basic deployments it might suffice to route requests to
`/auth_provider` on the https port of the neo4j database.

== Configuring Standalone Mode

Standalone mode, or reader-mode, overrides the functionality of NeoDash,
allowing you to deploy a fixed dashboard to users. Standalone mode can
be enabled by changing the `standalone` config parameter:

* If standalone mode is `false`, all other configuration parameters are
ignored. NeoDash will run in Editor mode, and require a manual sign-in.
* If standalone mode is `true`, NeoDash will read all configuration
parameters. A *predefined dashboard* will be auto-loaded, and no changes to
the dashboard can be made. There are two types of valid standalone
deployments:
** A standalone deployment that *reads the fixed dashboard from Neo4j*.
The `standaloneDashboardName` and `standaloneDashboardDatabase` config
parameters are used to define these.
** A standalone deployment that *reads the fixed dashboard from a URL*.
The `standaloneDashboardURL` config parameter is used to define this.

* Standalone mode can also be configured to allow users load a different
dashboard after the predefined one is loaded (a `Load Dashboard` button
will be displayed on the right side of dashboard title). 
The `standaloneAllowLoad` and `standaloneLoadFromOtherDatabases` are used
to define this.
* When allowing users to load dashboards dyamically in standalone mode,
they may also need to connect to different databases, depending on the
specific dashboard bing loaded. this can be enabled setting 
`standaloneMultiDatabase` to true and providing a comma separated list
of the allowed database names in the`standaloneDatabaseList` parameter.



================================================
FILE: docs/modules/ROOT/pages/developer-guide/contributing.adoc
================================================
include::../banner.adoc[]

= Contributing

include::../banner.adoc[]

Contributions to the project are highly welcomed. Please consider
creating a https://github.com/neo4j-labs/neodash/pulls[Pull Request].
Ensure you start from the `develop` branch, and set the merge base to
`develop` as well.

For your feature to be accepted, ensure: 

1. The component is tested (if relevant, see Testing). 
2. Your code is aligned with
https://www.w3.org/wiki/JavaScript_best_practices[JS Best Practices]. 
3. The component is well documented in the documentation portal (if
applicable).

== Feature Requests / Bugs

If you have a request for a feature, or have found a bug, consider
creating an https://github.com/neo4j-labs/neodash/issues[issue] on
GitHub. Please include a link:./testing#debug-report[Debug Report] if
available.


================================================
FILE: docs/modules/ROOT/pages/developer-guide/deploy-a-build.adoc
================================================
= Deploy a Build

include::../banner.adoc[]

If you have a pre-built NeoDash application, you can easily deploy it on an any webserver.
A NeoDash build is "just" a collection of HTML, CSS and JavaScript files, so it can run virtually anywhere.

This guide walks you through the process of deploying a NeoDash build onto your own webserver.

== 1. Prepare the files
First, check that you have the correct files.
We typically provide builds as either a zip file or tarball with the following naming convention: 
`neodash-2.X.X.zip` or `neodash-2.X.X.tar.gz`.

For zip files, open up the terminal and run:
```bash
unzip neodash-2.X.X.zip
```

For tar.gz files, open up the terminal and run:
```bash
tar -xf neodash-2.X.X.tar.gz
```

After running either of these, you should now have a folder `neodash-2.X.X` in the current directory.

== 2. Edit Configuration (Optional)
This is an optional step if you want to configure optional settings for your NeoDash deployment (e.g. SSO or standalone mode).

1. Inside the folder you just unzipped, open up `config.json`. 
2. Edit this file to modify your link:../configuration[Configuration] settings.
3. Save the file.
4. Inside the folder you just unzipped, open up `style.config.json`.
5. Edit this file to modify your link:../styleConfiguration[Style Configuration] settings.
6. Save the file

== 3. Move the tarball/zip to your webserver
Finally, copy the files to the correct folder on your webserver.
Depending on the webserver type and version, this could be different directory.
As an example - to copy the files to an nginx webserver using `scp`:

```bash
scp neodash-2.4.11-labs username@host:/usr/share/nginx/html
```

NeoDash should now be visible by visiting your (sub)domain in the browser.
 Can't see the application? Check that the webserver user has read-permissions on the files you copied into the HTML directory.

================================================
FILE: docs/modules/ROOT/pages/developer-guide/design.adoc
================================================
include::../banner.adoc[]

= Design

include::../banner.adoc[]


This page contains some key guidelines for design of the application.
This entails code architecture, as well as UX/UI design.

== File Structure

The source code of NeoDash is organized as a flat file structure based
on components. Given a component `ABC` is to be added, you should create
a directory called `abc` with the following files:

* `ABC.tsx` (component renderer)
* `ABCActions.ts` (objects defining state manipulation)
* `ABCReducer.ts` (handling state changes based on actions)
* `ABCSelectors.ts` (used by components to retrieve part of the state)
* `ABCThunks.ts` (Complex state handling logic, to fire one or more
actions)

=== Structure of the other folders

....
conf: nginx configuration for Docker image.
dist: directory for generated webpack files.
node_modules: downloaded dependencies
public: style files/images. Runtime app config.
scripts: utility scripts for deployment.
src: source code. 
target: compiled package as tgz file.
.babelrc: javascript compiled settings.
.gitignore: gitignore files.
Dockerfile: docker image definition.
....

== UX Design

At it’s core, NeoDash aims to be a tool that is _easy to learn, but hard
to master_. This translates into the following five design principles in
mind:

[arabic]
. Use a limited set of core visualizations, with high customizability.
. It should be easy to get started without reading documentation.
. The tool should be self-documenting.
. Complex data transformations should be done by dashboard builders in
Cypher, and not by the application.
. The tool should be easy to extend with custom visualizations.


================================================
FILE: docs/modules/ROOT/pages/developer-guide/index.adoc
================================================
include::../banner.adoc[]

= Developer Guide

include::../banner.adoc[]


This guide contains information for developers looking to deploy NeoDash, or extend it for their own needs. 

- link:build-and-run[Build & Run] 
- link:configuration[Configuration]
- link:standalone-mode[Standalone Mode] 
- link:component-overview[Component Overview] 
- link:design[Design]
- link:style-configuration[Style Configuration]
- link:adding-visualizations[Adding Visualizations] 
- link:state-management[State Management] 
- link:testing[Testing]
- link:contributing[Contributing]

== Prerequisites for extending NeoDash

NeoDash is a web application written in TypeScript. Knowledge of React &
Redux is also highly recommended when extending the application.
Concretely, the following languages and frameworks make up the core of
NeoDash: 

- https://reactjs.org/[React] 
- https://redux.js.org/[Redux] 
- https://redux.js.org/usage/writing-logic-thunks[Redux Thunks] 
- https://www.cypress.io/[Cypress] 
- https://mui.com/[Material UI] 
- https://webpack.js.org/[Webpack]

The following core libraries are used to build the visualizations for
reports: 

- https://github.com/vasturiano/react-force-graph[react-force-graph
(Graph)] 
- https://mui.com/components/data-grid/[@mui/datagrid (Table)]
- https://nivo.rocks/[@nivo (Bar, Line, Pie charts)] 
- https://leafletjs.com/[leaflet (Map)] 
- https://github.com/remarkjs/react-markdown[react-markdown (Markdown)]


================================================
FILE: docs/modules/ROOT/pages/developer-guide/session-storage.adoc
================================================
include::../banner.adoc[]

= Session Storage

include::../banner.adoc[]

This reducer serves only to store data that we want to reset at each new session.
To connect to it, just define a key and use the predefined actions to set a new pair (key,value) inside of it. 
Inside the actions there is also an action to delete all the keys that match a precise prefix, it can be useful, for example, to wipe the sessionStorage state for a certain extension, if it stores the data inside the sessionStorage using a prefix (for example look at the query-translator extension at getSessionStorageHistoryKey).

================================================
FILE: docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc
================================================
include::../banner.adoc[]

= Standalone Mode

include::../banner.adoc[]

Next to being a dashboard editor, NeoDash can be deployed in a
`standalone mode' - allowing you set up a architecture to publish and
read dashboards.

Running in standalone modec mode will: 

- Disable all editing options 
- Have a hardcoded Neo4j URL and database name 
- Load a dashboard from Neo4j with a fixed name.

The diagram below illustrates how NeoDash standalone mode can be
deployed next to a standard `Editor Mode' instance:

image:standalone-architecture.png[image]

== Option 1 - Standard Deployment (Non-Docker)

First, build NeoDash as described link:../build-and-run[here]. After
building, you’ll have a `dist` directory that you can deploy to a web
server.

To configure the app to run in standalone mode, you’ll need to edit
`dist/config.json` and change the `standalone` property to `true`. The
other variables inside `config.json` should also be configured to match
the hostname, port and database name of your Neo4j instance. See
Configuration for more on configuration variables.

As `config.json` gets picked up at runtime by the application, users
viewing the application will now access the dashboard in standalone
mode.

== Option 2 - Docker Deployment

You can configure the app to run in standalone by passing environment
variables to Docker:

....
docker run  -it --rm -p 5005:5005 \
    -e ssoEnabled=false \
    -e ssoProviders=[] \
    -e ssoDiscoveryUrl="https://example.com" \
    -e standalone=true \
    -e standaloneProtocol="neo4j+s" \
    -e standaloneHost="localhost" \
    -e standalonePort="7687" \
    -e standaloneDatabase="neo4j" \
    -e standaloneDashboardName="My Dashboard" \
    -e standaloneDashboardDatabase="dashboards" \
    -e standaloneDashboardURL="dashboards" \
    -e standaloneAllowLoad=false \
    -e standaloneLoadFromOtherDatabases=false \
    -e standaloneMultiDatabase=false \
    -e standaloneDatabaseList="neo4j" \
    neo4jlabs/neodash
....

Make sure that all of the environment variables are set to the correct
values. This is described in more detail link:../configuration[here].

____
Alternatively, environment variables from docker compose or a kubernetes
deployment can be used.
____

== Deep Linking
To dynamically view a deployed NeoDash dashboard, you can deep-link into a deployed dashboard.
 the following deeplinking options are available via URL parameters:
- Appending `?page=1` to the URL will open up a dashboard at a given page. (Starting at zero).
- Appending `?neodash_person_name=Tom` to the URL will set a dashboard parameter as a default for the entire dashboard.

Multiple parameters can be used in a deep-link by concatinating them:
....
https://myneodashdeployment.com/?page=1&neodash_person_name=Tom&neodash_movie_name=The%20Matrix
....


================================================
FILE: docs/modules/ROOT/pages/developer-guide/state-management.adoc
================================================
include::../banner.adoc[]

= State Management

include::../banner.adoc[]

NeoDash is an application with a complex internal state. If you are
planning to extend the application state in some way, make sure you are
familiar with https://redux.js.org/[Redux] design patterns.

The app’s entire state object is encapsulated in the following JSON
structure:

....
{
  "dashboard": {
    "title": "My Dashboard Name",
    "version": "2.4",
    "settings": {
      "pagenumber": 0,
      "editable": true,
      ...
      "parameters": {
          ...
       }
    },
    "pages": [
        ...
    ]
  },
  "application": {
        ...
   },
  "version": "2.1.0"
}
....

At the highest level, this object consists of three entries: 

- `dashboard`: all state related to the currently active dashboard. This
is changed when a dashboard gets loaded, modified or removed. 
- `application`: all state related to the application itself. This
describes which windows are open, what database you are connected to,
etc. 
- `version`: the version of NeoDash that is running. Note that
these are complete version numbers (of the shape X.Y.Z), unlike
dashboard versions, which have a different versioning scheme.

____
Want to see the complete state object for your application? Generate a
*Debug Report* from the About window.
____

== Dashboard State

The dashboard entry contains the entire state of the currently loaded
dashboard. Take the following simple dashboard as an example.

....
{
  "dashboard": {
    "title": "A Simple Dashboard",
    "version": "2.4",
    "settings": {
      "pagenumber": 0,
      "editable": true,
      "fullscreenEnabled": true,
      "parameters": {
          "neodash_person_name": "Bob"
       }
    },
    "pages": [
        {
          title: “My Page”
          reports: [
            {
                "title": "My Report",
                "query": "MATCH (n)-[e]->(m) RETURN n,e,m",
                "type": "graph",
                "x": "1",
                "y": "2",
                "width": "6",
                "height": "3",
                "settings": {
                    "nodeColorSchmeme": "blue"
                }
            }
        ]
     }
    ]
  }
}
....

Key entries of the object are: 

- `title`: the title of the dashboard. This is displayed on the top of the window. 
- `version`: _Main_ version of the dashboard that is loaded. 
- `settings`: contains settings for the dashboard. This includes the current page number, whether the dashboard
is editable, whether the dashboard is in fullscreen mode, and the
dashboard parameters that are currently set. 
- `pages`: contains the list of all pages in the dashboard. Each page has a title and a list of
reports.

== Application State

The application state is a flat dictionary of values that determine what
the user’s window looks like (which windows are open?) as well as the
current database connection, and whether the app is running in
standalone mode.

....
"application": {
    "notificationTitle": null,
    "notificationMessage": null,
    "connectionModalOpen": false,
    "welcomeScreenOpen": true,
    "aboutModalOpen": true,
    "connection": {
      "protocol": "neo4j+s",
      "url": "localhost",
      "port": "",
      "database": "",
      "username": "neo4j",
      "password": "************"
    },
    "desktopConnection": null,
    "connected": false,
    "dashboardToLoadAfterConnecting": null,
    "waitForSSO": false,
    "standalone": false,
    "oldDashboard": null,
    "ssoEnabled": false,
    "ssoProviders": [],
    "ssoDiscoveryUrl": "https://example.com",
    "standaloneProtocol": "neo4j+s",
    "standaloneHost": "localhost",
    "standalonePort": "7687",
    "standaloneDatabase": "neo4j",
    "standaloneDashboardName": "My Dashboard",
    "standaloneDashboardDatabase": "dashboards",
    "standaloneDashboardURL": "dashboards",
    "loggingMode": "0",
    "loggingDatabase": "logging",
    "standaloneAllowLoad": false,
    "standaloneLoadFromOtherDatabases ": false,
    "standaloneMultiDatabase": false,
    "standaloneDatabaseList": "neo4j",
    "notificationIsDismissable": null
}
....


================================================
FILE: docs/modules/ROOT/pages/developer-guide/style-configuration.adoc
================================================
include::../banner.adoc[]

= Style Configuration

include::../banner.adoc[]

When using a custom NeoDash deployment, there are several theme variables that
can be configured. These mostly relate to css tokens for
link:https://cdn.jsdelivr.net/npm/@neo4j-ndl/base@1.4.0/lib/tokens/css/tokens.css[Needle] and some other brand specific options.

For a simple (non-Dockerized) deployment, these configuration parameters
can be changed by modifying `dist/style.config.json` after you have built the
application. When using the NeoDash Docker image, these can be passed as environment
variables. For example:

....
docker run -p 5005:5005 \
 -e DASHBOARD_HEADER_BRAND_LOGO=https://picsum.photos/500/100 \
 neo4jlabs/neodash
....

An example configuration for NeoDash

....
{
  "DASHBOARD_HEADER_BRAND_LOGO": "logo_lightsand.png",
  "DASHBOARD_HEADER_COLOR" : "#F3F3F0",
  "DASHBOARD_HEADER_BUTTON_COLOR" : "#009999",
  "DASHBOARD_HEADER_TITLE_COLOR" : "#00C1B6",
  "DASHBOARD_PAGE_LIST_COLOR" : "#F3F3F0",
  "DASHBOARD_PAGE_LIST_ACTIVE_COLOR": "#009999",
  "style": {
    "--palette-light-neutral-bg-weak" : "243, 243, 240"
  }
}
....

== Configuration Options

[width="100%",cols="19%,17%,26%,38%",options="header",]
|===
|Name |Type |Default Value |Description
|DASHBOARD_HEADER_BRAND_LOGO |string |undefined |This variable defines the name of the logo file located on the public folder of the Neodash deployment, if you want your own logo instead of the Neo4j one.

|DASHBOARD_HEADER_COLOR |string |#0B297D |Determines the color of the header.

|DASHBOARD_HEADER_BUTTON_COLOR |string |#FFFFFF22 |Determines the color of the header buttons.

|DASHBOARD_HEADER_TITLE_COLOR |string |#FFFFFF |Determines the color of the header title.

|DASHBOARD_PAGE_LIST_COLOR |string |#F0F0F0 |Determines the color of the page selector tabs.

|DASHBOARD_PAGE_LIST_ACTIVE_COLOR |string |#FFFFFF |Determines the color of the page selector active tabs.

|style |object |{} | Determines css needle tokens that should be overridden at the root level. Colors should be defined with an rgb comma separated string (e.g "243, 243, 240")


|===


================================================
FILE: docs/modules/ROOT/pages/developer-guide/testing.adoc
================================================
include::../banner.adoc[]

= Testing 

include::../banner.adoc[]

NeoDash uses *Cypress* for automated testing. To install Cypress, check
out the official
https://docs.cypress.io/guides/getting-started/installing-cypress#What-you-ll-learn[installation
instructions].

After cypress is installed, you can use:

....
yarn run test
....

To open the Cypress GUN. Alternatively, use:

....
yarn run test-headless
....

To run Cypress from the UI.

Before starting the tests, make sure you have a local instance of
NeoDash running at `http://localhost:3000` using `yarn run dev`.

image:cypress.png[Cypress] Above: a screenshot of the Cypress GUI.

== Debug Report

For ad-hoc testing, a debug report can be generated by NeoDash. This
report contains a JSON representation of the current state of the
NeoDash application.

To generate a debug report, open the `About' screen. Then, click the
'Debug Report' button in the bottom left corner.

image::about.png[About]


================================================
FILE: docs/modules/ROOT/pages/index.adoc
================================================
include::/banner.adoc[]

= Introduction

This portal contains information on getting started with NeoDash - A Low-Code Dashboard Builder for Neo4j.

NeoDash is an open source tool for visualizing your Neo4j data. It lets you group visualizations together as dashboards, and allow for interactions between reports.


image::dashboard.png[Dashboard]

Neodash supports presenting your data as tables, graphs, bar charts, line charts, maps and more. It contains a Cypher editor to directly write the Cypher queries that populate the reports. You can save dashboards to your database, and share them with others.

- To get started, see the link:quickstart[Quickstart] page.
- For more on building dashboards, visit the link:user-guide[User Guide].
- For deploying, configuring and extending NeoDash, check out the link:developer-guide[Developer Guide].

================================================
FILE: docs/modules/ROOT/pages/quickstart.adoc
================================================
include::/banner.adoc[]

= Quickstart

include::/banner.adoc[]

There are three easy ways to run NeoDash and start dashboarding your Neo4j data:

. The latest version is always available online:
https://neodash.graphapp.io.
. Neo4j Desktop: Install it from the https://install.graphapp.io[Graph
App Gallery].
. Using Docker:
```
docker pull neo4jlabs/neodash:latest
docker run -it --rm -p 5005:5005 neo4jlabs/neodash
```

Or, build it yourself:
```
git clone https://github.com/neo4j-labs/neodash     
yarn install      
yarn run dev
```

NeoDash connects to any recent version of the Neo4j database. (Neo4j 4.0
or later). The quickest way to get started is to create a free cloud
database on https://console.neo4j.io[Neo4j Aura].

To get started with building your own dashboard, see the Dashboards
page.

== NeoDash in Five Minutes

See the video below for tips on how to get started with NeoDash in 5 minutes:
https://www.youtube.com/watch?v=Ygzj0Y4cYm4[image:https://img.youtube.com/vi/Ygzj0Y4cYm4/0.jpg[Youtube
Video]]

See also the link:../user-guide/faq#1-how-can-i-learn-more-about-neodash[list of
blog posts] in the FAQ.


================================================
FILE: docs/modules/ROOT/pages/user-guide/access-control.adoc
================================================
include::../banner.adoc[]

= Access Control

include::../banner.adoc[]

The Access Control feature in NeoDash is a security measure that allows Users with write access or higher privileges to manage who has access to specific dashboards.


== How it Works

Navigate to a specific dashboard and inside the dashboard settings click on the 'Access Control' option in the dashboard sidebar. This opens a modal where users can add labels to the dashboard. These labels are then used to determine which users have access to the dashboard. Please keep in mind that prior to doing this, an administrator needs to provide certain privileges for different user roles for each label in order for this to work.  You can read more about how RBAC works in Neo4j by reading the [Neo4j RBAC documentation](https://neo4j.com/docs/operations-manual/current/authentication-authorization/manage-privileges/).



================================================
FILE: docs/modules/ROOT/pages/user-guide/bloom-integration.adoc
================================================
include::../banner.adoc[]

= Bloom Integration

include::../banner.adoc[]

NeoDash can be linked to Neo4j Bloom perspectives by using
https://neo4j.com/docs/bloom-user-guide/current/bloom-tutorial/deep-links/[Bloom
Deep Links]. This functionality allows you to combine the power of graph
reporting (NeoDash) with intuitive graph exploration (Bloom).

== Bloom Deep-Linking

To link NeoDash to a Bloom perspective, you will need to: 

1. Create a Neo4j Bloom https://neo4j.com/docs/bloom-user-guide/current/bloom-perspectives/bloom-perspectives/[perspective].
2. Define a https://neo4j.com/docs/bloom-user-guide/current/bloom-tutorial/search-phrases-advanced/[Bloom
Search Phrase] for the perspective. 
3. Generate a https://neo4j.com/docs/bloom-user-guide/current/bloom-tutorial/deep-links/#_server_hosted_bloom[Deep
Link] for your perspective and respective search phrase. This requires
that you have a
https://neo4j.com/docs/bloom-user-guide/current/bloom-installation/installation-activation/#installing-server-plugin[Server-hosted
Bloom installation] running. 

4. Use the deep link you created in either:
- an iFrame Report (optionally passing in the dashboard parameters into
the search phrase). 
- a Graph Report (Adding your deep link inside the
`Drilldown Link' field under advanced settings):

image::graphdrilldown.png[Graph Drilldown]


================================================
FILE: docs/modules/ROOT/pages/user-guide/dashboards.adoc
================================================
include::../banner.adoc[]

= Dashboards

include::../banner.adoc[]

In NeoDash, a dashboard consists of several pages, each of which can
consist of multiple reports.

image::dashboardnew.png[Dashboard]

As an example: The screenshot above shows a dashboard with three pages:
`Breweries`, `Beer Ratings` and `Styles`. The dashboard title `My
Beer Database Dashboard 🍺` is displayed on the top of the window.

The first page is selected, and contains three reports, a table, a graph
and a map. Each report can be given their own name, and has exactly one
Cypher query used to populate the report. See Reports for more info on
how reports work.

== Dashboard Management

After startup up NeoDash, you will be given the choice to create a new
dashboard or open an existing one (if available). After being connected,
the buttons on the sidebar can be used to save, load or share a
dashboard.

image::dashboardnewsettings.png[Save/Load/Share Button]

=== Save a Dashboard

A NeoDash dashboard is, simply put, a JSON file. As an example, the
default dashboard has the following structure:

....
{
  "title": "",
  "version": "2.0",
  "settings": {
    "pagenumber": 0,
    "editable": true,
    "fullscreenEnabled": true,
    "parameters": {}
  },
  "pages": [
    {
      "title": "Main Page",
      "reports": [
        {
          "title": "Hi there 👋",
          "query": "**This is your first dashboard!** \n \nYou can click (⋮) to edit this report, or add a new report to get started. You can run any Cypher query directly from each report and render data in a variety of formats. \n \nTip: try _renaming_ this report by editing the title text. You can also edit the dashboard header at the top of the screen.\n\n\n",
          "width": 3,
          "type": "text",
          "height": 3,
          "selection": {},
          "settings": {}
        },
        {
          "title": "",
          "query": "MATCH (n)-[e]->(m) RETURN n,e,m LIMIT 20\n\n\n",
          "width": 3,
          "type": "graph",
          "height": 3,
          "selection": {
            "Movie": "title",
            "Genre": "name"
          },
          "settings": {
            "nodePositions": {}
          }
        }
      ]
    }
  ]
}
....

After opening the save dialog, there are three options for saving your
dashboard: 

1. Save as a file. This triggers a download of the current
dashboard as `.json` file. 
2. Save inside Neo4j. This stores a
stringified representation of the dashboard as a node in the database.
When using Neo4j multi-database, you will be given the choice of which
database to save the dashboard in. 
3. Copy-paste the JSON file directly.

> Keep in mind that your currently active dashboard is stored in the browser cache. If you clear your cache (cookies), the dashboard is gone.

=== Load a Dashboard

Just like in the save screen, a dashboard can be loaded in one of three
ways: 

1. Load from a file. This requires you to select a `.json`
somewhere on your computer. 
2. Load from Neo4j. This requires you to
select a dashboard node stored in the database. When loading from Neo4j,
you will be presented with the list of dashboards in reverse
chronological order. 
3. Loading a JSON file by pasting it directly into
the editor.

=== Share a Dashboard

A dashboard can be shared with other users by generating a direct link
to it. This link will contain: 

- A link to the dashboard (either a
direct URL or the name of the dashboard inside Neo4j). 
- (Optionally),
the credentials of the database that the dashboard is reporting on. *Be
warned*, when using this feature, the share link will contain the
database credentials, which can be a security risk. 
- If the dashboard should be viewed in `editor mode', or `standalone mode'. The latter configures neodash to run in a stripped down UI without any of the editor features enabled.

When creating a NeoDash deployment on a production database, it is not
recommended to use the `Share' feature. Rather, set up a dedicated
standalone deployment of NeoDash. See Publishing for more infomation.

=== Dashboard Access Control
With this feature, you can manage dashboard access by leveraging the native Neo4j Role-based Access Control (RBAC) functionality. Attach additional labels to the currently selected dashboard node within this window, either by utilizing existing labels in your database or creating new ones, to regulate access permissions. 

You can find the Dashboard Access Control feature by clicking on the three dots next to the dashboard name in the sidebar and selecting the "Access Control" option.

> This approach should be used together with restricted privileges on labels, assigned to certain roles. See link:../extensions/access-control-management[Access Control Management] for details.

image::dashboardaccesscontrol.png[Dashboard Access Control]

== Dashboard Settings

Settings for the entire dashboard can be accessed by clicking the
*Settings ⚙️* button in the dashboard sidebar.

image::dashboardsettings.png[Dashboard Settings]

This window can be used to control the followng settings:

[width="100%",cols="19%,17%,26%,38%",options="header",]
|===
|Name |Changeable |Default Value |Description
|Editable |Yes |on |If enabled, show the dashboard in `editing mode'. If
not, show it in `view mode'. In view mode, all editing is disabled,
pages and reports can not be moved, edited or renamed.

|Enable Fullscreen Report Views |Yes |on |If enabled, show the *🔳
Fullscreen* button on the top-right of a report, letting users maximize
a visualization.

|Maximum Query Time (seconds) |Yes |20 |The maximum time is a query is
allowed to take before being cancelled automatically. Increase this if
you have complex analytical queries.

|Disable Row Limiting |Yes |off |If enabled, the automatic
link:reports#row-limiting[row limiting] feature of dashboards is
disabled.

|Page Number |No |0 |The current page number of the dashboard being
viewed. This can only be changed by switching pages in the dashboard
header.

|Global Parameters |No | {} |The global parameters that are shared among
all reports in the dashboard. See the next section for more on global
parameters.
|===

== Parameters

Dashboard parameters are key-value pairs that can be used inside the
queries of reports. A convention is that a dashboard parameter in
NeoDash will always start with `$neodash_`.

Parameters can only be set (and unset) using the
link:../reports/parameter-select[Parameter Select] reports. After setting a
parameter, it will be available to all reports in the dashboard. A query
that uses a dashboard parameter will look like this:

....
MATCH (m:Movie)<-[a:ACTED_IN]-(p:Person)
WHERE m.title = $neodash_movie_title
RETURN m, a, p
....

=== Deep-Linking Parameters

For browser-based NeoDash deployments, you set NeoDash parameters by
means of URL parameters. For example, when a user visits the following
URL:

....
https://neodash.graphapp.io/?neodash_person_name=Adam
....

This will set the parameter `$neodash_person_name` to `Adam` after
loading the dashboard.


================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/access-control-management.adoc
================================================

= Access Control Management

include::../../banner.adoc[]

This extension lets you manage access control for roles and users, letting you assign users to roles as well as controlling which node labels can be read by a user.

This extension is only visible to users with the role of "Administrator" or "Super User". Enabling this extension will allow the admin user to manage the labels of the roles in the database and then attach them to the users.


== Using the Extension ==
If you have logged in to Neodash as an admin user, you will be able to enable the extension in the "Extensions" menu. Clicking on this extension will give the user a new button next to the settings button in the dashboard header. If the user click on this button, a menu will appear with all the roles in the database. 

image::rolesmenu.png[Role menu]

The user can then click on any role and a window will appear with the role's context:

* User list - This is a list of users from your database. You can select multiple users from the list and the role will be added to all the selected users.

* Allow list - This is a list of labels that the role will be granted to read. You can select multiple labels from the list or if you want every label to be granted, you can select "*" from the list. (Requires a database to be selected)

* Deny list - This is a list of labels that the role will be denied to read. You can select multiple labels from the list or if you want every label to be denied, you can select "*" from the list.  (Requires a database to be selected)


Finally when the admin user clicks on the "Save" button, the role will be updated in the database and the labels will be granted or denied to the users that were selected for the specific role and database.

image::rolelabelmodal.png[Role modal]

> Universal (Cross-database) `GRANT` and `DENY` privileges are not supported by this extension. Privileges must be added on a database-specific level. See the Neo4j https://neo4j.com/docs/operations-manual/current/authentication-authorization/privileges-reads/[documentation on read privileges] for more information.


================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/advanced-visualizations.adoc
================================================

= Advanced Visualizations

include::../../banner.adoc[]

Advanced visualizations let you extend your dashboard with complex, powerful visualizations beyond the standard visualizations.
For specific use-cases, these visualizations may convey information that a simple visualization cannot.
To use advanced visualizations, enable them in the **Extensions Window**. This makes them selectable inside reports, as well as add examples to the Example window.

The following visualizations are part of this extension:
- A link:../../reports/graph3d[3D Graph] to visualize a graph in three dimensions.
- A link:../../reports/sankey[Sankey Chart] to visualize flows.
- Three charts to plot hierarchical data (link:../../reports/sunburst[Sunburst], link:../../reports/circle-packing[Circle Packing], link:../../reports/treemap[Treemap])
- A link:../../reports/gauge-chart[Gauge Chart] to show percentages.
- An link:../../reports/choropleth[Choropleth] to visualize numeric, country-data.
- An link:../../reports/areamap[Area Map] to show an interactive world map, annotated with numeric country / region values.
- A link:../../reports/gantt[Gantt] chart to visualize dependencies between tasks. 
- A link:../../reports/radar[Radar Chart] to create a radial view of multiple categoric values.

image::advanced-visualizations.png[Advanced Visualizations]


================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/forms.adoc
================================================

= Forms

include::../../banner.adoc[]

The 'forms' extension lets you combine different parameter selectors to update / modify your graph data.
Update queries are predefined by the dashboard builder, and the user is limited to specifying the parameters for the query only.

See link:../../reports/form[Form] on how to create, configure, and use forms.

> Keep in mind that data-altering forms require your Neo4j user to have **write-access** to the graph. Make sure you give access to a select group of power-users only.




image::forms.png[Forms]


================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/index.adoc
================================================

= Extensions

include::../../banner.adoc[]

Extensions provide a way to expand the basic functionality of NeoDash with extra features.
To enable an extension, open up the extensions window by clicking the puzzle piece icon in the left-sidebar of the screen.
This will open up the **Extensions Window**, which lets you toggle active extensions for the current dashboard.

image::extensions.png[The Extensions Window]

The following types of functionality can be added through NeoDash extensions:

- A new type of visualization.
- A more customizable version of an existing visualization.
- New core features, such as rule-based styling or interactive reports.

The currently available extensions in NeoDash are:

- link:advanced-visualizations[Advanced Visualizations]
- link:rule-based-styling[Rule-based Styling]
- link:report-actions[Report Actions]
- link:natural-language-queries[Text2Cypher - Natural Language Queries]
- link:forms[Forms]
- link:access-control-management[Access Control Management]

== Types of Extensions

=== 1. Core Extensions
Core Extensions are available as part of the open-source NeoDash project.
These are available to use for free anywhere - Neo4j Desktop, public NeoDash deployments, and self-hosted NeoDash deployments.

=== 2. Expert Extensions
Expert Extensions are built by the Neo4j Professional Services team.
These extensions push NeoDash to the next level, by providing extra functionality to create interactive graph applications.
Reach out to link:mailto:emea_pmo@neotechnology.com[Neo4j Professional Services] if you are interested in a customized / new expert extension for your use-case.

=== 3. Custom Extensions
Custom Extensions are self-built extensions that you can plug into the project.
To learn about how to fork and extend NeoDash, check out the link:../../developer-guide[Developer Guide].


================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/natural-language-queries.adoc
================================================

= Text2Cypher - Natural Language Queries

include::../../banner.adoc[]

Use natural language to generate Cypher queries in NeoDash. Connect to an LLM through an API, and let NeoDash use your database schema + the report types to generate queries automatically.

== How it works
This extension feature allows users to interact with NeoDash using natural language to generate Cypher queries for querying Neo4j graph databases. 
This integration leverages Language Models (LLMs) to interpret user inputs and generate Cypher queries based on the provided schema definition.

== Configuration
To enable Natural Language Queries in NeoDash, follow these configuration steps:

1. Open NeoDash and navigate to the "Extensions" section in the left sidebar.
2. Locate the "Text2Cypher" extension and click on it to activate it.
3. Once activated, a new button will appear on top of the screen, with a red exclamation mark (⚠️). Click this button.
4. In the configuration window, you will be prompted to provide the necessary information to connect to the Language Model (LLM). Enter the model provider, API key, deployment url if needed by the model provider, and select the desired model to use.
5. After providing the required information, click on the "Start Querying" button to finalize the configuration.

image::llmconfiguration.png[Configuration settings for the Natural Language Queries extension]

== Usage
Once the extension is configured, you can start using it in your NeoDash reports. Here's how:

1. Open the Report settings for the desired report.
2. In the report settings, you will find a toggle switch located above the editor. This switch allows you to toggle between Cypher and English languages.
3. Since you have enabled the extension and authenticated by providing your API key, you can switch to the English language mode.
4. Start formulating your queries in plain English, using natural language expressions to describe the data you want to retrieve.
5. After composing your query, you have two options for further actions:

* Translate: By clicking the "Translate" button, your query will be translated into Cypher using the Language Model. The translated Cypher query will be displayed in the editor when you toggle to the Cypher view. 
This allows you to review and modify the generated Cypher query before execution.
* Run: If you wish to directly execute the query and view the results, click the "Run" button in the top right corner. The execution of the query will depend on the selected report type, and the results will be displayed accordingly.

image::englisheditor.png[Example of the English editor in NeoDash]

== Improving Accuracy with Custom Prompting
To boost the accuracy of the language model, you can provide your own example queries to be fed into the prompt.
Specifying queries specific to your data model & use-cases can significantly improve the quality of Text2Cypher translations.

To access the model examples screen, open up the settings for the extensions.
After specifying the provider and model, click the "Tweak Prompts" button on the bottom-left of the window.
This leads you to the example interface:

image::llm-examples.png[Custom Examples for your prompt]

In this interface, you can specify one or more examples that are sent to the language model.
An example consists of both a Cypher query, and a natural language equivalent of that query.
You can create as many examples as you want, but keeping them close to your user queries will yield best results.

== Underlying Functionality
* Retrieve the Schema: The system prompts at the beginning of the interaction to retrieve the database schema. This ensures that the generated queries adhere to the provided schema and available relationship types and properties.

* Prompting in English: Once the schema is retrieved, you can start prompting your queries in plain English. NeoDash, powered by the LLM, will interpret your English query and generate the corresponding Cypher query based on the provided schema.

* Automatic Query Generation: NeoDash automatically generates the Cypher queries for you, taking into account the report type you specified. Whether it's a table, graph, bar chart, line chart, or any other supported report type, the generated queries will retrieve the necessary data based on the report requirements.

* Retry Logic: To enhance the reliability of the generated queries, we have implemented retry logic. If there is any issue or error during the query generation process, the system will attempt to retry three times as a maximum and provide a valid query to ensure smooth query execution.

== Prompting Tips

When using Natural Language Queries in NeoDash, keep the following tips in mind to enhance your experience:

1. Be clear and specific in your queries: Provide detailed descriptions of the data you want to retrieve, including node labels, relationship types, and property values.
2. Use keywords and phrases: Incorporate relevant keywords and phrases that are commonly used in the context of your data to improve query accuracy.
3. Ask precise questions: Frame your queries as questions to obtain specific information. For example, instead of "Show me all customers," try "Which customers have made a purchase in the last month?"
4. Experiment with different phrasings: If you're not getting the desired results, try rephrasing your query using synonyms or alternative expressions.
5. Avoid ambiguous queries: Ambiguous or vague queries may yield unexpected results. Make sure to provide sufficient context and clarify any ambiguities.
6. Validate and review generated queries: Always review the generated Cypher queries to ensure they accurately represent your intent and produce the expected results.


== Important Considerations

When using Natural Language Queries with Language Models, it's important to be aware of the following considerations:

1. Multiple model providers: Depending on your configuration, your queries may be processed by different model providers. Take into account that this means your data is being sent to different providers.
2. Non-deterministic nature: Language Models can produce non-deterministic outputs. The generated queries may vary between different runs, even with the same input prompt. Validate the generated queries and perform thorough testing to ensure correctness.
3. Potential hallucination: Language Models can generate outputs that may not align with the specific schema or data constraints. Exercise caution and verify the results to prevent potential inaccuracies or hallucinations.

================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/report-actions.adoc
================================================

= Report Actions 

include::../../banner.adoc[]

link:../#_2_pro_extensions[label:Pro&nbsp;Extension[]]

Report actions let dashboard builders add interactivity into dashboards. Actions can be used to achieve:

1. Cross-report filtering.
2. Using the output of one report in another report.
3. Providing users with more parameterized control beyond parameter selectors.

The image below displays an example of two reports interacting using report actions:

- An action is defined for the table: **If a user clicks on a row in the Customer column, set the parameter `$neodash_customer_name` to `row.Customer`**.
- The graph visualization uses the parameter `$neodash_customer_name` to select a specific node. The graph is automatically updated when the user clicks on a row entry inside the table.

image::report-actions.png[Report Actions]



== Configuration
First, ensure that the extension is enabled.
Then, to create a **Report Action**, open up the report settings, Then, click the 'Report Action' button on the bottom right (marked with the red circle):

image::reportactionsbutton.png[Report]


This will open up the rule definition window. Inside this screen, a list
of rules can be defined. An unlimited number of rules can be defined, and based on the visualization, different actions can be specified. Each rule will have the following structure:

 IF [CONDITION] SET [OBJECT] TO [VALUE] 

image::reportactions.png[Report]

== Supported Visualizations

Report Actions are available for the following report types:

- Tables
- Graphs
- Maps



================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/rule-based-styling.adoc
================================================

= Rule-Based Styling 

include::../../banner.adoc[]

The rule-based styling extension allows users to dynamically color elements in a visualization based on output values. This can be applied to tables, graphs, bar charts, line charts, and more. To use the extension, click on the 'rule-based styling' icon inside the settings of a report.


image::rule-based-styling.png[Rule-Based Styling]


== Configuration
First, ensure that the extension is enabled.

Then, on several report types, rule-based styling can be applied to the
visualization. To do this, open up the report settings, Then, click the
*Rule-Based Styling* button on the bottom right (marked with the red
circle):

image::rulebasedstylingbutton.png[Report]

This will open up the action definition window. Inside this screen, a list
of action rules can be defined. Each rule will have the following structure:

 IF [CONDITION] THEN [STYLE]

image::rulebasedstyling.png[Report]

Conditions are always based on one of the return fields of the query.
This can be a simple field (text, number) or a node property. Style
rules are (as of NeoDash 2.1) always color-based.

For example, the following rule will set the color of all `Warning`
nodes to red:

`IF Warning.level = "critical" THEN 'Node Color' = "red"`

Ultimately, it is important to understand that the order of the rules is
important. If a node matches multiple rules, the first rule that matches
will be used. If no rules are matched, the default style will be used.

== Supported Visualizations
Rule-Based Styling is available for the following report types:

- Tables
- Bar Charts
- Line Charts
- Pie Charts
- Graphs
- Maps
- Single Values



================================================
FILE: docs/modules/ROOT/pages/user-guide/extensions/workflows.adoc
================================================

= Workflows

include::../../banner.adoc[]

Introducing an advanced extension for creating, managing, and running workflows with Cypher queries. Simplify ETL flows, execute complex query chains, and run graph data science workloads effortlessly from Neodash.

== Enable the extension

== Create a Workflow

== Create a new step in the workflow

== Check status



================================================
FILE: docs/modules/ROOT/pages/user-guide/faq.adoc
================================================
include::../banner.adoc[]

= FAQ

include::../banner.adoc[]

== 1. How can I learn more about NeoDash?

To learn more, check out the following list of resources (blogs, videos
and sites): 

- https://www.youtube.com/watch?v=Ygzj0Y4cYm4[NeoDash 2.0 in
Five Minutes] 
- https://www.youtube.com/watch?v=vjZ9M7JpExA[NeoDash 2.0 - Hands On at Neo4j Live] 
- https://medium.com/p/ddc938ff82fa[Investigating Supply Chains with NeoDash] 
- https://thatdavestevens.medium.com/social-recommendations-slack-neo4j-and-neodash-fe916588e65b[Social Recommendations with Neo4j & NeoDash] 
- https://neo4j.com/developer-blog/bitcoin-transactions-dashboard-neo4j-neodash/[Real-Time Dashboard of Bitcoin Transactions With Neo4j and NeoDash]
- https://medium.com/@a.emrevarol/european-natural-gas-network-via-knowledge-graph-3c3decb5f2ec[European
Natural Gas Pipelines] 
- http://blog.bruggen.com/2020/11/exporting-spotify-playlists-into-neo4j.html[Exporting Spotify Playlists into Neo4j] 
- https://nielsdejong.nl/neo4j%20projects/2021/12/14/neodash-2.0-a-brand-new-way-of-visualizing-neo4j-data.html[NeoDash
2.0 Release Overview] 
- https://nielsdejong.nl/neo4j%20projects/2021/06/06/neodash-1.1-extensible-interactive-dashboards.html[NeoDash
1.1 Release Overview] 
- https://nielsdejong.nl/neo4j%20projects/2020/11/16/neodash[NeoDash 1.0
Release Overview]

_Have a blog post about NeoDash you’d like to share? Let us know and we
can add it to this list!_

== 2. Is NeoDash free to use?

NeoDash 2.X is available under the
https://www.apache.org/licenses/LICENSE-2.0[Apache 2.0 license], which
means you can use it for free for with your project.

____
Keep in mind! As NeoDash is a https://neo4j.co
Download .txt
gitextract_84dlt97i/

├── .babelrc
├── .eslintrc.json
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   └── feature-request.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── develop-deployment.yml
│       ├── develop-test.yml
│       ├── master-deployment.yml
│       └── master-test.yml
├── .gitignore
├── .husky/
│   ├── common.sh
│   └── pre-commit
├── .lintstagedrc.json
├── .npmignore
├── .prettierignore
├── .prettierrc.json
├── Dockerfile
├── LICENSE
├── README.md
├── about.md
├── changelog.md
├── compose.yaml
├── conf/
│   └── default.conf.template
├── cypress/
│   ├── Page.js
│   ├── e2e/
│   │   ├── charts/
│   │   │   ├── array.cy.js
│   │   │   ├── bar.cy.js
│   │   │   └── table.cy.js
│   │   └── start_page.cy.js
│   ├── fixtures/
│   │   └── cypher_queries.js
│   ├── index.js
│   ├── plugins/
│   │   └── index.js
│   └── support/
│       ├── commands.js
│       └── e2e.ts
├── cypress.config.ts
├── docs/
│   ├── README.md
│   ├── antora.yml
│   ├── modules/
│   │   └── ROOT/
│   │       ├── nav.adoc
│   │       └── pages/
│   │           ├── banner.adoc
│   │           ├── developer-guide/
│   │           │   ├── adding-visualizations.adoc
│   │           │   ├── build-and-run.adoc
│   │           │   ├── component-overview.adoc
│   │           │   ├── configuration.adoc
│   │           │   ├── contributing.adoc
│   │           │   ├── deploy-a-build.adoc
│   │           │   ├── design.adoc
│   │           │   ├── index.adoc
│   │           │   ├── session-storage.adoc
│   │           │   ├── standalone-mode.adoc
│   │           │   ├── state-management.adoc
│   │           │   ├── style-configuration.adoc
│   │           │   └── testing.adoc
│   │           ├── index.adoc
│   │           ├── quickstart.adoc
│   │           └── user-guide/
│   │               ├── access-control.adoc
│   │               ├── bloom-integration.adoc
│   │               ├── dashboards.adoc
│   │               ├── extensions/
│   │               │   ├── access-control-management.adoc
│   │               │   ├── advanced-visualizations.adoc
│   │               │   ├── forms.adoc
│   │               │   ├── index.adoc
│   │               │   ├── natural-language-queries.adoc
│   │               │   ├── report-actions.adoc
│   │               │   ├── rule-based-styling.adoc
│   │               │   └── workflows.adoc
│   │               ├── faq.adoc
│   │               ├── index.adoc
│   │               ├── pages.adoc
│   │               ├── publishing.adoc
│   │               └── reports/
│   │                   ├── areamap.adoc
│   │                   ├── bar-chart.adoc
│   │                   ├── choropleth.adoc
│   │                   ├── circle-packing.adoc
│   │                   ├── form.adoc
│   │                   ├── gantt.adoc
│   │                   ├── gauge-chart.adoc
│   │                   ├── graph.adoc
│   │                   ├── graph3d.adoc
│   │                   ├── iframe.adoc
│   │                   ├── index.adoc
│   │                   ├── line-chart.adoc
│   │                   ├── map.adoc
│   │                   ├── markdown.adoc
│   │                   ├── parameter-select.adoc
│   │                   ├── pie-chart.adoc
│   │                   ├── radar.adoc
│   │                   ├── raw-json.adoc
│   │                   ├── sankey.adoc
│   │                   ├── single-value.adoc
│   │                   ├── sunburst.adoc
│   │                   ├── table.adoc
│   │                   └── treemap.adoc
│   ├── package.json
│   ├── preview.yml
│   └── server.js
├── gallery/
│   ├── .gitignore
│   ├── LICENSE
│   ├── README.md
│   ├── dashboards/
│   │   ├── assessment.json
│   │   ├── bom-english.json
│   │   ├── bom.json
│   │   ├── citation.json
│   │   ├── domains.json
│   │   ├── fraud.json
│   │   ├── jokes.json
│   │   ├── movies.json
│   │   ├── recommendations.json
│   │   ├── twitter.json
│   │   └── wine.json
│   ├── package.json
│   ├── postcss.config.js
│   ├── public/
│   │   ├── index.html
│   │   ├── manifest.json
│   │   └── robots.txt
│   ├── setup.md
│   ├── src/
│   │   ├── App.css
│   │   ├── App.tsx
│   │   ├── index.css
│   │   ├── index.tsx
│   │   ├── react-app-env.d.ts
│   │   ├── reportWebVitals.ts
│   │   └── setupTests.ts
│   ├── tailwind.config.js
│   └── tsconfig.json
├── k8s-deploy/
│   ├── neodash/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── NOTES.txt
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   ├── hpa.yaml
│   │   │   ├── ingress.yaml
│   │   │   ├── service.yaml
│   │   │   ├── serviceaccount.yaml
│   │   │   └── tests/
│   │   │       └── test-connection.yaml
│   │   └── values.yaml
│   └── sample-k8s-yamls/
│       ├── deployment.yaml
│       └── service.yaml
├── package.json
├── postcss.config.js
├── public/
│   ├── README.md
│   ├── config.json
│   ├── embed-test.html
│   ├── index.html
│   ├── manifest.json
│   ├── style.config.json
│   └── style.css
├── release-notes.md
├── scripts/
│   ├── config-entrypoint.sh
│   ├── docker-neo4j-initializer/
│   │   ├── docker-neo4j.sh
│   │   ├── movies.cypher
│   │   └── start-movies-db.sh
│   └── message-entrypoint.sh
├── src/
│   ├── application/
│   │   ├── Application.tsx
│   │   ├── ApplicationActions.ts
│   │   ├── ApplicationReducer.ts
│   │   ├── ApplicationSelectors.ts
│   │   ├── ApplicationThunks.ts
│   │   └── logging/
│   │       ├── LoggingActions.ts
│   │       ├── LoggingReducer.ts
│   │       ├── LoggingSelectors.ts
│   │       └── LoggingThunk.ts
│   ├── card/
│   │   ├── Card.tsx
│   │   ├── CardActions.ts
│   │   ├── CardAddButton.tsx
│   │   ├── CardReducer.ts
│   │   ├── CardSelectors.ts
│   │   ├── CardStyle.ts
│   │   ├── CardThunks.ts
│   │   ├── settings/
│   │   │   ├── CardSettings.tsx
│   │   │   ├── CardSettingsContent.tsx
│   │   │   ├── CardSettingsFooter.tsx
│   │   │   └── CardSettingsHeader.tsx
│   │   └── view/
│   │       ├── CardView.tsx
│   │       ├── CardViewFooter.tsx
│   │       └── CardViewHeader.tsx
│   ├── chart/
│   │   ├── Chart.ts
│   │   ├── ChartUtils.ts
│   │   ├── SettingsUtils.ts
│   │   ├── Utils.ts
│   │   ├── bar/
│   │   │   ├── BarChart.tsx
│   │   │   └── util.ts
│   │   ├── graph/
│   │   │   ├── GraphChart.tsx
│   │   │   ├── GraphChartVisualization.ts
│   │   │   ├── GraphChartVisualization2D.tsx
│   │   │   ├── GraphChartVisualizationBase.tsx
│   │   │   ├── component/
│   │   │   │   ├── GraphChartCanvas.tsx
│   │   │   │   ├── GraphChartContextMenu.tsx
│   │   │   │   ├── GraphChartEditModal.tsx
│   │   │   │   ├── GraphChartInspectModal.tsx
│   │   │   │   ├── GraphChartTooltip.tsx
│   │   │   │   ├── GraphEntityInspectionTable.tsx
│   │   │   │   ├── autocomplete/
│   │   │   │   │   ├── LabelTypeAutocomplete.tsx
│   │   │   │   │   └── PropertyNameAutocomplete.tsx
│   │   │   │   └── button/
│   │   │   │       ├── GraphChartDeepLinkButton.tsx
│   │   │   │       ├── GraphChartFitViewButton.tsx
│   │   │   │       ├── GraphChartLockButton.tsx
│   │   │   │       └── modal/
│   │   │   │           └── DeletePropertyButton.tsx
│   │   │   └── util/
│   │   │       ├── EditUtils.ts
│   │   │       ├── ExplorationUtils.ts
│   │   │       ├── NodeUtils.ts
│   │   │       ├── RecordUtils.ts
│   │   │       └── RelUtils.ts
│   │   ├── iframe/
│   │   │   └── IFrameChart.tsx
│   │   ├── json/
│   │   │   └── JSONChart.tsx
│   │   ├── line/
│   │   │   └── LineChart.tsx
│   │   ├── map/
│   │   │   ├── MapChart.tsx
│   │   │   ├── MapUtils.ts
│   │   │   └── layers/
│   │   │       ├── HeatmapLayer.tsx
│   │   │       ├── LineLayer.tsx
│   │   │       └── MarkerLayer.tsx
│   │   ├── markdown/
│   │   │   └── MarkdownChart.tsx
│   │   ├── parameter/
│   │   │   ├── ParameterSelectCardSettings.tsx
│   │   │   ├── ParameterSelectionChart.tsx
│   │   │   └── component/
│   │   │       ├── DateParameterSelect.tsx
│   │   │       ├── FreeTextParameterSelect.tsx
│   │   │       ├── NodePropertyParameterSelect.tsx
│   │   │       ├── ParameterSelect.ts
│   │   │       ├── QueryParameterSelect.tsx
│   │   │       ├── RelationshipPropertyParameterSelect.tsx
│   │   │       └── SelectionConfirmationButton.tsx
│   │   ├── pie/
│   │   │   └── PieChart.tsx
│   │   ├── scatter/
│   │   │   └── ScatterPlotChart.tsx
│   │   ├── single/
│   │   │   └── SingleValueChart.tsx
│   │   └── table/
│   │       ├── TableActionsHelper.ts
│   │       └── TableChart.tsx
│   ├── component/
│   │   ├── editor/
│   │   │   ├── CodeEditorComponent.tsx
│   │   │   └── CodeViewerComponent.tsx
│   │   ├── field/
│   │   │   ├── ColorPicker.tsx
│   │   │   ├── DateField.tsx
│   │   │   ├── Field.tsx
│   │   │   └── Setting.tsx
│   │   ├── misc/
│   │   │   └── DashboardConnectionUpdateHandler.tsx
│   │   ├── sso/
│   │   │   ├── SSOLoginButton.tsx
│   │   │   └── SSOUtils.ts
│   │   └── theme/
│   │       └── Themes.tsx
│   ├── config/
│   │   ├── ApplicationConfig.ts
│   │   ├── CardConfig.ts
│   │   ├── ColorConfig.ts
│   │   ├── DashboardConfig.ts
│   │   ├── ExampleConfig.ts
│   │   ├── PageConfig.ts
│   │   ├── ReportConfig.tsx
│   │   └── StyleConfig.tsx
│   ├── dashboard/
│   │   ├── Dashboard.tsx
│   │   ├── DashboardActions.ts
│   │   ├── DashboardReducer.ts
│   │   ├── DashboardSelectors.ts
│   │   ├── DashboardThunks.ts
│   │   ├── header/
│   │   │   ├── DashboardHeader.tsx
│   │   │   ├── DashboardHeaderAboutButton.tsx
│   │   │   ├── DashboardHeaderDownloadImageButton.tsx
│   │   │   ├── DashboardHeaderLogo.tsx
│   │   │   ├── DashboardHeaderLogoutButton.tsx
│   │   │   ├── DashboardHeaderPageList.tsx
│   │   │   ├── DashboardHeaderPageTitle.tsx
│   │   │   └── DashboardTitle.tsx
│   │   ├── placeholder/
│   │   │   └── DashboardPlaceholder.tsx
│   │   └── sidebar/
│   │       ├── DashboardSidebar.tsx
│   │       ├── DashboardSidebarListItem.tsx
│   │       ├── menu/
│   │       │   ├── DashboardSidebarCreateMenu.tsx
│   │       │   ├── DashboardSidebarDashboardMenu.tsx
│   │       │   └── DashboardSidebarDatabaseMenu.tsx
│   │       └── modal/
│   │           ├── DashboardSidebarAccessModal.tsx
│   │           ├── DashboardSidebarCreateModal.tsx
│   │           ├── DashboardSidebarDeleteModal.tsx
│   │           ├── DashboardSidebarExportModal.tsx
│   │           ├── DashboardSidebarImportModal.tsx
│   │           ├── DashboardSidebarInfoModal.tsx
│   │           ├── DashboardSidebarLoadModal.tsx
│   │           ├── DashboardSidebarSaveModal.tsx
│   │           ├── DashboardSidebarShareModal.tsx
│   │           └── legacy/
│   │               └── LegacyShareModal.tsx
│   ├── extensions/
│   │   ├── ExtensionConfig.tsx
│   │   ├── ExtensionUtils.ts
│   │   ├── ExtensionsModal.tsx
│   │   ├── actions/
│   │   │   └── ActionsRuleCreationModal.tsx
│   │   ├── advancedcharts/
│   │   │   ├── AdvancedChartsExampleConfig.ts
│   │   │   ├── AdvancedChartsReportConfig.tsx
│   │   │   ├── Utils.ts
│   │   │   ├── chart/
│   │   │   │   ├── areamap/
│   │   │   │   │   ├── AreaMapChart.tsx
│   │   │   │   │   ├── PolygonLayer.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   └── styles/
│   │   │   │   │       └── PolygonStyle.css
│   │   │   │   ├── choropleth/
│   │   │   │   │   └── ChoroplethMapChart.tsx
│   │   │   │   ├── circlepacking/
│   │   │   │   │   └── CirclePackingChart.tsx
│   │   │   │   ├── gantt/
│   │   │   │   │   ├── GanttChart.tsx
│   │   │   │   │   ├── Utils.ts
│   │   │   │   │   └── frappe/
│   │   │   │   │       ├── GanttVisualization.tsx
│   │   │   │   │       └── lib/
│   │   │   │   │           ├── arrow.ts
│   │   │   │   │           ├── bar.ts
│   │   │   │   │           ├── date_utils.js
│   │   │   │   │           ├── gantt.css
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── popup.ts
│   │   │   │   │           └── svg_utils.ts
│   │   │   │   ├── gauge/
│   │   │   │   │   └── GaugeChart.tsx
│   │   │   │   ├── graph3d/
│   │   │   │   │   ├── GraphChart3D.tsx
│   │   │   │   │   └── GraphChartVisualization3D.tsx
│   │   │   │   ├── radar/
│   │   │   │   │   └── RadarChart.tsx
│   │   │   │   ├── sankey/
│   │   │   │   │   └── SankeyChart.tsx
│   │   │   │   ├── sunburst/
│   │   │   │   │   └── SunburstChart.tsx
│   │   │   │   └── treemap/
│   │   │   │       └── TreeMapChart.tsx
│   │   │   └── component/
│   │   │       └── RefreshButton.tsx
│   │   ├── forms/
│   │   │   ├── FormsExampleConfig.tsx
│   │   │   ├── FormsReportConfig.tsx
│   │   │   ├── chart/
│   │   │   │   └── NeoForm.tsx
│   │   │   └── settings/
│   │   │       ├── NeoFormCardSettings.tsx
│   │   │       ├── NeoFormCardSettingsModal.tsx
│   │   │       └── list/
│   │   │           ├── NeoFormSortableItem.tsx
│   │   │           ├── NeoFormSortableList.tsx
│   │   │           └── NeoFormSortableOverlay.tsx
│   │   ├── query-translator/
│   │   │   └── component/
│   │   │       └── OverrideCardQueryEditor.tsx
│   │   ├── rbac/
│   │   │   ├── RBACManagementLabelButton.tsx
│   │   │   ├── RBACManagementMenu.tsx
│   │   │   ├── RBACManagementModal.tsx
│   │   │   └── RBACUtils.ts
│   │   ├── state/
│   │   │   ├── ExtensionActions.ts
│   │   │   ├── ExtensionReducer.ts
│   │   │   └── ExtensionSelectors.ts
│   │   ├── styling/
│   │   │   ├── StyleRuleCreationModal.tsx
│   │   │   └── StyleRuleEvaluator.ts
│   │   └── text2cypher/
│   │       ├── QueryTranslatorConfig.ts
│   │       ├── clients/
│   │       │   ├── AzureOpenAi/
│   │       │   │   └── AzureOpenAiClient.ts
│   │       │   ├── ModelClient.ts
│   │       │   ├── OpenAi/
│   │       │   │   └── OpenAiClient.ts
│   │       │   ├── VertexAiClient.ts
│   │       │   └── const.ts
│   │       ├── component/
│   │       │   ├── ClientSettings.tsx
│   │       │   ├── LoadingIcon.tsx
│   │       │   ├── OverrideCardQueryEditor.tsx
│   │       │   ├── QueryTranslatorButton.tsx
│   │       │   ├── QueryTranslatorSettingsModal.tsx
│   │       │   └── model-examples/
│   │       │       ├── ExampleDisplayTable.tsx
│   │       │       ├── ExampleEditorModal.tsx
│   │       │       ├── QueryTranslatorSettingsModelExamples.tsx
│   │       │       └── utils.ts
│   │       ├── state/
│   │       │   ├── QueryTranslatorActions.ts
│   │       │   ├── QueryTranslatorReducer.ts
│   │       │   ├── QueryTranslatorSelector.ts
│   │       │   └── QueryTranslatorThunks.ts
│   │       └── util/
│   │           ├── Status.ts
│   │           └── Util.ts
│   ├── index.pcss
│   ├── index.tsx
│   ├── modal/
│   │   ├── AboutModal.tsx
│   │   ├── ConnectionModal.tsx
│   │   ├── DeletePageModal.tsx
│   │   ├── ExportModal.tsx
│   │   ├── LoadSharedDashboardModal.tsx
│   │   ├── ModalSelectors.tsx
│   │   ├── ModalUtils.tsx
│   │   ├── NotificationModal.tsx
│   │   ├── ReportExamplesModal.tsx
│   │   ├── ReportHelpModal.tsx
│   │   ├── UpgradeOldDashboardModal.tsx
│   │   └── WelcomeScreenModal.tsx
│   ├── page/
│   │   ├── Page.tsx
│   │   ├── PageActions.ts
│   │   ├── PageReducer.ts
│   │   ├── PageSelectors.ts
│   │   └── PageThunks.ts
│   ├── report/
│   │   ├── Report.tsx
│   │   ├── ReportQueryRunner.ts
│   │   ├── ReportRecordProcessing.tsx
│   │   └── ReportWrapper.tsx
│   ├── sessionStorage/
│   │   ├── SessionStorageActions.ts
│   │   ├── SessionStorageReducer.ts
│   │   └── SessionStorageSelectors.ts
│   ├── settings/
│   │   ├── SettingsActions.ts
│   │   ├── SettingsModal.tsx
│   │   ├── SettingsReducer.ts
│   │   ├── SettingsSelectors.ts
│   │   └── SettingsThunks.ts
│   ├── store.ts
│   └── utils/
│       ├── ObjectManipulation.ts
│       ├── ReportUtils.ts
│       ├── accessibility.ts
│       ├── parameterUtils.ts
│       └── uuid.ts
├── ssl/
│   ├── Dockerfile
│   └── default.conf
├── tailwind.config.js
├── tsconfig.json
└── webpack.config.js
Download .txt
SYMBOL INDEX (509 symbols across 111 files)

FILE: cypress.config.ts
  method setupNodeEvents (line 12) | setupNodeEvents(on, config) {

FILE: cypress/Page.js
  constant DB_URL (line 1) | const DB_URL = 'localhost';
  constant DB_USERNAME (line 2) | const DB_USERNAME = 'neo4j';
  constant DB_PASSWORD (line 3) | const DB_PASSWORD = 'test1234';
  class Page (line 5) | class Page {
    method constructor (line 6) | constructor(cardSelector) {
    method init (line 10) | init() {
    method createNewDashboard (line 20) | createNewDashboard() {
    method connectToNeo4j (line 32) | connectToNeo4j() {
    method enableReportActions (line 43) | enableReportActions() {
    method enableAdvancedVisualizations (line 52) | enableAdvancedVisualizations() {
    method enableFormsExtension (line 60) | enableFormsExtension() {
    method selectReportOfType (line 69) | selectReportOfType(type) {
    method createReportOfType (line 83) | createReportOfType(type, query, fast = false, run = true) {
    method openSettings (line 103) | openSettings() {
    method closeSettings (line 109) | closeSettings() {
    method openAdvancedSettings (line 115) | openAdvancedSettings() {
    method closeAdvancedSettings (line 122) | closeAdvancedSettings() {
    method openReportActionsMenu (line 128) | openReportActionsMenu() {
    method updateDropdownAdvancedSetting (line 135) | updateDropdownAdvancedSetting(settingLabel, targetValue) {
    method updateChartQuery (line 143) | updateChartQuery(query) {

FILE: cypress/e2e/charts/array.cy.js
  constant CARD_SELECTOR (line 4) | const CARD_SELECTOR = 'main .react-grid-item:eq(2)';

FILE: cypress/e2e/charts/bar.cy.js
  constant CARD_SELECTOR (line 4) | const CARD_SELECTOR = '.react-grid-layout:eq(0) .MuiGrid-root:eq(2)';

FILE: cypress/e2e/start_page.cy.js
  constant CARD_SELECTOR (line 16) | const CARD_SELECTOR = 'main .react-grid-item:eq(2)';

FILE: cypress/support/commands.js
  constant WAITING_TIME (line 44) | const WAITING_TIME = 20000;

FILE: gallery/src/App.tsx
  function loadDashboards (line 10) | async function loadDashboards(setResults: any) {
  function App (line 30) | function App() {

FILE: src/application/ApplicationActions.ts
  constant CLEAR_NOTIFICATION (line 5) | const CLEAR_NOTIFICATION = 'APPLICATION/CLEAR_NOTIFICATION';
  constant CREATE_NOTIFICATION (line 11) | const CREATE_NOTIFICATION = 'APPLICATION/CREATE_NOTIFICATION';
  constant SET_CONNECTED (line 17) | const SET_CONNECTED = 'APPLICATION/SET_CONNECTED';
  constant SET_DRAFT (line 23) | const SET_DRAFT = 'APPLICATION/SET_DRAFT';
  constant SET_CONNECTION_MODAL_OPEN (line 29) | const SET_CONNECTION_MODAL_OPEN = 'APPLICATION/SET_CONNECTION_MODAL_OPEN';
  constant SET_ABOUT_MODAL_OPEN (line 35) | const SET_ABOUT_MODAL_OPEN = 'APPLICATION/SET_ABOUT_MODAL_OPEN';
  constant SET_REPORT_HELP_MODAL_OPEN (line 41) | const SET_REPORT_HELP_MODAL_OPEN = 'APPLICATION/SET_REPORT_HELP_MODAL_OP...
  constant SET_WELCOME_SCREEN_OPEN (line 47) | const SET_WELCOME_SCREEN_OPEN = 'APPLICATION/SET_WELCOME_SCREEN_OPEN';
  constant SET_CONNECTION_PROPERTIES (line 52) | const SET_CONNECTION_PROPERTIES = 'APPLICATION/SET_CONNECTION_PROPERTIES';
  constant SET_BASIC_CONNECTION_PROPERTIES (line 65) | const SET_BASIC_CONNECTION_PROPERTIES = 'APPLICATION/SET_BASIC_CONNECTIO...
  constant SET_DESKTOP_CONNECTION_PROPERTIES (line 78) | const SET_DESKTOP_CONNECTION_PROPERTIES = 'APPLICATION/SET_DESKTOP_CONNE...
  constant CLEAR_DESKTOP_CONNECTION_PROPERTIES (line 91) | const CLEAR_DESKTOP_CONNECTION_PROPERTIES = 'APPLICATION/CLEAR_DESKTOP_C...
  constant SET_OLD_DASHBOARD (line 98) | const SET_OLD_DASHBOARD = 'APPLICATION/SET_OLD_DASHBOARD';
  constant RESET_SHARE_DETAILS (line 105) | const RESET_SHARE_DETAILS = 'APPLICATION/RESET_SHARE_DETAILS';
  constant SET_SHARE_DETAILS_FROM_URL (line 111) | const SET_SHARE_DETAILS_FROM_URL = 'APPLICATION/SET_SHARE_DETAILS_FROM_U...
  constant SET_STANDALONE_ENABLED (line 141) | const SET_STANDALONE_ENABLED = 'APPLICATION/SET_STANDALONE_ENABLED';
  constant SET_STANDALONE_MODE (line 179) | const SET_STANDALONE_MODE = 'APPLICATION/SET_STANDALONE_MODE';
  constant SET_STANDALONE_DASHBOARD_DATEBASE (line 185) | const SET_STANDALONE_DASHBOARD_DATEBASE = 'APPLICATION/SET_STANDALONE_DA...
  constant SET_SSO_ENABLED (line 191) | const SET_SSO_ENABLED = 'APPLICATION/SET_SSO_ENABLED';
  constant SET_SSO_PROVIDERS (line 197) | const SET_SSO_PROVIDERS = 'APPLICATION/SET_SSO_PROVIDERS';
  constant SET_WAIT_FOR_SSO (line 203) | const SET_WAIT_FOR_SSO = 'APPLICATION/SET_WAIT_FOR_SSO';
  constant SET_CACHED_SSO_DISCOVERY_URL (line 209) | const SET_CACHED_SSO_DISCOVERY_URL = 'APPLICATION/SET_CACHED_SSO_DISCOVE...
  constant SET_SESSION_PARAMETERS (line 215) | const SET_SESSION_PARAMETERS = 'APPLICATION/SET_SESSION_PARAMETERS';
  constant SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING (line 221) | const SET_DASHBOARD_TO_LOAD_AFTER_CONNECTING = 'APPLICATION/SET_DASHBOAR...
  constant SET_PARAMETERS_TO_LOAD_AFTER_CONNECTING (line 227) | const SET_PARAMETERS_TO_LOAD_AFTER_CONNECTING = 'APPLICATION/SET_PARAMET...
  constant SET_CUSTOM_HEADER (line 233) | const SET_CUSTOM_HEADER = 'APPLICATION/SET_CUSTOM_HEADER';
  constant SET_DEPRECATION_NOTICE (line 239) | const SET_DEPRECATION_NOTICE = 'APPLICATION/SET_DEPRECATION_NOTICE';

FILE: src/application/logging/LoggingActions.ts
  constant LOGGING_PREFIX (line 1) | const LOGGING_PREFIX = 'APPLICATION/LOGGING/';
  constant SET_LOGGING_MODE (line 3) | const SET_LOGGING_MODE = `${LOGGING_PREFIX}/SET_LOGGING_MODE`;
  constant SET_LOGGING_DATABASE (line 9) | const SET_LOGGING_DATABASE = `${LOGGING_PREFIX}/SET_LOGGING_DATABASE`;
  constant SET_LOG_ERROR_NOTIFICATION (line 15) | const SET_LOG_ERROR_NOTIFICATION = `${LOGGING_PREFIX}/SET_LOG_ERROR_NOTI...

FILE: src/application/logging/LoggingReducer.ts
  constant LOGGING_INITIAL_STATE (line 5) | const LOGGING_INITIAL_STATE = {

FILE: src/card/CardActions.ts
  constant TOGGLE_CARD_SETTINGS (line 5) | const TOGGLE_CARD_SETTINGS = 'PAGE/CARD/TOGGLE_CARD_SETTINGS';
  constant HARD_RESET_CARD_SETTINGS (line 11) | const HARD_RESET_CARD_SETTINGS = 'PAGE/CARD/HARD_RESET_CARD_SETTINGS';
  constant UPDATE_REPORT_TITLE (line 17) | const UPDATE_REPORT_TITLE = 'PAGE/CARD/UPDATE_REPORT_TITLE';
  constant UPDATE_REPORT_SIZE (line 23) | const UPDATE_REPORT_SIZE = 'PAGE/CARD/UPDATE_REPORT_SIZE';
  constant UPDATE_REPORT_QUERY (line 29) | const UPDATE_REPORT_QUERY = 'PAGE/CARD/UPDATE_REPORT_QUERY';
  constant UPDATE_CYPHER_PARAMETERS (line 35) | const UPDATE_CYPHER_PARAMETERS = 'PAGE/CARD/UPDATE_CYPHER_PARAMETERS';
  constant UPDATE_REPORT_TYPE (line 41) | const UPDATE_REPORT_TYPE = 'PAGE/CARD/UPDATE_REPORT_TYPE';
  constant UPDATE_FIELDS (line 47) | const UPDATE_FIELDS = 'PAGE/CARD/UPDATE_FIELDS';
  constant UPDATE_SCHEMA (line 53) | const UPDATE_SCHEMA = 'PAGE/CARD/UPDATE_SCHEMA';
  constant UPDATE_SELECTION (line 59) | const UPDATE_SELECTION = 'PAGE/CARD/UPDATE_SELECTION';
  constant UPDATE_ALL_SELECTIONS (line 65) | const UPDATE_ALL_SELECTIONS = 'PAGE/CARD/UPDATE_ALL_SELECTIONS';
  constant CLEAR_SELECTION (line 71) | const CLEAR_SELECTION = 'PAGE/CARD/CLEAR_SELECTION';
  constant UPDATE_REPORT_SETTING (line 77) | const UPDATE_REPORT_SETTING = 'PAGE/CARD/UPDATE_REPORT_SETTING';
  constant TOGGLE_REPORT_SETTINGS (line 83) | const TOGGLE_REPORT_SETTINGS = 'PAGE/CARD/TOGGLE_REPORT_SETTINGS';
  constant UPDATE_REPORT_DATABASE (line 89) | const UPDATE_REPORT_DATABASE = 'PAGE/CARD/UPDATE_REPORT_DATABASE';

FILE: src/card/CardReducer.ts
  constant CARD_INITIAL_STATE (line 26) | const CARD_INITIAL_STATE = {

FILE: src/card/settings/CardSettingsContent.tsx
  function hasExtensionComponents (line 46) | function hasExtensionComponents() {
  function updateCypherQuery (line 54) | function updateCypherQuery(value) {
  function renderExtensionsComponents (line 59) | function renderExtensionsComponents() {

FILE: src/card/view/CardViewHeader.tsx
  function replaceParamsOnString (line 42) | function replaceParamsOnString(s, p) {

FILE: src/chart/Chart.ts
  type ChartProps (line 7) | interface ChartProps {
  type Neo4jSchema (line 29) | interface Neo4jSchema {

FILE: src/chart/ChartUtils.ts
  function valueIsArray (line 63) | function valueIsArray(value) {
  function valueIsNode (line 68) | function valueIsNode(value) {
  function valueIsRelationship (line 74) | function valueIsRelationship(value) {
  function valueIsPath (line 80) | function valueIsPath(value) {
  function valueisPoint (line 86) | function valueisPoint(value) {
  function valueIsObject (line 91) | function valueIsObject(value) {
  function toNumber (line 97) | function toNumber(ref) {
  function getRecordType (line 111) | function getRecordType(value) {
  function replaceDashboardParameters (line 187) | function replaceDashboardParameters(str, parameters) {
  function replaceDashboardParametersInString (line 236) | function replaceDashboardParametersInString(str, parameters) {
  function recordToNative (line 266) | function recordToNative(input: any): any {
  function resultToNative (line 284) | function resultToNative(result: QueryResult): Record<string, any> {
  function checkResultKeys (line 291) | function checkResultKeys(first: Neo4jRecord, keys: string[]) {
  function isCastableToNeo4jDate (line 413) | function isCastableToNeo4jDate(value: object) {
  function castToNeo4jDate (line 426) | function castToNeo4jDate(value: object) {
  function getSelectionBasedOnFields (line 436) | function getSelectionBasedOnFields(fields, oldSelection = {}, autoAssign...
  constant DEFAULT_NODE_LABELS (line 458) | const DEFAULT_NODE_LABELS = ['name', 'title', 'label', 'id', 'uid', '(la...

FILE: src/chart/Utils.ts
  function recordToNative (line 3) | function recordToNative(input: any): any {
  function resultToNative (line 21) | function resultToNative(result: QueryResult): Record<string, any> {
  function checkResultKeys (line 28) | function checkResultKeys(first: Neo4jRecord, keys: string[]) {
  type EntityType (line 115) | enum EntityType {

FILE: src/chart/bar/BarChart.tsx
  function calculateMarginBottom (line 112) | function calculateMarginBottom(legendPosition, showLegend, legendWidth, ...
  function calculateRightMargin (line 151) | function calculateRightMargin(legendPosition, legend, legendWidth, margi...
  function calculateLabelPosition (line 193) | function calculateLabelPosition(bar, positionLabel, layout) {
  function calculateWidth (line 355) | function calculateWidth(customDimensions, legendPosition, adaptableWidth...

FILE: src/chart/bar/util.ts
  function getOriginalRecordForNivoClickEvent (line 10) | function getOriginalRecordForNivoClickEvent(e, records, selection) {

FILE: src/chart/graph/GraphChart.tsx
  type GraphChartProps (line 24) | interface GraphChartProps extends ChartProps {
  constant DEFAULT_VISUALIZATION_COMPONENT (line 29) | const DEFAULT_VISUALIZATION_COMPONENT = NeoGraphChartVisualization2D;

FILE: src/chart/graph/GraphChartVisualization.ts
  type Layout (line 14) | type Layout = 'td' | 'bu' | 'lr' | 'rl' | 'radialout' | 'radialin';
  type GraphEntity (line 21) | interface GraphEntity {
  type Node (line 26) | interface Node extends GraphEntity {
  type Link (line 35) | interface Link extends GraphEntity {
  type GraphChartVisualizationProps (line 48) | interface GraphChartVisualizationProps {

FILE: src/chart/graph/component/GraphChartEditModal.tsx
  type EditType (line 21) | enum EditType {
  type EditAction (line 26) | enum EditAction {
  type GraphChartEditorVisualizationProps (line 32) | interface GraphChartEditorVisualizationProps extends GraphChartVisualiza...

FILE: src/chart/graph/component/GraphChartTooltip.tsx
  function getTooltip (line 10) | function getTooltip(entity: Node | Link) {

FILE: src/chart/graph/component/GraphEntityInspectionTable.tsx
  function handleCheckboxClick (line 41) | function handleCheckboxClick(parameter, checked) {

FILE: src/chart/graph/util/RecordUtils.ts
  function extractGraphEntitiesFromField (line 11) | function extractGraphEntitiesFromField(
  function buildGraphVisualizationObjectFromRecords (line 136) | function buildGraphVisualizationObjectFromRecords(
  function injectNewRecordsIntoGraphVisualization (line 225) | function injectNewRecordsIntoGraphVisualization(
  function checkIfAllRecordsAreNodes (line 273) | function checkIfAllRecordsAreNodes(records, fieldIndex) {
  function parseNodeRecordsToDictionaries (line 293) | function parseNodeRecordsToDictionaries(records, fieldIndex = 0) {

FILE: src/chart/graph/util/RelUtils.ts
  type Direction (line 1) | enum Direction {
  function assignCurvatureToLink (line 15) | function assignCurvatureToLink(link, index, nodePairListLength, mirrored...
  function getCurvature (line 31) | function getCurvature(index, total) {
  function recomputeCurvatures (line 105) | function recomputeCurvatures(links) {
  function mergeLinksLists (line 125) | function mergeLinksLists(oldLinks, newLinks) {

FILE: src/chart/line/LineChart.tsx
  type LineChartData (line 10) | interface LineChartData {

FILE: src/chart/map/MapChart.tsx
  function extractGraphEntitiesFromField (line 71) | function extractGraphEntitiesFromField(value) {
  function buildVisualizationDictionaryFromRecords (line 137) | function buildVisualizationDictionaryFromRecords(records) {

FILE: src/chart/map/layers/HeatmapLayer.tsx
  function createHeatmap (line 8) | function createHeatmap(data, props) {

FILE: src/chart/map/layers/LineLayer.tsx
  function createLines (line 6) | function createLines(data) {

FILE: src/chart/map/layers/MarkerLayer.tsx
  function createMarkers (line 11) | function createMarkers(data, props) {

FILE: src/chart/parameter/ParameterSelectCardSettings.tsx
  type ParameterId (line 12) | type ParameterId = string | undefined | null;
  function handleParameterTypeUpdate (line 82) | function handleParameterTypeUpdate(newValue) {
  function handleNodeLabelSelectionUpdate (line 91) | function handleNodeLabelSelectionUpdate(newValue) {
  function handleFreeTextNameSelectionUpdate (line 100) | function handleFreeTextNameSelectionUpdate(newValue) {
  function handlePropertyNameSelectionUpdate (line 109) | function handlePropertyNameSelectionUpdate(newValue) {
  function handlePropertyDisplayNameSelectionUpdate (line 123) | function handlePropertyDisplayNameSelectionUpdate(newValue) {
  function handleIdSelectionUpdate (line 132) | function handleIdSelectionUpdate(value) {
  function handleReportQueryUpdate (line 149) | function handleReportQueryUpdate(new_parameter_name, entityType, propert...
  function updateReportQuery (line 154) | function updateReportQuery(entityType, propertyType, propertyTypeDisplay) {

FILE: src/chart/parameter/component/DateParameterSelect.tsx
  function castPropsToBoltDate (line 8) | function castPropsToBoltDate(dict) {
  function castPropsToJsDate (line 15) | function castPropsToJsDate(dict) {

FILE: src/chart/parameter/component/ParameterSelect.ts
  type ParameterSelectProps (line 4) | interface ParameterSelectProps {

FILE: src/chart/table/TableChart.tsx
  constant TABLE_ROW_HEIGHT (line 28) | const TABLE_ROW_HEIGHT = 52;
  constant HIDDEN_COLUMN_PREFIX (line 29) | const HIDDEN_COLUMN_PREFIX = '__';
  function renderAsButtonWrapper (line 40) | function renderAsButtonWrapper(renderer) {
  function ApplyColumnType (line 55) | function ApplyColumnType(column, value, asAction) {

FILE: src/component/editor/CodeEditorComponent.tsx
  constant DEFAULT_CARD_SETTINGS_HELPER_TEXT_STYLE (line 5) | const DEFAULT_CARD_SETTINGS_HELPER_TEXT_STYLE = {

FILE: src/component/sso/SSOLoginButton.tsx
  function isLocalhost (line 33) | function isLocalhost(hostname) {

FILE: src/config/ApplicationConfig.ts
  type Screens (line 3) | const enum Screens {
  constant DEFAULT_SCREEN (line 10) | const DEFAULT_SCREEN = Screens.WELCOME_SCREEN;
  constant DEFAULT_NEO4J_URL (line 11) | const DEFAULT_NEO4J_URL = 'localhost';
  constant DEFAULT_DASHBOARD_TITLE (line 12) | const DEFAULT_DASHBOARD_TITLE = 'New dashboard';
  constant DASHBOARD_HEADER_COLOR (line 14) | const DASHBOARD_HEADER_COLOR = styleConfig?.style?.DASHBOARD_HEADER_COLO...
  constant DASHBOARD_HEADER_BUTTON_COLOR (line 16) | const DASHBOARD_HEADER_BUTTON_COLOR = styleConfig?.style?.DASHBOARD_HEAD...
  constant DASHBOARD_HEADER_TITLE_COLOR (line 18) | const DASHBOARD_HEADER_TITLE_COLOR = styleConfig?.style?.DASHBOARD_HEADE...
  constant DASHBOARD_HEADER_BRAND_LOGO (line 20) | const DASHBOARD_HEADER_BRAND_LOGO =
  constant IS_CUSTOM_LOGO (line 23) | const IS_CUSTOM_LOGO = Boolean(styleConfig?.style?.DASHBOARD_HEADER_BRAN...
  constant CUSTOM_CONNECTION_FOOTER_TEXT (line 25) | const CUSTOM_CONNECTION_FOOTER_TEXT = '';

FILE: src/config/CardConfig.ts
  constant CARD_FOOTER_HEIGHT (line 1) | const CARD_FOOTER_HEIGHT = 88;
  constant CARD_HEADER_HEIGHT (line 2) | const CARD_HEADER_HEIGHT = 72;
  type SELECTION_TYPES (line 4) | const enum SELECTION_TYPES {

FILE: src/config/DashboardConfig.ts
  constant DASHBOARD_SETTINGS (line 3) | const DASHBOARD_SETTINGS = {

FILE: src/config/ExampleConfig.ts
  constant EXAMPLE_REPORTS (line 9) | const EXAMPLE_REPORTS = [

FILE: src/config/PageConfig.ts
  constant GRID_COMPACTION_TYPE (line 1) | const GRID_COMPACTION_TYPE = 'vertical';

FILE: src/config/ReportConfig.tsx
  constant HARD_ROW_LIMITING (line 20) | const HARD_ROW_LIMITING = false;
  constant RUN_QUERY_DELAY_MS (line 23) | const RUN_QUERY_DELAY_MS = 300;
  constant DEFAULT_ROW_LIMIT (line 26) | const DEFAULT_ROW_LIMIT = 100;
  constant COMMON_REPORT_SETTINGS (line 1170) | const COMMON_REPORT_SETTINGS = {
  constant REPORT_TYPES (line 1224) | const REPORT_TYPES = objectMap(_REPORT_TYPES, (value: any) => {

FILE: src/config/StyleConfig.tsx
  class StyleConfig (line 3) | class StyleConfig {
    method constructor (line 8) | private constructor() {}
    method getInstance (line 10) | public static async getInstance(): Promise<StyleConfig> {
    method initialize (line 17) | async initialize() {
    method create (line 27) | static async create() {
    method applyCSS (line 34) | public applyCSS() {
    method complementColor (line 41) | public complementColor(color: string) {

FILE: src/dashboard/DashboardActions.ts
  constant RESET_DASHBOARD_STATE (line 1) | const RESET_DASHBOARD_STATE = 'DASHBOARD/RESET_DASHBOARD_STATE';
  constant SET_DASHBOARD (line 7) | const SET_DASHBOARD = 'DASHBOARD/SET_DASHBOARD';
  constant SET_DASHBOARD_UUID (line 13) | const SET_DASHBOARD_UUID = 'DASHBOARD/SET_DASHBOARD_UUID';
  constant SET_DASHBOARD_TITLE (line 19) | const SET_DASHBOARD_TITLE = 'DASHBOARD/SET_DASHBOARD_TITLE';
  constant CREATE_PAGE (line 25) | const CREATE_PAGE = 'DASHBOARD/CREATE_PAGE';
  constant REMOVE_PAGE (line 31) | const REMOVE_PAGE = 'DASHBOARD/REMOVE_PAGE';
  constant MOVE_PAGE (line 37) | const MOVE_PAGE = 'DASHBOARD/MOVE_PAGE';
  constant SET_EXTENSION_ENABLED (line 43) | const SET_EXTENSION_ENABLED = 'DASHBOARD/SET_EXTENSION_ENABLED';

FILE: src/dashboard/DashboardReducer.ts
  constant NEODASH_VERSION (line 21) | const NEODASH_VERSION = '2.4';
  constant VERSION_TO_MIGRATE (line 22) | const VERSION_TO_MIGRATE = {

FILE: src/dashboard/DashboardThunks.ts
  function setStatus (line 489) | function setStatus(status) {
  function runCallback (line 494) | function runCallback(records) {
  function patchDashboardVersion (line 553) | function patchDashboardVersion(dashboard: any, version: any) {
  function upgradeDashboardVersion (line 577) | function upgradeDashboardVersion(dashboard: any, origin: string, target:...

FILE: src/dashboard/header/DashboardHeaderAboutButton.tsx
  type HelpMenuOpenEvent (line 18) | type HelpMenuOpenEvent = React.MouseEvent<HTMLElement> | React.KeyboardE...

FILE: src/dashboard/header/DashboardHeaderPageList.tsx
  function handleDragEnd (line 41) | function handleDragEnd(event) {

FILE: src/dashboard/header/DashboardHeaderPageTitle.tsx
  type MenuEditEvent (line 13) | type MenuEditEvent = React.MouseEvent<HTMLElement> | React.KeyboardEvent...

FILE: src/dashboard/header/DashboardTitle.tsx
  type SettingsMenuOpenEvent (line 23) | type SettingsMenuOpenEvent = React.MouseEvent<HTMLElement> | React.Keybo...
  function renderExtensionsButtons (line 53) | function renderExtensionsButtons() {

FILE: src/dashboard/sidebar/DashboardSidebar.tsx
  type Menu (line 52) | enum Menu {
  type Modal (line 60) | enum Modal {
  constant UNSAVED_DASHBOARD_INDEX (line 75) | const UNSAVED_DASHBOARD_INDEX = -1;
  function createDashboard (line 127) | function createDashboard() {
  function deleteDashboard (line 133) | function deleteDashboard(uuid) {

FILE: src/dashboard/sidebar/modal/DashboardSidebarShareModal.tsx
  function getShareURL (line 22) | function getShareURL() {

FILE: src/extensions/ExtensionConfig.tsx
  type Extension (line 11) | interface Extension {
  constant EXTENSIONS (line 29) | const EXTENSIONS: Record<string, Extension> = {
  function getExtensionReducers (line 103) | function getExtensionReducers() {
  function getExtensionDrawerButtons (line 122) | function getExtensionDrawerButtons() {
  function getExtensionCardSettingsComponents (line 139) | function getExtensionCardSettingsComponents() {
  function getExtensionSettingsModal (line 157) | function getExtensionSettingsModal() {
  function getExtensionPrepopulateReportFunction (line 175) | function getExtensionPrepopulateReportFunction() {
  constant EXTENSIONS_REDUCERS (line 189) | const EXTENSIONS_REDUCERS = getExtensionReducers();
  constant EXTENSIONS_DRAWER_BUTTONS (line 190) | const EXTENSIONS_DRAWER_BUTTONS = getExtensionDrawerButtons();
  constant EXTENSIONS_SETTINGS_MODALS (line 191) | const EXTENSIONS_SETTINGS_MODALS = getExtensionSettingsModal();
  constant EXTENSIONS_CARD_SETTINGS_COMPONENT (line 192) | const EXTENSIONS_CARD_SETTINGS_COMPONENT = getExtensionCardSettingsCompo...
  constant EXTENSION_PREPOPULATE_REPORT_FUNCTION (line 193) | const EXTENSION_PREPOPULATE_REPORT_FUNCTION = getExtensionPrepopulateRep...

FILE: src/extensions/actions/ActionsRuleCreationModal.tsx
  constant RULE_CONDITIONS (line 14) | const RULE_CONDITIONS = {
  constant RULE_BASED_REPORT_ACTIONS_CUSTOMIZATIONS (line 78) | const RULE_BASED_REPORT_ACTIONS_CUSTOMIZATIONS = {

FILE: src/extensions/advancedcharts/AdvancedChartsExampleConfig.ts
  constant EXAMPLE_ADVANCED_REPORTS (line 12) | const EXAMPLE_ADVANCED_REPORTS = [

FILE: src/extensions/advancedcharts/AdvancedChartsReportConfig.tsx
  constant ADVANCED_REPORT_TYPES (line 959) | const ADVANCED_REPORT_TYPES = objectMap(_ADVANCED_REPORT_TYPES, (value: ...

FILE: src/extensions/advancedcharts/Utils.ts
  function isCyclicUtil (line 114) | function isCyclicUtil(i, visited, recStack, adj) {

FILE: src/extensions/advancedcharts/chart/areamap/AreaMapChart.tsx
  function createGeoDictionary (line 16) | function createGeoDictionary(records, selection) {
  function fromFeatureListToObject (line 42) | function fromFeatureListToObject(features, desiredLevel) {

FILE: src/extensions/advancedcharts/chart/areamap/PolygonLayer.tsx
  function getLegendRange (line 16) | function getLegendRange(min, max, legendLength) {
  function randomString (line 32) | function randomString() {
  function getDrillDown (line 43) | function getDrillDown(geoJson, features, key, keepConflict = false) {
  function bindDataToMap (line 75) | function bindDataToMap(geoData, geoJsonData) {
  function onDrillDown (line 155) | function onDrillDown(e) {
  function onEachFeature (line 160) | function onEachFeature(_, layer) {
  function getColor (line 181) | function getColor(weight, legendRange, listColors) {
  function ResetButton (line 203) | function ResetButton() {
  function Legend (line 230) | function Legend(colors, legendRange, dimensions) {

FILE: src/extensions/advancedcharts/chart/gantt/Utils.ts
  function createDependenciesMap (line 31) | function createDependenciesMap(links) {
  function createDependenciesDirectionsMap (line 43) | function createDependenciesDirectionsMap(links, direction_property) {
  function createTasksList (line 55) | function createTasksList(

FILE: src/extensions/advancedcharts/chart/gantt/frappe/GanttVisualization.tsx
  type GantRef (line 9) | type GantRef = SVGSVGElement | undefined;
  constant TASK_PADDING (line 11) | const TASK_PADDING = 9;
  constant HEADER_HEIGHT (line 12) | const HEADER_HEIGHT = 50;
  constant STEP_SIZE (line 13) | const STEP_SIZE = 8;
  constant COLUMN_WIDTH (line 14) | const COLUMN_WIDTH = 30;
  constant VIEW_MODE (line 15) | const VIEW_MODE = 'Day';
  class ReactGantt (line 20) | class ReactGantt extends Component {
    method getOptions (line 33) | getOptions() {
    method componentDidMount (line 62) | componentDidMount() {
    method componentDidUpdate (line 76) | componentDidUpdate(prevProps, _) {
    method componentWillUnmount (line 91) | componentWillUnmount() {
    method render (line 97) | render() {

FILE: src/extensions/advancedcharts/chart/gantt/frappe/lib/arrow.ts
  class Arrow (line 30) | class Arrow {
    method constructor (line 43) | constructor(gantt, from_task, to_task, direction) {
    method calculate_path (line 52) | calculate_path(direction) {
    method draw (line 196) | draw() {
    method update (line 204) | update() {

FILE: src/extensions/advancedcharts/chart/gantt/frappe/lib/bar.ts
  class Bar (line 9) | class Bar {
    method constructor (line 44) | constructor(gantt, task) {
    method set_defaults (line 51) | set_defaults(gantt, task) {
    method prepare (line 57) | prepare() {
    method prepare_values (line 62) | prepare_values() {
    method prepare_helpers (line 88) | prepare_helpers() {
    method draw (line 106) | draw() {
    method draw_bar (line 115) | draw_bar() {
    method draw_progress_bar (line 134) | draw_progress_bar() {
    method draw_label (line 153) | draw_label() {
    method draw_resize_handles (line 165) | draw_resize_handles() {
    method get_progress_polygon_points (line 204) | get_progress_polygon_points() {
    method bind (line 216) | bind() {
    method setup_click_event (line 223) | setup_click_event() {
    method show_popup (line 255) | show_popup() {
    method update_bar_position (line 276) | update_bar_position({ x = null, width = null }) {
    method date_changed (line 302) | date_changed() {
    method progress_changed (line 323) | progress_changed() {
    method set_action_completed (line 329) | set_action_completed() {
    method compute_start_end_date (line 334) | compute_start_end_date() {
    method compute_progress (line 344) | compute_progress() {
    method compute_x (line 349) | compute_x() {
    method compute_y (line 364) | compute_y() {
    method get_snap_position (line 372) | get_snap_position(dx) {
    method update_attr (line 390) | update_attr(element, attr, value) {
    method update_progressbar_position (line 398) | update_progressbar_position() {
    method update_label_position (line 406) | update_label_position() {
    method update_handle_position (line 419) | update_handle_position() {
    method update_arrow_position (line 430) | update_arrow_position() {
  function isFunction (line 438) | function isFunction(functionToCheck) {

FILE: src/extensions/advancedcharts/chart/gantt/frappe/lib/date_utils.js
  constant YEAR (line 6) | const YEAR = 'year';
  constant MONTH (line 7) | const MONTH = 'month';
  constant DAY (line 8) | const DAY = 'day';
  constant HOUR (line 9) | const HOUR = 'hour';
  constant MINUTE (line 10) | const MINUTE = 'minute';
  constant SECOND (line 11) | const SECOND = 'second';
  constant MILLISECOND (line 12) | const MILLISECOND = 'millisecond';
  method parse (line 18) | parse(date, date_separator = '-', time_separator = /[.:]/) {
  method to_string (line 49) | to_string(date, with_time = false) {
  method format (line 74) | format(date, format_string = 'YYYY-MM-DD HH:mm:ss.SSS', lang = 'en') {
  method diff (line 114) | diff(date_a, date_b, scale = DAY) {
  method today (line 142) | today() {
  method now (line 147) | now() {
  method add (line 151) | add(date, qty, scale) {
  method start_of (line 165) | start_of(date, scale) {
  method clone (line 194) | clone(date) {
  method get_date_values (line 198) | get_date_values(date) {
  method get_days_in_month (line 210) | get_days_in_month(date) {
  function padStart (line 229) | function padStart(str, targetLength, padString) {

FILE: src/extensions/advancedcharts/chart/gantt/frappe/lib/index.ts
  constant VIEW_MODE (line 14) | const VIEW_MODE = {
  class Gantt (line 24) | class Gantt {
    method constructor (line 75) | constructor(wrapper, tasks, options) {
    method setup_wrapper (line 84) | setup_wrapper(element) {
    method setup_options (line 132) | setup_options(options) {
    method setup_tasks (line 152) | setup_tasks(tasks) {
    method setup_dependencies (line 214) | setup_dependencies() {
    method refresh (line 224) | refresh(tasks) {
    method change_view_mode (line 236) | change_view_mode(mode = this.options.view_mode) {
    method update_view_scale (line 244) | update_view_scale(view_mode) {
    method setup_dates (line 271) | setup_dates() {
    method setup_gantt_dates (line 276) | setup_gantt_dates() {
    method setup_date_values (line 309) | setup_date_values() {
    method bind_events (line 329) | bind_events() {
    method render (line 334) | render() {
    method setup_layers (line 346) | setup_layers() {
    method make_grid (line 358) | make_grid() {
    method make_grid_background (line 366) | make_grid_background() {
    method make_grid_rows (line 387) | make_grid_rows() {
    method make_grid_header (line 419) | make_grid_header() {
    method make_grid_ticks (line 432) | make_grid_ticks() {
    method make_grid_highlights (line 472) | make_grid_highlights() {
    method make_dates (line 496) | make_dates() {
    method get_dates_to_draw (line 523) | get_dates_to_draw() {
    method get_date_info (line 533) | get_date_info(date, last_date, i) {
    method make_bars (line 600) | make_bars() {
    method make_arrows (line 608) | make_arrows() {
    method map_arrows_on_bars (line 632) | map_arrows_on_bars() {
    method set_width (line 640) | set_width() {
    method set_scroll_position (line 648) | set_scroll_position() {
    method bind_grid_click (line 662) | bind_grid_click() {
    method bind_bar_events (line 669) | bind_bar_events() {
    method bind_bar_progress (line 783) | bind_bar_progress() {
    method get_all_dependent_tasks (line 839) | get_all_dependent_tasks(task_id) {
    method get_snap_position (line 856) | get_snap_position(dx) {
    method unselect_all (line 877) | unselect_all() {
    method view_is (line 883) | view_is(modes) {
    method get_task (line 895) | get_task(id) {
    method get_bar (line 901) | get_bar(id) {
    method show_popup (line 907) | show_popup(options) {
    method hide_popup (line 916) | hide_popup() {
    method trigger_event (line 920) | trigger_event(event, args) {
    method get_oldest_starting_date (line 932) | get_oldest_starting_date() {
    method clear (line 943) | clear() {
  function generate_id (line 950) | function generate_id(task) {

FILE: src/extensions/advancedcharts/chart/gantt/frappe/lib/popup.ts
  class Popup (line 6) | class Popup {
    method constructor (line 17) | constructor(parent, custom_html) {
    method make (line 23) | make() {
    method show (line 37) | show(options) {
    method hide (line 82) | hide() {

FILE: src/extensions/advancedcharts/chart/gantt/frappe/lib/svg_utils.ts
  function $ (line 6) | function $(expr, con) {
  function createSVG (line 10) | function createSVG(tag, attrs) {
  function animateSVG (line 25) | function animateSVG(svgElement, attr, from, to) {
  function getAnimationElement (line 38) | function getAnimationElement(svgElement, attr, from, to, dur = '0.4s', b...
  function cubic_bezier (line 67) | function cubic_bezier(name) {

FILE: src/extensions/advancedcharts/chart/sankey/SankeyChart.tsx
  constant UNWEIGHTED_SANKEY_PROPERTY (line 12) | const UNWEIGHTED_SANKEY_PROPERTY = 'SANKEY_UNWEIGHTED';
  function extractGraphEntitiesFromField (line 61) | function extractGraphEntitiesFromField(value) {
  function buildVisualizationDictionaryFromRecords (line 108) | function buildVisualizationDictionaryFromRecords(records) {

FILE: src/extensions/forms/FormsExampleConfig.tsx
  constant EXAMPLE_FORMS (line 1) | const EXAMPLE_FORMS = [];

FILE: src/extensions/forms/FormsReportConfig.tsx
  constant FORMS (line 6) | const FORMS = {

FILE: src/extensions/forms/chart/NeoForm.tsx
  type FormStatus (line 12) | enum FormStatus {
  function forceRefreshDependentReports (line 38) | function forceRefreshDependentReports() {

FILE: src/extensions/forms/settings/NeoFormCardSettings.tsx
  function updateCypherQuery (line 29) | function updateCypherQuery(value) {
  function updateFormFields (line 34) | function updateFormFields(newFormFields) {

FILE: src/extensions/forms/settings/list/NeoFormSortableItem.tsx
  type Props (line 7) | interface Props {
  type Context (line 11) | interface Context {
  method ref (line 20) | ref() {}
  function SortableItem (line 23) | function SortableItem({ children, id }: PropsWithChildren<Props>) {
  function DragHandle (line 50) | function DragHandle() {

FILE: src/extensions/forms/settings/list/NeoFormSortableList.tsx
  type BaseItem (line 10) | interface BaseItem {
  type Props (line 14) | interface Props<T extends BaseItem> {
  function SortableList (line 20) | function SortableList<T extends BaseItem>({ items, onChange, renderItem ...

FILE: src/extensions/forms/settings/list/NeoFormSortableOverlay.tsx
  function SortableOverlay (line 16) | function SortableOverlay({ children }: PropsWithChildren) {

FILE: src/extensions/query-translator/component/OverrideCardQueryEditor.tsx
  type Language (line 38) | enum Language {
  function updateEnglishQuestion (line 70) | function updateEnglishQuestion(value) {
  function triggerTranslation (line 94) | function triggerTranslation() {

FILE: src/extensions/rbac/RBACUtils.ts
  type Operation (line 3) | enum Operation {
  function updatePrivileges (line 18) | async function updatePrivileges(
  function buildAccessQuery (line 113) | function buildAccessQuery(database, role, labels, operation: Operation, ...
  function retrieveLabelsList (line 219) | function retrieveLabelsList(driver, database: any, setLabels: (records: ...
  function retrieveDatabaseList (line 245) | function retrieveDatabaseList(driver, setDatabases: React.Dispatch<React...
  function updateUsers (line 267) | async function updateUsers(driver, currentRole, allUsers, selectedUsers,...

FILE: src/extensions/state/ExtensionActions.ts
  constant SET_EXTENSION_REDUCER_ENABLED (line 8) | const SET_EXTENSION_REDUCER_ENABLED = 'DASHBOARD/EXTENSIONS/SET_EXTENSIO...

FILE: src/extensions/state/ExtensionReducer.ts
  constant INITIAL_EXTENSIONS_STATE (line 4) | const INITIAL_EXTENSIONS_STATE = {

FILE: src/extensions/styling/StyleRuleCreationModal.tsx
  constant RULE_CONDITIONS (line 13) | const RULE_CONDITIONS = [
  constant RULE_BASED_REPORT_CUSTOMIZATIONS (line 45) | const RULE_BASED_REPORT_CUSTOMIZATIONS = {

FILE: src/extensions/styling/StyleRuleEvaluator.ts
  function useStyleRules (line 241) | function useStyleRules(enabled, rules, callback) {

FILE: src/extensions/text2cypher/QueryTranslatorConfig.ts
  type ClientSettingEntry (line 7) | interface ClientSettingEntry {
  type ClientSettings (line 17) | interface ClientSettings {
  type ClientConfig (line 23) | interface ClientConfig {
  type AvailableClients (line 30) | interface AvailableClients {
  type QueryTranslatorConfig (line 35) | interface QueryTranslatorConfig {
  constant QUERY_TRANSLATOR_CONFIG (line 39) | const QUERY_TRANSLATOR_CONFIG: QueryTranslatorConfig = {
  function getQueryTranslatorDefaultConfig (line 98) | function getQueryTranslatorDefaultConfig(providerName) {
  function getModelClientObject (line 108) | function getModelClientObject(modelProvider, settings) {

FILE: src/extensions/text2cypher/clients/AzureOpenAi/AzureOpenAiClient.ts
  class AzureOpenAiClient (line 9) | class AzureOpenAiClient extends OpenAiClient {
    method constructor (line 18) | constructor(settings) {
    method setModelClient (line 25) | setModelClient() {
    method getListModels (line 31) | async getListModels() {
    method chatCompletion (line 58) | async chatCompletion(history) {

FILE: src/extensions/text2cypher/clients/ModelClient.ts
  method constructor (line 34) | constructor(settings) {
  method setModelClient (line 42) | setModelClient() {
  method createSchemaText (line 53) | createSchemaText(nodeProps, relProps, rels) {
  method generateSchemaSample (line 77) | async generateSchemaSample(database) {
  method generateSchema (line 94) | async generateSchema(database) {
  method getTaskDefinition (line 107) | getTaskDefinition(schemaText) {
  method setDriver (line 114) | setDriver(driver: any) {
  method getMessageContent (line 118) | getMessageContent(_message: any) {
  method getExamplePrompt (line 123) | getExamplePrompt(examples) {
  method manageMessageHistory (line 129) | async manageMessageHistory(database, schema, schemaSampling, inputMessag...
  method queryTranslation (line 156) | async queryTranslation(
  method queryDatabase (line 241) | async queryDatabase(query, database, getFirstColumnOnly = true, paramete...
  method validateQuery (line 265) | async validateQuery(_message, _database) {
  method chatCompletion (line 269) | async chatCompletion(_history) {
  method addUserMessage (line 273) | addUserMessage(_content, _reportType, _plain = false) {
  method addSystemMessage (line 277) | addSystemMessage(_content) {
  method addAssistantMessage (line 281) | addAssistantMessage(_content) {
  method addErrorMessage (line 285) | addErrorMessage(_error) {
  type ModelConnectionState (line 291) | enum ModelConnectionState {

FILE: src/extensions/text2cypher/clients/OpenAi/OpenAiClient.ts
  class OpenAiClient (line 10) | class OpenAiClient extends ModelClient {
    method constructor (line 19) | constructor(settings) {
    method validateQuery (line 23) | async validateQuery(message, database) {
    method setModelClient (line 40) | setModelClient() {
    method authenticate (line 52) | async authenticate(
    method getListModels (line 73) | async getListModels() {
    method setApiKey (line 90) | setApiKey(apiKey) {
    method setDriver (line 98) | setDriver(driver) {
    method setListAvailableModels (line 102) | setListAvailableModels(listModels) {
    method setModelType (line 106) | setModelType(modelType) {
    method addUserMessage (line 117) | addUserMessage(content, reportType, plain = false) {
    method addSystemMessage (line 125) | addSystemMessage(content) {
    method addAssistantMessage (line 129) | addAssistantMessage(content) {
    method addErrorMessage (line 133) | addErrorMessage(error) {
    method getMessageContent (line 138) | getMessageContent(message: ChatCompletionRequestMessage) {
    method chatCompletion (line 142) | async chatCompletion(history) {

FILE: src/extensions/text2cypher/clients/VertexAiClient.ts
  class VertexAiClient (line 7) | class VertexAiClient extends ModelClient {}

FILE: src/extensions/text2cypher/clients/const.ts
  constant QUERY_TRANSLATOR_TASK (line 23) | const QUERY_TRANSLATOR_TASK = `
  constant SCHEMA_SAMPLING_NUMBER (line 53) | const SCHEMA_SAMPLING_NUMBER = 10000;
  constant MAX_NUM_VALIDATION (line 112) | const MAX_NUM_VALIDATION = 1;

FILE: src/extensions/text2cypher/component/ClientSettings.tsx
  function checkIfDisabled (line 75) | function checkIfDisabled(setting) {
  function setChoices (line 102) | function setChoices(setting, modelClient) {

FILE: src/extensions/text2cypher/component/LoadingIcon.tsx
  constant GPT_LOADING_ICON (line 4) | const GPT_LOADING_ICON = (

FILE: src/extensions/text2cypher/component/OverrideCardQueryEditor.tsx
  type Language (line 37) | enum Language {
  function updateEnglishQuestion (line 69) | function updateEnglishQuestion(value) {
  function triggerTranslation (line 95) | function triggerTranslation() {

FILE: src/extensions/text2cypher/component/model-examples/ExampleDisplayTable.tsx
  type Example (line 23) | type Example = {
  function ExampleDisplayTable (line 47) | function ExampleDisplayTable({ examples, deleteModelExample, handleEdit ...

FILE: src/extensions/text2cypher/component/model-examples/ExampleEditorModal.tsx
  function handleSubmit (line 33) | async function handleSubmit(e) {

FILE: src/extensions/text2cypher/component/model-examples/utils.ts
  function checkModelExampleAndSubmit (line 3) | async function checkModelExampleAndSubmit(

FILE: src/extensions/text2cypher/state/QueryTranslatorActions.ts
  constant QUERY_TRANSLATOR_ACTION_PREFIX (line 13) | const QUERY_TRANSLATOR_ACTION_PREFIX = 'DASHBOARD/EXTENSIONS/QUERY_TRANS...
  constant QUERY_TRANSLATOR_SESSION_STORAGE_ACTION_PREFIX (line 14) | const QUERY_TRANSLATOR_SESSION_STORAGE_ACTION_PREFIX = `DASHBOARD/EXTENS...
  constant SET_MODEL_PROVIDER (line 16) | const SET_MODEL_PROVIDER = `${QUERY_TRANSLATOR_ACTION_PREFIX}SET_MODEL_P...
  constant SET_CLIENT_SETTINGS (line 22) | const SET_CLIENT_SETTINGS = `${QUERY_TRANSLATOR_ACTION_PREFIX}SET_CLIENT...
  constant SET_GLOBAL_MODEL_CLIENT (line 28) | const SET_GLOBAL_MODEL_CLIENT = `${QUERY_TRANSLATOR_ACTION_PREFIX}SET_GL...
  constant UPDATE_LAST_MESSAGE (line 32) | const UPDATE_LAST_MESSAGE = `${QUERY_TRANSLATOR_ACTION_PREFIX}UPDATE_LAS...
  constant ADD_EXAMPLE (line 45) | const ADD_EXAMPLE = `${QUERY_TRANSLATOR_ACTION_PREFIX}ADD_EXAMPLE`;
  constant UPDATE_EXAMPLE (line 57) | const UPDATE_EXAMPLE = `${QUERY_TRANSLATOR_ACTION_PREFIX}UPDATE_EXAMPLE`;
  constant DELETE_EXAMPLE (line 70) | const DELETE_EXAMPLE = `${QUERY_TRANSLATOR_ACTION_PREFIX}DELETE_EXAMPLE`;

FILE: src/extensions/text2cypher/state/QueryTranslatorReducer.ts
  constant INITIAL_EXTENSION_STATE (line 14) | const INITIAL_EXTENSION_STATE = {

FILE: src/extensions/text2cypher/state/QueryTranslatorSelector.ts
  constant QUERY_TRANSLATOR_EXTENSION_NAME (line 3) | const QUERY_TRANSLATOR_EXTENSION_NAME = 'query-translator';
  constant QUERY_TRANSLATOR_HISTORY_PREFIX (line 4) | const QUERY_TRANSLATOR_HISTORY_PREFIX = `${QUERY_TRANSLATOR_EXTENSION_NA...

FILE: src/extensions/text2cypher/util/Status.ts
  type Status (line 1) | enum Status {

FILE: src/extensions/text2cypher/util/Util.ts
  function translateQuery (line 20) | function translateQuery(driver, dispatch, pagenumber, id, reportType, ex...

FILE: src/modal/ConnectionModal.tsx
  function NeoConnectionModal (line 8) | function NeoConnectionModal({

FILE: src/page/PageActions.ts
  constant CREATE_REPORT (line 1) | const CREATE_REPORT = 'PAGE/CREATE_REPORT';
  constant REMOVE_REPORT (line 7) | const REMOVE_REPORT = 'PAGE/REMOVE_REPORT';
  constant UPDATE_ALL_CARD_POSITIONS_IN_PAGE (line 13) | const UPDATE_ALL_CARD_POSITIONS_IN_PAGE = 'PAGE/UPDATE_ALL_CARD_POSITION...
  constant SET_PAGE_TITLE (line 19) | const SET_PAGE_TITLE = 'PAGE/SET_TITLE';
  constant FORCE_REFRESH_PAGE (line 25) | const FORCE_REFRESH_PAGE = 'PAGE/FORCE_REFRESH_PAGE';

FILE: src/page/PageReducer.ts
  constant PAGE_EXAMPLE_STATE (line 14) | const PAGE_EXAMPLE_STATE = {
  constant PAGE_EMPTY_STATE (line 45) | const PAGE_EMPTY_STATE = {

FILE: src/report/Report.tsx
  constant REPORT_LOADING_ICON (line 24) | const REPORT_LOADING_ICON = <LoadingSpinner size='large' className='cent...

FILE: src/report/ReportQueryRunner.ts
  type QueryStatus (line 4) | enum QueryStatus {
  function runCypherQuery (line 30) | async function runCypherQuery(

FILE: src/report/ReportRecordProcessing.tsx
  function extractNodePropertiesFromRecords (line 20) | function extractNodePropertiesFromRecords(records: any) {
  function extractNodeAndRelPropertiesFromRecords (line 38) | function extractNodeAndRelPropertiesFromRecords(records: any) {
  function mergeNodePropsFieldsLists (line 58) | function mergeNodePropsFieldsLists(oldFields: any[], newFields: any[]) {
  function saveNodePropertiesToDictionary (line 76) | function saveNodePropertiesToDictionary(field, fieldsDict) {
  function saveNodeAndRelPropertiesToDictionary (line 97) | function saveNodeAndRelPropertiesToDictionary(field, fieldsDict) {
  function addDirection (line 132) | function addDirection(relationship, start) {
  function RenderNode (line 142) | function RenderNode(value, hoverable = true) {
  function RenderNodeChip (line 180) | function RenderNodeChip(text, color = 'lightgrey', border = '0px') {
  function RenderRelationshipChip (line 188) | function RenderRelationshipChip(text, direction = undefined, color = 'li...
  function RenderRelationship (line 204) | function RenderRelationship(value, key = 0) {
  function RenderPath (line 238) | function RenderPath(value) {
  function RenderArray (line 256) | function RenderArray(value, transposedTable = false) {
  function RenderString (line 286) | function RenderString(value) {
  function RenderLink (line 298) | function RenderLink(value, disabled = false) {
  function RenderPoint (line 311) | function RenderPoint(value) {
  function RenderInteger (line 328) | function RenderInteger(value) {
  function RenderNumber (line 337) | function RenderNumber(value) {
  function RenderSubValue (line 345) | function RenderSubValue(value, transposedTable = false) {
  function getRendererForValue (line 427) | function getRendererForValue(value) {
  function renderValueByType (line 432) | function renderValueByType(value) {

FILE: src/sessionStorage/SessionStorageActions.ts
  constant SESSION_STORAGE_PREFIX (line 1) | const SESSION_STORAGE_PREFIX = 'NEODASH_SESSION_STORAGE';
  constant RESET_STATE (line 3) | const RESET_STATE = `${SESSION_STORAGE_PREFIX}/RESET_STATE`;
  constant STORE_VALUE_SESSION_STORAGE (line 9) | const STORE_VALUE_SESSION_STORAGE = `${SESSION_STORAGE_PREFIX}/STORE_VAL...
  constant DELETE_VALUE_SESSION_STORAGE (line 24) | const DELETE_VALUE_SESSION_STORAGE = `${SESSION_STORAGE_PREFIX}/DELETE_V...
  constant DELETE_ALL_KEYS_WITH_PREFIX_SESSION_STORAGE (line 34) | const DELETE_ALL_KEYS_WITH_PREFIX_SESSION_STORAGE = `${SESSION_STORAGE_P...

FILE: src/settings/SettingsActions.ts
  constant UPDATE_DASHBOARD_SETTING (line 1) | const UPDATE_DASHBOARD_SETTING = 'SETTINGS/UPDATE_DASHBOARD_SETTING';

FILE: src/settings/SettingsReducer.ts
  constant SETTINGS_INITIAL_STATE (line 5) | const SETTINGS_INITIAL_STATE = {

FILE: src/utils/ReportUtils.ts
  function validateQuery (line 6) | async function validateQuery(query, driver, database) {

FILE: src/utils/accessibility.ts
  class MouseSensor (line 5) | class MouseSensor extends LibMouseSensor {
  class KeyboardSensor (line 16) | class KeyboardSensor extends LibKeyboardSensor {
  function shouldHandleEvent (line 27) | function shouldHandleEvent(element: HTMLElement | null) {

FILE: src/utils/uuid.ts
  function createUUID (line 2) | function createUUID() {
Condensed preview — 384 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,623K chars).
[
  {
    "path": ".babelrc",
    "chars": 155,
    "preview": "{\n    \"presets\": [\"@babel/preset-env\", \"@babel/preset-react\",\"@babel/preset-typescript\"],\n    \"plugins\": [\"@babel/plugin"
  },
  {
    "path": ".eslintrc.json",
    "chars": 5151,
    "preview": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"plugins\": [\"@typescript-eslint\", \"react\"],\n  \"extends\": [\"eslint:recommend"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "chars": 1011,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n## Guidelines\nP"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.md",
    "chars": 723,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: feature\nassignees: ''\n\n---\n\n## Guide"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 381,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: 'npm'\n    directory: '/'\n    schedule:\n      interval: 'weekly'\n    target-br"
  },
  {
    "path": ".github/workflows/develop-deployment.yml",
    "chars": 1914,
    "preview": "name: Test/Deploy Develop\n\non:\n  push:\n    branches: [develop]\n\njobs:\n  build-test:\n    if: github.event.pull_request.dr"
  },
  {
    "path": ".github/workflows/develop-test.yml",
    "chars": 1144,
    "preview": "name: Test Develop\n\non:\n  pull_request:\n    branches: [develop]\n\njobs:\n  build-test:\n    if: github.event.pull_request.d"
  },
  {
    "path": ".github/workflows/master-deployment.yml",
    "chars": 6573,
    "preview": "name: Test/Deploy Master\n\non:\n  push:\n    branches: [master]\n\njobs:\n  build-test:\n    runs-on: neodash-runners\n    strat"
  },
  {
    "path": ".github/workflows/master-test.yml",
    "chars": 1003,
    "preview": "name: Test Master\n\non:\n  pull_request:\n    branches: [master]\n\njobs:\n  build-test:\n    runs-on: neodash-runners\n    stra"
  },
  {
    "path": ".gitignore",
    "chars": 473,
    "preview": ".idea\n*.iml\n*.pem\n*.cert\n*.passphrase\nnode_modules\nbuild\ntarget\n/node_modules\n/.pnp\n.pnp.js\n.vscode\n\n# testing\n/coverage"
  },
  {
    "path": ".husky/common.sh",
    "chars": 168,
    "preview": "command_exists () {\n  command -v \"$1\" >/dev/null 2>&1\n}\n\n# Workaround for Windows 10, Git Bash and Yarn\nif command_exist"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 107,
    "preview": "#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n. \"$(dirname -- \"$0\")/common.sh\"\n\nyarn run lint-staged\n"
  },
  {
    "path": ".lintstagedrc.json",
    "chars": 166,
    "preview": "{\n  \"*.ts\": [\"prettier --write\", \"eslint --fix\"],\n  \"*.tsx\": [\"prettier --write\", \"eslint --fix\"],\n  \"*.json\": [\"prettie"
  },
  {
    "path": ".npmignore",
    "chars": 130,
    "preview": "public\nsrc\n.env\n.env.hosted\n.gitignore\ntsconfig.json\nyarn.lock\nnode_modules\n*.tgz\ndesktop.passphrase\n*.config.js\ndesktop"
  },
  {
    "path": ".prettierignore",
    "chars": 31,
    "preview": "coverage\ndist\nnode_modules\ndocs"
  },
  {
    "path": ".prettierrc.json",
    "chars": 226,
    "preview": "{\n  \"printWidth\": 120,\n  \"semi\": true,\n  \"singleQuote\": true,\n  \"jsxSingleQuote\": true,\n  \"useTabs\": false,\n  \"tabWidth\""
  },
  {
    "path": "Dockerfile",
    "chars": 1553,
    "preview": "# build stage\nFROM node:lts-alpine3.18 AS build-stage\n\nRUN yarn global add typescript jest\nWORKDIR /usr/local/src/neodas"
  },
  {
    "path": "LICENSE",
    "chars": 11314,
    "preview": "     Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/l"
  },
  {
    "path": "README.md",
    "chars": 803,
    "preview": "## NeoDash Labs\nNeoDash is a dashboard builder for Neo4j, letting you build a graph dashboard in minutes.\n\n**This projec"
  },
  {
    "path": "about.md",
    "chars": 2613,
    "preview": "## About NeoDash Labs\n\n> NeoDash Labs is an unmaintained and unsupported tool. Use at your own risk!\n\nNeoDash is a web-b"
  },
  {
    "path": "changelog.md",
    "chars": 45836,
    "preview": "## NeoDash 2.4.10 - Community contributions\nThis is a minor release containing bug fixes and improvements contributed by"
  },
  {
    "path": "compose.yaml",
    "chars": 150,
    "preview": "services:\n  neodash:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    ports:\n      - \"5005:5005\"\n    environ"
  },
  {
    "path": "conf/default.conf.template",
    "chars": 489,
    "preview": "server {\n    listen       ${NGINX_PORT};\n    server_name  localhost;\n    include      mime.types;\n    location / {\n     "
  },
  {
    "path": "cypress/Page.js",
    "chars": 4339,
    "preview": "const DB_URL = 'localhost';\nconst DB_USERNAME = 'neo4j';\nconst DB_PASSWORD = 'test1234';\n\nexport class Page {\n  construc"
  },
  {
    "path": "cypress/e2e/charts/array.cy.js",
    "chars": 5518,
    "preview": "import { stringArrayCypherQuery, intArrayCypherQuery, pathArrayCypherQuery } from '../../fixtures/cypher_queries';\nimpor"
  },
  {
    "path": "cypress/e2e/charts/bar.cy.js",
    "chars": 9162,
    "preview": "import { barChartCypherQuery } from '../../fixtures/cypher_queries';\nimport { Page } from '../../Page';\n\nconst CARD_SELE"
  },
  {
    "path": "cypress/e2e/charts/table.cy.js",
    "chars": 1880,
    "preview": "import { tableCypherQuery } from '../../fixtures/cypher_queries';\nimport { Page } from '../../Page';\n\nconst page = new P"
  },
  {
    "path": "cypress/e2e/start_page.cy.js",
    "chars": 10247,
    "preview": "import {\n  tableCypherQuery,\n  barChartCypherQuery,\n  mapChartCypherQuery,\n  sunburstChartCypherQuery,\n  iFrameText,\n  m"
  },
  {
    "path": "cypress/fixtures/cypher_queries.js",
    "chars": 3393,
    "preview": "// Cypher queries - for component testing\nexport const defaultCypherQuery = 'MATCH (n) RETURN n LIMIT 25';\nexport const "
  },
  {
    "path": "cypress/index.js",
    "chars": 679,
    "preview": "// ***********************************************************\n// This example support/index.js is processed and\n// load"
  },
  {
    "path": "cypress/plugins/index.js",
    "chars": 494,
    "preview": "module.exports = (on, config) => {\n  require('@cypress/code-coverage/task')(on, config);\n  //Used to instrument code ran"
  },
  {
    "path": "cypress/support/commands.js",
    "chars": 1891,
    "preview": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom"
  },
  {
    "path": "cypress/support/e2e.ts",
    "chars": 713,
    "preview": "// ***********************************************************\n// This example support/index.js is processed and\n// load"
  },
  {
    "path": "cypress.config.ts",
    "chars": 564,
    "preview": "/* eslint @typescript-eslint/no-var-requires: \"off\" */\nimport { defineConfig } from 'cypress';\n\nexport default defineCon"
  },
  {
    "path": "docs/README.md",
    "chars": 603,
    "preview": "# NeoDash Documentation\n\nThis folder contains the documentation for the NeoDash project. The pages are written in AsciiD"
  },
  {
    "path": "docs/antora.yml",
    "chars": 234,
    "preview": "name: neodash\nversion: 2.4\ntitle: NeoDash\nstart_page: ROOT:index.adoc\nnav:\n  - modules/ROOT/nav.adoc\n\nasciidoc:\n  attrib"
  },
  {
    "path": "docs/modules/ROOT/nav.adoc",
    "chars": 2833,
    "preview": "* xref:index.adoc[Introduction]\n* xref:quickstart.adoc[Quickstart]\n* xref:user-guide/index.adoc[User Guide]\n** xref:user"
  },
  {
    "path": "docs/modules/ROOT/pages/banner.adoc",
    "chars": 225,
    "preview": "[NOTE]\n====\nThis documentation pertains to the unsupported version of NeoDash, as part of Neo4j Labs.\nFor users of the s"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/adding-visualizations.adoc",
    "chars": 3406,
    "preview": "include::../banner.adoc[]\n\n= Adding Visualizations\n\ninclude::../banner.adoc[]\n\nYou can extend NeoDash with your own visu"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/build-and-run.adoc",
    "chars": 5502,
    "preview": "include::../banner.adoc[]\n\n= Build & Run\n\ninclude::../banner.adoc[]\n\nTo start developing the application, you will need "
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/component-overview.adoc",
    "chars": 2631,
    "preview": "include::../banner.adoc[]\n\n= Component Overview\n\ninclude::../banner.adoc[]\n\nThe image below contains a high-level overvi"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/configuration.adoc",
    "chars": 8878,
    "preview": "include::../banner.adoc[]\n\n= Configuration\n\ninclude::../banner.adoc[]\n\nWhen using a custom NeoDash deployment, there are"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/contributing.adoc",
    "chars": 820,
    "preview": "include::../banner.adoc[]\n\n= Contributing\n\ninclude::../banner.adoc[]\n\nContributions to the project are highly welcomed. "
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/deploy-a-build.adoc",
    "chars": 1872,
    "preview": "= Deploy a Build\n\ninclude::../banner.adoc[]\n\nIf you have a pre-built NeoDash application, you can easily deploy it on an"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/design.adoc",
    "chars": 1655,
    "preview": "include::../banner.adoc[]\n\n= Design\n\ninclude::../banner.adoc[]\n\n\nThis page contains some key guidelines for design of th"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/index.adoc",
    "chars": 1450,
    "preview": "include::../banner.adoc[]\n\n= Developer Guide\n\ninclude::../banner.adoc[]\n\n\nThis guide contains information for developers"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/session-storage.adoc",
    "chars": 598,
    "preview": "include::../banner.adoc[]\n\n= Session Storage\n\ninclude::../banner.adoc[]\n\nThis reducer serves only to store data that we "
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc",
    "chars": 2807,
    "preview": "include::../banner.adoc[]\n\n= Standalone Mode\n\ninclude::../banner.adoc[]\n\nNext to being a dashboard editor, NeoDash can b"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/state-management.adoc",
    "chars": 4127,
    "preview": "include::../banner.adoc[]\n\n= State Management\n\ninclude::../banner.adoc[]\n\nNeoDash is an application with a complex inter"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/style-configuration.adoc",
    "chars": 2115,
    "preview": "include::../banner.adoc[]\n\n= Style Configuration\n\ninclude::../banner.adoc[]\n\nWhen using a custom NeoDash deployment, the"
  },
  {
    "path": "docs/modules/ROOT/pages/developer-guide/testing.adoc",
    "chars": 961,
    "preview": "include::../banner.adoc[]\n\n= Testing \n\ninclude::../banner.adoc[]\n\nNeoDash uses *Cypress* for automated testing. To insta"
  },
  {
    "path": "docs/modules/ROOT/pages/index.adoc",
    "chars": 847,
    "preview": "include::/banner.adoc[]\n\n= Introduction\n\nThis portal contains information on getting started with NeoDash - A Low-Code D"
  },
  {
    "path": "docs/modules/ROOT/pages/quickstart.adoc",
    "chars": 1130,
    "preview": "include::/banner.adoc[]\n\n= Quickstart\n\ninclude::/banner.adoc[]\n\nThere are three easy ways to run NeoDash and start dashb"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/access-control.adoc",
    "chars": 890,
    "preview": "include::../banner.adoc[]\n\n= Access Control\n\ninclude::../banner.adoc[]\n\nThe Access Control feature in NeoDash is a secur"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/bloom-integration.adoc",
    "chars": 1347,
    "preview": "include::../banner.adoc[]\n\n= Bloom Integration\n\ninclude::../banner.adoc[]\n\nNeoDash can be linked to Neo4j Bloom perspect"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/dashboards.adoc",
    "chars": 7043,
    "preview": "include::../banner.adoc[]\n\n= Dashboards\n\ninclude::../banner.adoc[]\n\nIn NeoDash, a dashboard consists of several pages, e"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/access-control-management.adoc",
    "chars": 2116,
    "preview": "\n= Access Control Management\n\ninclude::../../banner.adoc[]\n\nThis extension lets you manage access control for roles and "
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/advanced-visualizations.adoc",
    "chars": 1345,
    "preview": "\n= Advanced Visualizations\n\ninclude::../../banner.adoc[]\n\nAdvanced visualizations let you extend your dashboard with com"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/forms.adoc",
    "chars": 550,
    "preview": "\n= Forms\n\ninclude::../../banner.adoc[]\n\nThe 'forms' extension lets you combine different parameter selectors to update /"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/index.adoc",
    "chars": 1846,
    "preview": "\n= Extensions\n\ninclude::../../banner.adoc[]\n\nExtensions provide a way to expand the basic functionality of NeoDash with "
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/natural-language-queries.adoc",
    "chars": 6577,
    "preview": "\n= Text2Cypher - Natural Language Queries\n\ninclude::../../banner.adoc[]\n\nUse natural language to generate Cypher queries"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/report-actions.adoc",
    "chars": 1553,
    "preview": "\n= Report Actions \n\ninclude::../../banner.adoc[]\n\nlink:../#_2_pro_extensions[label:Pro&nbsp;Extension[]]\n\nReport actions"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/rule-based-styling.adoc",
    "chars": 1668,
    "preview": "\n= Rule-Based Styling \n\ninclude::../../banner.adoc[]\n\nThe rule-based styling extension allows users to dynamically color"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/extensions/workflows.adoc",
    "chars": 362,
    "preview": "\n= Workflows\n\ninclude::../../banner.adoc[]\n\nIntroducing an advanced extension for creating, managing, and running workfl"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/faq.adoc",
    "chars": 3580,
    "preview": "include::../banner.adoc[]\n\n= FAQ\n\ninclude::../banner.adoc[]\n\n== 1. How can I learn more about NeoDash?\n\nTo learn more, c"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/index.adoc",
    "chars": 680,
    "preview": "include::../banner.adoc[]\n\n= User Guide\n\ninclude::../banner.adoc[]\n\nThe following pages contain everything you need to g"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/pages.adoc",
    "chars": 748,
    "preview": "include::../banner.adoc[]\n\n= Pages\n\ninclude::../banner.adoc[]\n\nA page is a collection of link:../reports[reports] that c"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/publishing.adoc",
    "chars": 1422,
    "preview": "include::../banner.adoc[]\n\n= Publishing\n\ninclude::../banner.adoc[]\n\nWhen you are done building a dashboard, you may want"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/areamap.adoc",
    "chars": 2461,
    "preview": "\n= Area Map\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualizati"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/bar-chart.adoc",
    "chars": 4543,
    "preview": "\n= Bar Chart\n\ninclude::../../banner.adoc[]\n\nA bar chart will draw categories and values in a familiar bar-layout.\nThe ba"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/choropleth.adoc",
    "chars": 2177,
    "preview": "\n= Choropleth\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualiza"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/circle-packing.adoc",
    "chars": 1985,
    "preview": "\n= Circle Packing\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visua"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/form.adoc",
    "chars": 2761,
    "preview": "\n= Form\n\ninclude::../../banner.adoc[]\n\nA form is a special type of report that lets users run predefined, parameterized "
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/gantt.adoc",
    "chars": 3228,
    "preview": "\n= Gantt Chart\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualiz"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/gauge-chart.adoc",
    "chars": 1311,
    "preview": "\n= Gauge Chart\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualiz"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/graph.adoc",
    "chars": 6175,
    "preview": "\n= Graph\n\ninclude::../../banner.adoc[]\n\nThe graph report will render all returned nodes, relationships and paths\nin a fo"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/graph3d.adoc",
    "chars": 5895,
    "preview": "\n= 3D Graph\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualizati"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/iframe.adoc",
    "chars": 1239,
    "preview": "\n= iFrame\n\ninclude::../../banner.adoc[]\n\nAn iFrame report lets you embed a webpage inside your NeoDash dashboard.\nThe pa"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/index.adoc",
    "chars": 3987,
    "preview": "\n= Reports\n\ninclude::../../banner.adoc[]\n\nA report is the smallest building build of your dashboard. Each report\nwill ha"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/line-chart.adoc",
    "chars": 4730,
    "preview": "\n= Line Chart\n\ninclude::../../banner.adoc[]\n\nA line chart can be used to draw one or more lines in a two-dimensional\npla"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/map.adoc",
    "chars": 4524,
    "preview": "\n= Map\n\ninclude::../../banner.adoc[]\n\nThe map report will render all returned nodes, relationships and paths\non a geomap"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/markdown.adoc",
    "chars": 1418,
    "preview": "\n= Markdown\n\ninclude::../../banner.adoc[]\n\nMarkdown reports let you specify\nhttps://docs.github.com/en/get-started/writi"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/parameter-select.adoc",
    "chars": 2875,
    "preview": "\n= Parameter Select\n\ninclude::../../banner.adoc[]\n\nParameter select reports provide you with an easy way to add\ninteract"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/pie-chart.adoc",
    "chars": 3314,
    "preview": "\n= Pie Chart\n\ninclude::../../banner.adoc[]\n\nA pie chart will draw categories and values in a circular disc layout.\nThe p"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/radar.adoc",
    "chars": 2398,
    "preview": "\n= Radar Chart\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualiz"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/raw-json.adoc",
    "chars": 815,
    "preview": "\n= Raw JSON\n\ninclude::../../banner.adoc[]\n\nThe Raw JSON report renders the JSON response received from Neo4j\ndirectly. T"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/sankey.adoc",
    "chars": 2421,
    "preview": "\n= Sankey Chart\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visuali"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/single-value.adoc",
    "chars": 1675,
    "preview": "\n= Single Value\n\ninclude::../../banner.adoc[]\n\nA single value report will render the first column of the first row\nretur"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/sunburst.adoc",
    "chars": 2478,
    "preview": "\n= Sunburst\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualizati"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/table.adoc",
    "chars": 3935,
    "preview": "\n= Table\n\ninclude::../../banner.adoc[]\n\nThe most common report in a dashboard is often a simple table view.\nNeoDash cont"
  },
  {
    "path": "docs/modules/ROOT/pages/user-guide/reports/treemap.adoc",
    "chars": 1955,
    "preview": "\n= Treemap\n\ninclude::../../banner.adoc[]\n\nlink:../../extensions/advanced-visualizations[label:Advanced&nbsp;Visualizatio"
  },
  {
    "path": "docs/package.json",
    "chars": 749,
    "preview": "{\n    \"name\": \"docs\",\n    \"version\": \"1.0.0\",\n    \"description\": \"\",\n    \"main\": \"server.js\",\n    \"scripts\": {\n      \"te"
  },
  {
    "path": "docs/preview.yml",
    "chars": 457,
    "preview": "site:\n  title: NeoDash\n\ncontent:\n  sources:\n  - url: ../\n    start_path: docs\n    branches: HEAD\n    exclude:\n    - '!**"
  },
  {
    "path": "docs/server.js",
    "chars": 245,
    "preview": "const express = require('express')\n\nconst app = express()\nconst version = \"2.4\"\napp.use(express.static('./build/site'))\n"
  },
  {
    "path": "gallery/.gitignore",
    "chars": 310,
    "preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pn"
  },
  {
    "path": "gallery/LICENSE",
    "chars": 11314,
    "preview": "     Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/l"
  },
  {
    "path": "gallery/README.md",
    "chars": 959,
    "preview": "# NeoDash Dashboard Gallery 🎨\nThis is the source code for the NeoDash dashboard gallery located at [https://neodash-gall"
  },
  {
    "path": "gallery/dashboards/assessment.json",
    "chars": 6853,
    "preview": "{\n  \"title\": \"Graph Assessment\",\n  \"version\": \"2.1\",\n  \"settings\": {\n    \"pagenumber\": 1,\n    \"editable\": true,\n    \"ful"
  },
  {
    "path": "gallery/dashboards/bom-english.json",
    "chars": 8824,
    "preview": "{\n    \"title\": \"BOM - Bill of Material\",\n    \"version\": \"2.1\",\n    \"settings\": {\n      \"pagenumber\": 0,\n      \"editable\""
  },
  {
    "path": "gallery/dashboards/bom.json",
    "chars": 8147,
    "preview": "{\n  \"title\": \"BOM - Lista de materiales\",\n  \"version\": \"2.1\",\n  \"settings\": {\n    \"pagenumber\": 0,\n    \"editable\": true,"
  },
  {
    "path": "gallery/dashboards/citation.json",
    "chars": 11697,
    "preview": "{\n  \"title\": \"Citation graph - Topic extraction, recommendation, and Bloom exploration\",\n  \"version\": \"2.2\",\n  \"settings"
  },
  {
    "path": "gallery/dashboards/domains.json",
    "chars": 8451,
    "preview": "{\n    \"title\": \"New Caledonia Domains Dashboard\",\n    \"version\": \"2.1\",\n    \"settings\": {\n      \"pagenumber\": 0,\n      \""
  },
  {
    "path": "gallery/dashboards/fraud.json",
    "chars": 11677,
    "preview": "{\n  \"uuid\": \"b3236f88-ff8b-492d-8a84-d620a3dd629d\",\n  \"title\": \"Financial Crimes Enforcement Dashboard 🕵️\",\n  \"version\":"
  },
  {
    "path": "gallery/dashboards/jokes.json",
    "chars": 9200,
    "preview": "{\n  \"title\": \"Dad Jokes Dashboard\",\n  \"version\": \"2.2\",\n  \"settings\": {\n    \"pagenumber\": 0,\n    \"editable\": true,\n    \""
  },
  {
    "path": "gallery/dashboards/movies.json",
    "chars": 8588,
    "preview": "{\n    \"title\": \"NeoDash Movies Dashboard 🎬\",\n    \"version\": \"2.1\",\n    \"settings\": {\n      \"pagenumber\": 0,\n      \"edita"
  },
  {
    "path": "gallery/dashboards/recommendations.json",
    "chars": 8821,
    "preview": "{\n    \"title\": \"NeoDash Recommendations Dashboard 🎬\",\n    \"version\": \"2.1\",\n    \"settings\": {\n      \"pagenumber\": 0,\n   "
  },
  {
    "path": "gallery/dashboards/twitter.json",
    "chars": 11935,
    "preview": "{\n  \"title\": \"NeoDash Twitter Dashboard 📲\",\n  \"version\": \"2.1\",\n  \"settings\": {\n    \"pagenumber\": 0,\n    \"editable\": tru"
  },
  {
    "path": "gallery/dashboards/wine.json",
    "chars": 8610,
    "preview": "{\n  \"title\": \"Revue de vins par Winemag\",\n  \"version\": \"2.2\",\n  \"settings\": {\n    \"pagenumber\": 0,\n    \"editable\": true,"
  },
  {
    "path": "gallery/package.json",
    "chars": 979,
    "preview": "{\n  \"name\": \"neodash-gallery\",\n  \"version\": \"0.2\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@neo4j-ndl/base\": \"^0.8.3"
  },
  {
    "path": "gallery/postcss.config.js",
    "chars": 82,
    "preview": "module.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}\n"
  },
  {
    "path": "gallery/public/index.html",
    "chars": 2021,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"icon\" href=\"%PUBLIC_URL%/favicon.i"
  },
  {
    "path": "gallery/public/manifest.json",
    "chars": 510,
    "preview": "{\n  \"short_name\": \"NeoDash Dashboard Gallery\",\n  \"name\": \"NeoDash Dashboard Gallery\",\n  \"icons\": [\n    {\n      \"src\": \"f"
  },
  {
    "path": "gallery/public/robots.txt",
    "chars": 67,
    "preview": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "gallery/setup.md",
    "chars": 3283,
    "preview": "## Setting up the gallery back-end\n\nThe NeoDash gallery is powered by a Neo4j Aura Enterprise instance, available at `ac"
  },
  {
    "path": "gallery/src/App.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "gallery/src/App.tsx",
    "chars": 5958,
    "preview": "import React from 'react';\nimport './App.css';\nimport { Button, TextInput, HeroIcon, Tag, Alert } from '@neo4j-ndl/react"
  },
  {
    "path": "gallery/src/index.css",
    "chars": 469,
    "preview": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nbody {\n  margin: 0;\n  height: 100%;\n  background-color: whit"
  },
  {
    "path": "gallery/src/index.tsx",
    "chars": 710,
    "preview": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport App from './App';\nimpor"
  },
  {
    "path": "gallery/src/react-app-env.d.ts",
    "chars": 40,
    "preview": "/// <reference types=\"react-scripts\" />\n"
  },
  {
    "path": "gallery/src/reportWebVitals.ts",
    "chars": 425,
    "preview": "import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntr"
  },
  {
    "path": "gallery/src/setupTests.ts",
    "chars": 241,
    "preview": "// jest-dom adds custom jest matchers for asserting on DOM nodes.\n// allows you to do things like:\n// expect(element).to"
  },
  {
    "path": "gallery/tailwind.config.js",
    "chars": 285,
    "preview": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: [\n    \"./src/**/*.{js,jsx,ts,tsx}\",\n  ],\n  the"
  },
  {
    "path": "gallery/tsconfig.json",
    "chars": 503,
    "preview": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"sk"
  },
  {
    "path": "k8s-deploy/neodash/.helmignore",
    "chars": 349,
    "preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
  },
  {
    "path": "k8s-deploy/neodash/Chart.yaml",
    "chars": 1150,
    "preview": "apiVersion: v2\nname: neodash\ndescription: A NeoDash Helm chart for Kubernetes\n\n# A chart can be either an 'application' "
  },
  {
    "path": "k8s-deploy/neodash/README.md",
    "chars": 4220,
    "preview": "# NeoDash\n\n![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: applica"
  },
  {
    "path": "k8s-deploy/neodash/templates/NOTES.txt",
    "chars": 1979,
    "preview": "The NeoDash application has been successfully deployed, here is the application URL:\n{{- if .Values.ingress.enabled }}\n{"
  },
  {
    "path": "k8s-deploy/neodash/templates/_helpers.tpl",
    "chars": 1782,
    "preview": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"neodash.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | tru"
  },
  {
    "path": "k8s-deploy/neodash/templates/deployment.yaml",
    "chars": 2561,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ include \"neodash.fullname\" . }}\n  labels:\n    {{- include \"neo"
  },
  {
    "path": "k8s-deploy/neodash/templates/hpa.yaml",
    "chars": 991,
    "preview": "{{- if .Values.autoscaling.enabled }}\napiVersion: autoscaling/v2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: {{ incl"
  },
  {
    "path": "k8s-deploy/neodash/templates/ingress.yaml",
    "chars": 2079,
    "preview": "{{- if .Values.ingress.enabled -}}\n{{- $fullName := include \"neodash.fullname\" . -}}\n{{- $svcPort := .Values.service.por"
  },
  {
    "path": "k8s-deploy/neodash/templates/service.yaml",
    "chars": 490,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"neodash.fullname\" . }}\n  labels:\n    {{- include \"neodash.lab"
  },
  {
    "path": "k8s-deploy/neodash/templates/serviceaccount.yaml",
    "chars": 389,
    "preview": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"neodash.servi"
  },
  {
    "path": "k8s-deploy/neodash/templates/tests/test-connection.yaml",
    "chars": 486,
    "preview": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"neodash.fullname\" . }}-test-connection\"\n  labels:\n    {{- includ"
  },
  {
    "path": "k8s-deploy/neodash/values.yaml",
    "chars": 2393,
    "preview": "# Name override or full name override\nnameOverride: ''\nfullnameOverride: neodash-test\n\n# Number of pods\nreplicaCount: 1\n"
  },
  {
    "path": "k8s-deploy/sample-k8s-yamls/deployment.yaml",
    "chars": 1753,
    "preview": "---\n# Source: neodash/templates/deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: neodash\n  labels:"
  },
  {
    "path": "k8s-deploy/sample-k8s-yamls/service.yaml",
    "chars": 298,
    "preview": "---\n# Source: neodash/templates/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: neodash\n  labels:\n    applic"
  },
  {
    "path": "package.json",
    "chars": 4706,
    "preview": "{\n  \"name\": \"neodash\",\n  \"version\": \"2.4.11\",\n  \"description\": \"NeoDash - Neo4j Dashboard Builder\",\n  \"neo4jDesktop\": {\n"
  },
  {
    "path": "postcss.config.js",
    "chars": 115,
    "preview": "const tailwindcss = require('tailwindcss');\n\nmodule.exports = {\n  plugins: ['postcss-preset-env', tailwindcss],\n};\n"
  },
  {
    "path": "public/README.md",
    "chars": 153,
    "preview": "# Web Content Directory\nAfter building the application with `npm run build`, deploy this folder (now renamed from `publi"
  },
  {
    "path": "public/config.json",
    "chars": 591,
    "preview": "{\n  \"ssoEnabled\": false,\n  \"ssoProviders\": [],\n  \"ssoDiscoveryUrl\": \"https://example.com\",\n  \"standalone\": false,\n  \"sta"
  },
  {
    "path": "public/embed-test.html",
    "chars": 1106,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\" />\n    <title>Embed test</title>\n</head>\n\n<body>\n    <p>I am an "
  },
  {
    "path": "public/index.html",
    "chars": 1673,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "public/manifest.json",
    "chars": 482,
    "preview": "{\n    \"short_name\": \"NeoDash\",\n    \"name\": \"NeoDash\",\n    \"homepage\": \"https://github.com/neo4j-labs/neodash/\",\n    \"neo"
  },
  {
    "path": "public/style.config.json",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "public/style.css",
    "chars": 4693,
    "preview": "/* Needle */\n.logo-btn.large .ndl-icon {\n  width: 36px !important;\n  height: 36px !important;\n}\n\n.ndl-modal hr {\n  margi"
  },
  {
    "path": "release-notes.md",
    "chars": 85,
    "preview": "## NeoDash 2.4.11\n- Fixed deeplinking in standalone mode\n- Added deprecation notice.\n"
  },
  {
    "path": "scripts/config-entrypoint.sh",
    "chars": 2087,
    "preview": "#!/bin/sh\n###########\nset -e \n\necho \" \\\n    { \\\n    \\\"ssoEnabled\\\": ${ssoEnabled:=false}, \\\n    \\\"ssoProviders\\\": ${ssoP"
  },
  {
    "path": "scripts/docker-neo4j-initializer/docker-neo4j.sh",
    "chars": 122,
    "preview": "docker run \\\n    --name neo4j \\\n    -p7474:7474 -p7687:7687 \\\n    -d \\\n    --env NEO4J_AUTH=neo4j/test1234 \\\n    neo4j:4"
  },
  {
    "path": "scripts/docker-neo4j-initializer/movies.cypher",
    "chars": 27783,
    "preview": "CREATE CONSTRAINT IF NOT EXISTS FOR (p:Person) REQUIRE (p.name) IS UNIQUE;\nCREATE INDEX IF NOT EXISTS FOR (p:Person) ON "
  },
  {
    "path": "scripts/docker-neo4j-initializer/start-movies-db.sh",
    "chars": 251,
    "preview": "echo \"Loading Dataset\"\ncat ./scripts/docker-neo4j-initializer/movies.cypher | docker exec --interactive neo4j bin/cypher"
  },
  {
    "path": "scripts/message-entrypoint.sh",
    "chars": 598,
    "preview": "#!/bin/sh\n###########\n\necho \"-------------------------------------------------------------------------------------------"
  },
  {
    "path": "src/application/Application.tsx",
    "chars": 10632,
    "preview": "import React, { Suspense, useEffect } from 'react';\nimport NeoWelcomeScreenModal from '../modal/WelcomeScreenModal';\nimp"
  },
  {
    "path": "src/application/ApplicationActions.ts",
    "chars": 7261,
    "preview": "/**\n * This file contains all state-changing actions relevant for the main application.\n */\n\nexport const CLEAR_NOTIFICA"
  },
  {
    "path": "src/application/ApplicationReducer.ts",
    "chars": 10275,
    "preview": "/**\n * Reducers define changes to the application state when a given action is taken.\n */\n\nimport {\n  HARD_RESET_CARD_SE"
  },
  {
    "path": "src/application/ApplicationSelectors.ts",
    "chars": 4453,
    "preview": "import { initialState } from '../dashboard/DashboardReducer';\nimport isEqual from 'lodash.isequal';\n\n/**\n * Selectors de"
  },
  {
    "path": "src/application/ApplicationThunks.ts",
    "chars": 25295,
    "preview": "import { createDriver } from 'use-neo4j';\nimport { initializeSSO } from '../component/sso/SSOUtils';\nimport { DEFAULT_SC"
  },
  {
    "path": "src/application/logging/LoggingActions.ts",
    "chars": 693,
    "preview": "export const LOGGING_PREFIX = 'APPLICATION/LOGGING/';\n\nexport const SET_LOGGING_MODE = `${LOGGING_PREFIX}/SET_LOGGING_MO"
  },
  {
    "path": "src/application/logging/LoggingReducer.ts",
    "chars": 1153,
    "preview": "import { LOGGING_PREFIX, SET_LOGGING_DATABASE, SET_LOGGING_MODE, SET_LOG_ERROR_NOTIFICATION } from './LoggingActions';\n\n"
  },
  {
    "path": "src/application/logging/LoggingSelectors.ts",
    "chars": 263,
    "preview": "/**\n * Selector function for retrieving logging settings from the application state.\n * @param state - The application s"
  },
  {
    "path": "src/application/logging/LoggingThunk.ts",
    "chars": 3374,
    "preview": "import { createNotificationThunk } from '../../page/PageThunks';\nimport { runCypherQuery } from '../../report/ReportQuer"
  },
  {
    "path": "src/card/Card.tsx",
    "chars": 11475,
    "preview": "import { Card, Collapse, debounce } from '@mui/material';\nimport React, { useCallback, useContext, useEffect, useState }"
  },
  {
    "path": "src/card/CardActions.ts",
    "chars": 3408,
    "preview": "/**\n * A list of actions to perform on cards.\n */\n\nexport const TOGGLE_CARD_SETTINGS = 'PAGE/CARD/TOGGLE_CARD_SETTINGS';"
  },
  {
    "path": "src/card/CardAddButton.tsx",
    "chars": 961,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport { Card, CardContent } from '@mui/material';\nimp"
  },
  {
    "path": "src/card/CardReducer.ts",
    "chars": 3885,
    "preview": "import {\n  CLEAR_SELECTION,\n  HARD_RESET_CARD_SETTINGS,\n  TOGGLE_REPORT_SETTINGS,\n  UPDATE_ALL_SELECTIONS,\n  UPDATE_CYPH"
  },
  {
    "path": "src/card/CardSelectors.ts",
    "chars": 261,
    "preview": "export const getDashboardTitle = (state: any) => state.dashboard.title;\n\nexport const getReportState = (state: any, id: "
  },
  {
    "path": "src/card/CardStyle.ts",
    "chars": 136,
    "preview": "// TODO We need to refactor styled components\nimport styled from 'styled-components';\n\nexport const ReportItemContainer "
  },
  {
    "path": "src/card/CardThunks.ts",
    "chars": 7673,
    "preview": "import {\n  updateReportTitle,\n  updateReportQuery,\n  updateSelection,\n  updateCypherParameters,\n  updateFields,\n  update"
  },
  {
    "path": "src/card/settings/CardSettings.tsx",
    "chars": 3277,
    "preview": "import React from 'react';\nimport { ReportItemContainer } from '../CardStyle';\nimport NeoCardSettingsHeader from './Card"
  },
  {
    "path": "src/card/settings/CardSettingsContent.tsx",
    "chars": 5844,
    "preview": "import React, { useEffect } from 'react';\nimport CardContent from '@mui/material/CardContent';\nimport debounce from 'lod"
  },
  {
    "path": "src/card/settings/CardSettingsFooter.tsx",
    "chars": 7847,
    "preview": "import React, { useEffect } from 'react';\nimport debounce from 'lodash/debounce';\nimport { useCallback } from 'react';\ni"
  },
  {
    "path": "src/card/settings/CardSettingsHeader.tsx",
    "chars": 2606,
    "preview": "import React from 'react';\nimport { Tooltip, CardHeader } from '@mui/material';\nimport { IconButton } from '@neo4j-ndl/r"
  },
  {
    "path": "src/card/view/CardView.tsx",
    "chars": 8982,
    "preview": "import React, { useEffect, useState } from 'react';\nimport { ReportItemContainer } from '../CardStyle';\nimport NeoCardVi"
  },
  {
    "path": "src/card/view/CardViewFooter.tsx",
    "chars": 6560,
    "preview": "import React from 'react';\nimport { CardActions, FormControl, InputLabel, MenuItem, Select } from '@mui/material';\nimpor"
  },
  {
    "path": "src/card/view/CardViewHeader.tsx",
    "chars": 6861,
    "preview": "import React, { useEffect } from 'react';\nimport { Badge, CardHeader, Dialog, DialogContent, DialogTitle, TextField, Too"
  },
  {
    "path": "src/chart/Chart.ts",
    "chars": 2251,
    "preview": "import { Record as Neo4jRecord } from 'neo4j-driver';\n\n/**\n * Interface for all charts that NeoDash can render.\n * When "
  },
  {
    "path": "src/chart/ChartUtils.ts",
    "chars": 14601,
    "preview": "import domtoimage from 'dom-to-image';\nimport { Date as Neo4jDate } from 'neo4j-driver-core/lib/temporal-types.js';\n\n/**"
  },
  {
    "path": "src/chart/SettingsUtils.ts",
    "chars": 1401,
    "preview": "import { getReportTypes } from '../extensions/ExtensionUtils';\nimport { useStyleRules } from '../extensions/styling/Styl"
  },
  {
    "path": "src/chart/Utils.ts",
    "chars": 5494,
    "preview": "import { tokens } from '@neo4j-ndl/base';\nimport { QueryResult, Record as Neo4jRecord } from 'neo4j-driver';\nexport func"
  },
  {
    "path": "src/chart/bar/BarChart.tsx",
    "chars": 14837,
    "preview": "import { ResponsiveBar, ResponsiveBarCanvas } from '@nivo/bar';\nimport React, { useEffect } from 'react';\nimport { NoDra"
  },
  {
    "path": "src/chart/bar/util.ts",
    "chars": 1908,
    "preview": "/**\n * Utility function to reverse engineer, from an event on a Nivo bar chart, what the original Neo4j record was the d"
  },
  {
    "path": "src/chart/graph/GraphChart.tsx",
    "chars": 11043,
    "preview": "import React, { useEffect, useState } from 'react';\nimport useDimensions from 'react-cool-dimensions';\nimport { ChartPro"
  },
  {
    "path": "src/chart/graph/GraphChartVisualization.ts",
    "chars": 5560,
    "preview": "/**\n * A mapping between human-readable layout names, and the ones used by the library.\n */\nexport const layouts = {\n  '"
  },
  {
    "path": "src/chart/graph/GraphChartVisualization2D.tsx",
    "chars": 1467,
    "preview": "import React, { useRef } from 'react';\nimport ForceGraph2D from 'react-force-graph-2d';\nimport { executeActionRule, getR"
  },
  {
    "path": "src/chart/graph/GraphChartVisualizationBase.tsx",
    "chars": 4671,
    "preview": "import React, { useRef } from 'react';\nimport { executeActionRule, getRuleWithFieldPropertyName } from '../../extensions"
  },
  {
    "path": "src/chart/graph/component/GraphChartCanvas.tsx",
    "chars": 417,
    "preview": "import React from 'react';\n\nconst canvasStyle = {\n  paddingLeft: '10px',\n  marginBottom: 5,\n  position: 'relative',\n  ov"
  },
  {
    "path": "src/chart/graph/component/GraphChartContextMenu.tsx",
    "chars": 8344,
    "preview": "import * as React from 'react';\nimport MenuItem from '@mui/material/MenuItem';\nimport { GraphChartVisualizationProps } f"
  },
  {
    "path": "src/chart/graph/component/GraphChartEditModal.tsx",
    "chars": 10279,
    "preview": "import { GraphChartVisualizationProps } from '../GraphChartVisualization';\nimport React, { useEffect } from 'react';\nimp"
  },
  {
    "path": "src/chart/graph/component/GraphChartInspectModal.tsx",
    "chars": 1224,
    "preview": "import React from 'react';\nimport { GraphChartVisualizationProps } from '../GraphChartVisualization';\nimport { getEntity"
  },
  {
    "path": "src/chart/graph/component/GraphChartTooltip.tsx",
    "chars": 1686,
    "preview": "import React from 'react';\nimport { Table, TableBody, TableCell, TableContainer, TableRow, Card } from '@mui/material';\n"
  },
  {
    "path": "src/chart/graph/component/GraphEntityInspectionTable.tsx",
    "chars": 3609,
    "preview": "import React from 'react';\nimport ShowMoreText from 'react-show-more-text';\nimport { Checkbox, Table, TableBody, TableCe"
  },
  {
    "path": "src/chart/graph/component/autocomplete/LabelTypeAutocomplete.tsx",
    "chars": 1881,
    "preview": "import React from 'react';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport { TextField } from '@mui/materi"
  },
  {
    "path": "src/chart/graph/component/autocomplete/PropertyNameAutocomplete.tsx",
    "chars": 1546,
    "preview": "import React from 'react';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport { TextField } from '@mui/materi"
  },
  {
    "path": "src/chart/graph/component/button/GraphChartDeepLinkButton.tsx",
    "chars": 960,
    "preview": "import React from 'react';\nimport { Tooltip } from '@mui/material';\nimport { replaceDashboardParametersInString } from '"
  },
  {
    "path": "src/chart/graph/component/button/GraphChartFitViewButton.tsx",
    "chars": 915,
    "preview": "import React from 'react';\nimport { Tooltip } from '@mui/material';\nimport { GraphChartVisualizationProps } from '../../"
  },
  {
    "path": "src/chart/graph/component/button/GraphChartLockButton.tsx",
    "chars": 1336,
    "preview": "import React from 'react';\nimport { GraphChartVisualizationProps } from '../../GraphChartVisualization';\nimport { Toolti"
  },
  {
    "path": "src/chart/graph/component/button/modal/DeletePropertyButton.tsx",
    "chars": 704,
    "preview": "import React from 'react';\nimport { XMarkIconOutline } from '@neo4j-ndl/react/icons';\nimport { IconButton } from '@neo4j"
  },
  {
    "path": "src/chart/graph/util/EditUtils.ts",
    "chars": 5032,
    "preview": "import { GraphChartVisualizationProps, Link, Node } from '../GraphChartVisualization';\nimport { injectNewRecordsIntoGrap"
  },
  {
    "path": "src/chart/graph/util/ExplorationUtils.ts",
    "chars": 4563,
    "preview": "import { GraphChartVisualizationProps } from '../GraphChartVisualization';\nimport { injectNewRecordsIntoGraphVisualizati"
  },
  {
    "path": "src/chart/graph/util/NodeUtils.ts",
    "chars": 3026,
    "preview": "import { evaluateRulesOnNode } from '../../../extensions/styling/StyleRuleEvaluator';\nimport { GraphEntity } from '../Gr"
  }
]

// ... and 184 more files (download for full content)

About this extraction

This page contains the full source code of the nielsdejong/neodash GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 384 files (1.5 MB), approximately 382.7k tokens, and a symbol index with 509 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!