support "Add Another" in transaction add page / dialog (#471)

This commit is contained in:
MaysWind
2026-03-02 00:54:17 +08:00
parent d2ce801277
commit 732c256db2
29 changed files with 336 additions and 63 deletions
@@ -414,11 +414,25 @@
<v-tooltip :disabled="!inputIsEmpty" :text="inputEmptyProblemMessage ? tt(inputEmptyProblemMessage) : ''">
<template v-slot:activator="{ props }">
<div v-bind="props" class="d-inline-block">
<v-btn :disabled="inputIsEmpty || loading || submitting"
v-if="mode !== TransactionEditPageMode.View" @click="save">
{{ tt(saveButtonTitle) }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="submitting"></v-progress-circular>
</v-btn>
<v-btn-group density="comfortable" v-if="mode === TransactionEditPageMode.Add || mode === TransactionEditPageMode.Edit">
<v-btn color="primary" :disabled="inputIsEmpty || loading || submitting" @click="save(AfterSaveAction.GoBack)">
{{ tt(saveButtonTitle) }}
<v-progress-circular indeterminate size="22" class="ms-2" v-if="submitting"></v-progress-circular>
</v-btn>
<v-btn color="primary" density="compact"
:disabled="inputIsEmpty || loading || submitting" :icon="true"
v-if="type === TransactionEditPageType.Transaction && mode === TransactionEditPageMode.Add">
<v-icon :icon="mdiMenuDown" size="24" />
<v-menu activator="parent">
<v-list>
<v-list-item :title="tt(TransactionQuickAddButtonActionType.SaveAndAddNewTransaction.name)"
@click="save(AfterSaveAction.StayWithNewTransaction)"></v-list-item>
<v-list-item :title="tt(TransactionQuickAddButtonActionType.SaveAndKeepCurrentData.name)"
@click="save(AfterSaveAction.StayWithCurrentTransaction)"></v-list-item>
</v-list>
</v-menu>
</v-btn>
</v-btn-group>
</div>
</template>
</v-tooltip>
@@ -474,6 +488,7 @@ import {
TransactionEditPageMode,
TransactionEditPageType,
GeoLocationStatus,
AfterSaveAction,
useTransactionEditPageBase
} from '@/views/base/transactions/TransactionEditPageBase.ts';
@@ -487,7 +502,7 @@ import { useTransactionTemplatesStore } from '@/stores/transactionTemplate.ts';
import type { Coordinate } from '@/core/coordinate.ts';
import { CategoryType } from '@/core/category.ts';
import { TransactionType, TransactionEditScopeType } from '@/core/transaction.ts';
import { TransactionType, TransactionEditScopeType, TransactionQuickAddButtonActionType } from '@/core/transaction.ts';
import { TemplateType, ScheduledTemplateFrequencyType } from '@/core/template.ts';
import { KnownErrorCode } from '@/consts/api.ts';
import { SUPPORTED_IMAGE_EXTENSIONS } from '@/consts/file.ts';
@@ -563,6 +578,7 @@ const {
clientSessionId,
loading,
submitting,
submitted,
uploadingPicture,
geoLocationStatus,
setGeoLocationByClickMap,
@@ -596,6 +612,7 @@ const {
inputIsEmpty,
createNewTransactionModel,
setTransactionModel,
updateTransactionModelByAfterSaveAction,
updateTransactionTime,
updateTransactionTimezone,
swapTransactionData,
@@ -656,6 +673,7 @@ function open(options: TransactionEditOptions): Promise<TransactionEditResponse
activeTab.value = 'basicInfo';
loading.value = true;
submitting.value = false;
submitted.value = false;
geoLocationStatus.value = null;
setGeoLocationByClickMap.value = false;
originalTransactionEditable.value = false;
@@ -791,7 +809,7 @@ function open(options: TransactionEditOptions): Promise<TransactionEditResponse
});
}
function save(): void {
function save(afterAction: AfterSaveAction): void {
const problemMessage = inputEmptyProblemMessage.value;
if (problemMessage) {
@@ -810,24 +828,31 @@ function save(): void {
clientSessionId: clientSessionId.value
}).then(() => {
submitting.value = false;
if (resolveFunc) {
if (mode.value === TransactionEditPageMode.Add) {
resolveFunc({
message: 'You have added a new transaction'
});
} else if (mode.value === TransactionEditPageMode.Edit) {
resolveFunc({
message: 'You have saved this transaction'
});
}
}
submitted.value = true;
if (mode.value === TransactionEditPageMode.Add && !noTransactionDraft.value && !addByTemplateId.value && !duplicateFromId.value) {
transactionsStore.clearTransactionDraft();
}
showState.value = false;
if (mode.value === TransactionEditPageMode.Add && (afterAction === AfterSaveAction.StayWithNewTransaction || afterAction === AfterSaveAction.StayWithCurrentTransaction)) {
snackbar.value?.showMessage('You have added a new transaction');
updateTransactionModelByAfterSaveAction(afterAction, initOptions.value);
clientSessionId.value = generateRandomUUID();
} else {
if (resolveFunc) {
if (mode.value === TransactionEditPageMode.Add) {
resolveFunc({
message: 'You have added a new transaction'
});
} else if (mode.value === TransactionEditPageMode.Edit) {
resolveFunc({
message: 'You have saved this transaction'
});
}
}
showState.value = false;
}
}).catch(error => {
submitting.value = false;
@@ -903,6 +928,7 @@ function duplicate(withTime?: boolean, withGeoLocation?: boolean): void {
editId.value = null;
duplicateFromId.value = transaction.value.id;
clientSessionId.value = generateRandomUUID();
submitted.value = false;
activeTab.value = 'basicInfo';
transaction.value.id = '';
@@ -958,7 +984,11 @@ function remove(): void {
function cancel(): void {
const doClose = function () {
if (rejectFunc) {
if (props.type === TransactionEditPageType.Transaction && mode.value === TransactionEditPageMode.Add && submitted.value && resolveFunc) {
resolveFunc({
message: 'You have added a new transaction'
});
} else if (rejectFunc) {
rejectFunc();
}