Compare commits

...

10 Commits

Author SHA1 Message Date
Paolo Arena
4f524f790f - Iscrizione Conacreis
- Calendario
- Prodotti
2021-06-04 17:28:05 +02:00
Paolo Arena
7c8c970a9e - Iscrizione Conacreis 2021-05-10 01:51:18 +02:00
Paolo Arena
0a0ed62e27 - Iscrizione Conacreis
- Ordini
- Carrello
2021-04-30 01:32:44 +02:00
Paolo Arena
30dbd9bb57 ECommerce Ordini Email 1 2021-03-30 02:22:46 +02:00
Paolo Arena
47b01c9002 Reportistica Ore 3 2021-02-25 03:00:29 +01:00
Paolo Arena
1fdafbb0e4 Reportistica Ore 2 2021-02-24 04:52:33 +01:00
Paolo Arena
f8ad20d1ae Reportistica Ore 1 2021-02-21 02:05:39 +01:00
Paolo Arena
5568547784 Calcolo Hours 2021-02-11 02:21:36 +01:00
Paolo Arena
7d0b3fb26f Project e Todos sistemati...
aggiunti Gruppi
2021-02-03 01:32:56 +01:00
Paolo Arena
d02044ae17 Ordini 2021-01-18 00:48:53 +01:00
159 changed files with 9867 additions and 3707 deletions

View File

