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;
|
2017-08-20 14:16:40 -05:00
|
|
|
border: none;
|
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,
|
2017-06-07 06:46:36 -05:00
|
|
|
&[disabled],
|
2016-02-18 05:16:47 -06:00
|
|
|
&:disabled {
|
|
|
|
cursor: $cursor-disabled;
|
2017-12-19 09:22:41 -06:00
|
|
|
opacity: 0.65;
|
2016-02-18 05:16:47 -06:00
|
|
|
@include box-shadow(none);
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Button Sizes
|
|
|
|
// --------------------------------------------------
|
2017-12-04 09:18:46 -06:00
|
|
|
// XLarge
|
|
|
|
.btn-xlarge {
|
|
|
|
@include button-size($btn-padding-y-xl, $btn-padding-x-xl, $font-size-lg, $btn-border-radius);
|
|
|
|
font-weight: normal;
|
|
|
|
padding-bottom: $btn-padding-y-xl - 3;
|
|
|
|
.gicon {
|
|
|
|
font-size: 31px;
|
|
|
|
margin-right: 1rem;
|
|
|
|
}
|
|
|
|
}
|
2016-02-15 08:27:41 -06:00
|
|
|
|
|
|
|
// 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);
|
2017-12-04 09:18:46 -06:00
|
|
|
font-weight: normal;
|
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
|
|
|
}
|
2017-12-11 09:31:50 -06:00
|
|
|
|
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);
|
2018-06-12 04:54:50 -05:00
|
|
|
|
|
|
|
&--processing {
|
|
|
|
@include button-outline-variant($gray-1);
|
|
|
|
@include box-shadow(none);
|
|
|
|
cursor: default;
|
|
|
|
|
|
|
|
&:hover,
|
|
|
|
&:active,
|
|
|
|
&:active:hover,
|
|
|
|
&:focus,
|
|
|
|
&:disabled {
|
|
|
|
color: $gray-1;
|
|
|
|
background-color: transparent;
|
|
|
|
border-color: $gray-1;
|
|
|
|
}
|
|
|
|
}
|
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);
|
2018-11-06 01:01:00 -06:00
|
|
|
// Inverse appears as dark gray
|
2016-02-15 08:27:41 -06:00
|
|
|
}
|
|
|
|
.btn-inverse {
|
2017-12-05 05:48:16 -06:00
|
|
|
@include buttonBackground($btn-inverse-bg, $btn-inverse-bg-hl, $btn-inverse-text-color, $btn-inverse-text-shadow);
|
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
|
|
|
}
|
|
|
|
|
2018-01-31 07:19:07 -06:00
|
|
|
.btn-transparent {
|
|
|
|
background-color: transparent;
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
2017-12-19 09:22:41 -06:00
|
|
|
&:hover,
|
|
|
|
&:active,
|
|
|
|
&:active:hover,
|
|
|
|
&:focus {
|
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
|
|
|
color: $gray-1;
|
|
|
|
background-color: transparent;
|
2017-12-19 09:22:41 -06:00
|
|
|
border-color: $gray-1;
|
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
|
|
|
}
|
|
|
|
}
|
2016-02-18 07:44:36 -06:00
|
|
|
|
2017-12-12 08:00:04 -06:00
|
|
|
// Extra padding
|
2017-12-11 09:31:50 -06:00
|
|
|
.btn-p-x-2 {
|
|
|
|
padding-left: 20px;
|
|
|
|
padding-right: 20px;
|
|
|
|
}
|
2017-12-12 08:00:04 -06:00
|
|
|
|
|
|
|
// External services
|
|
|
|
// Usage:
|
|
|
|
// <div class="btn btn-service btn-service--facebook">Button text</div>
|
|
|
|
|
|
|
|
$btn-service-icon-width: 35px;
|
|
|
|
.btn-service {
|
|
|
|
position: relative;
|
|
|
|
}
|
|
|
|
|
|
|
|
@each $service, $data in $external-services {
|
|
|
|
$serviceBgColor: map-get($data, bgColor);
|
|
|
|
$serviceBorderColor: map-get($data, borderColor);
|
|
|
|
|
|
|
|
.btn-service--#{$service} {
|
|
|
|
background-color: $serviceBgColor;
|
|
|
|
border: 1px solid $serviceBorderColor;
|
|
|
|
|
|
|
|
.btn-service-icon {
|
|
|
|
font-size: 24px; // Override
|
|
|
|
border-right: 1px solid $serviceBorderColor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.btn-service-icon {
|
|
|
|
position: absolute;
|
|
|
|
left: 0;
|
|
|
|
height: 100%;
|
|
|
|
top: 0;
|
2017-12-19 09:22:41 -06:00
|
|
|
padding-left: 0.5rem;
|
|
|
|
padding-right: 0.5rem;
|
2017-12-12 08:00:04 -06:00
|
|
|
width: $btn-service-icon-width;
|
|
|
|
text-align: center;
|
|
|
|
|
|
|
|
&::before {
|
|
|
|
position: relative;
|
|
|
|
top: 4px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.btn-service--grafanacom {
|
|
|
|
.btn-service-icon {
|
|
|
|
background-image: url(/public/img/grafana_mask_icon_white.svg);
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
background-position: 50%;
|
|
|
|
background-size: 60%;
|
|
|
|
}
|
2017-12-19 09:22:41 -06:00
|
|
|
}
|
2018-08-16 03:58:47 -05:00
|
|
|
|
2018-09-21 03:25:46 -05:00
|
|
|
//Toggle button
|
|
|
|
|
|
|
|
.toggle-btn {
|
2018-09-24 05:49:29 -05:00
|
|
|
background: $input-label-bg;
|
|
|
|
color: $text-color-weak;
|
|
|
|
box-shadow: $card-shadow;
|
|
|
|
|
2018-09-26 00:56:33 -05:00
|
|
|
&:first-child {
|
2018-09-21 03:25:46 -05:00
|
|
|
border-radius: 2px 0 0 2px;
|
|
|
|
margin: 0;
|
|
|
|
}
|
2018-09-26 00:56:33 -05:00
|
|
|
&:last-child {
|
2018-09-21 03:25:46 -05:00
|
|
|
border-radius: 0 2px 2px 0;
|
|
|
|
margin-left: 0 !important;
|
2018-09-24 05:49:29 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
background-color: lighten($input-label-bg, 5%);
|
|
|
|
color: $link-color;
|
|
|
|
&:hover {
|
|
|
|
cursor: default;
|
2018-09-21 03:25:46 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-16 03:58:47 -05:00
|
|
|
//Button animations
|
|
|
|
|
|
|
|
.btn-loading span {
|
|
|
|
animation-name: blink;
|
|
|
|
animation-duration: 1.4s;
|
|
|
|
animation-iteration-count: infinite;
|
|
|
|
animation-fill-mode: both;
|
|
|
|
}
|
|
|
|
|
|
|
|
.btn-loading span:nth-child(2) {
|
|
|
|
animation-delay: 0.2s;
|
|
|
|
}
|
|
|
|
|
|
|
|
.btn-loading span:nth-child(3) {
|
|
|
|
animation-delay: 0.4s;
|
|
|
|
}
|
|
|
|
|
|
|
|
@keyframes blink {
|
|
|
|
0% {
|
|
|
|
opacity: 0.2;
|
|
|
|
font-size: 14;
|
|
|
|
}
|
|
|
|
20% {
|
|
|
|
opacity: 1;
|
|
|
|
font-size: 18;
|
|
|
|
}
|
|
|
|
100% {
|
|
|
|
opacity: 0.2;
|
|
|
|
font-size: 14;
|
|
|
|
}
|
|
|
|
}
|