Add remove money buttons.

This commit is contained in:
James Cole committed 2026-09-30 18:48:24 +02:00
1 parent 5b71c36eb4
commit d6cdfd49a1
9 files changed
+127 -65

No files matched your search

+1
View File
@@ -70,6 +70,7 @@ return [
'never',
'account_type_loan',
'account_type_mortgage',
'account_type_Cash account',
'account_type_debt',
'withdrawal',
'i_owe_amount',
@@ -41,7 +41,14 @@ import i18next from "i18next";
import { processUploadError } from "./shared/process-upload-error.js";
import { showMessageOrRedirectUser } from "./shared/show-message-or-redirect.js";
import { addSplit } from "./shared/add-split.js";
import { clearDestinationAccount, clearSourceAccount } from "./shared/clear-fields.js";
import {
clearDestinationAccount,
clearSourceAccount,
clearCategory,
clearDescription,
clearAmount,
clearForeignAmount
} from "./shared/clear-fields.js";
import { detectTransactionType } from "./shared/detect-transaction-type.js";
import { determineAmountCurrency } from "./shared/determine-amount-currency.js";
import { loadCustomFields } from "./shared/load-custom-fields.js";
@@ -203,6 +210,10 @@ let create = function () {
removeSplit: removeSplit,
clearSourceAccount: clearSourceAccount,
clearDestinationAccount: clearDestinationAccount,
clearCategory: clearCategory,
clearDescription: clearDescription,
clearAmount: clearAmount,
clearForeignAmount: clearForeignAmount,
detectTransactionType: detectTransactionType,
determineAmountCurrency: determineAmountCurrency,
addAllAutocompleteToForm: addAllAutocompleteToForm,
@@ -238,12 +249,7 @@ let create = function () {
this.formStates.storedAttachments = true;
this.showMessageOrRedirectUser("create.js processUpload");
},
clearDescription(index) {
this.entries[index].description = "";
},
clearCategory(index) {
this.entries[index].category_name = "";
},
fillSourceAccount() {
this.fillAccount("source", "source_account");
},
@@ -21,54 +21,61 @@
import "../../boot/bootstrap.js";
import dates from "../../pages/shared/dates.js";
import Get from "../../api/model/transaction/get.js";
import { parseDownloadedSplits } from "./shared/parse-downloaded-splits.js";
import { addAllAutocompleteToForm } from "./shared/add-autocomplete.js";
import { loadCurrencies } from "./shared/load-currencies.js";
import { loadBudgets } from "./shared/load-budgets.js";
import { loadPiggyBanks } from "./shared/load-piggy-banks.js";
import { processUploadError } from "./shared/process-upload-error.js";
import { loadSubscriptions } from "./shared/load-subscriptions.js";
import {parseDownloadedSplits} from "./shared/parse-downloaded-splits.js";
import {addAllAutocompleteToForm} from "./shared/add-autocomplete.js";
import {loadCurrencies} from "./shared/load-currencies.js";
import {loadBudgets} from "./shared/load-budgets.js";
import {loadPiggyBanks} from "./shared/load-piggy-banks.js";
import {processUploadError} from "./shared/process-upload-error.js";
import {loadSubscriptions} from "./shared/load-subscriptions.js";
import i18next from "i18next";
import { defaultErrorSet } from "./shared/create-empty-split.js";
import { parseFromEntries } from "./shared/parse-from-entries.js";
import {defaultErrorSet} from "./shared/create-empty-split.js";
import {parseFromEntries} from "./shared/parse-from-entries.js";
import Put from "../../api/model/transaction/put.js";
import { showMessageOrRedirectUser } from "./shared/show-message-or-redirect.js";
import { processAttachments } from "./shared/process-attachments.js";
import {showMessageOrRedirectUser} from "./shared/show-message-or-redirect.js";
import {processAttachments} from "./shared/process-attachments.js";
import sidebar from "../shared/sidebar.js";
import { disableSplitInputs } from "./shared/disable-split-inputs.js";
import { parseTotalAmount } from "./shared/parse-total-amount.js";
import { keyUpFromCategory } from "./shared/keyup-from-category.js";
import { keyUpFromSource } from "./shared/keyup-from-source.js";
import { keyUpFromDestination } from "./shared/keyup-from-destination.js";
import { keyUpFromDescription } from "./shared/keyup-from-description.js";
import { changedAmount } from "./shared/changed-amount.js";
import { changedForeignAmount } from "./shared/changed-foreign-amount.js";
import { parseErrors } from "./shared/parse-errors.js";
import { addSplit } from "./shared/add-split.js";
import { clearDestinationAccount, clearSourceAccount } from "./shared/clear-fields.js";
import { detectTransactionType } from "./shared/detect-transaction-type.js";
import { determineAmountCurrency } from "./shared/determine-amount-currency.js";
import { loadCustomFields } from "./shared/load-custom-fields.js";
import { displayMap } from "./shared/display-map.js";
import { loadDefaultCoordinates } from "./shared/load-default-coordinates.js";
import { renderMap } from "./shared/render-map.js";
import {disableSplitInputs} from "./shared/disable-split-inputs.js";
import {parseTotalAmount} from "./shared/parse-total-amount.js";
import {keyUpFromCategory} from "./shared/keyup-from-category.js";
import {keyUpFromSource} from "./shared/keyup-from-source.js";
import {keyUpFromDestination} from "./shared/keyup-from-destination.js";
import {keyUpFromDescription} from "./shared/keyup-from-description.js";
import {changedAmount} from "./shared/changed-amount.js";
import {changedForeignAmount} from "./shared/changed-foreign-amount.js";
import {parseErrors} from "./shared/parse-errors.js";
import {addSplit} from "./shared/add-split.js";
import {
clearAmount,
clearCategory,
clearDescription,
clearForeignAmount,
clearDestinationAccount,
clearSourceAccount
} from "./shared/clear-fields.js";
import {detectTransactionType} from "./shared/detect-transaction-type.js";
import {determineAmountCurrency} from "./shared/determine-amount-currency.js";
import {loadCustomFields} from "./shared/load-custom-fields.js";
import {displayMap} from "./shared/display-map.js";
import {loadDefaultCoordinates} from "./shared/load-default-coordinates.js";
import {renderMap} from "./shared/render-map.js";
import "leaflet/dist/leaflet.css";
import { onMapClick } from "./shared/on-map-click.js";
import { onMapZoom } from "./shared/on-map-zoom.js";
import { clearLocation } from "./shared/clear-location.js";
import { removeSplit } from "./shared/remove-split.js";
import { loadTransactionLinks } from "./shared/load-transaction-links.js";
import { createLinkAutocomplete } from "./shared/create-link-autocomplete.js";
import { editLink } from "./shared/edit-link.js";
import { switchLink } from "./shared/switch-link.js";
import { removeLink } from "./shared/remove-link.js";
import { saveEditedLink } from "./shared/save-edited-link.js";
import { saveNewLink } from "./shared/save-new-link.js";
import { processTransactionLinks } from "./shared/process-transaction-links.js";
import { redirectAfterTransactionLinks } from "./shared/redirect-after-transaction-links.js";
import { addTabListener } from "./shared/add-tab-listener.js";
import { autoStep } from "./shared/auto-step.js";
import { respondToTabSwitch } from "./shared/respond-to-tab-switch.js";
import {onMapClick} from "./shared/on-map-click.js";
import {onMapZoom} from "./shared/on-map-zoom.js";
import {clearLocation} from "./shared/clear-location.js";
import {removeSplit} from "./shared/remove-split.js";
import {loadTransactionLinks} from "./shared/load-transaction-links.js";
import {createLinkAutocomplete} from "./shared/create-link-autocomplete.js";
import {editLink} from "./shared/edit-link.js";
import {switchLink} from "./shared/switch-link.js";
import {removeLink} from "./shared/remove-link.js";
import {saveEditedLink} from "./shared/save-edited-link.js";
import {saveNewLink} from "./shared/save-new-link.js";
import {processTransactionLinks} from "./shared/process-transaction-links.js";
import {redirectAfterTransactionLinks} from "./shared/redirect-after-transaction-links.js";
import {addTabListener} from "./shared/add-tab-listener.js";
import {autoStep} from "./shared/auto-step.js";
import {respondToTabSwitch} from "./shared/respond-to-tab-switch.js";
import Alpine from "@alpinejs/csp";
import focusFirstInput from "../../shared/focus-first-input.js";
import filterForeignCurrencies from "./shared/filter-foreign-currencies.js";
@@ -183,6 +190,10 @@ let transactions = function () {
addSplit: addSplit,
clearSourceAccount: clearSourceAccount,
clearDestinationAccount: clearDestinationAccount,
clearCategory: clearCategory,
clearDescription: clearDescription,
clearAmount: clearAmount,
clearForeignAmount: clearForeignAmount,
detectTransactionType: detectTransactionType,
determineAmountCurrency: determineAmountCurrency,
addAllAutocompleteToForm: addAllAutocompleteToForm,
@@ -401,7 +412,7 @@ let transactions = function () {
// submit the transaction. Multi-stage process thing going on here!
let putter = new Put();
putter
.put(submission, { id: this.groupProperties.id })
.put(submission, {id: this.groupProperties.id})
.then((response) => {
this.formStates.storedGroup = true;
const group = response.data.data;
@@ -454,7 +465,7 @@ let transactions = function () {
};
};
let comps = { transactions, sidebar, dates };
let comps = {transactions, sidebar, dates};
function loadPage() {
Object.keys(comps).forEach((comp) => {
@@ -18,9 +18,23 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export function changedAmount(e) {
const index = parseInt(e.target.dataset.index);
this.entries[index].amount = parseFloat(e.target.value);
export function changedAmount(e, givenIndex) {
let index = 0;
if (null === e) {
index = parseInt(givenIndex);
}
if (null !== e) {
index = parseInt(e.target.dataset.index);
let value = e.target.value;
// switch commas for dots.
let len = (value.match(/,/g) || []).length;
if(1 === len) {
value = value.replace(',', '.');
}
this.entries[index].amount = parseFloat(value);
}
this.groupProperties.totalAmount = 0;
for (let i in this.entries) {
if (Object.hasOwn(this.entries, i)) {
@@ -18,13 +18,20 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export function changedForeignAmount(e) {
const index = parseInt(e.target.dataset.index);
this.entries[index].foreign_amount = parseFloat(e.target.value);
//this.groupProperties.totalAmount = 0;
// for (let i in this.entries) {
// if (this.entries.hasOwnProperty(i)) {
// this.groupProperties.totalAmount = this.groupProperties.totalAmount + parseFloat(this.entries[i].amount);
// }
// }
export function changedForeignAmount(e, givenIndex) {
let index = 0;
if (null === e) {
index = parseInt(givenIndex);
}
if (null !== e) {
index = parseInt(e.target.dataset.index);
let value = e.target.value;
// switch commas for dots.
let len = (value.match(/,/g) || []).length;
if (1 === len) {
value = value.replace(',', '.');
}
this.entries[index].foreign_amount = parseFloat(value);
}
}
@@ -29,3 +29,19 @@ export function clearDestinationAccount(index) {
this.entries[index].destination_account = getAccount();
this.detectTransactionType();
}
export function clearDescription(index) {
this.entries[index].description = "";
}
export function clearAmount(index) {
this.entries[index].amount = "";
this.changedAmount(null, index);
}
export function clearForeignAmount(index) {
this.entries[index].foreign_amount = "";
this.changedForeignAmount(null, index);
}
export function clearCategory(index) {
this.entries[index].category_name = "";
};
+1
View File
@@ -2324,6 +2324,7 @@ return [
'account_type_loan' => 'Loan',
'account_type_mortgage' => 'Mortgage',
'account_type_Credit card' => 'Credit card',
'account_type_Cash account' => 'Cash account',
'credit_card_type_monthlyFull' => 'Full payment every month',
'liability_direction_credit' => 'I am owed this debt',
'liability_direction_debit' => 'I owe this debt to somebody else',
@@ -5,6 +5,7 @@
</label>
<!-- actual amount -->
<div class="col-sm-9">
<div class="input-group">
<input type="number" step="any" min="0"
:id="'amount_' + index"
:data-index="index"
@@ -13,6 +14,8 @@
@keyup.enter="save()"
@change="changedAmount"
placeholder="0.00">
<button tabindex="-1" class="btn btn-outline-secondary" type="button" @click="clearAmount(index)"><em class="bi bi-trash"></em></button>
</div>
<template x-if="transaction.errors.amount.length > 0">
<div class="invalid-feedback"
x-text="transaction.errors.amount[0]"></div>
@@ -25,6 +25,7 @@
<template x-if="groupProperties.transactionType == 'transfer'">
<label class="small form-label">{{ __('firefly.amount_destination_account') }}</label>
</template>
<div class="input-group">
<input type="number" step="any" min="0"
:id="'foreign_amount_' + index"
:data-index="index"
@@ -32,6 +33,8 @@
x-model="transaction.foreign_amount"
@change="changedForeignAmount"
placeholder="0.00">
<button tabindex="-1" class="btn btn-outline-secondary" type="button" @click="clearForeignAmount(index)"><em class="bi bi-trash"></em></button>
</div>
<template x-if="transaction.errors.foreign_amount.length > 0">
<div class="invalid-feedback" x-text="transaction.errors.foreign_amount[0]"></div>
</template>