commit
34c66c871a
|
@ -1,5 +1,6 @@
|
|||
import React, {PropTypes} from 'react';
|
||||
import AlertsTable from '../components/AlertsTable';
|
||||
import SourceIndicator from '../../shared/components/SourceIndicator';
|
||||
import {getAlerts} from '../apis';
|
||||
import AJAX from 'utils/ajax';
|
||||
import _ from 'lodash';
|
||||
|
@ -93,6 +94,7 @@ const AlertsApp = React.createClass({
|
|||
},
|
||||
|
||||
render() {
|
||||
const {source} = this.props;
|
||||
return (
|
||||
// I stole this from the Hosts page.
|
||||
// Perhaps we should create an abstraction?
|
||||
|
@ -104,6 +106,9 @@ const AlertsApp = React.createClass({
|
|||
Alert History
|
||||
</h1>
|
||||
</div>
|
||||
<div className="page-header__right">
|
||||
<SourceIndicator sourceName={source.name} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="page-contents">
|
||||
|
|
|
@ -4,6 +4,7 @@ import {Link} from 'react-router';
|
|||
|
||||
import AutoRefreshDropdown from 'shared/components/AutoRefreshDropdown'
|
||||
import TimeRangeDropdown from 'shared/components/TimeRangeDropdown'
|
||||
import SourceIndicator from '../../shared/components/SourceIndicator'
|
||||
|
||||
const DashboardHeader = ({
|
||||
children,
|
||||
|
@ -17,6 +18,7 @@ const DashboardHeader = ({
|
|||
handleChooseAutoRefresh,
|
||||
handleClickPresentationButton,
|
||||
sourceID,
|
||||
source,
|
||||
}) => isHidden ? null : (
|
||||
<div className="page-header full-width">
|
||||
<div className="page-header__container">
|
||||
|
@ -48,6 +50,7 @@ const DashboardHeader = ({
|
|||
Graph Tips
|
||||
</div>
|
||||
<ReactTooltip id="graph-tips-tooltip" effect="solid" html={true} offset={{top: 2}} place="bottom" class="influx-tooltip place-bottom" />
|
||||
<SourceIndicator sourceName={source.name} />
|
||||
<AutoRefreshDropdown onChoose={handleChooseAutoRefresh} selected={autoRefresh} iconName="refresh" />
|
||||
<TimeRangeDropdown onChooseTimeRange={handleChooseTimeRange} selected={timeRange.inputValue} />
|
||||
<div className="btn btn-info btn-sm" onClick={handleClickPresentationButton}>
|
||||
|
@ -79,6 +82,7 @@ DashboardHeader.propTypes = {
|
|||
handleChooseTimeRange: func.isRequired,
|
||||
handleChooseAutoRefresh: func.isRequired,
|
||||
handleClickPresentationButton: func.isRequired,
|
||||
source: shape({}),
|
||||
}
|
||||
|
||||
export default DashboardHeader
|
||||
|
|
|
@ -119,6 +119,7 @@ const DashboardPage = React.createClass({
|
|||
handleClickPresentationButton={handleClickPresentationButton}
|
||||
dashboard={dashboard}
|
||||
sourceID={sourceID}
|
||||
source={source}
|
||||
>
|
||||
{(dashboards).map((d, i) => {
|
||||
return (
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import React, {PropTypes} from 'react';
|
||||
import {Link} from 'react-router';
|
||||
import SourceIndicator from '../../shared/components/SourceIndicator';
|
||||
|
||||
import {getDashboards} from '../apis';
|
||||
|
||||
|
@ -53,6 +54,9 @@ const DashboardsPage = React.createClass({
|
|||
Dashboards
|
||||
</h1>
|
||||
</div>
|
||||
<div className="page-header__right">
|
||||
<SourceIndicator sourceName={this.props.source.name} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="page-contents">
|
||||
|
|
|
@ -4,6 +4,7 @@ import {withRouter} from 'react-router';
|
|||
|
||||
import AutoRefreshDropdown from 'shared/components/AutoRefreshDropdown'
|
||||
import TimeRangeDropdown from '../../shared/components/TimeRangeDropdown';
|
||||
import SourceIndicator from '../../shared/components/SourceIndicator';
|
||||
|
||||
import timeRanges from 'hson!../../shared/data/timeRanges.hson';
|
||||
|
||||
|
@ -57,11 +58,7 @@ const Header = React.createClass({
|
|||
<h1>Explorer</h1>
|
||||
</div>
|
||||
<div className="page-header__right">
|
||||
<h1>Source:</h1>
|
||||
<div className="source-indicator">
|
||||
<span className="icon cpu"></span>
|
||||
{this.context.source.name}
|
||||
</div>
|
||||
<SourceIndicator sourceName={this.context.source.name} />
|
||||
<AutoRefreshDropdown onChoose={handleChooseAutoRefresh} selected={autoRefresh} iconName="refresh" />
|
||||
<TimeRangeDropdown onChooseTimeRange={this.handleChooseTimeRange} selected={this.findSelected(timeRange)} />
|
||||
</div>
|
||||
|
|
|
@ -150,7 +150,16 @@ export const HostPage = React.createClass({
|
|||
},
|
||||
|
||||
render() {
|
||||
const {params: {hostID}, location: {query: {app}}, source: {id}, autoRefresh, handleChooseAutoRefresh, inPresentationMode, handleClickPresentationButton} = this.props
|
||||
const {
|
||||
params: {hostID},
|
||||
location: {query: {app}},
|
||||
source: {id},
|
||||
autoRefresh,
|
||||
handleChooseAutoRefresh,
|
||||
inPresentationMode,
|
||||
handleClickPresentationButton,
|
||||
source,
|
||||
} = this.props
|
||||
const {layouts, timeRange, hosts} = this.state
|
||||
const appParam = app ? `?app=${app}` : ''
|
||||
|
||||
|
@ -164,6 +173,7 @@ export const HostPage = React.createClass({
|
|||
handleChooseTimeRange={this.handleChooseTimeRange}
|
||||
handleChooseAutoRefresh={handleChooseAutoRefresh}
|
||||
handleClickPresentationButton={handleClickPresentationButton}
|
||||
source={source}
|
||||
>
|
||||
{Object.keys(hosts).map((host, i) => {
|
||||
return (
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import React, {PropTypes} from 'react';
|
||||
import _ from 'lodash';
|
||||
import HostsTable from '../components/HostsTable';
|
||||
import SourceIndicator from '../../shared/components/SourceIndicator'
|
||||
import {getCpuAndLoadForHosts, getMappings, getAppsForHosts} from '../apis';
|
||||
|
||||
export const HostsPage = React.createClass({
|
||||
|
@ -44,6 +45,7 @@ export const HostsPage = React.createClass({
|
|||
},
|
||||
|
||||
render() {
|
||||
const {source} = this.props;
|
||||
return (
|
||||
<div className="page">
|
||||
<div className="page-header">
|
||||
|
@ -53,13 +55,16 @@ export const HostsPage = React.createClass({
|
|||
Host List
|
||||
</h1>
|
||||
</div>
|
||||
<div className="page-header__right">
|
||||
<SourceIndicator sourceName={source.name} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="page-contents">
|
||||
<div className="container-fluid">
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
<HostsTable source={this.props.source} hosts={_.values(this.state.hosts)} up={this.state.up} />
|
||||
<HostsTable source={source} hosts={_.values(this.state.hosts)} up={this.state.up} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -105,7 +105,7 @@ const AlertOutputs = React.createClass({
|
|||
return (
|
||||
<div className="panel panel-minimal">
|
||||
<div className="panel-body">
|
||||
<h4 className="text-center">Configure Alert Endpoints</h4>
|
||||
<h4 className="text-center no-user-select">Configure Alert Endpoints</h4>
|
||||
<br/>
|
||||
<div className="row">
|
||||
<div className="form-group col-xs-12 col-sm-8 col-sm-offset-2">
|
||||
|
|
|
@ -31,10 +31,10 @@ const AlertaConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div className="col-xs-12">
|
||||
<h4 className="text-center">Alerta Alert</h4>
|
||||
<h4 className="text-center no-user-select">Alerta Alert</h4>
|
||||
<br/>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<p>
|
||||
<p className="no-user-select">
|
||||
Have alerts sent to Alerta
|
||||
</p>
|
||||
|
||||
|
|
|
@ -30,9 +30,9 @@ const HipchatConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">HipChat Alert</h4>
|
||||
<h4 className="text-center no-user-select">HipChat Alert</h4>
|
||||
<br/>
|
||||
<p>Have alerts sent to HipChat.</p>
|
||||
<p className="no-user-select">Have alerts sent to HipChat.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12">
|
||||
<label htmlFor="url">HipChat URL</label>
|
||||
|
|
|
@ -45,13 +45,13 @@ const KapacitorForm = React.createClass({
|
|||
<div className="col-md-8 col-md-offset-2">
|
||||
<div className="panel panel-minimal">
|
||||
<div className="panel-body">
|
||||
<p>
|
||||
<p className="no-user-select">
|
||||
Kapacitor is used as the monitoring and alerting agent.
|
||||
This page will let you configure which Kapacitor to use and
|
||||
set up alert end points like email, Slack, and others.
|
||||
</p>
|
||||
<hr/>
|
||||
<h4 className="text-center">Connect Kapacitor to Source</h4>
|
||||
<h4 className="text-center no-user-select">Connect Kapacitor to Source</h4>
|
||||
<h4 className="text-center">{source.url}</h4>
|
||||
<br/>
|
||||
<form onSubmit={onSubmit}>
|
||||
|
|
|
@ -47,6 +47,7 @@ export const KapacitorRule = React.createClass({
|
|||
onChooseTimeRange={this.handleChooseTimeRange}
|
||||
validationError={this.validationError()}
|
||||
timeRange={timeRange}
|
||||
source={source}
|
||||
/>
|
||||
<div className="page-contents page-contents--green-scrollbar">
|
||||
<div className="container-fluid">
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
import React, {PropTypes} from 'react';
|
||||
import {Link} from 'react-router';
|
||||
import React, {PropTypes} from 'react'
|
||||
import {Link} from 'react-router'
|
||||
|
||||
import NoKapacitorError from '../../shared/components/NoKapacitorError';
|
||||
import NoKapacitorError from '../../shared/components/NoKapacitorError'
|
||||
import SourceIndicator from '../../shared/components/SourceIndicator'
|
||||
import KapacitorRulesTable from 'src/kapacitor/components/KapacitorRulesTable'
|
||||
|
||||
const KapacitorRules = ({
|
||||
|
@ -29,7 +30,7 @@ const KapacitorRules = ({
|
|||
}
|
||||
|
||||
return (
|
||||
<PageContents>
|
||||
<PageContents source={source} >
|
||||
<div className="panel-heading u-flex u-ai-center u-jc-space-between">
|
||||
<h2 className="panel-title">Alert Rules</h2>
|
||||
<Link to={`/sources/${source.id}/alert-rules/new`} className="btn btn-sm btn-primary">Create New Rule</Link>
|
||||
|
@ -44,13 +45,16 @@ const KapacitorRules = ({
|
|||
)
|
||||
}
|
||||
|
||||
const PageContents = ({children}) => (
|
||||
const PageContents = ({children, source}) => (
|
||||
<div className="page">
|
||||
<div className="page-header">
|
||||
<div className="page-header__container">
|
||||
<div className="page-header__left">
|
||||
<h1>Kapacitor Rules</h1>
|
||||
</div>
|
||||
<div className="page-header__right">
|
||||
<SourceIndicator sourceName={source && source.name} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="page-contents">
|
||||
|
@ -86,6 +90,7 @@ KapacitorRules.propTypes = {
|
|||
|
||||
PageContents.propTypes = {
|
||||
children: node,
|
||||
source: shape(),
|
||||
}
|
||||
|
||||
export default KapacitorRules
|
||||
|
|
|
@ -65,9 +65,9 @@ const OpsGenieConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">OpsGenie Alert</h4>
|
||||
<h4 className="text-center no-user-select">OpsGenie Alert</h4>
|
||||
<br/>
|
||||
<p>Have alerts sent to OpsGenie.</p>
|
||||
<p className="no-user-select">Have alerts sent to OpsGenie.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12">
|
||||
<label htmlFor="api-key">API Key</label>
|
||||
|
|
|
@ -29,9 +29,9 @@ const PagerDutyConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">PagerDuty Alert</h4>
|
||||
<h4 className="text-center no-user-select">PagerDuty Alert</h4>
|
||||
<br/>
|
||||
<p>You can have alerts sent to PagerDuty by entering info below.</p>
|
||||
<p className="no-user-select">You can have alerts sent to PagerDuty by entering info below.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12">
|
||||
<label htmlFor="service-key">Service Key</label>
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
import React, {PropTypes} from 'react';
|
||||
import ReactTooltip from 'react-tooltip';
|
||||
import TimeRangeDropdown from '../../shared/components/TimeRangeDropdown';
|
||||
import SourceIndicator from '../../shared/components/SourceIndicator';
|
||||
|
||||
export const RuleHeader = React.createClass({
|
||||
propTypes: {
|
||||
source: PropTypes.shape({}).isRequired,
|
||||
onSave: PropTypes.func.isRequired,
|
||||
rule: PropTypes.shape({}).isRequired,
|
||||
actions: PropTypes.shape({
|
||||
|
@ -56,15 +58,16 @@ export const RuleHeader = React.createClass({
|
|||
},
|
||||
|
||||
renderSave() {
|
||||
const {validationError, onSave, timeRange, onChooseTimeRange} = this.props;
|
||||
const {validationError, onSave, timeRange, onChooseTimeRange, source} = this.props;
|
||||
const saveButton = validationError ?
|
||||
<button className="btn btn-sm btn-default disabled" data-for="save-kapacitor-tooltip" data-tip={validationError}>
|
||||
<button className="btn btn-success btn-sm disabled" data-for="save-kapacitor-tooltip" data-tip={validationError}>
|
||||
Save Rule
|
||||
</button> :
|
||||
<button className="btn btn-success btn-sm" onClick={onSave}>Save Rule</button>;
|
||||
|
||||
return (
|
||||
<div className="page-header__right">
|
||||
<SourceIndicator sourceName={source.name} />
|
||||
<TimeRangeDropdown onChooseTimeRange={onChooseTimeRange} selected={timeRange.inputValue} />
|
||||
{saveButton}
|
||||
<ReactTooltip id="save-kapacitor-tooltip" effect="solid" html={true} offset={{top: 2}} place="bottom" class="influx-tooltip kapacitor-tooltip place-bottom" />
|
||||
|
|
|
@ -33,9 +33,9 @@ const SMTPConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">SMTP Alert</h4>
|
||||
<h4 className="text-center no-user-select">SMTP Alert</h4>
|
||||
<br/>
|
||||
<p>You can have alerts sent to an email address by setting up an SMTP endpoint.</p>
|
||||
<p className="no-user-select">You can have alerts sent to an email address by setting up an SMTP endpoint.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12 col-md-6">
|
||||
<label htmlFor="smtp-host">SMTP Host</label>
|
||||
|
|
|
@ -27,9 +27,9 @@ const SensuConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">Sensu Alert</h4>
|
||||
<h4 className="text-center no-user-select">Sensu Alert</h4>
|
||||
<br/>
|
||||
<p>Have alerts sent to Sensu.</p>
|
||||
<p className="no-user-select">Have alerts sent to Sensu.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12 col-md-6">
|
||||
<label htmlFor="source">Source</label>
|
||||
|
|
|
@ -48,9 +48,9 @@ const SlackConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">Slack Alert</h4>
|
||||
<h4 className="text-center no-user-select">Slack Alert</h4>
|
||||
<br/>
|
||||
<p>Post alerts to a Slack channel.</p>
|
||||
<p className="no-user-select">Post alerts to a Slack channel.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12">
|
||||
<label htmlFor="slack-url">Slack Webhook URL (<a href="https://api.slack.com/incoming-webhooks" target="_">see more on Slack webhooks</a>)</label>
|
||||
|
|
|
@ -34,9 +34,9 @@ const TalkConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">Talk Alert</h4>
|
||||
<h4 className="text-center no-user-select">Talk Alert</h4>
|
||||
<br/>
|
||||
<p>Have alerts sent to Talk.</p>
|
||||
<p className="no-user-select">Have alerts sent to Talk.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12">
|
||||
<label htmlFor="url">URL</label>
|
||||
|
|
|
@ -48,9 +48,9 @@ const TelegramConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">Telegram Alert</h4>
|
||||
<h4 className="text-center no-user-select">Telegram Alert</h4>
|
||||
<br/>
|
||||
<p>You can have alerts sent to Telegram by entering info below.</p>
|
||||
<p className="no-user-select">You can have alerts sent to Telegram by entering info below.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12">
|
||||
<label htmlFor="url">Telegram URL</label>
|
||||
|
|
|
@ -32,9 +32,9 @@ const VictorOpsConfig = React.createClass({
|
|||
|
||||
return (
|
||||
<div>
|
||||
<h4 className="text-center">VictorOps Alert</h4>
|
||||
<h4 className="text-center no-user-select">VictorOps Alert</h4>
|
||||
<br/>
|
||||
<p>Have alerts sent to VictorOps.</p>
|
||||
<p className="no-user-select">Have alerts sent to VictorOps.</p>
|
||||
<form onSubmit={this.handleSaveAlert}>
|
||||
<div className="form-group col-xs-12">
|
||||
<label htmlFor="api-key">API Key</label>
|
||||
|
|
|
@ -70,7 +70,7 @@ export const KubernetesDashboard = React.createClass({
|
|||
},
|
||||
|
||||
render() {
|
||||
const {layouts, autoRefresh, handleChooseAutoRefresh, inPresentationMode, handleClickPresentationButton} = this.props;
|
||||
const {layouts, autoRefresh, handleChooseAutoRefresh, inPresentationMode, handleClickPresentationButton, source} = this.props;
|
||||
const {timeRange} = this.state;
|
||||
const emptyState = (
|
||||
<div className="generic-empty-state">
|
||||
|
@ -89,6 +89,7 @@ export const KubernetesDashboard = React.createClass({
|
|||
handleChooseTimeRange={this.handleChooseTimeRange}
|
||||
isHidden={inPresentationMode}
|
||||
handleClickPresentationButton={handleClickPresentationButton}
|
||||
source={source}
|
||||
/>
|
||||
<div className={classnames({
|
||||
'page-contents': true,
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
import React, {PropTypes} from 'react';
|
||||
|
||||
const SourceIndicator = React.createClass({
|
||||
propTypes: {
|
||||
sourceName: PropTypes.string,
|
||||
},
|
||||
|
||||
render() {
|
||||
const {sourceName} = this.props;
|
||||
if (!sourceName) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<div className="source-indicator">
|
||||
<span className="icon server"></span>
|
||||
{sourceName}
|
||||
</div>
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export default SourceIndicator;
|
|
@ -37,6 +37,7 @@
|
|||
@import 'components/search-widget';
|
||||
@import 'components/tables';
|
||||
@import 'components/resizer';
|
||||
@import 'components/source-indicator';
|
||||
|
||||
// Pages
|
||||
@import 'pages/alerts';
|
||||
|
|
|
@ -124,3 +124,28 @@
|
|||
padding: 0 10px 0 1px !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
.single-stat {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size: 60px;
|
||||
font-weight: 300;
|
||||
color: $c-pool;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
font-size: 54px;
|
||||
font-weight: 300;
|
||||
color: $c-pool;
|
||||
|
||||
&.graph-single-stat {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
font-size: 17px;
|
||||
font-weight: 400;
|
||||
transition: color 0.25s ease;
|
||||
@include no-user-select();
|
||||
}
|
||||
.dropdown-toggle > .caret {
|
||||
right: 0;
|
||||
|
@ -35,6 +36,7 @@
|
|||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@include no-user-select();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Source Indicator component styles
|
||||
----------------------------------------------------------------
|
||||
*/
|
||||
.source-indicator {
|
||||
@include no-user-select();
|
||||
display: inline-block;
|
||||
padding: 0 9px;
|
||||
border: 0;
|
||||
background-color: $g5-pepper;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
color: $g13-mist;
|
||||
font-weight: 700;
|
||||
font-size: 12px;
|
||||
border-radius: 3px;
|
||||
margin-right: 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
||||
> .icon {
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
margin: 0 4px 0 -2px;
|
||||
}
|
||||
}
|
|
@ -31,6 +31,7 @@
|
|||
margin: 0;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
@include no-user-select();
|
||||
}
|
||||
&__left,
|
||||
&__right {
|
||||
|
|
|
@ -214,6 +214,7 @@ $sidebar-logo-color: $g8-storm;
|
|||
white-space: nowrap;
|
||||
margin: 0;
|
||||
display: block;
|
||||
@include no-user-select();
|
||||
}
|
||||
|
||||
&__menu-item {
|
||||
|
|
|
@ -1,70 +1,87 @@
|
|||
// Gradients
|
||||
@mixin gradient-v($startColor, $endColor) {
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(top, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(top, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(to bottom, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=0 );
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(top, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(top, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(to bottom, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=0 );
|
||||
}
|
||||
@mixin gradient-h($startColor, $endColor) {
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(left, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(left, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(to right, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(left, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(left, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(to right, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
}
|
||||
@mixin gradient-diag-up($startColor, $endColor) {
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(45deg, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(45deg, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(45deg, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(45deg, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(45deg, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(45deg, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
}
|
||||
@mixin gradient-diag-down($startColor, $endColor) {
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(135deg, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(135deg, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(135deg, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
background: $startColor;
|
||||
background: -moz-linear-gradient(135deg, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-linear-gradient(135deg, $startColor 0%,$endColor 100%);
|
||||
background: linear-gradient(135deg, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
}
|
||||
@mixin gradient-r($startColor, $endColor) {
|
||||
background: $startColor;
|
||||
background: -moz-radial-gradient(center, ellipse cover, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-radial-gradient(center, ellipse cover, $startColor 0%,$endColor 100%);
|
||||
background: radial-gradient(ellipse at center, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
background: $startColor;
|
||||
background: -moz-radial-gradient(center, ellipse cover, $startColor 0%, $endColor 100%);
|
||||
background: -webkit-radial-gradient(center, ellipse cover, $startColor 0%,$endColor 100%);
|
||||
background: radial-gradient(ellipse at center, $startColor 0%,$endColor 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$startColor', endColorstr='$endColor',GradientType=1 );
|
||||
}
|
||||
|
||||
// Custom Scrollbars (Chrome Only)
|
||||
$scrollbar-width: 16px;
|
||||
$scrollbar-offset: 3px;
|
||||
@mixin custom-scrollbar($trackColor, $handleColor) {
|
||||
&::-webkit-scrollbar {
|
||||
width: $scrollbar-width;
|
||||
border-bottom-right-radius: $radius;
|
||||
&::-webkit-scrollbar {
|
||||
width: $scrollbar-width;
|
||||
border-bottom-right-radius: $radius;
|
||||
|
||||
&-button {
|
||||
background-color: $trackColor;
|
||||
}
|
||||
&-track {
|
||||
background-color: $trackColor;
|
||||
border-bottom-right-radius: $radius;
|
||||
}
|
||||
&-track-piece {
|
||||
background-color: $trackColor;
|
||||
border: $scrollbar-offset solid $trackColor;
|
||||
border-radius: ($scrollbar-width / 2);
|
||||
}
|
||||
&-thumb {
|
||||
background-color: $handleColor;
|
||||
border: $scrollbar-offset solid $trackColor;
|
||||
border-radius: ($scrollbar-width / 2);
|
||||
}
|
||||
&-corner {
|
||||
background-color: $trackColor;
|
||||
}
|
||||
}
|
||||
&::-webkit-resizer {
|
||||
background-color: $trackColor;
|
||||
}
|
||||
&-button {
|
||||
background-color: $trackColor;
|
||||
}
|
||||
&-track {
|
||||
background-color: $trackColor;
|
||||
border-bottom-right-radius: $radius;
|
||||
}
|
||||
&-track-piece {
|
||||
background-color: $trackColor;
|
||||
border: $scrollbar-offset solid $trackColor;
|
||||
border-radius: ($scrollbar-width / 2);
|
||||
}
|
||||
&-thumb {
|
||||
background-color: $handleColor;
|
||||
border: $scrollbar-offset solid $trackColor;
|
||||
border-radius: ($scrollbar-width / 2);
|
||||
}
|
||||
&-corner {
|
||||
background-color: $trackColor;
|
||||
}
|
||||
}
|
||||
&::-webkit-resizer {
|
||||
background-color: $trackColor;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Block user select
|
||||
@mixin no-user-select() {
|
||||
user-select: none !important;
|
||||
-moz-user-select: none !important;
|
||||
-webkit-user-select: none !important;
|
||||
-ms-user-select: none !important;
|
||||
-o-user-select: none !important;
|
||||
}
|
||||
.no-user-select {
|
||||
user-select: none !important;
|
||||
-moz-user-select: none !important;
|
||||
-webkit-user-select: none !important;
|
||||
-ms-user-select: none !important;
|
||||
-o-user-select: none !important;
|
||||
}
|
||||
|
|
|
@ -24,25 +24,4 @@ $sessions-dropdown-width: 227px;
|
|||
.sessions-dropdown__btn {
|
||||
margin: 0 16px 0 0;
|
||||
border-radius: 0 3px 3px 0;
|
||||
}
|
||||
.source-indicator {
|
||||
padding: 0 9px;
|
||||
border: 0;
|
||||
background-color: $g5-pepper;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
color: $g13-mist;
|
||||
font-weight: 700;
|
||||
font-size: 12px;
|
||||
border-radius: 3px;
|
||||
margin-right: 16px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
||||
> .icon {
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
margin: 0 4px 0 -2px;
|
||||
}
|
||||
}
|
|
@ -29,6 +29,7 @@
|
|||
justify-content: space-between;
|
||||
|
||||
h1 {
|
||||
@include no-user-select();
|
||||
font-size: 17px;
|
||||
font-weight: 400;
|
||||
text-transform: uppercase;
|
||||
|
@ -105,7 +106,7 @@
|
|||
padding: 0;
|
||||
|
||||
> .icon {
|
||||
margin: 0;
|
||||
margin: 0 !important;
|
||||
font-size: 12px;
|
||||
position: relative;
|
||||
top: -1px;
|
||||
|
@ -135,6 +136,7 @@
|
|||
overflow: hidden;
|
||||
max-width: 177px;
|
||||
text-overflow: ellipsis;
|
||||
@include no-user-select();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -165,6 +167,7 @@ $query-builder--column-heading-height: 60px;
|
|||
top: 60px;
|
||||
}
|
||||
.query-builder--column-heading {
|
||||
@include no-user-select();
|
||||
width: 100%;
|
||||
height: $query-builder--column-heading-height;
|
||||
display: flex;
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
font-weight: 600;
|
||||
border-radius: $radius-small $radius-small 0 0;
|
||||
margin-right: 2px;
|
||||
@include no-user-select();
|
||||
transition:
|
||||
color 0.25s ease,
|
||||
background-color 0.25s ease;
|
||||
|
@ -82,6 +83,7 @@
|
|||
border-radius: 0 0 $radius-small $radius-small;
|
||||
|
||||
&-item {
|
||||
@include no-user-select();
|
||||
color: $g11-sidewalk;
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
color: $g13-mist;
|
||||
font-weight: 600;
|
||||
margin-right: 16px;
|
||||
@include no-user-select();
|
||||
transition:
|
||||
color 0.25s ease;
|
||||
}
|
||||
|
@ -70,6 +71,7 @@
|
|||
}
|
||||
}
|
||||
.graph-container {
|
||||
@include no-user-select();
|
||||
background-color: $graph-bg-color;
|
||||
border-radius: 0 0 $graph-radius $graph-radius;
|
||||
padding: 8px 16px;
|
||||
|
|
|
@ -5,22 +5,6 @@
|
|||
|
||||
.graph-container.hosts-graph {
|
||||
padding: 8px 16px;
|
||||
|
||||
.single-stat {
|
||||
font-size: 60px;
|
||||
font-weight: 300;
|
||||
color: $c-pool;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
|
||||
&.graph-single-stat {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.host-list--active-source {
|
||||
|
|
|
@ -80,6 +80,7 @@ $kapacitor-font-sm: 13px;
|
|||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@include no-user-select();
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
|
@ -101,6 +102,7 @@ $kapacitor-font-sm: 13px;
|
|||
font-weight: 400;
|
||||
color: $g13-mist;
|
||||
position: relative;
|
||||
@include no-user-select();
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
|
@ -451,6 +453,7 @@ div.qeditor.kapacitor-metric-selector {
|
|||
font-weight: 600;
|
||||
display: inline-block;
|
||||
color: $g15-platinum;
|
||||
@include no-user-select();
|
||||
}
|
||||
> code {
|
||||
background-color: $g2-kevlar;
|
||||
|
@ -465,6 +468,7 @@ div.qeditor.kapacitor-metric-selector {
|
|||
font-size: ($kapacitor-font-sm - 2px);
|
||||
font-weight: 600;
|
||||
transition: color 0.25s ease;
|
||||
@include no-user-select();
|
||||
|
||||
&:hover {
|
||||
color: $c-rainforest;
|
||||
|
@ -483,6 +487,7 @@ div.qeditor.kapacitor-metric-selector {
|
|||
font-weight: 600;
|
||||
display: inline-block;
|
||||
color: $g15-platinum;
|
||||
@include no-user-select();
|
||||
}
|
||||
|
||||
&.top {
|
||||
|
@ -514,6 +519,7 @@ div.qeditor.kapacitor-metric-selector {
|
|||
}
|
||||
|
||||
> p {
|
||||
@include no-user-select();
|
||||
white-space: nowrap;
|
||||
font-weight: 600;
|
||||
color: $g15-platinum;
|
||||
|
@ -521,6 +527,7 @@ div.qeditor.kapacitor-metric-selector {
|
|||
margin-right: ($kap-padding-sm / 2);
|
||||
}
|
||||
> span {
|
||||
@include no-user-select();
|
||||
color: $kapacitor-accent;
|
||||
height: $kap-input-height;
|
||||
line-height: $kap-input-height;
|
||||
|
|
|
@ -19,6 +19,10 @@
|
|||
.panel hr {
|
||||
background-color: $g5-pepper;
|
||||
}
|
||||
.panel-title,
|
||||
.panel-title a {
|
||||
@include no-user-select();
|
||||
}
|
||||
.panel-minimal {
|
||||
border: 0;
|
||||
|
||||
|
@ -55,7 +59,9 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
table thead th {
|
||||
@include no-user-select();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
@ -86,6 +92,72 @@ button.btn.btn-sm > span.icon {
|
|||
top: -1px;
|
||||
}
|
||||
|
||||
.btn.disabled,
|
||||
.btn[disabled="true"] {
|
||||
&.btn-success,
|
||||
&.btn-success:hover,
|
||||
&.btn-success:focus,
|
||||
&.btn-success:active,
|
||||
&.btn-success:hover:active,
|
||||
&.btn-success:hover:focus,
|
||||
&.btn-success:focus:active,
|
||||
&.btn-success:focus:active:hover {
|
||||
border-color: $c-emerald;
|
||||
background-color: $c-emerald;
|
||||
color: $g2-kevlar !important;
|
||||
}
|
||||
&.btn-primary,
|
||||
&.btn-primary:hover,
|
||||
&.btn-primary:focus,
|
||||
&.btn-primary:active,
|
||||
&.btn-primary:hover:active,
|
||||
&.btn-primary:hover:focus,
|
||||
&.btn-primary:focus:active,
|
||||
&.btn-primary:focus:active:hover {
|
||||
border-color: $c-sapphire;
|
||||
background-color: $c-sapphire;
|
||||
color: $g2-kevlar !important;
|
||||
}
|
||||
&.btn-info,
|
||||
&.btn-info:hover,
|
||||
&.btn-info:focus,
|
||||
&.btn-info:active,
|
||||
&.btn-info:hover:active,
|
||||
&.btn-info:hover:focus,
|
||||
&.btn-info:focus:active,
|
||||
&.btn-info:focus:active:hover {
|
||||
border-color: $g5-pepper;
|
||||
background-color: $g5-pepper;
|
||||
color: $g8-storm !important;
|
||||
}
|
||||
&.btn-danger,
|
||||
&.btn-danger:hover,
|
||||
&.btn-danger:focus,
|
||||
&.btn-danger:active,
|
||||
&.btn-danger:hover:active,
|
||||
&.btn-danger:hover:focus,
|
||||
&.btn-danger:focus:active,
|
||||
&.btn-danger:focus:active:hover {
|
||||
border-color: $c-ruby;
|
||||
background-color: $c-ruby;
|
||||
color: $g2-kevlar !important;
|
||||
}
|
||||
&.btn-warning,
|
||||
&.btn-warning:hover,
|
||||
&.btn-warning:focus,
|
||||
&.btn-warning:active,
|
||||
&.btn-warning:hover:active,
|
||||
&.btn-warning:hover:focus,
|
||||
&.btn-warning:focus:active,
|
||||
&.btn-warning:focus:active:hover {
|
||||
border-color: $c-star;
|
||||
background-color: $c-star;
|
||||
color: $g2-kevlar !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Dark Inputs
|
||||
----------------------------------------------
|
||||
|
@ -99,6 +171,7 @@ button.btn.btn-sm > span.icon {
|
|||
font-weight: 600;
|
||||
margin-bottom: 4px;
|
||||
padding: 0 13px;
|
||||
@include no-user-select();
|
||||
}
|
||||
.form-control {
|
||||
padding: 0 13px;
|
||||
|
@ -433,6 +506,8 @@ $toggle-border: 2px;
|
|||
border-radius: 3px;
|
||||
background-color: $g5-pepper;
|
||||
font-size: 0;
|
||||
white-space: nowrap;
|
||||
@include no-user-select();
|
||||
}
|
||||
.toggle-btn {
|
||||
border: 0;
|
||||
|
@ -673,4 +748,12 @@ $form-static-checkbox-size: 16px;
|
|||
opacity: 1;
|
||||
transform: translate(-50%,-50%) scale(1,1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
br {
|
||||
@include no-user-select();
|
||||
}
|
Loading…
Reference in New Issue