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

View File

@ -95,6 +95,7 @@ import LabeledInput from '@/components/Inputs/LabeledInput'
import OpenCreationsAmount from './OpenCreationsAmount.vue'
import { object, date as dateSchema, number, string } from 'yup'
import { GDD_PER_HOUR } from '../../constants'
import { useMinimalContributionDate } from '@/composables/useMinimalContributionDate'
const amountToHours = (amount) => parseFloat(amount / 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 },
maxGddLastMonth: { type: Number, required: true },
maxGddThisMonth: { type: Number, required: true },
successMessage: { type: String, required: true },
})
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 disableSmartValidState = ref(false)
const minimalDate = computed(() => useMinimalContributionDate(now.value))
const isThisMonth = computed(() => {
const formContributionDate = new Date(form.contributionDate)
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
const validationSchema = computed(() => {
const maxAmounts = Number(

View File

@ -1,9 +1,9 @@
<template>
<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') }}
<hr />
{{ $t('form.send_transaction_success') }}
{{ message }}
</div>
<div class="text-center mt-5">
<BButton variant="primary" @click="$emit('on-back')">
@ -12,8 +12,15 @@
</div>
</div>
</template>
<script>
export default {
name: 'TransactionResultSendSuccess',
}
<script setup>
import { defineProps, defineEmits } from 'vue'
defineProps({
message: {
type: String,
default: '',
},
})
defineEmits(['on-back'])
</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>
</template>
<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 #transactionResultSendError>
<transaction-result-send-error
@ -58,7 +61,7 @@ import GddSend, { TRANSACTION_STEPS } from '@/components/GddSend'
import TransactionForm from '@/components/GddSend/TransactionForm'
import TransactionConfirmationSend from '@/components/GddSend/TransactionConfirmationSend'
import TransactionConfirmationLink from '@/components/GddSend/TransactionConfirmationLink'
import TransactionResultSendSuccess from '@/components/GddSend/TransactionResultSendSuccess'
import SuccessMessage from '@/components/SuccessMessage'
import TransactionResultSendError from '@/components/GddSend/TransactionResultSendError'
import TransactionResultLink from '@/components/GddSend/TransactionResultLink'
import { sendCoins, createTransactionLink } from '@/graphql/mutations.js'