frontend/.pnpm-store/v3/files/8a/d66fd39cd613052348ebff589d9b8e01c77fd79862001ed1d03ed2244acb544a0f200e698d79fa85aae686253bc5b2cee539492f9dbe196106fc9bcc0ec5c5

110 lines
3.7 KiB
Plaintext

export default class Rows {
rawRows;
triggerChange;
sorted;
constructor(context) {
this.rawRows = context.rawRows;
this.triggerChange = context.triggerChange;
this.sorted = context.sorted;
}
sort(orderBy) {
if (!orderBy)
return;
const sorted = this.getSorted();
const parsed = this.parse(orderBy);
if (sorted.identifier !== parsed.identifier) {
this.sorted.update(store => store.direction = null);
}
if (sorted.direction === null || sorted.direction === 'desc') {
this.sortAsc(orderBy);
}
else if (sorted.direction === 'asc') {
this.sortDesc(orderBy);
}
}
sortAsc(orderBy) {
const parsed = this.parse(orderBy);
this.sorted.set({ identifier: parsed.identifier, direction: 'asc', fn: parsed.fn });
this.rawRows.update(store => {
try {
store.sort((a, b) => {
if (typeof (parsed.fn(b)) === "boolean") {
return parsed.fn(a) ? -1 : 1;
}
else if (!parsed.fn(b))
return 1;
else if (!parsed.fn(a))
return -1;
else {
return parsed.fn(a).localeCompare(parsed.fn(b));
}
});
return store;
}
catch (e) {
return store.sort((a, b) => parseFloat(parsed.fn(a)) - parseFloat(parsed.fn(b)));
}
});
this.triggerChange.update(store => { return store + 1; });
}
sortDesc(orderBy) {
const parsed = this.parse(orderBy);
this.sorted.set({ identifier: parsed.identifier, direction: 'desc', fn: parsed.fn });
this.rawRows.update(store => {
try {
store.sort((a, b) => {
if (typeof (parsed.fn(b)) === "boolean") {
return parsed.fn(a) ? 1 : -1;
}
else if (!parsed.fn(a))
return 1;
else if (!parsed.fn(b))
return -1;
else {
return parsed.fn(b).localeCompare(parsed.fn(a));
}
});
return store;
}
catch (e) {
return store.sort((a, b) => parseFloat(parsed.fn(b)) - parseFloat(parsed.fn(a)));
}
});
this.triggerChange.update(store => { return store + 1; });
}
applySorting(params = null) {
if (params) {
switch (params.direction) {
case 'asc': return this.sortAsc(params.orderBy);
case 'desc': return this.sortDesc(params.orderBy);
default: return this.sort(params.orderBy);
}
}
const sorted = this.getSorted();
if (sorted.identifier) {
return this.applySorting({
orderBy: sorted.fn,
direction: sorted.direction
});
}
return;
}
parse(orderBy) {
if (typeof (orderBy) === 'string') {
return {
fn: (row) => row[orderBy],
identifier: orderBy.toString()
};
}
return {
fn: orderBy,
identifier: orderBy.toString()
};
}
getSorted() {
let $sorted;
this.sorted.subscribe(store => $sorted = store);
return $sorted;
}
}