Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
EvaP
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
CourseEval
EvaP
Commits
822b3f38
Unverified
Commit
822b3f38
authored
Nov 15, 2021
by
Niklas Mohrin
Browse files
Options
Downloads
Patches
Plain Diff
`npx prettier --write src`
parent
cd600cc4
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
evap/static/ts/src/csrf-utils.ts
+3
-2
3 additions, 2 deletions
evap/static/ts/src/csrf-utils.ts
evap/static/ts/src/datagrid.ts
+65
-52
65 additions, 52 deletions
evap/static/ts/src/datagrid.ts
with
68 additions
and
54 deletions
evap/static/ts/src/csrf-utils.ts
+
3
−
2
View file @
822b3f38
// based on: https://docs.djangoproject.com/en/3.1/ref/csrf/#ajax
function
getCookie
(
name
:
string
):
string
|
null
{
if
(
document
.
cookie
!==
""
)
{
const
cookie
=
document
.
cookie
.
split
(
"
;
"
)
const
cookie
=
document
.
cookie
.
split
(
"
;
"
)
.
map
(
cookie
=>
cookie
.
trim
())
.
find
(
cookie
=>
cookie
.
substring
(
0
,
name
.
length
+
1
)
===
`
${
name
}
=`
);
if
(
cookie
)
{
...
...
This diff is collapsed.
Click to expand it.
evap/static/ts/src/datagrid.ts
+
65
−
52
View file @
822b3f38
declare
const
Sortable
:
typeof
import
(
"
sortablejs
"
);
interface
Row
{
element
:
HTMLElement
,
searchWords
:
string
[]
,
filterValues
:
Map
<
string
,
string
[]
>
,
orderValues
:
Map
<
string
,
string
|
number
>
,
isDisplayed
:
boolean
,
element
:
HTMLElement
;
searchWords
:
string
[]
;
filterValues
:
Map
<
string
,
string
[]
>
;
orderValues
:
Map
<
string
,
string
|
number
>
;
isDisplayed
:
boolean
;
}
interface
State
{
search
:
string
,
filter
:
Map
<
string
,
string
[]
>
,
order
:
[
string
,
"
asc
"
|
"
desc
"
][]
,
search
:
string
;
filter
:
Map
<
string
,
string
[]
>
;
order
:
[
string
,
"
asc
"
|
"
desc
"
][]
;
}
interface
BaseParameters
{
storageKey
:
string
,
searchInput
:
HTMLInputElement
,
storageKey
:
string
;
searchInput
:
HTMLInputElement
;
}
interface
DataGridParameters
extends
BaseParameters
{
head
:
HTMLElement
,
container
:
HTMLElement
head
:
HTMLElement
;
container
:
HTMLElement
;
}
abstract
class
DataGrid
{
...
...
@@ -83,9 +83,12 @@ abstract class DataGrid {
private
static
NUMBER_REGEX
=
/^
[
+-
]?\d
+
(?:[
.,
]\d
*
)?
$/
;
private
fetchRows
():
Row
[]
{
let
rows
=
[...
this
.
container
.
children
].
map
(
row
=>
row
as
HTMLElement
).
map
(
row
=>
{
const
searchWords
=
this
.
findSearchableCells
(
row
)
.
flatMap
(
element
=>
DataGrid
.
searchWordsOf
(
element
.
textContent
!
));
let
rows
=
[...
this
.
container
.
children
]
.
map
(
row
=>
row
as
HTMLElement
)
.
map
(
row
=>
{
const
searchWords
=
this
.
findSearchableCells
(
row
).
flatMap
(
element
=>
DataGrid
.
searchWordsOf
(
element
.
textContent
!
),
);
return
{
element
:
row
,
searchWords
,
...
...
@@ -100,7 +103,7 @@ abstract class DataGrid {
rows
.
forEach
(
row
=>
{
const
numberString
=
(
row
.
orderValues
.
get
(
column
)
as
string
).
replace
(
"
,
"
,
"
.
"
);
row
.
orderValues
.
set
(
column
,
parseFloat
(
numberString
));
})
})
;
}
}
return
rows
;
...
...
@@ -173,9 +176,7 @@ abstract class DataGrid {
// Reflects changes to the rows to the DOM
protected
renderToDOM
()
{
[...
this
.
container
.
children
].
map
(
element
=>
element
as
HTMLElement
).
forEach
(
element
=>
element
.
remove
());
const
elements
=
this
.
rows
.
filter
(
row
=>
row
.
isDisplayed
)
.
map
(
row
=>
row
.
element
);
const
elements
=
this
.
rows
.
filter
(
row
=>
row
.
isDisplayed
).
map
(
row
=>
row
.
element
);
this
.
container
.
append
(...
elements
);
this
.
saveStateToStorage
();
}
...
...
@@ -206,8 +207,8 @@ abstract class DataGrid {
}
interface
TableGridParameters
extends
BaseParameters
{
table
:
HTMLTableElement
,
resetSearch
:
HTMLButtonElement
,
table
:
HTMLTableElement
;
resetSearch
:
HTMLButtonElement
;
}
// Table based data grid which uses its head and body
...
...
@@ -252,7 +253,7 @@ export class TableGrid extends DataGrid {
}
interface
EvaluationGridParameters
extends
TableGridParameters
{
filterButtons
:
HTMLButtonElement
[]
,
filterButtons
:
HTMLButtonElement
[]
;
}
export
class
EvaluationGrid
extends
TableGrid
{
...
...
@@ -295,8 +296,9 @@ export class EvaluationGrid extends TableGrid {
}
protected
fetchRowFilterValues
(
row
:
HTMLElement
):
Map
<
string
,
string
[]
>
{
const
evaluationState
=
[...
row
.
querySelectorAll
<
HTMLElement
>
(
"
[data-filter]
"
)]
.
map
(
element
=>
element
.
dataset
.
filter
!
);
const
evaluationState
=
[...
row
.
querySelectorAll
<
HTMLElement
>
(
"
[data-filter]
"
)].
map
(
element
=>
element
.
dataset
.
filter
!
,
);
return
new
Map
([[
"
evaluationState
"
,
evaluationState
]]);
}
...
...
@@ -315,7 +317,7 @@ export class EvaluationGrid extends TableGrid {
}
interface
QuestionnaireParameters
extends
TableGridParameters
{
updateUrl
:
string
,
updateUrl
:
string
;
}
export
class
QuestionnaireGrid
extends
TableGrid
{
...
...
@@ -338,35 +340,41 @@ export class QuestionnaireGrid extends TableGrid {
}
const
questionnaireIndices
=
this
.
rows
.
map
((
row
,
index
)
=>
[
$
(
row
.
element
).
data
(
"
id
"
),
index
]);
$
.
post
(
this
.
updateUrl
,
Object
.
fromEntries
(
questionnaireIndices
));
}
}
,
});
}
private
reorderRow
(
oldPosition
:
number
,
newPosition
:
number
)
{
const
displayedRows
=
this
.
rows
.
map
((
row
,
index
)
=>
({
row
,
index
}))
.
filter
(({
row
})
=>
row
.
isDisplayed
);
const
displayedRows
=
this
.
rows
.
map
((
row
,
index
)
=>
({
row
,
index
})).
filter
(({
row
})
=>
row
.
isDisplayed
);
this
.
rows
.
splice
(
displayedRows
[
oldPosition
].
index
,
1
);
this
.
rows
.
splice
(
displayedRows
[
newPosition
].
index
,
0
,
displayedRows
[
oldPosition
].
row
);
}
}
interface
ResultGridParameters
extends
DataGridParameters
{
filterCheckboxes
:
Map
<
string
,
{
selector
:
string
,
checkboxes
:
HTMLInputElement
[]}
>
,
sortColumnSelect
:
HTMLSelectElement
,
sortOrderCheckboxes
:
HTMLInputElement
[]
,
resetFilter
:
HTMLButtonElement
,
resetOrder
:
HTMLButtonElement
,
filterCheckboxes
:
Map
<
string
,
{
selector
:
string
;
checkboxes
:
HTMLInputElement
[]
}
>
;
sortColumnSelect
:
HTMLSelectElement
;
sortOrderCheckboxes
:
HTMLInputElement
[]
;
resetFilter
:
HTMLButtonElement
;
resetOrder
:
HTMLButtonElement
;
}
// Grid based data grid which has its container separated from its header
export
class
ResultGrid
extends
DataGrid
{
private
readonly
filterCheckboxes
:
Map
<
string
,
{
selector
:
string
,
checkboxes
:
HTMLInputElement
[]}
>
;
private
readonly
filterCheckboxes
:
Map
<
string
,
{
selector
:
string
;
checkboxes
:
HTMLInputElement
[]
}
>
;
private
sortColumnSelect
:
HTMLSelectElement
;
private
sortOrderCheckboxes
:
HTMLInputElement
[];
private
resetFilter
:
HTMLButtonElement
;
private
resetOrder
:
HTMLButtonElement
;
constructor
({
filterCheckboxes
,
sortColumnSelect
,
sortOrderCheckboxes
,
resetFilter
,
resetOrder
,
...
options
}:
ResultGridParameters
)
{
constructor
({
filterCheckboxes
,
sortColumnSelect
,
sortOrderCheckboxes
,
resetFilter
,
resetOrder
,
...
options
}:
ResultGridParameters
)
{
super
(
options
);
this
.
filterCheckboxes
=
filterCheckboxes
;
this
.
sortColumnSelect
=
sortColumnSelect
;
...
...
@@ -413,14 +421,16 @@ export class ResultGrid extends DataGrid {
const
order
=
this
.
sortOrderCheckboxes
.
find
(
checkbox
=>
checkbox
.
checked
)
!
.
value
;
if
(
order
===
"
asc
"
||
order
===
"
desc
"
)
{
if
(
column
===
"
name-semester
"
)
{
this
.
sort
([[
"
name
"
,
order
],
[
"
semester
"
,
order
]]);
this
.
sort
([
[
"
name
"
,
order
],
[
"
semester
"
,
order
],
]);
}
else
{
this
.
sort
([[
column
,
order
]]);
}
}
}
protected
findSearchableCells
(
row
:
HTMLElement
):
HTMLElement
[]
{
return
[...
row
.
querySelectorAll
<
HTMLElement
>
(
"
.evaluation-name, [data-col=responsible]
"
)];
}
...
...
@@ -438,7 +448,10 @@ export class ResultGrid extends DataGrid {
}
protected
get
defaultOrder
():
[
string
,
"
asc
"
|
"
desc
"
][]
{
return
[[
"
name
"
,
"
asc
"
],
[
"
semester
"
,
"
asc
"
]];
return
[
[
"
name
"
,
"
asc
"
],
[
"
semester
"
,
"
asc
"
],
];
}
protected
reflectFilterStateOnInputs
()
{
...
...
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
sign in
to comment