Verified Commit a92ec505 authored by Jakob Moser's avatar Jakob Moser
Browse files

Add Todo model (outfactoring common code with Agenda model into TaskList model)

parent bcc2f83f
Loading
Loading
Loading
Loading
Loading
+8 −51
Changes for portal/static/js/model/Agenda.mjs: 8 added lines, 51 removed lines.
Original line number Diff line number Diff line
import { getKey } from "../account.mjs"

export class Agenda {
    items
    message = "Wird geladen..."

    get url() {
        return "/api/v0/agendas/-/items"
    }

    get #headers() {
        return getKey() ? { Authorization: `Bearer ${getKey().secret}` } : {}
    }

    get changes() {
        return this.items.filter(it => it.taiga && it.taiga.status !== 42)
    }

    async fetch(force) {
        if (this.items && !force) return

        try {
            this.items = await m.request({
                method: "GET",
                url: this.url,
                headers: this.#headers,
            })
        } catch (e) {
            if (e.code === 401) {
                this.message =
                    "Melde dich an Portal an, um die Tagesordnung anzuzeigen."
            } else {
                this.message = "Die Tagesordnung konnte nicht geladen werden."
            }
        }
    }

    async save() {
        try {
            if (this.changes.length === 0) return

            this.items = await m.request({
                method: "PATCH",
                url: this.url,
                headers: this.#headers,
                body: this.changes,
import { TaskList } from "./TaskList.mjs"

class Agenda extends TaskList {
    constructor() {
        super("/api/v0/agendas/-/items", 42, {
            unauthorized:
                "Melde dich an Portal an, um die Tagesordnung anzuzeigen.",
            error: "Die Tagesordnung konnte nicht geladen werden.",
        })
        } catch (e) {
            // TODO Handle error better
            alert("Beim Speichern ist ein Fehler aufgetreten.")
            throw e
        }
    }
}

+58 −0
Changes for portal/static/js/model/TaskList.mjs: 58 added lines, 0 removed lines.
Original line number Diff line number Diff line
import { getKey } from "../account.mjs"

export class TaskList {
    items
    message = "Wird geladen..."

    constructor(url, status, messages) {
        this.url = url
        this.status = status
        this.unauthorizedMessage = messages.unauthorized
        this.errorMessage = messages.error
    }

    get #headers() {
        return getKey() ? { Authorization: `Bearer ${getKey().secret}` } : {}
    }

    get changes() {
        return (this.items ?? []).filter(
            it => it.taiga && it.taiga.status !== this.status,
        )
    }

    async fetch(force) {
        if (this.items && !force) return

        try {
            this.items = await m.request({
                method: "GET",
                url: this.url,
                headers: this.#headers,
            })
        } catch (e) {
            if (e.code === 401) {
                this.message = this.unauthorizedMessage
            } else {
                this.message = this.errorMessage
            }
        }
    }

    async save() {
        if (this.changes.length === 0) return

        try {
            this.items = await m.request({
                method: "PATCH",
                url: this.url,
                headers: this.#headers,
                body: this.changes,
            })
        } catch (e) {
            // TODO Handle error better
            alert("Beim Speichern ist ein Fehler aufgetreten.")
            throw e
        }
    }
}
+13 −0
Changes for portal/static/js/model/Todo.mjs: 13 added lines, 0 removed lines.
Original line number Diff line number Diff line
import { TaskList } from "./TaskList.mjs"

class Todo extends TaskList {
    constructor() {
        super("/api/v0/todos/-/items", 41, {
            unauthorized: "Melde dich an Portal an, um die Todos anzuzeigen.",
            error: "Die Todos konnten nicht geladen werden.",
        })
    }
}

// Singleton
export const todo = new Todo()