Bump Prettier version (#15532)

* Fix prettier version to 1.16.4
This commit is contained in:
Dominik Prokop 2019-02-19 15:41:35 +01:00 committed by Torkel Ödegaard
parent 5b1cf9c94f
commit 88a46e6dd4
83 changed files with 583 additions and 396 deletions

View File

@ -83,7 +83,7 @@
"postcss-browser-reporter": "^0.5.0", "postcss-browser-reporter": "^0.5.0",
"postcss-loader": "^2.0.6", "postcss-loader": "^2.0.6",
"postcss-reporter": "^5.0.0", "postcss-reporter": "^5.0.0",
"prettier": "1.9.2", "prettier": "1.16.4",
"react-hot-loader": "^4.3.6", "react-hot-loader": "^4.3.6",
"react-test-renderer": "^16.5.0", "react-test-renderer": "^16.5.0",
"redux-mock-store": "^1.5.3", "redux-mock-store": "^1.5.3",
@ -129,8 +129,14 @@
} }
}, },
"lint-staged": { "lint-staged": {
"*.{ts,tsx,json,scss}": ["prettier --write", "git add"], "*.{ts,tsx,json,scss}": [
"*pkg/**/*.go": ["gofmt -w -s", "git add"] "prettier --write",
"git add"
],
"*pkg/**/*.go": [
"gofmt -w -s",
"git add"
]
}, },
"prettier": { "prettier": {
"trailingComma": "es5", "trailingComma": "es5",
@ -196,7 +202,12 @@
"**/@types/react": "16.7.6" "**/@types/react": "16.7.6"
}, },
"workspaces": { "workspaces": {
"packages": ["packages/*"], "packages": [
"nohoist": ["**/@types/*", "**/@types/*/**"] "packages/*"
],
"nohoist": [
"**/@types/*",
"**/@types/*/**"
]
} }
} }

View File

@ -4,5 +4,5 @@
padding: $spacer; padding: $spacer;
min-width: 350px; min-width: 350px;
border-radius: $border-radius; border-radius: $border-radius;
margin-bottom: $spacer*2; margin-bottom: $spacer * 2;
} }

View File

