Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
O
openbis
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
sispub
openbis
Commits
9c3f0c43
Commit
9c3f0c43
authored
3 years ago
by
piotr.kupczyk@id.ethz.ch
Browse files
Options
Downloads
Patches
Plain Diff
SSDM-11664 : NG UI & ELN : common table widget - settings
parent
817a9cb9
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
openbis_ng_ui/src/js/components/common/grid/GridController.js
+176
-176
176 additions, 176 deletions
...bis_ng_ui/src/js/components/common/grid/GridController.js
with
176 additions
and
176 deletions
openbis_ng_ui/src/js/components/common/grid/GridController.js
+
176
−
176
View file @
9c3f0c43
...
@@ -19,6 +19,7 @@ export default class GridController {
...
@@ -19,6 +19,7 @@ export default class GridController {
columnsSorting
:
[],
columnsSorting
:
[],
columns
:
[],
columns
:
[],
rows
:
[],
rows
:
[],
filteredRows
:
[],
sortedRows
:
[],
sortedRows
:
[],
allRows
:
[],
allRows
:
[],
selectedRow
:
null
,
selectedRow
:
null
,
...
@@ -29,9 +30,127 @@ export default class GridController {
...
@@ -29,9 +30,127 @@ export default class GridController {
this
.
context
=
context
this
.
context
=
context
}
}
async
_initColumns
(
rows
)
{
async
load
()
{
const
props
=
this
.
context
.
getProps
()
if
((
props
.
rows
&&
props
.
loadRows
)
||
(
!
props
.
rows
&&
!
props
.
loadRows
))
{
throw
new
Error
(
'
Incorrect grid configuration. Please set "rows" or "loadRows" property.
'
)
}
if
(
(
props
.
columns
&&
props
.
loadColumns
)
||
(
!
props
.
columns
&&
!
props
.
loadColumns
)
)
{
throw
new
Error
(
'
Incorrect grid configuration. Please set "columns" or "loadColumns" property.
'
)
}
await
this
.
context
.
setState
(()
=>
({
loading
:
true
}))
const
state
=
this
.
context
.
getState
()
const
newState
=
{
...
state
,
loading
:
false
,
loaded
:
true
}
if
(
!
state
.
loaded
)
{
const
settings
=
await
this
.
_loadSettings
()
if
(
settings
)
{
newState
.
pageSize
=
settings
.
pageSize
newState
.
sort
=
settings
.
sort
newState
.
sortDirection
=
settings
.
sortDirection
newState
.
columnsVisibility
=
settings
.
columnsVisibility
newState
.
columnsSorting
=
settings
.
columnsSorting
}
}
if
(
props
.
rows
)
{
const
{
newColumns
,
newColumnsVisibility
,
newColumnsSorting
}
=
await
this
.
_loadColumns
(
props
.
rows
,
newState
.
columnsVisibility
,
newState
.
columnsSorting
)
newState
.
columns
=
newColumns
newState
.
columnsVisibility
=
newColumnsVisibility
newState
.
columnsSorting
=
newColumnsSorting
newState
.
allRows
=
props
.
rows
newState
.
filteredRows
=
this
.
_filterRows
(
newState
.
allRows
,
newState
.
columns
,
newState
.
filters
)
newState
.
sortedRows
=
this
.
_sortRows
(
newState
.
filteredRows
,
newState
.
columns
,
newState
.
sort
,
newState
.
sortDirection
)
newState
.
totalCount
=
newState
.
filteredRows
.
length
const
pageCount
=
Math
.
max
(
Math
.
ceil
(
newState
.
totalCount
/
newState
.
pageSize
),
1
)
newState
.
page
=
Math
.
min
(
newState
.
page
,
pageCount
-
1
)
newState
.
rows
=
this
.
_pageRows
(
newState
.
sortedRows
,
newState
.
page
,
newState
.
pageSize
)
}
else
if
(
props
.
loadRows
)
{
const
result
=
await
props
.
loadRows
({
filters
:
newState
.
filters
,
page
:
newState
.
page
,
pageSize
:
newState
.
pageSize
,
sort
:
newState
.
sort
,
sortDirection
:
newState
.
sortDirection
})
newState
.
allRows
=
result
.
rows
newState
.
filteredRows
=
result
.
rows
newState
.
sortedRows
=
result
.
rows
newState
.
rows
=
result
.
rows
newState
.
totalCount
=
result
.
totalCount
const
pageCount
=
Math
.
max
(
Math
.
ceil
(
result
.
totalCount
/
newState
.
pageSize
),
1
)
newState
.
page
=
Math
.
min
(
newState
.
page
,
pageCount
-
1
)
const
{
newColumns
,
newColumnsVisibility
,
newColumnsSorting
}
=
await
this
.
_loadColumns
(
newState
.
rows
,
newState
.
columnsVisibility
,
newState
.
columnsSorting
)
newState
.
columns
=
newColumns
newState
.
columnsVisibility
=
newColumnsVisibility
newState
.
columnsSorting
=
newColumnsSorting
}
await
this
.
context
.
setState
(
newState
)
if
(
!
state
.
loaded
)
{
this
.
selectRow
(
props
.
selectedRowId
)
}
else
{
this
.
selectRow
(
newState
.
selectedRow
?
newState
.
selectedRow
.
id
:
null
)
}
}
async
_loadColumns
(
rows
,
columnsVisibility
,
columnsSorting
)
{
const
{
columns
,
loadColumns
}
=
this
.
context
.
getProps
()
const
{
columns
,
loadColumns
}
=
this
.
context
.
getProps
()
const
{
columnsVisibility
,
columnsSorting
}
=
this
.
context
.
getState
()
let
newColumns
=
[]
let
newColumns
=
[]
const
newColumnsVisibility
=
{
...
columnsVisibility
}
const
newColumnsVisibility
=
{
...
columnsVisibility
}
...
@@ -54,7 +173,7 @@ export default class GridController {
...
@@ -54,7 +173,7 @@ export default class GridController {
throw
new
Error
(
'
column.getValue cannot be empty
'
)
throw
new
Error
(
'
column.getValue cannot be empty
'
)
}
}
return
this
.
_
init
Column
(
newColumn
)
return
this
.
_
load
Column
(
newColumn
)
})
})
newColumns
.
forEach
((
newColumn
,
newColumnIndex
)
=>
{
newColumns
.
forEach
((
newColumn
,
newColumnIndex
)
=>
{
...
@@ -92,21 +211,7 @@ export default class GridController {
...
@@ -92,21 +211,7 @@ export default class GridController {
return
{
newColumns
,
newColumnsVisibility
,
newColumnsSorting
}
return
{
newColumns
,
newColumnsVisibility
,
newColumnsSorting
}
}
}
_sortColumns
(
columns
,
columnsSorting
)
{
_loadColumn
(
column
)
{
columns
.
sort
((
c1
,
c2
)
=>
{
const
c1Index
=
_
.
findIndex
(
columnsSorting
,
columnName
=>
columnName
===
c1
.
name
)
const
c2Index
=
_
.
findIndex
(
columnsSorting
,
columnName
=>
columnName
===
c2
.
name
)
return
c1Index
-
c2Index
})
}
_initColumn
(
column
)
{
return
{
return
{
...
column
,
...
column
,
name
:
column
.
name
,
name
:
column
.
name
,
...
@@ -165,102 +270,21 @@ export default class GridController {
...
@@ -165,102 +270,21 @@ export default class GridController {
}
}
}
}
async
load
()
{
_sortColumns
(
columns
,
columnsSorting
)
{
const
{
columns
,
loadColumns
,
rows
,
loadRows
,
selectedRowId
}
=
columns
.
sort
((
c1
,
c2
)
=>
{
this
.
context
.
getProps
()
const
c1Index
=
_
.
findIndex
(
columnsSorting
,
if
((
rows
&&
loadRows
)
||
(
!
rows
&&
!
loadRows
))
{
columnName
=>
columnName
===
c1
.
name
throw
new
Error
(
'
Incorrect grid configuration. Please set "rows" or "loadRows" property.
'
)
}
if
((
columns
&&
loadColumns
)
||
(
!
columns
&&
!
loadColumns
))
{
throw
new
Error
(
'
Incorrect grid configuration. Please set "columns" or "loadColumns" property.
'
)
)
}
const
c2Index
=
_
.
findIndex
(
columnsSorting
,
await
this
.
context
.
setState
(()
=>
({
columnName
=>
columnName
===
c2
.
name
loading
:
true
}))
const
{
loaded
,
filters
,
page
,
pageSize
,
sort
,
sortDirection
,
selectedRow
}
=
this
.
context
.
getState
()
let
newRows
,
newSortedRows
,
newAllRows
,
newColumns
,
newColumnsVisibility
,
newColumnsSorting
,
newPage
,
newTotalCount
if
(
rows
)
{
;({
newColumns
,
newColumnsVisibility
,
newColumnsSorting
}
=
await
this
.
_initColumns
(
rows
))
const
filteredRows
=
this
.
_filter
(
rows
,
newColumns
,
filters
)
const
pageCount
=
Math
.
max
(
Math
.
ceil
(
filteredRows
.
length
/
pageSize
),
1
)
const
sortedRows
=
this
.
_sort
(
filteredRows
,
newColumns
,
sort
,
sortDirection
)
)
return
c1Index
-
c2Index
newPage
=
Math
.
min
(
page
,
pageCount
-
1
)
})
newRows
=
this
.
_page
(
sortedRows
,
newPage
,
pageSize
)
newSortedRows
=
sortedRows
newAllRows
=
rows
newTotalCount
=
filteredRows
.
length
}
else
if
(
loadRows
)
{
const
result
=
await
loadRows
({
filters
,
page
,
pageSize
,
sort
,
sortDirection
})
const
newPageCount
=
Math
.
max
(
Math
.
ceil
(
result
.
totalCount
/
pageSize
),
1
)
newPage
=
Math
.
min
(
page
,
newPageCount
-
1
)
newRows
=
result
.
rows
newSortedRows
=
result
.
rows
newAllRows
=
result
.
rows
newTotalCount
=
result
.
totalCount
;({
newColumns
,
newColumnsVisibility
,
newColumnsSorting
}
=
await
this
.
_initColumns
(
newRows
))
}
await
this
.
context
.
setState
(()
=>
({
loading
:
false
,
loaded
:
true
,
columnsVisibility
:
newColumnsVisibility
,
columnsSorting
:
newColumnsSorting
,
columns
:
newColumns
,
rows
:
newRows
,
sortedRows
:
newSortedRows
,
allRows
:
newAllRows
,
page
:
newPage
,
totalCount
:
newTotalCount
}))
if
(
!
loaded
)
{
this
.
selectRow
(
selectedRowId
)
}
else
{
this
.
selectRow
(
selectedRow
?
selectedRow
.
id
:
null
)
}
}
}
_loadSettings
()
{
async
_loadSettings
()
{
const
props
=
this
.
context
.
getProps
()
const
props
=
this
.
context
.
getProps
()
if
(
if
(
...
@@ -292,31 +316,7 @@ export default class GridController {
...
@@ -292,31 +316,7 @@ export default class GridController {
})
})
}
}
_applySettings
(
settings
,
state
)
{
async
_saveSettings
()
{
let
newColumns
=
[...
state
.
columns
]
newColumns
.
sort
((
c1
,
c2
)
=>
{
let
index1
=
_
.
findIndex
(
settings
.
columns
,
[
'
name
'
,
c1
.
name
])
let
index2
=
_
.
findIndex
(
settings
.
columns
,
[
'
name
'
,
c2
.
name
])
return
index1
-
index2
})
newColumns
=
newColumns
.
map
(
column
=>
{
let
setting
=
_
.
find
(
settings
.
columns
,
[
'
name
'
,
column
.
name
])
if
(
setting
)
{
return
{
...
column
,
visible
:
setting
.
visible
}
}
else
{
return
column
}
})
this
.
context
.
setState
(()
=>
({
...
settings
,
columns
:
newColumns
}))
}
_saveSettings
()
{
const
props
=
this
.
context
.
getProps
()
const
props
=
this
.
context
.
getProps
()
const
state
=
this
.
context
.
getState
()
const
state
=
this
.
context
.
getState
()
...
@@ -330,16 +330,12 @@ export default class GridController {
...
@@ -330,16 +330,12 @@ export default class GridController {
)
)
}
}
let
columns
=
state
.
columns
.
map
(
column
=>
({
name
:
column
.
name
,
visible
:
column
.
visible
}))
let
settings
=
{
let
settings
=
{
pageSize
:
state
.
pageSize
,
pageSize
:
state
.
pageSize
,
sort
:
state
.
sort
,
sort
:
state
.
sort
,
sortDirection
:
state
.
sortDirection
,
sortDirection
:
state
.
sortDirection
,
columns
columnsVisibility
:
state
.
columnsVisibility
,
columnsSorting
:
state
.
columnsSorting
}
}
let
gridSettings
=
new
openbis
.
WebAppSettingCreation
()
let
gridSettings
=
new
openbis
.
WebAppSettingCreation
()
...
@@ -350,7 +346,41 @@ export default class GridController {
...
@@ -350,7 +346,41 @@ export default class GridController {
update
.
setUserId
(
new
openbis
.
Me
())
update
.
setUserId
(
new
openbis
.
Me
())
update
.
getWebAppSettings
(
props
.
settingsId
.
webAppId
).
add
(
gridSettings
)
update
.
getWebAppSettings
(
props
.
settingsId
.
webAppId
).
add
(
gridSettings
)
openbis
.
updatePersons
([
update
])
await
openbis
.
updatePersons
([
update
])
}
_filterRows
(
rows
,
columns
,
filters
)
{
return
_
.
filter
([...
rows
],
row
=>
{
let
matchesAll
=
true
columns
.
forEach
(
column
=>
{
if
(
column
.
visible
)
{
let
filter
=
filters
[
column
.
name
]
matchesAll
=
matchesAll
&&
column
.
matches
(
row
,
filter
)
}
})
return
matchesAll
})
}
_sortRows
(
rows
,
columns
,
sort
,
sortDirection
)
{
if
(
sort
)
{
const
column
=
_
.
find
(
columns
,
[
'
name
'
,
sort
])
if
(
column
)
{
return
rows
.
sort
((
t1
,
t2
)
=>
{
let
sign
=
sortDirection
===
'
asc
'
?
1
:
-
1
return
sign
*
column
.
compare
(
t1
,
t2
)
})
}
}
return
rows
}
_pageRows
(
rows
,
page
,
pageSize
)
{
return
rows
.
slice
(
page
*
pageSize
,
Math
.
min
(
rows
.
length
,
(
page
+
1
)
*
pageSize
)
)
}
}
async
selectRow
(
newSelectedRowId
)
{
async
selectRow
(
newSelectedRowId
)
{
...
@@ -449,6 +479,7 @@ export default class GridController {
...
@@ -449,6 +479,7 @@ export default class GridController {
})
})
await
this
.
load
()
await
this
.
load
()
await
this
.
_saveSettings
()
}
}
async
handleColumnOrderChange
(
sourceIndex
,
destinationIndex
)
{
async
handleColumnOrderChange
(
sourceIndex
,
destinationIndex
)
{
...
@@ -479,6 +510,7 @@ export default class GridController {
...
@@ -479,6 +510,7 @@ export default class GridController {
})
})
await
this
.
load
()
await
this
.
load
()
await
this
.
_saveSettings
()
}
}
async
handleSortChange
(
column
)
{
async
handleSortChange
(
column
)
{
...
@@ -500,6 +532,7 @@ export default class GridController {
...
@@ -500,6 +532,7 @@ export default class GridController {
})
})
await
this
.
load
()
await
this
.
load
()
await
this
.
_saveSettings
()
}
}
async
handlePageChange
(
page
)
{
async
handlePageChange
(
page
)
{
...
@@ -515,46 +548,13 @@ export default class GridController {
...
@@ -515,46 +548,13 @@ export default class GridController {
pageSize
pageSize
}))
}))
await
this
.
load
()
await
this
.
load
()
await
this
.
_saveSettings
()
}
}
async
handleRowSelect
(
row
)
{
async
handleRowSelect
(
row
)
{
await
this
.
selectRow
(
row
?
row
.
id
:
null
)
await
this
.
selectRow
(
row
?
row
.
id
:
null
)
}
}
_filter
(
rows
,
columns
,
filters
)
{
return
_
.
filter
([...
rows
],
row
=>
{
let
matchesAll
=
true
columns
.
forEach
(
column
=>
{
if
(
column
.
visible
)
{
let
filter
=
filters
[
column
.
name
]
matchesAll
=
matchesAll
&&
column
.
matches
(
row
,
filter
)
}
})
return
matchesAll
})
}
_sort
(
rows
,
columns
,
sort
,
sortDirection
)
{
if
(
sort
)
{
const
column
=
_
.
find
(
columns
,
[
'
name
'
,
sort
])
if
(
column
)
{
return
rows
.
sort
((
t1
,
t2
)
=>
{
let
sign
=
sortDirection
===
'
asc
'
?
1
:
-
1
return
sign
*
column
.
compare
(
t1
,
t2
)
})
}
}
return
rows
}
_page
(
rows
,
page
,
pageSize
)
{
return
rows
.
slice
(
page
*
pageSize
,
Math
.
min
(
rows
.
length
,
(
page
+
1
)
*
pageSize
)
)
}
getPage
()
{
getPage
()
{
const
{
page
}
=
this
.
context
.
getState
()
const
{
page
}
=
this
.
context
.
getState
()
return
page
return
page
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment