diff --git a/src/stores/transaction.js b/src/stores/transaction.js
index 8a030cdd..5e53eece 100644
--- a/src/stores/transaction.js
+++ b/src/stores/transaction.js
@@ -15,6 +15,8 @@ import { isNumber, isString } from '@/lib/common.js';
import {
getCurrentUnixTime,
getTimezoneOffsetMinutes,
+ getBrowserTimezoneOffsetMinutes,
+ getActualUnixTimeForStore,
parseDateFromUnixTime,
getShortDate,
getYear,
@@ -651,25 +653,55 @@ export const useTransactionsStore = defineStore('transactions', {
});
});
},
- saveTransaction({ transaction, defaultCurrency }) {
+ saveTransaction({ transaction, defaultCurrency, isEdit }) {
const self = this;
const settingsStore = useSettingsStore();
const exchangeRatesStore = useExchangeRatesStore();
+ const submitTransaction = {
+ type: transaction.type,
+ time: getActualUnixTimeForStore(transaction.time, transaction.utcOffset, getBrowserTimezoneOffsetMinutes()),
+ sourceAccountId: transaction.sourceAccountId,
+ sourceAmount: transaction.sourceAmount,
+ destinationAccountId: '0',
+ destinationAmount: 0,
+ hideAmount: transaction.hideAmount,
+ tagIds: transaction.tagIds,
+ comment: transaction.comment,
+ geoLocation: transaction.geoLocation,
+ utcOffset: transaction.utcOffset
+ };
+
+ if (transaction.type === transactionConstants.allTransactionTypes.Expense) {
+ submitTransaction.categoryId = transaction.expenseCategory;
+ } else if (transaction.type === transactionConstants.allTransactionTypes.Income) {
+ submitTransaction.categoryId = transaction.incomeCategory;
+ } else if (transaction.type === transactionConstants.allTransactionTypes.Transfer) {
+ submitTransaction.categoryId = transaction.transferCategory;
+ submitTransaction.destinationAccountId = transaction.destinationAccountId;
+ submitTransaction.destinationAmount = transaction.destinationAmount;
+ } else {
+ return Promise.reject('An error has occurred');
+ }
+
+ if (isEdit) {
+ submitTransaction.id = transaction.id;
+ }
+
return new Promise((resolve, reject) => {
let promise = null;
- if (!transaction.id) {
- promise = services.addTransaction(transaction);
+ if (!submitTransaction.id) {
+ promise = services.addTransaction(submitTransaction);
} else {
- promise = services.modifyTransaction(transaction);
+ promise = services.modifyTransaction(submitTransaction);
}
promise.then(response => {
const data = response.data;
if (!data || !data.success || !data.result) {
- if (!transaction.id) {
+ if (!submitTransaction.id) {
reject({ message: 'Unable to add transaction' });
} else {
reject({ message: 'Unable to save transaction' });
@@ -677,7 +709,7 @@ export const useTransactionsStore = defineStore('transactions', {
return;
}
- if (!transaction.id) {
+ if (!submitTransaction.id) {
if (!self.transactionListStateInvalid) {
self.updateTransactionListInvalidState(true);
}
@@ -710,7 +742,7 @@ export const useTransactionsStore = defineStore('transactions', {
if (error.response && error.response.data && error.response.data.errorMessage) {
reject({ error: error.response.data });
} else if (!error.processed) {
- if (!transaction.id) {
+ if (!submitTransaction.id) {
reject({ message: 'Unable to add transaction' });
} else {
reject({ message: 'Unable to save transaction' });
diff --git a/src/views/desktop/transactions/ListPage.vue b/src/views/desktop/transactions/ListPage.vue
index 00bf6f38..3fec1b8e 100644
--- a/src/views/desktop/transactions/ListPage.vue
+++ b/src/views/desktop/transactions/ListPage.vue
@@ -839,6 +839,8 @@ export default {
if (result && result.message) {
self.$refs.snackbar.showMessage(result.message);
}
+
+ self.reload(false);
}).catch(error => {
if (error) {
self.$refs.snackbar.showError(error);
@@ -855,6 +857,8 @@ export default {
if (result && result.message) {
self.$refs.snackbar.showMessage(result.message);
}
+
+ self.reload(false);
}).catch(error => {
if (error) {
self.$refs.snackbar.showError(error);
diff --git a/src/views/desktop/transactions/list/dialogs/EditDialog.vue b/src/views/desktop/transactions/list/dialogs/EditDialog.vue
index 9298a27d..97ab911a 100644
--- a/src/views/desktop/transactions/list/dialogs/EditDialog.vue
+++ b/src/views/desktop/transactions/list/dialogs/EditDialog.vue
@@ -278,8 +278,17 @@
{{ $t(saveButtonTitle) }}
- {{ $t(cancelButtonTitle) }}
+ {{ $t('Duplicate') }}
+ {{ $t('Edit') }}
+
+ {{ $t('Delete') }}
+
+
+ {{ $t(cancelButtonTitle) }}
@@ -303,10 +312,9 @@ import categoryConstants from '@/consts/category.js';
import transactionConstants from '@/consts/transaction.js';
import logger from '@/lib/logger.js';
import {
- getNameByKeyValue
-} from '@/lib/common.js';
-import {
- getUtcOffsetByUtcOffsetMinutes
+ getUtcOffsetByUtcOffsetMinutes,
+ getTimezoneOffsetMinutes,
+ getCurrentUnixTime
} from '@/lib/datetime.js';
import {
getFirstAvailableCategoryId
@@ -619,7 +627,82 @@ export default {
return;
}
+ const doSubmit = function () {
+ self.submitting = true;
+ self.transactionsStore.saveTransaction({
+ transaction: self.transaction,
+ defaultCurrency: self.defaultCurrency,
+ isEdit: self.mode === 'edit'
+ }).then(() => {
+ self.submitting = false;
+
+ if (self.resolve) {
+ if (self.mode === 'add') {
+ self.resolve({
+ message: 'You have added a new transaction'
+ });
+ } else if (self.mode === 'edit') {
+ self.resolve({
+ message: 'You have saved this transaction'
+ });
+ }
+ }
+
+ self.showState = false;
+ }).catch(error => {
+ self.submitting = false;
+
+ if (!error.processed) {
+ self.$refs.snackbar.showError(error);
+ }
+ });
+ };
+
+ if (self.transaction.sourceAmount === 0) {
+ self.$refs.confirmDialog.open('Are you sure you want to save this transaction whose amount is 0?').then(() => {
+ doSubmit();
+ });
+ } else {
+ doSubmit();
+ }
+ },
+ duplicate() {
+ this.editTransactionId = null;
+ this.transaction.id = null;
+ this.transaction.time = getCurrentUnixTime();
+ this.transaction.timeZone = this.settingsStore.appSettings.timeZone;
+ this.transaction.utcOffset = getTimezoneOffsetMinutes(this.transaction.timeZone);
+ this.transaction.geoLocation = null;
+ this.mode = 'add';
+ },
+ edit() {
+ this.mode = 'edit';
+ },
+ remove() {
+ const self = this;
+
+ self.$refs.confirmDialog.open('Are you sure you want to delete this transaction?').then(() => {
+ self.submitting = true;
+
+ self.transactionsStore.deleteTransaction({
+ transaction: self.transaction,
+ defaultCurrency: self.defaultCurrency
+ }).then(() => {
+ if (self.resolve) {
+ self.resolve();
+ }
+
+ self.submitting = false;
+ self.showState = false;
+ }).catch(error => {
+ self.submitting = false;
+
+ if (!error.processed) {
+ self.$refs.snackbar.showError(error);
+ }
+ });
+ });
},
cancel() {
if (this.reject) {
@@ -676,9 +759,6 @@ export default {
this.geoLocationStatus = null;
this.transaction.geoLocation = null;
},
- getAccountNameByKeyValue(src, value, keyField, nameField, defaultName) {
- return getNameByKeyValue(this.allAccounts, src, value, keyField, nameField, defaultName);
- },
setTransaction(transaction, options, setContextData) {
setTransactionModelByTransaction(
this.transaction,
diff --git a/src/views/mobile/transactions/EditPage.vue b/src/views/mobile/transactions/EditPage.vue
index dfe0c675..9d7a793f 100644
--- a/src/views/mobile/transactions/EditPage.vue
+++ b/src/views/mobile/transactions/EditPage.vue
@@ -674,44 +674,14 @@ export default {
return;
}
- const submitTransaction = {
- type: self.transaction.type,
- time: getActualUnixTimeForStore(self.transaction.time, self.transaction.utcOffset, getBrowserTimezoneOffsetMinutes()),
- sourceAccountId: self.transaction.sourceAccountId,
- sourceAmount: self.transaction.sourceAmount,
- destinationAccountId: '0',
- destinationAmount: 0,
- hideAmount: self.transaction.hideAmount,
- tagIds: self.transaction.tagIds,
- comment: self.transaction.comment,
- geoLocation: self.transaction.geoLocation,
- utcOffset: self.transaction.utcOffset
- };
-
- if (self.transaction.type === self.allTransactionTypes.Expense) {
- submitTransaction.categoryId = self.transaction.expenseCategory;
- } else if (self.transaction.type === self.allTransactionTypes.Income) {
- submitTransaction.categoryId = self.transaction.incomeCategory;
- } else if (self.transaction.type === self.allTransactionTypes.Transfer) {
- submitTransaction.categoryId = self.transaction.transferCategory;
- submitTransaction.destinationAccountId = self.transaction.destinationAccountId;
- submitTransaction.destinationAmount = self.transaction.destinationAmount;
- } else {
- self.$toast('An error has occurred');
- return;
- }
-
- if (self.mode === 'edit') {
- submitTransaction.id = self.transaction.id;
- }
-
const doSubmit = function () {
self.submitting = true;
self.$showLoading(() => self.submitting);
self.transactionsStore.saveTransaction({
- transaction: submitTransaction,
- defaultCurrency: self.defaultCurrency
+ transaction: self.transaction,
+ defaultCurrency: self.defaultCurrency,
+ isEdit: self.mode === 'edit'
}).then(() => {
self.submitting = false;
self.$hideLoading();
@@ -733,7 +703,7 @@ export default {
});
};
- if (submitTransaction.sourceAmount === 0) {
+ if (self.transaction.sourceAmount === 0) {
self.$confirm('Are you sure you want to save this transaction whose amount is 0?', () => {
doSubmit();
});