@@ -105,9 +105,9 @@ It's also possible to update and delete data sources from the config file. More
### Dashboards
-We also deprecated the [dashboard.json] in favor of our new dashboard provisioner that keeps dashboards on disk
+We also deprecated the `[dashboard.json]` in favor of our new dashboard provisioner that keeps dashboards on disk
in sync with dashboards in Grafana's database. The dashboard provisioner has multiple advantages over the old
-[dashboard.json] feature. Instead of storing the dashboard in memory we now insert the dashboard into the database,
+`[dashboard.json]` feature. Instead of storing the dashboard in memory we now insert the dashboard into the database,
which makes it possible to star them, use one as the home dashboard, set permissions and other features in Grafana that
expects the dashboards to exist in the database. More info in the [dashboard provisioning docs](/administration/provisioning/#dashboards)
@@ -117,4 +117,4 @@ We are introducing a new identifier (`uid`) in the dashboard JSON model. The new
We are also changing the route for getting dashboards to use this `uid` instead of the slug that the current route and API are using.
We will keep supporting the old route for backward compatibility. This will make it possible to change the title on dashboards without breaking links.
Sharing dashboards between instances becomes much easier since the uid is unique (unique enough). This might seem like a small change,
-but we are incredibly excited about it since it will make it much easier to manage, collaborate and navigate between dashboards.
+but we are incredibly excited about it since it will make it much easier to manage, collaborate and navigate between dashboards.
@@ -90,7 +90,7 @@ Content-Type: application/json
## Get a single data source by Name
-`GET /api/datasources/name/:name`
+`GET /api/datasources/:name`
**Example Request**:
@@ -88,8 +88,8 @@ func GetDashboard(c *middleware.Context) Response {
HasAcl: dash.HasAcl,
IsFolder: dash.IsFolder,
FolderId: dash.FolderId,
- FolderTitle: "Root",
Url: dash.GetUrl(),
+ FolderTitle: "General",
}
// lookup folder title
@@ -250,6 +250,9 @@ func PostDashboard(c *middleware.Context, cmd m.SaveDashboardCommand) Response {
if err == m.ErrDashboardWithSameUIDExists {
return Json(412, util.DynMap{"status": "name-exists", "message": err.Error()})
+ if err == m.ErrDashboardWithSameNameInFolderExists {
+ return Json(412, util.DynMap{"status": "name-exists", "message": err.Error()})
+ }
if err == m.ErrDashboardVersionMismatch {
return Json(412, util.DynMap{"status": "version-mismatch", "message": err.Error()})
@@ -310,7 +313,7 @@ func GetHomeDashboard(c *middleware.Context) Response {
dash := dtos.DashboardFullWithMeta{}
dash.Meta.IsHome = true
dash.Meta.CanEdit = c.SignedInUser.HasRole(m.ROLE_EDITOR)
- dash.Meta.FolderTitle = "Root"
+ dash.Meta.FolderTitle = "General"
jsonParser := json.NewDecoder(file)
if err := jsonParser.Decode(&dash.Dashboard); err != nil {
@@ -161,7 +161,7 @@ export class SearchSrv {
} else {
section = {
id: 0,
- title: 'Root',
+ title: 'General',
items: [],
icon: 'fa fa-folder-open',
toggle: this.toggleFolder.bind(this),
@@ -30,7 +30,7 @@ describe('ManageDashboards', () => {
},
{
uri: 'db/something-else',
type: 'dash-db',
@@ -363,7 +363,7 @@ describe('ManageDashboards', () => {
items: [{ id: 3, checked: true }],
checked: false,
@@ -391,7 +391,7 @@ describe('ManageDashboards', () => {
items: [{ id: 3, checked: false }],
@@ -420,7 +420,7 @@ describe('ManageDashboards', () => {
@@ -455,7 +455,7 @@ describe('ManageDashboards', () => {
@@ -497,7 +497,7 @@ describe('ManageDashboards', () => {
items: [{ id: 3, checked: true, uid: 'root-dash' }],
checked: true,
@@ -541,7 +541,7 @@ describe('ManageDashboards', () => {
items: [{ id: 3, checked: true, uid: 'dash-2' }],
@@ -49,7 +49,7 @@ describe('SearchCtrl', () => {
items: [{ id: 3, selected: false }, { id: 5, selected: false }],
selected: false,
expanded: true,
@@ -146,7 +146,7 @@ describe('SearchCtrl', () => {
@@ -12,7 +12,7 @@ export class FolderPickerCtrl {
enterFolderCreation: any;
exitFolderCreation: any;
enableCreateNew: boolean;
- rootName = 'Root';
+ rootName = 'General';
folder: any;
createNewFolder: boolean;
newFolderName: string;
@@ -33,10 +33,13 @@ export class FolderPickerCtrl {
return this.backendSrv.get('api/dashboards/folders', { query: query }).then(result => {
if (
query === '' ||
- query.toLowerCase() === 'r' ||
- query.toLowerCase() === 'ro' ||
- query.toLowerCase() === 'roo' ||
- query.toLowerCase() === 'root'
+ query.toLowerCase() === 'g' ||
+ query.toLowerCase() === 'ge' ||
+ query.toLowerCase() === 'gen' ||
+ query.toLowerCase() === 'gene' ||
+ query.toLowerCase() === 'gener' ||
+ query.toLowerCase() === 'genera' ||
+ query.toLowerCase() === 'general'
) {
result.unshift({ title: this.rootName, id: 0 });
@@ -46,6 +46,7 @@ export class SaveDashboardAsModalCtrl {
var dashboard = this.dashboardSrv.getCurrent();
this.clone = dashboard.getSaveModelClone();
this.clone.id = null;
+ this.clone.uid = '';
this.clone.title += ' Copy';
this.clone.editable = true;
this.clone.hideControls = false;
@@ -1,7 +1,7 @@
import coreModule from 'app/core/core_module';
export class ValidationSrv {
- rootName = 'root';
+ rootName = 'general';
/** @ngInject */
constructor(private $q, private backendSrv) {}
@@ -19,7 +19,7 @@ export class ValidationSrv {
if (name.toLowerCase() === this.rootName) {
return this.$q.reject({
type: 'EXISTING',
- message: 'A folder or dashboard with the same name already exists',
+ message: 'This is a reserved name and cannot be used for a folder.',
});
@@ -4,7 +4,7 @@
width="64px" height="64px" viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
- .st1{fill:#555555;}
+ .st1{fill:#f7f8fa;}
.st2{fill:url(#SVGID_1_);}
</style>
<g>
@@ -13,7 +13,7 @@
<path class="st1" d="M31,41.9c0-2.9,2.4-5.3,5.3-5.3h4.1v-4.1c0-1.7,0.8-3.2,2.1-4.2V16.1v-3.9c0-4.5-3.7-8.2-8.2-8.2H17.8l0,0H8.2
C3.7,4,0,7.7,0,12.2v19.4c0,4.5,3.7,8.2,8.2,8.2h12.2l10.6,10v-0.1V41.9z M27.4,37.5L23,33.3H8.2c-0.9,0-1.7-0.7-1.7-1.7V12.2
c0-0.9,0.7-1.7,1.7-1.7h23.2l0,0h3.1c0.9,0,1.7,0.7,1.7,1.7v10.4v9l0,0c0,0.9-0.7,1.7-1.7,1.7h-7L27.4,37.5z"/>
-
+
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="49.6596" y1="-13.1545" x2="49.6596" y2="47.3804" gradientTransform="matrix(1 0 0 -1 0 66)">
<stop offset="0" style="stop-color:#FFF23A"/>
<stop offset="4.010540e-02" style="stop-color:#FEE62D"/>
@@ -3,7 +3,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- .st0{fill:#555555;}
+ .st0{fill:#f7f8fa;}
.st1{fill:url(#SVGID_1_);}
@@ -14,7 +14,7 @@
<path class="st0" d="M47.6,9.2L47.8,9l1.3-1.3c1.3-1.3,1.3-3.4,0-4.7s-3.4-1.3-4.7,0l-1.3,1.3l-0.2,0.2L42,5.3l4.7,4.7L47.6,9.2z"
/>
<polygon class="st0" points="24.2,24.3 24.1,24.7 23.5,28.5 27.3,27.9 27.7,27.8 29.2,27.6 24.5,22.9 "/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="49.6596" y1="-15.1627" x2="49.6596" y2="45.3912" gradientTransform="matrix(1 0 0 -1 0 66)">
+ .st0{fill:#52545c;}
.st0{fill:#66C9DC;}
.st2{fill:#5CB947;}
.st3{fill:url(#SVGID_1_);}
<circle class="st0" cx="27.9" cy="30.3" r="5"/>
width="117.8px" height="64px" viewBox="0 0 117.8 64" style="enable-background:new 0 0 117.8 64;" xml:space="preserve">
.st2{fill:url(#SVGID_2_);}
.st3{fill:url(#SVGID_3_);}
<path class="st0" d="M34.5,64c4.5,0,8.1-3.6,8.1-8.1H26.4C26.4,60.4,30,64,34.5,64z"/>
<circle class="st0" cx="6" cy="12" r="6"/>
<path class="st0" d="M59,17.6H20.2c-2.8,0-5-2.2-5-5l0,0c0-2.8,2.2-5,5-5H59c2.8,0,5,2.2,5,5l0,0C64,15.3,61.8,17.6,59,17.6z"/>
<path class="st0" d="M59.5,50.8L28.4,19.6C32.2,15,32,8.2,27.6,3.9c-2.3-2.3-5.3-3.4-8.3-3.4s-6,1.1-8.3,3.4L5.7,9.3
c-4.6,4.6-4.6,12,0,16.6C8,28.1,11,29.2,14,29.2c2.6,0,5.3-0.9,7.5-2.7l20.9,20.9L35.8,54c-0.5,0.5-0.5,1.3,0,1.8l2.1,2.1
<path class="st0" d="M64,36.1V28l-8.7-2.5c-0.5-1.8-1.3-3.6-2.2-5.2l4.4-7.9l-5.7-5.7l-7.9,4.4c-1.6-0.9-3.4-1.7-5.2-2.2L36.1,0H28
<path class="st0" d="M24.5,31H6.1C2.7,31,0,28.3,0,24.9V6.5c0-3.4,2.7-6.1,6.1-6.1h18.4c3.4,0,6.1,2.7,6.1,6.1v18.4
<path class="st0" d="M23.5,22.7l7-17.3c-0.5-2.8-3-5-6-5H6.1C2.7,0.4,0,3.1,0,6.5v18.4C0,28.3,2.7,31,6.1,31H9l-7.4-6.5L23.5,22.7z"
width="18px" height="18px" viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
- .st0{fill:#35373F;}
width="100px" height="100px" viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve">
<path class="st0" d="M50,84.1c-22.1,0-40.7-6.5-49.3-16.2C0.2,69.1,0,70.4,0,71.7c0,13,22.9,23.9,50,23.9s50-11,50-23.9
<path class="st0" d="M63.2,32l-7-7V11.8c0-2.9-2.4-5.3-5.3-5.3l0,0c-2.9,0-5.3,2.4-5.3,5.3v2.6L34,2.8c-1.1-1.1-2.8-1.1-3.9,0
L0.8,32c-1.7,1.7-0.5,4.7,2,4.7h5l0,0v7.6v14.8c0,1.5,1.2,2.8,2.8,2.8h13.2V44.4h16.5V62h13.2c1.5,0,2.8-1.2,2.8-2.8V36.8l0,0l0,0h5
<path class="st0" d="M8.1,26.5h15.6c2.8,0,5.2-2.3,5.2-5.2V5.8c0-2.8-2.3-5.2-5.2-5.2H8.1c-2.8,0-5.2,2.3-5.2,5.2v15.6
<path class="st0" d="M0.1,31.8c0-1.6,1-2.9,2.5-3.4c0.5-0.2,1-0.4,1.4-0.6c0.9-0.6,1.4-1.5,1.4-2.7v-9.9c0-2,0.4-3.5,1.1-4.5
<ellipse class="st0" cx="30.2" cy="33.8" rx="0" ry="0"/>
<path class="st0" d="M56.3,44.5c-1.6,0-3.2,0.5-4.4,1.4l-8.1-4.7c0.3-1,0.4-2,0.4-3.1c0-5.6-3.8-10.4-9-11.8v-7.5
c2.6-1.2,4.5-3.9,4.5-7c0-4.2-3.4-7.7-7.7-7.7s-7.7,3.4-7.7,7.7c0,3.1,1.8,5.7,4.5,7v7.5c-5.2,1.4-9,6.1-9,11.8
<path class="st0" d="M63.8,55.9h-2.1c-0.1,0-0.2-0.1-0.2-0.2V20.3c0-0.1-0.1-0.2-0.2-0.2l-20.5-3.1c0,0-0.1,0-0.1,0l-4.7,1.3
<path class="st0" d="M60.8,4.4H18.9c-1.8,0-3.2,1.4-3.2,3.2v6.6h36.9c3.6,0,6.6,2.9,6.6,6.6V35h1.6c1.8,0,3.2-1.4,3.2-3.2V7.5
<path class="st0" d="M59.4,23.7c-1.7-1.7-4.4-1.7-6,0L41.6,35.6l-12.9-13l11.8-11.9c1.7-1.7,1.7-4.4,0-6.1s-4.4-1.7-6,0L22.7,16.5
L12.6,6.2C1.3,17.6,0.4,35.5,9.8,48l-3.6,3.6c-1.7,1.7-1.7,4.4,0,6.1c1.7,1.7,4.4,1.7,6,0l3.6-3.6c12.4,9.5,30.1,8.6,41.4-2.8
<path class="st0" d="M23,48H3.2C1.4,48,0,49.3,0,51s1.4,3,3.2,3H23c-0.5-0.9-0.8-1.9-0.8-3S22.4,48.9,23,48z"/>
<path class="st0" d="M34.7,54h26.1c1.8,0,3.2-1.3,3.2-3s-1.4-3-3.2-3H34.7c0.5,0.9,0.8,1.9,0.8,3S35.2,53.1,34.7,54z"/>
<path class="st0" d="M32.1,49.1c-1.9,0-3.5-1.6-3.5-3.5s1.6-3.5,3.5-3.5c1.9,0,3.5,1.6,3.5,3.5S34.1,49.1,32.1,49.1z M34.4,36.2v3.4
h-4.5v-7.9h2.4l0,0c3,0,5.4-2.4,5.4-5.3s-2.4-5.3-5.4-5.3c-2.1,0-3.9,1.1-4.9,2.9l-4.3-2c1.7-3.4,5.2-5.6,9.1-5.6
<path class="st0" d="M14.9,46.8c-0.7-1-1.3-2-2-3C13.6,44.9,14.2,45.9,14.9,46.8z"/>
<path class="st0" d="M57.3,41.8V35c0-3.5-2.8-6.3-6.3-6.3H34.7v-6.5c3.9-1.2,6.7-4.8,6.7-9l0,0c0-5.2-4.2-9.4-9.4-9.4
s-9.4,4.2-9.4,9.4l0,0c0,4.3,2.8,7.9,6.7,9v6.5H13.1c-3.5,0-6.3,2.8-6.3,6.3v6.8C2.8,43,0,46.6,0,50.9l0,0c0,5.2,4.2,9.4,9.4,9.4
<path class="st0" d="M62,16.6L56.2,14l0.8-3l-8.6-2.4v-5H43l-0.2-1.4l-9,1.4h-1.1L24.2,0l-0.8,1.8l-6.2-1.7l-1,3.6h-9v4.1L2,8.6
<path class="st0" d="M54.1,40.6c0,0-0.1-0.1-0.2-0.1c-0.9-0.5-0.7-1.9-0.5-2.6c0.6-0.7,1.3-1.8,1.5-3.6c0.1-0.5,0.3-1,0.6-1.3
<path class="st0" d="M41.5,35.5c-0.1-0.1-0.2-0.1-0.4-0.2c-1.2-0.7-1-2.6-0.7-3.8c0.9-1,1.8-2.5,2.2-5.2c0.1-0.7,0.4-1.3,0.8-1.9
<path class="st0" d="M33.5,27.3c2.2-3.7,4-6.1,5.4-7.1c1.4-1.1,2.7-1.6,4.1-1.6c1.2,0,2.2,0.4,2.9,1.1c0.8,0.7,1.1,1.6,1.1,2.7
<path class="st0" d="M62.5,55.1L43.9,36.6C49.8,27.4,48.7,15,40.7,7C31.4-2.3,16.3-2.3,7,7s-9.3,24.4,0,33.7c8,8,20.4,9.1,29.6,3.3
@@ -59,7 +59,8 @@ $critical: #ec2128;
$body-bg: $gray-7;
$page-bg: $gray-7;
$body-color: $gray-1;
-$text-color: $dark-4;
+//$text-color: $dark-4;
+$text-color: $gray-1;
$text-color-strong: $white;
$text-color-weak: $gray-2;
$text-color-faint: $gray-4;