@@ -1,8 +1,8 @@
import moment from 'moment' import moment from 'moment'
import 'moment/locale/fr' import 'moment/locale/it'
moment.locale('fr') moment.locale('it')
const monthsStrings = ['Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'] const monthsStrings = ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre']
export class DateMoving { export class DateMoving {
public date: moment.Moment public date: moment.Moment

View File

@@ -36,6 +36,20 @@ export const shared_consts = {
FILTER_NAVI_NON_PRESENTI: 8192, FILTER_NAVI_NON_PRESENTI: 8192,
FILTER_QUALIFIED: 16384, FILTER_QUALIFIED: 16384,
FILTER_ASK_ZOOM_VISTO: 32768, FILTER_ASK_ZOOM_VISTO: 32768,
FILTER_HOURS_MYLIST: 65536,
FILTER_HOURS_ALL: 131072,
FILTER_MISSING_PAYMENT: 262144,
FILTER_TO_MAKE_MEMBERSHIP_CARD: 524288,
FILTER_MEMBERSHIP_CARD_OK: 1048576,
REPORT_FILT_RESP: 1,
REPORT_FILT_ATTIVITA: 2,
CashType: {
None: 0,
Incoming: 1,
Outcoming: 2,
},
Permissions: { Permissions: {
Admin: { Admin: {
@@ -62,9 +76,9 @@ export const shared_consts = {
icon: 'fas fa-user-tie', icon: 'fas fa-user-tie',
color: 'fuchsia' color: 'fuchsia'
}, },
Traduttrici: { Editor: {
value: 16, value: 16,
label: 'dashboard.traduttrici', label: 'dashboard.Editor',
icon: 'fas fa-user-tie', icon: 'fas fa-user-tie',
color: 'orange' color: 'orange'
}, },
@@ -73,6 +87,12 @@ export const shared_consts = {
label: 'dashboard.zoomeri', label: 'dashboard.zoomeri',
icon: 'fas fa-user-tie', icon: 'fas fa-user-tie',
color: 'yellow' color: 'yellow'
},
Department: {
value: 64,
label: 'pages.department',
icon: 'fas fa-user-tie',
color: 'yellow'
} }
}, },
@@ -83,12 +103,16 @@ export const shared_consts = {
TypeMsg: { TypeMsg: {
SEND_TO_ALL: 1, SEND_TO_ALL: 1,
SEND_TO_SOCI: 2,
SEND_TO_SOCIO_RESIDENTE: 3,
SEND_TO_NON_SOCI: 10,
SEND_TO_PAOLO: 20
}, },
TypeMsg_Actions: { TypeMsg_Actions: {
NORMAL: 0, NORMAL: 0,
YESNO: 1, YESNO: 1,
OPZ1_2: 2, OPZ1_2: 2
}, },
selectActions: [ selectActions: [
@@ -109,6 +133,93 @@ export const shared_consts = {
} }
], ],
selectDestination: [
{
id: 0,
label: 'A Tutti',
value: 1
},
{
id: 1,
label: 'Solo ai Soci',
value: 2
},
{
id: 2,
label: 'Solo ai Soci Residenti',
value: 3
},
{
id: 3,
label: 'Solo ai NON Soci',
value: 10
},
{
id: 4,
label: 'a Paolo (test)',
value: 20
}
],
OrderStatus: {
NONE: 0,
IN_CART: 1,
CHECKOUT_SENT: 2,
ORDER_CONFIRMED: 3,
PAYED: 4,
DELIVEDED: 5,
RECEIVED: 6,
CANCELED: 10
},
OrderStatusView: [
2,
3,
4,
6,
10
],
OrderStatusStr: [
{
label: 'Nessuno',
value: 0
},
{
label: 'In Carrello',
value: 1
},
{
label: 'Ordine in Lavorazione',
value: 2
},
{
label: 'Ordine Confermato',
value: 3
},
{
label: 'Pagato',
value: 4
},
{
label: 'Spedito',
value: 5
},
{
label: 'Ricevuto',
value: 6
},
{
label: 'Cancellato',
value: 10
}
],
getStatusStr(status) {
const trovatorec = this.OrderStatusStr.find((rec) => rec.value === status)
return (!!trovatorec) ? trovatorec.label : ''
},
fieldsUserToChange() { fieldsUserToChange() {
return ['_id', 'username', 'email', 'name', 'surname', 'perm', 'date_reg', 'verified_email', 'img', 'ipaddr', 'lasttimeonline', 'profile', 'news_on'] return ['_id', 'username', 'email', 'name', 'surname', 'perm', 'date_reg', 'verified_email', 'img', 'ipaddr', 'lasttimeonline', 'profile', 'news_on']
} }

View File

@@ -16,6 +16,9 @@ export default class CDate extends Vue {
@Prop({ required: false, default: false }) public readonly!: boolean @Prop({ required: false, default: false }) public readonly!: boolean
@Prop({ required: false, default: false }) public disable!: boolean @Prop({ required: false, default: false }) public disable!: boolean
@Prop({ required: false, default: '' }) public color!: string @Prop({ required: false, default: '' }) public color!: string
@Prop({ required: false, default: false }) public rounded!: boolean
@Prop({ required: false, default: false }) public outlined!: boolean
@Prop({ required: false, default: true }) public dense!: boolean
public mystyleicon: string = 'font-size: 1.5rem;' public mystyleicon: string = 'font-size: 1.5rem;'
@@ -41,7 +44,7 @@ export default class CDate extends Vue {
const datavalida = tools.convertstrtoDate(value) const datavalida = tools.convertstrtoDate(value)
if (!!datavalida) { if (!!datavalida) {
this.valueInternal = datavalida this.valueInternal = datavalida
console.log('EMIT: changedate', datavalida) console.log('EMIT: changedate', datavalida.toString())
this.$emit('input', this.getDate()) this.$emit('input', this.getDate())
} else { } else {
console.log(' DATA NON VALIDAAAAAAAAAAAAA ', value, datavalida) console.log(' DATA NON VALIDAAAAAAAAAAAAA ', value, datavalida)
@@ -50,7 +53,9 @@ export default class CDate extends Vue {
} }
get getdatestring() { get getdatestring() {
return tools.getstrDate(this.valueInternal) const mydate = tools.getstrDate(this.valueInternal)
console.log('getdatestring', mydate)
return mydate
} }
get getdateyymmddstring() { get getdateyymmddstring() {
return tools.getstrYYMMDDDate(this.valueInternal) return tools.getstrYYMMDDDate(this.valueInternal)

View File

@@ -1,5 +1,9 @@
<template> <template>
<q-input :class="data_class" :bg-color="color" :readonly="readonly" :disable="disable" debounce="1000" dense :value="getdatestring" stack-label :label="label" @input="changedate"> <q-input :class="data_class" :bg-color="color" :readonly="readonly" :disable="disable" debounce="1000" :dense="dense"
:value="getdatestring" stack-label :label="label" @input="changedate" :rounded="rounded"
mask="##/##/####"
fill-mask
:outlined="outlined">
<template v-slot:append> <template v-slot:append>
<q-icon name="event" class="cursor-pointer" :style="mystyleicon"> <q-icon name="event" class="cursor-pointer" :style="mystyleicon">
<q-popup-proxy v-if="!readonly" ref="datePicker"> <q-popup-proxy v-if="!readonly" ref="datePicker">

View File

@@ -24,6 +24,7 @@ export default class CDateTime extends Vue {
@Prop({ required: false, default: '' }) public bgcolor!: string @Prop({ required: false, default: '' }) public bgcolor!: string
@Prop({ required: false, default: false }) public dense: boolean @Prop({ required: false, default: false }) public dense: boolean
@Prop({ required: false, default: '5' }) public minuteinterval: boolean @Prop({ required: false, default: '5' }) public minuteinterval: boolean
@Prop({ required: false, default: 'date-time' }) public view: string
public mystyleicon: string = 'font-size: 1.5rem;' public mystyleicon: string = 'font-size: 1.5rem;'
public showDateTimeScroller: boolean = false public showDateTimeScroller: boolean = false
@@ -118,4 +119,12 @@ export default class CDateTime extends Vue {
else else
return '' return ''
} }
public getstrDate(mydate) {
if (this.view === 'date-time') {
return tools.getstrDateTime(mydate)
} else {
return tools.getstrDate(mydate)
}
}
} }

View File

@@ -31,7 +31,7 @@
<template v-slot:control> <template v-slot:control>
<div style=""> <div style="">
<div class="self-center full-width no-outline" :style="mystyle" tabindex="0"> <div class="self-center full-width no-outline" :style="mystyle" tabindex="0">
{{ tools.getstrDateTime(myvalue) }} {{ getstrDate(myvalue) }}
</div> </div>
</div> </div>
</template> </template>
@@ -41,7 +41,7 @@
<q-scroller <q-scroller
v-model="myvalue" v-model="myvalue"
view="date-time" :view="view"
:locale="toolsext.getLocale()" :locale="toolsext.getLocale()"
:rounded-borders="true" :rounded-borders="true"
border-color="#2196f3" border-color="#2196f3"

View File

@@ -272,7 +272,7 @@ $graytext: #555;
position: absolute; position: absolute;
margin-top: -10px; margin-top: -10px;
overflow: hidden; overflow: hidden;
z-index: 9999; z-index: 1000;
box-sizing: border-box; box-sizing: border-box;
right: 0; right: 0;
@media (max-width: 400px) { @media (max-width: 400px) {
@@ -297,3 +297,7 @@ $graytext: #555;
flex-flow: column; flex-flow: column;
} }
} }
.itemprenota{
align-self: center;
color: blue;
}

View File

@@ -57,8 +57,9 @@ export default class CEventsCalendar extends MixinEvents {
public $q public $q
public $t: any public $t: any
public calendarView = 'month' public calendarView = 'month'
public selectedDate = '2019-04-01' public selectedDate = ''
public tabeditor: string = 'details' public tabeditor: string = 'details'
public showPrev: boolean = false
public formDefault: IEvents = { public formDefault: IEvents = {
title: '', title: '',
details: '', details: '',
@@ -74,6 +75,9 @@ export default class CEventsCalendar extends MixinEvents {
msgbooking: '', msgbooking: '',
infoevent: '', infoevent: '',
numpeople: 1, numpeople: 1,
numpeopleLunch: 0,
numpeopleDinner: 0,
numpeopleDinnerShared: 0,
datebooked: tools.getDateNow(), datebooked: tools.getDateNow(),
booked: false, booked: false,
modified: false modified: false
@@ -133,33 +137,15 @@ export default class CEventsCalendar extends MixinEvents {
return this return this
} }
get lists() {
return lists
}
set mythis(aa) { set mythis(aa) {
} }
public resources = [ public resources = []
{
label: 'John'
},
{
label: 'Mary'
},
{
label: 'Susan'
},
{
label: 'Olivia'
},
{
label: 'Board Room'
},
{
label: 'Room-1'
},
{
label: 'Room-2'
}
]
// public eventdata = // public eventdata =
// [ // [
@@ -365,6 +351,9 @@ export default class CEventsCalendar extends MixinEvents {
get hasModifiedBooking() { get hasModifiedBooking() {
return (this.bookEventpage.bookedevent.numpeople !== this.bookEventForm.numpeople) || return (this.bookEventpage.bookedevent.numpeople !== this.bookEventForm.numpeople) ||
(this.bookEventpage.bookedevent.numpeopleLunch !== this.bookEventForm.numpeopleLunch) ||
(this.bookEventpage.bookedevent.numpeopleDinner !== this.bookEventForm.numpeopleDinner) ||
(this.bookEventpage.bookedevent.numpeopleDinnerShared !== this.bookEventForm.numpeopleDinnerShared) ||
(this.bookEventpage.bookedevent.msgbooking !== this.bookEventForm.msgbooking) || (this.bookEventpage.bookedevent.msgbooking !== this.bookEventForm.msgbooking) ||
(this.bookEventpage.bookedevent.booked !== this.bookEventForm.booked) (this.bookEventpage.bookedevent.booked !== this.bookEventForm.booked)
} }
@@ -399,16 +388,21 @@ export default class CEventsCalendar extends MixinEvents {
} }
public mounted() { public mounted() {
this.selectedDate = this.formatDate(tools.getDateNow())
this.$root.$on('calendar:next', this.calendarNext) this.$root.$on('calendar:next', this.calendarNext)
this.$root.$on('calendar:prev', this.calendarPrev) this.$root.$on('calendar:prev', this.calendarPrev)
this.$root.$on('calendar:today', this.calendarToday) this.$root.$on('calendar:today', this.calendarToday)
this.SetToday()
// CalendarStore.state.eventlist = events // CalendarStore.state.eventlist = events
this.updateFormatters() this.updateFormatters()
} }
public beforeMount() { public beforeMount() {
// console.log('mounted')
this.selectedDate = this.formatDate(tools.getDateNow())
// console.log('this.selectedDate', this.selectedDate)
CalendarStore.state.locale = toolsext.getLocale() CalendarStore.state.locale = toolsext.getLocale()
this.updateFormatters() this.updateFormatters()
} }
@@ -450,16 +444,18 @@ export default class CEventsCalendar extends MixinEvents {
this.eventForm = { ...this.formDefault } this.eventForm = { ...this.formDefault }
} }
public addEventMenu(day, type) { public addEventMenu(day) {
// console.log('addeventmenu editable = ', this.editable) console.log('addeventmenu', day)
if (this.calendarView === 'scheduler' || this.calendarView === 'week-scheduler' || this.calendarView === 'month-scheduler' || !this.editable) { if (this.calendarView === 'scheduler' || this.calendarView === 'week-scheduler' || this.calendarView === 'month-scheduler' || !this.editable) {
return return
} }
this.resetForm() this.resetForm()
this.contextDay = { ...day } this.contextDay = { ...day.scope }
this.eventForm.dateTimeStart = tools.getstrYYMMDDDateTime(day.date + ' 21:00:00') this.eventForm.dateTimeStart = tools.getstrYYMMDDDateTime(day.scope.timestamp.date + ' 21:00:00')
this.eventForm.dateTimeEnd = tools.getstrYYMMDDDateTime(day.date + ' 22:00:00') this.eventForm.dateTimeEnd = tools.getstrYYMMDDDateTime(day.scope.timestamp.date + ' 22:00:00')
console.log('eventForm', this.eventForm)
this.addEvent = true // show dialog this.addEvent = true // show dialog
} }
@@ -467,7 +463,7 @@ export default class CEventsCalendar extends MixinEvents {
public addBookEventMenu(eventparam) { public addBookEventMenu(eventparam) {
if (!UserStore.state.isLogged || !UserStore.state.my.verified_email) { if (!UserStore.state.isLogged || !UserStore.state.my.verified_email) {
// Visu right Toolbar to make SignIn // Visu right Toolbar to make SignIn
GlobalStore.state.RightDrawerOpen = true GlobalStore.state.rightDrawerOpen = true
tools.showNeutralNotif(this.$q, this.$t('login.needlogin')) tools.showNeutralNotif(this.$q, this.$t('login.needlogin'))
tools.scrollToTop() tools.scrollToTop()
// window.scrollTo(0, 0) // window.scrollTo(0, 0)
@@ -479,6 +475,9 @@ export default class CEventsCalendar extends MixinEvents {
this.myevent = eventparam this.myevent = eventparam
this.bookEventForm.msgbooking = '' this.bookEventForm.msgbooking = ''
this.bookEventForm.numpeople = 1 this.bookEventForm.numpeople = 1
this.bookEventForm.numpeopleLunch = 0
this.bookEventForm.numpeopleDinner = 0
this.bookEventForm.numpeopleDinnerShared = 0
this.bookEventForm.booked = true this.bookEventForm.booked = true
this.bookEventpage.state = EState.Creating this.bookEventpage.state = EState.Creating
@@ -490,7 +489,7 @@ export default class CEventsCalendar extends MixinEvents {
public askForInfoEventMenu(eventparam) { public askForInfoEventMenu(eventparam) {
if (!UserStore.state.isLogged || !UserStore.state.my.verified_email) { if (!UserStore.state.isLogged || !UserStore.state.my.verified_email) {
// Visu right Toolbar to make SignIn // Visu right Toolbar to make SignIn
GlobalStore.state.RightDrawerOpen = true GlobalStore.state.rightDrawerOpen = true
tools.showNeutralNotif(this.$q, this.$t('login.needlogin')) tools.showNeutralNotif(this.$q, this.$t('login.needlogin'))
tools.scrollToTop() tools.scrollToTop()
@@ -703,6 +702,9 @@ export default class CEventsCalendar extends MixinEvents {
if (bookedevent) { if (bookedevent) {
this.bookEventForm._id = bookedevent._id this.bookEventForm._id = bookedevent._id
this.bookEventForm.numpeople = bookedevent.numpeople this.bookEventForm.numpeople = bookedevent.numpeople
this.bookEventForm.numpeopleLunch = bookedevent.numpeopleLunch
this.bookEventForm.numpeopleDinner = bookedevent.numpeopleDinner
this.bookEventForm.numpeopleDinnerShared = bookedevent.numpeopleDinnerShared
this.bookEventForm.infoevent = bookedevent.infoevent this.bookEventForm.infoevent = bookedevent.infoevent
this.bookEventForm.msgbooking = bookedevent.msgbooking this.bookEventForm.msgbooking = bookedevent.msgbooking
this.bookEventForm.booked = bookedevent.booked this.bookEventForm.booked = bookedevent.booked
@@ -755,6 +757,9 @@ export default class CEventsCalendar extends MixinEvents {
userId: UserStore.state.my._id, userId: UserStore.state.my._id,
id_bookedevent: myevent._id, id_bookedevent: myevent._id,
numpeople: self.bookEventForm.numpeople, numpeople: self.bookEventForm.numpeople,
numpeopleLunch: self.bookEventForm.numpeopleLunch,
numpeopleDinner: self.bookEventForm.numpeopleDinner,
numpeopleDinnerShared: self.bookEventForm.numpeopleDinnerShared,
infoevent: tools.gettextevent(self, myevent), infoevent: tools.gettextevent(self, myevent),
msgbooking: self.bookEventForm.msgbooking, msgbooking: self.bookEventForm.msgbooking,
booked: self.bookEventForm.booked, booked: self.bookEventForm.booked,
@@ -763,6 +768,7 @@ export default class CEventsCalendar extends MixinEvents {
} }
this.BookEvent(data).then((ris) => { this.BookEvent(data).then((ris) => {
console.log('ris uscita di BookEvent', ris)
if (ris) if (ris)
tools.showPositiveNotif(self.$q, self.$t('cal.booked') + ' ' + self.$t('cal.event') + ' "' + myevent.title + '"') tools.showPositiveNotif(self.$q, self.$t('cal.booked') + ' ' + self.$t('cal.event') + ' "' + myevent.title + '"')
else else
@@ -894,6 +900,10 @@ export default class CEventsCalendar extends MixinEvents {
return CalendarStore.state.operators return CalendarStore.state.operators
} }
get getInternalPagesArr() {
return CalendarStore.state.internalpages
}
get getWhereArr() { get getWhereArr() {
return CalendarStore.state.wheres return CalendarStore.state.wheres
} }
@@ -986,6 +996,7 @@ export default class CEventsCalendar extends MixinEvents {
public getEvents(dt) { public getEvents(dt) {
const eventsloc = [] const eventsloc = []
// console.log('dt', dt)
for (let i = 0; i < CalendarStore.state.eventlist.length; ++i) { for (let i = 0; i < CalendarStore.state.eventlist.length; ++i) {
let added = false let added = false
@@ -994,11 +1005,11 @@ export default class CEventsCalendar extends MixinEvents {
// check for overlapping times // check for overlapping times
const startTime = CalendarStore.state.eventlist[i].dateTimeStart const startTime = CalendarStore.state.eventlist[i].dateTimeStart
const endTime = CalendarStore.state.eventlist[i].dateTimeEnd const endTime = CalendarStore.state.eventlist[i].dateTimeEnd
for (let j = 0; j < eventsloc.length; ++j) { for (const item of eventsloc) {
const startTime2 = eventsloc[j].dateTimeStart const startTime2 = item.dateTimeStart
const endTime2 = eventsloc[j].dateTimeEnd const endTime2 = item.dateTimeEnd
if (date.isBetweenDates(startTime, startTime2, endTime2) || date.isBetweenDates(endTime, startTime2, endTime2)) { if (date.isBetweenDates(startTime, startTime2, endTime2) || date.isBetweenDates(endTime, startTime2, endTime2)) {
eventsloc[j].side = 'left' item.side = 'left'
eventsloc.push(CalendarStore.state.eventlist[i]) eventsloc.push(CalendarStore.state.eventlist[i])
added = true added = true
break break
@@ -1018,6 +1029,8 @@ export default class CEventsCalendar extends MixinEvents {
} }
} }
} }
// if (eventsloc.length > 0)
// console.log('eventsloc', eventsloc)
return eventsloc return eventsloc
} }

View File

@@ -1,9 +1,18 @@
<template> <template>
<div class="landing"> <div class="landing">
<!-- <div v-if="!tools.IsLogged() && (!mysingleevent)">
<div class="centermydiv">
<q-banner class="bg-secondary text-white">
Il Calendario sarà visibile solo dopo aver effettuato l'accesso
</q-banner>
</div>
</div>-->
<div>
<!-- display an myevent --> <!-- display an myevent -->
<q-dialog v-model="displayEvent"> <q-dialog v-model="displayEvent">
<q-card v-if="myevent"> <q-card v-if="myevent" :style="`min-width: ` + tools.myheight_dialog() + `px;`">
<q-toolbar class="bg-primary text-white" :style="`min-width: ` + tools.myheight_dialog() + `px;`"> <q-toolbar class="bg-primary text-white">
<!--<q-toolbar :class="tools.displayClasses(myevent)"--> <!--<q-toolbar :class="tools.displayClasses(myevent)"-->
<!--:style="tools.displayStyles(myevent) + ` min-width: `+ tools.myheight_dialog() + `px;`">--> <!--:style="tools.displayStyles(myevent) + ` min-width: `+ tools.myheight_dialog() + `px;`">-->
<q-toolbar-title> <q-toolbar-title>
@@ -56,6 +65,8 @@
<!--<span class="cal__teacher-content">{{myevent.teacher}}</span>--> <!--<span class="cal__teacher-content">{{myevent.teacher}}</span>-->
<CMyTeacher :username="myevent.teacher"></CMyTeacher> <CMyTeacher :username="myevent.teacher"></CMyTeacher>
<CMyTeacher :username="myevent.teacher2"></CMyTeacher> <CMyTeacher :username="myevent.teacher2"></CMyTeacher>
<CMyTeacher :username="myevent.teacher3"></CMyTeacher>
<CMyTeacher :username="myevent.teacher4"></CMyTeacher>
</div> </div>
<div v-if="myevent.wherecode" class="cal__where"> <div v-if="myevent.wherecode" class="cal__where">
<!--<span v-if="tools.isMobile()"><br/></span>--> <!--<span v-if="tools.isMobile()"><br/></span>-->
@@ -101,7 +112,7 @@
</q-dialog> </q-dialog>
<!-- id_bookedeventadd/edit an myevent --> <!-- id_bookedeventadd/edit an myevent -->
<q-dialog v-model="addEvent" no-backdrop-dismiss> <q-dialog v-model="addEvent" no-backdrop-dismiss persistent>
<q-card v-if="addEvent" :style="`min-width: `+ tools.myheight_dialog() + `px;`"> <q-card v-if="addEvent" :style="`min-width: `+ tools.myheight_dialog() + `px;`">
<q-toolbar class="bg-primary text-white"> <q-toolbar class="bg-primary text-white">
<q-toolbar-title> <q-toolbar-title>
@@ -120,16 +131,21 @@
:options="getDisciplines" :useinput="false"> :options="getDisciplines" :useinput="false">
</CMySelect> </CMySelect>
<div>
<q-input color="grey-1" v-model="eventForm.short_tit" autofocus <q-input color="grey-1" v-model="eventForm.short_tit" autofocus
debounce="1000"
:input-style="`background-color: ${eventForm.bgcolor} !important; color: white !important; font-weight: bold; `" :input-style="`background-color: ${eventForm.bgcolor} !important; color: white !important; font-weight: bold; `"
borderless rounded dense :label="$t('event.short_tit')" borderless rounded dense :label="$t('event.short_tit')"
></q-input> ></q-input>
<q-input color="grey-1" v-model="eventForm.title" autofocus <q-input color="grey-1" v-model="eventForm.title" autofocus
debounce="1000"
:input-style="`background-color: ${eventForm.bgcolor} !important; color: white !important; font-weight: bold; `" :input-style="`background-color: ${eventForm.bgcolor} !important; color: white !important; font-weight: bold; `"
borderless rounded dense :label="$t('event.title')" borderless rounded dense :label="$t('event.title')"
:rules="[v => v && v.length > 0 || $t('event.notempty')]"></q-input> :rules="[v => v && v.length > 0 || $t('event.notempty')]"></q-input>
</div>
<q-tabs <q-tabs
v-model="tabeditor" v-model="tabeditor"
@@ -140,28 +156,58 @@
align="justify" align="justify"
narrow-indicator narrow-indicator
> >
<q-tab name="details" label="Descrizione"/> <q-tab name="details" label="Descrizione Breve" icon="fas fa-pencil-alt"/>
<q-tab name="container" label="Contenuto"/> <q-tab name="container" label="Dettaglio Pagina" icon="fas fa-book"/>
<q-tab name="settings" label="Impostazioni" icon="fas fa-calendar-day"/>
</q-tabs> </q-tabs>
<q-tab-panels v-model="tabeditor" animated> <q-tab-panels v-model="tabeditor" animated>
<q-tab-panel name="details"> <q-tab-panel name="details">
<CMyEditor :value.sync="eventForm.details"> <div class="q-gutter-sm myflex">
<q-input class="myflex" dense v-model="eventForm.img"
:label="$t('event.img')"></q-input>
<q-input class="myflex" dense v-model="eventForm.img_small"
:label="$t('event.img_small')"></q-input>
</div>
<div class="q-gutter-sm myflex">
<q-input
class="myflex"
:style="`background-color: ${eventForm.bgcolor} !important; color: white !important;`"
filled
color="white"
dense
:label="$t('event.bgcolor')"
v-model="eventForm.bgcolor">
<template #append>
<q-icon name="colorize" class="cursor-pointer" color="white">
<q-popup-proxy>
<q-color format-model="hex" v-model="eventForm.bgcolor"></q-color>
</q-popup-proxy>
</q-icon>
</template>
</q-input>
<q-input class="myflex" dense v-model="eventForm.icon"
:label="$t('event.icon')"></q-input>
</div>
<CMyEditor :value.sync="eventForm.details" :showButtons="false">
</CMyEditor> </CMyEditor>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="container"> <q-tab-panel name="container">
<CMyEditor :value.sync="eventForm.bodytext"> <CMyEditor :value.sync="eventForm.bodytext" :showButtons="false">
</CMyEditor> </CMyEditor>
</q-tab-panel> </q-tab-panel>
</q-tab-panels> <q-tab-panel name="settings" class="q-gutter-sm">
<!--<q-checkbox v-model="eventForm.allday" :label="$t('cal.alldayevent')"></q-checkbox>--> <!--<q-checkbox v-model="eventForm.allday" :label="$t('cal.alldayevent')"></q-checkbox>-->
<div class="q-gutter-sm row myflex"> <div class="q-gutter-sm row myflex">
<CDateTime <CDateTime
:value.sync="eventForm.dateTimeStart" :value.sync="eventForm.dateTimeStart"
@@ -188,13 +234,31 @@
optval="username" :optlab="(item) => item.name + ' ' + item.surname" optval="username" :optlab="(item) => item.name + ' ' + item.surname"
:options="getTeachersArr" :useinput="false"> :options="getTeachersArr" :useinput="false">
</CMySelect> </CMySelect>
</div> <CMySelect myclass="myflex" :label="$t('cal.teacher') + ' 3°'"
:value.sync="eventForm.teacher3"
<div class="q-gutter-sm myflex wrap"> optval="username" :optlab="(item) => item.name + ' ' + item.surname"
:options="getTeachersArr" :useinput="false">
</CMySelect>
<CMySelect myclass="myflex" :label="$t('cal.teacher') + ' 4°'"
:value.sync="eventForm.teacher4"
optval="username" :optlab="(item) => item.name + ' ' + item.surname"
:options="getTeachersArr" :useinput="false">
</CMySelect>
<CMySelect :label="$t('cal.where')" :value.sync="eventForm.wherecode" optval="code" <CMySelect :label="$t('cal.where')" :value.sync="eventForm.wherecode" optval="code"
optlab="placename" optlab="placename"
:options="getWhereArr" :useinput="false"> :options="getWhereArr" :useinput="false">
</CMySelect> </CMySelect>
</div>
<div class="q-gutter-sm myflex wrap">
<q-checkbox class="myflex wrap" dense v-model="eventForm.internal"
:label="$t('event.internal')"></q-checkbox>
<q-checkbox class="myflex wrap" dense v-model="eventForm.lunchAvailable"
:label="$t('event.lunchAvailable')"></q-checkbox>
<q-checkbox class="myflex wrap" dense v-model="eventForm.dinnerAvailable"
:label="$t('event.dinnerAvailable')"></q-checkbox>
<q-checkbox class="myflex wrap" dense v-model="eventForm.dinnerSharedAvailable"
:label="$t('event.dinnerSharedAvailable')"></q-checkbox>
<q-checkbox class="myflex wrap" dense v-model="eventForm.news" <q-checkbox class="myflex wrap" dense v-model="eventForm.news"
:label="$t('event.news')"></q-checkbox> :label="$t('event.news')"></q-checkbox>
<q-checkbox class="myflex wrap" dense v-model="eventForm.nobookable" <q-checkbox class="myflex wrap" dense v-model="eventForm.nobookable"
@@ -207,36 +271,6 @@
</div> </div>
<div class="q-gutter-sm myflex">
<q-input class="myflex" dense v-model="eventForm.img"
:label="$t('event.img')"></q-input>
<q-input class="myflex" dense v-model="eventForm.img_small"
:label="$t('event.img_small')"></q-input>
</div>
<div class="q-gutter-sm myflex">
<q-input
class="myflex"
:style="`background-color: ${eventForm.bgcolor} !important; color: white !important;`"
filled
color="white"
dense
:label="$t('event.bgcolor')"
v-model="eventForm.bgcolor">
<template #append>
<q-icon name="colorize" class="cursor-pointer" color="white">
<q-popup-proxy>
<q-color format-model="hex" v-model="eventForm.bgcolor"></q-color>
</q-popup-proxy>
</q-icon>
</template>
</q-input>
<q-input class="myflex" dense v-model="eventForm.icon"
:label="$t('event.icon')"></q-input>
</div>
<div class="q-gutter-sm myflex"> <div class="q-gutter-sm myflex">
@@ -255,11 +289,24 @@
</div> </div>
<div class="q-gutter-sm myflex"> <div class="q-gutter-sm myflex">
<CMySelect myclass="myflex" :label="$t('event.pagefooter') + ' 1°'"
:value.sync="eventForm.pagefooter"
style="min-width: 300px;"
:multiple="true"
optval="path" optlab="title"
:options="getInternalPagesArr" :useinput="false">
</CMySelect>
<br>
<q-input class="myflex" dense v-model="eventForm.linkpage" <q-input class="myflex" dense v-model="eventForm.linkpage"
:label="$t('event.linkpage')"></q-input> :label="$t('event.linkpage')"></q-input>
<q-input class="myflex" dense v-model="eventForm.linkpdf" <q-input class="myflex" dense v-model="eventForm.linkpdf"
:label="$t('event.linkpdf')"></q-input> :label="$t('event.linkpdf')"></q-input>
<q-input class="myflex" dense v-model="eventForm.facebook"
:label="$t('event.facebook')"></q-input>
</div> </div>
</q-tab-panel>
</q-tab-panels>
</q-form> </q-form>
</q-card-section> </q-card-section>
@@ -282,7 +329,7 @@
<q-card-section class="inset-shadow"> <q-card-section class="inset-shadow">
<q-img :src="getImgEvent(myevent)" <q-img :src="getImgEvent(myevent)"
class="absolute-top" class="absolute-top"
style="height: 150px;" style="height: 200px;"
:alt="myevent.title"> :alt="myevent.title">
</q-img> </q-img>
<div style="margin-top: 150px;"> <div style="margin-top: 150px;">
@@ -301,6 +348,7 @@
<div class="q-pa-xs"> <div class="q-pa-xs">
<q-card class="text-white windowcol" style="display: block; "> <q-card class="text-white windowcol" style="display: block; ">
<q-card-section class="q-pa-xs"> <q-card-section class="q-pa-xs">
<div style="display: inline-flex; " class="q-px-xs centermydiv"> <div style="display: inline-flex; " class="q-px-xs centermydiv">
<q-checkbox <q-checkbox
:disable="((bookEventpage.bookedevent && bookEventpage.bookedevent.booked) || (bookEventpage.bookedevent === undefined)) || !isEventEnabled(myevent)" :disable="((bookEventpage.bookedevent && bookEventpage.bookedevent.booked) || (bookEventpage.bookedevent === undefined)) || !isEventEnabled(myevent)"
@@ -317,8 +365,47 @@
</q-select> </q-select>
</div> </div>
</div> </div>
<div v-if="myevent.lunchAvailable" class="q-px-xs centermydiv" style="display: inline-flex; ">
<div style="display: inline-flex; " class="q-px-xs centermydiv">
<div class="itemprenota">{{ $t('cal.selnumpeopleLunch') }}</div>
<div class="q-gutter-xs"
style="min-width: 140px; margin-left: 10px;">
<q-select
rounded outlined v-model="bookEventForm.numpeopleLunch"
:options="tools.SelectListNumPeople"
:label="$t('cal.Lunch')" emit-value map-options>
</q-select>
</div>
</div>
</div>
<br>
<div v-if="myevent.dinnerAvailable" class="q-px-xs centermydiv" style="display: inline-flex; ">
<div style="display: inline-flex; " class="q-px-xs centermydiv">
<div class="itemprenota">{{ $t('cal.selnumpeopleDinner') }}</div>
<div class="q-gutter-xs " style="min-width: 180px; margin-left: 10px;">
<q-select
rounded outlined v-model="bookEventForm.numpeopleDinner"
:options="tools.SelectListNumPeople"
:label="$t('cal.Dinner')" emit-value map-options>
</q-select>
</div>
</div>
</div>
<div v-if="myevent.dinnerSharedAvailable" class="q-px-xs centermydiv"
style="display: inline-flex; ">
<div style="display: inline-flex; " class="q-px-xs centermydiv">
<div class="itemprenota">{{ $t('cal.selnumpeopleDinnerShared') }}</div>
<div class="q-gutter-xs " style="min-width: 180px; margin-left: 10px;">
<q-select
rounded outlined v-model="bookEventForm.numpeopleDinnerShared"
:options="tools.SelectListNumPeople"
:label="$t('cal.DinnerShared')" emit-value map-options>
</q-select>
</div>
</div>
</div>
<q-input v-model="bookEventForm.msgbooking" :label="$t('cal.msgbooking')+':'" <q-input v-model="bookEventForm.msgbooking" :label="$t('cal.writemsg')+':'"
type="textarea" debounce="500" type="textarea" debounce="500"
input-class="myinput-area" input-class="myinput-area"
> >
@@ -342,7 +429,7 @@
@click="tools.CancelBookingEvent(mythis, myevent, bookEventForm._id, true)"></q-btn> @click="tools.CancelBookingEvent(mythis, myevent, bookEventForm._id, true)"></q-btn>
<q-btn v-if="checkseinviaMsg" flat :label="$t('dialog.sendonlymsg')" color="primary" <q-btn v-if="checkseinviaMsg" flat :label="$t('dialog.sendonlymsg')" color="primary"
@click="sendMsg(myevent)"></q-btn> @click="sendMsg(myevent)"></q-btn>
<q-btn v-else flat :label="getTitleBtnBooking" color="primary" @click="saveBookEvent(myevent)" <q-btn v-else :label="getTitleBtnBooking" color="primary" @click="saveBookEvent(myevent)"
:disable="!(bookEventpage.state === EState.Creating || hasModifiedBooking)"></q-btn> :disable="!(bookEventpage.state === EState.Creating || hasModifiedBooking)"></q-btn>
@@ -382,7 +469,7 @@
<div class="q-pa-xs"> <div class="q-pa-xs">
<q-card class="text-white windowcol"> <q-card class="text-white windowcol">
<q-card-section> <q-card-section>
<q-input v-model="askInfoForm.message" :label="$t('cal.msgbooking')+':'" <q-input v-model="askInfoForm.message" :label="$t('cal.writemsg')+':'"
autofocus debounce="500" type="textarea" autofocus debounce="500" type="textarea"
input-class="myinput-area"> input-class="myinput-area">
</q-input> </q-input>
@@ -429,6 +516,7 @@
:enable-themes="enableThemes === true" :enable-themes="enableThemes === true"
--> -->
<q-calendar <q-calendar
v-if="visuAllCal" v-if="visuAllCal"
ref="calendar" ref="calendar"
@@ -473,8 +561,8 @@
dayPadding="35px 2px" dayPadding="35px 2px"
> >
<template #day="{ date }"> <template #day="{ timestamp }">
<template v-for="(event, index) in getEvents(date)"> <template v-for="(event, index) in getEvents(timestamp.date)">
<q-badge <q-badge
:key="index" :key="index"
style="width: 100%; cursor: pointer;" style="width: 100%; cursor: pointer;"
@@ -496,9 +584,9 @@
</template> </template>
</template> </template>
<template #day-header="{ date }"> <template #day-header="{ timestamp }">
<div class="row justify-center"> <div class="row justify-center">
<template v-for="(event, index) in eventsMap[date]"> <template v-for="(event, index) in eventsMap[timestamp.date]">
<q-badge <q-badge
:key="index" :key="index"
class="q-ma-xs" class="q-ma-xs"
@@ -509,8 +597,8 @@
</template> </template>
</div> </div>
</template> </template>
<template #day-body="{ date, timeStartPos, timeDurationHeight }"> <template #day-body="{ timestamp, timeStartPos, timeDurationHeight }">
<template v-for="(event, index) in getEvents(date)"> <template v-for="(event, index) in getEvents(timestamp.date)">
<div <div
:key="index" :key="index"
:label="tools.getstrTime(event.dateTimeStart)" :label="tools.getstrTime(event.dateTimeStart)"
@@ -577,8 +665,13 @@
<div class="q-mt-md"> <div class="q-mt-md">
<div v-if="!mysingleevent"> <div v-if="!mysingleevent">
<p class="text-subtitle1 text-red bg-amber text-center ">LISTA PROSSIMI <span v-if="showfirstN > 0">{{ showfirstN }}</span> <p class="text-subtitle1 text-red bg-amber text-center ">LISTA PROSSIMI <span
v-if="showfirstN > 0">{{ showfirstN }}</span>
EVENTI:</p> EVENTI:</p>
<q-toggle v-model="showPrev" :val="lists.MenuAction.SHOW_PREV_REC"
:label="$t('grid.showprevedit')"></q-toggle>
<q-markup-table wrap-cells bordered separator="horizontal" class="listaev__table"> <q-markup-table wrap-cells bordered separator="horizontal" class="listaev__table">
<tbody> <tbody>
<tr v-for="(event, index) in getEventList()" class="listaev listaev__table"> <tr v-for="(event, index) in getEventList()" class="listaev listaev__table">
@@ -630,7 +723,7 @@
</div> </div>
<div class="listaev__date listaev__align_center_mobile"> <div class="listaev__date listaev__align_center_mobile text-center">
<span v-html="tools.getstrDateTimeEvent(mythis, event, true)"></span> <span v-html="tools.getstrDateTimeEvent(mythis, event, true)"></span>
</div> </div>
@@ -638,15 +731,20 @@
<div style="margin: 10px;"></div> <div style="margin: 10px;"></div>
<div class=""> <div v-if="event.internal">
<q-chip color="blue" text-color="white">Evento Interno:</q-chip>
</div>
<div class="text-center">
<!-- Se c'è un link, allora --> <!-- Se c'è un link, allora -->
<q-btn size="md" type="a" <q-btn size="md" type="a"
class="text-center boldhigh"
:to="`/event/${event.typol}/${event._id}`" :to="`/event/${event.typol}/${event._id}`"
target="_blank" target="_blank"
:style="`background-color: ${event.bgcolor} !important; color: white !important;`" :style="`background-color: ${event.bgcolor} !important; color: white !important;`"
ripple ripple
rounded rounded
:label="event.title" :icon="event.icon" :label="getTitleEv(event)"
:color="event.bgcolor" text-color="white" glossy> :color="event.bgcolor" text-color="white" glossy>
</q-btn> </q-btn>
@@ -671,6 +769,8 @@
<CMyTeacher :username="event.teacher"></CMyTeacher> <CMyTeacher :username="event.teacher"></CMyTeacher>
<CMyTeacher :username="event.teacher2"></CMyTeacher> <CMyTeacher :username="event.teacher2"></CMyTeacher>
<CMyTeacher :username="event.teacher3"></CMyTeacher>
<CMyTeacher :username="event.teacher4"></CMyTeacher>
<span v-if="event.wherecode" class=""> <span v-if="event.wherecode" class="">
<span v-if="tools.isMobile()"><br/></span> <span v-if="tools.isMobile()"><br/></span>
@@ -678,12 +778,14 @@
<q-chip> <q-chip>
<q-avatar v-if="getWhereIcon(event.wherecode)"> <q-avatar v-if="getWhereIcon(event.wherecode)">
<img :src="`../../statics/images/avatar/` + getWhereIcon(event.wherecode)" <img
:src="`../../statics/images/avatar/` + getWhereIcon(event.wherecode)"
:alt="event.wherecode"> :alt="event.wherecode">
</q-avatar> </q-avatar>
<q-avatar color="blue" font-size="20px" text-color="white" icon="home"> <q-avatar color="blue" font-size="20px" text-color="white" icon="home">
</q-avatar> </q-avatar>
<span class="cal__teacher-content">{{getWhereName(event.wherecode)}}</span> <span
class="cal__teacher-content">{{ getWhereName(event.wherecode) }}</span>
</q-chip> </q-chip>
</span> </span>
</div> </div>
@@ -692,7 +794,8 @@
class="margin_with"></span></span> class="margin_with"></span></span>
<span v-if="!isShowPrice(event)" class=""> <span v-if="!isShowPrice(event)" class="">
<q-chip class="glossy" color="orange" text-color="white"> <q-chip class="glossy" color="orange" text-color="white">
<span class="cal__quota-content">{{getContribtypeById(event.contribtype)}}</span> <span
class="cal__quota-content">{{ getContribtypeById(event.contribtype) }}</span>
</q-chip> </q-chip>
</span> </span>
@@ -703,7 +806,7 @@
</div> </div>
<div class="row justify-end"> <div class="row centeritems">
<q-btn v-if="event.linkpdf" size="md" type="a" <q-btn v-if="event.linkpdf" size="md" type="a"
:href="`../../statics/` + event.linkpdf" :href="`../../statics/` + event.linkpdf"
target="_blank" rounded color="primary" icon="info" target="_blank" rounded color="primary" icon="info"
@@ -711,21 +814,21 @@
:label="$t('cal.showpdf')"> :label="$t('cal.showpdf')">
</q-btn> </q-btn>
<q-btn v-if="event.bodytext" rounded outline <q-btn rounded
class="q-ma-sm" class="q-ma-sm"
color="primary" color="primary"
:to="`/event/${event.typol}/${event._id}`" :to="`/event/${event.typol}/${event._id}`"
:label="$t('event.showpage')"> :label="$t('event.openpage')">
</q-btn> </q-btn>
<q-btn rounded outline class="q-ma-sm" <q-btn rounded outline class="q-ma-sm"
color="primary" @click="askForInfoEventMenu(event)" color="primary" @click="askForInfoEventMenu(event)"
:label="$t('event.askinfo')"> :label="$t('event.askinfo')">
</q-btn> </q-btn>
<q-btn rounded outline class="q-ma-sm" <!--<q-btn rounded outline class="q-ma-sm"
v-if="!event.nobookable && !isAlreadyBooked(event) && static_data.functionality.BOOKING_EVENTS" v-if="!event.nobookable && !isAlreadyBooked(event) && static_data.functionality.BOOKING_EVENTS"
color="primary" @click="addBookEventMenu(event)" color="primary" @click="addBookEventMenu(event)"
:label="$t('cal.booking')" :disable="!isEventEnabled(event)"> :label="$t('cal.booking')" :disable="!isEventEnabled(event)">
</q-btn> </q-btn>-->
<q-btn rounded outline class="q-ma-sm" <q-btn rounded outline class="q-ma-sm"
v-if="!event.nobookable && isAlreadyBooked(event) && static_data.functionality.BOOKING_EVENTS" v-if="!event.nobookable && isAlreadyBooked(event) && static_data.functionality.BOOKING_EVENTS"
text-color="red" text-color="red"
@@ -766,6 +869,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</template> </template>
<script lang="ts" src="./CEventsCalendar.ts"> <script lang="ts" src="./CEventsCalendar.ts">
</script> </script>

View File

@@ -52,7 +52,7 @@ export default class CGeoChart extends Vue {
for (const rec of this.mydata) { for (const rec of this.mydata) {
alldata = [] alldata = []
alldata.push(tools.getNationsByNationality(rec._id, true)) alldata.push(tools.getNationsByNationality(rec._id))
alldata.push(rec.count) alldata.push(rec.count)
this.mydatafixed.push(alldata) this.mydatafixed.push(alldata)

View File

@@ -12,5 +12,11 @@
} }
.q-table td { .q-table td {
padding: 0; padding-left: 1px;
padding-right: 2px;
padding-top: 0;
padding-bottom: 0;
&__title {
font-size: 1rem;
}
} }

View File

@@ -5,7 +5,7 @@ import { GlobalStore, UserStore } from '../../store/Modules/index'
import { tools } from '../../store/Modules/tools' import { tools } from '../../store/Modules/tools'
import { shared_consts } from '../../common/shared_vuejs' import { shared_consts } from '../../common/shared_vuejs'
import { ICategory, IColGridTable, IFilter, ITableRec } from '../../model' import { ICategory, IColGridTable, IFilter, ITableRec, IPagination } from '../../model'
import { CTodo } from '../todos/CTodo' import { CTodo } from '../todos/CTodo'
import { SingleProject } from '../projects/SingleProject' import { SingleProject } from '../projects/SingleProject'
import { lists } from '../../store/Modules/lists' import { lists } from '../../store/Modules/lists'
@@ -19,14 +19,32 @@ import { CMyDashboard } from '../CMyDashboard'
components: { CMyPopupEdit, CTitleBanner, CMyDashboard } components: { CMyPopupEdit, CTitleBanner, CMyDashboard }
}) })
export default class CGridTableRec extends Vue { export default class CGridTableRec extends Vue {
private addRow: string = 'Aggiungi'
@Prop({ required: true }) public prop_mytitle: string @Prop({ required: true }) public prop_mytitle: string
@Prop({ required: false }) public prop_mytable: string @Prop({ required: false }) public prop_mytable: string
@Prop({ required: false, default: null }) public prop_mycolumns: any[] @Prop({ required: false, default: null }) public prop_mycolumns: any[]
@Prop({ required: false, default: '' }) public prop_colkey: string @Prop({ required: false, default: '' }) public prop_colkey: string
@Prop({ required: false, default: '' }) public prop_codeId: string
@Prop({ required: false, default: '' }) public nodataLabel: string @Prop({ required: false, default: '' }) public nodataLabel: string
@Prop({ required: false, default: 'Aggiungi' }) public labelBtnAddRow: string
@Prop({ required: false, default: '' }) public noresultLabel: string @Prop({ required: false, default: '' }) public noresultLabel: string
@Prop({
required: false, default: function mydef(): object {
return {}
}
}) public defaultnewrec: object
@Prop({ required: false, default: null }) public tablesList: ITableRec[] @Prop({ required: false, default: null }) public tablesList: ITableRec[]
@Prop({ required: false, default: null }) public arrfilters: IFilter[] @Prop({ required: false, default: null }) public arrfilters: IFilter[]
@Prop({ required: false, default: [] }) public filterdef: number[]
@Prop({ required: false, default: {} }) public extraparams: any
@Prop({
required: false,
default: { sortBy: '', descending: false, page: 1, rowsNumber: 10, rowsPerPage: 10 }
}) public pagination: IPagination
public newRecordBool: boolean = false
public newRecord: any = {}
public savenewRec: boolean = false
public mytable: string public mytable: string
public mytitle: string public mytitle: string
@@ -39,13 +57,6 @@ export default class CGridTableRec extends Vue {
public $q public $q
public $t public $t
public loading: boolean = false public loading: boolean = false
public pagination: {
sortBy: string,
descending: boolean
rowsNumber: number
page: number,
rowsPerPage: number // specifying this determines pagination is server-side
} = { sortBy: '', descending: false, page: 1, rowsNumber: 10, rowsPerPage: 10 }
public serverData: any [] = [] public serverData: any [] = []
public spinner_visible: boolean = false public spinner_visible: boolean = false
@@ -55,9 +66,9 @@ export default class CGridTableRec extends Vue {
public valPrec: string = '' public valPrec: string = ''
public separator: 'horizontal' public separator: 'horizontal'
public myfilter = undefined public myfilter: any = ''
public myfilterand = [] public myfilterand = []
public rowsel: any public rowsel: any = {}
public dark: boolean = true public dark: boolean = true
public canEdit: boolean = false public canEdit: boolean = false
@@ -71,6 +82,11 @@ export default class CGridTableRec extends Vue {
public selected = [] public selected = []
@Watch('prop_codeId')
public changeprop_codeId() {
this.refresh()
}
get isAdmin() { get isAdmin() {
return UserStore.state.isAdmin return UserStore.state.isAdmin
} }
@@ -79,6 +95,10 @@ export default class CGridTableRec extends Vue {
return UserStore.state.isManager return UserStore.state.isManager
} }
get isSocioResidente() {
return UserStore.state.my.profile.socioresidente
}
get isTutor() { get isTutor() {
return UserStore.state.isTutor return UserStore.state.isTutor
} }
@@ -154,7 +174,11 @@ export default class CGridTableRec extends Vue {
} }
public annulla(val) { public annulla(val) {
// this.rowclicksel = null console.log('annulla')
GlobalStore.actions.DeleteRec({ table: this.mytable, id: this.newRecord._id })
.then((ris) => {
return true
})
} }
public SaveValue(newVal, valinitial) { public SaveValue(newVal, valinitial) {
@@ -189,9 +213,15 @@ export default class CGridTableRec extends Vue {
this.valPrec = valinitial this.valPrec = valinitial
this.saveFieldValue(mydata) this.saveFieldValue(mydata)
}
public beforeMount() {
console.log('beforeMount')
} }
public created() { public created() {
console.log('created')
// this.serverData = this.mylist.slice() // [{ chiave: 'chiave1', valore: 'valore 1' }] // this.serverData = this.mylist.slice() // [{ chiave: 'chiave1', valore: 'valore 1' }]
this.mytable = this.prop_mytable this.mytable = this.prop_mytable
@@ -228,6 +258,8 @@ export default class CGridTableRec extends Vue {
const myfilter = this.myfilter const myfilter = this.myfilter
const myfilterand = this.myfilterand const myfilterand = this.myfilterand
this.savefilter()
if (!this.mytable) if (!this.mytable)
return return
@@ -292,16 +324,20 @@ export default class CGridTableRec extends Vue {
myobj[sortBy] = 1 myobj[sortBy] = 1
} }
const params: IParamsQuery = { let params: IParamsQuery = {
table: this.mytable, table: this.mytable,
startRow, startRow,
endRow, endRow,
filter: myfilter, filter: myfilter,
filterand: myfilterand, filterand: myfilterand,
sortBy: myobj, sortBy: myobj,
descending descending,
userId: UserStore.state.my._id,
codeId: this.prop_codeId
} }
params = { ...params, ...this.extraparams }
const data = await GlobalStore.actions.loadTable(params) const data = await GlobalStore.actions.loadTable(params)
if (data) { if (data) {
@@ -368,6 +404,27 @@ export default class CGridTableRec extends Vue {
return this.returnedCount return this.returnedCount
} }
public async createNewRecordDialog() {
const mydata = {
table: this.mytable,
data: {}
}
mydata.data = this.defaultnewrec
// const mykey = fieldsTable.getKeyByTable(this.mytable)
// mydata.data[mykey] = ''
console.log('mydata', mydata)
const data = await GlobalStore.actions.saveTable(mydata)
this.newRecord = data
this.newRecordBool = true
}
public async createNewRecord() { public async createNewRecord() {
this.loading = true this.loading = true
@@ -376,10 +433,13 @@ export default class CGridTableRec extends Vue {
data: {} data: {}
} }
mydata.data = this.defaultnewrec
// const mykey = fieldsTable.getKeyByTable(this.mytable) // const mykey = fieldsTable.getKeyByTable(this.mytable)
// mydata.data[mykey] = '' // mydata.data[mykey] = ''
console.log('mydata', mydata)
const data = await GlobalStore.actions.saveTable(mydata) const data = await GlobalStore.actions.saveTable(mydata)
this.serverData.push(data) this.serverData.push(data)
@@ -403,11 +463,13 @@ export default class CGridTableRec extends Vue {
} }
public mounted() { public mounted() {
console.log('GridTable mounted', this.tablesel)
if (!!this.tablesList) { if (!!this.tablesList) {
this.canEdit = tools.getCookie(tools.CAN_EDIT, this.canEdit) === 'true' this.canEdit = tools.getCookie(tools.CAN_EDIT, this.canEdit) === 'true'
this.tablesel = tools.getCookie('tablesel', this.tablesel) this.tablesel = tools.getCookie('tablesel', this.tablesel)
} }
this.myfilterand = this.filterdef
console.log('this.tablesel', this.tablesel) console.log('this.tablesel', this.tablesel)
if (this.tablesel === '') { if (this.tablesel === '') {
@@ -588,9 +650,11 @@ export default class CGridTableRec extends Vue {
else else
return '' return ''
} }
public getSelectedString() { public getSelectedString() {
return this.selected.length === 0 ? '' : `${this.selected.length} record${this.selected.length > 1 ? 's' : ''} selected of ${this.serverData.length}` return this.selected.length === 0 ? '' : `${this.selected.length} record${this.selected.length > 1 ? 's' : ''} selected of ${this.serverData.length}`
} }
public selectionclick(details) { public selectionclick(details) {
// console.log('selectionclick this.selected', this.selected, 'details', details) // console.log('selectionclick this.selected', this.selected, 'details', details)
if (details.added) { if (details.added) {
@@ -618,4 +682,49 @@ export default class CGridTableRec extends Vue {
public changemyfilterand() { public changemyfilterand() {
this.refresh() this.refresh()
} }
public async saveNewRecord() {
console.log('saveNewRecord')
this.savenewRec = true
const mydata = {
table: this.mytable,
data: {}
}
mydata.data = this.newRecord
const data = await GlobalStore.actions.saveTable(mydata)
.then((ris) => {
if (ris) {
// console.log('ris', ris)
this.newRecordBool = false
this.refresh()
}
})
}
public hidewindow() {
console.log('hidewindow')
if (!this.savenewRec) {
this.annulla(0)
}
}
get isfinishLoading() {
return GlobalStore.state.finishLoading
}
get getlabelAddRow() {
return this.labelBtnAddRow
}
get visButtRow() {
return this.labelBtnAddRow !== this.addRow
}
public savefilter() {
// console.log('Close')
this.$emit('savefilter', this.myfilterand)
}
} }

View File

@@ -1,6 +1,11 @@
<template> <template>
<div class="q-pa-xs"> <div class="q-pa-xs" v-if="isfinishLoading">
<div class="centermydiv q-ma-sm" style="text-align: center">
<q-btn v-if="mytable && visButtRow" rounded dense color="primary"
size="lg"
:label="getlabelAddRow"
@click="createNewRecordDialog"></q-btn>
</div>
<q-table <q-table
flat flat
@@ -20,8 +25,7 @@
:no-results-label="noresultLabel" :no-results-label="noresultLabel"
:selected-rows-label="getSelectedString" :selected-rows-label="getSelectedString"
selection="single" selection="single"
:selected.sync="selected" :selected.sync="selected">
>
<template v-slot:header="props"> <template v-slot:header="props">
@@ -42,7 +46,7 @@
</template> </template>
<template v-slot:top="props"> <template v-slot:top="props">
<div class="col-2 q-table__title">{{ mytitle }}</div> <div class="q-table__title" style="min-width: 150px;">{{ mytitle }}</div>
<!--<p style="color:red"> Rows: {{ getrows }}</p>--> <!--<p style="color:red"> Rows: {{ getrows }}</p>-->
@@ -54,16 +58,17 @@
</q-input> </q-input>
<q-toggle v-if="mytable" v-model="canEdit" :disable="disabilita" :val="lists.MenuAction.CAN_EDIT_TABLE" <q-toggle v-if="mytable" v-model="canEdit" :disable="disabilita" :val="lists.MenuAction.CAN_EDIT_TABLE"
class="q-mx-sm" class="q-mx-sm"
:label="$t('grid.editvalues')" @input="changefuncAct" :label="$t('grid.editvalues')" @input="changefuncAct">
></q-toggle> </q-toggle>
<q-btn v-if="mytable" flat dense color="primary" :disable="loading || !canEdit" <q-btn v-if="mytable" flat dense color="primary" :disable="loading || !canEdit"
:label="$t('grid.addrecord')" :label="$t('grid.addrecord')"
@click="createNewRecord"></q-btn> @click="createNewRecord">
</q-btn>
<q-space/> <q-space/>
<!--<q-toggle v-for="(mycol, index) in mycolumns" v-model="colVisib" :val="rec.field" :label="mycol.label"></q-toggle>--> <!--<q-toggle v-for="(mycol, index) in mycolumns" v-model="colVisib" :val="rec.field" :label="mycol.label"></q-toggle>-->
<q-select <q-select
@@ -79,7 +84,7 @@
map-options map-options
:options="mycolumns" :options="mycolumns"
option-value="name" option-value="name"
style="min-width: 150px" º
@input="changeCol"> @input="changeCol">
</q-select> </q-select>
@@ -102,11 +107,14 @@
</q-inner-loading> </q-inner-loading>
<div class="row"> <div class="row">
<q-toggle v-for="(filter, index) of arrfilters" :key="index" v-model="myfilterand" :val="filter.value" <q-toggle v-for="(filter, index) of arrfilters"
:label="filter.label"></q-toggle> :key="index"
v-model="myfilterand" :disable="filter.hide"
:val="filter.value"
:label="filter.label">
</q-toggle>
</div> </div>
</template> </template>
<template v-slot:body="props"> <template v-slot:body="props">
@@ -141,6 +149,7 @@
</q-td> </q-td>
</q-tr> </q-tr>
</template> </template>
<!-- <!--
<q-btn <q-btn
flat round dense flat round dense
@@ -193,6 +202,40 @@
</div> </div>
</div> </div>
</div> </div>
<q-dialog v-model="newRecordBool" @hide="hidewindow">
<q-card :style="`min-width: `+ tools.myheight_dialog() + `px;`">
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
{{ mytitle }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<div v-for="col in mycolumns" :key="col.name"
v-if="colVisib.includes(col.field + col.subfield)">
<div>
<CMyPopupEdit :canEdit="true"
:col="col"
:row.sync="newRecord"
:field="col.field"
:subfield="col.subfield"
minuteinterval="1"
:visulabel="true"
@save="SaveValue"
@show="selItem(newRecord, col)"
@showandsave="showandsel">
</CMyPopupEdit>
</div>
</div>
</q-card-section>
<q-card-actions align="center">
<q-btn flat :label="$t('dialog.ok')" color="primary" @click="saveNewRecord"></q-btn>
<q-btn flat :label="$t('dialog.cancel')" color="primary" v-close-popup @click="annulla"></q-btn>
</q-card-actions>
</q-card>
</q-dialog>
</div> </div>
</template> </template>
<script lang="ts" src="./CGridTableRec.ts"> <script lang="ts" src="./CGridTableRec.ts">

View File

@@ -1,922 +1,11 @@
<template> <template>
<div> <div>
<div v-if="toolsext.isLang('it')"> <div v-if="toolsext.isLang('it')">
<CTitleBanner title="AYNI GIFT*ECOnomy"></CTitleBanner> <CTitleBanner title=""></CTitleBanner>
<CImgText src=""> <CImgText src="">
<p class="cltexth3 text-green-8 q-ma-sm"><span <p class="cltexth3 text-green-8 q-ma-sm"><span
class="boldhigh">Movimento di ECOnomia Solidale ~ AYNI GIFT*ECOnomy</span></p> class="boldhigh">Movimento </span></p>
<p>
<strong>Ayni</strong> è un movimento di economia solidale. Si basa sulla pratica del
<strong>regalo</strong>,
del <strong>donare come risorsa e come ricchezza! Dare e donare mi apre al ricevere, crea relazioni
basate
sullaiuto e la gratitudine</strong>, non
sul profitto.</p>
<p>
<strong>Ayni</strong> è pensata e creata per permettere alle persone di aiutarsi e sostenersi fra di
loro, in
modo da realizzare i propri sogni e i propri progetti di vita. È un progetto serio che richiede, a
chi ne vuol
far parte, di
comprendere che questo non è un sistema per guadagnare o un classico fondo di investimento, ma un
modo per
recuperare quel fattore umano di aiuto reciproco attraverso il continuo sostegno e accompagnamento
dei nuovi
membri supportati da chi ha già fatto esperienza in questo e in altri movimenti di Economia
Solidale,
attraverso
il fare Rete, creando così <strong>relazioni e esperienze di Valore, generando Ricchezza
Reale</strong>.</p>
<p class="text-center"><strong>Strumenti necessari per far parte di AYNI</strong></p>
<ul class="lista text-center">
<li>Cellulare e/o computer</li>
<li>App Telegram</li>
</ul>
<p class="cltexth3 text-red q-ma-lg">Cosa devi fare per poter entrare in <strong>Ayni</strong>?</p>
<p class="cltexth3 text-blue q-ma-lg">Fase 1: Accoglienza</p>
<ul class="lista">
<li>Qualcuno ti ha invitato e ti ha dato il link di accesso al sito <strong>AYNI
GIFT*ECOnomy.</strong> e ti
sei iscritto.
</li>
<li>Entri nella chat Telegram <strong>Ayni EMPOWER</strong>, luogo dove ci incontriamo, accogliamo i
nuovi
invitati,
e ci aiutiamo a sostenere e ad espandere la nostra visione e il movimento.
</li>
<li>
Entri nel Canale Telegram <strong>AYNI BIBLIO</strong> che è un canale di informazioni in cui
vengono
postati
comunicati, notizie e novità sul movimento.
</li>
<li>
Infine abbiamo Telegram <strong>AYNI HELP</strong> dove puoi entrare ogni volta che dovessero
sorgerti
domande
o dubbi, trovando un aiuto pratico a tua disposizione.
</li>
</ul>
<p class="cltexth3 text-blue q-ma-lg">Fase 2: Completamento dei requisiti richiesti</p>
<ol class="lista">
<li>Leggere ed accettare le nostre Linee Guida e Guardare i Video Introduttivi al Movimento.</li>
<li>Attivare almeno <strong>2 metodi di pagamento</strong>.
<strong>Revolut, Payeer e Paypal (tramite MoneyBox)</strong> sono quelli maggiormente consigliati.<br>
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Fase 3: Lista d'imbarco e partenza della Nave</p>
<p>In AYNI La sequenza dei passaggi è programmata in anticipo, in modo da:</p>
<ul class="lista">
<li>garantire che i 3 passi del processo si svolgano nei tempi e nella forma previsti.</li>
<li>realizzare e concludere il processo in maniera semplice, godibile e semi-automatizzata.</li>
</ul>
<p>La tua Nave verrà programmata e tu entrerai in una chat coi tuoi compagni di viaggio. Allo stesso
tempo,
ti verrà comunicata la data in cui la tua Nave salperà, cioè quando potrai donare i 33€ e il
nominativo e i
dati del Sognatore a cui fare il tuo dono.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
Le date di programmazione e dei passi sono intese come <em>previsioni di attivazione e di
completamento</em>.
Nel caso il flusso di persone e di invitati non consentisse di mantenere e realizzare quanto
programmato nei
tempi e forma previsti, le date verranno riprogrammate per permettere il completamento di tutti e
non lasciare
che il
viaggio possa interrompersi.
</p>
<p>Nel fare esperienza dei 3 passi incontreremo e transiteremo in 3 personaggi:</p>
<p style=""><strong>Donatore</strong>: Colui che effettua il Dono di 33€.<br>
<strong>Mediatore</strong>: È il ponte, colui che mette in relazione Donatori e Sognatore.<br>
<strong>Sognatore</strong>: Colui che manifesta il suo sogno ricevendo i Doni.<br>
</p>
<CTitleBanner title="Visualizza in Anteprima I 3 Passi (clicca qui)" bgcolor="bg-green-5" canopen="true"
:visible="false" imgpreview="statics/images/passo_1.jpg">
<p>Dal momento in cui conosco il giorno della partenza della mia Nave, i passi da compiere
saranno questi:</p>
<div class="text-center">
<q-img src="statics/images/passo_1.jpg" class="img"></q-img>
</div>
<p class="grass">Entro nella chat Telegram come Donatore:</p>
<p>La chat è formata da 8 donatori e un mediatore.<br>
Il mio compito è di regalare 33€ al Sognatore (il mediatore mi guiderà nel processo).<br>
Il dono lo farò nella data di attivazione della billetera e del passo 1.</p>
<div class="text-center">
<q-img src="statics/images/passo_2.jpg" class="img"></q-img>
</div>
<p class="grass">Apro una chat Telegram e divento Mediatore:</p>
<p>La chat è formata da 8 donatori (che aiuterò ad entrare in chat) e da me, il Mediatore.<br>
Il mio compito è quello di assicurarmi che tutti i Donatori facciano il Dono al Sognatore.
Il sistema invierà in automatico le istruzioni per fare il Dono, il Mediatore (io) verificherà e
accompagnerà il processo.
</p>
<div class="text-center">
<q-img src="statics/images/passo_3.jpg" class="img"></q-img>
</div>
<p class="grass">Divento Sognatore:</p>
<p>La chat dove sono Sognatore è la stessa e con le stesse persone aperta nel passo 2 (dove io ero
Mediatore)
e anche qui cambiano i ruoli, ovvero ora ci sono 8 mediatori e io, il Sognatore.<br>
Il mio compito è quello di aprirmi a ricevere i Doni da ciascun Donatore, completarmi e
celebrare
lAbbondanza.<br>
<br>
</p>
</CTitleBanner>
<p class="text-blue-10 q-ma-lg clBorderImportant text-center" style="font-size: 1.15rem;">La Chat
Automatica
<strong>AYNI BOT</strong> mi invierà tutte le istruzioni che dovrò compiere, al momento opportuno!
</p>
<p class="cltexth2 text-green-8 q-ma-lg"><span class="boldhigh">Bene... Ora mettiti comodo, il tuo viaggio è cominciato!</span>
</p>
</CImgText> </CImgText>
</div>
<div v-else-if="toolsext.isLang('si')">
<CTitleBanner title="AYNI DARILO * ECOnomy"></CTitleBanner>
<CImgText src="">
<p class="cltexth3 text-green-8 q-ma-sm"><span
class="boldhigh">Gibanje Solidarna ECOnomia ~ AYNI DARILO * ECOnomy</span></p>
<p>
Ayni je gibanje solidarnostnega gospodarstva. Temelji na praksi darovanja, dajanja kot viru in
obilja! Dajanje me odpira do sprejemanja, ustvarja odnose, ki temeljijo na pomoči in hvaležnosti, ne
na dobičku.
</p>
<p>
Ayni je zasnovana in ustvarjena tako, da si ljudje medsebojno pomagajo in se podpirajo, da bi
dosegli svoje sanje in življenjske cilje. Gre za resen projekt, ki od tistih, ki želijo biti del
tega, zahteva, razumevanje, da ne gre za sistem zaslužka ali klasičen investicijski sklad, ampak
način, ki skozi medsebojno pomočjo, nenehno podporo in spremljavo novih članov, ki so podprti z
osebami, ki so to izkušnjo že sami doživeli v tem ali podobnem gibanju Solidarne Ekonomije in
ustvarili mreženje in ustvarili tako odnose, pridobili vredne izkušnje ter ustvarili resnično
obilje.</p>
<p class="text-center"><strong>Za vključitev v AYNI potrebujete:</strong></p>
<ul class="lista text-center">
<li>Mobilni telefon in / ali računalnik</li>
<li>Aplikacijo Telegram</li>
</ul>
<p class="cltexth3 text-red q-ma-lg">Kaj morate storiti, da lahko vstopite v Ayni?</p>
<p class="cltexth3 text-blue q-ma-lg">1. Faza: sprejem</p>
<ul class="lista">
<li>Nekdo vas je povabil in vam posredoval povezavo za dostop do spletnega mesta AYNI GIFT *
ECOnomy. in ste se prijavili.
</li>
<li>Vstopite v klepet Telegram Ayni EMPOWER, kraj, kjer se srečujemo, pozdravljamo nove člane, se
medsebojno podpiramo, širimo našo vizijo in gibanje.
</li>
<li>Vstopite v kanal Telegram AYNI BIBLIO, ki je informacijski kanal, na katerem so objavljena
sporočila za javnost, novice in novice o gibanju.
</li>
<li>
Končno imamo na voljo Telegram AYNI HELP, kamor lahko pišete in vprašate karkoli vas zanima ali
kakršnikoli dvom in poiščete praktično pomoč.
</li>
</ul>
<p class="cltexth3 text-blue q-ma-lg">2. Faza: Izpolnitev zahtevanih zahtev
</p>
<ol class="lista">
<li>Preberite in sprejmite naše smernice ter si pogledate uvodne video posnetke gibanja.</li>
<li>Aktivirajte vsaj 2 načina plačila.
<strong>Revolut, Payeer in Paypal (preko MoneyBoxa)</strong> so najbolj priporočljivi.<br>
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">3. faza: Programiranje in aktiviranje ladjice</p>
<p>V AYNI Zaporedje korakov je vnaprej programirano, da:</p>
<ul class="lista">
<li>zagotovite, da se trije koraki postopka odvijajo po načrtih in v pričakovani obliki.</li>
<li>Izvedete in zaključite postopek na preprost, prijeten in polavtomatski način.
</li>
</ul>
<p>
Ko bo vaša ladjica na sporedu, boste v njo vstopili v klepet s sopotniki. Hkrati boste obveščeni
o datumu starta ladjice, kjer boste lahko podarili 33 evrov, ter izvedeli ime s podatke Sanjača,
ki mu izročite svoje darilo. Izvedeli boste tudi datume vseh treh korakov.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
Datumi in koraki programiranja so mišljeni kot „napovedi aktiviranja in zaključka“. V primeru, da
pretok ljudi ne dovoli obdržati in izvesti načrtovanega v predvidenem roku in obliki, bodo datumi
prestavljeni, da se vsem omogoči dokončanje in se tako ne dovoli prekinitev potovanja.
</p>
<p>Pri procesu treh korakov se bomo srečali in prešli skozi 3 imena:</p>
<p style=""><strong>Donator</strong>: tisti, ki donira 33 €.<br>
<strong>Posrednik- Mediator</strong>: Most med tistim, ki povezuje donatorje in sanjača.<br>
<strong>Sanjač</strong>: Kdor svoje sanje manifestira s sprejemanjem Daril.<br>
</p>
<CTitleBanner title="Predogled 3 korakov (kliknite tukaj)" bgcolor="bg-green-5" canopen="true"
:visible="false" imgpreview="statics/images/passo_1.jpg">
<p>Od trenutka, ko bom izvedel dan odhoda svoje ladje, bodo naslednji koraki naslednji:</p>
<div class="text-center">
<q-img src="statics/images/passo_1.jpg" class="img"></q-img>
</div>
<p class="grass">V klepet Telegrama vstopim kot donator:</p>
<p>Klepet sestavlja 8 donatorjev in mediator-posrednik.<br>
Moja naloga je, da sanjaču vplačam 33 evrov (mediator me bo vodil v postopku).
Darilo bom izvedel na datum starta moje ladje In 1. koraka.</p>
<div class="text-center">
<q-img src="statics/images/passo_2.jpg" class="img"></q-img>
</div>
<p class="grass">Odprem telegramski klepet in postanem posrednik:</p>
<p>Klepet sestavlja 8 donatorjev (ki jim bom pomagal vstopiti v klepet) tako jaz, kot posrednik.<br>
Moja naloga je, da poskrbim, da bodo vsi donatorji sanjaču vplačali darilo. Sistem bo samodejno
poslal navodila za način vplačila, Posrednik (jaz) bo postopek preveril in spremljal.
</p>
<div class="text-center">
<q-img src="statics/images/passo_3.jpg" class="img"></q-img>
</div>
<p class="grass">Postanem sanjač:</p>
<p>Klepet, kjer sem sanjač, je enak in z istimi ljudmi odprt v koraku 2 (kjer sem bil Mediator) in
tudi tukaj se vloge spreminjajo, torej je zdaj 8 mediatorjev in jaz, sanjač.
Moja naloga je, da se odprem, da sprejmem vplačila od vsakega donatorja, se dopolnim in
proslavim obilje.
</p>
</CTitleBanner>
<p class="text-blue-10 q-ma-lg clBorderImportant text-center" style="font-size: 1.15rem;">Samodejni
klepet <strong>AYNI BOT</strong> mi bo ob pravem času poslal vsa navodila, ki jih bom moral
izpolniti!
</p>
<p class="cltexth2 text-green-8 q-ma-lg"><span class="boldhigh">No ... Zdaj se udobno opremite, vaše potovanje se je začelo!</span>
</p>
</CImgText>
</div>
<div v-else-if="toolsext.isLang('es')">
<CTitleBanner title="AYNI GIFT*ECOnomy"></CTitleBanner>
<CImgText src="">
<p class="cltexth3 text-green-8 q-ma-sm"><span
class="boldhigh">Economía Solidaria ~ AYNI GIFT*ECOnomía</span></p>.
<p>
<strong>Ayni</strong> es un movimiento de economía solidaria. Se basa en la práctica del
hacer un <strong>regalo</strong>,
de <strong> dar como recurso y como riqueza!</strong> Dar me abre a recibir, crea relaciones basadas
en la
ayuda y la gratitud, no en el beneficio.
</p>
<p>
<strong>Ayni</strong> está diseñado y creado para permitir a las personas ayudarse y apoyarse
mutuamente, para que puedan hacer realidad sus sueños y sus planes de vida. Es un proyecto serio que
requiere, por parte de aquellos a quienes les gustaría participar, de entender primero que nada, que
este no es un sistema para hacer dinero o un fondo de inversión clásico, sino una forma de recuperar
ese factor humano de ayuda mutua a través del apoyo y el acompañamiento continuo de los nuevos
miembros que vendràn guiados por quienes ya han tenido experiencia en este y otros movimientos de
Economía Solidaria, a través de La creación de redes, creando así relaciones y experiencias de
Valor, generando Riqueza Real.
</p>
<p class="text-center"><strong>Herramientas necesarias para formar parte de AYNI</strong></p>.
<ul class="text-center lista">
<li>Teléfono móvil y/o ordenador</li>
<li>Telegram de aplicación</li>
</ul>
<p class="cltexth3 text-red q-ma-lg">¿Qué tienes que hacer para entrar en <strong>Ayni</strong>?</p>
<p class="cltexth3 text-blue q-ma-lg">Paso 1: Recepción</p>
<ul class="lista">
<li>Alguien te invitó y te dio el enlace de acceso a la página web de AYNI GIFT*ECOnomy.
estás inscrito.
</li>
<li>Entra en el chat Telegram <strong>AYNI-EMPOWER</strong>, lugar donde nos encontramos, damos la
bienvenida a los nuevos invitados, y somos ayudados para ampliar nuestra visión del movimiento.
</li>
<li>
Entra en el canal de Telegram <strong>AYNI-BIBLIO</strong> que es un canal de información donde
puedes conseguir las publicaciones con comunicados, noticias y novedades sobre el movimiento.
</li>
<li>
Finalmente tenemos el Telegram <strong>AYNI-HELP</strong> donde puedes entrar cuando quieras
preguntar o tengas
dudas, encontrando ayuda práctica a su disposición.
</li>
</ul>
<p class="cltexth3 text-blue q-ma-lg">Paso 2: Cumplimiento de los requisitos</p>.
<ol class="lista">
<li>Lee y acepta nuestras directrices y ve los vídeos de introducción al movimiento.
<li>Activar por lo menos <strong>2 métodos de pago</strong>.
<strong>Revolut, Payeer y Paypal (a través de MoneyBox)</strong> son los más recomendados.<br>
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Paso 3: Programación y activación de mi Nave</p>.
<p>En AYNI La secuencia de pasos está programada de antemano, de modo que:</p>
<ul class="lista">
<li>Podemos garantizar que los 3 pasos del proceso se lleven a cabo en el tiempo y la forma
previstos.
</li>
<li>Realizamos y terminamos el proceso de una manera simple, agradable y semi-automática.</li>
</ul>
<p>Tu Nave será programada y entrarás en una chat con tus compañeros de viaje. Al mismo tiempo, se te
informará de la fecha en la que se activará tu Nave en la que podrás donar los 33 € y el nombre y el
los datos del Soñador para darle su regalo.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
Las fechas de programación y los pasos se entienden como "<em>activación y predicciones de
finalización</em>".
En caso de que el flujo de personas e invitados no permita mantener y lograr lo que se ha programado
en el momento y de la forma esperada, las fechas se re programaran para permitir la finalización de
todos y no dejar que el viaje pueda ser interrumpido.
</p>
<p>En la experiencia de los 3 pasos nos encontraremos y pasaremos por 3 caracteres:</p>
<p style=""><strong>Donante</strong>: El que hace el regalo de 33 €.<br>
<strong>Mediador</strong>:Él es el puente, el que conecta a los donantes y al Soñador.<br>
<strong>Soñador</strong>: Aquel que manifiesta su sueño recibiendo los Regalos.<br>
</p>
<CTitleBanner title="Previsualización de los 3 pasos (click aquí)" bgcolor="bg-green-5" canopen="true"
:visible="false" imgpreview="statics/images/passo_1.jpg">
<p>Desde el momento en que sé el día de la salida de mi Nave, los pasos a seguir
serán estos:</p>
<div class="text-center">
<q-img src="statics/images/passo_1.jpg" class="img"></q-img>
</div>
<p class="grass">Entraré en el chat de Telegram como Donador:</p>
<p>El chat está formada por 8 Donantes y un mediador.
Mi tarea es dar 33 € al Soñador (el mediador me guiará en el proceso).
<br>
Daré el regalo en la fecha de activación de la Nave y el paso 1.
<div class="text-center">
<q-img src="statics/images/passo_2.jpg" class="img"></q-img>
</div>
<p class="grass">Abro un chat de Telegram y me convierto en Mediador:</p>
<p>El chat consiste en 8 donantes (a los que ayudaré a entrar en el chat) y yo.<br>
Mi trabajo es asegurarme de que todos los donantes le den el regalo al Soñador.
El sistema enviará automáticamente instrucciones para hacer el Regalo, el Mediador
verificará y acompañará el proceso.
<div class="text-center">
<q-img src="statics/images/passo_3.jpg" class="img"></q-img>
</div>
<p class="grass">Conviértete en un Soñador:</p>
<p>El chat donde soy Soñador es el mismo y con las mismas personas abierto en el paso 2 (donde fui
Mediador)
e incluso aquí los papeles cambian, es decir, ahora hay 8 Mediadores y yo, el Soñador.
Mi tarea es abrirme para recibir los regalos de cada donante, completarme y celebrar
la Abundancia.
El paso 3 se activa normalmente 4 días después del paso 2.<br><br>.
</p>
</CTitleBanner>
<p class="text-blue-10 q-ma-lg clBorderImportant text-center" style="font-size: 1.15rem;">El Chat
Automático
<strong>AYNI BOT</strong> me enviará todas las instrucciones que necesito hacer en el momento
adecuado.
</p>
<p class="cltexth2 text-green-8 q-ma-lg"><span class="boldhigh">Bueno... Ahora ponte cómodo, ¡tu viaje ha comenzado!</span>
</p>
</CImgText>
</div>
<div v-else-if="toolsext.isLang('pt')">
<CTitleBanner title="AYNI GIFT*ECOnomy"></CTitleBanner>
<CImgText src="">
<p class="cltexth3 text-green-8 q-ma-sm"><span
class="boldhigh">Movimento ECOnomy Solidarity ~ AYNI GIFT*ECOnomy</span></p>.
<p>
<strong>Ayni</strong> é um movimento de economia solidária. É baseado na prática de
<strong>presente</strong>,
de <strong>give como um recurso e como riqueza! Dar e dar me abre para receber, cria relacionamentos
baseados
em
sobre ajuda e gratidão</strong>, não
sobre o lucro.</p>
<p>
<strong>Ayni</strong> foi concebido e criado para permitir que as pessoas se ajudem e apoiem umas às
outras,
em
para que possas tornar os teus sonhos e os teus planos de vida realidade. É um projeto sério que
requer, para
aqueles que o querem
pertencer, a
entender que este não é um sistema para fazer dinheiro ou um fundo de investimento clássico, mas uma
forma de
recuperar esse factor humano de ajuda mútua através do contínuo apoio e acompanhamento do novo
membros apoiados por aqueles que já tiveram experiência neste e em outros movimentos de Economia
Solidária, através de
Trabalho em rede, criando assim relações <strong>relacionamentos e experiências de Valor, gerando
Riqueza
Real</strong>.</p>
<p class="text-center"><strong>Ferramentas necessárias para fazer parte do AYNI</strong></p>.
<ul class="text-center lista">
<li>Móvel telefone e/ou computador</li>
<li>Telegrama de aplicação</li>
</ul>
<p class="cltexth3 text-red q-ma-lg">O que você precisa fazer para entrar em <strong>Ayni</strong>?</p>
<p class="cltexth3 text-blue q-ma-lg">Passo 1: Recepção</p>
<ul class="lista">
<li>Algém o convidou e deu-lhe o link de acesso ao site <strong>AYNI GIFT*ECOnomy.</strong> e você
você está inscrito.
</li>
<li>Vá para o chat Telegrama <strong>Ayni EMPOWER</strong>, lugar onde nos encontramos, acolhemos
novas
pessoas
convidados,
e ajudar-nos a apoiar e expandir a nossa visão e movimento.
</li>
<li>
Entre no Canal de Telegrama <strong>BIBLIOTECA AYNI LIBRARY</strong> que é um canal de
informação onde você
pode obter
publicado
comunicados, notícias e notícias sobre o movimento.
</li>
<li>
Finalmente temos Telegrama <strong>AYNI HELP</strong> onde você pode entrar quando quiser
questões
ou dúvidas, encontrando ajuda prática à sua disposição.
</li>
</ul>
<p class="cltexth3 text-blue q-ma-lg">Passo 2: Conclusão dos requisitos</p>.
<ol class="lista">
<li>Ler e aceitar nossas Diretrizes e Assistir os Vídeos Introdutórios ao Movimento.
<li>Ativar pelo menos <strong>2 formas de pagamento</strong>.
<strong>Revolut, Payeer e Paypal (via MoneyBox)</strong> são os mais recomendados.<br>
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Passo 3: Programação e ativação do Navio</p>.
<p>Em AYNI A sequência de passos é programada com antecedência, de modo que:</p>
<ul class="lista">
<li>garantia de que as 3 etapas do processo ocorrem dentro do prazo e da forma prevista.</li>
<li>Fazer e terminar o processo de uma forma simples, agradável e semi-automática.</li>
</ul>
<p>Sua nave será programada e você entrará em uma conversa com seus colegas passageiros. Ao mesmo tempo,
você será informado da data em que seu navio navegará, ou seja, quando você poderá doar os 33 euros
e o nome e
dados do Sonhador para dar o seu presente.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
As datas de programação e os passos são entendidos como '<em>previsão de ativação e conclusão</em>'.
No caso do fluxo de pessoas e convidados não permitir manter e alcançar o que foi programado no
tempos e
formulário esperado, as datas serão reprogramadas para permitir a conclusão de todos e não deixar o
a viagem pode ser interrompida.
</p>
<p>Na experiência dos 3 passos vamos nos encontrar e passar em 3 caracteres:</p>
<p style=""><strong>Doador</strong>: Aquele que faz o Presente de 33 €.<br>
<strong>Mediador</strong>: Ele é a ponte, aquele que liga os Doadores ao Sonhador.<br>
<strong>Dreamer</strong>: Aquele que manifesta o seu sonho ao receber os Presentes.<br>
</p>
<CTitleBanner title="Preview The 3 Steps (click here)" bgcolor="bg-green-5" canopen="true"
visible="false" imgpreview="statics/images/step_1.jpg">
<p>A partir do momento em que sei o dia da partida do meu bilhete, os passos a dar
serão estes:</p>
<div class="text-center">
<q-img src="statics/images/passi_1.jpg" class="img"></q-img>
</div>
<p class="grass">Entro no chat Telegrama como Doador:</p>
<p>A conversa consiste em 8 doadores e um mediador.<br>
A minha tarefa é dar 33 € ao Sonhador (o mediador irá guiar-me no processo).<br>
O presente será dado na data de ativação do boleto e no passo 1.
<div class="text-center">
<q-img src="statics/images/passi_2.jpg" class="img"></q-img>
</div>
<p class="grass">abro uma conversa por telegrama e torno-me Provedor de Justiça:</p>
<p>O chat consiste em 8 doadores (que eu ajudarei a entrar no chat) e eu, o Mediador.<br>
O meu trabalho é garantir que todos os Doadores façam o Presente para o Sonhador.
O sistema enviará automaticamente instruções para fazer o Presente, o Mediador (I) irá verificar
e
irá acompanhar o processo.<br>
<div class="text-center">
<q-img src="statics/images/passi_3.jpg" class="img"></q-img>
</div>
<p class="grass">Dreamer Become a Dreamer:</p>
<p>O chat onde eu sou o Dreamer é o mesmo e com as mesmas pessoas abertas no passo 2 (onde eu fui
mediador)
e mesmo aqui os papéis mudam, ou seja, agora há 8 mediadores e eu, o Sonhador.<br>
Minha tarefa é abrir-me para receber os Presentes de cada Doador, completar-me e celebrar
a Abundância.<br>
</p>
</CTitleBanner>
<p class="text-blue-10 q-ma-lg clBorderImportant text-center" style="font-size: 1.15rem;">O Chat
Automático
<strong>AYNI BOT</strong> me enviará todas as instruções que preciso de fazer no momento apropriado!
<p class="cltexth2 text-green-8 q-ma-lg"><span class="boldhigh">Good... Agora fique à vontade, a sua viagem já começou!</span>
</p>
</CImgText>
</div>
<div v-else-if="toolsext.isLang('fr')">
<CTitleBanner title="AYNI GIFT*ECOnomy"></CTitleBanner>
.
<CImgText src="">
<p class="cltexth3 text-green-8 q-ma-sm"><span
class="boldhigh">Mouvement dĒCOnomie Solidaire ~AYNI GIFT*ECOnomy</span></p>.
<p>
<strong>Ayni</strong> est un mouvement d'économie solidaire. Il est basé sur la <strong>pratique du
don</strong>, de
lacte de donner comme ressource et comme richesse ! Donner et offrir m'ouvre à recevoir, crée des
relations basées sur le <strong>soutien et la gratitude</strong>, et non sur le profit.</p>
<p>
<strong>Ayni</strong> est pensée et créée pour permettre aux personnes de s'aider et de se soutenir
mutuellement, pour réaliser les propres rêves et les propres projets de vie. C'est un projet sérieux
qui nécessite, pour ceux qui veulent y participer, de comprendre qu'il ne s'agit pas d'un système
pour gagner de l'argent ou d'un fond d'investissement classique, mais d'un moyen qui invite à
récupérer le facteur humain d'entraide à travers le soutien et l'accompagnement continus des
nouveaux participants/es par ceux et celles qui ont déjà eu une expérience dans ce mouvement et dans
d'autres mouvements d'Ēconomie Solidaire, par le biais dune mise en réseau, créant ainsi des
relations et des expériences de <strong>Valeur, générant une Véritable Richesse</strong>.</p>
<br>
<p class="text-center"><strong>Les outils nécessaires pour faire partie de AYNI</strong></p>.
<ul class="text-center lista">
<li>Téléphone portable et/ou ordinateur</li>
<li>App Telegram</li>
</ul>
<p class="cltexth3 text-red q-ma-lg">Qu'est-ce qu'il faut faire pour entrer dans <strong>Ayni</strong>?
</p>
<p class="cltexth3 text-blue q-ma-lg">Etape 1: ACCUEIL</p>
<ul class="lista">
<li>Quelqu'un vous a invité et vous a donné le lien d'accès au site <strong>AYNI
GIFT*ECOnomy.</strong> et vous vous êtes inscrit.
</li>
<li>Entrez dans le chat Télégram <strong>Ayni-EMPOWER</strong>, lieu de rencontre, accueil de
nouvelles
personnes invitées, et nous aidons à soutenir et à élargir notre vision et notre mouvement.
</li>
<li>
Entrez dans le chat Télégram <strong>AYNI-BIBLIO</strong> qui est un canal d'informations
où sont publiés des communiqués, des nouvelles et des informations sur le mouvement.
</li>
<li>
Enfin, nous avons Télégram <strong>AYNI-HELP</strong> où vous pouvez entrer quand vous voulez
pour toutes demandes ou doutes, en trouvant une aide pratique à votre disposition-
</li>
</ul>
<p class="cltexth3 text-blue q-ma-lg">Étape 2: COMPLÉTER LES REQUIS DEMANDĒS</p>.
<ol class="lista">
<li>Lisez et acceptez nos lignes directrices et regardez les vidéos d'introduction au mouvement.
<li>Activer au moins 2 <strong>moyens de paiement</strong>
<strong>Revolut, Payeer et Paypal (via MoneyBox)</strong> sont les plus recommandés.<br>
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Etape 3: PROGRAMMATION ET ACTIVATION DE DES NAVIRES</p>.
<p>Dans AYNI La séquence des étapes est programmée à l'avance, de sorte à:</p>
<ul class="lista">
<li>garantir que les 3 passages du processus se déroulent dans les délais et sous la forme prévus
</li>
<li>réaliser et terminer le processus de manière simple, agréable et semi-automatique.</li>
</ul>
<p>Votre Navire sera programmé et vous entrerez en conversation avec vos compagnons de voyage. Dans le
même temps, vous serez informé(e) de la date à laquelle le navire sera activé et à laquelle vous
pourrez faire le Don des 33€, ainsi que le nom et les données du Rêveur/Rêveuse à qui faire votre
Don. Vous connaîtrez également les dates de chacune des 3 étapes.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
Les dates de programmation et les étapes sont comprises comme <em>"prévisions dactivation et de
complètement"</em>. Au cas où le flux de personnes et d'invités ne permettrait pas de maintenir et
de
réaliser ce qui a été programmé dans les délais et forme prévus, les dates seront reprogrammées pour
permettre le complètement à toutes et tous et pour éviter que le voyage puisse être interrompu.
</p>
<p>Dans l'expérience des 3 étapes nous rencontrerons et interpréterons 3 personnages:</p>
<p style=""><strong>Donateur</strong>: Celui/celle qui fait le Don de 33€.<br>
<strong>Médiateur</strong>: Il/Elle est le pont, celui ou celle qui met en relation le Donateur et
le Rêveur.<br>
<strong>Rêveur</strong>: Celui/celle qui manifeste son rêve en recevant les Dons.<br>
</p>
<CTitleBanner title="Aperçu des 3 étapes (cliquez ici)" bgcolor="bg-green-5" canopen="true"
:visible="false" imgpreview="statics/images/passo_1.jpg">
<p>À partir du moment où je connais le jour du départ de mon navire, les étapes à suivre seront les
suivantes:</p>
<div class="text-center">
<q-img src="statics/images/passo_1.jpg" class="img"></q-img>
</div>
<p class="grass">J'entre dans le chat du télégramme en tant que Donateur/Donatrice:</p>
<p>Le chat est formé de 8 donateurs et d'un médiateur.<br>
Mon rôle consiste à donner 33 € au Rêveur (le Médiateur me guidera dans le processus).<br>
Je ferai le Don à la date de départ de mon navire et à l'étape 1.
<div class="text-center">
<q-img src="statics/images/passo_2.jpg" class="img"></q-img>
</div>
<p class="grass">J'ouvre un chat Telegram et deviens Médiateur/Médiatrice:</p>
<p>Le chat est formé de 8 Donateurs (que j'aiderai à entrer dans le chat) et moi, le Médiateur. <br>
Mon rôle consiste à m'assurer que tous les Donateurs fassent le Don au Rêveur. Le système
enverra automatiquement les instructions pour faire le Don, le Médiateur (moi) vérifiera et
accompagnera le processus.<br>
<div class="text-center">
<q-img src="statics/images/passo_3.jpg" class="img"></q-img>
</div>
<p class="grass">Je deviens Rêveur/Rêveuse:</p>
<p>Le chat où je suis Rêveur est le même et avec les mêmes personnes ouvert à l'étape 2 ( j'étais
Médiateur) et ici aussi les rôles changent, c'est-à-dire qu'il y a maintenant 8 médiateurs et
moi, le Rêveur.<br>
Ma tâche est de m'ouvrir pour recevoir les Dons de chaque Donateur, de compléter et de célébrer
l'Abondance.<br>
</p>
</CTitleBanner>
<p class="text-blue-10 q-ma-lg clBorderImportant text-center" style="font-size : 1.15rem ;">La Chat
automatique AYNI BOT m'enverra toutes les instructions nécessaires que je devrai réaliser au moment
opportun !
<p class="cltexth2 text-green-8 q-ma-lg"><span class="boldhigh">Bien... Mettez-vous à l'aise, votre voyage a commencé
</span>
</p>
</CImgText>
</div>
<div v-else>
<CTitleBanner title="AYNI GIFT*ECOnomy"></CTitleBanner>
<CImgText src="">
<p class="cltexth3 text-green-8 q-ma-sm"><span
class="boldhigh">Movement ECOnomy Solidarity ~ AYNI GIFT*ECOnomy</span></p>.
<p>
<strong>Ayni</strong> is a solidarity economy movement. It is based on the practice of
<strong>gift</strong>,
<strong>give as a resource as well as abundance! Giving open me up to receiving, creates
relationships based on help and gratitude</strong>, not on profit.</p>
<p>
<strong>Ayni</strong> is designed and created to allow people to help and support each other, so you
can make your dreams and your life plans come true. It is a serious project that gives, for those
who want to be part of it, understanding that this is not a system for making money or a classic
investment fund, but a way to recover that human factor of mutual aid through the continuous support
and accompaniment of the new members supported by those who have already had experience in this and
other Solidarity Economy movements through Networking, thus creating <strong>relationships and
experiences of Value, generating Real abundance.</strong>.</p>
<div class="text-center">
<p class="text-center"><strong>Tools needed to be part of AYNI</strong></p>.
<ul class="lista center_img">
<li>Mobile phone and/or computer</li>
<li>App Telegram</li>
</ul>
</div>
<p class="cltexth3 text-red q-ma-lg">What do you have to do to get into <strong>Ayni</strong>?</p>
<p class="cltexth3 text-blue q-ma-lg">Step 1: Welcome</p>
<ul class="lista">
<li>Someone invited you and gave you the login link to <strong>AYNI GIFT*ECOnomy.</strong> and you
signed up.
</li>
<li>Go into the Telegram <strong>Ayni-EMPOWER</strong> chat, where we meet, welcome new guests,
and help us to support and expand our vision and movement.
</li>
<li>
Enter the Telegram Channel <strong>AYNI-BIBLIO</strong> which is an information channel in which
you post communications, news and news about the movement.
</li>
<li>
Finally we have Telegram <strong>AYNI-HELP</strong> where you can enter whenever questions or
doubts arise, finding practical help at your disposal.
</li>
</ul>
<p class="cltexth3 text-blue q-ma-lg">Step 2: Completion of requirements</p>
<ol class="lista">
<li>Read and accept our Guidelines and Watch the Introductory Videos to the Movement.
<li>Activate at least <strong>2 payment methods</strong> (is recommended).
<strong>Revolut, Payeer and Paypal (via MoneyBox)</strong> are the most recommended.<br>
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Step 3: Programming and Activation of the Ship</p>
<p>In AYNI The sequence of steps is programmed in advance, so that:</p>
<ul class="lista">
<li>guarantee that the 3 steps of the process take place on time and in the form provided.</li>
<li>make and finish the process in a simple, enjoyable and semi-automated way.</li>
</ul>
<p>Your Ship will be programmed and you'll enter a chat with your fellow travellers. At the same time,
you will be informed of the date at which your ship will be activated and donate
the 33 and the name and the data of the Dreamer to give your gift to.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
The dates of programming and steps are understood as '<em>activation and completion predictions</em>'.
In case the flow of people and guests does not allow to maintain and achieve what has been
programmed in the times and form expected, the dates will be rescheduled to allow for completion of
all and not let the travel may be interrupted.
</p>
<p>In the experience of the 3 steps we will meet and pass in 3 characters:</p>
<p style=""><strong>Donor</strong>: He who makes the Gift of 33.<br>
<strong>Mediator</strong>: He is the bridge, the one who connects Donors and Dreamer.<br>
<strong>Dreamer</strong>: He who manifests his dream by receiving the Gifts.<br>
</p>
<CTitleBanner title="Preview The 3 Steps (click here)" bgcolor="bg-green-5" canopen="true"
:visible="false" imgpreview="statics/images/passo_1.jpg">
<p>From the moment I know the starting day, the steps to be taken will be these:</p>
<div class="text-center">
<q-img src="statics/images/passo_1.jpg" class="img"></q-img>
</div>
<p class="grass">I enter the Telegram chat as Donor:</p>
<p>The chat is formed by 8 donors and a mediator.<br>
My task is to give 33 to the Dreamer (the mediator will guide me in the process).<br>
The gift will be given on the date of activation of the Ship and step 1.
<div class="text-center">
<q-img src="statics/images/passo_2.jpg" class="img"></q-img>
</div>
<p class="grass">I open a Telegram chat and become Mediator:</p>
<p>The chat consists of 8 Donors (which I will help to enter the chat) and me, the Mediator.
My job is to make sure that all the Donors give the Gift to the Dreamer. The system will
automatically send instructions to make the Gift, the Mediator (me) will verify and will
accompany the process.<br>
<div class="text-center">
<q-img src="statics/images/passo_3.jpg" class="img"></q-img>
</div>
<p class="grass">Dreamer Become a Dreamer:</p>
<p>The chat where I am Dreamer is the same and with the same people open in step 2 (where I was
Mediator) and here the roles change, there are now 8 mediators and me, the Dreamer.
My task is to open myself to receive the Gifts from each Donor, complete myself and celebrate
the Abundance.<br>
<br><br>.
</p>
</CTitleBanner>
<p class="text-blue-10 q-ma-lg clBorderImportant text-center" style="font-size: 1.15rem;">The Automatic
Chat <strong>AYNI BOT</strong> will send me all the instructions I need to do at the appropriate
time!
<p class="cltexth2 text-green-8 q-ma-lg"><span class="boldhigh">Good... Now make yourself comfortable, your journey has begun!
</span></p>
</CImgText>
</div>
<div>
<p>&nbsp;</p>
<div v-if="toolsext.isLang('it')">
<CTitleBanner title="Condizioni da Accettare:" bgcolor="bg-red-5"></CTitleBanner>
<ul class="lista-small">
<li>dichiaro di aver letto e ben compreso le linee guida del movimento AYNI</li>
<li>dichiaro di aver ben compreso l'impegno che prendo iscrivendomi a AYNI (facendo un regalo di 33
€)
e di aver compreso che senza non potrò proseguire il mio viaggio.
</li>
<li>Potrò avvalermi del diritto di recesso, entro 14 giorni dall'invio del dono, qualora non volessi
più continuare il mio viaggio.
</li>
<li>dichiaro di aver ben compreso che <strong>non è un fondo di investimento e che il mio regalo,
scaduti i 14 giorni del diritto di recesso, è a fondo perduto</strong>
</li>
</ul>
</div>
<div v-else-if="toolsext.isLang('si')">
<CTitleBanner title="Pogoji za sprejem:" bgcolor="bg-red-5"></CTitleBanner>
<ul class="lista-small">
<li>Izjavljam, da sem prebral in razumel smernice gibanja AYNI</li>
<li>Izjavljam, da sem popolnoma razumel zaveze, ki jih prevzemam z registracijo pri AYNI (z darilom
v višini 33 evrov) in da razumem, da brez vplačila ne bom mogel nadaljevati poti.
</li>
<li>Pravico do odstopanja bom lahko uveljavil v 14 dneh po pošiljanju darila, če ne želim več
nadaljevati poti
</li>
<li>Izjavljam, da sem dobro razumel, da ne gre za investicijski sklad in da je moje darilo po 14
dneh pravice do odstopa izgubljeno
</li>
</ul>
</div>
<div v-else-if="toolsext.isLang('es')">
<CTitleBanner title="Condiciones de aceptación:" bgcolor="bg-red-5"></CTitleBanner>
<ul class="lista-small">
<li>Declaro que he leído y comprendido bien las directrices del movimiento AYNI.</li>
<li>Declaro que he entendido bien los compromisos que hago al firmar para AYNI y haber entendido que
sin ella no seré incluido en la programación.
</li>
<li>Declaro que he comprendido bien que el <strong>no es un fondo de inversión y que mi regalo, una
vez que los 14 días del derecho de retiro hayan expirado, es no reembolsable</strong>.
</li>
<li>
Puedo ejercer mi derecho de retirada dentro de los 14 días siguientes al envío del regalo si no
deseo continuar mi viaje.
</li>
</ul>
</div>
<div v-else-if="toolsext.isLang('pt')">
<CTitleBanner title="Condições para Aceitar:" bgcolor="bg-red-5"></CTitleBanner>
<ul class="lista-small">
<li>Eu declaro que li e compreendi bem as orientações do movimento AYNI</li>
<li>Declaro que compreendi bem os compromissos que assumi ao inscrever-me no AYNI (trazer 2 pessoas,
presente
33 ) e ter entendido que sem isso não serei incluído na programação.
</li>
<li>Eu declaro que compreendi bem que <strong> não é um fundo de investimento e que a minha doação é
não
reembolsável</strong>
</li>
<li>
Posso exercer o meu direito de retirada no prazo de 14 dias após o envio do presente se não
quiser mais
continuar a minha viagem.
</li>
</ul>
</div>
<div v-else-if="toolsext.isLang('fr')">
<CTitleBanner title="Conditions d'acceptation:" bgcolor="bg-red-5"></CTitleBanner>
.
<ul class="lista-small">
<li>Je déclare avoir lu et bien compris les directives du mouvement AYNI;</li>
<li>Je déclare avoir bien compris les engagements que je prends en m'inscrivant à AYNI (Don de 33 €)
et que je comprends que sans cela je ne pourrai pas continuer mon voyage. Je pourrai bénéficier
du droit de rétraction, dans les 14 jours qui suivent lenvoie de mon Don si je ne souhaite plus
poursuivre mon voyage.
</li>
<li>Je déclare avoir bien compris qu'il ne s'agit pas d'un fonds d'investissement et que mon Don,
après 14 jours de la possibilité de rétraction, nest plus remboursable
</li>
<li>Je peux exercer mon droit de rétractation dans les 14 jours suivant l'envoi du cadeau si je ne
souhaite plus poursuivre mon voyage.
</li>
</ul>
</div>
<div v-else>
<CTitleBanner title="Conditions to Accept:" bgcolor="bg-red-5"></CTitleBanner>
<ul class="lista-small">
<li>I declare that I have read and well understood the guidelines of the AYNI movement</li>
<li>I declare that I have well understood the commitments I make by enrolling in AYNI and to have
understood that without it I will not be included in the programming.
</li>
<li>I declare that I have well understood that <strong>is not an investment fund and that my gift,
once the 14 days of the right of withdrawal have expired, is
permanent donation</strong>
</li>
<li>I can exercise my right of withdrawal within 14 days of sending the gift if I no longer wish to
continue my trip.
</li>
</ul>
</div>
<div v-if="showconditions"> <div v-if="showconditions">
<q-checkbox <q-checkbox
class="bg-grey-4" class="bg-grey-4"

View File

91
src/components/CHours/CHours.ts Executable file
View File

@@ -0,0 +1,91 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { colTableHours, colTableStorehouse } from '@src/store/Modules/fieldsTable'
import { CCard, CGridTableRec, CMyPage, CTitleBanner, CImgText } from '@components'
import MixinBase from '@src/mixins/mixin-base'
import { shared_consts } from '@src/common/shared_vuejs'
import { UserStore } from '@store'
@Component({
name: 'CHours',
mixins: [MixinBase],
components: { CImgText, CCard, CMyPage, CTitleBanner, CGridTableRec }
})
export default class CHours extends MixinBase {
@Prop({ required: true }) public todoId: string
public pagination = {
sortBy: 'descr',
descending: false,
page: 2,
rowsPerPage: 5
// rowsNumber: xx if getting data from a server
}
public created() {
console.log('created CHours')
}
get extraparams() {
return {
lk_tab: 'users',
lk_LF: 'userId',
lk_FF: '_id',
lk_as: 'user',
af_objId_tab: 'myId',
lk_proj: {
todoId: 1, userId: 1, descr: 1, date: 1, time_start: 1, time_end: 1, hours: 1,
username: 1, name: 1, surname: 1
}
}
}
public arrfilterand = [
{
label: 'Tutte le ore',
value: shared_consts.FILTER_HOURS_ALL
}
]
get myfilterdef() {
return [shared_consts.FILTER_HOURS_MYLIST]
}
get myarrfilterand() {
const myfiltrodef = {
label: 'Mie Ore',
value: shared_consts.FILTER_HOURS_MYLIST,
hide: true,
default: true
}
let myarr = []
myarr.push(myfiltrodef)
if (this.arrfilterand)
myarr = [...myarr, ...this.arrfilterand]
return myarr
}
public selected = []
public dataPages = []
get getcolHours() {
return colTableHours
}
get getdefaultnewrec() {
const myrec = {
todoId: this.todoId,
userId: UserStore.state.my._id,
descr: ''
}
return myrec
}
}

View File

@@ -0,0 +1,26 @@
<template>
<div>
<div class="q-ma-sm q-gutter-sm q-pa-xs">
<CGridTableRec prop_mytable="hours"
prop_mytitle="Lista Ore"
:prop_mycolumns="getcolHours"
prop_colkey="descr"
nodataLabel="Nessuna Lista Ore"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
:arrfilters="myarrfilterand"
:filterdef="myfilterdef"
:prop_codeId="todoId"
:defaultnewrec="getdefaultnewrec"
:extraparams="extraparams"
labeladd="Aggiungi Ora">
</CGridTableRec>
</div>
</div>
</template>
<script lang="ts" src="./CHours.ts">
</script>
<style lang="scss" scoped>
@import 'CHours.scss';
</style>

1
src/components/CHours/index.ts Executable file
View File

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

View File

@@ -55,7 +55,7 @@
} }
.title{ .title{
font-size: 3.5rem; font-size: 3rem;
padding: 10px; padding: 10px;
text-shadow: .2rem .2rem .2rem #3d3d3d; text-shadow: .2rem .2rem .2rem #3d3d3d;
} }
@@ -63,7 +63,7 @@
@media (max-width: 400px) { @media (max-width: 400px) {
.title{ .title{
padding: 5px; padding: 5px;
font-size: 3rem; font-size: 2.5rem;
} }
} }

View File

@@ -1,8 +1,8 @@
<template> <template>
<div> <div>
<q-parallax :src="getsrc" :height="tools.myheight_imgtitle(myheight, myheightmobile)"> <q-parallax :src="getsrc" :height="tools.myheight_imgtitle(myheight, myheightmobile)">
<h1 class="text-white center_to_image title">{{title}}</h1> <h1 class="text-white title" style="text-align: center" >{{title}}</h1>
<div v-if="legendinside" class="mylegendinside absolute-bottom custom-caption center_to_image" v-html="legendinside"></div> <div v-if="legendinside" class="mylegendinside absolute-bottom custom-caption" style="text-align: center" v-html="legendinside"></div>
</q-parallax> </q-parallax>
<div v-if="legend" class="mylegend" v-html="legend"></div> <div v-if="legend" class="mylegend" v-html="legend"></div>
</div> </div>

View File

34
src/components/CInput/CInput.ts Executable file
View File

@@ -0,0 +1,34 @@
import Vue from 'vue'
import { Component, Prop } from 'vue-property-decorator'
import { GlobalStore, UserStore } from '@store'
import VueScrollReveal from 'vue-scroll-reveal'
import { tools } from '@src/store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import { Screen } from 'quasar'
@Component({
name: 'CInput'
})
export default class CInput extends Vue {
@Prop({ required: false, default: '' }) public src: string
@Prop({ required: false, default: '' }) public src2: string
@Prop({ required: false, default: 'myclimg' }) public class1: string
@Prop({ required: false, default: '' }) public style1: string
@Prop({ required: false, default: 'image' }) public alt1: string
@Prop({ required: false, default: 'image' }) public alt2: string
get clrowcol() {
let mycl = 'row'
if (tools.isMobile())
mycl = 'column'
return mycl
}
get myclass() {
return this.clrowcol + ' items-start q-col-gutter-xs imgtext '
}
}

View File

@@ -0,0 +1,11 @@
<template>
<div>
<q-field
</div>
</template>
<script lang="ts" src="./CInput.ts">
</script>
<style lang="scss" scoped>
@import './CInput.scss';
</style>

1
src/components/CInput/index.ts Executable file
View File

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

View File

@@ -18,7 +18,7 @@
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
<q-item-label>{{ tools.getNationsByNationality(nat._id, false) }}</q-item-label> <q-item-label>{{ tools.getNationsByNationality(nat._id) }}</q-item-label>
</q-item-section> </q-item-section>
<q-item-section side> <q-item-section side>

View File

@@ -6,7 +6,7 @@ import { CCardState } from '../CCardState'
import { CCopyBtn } from '../CCopyBtn' import { CCopyBtn } from '../CCopyBtn'
import { IOrder, IProduct } from '@src/model' import { IOrder, IProduct } from '@src/model'
import { Products, UserStore } from '@store' import { GlobalStore, Products, UserStore } from '@store'
import { CSingleCart } from '../../components/CSingleCart' import { CSingleCart } from '../../components/CSingleCart'
import MixinUsers from '@src/mixins/mixin-users' import MixinUsers from '@src/mixins/mixin-users'
@@ -44,4 +44,8 @@ export default class CMyCart extends MixinUsers {
return 0 return 0
} }
} }
public closecart() {
GlobalStore.state.rightCartOpen = false
}
} }

View File

@@ -11,7 +11,7 @@
</q-btn> </q-btn>
</div> </div>
<div class="col-6" style="text-align: right"> <div class="col-6" style="text-align: right">
<span class="text-grey q-mr-xs">Totale:</span> <span <span v-if="myTotalPrice" class="text-grey q-mr-xs">Totale:</span> <span
class="text-subtitle1 q-mr-sm "> {{ myTotalPrice.toFixed(2) }}</span> class="text-subtitle1 q-mr-sm "> {{ myTotalPrice.toFixed(2) }}</span>
</div> </div>
</div> </div>
@@ -30,7 +30,7 @@
Il Carrello è Vuoto Il Carrello è Vuoto
</div> </div>
<div v-else style="text-align: center"> <div v-else style="text-align: center">
<q-btn rounded icon="fas fa-shopping-cart" color="green" label="Vai alla Cassa" class="q-mb-sm" to="/checkout"></q-btn> <q-btn rounded icon="fas fa-shopping-cart" color="green" label="Vai alla Cassa" class="q-mb-sm" to="/checkout" @click="closecart"></q-btn>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -18,6 +18,7 @@ export default class CMyEditor extends Vue {
@Prop({ required: false, default: '' }) public title @Prop({ required: false, default: '' }) public title
@Prop({ required: true }) public value @Prop({ required: true }) public value
@Prop({ required: false, default: '' }) public myclass @Prop({ required: false, default: '' }) public myclass
@Prop({ required: false, default: true }) public showButtons
public myvalue = '' public myvalue = ''
public mycolor = '' public mycolor = ''

View File

@@ -1,6 +1,5 @@
<template> <template>
<div> <div>
<q-dialog v-model="showeditor">
<q-card :style="`min-width: `+ tools.myheight_dialog() + `px;` "> <q-card :style="`min-width: `+ tools.myheight_dialog() + `px;` ">
<q-toolbar class="bg-primary text-white" style="min-height: 30px;"> <q-toolbar class="bg-primary text-white" style="min-height: 30px;">
<q-toolbar-title> <q-toolbar-title>
@@ -39,12 +38,12 @@
</q-editor> </q-editor>
</form> </form>
</q-card-section> </q-card-section>
<q-card-actions align="center"> <q-card-actions v-if="showButtons" align="center">
<q-btn flat :label="$t('dialog.ok')" color="primary" @click="saveval"></q-btn> <q-btn flat :label="$t('dialog.ok')" color="primary" @click="saveval"></q-btn>
<q-btn flat :label="$t('dialog.cancel')" color="primary" v-close-popup @click="annulla"></q-btn> <q-btn flat :label="$t('dialog.cancel')" color="primary" v-close-popup @click="annulla"></q-btn>
</q-card-actions> </q-card-actions>
</q-card> </q-card>
</q-dialog>
</div> </div>
</template> </template>

View File

@@ -13,10 +13,11 @@ import { GlobalStore, UserStore } from '../../store/Modules'
import { CMyChipList } from '../CMyChipList' import { CMyChipList } from '../CMyChipList'
import { CMyToggleList } from '../CMyToggleList' import { CMyToggleList } from '../CMyToggleList'
import translate from '@src/globalroutines/util' import translate from '@src/globalroutines/util'
import { CDateTime } from '../CDateTime'
@Component({ @Component({
name: 'CMyFieldDb', name: 'CMyFieldDb',
components: { CMyEditor, CMySelect, CMyChipList, CMyToggleList } components: { CMyEditor, CMySelect, CMyChipList, CMyToggleList, CDateTime }
}) })
export default class CMyFieldDb extends MixinBase { export default class CMyFieldDb extends MixinBase {
@@ -29,6 +30,8 @@ export default class CMyFieldDb extends MixinBase {
@Prop({ required: false, default: '' }) public jointable: string @Prop({ required: false, default: '' }) public jointable: string
@Prop({ required: false, default: 'settings' }) public table: string @Prop({ required: false, default: 'settings' }) public table: string
@Prop({ required: false, default: '' }) public myimg: string @Prop({ required: false, default: '' }) public myimg: string
@Prop({ required: false, default: '' }) public id: string
@Prop({ required: false, default: '' }) public idmain: string
public $t public $t
public myvalue = '' public myvalue = ''
@@ -37,18 +40,28 @@ export default class CMyFieldDb extends MixinBase {
public countryname = '' public countryname = ''
public created() { public created() {
this.myvalue = this.getValDb(this.mykey, this.serv, '', this.table, this.mysubkey) this.crea()
}
public crea() {
this.myvalue = this.getValDb(this.mykey, this.serv, '', this.table, this.mysubkey, this.id, this.idmain)
this.col.jointable = this.jointable this.col.jointable = this.jointable
this.col.fieldtype = this.type this.col.fieldtype = this.type
this.col.label = this.title this.col.label = this.title
// console.log('created', this.myvalue) // console.log('CMyFieldDb crea', this.myvalue)
}
@Watch('id')
public idchanged(value) {
this.crea()
} }
public getclassCol(col) { public getclassCol(col) {
if (col) { if (col) {
let mycl = (this.disable || col.disable) ? '' : 'colmodif ' let mycl = (this.disable || col.disable) ? '' : 'colmodif '
mycl += (col.fieldtype === tools.FieldType.date) ? ' coldate flex flex-container ' : '' mycl += ((col.fieldtype === tools.FieldType.date) || (col.fieldtype === tools.FieldType.onlydate)) ? ' coldate flex flex-container ' : ''
return mycl return mycl
} else { } else {
@@ -63,6 +76,12 @@ export default class CMyFieldDb extends MixinBase {
} else { } else {
return tools.getstrDateTime(val) return tools.getstrDateTime(val)
} }
} else if (this.col.fieldtype === tools.FieldType.onlydate) {
if (val === undefined) {
return '[]'
} else {
return tools.getstrDate(val)
}
} else if (this.col.fieldtype === tools.FieldType.boolean) { } else if (this.col.fieldtype === tools.FieldType.boolean) {
return (val) ? this.$t('dialog.yes') : this.$t('dialog.no') return (val) ? this.$t('dialog.yes') : this.$t('dialog.no')
} else if (this.col.fieldtype === tools.FieldType.binary) { } else if (this.col.fieldtype === tools.FieldType.binary) {
@@ -120,7 +139,7 @@ export default class CMyFieldDb extends MixinBase {
public savefield(value, initialval) { public savefield(value, initialval) {
this.myvalue = value this.myvalue = value
this.setValDb(this.mykey, this.myvalue, this.type, this.serv, this.table, this.mysubkey) this.setValDb(this.mykey, this.myvalue, this.type, this.serv, this.table, this.mysubkey, this.id)
} }
public savefieldboolean(value) { public savefieldboolean(value) {
@@ -129,7 +148,7 @@ export default class CMyFieldDb extends MixinBase {
else else
this.myvalue = value this.myvalue = value
this.setValDb(this.mykey, this.myvalue, this.type, this.serv, this.table, this.mysubkey) this.setValDb(this.mykey, this.myvalue, this.type, this.serv, this.table, this.mysubkey, this.id)
} }
public selectcountry({ name, iso2, dialCode }) { public selectcountry({ name, iso2, dialCode }) {

View File

@@ -31,6 +31,18 @@
> >
</CDateTime> </CDateTime>
</div> </div>
<div v-else-if="type === tools.FieldType.onlydate">
<CDateTime
:label="col.label"
class="cursor-pointer"
:value.sync="myvalue"
:readonly="false"
:dense="true"
:canEdit="canEdit"
view="date"
>
</CDateTime>
</div>
<div v-else :class="mycl"> <div v-else :class="mycl">
<div v-if="type === tools.FieldType.binary"> <div v-if="type === tools.FieldType.binary">
<CMyChipList <CMyChipList
@@ -140,6 +152,13 @@
</q-input> </q-input>
</div> </div>
<div v-else-if="type === tools.FieldType.hours">
<CMySelect label="Ore" :value.sync="myvalue"
optval="_id" optlab="label"
:useinput="false"
o :options="tools.SelectHours">
</CMySelect>
</div>
<div v-else-if="type === tools.FieldType.binary"> <div v-else-if="type === tools.FieldType.binary">
<CMyToggleList :label="col.title" <CMyToggleList :label="col.title"
:options="db_fieldsTable.getTableJoinByName(col.jointable)" :options="db_fieldsTable.getTableJoinByName(col.jointable)"

View File

@@ -4,13 +4,10 @@ import { GlobalStore, UserStore } from '@store'
import { Footer } from '../../components/Footer' import { Footer } from '../../components/Footer'
// import VueScrollReveal from 'vue-scroll-reveal'
import { tools } from '@src/store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import { Screen } from 'quasar'
import { CImgTitle } from '../../components/CImgTitle/index' import { CImgTitle } from '../../components/CImgTitle/index'
import { CTitle } from '../../components/CTitle/index' import { CTitle } from '../../components/CTitle/index'
import MixinsMetaTags from '../../mixins/mixin-metatags' import MixinsMetaTags from '../../mixins/mixin-metatags'
import { IMyPage } from '@src/model'
@Component({ @Component({
name: 'CMyPage', name: 'CMyPage',
@@ -18,7 +15,8 @@ import MixinsMetaTags from '../../mixins/mixin-metatags'
components: { Footer, CImgTitle, CTitle } components: { Footer, CImgTitle, CTitle }
}) })
export default class CMyPage extends Vue { export default class CMyPage extends Vue {
@Prop({ required: true, default: '' }) public title: string @Prop({ required: false, default: '' }) public title: string
@Prop({ required: false, default: '' }) public mypath: string
@Prop({ required: false, default: '' }) public img: string @Prop({ required: false, default: '' }) public img: string
@Prop({ required: false, default: '' }) public imgbackground: string @Prop({ required: false, default: '' }) public imgbackground: string
@Prop({ required: false, default: '' }) public sizes: string @Prop({ required: false, default: '' }) public sizes: string
@@ -26,6 +24,7 @@ export default class CMyPage extends Vue {
@Prop({ required: false, default: false }) public nofooter: boolean @Prop({ required: false, default: false }) public nofooter: boolean
public $t public $t
public $q public $q
public rec: IMyPage = null
// public metaInfo() { // public metaInfo() {
// return { // return {
@@ -40,8 +39,10 @@ export default class CMyPage extends Vue {
// } // }
// } // }
public mounted() { public async mounted() {
// console.log('CMYPage title=', this.title) // console.log('CMYPage title=', this.title)
// console.table(this.meta) // console.table(this.meta)
if (this.mypath !== '')
this.rec = await GlobalStore.actions.loadPage(this.mypath)
} }
} }

View File

@@ -1,5 +1,35 @@
<template> <template>
<div> <div>
<div v-if="mypath && !!rec">
<div class="q-ma-sm q-gutter-sm q-pa-xs">
<div v-if="!!rec.img1" class="text-center">
<q-img :src="`statics/`+ rec.img1" class="img"></q-img>
</div>
<div v-if="!!rec.content" v-html="rec.content"></div>
<q-video v-if="!!rec.video1" :src="rec.video1" :ratio="rec.ratio1">
</q-video>
<div v-if="!!rec.img2" class="text-center">
<q-img :src="`statics/`+ rec.img2" class="img"></q-img>
</div>
<div v-if="!!rec.content2" v-html="rec.content2"></div>
<q-video v-if="!!rec.video2" :src="rec.video2" :ratio="rec.ratio2"></q-video>
<div v-if="!!rec.img3" class="text-center">
<q-img :src="`statics/`+ rec.img2" class="img"></q-img>
</div>
<div v-if="!!rec.content3" v-html="rec.content3"></div>
<q-video v-if="!!rec.video3" :src="rec.video3" :ratio="rec.ratio3"></q-video>
<div v-if="!!rec.content4" v-html="rec.content4"></div>
</div>
</div>
<div v-else>
<div v-if="!!title">
<CTitle v-if="imgbackground" :imgbackground="imgbackground" <CTitle v-if="imgbackground" :imgbackground="imgbackground"
:headtitle="title" :sizes="sizes" :styleadd="styleadd"></CTitle> :headtitle="title" :sizes="sizes" :styleadd="styleadd"></CTitle>
<div v-if="!imgbackground"> <div v-if="!imgbackground">
@@ -11,6 +41,8 @@
<Footer></Footer> <Footer></Footer>
</div> </div>
</div> </div>
</div>
</div>
</template> </template>

View File

@@ -6,6 +6,7 @@ import { toolsext } from '@src/store/Modules/toolsext'
import { IColGridTable } from '../../model' import { IColGridTable } from '../../model'
import { fieldsTable } from '../../store/Modules/fieldsTable' import { fieldsTable } from '../../store/Modules/fieldsTable'
import { CMyChipList } from '../CMyChipList' import { CMyChipList } from '../CMyChipList'
import { CDate } from '../CDate'
import { CDateTime } from '../CDateTime' import { CDateTime } from '../CDateTime'
import { CMyToggleList } from '../CMyToggleList' import { CMyToggleList } from '../CMyToggleList'
import { CMySelect } from '../CMySelect' import { CMySelect } from '../CMySelect'
@@ -14,7 +15,7 @@ import { CGallery } from '../CGallery'
@Component({ @Component({
name: 'CMyPopupEdit', name: 'CMyPopupEdit',
components: { CMyChipList, CDateTime, CMyToggleList, CMySelect, CMyEditor, CGallery } components: { CMyChipList, CDateTime, CDate, CMyToggleList, CMySelect, CMyEditor, CGallery }
}) })
export default class CMyPopupEdit extends Vue { export default class CMyPopupEdit extends Vue {
@@ -27,11 +28,13 @@ export default class CMyPopupEdit extends Vue {
@Prop({ required: false, default: 'row' }) public view @Prop({ required: false, default: 'row' }) public view
@Prop({ required: false, default: '5' }) public minuteinterval @Prop({ required: false, default: '5' }) public minuteinterval
@Prop({ required: false, default: false }) public disable @Prop({ required: false, default: false }) public disable
@Prop({ required: false, default: false }) public visulabel
public myvalue = '' public myvalue = ''
public myvalueprec = 'false' public myvalueprec = 'false'
public countryname = '' public countryname = ''
public visueditor: boolean = false public visueditor: boolean = false
public showeditor: boolean = true
get tools() { get tools() {
return tools return tools
@@ -50,6 +53,29 @@ export default class CMyPopupEdit extends Vue {
this.$emit('update:row', newval) this.$emit('update:row', newval)
} }
public getrealval(newval) {
if (this.col.fieldtype === tools.FieldType.hours) {
newval = newval.value
}
}
public changevalRec(newval) {
console.log('this.row', this.row, 'this.col', this.col, 'newval', newval)
console.log('this.row[this.col.name]', this.row[this.col.name])
this.row[this.col.name] = newval
console.log('changevalRec update:row', newval)
this.$emit('update:row', this.row)
}
public changevalRecHours(newval) {
if (this.col.fieldtype === tools.FieldType.hours) {
newval = newval.value
}
this.changevalRec(newval)
this.myvalue = newval
}
public updatedata() { public updatedata() {
this.mounted() this.mounted()
} }
@@ -161,6 +187,12 @@ export default class CMyPopupEdit extends Vue {
} else { } else {
return tools.getstrDateTime(val) return tools.getstrDateTime(val)
} }
} else if (col.fieldtype === tools.FieldType.onlydate) {
if (val === undefined) {
return '[]'
} else {
return tools.getstrDate(val)
}
} else if (col.fieldtype === tools.FieldType.boolean) { } else if (col.fieldtype === tools.FieldType.boolean) {
return (val) ? this.$t('dialog.yes') : this.$t('dialog.no') return (val) ? this.$t('dialog.yes') : this.$t('dialog.no')
} else if (col.fieldtype === tools.FieldType.binary) { } else if (col.fieldtype === tools.FieldType.binary) {
@@ -179,7 +211,7 @@ export default class CMyPopupEdit extends Vue {
else else
return fieldsTable.getMultiValueByTable(col, val) return fieldsTable.getMultiValueByTable(col, val)
} else { } else {
if (val === undefined) if (val === undefined || val === null)
return '[]' return '[]'
else if (val === '') { else if (val === '') {
return '[]' return '[]'
@@ -201,10 +233,14 @@ export default class CMyPopupEdit extends Vue {
} }
} }
public visInNewRec(col) {
return !col.notShowInNewRec
}
public getclassCol(col) { public getclassCol(col) {
if (col) { if (col) {
let mycl = (col.disable || this.isviewfield) ? '' : 'colmodif' let mycl = (col.disable || this.isviewfield) ? '' : 'colmodif'
mycl += (col.fieldtype === tools.FieldType.date) ? ' coldate flex flex-container' : '' mycl += ((col.fieldtype === tools.FieldType.date) || (col.fieldtype === tools.FieldType.onlydate)) ? ' coldate flex flex-container' : ''
return mycl return mycl
} else { } else {
@@ -228,4 +264,8 @@ export default class CMyPopupEdit extends Vue {
this.myvalue = '+' + coderec.dialCode this.myvalue = '+' + coderec.dialCode
} }
public createHours(value) {
}
} }

View File

@@ -1,5 +1,143 @@
<template> <template>
<div :class="getclassCol(col)"> <div :class="getclassCol(col)">
<div v-if="visulabel" class="flex">
<div v-if="visInNewRec(col)" style="flex-grow: 1;">
<div v-if="col.fieldtype === tools.FieldType.string">
<q-input v-model="myvalue"
autogrow
@keyup.enter.stop
@input="changevalRec"
autofocus
:label="col.label">
</q-input>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.date">
<CDateTime
:label="col.label"
class="cursor-pointer"
:valueDate="myvalue"
:readonly="false"
:minuteinterval="minuteinterval"
:dense="true"
@input="changevalRec"
canEdit="true"
@savetoclose="SaveValueInt"
@show="OpenEdit">
</CDateTime>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.onlydate">
<CDateTime
:label="col.label"
class="cursor-pointer"
:valueDate="myvalue"
:readonly="false"
:minuteinterval="minuteinterval"
:dense="true"
@input="changevalRec"
canEdit="true"
@savetoclose="SaveValueInt"
@show="OpenEdit"
view="date">
</CDateTime>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.number">
<q-input v-model="myvalue" type="number"
autofocus
@input="changevalRec"
:label="col.label"
>
</q-input>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.hours">
<div class="row">
<q-input v-model="myvalue" type="number"
autofocus
@input="changevalRec"
style="max-width: 100px;"
:label="col.label"
>
</q-input>
<CMySelect label="Ore" :value.sync="myvalue"
optval="value" optlab="label"
:dense="false"
:use-input="false"
@changeval="changevalRecHours"
style="max-width: 100px;"
:options="tools.SelectHours">
</CMySelect>
</div>
<!--<q-input v-model="myvalue" type="number"
autofocus
@input="changevalRec"
:label="col.label">
</q-input>
-->
</div>
<div v-else-if="col.fieldtype === tools.FieldType.listimages">
<CGallery :gall="row" :listimages="myvalue" :edit="isviewfield"
@showandsave="Savedb"
@input="changevalRec"
>
</CGallery>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.image">
<CGallery :gall="row" :listimages="myvalue" :edit="isviewfield"
@input="changevalRec"
@showandsave="Savedb">
</CGallery>
</div>
<div v-if="col.fieldtype === tools.FieldType.binary">
<CMyChipList
:type="tools.FieldType.binary"
:value="myvalue"
@input="changevalRec"
:options="db_fieldsTable.getTableJoinByName(col.jointable)"
:optval="db_fieldsTable.getKeyByTable(col.jointable)"
:optlab="db_fieldsTable.getLabelByTable(col.jointable)"
:opticon="db_fieldsTable.getIconByTable(col.jointable)"></CMyChipList>
</div>
<!-- Show Value -->
<div v-else-if="col.fieldtype === tools.FieldType.multiselect">
<CMyChipList
@input="changevalRec"
:type="tools.FieldType.multiselect"
:value="myvalue"
:options="db_fieldsTable.getTableJoinByName(col.jointable)"
:optval="db_fieldsTable.getKeyByTable(col.jointable)"
:optlab="db_fieldsTable.getLabelByTable(col.jointable)"
:opticon="db_fieldsTable.getIconByTable(col.jointable)"></CMyChipList>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.select">
<CMyChipList
@input="changevalRec"
myclass="text-center"
:type="tools.FieldType.select"
:value="myvalue"
:options="db_fieldsTable.getTableJoinByName(col.jointable)"
:optval="db_fieldsTable.getKeyByTable(col.jointable)"
:optlab="db_fieldsTable.getLabelByTable(col.jointable)"
:opticon="db_fieldsTable.getIconByTable(col.jointable)"></CMyChipList>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.boolean">
<q-toggle dark color="green" v-model="myvalue" :label="col.title"
:disable="disable && col.name !== 'profile.saw_zoom_presentation'"
@input="changevalRec"></q-toggle>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.html">
<div v-html="visuValByType(myvalue, col, row)" @click="visueditor = true">
</div>
</div>
</div>
</div>
<div v-else>
<div v-if="col.fieldtype === tools.FieldType.listimages"> <div v-if="col.fieldtype === tools.FieldType.listimages">
<CGallery :gall="row" :listimages="myvalue" :edit="isviewfield" <CGallery :gall="row" :listimages="myvalue" :edit="isviewfield"
@showandsave="Savedb"> @showandsave="Savedb">
@@ -37,7 +175,21 @@
@show="OpenEdit"> @show="OpenEdit">
</CDateTime> </CDateTime>
</span> </span>
<div v-if="col.fieldtype !== tools.FieldType.date"> <span v-else-if="col.fieldtype === tools.FieldType.onlydate">
<CDateTime
:label="col.label"
class="cursor-pointer"
:valueDate="myvalue"
:readonly="false"
:minuteinterval="minuteinterval"
:dense="true"
:canEdit="canEdit"
@savetoclose="SaveValueInt"
@show="OpenEdit"
view="date">
</CDateTime>
</span>
<div v-else>
<div> <div>
<div v-if="col.fieldtype === tools.FieldType.binary"> <div v-if="col.fieldtype === tools.FieldType.binary">
<CMyChipList <CMyChipList
@@ -80,14 +232,17 @@
</div> </div>
<div v-else> <div v-else>
{{ visuValByType(myvalue, col, row) }} {{ visuValByType(myvalue, col, row) }}
</div> </div>
<div v-if="col.fieldtype === tools.FieldType.html"> <div v-if="col.fieldtype === tools.FieldType.html">
<!--<q-dialog v-model="showeditor">-->
<CMyEditor v-if="visueditor" :value.sync="myvalue" :title="col.title" @keyup.enter.stop <CMyEditor v-if="visueditor" :value.sync="myvalue" :title="col.title" @keyup.enter.stop
@showandsave="Savedb" @annulla="visueditor=false"> @showandsave="Savedb" @annulla="visueditor=false">
</CMyEditor> </CMyEditor>
<!--</q-dialog>-->
</div> </div>
<q-popup-edit <q-popup-edit
v-if="canEdit && col.fieldtype !== tools.FieldType.html" v-if="canEdit && col.fieldtype !== tools.FieldType.html"
@@ -126,6 +281,12 @@
</q-input> </q-input>
</div> </div>
<div v-else-if="col.fieldtype === tools.FieldType.hours">
<q-input v-model="myvalue" type="number"
autofocus>
</q-input>
</div>
<div v-else-if="col.fieldtype === tools.FieldType.binary"> <div v-else-if="col.fieldtype === tools.FieldType.binary">
<CMyToggleList :label="col.title" <CMyToggleList :label="col.title"
:options="db_fieldsTable.getTableJoinByName(col.jointable)" :options="db_fieldsTable.getTableJoinByName(col.jointable)"
@@ -203,12 +364,12 @@
</q-select> </q-select>
</div> </div>
</q-popup-edit> </q-popup-edit>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
</template> </template>
<script lang="ts" src="./CMyPopupEdit.ts"> <script lang="ts" src="./CMyPopupEdit.ts">

View File

@@ -15,7 +15,13 @@ export default class CMySelect extends Vue {
@Prop({ required: true, default: '' }) public optlab @Prop({ required: true, default: '' }) public optlab
@Prop({ required: true, default: '' }) public optval @Prop({ required: true, default: '' }) public optval
@Prop({ required: false, default: true }) public useinput: boolean @Prop({ required: false, default: true }) public useinput: boolean
@Prop({ required: false, default: null }) public newvaluefunc @Prop({ required: false, default: true }) public dense: boolean
@Prop({ required: false, default: false }) public multiple: boolean
@Prop({
required: false, default: function mydef(): object {
return {}
}
}) public newvaluefunc: object
@Prop({ required: false, default: null }) public funcgetvaluebyid @Prop({ required: false, default: null }) public funcgetvaluebyid
@Prop({ required: true }) public options @Prop({ required: true }) public options
@@ -26,7 +32,9 @@ export default class CMySelect extends Vue {
} }
public changeval(newval) { public changeval(newval) {
console.log('changeval', newval)
this.$emit('update:value', newval) this.$emit('update:value', newval)
this.$emit('changeval', newval)
} }
public mounted() { public mounted() {

View File

@@ -2,6 +2,7 @@
<div class="text-center"> <div class="text-center">
<div v-if="useinput"> <div v-if="useinput">
<q-select <q-select
:multiple="multiple"
rounded rounded
outlined outlined
:input-class="myclass" :input-class="myclass"
@@ -15,15 +16,16 @@
:option-label="optlab" :option-label="optlab"
@input="changeval" @input="changeval"
:label="label" :label="label"
dense :dense="dense"
> >
</q-select> </q-select>
</div> </div>
<div v-else> <div v-else>
<q-select <q-select
:multiple="multiple"
rounded rounded
outlined outlined
dense :dense="dense"
:input-class="myclass" :input-class="myclass"
v-model="myvalue" v-model="myvalue"
:options="options" :options="options"

View File

@@ -61,11 +61,11 @@ $graytext: #555;
align-items: center; align-items: center;
} }
&__img { &__singleevimg {
padding: 0.25rem !important; padding: 0.25rem !important;
float: left; float: left;
width: 150px; width: 250px;
height: 150px; height: 250px;
border-radius: 1rem; border-radius: 1rem;
@media (max-width: 718px) { @media (max-width: 718px) {
@@ -73,6 +73,9 @@ $graytext: #555;
float: none; float: none;
text-align: center; text-align: center;
margin: 0 auto; margin: 0 auto;
width: 200px;
height: 200px;
} }
} }

View File

@@ -1,12 +1,13 @@
<template> <template>
<div> <div>
<CMyPage v-if="myevent" :imgbackground="myevent.img" :title="myevent.title" keywords="" description="" nofooter="true"> <CMyPage v-if="myevent" :imgbackground="myevent.img" :title="myevent.title" keywords="" description=""
nofooter="true">
<div class="q-mx-md"> <div class="q-mx-md">
<div class="listaev__align_chips q-ma-md"> <div class="listaev__align_chips q-ma-md">
<img :src="getImgEvent(myevent)" <img :src="getImgEvent(myevent)"
@click="selectEvent(myevent)" @click="selectEvent(myevent)"
class="text-left padding_cell listaev__tdimg listaev__img cursor-pointer" class="text-left padding_cell listaev__tdimg listaev__singleevimg cursor-pointer"
:style="getStyleByEvent(myevent, true)" :style="getStyleByEvent(myevent, true)"
:alt="myevent.title"> :alt="myevent.title">
<q-chip dense v-if="isAlreadyBooked(myevent)" class="cltexth4 chipbooked shadow-5 q-mb-md" <q-chip dense v-if="isAlreadyBooked(myevent)" class="cltexth4 chipbooked shadow-5 q-mb-md"
@@ -57,41 +58,47 @@
<div style="margin: 10px;"></div> <div style="margin: 10px;"></div>
<div class=""> <div class="q-pa-sm q-gutter-md text-center">
<!-- Se c'è un link, allora --> <!-- Se c'è un link, allora -->
<q-btn v-if="myevent.linkpdf" size="md" type="a" <q-btn class="text-center boldhigh" v-if="myevent.linkpdf" size="md" type="a"
:href="`../../statics/` + myevent.linkpdf" :href="`../../statics/` + myevent.linkpdf"
target="_blank" target="_blank"
ripple rounded :label="myevent.title" :icon="myevent.icon" ripple rounded :label="myevent.title"
:color="myevent.bgcolor" text-color="white" glossy> :color="myevent.bgcolor" text-color="white" glossy>
</q-btn> </q-btn>
<!-- altrimenti mostra solo Chip --> <!-- altrimenti mostra solo Chip -->
<div v-else> <div v-else-if="tools.isMobile()" class="cltexth3 text-center boldhigh"
<div v-if="tools.isMobile()" class="cltexth3 text-center"
:style="`background-color: ${myevent.bgcolor} !important; color: white !important;`"> :style="`background-color: ${myevent.bgcolor} !important; color: white !important;`">
{{ myevent.title }} {{ myevent.title }}
</div> </div>
<q-chip v-else class="cltexth3 text-center" <q-chip v-else class="cltexth3 text-center boldhigh"
icon="bookmark"
:style="`background-color: ${myevent.bgcolor} !important; color: white !important;`" :style="`background-color: ${myevent.bgcolor} !important; color: white !important;`"
text-color="white" text-color="white"
:icon="myevent.icon"
dense>{{ myevent.title }} dense>{{ myevent.title }}
</q-chip> </q-chip>
</div> </div>
</div>
<div style="margin: 10px;"></div> <div style="margin: 10px;"></div>
<p v-if="myevent.bodytext" class="listaev__details text-left q-mb-md" v-html="myevent.bodytext"></p> <p v-if="myevent.bodytext" class="listaev__details text-left q-mb-md" v-html="myevent.bodytext"></p>
<p v-else class="listaev__details" v-html="myevent.details"></p> <p v-else class="listaev__details" v-html="myevent.details"></p>
<div v-for="(mypage, index) in myevent.pagefooter" :key="index">
<CMyPage v-if="!!mypage" :mypath="`/`+ mypage">
</CMyPage>
</div>
<div v-if="myevent.teacher" class=""> <div v-if="myevent.teacher" class="">
<span class="cal__teacher-title">{{ $t('cal.teacher') }}: <span <span class="cal__teacher-title">{{ $t('cal.teacher') }}: <span
class="margin_with"></span></span> class="margin_with"></span></span>
<CMyTeacher :username="myevent.teacher"></CMyTeacher> <CMyTeacher :username="myevent.teacher"></CMyTeacher>
<CMyTeacher :username="myevent.teacher2"></CMyTeacher> <CMyTeacher :username="myevent.teacher2"></CMyTeacher>
<CMyTeacher :username="myevent.teacher3"></CMyTeacher>
<CMyTeacher :username="myevent.teacher4"></CMyTeacher>
<span v-if="myevent.wherecode" class="q-ma-md"> <span v-if="myevent.wherecode" class="q-ma-md">
<span v-if="tools.isMobile()"><br/></span> <span v-if="tools.isMobile()"><br/></span>
@@ -99,12 +106,15 @@
<q-chip> <q-chip>
<q-avatar v-if="getWhereIcon(myevent.wherecode)"> <q-avatar v-if="getWhereIcon(myevent.wherecode)">
<img :src="`../../statics/images/avatar/` + getWhereIcon(myevent.wherecode)" alt="località"> <img
:src="`../../statics/images/avatar/` + getWhereIcon(myevent.wherecode)"
alt="località">
</q-avatar> </q-avatar>
<q-avatar v-else color="blue" font-size="20px" text-color="white" <q-avatar v-else color="blue" font-size="20px" text-color="white"
icon="home"> icon="home">
</q-avatar> </q-avatar>
<span class="cal__teacher-content">{{getWhereName(myevent.wherecode)}}</span> <span
class="cal__teacher-content">{{ getWhereName(myevent.wherecode) }}</span>
</q-chip> </q-chip>
</span> </span>
</div> </div>
@@ -113,7 +123,10 @@
class="margin_with"></span></span> class="margin_with"></span></span>
<span v-if="!isShowPrice(myevent)" class=""> <span v-if="!isShowPrice(myevent)" class="">
<q-chip class="glossy" color="orange" text-color="white"> <q-chip class="glossy" color="orange" text-color="white">
<span class="cal__quota-content">{{getContribtypeById(myevent.contribtype)}}</span> <span
class="cal__quota-content">{{
getContribtypeById(myevent.contribtype)
}}</span>
</q-chip> </q-chip>
</span> </span>
@@ -132,13 +145,13 @@
:label="$t('cal.showpdf')"> :label="$t('cal.showpdf')">
</q-btn> </q-btn>
<q-btn v-if="myevent.bodytext" rounded outline class="q-mx-sm" <!--<q-btn v-if="myevent.bodytext" rounded outline class="q-mx-sm"
color="primary" color="primary"
:to="`/event/${myevent.typol}/${myevent._id}`" :to="`/event/${myevent.typol}/${myevent._id}`"
:label="$t('event.showpage')"> :label="$t('event.showpage')">
</q-btn> </q-btn>-->
</div> </div>
<div class="row justify-end q-mb-lg"> <div class="row text-center">
<q-btn rounded outline class="q-mx-sm" <q-btn rounded outline class="q-mx-sm"
color="primary" @click="askForInfoEventMenu(myevent)" color="primary" @click="askForInfoEventMenu(myevent)"
:label="$t('event.askinfo')"> :label="$t('event.askinfo')">
@@ -154,6 +167,7 @@
@click="EditBookEvent(myevent)" @click="EditBookEvent(myevent)"
:label="$t('cal.modifybooking')"> :label="$t('cal.modifybooking')">
</q-btn> </q-btn>
<br>
<!-- <!--
<q-btn push rounded v-if="!myevent.nobookable && isAlreadyBooked(myevent)" color="positive" @click="BookEvent(myevent)" <q-btn push rounded v-if="!myevent.nobookable && isAlreadyBooked(myevent)" color="positive" @click="BookEvent(myevent)"
:label="$t('cal.booked')"> :label="$t('cal.booked')">

View File

@@ -41,6 +41,7 @@ export default class CMyToggleList extends Vue {
} }
public mounted() { public mounted() {
console.log('mounted')
this.myarrvalues = [] this.myarrvalues = []
// console.log('value', this.value) // console.log('value', this.value)
@@ -50,11 +51,28 @@ export default class CMyToggleList extends Vue {
if (this.isarray) { if (this.isarray) {
// console.table(this.options) // console.table(this.options)
this.options.forEach((rec) => { this.options.forEach((rec) => {
console.log('rec: ', rec) console.log('rec: ', rec, 'optval', this.optval, 'optlab', this.optlab)
const mydata = { const mydata = {
label: this.$t(rec[this.optlab]), label: '',
value: rec[this.optval], value: rec[this.optval],
valbool: this.value.includes(rec[this.optval]) valbool: false
}
const lab = rec[`${this.optlab}`]
console.log('lab', lab)
if (tools.isObject(this.optlab)) {
const arr = this.options.filter((myrec) => myrec[this.optval] === mydata.value).map(this.optlab)
if (arr) {
// @ts-ignore
mydata.label = arr[0]
}
} else {
mydata.label = this.$t(rec[this.optlab])
}
if (this.value) {
mydata.valbool = this.value.includes(rec[this.optval])
} }
console.log('mydata ', mydata) console.log('mydata ', mydata)
this.myarrvalues.push(mydata) this.myarrvalues.push(mydata)

View File

@@ -0,0 +1,168 @@
$grayshadow: #555;
$textcol: #eeefe1;
$textcol_scuro: darkblue;
p {
margin: 0 0 1.25rem;
//text-shadow: .125rem .125rem .25rem $grayshadow;
}
h4 {
font-size: 1.25rem;
}
.landing > section {
/*
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
//padding: 0 16px
*/
}
.subtitle {
text-align: center;
font-size: 0.85rem;
}
.landing > section.padding {
padding: 5.62rem 1rem;
}
.landing > section > div {
position: relative;
width: 100%;
height: 100%;
}
.landing__footer .doc-link {
color: $textcol;
}
.landing__footer .doc-link:hover {
opacity: .8
}
.gallery:before {
content: "";
position: fixed;
top: 0;
height: 100vh;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
//background: #000 url(../../statics/images/cover.jpg) 50%;
background-size: cover
}
.carousel_slide {
}
.gallery {
background-size: cover;
background-position: center center;
margin: auto;
width: 100%;
height: 100%;
max-width: 800px;
}
.gallery2{
margin: auto;
max-width: 800px;
}
.btn-start {
margin: 3.125rem;
}
.shadow {
//color: white;
text-shadow: 0.125rem 0.125rem 0.25rem $grayshadow;
}
.shadow-max {
//color: white;
text-shadow: .25rem .25rem .5rem $grayshadow;
}
@media (max-width: 2000px) {
.q-carousel {
height: 800px !important;
}
}
@media (max-width: 1000px) {
.q-carousel {
height: 800px !important;
}
}
@media (max-width: 800px) {
.q-carousel {
height: 600px !important;
}
}
@media (max-width: 718px) {
// PER VERSIONE MOBILE
.gallery2 {
max-height: 80vh;
}
.text-h1 {
font-size: 3rem;
line-height: 3.05rem;
margin-bottom: 1.5rem
}
.text-subtitle1 {
font-size: 1.25rem;
}
.text-vers {
font-size: 0.6rem;
}
}
@media (max-width: 600px) {
.q-carousel {
height: 450px !important;
}
}
@media (max-width: 400px) {
.q-carousel {
height: 300px !important;
}
}
.allunga0 {
height: 300px !important;
}
.allunga1 {
height: 400px !important;
}
.allunga2 {
height: 500px !important;
}
.allunga3 {
height: 600px !important;
}
.custom-caption {
text-align: center;
padding: .75rem;
color: $textcol;
background-color: rgba(0, 0, 0, .3);
}

View File

@@ -0,0 +1,250 @@
import Vue from 'vue'
import { Component, Prop } from 'vue-property-decorator'
import { GlobalStore, UserStore } from '@store'
import { IColl, IGallery, ITimeLineEntry } from '@src/model/GlobalStore'
import { Logo } from '../../components/logo'
import { Footer } from '../../components/Footer'
import VueScrollReveal from 'vue-scroll-reveal'
import { tools } from '@src/store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import { CImgTitle } from '../../components/CImgTitle/index'
import { Screen } from 'quasar'
import { static_data } from '@src/db/static_data'
Vue.use(VueScrollReveal, {
class: 'v-scroll-reveal', // A CSS class applied to elements with the v-scroll-reveal directive; useful for animation overrides.
duration: 1200,
scale: 0.95,
distance: '10px',
rotate: {
x: 0,
y: 0,
z: 0
}
// mobile: true
})
@Component({
components: { Logo, Footer, CImgTitle }
})
export default class PhotosGallery extends Vue {
@Prop({ required: true }) public mygallery: []
public text: string = ''
public visibile: boolean = false
public cardvisible: string = 'hidden'
public displaycard: string = 'block'
public $t: any
// public firstClassSection: string = 'landing_background fade homep-cover-img animate-fade homep-cover-img-1'
public firstClassSection: string = 'fade homep-cover-img animate-fade homep-cover-img-1'
public $q
public polling
public slide = 'first'
public slide2 = 1
public animare: number = 0
public activePanelImg: number
public withThumbnails: boolean = true
public withCaptions: boolean = true
public allunga: boolean = false
public fullscreen: boolean = false
public myclass: string = ''
public dimensione: string = ''
public dimensioneImg: any = [
{
id: 0,
label: 'Piccola',
value: 0
},
{
id: 1,
label: 'Media',
value: 1
},
{
id: 2,
label: 'Grande',
value: 2
},
{
id: 3,
label: 'Molto Grande',
value: 3
}
]
constructor() {
super()
// console.log('Home constructor...')
this.initprompt()
}
get static_data() {
return static_data
}
public changeAllunga(value, evt) {
if (value)
this.myclass = 'allunga'
else
this.myclass = ''
}
get getappname() {
return this.$t('msg.myAppName')
}
get tools() {
return tools
}
public mounted() {
let primo = true
const mytime = 10000
this.polling = setInterval(() => {
this.firstClassSection = 'landing_background fade homep-cover-img ' + (primo ? 'homep-cover-img-2' : 'homep-cover-img-1')
primo = !primo
// console.log('this.firstClassSection', this.firstClassSection)
}, mytime)
}
get appname() {
return process.env.APP_NAME
}
public beforeDestroy() {
console.log('beforeDestroy')
clearInterval(this.polling)
}
public created() {
this.animare = process.env.DEV ? 0 : 8000
GlobalStore.actions.prova()
}
get isLogged() {
return UserStore.state.isLogged
}
public meta() {
return {
keywords: { name: 'keywords', content: 'Quasar website' },
// meta tags
meta: {
mykey: { name: 'mykey', content: 'Key 1' },
description: { name: 'description', content: 'Page 1' },
keywords: { name: 'keywords', content: 'Quasar website' },
equiv: { 'http-equiv': 'Content-Type', 'content': 'text/html; charset=UTF-8' }
}
}
}
public mystilecard() {
return {
visibility: this.cardvisible,
display: this.displaycard
}
}
get conta() {
return GlobalStore.state.conta
}
public getenv(myvar) {
return process.env[myvar]
}
set conta(valore) {
GlobalStore.actions.setConta(valore)
const my = this.$q.lang.isoName
tools.showNotif(this.$q, String(my))
}
public initprompt() {
window.addEventListener('beforeinstallprompt', function (event) {
// console.log('******************************** beforeinstallprompt fired')
event.preventDefault()
// console.log('§§§§§§§§§§§§§§§§§§§§ IMPOSTA DEFERRED PROMPT !!!!!!!!!!!!!!!!! ')
// #Todo++ IMPOSTA DEFERRED PROMPT
return false
})
}
get isInCostruction() {
return process.env.IN_CONSTRUCTION === '1'
}
public getPermission() {
return Notification.permission
}
public NotServiceWorker() {
return (!('serviceWorker' in navigator))
}
public PagLogin() {
this.$router.replace('/signin')
}
public PagReg() {
this.$router.replace('/signup')
}
public openCreatePostModal() {
console.log('APERTO ! openCreatePostModal')
this.conta = this.conta + 1
this.visibile = !this.visibile
if (this.visibile) {
this.displaycard = 'block'
this.cardvisible = 'visible'
} else {
this.displaycard = 'block'
this.cardvisible = 'hidden'
}
}
public getmywidth(rec: IColl) {
return rec.width
}
public getmyheight(rec: IColl) {
return rec.height
}
public setTransition(newVal, oldVal) {
// console.log('setTransition', newVal, oldVal)
this.activePanelImg = newVal
}
public getsubtitle(data: IColl) {
if (data.subtitle[toolsext.getLocale()])
return data.subtitle[toolsext.getLocale()]
else {
return data.subtitle[static_data.arrLangUsed[0]]
}
}
public getTitle(data: IColl) {
if (data.title[toolsext.getLocale()])
return data.title[toolsext.getLocale()]
else {
return data.title[static_data.arrLangUsed[0]]
}
}
public changedim(value) {
this.myclass = 'allunga' + value
// console.log('myclass', this.myclass, value)
}
}

View File

@@ -0,0 +1,67 @@
<template>
<div>
<div class="text-black">
<q-checkbox v-model="withThumbnails" label="Miniature">
</q-checkbox>
<q-checkbox v-model="withCaptions" label="Didascalie">
</q-checkbox>
<q-select v-model="dimensione" :options="dimensioneImg"
style="max-width: 150px"
rounded
outlined
dense
label="Altezza"
emit-value map-options
@input="changedim"
></q-select>
</div>
<q-carousel
animated
infinite
arrows
control-color="primary"
control-text-color="white"
swipeable
:thumbnails="withThumbnails"
transition-next="slide-left"
transition-prev="slide-right"
v-model="slide2"
:class="`bg-grey-1 shadow-2 rounded-borders ` + myclass + ' gallery2 ' "
@transition="setTransition"
>
<q-carousel-slide v-for="(rec, index) in mygallery" v-if="rec.ingallery"
:key="index" :name="index" :img-src="rec.img">
<div v-if="rec.ingallery && withCaptions" class="absolute-bottom custom-caption"
style="margin-bottom: 70px">
<div v-if="!!rec.title" class="text-h5"><span style="font-size: 1.25rem;">{{ getTitle(rec) }}</span></div>
<div class="subtitle" v-html="getsubtitle(rec)"></div>
</div>
</q-carousel-slide>
<!--<template v-slot:control>
<q-carousel-control
position="bottom-right"
:offset="[18, 18]"
>
<q-btn
push round dense color="white" text-color="primary"
:icon="fullscreen ? 'fullscreen_exit' : 'fullscreen'"
@click="fullscreen = !fullscreen"
/>
</q-carousel-control>
</template>-->
</q-carousel>
<br>
</div>
</template>
<script lang="ts" src="./CPhotosGallery.ts">
</script>
<style lang="scss" scoped>
@import './CPhotosGallery.scss';
</style>

View File

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

View File

@@ -17,7 +17,10 @@ import { Products, UserStore } from '@store'
export default class CProductCard extends MixinBase { export default class CProductCard extends MixinBase {
public $t public $t
@Prop({ required: true }) public product: IProduct @Prop({ required: false, default: null }) public product: IProduct
public myproduct: IProduct = null
@Prop({ required: false, default: '' }) public code: string
@Prop({ required: false, default: false }) public complete: boolean
@Prop({ @Prop({
required: false, required: false,
type: Object, type: Object,
@@ -50,11 +53,17 @@ export default class CProductCard extends MixinBase {
public addtoCart() { public addtoCart() {
if (!UserStore.state.isLogged) {
tools.showNeutralNotif(this.$q, 'Devi prima accedere alla tua Area Personale')
GlobalStore.state.rightDrawerOpen = true
return false
}
// Controlla se esiste già nel carrello il prodotto // Controlla se esiste già nel carrello il prodotto
if (Products.getters.existProductInCart(this.product._id)) { if (Products.getters.existProductInCart(this.myproduct._id)) {
tools.showNegativeNotif(this.$q, 'Questo prodotto è stato già aggiunto al Carrello') tools.showNegativeNotif(this.$q, 'Questo prodotto è stato già aggiunto al Carrello')
} else { } else {
Products.actions.addToCart({ product: this.product, order: this.order }).then((ris) => { Products.actions.addToCart({ product: this.myproduct, order: this.order }).then((ris) => {
let strprod = 'prodotto' let strprod = 'prodotto'
if (this.order.quantity > 1) if (this.order.quantity > 1)
strprod = 'prodotti' strprod = 'prodotti'
@@ -67,14 +76,14 @@ export default class CProductCard extends MixinBase {
} }
public getnumstore() { public getnumstore() {
if (!!this.product.storehouses) if (this.myproduct.storehouses)
return this.product.storehouses.length return this.myproduct.storehouses.length
else else
return 0 return 0
} }
public getSingleStorehouse() { public getSingleStorehouse() {
const mystore = this.product.storehouses[0] const mystore = this.myproduct.storehouses[0]
return mystore.name + ' (' + mystore.city + ')' return mystore.name + ' (' + mystore.city + ')'
} }
@@ -82,7 +91,7 @@ export default class CProductCard extends MixinBase {
const myarr = [] const myarr = []
let ind = 1 let ind = 1
this.product.storehouses.forEach((store) => { this.myproduct.storehouses.forEach((store) => {
myarr.push( myarr.push(
{ {
id: ind, id: ind,
@@ -101,13 +110,40 @@ export default class CProductCard extends MixinBase {
return !this.order.idStorehouse return !this.order.idStorehouse
} }
public infoproduct() { @Watch('code')
public codechanged(value) {
console.log('change code')
this.load()
} }
public created() { public async load() {
if (this.product.storehouses.length === 1) { // console.log('created Cproductcard', this.code)
this.order.idStorehouse = this.product.storehouses[0]._id if (this.code) {
this.myproduct = await Products.actions.loadProduct({ code: this.code })
} else {
this.myproduct = this.product
}
console.log('this.myproduct', this.myproduct, 'this.product', this.product)
if (!!this.myproduct) {
if (this.myproduct.storehouses.length === 1) {
this.order.idStorehouse = this.myproduct.storehouses[0]._id
} }
} }
} }
public async created() {
this.load()
}
get getmycardcl() {
return (this.complete) ? 'my-card-big' : 'my-card'
}
get getclimg() {
return (this.complete) ? 'myimgtitle centermydiv' : 'centermydiv'
}
}

View File

@@ -1,50 +1,50 @@
<template> <template>
<q-card class="my-card"> <q-card :class="getmycardcl" v-if="!!myproduct">
<img :src="`statics/` + product.img" :alt="product.name"> <q-img :src="`statics/` + myproduct.img" :alt="myproduct.name" :class="getclimg"></q-img>
<q-card-section> <q-card-section>
<q-btn <q-btn
v-if="!complete"
fab fab
color="primary" color="primary"
icon="fas fa-info" icon="fas fa-info"
class="absolute" class="absolute"
style="top: 0; right: 12px; transform: translateY(-50%);" style="top: 0; right: 12px; transform: translateY(-50%);"
@click="infoproduct" :to="`/product/`+ myproduct.code"
/> />
<div class="row items-center"> <div class="row items-center centeritems">
<div class="text-h7"> <div class="text-h7 boldhigh">
{{ product.name }} {{ myproduct.name }}
</div> </div>
</div> </div>
<div class="row items-center"> <div v-if="complete" class="row items-center">
<div class="text-title text-grey-9"> <div class="text-title text-grey-9">
<span class="text-grey-7">{{ product.description }}</span> <span class="text-grey-7" v-html="myproduct.description"></span>
</div> </div>
</div> </div>
<div> <div>
<div> <div v-if="complete">
<div class="text-grey text-title row items-center q-mt-sm"> <div class="text-grey text-title row items-center q-mt-sm">
<q-icon name="map" class="q-mr-xs"/> <q-icon name="map" class="q-mr-xs"/>
Origine: <span class="text-blue q-ml-xs text-h8"> {{ product.producer.city }} ({{ Origine: <span class="text-blue q-ml-xs text-h8"> {{ myproduct.producer.city }} ({{
product.producer.region myproduct.producer.region
}})</span> }})</span>
</div> </div>
</div> </div>
<div class="text-grey text-title row items-center"> <div v-if="complete" class="text-grey text-title row items-center">
<q-icon name="place" class="q-mr-xs"/> <q-icon name="place" class="q-mr-xs"/>
Produttore: <span class="text-black q-ml-xs text-h8"> {{ product.producer.name }}</span> Produttore: <span class="text-black q-ml-xs text-h8"> {{ myproduct.producer.name }}</span>
</div> </div>
</div> </div>
<!--<q-rating v-model="product.stars" :max="5" size="32px" readonly/>--> <!--<q-rating v-model="myproduct.stars" :max="5" size="32px" readonly/>-->
</q-card-section>
<q-card-section class="q-pt-none">
<div class="row q-mb-sm no-wrap items-center centeritems"> <div class="row q-mb-sm no-wrap items-center centeritems">
<div class="text-price q-mr-md no-wrap"> <div class="text-price no-wrap">
{{ product.price.toFixed(2) }} <span v-if="!!myproduct.price"> {{ myproduct.price.toFixed(2) }}</span>
<span v-if="!!myproduct.after_price">{{ myproduct.after_price }}</span>
</div> </div>
</div> </div>
<div class="row q-mb-sm no-wrap items-center centeritems"> <div class="row q-mb-sm no-wrap items-center centeritems">
@@ -56,6 +56,7 @@
</q-field> </q-field>
<q-btn round size="xs" text-color="grey" icon="fas fa-plus" @click="addqty"></q-btn> <q-btn round size="xs" text-color="grey" icon="fas fa-plus" @click="addqty"></q-btn>
</div> </div>
<div v-if="complete || getnumstore() > 1">
<div class="text-blue text-title row items-center q-mr-md centeritems"> <div class="text-blue text-title row items-center q-mr-md centeritems">
<q-icon size="sm" name="fas fa-shipping-fast" class="q-mr-sm"/> <q-icon size="sm" name="fas fa-shipping-fast" class="q-mr-sm"/>
Ritiro presso: Ritiro presso:
@@ -73,15 +74,19 @@
<span class="text-title text-center">{{ getSingleStorehouse() }}</span> <span class="text-title text-center">{{ getSingleStorehouse() }}</span>
</div> </div>
</div> </div>
</div>
</q-card-section> </q-card-section>
<q-separator/> <q-separator/>
<q-card-actions vertical align="center"> <q-card-actions vertical align="center">
<q-btn icon="fas fa-cart-plus" color="primary" :disable="checkifCartDisable" rounded size="md" label="Aggiungi al Carrello" @click="addtoCart"> <q-btn icon="fas fa-cart-plus" color="primary" :disable="checkifCartDisable" rounded size="md"
label="Aggiungi al Carrello" @click="addtoCart">
</q-btn> </q-btn>
<q-btn :icon="iconWhishlist(product)" flat color="primary" rounded label="Lista Desideri"> <!--
<q-btn :icon="iconWhishlist(myproduct)" flat color="primary" rounded label="Lista Desideri">
</q-btn> </q-btn>
-->
</q-card-actions> </q-card-actions>
</q-card> </q-card>
</template> </template>

View File

@@ -12,9 +12,23 @@ $heightBtn: 100%;
.cpr-progrbar-item { .cpr-progrbar-item {
//height: 10px //height: 10px
margin-top: 11px; margin-top: 8px;
margin-bottom: 11px; margin-bottom: 8px;
height:15px; height:10px;
}
@media (max-width: 600px) {
.cpr-progrbar-item {
//height: 10px
margin-top: 6px;
margin-bottom: 6px;
height: 8px;
}
.progress-item {
padding-top: 2px;
padding-bottom: 2px;
}
} }
.cpr-slider-item { .cpr-slider-item {

View File

@@ -0,0 +1,18 @@
.zoom_data{
font-size:1rem;
font-weight: bold;
text-shadow: .05rem .05rem .05rem #3d3d3d;
color: green;
}
.title {
font-weight: bold;
}
.id_conf{
font-weight: normal;
}
.note{
font-style: italic;
}

View File

@@ -0,0 +1,225 @@
import { Component, Prop, Watch } from 'vue-property-decorator'
import { INotData, IParamsQuery, IShareWithUs } from '../../model/index'
import { tools } from '../../store/Modules/tools'
import { NotevoleStore } from '@store'
import MixinBase from '@src/mixins/mixin-base'
import { validationMixin } from 'vuelidate'
import { validations } from '../CSignUpNotevole/CSignUp-validate'
import { CTitleBanner } from '@components'
import { CCardState } from '../CCardState'
import { UserStore } from '../../store/Modules'
import { GlobalStore } from '../../store'
import { CCopyBtn } from '../CCopyBtn'
import { date } from 'quasar'
import objectId from '@src/js/objectId'
@Component({
name: 'CShareWithUs',
components: { CTitleBanner, CCardState, CCopyBtn }
})
export default class CShareWithUs extends MixinBase {
public $t
public myshares: IShareWithUs[] = []
public mydescr: string = ''
get listasharewithus() {
return GlobalStore.state.sharewithus.sort((a, b) => b.numshared - a.numshared)
}
get listamyshare() {
return UserStore.state.my.profile.myshares
}
public myload() {
const sortBy = 'numshared'
const descending = 1
const myobj = {}
if (descending)
myobj[sortBy] = -1
else
myobj[sortBy] = 1
const params: IParamsQuery = {
table: 'sharewithus',
startRow: 0,
endRow: 10000,
filter: '',
filterand: '',
sortBy: myobj,
descending,
userId: UserStore.state.my._id
}
console.log('myload', params)
GlobalStore.actions.loadTable(params).then((data) => {
GlobalStore.state.sharewithus = data.rows
})
}
public mounted() {
this.myload()
}
public recsharenow(mydescr): IShareWithUs {
return {
idapp: process.env.APP_ID,
description: mydescr,
userId: UserStore.state.my._id,
numshared: 0,
rating: 0
}
}
public add_newshare(mydescr) {
if (!mydescr)
return false
const recfound = UserStore.state.my.profile.myshares.find((rec) => rec.description.toLowerCase() === mydescr.toLowerCase())
if (!!recfound) {
tools.showNegativeNotif(this.$q, '"' + mydescr + '" è già presente!')
return false
}
UserStore.state.my.profile.myshares.push({ description: mydescr, rating: 5 })
const mydata = {
'profile.myshares': UserStore.state.my.profile.myshares
}
tools.saveFieldToServer(this, 'users', UserStore.state.my._id, mydata)
const myrec = this.recsharenow(mydescr)
const updatedexistingrec = this.updaterecnow(mydescr, true)
if (!updatedexistingrec) {
tools.createNewRecord(this, 'sharewithus', myrec, false).then((myrecris) => {
GlobalStore.state.sharewithus.push(myrecris)
this.myload()
this.mydescr = ''
return true
})
}
}
public updaterecnow(mydescr, add) {
const recesistente = GlobalStore.state.sharewithus.find((rec) => rec.description.toLowerCase() === mydescr.toLowerCase())
const indrec = GlobalStore.state.sharewithus.findIndex((rec) => rec.description.toLowerCase() === mydescr.toLowerCase())
console.log('recesistente', recesistente)
if (recesistente) {
const mydatatosave = {
id: recesistente._id,
table: tools.TABSHAREWITHUS,
fieldsvalue: recesistente
}
if (add)
recesistente.numshared++
else {
if (recesistente.numshared <= 0)
return false
else
recesistente.numshared--
}
GlobalStore.actions.saveFieldValue(mydatatosave).then((myrecris) => {
if (myrecris) {
GlobalStore.state.sharewithus[indrec] = recesistente
this.myload()
}
this.mydescr = ''
})
return true
} else {
return false
}
}
public selected(value, shared) {
shared.numshared++
tools.saveFieldToServer(this, 'sharewithus', shared._id, { numshared: shared.numshared })
}
public checkifICanRemove(shared) {
// Controlla se questo è stato aggiunto da me
const recfound = GlobalStore.state.sharewithus.find((rec) => rec.description.toLowerCase() === shared.description.toLowerCase())
if (!!recfound)
return recfound.userId === UserStore.state.my._id
else
return true
}
public removeShared(shared) {
this.$q.dialog({
message: 'Vuoi cancellare "' + shared.description + '" dalla tua lista ?',
ok: {
label: this.$t('dialog.yes'),
push: true
},
cancel: {
label: this.$t('dialog.cancel')
},
title: this.$t('pages.sharedwithus')
}).onOk(async () => {
const descr = shared.description
// Aggiorna Record Personale
UserStore.state.my.profile.myshares = UserStore.state.my.profile.myshares.filter((rec) => rec.description !== descr)
const mydata = {
'profile.myshares': UserStore.state.my.profile.myshares
}
tools.saveFieldToServer(this, 'users', UserStore.state.my._id, mydata)
const updatedexistingrec = this.updaterecnow(shared.description, false)
if (!updatedexistingrec) {
if (this.checkifICanRemove(shared)) {
const myrec = GlobalStore.state.sharewithus.find((rec) => rec.description.toLowerCase() === descr.toLowerCase())
if (!!myrec) {
GlobalStore.actions.DeleteRec({ table: tools.TABSHAREWITHUS, id: myrec._id })
.then((ris) => {
console.log('DELETEREC ris=', ris)
if (ris) {
// Aggiorna Array Globale
GlobalStore.state.sharewithus = GlobalStore.state.sharewithus.filter((rec) => rec.description !== descr)
this.myload()
console.log('GlobalStore.state.sharewithus', GlobalStore.state.sharewithus)
tools.showPositiveNotif(this.$q, this.$t('db.deletedrecord'))
}
})
}
}
}
}
)
}
public findrec(descr) {
if (UserStore.state.my.profile.myshares.length === 0)
return false
return UserStore.state.my.profile.myshares.find((rec) => rec.description.toLowerCase() === descr.toLowerCase())
}
public mycolorbtn(shared) {
if (this.findrec(shared.description)) {
return 'positive'
} else {
return 'primary'
}
}
public geticon(shared) {
if (this.findrec(shared.description))
return undefined
else
return 'fas fa-plus'
}
public getifdisable(shared) {
return this.findrec(shared.description)
}
}

View File

@@ -0,0 +1,91 @@
<template>
<div>
<div>
<CTitleBanner v-if="listasharewithus && listasharewithus.length > 0" class="q-pa-xs"
:title="$t('pages.sharewithus')"
bgcolor="bg-white" clcolor="text-blue"
mystyle="" myclass="myshad" canopen="true">
<div class="flex flex-center">
<div class="row animazione justify-center q-gutter-xs">
<q-item v-for="(shared, index) in listamyshare" :key="shared._id"
class="q-mb-xs animated clBorderShare q-pa-sm" v-ripple>
<transition name="fade" mode="out-in"
appear
enter-active-class="animazione fadeIn"
leave-active-class="animazione fadeOut">
<div class="row">
<q-item-section class="text-center">
<q-item-label class="title">{{ shared.description }}</q-item-label>
<!--<q-item-label class="title">Condiviso: {{ shared.numshared }}</q-item-label>
<q-item-label class="title">Rating: {{ shared.rating }}</q-item-label>-->
</q-item-section>
<!--<q-rating v-model="shared.rating" :max="5" size="16px" @input="change_rating(shared.rating, shared)"/>-->
</div>
</transition>
<q-btn class="q-ml-sm" round icon="fas fa-times" color="white" text-color="grey" size="sm" @click="removeShared(shared)"></q-btn>
</q-item>
</div>
</div>
</CTitleBanner>
Scrivi cosa vorresti fare con noi:<br>
<div class="row no-wrap justify-between q-pa-md q-gutter-sm">
<q-input v-model="mydescr" label="Cosa vorresti fare?" class="full-width">
</q-input>
<q-btn rounded label="Aggiungi" color="positive" @click="add_newshare(mydescr)" :disable="mydescr === ''"></q-btn>
</div>
<CTitleBanner v-if="listasharewithus && listasharewithus.length > 0" class="q-pa-xs"
title="Graduatoria Attuale"
bgcolor="bg-white" clcolor="text-blue"
mystyle="" myclass="myshad" canopen="true">
<div class="flex flex-center text-center">
<div class="animazione justify-center q-gutter-xs">
<q-item v-for="(shared, index) in listasharewithus" :key="shared._id"
class="animated" style="padding: 4px;" v-ripple>
<transition name="fade" mode="out-in"
appear
enter-active-class="animazione fadeIn"
leave-active-class="animazione fadeOut">
<div class="row no-wrap">
<q-btn dense size="md" :color="mycolorbtn(shared)" rounded :icon="geticon(shared)" :label="shared.description + ` (` + (shared.numshared + 1) + `)`"
@click="add_newshare(shared.description)"></q-btn>
<!--<q-item-label class="title">Condiviso: {{ shared.numshared }}</q-item-label>
<q-item-label class="title">Rating: {{ shared.rating }}</q-item-label>-->
<!--<q-rating v-model="shared.rating" :max="5" size="16px" @input="change_rating(shared.rating, shared)"/>-->
</div>
</transition>
</q-item>
</div>
</div>
</CTitleBanner>
</div>
</div>
</template>
<script lang="ts" src="./CShareWithUs.ts">
</script>
<style lang="scss" scoped>
@import './CShareWithUs.scss';
</style>

View File

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

View File

@@ -53,16 +53,19 @@
:disable="$v.$error || iswaitingforRes">{{$t('login.enter')}} :disable="$v.$error || iswaitingforRes">{{$t('login.enter')}}
</q-btn> </q-btn>
</div> </div>
<div v-if="static_data.functionality.ENABLE_REGISTRATION && showregbutt" align="center" style="margin-top:10px;">
<q-btn flat rounded size="md" color="primary" to="/signup" :label="$t('reg.submit')">
</q-btn>
</div>
<br> <br>
<div class="text-center" style="margin-bottom: 10px;"> <div class="text-center" style="margin-bottom: 10px;">
<a :href="getlinkforgetpwd()" style="color:gray;">{{$t('reg.forgetpassword')}}</a> <a :href="getlinkforgetpwd()" style="color:gray;">{{$t('reg.forgetpassword')}}</a>
</div> </div>
<div v-if="static_data.functionality.ENABLE_REGISTRATION && showregbutt" align="center" style="margin-top:10px;">
Se non sei ancora Registrato:<br>
<q-btn rounded size="md" color="primary" to="/signup" :label="$t('reg.submit')">
</q-btn>
</div>
</div> </div>
</form> </form>
</div> </div>

View File

@@ -117,6 +117,7 @@ export default class CSignUp extends MixinBase {
if (!item.$error) { if (!item.$error) {
return '' return ''
} }
console.log('item', item)
// console.log('errorMsg', cosa, item) // console.log('errorMsg', cosa, item)
if (item.$params.email && !item.email) { if (item.$params.email && !item.email) {
return this.$t('reg.err.email') return this.$t('reg.err.email')
@@ -157,6 +158,8 @@ export default class CSignUp extends MixinBase {
} }
} else if (cosa === 'username') { } else if (cosa === 'username') {
// console.log(item); // console.log(item);
console.log('username')
console.log(item.$error)
if (!item.isUnique) { if (!item.isUnique) {
return this.$t('reg.err.duplicate_username') return this.$t('reg.err.duplicate_username')
} }
@@ -176,9 +179,22 @@ export default class CSignUp extends MixinBase {
} }
} }
public changeemail(value) {
this.signup.email = tools.removespaces(this.signup.email)
this.signup.email = this.signup.email.toLowerCase()
this.$emit('update:value', this.signup.email)
}
public changeusername(value) {
this.signup.username = tools.removespaces(this.signup.username)
this.$emit('update:value', this.signup.username)
}
public submitOk() { public submitOk() {
this.$v.signup.$touch() this.$v.signup.$touch()
this.signup.email = tools.removespaces(this.signup.email)
this.signup.email = this.signup.email.toLowerCase()
this.signup.username = tools.removespaces(this.signup.username) this.signup.username = tools.removespaces(this.signup.username)
this.duplicate_email = false this.duplicate_email = false

View File

@@ -14,6 +14,7 @@
v-model="signup.email" v-model="signup.email"
rounded outlined rounded outlined
@blur="$v.signup.email.$touch" @blur="$v.signup.email.$touch"
@input="changeemail"
:error="$v.signup.email.$error" :error="$v.signup.email.$error"
:error-message="errorMsg('email', $v.signup.email)" :error-message="errorMsg('email', $v.signup.email)"
maxlength="50" maxlength="50"
@@ -29,6 +30,7 @@
<q-input <q-input
v-model="signup.username" v-model="signup.username"
rounded outlined rounded outlined
@input="changeusername"
@blur="$v.signup.username.$touch" @blur="$v.signup.username.$touch"
:error="$v.signup.username.$error" :error="$v.signup.username.$error"
@keydown.native.54="(event) => event.preventDefault()" @keydown.native.54="(event) => event.preventDefault()"

View File

@@ -0,0 +1,56 @@
import { ISignupIscrizioneConacreisOptions } from 'model'
import { email, minLength, required, sameAs } from 'vuelidate/lib/validators'
export interface ISignupConacreis {
signup: ISignupIscrizioneConacreisOptions,
validationGroup: string[]
}
export const validations = {
signup: {
name: {
required
},
surname: {
required
},
email: {
email,
required
},
fiscalcode: {
required,
minLength: minLength(16)
},
residency_address: {
required
},
residency_city: {
required
},
residency_province: {
required
},
residency_zipcode: {
required
},
dateofbirth: {
required
},
born_city: {
required
},
born_province: {
required
},
born_country: {
required
},
metodo_pagamento: {
required
},
terms: {
required
},
}
}

View File

@@ -0,0 +1,34 @@
.signup {
width: 100%;
margin: 0 auto;
max-width: 450px;
}
.wrapper {
display: flex;
align-items: center;
justify-content: center;
}
.clCellCode {
border-radius: 32px;
border-right: #2d2260;
height: 50px;
font-size: 1rem;
padding: 8px;
}
.clCell {
border-radius: 32px;
border-right: #2d2260;
height: 50px;
font-size: 1rem;
padding: 8px;
}
.vue-country-select{
border-radius: 32px;
}

View File

@@ -0,0 +1,198 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { UserStore } from '@store'
import { tools } from '../../store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import { ISignupIscrizioneConacreisOptions } from 'model'
import { validations, ISignupConacreis } from './CSignUpIscrizioneConacreis-validate'
import { validationMixin } from 'vuelidate'
import { Logo } from '../../components/logo'
import { DefaultProfile } from '../../store/Modules/UserStore'
// import 'vue-country-code/dist/vue-country-code.css'
import { serv_constants } from '@src/store/Modules/serv_constants'
import VueCountryCode from 'vue-country-code'
import { registereduser } from '../../validation'
import MixinBase from '../../mixins/mixin-base'
import { CTitleBanner } from '../CTitleBanner'
import { CDate } from '../../components/CDate'
import { date } from 'quasar'
import { CMyPage } from '@src/components/CMyPage'
import MixinUsers from '@src/mixins/mixin-users'
Vue.use(VueCountryCode)
// import {Loading, QSpinnerFacebook, QSpinnerGears} from 'quasar'
@Component({
name: 'CSignUpIscrizioneConacreis',
mixins: [validationMixin],
validations,
components: { Logo, CTitleBanner, CDate, CMyPage }
})
export default class CSignUpIscrizioneConacreis extends MixinUsers {
public $v
public $q
public $t: any
public countryname: string = ''
public countryborn: string = ''
public iamadult: boolean = false
public duplicate_email: boolean = false
public duplicate_username: boolean = false
public signup: ISignupIscrizioneConacreisOptions = {
accetta_carta_costituzionale_on: false,
newsletter_on: false,
terms: false
}
public created() {
if (!!this.getMyUsername() && (!UserStore.state.my.profile.socio)) {
this.signup.name = UserStore.state.my.name
this.signup.surname = this.mySurname.toString()
this.signup.email = this.Email
this.signup.cell_phone = this.myCell.toString()
}
this.$v.$reset()
}
get allowSubmit() {
const error = this.$v.$error || this.$v.$invalid
// console.log('v', this.$v, 'error', error, 'terms', this.signup.terms, 'carta', this.signup.accetta_carta_costituzionale_on)
return !error && this.signup.terms && this.signup.accetta_carta_costituzionale_on
}
public env() {
return process.env
}
public setDateOfBirth(param) {
console.log('param', param)
// this.signup.dateofbirth = tools.convertstrtoDate(arguments[0])
this.signup.dateofbirth = new Date(arguments[0])
}
public errorMsg(cosa: string, item: any) {
try {
if (!item.$error) {
return ''
}
console.log('item', item)
// console.log('errorMsg', cosa, item)
if (item.$params.email && !item.email) {
return this.$t('reg.err.email')
}
// console.log('item', item)
if (item.minLength !== undefined) {
if (!item.minLength) {
return this.$t('reg.err.atleast') + ` ${item.$params.minLength.min} ` + this.$t('reg.err.char')
}
}
if (item.complexity !== undefined) {
if (!item.complexity) {
return this.$t('reg.err.complexity')
}
}
// if (!item.maxLength) { return this.$t('reg.err.notmore') + ` ${item.$params.maxLength.max} ` + this.$t('reg.err.char') }
if (item.required !== undefined) {
if (!item.required) {
return this.$t('reg.err.required')
}
}
// console.log(' ....avanti')
if (cosa === 'email') {
// console.log("EMAIL " + item.isUnique);
// console.log(item);
if (!item.isUnique) {
return this.$t('reg.err.duplicate_email')
}
} else if (cosa === 'username') {
// console.log(item);
console.log('username')
console.log(item.$error)
if (!item.isUnique) {
return this.$t('reg.err.duplicate_username')
}
} else if ((cosa === 'name') || (cosa === 'surname')) {
// console.log(item);
}
return ''
} catch (error) {
// console.log("ERR : " + error);
}
}
public submitOk() {
this.$v.signup.$touch()
this.signup.email = tools.removespaces(this.signup.email)
this.signup.email = this.signup.email.toLowerCase()
this.signup.residency_country = tools.CapitalizeAllWords(this.signup.residency_country)
this.signup.residency_address = tools.CapitalizeAllWords(this.signup.residency_address)
this.signup.residency_city = tools.CapitalizeAllWords(this.signup.residency_city)
this.signup.residency_province = this.signup.residency_province.toUpperCase()
this.signup.born_province = this.signup.born_province.toUpperCase()
this.duplicate_email = false
this.duplicate_username = false
if (!this.signup.terms) {
tools.showNotif(this.$q, this.$t('reg.err.terms'))
return
}
if (!this.signup.accetta_carta_costituzionale_on) {
tools.showNotif(this.$q, this.$t('reg.err.accetta_carta_costituzionale_on'))
return
}
if (this.$v.signup.$error) {
tools.showNotif(this.$q, this.$t('reg.err.errore_generico'))
return
}
this.signup.name = tools.CapitalizeAllWords(this.signup.name)
this.signup.surname = tools.CapitalizeAllWords(this.signup.surname)
this.signup.annoTesseramento = 2021
this.$q.loading.show({ message: this.$t('reg.iscrizioneincorso') })
console.log(this.signup)
return UserStore.actions.iscrivitiConacreis(tools.clone(this.signup))
.then((ris) => {
if (tools.SignUpcheckErrors(this, ris.code, ris.msg))
this.$q.loading.hide()
}).catch((error) => {
console.log('ERROR = ' + error)
this.$q.loading.hide()
})
}
public selectcountry({ name, iso2, dialCode }) {
// console.log(name, iso2, dialCode)
this.signup.residency_country = name
this.countryname = name
}
public selectcountryborn({ name, iso2, dialCode }) {
// console.log(name, iso2, dialCode)
this.signup.born_country = name
this.countryborn = name
}
}

View File

@@ -0,0 +1,299 @@
<template>
<div>
<div class="text-center">
<logo></logo>
<CTitleBanner :title="$t('pages.SignUpIscrizione')" :canopen="true" :visible="false">
<div class="q-gutter-xs">
<p class="q-ml-md text-center">
Leggi
<span class="underline"> <router-link to="/il-nostro-progetto" custom v-slot="{ navigate }">
<span class="footer_link" @click="navigate" @keypress.enter="navigate" role="link">Il Nostro Progetto</span>
</router-link></span>
</p>
<q-input
v-model="signup.name"
rounded outlined
@blur="$v.signup.name.$touch"
:error="$v.signup.name.$error"
maxlength="30"
:error-message="errorMsg('name', $v.signup.name)"
:label="$t('reg.name')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="signup.surname"
rounded outlined
@blur="$v.signup.surname.$touch"
:error="$v.signup.surname.$error"
maxlength="30"
:error-message="errorMsg('surname', $v.signup.surname)"
:label="$t('reg.surname')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="signup.email"
rounded outlined
@blur="$v.signup.email.$touch"
:error="$v.signup.email.$error"
:error-message="errorMsg('email', $v.signup.email)"
maxlength="50"
debounce="1000"
:label="$t('reg.email')">
<template v-slot:prepend>
<q-icon name="email"/>
</template>
</q-input>
<q-input
v-model="signup.fiscalcode"
rounded outlined
@blur="$v.signup.fiscalcode.$touch"
:error="$v.signup.fiscalcode.$error"
maxlength="20"
mask="AAAAAA##A##A###A"
debounce="1000"
:error-message="errorMsg('fiscalcode', $v.signup.fiscalcode)"
:label="$t('reg.fiscalcode')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="signup.residency_address"
rounded outlined
@blur="$v.signup.residency_address.$touch"
:error="$v.signup.residency_address.$error"
maxlength="60"
debounce="1000"
:error-message="errorMsg('residency_address', $v.signup.residency_address)"
:label="$t('reg.residency_address')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="signup.residency_city"
rounded outlined
@blur="$v.signup.residency_city.$touch"
:error="$v.signup.residency_city.$error"
maxlength="60"
debounce="1000"
:error-message="errorMsg('residency_city', $v.signup.residency_city)"
:label="$t('reg.residency_city')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="signup.residency_province"
rounded outlined
@blur="$v.signup.residency_province.$touch"
:error="$v.signup.residency_province.$error"
maxlength="3"
debounce="1000"
:error-message="errorMsg('residency_province', $v.signup.residency_province)"
:label="$t('reg.residency_province')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="signup.residency_zipcode"
rounded outlined
@blur="$v.signup.residency_zipcode.$touch"
:error="$v.signup.residency_zipcode.$error"
maxlength="10"
debounce="1000"
:error-message="errorMsg('residency_zipcode', $v.signup.residency_zipcode)"
:label="$t('reg.residency_zipcode')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="countryname"
:readonly="true"
rounded outlined
debounce="1000"
:label="$t('reg.nationality')">
<template v-slot:prepend>
<vue-country-code
@onSelect="selectcountry"
:preferredCountries="tools.getprefCountries"
:dropdownOptions="{ disabledDialCode: true }"
>
</vue-country-code>
</template>
</q-input>
<br>
<vue-tel-input
v-model="signup.cell_phone"
:placeholder="$t('reg.cell')"
maxlength="20"
debounce="1000"
:enabledCountryCode="true"
inputClasses="clCell"
wrapperClasses="clCellCode">
</vue-tel-input>
<br>
<q-input
v-model="signup.dateofbirth"
debounce="1000"
@blur="$v.signup.dateofbirth.$touch"
:error="$v.signup.dateofbirth.$error"
:error-message="errorMsg('dateofbirth', $v.signup.dateofbirth)"
stack-label
:label="$t('reg.dateofbirth')"
rounded
type="date"
mask="date"
fill-mask
outlined>
</q-input>
<q-input
v-model="signup.born_city"
rounded outlined
@blur="$v.signup.born_city.$touch"
:error="$v.signup.born_city.$error"
maxlength="60"
debounce="1000"
:error-message="errorMsg('born_city', $v.signup.born_city)"
:label="$t('reg.born_city')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-input
v-model="signup.born_province"
rounded outlined
@blur="$v.signup.born_province.$touch"
:error="$v.signup.born_province.$error"
maxlength="3"
debounce="1000"
:error-message="errorMsg('born_province', $v.signup.born_province)"
:label="$t('reg.born_province')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<!--<CDate :mydate="signup.dateofbirth" @input="setDateOfBirth(arguments[0])"
:rounded="true" :outlined="true"
:dense="false"
:label="$t('reg.dateofbirth')">
</CDate>-->
<q-input
v-model="countryborn"
:readonly="true"
rounded outlined
debounce="1000"
:label="$t('reg.nationality_born')">
<template v-slot:prepend>
<vue-country-code
@onSelect="selectcountryborn"
:preferredCountries="tools.getprefCountries"
:dropdownOptions="{ disabledDialCode: true }"
>
</vue-country-code>
</template>
</q-input>
<br>
<!--<div v-if="!tools.isMobile()"><br></div>-->
<q-select
rounded outlined v-model="signup.metodo_pagamento"
:options="tools.SelectMetodiPagamento"
:label="$t('reg.metodopagamento')" emit-value map-options>
</q-select>
<q-checkbox
v-model="signup.accetta_carta_costituzionale_on"
color="secondary">
<span v-html="$t('reg.accetta_carta_costituzionale_on')"></span>
</q-checkbox>
<q-checkbox
v-model="signup.terms"
color="secondary"
@blur="$v.signup.terms.$touch"
:error="$v.signup.terms.$error"
:error-message="`${errorMsg('terms', $v.signup.terms)}`"
:label="$t('reg.terms')">
</q-checkbox>
<div class="wrapper">
<q-btn rounded size="lg" color="positive" @click="submitOk" :disabled='!allowSubmit'
:label="$t('reg.iscriviti')">
</q-btn>
</div>
<br>
</div>
</CTitleBanner>
<br>
</div>
</div>
</template>
<script lang="ts" src="./CSignUpIscrizioneConacreis.ts">
</script>
<style lang="scss" scoped>
@import './CSignUpIscrizioneConacreis.scss';
</style>

View File

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

View File

@@ -3,7 +3,7 @@
<CSignIn :mythis="mythis" <CSignIn :mythis="mythis"
@loginOk="loginOk" @loginOk="loginOk"
@loginInCorso="loginInCorso" @loginInCorso="loginInCorso"
:showregbutt="false" :showregbutt="showregbutt"
@checkErrors="checkErrors" @checkErrors="checkErrors"
@showNotif="showNotif"> @showNotif="showNotif">
</CSignIn> </CSignIn>

View File

@@ -18,6 +18,7 @@ export default class CSingleCart extends MixinBase {
public $t public $t
@Prop({ required: true }) public order: IOrder @Prop({ required: true }) public order: IOrder
@Prop({ required: false, default: false }) public showall: boolean @Prop({ required: false, default: false }) public showall: boolean
@Prop({ required: false, default: false }) public nomodif: boolean
get myimgclass() { get myimgclass() {
if (this.showall) { if (this.showall) {

View File

@@ -13,7 +13,7 @@
</div> </div>
<div class="col-3"> <div class="col-3">
<div class="row q-mb-xs no-wrap items-center centeritems"> <div class="row q-mb-xs no-wrap items-center centeritems">
<q-btn v-if="showall" round size="xs" text-color="grey" icon="fas fa-minus" <q-btn v-if="showall && !nomodif" round size="xs" text-color="grey" icon="fas fa-minus"
@click="addsubqty(false, true)"></q-btn> @click="addsubqty(false, true)"></q-btn>
<!--<q-field outlined dense style="width: 25px; height: 20px; " class="q-mx-xs text-subtitle4"> <!--<q-field outlined dense style="width: 25px; height: 20px; " class="q-mx-xs text-subtitle4">
<template v-slot:control> <template v-slot:control>
@@ -21,15 +21,15 @@
</template> </template>
</q-field>--> </q-field>-->
<div class="q-mx-sm text-blue-14">{{ order.quantity }}</div> <div class="q-mx-sm text-blue-14">{{ order.quantity }}</div>
<q-btn v-if="showall" round size="xs" text-color="grey" icon="fas fa-plus" <q-btn v-if="showall && !nomodif" round size="xs" text-color="grey" icon="fas fa-plus"
@click="addsubqty(true, false)"></q-btn> @click="addsubqty(true, false)"></q-btn>
</div> </div>
</div> </div>
<div class="col-2 no-wrap text-subtitle3 q-mr-sm"> <div class="col-2 no-wrap text-subtitle3 q-mr-sm">
{{ (order.price * order.quantity).toFixed(2) }} &nbsp;{{ (order.price * order.quantity).toFixed(2) }}
</div> </div>
<div class="col-1"> <div class="col-1">
<q-btn icon="fas fa-times" color="negative" round size="xs" @click="removeFromCard"> <q-btn v-if="!nomodif" icon="fas fa-times" color="negative" round size="xs" @click="removeFromCard">
</q-btn> </q-btn>
</div> </div>
</div> </div>

View File

@@ -10,27 +10,12 @@
myclass="myshad" canopen="true" :visible="true"> myclass="myshad" canopen="true" :visible="true">
<div v-if="showconditions"> <div v-if="showconditions">
<div v-if="toolsext.isLang('fr')">
<CVideo myvideokey="GZR0ncSaG8s"></CVideo>
</div>
<div v-else>
<CVideo myvideokey="DWfQzbOCK3s"></CVideo> <CVideo myvideokey="DWfQzbOCK3s"></CVideo>
</div> </div>
</div>
<div v-else> <div v-else>
<div v-if="toolsext.isLang('si')"> <div v-if="toolsext.isLang('it')">
<CVideo myvideokey="5vJ-xSdoUmk"></CVideo> <CVideo myvideokey=""></CVideo>
</div> </div>
<div v-else-if="toolsext.isLang('it')">
<CVideo myvideokey="GU93sIBG6yM"></CVideo>
</div>
<div v-else-if="toolsext.isLang('hr')">
<CVideo myvideokey="zBksb1vdddw"></CVideo>
</div>
<div v-else>
<CVideo myvideokey="16VpLhir7xg"></CVideo>
</div>
</div> </div>
</CTitleBanner> </CTitleBanner>

View File

@@ -114,8 +114,8 @@
</FormNewsletter> </FormNewsletter>
<p class="text-center"> <p class="text-center">
<router-link v-if="static_data.functionality.SHOW_ONLY_POLICY" to="/policy"><span <router-link v-if="static_data.functionality.SHOW_ONLY_POLICY" to="/policy" custom v-slot="{ navigate }">
class="footer_link">{{$t('privacy_policy')}}</span></router-link> <span class="footer_link" @click="navigate" @keypress.enter="navigate" role="link">{{$t('privacy_policy')}}</span></router-link>
</p> </p>
</div> </div>
@@ -131,8 +131,8 @@
<span class="footer_link">{{tools.getLabelByItem(myitemmenu, mythisfoot)}}</span><br/> <span class="footer_link">{{tools.getLabelByItem(myitemmenu, mythisfoot)}}</span><br/>
</div> </div>
<div v-else> <div v-else>
<router-link :to="myitemmenu.path"> <router-link :to="myitemmenu.path" custom v-slot="{ navigate }">
<span class="footer_link"><span <span class="footer_link" @click="navigate" @keypress.enter="navigate" role="link"><span
v-if="myitemmenu.level_child > 0">&nbsp;&nbsp;&nbsp;</span> v-if="myitemmenu.level_child > 0">&nbsp;&nbsp;&nbsp;</span>
{{tools.getLabelByItem(myitemmenu, mythisfoot)}}</span><br/> {{tools.getLabelByItem(myitemmenu, mythisfoot)}}</span><br/>
</router-link> </router-link>

View File

@@ -44,7 +44,8 @@
</q-input> </q-input>
<router-link to="/policy"><span class="news_link">{{$t('privacy_policy')}}</span></router-link> <router-link to="/policy" custom v-slot="{ navigate }">
<span class="news_link" @click="navigate" @keypress.enter="navigate" role="link">{{$t('privacy_policy')}}</span></router-link>
<q-toggle dark v-model="accept" :label="$t('newsletter.acceptlicense')"/> <q-toggle dark v-model="accept" :label="$t('newsletter.acceptlicense')"/>

View File

@@ -213,9 +213,6 @@ canvas {
display: none !important; display: none !important;
} }
.underline {
text-decoration: underline;
}
.toolbar { .toolbar {
min-height: 43px; min-height: 43px;

View File

@@ -18,6 +18,7 @@ import MixinUsers from '../../mixins/mixin-users'
import { CMyAvatar } from '../CMyAvatar' import { CMyAvatar } from '../CMyAvatar'
import { CSigninNoreg } from '../CSigninNoreg' import { CSigninNoreg } from '../CSigninNoreg'
import { CMyCart } from '@components' import { CMyCart } from '@components'
import { shared_consts } from '@src/common/shared_vuejs'
@Component({ @Component({
name: 'Header', name: 'Header',
@@ -42,6 +43,7 @@ export default class Header extends Vue {
public clCloudUpload: string = '' public clCloudUpload: string = ''
public clCloudDownload: string = '' public clCloudDownload: string = ''
public clCloudUp_Indexeddb: string = '' public clCloudUp_Indexeddb: string = ''
public tabcmd: string = ''
public clCloudDown_Indexeddb: string = 'clIndexeddbsend' public clCloudDown_Indexeddb: string = 'clIndexeddbsend'
public photo = '' public photo = ''
public visuimg: boolean = true public visuimg: boolean = true
@@ -62,6 +64,21 @@ export default class Header extends Vue {
return UserStore.state.isManager return UserStore.state.isManager
} }
get isSocio() {
return UserStore.state.my.profile.socio
}
get isSocioResidente() {
return UserStore.state.my.profile.socioresidente
}
get isConsiglio() {
return UserStore.state.my.profile.consiglio
}
get getcolormenu() {
return this.isSocio ? 'green-7' : 'white'
}
get isTutor() { get isTutor() {
return UserStore.state.isTutor return UserStore.state.isTutor
} }
@@ -120,19 +137,25 @@ export default class Header extends Vue {
} }
get rightDrawerOpen() { get rightDrawerOpen() {
return GlobalStore.state.RightDrawerOpen return GlobalStore.state.rightDrawerOpen
}
set rightDrawerOpen(value) {
GlobalStore.state.rightDrawerOpen = value
if (GlobalStore.state.rightDrawerOpen)
GlobalStore.state.rightCartOpen = false
} }
get rightCartOpen() { get rightCartOpen() {
return GlobalStore.state.rightCartOpen return GlobalStore.state.rightCartOpen
} }
set rightDrawerOpen(value) {
GlobalStore.state.RightDrawerOpen = value
}
set rightCartOpen(value) { set rightCartOpen(value) {
GlobalStore.state.rightCartOpen = value GlobalStore.state.rightCartOpen = value
if (GlobalStore.state.rightCartOpen)
GlobalStore.state.rightDrawerOpen = false
} }
get lang() { get lang() {
@@ -195,11 +218,12 @@ export default class Header extends Vue {
// console.log('SSSSSSSS: ', value, oldValue) // console.log('SSSSSSSS: ', value, oldValue)
const color = (value === 'online') ? 'positive' : 'warning' const color = (value === 'online') ? 'positive' : 'warning'
const statoconn = this.$t('connection.conn') + ' ' + ((value === 'online') ? this.$t('connection.online') : this.$t('connection.offline'))
if (this.static_data.functionality.SHOW_IF_IS_SERVER_CONNECTION) { if (this.static_data.functionality.SHOW_IF_IS_SERVER_CONNECTION) {
if (!!oldValue) { if (!!oldValue) {
tools.showNotif(this.$q, this.$t('connection') + ` {disc__value}`, { tools.showNotif(this.$q, statoconn, {
color, color,
icon: 'wifi' icon: 'wifi'
}) })
@@ -390,6 +414,15 @@ export default class Header extends Vue {
return 0 return 0
} }
get getnumOrdersCart() {
const arrorderscart = Products.state.orders.filter((rec) => rec.status < shared_consts.OrderStatus.RECEIVED)
// const arrorderscart = Products.state.orders
if (!!arrorderscart) {
return arrorderscart.length
}
return 0
}
get getcart() { get getcart() {
return Products.state.cart return Products.state.cart
} }
@@ -402,4 +435,9 @@ export default class Header extends Vue {
else else
return 'bg-primary' return 'bg-primary'
} }
public changecmd(value) {
console.log('changecmd', value)
GlobalStore.mutations.changeCmdClick(value)
}
} }

View File

@@ -108,6 +108,7 @@
icon="menu" icon="menu"
@click="rightDrawerOpen = !rightDrawerOpen"> @click="rightDrawerOpen = !rightDrawerOpen">
</q-btn> </q-btn>
<q-btn class="q-mx-xs" v-if="static_data.functionality.ENABLE_ECOMMERCE && isLogged" round dense flat <q-btn class="q-mx-xs" v-if="static_data.functionality.ENABLE_ECOMMERCE && isLogged" round dense flat
@click="rightCartOpen = !rightCartOpen" icon="fas fa-shopping-cart"> @click="rightCartOpen = !rightCartOpen" icon="fas fa-shopping-cart">
@@ -116,8 +117,24 @@
{{ getnumItemsCart }} {{ getnumItemsCart }}
</q-badge> </q-badge>
</q-btn> </q-btn>
<q-btn class="q-mx-xs" v-if="static_data.functionality.ENABLE_ECOMMERCE && isLogged && getnumOrdersCart > 0"
round dense flat
to="/orderinfo" icon="fas fa-list-ol">
<q-badge v-if="getnumOrdersCart > 0" color="blue" floating transparent>
{{ getnumOrdersCart }}
</q-badge>
</q-btn>
<q-btn class="q-mx-xs" v-if="static_data.functionality.SHOW_USER_MENU && isLogged" round dense flat <q-btn class="q-mx-xs" v-if="static_data.functionality.SHOW_USER_MENU && isLogged" round dense flat
@click="rightDrawerOpen = !rightDrawerOpen" :icon="getMyImgforIcon"> @click="rightDrawerOpen = !rightDrawerOpen" :icon="getMyImgforIcon" :color="getcolormenu">
<!--<q-badge v-if="isSocio" color="green" floating transparent>
s
</q-badge>-->
</q-btn> </q-btn>
</q-toolbar> </q-toolbar>
@@ -152,24 +169,32 @@
style="height: 150px" alt="section page"> style="height: 150px" alt="section page">
</q-img> </q-img>
<div class="absolute-top bg-transparent text-black center_img" style="margin-top: 10px;"> <div class="absolute-top bg-transparent text-black center_img" style="margin-top: 10px;">
<div class="text-center q-ma-xs boldhigh text-white text-h7">Area Personale</div>
<CMyAvatar :myimg="getMyImg"></CMyAvatar> <CMyAvatar :myimg="getMyImg"></CMyAvatar>
<q-btn class="absolute-top-right" style="margin-right: 10px; color: white;" <q-btn class="absolute-top-right" style="margin-right: 10px; color: white;"
dense flat round icon="close" @click="rightDrawerOpen = !rightDrawerOpen"> dense flat round icon="close" @click="rightDrawerOpen = !rightDrawerOpen">
</q-btn> </q-btn>
<div v-if="isLogged" class="text-weight-bold text-user">{{ Username }} - {{ myName }} <span
v-if="isAdmin"> [Admin]</span> <div v-if="isLogged" class="text-weight-bold text-user">{{ Username }} - {{ myName }}
<span v-if="isManager"> [Manager]</span>
<span v-if="isTutor"> [Tutor]</span>
<span v-if="isTratuttrici"> [Trad]</span>
</div> </div>
<div v-else class="text-user text-italic bg-red"> <div class="row justify-evenly q-pa-xs-sm">
<div v-if="isLogged && isAdmin" class="text-weight-bold text-user bg-red q-px-xs">Admin</div>
<div v-if="isSocio" class="text-weight-bold text-user q-px-xs">Socio</div>
<div v-if="isSocioResidente" class="text-weight-bold text-user q-px-xs bg-amber">Residente</div>
<div v-if="isConsiglio" class="text-weight-bold text-user q-px-xs bg-deep-orange-10">Consiglio</div>
<div v-if="isManager" class="text-weight-bold text-user bg-blue q-px-xs">Segreteria</div>
<div v-if="isTutor" class="text-weight-bold text-user q-px-xs">Tutor</div>
<div v-if="isTratuttrici" class="text-weight-bold text-user q-px-xs">Editor</div>
</div>
<div v-if="!isLogged" class="text-user text-italic bg-red">
{{ $t('user.loggati') }} {{ $t('user.loggati') }}
</div> </div>
<div v-if="isLogged && !isEmailVerified" class="text-verified">{{ <div v-if="isLogged && !isEmailVerified" class="text-verified">{{
$t('components.authentication.email_verification.verify_email') }} $t('components.authentication.email_verification.verify_email')
}}
</div> </div>
<!--<span class="text-white" v-if="Verificato"> {{$t('reg.verificato')}} </span>--> <!--<span class="text-white" v-if="Verificato"> {{$t('reg.verificato')}} </span>-->
@@ -184,15 +209,16 @@
</div> </div>
<div style="margin-top:120px;"></div> <div style="margin-top:120px;"></div>
<div v-show="!isLogged"> <div v-show="!isLogged">
<div class="q-ma-md" style=""> <div class="q-ma-md" style="">
<CSigninNoreg :showregbutt="static_data.functionality.SHOW_REG_BUTTON"> <CSigninNoreg :showregbutt="true">
</CSigninNoreg> </CSigninNoreg>
</div> </div>
</div> </div>
</div> </div>
<div v-if="isLogged" class="q-mt-lg"><br><br></div> <div v-if="isLogged" class="q-mt-lg"></div>
<slot></slot> <slot></slot>

View File

@@ -27,6 +27,6 @@ export default class CTesseraElettronica extends Vue {
} }
get rightDrawerOpen() { get rightDrawerOpen() {
return GlobalStore.state.RightDrawerOpen return GlobalStore.state.rightDrawerOpen
} }
} }

View File

@@ -16,6 +16,7 @@ export * from './CMyPopupEdit'
export * from './CMyToggleList' export * from './CMyToggleList'
export * from './CMyChipList' export * from './CMyChipList'
export * from './CMyEditor' export * from './CMyEditor'
export * from './CInput'
export * from './CMyFieldDb' export * from './CMyFieldDb'
export * from './CMyTeacher' export * from './CMyTeacher'
export * from './CImgText' export * from './CImgText'
@@ -25,6 +26,7 @@ export * from './CSignIn'
export * from './CSignUp' export * from './CSignUp'
export * from './CSignUpNotevole' export * from './CSignUpNotevole'
export * from './CSignUpSIP' export * from './CSignUpSIP'
export * from './CSignUpIscrizioneConacreis'
export * from './CEventsCalendar' export * from './CEventsCalendar'
export * from './CMySingleEvent' export * from './CMySingleEvent'
export * from './CDate' export * from './CDate'
@@ -63,4 +65,6 @@ export * from './CMyFlotta'
export * from './CECommerce' export * from './CECommerce'
export * from './CSingleCart' export * from './CSingleCart'
export * from './CMyCart' export * from './CMyCart'
export * from './CShareWithUs'
export * from './CHours'
export * from '../views/ecommerce/' export * from '../views/ecommerce/'

View File

@@ -1,5 +1,4 @@
$colcompleted: #a2a2a2; $colcompleted: #a2a2a2;
$heightitem: 32px; $heightitem: 32px;
$heightothers: 32px; $heightothers: 32px;
@@ -11,7 +10,7 @@ $heightdescr: 20px;
.flex-container2 { .flex-container2 {
flex-flow: row wrap; flex-flow: row wrap;
justify-content: space-between; justify-content: space-between;
margin: 0px 10px 0px 10px; // top right bottom left // margin: 0px 10px 0px 10px; // top right bottom left
} }
// Set visibility: visible to the icon menu of pos-item-popover // Set visibility: visible to the icon menu of pos-item-popover
@@ -56,26 +55,33 @@ $heightdescr: 20px;
} }
.pos-item { .pos-item {
max-width: 24px; // max-width: 24px;
min-width: 26px; // min-width: 26px;
margin-left: 1px;
margin-right: 1px;
padding-left: 1px; padding-left: 1px;
padding-right: 1px; padding-right: 1px;
margin: 0px; margin: 0;
padding-top: 0px; padding-top: 0;
padding-bottom: 0px; padding-bottom: 0;
//height: $heightitem; //height: $heightitem;
line-height: $heightitem; line-height: $heightitem;
min-height: $heightitem; min-height: $heightitem;
text-align: center; text-align: center;
vertical-align: middle;
// background-color: #ff4081; // background-color: #ff4081;
font-size: 1rem; font-size: 1rem;
order: 2; // order: 1;
flex: 1; // flex: 1;
} }
.pos-group {
order: 1;
}
.pos-go {
// order: 1;
}
.titleLista-item { .titleLista-item {
@@ -92,8 +98,8 @@ $heightdescr: 20px;
.pos-item-popover{ .pos-item-popover{
max-width: 24px; // max-width: 24px;
min-width: 24px; // min-width: 24px;
padding: 0px; padding: 0px;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
@@ -157,8 +163,10 @@ $heightdescr: 20px;
padding-bottom: 4px; padding-bottom: 4px;
max-width: 36px; max-width: 36px;
min-width: 32px; min-width: 32px;
flex: 1; display: inline-block;
order: 1; vertical-align: middle;
// flex: 1;
// order: 1;
} }
.progrbar-item { .progrbar-item {
@@ -247,6 +255,7 @@ $heightdescr: 20px;
font-size: 1rem; font-size: 1rem;
display: table; display: table;
flex: 1; flex: 1;
order: 1;
height: $heightitem; height: $heightitem;
vertical-align: middle; vertical-align: middle;
} }
@@ -388,3 +397,15 @@ $heightdescr: 20px;
*/ */
.clResp{
font-weight: bold;
color: darkgreen;
}
.clViceResp{
font-weight: bold;
color: red;
}
.clVice2Resp{
font-weight: bold;
color: darkblue;
}

View File

@@ -6,7 +6,7 @@ import { tools } from '../../../store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext' import { toolsext } from '@src/store/Modules/toolsext'
import { lists } from '../../../store/Modules/lists' import { lists } from '../../../store/Modules/lists'
import { IProject } from '../../../model/index' import { IProject, TipoVisu } from '../../../model/index'
import { SubMenusProj } from '../SubMenusProj' import { SubMenusProj } from '../SubMenusProj'
import { CDate } from '../../CDate' import { CDate } from '../../CDate'
@@ -14,6 +14,7 @@ import { CDate } from '../../CDate'
import { date } from 'quasar' import { date } from 'quasar'
import { GlobalStore } from '@store' import { GlobalStore } from '@store'
import { RouteNames } from '@src/router/route-names' import { RouteNames } from '@src/router/route-names'
import { shared_consts } from '@src/common/shared_vuejs'
@Component({ @Component({
components: { SubMenusProj, CDate }, components: { SubMenusProj, CDate },
@@ -51,6 +52,24 @@ export default class SingleProject extends Vue {
return Projects.getters.CanIModifyPanelPrivacy(this.itemproject) return Projects.getters.CanIModifyPanelPrivacy(this.itemproject)
} }
get TipoVisu() {
return TipoVisu
}
get getTipovisuByProjParent() {
let myprojparent = Projects.getters.getRecordById(this.itemproject.id_parent)
if (!myprojparent)
myprojparent = this.itemproject
return Projects.getters.getTipoVisuProj(myprojparent)
}
get getTipoViewByProjParent() {
const myprojparent = Projects.getters.getRecordById(this.itemproject.id_parent)
if (!myprojparent)
return ''
return myprojparent.view
}
@Prop({ required: true }) public itemproject: IProject @Prop({ required: true }) public itemproject: IProject
@Watch('itemproject.enableExpiring') @Watch('itemproject.enableExpiring')
@@ -83,6 +102,31 @@ export default class SingleProject extends Vue {
this.watchupdate('themecolor') this.watchupdate('themecolor')
} }
@Watch('itemproject.pos')
public valueChangedpos() {
this.watchupdate('pos')
}
@Watch('itemproject.groupId')
public valueChangedgroupId() {
this.watchupdate('groupId')
}
@Watch('itemproject.respUsername')
public valueChangedresp() {
this.watchupdate('respUsername')
}
@Watch('itemproject.viceRespUsername')
public valueChangedviceResp() {
this.watchupdate('viceRespUsername')
}
@Watch('itemproject.vice2RespUsername')
public valueChangedvice2Resp() {
this.watchupdate('vice2RespUsername')
}
@Watch('itemproject.themebgcolor') @Watch('itemproject.themebgcolor')
public valueChangedthemebgcolor() { public valueChangedthemebgcolor() {
this.watchupdate('themebgcolor') this.watchupdate('themebgcolor')
@@ -123,6 +167,11 @@ export default class SingleProject extends Vue {
this.watchupdate('privacywrite') this.watchupdate('privacywrite')
} }
@Watch('itemproject.tipovisu')
public valueChanged_tipovisu() {
this.watchupdate('tipovisu')
}
@Watch('itemproject.totalphases') @Watch('itemproject.totalphases')
public valueChangedtotalphases() { public valueChangedtotalphases() {
this.watchupdate('totalphases') this.watchupdate('totalphases')
@@ -130,7 +179,7 @@ export default class SingleProject extends Vue {
@Watch('itemproject.progressCalc') @Watch('itemproject.progressCalc')
public valueChanged6() { public valueChanged6() {
console.log('itemproject.progressCalc') // console.log('itemproject.progressCalc')
this.updateClasses() this.updateClasses()
// console.log('this.percentageProgress', this.percentageProgress, 'this.itemproject.progressCalc', this.itemproject.progressCalc) // console.log('this.percentageProgress', this.percentageProgress, 'this.itemproject.progressCalc', this.itemproject.progressCalc)
@@ -169,15 +218,15 @@ export default class SingleProject extends Vue {
} }
public watchupdate(field = '') { public watchupdate(field = '') {
console.log('watchupdate PROJ', field) // console.log('watchupdate PROJ', field)
this.$emit('eventupdateproj', { myitem: this.itemproject, field }) this.$emit('eventupdateproj', { myitem: this.itemproject, field })
this.updateicon() this.updateicon()
} }
public updateClasses() { public updateClasses() {
// this.classCompleted = 'completed-item' // this.classCompleted = 'completed-item'
this.classDescr = 'flex-item div_descr show donotdrag' this.classDescr = ''
this.classDescrEdit = 'flex-item div_descr_edit donotdrag' this.classDescrEdit = 'div_descr_edit donotdrag'
if (!this.isProject()) { if (!this.isProject()) {
this.classDescr += ' titleLista-item' this.classDescr += ' titleLista-item'
this.classDescrEdit += ' titleLista-item' this.classDescrEdit += ' titleLista-item'
@@ -188,7 +237,7 @@ export default class SingleProject extends Vue {
this.percProgress = 'percProgress' this.percProgress = 'percProgress'
this.classExpiring = 'flex-item data-item shadow-1 hide-if-small' this.classExpiring = 'data-item shadow-1 hide-if-small'
this.classExpiringEx = '' this.classExpiringEx = ''
this.clButtPopover = this.sel ? 'pos-item-popover comp_selected' : 'pos-item-popover' this.clButtPopover = this.sel ? 'pos-item-popover comp_selected' : 'pos-item-popover'
@@ -231,7 +280,7 @@ export default class SingleProject extends Vue {
} }
public clickRiga(clickmenu: boolean = false) { public clickRiga(clickmenu: boolean = false) {
console.log('CLICK RIGA PROJ ************') // console.log('CLICK RIGA PROJ ************')
// if (!this.sel) { // if (!this.sel) {
@@ -240,12 +289,12 @@ export default class SingleProject extends Vue {
this.$emit('deselectAllRowstodo', null, false) this.$emit('deselectAllRowstodo', null, false)
this.$emit('deselectAllRowsproj', this.itemproject, true) this.$emit('deselectAllRowsproj', this.itemproject, true)
if (!this.sel) { // if (!this.sel) {
this.selectRiga() this.selectRiga()
} else { // } else {
this.$emit('deselectAllRowsproj', null, false, false, true) // this.$emit('deselectAllRowsproj', null, false, false, true)
this.deselectRiga() // this.deselectRiga()
} // }
} }
} }
@@ -287,7 +336,7 @@ export default class SingleProject extends Vue {
} }
public activeEdit() { public activeEdit() {
console.log('Attiva Edit') // console.log('Attiva Edit')
this.attivaEdit = true this.attivaEdit = true
this.editProject() this.editProject()
} }
@@ -297,6 +346,10 @@ export default class SingleProject extends Vue {
} }
get tipoProj() { get tipoProj() {
const myarr = this.$route.name.split('.')
if (myarr)
return myarr[1]
else
return this.$route.name return this.$route.name
} }
@@ -342,7 +395,7 @@ export default class SingleProject extends Vue {
} }
// console.log('focus()') // console.log('focus()')
}, 400) }, 100)
} }
public getFocus(e) { public getFocus(e) {
@@ -379,7 +432,9 @@ export default class SingleProject extends Vue {
} }
public keyDownArea(e) { public keyDownArea(e) {
console.log('keyDownArea') // console.log('keyDownArea', e.keyCode, 'key', e.key)
// console.log('precDescr', this.precDescr)
// console.log('shiftKey', e.shiftKey)
/* /*
if ((e.key === 'ArrowUp') && !e.shiftKey) { if ((e.key === 'ArrowUp') && !e.shiftKey) {
e.key = 'Tab' e.key = 'Tab'
@@ -405,6 +460,7 @@ export default class SingleProject extends Vue {
} }
if (((e.key === 'Enter') || (e.key === 'Tab')) && !e.shiftKey) { if (((e.key === 'Enter') || (e.key === 'Tab')) && !e.shiftKey) {
// console.log(' updateTodo...')
this.updateTodo() this.updateTodo()
if ((e.key === 'Tab') && !e.shiftKey) { if ((e.key === 'Tab') && !e.shiftKey) {
@@ -427,14 +483,17 @@ export default class SingleProject extends Vue {
} }
public updateTodo() { public updateTodo() {
// console.log('this.itemproject.descr', this.itemproject.descr)
// console.log('precDescr', this.precDescr)
if (this.itemproject.descr === this.precDescr) { if (this.itemproject.descr === this.precDescr) {
return return
} }
this.itemproject.descr = this.precDescr this.itemproject.descr = this.precDescr
console.log('updateTodo', this.precDescr, this.itemproject.descr) // console.log('updateTodo', this.precDescr, this.itemproject.descr)
console.log('itemproject', this.itemproject) // console.log('itemproject', this.itemproject)
console.log('Prec:', this.itemprojectPrec) // console.log('Prec:', this.itemprojectPrec)
this.watchupdate('descr') this.watchupdate('descr')
this.inEdit = false this.inEdit = false
@@ -467,7 +526,7 @@ export default class SingleProject extends Vue {
public updatedata(field: string) { public updatedata(field: string) {
// const myitem = tools.jsonCopy(this.itemproject) // const myitem = tools.jsonCopy(this.itemproject)
console.log('calling this.$emit(eventupdateproj)', this.itemproject) // console.log('calling this.$emit(eventupdateproj)', this.itemproject)
this.$emit('eventupdateproj', { myitem: this.itemproject, field }) this.$emit('eventupdateproj', { myitem: this.itemproject, field })
} }
@@ -497,7 +556,7 @@ export default class SingleProject extends Vue {
} }
public async clickMenu(action) { public async clickMenu(action) {
console.log('click menu: ', action) // console.log('click menu: ', action)
if (action === lists.MenuAction.DELETE) { if (action === lists.MenuAction.DELETE) {
return await this.askConfirmDelete() return await this.askConfirmDelete()
} else if (action === lists.MenuAction.TOGGLE_EXPIRING) { } else if (action === lists.MenuAction.TOGGLE_EXPIRING) {
@@ -598,4 +657,25 @@ export default class SingleProject extends Vue {
*/ */
} }
public getResp() {
if (!!GlobalStore.state.resps)
return this.itemproject.respUsername ? GlobalStore.getters.getRespByUsername(this.itemproject.respUsername) : ''
else
return ''
}
public getViceResp() {
if (!!GlobalStore.state.resps)
return this.itemproject.viceRespUsername ? GlobalStore.getters.getRespByUsername(this.itemproject.viceRespUsername) : ''
else
return ''
}
public getVice2Resp() {
if (!!GlobalStore.state.resps)
return this.itemproject.vice2RespUsername ? GlobalStore.getters.getRespByUsername(this.itemproject.vice2RespUsername) : ''
else
return ''
}
} }

View File

@@ -1,15 +1,51 @@
<template> <template>
<div :class="getClassRow()" @click="clickProject" > <q-item @click="clickProject" clickable>
<q-btn :disable="isDisable" class="flex-item donotdrag " size="sm" push color="primary" round icon="arrow_forward"
:to="getrouteto"></q-btn>
<div class="flex-item donotdrag divdescrTot"> <q-item-section avatar>
<q-btn
v-if="isProject()"
:class="(itemproject.respUsername !== '' && itemproject.viceRespUsername !== '') ? 'clresp' : 'clrespempty' + ' clButtPopover pos-item'"
:readonly="!CanIModifyProject"
size="sm"
dense
flat
@mousedown="clickRiga"
:disable="!CanIModifyProject"
icon="menu">
<q-menu ref="popmenu" self="top right">
<SubMenusProj :menuPopupProj="menuPopupProj" :itemproject="itemproject" @clickMenu="clickMenu"
@selectSubMenu="selectSubMenu"></SubMenusProj>
</q-menu>
</q-btn>
</q-item-section>
<q-item-section>
<div :class="getClassRow()">
<!--<div :class="(itemproject.respUsername !== '' && itemproject.viceRespUsername !== '') ? 'clresp' : 'clrespempty' + ' pos-group flex-item'">
<q-icon class="" name="fas fa-user-friends"></q-icon>
</div>-->
<!--<div class="q-mx-xs"></div>-->
<q-item-label v-if="getTipoViewByProjParent === 'posiz'">
<div class="flex-item donotdrag">
<q-input
v-model="itemproject.pos"
type="number"
rounded outlined
dense
debounce="500"
style="max-width: 70px;"></q-input>
</div>
</q-item-label>
<q-item-label>
<div class="flex-item donotdrag">
<q-input v-if="(sel && inEdit)" hide-underline type="textarea" ref="inputprojdescr" <q-input v-if="(sel && inEdit)" hide-underline type="textarea" ref="inputprojdescr"
v-model.trim="precDescr" v-model.trim="precDescr"
autogrow autogrow
borderless borderless
debounce="1000"
:label="getlabeltext" :label="getlabeltext"
dense dense
@focus="getFocus($event)" @focus="getFocus($event)"
@@ -18,12 +54,37 @@
</q-input> </q-input>
<div v-else :class="classDescr" <div v-else :class="classDescr"
@keydown="keyDownRow">{{itemproject.descr}} @keydown="keyDownRow">
</div>
<!--<div class="clpos">{{ itemproject.pos }}.</div> -->
{{ itemproject.descr }}
</div> </div>
</div>
</q-item-label>
<div v-if="isProject()" class="flex-item progress-item shadow-1"> <q-item-label v-if="getTipovisuByProjParent === TipoVisu.responsabili" caption lines="2">
<span v-if="getResp()">Responsabile: <span class="clResp">{{ getResp() }}</span></span>
<span v-if="getViceResp()"><br>ViceResponsabile: <span class="clViceResp">{{ getViceResp() }}</span></span>
<span v-if="getVice2Resp()"><br>Vice 2 Responsabile: <span class="clVice2Resp">{{ getVice2Resp() }}</span></span>
</q-item-label>
<!--<div>
{{ tools.getGroupById(itemproject.groupId) }}
</div>-->
<div v-if="itemproject.enableExpiring" :class="classExpiring">
<CDate :mydate="itemproject.expiring_at" @input="itemproject.expiring_at = new Date(arguments[0])"
data_class="data_string">
</CDate>
</div>
</div>
</q-item-section>
<q-item-section side>
<q-item-label caption>
<div v-if="isProject() && itemproject.tipovisu === TipoVisu.taskProgress && percentageProgress > 0"
class="donotdrag progress-item shadow-1">
<q-linear-progress <q-linear-progress
stripe stripe
rounded rounded
@@ -36,27 +97,16 @@
{{ percentageProgress }}% {{ percentageProgress }}%
</div> </div>
</div> </div>
<q-btn :disable="isDisable" class="pos-go" size="sm" push color="primary" round
icon="arrow_forward"
:to="getrouteto">
<div v-if="itemproject.enableExpiring" :class="classExpiring">
<CDate :mydate="itemproject.expiring_at" @input="itemproject.expiring_at = new Date(arguments[0])"
data_class="data_string">
</CDate>
</div>
<div v-if="isProject()" class="flex-item pos-item " @mousedown="clickRiga">
<q-btn flat
:class="clButtPopover"
:readonly="!CanIModifyProject"
:disable="!CanIModifyProject"
icon="menu">
<q-menu ref="popmenu" self="top right">
<SubMenusProj :menuPopupProj="menuPopupProj" :itemproject="itemproject" @clickMenu="clickMenu"
@selectSubMenu="selectSubMenu"></SubMenusProj>
</q-menu>
</q-btn> </q-btn>
</div> </q-item-label>
</q-item-section>
</q-item>
</div>
</template> </template>
<script lang="ts" src="./SingleProject.ts"> <script lang="ts" src="./SingleProject.ts">

View File

@@ -13,6 +13,7 @@ import { UserStore } from '@store'
import { Getter } from 'vuex-class' import { Getter } from 'vuex-class'
import { SingleTodo } from '../SingleTodo' import { SingleTodo } from '../SingleTodo'
import { costanti } from '@src/store/Modules/costanti'
const namespace: string = 'Todos' const namespace: string = 'Todos'
@@ -91,10 +92,11 @@ export default class CTodo extends Vue {
} }
public created() { public created() {
const $service = this.$dragula.$service if (costanti.DRAGULA) {
tools.dragula_option($service, this.dragname) const service = this.$dragula.$service
tools.dragula_option(service, this.dragname)
$service.eventBus.$on('dragend', (args) => { service.eventBus.$on('dragend', (args) => {
// console.log('args', args) // console.log('args', args)
if (args.name === this.dragname) { if (args.name === this.dragname) {
const itemdragend: IDrag = { const itemdragend: IDrag = {
@@ -106,12 +108,13 @@ export default class CTodo extends Vue {
} }
}) })
$service.eventBus.$on('drag', (el, source) => { service.eventBus.$on('drag', (el, source) => {
this.scrollable = false this.scrollable = false
}) })
$service.eventBus.$on('drop', (el, source) => { service.eventBus.$on('drop', (el, source) => {
this.scrollable = true this.scrollable = true
}) })
}
this.load() this.load()
} }
@@ -167,8 +170,7 @@ export default class CTodo extends Vue {
// empty the field // empty the field
if (atfirst) { if (atfirst) {
this.todotop = '' this.todotop = ''
} } else {
else {
this.todobottom = '' this.todobottom = ''
} }
@@ -188,7 +190,13 @@ export default class CTodo extends Vue {
// //
// await Todos.actions.swapElems(itemdragend) // await Todos.actions.swapElems(itemdragend)
await Todos.actions.modify({ myitem, field }) Todos.actions.modify({ myitem, field })
.then((ris) => {
if (ris)
tools.showPositiveNotif(this.$q, 'Campo Aggiornato')
else
tools.showNegativeNotif(this.$q, 'Campo non Aggiornato!')
})
} }

View File

@@ -3,7 +3,10 @@
<div class="panel"> <div class="panel">
<div v-if="!!title" class="divtitlecat"> <div v-if="!!title" class="divtitlecat">
<div class="flex-container"> <div class="flex-container">
<div class="flex-item categorytitle" :style="`background-color: ${backcolor} !important; color: ${forecolor} !important;`">{{title | capitalize}}</div> <div class="flex-item categorytitle"
:style="`background-color: ${backcolor} !important; color: ${forecolor} !important;`">
{{ title | capitalize }}
</div>
<div class="flex-item"> <div class="flex-item">
<q-btn push <q-btn push
size="sm" size="sm"
@@ -67,7 +70,8 @@
<div style="display: none">{{ prior = 0, priorcomplet = false }}</div> <div style="display: none">{{ prior = 0, priorcomplet = false }}</div>
<div> <div>
<!--<q-infinite-scroll :handler="loadMoreTodo" :offset="7">--> <!--<q-infinite-scroll :handler="loadMoreTodo" :offset="7">-->
<div class="container" v-dragula="items_dacompletare(categoryAtt)" :drake="dragname"> <!--<div class="container" v-dragula="items_dacompletare(categoryAtt)" :drake="dragname">-->
<div class="container">
<div :id="tools.getmyid(mytodo._id)" :index="index" <div :id="tools.getmyid(mytodo._id)" :index="index"
v-for="(mytodo, index) in items_dacompletare(categoryAtt)" v-for="(mytodo, index) in items_dacompletare(categoryAtt)"
:key="mytodo._id" class="myitemdrag"> :key="mytodo._id" class="myitemdrag">
@@ -77,14 +81,16 @@
<label>{{ tools.getPriorityByInd(mytodo.priority) }}</label> <label>{{ tools.getPriorityByInd(mytodo.priority) }}</label>
</div> </div>
<SingleTodo ref="single" @deleteItemtodo="mydeleteitemtodo(mytodo._id)" @eventupdate="updateitemtodo" <SingleTodo ref="single" @deleteItemtodo="mydeleteitemtodo(mytodo._id)" @eventupdate="updateitemtodo"
@setitemsel="setitemsel" @deselectAllRowstodo="deselectAllRowstodo" @deselectAllRowsproj="deselectAllRowsproj" @onEnd="onEndtodo" @setitemsel="setitemsel" @deselectAllRowstodo="deselectAllRowstodo"
@deselectAllRowsproj="deselectAllRowsproj" @onEnd="onEndtodo"
:itemtodo='mytodo' :CanIModifyTodo="CanIModifyTodo"> :itemtodo='mytodo' :CanIModifyTodo="CanIModifyTodo">
</SingleTodo> </SingleTodo>
<!--<div :nametranslate="`REF${index}`" class="divdrag non-draggato"></div>--> <!--<div :nametranslate="`REF${index}`" class="divdrag non-draggato"></div>-->
<div style="display: none">{{ prior = mytodo.priority, priorcomplet = (mytodo.statustodo === tools.Status.COMPLETED) }} <div style="display: none">
{{ prior = mytodo.priority, priorcomplet = (mytodo.statustodo === tools.Status.COMPLETED) }}
</div> </div>
</div> </div>
</div> </div>
@@ -101,12 +107,14 @@
:key="mytodo._id" class="myitemdrag"> :key="mytodo._id" class="myitemdrag">
<SingleTodo ref="single" @deleteItemtodo="mydeleteitemtodo(mytodo._id)" @eventupdate="updateitemtodo" <SingleTodo ref="single" @deleteItemtodo="mydeleteitemtodo(mytodo._id)" @eventupdate="updateitemtodo"
@setitemsel="setitemsel" @deselectAllRowstodo="deselectAllRowstodo" @deselectAllRowsproj="deselectAllRowsproj" @onEnd="onEndtodo" @setitemsel="setitemsel" @deselectAllRowstodo="deselectAllRowstodo"
@deselectAllRowsproj="deselectAllRowsproj" @onEnd="onEndtodo"
:itemtodo='mytodo'/> :itemtodo='mytodo'/>
<!--<div :nametranslate="`REF${index}`" class="divdrag non-draggato"></div>--> <!--<div :nametranslate="`REF${index}`" class="divdrag non-draggato"></div>-->
<div style="display: none">{{ prior = mytodo.priority, priorcomplet = (mytodo.statustodo === tools.Status.COMPLETED) }} <div style="display: none">
{{ prior = mytodo.priority, priorcomplet = (mytodo.statustodo === tools.Status.COMPLETED) }}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -65,25 +65,34 @@ export default class SingleTodo extends Vue {
// this.watchupdate('priority') // this.watchupdate('priority')
// } // }
@Watch('itemtodo.descr') public valueChanged5() { @Watch('itemtodo.descr') public valueChangeddescr() {
this.precDescr = this.itemtodo.descr this.precDescr = this.itemtodo.descr
this.watchupdate('descr') this.watchupdate('descr')
} }
@Watch('itemtodo.note') public valueChanged5() {
this.precDescr = this.itemtodo.note
this.watchupdate('note')
}
@Watch('itemtodo.hoursplanned') public valueChangedhoursplanned() { @Watch('itemtodo.hoursplanned') public valueChangedhoursplanned() {
console.log('itemtodo.hoursplanned', this.itemtodo.hoursplanned) // console.log('itemtodo.hoursplanned', this.itemtodo.hoursplanned)
this.watchupdate('hoursplanned') this.watchupdate('hoursplanned')
} }
@Watch('itemtodo.pos') public valueChangedpos() {
// console.log('itemtodo.hoursplanned', this.itemtodo.hoursplanned)
this.watchupdate('pos')
}
@Watch('itemtodo.statustodo') public valueChangedstatus() { @Watch('itemtodo.statustodo') public valueChangedstatus() {
console.log('itemtodo.statustodo', this.itemtodo.statustodo) // console.log('itemtodo.statustodo', this.itemtodo.statustodo)
this.watchupdate('statustodo') this.watchupdate('statustodo')
} }
@Watch('itemtodo.completed_at') public valueChangedcompleted_at() { @Watch('itemtodo.completed_at') public valueChangedcompleted_at() {
console.log('itemtodo.completed_at', this.itemtodo.completed_at) // console.log('itemtodo.completed_at', this.itemtodo.completed_at)
this.watchupdate('completed_at') this.watchupdate('completed_at')
} }
@Watch('itemtodo.hoursworked') public valueChangedhoursworked() { @Watch('itemtodo.hoursworked') public valueChangedhoursworked() {
console.log('itemtodo.hoursworked', this.itemtodo.hoursworked) // console.log('itemtodo.hoursworked', this.itemtodo.hoursworked)
this.watchupdate('hoursworked') this.watchupdate('hoursworked')
} }
@Watch('itemtodo.start_date') public valueChangedstart_date() { @Watch('itemtodo.start_date') public valueChangedstart_date() {
@@ -102,11 +111,15 @@ export default class SingleTodo extends Vue {
this.watchupdate('phase') this.watchupdate('phase')
} }
@Watch('itemtodo.assignedToUsers') public valueChangeassignedToUsers() {
this.watchupdate('assignedToUsers')
}
@Watch('itemtodo.progress') public valueChanged6() { @Watch('itemtodo.progress') public valueChanged6() {
console.log('itemtodo.progress') // console.log('itemtodo.progress')
this.updateClasses() this.updateClasses()
console.log('this.percentageProgress', this.percentageProgress, 'this.itemtodo.progress', this.itemtodo.progress) // console.log('this.percentageProgress', this.percentageProgress, 'this.itemtodo.progress', this.itemtodo.progress)
this.watchupdate('progress') this.watchupdate('progress')
} }
@@ -221,12 +234,12 @@ export default class SingleTodo extends Vue {
this.$emit('deselectAllRowsproj', null, false, false) this.$emit('deselectAllRowsproj', null, false, false)
this.$emit('deselectAllRowstodo', this.itemtodo, true) this.$emit('deselectAllRowstodo', this.itemtodo, true)
if (!this.sel) { // if (!this.sel) {
this.selectRiga() this.selectRiga()
} else { // } else {
this.$emit('deselectAllRowsproj', null, false, false, true) // this.$emit('deselectAllRowsproj', null, false, false, true)
this.deselectRiga() // this.deselectRiga()
} // }
} }
} }
@@ -239,7 +252,7 @@ export default class SingleTodo extends Vue {
} }
public deselectRiga() { public deselectRiga() {
console.log('DeselectRiga', this.itemtodo.descr) // console.log('DeselectRiga', this.itemtodo.descr)
this.sel = false this.sel = false
this.classRow = '' this.classRow = ''
this.inEdit = false this.inEdit = false
@@ -298,7 +311,7 @@ export default class SingleTodo extends Vue {
} }
if (!!theField) { if (!!theField) {
console.log('FOCUS TODO', theField) // console.log('FOCUS TODO', theField)
theField.focus() theField.focus()
} }
// console.log('focus()') // console.log('focus()')
@@ -320,7 +333,7 @@ export default class SingleTodo extends Vue {
} }
public keyDownRow(e) { public keyDownRow(e) {
console.log('keyDownRow') // console.log('keyDownRow')
// Delete Key or Backspage // Delete Key or Backspage
if (((e.keyCode === 8) || (e.keyCode === 46)) && (this.precDescr === '') && !e.shiftKey) { if (((e.keyCode === 8) || (e.keyCode === 46)) && (this.precDescr === '') && !e.shiftKey) {
e.preventDefault() e.preventDefault()
@@ -335,7 +348,7 @@ export default class SingleTodo extends Vue {
} }
public keyDownArea(e) { public keyDownArea(e) {
console.log('keyDownArea') // console.log('keyDownArea')
/* /*
if ((e.key === 'ArrowUp') && !e.shiftKey) { if ((e.key === 'ArrowUp') && !e.shiftKey) {
e.key = 'Tab' e.key = 'Tab'
@@ -376,7 +389,7 @@ export default class SingleTodo extends Vue {
if (e.key === 'Escape') { if (e.key === 'Escape') {
this.deselectRiga() this.deselectRiga()
// this.faiFocus('insertTask', true) // this.faiFocus('insertTask', true)
console.log('LOAD this.precDescr', this.precDescr) // console.log('LOAD this.precDescr', this.precDescr)
this.precDescr = this.itemtodo.descr this.precDescr = this.itemtodo.descr
} }
@@ -388,9 +401,9 @@ export default class SingleTodo extends Vue {
} }
this.itemtodo.descr = this.precDescr this.itemtodo.descr = this.precDescr
console.log('updateTodo', this.precDescr, this.itemtodo.descr) // console.log('updateTodo', this.precDescr, this.itemtodo.descr)
console.log('itemtodo', this.itemtodo) // console.log('itemtodo', this.itemtodo)
console.log('Prec:', this.itemtodoPrec) // console.log('Prec:', this.itemtodoPrec)
this.watchupdate('descr') this.watchupdate('descr')
this.inEdit = false this.inEdit = false
@@ -426,7 +439,7 @@ export default class SingleTodo extends Vue {
public updatedata(field: string) { public updatedata(field: string) {
// const myitem = tools.jsonCopy(this.itemtodo) // const myitem = tools.jsonCopy(this.itemtodo)
console.log('calling this.$emit(eventupdate)', this.itemtodo) // console.log('calling this.$emit(eventupdate)', this.itemtodo)
this.$emit('eventupdate', { myitem: this.itemtodo, field } ) this.$emit('eventupdate', { myitem: this.itemtodo, field } )
} }
@@ -462,13 +475,13 @@ export default class SingleTodo extends Vue {
} }
public activeEdit() { public activeEdit() {
console.log('Attiva Edit') // console.log('Attiva Edit')
this.attivaEdit = true this.attivaEdit = true
this.editTodo() this.editTodo()
} }
public async clickMenu(action) { public async clickMenu(action) {
console.log('click menu: ', action) // console.log('click menu: ', action)
if (action === lists.MenuAction.DELETE) { if (action === lists.MenuAction.DELETE) {
return await this.askConfirmDelete() return await this.askConfirmDelete()
} else if (action === lists.MenuAction.TOGGLE_EXPIRING) { } else if (action === lists.MenuAction.TOGGLE_EXPIRING) {

View File

@@ -10,10 +10,25 @@
</q-btn> </q-btn>
</div> </div>
<div :class="classMenuBtn" @mousedown="clickRiga">
<q-btn flat
:class="clButtPopover"
:readonly="!CanIModifyTodo"
icon="menu">
<q-menu v-if="CanIModifyTodo" ref="popmenu" self="top right">
<SubMenus :menuPopupTodo="menuPopupTodo" :itemtodo="itemtodo" @clickMenu="clickMenu"
@selectSubMenu="selectSubMenu"></SubMenus>
</q-menu>
</q-btn>
</div>
<!-- <q-icon :name="iconPriority"/> -->
<div class="flex-item donotdrag divdescrTot"> <div class="flex-item donotdrag divdescrTot">
<q-input v-if="sel && inEdit && itemtodo.statustodo !== tools.Status.COMPLETED" hide-underline type="textarea" ref="inputdescr" <q-input v-if="sel && inEdit && itemtodo.statustodo !== tools.Status.COMPLETED" hide-underline type="textarea"
ref="inputdescr"
v-model.trim="precDescr" v-model.trim="precDescr"
debounce="1000"
autogrow autogrow
borderless borderless
:readonly="!CanIModifyTodo" :readonly="!CanIModifyTodo"
@@ -25,6 +40,7 @@
@keydown="keyDownRow">{{ itemtodo.descr }} @keydown="keyDownRow">{{ itemtodo.descr }}
</div> </div>
</div> </div>
<!--<q-field dark v-else :label="itemtodo.descr"--> <!--<q-field dark v-else :label="itemtodo.descr"-->
@@ -60,24 +76,11 @@
</div> </div>
</div> </div>
<div v-if="itemtodo.enableExpiring" :class="classExpiring"> <div v-if="itemtodo.enableExpiring" :class="classExpiring">
<CDate :mydate="itemtodo.expiring_at" @input="itemtodo.expiring_at = new Date(arguments[0])" <CDate :mydate="itemtodo.expiring_at" @input="itemtodo.expiring_at = new Date(arguments[0])"
data_class="data_string" :readonly="!CanIModifyTodo"> data_class="data_string" :readonly="!CanIModifyTodo">
</CDate> </CDate>
</div> </div>
<div :class="classMenuBtn" @mousedown="clickRiga">
<q-btn flat
:class="clButtPopover"
:readonly="!CanIModifyTodo"
icon="menu">
<q-menu v-if="CanIModifyTodo" ref="popmenu" self="top right">
<SubMenus :menuPopupTodo="menuPopupTodo" :itemtodo="itemtodo" @clickMenu="clickMenu"
@selectSubMenu="selectSubMenu"></SubMenus>
</q-menu>
</q-btn>
</div>
</div> </div>
</template> </template>

View File

@@ -2,18 +2,19 @@ import indexdb from './indexdb'
import { GlobalStore } from '../store/Modules' import { GlobalStore } from '../store/Modules'
export default async (context, cmd, table, data = null, id = '') => { export default async (context, cmd, table, data = null, id = '') => {
const descr = data !== null ? data.descr : '' // const descr = data !== null ? data.descr : ''
// console.log('globalroutines', cmd, table, descr, id) // console.log('globalroutines', cmd, table, descr, id)
return await indexdb(context, cmd, table, data, id) return indexdb(context, cmd, table, data, id)
.then(ris => { .then((ris) => {
// console.log('GlobalStore.state.connData', GlobalStore.state.connData)
setTimeout(() => { setTimeout(() => {
GlobalStore.state.connData.uploading_indexeddb = 0 GlobalStore.state.connData.uploading_indexeddb = 0
GlobalStore.state.connData.downloading_indexeddb = 0 GlobalStore.state.connData.downloading_indexeddb = 0
}, 1000) }, 1000)
return ris return ris
} }
).catch((err) => {
).catch(err => {
setTimeout(() => { setTimeout(() => {
GlobalStore.state.connData.uploading_indexeddb = (GlobalStore.state.connData.uploading_indexeddb === 1) ? -1 : GlobalStore.state.connData.uploading_indexeddb GlobalStore.state.connData.uploading_indexeddb = (GlobalStore.state.connData.uploading_indexeddb === 1) ? -1 : GlobalStore.state.connData.uploading_indexeddb
GlobalStore.state.connData.downloading_indexeddb = (GlobalStore.state.connData.downloading_indexeddb === 1) ? -1 : GlobalStore.state.connData.downloading_indexeddb GlobalStore.state.connData.downloading_indexeddb = (GlobalStore.state.connData.downloading_indexeddb === 1) ? -1 : GlobalStore.state.connData.downloading_indexeddb

View File

@@ -67,7 +67,7 @@ async function readfromIndexDbToState(context, table) {
} else { } else {
const arrris = tools.setArrayMainByTable(table, reccat) const arrris = tools.setArrayMainByTable(table, reccat)
// console.log('************ ARRAYS SALVATI IN MEMORIA ', table, arrris) console.log('************ ARRAYS SALVATI IN MEMORIA ', table, arrris)
} }
@@ -89,6 +89,7 @@ function testfunc2() {
export default async (context, cmd, table, datakey = null, id = '') => { export default async (context, cmd, table, datakey = null, id = '') => {
try {
// console.log('TABLE', table, 'cmd', cmd) // console.log('TABLE', table, 'cmd', cmd)
if (cmd === 'loadapp') { if (cmd === 'loadapp') {
// ****** LOAD APP AL CARICAMENTO ! ******* // ****** LOAD APP AL CARICAMENTO ! *******
@@ -104,6 +105,7 @@ export default async (context, cmd, table, datakey = null, id = '') => {
} else if (cmd === 'readall') { } else if (cmd === 'readall') {
if (GlobalStore) { if (GlobalStore) {
GlobalStore.state.connData.downloading_indexeddb = 1 GlobalStore.state.connData.downloading_indexeddb = 1
console.log('getalldata table', table)
} }
return await storage.getalldata(table) return await storage.getalldata(table)
} else if (cmd === 'count') { } else if (cmd === 'count') {
@@ -126,4 +128,7 @@ export default async (context, cmd, table, datakey = null, id = '') => {
} else if (cmd === 'log') { } else if (cmd === 'log') {
consolelogpao(table) consolelogpao(table)
} }
} catch (e) {
console.error('error INDEXdb', e);
}
} }

View File

@@ -7,7 +7,8 @@ export let idbKeyval = (() => {
if (!db) { if (!db) {
// console.log('CREO DB STORAGE JS !') // console.log('CREO DB STORAGE JS !')
db = new Promise((resolve, reject) => { db = new Promise((resolve, reject) => {
const openreq = indexedDB.open('mydb3', 11); // console.log('open mydb3')
const openreq = indexedDB.open('mydb3', 12);
openreq.onerror = () => { openreq.onerror = () => {
reject(openreq.error); reject(openreq.error);
@@ -16,14 +17,15 @@ export let idbKeyval = (() => {
openreq.onupgradeneeded = () => { openreq.onupgradeneeded = () => {
// First time setup: create an empty object store // First time setup: create an empty object store
for (let mytab of ApiTables.MainTables) { for (let mytab of ApiTables.MainTables) {
openreq.result.createObjectStore(mytab, { keyPath: '_id' }); openreq.result.createObjectStore(mytab, { keyPath: 'BOMID', autoIncrement: true });
for (let mymeth of ApiTables.allMethod) { for (let mymeth of ApiTables.allMethod) {
const tab = mymeth + mytab const tab = mymeth + mytab
openreq.result.createObjectStore(tab, { keyPath: '_id' }); openreq.result.createObjectStore(tab, { keyPath: 'BOMID', autoIncrement: true });
} }
} }
for (let mytab of ApiTables.OtherTables) { for (let mytab of ApiTables.OtherTables) {
openreq.result.createObjectStore(mytab, { keyPath: '_id' }); console.log('mytab', mytab);
openreq.result.createObjectStore(mytab, { keyPath: 'BOMID', autoIncrement: true });
} }
}; };

View File

@@ -67,6 +67,10 @@
color: red; color: red;
} }
.isSocioResidente {
color: darkgreen;
}
.isCalendar { .isCalendar {
color: #fff241; color: #fff241;
} }

View File

@@ -76,14 +76,25 @@ export default class MenuOne extends Vue {
public getmymenuclass(elem: IListRoutes) { public getmymenuclass(elem: IListRoutes) {
let menu = this.clBaseint let menu = this.clBaseint
if (elem.color) {
menu += ' ' + elem.color
} else {
if (elem.onlyAdmin) if (elem.onlyAdmin)
menu += ' isAdmin' menu += ' isAdmin'
if (elem.onlyManager) if (elem.onlyManager)
menu += ' isManager' menu += ' isManager'
if (elem.onlySocioResidente)
menu += ' isSocioResidente'
if (elem.onlyConsiglio)
menu += ' isConsiglio'
if (elem.onlyDepartment)
menu += ' isDepartment'
if (elem.onlyTutor) if (elem.onlyTutor)
menu += ' isTutor' menu += ' isTutor'
if (elem.onlyTraduttrici) if (elem.onlyEditor)
menu += ' isTraduttrici' menu += ' isEditor'
}
if (elem.extraclass) if (elem.extraclass)
menu += ' ' + elem.extraclass menu += ' ' + elem.extraclass

View File

@@ -9,6 +9,8 @@ import { fieldsTable } from '@src/store/Modules/fieldsTable'
import { CalendarStore } from '@store' import { CalendarStore } from '@store'
import MixinMetaTags from '@src/mixins/mixin-metatags' import MixinMetaTags from '@src/mixins/mixin-metatags'
import { shared_consts } from '../common/shared_vuejs'
// You can declare a mixin as the same style as components. // You can declare a mixin as the same style as components.
@Component @Component
export default class MixinBase extends MixinMetaTags { export default class MixinBase extends MixinMetaTags {
@@ -36,9 +38,13 @@ export default class MixinBase extends MixinMetaTags {
return tools return tools
} }
public getValDb(keystr, serv, def?, table?, subkey?, id?) { get shared_consts() {
return shared_consts
}
return tools.getValDb(keystr, serv, def, table, subkey, id) public getValDb(keystr, serv, def?, table?, subkey?, id?, idmain?) {
return tools.getValDb(keystr, serv, def, table, subkey, id, idmain)
} }
public getValDbLang(keystr, serv, def?, table?, subkey?) { public getValDbLang(keystr, serv, def?, table?, subkey?) {
@@ -55,7 +61,7 @@ export default class MixinBase extends MixinMetaTags {
if (table === 'users') { if (table === 'users') {
const myid = UserStore.state.my._id const myid = UserStore.state.my._id
let myfield = {} const myfield = {}
if (key === 'profile') { if (key === 'profile') {
UserStore.state.my.profile[subkey] = value UserStore.state.my.profile[subkey] = value
@@ -78,6 +84,25 @@ export default class MixinBase extends MixinMetaTags {
fieldsvalue: myfield fieldsvalue: myfield
} }
} else if (table === 'todos') {
const myfield = {}
// Save to the DB:
if (subkey) {
myfield[key + '.' + subkey] = value
} else {
myfield[key] = value
}
// console.log('myfield', myfield)
mydatatosave = {
id,
table,
fieldsvalue: myfield
}
} else if (table === 'settings') { } else if (table === 'settings') {
GlobalStore.mutations.setValueSettingsByKey({ key, value, serv }) GlobalStore.mutations.setValueSettingsByKey({ key, value, serv })
@@ -89,9 +114,9 @@ export default class MixinBase extends MixinMetaTags {
type type
} }
myrec.serv = serv myrec.serv = serv
if (myrec.type === tools.FieldType.date) if ((myrec.type === tools.FieldType.date) || (myrec.type === tools.FieldType.onlydate))
myrec.value_date = value myrec.value_date = value
else if (myrec.type === tools.FieldType.number) else if ((myrec.type === tools.FieldType.number) || (myrec.type === tools.FieldType.hours))
myrec.value_num = value myrec.value_num = value
else if (myrec.type === tools.FieldType.boolean) else if (myrec.type === tools.FieldType.boolean)
myrec.value_bool = value myrec.value_bool = value

View File

@@ -70,7 +70,7 @@ export default class MixinUsers extends Vue {
get getMyImgforIcon() { get getMyImgforIcon() {
const ris = UserStore.getters.getImgByUsername(UserStore.state.my.username) const ris = UserStore.getters.getImgByUsername(UserStore.state.my.username)
return (ris !== '') ? 'img:statics/' + ris : 'fas fa-user-circle' return (ris !== '') ? 'img:statics/' + ris : 'fas fa-user'
} }
get getIconCart() { get getIconCart() {
@@ -96,6 +96,10 @@ export default class MixinUsers extends Vue {
return UserStore.state.my.surname return UserStore.state.my.surname
} }
get myCell() {
return UserStore.state.my.profile.cell
}
get Verificato() { get Verificato() {
return UserStore.state.my.verified_email return UserStore.state.my.verified_email
} }

View File

@@ -1,4 +1,4 @@
import { IOperators } from '@src/model/GlobalStore' import { IInternalPage, IMyPage, IOperators } from '@src/model/GlobalStore'
export interface IEvents { export interface IEvents {
_id?: any _id?: any
@@ -20,11 +20,24 @@ export interface IEvents {
infoafterprice?: string infoafterprice?: string
teacher?: string teacher?: string
teacher2?: string teacher2?: string
teacher3?: string
teacher4?: string
infoextra?: string infoextra?: string
linkpage?: string linkpage?: string
pagefooter?: IInternalPage[]
linkpdf?: string linkpdf?: string
nobookable?: boolean nobookable?: boolean
lunchAvailable?: boolean
dinnerAvailable?: boolean
dinnerSharedAvailable?: boolean
lunchType?: number
dinnerType?: number
lunchPrice?: number
dinnerPrice?: number
internal?: boolean
note?: string
news?: boolean news?: boolean
facebook?: string
canceled?: boolean canceled?: boolean
deleted?: boolean deleted?: boolean
dupId?: any dupId?: any
@@ -36,6 +49,9 @@ export interface IBookedEvent {
userId: string userId: string
id_bookedevent?: any id_bookedevent?: any
numpeople: number numpeople: number
numpeopleLunch?: number
numpeopleDinner?: number
numpeopleDinnerShared?: number
infoevent: string infoevent: string
msgbooking: string msgbooking: string
datebooked?: Date datebooked?: Date
@@ -70,6 +86,7 @@ export interface ICalendarState {
eventlist: IEvents[] eventlist: IEvents[]
bookedevent: IBookedEvent[] bookedevent: IBookedEvent[]
operators: IOperators[] operators: IOperators[]
internalpages: IMyPage[]
wheres: IWheres[] wheres: IWheres[]
contribtype: IContribtype[] contribtype: IContribtype[]
// --------------- // ---------------

View File

@@ -2,7 +2,7 @@ import { IAction } from '@src/model/Projects'
import { Component } from 'vue-router/types/router' import { Component } from 'vue-router/types/router'
import { lists } from '@src/store/Modules/lists' import { lists } from '@src/store/Modules/lists'
import { IPaymentType } from '@src/model/UserStore' import { IPaymentType } from '@src/model/UserStore'
import { ICart, IProducer, IProduct, IStorehouse } from '@src/model/Products' import { ICart, IDepartment, IProducer, IProduct, IShareWithUs, IStorehouse } from '@src/model/Products'
export interface IPost { export interface IPost {
title: string title: string
@@ -52,6 +52,17 @@ export interface ITeachUname {
username?: string username?: string
} }
export interface IInternalPage {
path?: string
}
export interface IResp {
_id?: string
username?: string
name?: string
surname?: string
}
export interface IMyPage { export interface IMyPage {
_id?: string _id?: string
author_username?: string author_username?: string
@@ -62,14 +73,45 @@ export interface IMyPage {
path?: string path?: string
keywords?: string keywords?: string
description?: string description?: string
img1?: string
content?: string content?: string
video1?: string
img2?: string
content2?: string
video2?: string
img3?: string
content3?: string
video3?: string
content4?: string
active?: boolean active?: boolean
inmenu?: boolean inmenu?: boolean
color?: string
onlyif_logged?: boolean onlyif_logged?: boolean
only_residenti?: boolean
only_consiglio?: boolean
submenu?: boolean submenu?: boolean
l_par?: number, l_par?: number,
l_child?: number, l_child?: number,
infooter?: boolean infooter?: boolean
internalpage?: boolean
}
export interface ISites {
_id?: string
attiva?: boolean
idapp?: string
name?: string
adminemail?: string
manageremail?: string
replyTo?: string
host?: string
portapp?: string
dir?: string
email_from?: string
email_pwd?: string
telegram_key?: string
telegram_bot_name?: string
pathreg_add?: string
} }
export interface INewsToSent { export interface INewsToSent {
@@ -98,6 +140,11 @@ export interface ICalZoom {
note?: string note?: string
} }
export interface IGroup {
_id?: any
descr?: string
}
export interface IMailinglist { export interface IMailinglist {
name?: string name?: string
surname?: string surname?: string
@@ -149,11 +196,12 @@ export interface IGlobalState {
mobileMode: boolean mobileMode: boolean
menuCollapse: boolean menuCollapse: boolean
leftDrawerOpen: boolean leftDrawerOpen: boolean
RightDrawerOpen: boolean rightDrawerOpen: boolean
rightCartOpen: boolean rightCartOpen: boolean
category: string category: string
stateConnection: string stateConnection: string
networkDataReceived: boolean networkDataReceived: boolean
clickcmd?: string
cfgServer: ICfgServer[] cfgServer: ICfgServer[]
testp1: ITestp1 testp1: ITestp1
connData: IConnData connData: IConnData
@@ -175,6 +223,11 @@ export interface IGlobalState {
calzoom: ICalZoom[], calzoom: ICalZoom[],
producers: IProducer[], producers: IProducer[],
storehouses: IStorehouse[], storehouses: IStorehouse[],
departments: IDepartment[],
sharewithus: IShareWithUs[],
groups: IGroup[],
resps: IResp[],
workers: IResp[],
autoplaydisc: number autoplaydisc: number
} }
@@ -207,8 +260,13 @@ export interface IListRoutes {
onlyAdmin?: boolean onlyAdmin?: boolean
onlyif_logged?: boolean onlyif_logged?: boolean
onlyManager?: boolean onlyManager?: boolean
onlySocioResidente?: boolean
onlyConsiglio?: boolean
onlyNotSoci?: boolean
onlyDepartment?: boolean
onlyTutor?: boolean onlyTutor?: boolean
onlyTraduttrici?: boolean color?: string
onlyEditor?: boolean
extraclass?: string extraclass?: string
meta?: any meta?: any
idelem?: string idelem?: string
@@ -345,6 +403,7 @@ export interface IFunctionality {
BOOKING_EVENTS?: boolean BOOKING_EVENTS?: boolean
ENABLE_REG_AYNI?: boolean ENABLE_REG_AYNI?: boolean
ENABLE_REG_SIP?: boolean ENABLE_REG_SIP?: boolean
ENABLE_REG_CNM?: boolean
} }
export interface IParamsQuery { export interface IParamsQuery {
@@ -355,6 +414,15 @@ export interface IParamsQuery {
filterand: string filterand: string
sortBy: any sortBy: any
descending: number descending: number
userId: string
codeId?: string
lk_tab?: string,
af_objId_tab?: string,
lk_LF?: string,
lk_FF?: string,
lk_as?: string,
lk_proj?: string,
lk_col2?: string,
} }
export interface IColGridTable { export interface IColGridTable {
@@ -377,6 +445,7 @@ export interface IColGridTable {
jointable?: string jointable?: string
resultjoin?: string[] resultjoin?: string[]
visuonlyEditVal?: boolean visuonlyEditVal?: boolean
notShowInNewRec?: boolean
} }
export interface ITableRec { export interface ITableRec {
@@ -393,6 +462,8 @@ export interface ITableRec {
export interface IFilter { export interface IFilter {
label: string label: string
value: string value: string
hide?: boolean
default?: boolean
} }
export interface IDataPass { export interface IDataPass {
@@ -418,3 +489,11 @@ export const DefaultNewsState: INewsState = {
totunsubscribed: 0, totunsubscribed: 0,
totsentlastid: 0 totsentlastid: 0
} }
export interface IPagination {
sortBy: string,
descending: boolean
rowsNumber: number
page: number,
rowsPerPage: number // specifying this determines pagination is server-side
}

View File

@@ -1,17 +1,22 @@
export interface IProduct { export interface IProduct {
_id?: any _id?: any
descr?: string, active?: boolean
idProducer?: string, idProducer?: string,
idStorehouses?: string[], idStorehouses?: string[],
producer?: IProducer, producer?: IProducer,
storehouses?: IStorehouse[], storehouses?: IStorehouse[],
code?: string,
name?: string, name?: string,
description?: string,
department?: string, department?: string,
category?: string, category?: string,
price?: number, price?: number,
after_price?: string,
color?: string, color?: string,
size?: string, size?: string,
quantityAvailable?: number, quantityAvailable?: number,
canBeShipped?: boolean,
canBeBuyOnline?: boolean,
weight?: number, weight?: number,
stars?: number, stars?: number,
date?: Date, date?: Date,
@@ -32,6 +37,7 @@ export interface IOrder {
idProducer?: string idProducer?: string
idStorehouse?: string idStorehouse?: string
price?: number price?: number
after_price?: string
color?: string color?: string
size?: string size?: string
quantity?: number quantity?: number
@@ -51,6 +57,7 @@ export interface IOrder {
export interface IProductsState { export interface IProductsState {
products: IProduct[] products: IProduct[]
cart: ICart cart: ICart
orders: IOrderCart[]
} }
export interface IProducer { export interface IProducer {
@@ -59,12 +66,20 @@ export interface IProducer {
name?: string, name?: string,
description?: string, description?: string,
referent?: string, referent?: string,
username?: string,
region?: string, region?: string,
city?: string, city?: string,
img?: string, img?: string,
website?: string, website?: string,
} }
export interface IDepartment {
_id?: any
idapp?: string
name?: string,
username?: string,
}
export interface IStorehouse { export interface IStorehouse {
_id?: any _id?: any
idapp?: string idapp?: string
@@ -84,5 +99,33 @@ export interface ICart {
userId?: string userId?: string
totalQty?: number totalQty?: number
totalPrice?: number totalPrice?: number
department?: string
items?: IBaseOrder[] items?: IBaseOrder[]
note?: string
modify_at?: Date
}
export interface IOrderCart {
_id?: any
idapp?: string
numorder?: number
userId?: string
totalQty?: number
totalPrice?: number
department?: string
items?: IBaseOrder[]
nameSurname?: string
status?: number
note?: string
modify_at?: Date
completed_at?: Date
}
export interface IShareWithUs {
_id?: any
idapp?: string
userId?: string
description?: string
numshared?: number
rating?: number
} }

View File

@@ -18,6 +18,7 @@ export interface IProject {
id_main_project?: string id_main_project?: string
id_parent?: string id_parent?: string
descr?: string descr?: string
note?: string
longdescr?: string longdescr?: string
priority?: number priority?: number
statusproj?: number statusproj?: number
@@ -26,7 +27,6 @@ export interface IProject {
completed_at?: Date completed_at?: Date
expiring_at?: Date expiring_at?: Date
enableExpiring?: boolean enableExpiring?: boolean
id_prev?: string
modified?: boolean modified?: boolean
favourite?: number favourite?: number
pos?: number pos?: number
@@ -45,8 +45,14 @@ export interface IProject {
actualphase?: number actualphase?: number
privacyread?: string privacyread?: string
privacywrite?: string privacywrite?: string
tipovisu?: number
themecolor?: string themecolor?: string
themebgcolor?: string themebgcolor?: string
groupId?: string
respUsername?: string
viceRespUsername?: string
vice2RespUsername?: string
view?: string
} }
export interface IProjectsState { export interface IProjectsState {
@@ -60,7 +66,15 @@ export const Privacy = {
all: 'all', all: 'all',
friends: 'friends', friends: 'friends',
mygroup: 'mygroup', mygroup: 'mygroup',
onlyme: 'onlyme' onlyme: 'onlyme',
inherited: 'inherited'
}
export const TipoVisu = {
inherited: 0,
simplelist: 1,
taskProgress: 2,
responsabili: 3
} }
export const TypeProj = { export const TypeProj = {

View File

@@ -5,6 +5,7 @@ export interface ITodo {
userId?: string userId?: string
category?: string category?: string
descr?: string, descr?: string,
note?: string,
priority?: number, priority?: number,
statustodo?: number, statustodo?: number,
created_at?: Date, created_at?: Date,
@@ -12,7 +13,6 @@ export interface ITodo {
completed_at?: Date, completed_at?: Date,
expiring_at?: Date, expiring_at?: Date,
enableExpiring?: boolean, enableExpiring?: boolean,
id_prev?: string,
modified?: boolean, modified?: boolean,
pos?: number, pos?: number,
order?: number, order?: number,
@@ -25,6 +25,7 @@ export interface ITodo {
start_date?: Date start_date?: Date
themecolor?: string themecolor?: string
themebgcolor?: string themebgcolor?: string
assignedToUsers?: string[]
} }
export interface IParamTodo { export interface IParamTodo {
@@ -57,3 +58,14 @@ export interface ITodosState {
insidePending: boolean insidePending: boolean
visuLastCompleted: number visuLastCompleted: number
} }
export interface IHours {
_id?: any,
userId?: string
descr?: string,
todoId?: string,
date?: Date,
time_start: number
time_end: number
hours: number
}

View File

@@ -1,5 +1,5 @@
import { IToken } from 'model/other' import { IToken } from 'model/other'
import { ICart } from '@src/model/Products' import { ICart, IOrderCart, IShareWithUs } from '@src/model/Products'
const enum ESexType { const enum ESexType {
None = 0, None = 0,
@@ -33,6 +33,9 @@ export interface IUserProfile {
saw_and_accepted?: boolean saw_and_accepted?: boolean
qualified?: boolean qualified?: boolean
qualified_2invitati?: boolean qualified_2invitati?: boolean
myshares?: IShareWithUs[]
socio?: boolean
socioresidente?: boolean
} }
export interface IPaymentType { export interface IPaymentType {
@@ -88,6 +91,7 @@ export interface IUserFields {
numinvitati?: number numinvitati?: number
numinvitatiattivi?: number numinvitatiattivi?: number
cart?: ICart cart?: ICart
ordercart?: IOrderCart
} }
/* /*
@@ -116,9 +120,10 @@ export interface IUserState {
isLogged?: boolean isLogged?: boolean
isAdmin?: boolean isAdmin?: boolean
isManager?: boolean isManager?: boolean
isDepartment?: boolean
isTutor?: boolean isTutor?: boolean
isZoomeri?: boolean isZoomeri?: boolean
isTraduttrici?: boolean isEditor?: boolean
isTeacher?: boolean isTeacher?: boolean
usersList?: IUserFields[] usersList?: IUserFields[]
countusers?: number countusers?: number

View File

@@ -13,3 +13,39 @@ export interface ISignupOptions {
profile?: IUserProfile profile?: IUserProfile
// already_registered: boolean // already_registered: boolean
} }
export interface ISignupIscrizioneConacreisOptions {
userId?: string
name?: string
surname?: string
email?: string
fiscalcode?: string
residency_address?: string
residency_city?: string
residency_province?: string
residency_country?: string
residency_zipcode?: string
dateofbirth?: Date
dateofreg?: Date
dateofapproved?: Date
born_city?: string
born_province?: string
born_country?: string
cell_phone?: string
newsletter_on?: boolean
accetta_carta_costituzionale_on?: boolean
metodo_pagamento?: number
iscrizione_compilata?: boolean
ha_pagato?: boolean
codiceConacreis?: string
annoTesseramento?: number
numTesseraInterna?: number
motivazioni?: string
competenze_professionalita?: string
cosa_potrei_offrire?: string
cosa_vorrei_ricevere?: string
altre_comunicazioni?: string
come_ci_hai_conosciuto?: string
terms?: boolean
note?: string
}

View File

View File

@@ -0,0 +1,44 @@
import Vue from 'vue'
import { Component, Prop } from 'vue-property-decorator'
import { GlobalStore, UserStore } from '@store'
import { tools } from '../../../store/Modules/tools'
import { toolsext } from '../../../store/Modules/toolsext'
import { static_data } from '../../../db/static_data'
import { Screen } from 'quasar'
import { colTabledepartments } from '@src/store/Modules/fieldsTable'
import { CImgText } from '../../../components/CImgText/index'
import { CCard, CGridTableRec, CMyPage, CTitleBanner } from '@components'
import MixinMetaTags from '../../../mixins/mixin-metatags'
import MixinBase from '@src/mixins/mixin-base'
@Component({
mixins: [MixinBase],
components: { CImgText, CCard, CMyPage, CTitleBanner, CGridTableRec }
})
export default class StorehousePage extends MixinMetaTags {
public pagination = {
sortBy: 'name',
descending: false,
page: 2,
rowsPerPage: 5
// rowsNumber: xx if getting data from a server
}
public selected = []
public dataPages = []
get getcoldepartments() {
return colTabledepartments
}
public meta() {
return tools.metafunc(this)
}
get static_data() {
return static_data
}
}

View File

@@ -0,0 +1,27 @@
<template>
<CMyPage title="Uffici" imgbackground="../../statics/images/produttori.jpg" sizes="max-height: 120px">
<span>{{ setmeta({
title: 'Uffici',
description: "",
keywords: '' } ) }}
</span>
<div class="q-ma-sm q-gutter-sm q-pa-xs">
<CTitleBanner title="Uffici"></CTitleBanner>
<CGridTableRec prop_mytable="departments"
prop_mytitle="Lista Uffici"
:prop_mycolumns="getcoldepartments"
prop_colkey="name"
nodataLabel="Nessun Ufficio"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato">
</CGridTableRec>
</div>
</CMyPage>
</template>
<script lang="ts" src="./departments.ts">
</script>
<style lang="scss" scoped>
@import 'departments.scss';
</style>

View File

@@ -10,6 +10,7 @@ import { Getter } from 'vuex-class'
import { lists } from '@src/store/Modules/lists' import { lists } from '@src/store/Modules/lists'
import MixinUsers from '@src/mixins/mixin-users' import MixinUsers from '@src/mixins/mixin-users'
import MixinOperator from '@src/mixins/mixin-operator' import MixinOperator from '@src/mixins/mixin-operator'
import MixinEvents from '@src/mixins/mixin-events'
const namespace = 'CalendarModule' const namespace = 'CalendarModule'
@@ -18,10 +19,11 @@ const namespace = 'CalendarModule'
name: 'EventList', name: 'EventList',
components: { CTitle, CMyPage } components: { CTitle, CMyPage }
}) })
export default class Eventlist extends Vue { export default class Eventlist extends MixinEvents {
public $t: any public $t: any
public $q public $q
public showpeople: boolean = false public showpeople: boolean = false
public shownote: boolean = false
public eventsel: IEvents = null public eventsel: IEvents = null
public showPrev = false public showPrev = false
public numrec = 0 public numrec = 0
@@ -30,7 +32,7 @@ export default class Eventlist extends Vue {
public getEventsBookedByIdEvent: (state: ICalendarState, id, showall) => IBookedEvent[] public getEventsBookedByIdEvent: (state: ICalendarState, id, showall) => IBookedEvent[]
@Getter('getNumParticipants', { namespace }) @Getter('getNumParticipants', { namespace })
public getNumParticipants: (state: ICalendarState, event: IEvents, showall) => number public getNumParticipants: (state: ICalendarState, event: IEvents, showall, tipo) => number
public getNameSurnameByUserId(userid) { public getNameSurnameByUserId(userid) {
return UserStore.getters.getNameSurnameByUserId(userid) return UserStore.getters.getNameSurnameByUserId(userid)
@@ -51,7 +53,7 @@ export default class Eventlist extends Vue {
let add = true let add = true
if (!this.showall) { if (!this.showall) {
add = CalendarStore.getters.getNumParticipants(myevent, this.showall) > 0 add = CalendarStore.getters.getNumParticipants(myevent, this.showall, tools.peopleWhere.participants) > 0
} }
if (add) { if (add) {
@@ -78,7 +80,7 @@ export default class Eventlist extends Vue {
eventsloc.reverse() eventsloc.reverse()
} }
return eventsloc return eventsloc.filter((rec) => rec.title !== '')
} }
public getNumEvent() { public getNumEvent() {
@@ -96,7 +98,7 @@ export default class Eventlist extends Vue {
let add = true let add = true
if (!this.showall) { if (!this.showall) {
add = CalendarStore.getters.getNumParticipants(myevent, this.showall) > 0 add = CalendarStore.getters.getNumParticipants(myevent, this.showall, tools.peopleWhere.participants) > 0
} }
if (add) { if (add) {
@@ -154,4 +156,8 @@ export default class Eventlist extends Vue {
this.getNumEvent() this.getNumEvent()
} }
public change_rec(eventparam) {
this.UpdateDbByFields(this, eventparam)
}
} }

View File

@@ -1,5 +1,6 @@
<template> <template>
<CMyPage title="Events" keywords="" description="" imgbackground="../../statics/images/calendario_eventi.jpg" sizes="max-height: 120px"> <CMyPage title="Events" keywords="" description="" imgbackground="../../statics/images/calendario_eventi.jpg"
sizes="max-height: 120px">
<div class="q-ma-sm q-pa-xs"> <div class="q-ma-sm q-pa-xs">
<div v-if="!showall" class="text-h6 bg-red text-white text-center q-pa-xs shadow-max">Lista delle tue <div v-if="!showall" class="text-h6 bg-red text-white text-center q-pa-xs shadow-max">Lista delle tue
@@ -18,7 +19,18 @@
<th>{{ $t('cal.data') }}</th> <th>{{ $t('cal.data') }}</th>
<th>{{ $t('cal.event') }}</th> <th>{{ $t('cal.event') }}</th>
<th v-if="!tools.isMobile()">{{ $t('cal.teachertitle') }}</th> <th v-if="!tools.isMobile()">{{ $t('cal.teachertitle') }}</th>
<th v-if="showall"><span v-if="!tools.isMobile()">{{$t('cal.selnumpeople')}}</span><span v-else>{{$t('cal.selnumpeople_short')}}</span> <th v-if="showall">
<span v-if="!tools.isMobile()">{{ $t('cal.selnumpeople') }}</span>
<span v-else>{{ $t('cal.selnumpeople_short') }}</span>
</th>
<th v-if="showall">
{{ $t('cal.selnumpeopleLunch') }}
</th>
<th v-if="showall">
{{ $t('cal.selnumpeopleDinner') }}
</th>
<th v-if="showall">
{{ $t('cal.selnumpeopleDinnerShared') }}
</th> </th>
<th>{{ $t('cal.peoplebooked') }}</th> <th>{{ $t('cal.peoplebooked') }}</th>
</thead> </thead>
@@ -34,26 +46,68 @@
<td v-if="!tools.isMobile()"> <td v-if="!tools.isMobile()">
<div class="text-center">{{ getTeacherByUsername(event.teacher) }} <div class="text-center">{{ getTeacherByUsername(event.teacher) }}
<span v-if="isValidUsername(event.teacher2)"> - {{ getTeacherByUsername(event.teacher2) }}</span> <span v-if="isValidUsername(event.teacher2)"> - {{ getTeacherByUsername(event.teacher2) }}</span>
<span v-if="isValidUsername(event.teacher3)"> - {{ getTeacherByUsername(event.teacher3) }}</span>
<span v-if="isValidUsername(event.teacher4)"> - {{ getTeacherByUsername(event.teacher4) }}</span>
</div> </div>
</td> </td>
<td v-if="showall"> <td v-if="showall">
<div class="text-center">{{ getNumParticipants(event, showall) }}</div> <div class="text-center">{{ getNumParticipants(event, showall, tools.peopleWhere.participants) }}</div>
</td> </td>
<td v-if="showall">
<div class="text-center">{{ getNumParticipants(event, showall, tools.peopleWhere.lunch) }}</div>
</td>
<td v-if="showall">
<div class="text-center">{{ getNumParticipants(event, showall, tools.peopleWhere.dinner) }}</div>
</td>
<td v-if="showall">
<div class="text-center">{{ getNumParticipants(event, showall, tools.peopleWhere.dinnerShared) }}</div>
</td>
<td class="text-center"> <td class="text-center">
<q-btn v-if="getNumParticipants(event, showall) > 0" <q-btn v-if="getNumParticipants(event, showall, tools.peopleWhere.participants) > 0"
flat
dense dense
round color="positive"
rounded
icon="fas fa-user-check"
@click="showpeople = true; eventsel = event" @click="showpeople = true; eventsel = event"
aria-label="Menu"> >
<q-icon name="info"/> </q-btn>
<q-btn dense
flat
rounded
:color="!!event.note ? 'positive' : 'dark'"
icon="fas fa-pencil-alt"
@click="shownote = true; eventsel = event"
>
</q-btn> </q-btn>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</q-markup-table> </q-markup-table>
<q-dialog v-model="shownote">
<q-card v-if="eventsel" :style="`min-width: ` + tools.myheight_dialog() + `px;`">
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
Note: {{ eventsel.title }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="q-pa-xs inset-shadow">
<q-input v-model="eventsel.note" style="min-height: 50px; " label="Note:"
filled dense
autogrow
type="textarea" debounce="500"
input-class="myinput-area"
@input="change_rec(eventsel)">
</q-input>
</q-card-section>
</q-card>
</q-dialog>
<q-dialog v-model="showpeople"> <q-dialog v-model="showpeople">
<q-card v-if="eventsel"> <q-card v-if="eventsel" :style="`min-width: ` + tools.myheight_dialog() + `px;`">
<q-toolbar class="bg-primary text-white" :style="`min-width: ` + tools.myheight_dialog() + `px;`"> <q-toolbar class="bg-primary text-white">
<q-toolbar-title> <q-toolbar-title>
{{ eventsel.title }} {{ eventsel.title }}
</q-toolbar-title> </q-toolbar-title>
@@ -64,7 +118,7 @@
<thead> <thead>
<th>Data</th> <th>Data</th>
<th>Messaggio</th> <th>Messaggio</th>
<th>Num</th> <th>Partec</th>
<th>Azione</th> <th>Azione</th>
</thead> </thead>
@@ -81,7 +135,10 @@
{{ eventbook.msgbooking }} {{ eventbook.msgbooking }}
</td> </td>
<td class="text-center"> <td class="text-center">
{{eventbook.numpeople}} <span v-if="eventbook.numpeople > 0">Partecipanti: {{ eventbook.numpeople }}<br></span>
<span v-if="eventbook.numpeopleLunch > 0">Pranzo: {{ eventbook.numpeopleLunch }}<br></span>
<span v-if="eventbook.numpeopleDinner > 0">Cena: {{ eventbook.numpeopleDinner }}<br></span>
<span v-if="eventbook.numpeopleDinnerShared > 0">Cena Condivisa: {{ eventbook.numpeopleDinnerShared }}<br></span>
</td> </td>
<td class="text-center"> <td class="text-center">
<q-btn flat round color="red" icon="fas fa-trash-alt" size="sm" <q-btn flat round color="red" icon="fas fa-trash-alt" size="sm"

View File

View File

@@ -0,0 +1,44 @@
import Vue from 'vue'
import { Component, Prop } from 'vue-property-decorator'
import { GlobalStore, UserStore } from '@store'
import { tools } from '../../../store/Modules/tools'
import { toolsext } from '../../../store/Modules/toolsext'
import { static_data } from '../../../db/static_data'
import { Screen } from 'quasar'
import { colTablegroups } from '@src/store/Modules/fieldsTable'
import { CImgText } from '../../../components/CImgText/index'
import { CCard, CGridTableRec, CMyPage, CTitleBanner } from '@components'
import MixinMetaTags from '../../../mixins/mixin-metatags'
import MixinBase from '@src/mixins/mixin-base'
@Component({
mixins: [MixinBase],
components: { CImgText, CCard, CMyPage, CTitleBanner, CGridTableRec }
})
export default class GroupPage extends MixinMetaTags {
public pagination = {
sortBy: 'descr',
descending: false,
page: 2,
rowsPerPage: 5
// rowsNumber: xx if getting data from a server
}
public selected = []
public dataPages = []
get getcolgroups() {
return colTablegroups
}
public meta() {
return tools.metafunc(this)
}
get static_data() {
return static_data
}
}

View File

@@ -0,0 +1,27 @@
<template>
<CMyPage title="Gruppi" imgbackground="../../statics/images/produttori.jpg" sizes="max-height: 120px">
<span>{{ setmeta({
title: 'Gruppi',
description: "",
keywords: '' } ) }}
</span>
<div class="q-ma-sm q-gutter-sm q-pa-xs">
<CTitleBanner title="Gruppi"></CTitleBanner>
<CGridTableRec prop_mytable="groups"
prop_mytitle="Gruppi"
:prop_mycolumns="getcolgroups"
prop_colkey="descr"
nodataLabel="Nessun Gruppo"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato">
</CGridTableRec>
</div>
</CMyPage>
</template>
<script lang="ts" src="./groups.ts">
</script>
<style lang="scss" scoped>
@import 'groups.scss';
</style>

Some files were not shown because too many files have changed in this diff Show More