- Using CEventsCalendar also for show a Single Event, with his button edit/add/duplicate...

This commit is contained in:
Paolo Arena
2019-11-07 18:57:41 +01:00
parent 7fe6b5fb6a
commit 5393092542
8 changed files with 845 additions and 460 deletions

View File

@@ -35,13 +35,15 @@ import MixinOperator from '../../mixins/mixin-operator'
import MixinEvents from '../../mixins/mixin-events'
import { CDateTime } from '../CDateTime'
import { CMyAvatar } from '../CMyAvatar'
import { CMySingleEvent } from '../CMySingleEvent'
@Component({
mixins: [MixinOperator, MixinUsers, MixinEvents],
name: 'CEventsCalendar',
components: { Logo, Footer, CTitle, CImgText, QDateTimeScroller, QDateScroller, CMySelect, CMyEditor, CDateTime, CMyAvatar }
components: { Logo, Footer, CTitle, CImgText, QDateTimeScroller, QDateScroller, CMySelect, CMyEditor, CDateTime, CMyAvatar, CMySingleEvent }
})
export default class CEventsCalendar extends MixinEvents {
@Prop ({required: false, default: null}) public mysingleevent: IEvents
public $q
public $t: any
public calendarView = 'month'
@@ -191,6 +193,10 @@ export default class CEventsCalendar extends MixinEvents {
// }
// ]
get visuAllCal() {
return this.mysingleevent === null
}
get title_cal() {
if (this.titleFormatter && this.locale) {
const mydate = new Date(this.selectedDate)
@@ -986,6 +992,15 @@ export default class CEventsCalendar extends MixinEvents {
return eventsloc
}
public isEventEnabled(myevent) {
// check if event is in the past
const datenow = tools.addDays(tools.getDateNow(), -1)
// console.log('datenow', datenow, 'end', myevent.dateTimeEnd)
return (new Date(myevent.dateTimeEnd) >= datenow)
}
public getTitleEv(event: IEvents) {
return (!!event.short_tit) ? event.short_tit : event.title
}

View File

@@ -1,6 +1,5 @@
<template>
<div class="landing">
<q-page class="column" style="min-height: 500px !important;">
<!-- display an myevent -->
<q-dialog v-model="displayEvent">
<q-card v-if="myevent">
@@ -31,7 +30,8 @@
@click="deleteEvent(myevent)"></q-btn>
<q-btn v-if="editable" flat round color="white" icon="edit" v-close-popup
@click="editEvent(myevent)"></q-btn>
<q-btn flat round color="white" icon="cancel" v-close-popup @click="myevent = null; displayEvent = false"></q-btn>
<q-btn flat round color="white" icon="cancel" v-close-popup
@click="myevent = null; displayEvent = false"></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<q-img :src="getImgEvent(myevent)"
@@ -375,8 +375,9 @@
<!--v-touch-swipe.mouse.left.right="handleSwipe" -->
<!-- the calendar -->
<q-page v-if="visuAllCal" class="column" style="min-height: 500px !important;">
<div>
<div >
<q-toolbar class="mytoolbar">
<q-btn color="primary" round icon="keyboard_arrow_left" @click="calendarPrev"/>
<q-btn color="primary" round icon="keyboard_arrow_right" @click="calendarNext"/>
@@ -399,6 +400,7 @@
-->
<q-calendar
v-if="visuAllCal"
ref="calendar"
class="calendar"
:key="keyValue"
@@ -519,8 +521,16 @@
</q-page>
<div class="q-mt-md">
<p class="text-subtitle1 text-red text-center">LISTA PROSSIMI EVENTI:</p>
<p v-if="visuAllCal" class="text-subtitle1 text-red text-center">LISTA PROSSIMI EVENTI:</p>
<!--<q-intersection-->
<!--v-for="index in 10"-->
<!--:key="index"-->
<!--transition="scale"-->
<!--class="example-item"-->
<!--&gt;-->
<div v-if="!mysingleevent">
<q-markup-table wrap-cells bordered separator="horizontal" class="listaev__table">
<tbody>
<tr v-for="(event, index) in getEventList()" class="listaev listaev__table">
@@ -535,7 +545,8 @@
icon="event_available">{{$t('cal.booked')}}
</q-chip>
<q-chip v-if="event === myevent && !displayEvent && editable" class="text-center shadow-5 glossy bg-blue chipmodif">
<q-chip v-if="event === myevent && !displayEvent && editable"
class="text-center shadow-5 glossy bg-blue chipmodif">
<q-btn v-if="editable" flat round color="white" icon="fas fa-copy">
<q-menu
@@ -560,7 +571,8 @@
@click="editEvent(myevent)"></q-btn>
<q-btn flat round color="white" icon="cancel" @click="selectEvent(null)"></q-btn>
</q-chip>
<q-chip v-if="event.news" class="cltexth4 chipnews shadow-5 glossy text-right" color="red"
<q-chip v-if="event.news" class="cltexth4 chipnews shadow-5 glossy text-right"
color="red"
text-color="white" icon-right="star" icon="star" dense
style="">
{{$t('event.news')}}
@@ -694,7 +706,19 @@
</tr>
</tbody>
</q-markup-table>
</div>
<div v-else>
<CMySingleEvent :myevent="mysingleevent" calendarView="month" :iseditable="editable"
@duplicateEvent="duplicateEvent"
@askForInfoEventMenu="askForInfoEventMenu"
@deleteEvent="deleteEvent"
@editEvent="editEvent"
@addBookEventMenu="addBookEventMenu"
@EditBookEvent="EditBookEvent">
</CMySingleEvent>
</div>
<!--</q-intersection>-->
<!-- Example of a Dialog with a Card -->
<!--
<q-dialog v-model="card">

View File

@@ -0,0 +1,86 @@
.listaev {
color: black;
font-size: 0.75rem;
font-weight: 400;
line-height: 1.25rem;
letter-spacing: 0.03333em;
&__date {
font-weight: bold;
color: #2ba0fd;
font-size: 1rem;
}
&__title {
color: red;
font-weight: 700;
letter-spacing: 0.066em;
}
&__details {
color: black;
}
&__tdimg {
width: 150px;
height: 150px;
}
&__tdimg_small {
width: auto;
height: 50px !important;
@media (max-width: 800px) {
height: 40px !important;
}
}
&__table {
margin: 10px;
border: solid 1px #4198ef;
border-radius: 1rem;
padding: 2px;
}
&__table tr {
border: solid 1px #4198ef;
border-radius: 1rem;
}
&__align_center_mobile {
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
}
&__align_chips {
text-align: center;
display: flex;
flex-direction: column-reverse;
align-items: center;
}
&__img {
padding: 0.25rem !important;
float: left;
width: 150px;
height: 150px;
border-radius: 1rem;
@media (max-width: 718px) {
// PER VERSIONE MOBILE
float: none;
text-align: center;
margin: 0 auto;
}
}
&__img:hover {
transition: transform .2s;
transform: scale(1.05);
border: inset;
border-color: blue;
border-width: 1px;
}
}

View File

@@ -0,0 +1,85 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { CalendarStore, GlobalStore, UserStore } from '@store'
import { Logo } from '../../components/logo/index'
import { Footer } from '../../components/Footer/index'
import { tools } from '../../store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import { static_data } from '@src/db/static_data'
import { Screen } from 'quasar'
import { CImgText } from '../../components/CImgText/index'
import { CCard, CMyAvatar, CMyPage } from '@components'
import MixinOperator from '@src/mixins/mixin-operator'
import MixinEvents from '../../mixins/mixin-events'
import { IEvents } from '@src/model'
import MixinBase from '@src/mixins/mixin-base'
import MixinUsers from '@src/mixins/mixin-users'
@Component({
name: 'CMySingleEvent',
mixins: [MixinOperator, MixinBase, MixinEvents, MixinUsers],
components: { Logo, Footer, CImgText, CCard, CMyPage, CMyAvatar }
})
export default class CMySingleEvent extends MixinEvents {
public $q
public $t
public myevent: IEvents = null
public selected: boolean = false
@Watch('$route.params.eventid')
public changeevent() {
// this.mytypetransgroup = ''
this.myevent = CalendarStore.state.eventlist.find((rec) => rec._id === this.$route.params.eventid)
// console.log('myevent', this.myevent, 'eventid=', this.$route.params.eventid)
}
public selectEvent(eventparam: IEvents) {
this.selected = !this.selected
}
public getTextEvent(myevent: IEvents) {
if (myevent.bodytext === '') {
return myevent.details
} else {
return myevent.bodytext
}
}
public mounted() {
this.changeevent()
console.log('myevent', this.myevent)
}
get static_data() {
return static_data
}
public duplicateEvent(event, numgg) {
this.$emit('duplicateEvent', event, numgg)
}
public askForInfoEventMenu(event) {
this.$emit('askForInfoEventMenu', event)
}
public deleteEvent(event) {
this.$emit('deleteEvent', event)
}
public editEvent(event) {
this.$emit('editEvent', event)
}
public addBookEventMenu(event) {
this.$emit('addBookEventMenu', event)
}
public EditBookEvent(event) {
this.$emit('EditBookEvent', event)
}
}

View File

@@ -0,0 +1,172 @@
<template>
<div>
<CMyPage v-if="myevent" :imgbackground="myevent.img" :title="myevent.title" keywords="" description="">
<div class="q-ma-md">
<div class="listaev__align_chips q-ma-md">
<img :src="getImgEvent(myevent)"
@click="selectEvent(myevent)"
class="text-left padding_cell listaev__tdimg listaev__img cursor-pointer"
:style="getStyleByEvent(myevent, true)">
<q-chip dense v-if="isAlreadyBooked(myevent)" class="cltexth4 chipbooked shadow-5 q-mb-md"
color="green" text-color="white"
icon="event_available">{{$t('cal.booked')}}
</q-chip>
<q-chip v-if="selected" class="text-center shadow-5 glossy bg-blue chipmodif">
<q-btn v-if="editable" flat round color="white" icon="fas fa-copy">
<q-menu
transition-show="flip-right"
transition-hide="flip-left">
<q-list style="min-width: 100px">
<q-item clickable @click="duplicateEvent(myevent, 7)">
<q-item-section>Tra 1 Settimana</q-item-section>
</q-item>
<q-item clickable @click="duplicateEvent(myevent, 14)">
<q-item-section>Tra 2 Settimane</q-item-section>
</q-item>
<q-item clickable @click="duplicateEvent(myevent, 7, 4)">
<q-item-section>4 Eventi ogni Settimana</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
<q-btn v-if="editable" flat round color="white" icon="delete" v-close-popup
@click="deleteEvent(myevent)"></q-btn>
<q-btn v-if="editable" flat round color="white" icon="edit" v-close-popup
@click="editEvent(myevent)"></q-btn>
<q-btn flat round color="white" icon="cancel" @click="selectEvent(null)"></q-btn>
</q-chip>
<q-chip v-if="myevent.news" class="cltexth4 chipnews shadow-5 glossy text-right" color="red"
text-color="white" icon-right="star" icon="star" dense
style="">
{{$t('event.news')}}
</q-chip>
</div>
<div class="listaev__date listaev__align_center_mobile">
<span v-html="tools.getstrDateTimeEvent(mythis(), myevent, true)"></span>
</div>
<div class="listaev__align_center_mobile">
<div style="margin: 10px;"></div>
<div class="">
<!-- Se c'è un link, allora -->
<q-btn v-if="myevent.linkpdf" size="md" type="a"
:href="`../../statics/` + myevent.linkpdf"
target="_blank"
ripple rounded :label="myevent.title" :icon="myevent.icon"
:color="myevent.bgcolor" text-color="white" glossy>
</q-btn>
<!-- altrimenti mostra solo Chip -->
<div v-else>
<div v-if="tools.isMobile()" class="cltexth3 text-center"
:style="`background-color: ${myevent.bgcolor} !important; color: white !important;`">
{{myevent.title}}
</div>
<q-chip v-else class="cltexth3 text-center"
:style="`background-color: ${myevent.bgcolor} !important; color: white !important;`"
text-color="white"
:icon="myevent.icon"
dense>{{myevent.title}}
</q-chip>
</div>
</div>
<div style="margin: 10px;"></div>
<p v-if="myevent.bodytext" class="listaev__details text-left" v-html="myevent.bodytext"></p>
<p v-else class="listaev__details" v-html="myevent.details"></p>
<div v-if="myevent.teacher" class="">
<span class="cal__teacher-title">{{$t('cal.teacher')}}: <span
class="margin_with"></span></span>
<q-chip>
<CMyAvatar :myimg="getImgTeacherByUsername(myevent.teacher)"></CMyAvatar>
<span class="cal__teacher-content">{{getTeacherByUsername(myevent.teacher)}}</span>
</q-chip>
<span v-if="getImgTeacherByUsername(myevent.teacher2) && isValidUsername(myevent.teacher2)"
class="margin_avatar2"></span>
<q-chip v-if="getImgTeacherByUsername(myevent.teacher2) && isValidUsername(myevent.teacher2)">
<CMyAvatar :myimg="getImgTeacherByUsername(myevent.teacher2)"></CMyAvatar>
<span class="cal__teacher-content">{{getTeacherByUsername(myevent.teacher2)}}</span>
</q-chip>
<span v-if="myevent.wherecode" class="">
<span v-if="tools.isMobile()"><br/></span>
<span class="cal__where-title">{{$t('cal.where')}}: </span>
<q-chip>
<q-avatar v-if="getWhereIcon(myevent.wherecode)">
<img :src="`../../statics/images/avatar/` + getWhereIcon(myevent.wherecode)">
</q-avatar>
<q-avatar v-else color="blue" font-size="20px" text-color="white"
icon="home">
</q-avatar>
<span class="cal__teacher-content">{{getWhereName(myevent.wherecode)}}</span>
</q-chip>
</span>
</div>
<div v-if="myevent.contribtype" class="">
<span class="cal__quota-title">{{$t('event.price')}}:<span
class="margin_with"></span></span>
<span v-if="!isShowPrice(myevent)" class="">
<q-chip class="glossy" color="orange" text-color="white">
<span class="cal__quota-content">{{getContribtypeById(myevent.contribtype)}}</span>
</q-chip>
</span>
<q-chip v-if="myevent.price && isShowPrice(myevent)" class="glossy" color="orange"
text-color="white" icon-right="star">
<span class="cal__quota-content">{{getPrice(myevent)}}</span>
</q-chip>
</div>
<p class="text-center">
<span v-if="myevent.linkpdf" class="">
<q-btn size="md" type="a" :href="`../../statics/` + myevent.linkpdf"
target="_blank" rounded color="primary" icon="info"
:label="$t('cal.showinfo')">
</q-btn>
</span>
</p>
<div class="row justify-end">
<q-btn rounded outline class="q-mx-sm"
color="primary" @click="askForInfoEventMenu(myevent)"
:label="$t('event.askinfo')">
</q-btn>
<q-btn rounded outline class="q-mx-sm"
v-if="!myevent.nobookable && !isAlreadyBooked(myevent) && static_data.functionality.BOOKING_EVENTS"
color="primary" @click="addBookEventMenu(myevent)"
:label="$t('cal.booking')" :disable="!isEventEnabled(myevent)">
</q-btn>
<q-btn rounded outline class="q-mx-sm"
v-if="!myevent.nobookable && isAlreadyBooked(myevent) && static_data.functionality.BOOKING_EVENTS"
text-color="red"
@click="EditBookEvent(myevent)"
:label="$t('cal.modifybooking')">
</q-btn>
<!--
<q-btn push rounded v-if="!myevent.nobookable && isAlreadyBooked(myevent)" color="positive" @click="BookEvent(myevent)"
:label="$t('cal.booked')">
</q-btn>
-->
</div>
</div>
</div>
</CMyPage>
</div>
</template>
<script lang="ts" src="./CMySingleEvent.ts">
</script>
<style lang="scss" scoped>
@import './CMySingleEvent.scss';
</style>

View File

@@ -0,0 +1 @@
export {default as CMySingleEvent} from './CMySingleEvent.vue'

View File

@@ -18,6 +18,7 @@ export * from './CPreloadImages'
export * from './CSignIn'
export * from './CSignUp'
export * from './CEventsCalendar'
export * from './CMySingleEvent'
export * from './CDate'
export * from './CDateTime'
export * from './BannerCookies'

View File

@@ -658,6 +658,7 @@ namespace Actions {
await Projects.actions.dbLoad({ checkPending: true, onlyiffirsttime: true })
GlobalStore.state.finishLoading = true
console.log('finishLoading', GlobalStore.state.finishLoading)
return true
// console.log('setGlobal: END')