mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-10-02 17:44:37 -04:00
119 lines
3.5 KiB
Vue
119 lines
3.5 KiB
Vue
<template>
|
|
<ListInput
|
|
v-model="v"
|
|
:prototype="prototype()"
|
|
:group="group"
|
|
:readonly="readonly"
|
|
:maxitems="maxitems"
|
|
disable-sorting
|
|
>
|
|
<template #default="s">
|
|
<input
|
|
v-model="s.val.name"
|
|
class="form-control"
|
|
:readonly="readonly"
|
|
required
|
|
maxlength="24"
|
|
:placeholder="$t('profile.calendar.customEvents.name')"
|
|
@keyup="s.update(s.val)"
|
|
@paste="$nextTick(() => s.update(s.val))"
|
|
@change="s.update(s.val)"
|
|
>
|
|
<select v-model="s.val.month" class="form-control" :disabled="readonly" @change="s.update(s.val)">
|
|
<option value="">
|
|
{{ $t('profile.calendar.customEvents.month') }}
|
|
</option>
|
|
<option v-for="i in 12" :value="i">
|
|
{{ $t(`calendar.months.${i}`) }}
|
|
</option>
|
|
</select>
|
|
<select v-model="s.val.day" class="form-control" :disabled="readonly" @change="s.update(s.val)">
|
|
<option value="">
|
|
{{ $t('profile.calendar.customEvents.day') }}
|
|
</option>
|
|
<option v-for="i in maxDaysInMonths[s.val.month] || 0" :value="i">
|
|
{{ i }}
|
|
</option>
|
|
</select>
|
|
<input
|
|
v-model="s.val.comment"
|
|
class="form-control"
|
|
:readonly="readonly"
|
|
maxlength="128"
|
|
:placeholder="$t('profile.calendar.customEvents.comment')"
|
|
@keyup="s.update(s.val)"
|
|
@paste="$nextTick(() => s.update(s.val))"
|
|
@change="s.update(s.val)"
|
|
>
|
|
</template>
|
|
<template #validation="s">
|
|
<p v-if="validation(s.val)" class="small text-danger">
|
|
<Icon v="exclamation-triangle" />
|
|
<span class="ml-1">{{ $t(validation(s.val)) }}</span>
|
|
</p>
|
|
</template>
|
|
</ListInput>
|
|
</template>
|
|
|
|
<script>
|
|
|
|
export default {
|
|
props: {
|
|
value: {},
|
|
group: {},
|
|
readonly: { type: Boolean },
|
|
maxitems: { default: null },
|
|
},
|
|
data() {
|
|
return {
|
|
v: this.value,
|
|
maxDaysInMonths: {
|
|
1: 31,
|
|
2: 29,
|
|
3: 31,
|
|
4: 30,
|
|
5: 31,
|
|
6: 30,
|
|
7: 31,
|
|
8: 31,
|
|
9: 30,
|
|
10: 31,
|
|
11: 30,
|
|
12: 31,
|
|
},
|
|
};
|
|
},
|
|
watch: {
|
|
v() {
|
|
this.$emit('input', this.v);
|
|
},
|
|
value(v) {
|
|
this.v = v;
|
|
},
|
|
},
|
|
methods: {
|
|
prototype() {
|
|
return { name: '', month: '', day: '', comment: '' };
|
|
},
|
|
|
|
validation(v) {
|
|
if (JSON.stringify(v) === JSON.stringify(this.prototype())) {
|
|
return null;
|
|
}
|
|
|
|
if (!v.name) {
|
|
return 'profile.calendar.customEvents.validation.missingName';
|
|
}
|
|
if (!v.month || !v.day) {
|
|
return 'profile.calendar.customEvents.validation.missingDate';
|
|
}
|
|
if (parseInt(v.day) < 1 || parseInt(v.day) > this.maxDaysInMonths[parseInt(this.month)]) {
|
|
return 'profile.calendar.customEvents.validation.invalidDate';
|
|
}
|
|
|
|
return null;
|
|
},
|
|
},
|
|
};
|
|
</script>
|