make scheme a dropdown, update the redux store for a mapping change corectly, and add an empty state for the provider mappings page

pull/10616/head
Iris Scholten 2018-02-02 15:26:31 -08:00
parent 343f417474
commit 9ecbf9daf7
4 changed files with 132 additions and 59 deletions

View File

@ -35,6 +35,14 @@ class ProvidersTable extends Component {
const tableTitle =
mappings.length === 1 ? '1 Map' : `${mappings.length} Maps`
// define scheme options
const schemes = [
{text: '*'},
{text: 'oauth2'},
{text: 'option2'},
{text: 'option3'},
]
return (
<div className="panel panel-default">
<div className="panel-heading u-flex u-ai-center u-jc-space-between">
@ -49,38 +57,55 @@ class ProvidersTable extends Component {
<span className="icon plus" /> Create Map
</button>
</div>
<div className="panel-body">
<div className="fancytable--labels">
<div className="fancytable--th provider--id">ID</div>
<div className="fancytable--th provider--scheme">Scheme</div>
<div className="fancytable--th provider--provider">Provider</div>
<div className="fancytable--th provider--providerorg">
Provider Org
{(mappings && mappings.length) || isCreatingMap
? <div className="panel-body">
<div className="fancytable--labels">
<div className="fancytable--th provider--id">ID</div>
<div className="fancytable--th provider--scheme">Scheme</div>
<div className="fancytable--th provider--provider">
Provider
</div>
<div className="fancytable--th provider--providerorg">
Provider Org
</div>
<div className="fancytable--th provider--arrow" />
<div className="fancytable--th provider--redirect">
Organization
</div>
<div className="fancytable--th" />
<div className="fancytable--th provider--delete" />
</div>
{mappings.map(mapping =>
<ProvidersTableRow
key={mapping.id}
mapping={mapping}
organizations={organizations}
schemes={schemes}
onDelete={onDeleteMap}
onUpdate={onUpdateMap}
/>
)}
{isCreatingMap
? <ProvidersTableRowNew
organizations={organizations}
schemes={schemes}
onCreate={this.handleCreateMap}
onCancel={this.handleCancelCreateMap}
/>
: null}
</div>
<div className="fancytable--th provider--arrow" />
<div className="fancytable--th provider--redirect">
Organization
</div>
<div className="fancytable--th" />
<div className="fancytable--th provider--delete" />
</div>
{mappings.map(mapping =>
<ProvidersTableRow
key={mapping.id}
mapping={mapping}
organizations={organizations}
onDelete={onDeleteMap}
onUpdate={onUpdateMap}
/>
)}
{isCreatingMap
? <ProvidersTableRowNew
organizations={organizations}
onCreate={this.handleCreateMap}
onCancel={this.handleCancelCreateMap}
/>
: null}
</div>
: <div className="generic-empty-state">
<h4 style={{margin: '90px 0'}}>
Looks like you dont have any mappings
</h4>
<button
className="btn btn-sm btn-primary"
onClick={this.handleClickCreateMap}
disabled={isCreatingMap}
>
<span className="icon plus" /> Create Map
</button>
</div>}
</div>
)
}

View File

@ -33,30 +33,68 @@ class ProvidersTableRow extends Component {
onDelete(mapping)
}
handleChangeScheme = scheme => {
this.setState({scheme})
this.handleUpdateMapping()
}
handleChangeProvider = provider => {
this.setState({provider})
this.handleUpdateMapping()
const {scheme, organizationId, providerOrganization} = this.state
const {onUpdate, mapping: {id}} = this.props
const updatedMap = {
id,
scheme,
provider,
providerOrganization,
organizationId,
}
onUpdate(updatedMap)
}
handleChangeProviderOrg = providerOrganization => {
this.setState({providerOrganization})
this.handleUpdateMapping()
const {onUpdate, mapping: {id}} = this.props
const {scheme, provider, organizationId} = this.state
const updatedMap = {
id,
scheme,
provider,
providerOrganization,
organizationId,
}
onUpdate(updatedMap)
}
handleChooseOrganization = org => {
this.setState({organizationId: org.id})
this.handleUpdateMapping()
const organizationId = org.id
this.setState({organizationId})
const {onUpdate, mapping: {id}} = this.props
const {scheme, provider, providerOrganization} = this.state
const updatedMap = {
id,
scheme,
provider,
providerOrganization,
organizationId,
}
onUpdate(updatedMap)
}
handleChooseScheme = s => {
const scheme = s.text
this.setState({scheme})
const {onUpdate, mapping: {id}} = this.props
const {provider, providerOrganization, organizationId} = this.state
const updatedMap = {
id,
scheme,
provider,
providerOrganization,
organizationId,
}
onUpdate(updatedMap)
}
handleUpdateMapping = () => {
// this was getting called by all the handlers for input/dropdown changes but it meant the state was not getting updated so the updated map was stale
const {onUpdate, mapping: {id}} = this.props
const {scheme, provider, providerOrganization, organizationId} = this.state
const updatedMap = {
id,
scheme,
@ -75,11 +113,10 @@ class ProvidersTableRow extends Component {
organizationId,
isDeleting,
} = this.state
const {organizations, mapping} = this.props
const {organizations, mapping, schemes} = this.props
const selectedOrg = organizations.find(o => o.id === organizationId)
const dropdownItems = organizations.map(role => ({
const orgDropdownItems = organizations.map(role => ({
...role,
text: role.name,
}))
@ -95,11 +132,11 @@ class ProvidersTableRow extends Component {
<div className="fancytable--td provider--id">
{mapping.id}
</div>
<InputClickToEdit
value={scheme}
wrapperClass="fancytable--td provider--scheme"
onUpdate={this.handleChangeScheme}
disabled={isDefaultMapping}
<Dropdown
items={schemes}
onChoose={this.handleChooseScheme}
selected={scheme}
className="fancytable--td provider--scheme"
/>
<InputClickToEdit
value={provider}
@ -118,7 +155,7 @@ class ProvidersTableRow extends Component {
</div>
<div className={organizationIdClassName}>
<Dropdown
items={dropdownItems}
items={orgDropdownItems}
onChoose={this.handleChooseOrganization}
selected={selectedOrg.name}
className="dropdown-stretch"
@ -158,6 +195,11 @@ ProvidersTableRow.propTypes = {
name: string.isRequired,
})
),
schemes: arrayOf(
shape({
text: string.isRequired,
})
),
onDelete: func.isRequired,
onUpdate: func.isRequired,
}

View File

@ -9,15 +9,15 @@ class ProvidersTableRowNew extends Component {
super(props)
this.state = {
scheme: null,
scheme: '*',
provider: null,
providerOrganization: null,
organizationId: 'default',
}
}
handleChangeScheme = scheme => {
this.setState({scheme})
handleChooseScheme = scheme => {
this.setState({scheme: scheme.text})
}
handleChangeProvider = provider => {
@ -42,7 +42,7 @@ class ProvidersTableRowNew extends Component {
render() {
const {scheme, provider, providerOrganization, organizationId} = this.state
const {organizations, onCancel} = this.props
const {organizations, onCancel, schemes} = this.props
const selectedOrg = organizations.find(o => o.id === organizationId)
@ -54,10 +54,12 @@ class ProvidersTableRowNew extends Component {
return (
<div className="fancytable--row">
<div className="fancytable--td provider--id">--</div>
<InputClickToEdit
value={scheme}
wrapperClass="fancytable--td provider--scheme"
onUpdate={this.handleChangeScheme}
<Dropdown
items={schemes}
onChoose={this.handleChooseScheme}
selected={scheme}
className={'fancytable--td provider--scheme'}
/>
<InputClickToEdit
value={provider}
@ -98,6 +100,11 @@ ProvidersTableRowNew.propTypes = {
name: string.isRequired,
})
).isRequired,
schemes: arrayOf(
shape({
text: string.isRequired,
})
),
onCreate: func.isRequired,
onCancel: func.isRequired,
}

View File

@ -37,7 +37,6 @@ class ProvidersPage extends Component {
handleUpdateMap = updatedMap => {
// update the redux store
this.props.actions.updateMappingAsync(updatedMap)
// update the server
/*
const {actionsAdmin: {updateMappingAsync}} = this.props