127.0.0.1:8000 budget / master src / js / pages / incomes.js
master

Tree @master (Download .tar.gz)

incomes.js @masterraw · history · blame

const $ = require('jquery');
const api = require('../utils/api');
const utils = require('../utils');
const chart = require('./chart_and_messages');
const list_row = require('../ui/list_row');
const ui = require('../ui/common');
const modal = require('../utils/modal');

api.on_submit("/budget/balance", [
    $("#set-balance")
], {
    value: x => Math.abs(utils.round(parseFloat(x), 2))
}, [
    ["value", "Contribution value must be provided"], // value=0 will be accounted for here
    ["value", "Contribution value must be a number", value => !isNaN(value)],
], async function() {
    await chart.refresh();
});

api.on_submit('/budget/income', [
    $("#create-income"), $("#edit-income")
], {
    value: x => Math.abs(utils.round(parseFloat(x), 2)),
    date: x => parseInt(x),
    month: x => parseInt(x)
}, [
    ["name", "Recurring income must have a name"],
    ["value", "Income value must be provided"], // value=0 will be accounted for here
    ["value", "Income value must be a number", value => !isNaN(value)],
    ["date", "Invalid date", utils.validate.date],
    ["month", "invalid month", utils.validate.month]
], async function() {
    modal.close();
    await chart.refresh();
    await populate_incomes_table();
});

$("#delete-income").on("click", async function() {
    const id = $("#edit-income").find('[name="id"]').val();
    await api.delete('/budget/income/' + id);
    ui.show_banner({
        message: `Income ${id} deleted`
    });
    modal.close();
    await chart.refresh();
    await populate_incomes_table();
});

const month_fields = ui.get_inputs(["#create-income", "#edit-income"], "month").map(ui.generate_month_options);
const date_fields = ui.get_inputs(["#create-income", "#edit-income"], "date");
date_fields.forEach(function($date_field) {
    month_fields.forEach(function($month_field) {
        $month_field.on('click', function() {
            ui.generate_date_options($date_field, $month_field.val());
        });
    });
    ui.generate_date_options($date_field);
});

populate_incomes_table();

async function populate_incomes_table() {
    $("#incomes-list").empty();
    const {
        incomes
    } = await api.get("/budget/incomes");
    for (const income of incomes) {
        list_row.create("incomes", {
            title: `${income.name}:`,
            text: `$${income.value} ${utils.get_recurring_text(income.month)} ${utils.format_date(income.date)}`
        }, function() {
            ui.prefill_inputs("#edit-income", income);
            modal.create('edit-income-modal');
        });
    }
}