Skip to content
Snippets Groups Projects
Commit bcfcf896 authored by piotr.kupczyk@id.ethz.ch's avatar piotr.kupczyk@id.ethz.ch
Browse files

SSDM-7594 : Grid - separate filtering for each column

parent 560151e4
No related branches found
No related tags found
No related merge requests found
...@@ -22,11 +22,6 @@ const styles = theme => ({ ...@@ -22,11 +22,6 @@ const styles = theme => ({
flexDirection: 'column', flexDirection: 'column',
height: '100%' height: '100%'
}, },
headerContainer: {
flexGrow: 0,
padding: theme.spacing(2),
paddingBottom: 0
},
footerContainer: { footerContainer: {
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
...@@ -82,7 +77,7 @@ class Grid extends React.Component { ...@@ -82,7 +77,7 @@ class Grid extends React.Component {
this.state = { this.state = {
loaded: false, loaded: false,
filter: this.props.filter || '', filters: this.props.filters || {},
page: 0, page: 0,
pageSize: 10, pageSize: 10,
visibleColumns: Object.keys(this.columnsMap), visibleColumns: Object.keys(this.columnsMap),
...@@ -112,7 +107,7 @@ class Grid extends React.Component { ...@@ -112,7 +107,7 @@ class Grid extends React.Component {
loadData() { loadData() {
if (_.isFunction(this.props.data)) { if (_.isFunction(this.props.data)) {
let loadConfig = { let loadConfig = {
filter: this.state.filter, filters: this.state.filters,
page: this.state.page, page: this.state.page,
pageSize: this.state.pageSize, pageSize: this.state.pageSize,
sort: this.state.sort, sort: this.state.sort,
...@@ -173,11 +168,16 @@ class Grid extends React.Component { ...@@ -173,11 +168,16 @@ class Grid extends React.Component {
facade.updatePersons([update]) facade.updatePersons([update])
} }
handleFilterChange(filter) { handleFilterChange(column, filter) {
let filters = {
...this.state.filters,
[column]: filter
}
this.setState( this.setState(
() => ({ () => ({
page: 0, page: 0,
filter filters
}), }),
() => { () => {
this.loadData() this.loadData()
...@@ -239,17 +239,13 @@ class Grid extends React.Component { ...@@ -239,17 +239,13 @@ class Grid extends React.Component {
} }
filter(objects) { filter(objects) {
const filter = this.state.filter function matches(value, filter) {
? this.state.filter.trim().toUpperCase()
: null
function matches(value) {
if (filter) { if (filter) {
return value return value
? value ? value
.trim() .trim()
.toUpperCase() .toUpperCase()
.includes(filter) .includes(filter.trim().toUpperCase())
: false : false
} else { } else {
return true return true
...@@ -257,11 +253,13 @@ class Grid extends React.Component { ...@@ -257,11 +253,13 @@ class Grid extends React.Component {
} }
return _.filter(objects, row => { return _.filter(objects, row => {
return this.state.visibleColumns.some(visibleColumn => { let matchesAll = true
let column = this.columnsMap[visibleColumn] this.state.visibleColumns.forEach(visibleColumn => {
let value = _.get(row, column.field) let value = _.get(row, visibleColumn)
return matches(value) let filter = this.state.filters[visibleColumn]
matchesAll = matchesAll && matches(value, filter)
}) })
return matchesAll
}) })
} }
...@@ -297,7 +295,7 @@ class Grid extends React.Component { ...@@ -297,7 +295,7 @@ class Grid extends React.Component {
} }
const { classes } = this.props const { classes } = this.props
const { page, pageSize, filter, visibleColumns } = this.state const { page, pageSize, visibleColumns } = this.state
let pagedObjects = null let pagedObjects = null
let totalCount = null let totalCount = null
...@@ -314,12 +312,12 @@ class Grid extends React.Component { ...@@ -314,12 +312,12 @@ class Grid extends React.Component {
return ( return (
<div className={classes.container}> <div className={classes.container}>
<div className={classes.headerContainer}>
<FilterField filter={filter} filterChange={this.handleFilterChange} />
</div>
<div className={classes.tableContainer}> <div className={classes.tableContainer}>
<Table classes={{ root: classes.table }}> <Table classes={{ root: classes.table }}>
<TableHead classes={{ root: classes.tableHeader }}> <TableHead classes={{ root: classes.tableHeader }}>
<TableRow>
{this.columnsArray.map(column => this.renderFilterCell(column))}
</TableRow>
<TableRow> <TableRow>
{this.columnsArray.map(column => this.renderHeaderCell(column))} {this.columnsArray.map(column => this.renderHeaderCell(column))}
</TableRow> </TableRow>
...@@ -382,6 +380,24 @@ class Grid extends React.Component { ...@@ -382,6 +380,24 @@ class Grid extends React.Component {
} }
} }
renderFilterCell(column) {
const { visibleColumns, filters } = this.state
if (visibleColumns.includes(column.field)) {
let filter = filters[column.field] || ''
let filterChange = filter => {
this.handleFilterChange(column.field, filter)
}
return (
<TableCell key={column.field}>
<FilterField filter={filter} filterChange={filterChange} />
</TableCell>
)
} else {
return null
}
}
renderRowCell(column, row) { renderRowCell(column, row) {
const { visibleColumns } = this.state const { visibleColumns } = this.state
......
...@@ -58,10 +58,19 @@ class Search extends React.Component { ...@@ -58,10 +58,19 @@ class Search extends React.Component {
dataSetTypes, dataSetTypes,
materialTypes materialTypes
) )
return allTypes.map(type => ({
...type, let query = this.props.objectId.toUpperCase()
id: type.permId.entityKind + '-' + type.permId.permId
})) return allTypes
.filter(
type =>
(type.code && type.code.toUpperCase().includes(query)) ||
(type.description && type.description.toUpperCase().includes(query))
)
.map(type => ({
...type,
id: type.permId.entityKind + '-' + type.permId.permId
}))
}) })
} }
...@@ -125,7 +134,6 @@ class Search extends React.Component { ...@@ -125,7 +134,6 @@ class Search extends React.Component {
return ( return (
<Grid <Grid
id={ids.TYPES_GRID_ID} id={ids.TYPES_GRID_ID}
filter={this.props.objectId}
columns={[ columns={[
{ {
field: 'permId.entityKind', field: 'permId.entityKind',
......
...@@ -8,40 +8,51 @@ class Search extends React.Component { ...@@ -8,40 +8,51 @@ class Search extends React.Component {
constructor(props) { constructor(props) {
super(props) super(props)
this.state = {
loaded: false
}
this.load = this.load.bind(this) this.load = this.load.bind(this)
} }
load({ filter, page, pageSize }) { componentDidMount() {
this.load().then(users => {
this.setState(() => ({
users,
loaded: true
}))
})
}
load() {
let query = this.props.objectId
let criteria = new dto.PersonSearchCriteria() let criteria = new dto.PersonSearchCriteria()
let fo = new dto.PersonFetchOptions() let fo = new dto.PersonFetchOptions()
criteria.withOrOperator() criteria.withOrOperator()
criteria.withUserId().thatContains(filter) criteria.withUserId().thatContains(query)
criteria.withFirstName().thatContains(filter) criteria.withFirstName().thatContains(query)
criteria.withLastName().thatContains(filter) criteria.withLastName().thatContains(query)
fo.count(pageSize)
fo.from(page * pageSize)
return facade.searchPersons(criteria, fo).then(result => { return facade.searchPersons(criteria, fo).then(result => {
let objects = result.objects.map(user => ({ return result.objects.map(user => ({
...user, ...user,
id: user.userId id: user.userId
})) }))
return {
objects,
totalCount: result.totalCount
}
}) })
} }
render() { render() {
logger.log(logger.DEBUG, 'Search.render') logger.log(logger.DEBUG, 'Search.render')
if (!this.state.loaded) {
return null
}
return ( return (
<Grid <Grid
id={ids.USERS_GRID_ID} id={ids.USERS_GRID_ID}
filter={this.props.objectId}
columns={[ columns={[
{ {
field: 'userId' field: 'userId'
...@@ -53,7 +64,7 @@ class Search extends React.Component { ...@@ -53,7 +64,7 @@ class Search extends React.Component {
field: 'lastName' field: 'lastName'
} }
]} ]}
data={this.load} data={this.state.users}
/> />
) )
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment