Polish Admin UI

- Mostly using new form styles instead of the previous one-off styles
pull/1544/head
Alex P 2017-05-23 14:18:08 -07:00
parent 4cd0a02492
commit 3c90d8d2a3
14 changed files with 100 additions and 60 deletions

View File

@ -96,7 +96,7 @@ const AdminTabs = ({
<TabList customClass="col-md-2 admin-tabs"> <TabList customClass="col-md-2 admin-tabs">
{tabs.map((t, i) => <Tab key={tabs[i].type}>{tabs[i].type}</Tab>)} {tabs.map((t, i) => <Tab key={tabs[i].type}>{tabs[i].type}</Tab>)}
</TabList> </TabList>
<TabPanels customClass="col-md-10"> <TabPanels customClass="col-md-10 admin-tabs--content">
{tabs.map((t, i) => ( {tabs.map((t, i) => (
<TabPanel key={tabs[i].type}>{t.component}</TabPanel> <TabPanel key={tabs[i].type}>{t.component}</TabPanel>
))} ))}

View File

@ -48,13 +48,13 @@ class ChangePassRow extends Component {
} }
render() { render() {
const {user} = this.props const {user, buttonSize} = this.props
if (this.state.showForm) { if (this.state.showForm) {
return ( return (
<div className="admin-change-pw"> <div className="admin-change-pw">
<input <input
className="form-control" className="form-control input-xs"
name="password" name="password"
type="password" type="password"
value={user.password || ''} value={user.password || ''}
@ -67,6 +67,7 @@ class ChangePassRow extends Component {
onConfirm={this.handleSubmit} onConfirm={this.handleSubmit}
item={user} item={user}
onCancel={this.handleCancel} onCancel={this.handleCancel}
buttonSize={buttonSize}
/> />
</div> </div>
) )
@ -83,12 +84,13 @@ class ChangePassRow extends Component {
} }
} }
const {shape, func} = PropTypes const {func, shape, string} = PropTypes
ChangePassRow.propTypes = { ChangePassRow.propTypes = {
user: shape().isRequired, user: shape().isRequired,
onApply: func.isRequired, onApply: func.isRequired,
onEdit: func.isRequired, onEdit: func.isRequired,
buttonSize: string,
} }
export default OnClickOutside(ChangePassRow) export default OnClickOutside(ChangePassRow)

View File

@ -25,7 +25,7 @@ const DatabaseManager = ({
onDeleteRetentionPolicy, onDeleteRetentionPolicy,
}) => { }) => {
return ( return (
<div className="panel panel-info"> <div className="panel panel-default">
<div className="panel-heading u-flex u-ai-center u-jc-space-between"> <div className="panel-heading u-flex u-ai-center u-jc-space-between">
<h2 className="panel-title"> <h2 className="panel-title">
{databases.length === 1 {databases.length === 1

View File

@ -48,13 +48,15 @@ class DatabaseRow extends Component {
{isNew {isNew
? <div className="admin-table--edit-cell"> ? <div className="admin-table--edit-cell">
<input <input
className="form-control" className="form-control input-sm"
type="text" type="text"
defaultValue={name} defaultValue={name}
placeholder="Name this RP" placeholder="Name this RP"
onKeyDown={e => this.handleKeyDown(e, database)} onKeyDown={e => this.handleKeyDown(e, database)}
ref={r => (this.name = r)} ref={r => (this.name = r)}
autoFocus={true} autoFocus={true}
spellCheck={false}
autoComplete={false}
/> />
</div> </div>
: <div className="admin-table--edit-cell"> : <div className="admin-table--edit-cell">
@ -64,7 +66,7 @@ class DatabaseRow extends Component {
<td> <td>
<div className="admin-table--edit-cell"> <div className="admin-table--edit-cell">
<input <input
className="form-control" className="form-control input-sm"
name="name" name="name"
type="text" type="text"
defaultValue={formattedDuration} defaultValue={formattedDuration}
@ -72,13 +74,15 @@ class DatabaseRow extends Component {
onKeyDown={e => this.handleKeyDown(e, database)} onKeyDown={e => this.handleKeyDown(e, database)}
ref={r => (this.duration = r)} ref={r => (this.duration = r)}
autoFocus={!isNew} autoFocus={!isNew}
spellCheck={false}
autoComplete={false}
/> />
</div> </div>
</td> </td>
<td style={isRFDisplayed ? {} : {display: 'none'}}> <td style={isRFDisplayed ? {} : {display: 'none'}}>
<div className="admin-table--edit-cell"> <div className="admin-table--edit-cell">
<input <input
className="form-control" className="form-control input-sm"
name="name" name="name"
type="number" type="number"
min="1" min="1"
@ -86,6 +90,8 @@ class DatabaseRow extends Component {
placeholder="# of Nodes" placeholder="# of Nodes"
onKeyDown={e => this.handleKeyDown(e, database)} onKeyDown={e => this.handleKeyDown(e, database)}
ref={r => (this.replication = r)} ref={r => (this.replication = r)}
spellCheck={false}
autoComplete={false}
/> />
</div> </div>
</td> </td>
@ -121,6 +127,7 @@ class DatabaseRow extends Component {
? <YesNoButtons ? <YesNoButtons
onConfirm={() => onDelete(database, retentionPolicy)} onConfirm={() => onDelete(database, retentionPolicy)}
onCancel={this.handleEndDelete} onCancel={this.handleEndDelete}
buttonSize="btn-xs"
/> />
: <button : <button
className="btn btn-xs btn-danger admin-table--hidden" className="btn btn-xs btn-danger admin-table--hidden"

View File

@ -90,7 +90,7 @@ const Header = ({
<div style={confirmStyle}> <div style={confirmStyle}>
<div className="admin-table--delete-cell"> <div className="admin-table--delete-cell">
<input <input
className="form-control" className="form-control input-xs"
name="name" name="name"
type="text" type="text"
value={database.deleteCode || ''} value={database.deleteCode || ''}
@ -98,12 +98,15 @@ const Header = ({
onChange={e => onDatabaseDeleteConfirm(database, e)} onChange={e => onDatabaseDeleteConfirm(database, e)}
onKeyDown={e => onDatabaseDeleteConfirm(database, e)} onKeyDown={e => onDatabaseDeleteConfirm(database, e)}
autoFocus={true} autoFocus={true}
autoComplete={false}
spellCheck={false}
/> />
</div> </div>
<ConfirmButtons <ConfirmButtons
item={database} item={database}
onConfirm={onConfirm} onConfirm={onConfirm}
onCancel={onCancel} onCancel={onCancel}
buttonSize="btn-xs"
/> />
</div> </div>
) )
@ -119,14 +122,16 @@ const Header = ({
const EditHeader = ({database, onEdit, onKeyDown, onConfirm, onCancel}) => ( const EditHeader = ({database, onEdit, onKeyDown, onConfirm, onCancel}) => (
<div className="db-manager-header db-manager-header--edit"> <div className="db-manager-header db-manager-header--edit">
<input <input
className="form-control" className="form-control input-sm"
name="name" name="name"
type="text" type="text"
value={database.name} value={database.name}
placeholder="Name this database" placeholder="Name this Database"
onChange={e => onEdit(database, {name: e.target.value})} onChange={e => onEdit(database, {name: e.target.value})}
onKeyDown={e => onKeyDown(e, database)} onKeyDown={e => onKeyDown(e, database)}
autoFocus={true} autoFocus={true}
spellCheck={false}
autoComplete={false}
/> />
<ConfirmButtons item={database} onConfirm={onConfirm} onCancel={onCancel} /> <ConfirmButtons item={database} onConfirm={onConfirm} onCancel={onCancel} />
</div> </div>

View File

@ -31,7 +31,7 @@ class FilterBar extends Component {
<div className="users__search-widget input-group admin__search-widget"> <div className="users__search-widget input-group admin__search-widget">
<input <input
type="text" type="text"
className="form-control" className="form-control input-sm"
placeholder={`Filter ${placeholderText}...`} placeholder={`Filter ${placeholderText}...`}
value={this.state.filterText} value={this.state.filterText}
onChange={this.handleText} onChange={this.handleText}

View File

@ -4,9 +4,9 @@ import QueryRow from 'src/admin/components/QueryRow'
const QueriesTable = ({queries, onKillQuery}) => ( const QueriesTable = ({queries, onKillQuery}) => (
<div> <div>
<div className="panel panel-minimal"> <div className="panel panel-default">
<div className="panel-body"> <div className="panel-body">
<table className="table v-center admin-table"> <table className="table v-center admin-table table-highlight">
<thead> <thead>
<tr> <tr>
<th>Database</th> <th>Database</th>

View File

@ -72,7 +72,11 @@ const RoleRow = ({
/> />
: null} : null}
</td> </td>
<DeleteConfirmTableCell onDelete={onDelete} item={role} /> <DeleteConfirmTableCell
onDelete={onDelete}
item={role}
buttonSize="btn-xs"
/>
</tr> </tr>
) )
} }

View File

@ -17,7 +17,7 @@ const RolesTable = ({
onUpdateRoleUsers, onUpdateRoleUsers,
onUpdateRolePermissions, onUpdateRolePermissions,
}) => ( }) => (
<div className="panel panel-info"> <div className="panel panel-default">
<FilterBar <FilterBar
type="roles" type="roles"
onFilter={onFilter} onFilter={onFilter}
@ -25,7 +25,7 @@ const RolesTable = ({
onClickCreate={onClickCreate} onClickCreate={onClickCreate}
/> />
<div className="panel-body"> <div className="panel-body">
<table className="table v-center admin-table"> <table className="table v-center admin-table table-highlight">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>Name</th>

View File

@ -25,10 +25,10 @@ class UserEditingRow extends Component {
render() { render() {
const {user, isNew} = this.props const {user, isNew} = this.props
return ( return (
<td> <td style={{width: '240px'}}>
<div className="admin-table--edit-cell"> <div className="admin-table--edit-cell">
<input <input
className="form-control" className="form-control input-sm"
name="name" name="name"
type="text" type="text"
value={user.name || ''} value={user.name || ''}
@ -36,16 +36,20 @@ class UserEditingRow extends Component {
onChange={this.handleEdit(user)} onChange={this.handleEdit(user)}
onKeyPress={this.handleKeyPress(user)} onKeyPress={this.handleKeyPress(user)}
autoFocus={true} autoFocus={true}
spellCheck={false}
autoComplete={false}
/> />
{isNew {isNew
? <input ? <input
className="form-control" className="form-control input-sm"
name="password" name="password"
type="password" type="password"
value={user.password || ''} value={user.password || ''}
placeholder="Password" placeholder="Password"
onChange={this.handleEdit(user)} onChange={this.handleEdit(user)}
onKeyPress={this.handleKeyPress(user)} onKeyPress={this.handleKeyPress(user)}
spellCheck={false}
autoComplete={false}
/> />
: null} : null}
</div> </div>

View File

@ -48,8 +48,9 @@ const UserRow = ({
onSave={onSave} onSave={onSave}
isNew={isNew} isNew={isNew}
/> />
{hasRoles ? <td /> : null} {hasRoles ? <td>--</td> : null}
<td /> <td>--</td>
<td style={{width: '190px'}} />
<td className="text-right" style={{width: '85px'}}> <td className="text-right" style={{width: '85px'}}>
<ConfirmButtons item={user} onConfirm={onSave} onCancel={onCancel} /> <ConfirmButtons item={user} onConfirm={onSave} onCancel={onCancel} />
</td> </td>
@ -59,7 +60,7 @@ const UserRow = ({
return ( return (
<tr> <tr>
<td>{name}</td> <td style={{width: '240px'}}>{name}</td>
{hasRoles {hasRoles
? <td> ? <td>
<MultiSelectDropdown <MultiSelectDropdown
@ -74,6 +75,7 @@ const UserRow = ({
/> />
</td> </td>
: null} : null}
<td> <td>
{allPermissions && allPermissions.length {allPermissions && allPermissions.length
? <MultiSelectDropdown ? <MultiSelectDropdown
@ -86,14 +88,19 @@ const UserRow = ({
/> />
: null} : null}
</td> </td>
<td className="text-right" style={{width: '300px'}}> <td className="text-right" style={{width: '190px'}}>
<ChangePassRow <ChangePassRow
onEdit={onEdit} onEdit={onEdit}
onApply={handleUpdatePassword} onApply={handleUpdatePassword}
user={user} user={user}
buttonSize="btn-xs"
/> />
</td> </td>
<DeleteConfirmTableCell onDelete={onDelete} item={user} /> <DeleteConfirmTableCell
onDelete={onDelete}
item={user}
buttonSize="btn-xs"
/>
</tr> </tr>
) )
} }

View File

@ -20,7 +20,7 @@ const UsersTable = ({
onUpdateRoles, onUpdateRoles,
onUpdatePassword, onUpdatePassword,
}) => ( }) => (
<div className="panel panel-info"> <div className="panel panel-default">
<FilterBar <FilterBar
type="users" type="users"
onFilter={onFilter} onFilter={onFilter}
@ -28,7 +28,7 @@ const UsersTable = ({
onClickCreate={onClickCreate} onClickCreate={onClickCreate}
/> />
<div className="panel-body"> <div className="panel-body">
<table className="table v-center admin-table"> <table className="table v-center admin-table table-highlight">
<thead> <thead>
<tr> <tr>
<th>User</th> <th>User</th>

View File

@ -1,21 +1,36 @@
import React, {PropTypes} from 'react' import React, {PropTypes} from 'react'
import classnames from 'classnames'
const YesNoButtons = ({onConfirm, onCancel}) => ( const YesNoButtons = ({onConfirm, onCancel, buttonSize}) => (
<div> <div>
<button className="btn btn-xs btn-info" onClick={onCancel}> <button
className={classnames('btn btn-square btn-info', {
[buttonSize]: buttonSize,
})}
onClick={onCancel}
>
<span className="icon remove" /> <span className="icon remove" />
</button> </button>
<button className="btn btn-xs btn-success" onClick={onConfirm}> <button
className={classnames('btn btn-square btn-success', {
[buttonSize]: buttonSize,
})}
onClick={onConfirm}
>
<span className="icon checkmark" /> <span className="icon checkmark" />
</button> </button>
</div> </div>
) )
const {func} = PropTypes const {func, string} = PropTypes
YesNoButtons.propTypes = { YesNoButtons.propTypes = {
onConfirm: func.isRequired, onConfirm: func.isRequired,
onCancel: func.isRequired, onCancel: func.isRequired,
buttonSize: string,
}
YesNoButtons.defaultProps = {
buttonSize: 'btn-sm',
} }
export default YesNoButtons export default YesNoButtons

View File

@ -12,22 +12,7 @@
*/ */
.admin-tabs { .admin-tabs {
padding-right: 0; padding-right: 0;
& + div {padding-left: 0;}
& + div {
padding-left: 0;
.panel {
border-top-left-radius: 0;
}
.panel-body {
min-height: 300px;
}
.panel-title {
font-size: 17px;
font-weight: 400 !important;
color: $g12-forge;
}
}
} }
.admin-tabs .btn-group { .admin-tabs .btn-group {
margin: 0; margin: 0;
@ -64,8 +49,26 @@
} }
} }
} }
.admin-tabs--content {
.panel {
border-top-left-radius: 0;
}
.panel-heading {
height: 60px;
}
.panel-title {
font-size: 17px;
font-weight: 400 !important;
color: $g12-forge;
padding: 0;
}
.panel-body {
min-height: 300px;
}
.panel-heading + .panel-body {
padding-top: 0;
}
}
/* /*
Admin Table Admin Table
---------------------------------------------- ----------------------------------------------
@ -184,21 +187,18 @@
h4 { h4 {
margin: 0px; margin: 0px;
color: $c-potassium; color: $c-potassium;
font-size: 17px; font-size: 16px;
font-family: $code-font; font-family: $code-font;
padding-left: 6px; padding-left: 6px;
width: auto;
} }
} }
.db-manager-header--edit { .db-manager-header--edit {
justify-content: flex-start; justify-content: flex-start;
.form-control { .form-control {
height: 22px; margin: 0 8px 0 0;
padding: 0 6px; flex: 1 0 0;
margin: 0 4px 0 0;
min-width: 110px;
font-size: 12px;
width: 50%;
} }
} }
@ -215,11 +215,7 @@
flex-wrap: nowrap; flex-wrap: nowrap;
.form-control { .form-control {
height: 22px;
padding: 0 6px;
margin: 0 4px 0 0; margin: 0 4px 0 0;
min-width: 110px;
font-size: 12px;
width: 120px; width: 120px;
} }
} }