Merge pull request #13534 from grafana/misc-react-migration-fixes

ux: misc react migration fixes and info box style improvement
This commit is contained in:
Torkel Ödegaard 2018-10-05 09:55:39 +02:00 committed by GitHub
commit 61d64c41fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 41 additions and 24 deletions

View File

@ -6,6 +6,7 @@ const setup = (propOverrides?: object) => {
const props: Props = { const props: Props = {
searchQuery: '', searchQuery: '',
setSearchQuery: jest.fn(), setSearchQuery: jest.fn(),
target: '_blank',
linkButton: { href: 'some/url', title: 'test' }, linkButton: { href: 'some/url', title: 'test' },
}; };

View File

@ -7,11 +7,17 @@ export interface Props {
onSetLayoutMode?: (mode: LayoutMode) => {}; onSetLayoutMode?: (mode: LayoutMode) => {};
setSearchQuery: (value: string) => {}; setSearchQuery: (value: string) => {};
linkButton: { href: string; title: string }; linkButton: { href: string; title: string };
target?: string;
} }
export default class OrgActionBar extends PureComponent<Props> { export default class OrgActionBar extends PureComponent<Props> {
render() { render() {
const { searchQuery, layoutMode, onSetLayoutMode, linkButton, setSearchQuery } = this.props; const { searchQuery, layoutMode, onSetLayoutMode, linkButton, setSearchQuery, target } = this.props;
const linkProps = { href: linkButton.href, target: undefined };
if (target) {
linkProps.target = target;
}
return ( return (
<div className="page-action-bar"> <div className="page-action-bar">
@ -29,7 +35,7 @@ export default class OrgActionBar extends PureComponent<Props> {
<LayoutSelector mode={layoutMode} onLayoutModeChanged={(mode: LayoutMode) => onSetLayoutMode(mode)} /> <LayoutSelector mode={layoutMode} onLayoutModeChanged={(mode: LayoutMode) => onSetLayoutMode(mode)} />
</div> </div>
<div className="page-action-bar__spacer" /> <div className="page-action-bar__spacer" />
<a className="btn btn-success" href={linkButton.href} target="_blank"> <a className="btn btn-success" {...linkProps}>
{linkButton.title} {linkButton.title}
</a> </a>
</div> </div>

View File

@ -71,8 +71,7 @@ export class UsersActionBar extends PureComponent<Props> {
)} )}
{externalUserMngLinkUrl && ( {externalUserMngLinkUrl && (
<a className="btn btn-success" href={externalUserMngLinkUrl} target="_blank"> <a className="btn btn-success" href={externalUserMngLinkUrl} target="_blank">
<i className="fa fa-external-link-square" /> <i className="fa fa-external-link-square" /> {externalUserMngLinkName}
{externalUserMngLinkName}
</a> </a>
)} )}
</div> </div>

View File

@ -1,6 +1,7 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { hot } from 'react-hot-loader'; import { hot } from 'react-hot-loader';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import Remarkable from 'remarkable';
import PageHeader from 'app/core/components/PageHeader/PageHeader'; import PageHeader from 'app/core/components/PageHeader/PageHeader';
import UsersActionBar from './UsersActionBar'; import UsersActionBar from './UsersActionBar';
import UsersTable from 'app/features/users/UsersTable'; import UsersTable from 'app/features/users/UsersTable';
@ -30,9 +31,20 @@ export interface State {
} }
export class UsersListPage extends PureComponent<Props, State> { export class UsersListPage extends PureComponent<Props, State> {
state = { externalUserMngInfoHtml: string;
showInvites: false,
}; constructor(props) {
super(props);
if (this.props.externalUserMngInfo) {
const markdownRenderer = new Remarkable();
this.externalUserMngInfoHtml = markdownRenderer.render(this.props.externalUserMngInfo);
}
this.state = {
showInvites: false,
};
}
componentDidMount() { componentDidMount() {
this.fetchUsers(); this.fetchUsers();
@ -76,17 +88,16 @@ export class UsersListPage extends PureComponent<Props, State> {
}; };
render() { render() {
const { externalUserMngInfo, invitees, navModel, users } = this.props; const { invitees, navModel, users } = this.props;
const externalUserMngInfoHtml = this.externalUserMngInfoHtml;
return ( return (
<div> <div>
<PageHeader model={navModel} /> <PageHeader model={navModel} />
<div className="page-container page-body"> <div className="page-container page-body">
<UsersActionBar onShowInvites={this.onShowInvites} showInvites={this.state.showInvites} /> <UsersActionBar onShowInvites={this.onShowInvites} showInvites={this.state.showInvites} />
{externalUserMngInfo && ( {externalUserMngInfoHtml && (
<div className="grafana-info-box"> <div className="grafana-info-box" dangerouslySetInnerHTML={{ __html: externalUserMngInfoHtml }} />
<span>{externalUserMngInfo}</span>
</div>
)} )}
{this.state.showInvites ? ( {this.state.showInvites ? (
<InviteesTable invitees={invitees} onRevokeInvite={code => this.onRevokeInvite(code)} /> <InviteesTable invitees={invitees} onRevokeInvite={code => this.onRevokeInvite(code)} />

View File

@ -112,6 +112,7 @@ exports[`Render should show external user management button 1`] = `
<i <i
className="fa fa-external-link-square" className="fa fa-external-link-square"
/> />
</a> </a>
</div> </div>
</div> </div>

View File

@ -304,8 +304,7 @@ $graph-tooltip-bg: $dark-1;
$checkboxImageUrl: '../img/checkbox.png'; $checkboxImageUrl: '../img/checkbox.png';
// info box // info box
$info-box-background: linear-gradient(100deg, $blue-dark, darken($blue-dark, 5%)); $info-box-border-color: darken($blue, 12%);
$info-box-color: $gray-4;
// footer // footer
$footer-link-color: $gray-2; $footer-link-color: $gray-2;

View File

@ -309,8 +309,7 @@ $graph-tooltip-bg: $gray-5;
$checkboxImageUrl: '../img/checkbox_white.png'; $checkboxImageUrl: '../img/checkbox_white.png';
// info box // info box
$info-box-background: linear-gradient(100deg, $blue, darken($blue, 5%)); $info-box-border-color: lighten($blue, 20%);
$info-box-color: $gray-7;
// footer // footer
$footer-link-color: $gray-3; $footer-link-color: $gray-3;

View File

@ -1,16 +1,13 @@
.grafana-info-box { .grafana-info-box {
position: relative; position: relative;
background: $info-box-background; padding: 1.5rem;
box-shadow: $card-shadow; background-color: $empty-list-cta-bg;
padding: 1rem; margin-bottom: 2rem;
border-radius: 4px; border-top: 3px solid $info-box-border-color;
margin-bottom: $spacer; margin-bottom: $spacer;
margin-right: $gf-form-margin; margin-right: $gf-form-margin;
box-shadow: $card-shadow;
flex-grow: 1; flex-grow: 1;
color: $info-box-color;
h5 {
color: $info-box-color;
}
h5 { h5 {
margin-bottom: $spacer; margin-bottom: $spacer;
@ -28,6 +25,10 @@
border-radius: 4px; border-radius: 4px;
} }
p:last-child {
margin-bottom: 0;
}
a { a {
@extend .external-link; @extend .external-link;
} }