2016-02-15 08:27:41 -06:00
|
|
|
//
|
|
|
|
// Buttons
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// Base styles
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// Core
|
|
|
|
.btn {
|
|
|
|
display: inline-block;
|
2016-02-18 05:16:47 -06:00
|
|
|
font-weight: $btn-font-weight;
|
|
|
|
line-height: $btn-line-height;
|
2016-02-16 03:42:06 -06:00
|
|
|
font-size: $font-size-base;
|
2016-02-15 08:27:41 -06:00
|
|
|
text-align: center;
|
|
|
|
vertical-align: middle;
|
|
|
|
cursor: pointer;
|
2016-02-18 07:44:36 -06:00
|
|
|
border: $input-btn-border-width solid transparent;
|
2016-02-15 08:27:41 -06:00
|
|
|
|
2016-02-18 05:16:47 -06:00
|
|
|
@include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-border-radius);
|
2016-02-15 08:27:41 -06:00
|
|
|
|
2016-02-18 05:16:47 -06:00
|
|
|
&,
|
|
|
|
&:active,
|
|
|
|
&.active {
|
|
|
|
&:focus,
|
|
|
|
&.focus {
|
|
|
|
@include tab-focus();
|
|
|
|
}
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
|
2016-02-18 05:16:47 -06:00
|
|
|
@include hover-focus {
|
|
|
|
text-decoration: none;
|
|
|
|
}
|
|
|
|
&.focus {
|
|
|
|
text-decoration: none;
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
|
2016-02-18 05:16:47 -06:00
|
|
|
&:active,
|
|
|
|
&.active {
|
2016-02-15 08:27:41 -06:00
|
|
|
background-image: none;
|
2016-02-18 05:16:47 -06:00
|
|
|
outline: 0;
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
&.disabled,
|
2016-02-18 05:16:47 -06:00
|
|
|
&:disabled {
|
|
|
|
cursor: $cursor-disabled;
|
|
|
|
opacity: .65;
|
|
|
|
@include box-shadow(none);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Button Sizes
|
|
|
|
// --------------------------------------------------
|
|
|
|
|
|
|
|
// Large
|
|
|
|
.btn-large {
|
2016-02-18 05:16:47 -06:00
|
|
|
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $font-size-lg, $btn-border-radius);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
.btn-small {
|
2016-02-18 05:16:47 -06:00
|
|
|
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-sm, $btn-border-radius);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
.btn-mini {
|
2016-02-18 05:16:47 -06:00
|
|
|
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $font-size-xs, $btn-border-radius);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
|
2016-02-19 07:21:57 -06:00
|
|
|
.btn-link {
|
2016-02-20 04:05:06 -06:00
|
|
|
color: $btn-link-color;
|
2016-02-19 07:21:57 -06:00
|
|
|
}
|
|
|
|
|
2016-02-15 08:27:41 -06:00
|
|
|
// Set the backgrounds
|
|
|
|
// -------------------------
|
|
|
|
.btn-primary {
|
2016-02-18 13:41:23 -06:00
|
|
|
@include buttonBackground($btn-primary-bg, $btn-primary-bg-hl);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
2016-02-19 17:22:24 -06:00
|
|
|
.btn-secondary {
|
|
|
|
@include buttonBackground($btn-secondary-bg, $btn-secondary-bg-hl);
|
|
|
|
}
|
2016-02-15 08:27:41 -06:00
|
|
|
// Warning appears are orange
|
|
|
|
.btn-warning {
|
2016-02-19 07:21:57 -06:00
|
|
|
@include buttonBackground($btn-warning-bg, $btn-warning-bg-hl);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
// Danger and error appear as red
|
|
|
|
.btn-danger {
|
2016-02-19 07:21:57 -06:00
|
|
|
@include buttonBackground($btn-danger-bg, $btn-danger-bg-hl);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
// Success appears as green
|
|
|
|
.btn-success {
|
2016-02-19 07:21:57 -06:00
|
|
|
@include buttonBackground($btn-success-bg, $btn-success-bg-hl);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
// Info appears as a neutral blue
|
2016-02-20 04:05:06 -06:00
|
|
|
.btn-secondary {
|
|
|
|
@include buttonBackground($btn-secondary-bg, $btn-secondary-bg-hl);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
// Inverse appears as dark gray
|
|
|
|
.btn-inverse {
|
2016-02-19 07:21:57 -06:00
|
|
|
@include buttonBackground($btn-inverse-bg, $btn-inverse-bg-hl, $btn-inverse-text-color);
|
2016-03-20 04:31:50 -05:00
|
|
|
//background: $card-background;
|
|
|
|
box-shadow: $card-shadow;
|
|
|
|
//border: 1px solid $tight-form-func-highlight-bg;
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
|
2016-02-18 07:44:36 -06:00
|
|
|
.btn-outline-primary {
|
2016-02-18 13:41:23 -06:00
|
|
|
@include button-outline-variant($btn-primary-bg);
|
2016-02-18 07:44:36 -06:00
|
|
|
}
|
|
|
|
.btn-outline-secondary {
|
2016-02-20 04:05:06 -06:00
|
|
|
@include button-outline-variant($btn-secondary-bg);
|
2016-02-18 07:44:36 -06:00
|
|
|
}
|
2016-02-20 04:05:06 -06:00
|
|
|
.btn-outline-inverse {
|
|
|
|
@include button-outline-variant($btn-inverse-bg);
|
2016-02-18 07:44:36 -06:00
|
|
|
}
|
|
|
|
.btn-outline-success {
|
2016-02-19 07:21:57 -06:00
|
|
|
@include button-outline-variant($btn-success-bg);
|
2016-02-18 07:44:36 -06:00
|
|
|
}
|
|
|
|
.btn-outline-warning {
|
2016-02-19 07:21:57 -06:00
|
|
|
@include button-outline-variant($btn-warning-bg);
|
2016-02-18 07:44:36 -06:00
|
|
|
}
|
|
|
|
.btn-outline-danger {
|
2016-02-19 07:21:57 -06:00
|
|
|
@include button-outline-variant($btn-danger-bg);
|
2016-02-18 07:44:36 -06:00
|
|
|
}
|
History and Version Control for Dashboard Updates
A simple version control system for dashboards. Closes #1504.
Goals
1. To create a new dashboard version every time a dashboard is saved.
2. To allow users to view all versions of a given dashboard.
3. To allow users to rollback to a previous version of a dashboard.
4. To allow users to compare two versions of a dashboard.
Usage
Navigate to a dashboard, and click the settings cog. From there, click
the "Changelog" button to be brought to the Changelog view. In this
view, a table containing each version of a dashboard can be seen. Each
entry in the table represents a dashboard version. A selectable
checkbox, the version number, date created, name of the user who created
that version, and commit message is shown in the table, along with a
button that allows a user to restore to a previous version of that
dashboard. If a user wants to restore to a previous version of their
dashboard, they can do so by clicking the previously mentioned button.
If a user wants to compare two different versions of a dashboard, they
can do so by clicking the checkbox of two different dashboard versions,
then clicking the "Compare versions" button located below the dashboard.
From there, the user is brought to a view showing a summary of the
dashboard differences. Each summarized change contains a link that can
be clicked to take the user a JSON diff highlighting the changes line by
line.
Overview of Changes
Backend Changes
- A `dashboard_version` table was created to store each dashboard
version, along with a dashboard version model and structs to represent
the queries and commands necessary for the dashboard version API
methods.
- API endpoints were created to support working with dashboard
versions.
- Methods were added to create, update, read, and destroy dashboard
versions in the database.
- Logic was added to compute the diff between two versions, and
display it to the user.
- The dashboard migration logic was updated to save a "Version
1" of each existing dashboard in the database.
Frontend Changes
- New views
- Methods to pull JSON and HTML from endpoints
New API Endpoints
Each endpoint requires the authorization header to be sent in
the format,
```
Authorization: Bearer <jwt>
```
where `<jwt>` is a JSON web token obtained from the Grafana
admin panel.
`GET "/api/dashboards/db/:dashboardId/versions?orderBy=<string>&limit=<int>&start=<int>"`
Get all dashboard versions for the given dashboard ID. Accepts
three URL parameters:
- `orderBy` String to order the results by. Possible values
are `version`, `created`, `created_by`, `message`. Default
is `versions`. Ordering is always in descending order.
- `limit` Maximum number of results to return
- `start` Position in results to start from
`GET "/api/dashboards/db/:dashboardId/versions/:id"`
Get an individual dashboard version by ID, for the given
dashboard ID.
`POST "/api/dashboards/db/:dashboardId/restore"`
Restore to the given dashboard version. Post body is of
content-type `application/json`, and must contain.
```json
{
"dashboardId": <int>,
"version": <int>
}
```
`GET "/api/dashboards/db/:dashboardId/compare/:versionA...:versionB"`
Compare two dashboard versions by ID for the given
dashboard ID, returning a JSON delta formatted
representation of the diff. The URL format follows
what GitHub does. For example, visiting
[/api/dashboards/db/18/compare/22...33](http://ec2-54-80-139-44.compute-1.amazonaws.com:3000/api/dashboards/db/18/compare/22...33)
will return the diff between versions 22 and 33 for
the dashboard ID 18.
Dependencies Added
- The Go package [gojsondiff](https://github.com/yudai/gojsondiff)
was added and vendored.
2017-05-24 18:14:39 -05:00
|
|
|
.btn-outline-disabled {
|
|
|
|
@include button-outline-variant($gray-1);
|
|
|
|
@include box-shadow(none);
|
|
|
|
cursor: default;
|
|
|
|
|
|
|
|
&:hover, &:active, &:active:hover, &:focus {
|
|
|
|
color: $gray-1;
|
|
|
|
background-color: transparent;
|
|
|
|
border-color: $gray-1;
|
|
|
|
}
|
|
|
|
}
|
2016-02-18 07:44:36 -06:00
|
|
|
|
2016-02-19 07:21:57 -06:00
|
|
|
|