Merge pull request #3583 from gradido/ui_success_message_creation_like_transfer

feat(frontend): success message on create contribution like on send
This commit is contained in:
einhornimmond 2025-12-02 06:37:26 +01:00 committed by GitHub
commit bc2923b520
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 54 additions and 28 deletions

View File

@ -1,15 +1,28 @@
<template> <template>
<transition name="fade-out" @after-leave="resetForm"> <div>
<div v-if="showForm"> <div v-if="showForm">
<contribution-form <contribution-form
v-if="maxForMonths" v-if="maxForMonths"
:model-value="form" :model-value="form"
:max-gdd-last-month="parseFloat(maxForMonths.openCreations[1].amount)" :max-gdd-last-month="maxGddLastMonth"
:max-gdd-this-month="parseFloat(maxForMonths.openCreations[2].amount)" :max-gdd-this-month="maxGddThisMonth"
:success-message="$t('contribution.submitted')"
@upsert-contribution="handleCreateContribution" @upsert-contribution="handleCreateContribution"
/> />
</div> </div>
</transition> <div v-else>
<open-creations-amount
:minimal-date="minimalDate"
:max-gdd-last-month="maxGddLastMonth"
:max-gdd-this-month="maxGddThisMonth"
/>
<div class="mb-3"></div>
<success-message
:message="$t('contribution.submitted')"
@on-back="showForm = true"
></success-message>
</div>
</div>
</template> </template>
<script setup> <script setup>
@ -18,11 +31,12 @@ import { GDD_PER_HOUR } from '@/constants'
import { useQuery, useMutation } from '@vue/apollo-composable' import { useQuery, useMutation } from '@vue/apollo-composable'
import { openCreationsAmounts, createContribution } from '@/graphql/contributions.graphql' import { openCreationsAmounts, createContribution } from '@/graphql/contributions.graphql'
import { useAppToast } from '@/composables/useToast' import { useAppToast } from '@/composables/useToast'
import { useI18n } from 'vue-i18n' import { computed, ref } from 'vue'
import { ref } from 'vue' import SuccessMessage from '@/components/SuccessMessage.vue'
import OpenCreationsAmount from '@/components/Contributions/OpenCreationsAmount.vue'
import { useMinimalContributionDate } from '@/composables/useMinimalContributionDate'
const { toastError, toastSuccess } = useAppToast() const { toastError } = useAppToast()
const { t } = useI18n()
const { result: maxForMonths, refetch } = useQuery( const { result: maxForMonths, refetch } = useQuery(
openCreationsAmounts, openCreationsAmounts,
@ -34,6 +48,10 @@ const { mutate: createContributionMutation } = useMutation(createContribution)
const form = ref(emptyForm()) const form = ref(emptyForm())
const showForm = ref(true) const showForm = ref(true)
const maxGddLastMonth = computed(() => parseFloat(maxForMonths.value?.openCreations[1].amount))
const maxGddThisMonth = computed(() => parseFloat(maxForMonths.value?.openCreations[2].amount))
const minimalDate = computed(() => useMinimalContributionDate(new Date()))
function emptyForm() { function emptyForm() {
return { return {
contributionDate: undefined, contributionDate: undefined,
@ -45,18 +63,14 @@ function emptyForm() {
async function handleCreateContribution(contribution) { async function handleCreateContribution(contribution) {
try { try {
form.value = emptyForm()
await createContributionMutation({ ...contribution }) await createContributionMutation({ ...contribution })
toastSuccess(t('contribution.submitted')) await refetch()
showForm.value = false showForm.value = false
} catch (err) { } catch (err) {
toastError(err.message) toastError(err.message)
} }
} }
function resetForm() {
refetch()
showForm.value = true
}
</script> </script>
<style scoped> <style scoped>
.fade-out-enter-active, .fade-out-enter-active,

View File

@ -95,6 +95,7 @@ import LabeledInput from '@/components/Inputs/LabeledInput'
import OpenCreationsAmount from './OpenCreationsAmount.vue' import OpenCreationsAmount from './OpenCreationsAmount.vue'
import { object, date as dateSchema, number, string } from 'yup' import { object, date as dateSchema, number, string } from 'yup'
import { GDD_PER_HOUR } from '../../constants' import { GDD_PER_HOUR } from '../../constants'
import { useMinimalContributionDate } from '@/composables/useMinimalContributionDate'
const amountToHours = (amount) => parseFloat(amount / GDD_PER_HOUR).toFixed(2) const amountToHours = (amount) => parseFloat(amount / GDD_PER_HOUR).toFixed(2)
const hoursToAmount = (hours) => parseFloat(hours * GDD_PER_HOUR).toFixed(2) const hoursToAmount = (hours) => parseFloat(hours * GDD_PER_HOUR).toFixed(2)
@ -103,6 +104,7 @@ const props = defineProps({
modelValue: { type: Object, required: true }, modelValue: { type: Object, required: true },
maxGddLastMonth: { type: Number, required: true }, maxGddLastMonth: { type: Number, required: true },
maxGddThisMonth: { type: Number, required: true }, maxGddThisMonth: { type: Number, required: true },
successMessage: { type: String, required: true },
}) })
const emit = defineEmits(['upsert-contribution', 'abort']) const emit = defineEmits(['upsert-contribution', 'abort'])
@ -125,6 +127,7 @@ const form = reactive({ ...entityDataToForm.value })
const now = ref(new Date()) // checked every minute, updated if day, month or year changed const now = ref(new Date()) // checked every minute, updated if day, month or year changed
const disableSmartValidState = ref(false) const disableSmartValidState = ref(false)
const minimalDate = computed(() => useMinimalContributionDate(now.value))
const isThisMonth = computed(() => { const isThisMonth = computed(() => {
const formContributionDate = new Date(form.contributionDate) const formContributionDate = new Date(form.contributionDate)
return ( return (
@ -133,12 +136,6 @@ const isThisMonth = computed(() => {
) )
}) })
const minimalDate = computed(() => {
const minimalDate = new Date(now.value)
minimalDate.setMonth(now.value.getMonth() - 1, 1)
return minimalDate
})
// reactive validation schema, because some boundaries depend on form input and existing data // reactive validation schema, because some boundaries depend on form input and existing data
const validationSchema = computed(() => { const validationSchema = computed(() => {
const maxAmounts = Number( const maxAmounts = Number(

View File

@ -1,9 +1,9 @@
<template> <template>
<div class="bg-white app-box-shadow gradido-border-radius p-3"> <div class="bg-white app-box-shadow gradido-border-radius p-3">
<div class="p-4" data-test="send-transaction-success-text"> <div class="p-4" data-test="success-message">
{{ $t('form.thx') }} {{ $t('form.thx') }}
<hr /> <hr />
{{ $t('form.send_transaction_success') }} {{ message }}
</div> </div>
<div class="text-center mt-5"> <div class="text-center mt-5">
<BButton variant="primary" @click="$emit('on-back')"> <BButton variant="primary" @click="$emit('on-back')">
@ -12,8 +12,15 @@
</div> </div>
</div> </div>
</template> </template>
<script> <script setup>
export default { import { defineProps, defineEmits } from 'vue'
name: 'TransactionResultSendSuccess',
} defineProps({
message: {
type: String,
default: '',
},
})
defineEmits(['on-back'])
</script> </script>

View File

@ -0,0 +1,5 @@
export function useMinimalContributionDate(now) {
const minimalDate = new Date(now)
minimalDate.setMonth(now.getMonth() - 1, 1)
return minimalDate
}

View File

@ -28,7 +28,10 @@
></transaction-confirmation-link> ></transaction-confirmation-link>
</template> </template>
<template #transactionResultSendSuccess> <template #transactionResultSendSuccess>
<transaction-result-send-success @on-back="onBack"></transaction-result-send-success> <success-message
:message="$t('form.send_transaction_success')"
@on-back="onBack"
></success-message>
</template> </template>
<template #transactionResultSendError> <template #transactionResultSendError>
<transaction-result-send-error <transaction-result-send-error
@ -58,7 +61,7 @@ import GddSend, { TRANSACTION_STEPS } from '@/components/GddSend'
import TransactionForm from '@/components/GddSend/TransactionForm' import TransactionForm from '@/components/GddSend/TransactionForm'
import TransactionConfirmationSend from '@/components/GddSend/TransactionConfirmationSend' import TransactionConfirmationSend from '@/components/GddSend/TransactionConfirmationSend'
import TransactionConfirmationLink from '@/components/GddSend/TransactionConfirmationLink' import TransactionConfirmationLink from '@/components/GddSend/TransactionConfirmationLink'
import TransactionResultSendSuccess from '@/components/GddSend/TransactionResultSendSuccess' import SuccessMessage from '@/components/SuccessMessage'
import TransactionResultSendError from '@/components/GddSend/TransactionResultSendError' import TransactionResultSendError from '@/components/GddSend/TransactionResultSendError'
import TransactionResultLink from '@/components/GddSend/TransactionResultLink' import TransactionResultLink from '@/components/GddSend/TransactionResultLink'
import { sendCoins, createTransactionLink } from '@/graphql/mutations.js' import { sendCoins, createTransactionLink } from '@/graphql/mutations.js'