- Nella Lavagna, cliccando sul nome dell'invitato, compaiono le sue informazioni sugli step rimasti, in dettaglio.

- Ogni utente puo' cosi scegliere di regalare un proprio invitato, cliccando sull'invitato, scrivendo l'username del destinatario e premendo il bottone 'Regala Invitato'.
Al destinatario gli arriverà un messaggio sul Bot Telegram che indica che gli è stato regalato un'invitato.
This commit is contained in:
Paolo Arena
2020-02-02 04:07:24 +01:00
parent 4b54a9ce52
commit 20cd0f2e52
56 changed files with 881 additions and 132 deletions

View File

@@ -16,7 +16,7 @@ import { CalendarStore } from '../../store/Modules'
components: { CMyTeacher }
})
export default class CCardDiscipline extends Vue {
export default class CCardDiscipline extends MixinBase {
@Prop({ required: true }) public discipline: IDiscipline
@Prop({ required: false, default: '' }) public mystyle: string
@Prop({ required: false, default: false }) public autoplay: boolean

View File

@@ -1,14 +1,16 @@
<template>
<div class="q-ma-sm column cursor-pointer" @click="copytoclip">
<q-field outlined bottom-slots :label="title" stack-label class="text-center">
<template v-slot:prepend v-if="!tools.isMobile()">
<q-btn round dense flat icon="far fa-copy" />
</template>
<div class="q-ma-sm">
<div class="column cursor-pointer" @click="copytoclip">
<q-field outlined :label="title" stack-label class="text-center cursor-pointer">
<template v-slot:prepend v-if="!tools.isMobile()">
<q-btn round dense flat icon="far fa-copy"/>
</template>
<template v-slot:control>
<div class="self-center full-width no-outline text-center wrapword text-h5" tabindex="0">{{texttocopy}}</div>
</template>
</q-field>
<template v-slot:control>
<div class="self-center full-width no-outline text-center wrapword text-h5" tabindex="0">{{texttocopy}}</div>
</template>
</q-field>
</div>
</div>
</template>

View File

@@ -129,6 +129,14 @@ export default class CEventsCalendar extends MixinEvents {
public draggedEvent = null
public ignoreNextSwipe = false
get mythis() {
return this
}
set mythis(aa) {
}
public resources = [
{
label: 'John'

View File

@@ -80,7 +80,7 @@
</div>
<div v-if="myevent.dateTimeStart" class="cal__when">
<span class="cal__where-title">{{$t('cal.when')}}:
<span v-html="tools.getstrDateTimeEvent(mythis(), myevent, true)"></span>
<span v-html="tools.getstrDateTimeEvent(mythis, myevent, true)"></span>
</span>
</div>
<p v-if="myevent.linkpdf" style="margin-top: 10px; text-align: center">
@@ -295,7 +295,7 @@
</q-chip>
<div v-if="myevent.dateTimeStart" class="cal__when">
<span class="cal__where-title">{{$t('cal.when')}}:
<span v-html="tools.getstrDateTimeEvent(mythis(), myevent, true)"></span>
<span v-html="tools.getstrDateTimeEvent(mythis, myevent, true)"></span>
</span>
</div>
<div class="q-pa-xs">
@@ -339,7 +339,7 @@
<q-card-actions align="right">
<q-btn v-if="bookEventpage.state === EState.Modifying" flat :label="$t('cal.cancelbooking')"
color="negative"
@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"
@click="sendMsg(myevent)"></q-btn>
<q-btn v-else flat :label="getTitleBtnBooking" color="primary" @click="saveBookEvent(myevent)"
@@ -376,7 +376,7 @@
</q-chip>
<div v-if="myevent.dateTimeStart" class="cal__when">
<span class="cal__where-title">{{$t('cal.when')}}:
<span v-html="tools.getstrDateTimeEvent(mythis(), myevent, true)"></span>
<span v-html="tools.getstrDateTimeEvent(mythis, myevent, true)"></span>
</span>
</div>
<div class="q-pa-xs">
@@ -631,7 +631,7 @@
</div>
<div class="listaev__date listaev__align_center_mobile">
<span v-html="tools.getstrDateTimeEvent(mythis(), event, true)"></span>
<span v-html="tools.getstrDateTimeEvent(mythis, event, true)"></span>
</div>
<div class="listaev__align_center_mobile">

View File

@@ -18,14 +18,31 @@ export default class CGallery extends MixinBase {
@Prop({ required: true }) public edit: boolean
@Prop({ required: true }) public gall: IGallery
@Prop({ required: true }) public listimages: IImgGallery[]
public mygall: IGallery = {}
public mylistimages: IImgGallery[] = []
@Watch('gall')
public gallchanged() {
this.mygall = this.gall
}
@Watch('listimages')
public listimageschanged() {
this.mylistimages = this.listimages
}
public created() {
this.mygall = this.gall
this.mylistimages = this.listimages
}
get tools() {
return tools
}
get getlistimages() {
if (this.listimages)
return this.listimages.sort((a, b) => a.order - b.order)
if (this.mylistimages)
return this.mylistimages.slice().sort((a, b) => a.order - b.order)
else
return null
}
@@ -77,13 +94,13 @@ export default class CGallery extends MixinBase {
return
}
const myindex = this.listimages.findIndex((rec) => rec._id === draggedId)
const myrec: IImgGallery = this.listimages[myindex]
const myindex = this.mylistimages.findIndex((rec) => rec._id === draggedId)
const myrec: IImgGallery = this.mylistimages[myindex]
let myrecprec: IImgGallery = null
let myrecout: IImgGallery = null
const myindexout = this.listimages.findIndex((rec) => rec._id === dragout)
myrecout = this.listimages[myindexout]
const myindexout = this.mylistimages.findIndex((rec) => rec._id === dragout)
myrecout = this.mylistimages[myindexout]
let myindexprec = myindexout - 1
if (myindexprec < 0)
@@ -135,7 +152,7 @@ export default class CGallery extends MixinBase {
get getlastord() {
let myord = 0
for (const file of this.listimages) {
for (const file of this.mylistimages) {
if (file.order > myord)
myord = file.order
}
@@ -146,29 +163,29 @@ export default class CGallery extends MixinBase {
public uploaded(info) {
console.log(info)
for (const file of info.files) {
this.listimages.push({ imagefile: file.name, order: this.getlastord })
this.mylistimages.push({ imagefile: file.name, order: this.getlastord })
}
this.save()
}
public deleted(rec) {
console.table(this.listimages)
// console.table(this.mylistimages)
const index = this.listimages.findIndex((elem) => elem.imagefile === rec.imagefile)
const index = this.mylistimages.findIndex((elem) => elem.imagefile === rec.imagefile)
if (index > -1) {
this.listimages.splice(index, 1)
this.mylistimages.splice(index, 1)
}
// this.listimages = this.listimages.pop((elem) => elem.imagefile !== rec.imagefile)
// this.mylistimages = this.mylistimages.pop((elem) => elem.imagefile !== rec.imagefile)
console.table(this.listimages)
// console.table(this.mylistimages)
this.save()
}
public getfullname(rec) {
return 'statics/upload/' + this.gall.directory + `/` + rec.imagefile
return 'statics/upload/' + this.mygall.directory + `/` + rec.imagefile
}
public copytoclipboard(rec) {
@@ -187,7 +204,7 @@ export default class CGallery extends MixinBase {
}
public save() {
this.$emit('showandsave', this.listimages)
this.$emit('showandsave', this.mylistimages)
}
public getsrcimg(mygallery) {
@@ -195,7 +212,7 @@ export default class CGallery extends MixinBase {
if (tools.getextfile(mygallery.imagefile) === 'pdf')
return 'statics/images/images/pdf.jpg'
else
return 'statics/upload/' + this.gall.directory + `/` + mygallery.imagefile
return 'statics/upload/' + this.mygall.directory + `/` + mygallery.imagefile
}
}

View File

@@ -1,11 +1,11 @@
import Vue from 'vue'
import { Component, Prop } from 'vue-property-decorator'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { GlobalStore, UserStore } from '../../store/Modules/index'
import { tools } from '../../store/Modules/tools'
import { shared_consts } from '../../common/shared_vuejs'
import { ICategory, IColGridTable, ITableRec } from '../../model'
import { ICategory, IColGridTable, IFilter, ITableRec } from '../../model'
import { CTodo } from '../todos/CTodo'
import { SingleProject } from '../projects/SingleProject'
import { lists } from '../../store/Modules/lists'
@@ -26,6 +26,7 @@ export default class CGridTableRec extends Vue {
@Prop({ required: false, default: '' }) public nodataLabel: string
@Prop({ required: false, default: '' }) public noresultLabel: string
@Prop({ required: false, default: null }) public tablesList: ITableRec[]
@Prop({ required: false, default: null }) public arrfilters: IFilter[]
public mytable: string
public mytitle: string
@@ -55,6 +56,7 @@ export default class CGridTableRec extends Vue {
public separator: 'horizontal'
public myfilter = undefined
public myfilterand = []
public rowsel: any
public dark: boolean = true
public canEdit: boolean = false
@@ -190,6 +192,7 @@ export default class CGridTableRec extends Vue {
// console.log('onRequest', 'myfilter = ', this.myfilter)
const { page, rowsPerPage, rowsNumber, sortBy, descending } = props.pagination
const myfilter = this.myfilter
const myfilterand = this.myfilterand
if (!this.mytable)
return
@@ -212,7 +215,7 @@ export default class CGridTableRec extends Vue {
this.serverData = []
// fetch data from "server"
this.fetchFromServer(startRow, endRow, myfilter, sortBy, descending).then((ris) => {
this.fetchFromServer(startRow, endRow, myfilter, myfilterand, sortBy, descending).then((ris) => {
this.pagination.rowsNumber = this.getRowsNumberCount(myfilter)
@@ -244,7 +247,7 @@ export default class CGridTableRec extends Vue {
// emulate ajax call
// SELECT * FROM ... WHERE...LIMIT...
public async fetchFromServer(startRow, endRow, myfilter, sortBy, descending) {
public async fetchFromServer(startRow, endRow, myfilter, myfilterand, sortBy, descending) {
let myobj = null
if (sortBy) {
@@ -260,6 +263,7 @@ export default class CGridTableRec extends Vue {
startRow,
endRow,
filter: myfilter,
filterand: myfilterand,
sortBy: myobj,
descending
}
@@ -565,4 +569,9 @@ export default class CGridTableRec extends Vue {
return ''
}
}
@Watch('myfilterand')
public changemyfilterand() {
this.refresh()
}
}

View File

@@ -24,6 +24,7 @@
>
<template v-slot:header="props">
<q-tr :props="props">
<q-th>
@@ -99,6 +100,11 @@
<q-spinner-tail size="2em" color="primary"/>
</q-inner-loading>
<div class="row">
<q-toggle v-for="(filter, index) of arrfilters" :key="index" v-model="myfilterand" :val="filter.value" :label="filter.label"></q-toggle>
</div>
</template>
<template v-slot:body="props">

View File

View File

@@ -0,0 +1,15 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { tools } from '../../store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import MixinBase from '@src/mixins/mixin-base'
@Component({
})
export default class CLegenda extends MixinBase {
@Prop({ required: true }) public icon: string
@Prop({ required: true }) public text: string
}

View File

@@ -0,0 +1,15 @@
<template>
<div>
<div class="row q-ml-sm q-pa-xs items-center">
<q-icon size="sm" :name="icon" color="green"></q-icon>
<q-chip dense color="blue" text-color="white" class="q-ml-md">{{text}}</q-chip>
</div>
</div>
</template>
<script lang="ts" src="./CLegenda.ts">
</script>
<style lang="scss" scoped>
@import './CLegenda.scss';
</style>

View File

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

View File

@@ -25,6 +25,10 @@ export default class CLineChart extends Vue {
return this
}
set mythis(my) {
//
}
public mounted() {
this.mydatafixed = {}

View File

@@ -0,0 +1,12 @@
import { ISignupOptions } from 'model'
import { email, minLength, required, sameAs } from 'vuelidate/lib/validators'
// import { ValidationRuleset } from 'vuelidate'
import { complexity, registeredemail, registereduser, aportadorexist } from '../../validation'
export const validations = {
aportador_solidario: {
aportadorexist,
required
}
}

View File

@@ -9,19 +9,110 @@ import { CTitleBanner } from '../CTitleBanner'
import { CMyFieldDb } from '../CMyFieldDb'
import { CCopyBtn } from '../CCopyBtn'
import { CUserBadge } from '../CUserBadge'
import { CLegenda } from '../CLegenda'
import { IDashboard, IUserProfile } from '../../model'
import { IUserFields } from '../../model/UserStore'
import { CRequisito } from '../CRequisito'
import translate from '../../globalroutines/util'
import { tools } from '../../store/Modules/tools'
import { lists } from '../../store/Modules/lists'
import { validations } from './CMyDashboard-validate'
import { validationMixin } from 'vuelidate'
@Component({
components: { CProfile, CTitleBanner, CMyFieldDb, CCopyBtn, CUserBadge }
mixins: [validationMixin],
validations,
components: { CProfile, CTitleBanner, CMyFieldDb, CCopyBtn, CUserBadge, CLegenda, CRequisito }
})
export default class CMyDashboard extends MixinUsers {
@Prop({ required: true }) public username
public $v
public $q
public dashboard = { aportador: DefaultUser, numpeople_aportador: 0, downline: [], downbyuser: [] }
public myusername: string = ''
public showuserinfo: boolean = false
public notifBot: boolean = true
public seluser: IUserFields = null
public aportador_solidario: string = ''
public dashboard: IDashboard = {
myself: DefaultUser,
aportador: DefaultUser,
numpeople_aportador: 0,
downline: [],
downnotreg: [],
downbyuser: []
}
public mythis() {
@Prop({ required: true }) public username
public arrrequisiti = [
{
icon: 'email',
textlang: 'reg.verified_email',
isok(user) {
if (user)
return user.verified_email
else
return false
},
info: '',
},
{
icon: 'fab fa-telegram',
textlang: 'reg.telegram',
isok(user) {
if (user)
if (user.profile)
return user.profile.teleg_id > 0
return false
},
info: '',
},
{
icon: 'fas fa-video',
textlang: 'steps.zoom_partecipa',
isok(user) {
if (user)
if (user.profile)
return user.profile.saw_zoom_presentation
return false
},
info: '',
},
{
icon: 'fas fa-heart',
textlang: 'steps.dream',
isok(user) {
if (user)
if (user.profile.my_dream)
return user.profile.my_dream.length > 20
else
return false
},
info: '',
},
{
icon: 'far fa-credit-card',
textlang: 'steps.paymenttype',
isok(user) {
if (user)
if (user.profile.paymenttypes)
return user.profile.paymenttypes.length > 20
else
return false
},
info: '',
},
]
@Watch('UserStore.state.my.dashboard')
public changedash() {
console.log('changedash')
this.dashboard = UserStore.state.my.dashboard
}
get mythis() {
return this
}
@@ -34,40 +125,106 @@ export default class CMyDashboard extends MixinUsers {
this.update_username()
}
public update_username() {
public async update_username() {
// console.log('update_username')
if (this.username === '')
this.username = this.getMyUsername()
this.myusername = this.getMyUsername()
else
this.myusername = this.username
UserStore.actions.getDashboard({ username: this.username }).then((ris) => {
// console.log('getDashboard', ris)
if (ris.aportador === undefined) {
this.dashboard.aportador = DefaultUser
} else {
this.dashboard.aportador = ris.aportador
}
if (ris.numpeople_aportador === undefined) {
this.dashboard.numpeople_aportador = 0
} else {
this.dashboard.numpeople_aportador = ris.numpeople_aportador
}
if (ris.downline === undefined) {
this.dashboard.downline = []
} else {
this.dashboard.downline = ris.downline
}
if (ris.downbyuser === undefined) {
this.dashboard.downbyuser = []
} else {
this.dashboard.downbyuser = ris.downbyuser
}
// console.log('this.dashboard', this.dashboard)
await UserStore.actions.getDashboard({ username: this.myusername }).then((ris) => {
this.dashboard = UserStore.state.my.dashboard
})
}
get getRefLink() {
return UserStore.getters.getRefLink(this.username)
return UserStore.getters.getRefLink(this.myusername)
}
get invitatinotreg() {
if (this.dashboard)
if (this.dashboard.downnotreg)
return this.dashboard.downnotreg.length > 0
return false
}
public selectclick(user) {
this.showuserinfo = true
this.seluser = user
}
public isextralist(user) {
return !!user.cell_complete
}
public ismyinvited_notreg(user) {
return this.dashboard.downnotreg.find((rec) => rec.ind_order === user.ind_order)
}
public ismydownline(user) {
return this.dashboard.downline.find((rec) => rec.username === user.username)
}
public async deleteUserFromExtraList(user) {
await tools.askConfirm(this.$q, translate('reg.cancella_invitato'), translate('reg.cancella_invitato') + ' ' + user.name + ' ' + user.surname + '?', translate('dialog.yes'), translate('dialog.no'), this, '', lists.MenuAction.DELETE_EXTRALIST, 0, {
param1: user,
param2: true
})
}
public async RegalaInvitato(user, aportador_solidario, notifBottxt) {
let notiftxt = ''
if (this.notifBot)
notiftxt = notifBottxt
await tools.askConfirm(this.$q, translate('reg.regala_invitato'), translate('reg.regala_invitato') + ' ' + user.name + ' ' + user.surname + ' a ' + aportador_solidario + ' ?', translate('dialog.yes'), translate('dialog.no'), this, '', lists.MenuAction.REGALA_INVITATO, 0, {
param1: user,
param2: aportador_solidario,
param3: notiftxt
})
}
public errorMsg(cosa: string, item: any) {
try {
if (!item.$error) {
return ''
}
if (item.required !== undefined) {
if (!item.required) {
return this.$t('reg.err.required')
}
} else if (cosa === 'aportador_solidario') {
// console.log(item);
if (!item.aportadorexist) {
// console.log('!item.aportadorexist !')
return this.$t('reg.err.aportador_regalare_not_exist')
}
}
return ''
} catch (error) {
// console.log("ERR : " + error);
}
}
get allowSubmit() {
let error = this.$v.$error || this.$v.$invalid
error = error || (this.aportador_solidario === this.seluser.aportador_solidario)
return !error
}
get getnotifBotTxt() {
return this.$t('dashboard.ricevuto_dono', {
invitato: this.seluser.name + ' ' + this.seluser.surname,
mittente: this.dashboard.myself.username
})
}
}

View File

@@ -1,18 +1,16 @@
<template>
<div class="q-ma-xs q-gutter-xs q-pa-xs" v-if="username !== ''">
<CTitleBanner class="q-pa-xs" :title="$t('pages.dashboard') +` (`+ username + `)`" bgcolor="bg-info" clcolor="text-white"
<div class="q-ma-xs q-gutter-xs q-pa-xs" v-if="myusername !== ''">
<CTitleBanner class="q-pa-xs" :title="$t('pages.dashboard')" bgcolor="bg-info" clcolor="text-white"
mystyle=" " myclass="myshad">
<CCopyBtn :title="$t('reg.reflink')" :texttocopy="getRefLink">
</CCopyBtn>
<CTitleBanner class="shadow-2" :title="$t('reg.aportador_solidario')" bgcolor="bg-accent"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<CUserBadge v-if="!!dashboard.aportador.name" :user="dashboard.aportador" :index="0" :numpeople="dashboard.numpeople_aportador"
mycolor="accent">
<CUserBadge v-if="!!dashboard.aportador" :user="dashboard.aportador" :index="0"
:numpeople="dashboard.numpeople_aportador"
mycolor="accent" @myclick="selectclick">
</CUserBadge>
<div v-else class="q-pa-sm text-center">
@@ -20,17 +18,35 @@
</div>
</CTitleBanner>
<CTitleBanner class="shadow-2" :title="$t('reg.you')" bgcolor="bg-blue"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<CUserBadge v-if="!!dashboard.myself" :user="dashboard.myself" :index="0"
:numpeople="dashboard.downline.length"
@myclick="selectclick"
mycolor="blue">
</CUserBadge>
</CTitleBanner>
<CTitleBanner class="shadow-2 rounded-borders" :title="$t('dashboard.downline')" bgcolor="bg-positive"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<q-list bordered v-if="!!dashboard.downline && dashboard.downline.length > 0" class="rounded-borders">
<div v-for="(user, index) in dashboard.downline" :key="index">
<CUserBadge :yourinvite="true" :user="user" mycolor="primary" :index="index" :numpeople="dashboard.downbyuser[user.username].length">
<CUserBadge :yourinvite="true" :user="user" mycolor="positive" :index="index"
:numpeople="dashboard.downbyuser[user.username].length"
@myclick="selectclick"
>
</CUserBadge>
<div style="margin-left:10px;" v-for="(user2, index2) in dashboard.downbyuser[user.username]" :key="index2">
<CUserBadge :yourinvite="false" :user="user2" mycolor="orange" :index="index2" :numpeople="dashboard.downbyuser[user2.username].length">
<CUserBadge :yourinvite="false" :user="user2" mycolor="orange" :index="index2"
:numpeople="dashboard.downbyuser[user2.username].length"
@myclick="selectclick"
>
</CUserBadge>
</div>
@@ -41,6 +57,21 @@
</div>
</CTitleBanner>
<CTitleBanner v-if="invitatinotreg" class="shadow-2 rounded-borders" :title="$t('dashboard.downnotreg')"
bgcolor="bg-grey"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<q-list bordered v-if="!!dashboard.downnotreg" class="rounded-borders">
<div v-for="(user, index) in dashboard.downnotreg" :key="index">
<CUserBadge :yourinvite="true" :user="user" mycolor="grey" :index="index" :numpeople="user.num_invitati"
@myclick="selectclick">
</CUserBadge>
</div>
</q-list>
</CTitleBanner>
</CTitleBanner>
<!--
@@ -60,6 +91,103 @@
</div>
</CTitleBanner>
-->
<CCopyBtn :title="$t('reg.reflink')" :texttocopy="getRefLink">
</CCopyBtn>
<CTitleBanner class="shadow-2 rounded-borders" :title="$t('reg.legenda')"
bgcolor="bg-primary"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<q-list bordered class="rounded-borders row justify-between">
<CLegenda icon="fab fa-telegram" :text="`Telegram ` + $t('pages.statusreg.verified')"></CLegenda>
<CLegenda icon="fas fa-video" :text="$t('pages.statusreg.seezoom')"></CLegenda>
<CLegenda icon="fas fa-user-friends" :text="$t('dashboard.numinvitati')"></CLegenda>
<CLegenda icon="fab fa-whatsapp" :text="$t('dashboard.telefono_wa')"></CLegenda>
</q-list>
</CTitleBanner>
<br>
<q-dialog v-model="showuserinfo">
<q-card v-if="seluser" :style="`min-width: `+ tools.myheight_dialog() + `px;`">
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
Info:
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<CTitleBanner class="shadow-2 rounded-borders" :title="seluser.name + ` ` + seluser.surname"
bgcolor="bg-primary"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<div v-if="!ismyinvited_notreg(seluser)" class="text-center">
<div v-if="!isextralist(seluser)">
<div v-for="req of arrrequisiti">
<CRequisito :icon="req.icon" :text="$t(req.textlang)" :isok="req.isok(seluser)"
:info="req.info"></CRequisito>
</div>
</div>
<div v-if="ismydownline(seluser)">
<CTitleBanner class="shadow-2 rounded-borders" :title="$t('reg.regala_invitato')"
bgcolor="bg-positive"
clcolor="text-white"
:visible="false"
mystyle=" " myclass="myshad" :canopen="true">
<div class="column q-gutter-sm justify-center text-center">
<q-input
bg-color="lightblue"
v-model="aportador_solidario"
rounded outlined
@blur="$v.aportador_solidario.$touch"
:error="$v.aportador_solidario.$error"
:error-message="errorMsg('aportador_solidario', $v.aportador_solidario)"
maxlength="20"
debounce="1000"
:label="$t('reg.username_regala_invitato')">
<template v-slot:prepend>
<q-icon name="person"/>
</template>
</q-input>
<q-toggle v-model="notifBot" :label="$t('dashboard.sendnotification')"/>
<q-btn class="q-ma-sm" rounded color="positive" text-color="white" icon="fas fa-gift" :label="$t('reg.regala_invitato')"
:disabled='!allowSubmit'
@click="RegalaInvitato(seluser, aportador_solidario, getnotifBotTxt)"></q-btn>
</div>
</CTitleBanner>
</div>
</div>
<div v-else>
<div class="column justify-center q-gutter-sm q-pa-sm">
<CRequisito icon="fas fa-user" text="dashboard.notreg" :isok="false"
info=""></CRequisito>
<q-btn rounded text-color="red" icon="delete" :label="$t('reg.cancella_invitato')"
@click="deleteUserFromExtraList(seluser)"></q-btn>
</div>
</div>
</CTitleBanner>
</q-card-section>
</q-card>
</q-dialog>
</div>
</template>

View File

@@ -30,6 +30,14 @@ export default class CMySingleEvent extends MixinEvents {
public $t
public selected: boolean = false
get mythis() {
return this
}
set mythis(aa) {
}
public selectEvent(eventparam: IEvents) {
this.selected = !this.selected
}

View File

@@ -50,7 +50,7 @@
</div>
<div class="listaev__date listaev__align_center_mobile">
<span v-html="tools.getstrDateTimeEvent(mythis(), myevent, true)"></span>
<span v-html="tools.getstrDateTimeEvent(mythis, myevent, true)"></span>
</div>
<div class="listaev__align_center_mobile">

View File

@@ -9,10 +9,13 @@ 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'
@Component({
name: 'CStatusReg',
components: { CTitleBanner, CCardState }
components: { CTitleBanner, CCardState, CCopyBtn }
})
export default class CNextZoom extends MixinBase {
@@ -27,4 +30,18 @@ export default class CNextZoom extends MixinBase {
return tools.getstrTime(this.listacalzoom[0].date_start)
}
}
get showzoom() {
if (GlobalStore.state.calzoom.length > 0) {
const mydate = GlobalStore.state.calzoom.slice(-1)[0].date_start
const mydate_end = GlobalStore.state.calzoom.slice(-1)[0].date_end
const datenow = tools.getDateNow()
console.log('date.getDateDiff(datenow, mydate, \'minutes\')', date.getDateDiff(datenow, mydate, 'minutes'))
// if begin is in the past, take the day now
if ((date.getDateDiff(datenow, mydate, 'minutes') > -10) && (date.getDateDiff(datenow, mydate_end, 'minutes') < 0)) {
return true
}
}
return false
}
}

View File

@@ -7,12 +7,16 @@
<div class="flex flex-center">
<div class="column animazione">
<div class="row animazione justify-center q-gutter-md">
<q-btn v-if="showzoom" size="md" type="a" :href="tools.getLinkZoom()"
target="_blank" rounded color="white" text-color="primary" icon="fas fa-video" :label="$t('steps.entra_zoom')">
</q-btn>
<transition-group name="fade" mode="out-in"
appear
enter-active-class="animazione fadeIn"
leave-active-class="animazione fadeOut">
<q-item v-for="(confer, index) in listacalzoom" :key="confer._id" class="q-mb-xs animated" v-ripple>
<q-item v-for="(confer, index) in listacalzoom" :key="confer._id" class="q-mb-xs animated clBorderZoom q-pa-sm" v-ripple>
<q-item-section avatar>
<q-avatar v-if="tools.geticon(confer.lang)" :class="tools.geticon(confer.lang)" size="xs">

View File

@@ -15,7 +15,6 @@ import MixinBase from '../../mixins/mixin-base'
})
export default class CProfile extends MixinBase {
@Prop({ required: true }) public mythis: any
public $v
public $t: any

View File

@@ -0,0 +1,16 @@
.req_icon{
flex: 0 0 40px;
align-self: center;
}
.req_text{
flex: 1 1;
align-self: center;
}
.response {
flex: 0 0 40px;
font-weight: bold;
align-self: center;
}

View File

@@ -0,0 +1,29 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { tools } from '../../store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import MixinBase from '@src/mixins/mixin-base'
@Component({
})
export default class CRequisito extends MixinBase {
@Prop({ required: true }) public icon: string
@Prop({ required: true }) public text: string
@Prop({ required: true }) public isok: boolean
@Prop({ required: true }) public info: string
get checkifok() {
return this.isok ? 'green' : 'red'
}
get getris() {
return (this.isok) ? this.$t('dialog.yes') : this.$t('dialog.no')
}
get iconris() {
return (this.isok) ? 'fas fa-check' : 'fas fa-exclamation-triangle'
}
}

View File

@@ -0,0 +1,14 @@
<template>
<div class="row no-wrap clBorderSmall">
<q-icon size="sm" :name="icon" color="blue" class="column req_icon"></q-icon>
<q-chip dense color="white" text-color="blue" class="q-ml-md column req_text">{{text}}</q-chip>
<q-icon size="sm" :name="iconris" :color="checkifok" class="column req_icon"></q-icon>
</div>
</template>
<script lang="ts" src="./CRequisito.ts">
</script>
<style lang="scss" scoped>
@import './CRequisito.scss';
</style>

View File

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

View File

@@ -25,7 +25,6 @@ import { static_data } from '../../db/static_data'
})
export default class CSignIn extends Vue {
@Prop({ required: true }) public mythis: any
public $v
public loading: boolean
public $t: any

View File

@@ -14,7 +14,6 @@ import { CCopyBtn } from '../CCopyBtn'
import { CVideo } from '../CVideo'
import { CRequisiti } from '../CRequisiti'
@Component({
components: { CTitleBanner, CMyFieldDb, CMyInnerPage, CVerifyTelegram, CVerifyEmail, CCopyBtn, CVideo, CRequisiti }
})
@@ -241,7 +240,7 @@ export default class CStatus extends MixinBase {
public getnuminvitati_attivi() {
if (UserStore.state.my)
if (UserStore.state.my.calcstat)
console.log('numinvitati', UserStore.state.my.calcstat)
// console.log('numinvitati', UserStore.state.my.calcstat)
return UserStore.state.my.calcstat.numinvitati_attivi
return 0

View File

@@ -213,6 +213,10 @@
</CCopyBtn>
<CCopyBtn :title="$t('reg.linkzoom')" :texttocopy="tools.getLinkZoom()">
</CCopyBtn>
<q-btn class="q-mb-md" rounded size="md" color="primary" to="/dashboard"
:label="$t('pages.dashboard')"></q-btn>

View File

@@ -5,3 +5,7 @@
border-radius: 1rem;
padding: 2px;
}
.notreg {
color: red;
}

View File

@@ -24,7 +24,12 @@ export default class CUserBadge extends MixinBase {
public $t: any
public getletter(user) {
return user.name[0].toUpperCase()
if (!user)
return ''
if (!!user.name[0])
return user.name[0].toUpperCase()
else
return ''
}
public getnumber(user, index) {
@@ -32,11 +37,21 @@ export default class CUserBadge extends MixinBase {
}
public getstatecolor(user) {
return (user.profile.teleg_id) ? 'green' : 'gray'
if (user.profile)
return (user.profile.teleg_id) ? 'green' : 'grey'
else
return 'grey'
}
public getindorder(user) {
if (!!user.ind_order)
return ' (' + user.ind_order + ')'
else
return ''
}
public getmoneycolor(user) {
return (user.made_gift) ? 'green' : 'gray'
return (user.made_gift) ? 'green' : 'grey'
}
get madegift() {
@@ -44,15 +59,37 @@ export default class CUserBadge extends MixinBase {
}
public getzoomcolor(user) {
return (user.profile.saw_zoom_presentation) ? 'green' : 'gray'
if (user.profile)
return (user.profile.saw_zoom_presentation) ? 'green' : 'grey'
else
return 'grey'
}
public get2peoplecolor() {
return (this.getnumpeople() >= 2) ? 'green' : 'gray'
public get2peoplecolor(user) {
if (this.isextralist(user))
return 'grey'
else
return (this.getnumpeople() >= 2) ? 'green' : 'grey'
}
public isextralist(user) {
return !!user.cell_complete
}
public getnumpeople() {
return this.numpeople
}
public getusername(user) {
if (this.isextralist(user)) {
return user.cell_complete
} else {
return user.username
}
}
public execclick(user) {
this.$emit('myclick', user)
}
}

View File

@@ -1,6 +1,6 @@
<template>
<div>
<q-item class="q-my-sm q-pa-sm myuserbadge shadow-5" clickable v-ripple>
<div v-if="!!user">
<q-item class="q-my-sm q-pa-sm myuserbadge shadow-5" clickable v-ripple @click="execclick(user)">
<q-item-section avatar>
<div class="row" style="margin-left: 4px;">
<q-avatar v-if="yourinvite" :text-color="mycolor" size="md">
@@ -13,23 +13,31 @@
</q-item-section>
<q-item-section>
<q-item-label>{{ user.name }} {{ user.surname }}<br>
<span class="text-grey">({{ user.username }})</span>
<q-item-label>{{ user.name }} {{ user.surname }} {{ getindorder(user) }}<br>
<span class="text-grey">({{ getusername(user) }})</span>
<br><span v-if="isextralist(user)" class="notreg">{{$t('dashboard.notreg')}}</span>
</q-item-label>
<!--<q-item-label caption lines="1">{{ user.email }}</q-item-label>-->
</q-item-section>
<q-item-section side>
<div class="row q-gutter-xs justify-center items-center">
<q-icon size="xs" name="fab fa-telegram" :color="getstatecolor(user)"></q-icon>
<q-icon size="xs" name="fas fa-video" :color="getzoomcolor(user)"></q-icon>
<q-btn v-if="isextralist(user)" fab-mini
icon="fab fa-whatsapp"
color="green" type="a"
size="sm"
:href="tools.getHttpForWhatsapp(user.cell_complete)" target="__blank">
</q-btn>
<q-icon v-if="!isextralist(user)" size="sm" name="fab fa-telegram" :color="getstatecolor(user)"></q-icon>
<q-icon v-if="!isextralist(user)" size="sm" name="fas fa-video" :color="getzoomcolor(user)"></q-icon>
<q-avatar :text-color="mycolor" size="md">
{{ getnumpeople() }}
</q-avatar>
<q-icon size="xs" name="fas fa-user-friends" :color="get2peoplecolor()"></q-icon>
<q-icon size="xs" name="fas fa-user-friends" :color="get2peoplecolor(user)"></q-icon>
</div>
</q-item-section>
</q-item>
</div>
</template>

View File

@@ -6,8 +6,8 @@
<div class="subtitle_small text-blue" v-html="getvideotit"></div>
<div class="">
<iframe
:width="tools.getwidthscale(mythis(), getValDb('YT_W', false), 800)"
:height="tools.getheightbywidth(mythis(), getValDb('YT_W', false), getValDb('YT_H', false), 800)"
:width="tools.getwidthscale(mythis, getValDb('YT_W', false), 800)"
:height="tools.getheightbywidth(mythis, getValDb('YT_W', false), getValDb('YT_H', false), 800)"
:src="tools.getvideobyidyoutube(myvideokey)"
frameborder="0"
allowfullscreen

View File

@@ -361,7 +361,7 @@ export default class Header extends Vue {
tools.showNotif(this.$q, this.$t(msgcode))
}
public mythis() {
get mythis() {
return this
}

View File

@@ -51,3 +51,5 @@ export * from './CVerifyEmail'
export * from './CLineChart'
export * from './CUserBadge'
export * from './CMyDashboard'
export * from './CLegenda'
export * from './CRequisito'