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

Tree @master (Download .tar.gz)

accounts.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');

// We don't want to hit the API any time we are loading new data
let cached_accounts = {};

api.on_submit("/budget/account", [
    $("#create-account"), $("#edit-account")
], {
    value: x => Math.abs(utils.round(parseFloat(x), 2))
}, [
    ["balance", "Account balance must be a number", value => !isNaN(value)],
], async function () {
    await chart.refresh();
});

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

populate_accounts_table().then(populate_account_balance_transfers_table);

async function populate_accounts_table() {
    $("#accounts-list").empty();
    const {
        accounts
    } = await api.get("/budget/accounts");
    for (const account of accounts) {
        cached_accounts[account.id] = {
            name: account.name,
        };

        list_row.create("accounts", {
            title: `${account.name}:`,
            text: `Current Balance $${account.balance.toFixed(2)}`
        }).on('click', function () {
            ui.prefill_inputs("#edit-account", account);
            modal.create('edit-account-modal');
        });
    }
}

async function populate_account_balance_transfers_table() {
    $("#account-balance-transfers-list").empty();
    const {
        transfers
    } = await api.get("/budget/accounts/transfers");

    for (const transfer of transfers) {
        const icon = transfer.from_account ? 'arrow-right' : (transfer.value < 0 ? 'arrow-down' : 'arrow-up');
        let text = `$${Math.abs(transfer.value).toFixed(2)} `
        if (transfer.from_account) {
            text += `from ${cached_accounts[transfer.from_account].name} to ${cached_accounts[transfer.account].name}`;
        } else {
            text += `${transfer.value < 0 ? 'Out of' : 'Into'} ${cached_accounts[transfer.account].name}`
        }
        text += ` on ${transfer.date}`;
        list_row.create("account-balance-transfers", {
            icon,
            text
        });
    }
}