Replace calendar browse buttons with dropdown

This commit is contained in:
Björn Fromme
2020-04-17 13:53:12 +02:00
parent 64da0d2381
commit 3fbfaac86c
3 changed files with 41 additions and 29 deletions
@@ -6,21 +6,14 @@
<div class="calendar__loading" v-show="loading"> <div class="calendar__loading" v-show="loading">
<img :src="loaderUri" alt="Loading" title="Loading"> <img :src="loaderUri" alt="Loading" title="Loading">
</div> </div>
<div class="calendar__inner" v-cloak v-html="calendarHtml"></div> <div class="col-xs-12">
<div class="calendar__buttons" v-cloak> <select class="form-control calendar__select" v-model="selectedMonth" @change="loadCalendar">
<div class="col-xs-6"> <option v-for="option in selectableMonths" :value="option" :key="option.format('YYYY')+option.format('M')">
<a v-show="showPrev" @click.prevent="prev()" href="#" {{ option.format('MMMM YYYY') }}
class="calendar__browse calendar__browse--prev btn btn-warning"> </option>
<i class="fa fa-chevron-left"></i> früher </select>
</a>
</div>
<div class="col-xs-6 text-right">
<a @click.prevent="next()" href="#"
class="calendar__browse calendar__browse--next btn btn-warning">
später <i class="fa fa-chevron-right"></i>
</a>
</div>
</div> </div>
<div class="calendar__inner" v-cloak v-html="calendarHtml"></div>
</div> </div>
</template> </template>
<script> <script>
@@ -28,6 +21,7 @@
import axios from 'axios' import axios from 'axios'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import 'dayjs/locale/de' import 'dayjs/locale/de'
dayjs.locale('de');
export default { export default {
props: { props: {
@@ -65,8 +59,8 @@
}, },
data () { data () {
return { return {
showPrev: false,
startDate: dayjs().startOf('month'), startDate: dayjs().startOf('month'),
selectedMonth: dayjs().startOf('month'),
calendarHtml: '', calendarHtml: '',
loading: false loading: false
} }
@@ -74,40 +68,47 @@
computed: { computed: {
isSingleCalendar () { isSingleCalendar () {
return parseInt(this.months) === 1; return parseInt(this.months) === 1;
},
selectableMonths() {
const months = [];
let month = this.startDate.month();
let year = this.startDate.year();
for (let i = 1; i <= 12; i++) {
months.push(dayjs().set('year', year).set('month', month));
if (month < 12) {
month++;
} else {
month = 1;
year++;
}
}
return months;
} }
}, },
methods: { methods: {
loadCalendar () { loadCalendar () {
let query = {}; let query = {};
query[this.argumentPrefix + '[hotel]'] = this.hotelUid; query[this.argumentPrefix + '[hotel]'] = this.hotelUid;
query[this.argumentPrefix + '[month]'] = this.startDate.month() + 1; query[this.argumentPrefix + '[month]'] = this.selectedMonth.month() + 1;
query[this.argumentPrefix + '[year]'] = this.startDate.year(); query[this.argumentPrefix + '[year]'] = this.selectedMonth.year();
query[this.argumentPrefix + '[months]'] = this.months; query[this.argumentPrefix + '[months]'] = this.months;
this.loading = true; this.loading = true;
this.showPrev = this.startDate.isAfter(dayjs());
axios({ axios({
url: this.uri, url: this.uri,
responseType: 'text', responseType: 'text',
params: query params: query
}).then((response) => { }).then((response) => {
this.calendarHtml = response.data; this.calendarHtml = response.data;
this.loading = false;
}).catch(() => { }).catch(() => {
}).finally(() => {
this.loading = false; this.loading = false;
}); });
},
next () {
this.startDate = this.startDate.add(this.step, 'month');
this.loadCalendar();
},
prev () {
this.startDate = this.startDate.subtract(this.step, 'month');
this.loadCalendar();
} }
}, },
mounted () { mounted () {
Vue.nextTick(() => { Vue.nextTick(() => {
this.loadCalendar(); this.loadCalendar();
this.selectedMonth = this.selectableMonths[0];
}); });
} }
} }
@@ -16,6 +16,14 @@
} }
} }
.calendar__select {
margin-bottom: 20px;
outline: none;
&:focus {
outline: none;
}
}
.calendar__loading { .calendar__loading {
position: absolute; position: absolute;
@include size(100%); @include size(100%);
@@ -33,7 +41,11 @@
} }
.calendar__days { .calendar__days {
min-height: 275px;
table {
margin-bottom: 0;
}
} }
.label-success-danger { .label-success-danger {
@@ -18,7 +18,6 @@
<f:for each="{year}" as="month"> <f:for each="{year}" as="month">
<ep:calendar.includes range="{range}" period="{month}"> <ep:calendar.includes range="{range}" period="{month}">
<div class="calendar__month col-xs-12{f:if(condition: '{months} > 1', then: ' col-md-6 col-lg-4')}"> <div class="calendar__month col-xs-12{f:if(condition: '{months} > 1', then: ' col-md-6 col-lg-4')}">
<h3 class="calendar__month{f:if(condition: '{months} == 1', then: ' calendar__month--single')}">{month.begin -> f:format.date(format: '%B')} {month.begin -> f:format.date(format: '%Y')}</h3>
<div class="calendar__days"> <div class="calendar__days">
<table class="table table-bordered"> <table class="table table-bordered">
<tr> <tr>