@ -115,9 +115,9 @@ export class Gauge extends PureComponent<Props> {
getFontScale(length: number): number { getFontScale(length: number): number {
if (length > 12) { if (length > 12) {
return FONT_SCALE - length * 5 / 120; return FONT_SCALE - (length * 5) / 120;
} }
return FONT_SCALE - length * 5 / 105; return FONT_SCALE - (length * 5) / 105;
} }
draw() { draw() {

View File

@ -17,12 +17,7 @@ const transitionStyles: { [key: string]: object } = {
exiting: { opacity: 0, transitionDelay: '500ms' }, exiting: { opacity: 0, transitionDelay: '500ms' },
}; };
export type RenderPopperArrowFn = ( export type RenderPopperArrowFn = (props: { arrowProps: PopperArrowProps; placement: string }) => JSX.Element;
props: {
arrowProps: PopperArrowProps;
placement: string;
}
) => JSX.Element;
interface Props extends React.HTMLAttributes<HTMLDivElement> { interface Props extends React.HTMLAttributes<HTMLDivElement> {
show: boolean; show: boolean;

View File

@ -61,15 +61,14 @@ export default class PermissionsListItem extends PureComponent<Props> {
{item.name} <ItemDescription item={item} /> {item.name} <ItemDescription item={item} />
</td> </td>
<td> <td>
{item.inherited && {item.inherited && folderInfo && (
folderInfo && ( <em className="muted no-wrap">
<em className="muted no-wrap"> Inherited from folder{' '}
Inherited from folder{' '} <a className="text-link" href={`${folderInfo.url}/permissions`}>
<a className="text-link" href={`${folderInfo.url}/permissions`}> {folderInfo.title}
{folderInfo.title} </a>{' '}
</a>{' '} </em>
</em> )}
)}
{inheritedFromRoot && <em className="muted no-wrap">Default Permission</em>} {inheritedFromRoot && <em className="muted no-wrap">Default Permission</em>}
</td> </td>
<td className="query-keyword">Can</td> <td className="query-keyword">Can</td>

View File

@ -3,14 +3,14 @@
/* /*
* Escapes `"` characters from string * Escapes `"` characters from string
*/ */
function escapeString(str: string): string { function escapeString(str: string): string {
return str.replace('"', '"'); return str.replace('"', '"');
} }
/* /*
* Determines if a value is an object * Determines if a value is an object
*/ */
export function isObject(value: any): boolean { export function isObject(value: any): boolean {
const type = typeof value; const type = typeof value;
return !!value && type === 'object'; return !!value && type === 'object';
@ -20,7 +20,7 @@ export function isObject(value: any): boolean {
* Gets constructor name of an object. * Gets constructor name of an object.
* From http://stackoverflow.com/a/332429 * From http://stackoverflow.com/a/332429
* *
*/ */
export function getObjectName(object: object): string { export function getObjectName(object: object): string {
if (object === undefined) { if (object === undefined) {
return ''; return '';
@ -43,7 +43,7 @@ export function getObjectName(object: object): string {
/* /*
* Gets type of an object. Returns "null" for null objects * Gets type of an object. Returns "null" for null objects
*/ */
export function getType(object: object): string { export function getType(object: object): string {
if (object === null) { if (object === null) {
return 'null'; return 'null';
@ -53,7 +53,7 @@ export function getType(object: object): string {
/* /*
* Generates inline preview for a JavaScript object based on a value * Generates inline preview for a JavaScript object based on a value
*/ */
export function getValuePreview(object: object, value: string): string { export function getValuePreview(object: object, value: string): string {
const type = getType(object); const type = getType(object);
@ -78,7 +78,7 @@ export function getValuePreview(object: object, value: string): string {
/* /*
* Generates inline preview for a JavaScript object * Generates inline preview for a JavaScript object
*/ */
let value = ''; let value = '';
export function getPreview(obj: object): string { export function getPreview(obj: object): string {
if (isObject(obj)) { if (isObject(obj)) {
@ -94,15 +94,15 @@ export function getPreview(obj: object): string {
/* /*
* Generates a prefixed CSS class name * Generates a prefixed CSS class name
*/ */
export function cssClass(className: string): string { export function cssClass(className: string): string {
return `json-formatter-${className}`; return `json-formatter-${className}`;
} }
/* /*
* Creates a new DOM element with given type and class * Creates a new DOM element with given type and class
* TODO: move me to helpers * TODO: move me to helpers
*/ */
export function createElement(type: string, className?: string, content?: Element | string): Element { export function createElement(type: string, className?: string, content?: Element | string): Element {
const el = document.createElement(type); const el = document.createElement(type);
if (className) { if (className) {

View File

@ -83,7 +83,7 @@ export class JsonExplorer {
/* /*
* is formatter open? * is formatter open?
*/ */
private get isOpen(): boolean { private get isOpen(): boolean {
if (this._isOpen !== null) { if (this._isOpen !== null) {
return this._isOpen; return this._isOpen;
@ -94,14 +94,14 @@ export class JsonExplorer {
/* /*
* set open state (from toggler) * set open state (from toggler)
*/ */
private set isOpen(value: boolean) { private set isOpen(value: boolean) {
this._isOpen = value; this._isOpen = value;
} }
/* /*
* is this a date string? * is this a date string?
*/ */
private get isDate(): boolean { private get isDate(): boolean {
return ( return (
this.type === 'string' && this.type === 'string' &&
@ -111,14 +111,14 @@ export class JsonExplorer {
/* /*
* is this a URL string? * is this a URL string?
*/ */
private get isUrl(): boolean { private get isUrl(): boolean {
return this.type === 'string' && this.json.indexOf('http') === 0; return this.type === 'string' && this.json.indexOf('http') === 0;
} }
/* /*
* is this an array? * is this an array?
*/ */
private get isArray(): boolean { private get isArray(): boolean {
return Array.isArray(this.json); return Array.isArray(this.json);
} }
@ -126,21 +126,21 @@ export class JsonExplorer {
/* /*
* is this an object? * is this an object?
* Note: In this context arrays are object as well * Note: In this context arrays are object as well
*/ */
private get isObject(): boolean { private get isObject(): boolean {
return isObject(this.json); return isObject(this.json);
} }
/* /*
* is this an empty object with no properties? * is this an empty object with no properties?
*/ */
private get isEmptyObject(): boolean { private get isEmptyObject(): boolean {
return !this.keys.length && !this.isArray; return !this.keys.length && !this.isArray;
} }
/* /*
* is this an empty object or array? * is this an empty object or array?
*/ */
private get isEmpty(): boolean { private get isEmpty(): boolean {
return this.isEmptyObject || (this.keys && !this.keys.length && this.isArray); return this.isEmptyObject || (this.keys && !this.keys.length && this.isArray);
} }
@ -148,14 +148,14 @@ export class JsonExplorer {
/* /*
* did we receive a key argument? * did we receive a key argument?
* This means that the formatter was called as a sub formatter of a parent formatter * This means that the formatter was called as a sub formatter of a parent formatter
*/ */
private get hasKey(): boolean { private get hasKey(): boolean {
return typeof this.key !== 'undefined'; return typeof this.key !== 'undefined';
} }
/* /*
* if this is an object, get constructor function name * if this is an object, get constructor function name
*/ */
private get constructorName(): string { private get constructorName(): string {
return getObjectName(this.json); return getObjectName(this.json);
} }
@ -163,7 +163,7 @@ export class JsonExplorer {
/* /*
* get type of this value * get type of this value
* Possible values: all JavaScript primitive types plus "array" and "null" * Possible values: all JavaScript primitive types plus "array" and "null"
*/ */
private get type(): string { private get type(): string {
return getType(this.json); return getType(this.json);
} }
@ -171,7 +171,7 @@ export class JsonExplorer {
/* /*
* get object keys * get object keys
* If there is an empty key we pad it wit quotes to make it visible * If there is an empty key we pad it wit quotes to make it visible
*/ */
private get keys(): string[] { private get keys(): string[] {
if (this.isObject) { if (this.isObject) {
return Object.keys(this.json).map(key => (key ? key : '""')); return Object.keys(this.json).map(key => (key ? key : '""'));

View File

@ -47,7 +47,8 @@ class BottomNavLinks extends PureComponent<Props> {
<div className="sidemenu-org-switcher__org-current">Current Org:</div> <div className="sidemenu-org-switcher__org-current">Current Org:</div>
</div> </div>
<div className="sidemenu-org-switcher__switch"> <div className="sidemenu-org-switcher__switch">
<i className="fa fa-fw fa-random" />Switch <i className="fa fa-fw fa-random" />
Switch
</div> </div>
</a> </a>
</li> </li>

View File

@ -29,7 +29,8 @@ export class SideMenu extends PureComponent {
<div className="sidemenu__logo_small_breakpoint" onClick={this.toggleSideMenuSmallBreakpoint} key="hamburger"> <div className="sidemenu__logo_small_breakpoint" onClick={this.toggleSideMenuSmallBreakpoint} key="hamburger">
<i className="fa fa-bars" /> <i className="fa fa-bars" />
<span className="sidemenu__close"> <span className="sidemenu__close">
<i className="fa fa-times" />&nbsp;Close <i className="fa fa-times" />
&nbsp;Close
</span> </span>
</div>, </div>,
<TopSection key="topsection" />, <TopSection key="topsection" />,

View File

@ -153,7 +153,7 @@ export function buildQueryTransaction(
}; };
} }
export const clearQueryKeys: ((query: DataQuery) => object) = ({ key, refId, ...rest }) => rest; export const clearQueryKeys: (query: DataQuery) => object = ({ key, refId, ...rest }) => rest;
const isMetricSegment = (segment: { [key: string]: string }) => segment.hasOwnProperty('expr'); const isMetricSegment = (segment: { [key: string]: string }) => segment.hasOwnProperty('expr');
const isUISegment = (segment: { [key: string]: string }) => segment.hasOwnProperty('ui'); const isUISegment = (segment: { [key: string]: string }) => segment.hasOwnProperty('ui');

View File

@ -143,7 +143,7 @@ kbn.secondsToHhmmss = seconds => {
}; };
kbn.to_percent = (nr, outof) => { kbn.to_percent = (nr, outof) => {
return Math.floor(nr / outof * 10000) / 100 + '%'; return Math.floor((nr / outof) * 10000) / 100 + '%';
}; };
kbn.addslashes = str => { kbn.addslashes = str => {

View File

@ -149,4 +149,9 @@ const mapDispatchToProps = {
togglePauseAlertRule, togglePauseAlertRule,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(AlertRuleList)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(AlertRuleList)
);

View File

@ -263,4 +263,9 @@ const mapDispatchToProps = {
addApiKey, addApiKey,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(ApiKeysPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(ApiKeysPage)
);

View File

@ -32,7 +32,7 @@
.add-panel-widget__title { .add-panel-widget__title {
font-size: $font-size-md; font-size: $font-size-md;
font-weight: $font-weight-semi-bold; font-weight: $font-weight-semi-bold;
margin-right: $spacer*2; margin-right: $spacer * 2;
} }
.add-panel-widget__link { .add-panel-widget__link {

View File

@ -267,4 +267,7 @@ const mapDispatchToProps = {
updateLocation, updateLocation,
}; };
export default connect(mapStateToProps, mapDispatchToProps)(DashNav); export default connect(
mapStateToProps,
mapDispatchToProps
)(DashNav);

View File

@ -306,4 +306,9 @@ const mapDispatchToProps = {
updateLocation, updateLocation,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DashboardPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(DashboardPage)
);

View File

@ -107,4 +107,9 @@ const mapDispatchToProps = {
initDashboard, initDashboard,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(SoloPanelPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(SoloPanelPage)
);

View File

@ -49,21 +49,20 @@ export class PanelHeaderCorner extends Component<Props> {
return ( return (
<div className="markdown-html"> <div className="markdown-html">
<div dangerouslySetInnerHTML={{ __html: remarkableInterpolatedMarkdown }} /> <div dangerouslySetInnerHTML={{ __html: remarkableInterpolatedMarkdown }} />
{panel.links && {panel.links && panel.links.length > 0 && (
panel.links.length > 0 && ( <ul className="text-left">
<ul className="text-left"> {panel.links.map((link, idx) => {
{panel.links.map((link, idx) => { const info = linkSrv.getPanelLinkAnchorInfo(link, panel.scopedVars);
const info = linkSrv.getPanelLinkAnchorInfo(link, panel.scopedVars); return (
return ( <li key={idx}>
<li key={idx}> <a className="panel-menu-link" href={info.href} target={info.target}>
<a className="panel-menu-link" href={info.href} target={info.target}> {info.title}
{info.title} </a>
</a> </li>
</li> );
); })}
})} </ul>
</ul> )}
)}
</div> </div>
); );
}; };

View File

@ -227,8 +227,8 @@ export class TimeSrv {
const timespan = range.to.valueOf() - range.from.valueOf(); const timespan = range.to.valueOf() - range.from.valueOf();
const center = range.to.valueOf() - timespan / 2; const center = range.to.valueOf() - timespan / 2;
const to = center + timespan * factor / 2; const to = center + (timespan * factor) / 2;
const from = center - timespan * factor / 2; const from = center - (timespan * factor) / 2;
this.setTime({ from: moment.utc(from), to: moment.utc(to) }); this.setTime({ from: moment.utc(from), to: moment.utc(to) });
} }

View File

@ -487,7 +487,7 @@ export class DashboardMigrator {
for (const panel of row.panels) { for (const panel of row.panels) {
panel.span = panel.span || DEFAULT_PANEL_SPAN; panel.span = panel.span || DEFAULT_PANEL_SPAN;
if (panel.minSpan) { if (panel.minSpan) {
panel.minSpan = Math.min(GRID_COLUMN_COUNT, GRID_COLUMN_COUNT / 12 * panel.minSpan); panel.minSpan = Math.min(GRID_COLUMN_COUNT, (GRID_COLUMN_COUNT / 12) * panel.minSpan);
} }
const panelWidth = Math.floor(panel.span) * widthFactor; const panelWidth = Math.floor(panel.span) * widthFactor;
const panelHeight = panel.height ? getGridHeight(panel.height) : rowGridHeight; const panelHeight = panel.height ? getGridHeight(panel.height) : rowGridHeight;

View File

@ -98,4 +98,9 @@ const mapDispatchToProps = {
removeDashboard, removeDashboard,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourceDashboards)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(DataSourceDashboards)
);

View File

@ -115,4 +115,9 @@ const mapDispatchToProps = {
setDataSourcesLayoutMode, setDataSourcesLayoutMode,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourcesListPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(DataSourcesListPage)
);

View File

@ -80,4 +80,9 @@ const mapDispatchToProps = {
setDataSourceTypeSearchQuery, setDataSourceTypeSearchQuery,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(NewDataSourcePage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(NewDataSourcePage)
);

View File

@ -259,4 +259,9 @@ const mapDispatchToProps = {
setIsDefault, setIsDefault,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourceSettingsPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(DataSourceSettingsPage)
);

View File

@ -200,43 +200,42 @@ export class Explore extends React.PureComponent<ExploreProps> {
</div> </div>
)} )}
{datasourceInstance && {datasourceInstance && !datasourceError && (
!datasourceError && ( <div className="explore-container">
<div className="explore-container"> <QueryRows exploreEvents={this.exploreEvents} exploreId={exploreId} queryKeys={queryKeys} />
<QueryRows exploreEvents={this.exploreEvents} exploreId={exploreId} queryKeys={queryKeys} /> <AutoSizer onResize={this.onResize} disableHeight>
<AutoSizer onResize={this.onResize} disableHeight> {({ width }) => {
{({ width }) => { if (width === 0) {
if (width === 0) { return null;
return null; }
}
return ( return (
<main className="m-t-2" style={{ width }}> <main className="m-t-2" style={{ width }}>
<ErrorBoundary> <ErrorBoundary>
{showingStartPage && <StartPage onClickExample={this.onClickExample} />} {showingStartPage && <StartPage onClickExample={this.onClickExample} />}
{!showingStartPage && ( {!showingStartPage && (
<> <>
{supportsGraph && !supportsLogs && <GraphContainer width={width} exploreId={exploreId} />} {supportsGraph && !supportsLogs && <GraphContainer width={width} exploreId={exploreId} />}
{supportsTable && <TableContainer exploreId={exploreId} onClickCell={this.onClickLabel} />} {supportsTable && <TableContainer exploreId={exploreId} onClickCell={this.onClickLabel} />}
{supportsLogs && ( {supportsLogs && (
<LogsContainer <LogsContainer
width={width} width={width}
exploreId={exploreId} exploreId={exploreId}
onChangeTime={this.onChangeTime} onChangeTime={this.onChangeTime}
onClickLabel={this.onClickLabel} onClickLabel={this.onClickLabel}
onStartScanning={this.onStartScanning} onStartScanning={this.onStartScanning}
onStopScanning={this.onStopScanning} onStopScanning={this.onStopScanning}
/> />
)} )}
</> </>
)} )}
</ErrorBoundary> </ErrorBoundary>
</main> </main>
); );
}} }}
</AutoSizer> </AutoSizer>
</div> </div>
)} )}
</div> </div>
); );
} }
@ -287,4 +286,9 @@ const mapDispatchToProps = {
setQueries, setQueries,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(Explore)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(Explore)
);

View File

@ -193,4 +193,9 @@ const mapDispatchToProps: DispatchProps = {
split: splitOpen, split: splitOpen,
}; };
export const ExploreToolbar = hot(module)(connect(mapStateToProps, mapDispatchToProps)(UnConnectedExploreToolbar)); export const ExploreToolbar = hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(UnConnectedExploreToolbar)
);

View File

@ -217,11 +217,13 @@ export class Graph extends PureComponent<GraphProps, GraphState> {
let series = [{ data: [[0, 0]] }]; let series = [{ data: [[0, 0]] }];
if (data && data.length > 0) { if (data && data.length > 0) {
series = data.filter((ts: TimeSeries) => !hiddenSeries.has(ts.alias)).map((ts: TimeSeries) => ({ series = data
color: ts.color, .filter((ts: TimeSeries) => !hiddenSeries.has(ts.alias))
label: ts.label, .map((ts: TimeSeries) => ({
data: ts.getFlotPairs('null'), color: ts.color,
})); label: ts.label,
data: ts.getFlotPairs('null'),
}));
} }
this.dynamicOptions = this.getDynamicOptions(); this.dynamicOptions = this.getDynamicOptions();
@ -242,17 +244,15 @@ export class Graph extends PureComponent<GraphProps, GraphState> {
return ( return (
<> <>
{this.props.data && {this.props.data && this.props.data.length > MAX_NUMBER_OF_TIME_SERIES && !this.state.showAllTimeSeries && (
this.props.data.length > MAX_NUMBER_OF_TIME_SERIES && <div className="time-series-disclaimer">
!this.state.showAllTimeSeries && ( <i className="fa fa-fw fa-warning disclaimer-icon" />
<div className="time-series-disclaimer"> {`Showing only ${MAX_NUMBER_OF_TIME_SERIES} time series. `}
<i className="fa fa-fw fa-warning disclaimer-icon" /> <span className="show-all-time-series" onClick={this.onShowAllTimeSeries}>{`Show all ${
{`Showing only ${MAX_NUMBER_OF_TIME_SERIES} time series. `} this.props.data.length
<span className="show-all-time-series" onClick={this.onShowAllTimeSeries}>{`Show all ${ }`}</span>
this.props.data.length </div>
}`}</span> )}
</div>
)}
<div id={id} className="explore-graph" style={{ height }} /> <div id={id} className="explore-graph" style={{ height }} />
<Legend data={data} hiddenSeries={hiddenSeries} onToggleSeries={this.onToggleSeries} /> <Legend data={data} hiddenSeries={hiddenSeries} onToggleSeries={this.onToggleSeries} />
</> </>

View File

@ -70,4 +70,9 @@ const mapDispatchToProps = {
changeTime, changeTime,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(GraphContainer)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(GraphContainer)
);

View File

@ -60,7 +60,9 @@ export class LogLabelStats extends PureComponent<Props> {
<span className="logs-stats__close fa fa-remove" onClick={onClickClose} /> <span className="logs-stats__close fa fa-remove" onClick={onClickClose} />
</div> </div>
<div className="logs-stats__body"> <div className="logs-stats__body">
{topRows.map(stat => <LogLabelStatsRow key={stat.value} {...stat} active={stat.value === value} />)} {topRows.map(stat => (
<LogLabelStatsRow key={stat.value} {...stat} active={stat.value === value} />
))}
{insertActiveRow && activeRow && <LogLabelStatsRow key={activeRow.value} {...activeRow} active />} {insertActiveRow && activeRow && <LogLabelStatsRow key={activeRow.value} {...activeRow} active />}
{otherCount > 0 && ( {otherCount > 0 && (
<LogLabelStatsRow key="__OTHERS__" count={otherCount} value="Other" proportion={otherProportion} /> <LogLabelStatsRow key="__OTHERS__" count={otherCount} value="Other" proportion={otherProportion} />

View File

@ -61,15 +61,14 @@ export class LogMessageAnsi extends PureComponent<Props, State> {
render() { render() {
const { chunks } = this.state; const { chunks } = this.state;
return chunks.map( return chunks.map((chunk, index) =>
(chunk, index) => chunk.style ? (
chunk.style ? ( <span key={index} style={chunk.style}>
<span key={index} style={chunk.style}> {chunk.text}
{chunk.text} </span>
</span> ) : (
) : ( chunk.text
chunk.text )
)
); );
} }
} }

View File

@ -161,26 +161,23 @@ export class LogRow extends PureComponent<Props, State> {
)} )}
<div className="logs-row__message" onMouseEnter={this.onMouseOverMessage} onMouseLeave={this.onMouseOutMessage}> <div className="logs-row__message" onMouseEnter={this.onMouseOverMessage} onMouseLeave={this.onMouseOutMessage}>
{containsAnsiCodes && <LogMessageAnsi value={row.entry} />} {containsAnsiCodes && <LogMessageAnsi value={row.entry} />}
{!containsAnsiCodes && {!containsAnsiCodes && parsed && (
parsed && ( <Highlighter
<Highlighter autoEscape
autoEscape highlightTag={FieldHighlight(this.onClickHighlight)}
highlightTag={FieldHighlight(this.onClickHighlight)} textToHighlight={row.entry}
textToHighlight={row.entry} searchWords={parsedFieldHighlights}
searchWords={parsedFieldHighlights} highlightClassName="logs-row__field-highlight"
highlightClassName="logs-row__field-highlight" />
/> )}
)} {!containsAnsiCodes && !parsed && needsHighlighter && (
{!containsAnsiCodes && <Highlighter
!parsed && textToHighlight={row.entry}
needsHighlighter && ( searchWords={highlights}
<Highlighter findChunks={findHighlightChunksInText}
textToHighlight={row.entry} highlightClassName={highlightClassName}
searchWords={highlights} />
findChunks={findHighlightChunksInText} )}
highlightClassName={highlightClassName}
/>
)}
{!containsAnsiCodes && !parsed && !needsHighlighter && row.entry} {!containsAnsiCodes && !parsed && !needsHighlighter && row.entry}
{showFieldStats && ( {showFieldStats && (
<div className="logs-row__stats"> <div className="logs-row__stats">

View File

@ -237,17 +237,16 @@ export default class Logs extends PureComponent<Props, State> {
</div> </div>
</div> </div>
{hasData && {hasData && meta && (
meta && ( <div className="logs-panel-meta">
<div className="logs-panel-meta"> {meta.map(item => (
{meta.map(item => ( <div className="logs-panel-meta__item" key={item.label}>
<div className="logs-panel-meta__item" key={item.label}> <span className="logs-panel-meta__label">{item.label}:</span>
<span className="logs-panel-meta__label">{item.label}:</span> <span className="logs-panel-meta__value">{renderMetaItem(item.value, item.kind)}</span>
<span className="logs-panel-meta__value">{renderMetaItem(item.value, item.kind)}</span> </div>
</div> ))}
))} </div>
</div> )}
)}
<div className="logs-rows"> <div className="logs-rows">
{hasData && {hasData &&
@ -282,16 +281,14 @@ export default class Logs extends PureComponent<Props, State> {
))} ))}
{hasData && deferLogs && <span>Rendering {dedupedData.rows.length} rows...</span>} {hasData && deferLogs && <span>Rendering {dedupedData.rows.length} rows...</span>}
</div> </div>
{!loading && {!loading && !hasData && !scanning && (
!hasData && <div className="logs-panel-nodata">
!scanning && ( No logs found.
<div className="logs-panel-nodata"> <a className="link" onClick={this.onClickScan}>
No logs found. Scan for older logs
<a className="link" onClick={this.onClickScan}> </a>
Scan for older logs </div>
</a> )}
</div>
)}
{scanning && ( {scanning && (
<div className="logs-panel-nodata"> <div className="logs-panel-nodata">

View File

@ -127,4 +127,9 @@ const mapDispatchToProps = {
toggleLogLevelAction, toggleLogLevelAction,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(LogsContainer)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(LogsContainer)
);

View File

@ -169,4 +169,9 @@ const mapDispatchToProps = {
runQueries, runQueries,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(QueryRow)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(QueryRow)
);

View File

@ -51,4 +51,9 @@ const mapDispatchToProps = {
toggleTable, toggleTable,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(TableContainer)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(TableContainer)
);

View File

@ -82,4 +82,9 @@ const mapDispatchToProps = {
resetExploreAction, resetExploreAction,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(Wrapper)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(Wrapper)
);

View File

@ -132,4 +132,9 @@ const mapDispatchToProps = {
addFolderPermission, addFolderPermission,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(FolderPermissions)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(FolderPermissions)
);

View File

@ -113,4 +113,9 @@ const mapDispatchToProps = {
deleteFolder, deleteFolder,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(FolderSettingsPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(FolderSettingsPage)
);

View File

@ -65,4 +65,9 @@ const mapDispatchToProps = {
updateOrganization, updateOrganization,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(OrgDetailsPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(OrgDetailsPage)
);

View File

@ -81,4 +81,9 @@ const mapDispatchToProps = {
setPluginsSearchQuery, setPluginsSearchQuery,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(PluginListPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(PluginListPage)
);

View File

@ -136,27 +136,29 @@ function pluginDirectiveLoader($compile, datasourceSrv, $rootScope, $q, $http, $
// Datasource ConfigCtrl // Datasource ConfigCtrl
case 'datasource-config-ctrl': { case 'datasource-config-ctrl': {
const dsMeta = scope.ctrl.datasourceMeta; const dsMeta = scope.ctrl.datasourceMeta;
return importPluginModule(dsMeta.module).then((dsModule): any => { return importPluginModule(dsMeta.module).then(
if (!dsModule.ConfigCtrl) { (dsModule): any => {
return { notFound: true }; if (!dsModule.ConfigCtrl) {
return { notFound: true };
}
scope.$watch(
'ctrl.current',
() => {
scope.onModelChanged(scope.ctrl.current);
},
true
);
return {
baseUrl: dsMeta.baseUrl,
name: 'ds-config-' + dsMeta.id,
bindings: { meta: '=', current: '=' },
attrs: { meta: 'ctrl.datasourceMeta', current: 'ctrl.current' },
Component: dsModule.ConfigCtrl,
};
} }
);
scope.$watch(
'ctrl.current',
() => {
scope.onModelChanged(scope.ctrl.current);
},
true
);
return {
baseUrl: dsMeta.baseUrl,
name: 'ds-config-' + dsMeta.id,
bindings: { meta: '=', current: '=' },
attrs: { meta: 'ctrl.datasourceMeta', current: 'ctrl.current' },
Component: dsModule.ConfigCtrl,
};
});
} }
// AppConfigCtrl // AppConfigCtrl
case 'app-config-ctrl': { case 'app-config-ctrl': {

View File

@ -116,26 +116,25 @@ export class TeamGroupSync extends PureComponent<Props, State> {
</div> </div>
</SlideDown> </SlideDown>
{groups.length === 0 && {groups.length === 0 && !isAdding && (
!isAdding && ( <div className="empty-list-cta">
<div className="empty-list-cta"> <div className="empty-list-cta__title">There are no external groups to sync with</div>
<div className="empty-list-cta__title">There are no external groups to sync with</div> <button onClick={this.onToggleAdding} className="empty-list-cta__button btn btn-xlarge btn-primary">
<button onClick={this.onToggleAdding} className="empty-list-cta__button btn btn-xlarge btn-primary"> <i className="gicon gicon-add-team" />
<i className="gicon gicon-add-team" /> Add Group
Add Group </button>
</button> <div className="empty-list-cta__pro-tip">
<div className="empty-list-cta__pro-tip"> <i className="fa fa-rocket" /> {headerTooltip}
<i className="fa fa-rocket" /> {headerTooltip} <a
<a className="text-link empty-list-cta__pro-tip-link"
className="text-link empty-list-cta__pro-tip-link" href="http://docs.grafana.org/auth/enhanced_ldap/"
href="http://docs.grafana.org/auth/enhanced_ldap/" target="_blank"
target="_blank" >
> Learn more
Learn more </a>
</a>
</div>
</div> </div>
)} </div>
)}
{groups.length > 0 && ( {groups.length > 0 && (
<div className="admin-list-table"> <div className="admin-list-table">
@ -167,4 +166,7 @@ const mapDispatchToProps = {
removeTeamGroup, removeTeamGroup,
}; };
export default connect(mapStateToProps, mapDispatchToProps)(TeamGroupSync); export default connect(
mapStateToProps,
mapDispatchToProps
)(TeamGroupSync);

View File

@ -161,4 +161,9 @@ const mapDispatchToProps = {
setSearchQuery, setSearchQuery,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(TeamList)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(TeamList)
);

View File

@ -62,7 +62,9 @@ export class TeamMembers extends PureComponent<Props, State> {
return ( return (
<td> <td>
{labels.map(label => <TagBadge key={label} label={label} removeIcon={false} count={0} onClick={() => {}} />)} {labels.map(label => (
<TagBadge key={label} label={label} removeIcon={false} count={0} onClick={() => {}} />
))}
</td> </td>
); );
} }
@ -156,4 +158,7 @@ const mapDispatchToProps = {
setSearchMemberQuery, setSearchMemberQuery,
}; };
export default connect(mapStateToProps, mapDispatchToProps)(TeamMembers); export default connect(
mapStateToProps,
mapDispatchToProps
)(TeamMembers);

View File

@ -108,4 +108,9 @@ const mapDispatchToProps = {
loadTeam, loadTeam,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(TeamPages)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(TeamPages)
);

View File

@ -98,4 +98,7 @@ const mapDispatchToProps = {
updateTeam, updateTeam,
}; };
export default connect(mapStateToProps, mapDispatchToProps)(TeamSettings); export default connect(
mapStateToProps,
mapDispatchToProps
)(TeamSettings);

View File

@ -54,15 +54,17 @@ export class VariableSrv {
onTimeRangeUpdated(timeRange: TimeRange) { onTimeRangeUpdated(timeRange: TimeRange) {
this.templateSrv.updateTimeRange(timeRange); this.templateSrv.updateTimeRange(timeRange);
const promises = this.variables.filter(variable => variable.refresh === 2).map(variable => { const promises = this.variables
const previousOptions = variable.options.slice(); .filter(variable => variable.refresh === 2)
.map(variable => {
const previousOptions = variable.options.slice();
return variable.updateOptions().then(() => { return variable.updateOptions().then(() => {
if (angular.toJson(previousOptions) !== angular.toJson(variable.options)) { if (angular.toJson(previousOptions) !== angular.toJson(variable.options)) {
this.dashboard.templateVariableValueUpdated(); this.dashboard.templateVariableValueUpdated();
} }
});
}); });
});
return this.$q.all(promises).then(() => { return this.$q.all(promises).then(() => {
this.dashboard.startRefresh(); this.dashboard.startRefresh();

View File

@ -52,6 +52,9 @@ const mapDispatchToProps = {
revokeInvite, revokeInvite,
}; };
export default connect(() => { export default connect(
return {}; () => {
}, mapDispatchToProps)(InviteeRow); return {};
},
mapDispatchToProps
)(InviteeRow);

View File

@ -92,4 +92,7 @@ const mapDispatchToProps = {
setUsersSearchQuery, setUsersSearchQuery,
}; };
export default connect(mapStateToProps, mapDispatchToProps)(UsersActionBar); export default connect(
mapStateToProps,
mapDispatchToProps
)(UsersActionBar);

View File

@ -138,4 +138,9 @@ const mapDispatchToProps = {
removeUser, removeUser,
}; };
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(UsersListPage)); export default hot(module)(
connect(
mapStateToProps,
mapDispatchToProps
)(UsersListPage)
);

View File

@ -4,7 +4,8 @@ export class AzureMonitorAnnotationsQueryCtrl {
annotation: any; annotation: any;
workspaces: any[]; workspaces: any[];
defaultQuery = '<your table>\n| where $__timeFilter() \n| project TimeGenerated, Text=YourTitleColumn, Tags="tag1,tag2"'; defaultQuery =
'<your table>\n| where $__timeFilter() \n| project TimeGenerated, Text=YourTitleColumn, Tags="tag1,tag2"';
/** @ngInject */ /** @ngInject */
constructor() { constructor() {

View File

@ -311,8 +311,8 @@ class QueryField extends React.Component<any, any> {
let selectedIndex = Math.max(this.state.typeaheadIndex, 0); let selectedIndex = Math.max(this.state.typeaheadIndex, 0);
const flattenedSuggestions = flattenSuggestions(suggestions); const flattenedSuggestions = flattenSuggestions(suggestions);
selectedIndex = selectedIndex % flattenedSuggestions.length || 0; selectedIndex = selectedIndex % flattenedSuggestions.length || 0;
const selectedKeys = (flattenedSuggestions.length > 0 ? [flattenedSuggestions[selectedIndex]] : []).map( const selectedKeys = (flattenedSuggestions.length > 0 ? [flattenedSuggestions[selectedIndex]] : []).map(i =>
i => (typeof i === 'object' ? i.text : i) typeof i === 'object' ? i.text : i
); );
// Create typeahead in DOM root so we can later position it absolutely // Create typeahead in DOM root so we can later position it absolutely

View File

@ -78,46 +78,48 @@ export default class InfluxDatasource {
// replace templated variables // replace templated variables
allQueries = this.templateSrv.replace(allQueries, scopedVars); allQueries = this.templateSrv.replace(allQueries, scopedVars);
return this._seriesQuery(allQueries, options).then((data): any => { return this._seriesQuery(allQueries, options).then(
if (!data || !data.results) { (data): any => {
return []; if (!data || !data.results) {
} return [];
const seriesList = [];
for (i = 0; i < data.results.length; i++) {
const result = data.results[i];
if (!result || !result.series) {
continue;
} }
const target = queryTargets[i]; const seriesList = [];
let alias = target.alias; for (i = 0; i < data.results.length; i++) {
if (alias) { const result = data.results[i];
alias = this.templateSrv.replace(target.alias, options.scopedVars); if (!result || !result.series) {
} continue;
const influxSeries = new InfluxSeries({
series: data.results[i].series,
alias: alias,
});
switch (target.resultFormat) {
case 'table': {
seriesList.push(influxSeries.getTable());
break;
} }
default: {
const timeSeries = influxSeries.getTimeSeries(); const target = queryTargets[i];
for (y = 0; y < timeSeries.length; y++) { let alias = target.alias;
seriesList.push(timeSeries[y]); if (alias) {
alias = this.templateSrv.replace(target.alias, options.scopedVars);
}
const influxSeries = new InfluxSeries({
series: data.results[i].series,
alias: alias,
});
switch (target.resultFormat) {
case 'table': {
seriesList.push(influxSeries.getTable());
break;
}
default: {
const timeSeries = influxSeries.getTimeSeries();
for (y = 0; y < timeSeries.length; y++) {
seriesList.push(timeSeries[y]);
}
break;
} }
break;
} }
} }
}
return { data: seriesList }; return { data: seriesList };
}); }
);
} }
annotationQuery(options) { annotationQuery(options) {

View File

@ -38,15 +38,17 @@ export function groupMetricsByPrefix(metrics: string[], delimiter = '_'): Cascad
const metricsOptions = _.chain(metrics) const metricsOptions = _.chain(metrics)
.filter(metric => !ruleRegex.test(metric)) .filter(metric => !ruleRegex.test(metric))
.groupBy(metric => metric.split(delimiter)[0]) .groupBy(metric => metric.split(delimiter)[0])
.map((metricsForPrefix: string[], prefix: string): CascaderOption => { .map(
const prefixIsMetric = metricsForPrefix.length === 1 && metricsForPrefix[0] === prefix; (metricsForPrefix: string[], prefix: string): CascaderOption => {
const children = prefixIsMetric ? [] : metricsForPrefix.sort().map(m => ({ label: m, value: m })); const prefixIsMetric = metricsForPrefix.length === 1 && metricsForPrefix[0] === prefix;
return { const children = prefixIsMetric ? [] : metricsForPrefix.sort().map(m => ({ label: m, value: m }));
children, return {
label: prefix, children,
value: prefix, label: prefix,
}; value: prefix,
}) };
}
)
.sortBy('label') .sortBy('label')
.value(); .value();

View File

@ -487,13 +487,15 @@ export function alignRange(start, end, step) {
export function extractRuleMappingFromGroups(groups: any[]) { export function extractRuleMappingFromGroups(groups: any[]) {
return groups.reduce( return groups.reduce(
(mapping, group) => (mapping, group) =>
group.rules.filter(rule => rule.type === 'recording').reduce( group.rules
(acc, rule) => ({ .filter(rule => rule.type === 'recording')
...acc, .reduce(
[rule.name]: rule.query, (acc, rule) => ({
}), ...acc,
mapping [rule.name]: rule.query,
), }),
mapping
),
{} {}
); );
} }

View File

@ -57,18 +57,18 @@ export class Help extends React.Component<Props, State> {
<div className="gf-form-label gf-form-label--grow" /> <div className="gf-form-label gf-form-label--grow" />
</div> </div>
</div> </div>
{rawQuery && {rawQuery && displaRawQuery && (
displaRawQuery && ( <div className="gf-form">
<div className="gf-form"> <pre className="gf-form-pre">{rawQuery}</pre>
<pre className="gf-form-pre">{rawQuery}</pre> </div>
</div> )}
)}
{displayHelp && ( {displayHelp && (
<div className="gf-form grafana-info-box" style={{ padding: 0 }}> <div className="gf-form grafana-info-box" style={{ padding: 0 }}>
<pre className="gf-form-pre alert alert-info" style={{ marginRight: 0 }}> <pre className="gf-form-pre alert alert-info" style={{ marginRight: 0 }}>
<h5>Alias Patterns</h5>Format the legend keys any way you want by using alias patterns. Format the legend <h5>Alias Patterns</h5>Format the legend keys any way you want by using alias patterns. Format the legend
keys any way you want by using alias patterns.<br /> <br /> keys any way you want by using alias patterns.
<br /> <br />
Example: Example:
<code>{`${'{{metricDescriptor.name}} - {{metricDescriptor.label.instance_name}}'}`}</code> <code>{`${'{{metricDescriptor.name}} - {{metricDescriptor.label.instance_name}}'}`}</code>
<br /> <br />

View File

@ -92,12 +92,14 @@ export class Metrics extends React.Component<Props, State> {
if (!selectedMetricDescriptor) { if (!selectedMetricDescriptor) {
return []; return [];
} }
const metricsByService = metricDescriptors.filter(m => m.service === selectedMetricDescriptor.service).map(m => ({ const metricsByService = metricDescriptors
service: m.service, .filter(m => m.service === selectedMetricDescriptor.service)
value: m.type, .map(m => ({
label: m.displayName, service: m.service,
description: m.description, value: m.type,
})); label: m.displayName,
description: m.description,
}));
return metricsByService; return metricsByService;
} }
@ -105,12 +107,14 @@ export class Metrics extends React.Component<Props, State> {
const { metricDescriptors } = this.state; const { metricDescriptors } = this.state;
const { templateSrv, metricType } = this.props; const { templateSrv, metricType } = this.props;
const metrics = metricDescriptors.filter(m => m.service === templateSrv.replace(service)).map(m => ({ const metrics = metricDescriptors
service: m.service, .filter(m => m.service === templateSrv.replace(service))
value: m.type, .map(m => ({
label: m.displayName, service: m.service,
description: m.description, value: m.type,
})); label: m.displayName,
description: m.description,
}));
this.setState({ service, metrics }); this.setState({ service, metrics });

View File

@ -58,7 +58,7 @@ export class StackdriverVariableQueryEditor extends PureComponent<VariableQueryP
metricTypes, metricTypes,
selectedMetricType, selectedMetricType,
metricDescriptors, metricDescriptors,
...await this.getLabels(selectedMetricType), ...(await this.getLabels(selectedMetricType)),
}; };
this.setState(state); this.setState(state);
} }
@ -66,7 +66,7 @@ export class StackdriverVariableQueryEditor extends PureComponent<VariableQueryP
async onQueryTypeChange(event) { async onQueryTypeChange(event) {
const state: any = { const state: any = {
selectedQueryType: event.target.value, selectedQueryType: event.target.value,
...await this.getLabels(this.state.selectedMetricType, event.target.value), ...(await this.getLabels(this.state.selectedMetricType, event.target.value)),
}; };
this.setState(state); this.setState(state);
} }
@ -82,13 +82,13 @@ export class StackdriverVariableQueryEditor extends PureComponent<VariableQueryP
selectedService: event.target.value, selectedService: event.target.value,
metricTypes, metricTypes,
selectedMetricType, selectedMetricType,
...await this.getLabels(selectedMetricType), ...(await this.getLabels(selectedMetricType)),
}; };
this.setState(state); this.setState(state);
} }
async onMetricTypeChange(event) { async onMetricTypeChange(event) {
const state: any = { selectedMetricType: event.target.value, ...await this.getLabels(event.target.value) }; const state: any = { selectedMetricType: event.target.value, ...(await this.getLabels(event.target.value)) };
this.setState(state); this.setState(state);
} }

View File

@ -532,7 +532,7 @@ class GraphElement {
// Expand ticks for pretty view // Expand ticks for pretty view
min = Math.floor(min / tickStep) * tickStep; min = Math.floor(min / tickStep) * tickStep;
// 1.01 is 101% - ensure we have enough space for last bar // 1.01 is 101% - ensure we have enough space for last bar
max = Math.ceil(max * 1.01 / tickStep) * tickStep; max = Math.ceil((max * 1.01) / tickStep) * tickStep;
ticks = []; ticks = [];
for (let i = min; i <= max; i += tickStep) { for (let i = min; i <= max; i += tickStep) {

View File

@ -173,8 +173,7 @@ function drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minVal
const posY = getSvgElemHeight(legendElem) + LEGEND_VALUE_MARGIN; const posY = getSvgElemHeight(legendElem) + LEGEND_VALUE_MARGIN;
const posX = getSvgElemX(colorRect); const posX = getSvgElemX(colorRect);
d3 d3.select(legendElem.get(0))
.select(legendElem.get(0))
.append('g') .append('g')
.attr('class', 'axis') .attr('class', 'axis')
.attr('transform', 'translate(' + posX + ',' + posY + ')') .attr('transform', 'translate(' + posX + ',' + posY + ')')

View File

@ -205,10 +205,10 @@ export class HeatmapTooltip {
let barWidth; let barWidth;
if (this.panel.yAxis.logBase === 1) { if (this.panel.yAxis.logBase === 1) {
barWidth = Math.floor(HISTOGRAM_WIDTH / (max - min) * yBucketSize * 0.9); barWidth = Math.floor((HISTOGRAM_WIDTH / (max - min)) * yBucketSize * 0.9);
} else { } else {
const barNumberFactor = yBucketSize ? yBucketSize : 1; const barNumberFactor = yBucketSize ? yBucketSize : 1;
barWidth = Math.floor(HISTOGRAM_WIDTH / ticks / barNumberFactor * 0.9); barWidth = Math.floor((HISTOGRAM_WIDTH / ticks / barNumberFactor) * 0.9);
} }
barWidth = Math.max(barWidth, 1); barWidth = Math.max(barWidth, 1);

View File

@ -570,8 +570,7 @@ export class HeatmapRenderer {
} }
resetCardHighLight(event) { resetCardHighLight(event) {
d3 d3.select(event.target)
.select(event.target)
.style('fill', this.tooltip.originalFillColor) .style('fill', this.tooltip.originalFillColor)
.style('stroke', this.tooltip.originalFillColor) .style('stroke', this.tooltip.originalFillColor)
.style('stroke-width', 0); .style('stroke-width', 0);

View File

@ -14,12 +14,31 @@ $spacer: 1rem !default;
$spacer-x: $spacer !default; $spacer-x: $spacer !default;
$spacer-y: $spacer !default; $spacer-y: $spacer !default;
$spacers: ( $spacers: (
0: (x: 0, y: 0), 0: (
1: (x: $spacer-x, y: $spacer-y), x: 0,
2: (x: ($spacer-x * 1.5), y: ($spacer-y * 1.5)), y: 0,
3: (x: ($spacer-x * 3), y: ($spacer-y * 3)) ),
) 1: (
!default; x: $spacer-x,
y: $spacer-y,
),
2: (
x: (
$spacer-x * 1.5,
),
y: (
$spacer-y * 1.5,
),
),
3: (
x: (
$spacer-x * 3,
),
y: (
$spacer-y * 3,
),
),
) !default;
$border-width: 1px !default; $border-width: 1px !default;
// Grid breakpoints // Grid breakpoints
@ -27,13 +46,24 @@ $border-width: 1px !default;
// Define the minimum and maximum dimensions at which your layout will change, // Define the minimum and maximum dimensions at which your layout will change,
// adapting to different screen sizes, for use in media queries. // adapting to different screen sizes, for use in media queries.
$grid-breakpoints: (xs: 0, sm: 544px, md: 768px, lg: 992px, xl: 1200px) !default; $grid-breakpoints: (
xs: 0,
sm: 544px,
md: 768px,
lg: 992px,
xl: 1200px,
) !default;
// Grid containers // Grid containers
// //
// Define the maximum width of `.container` for different screen sizes. // Define the maximum width of `.container` for different screen sizes.
$container-max-widths: (sm: 576px, md: 720px, lg: 940px, xl: 1080px) !default; $container-max-widths: (
sm: 576px,
md: 720px,
lg: 940px,
xl: 1080px,
) !default;
// Grid columns // Grid columns
// //
@ -100,7 +130,7 @@ $line-height-sm: 1.5 !default;
$border-radius: 3px !default; $border-radius: 3px !default;
$border-radius-lg: 5px !default; $border-radius-lg: 5px !default;
$border-radius-sm: 2px!default; $border-radius-sm: 2px !default;
// Page // Page
@ -143,12 +173,9 @@ $gf-form-input-height: 35px;
$cursor-disabled: not-allowed !default; $cursor-disabled: not-allowed !default;
// Form validation icons // Form validation icons
$form-icon-success: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") $form-icon-success: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") !default;
!default; $form-icon-warning: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E") !default;
$form-icon-warning: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E") $form-icon-danger: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E") !default;
!default;
$form-icon-danger: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")
!default;
// Z-index master list // Z-index master list
// ------------------------- // -------------------------
@ -191,19 +218,38 @@ $panel-margin: 10px;
$dashboard-padding: $panel-margin * 2; $dashboard-padding: $panel-margin * 2;
$panel-horizontal-padding: 10; $panel-horizontal-padding: 10;
$panel-vertical-padding: 5; $panel-vertical-padding: 5;
$panel-padding: 0px $panel-horizontal-padding+0px $panel-vertical-padding+0px $panel-horizontal-padding+0px; $panel-padding: 0px $panel-horizontal-padding + 0px $panel-vertical-padding + 0px $panel-horizontal-padding + 0px;
// tabs // tabs
$tabs-padding: 10px 15px 9px; $tabs-padding: 10px 15px 9px;
$external-services: ( $external-services: (
github: (bgColor: #464646, borderColor: #393939, icon: ''), github: (
gitlab: (bgColor: #fc6d26, borderColor: #e24329, icon: ''), bgColor: #464646,
google: (bgColor: #e84d3c, borderColor: #b83e31, icon: ''), borderColor: #393939,
grafanacom: (bgColor: #262628, borderColor: #393939, icon: ''), icon: '',
oauth: (bgColor: #262628, borderColor: #393939, icon: '') ),
) gitlab: (
!default; bgColor: #fc6d26,
borderColor: #e24329,
icon: '',
),
google: (
bgColor: #e84d3c,
borderColor: #b83e31,
icon: '',
),
grafanacom: (
bgColor: #262628,
borderColor: #393939,
icon: '',
),
oauth: (
bgColor: #262628,
borderColor: #393939,
icon: '',
),
) !default;
:export { :export {
panelhorizontalpadding: $panel-horizontal-padding; panelhorizontalpadding: $panel-horizontal-padding;

View File

@ -31,7 +31,7 @@ input,
button, button,
select, select,
textarea { textarea {
@include font-shorthand($font-size-base,normal,$line-height-base); // Set size, weight, line-height here @include font-shorthand($font-size-base, normal, $line-height-base); // Set size, weight, line-height here
} }
input, input,
button, button,

View File

@ -357,14 +357,14 @@ a.external-link {
ul, ul,
ol { ol {
padding-left: $spacer*1.5; padding-left: $spacer * 1.5;
margin-bottom: $spacer; margin-bottom: $spacer;
} }
table { table {
td, td,
th { th {
padding: $spacer*0.5 $spacer; padding: $spacer * 0.5 $spacer;
} }
th { th {
font-weight: $font-weight-semi-bold; font-weight: $font-weight-semi-bold;

View File

@ -35,7 +35,7 @@
} }
.card-section { .card-section {
margin-bottom: $spacer*2; margin-bottom: $spacer * 2;
} }
.card-list { .card-list {

View File

@ -53,7 +53,7 @@
.dashboard-settings__header { .dashboard-settings__header {
font-size: $font-size-h3; font-size: $font-size-h3;
margin-bottom: $spacer*2; margin-bottom: $spacer * 2;
} }
.dashboard-settings__subheader { .dashboard-settings__subheader {
@ -89,7 +89,7 @@
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
flex-grow: 1; flex-grow: 1;
margin: $spacer*3 $spacer*2 0 0; margin: $spacer * 3 $spacer * 2 0 0;
button { button {
margin-bottom: 10px; margin-bottom: 10px;

View File

@ -1,7 +1,7 @@
.empty-list-cta { .empty-list-cta {
background-color: $empty-list-cta-bg; background-color: $empty-list-cta-bg;
text-align: center; text-align: center;
padding: $spacer*2; padding: $spacer * 2;
border-radius: $border-radius; border-radius: $border-radius;
.grafana-info-box { .grafana-info-box {
@ -11,12 +11,12 @@
} }
.empty-list-cta__title { .empty-list-cta__title {
padding-bottom: $spacer*3; padding-bottom: $spacer * 3;
font-style: italic; font-style: italic;
} }
.empty-list-cta__button { .empty-list-cta__button {
margin-bottom: $spacer*3; margin-bottom: $spacer * 3;
} }
.empty-list-cta__pro-tip-link { .empty-list-cta__pro-tip-link {

View File

@ -226,7 +226,7 @@ $input-border: 1px solid $input-border-color;
} }
&--dropdown { &--dropdown {
padding-right: $input-padding-x*2; padding-right: $input-padding-x * 2;
&::after { &::after {
position: absolute; position: absolute;
@ -276,7 +276,7 @@ $input-border: 1px solid $input-border-color;
& + .gf-form-input { & + .gf-form-input {
position: relative; position: relative;
z-index: 2; z-index: 2;
padding-left: $input-padding-x*3; padding-left: $input-padding-x * 3;
background-color: transparent; background-color: transparent;
option { option {
@ -293,7 +293,7 @@ $input-border: 1px solid $input-border-color;
select.gf-form-input { select.gf-form-input {
text-indent: 0.01px; text-indent: 0.01px;
text-overflow: ''; text-overflow: '';
padding-right: $input-padding-x*3; padding-right: $input-padding-x * 3;
appearance: none; appearance: none;
&:-moz-focusring { &:-moz-focusring {
@ -321,7 +321,7 @@ $input-border: 1px solid $input-border-color;
&--has-help-icon { &--has-help-icon {
&::after { &::after {
right: $input-padding-x*3; right: $input-padding-x * 3;
} }
} }
} }

View File

@ -24,7 +24,7 @@
z-index: $zindex-modal; z-index: $zindex-modal;
width: 100%; width: 100%;
background: $page-bg; background: $page-bg;
@include box-shadow(0 3px 7px rgba(0,0,0,0.3)); @include box-shadow(0 3px 7px rgba(0, 0, 0, 0.3));
@include background-clip(padding-box); @include background-clip(padding-box);
outline: none; outline: none;
@ -47,7 +47,7 @@
font-size: $font-size-h3; font-size: $font-size-h3;
float: left; float: left;
padding-top: $spacer * 0.75; padding-top: $spacer * 0.75;
margin: 0 $spacer*3 0 $spacer*1.5; margin: 0 $spacer * 3 0 $spacer * 1.5;
.gicon { .gicon {
position: relative; position: relative;
@ -66,7 +66,7 @@
} }
.modal-content { .modal-content {
padding: $spacer*2; padding: $spacer * 2;
&--has-scroll { &--has-scroll {
max-height: calc(100vh - 400px); max-height: calc(100vh - 400px);
@ -105,7 +105,7 @@
.confirm-modal-text { .confirm-modal-text {
font-size: $font-size-h4; font-size: $font-size-h4;
color: $link-color; color: $link-color;
margin-bottom: $spacer*2; margin-bottom: $spacer * 2;
padding-top: $spacer; padding-top: $spacer;
} }

View File

@ -21,7 +21,7 @@
} }
.panel-editor-container__editor { .panel-editor-container__editor {
margin-top: $panel-margin*2; margin-top: $panel-margin * 2;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
flex: 1 1 0; flex: 1 1 0;

View File

@ -57,7 +57,7 @@ $path-position: $marker-size-half - ($path-height / 2);
z-index: 1; z-index: 1;
top: $path-position; top: $path-position;
bottom: $path-position; bottom: $path-position;
right: - $marker-size-half; right: -$marker-size-half;
width: 100%; width: 100%;
height: $path-height; height: $path-height;
border-top: 2px solid $progress-color-grey-light; border-top: 2px solid $progress-color-grey-light;

View File

@ -6,7 +6,7 @@ $column-horizontal-spacing: 10px;
padding: $panel-padding; padding: $panel-padding;
padding-top: 10px; padding-top: 10px;
border-radius: $border-radius; border-radius: $border-radius;
margin: 2*$panel-margin 0 $panel-margin; margin: 2 * $panel-margin 0 $panel-margin;
border: $panel-border; border: $panel-border;
flex-direction: column; flex-direction: column;
} }
@ -18,7 +18,7 @@ $column-horizontal-spacing: 10px;
flex-wrap: wrap; flex-wrap: wrap;
> * { > * {
margin-right: $spacer*2; margin-right: $spacer * 2;
} }
} }

View File

@ -1 +0,0 @@

View File

@ -77,7 +77,7 @@
.search-filter-box { .search-filter-box {
background: $search-filter-box-bg; background: $search-filter-box-bg;
border-radius: 2px; border-radius: 2px;
padding: $spacer*1.5; padding: $spacer * 1.5;
min-width: 340px; min-width: 340px;
margin-bottom: $spacer * 1.5; margin-bottom: $spacer * 1.5;
} }
@ -259,7 +259,7 @@
.search-button-row { .search-button-row {
text-align: center; text-align: center;
padding: $spacer*2 $spacer; padding: $spacer * 2 $spacer;
background: $panel-bg; background: $panel-bg;
} }

View File

@ -20,7 +20,7 @@
.tabbed-view-title { .tabbed-view-title {
float: left; float: left;
padding-top: 0.5rem; padding-top: 0.5rem;
margin: 0 $spacer*3 0 0; margin: 0 $spacer * 3 0 0;
} }
.tabbed-view-panel-title { .tabbed-view-panel-title {
@ -45,7 +45,7 @@
} }
.tabbed-view-body { .tabbed-view-body {
padding: $spacer*2 $spacer $spacer $spacer; padding: $spacer * 2 $spacer $spacer $spacer;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex: 1; flex: 1;

View File

@ -9,7 +9,7 @@
} }
.edit-sidemenu-aside { .edit-sidemenu-aside {
margin-right: $spacer*2; margin-right: $spacer * 2;
} }
.edit-sidemenu { .edit-sidemenu {

View File

@ -39,8 +39,8 @@
width: 100%; width: 100%;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
padding-left: $spacer*2; padding-left: $spacer * 2;
padding-right: $spacer*2; padding-right: $spacer * 2;
max-width: 980px; max-width: 980px;
@include clearfix(); @include clearfix();
} }
@ -93,7 +93,7 @@
} }
.page-body { .page-body {
padding-top: $spacer*2; padding-top: $spacer * 2;
} }
.page-heading { .page-heading {
@ -164,5 +164,5 @@
} }
.page-sidebar-section { .page-sidebar-section {
margin-bottom: $spacer*2; margin-bottom: $spacer * 2;
} }

View File

@ -1,6 +1,6 @@
// Button backgrounds // Button backgrounds
// ------------------ // ------------------
@mixin buttonBackground($startColor, $endColor, $text-color: #fff, $textShadow: 0px 1px 0 rgba(0,0,0,0.1)) { @mixin buttonBackground($startColor, $endColor, $text-color: #fff, $textShadow: 0px 1px 0 rgba(0, 0, 0, 0.1)) {
// gradientBar will set the background to a pleasing blend of these, to support IE<=9 // gradientBar will set the background to a pleasing blend of these, to support IE<=9
@include gradientBar($startColor, $endColor, $text-color, $textShadow); @include gradientBar($startColor, $endColor, $text-color, $textShadow);

View File

@ -41,7 +41,7 @@
&:before { &:before {
top: 100%; top: 100%;
left: 50%; left: 50%;
margin-left: - $popover-arrow-size; margin-left: -$popover-arrow-size;
border-top-color: $border-color; border-top-color: $border-color;
} }
} }
@ -52,7 +52,7 @@
&:before { &:before {
bottom: 100%; bottom: 100%;
left: 50%; left: 50%;
margin-left: - $popover-arrow-size; margin-left: -$popover-arrow-size;
border-bottom-color: $border-color; border-bottom-color: $border-color;
} }
} }
@ -63,7 +63,7 @@
&:before { &:before {
left: 100%; left: 100%;
top: 50%; top: 50%;
margin-top: - $popover-arrow-size; margin-top: -$popover-arrow-size;
border-left-color: $border-color; border-left-color: $border-color;
} }
} }
@ -74,14 +74,14 @@
&:before { &:before {
right: 100%; right: 100%;
top: 50%; top: 50%;
margin-top: - $popover-arrow-size; margin-top: -$popover-arrow-size;
border-right-color: $border-color; border-right-color: $border-color;
} }
} }
// Target middle/center, element corner // Target middle/center, element corner
&.drop-element-attached-left.drop-target-attached-center .drop-content { &.drop-element-attached-left.drop-target-attached-center .drop-content {
left: - $popover-arrow-size * 2; left: -$popover-arrow-size * 2;
} }
&.drop-element-attached-right.drop-target-attached-center .drop-content { &.drop-element-attached-right.drop-target-attached-center .drop-content {

View File

@ -278,7 +278,7 @@
} }
// Gradient Bar Colors for buttons and alerts // Gradient Bar Colors for buttons and alerts
@mixin gradientBar($primaryColor, $secondaryColor, $text-color: #fff, $textShadow: 0 -1px 0 rgba(0,0,0,0.25)) { @mixin gradientBar($primaryColor, $secondaryColor, $text-color: #fff, $textShadow: 0 -1px 0 rgba(0, 0, 0, 0.25)) {
color: $text-color; color: $text-color;
text-shadow: $textShadow; text-shadow: $textShadow;
@include gradient-vertical($primaryColor, $secondaryColor); @include gradient-vertical($primaryColor, $secondaryColor);

View File

@ -452,7 +452,7 @@
// TODO Experimental // TODO Experimental
.cheat-sheet-item { .cheat-sheet-item {
margin: 2*$panel-margin 0; margin: 2 * $panel-margin 0;
width: 50%; width: 50%;
} }

View File

@ -13500,10 +13500,10 @@ preserve@^0.2.0:
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
prettier@1.9.2: prettier@1.16.4:
version "1.9.2" version "1.16.4"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.9.2.tgz#96bc2132f7a32338e6078aeb29727178c6335827" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717"
integrity sha512-piXx9N2WT8hWb7PBbX1glAuJVIkEyUV9F5fMXFINpZ0x3otVOFKKeGmeuiclFJlP/UrgTckyV606VjH2rNK4bw== integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==
prettier@^1.12.1: prettier@^1.12.1:
version "1.16.1" version "1.16.1"