-
Notifications
You must be signed in to change notification settings - Fork 27
Dashboard import feature #758
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
21f313b
29e8848
37f88e7
620479a
200303e
6abd688
b2646a2
3fbec0a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,192 @@ | ||||||||||||||
= Import | ||||||||||||||
:description: This page holds information about import options for dashboards. | ||||||||||||||
|
||||||||||||||
When you create a dashboard, you can choose to **Import**. | ||||||||||||||
|
||||||||||||||
In the **Import dashboard** dialog, you have several options to source the dashboard specification for the import: | ||||||||||||||
|
||||||||||||||
* Browse for a JSON file on your machine. | ||||||||||||||
* Select a dashboard specification that is stored in your database. | ||||||||||||||
* Drag and drop or paste a dashboard specification in JSON format to the editor. | ||||||||||||||
.Import dashboard dialog | ||||||||||||||
image::dashboards/import/import-dashboard-dialog.png[] | ||||||||||||||
|
||||||||||||||
Note that you only have the option to select a stored dashboard specification when there are stored dashboards in your database. | ||||||||||||||
|
||||||||||||||
|
||||||||||||||
It is not possible to delete stored dashboards from the database through the dashboard application. | ||||||||||||||
|
||||||||||||||
If the dashboard specification selected for the import is syntactically correct, the **Import dashboard** dialog displays a **Summary** and **Details** for the import. | ||||||||||||||
This means that the import can be run. | ||||||||||||||
|
||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. added this note, but let's avoid making promises in the docs :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. lets remember to remove this note in a couple of weeks |
||||||||||||||
|
||||||||||||||
== Supported types | ||||||||||||||
|
||||||||||||||
|
||||||||||||||
[cols="9,^4",options="header",grid="cols"] | ||||||||||||||
|=== | ||||||||||||||
| NeoDash | Aura dashboards | ||||||||||||||
|
||||||||||||||
| Table | ✅ | ||||||||||||||
| Graph | ✅ | ||||||||||||||
| Bar chart | ✅ | ||||||||||||||
| Pie chart | ✅ | ||||||||||||||
| Line chart | ✅ | ||||||||||||||
| Map | Converted to graph | ||||||||||||||
| Single value | ✅ | ||||||||||||||
| Raw JSON | ❌ | ||||||||||||||
| Parameter select | Only node and relationship properties | ||||||||||||||
| Form | Only node and relationship properties | ||||||||||||||
|
||||||||||||||
| iFrame | ❌ | ||||||||||||||
| Markdown | ✅ | ||||||||||||||
|
||||||||||||||
|=== | ||||||||||||||
|
||||||||||||||
|
||||||||||||||
== Summary | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can this be a list? or something more concise? it feels like a lot to digest |
||||||||||||||
|
||||||||||||||
Data fields relevant to the import are displayed under **Summary**. | ||||||||||||||
|
||||||||||||||
The latest version of both NeoDash Labs and NeoDash commercial are supported. | ||||||||||||||
However, the import procedure can always attempt to import a dashboard specification, even if the version differs from those. | ||||||||||||||
|
||||||||||||||
The summary includes the number of imported pages, cards, parameters and filters. | ||||||||||||||
You can see how many cards and filters were migrated, converted or skipped. | ||||||||||||||
|
||||||||||||||
Cards and filters tagged as migrated have a type that is supported by Aura dashboards and they can be fully migrated. | ||||||||||||||
If they are converted, Aura dashboards converts them to the closest supported similar type available, for example a NeoDash commercial map report is converted to an Aura dashboard graph visualization. | ||||||||||||||
The import procedure skips any types it can neither migrate nor convert. | ||||||||||||||
|
||||||||||||||
Note that not all settings from NeoDash reports have a counterpart in Aura dashboards. | ||||||||||||||
Any such settings do not affect the import and are not preserved by the import procedure. | ||||||||||||||
|
||||||||||||||
|
||||||||||||||
== Details | ||||||||||||||
|
||||||||||||||
Expand the **Details** to inspect incidents reported during the import. | ||||||||||||||
|
||||||||||||||
Entries include the location of the incident in the JSON specification, that is, the specific page and report, as well as a description what went wrong or is of note. | ||||||||||||||
|
||||||||||||||
|
||||||||||||||
== Example | ||||||||||||||
|
||||||||||||||
|
||||||||||||||
Here is an example NeoDash dashboard specification: | ||||||||||||||
|
||||||||||||||
[source, json, indent=0] | ||||||||||||||
---- | ||||||||||||||
{ | ||||||||||||||
"uuid": "bb8f1146-6ea1-4640-9e19-60723648c68f", | ||||||||||||||
"title": "NeoDash filters", | ||||||||||||||
"version": "3.1", | ||||||||||||||
"settings": { | ||||||||||||||
"pagenumber": 0, | ||||||||||||||
"editable": true, | ||||||||||||||
"fullscreenEnabled": false, | ||||||||||||||
"parameters": { | ||||||||||||||
"neodash_product_productname": "Chai", | ||||||||||||||
"neodash_product_productname_display": "Chai", | ||||||||||||||
"undefined": "", | ||||||||||||||
"undefined_display": "" | ||||||||||||||
}, | ||||||||||||||
"theme": "light" | ||||||||||||||
}, | ||||||||||||||
"pages": [ | ||||||||||||||
{ | ||||||||||||||
"title": "Main Page", | ||||||||||||||
"reports": [ | ||||||||||||||
{ | ||||||||||||||
"id": "69e42486-87b7-4c6f-b8a5-e7da8e739434", | ||||||||||||||
"title": "Product name fiter", | ||||||||||||||
"query": "MATCH (n:`Product`) \nWHERE toLower(toString(n.`productName`)) CONTAINS toLower($input) \nRETURN DISTINCT n.`productName` as value, n.`productName` as display ORDER BY size(toString(value)) ASC LIMIT 5", | ||||||||||||||
"width": 4, | ||||||||||||||
"height": 2, | ||||||||||||||
"x": 0, | ||||||||||||||
"y": 0, | ||||||||||||||
"type": "select", | ||||||||||||||
"selection": {}, | ||||||||||||||
"settings": { | ||||||||||||||
"type": "Node Property", | ||||||||||||||
"entityType": "Product", | ||||||||||||||
"propertyType": "productName", | ||||||||||||||
"propertyTypeDisplay": "productName", | ||||||||||||||
"parameterName": "neodash_product_productname" | ||||||||||||||
}, | ||||||||||||||
"schema": [], | ||||||||||||||
"fields": [], | ||||||||||||||
"settingsOpen": true, | ||||||||||||||
"collapseTimeout": "auto" | ||||||||||||||
}, | ||||||||||||||
{ | ||||||||||||||
"id": "16b245a0-6467-4cb8-9a34-6a8cf77487c5", | ||||||||||||||
"title": "Free text", | ||||||||||||||
"query": "RETURN true;", | ||||||||||||||
"width": 4, | ||||||||||||||
"height": 3, | ||||||||||||||
"x": 8, | ||||||||||||||
"y": 0, | ||||||||||||||
"type": "select", | ||||||||||||||
"selection": {}, | ||||||||||||||
"settings": { | ||||||||||||||
"type": "Free Text", | ||||||||||||||
"entityType": "\"The free text\"", | ||||||||||||||
"parameterName": "neodash_\"the_free_text\"" | ||||||||||||||
}, | ||||||||||||||
"schema": [], | ||||||||||||||
"fields": [] | ||||||||||||||
}, | ||||||||||||||
{ | ||||||||||||||
"id": "1a822a3c-d703-4c52-9532-68e9e6a0cd43", | ||||||||||||||
"title": "Date param select", | ||||||||||||||
"query": "RETURN true;", | ||||||||||||||
"width": 4, | ||||||||||||||
"height": 4, | ||||||||||||||
"x": 12, | ||||||||||||||
"y": 0, | ||||||||||||||
"type": "select", | ||||||||||||||
"selection": {}, | ||||||||||||||
"settings": { | ||||||||||||||
"type": "Date Picker", | ||||||||||||||
"entityType": "this_is_a_date", | ||||||||||||||
"parameterName": "neodash_this_is_a_date" | ||||||||||||||
}, | ||||||||||||||
"schema": [], | ||||||||||||||
"fields": [] | ||||||||||||||
}, | ||||||||||||||
{ | ||||||||||||||
"id": "70b4b53b-1ed8-4759-8881-e85d4b412e2d", | ||||||||||||||
"title": "Product name fiter", | ||||||||||||||
"query": "MATCH (n:`undefined`) \nWHERE toLower(toString(n.`undefined`)) CONTAINS toLower($input) \nRETURN DISTINCT n.`undefined` as value, n.`undefined` as display ORDER BY size(toString(value)) ASC LIMIT 5", | ||||||||||||||
"width": 4, | ||||||||||||||
"height": 4, | ||||||||||||||
"x": 4, | ||||||||||||||
"y": 0, | ||||||||||||||
"type": "select", | ||||||||||||||
"selection": {}, | ||||||||||||||
"settings": { | ||||||||||||||
"type": "Node Property" | ||||||||||||||
}, | ||||||||||||||
"schema": [], | ||||||||||||||
"fields": [], | ||||||||||||||
"settingsOpen": true, | ||||||||||||||
"collapseTimeout": "auto", | ||||||||||||||
"advancedSettingsOpen": true | ||||||||||||||
} | ||||||||||||||
] | ||||||||||||||
} | ||||||||||||||
], | ||||||||||||||
"parameters": {}, | ||||||||||||||
"extensions": { | ||||||||||||||
"active": true, | ||||||||||||||
"activeReducers": [] | ||||||||||||||
} | ||||||||||||||
} | ||||||||||||||
---- | ||||||||||||||
|
||||||||||||||
Upon import, the following **Summary** and **Details** are generated: | ||||||||||||||
|
||||||||||||||
.Example import | ||||||||||||||
image::dashboards/import/import-example.png[] | ||||||||||||||
|
||||||||||||||
The import procedure was only able to import two of the four filters in the dashboard specification. | ||||||||||||||
The details hint at the reason: the second and third report (index 1 and 2) have an unsupported parameter select type (`Free Text` and `Date Picker`). | ||||||||||||||
The third **Details** entry reveals that the fourth report is missing an entity type, a property type and a parameter name. | ||||||||||||||
However, the import can still successfully create a parameter for this parameter select report, while it cannot for the other two. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,15 +15,18 @@ The number of dashboards you can create depends on your Aura tier: | |
|
||
== Creating a dashboard | ||
|
||
If you have no dashboards, select either **Create from scratch** or **Create with AI**. | ||
If you have no dashboards, select **Create dashboard** and either **Create from scratch** or **Import**. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this UI will change: https://linear.app/neo4j/issue/DASH-337/improve-quality-of-empty-states There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. when will it be available? asking because i think i need to retake some screenshots :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it's planned for this DevCycle, so probably in the next 2-3 weeks. |
||
Alternatively, select **Create with AI**. | ||
|
||
.Create your first dashboard | ||
image::dashboards/create-first-dashboard.png[] | ||
|
||
If you want to create another dashboard: use **Create Dashboard** at the top right, and select either **Create from scratch** or **Create with AI**. | ||
If you already have a dashboard and want to create another, use **Create Dashboard** at the top right, and select **Create from scratch**, **Import** or **Create with AI**. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same here, UI will change |
||
|
||
**Create from scratch** takes you directly to a new and empty dashboard. | ||
|
||
See xref:/dashboards/import.adoc[] to learn more about importing dashboards. | ||
|
||
See xref::/dashboards/ai-dashboards.adoc[] for advice how to create a dashboard via prompt. | ||
|
||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'dashboard specification' sounds a bit awkward - is dashboard instance/dashboard save better?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe also explicitly call out that dashboards stored in the database is a legacy storage mechanism
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hm... what do we call it internally?
it's not quite the dashboard itself, rather the stored version of it, or the JSON representation of a dashboard
legacy storage mechanism as in we discourage users?
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Imo, good options are "dashboard JSON" or more verbose "dashboard JSON representation".
When "sourcing" a JSON, we show a toast saying "Dashboard loaded successfully". Should we use "load" instead of "source"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
^ agree with Leo that "dashboard JSON" makes sense.
I also prefer load over source.