Skip to content
Snippets Groups Projects
Unverified Commit 822b3f38 authored by Niklas Mohrin's avatar Niklas Mohrin
Browse files

`npx prettier --write src`

parent cd600cc4
Branches
No related tags found
No related merge requests found
// 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) {
......
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() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment