mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
191 lines
5.9 KiB
Vue
191 lines
5.9 KiB
Vue
<template>
|
|
<div class="contribution-form container">
|
|
<!-- <div class="my-3">
|
|
<h3>{{ $t('contribution.formText.yourContribution') }}</h3>
|
|
{{ $t('contribution.formText.bringYourTalentsTo') }}
|
|
<ul class="my-3">
|
|
<li v-html="textForMonth(new Date(minimalDate), maxGddLastMonth)"></li>
|
|
<li v-html="textForMonth(new Date(), maxGddThisMonth)"></li>
|
|
</ul>
|
|
|
|
<div class="my-3">
|
|
<b>{{ $t('contribution.formText.describeYourCommunity') }}</b>
|
|
</div>
|
|
</div> -->
|
|
<b-form
|
|
ref="form"
|
|
@submit.prevent="submit"
|
|
class="border p-3 bg-white appBoxShadow gradido-border-radius"
|
|
>
|
|
<label>{{ $t('contribution.selectDate') }} {{ $t('math.asterisk') }}</label>
|
|
<b-form-datepicker
|
|
id="contribution-date"
|
|
v-model="form.date"
|
|
size="lg"
|
|
:locale="$i18n.locale"
|
|
:max="maximalDate"
|
|
:min="minimalDate"
|
|
class="mb-4"
|
|
reset-value=""
|
|
:label-no-date-selected="$t('contribution.noDateSelected')"
|
|
required
|
|
:disabled="this.form.id !== null"
|
|
>
|
|
<template #nav-prev-year><span></span></template>
|
|
<template #nav-next-year><span></span></template>
|
|
</b-form-datepicker>
|
|
<div v-if="validMaxGDD > 0">
|
|
<input-textarea
|
|
v-model="form.memo"
|
|
:name="$t('form.message')"
|
|
:label="$t('contribution.activity')"
|
|
:placeholder="$t('contribution.yourActivity')"
|
|
:rules="{ required: true, min: 5, max: 255 }"
|
|
/>
|
|
|
|
<!-- <validation-provider
|
|
:rules="{
|
|
min: minlength,
|
|
max: maxlength,
|
|
}"
|
|
:name="$t('form.message')"
|
|
v-slot="{ errors }"
|
|
>
|
|
<label class="mt-3">{{ $t('contribution.activity') }} {{ $t('math.asterisk') }}</label>
|
|
<b-form-textarea
|
|
id="contribution-memo"
|
|
v-model="form.memo"
|
|
rows="3"
|
|
:placeholder="$t('contribution.yourActivity')"
|
|
required
|
|
></b-form-textarea>
|
|
<b-col v-if="errors">
|
|
<span v-for="error in errors" class="errors" :key="error">{{ error }}</span>
|
|
</b-col>
|
|
</validation-provider> -->
|
|
<input-amount
|
|
v-model="form.amount"
|
|
:name="$t('form.amount')"
|
|
:label="$t('form.amount')"
|
|
:placeholder="'20'"
|
|
:rules="{ required: true, gddSendAmount: [20, validMaxGDD] }"
|
|
typ="ContributionForm"
|
|
></input-amount>
|
|
</div>
|
|
<div v-else class="mb-5">{{ $t('contribution.exhausted') }}</div>
|
|
<!-- <validation-provider
|
|
:name="$t('form.amount')"
|
|
:rules="{
|
|
required: true,
|
|
gddSendAmount: [0.01, validMaxGDD],
|
|
}"
|
|
v-slot="{ errors }"
|
|
>
|
|
<label class="mt-3">{{ $t('form.amount') }} {{ $t('math.asterisk') }}</label>
|
|
<b-input-group size="lg" prepend="GDD">
|
|
<b-form-input
|
|
id="contribution-amount"
|
|
v-model="form.amount"
|
|
type="number"
|
|
:formatter="numberFormat"
|
|
:max="validMaxGDD"
|
|
required
|
|
></b-form-input>
|
|
</b-input-group>
|
|
<b-col v-if="errors">
|
|
<span v-for="error in errors" class="errors" :key="error">{{ error }}</span>
|
|
</b-col>
|
|
</validation-provider> -->
|
|
<b-row class="mt-3">
|
|
<b-col>
|
|
<b-button type="reset" variant="secondary" @click="reset" data-test="button-cancel">
|
|
{{ $t('form.cancel') }}
|
|
</b-button>
|
|
</b-col>
|
|
<b-col class="text-right">
|
|
<b-button type="submit" variant="primary" :disabled="disabled" data-test="button-submit">
|
|
{{ form.id ? $t('form.change') : $t('contribution.submit') }}
|
|
</b-button>
|
|
</b-col>
|
|
</b-row>
|
|
</b-form>
|
|
<p class="p-2">{{ $t('math.asterisk') }} {{ $t('form.mandatoryField') }}</p>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import InputAmount from '@/components/Inputs/InputAmount.vue'
|
|
import InputTextarea from '@/components/Inputs/InputTextarea.vue'
|
|
|
|
const PATTERN_NON_DIGIT = /\D/g
|
|
|
|
export default {
|
|
name: 'ContributionForm',
|
|
components: {
|
|
InputAmount,
|
|
InputTextarea,
|
|
},
|
|
props: {
|
|
value: { type: Object, required: true },
|
|
isThisMonth: { type: Boolean, required: true },
|
|
minimalDate: { type: Date, required: true },
|
|
maxGddLastMonth: { type: Number, required: true },
|
|
maxGddThisMonth: { type: Number, required: true },
|
|
},
|
|
data() {
|
|
return {
|
|
minlength: 5,
|
|
maxlength: 255,
|
|
maximalDate: new Date(),
|
|
form: this.value, // includes 'id'
|
|
}
|
|
},
|
|
methods: {
|
|
// numberFormat(value) {
|
|
// return value.replace(PATTERN_NON_DIGIT, '')
|
|
// },
|
|
submit() {
|
|
this.form.amount = this.form.amount.replace(PATTERN_NON_DIGIT, '')
|
|
// spreading is needed for testing
|
|
this.$emit(this.form.id ? 'update-contribution' : 'set-contribution', { ...this.form })
|
|
this.reset()
|
|
},
|
|
reset() {
|
|
this.$refs.form.reset()
|
|
this.form.id = null
|
|
this.form.date = ''
|
|
this.form.memo = ''
|
|
this.form.amount = ''
|
|
},
|
|
// textForMonth(date, availableAmount) {
|
|
// const obj = {
|
|
// monthAndYear: this.$d(date, 'monthAndYear'),
|
|
// creation: availableAmount,
|
|
// }
|
|
// return this.$t('contribution.formText.openAmountForMonth', obj)
|
|
// },
|
|
},
|
|
computed: {
|
|
disabled() {
|
|
return (
|
|
this.form.date === '' ||
|
|
this.form.memo.length < this.minlength ||
|
|
this.form.memo.length > this.maxlength ||
|
|
this.form.amount === '' ||
|
|
parseInt(this.form.amount) <= 0 ||
|
|
parseInt(this.form.amount) > 1000 ||
|
|
(this.isThisMonth && parseInt(this.form.amount) > parseInt(this.maxGddThisMonth)) ||
|
|
(!this.isThisMonth && parseInt(this.form.amount) > parseInt(this.maxGddLastMonth))
|
|
)
|
|
},
|
|
validMaxGDD() {
|
|
return Number(this.isThisMonth ? this.maxGddThisMonth : this.maxGddLastMonth)
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
<style>
|
|
span.errors {
|
|
color: red;
|
|
}
|
|
</style>
|