- Requirements
- Send Msg to Passeggeri
This commit is contained in:
Paolo Arena
2020-03-10 21:42:30 +01:00
parent 2f283d0710
commit 3f6ffc973a
66 changed files with 1670 additions and 547 deletions

View File

@@ -1,26 +1,25 @@
import moment from 'moment';
import 'moment/locale/fr';
import moment from 'moment'
import 'moment/locale/fr'
moment.locale('fr')
const monthsStrings = ['Janvier','Fevrier','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'];
const monthsStrings = ['Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']
export class DateMoving {
public date: moment.Moment;
public hour: string;
public number: number;
public month: string;
public year: number;
public date: moment.Moment
public hour: string
public number: number
public month: string
public year: number
constructor(time: number) {
this.date = moment(time * 1000);
this.hour = `${this.date.format('HH:mm')}`;
this.number = this.date.date();
this.year = this.date.year();
this.month = monthsStrings[this.date.month()];
this.date = moment(time * 1000)
this.hour = `${this.date.format('HH:mm')}`
this.number = this.date.date()
this.year = this.date.year()
this.month = monthsStrings[this.date.month()]
}
fullString() {
return this.date.format('Do MMMM YYYY, HH:mm');
public fullString() {
return this.date.format('Do MMMM YYYY, HH:mm')
}
}
}

View File

@@ -1,7 +1,18 @@
export const shared_consts = {
Accepted: {
CHECK_READ_GUIDELINES: 1,
CHECK_SEE_VIDEO_PRINCIPI: 2,
CHECK_READ_GUIDELINES: {
value: 1,
label: 'steps.linee_guida',
icon: 'fas fa-user-shield',
color: 'red'
},
CHECK_SEE_VIDEO_PRINCIPI: {
value: 2,
label: 'steps.video_intro',
icon: 'fas fa-tools',
color: 'green'
},
},
ALL_SAW_AND_ACCEPTED: 3,

View File

@@ -11,3 +11,24 @@
box-shadow: none;
}
.my-card-small-stat {
width: 100%;
max-width: 60px;
min-width: 40px;
@media (max-width: 718px) {
// PER VERSIONE MOBILE
max-width: 50px;
min-width: 40px;
}
box-shadow: none;
}
.text-h5-short {
line-height: 1.25rem !important;
@media (max-width: 718px) {
line-height: 1rem !important;
}
}

View File

@@ -16,12 +16,17 @@ export default class CCardState extends MixinBase {
@Prop({ required: false, default: '' }) public imgsrc
@Prop({ required: false, default: false }) public isperc
@Prop({ required: false, default: '' }) public textadd
@Prop({ required: false, default: 'green' }) public color
@Prop({ required: false, default: 'green' }) public mycolor
@Prop({ required: false, default: '150px' }) public size
@Prop({ required: false, default: '130px' }) public size_mob
@Prop({ required: false, default: '1rem' }) public fontsize
@Prop({ required: false, default: '' }) public mystyle
@Prop({ required: false, default: 'my-card-stat' }) public myclass
get getsize() {
if (tools.isMobile())
return '130px'
return this.size_mob
else
return '150px'
return this.size
}
}

View File

@@ -1,14 +1,14 @@
<template>
<q-card class="my-card-stat text-center">
<q-card :class="myclass +` text-center`" :style="mystyle">
<q-circular-progress
show-value
font-size="1rem"
:font-size="fontsize"
:value="myperc"
:size="getsize"
:thickness="0.25"
:color="color"
:color="mycolor"
track-color="grey-3"
class="q-ma-sm animated"
class="animated"
>
<q-avatar v-if="imgsrc" size="60px">
@@ -18,7 +18,7 @@
<div>
{{ mytext }}
</div>
<div class="mlvalue text-h5 text-blue boldhigh"> {{ myval }} {{ textadd }}
<div class="mlvalue text-h5 text-blue boldhigh text-h5-short"> {{ myval }} {{ textadd }}
</div>
<div v-if="isperc" class="cltexth4">
({{ myperc.toFixed(1) }} %)

View File

@@ -557,7 +557,7 @@ export default class CGridTableRec extends Vue {
this.colclicksel = null
}
console.log('this.rowclicksel', this.rowclicksel)
// console.log('this.rowclicksel', this.rowclicksel)
}
get getusernamesel() {

View File

@@ -31,15 +31,15 @@ export default class CGuidelines extends MixinBase {
}
public aggiorna_guideline() {
this.myguideline = tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES)
this.myguideline = tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES.value)
}
public changeval(value) {
console.log('PRIMA saw_and_accepted', UserStore.state.my.profile.saw_and_accepted)
if (value)
UserStore.state.my.profile.saw_and_accepted = tools.SetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES)
UserStore.state.my.profile.saw_and_accepted = tools.SetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES.value)
else
UserStore.state.my.profile.saw_and_accepted = tools.UnSetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES)
UserStore.state.my.profile.saw_and_accepted = tools.UnSetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES.value)
const mydata = {
'profile.saw_and_accepted': UserStore.state.my.profile.saw_and_accepted

View File

@@ -64,16 +64,9 @@
Union</strong>, Xoom o TransferWise nei casi di
regali extraeuropei.
</li>
<li>Invitare, invitare, invitare. Accompagnare le persone ad un Zoom di Benvenuto e assisterli nella
registrazione al sito. Il movimento è un organismo vivente di cui ora anche tu fai parte. Per ciò ti viene
richiesto di coinvolgere attivamente almeno 2 persone, <strong>ne consigliamo 3 in su</strong>, non penso
solo a me, ma anche agli altri che ne fanno parte, garantendo e <strong>sostenendo così la
solidarietà</strong>
dello stesso.
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Fase 3: Programmazione e Attivazione della Billettera</p>
<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">
@@ -81,17 +74,16 @@
<li>realizzare e concludere il processo in maniera semplice, godibile e semi-automatizzata.</li>
</ul>
<p>La tua Billetera verrà programmata e tu entrerai in una chat coi tuoi compagni di viaggio. Allo stesso tempo,
ti verrà comunicata la data in cui la billetera sarà attivata e in cui potrai donare i 33 e il nominativo e i
<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.
Conoscerai, inoltre, le date di ciascuno dei 3 passi.
</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
tempi e forma previsti, le date verranno riprogrammate per permettere il completamento di tutti e non lasciare
che il
viaggio possa interrompersi.
</p>
@@ -104,7 +96,7 @@
<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 bigliettera, i passi da compiere
<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>
@@ -215,16 +207,9 @@
Union</strong>, Xoom o TransferWise en casos de
regalos extra-europeos.
</li>
<li>
Invitar, invitar, invitar. Acompañar a la gente a un Zoom de Bienvenida y ayudarlos en el
registro del sitio. El movimiento es un organismo vivo del que ahora formas parte. Es por eso que usted es
se requiere involucrar activamente al menos a 2 personas, <strong> recomendamos 3 up</strong>, no lo creo.
sólo a , sino también a los otros que forman parte de ella, garantizando y apoyando así la
<strong>solidaridad</strong> de lo mismo.
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Paso 3: Programación y activación de la Billettera</p>.
<p class="cltexth3 text-blue q-ma-lg">Paso 3: Programación y activación de la Nave</p>.
<p>En AYNI La secuencia de pasos está programada de antemano, de modo que:</p>
<ul class="lista">
@@ -232,11 +217,9 @@
<li>hacer y terminar el proceso de una manera simple, agradable y semi-automática.</li>
</ul>
<p>Tu Billetera será programada y entrarás en un chat con tus compañeros de viaje. Al mismo tiempo,
se le informará de la fecha en la que se activará la billetera y en la que podrá donar los 33 y el
nombre y el
<p>Su nave será programada y entrará en un chat con sus compañeros de viaje. Al mismo tiempo,
se le informará de la fecha en la que su barco zarpará, es decir, cuando podrá donar los 33€ y el nombre y el
los datos del Soñador para darle su regalo.
También sabrás las fechas de cada uno de los 3 pasos.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
@@ -370,16 +353,8 @@
Union</strong>, Xoom ou TransferWise em casos de
presentes extra-europeus.
</li>
<li>Convidar, convidar, convidar. Acompanhe as pessoas a um Zoom de Boas-vindas e ajude-as no
registo no site. O movimento é um organismo vivo do qual você agora faz parte. É por isso que você é
necessário para envolver ativamente pelo menos 2 pessoas, <strong> recomendamos 3 a mais</strong>, eu não
acho.
apenas para mim, mas também para os outros que fazem parte dela, garantindo e <strong>sustentando o
solidariedade</strong>
do mesmo.
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Passo 3: Programação e ativação do Billettera</p>.
<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">
@@ -387,10 +362,9 @@
<li>Fazer e terminar o processo de uma forma simples, agradável e semi-automática.</li>
</ul>
<p>Sua Billetera será programada e você entrará em uma conversa com seus companheiros de viagem. Ao mesmo tempo,
você será informado da data em que o boleto será ativado e em que você pode doar os 33 e o nome e a
<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ê podedoar os 33 euros e o nome e
dados do Sonhador para dar o seu presente.
Você também saberá as datas de cada um dos 3 passos.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
@@ -520,17 +494,8 @@
Union</strong>, Xoom ou TransferWise en cas de
les cadeaux extra-européens.
</li>
<li>Invitez, invitez, invitez. Accompagner les personnes à un Zoom de bienvenue et les aider à
l'enregistrement du site. Le mouvement est un organisme vivant dont vous faites maintenant partie. C'est
pourquoi vous êtes
Il faut qu'au moins 2 personnes participent activement, <strong> nous recommandons 3 personnes </strong>, je
ne pense pas.
seulement à moi, mais aussi aux autres qui en font partie, garantissant et <strong>soutenant ainsi la
solidarité</strong>
de la même manière.
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Etape 3: Programmation et activation de la Billettera</p>.
<p class="cltexth3 text-blue q-ma-lg">Etape 3: Programmation et activation de la Navire</p>.
<p>En AYNI La séquence des étapes est programmée à l'avance, de sorte que:</p>
<ul class="lista">
@@ -538,11 +503,11 @@
<li>faire et terminer le processus de manière simple, agréable et semi-automatique.</li>
</ul>
<p>Votre Billetera sera programmée et vous entrerez en conversation avec vos compagnons de voyage. Dans le même
temps, vous serez informé de la date à laquelle la billetera sera activée et à laquelle vous pourrez faire don
des
33 et du nom et de la les données du rêveur à qui vous pouvez faire un cadeau.
Vous connaîtrez également les dates de chacune des 3 étapes.
<p>Votre navire sera programmé et vous entrerez en conversation avec vos compagnons de voyage. Dans le même
temps,
vous serez informé de la date à laquelle votre navire naviguera, c'est-à-dire de la date à laquelle vous
pourrez faire don des 33€ et du nom et de la
les données du rêveur à qui vous pouvez faire un cadeau.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
@@ -673,16 +638,9 @@
Union</strong>, Xoom or TransferWise in cases of
extra-European gifts.
</li>
<li>Invite, invite, invite. Accompany people to a Welcome Zoom and assist them in the
site registration. The movement is a living organism of which you are now part. That is why you are
required to actively involve at least 2 people, <strong> we recommend 3 up</strong>, I don't think so.
only to me, but also to the others who are part of it, guaranteeing and <strong>supporting
solidarity</strong>.
of the same.
</li>
</ol>
<p class="cltexth3 text-blue q-ma-lg">Step 3: Programming and Activation of the Billettera</p>
<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">
@@ -690,12 +648,10 @@
<li>make and finish the process in a simple, enjoyable and semi-automated way.</li>
</ul>
<p>Your Billetera will be programmed and you'll enter a chat with your fellow travellers. At the same time,
you will be informed of the date on which the billetera will be activated and on which you can donate the
33€
<p>Your Ship will be programmed and you will enter a chat with your fellow passengers. At the same time,
you will be informed of the date on which your ship will sail, i.e. when you will be able to donate the 33€
and the name and the
data of the Dreamer to give your gift to.
You will also know the dates of each of the 3 steps.
</p>
<p class="clBorderImportant" style="border-color: deepskyblue">
@@ -758,29 +714,31 @@
</CImgText>
</div>
<div v-if="showconditions">
<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 gli impegni che prendo iscrivendomi a AYNI (portare 2 persone, regalo 33
€) e di aver compreso che senza non verrò inserito in programmazione.
<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>dichiaro di aver ben compreso che <strong>non è un fondo di investimento e che il mio regalo è a fondo
perduto</strong>
<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>
<li>dichiaro di aver ben compreso che devo <strong>partecipare almeno ad uno ZOOM</strong>
(Video-Conferenza
On Line)
(Video-Conferenza On Line)
</li>
<li>dichiaro di aver ben compreso che per la mia sicurezza devo aprire un <strong>conto Paypal</strong>
per
consegnare il regalo.
per consegnare il regalo.
</li>
</ul>
</div>
@@ -804,6 +762,11 @@
<li>Declaro haber entendido bien que por mi seguridad tengo que abrir una <strong>cuenta de
Paypal</strong> para entregar el regalo.
</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>
@@ -826,6 +789,11 @@
<li>Eu declaro que compreendi bem que para minha segurança tenho que abrir uma <strong>conta Paypal</strong>.
para entregar o presente.
</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')">
@@ -848,6 +816,11 @@
<li>Je déclare avoir bien compris que pour ma sécurité, je dois ouvrir un compte <strong>paypal</strong>.
pour livrer le cadeau.
</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>
@@ -861,8 +834,8 @@
33 €) 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 is deep
lost</strong>
<li>I declare that I have well understood that <strong>is not an investment fund and that my gift is
non-refundable</strong>
</li>
<li>I declare that I have well understood that I must <strong>participate at least in one ZOOM</strong>
@@ -870,20 +843,26 @@
</li>
<li>I declare to have well understood that for my safety I have to open a <strong>paypal</strong> account
for
deliver the gift.
for deliver the gift.
</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>
<q-checkbox
class="bg-grey-4"
v-model="myguideline"
color="primary"
@input="changeval"
:label="$t('steps.read_guidelines')">
<div v-if="showconditions">
<q-checkbox
class="bg-grey-4"
v-model="myguideline"
color="primary"
@input="changeval"
:label="$t('steps.read_guidelines')">
</q-checkbox>
</q-checkbox>
</div>
</div>
</div>

View File

@@ -1,8 +1,8 @@
<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>
<q-icon v-if="icon" size="lg" :name="icon" color="green"></q-icon>
<q-chip dense color="blue" text-color="white" class="q-ml-sm">{{text}}</q-chip>
</div>
</div>
</template>

View File

@@ -16,6 +16,7 @@ export default class CLineChart extends Vue {
@Prop({ required: false, default: false }) public sum: boolean
@Prop({ required: false, default: '' }) public title: string
@Prop({ required: false, default: null }) public mycolors
@Prop({ required: false, default: 0 }) public offset
get tools() {
return tools
@@ -33,6 +34,8 @@ export default class CLineChart extends Vue {
this.mydatafixed = {}
let somma = 0
if (this.sum)
somma = this.offset
for (const rec of this.mydata) {
if (this.sum) {
@@ -48,4 +51,8 @@ export default class CLineChart extends Vue {
return this.mydatafixed
}
get getoffset() {
return this.offset
}
}

View File

@@ -1,6 +1,6 @@
<template>
<div>
<line-chart :width="tools.getwidthscale(mythis, 350, 400)+`px`" :title="title" :data="getmydata" :round="0" :colors="mycolors"></line-chart>
<line-chart :width="tools.getwidthscale(mythis, 350, 400)+`px`" :title="title" :data="getmydata" :offset="getoffset" :round="0" :colors="mycolors"></line-chart>
</div>
</template>

View File

@@ -18,9 +18,12 @@ import { tools } from '../../store/Modules/tools'
import { lists } from '../../store/Modules/lists'
import { shared_consts } from '../../common/shared_vuejs'
import { CMyRequirement } from '../CMyRequirement'
import { CRequisiti } from '../CRequisiti'
import { CCardState } from '../CCardState'
import { CMyNave } from '../CMyNave'
@Component({
components: { CProfile, CTitleBanner, CMyFieldDb, CCopyBtn, CUserBadge, CLegenda, CRequisito, CMyRequirement }
components: { CProfile, CTitleBanner, CMyFieldDb, CCopyBtn, CUserBadge, CLegenda, CRequisito, CMyRequirement, CRequisiti, CCardState, CMyNave }
})
export default class CMyDashboard extends MixinUsers {
@@ -37,7 +40,8 @@ export default class CMyDashboard extends MixinUsers {
numpeople_aportador: 0,
downline: [],
downnotreg: [],
downbyuser: []
downbyuser: [],
arrnavi: []
}
@Prop({ required: true }) public username
@@ -70,7 +74,7 @@ export default class CMyDashboard extends MixinUsers {
this.myusername = this.username
await UserStore.actions.getDashboard({ username: this.myusername }).then((ris) => {
this.dashboard = UserStore.state.my.dashboard
this.dashboard = ris
})
}
@@ -90,4 +94,19 @@ export default class CMyDashboard extends MixinUsers {
this.seluser = user
}
get Completato7Req() {
// return tools.Is7ReqOk(this.dashboard.myself)
return this.dashboard.myself.qualified
}
get Completato9Req() {
// return tools.Is9ReqOk(this.dashboard.myself)
return this.dashboard.myself.qualified && (this.dashboard.myself.numinvitatiattivi >= 2)
}
public HasNave() {
return this.dashboard.arrnavi.length > 0
}
}

View File

@@ -1,5 +1,39 @@
<template>
<div class="q-ma-xs q-gutter-xs q-pa-xs" v-if="myusername !== ''">
<div class="q-my-xs q-gutter-xs q-py-xs" v-if="myusername !== ''">
<CTitleBanner class="q-pa-xs text-center" :title="$t('pages.statoattuale')" bgcolor="bg-red" clcolor="text-white"
mystyle=" " myclass="myshad">
<div v-if="!!dashboard.myself.name">
<div v-if="!Completato9Req">
<CTitleBanner icon="person" :canopen="true" class="q-pa-xs text-center"
:title="$t('pages.posizione_in_programmazione')" bgcolor="bg-blue"
clcolor="text-white" mystyle=" " myclass="myshad">
<CRequisiti :statebool="Completato7Req" :msgTrue="$t('steps.enter_prog_requisiti_ok')"
:msgFalse="$t('steps.enter_prog_completa_requisiti')">
</CRequisiti>
</CTitleBanner>
</div>
<CTitleBanner icon="fas fa-gift" :canopen="true" class="q-pa-xs text-center"
:title="$t('pages.posizione_in_nave')" bgcolor="bg-green"
clcolor="text-white" mystyle=" " myclass="myshad">
<div v-if="!HasNave">
<CRequisiti :statebool="Completato9Req" :msgTrue="$t('steps.enter_nave_9req_ok')"
:color_ko="true"
:msgFalse="$t('steps.enter_nave_9req_ko')">
</CRequisiti>
</div>
<CMyNave v-for="(mianave, index) in dashboard.arrnavi" :naveprop="mianave" :key="index"
:navi_partenzaprop="dashboard.navi_partenza">
</CMyNave>
</CTitleBanner>
</div>
</CTitleBanner>
<CTitleBanner class="q-pa-xs" :title="$t('pages.dashboard')" bgcolor="bg-info" clcolor="text-white"
mystyle=" " myclass="myshad">
@@ -75,7 +109,7 @@
</q-btn>
</div>
<CTitleBanner v-if="invitatinotreg" class="shadow-2 rounded-borders" :title="$t('dashboard.downnotreg')"
<!--<CTitleBanner v-if="invitatinotreg" class="shadow-2 rounded-borders" :title="$t('dashboard.downnotreg')"
bgcolor="bg-grey"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
@@ -88,7 +122,7 @@
</CUserBadge>
</div>
</q-list>
</CTitleBanner>
</CTitleBanner>-->
</CTitleBanner>
@@ -119,12 +153,35 @@
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<p class="q-ml-sm">{{ $t('dashboard.legenda_title')}}</p>
<q-list bordered class="rounded-borders row justify-between">
<CLegenda icon="fab fa-telegram" :text="`Telegram ` + $t('pages.statusreg.verified')"></CLegenda>
<q-list bordered class="rounded-borders justify-center q-pa-sm">
<div class="row items-center q-pa-xs">
<CCardState :mytext="$t('pages.statusreg.req')" :myval="7" :myperc="(7 / 9) * 100" size="50px" size_mob="40px"
fontsize="0.75rem" myclass="my-card-small-stat" mycolor="orange">
</CCardState>
<div class="bg-blue text-white clBorderxs q-ml-sm">{{$t('pages.statusreg.req7')}}</div>
</div>
<div class="row items-center q-pa-xs">
<CCardState :mytext="$t('pages.statusreg.req')" :myval="9" :myperc="100" size="50px" size_mob="40px"
fontsize="0.75rem" myclass="my-card-small-stat" mycolor="green"></CCardState>
<div class="bg-blue text-white clBorderxs q-ml-sm">{{$t('pages.statusreg.req9')}}</div>
</div>
<div class="row items-center q-pa-xs">
<CCardState :mytext="$t('pages.statusreg.people')" :myval="2" :myperc="100" size="50px" size_mob="40px"
fontsize="0.75rem" myclass="my-card-small-stat" mycolor="green"></CCardState>
<div class="bg-blue text-white clBorderxs q-ml-sm">{{$t('pages.statusreg.peoplelegend')}}</div>
</div>
<!--<CLegenda icon="fab fa-telegram" :text="`Telegram ` + $t('pages.statusreg.verified')"></CLegenda>
<CLegenda icon="fas fa-video" :text="$t('stat.zoom')"></CLegenda>
<CLegenda icon="fas fa-user-friends" :text="$t('dashboard.numinvitati')"></CLegenda>
<CLegenda icon="fab fa-whatsapp" :text="$t('dashboard.telefono_wa')"></CLegenda>
<CLegenda icon="fas fa-user-friends" :text="$t('dashboard.numinvitati')"></CLegenda>-->
<div class="row items-center q-pa-xs q-ml-sm">
<q-btn
fab-mini
icon="fab fa-whatsapp"
color="white" text-color="green"
size="sm">
</q-btn>
<div class="bg-blue text-white clBorderxs q-ml-sm">{{$t('dashboard.telefono_wa')}}</div>
</div>
</q-list>
</CTitleBanner>
<br>

View File

@@ -11,10 +11,11 @@ import { IColGridTable } from '../../model'
import { CMySelect } from '../CMySelect'
import { GlobalStore, UserStore } from '../../store/Modules'
import { CMyChipList } from '../CMyChipList'
import { CMyToggleList } from '../CMyToggleList'
@Component({
name: 'CMyFieldDb',
components: { CMyEditor, CMySelect, CMyChipList }
components: { CMyEditor, CMySelect, CMyChipList, CMyToggleList }
})
export default class CMyFieldDb extends MixinBase {

View File

@@ -197,6 +197,15 @@
</div>
<div v-else-if="col.fieldtype === tools.FieldType.multiselect">
<CMyToggleList :label="col.title"
:options="db_fieldsTable.getTableJoinByName(col.jointable)"
:value.sync="myvalue"
:optval="db_fieldsTable.getKeyByTable(col.jointable)"
:optlab="db_fieldsTable.getLabelByTable(col.jointable)"
:isarray="true">
</CMyToggleList>
<!--
<q-select
v-model="myvalue"
rounded
@@ -214,6 +223,7 @@
>
</q-select>
-->
</div>
<div v-else-if="col.fieldtype === tools.FieldType.multioption">
</div>

View File

@@ -0,0 +1,73 @@
.donatore, .mediatore, .sognatore {
padding: 4px;
margin: 4px;
color: white;
font-size: 1.25rem;
border-radius: 16px;
}
.donatore {
background-color: #2ba0fd;
}
.mediatore {
background-color: red;
}
.sognatore {
background-color: green;
}
.cont_donatore, .cont_sognatore, .cont_mediatore, .cont_tragitto, .cont_pos, .cont_intestaz, .cont_pos_intest, .cont_intestaz_small {
border: solid 2px #4198ef;
padding: 4px;
margin: 4px;
font-size: 1rem;
border-radius: 16px;
}
.you {
background-color: yellow;
}
.cont_tragitto{
color: blue;
}
.cont_pos, .cont_pos_intest{
padding-left: 12px;
padding-right: 12px;
border-radius: 64px !important;
color: red;
}
.cont_pos_intest {
width: 37px;
font-size: 0.75rem;
}
.extra{
opacity: 0.6;
}
.passo{
font-weight: bold;
width: 100px;
}
.gift{
margin: 4px;
}
.cont_intestaz, .cont_intestaz_small{
font-size: 0.75rem;
margin: 4px;
border-radius: 16px !important;
}
.cont_intestaz_small{
margin: 0;
margin-top: 4px;
margin-bottom: 4px;
}

View File

@@ -0,0 +1,255 @@
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'
import MixinNave from '../../mixins/mixin-nave'
import { CTitleBanner } from '../CTitleBanner'
import { UserStore } from '../../store/Modules'
import { lists } from '../../store/Modules/lists'
import translate from '../../globalroutines/util'
@Component({
components: { CTitleBanner },
})
export default class CMyNave extends MixinNave {
@Prop({ required: true }) public naveprop
@Prop({ required: true }) public navi_partenzaprop: any[]
public navi_partenza: any[]
public $t
public link_chat: string = ''
public cosa: string = 'tragitto'
public nave: any = null
public numpercorso = 7
public riga: number = 1
public col: number = 1
public rigadoni: number = 1
public coldoni: number = 1
public mediatore: any = {}
public tragitto = [
{
ind: 7,
color: 'purple',
title_lang: 'dashboard.sognatore',
extracl: ''
},
{
ind: 6,
color: 'indigo',
title_lang: 'dashboard.pos6',
extracl: 'extra'
},
{
ind: 5,
color: 'blue',
title_lang: 'dashboard.pos5',
extracl: 'extra'
},
{
ind: 4,
color: 'green',
title_lang: 'dashboard.mediatore',
extracl: ''
},
{
ind: 3,
color: 'yellow',
title_lang: 'dashboard.pos3',
extracl: 'extra'
},
{
ind: 2,
color: 'orange',
title_lang: 'dashboard.pos2',
extracl: 'extra'
},
{
ind: 1,
color: 'red',
title_lang: 'dashboard.donatore',
extracl: ''
},
]
public mounted() {
this.nave = this.naveprop
this.navi_partenza = this.navi_partenzaprop
this.riga = tools.getValDb('riga', false, 1)
this.col = tools.getValDb('col', false, 1)
this.rigadoni = tools.getValDb('rigadoni', false, 1)
this.coldoni = tools.getValDb('coldoni', false, 1)
this.mediatore = this.getmediatore()
if (!!this.mediatore) {
this.link_chat = this.mediatore.link_chat
}
}
public getNavePartByInd(ind) {
if (!!this.navi_partenza[ind])
return this.navi_partenza[ind].date_start
else
return ' --/--/-- '
}
public getRiganave(riga) {
let ris = riga - 3
if (ris <= 1)
ris = 1
return ris
}
public getColnave(col) {
let ris = Math.floor(col / (2 * 4))
if (ris <= 1)
ris = 1
return ris
}
public sonoMediatore() {
if (!!this.nave) {
if (!!this.nave.rec.donatore.recmediatore)
return this.nave.rec.donatore.recmediatore.ind_order === this.nave.ind_order
else {
if (!!this.nave.rec.mediatore.recmediatore)
return this.nave.rec.mediatore.recmediatore.ind_order === this.nave.ind_order
}
}
return false
}
public sonoDonatore() {
if (!!this.nave) {
for (const rec of this.nave.rec.donatore.arrdonatori) {
if (!!rec) {
if (rec.ind_order === this.nave.ind_order)
return true
}
}
}
return false
}
public getmediatore() {
return this.nave.rec.donatore.recmediatore
}
public change_link_chat() {
const recmed = this.getmediatore()
if (recmed.link_chat !== this.link_chat) {
recmed.link_chat = this.link_chat
const mydata = {
link_chat: recmed.link_chat
}
tools.saveFieldToServer(this, 'navi', recmed._id, mydata)
}
}
get linkchatopen() {
return this.link_chat
}
public sonoSognatore() {
return this.nave.rec.donatore.recsognatore.ind_order === this.nave.ind_order
}
public getclassSelect(rec) {
if (rec.ind_order === this.nave.ind_order)
return ' you'
}
public gettitlenave(ind) {
if (ind === 1)
return this.getRiganave(this.nave.riga) + '.' + this.getColnave(this.nave.col)
else
return (this.getrigaNaveByInd(ind)) + '.x'
}
public getdatanave(rec) {
if (this.sonoDonatore()) {
if (rec.ind === 1) {
return tools.getstrshortDate(this.nave.date_start) // Donatore
}
}
if (this.sonoMediatore()) {
if (rec.ind === 4) {
return tools.getstrshortDate(this.nave.date_start) // Mediatore
}
}
return this.getNavePartByInd(rec.ind)
}
public getrigaNaveByInd(ind) {
return this.getRiganave(this.nave.riga + ind - 1)
}
public NaveeseguitabyInd(riga) {
return (this.riga >= riga)
}
public getclpos(rec) {
if (this.NaveeseguitabyInd(this.getrigaNaveByInd(rec.ind))) {
return 'you'
} else {
return ''
}
}
public geticon(rec) {
if (this.rigadoni >= this.getrigaNaveByInd(rec.ind)) {
return 'fas fa-gift'
}
}
public async InviaMsgANave(msgobj, navemediatore) {
let msgtitle = translate('dashboard.controlla_donatori')
if (msgobj.inviareale) {
msgtitle = translate('dashboard.invia_link_chat')
}
await tools.askConfirm(this.$q, msgtitle, translate('dashboard.inviare_msg_donatori') + ' ' + '?', translate('dialog.yes'), translate('dialog.no'), this, '', lists.MenuAction.INVIA_MSG_A_DONATORI, 0, {
param1: msgobj,
param2: navemediatore
})
}
public async InviaMsgADonatori(msgobj) {
const navemediatore = {
id: this.mediatore._id,
riga: this.mediatore.riga,
col: this.mediatore.col
}
this.InviaMsgANave(msgobj, navemediatore)
}
get linkchatesiste() {
if (!!this.linkchatopen)
return this.linkchatopen.length > 10
return false
}
public InviaLinkChatADonatori(inviareale) {
const msgobj = {
tipomsg: tools.TipoMsg.SEND_LINK_CHAT_DONATORI,
msgpar1: this.linkchatopen,
inviareale,
}
this.InviaMsgADonatori(msgobj)
}
}

View File

@@ -0,0 +1,177 @@
<template>
<div>
<CTitleBanner v-if="nave" class="q-pa-xs"
:title="$t('pages.nave') + ` ` + getRiganave(nave.riga) + `.`+getColnave(nave.col) + ` ` + $t('dashboard.nave_in_partenza') + ` ` + tools.getstrDate(nave.date_start)"
bgcolor="bg-primary"
clcolor="text-white"
mystyle="" myclass="myshad" canopen="true">
<div v-if="nave" class="flex flex-center column justify-center">
<div class="">
<!--IndPrimario: {{ nave.indprimario }} - IndOrder: {{ nave.ind_order }} -->
</div>
<q-tabs
v-model="cosa"
dense
class="text-blue"
active-color="primary"
indicator-color="primary"
align="justify"
narrow-indicator
>
<q-tab name="tragitto" label="Tragitto"></q-tab>
<q-tab name="donatore" label="Donatore"></q-tab>
<q-tab name="mediatore" label="Mediatore"></q-tab>
<q-tab name="spiegazione" label="Spiegazione"></q-tab>
</q-tabs>
<q-tab-panels v-model="cosa" animated>
<q-tab-panel name="spiegazione">
<div v-if="sonoMediatore()">
<div class="text-left" v-html="$t('dashboard.sonomediatore')"></div>
<q-input v-model="link_chat" :label="$t('dashboard.link_chat')"
debounce="1000"
input-class="myinput-area"
@input="change_link_chat">
</q-input>
<div class="">
<div class="row justify-center centermydiv q-gutter-sm" style="max-width: 420px;">
<q-btn rounded text-color="secondary" icon="fab fa-telegram"
:label="$t('dashboard.controlla_donatori')"
@click="InviaLinkChatADonatori(false)"></q-btn>
<q-btn rounded text-color="primary" icon="fab fa-telegram"
:disable="!linkchatesiste"
:label="$t('dashboard.invia_link_chat')"
@click="InviaLinkChatADonatori(true)"></q-btn>
</div>
</div>
</div>
<div v-else-if="sonoDonatore()">
<div v-html="$t('dashboard.sonosognatore')">
</div>
</div>
</q-tab-panel>
<q-tab-panel name="tragitto">
<div class="row justify-between">
<div class="cont_pos_intest">N</div>
<div class="cont_intestaz q-mx-sm"> Nome<br>dei Passaggi</div>
<div class="cont_intestaz">Nave</div>
<div class="cont_intestaz">Data<br>Partenza</div>
<div class="cont_intestaz_small">Doni<br>Inviati</div>
</div>
<div v-for="rec in tragitto" :key="rec.ind">
<div :class="`row items-center ` + rec.extracl">
<div :class="`cont_pos ` + getclpos(rec)">
{{ rec.ind }}
</div>
<div v-if="rec.title_lang" class="passo">
<div :class="rec.extracl">
<q-chip class="glossy" :color="rec.color" text-color="white">
{{ $t(rec.title_lang) }}
</q-chip>
</div>
</div>
<div class="">
<q-chip class="glossy" :color="rec.color" text-color="white">
{{ gettitlenave(rec.ind) }}
</q-chip>
</div>
<div class="">
<q-chip class="glossy" :color="rec.color" text-color="white">
{{ getdatanave(rec) }}
</q-chip>
</div>
<q-icon color="green" inverted size="sm" :name="geticon(rec)" class="gift"></q-icon>
</div>
</div>
<div class="q-ma-md q-butter-sm" v-if="!!linkchatopen">
Per entrare nella Gift Chat, clicca qui:<br>
<div class="q-ma-md">
<q-btn rounded color="primary" icon="fab fa-telegram" :label="$t('dashboard.entra_in_gift_chat')"
type="a"
:href="linkchatopen" target="_blank"></q-btn>
<br>
</div>
</div>
</q-tab-panel>
<q-tab-panel name="donatore">
<div v-if="nave.rec.donatore.recsognatori">
<div class="sognatore">SOGNATORI:</div>
<div v-for="(sognatore, index) in nave.rec.donatore.recsognatori" :key="10+index">
<div v-if="sognatore" :class="`cont_sognatore ` + getclassSelect(sognatore)">
A{{3 - index}} - {{ sognatore.name }} {{ sognatore.surname }} ({{sognatore.username }})
</div>
</div>
<div class="">
<div class="mediatore">MEDIATORE:</div>
<div :class="`cont_mediatore ` + getclassSelect(nave.rec.donatore.recmediatore)">
{{ nave.rec.donatore.recmediatore.name }} {{ nave.rec.donatore.recmediatore.surname }} ({{
nave.rec.donatore.recmediatore.username }})
</div>
</div>
<div class="donatore">DONATORI:</div>
<div v-for="(donatore, index) in nave.rec.donatore.arrdonatori" :key="index">
<div v-if="donatore" :class="`cont_donatore ` + getclassSelect(donatore)">
D{{index + 1}} - {{ donatore.name }} {{ donatore.surname }} ({{ donatore.username }}) {{
donatore.riga}}.{{donatore.col}}<br>
</div>
</div>
</div>
</q-tab-panel>
<q-tab-panel name="mediatore">
<div v-if="nave.rec.mediatore.recsognatori">
<div class="sognatore">SOGNATORI:</div>
<div v-for="(sognatore, index) in nave.rec.mediatore.recsognatori" :key="10+index">
<div v-if="sognatore" :class="`cont_sognatore ` + getclassSelect(sognatore)">
A{{3 - index}} - {{ sognatore.name }} {{ sognatore.surname }} ({{sognatore.username }})
</div>
</div>
<div class="">
<div class="mediatore">MEDIATORE:</div>
<div :class="`cont_mediatore ` + getclassSelect(nave.rec.mediatore.recmediatore)">
{{ nave.rec.mediatore.recmediatore.name }} {{ nave.rec.mediatore.recmediatore.surname }} ({{
nave.rec.mediatore.recmediatore.username }})
</div>
</div>
<div class="donatore">DONATORI:</div>
<div v-for="(donatore, index) in nave.rec.mediatore.arrdonatori" :key="index">
<div v-if="donatore" :class="`cont_donatore ` + getclassSelect(donatore)">
D{{index + 1}} - {{ donatore.name }} {{ donatore.surname }} ({{ donatore.username }}) {{
donatore.riga}}.{{donatore.col}}<br>
</div>
</div>
</div>
</q-tab-panel>
</q-tab-panels>
</div>
</CTitleBanner>
</div>
</template>
<script lang="ts" src="./CMyNave.ts">
</script>
<style lang="scss" scoped>
@import './CMyNave.scss';
</style>

View File

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

View File

@@ -96,7 +96,7 @@ export default class CMyRequirement extends MixinUsers {
isok(user) {
if (user)
if (user.profile)
return tools.isBitActive(user.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES)
return tools.isBitActive(user.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES.value)
return false
},
info: '',
@@ -110,7 +110,7 @@ export default class CMyRequirement extends MixinUsers {
isok(user) {
if (user)
if (user.profile)
return tools.isBitActive(user.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI)
return tools.isBitActive(user.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI.value)
return false
},
info: '',
@@ -171,6 +171,9 @@ export default class CMyRequirement extends MixinUsers {
},
info: '',
},
]
public arrrequisiti_liberi = [
{
icon: 'fas fa-users',
textlang: 'steps.sharemovement',
@@ -298,4 +301,11 @@ export default class CMyRequirement extends MixinUsers {
return mycl
}
public geticonerror(mybool) {
if (mybool)
return 'fas fa-exclamation-triangle'
else
return ''
}
}

View File

@@ -1,16 +1,20 @@
<template>
<div>
<CTitleBanner class="shadow-2 rounded-borders" :title="$t('reg.requirement') + ` - ` + seluser.name + ` ` + seluser.surname + ``"
<CTitleBanner class="shadow-2 rounded-borders"
:title="$t('reg.requirement') + ` - ` + seluser.name + ` ` + seluser.surname + ``"
bgcolor="bg-primary"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<div v-if="!ismyinvited_notreg(seluser)" :class="myclassreq">
<div :class="myclassreq">
<div v-if="!isextralist(seluser)">
<div v-for="(req, index) of arrrequisiti">
<CRequisito :icon="req.icon" :text="(index + 1) + `. ` + $t(req.textlang) + req.textadd(seluser)" :isok="req.isok(seluser)"
<CRequisito :icon="req.icon" :text="(index + 1) + `. ` + $t(req.textlang) + req.textadd(seluser)"
:icon_error="geticonerror(true)"
:no_check="false"
:isok="req.isok(seluser)"
:info="req.info"></CRequisito>
</div>
@@ -68,7 +72,28 @@
</div>
</div>
<div v-else>
<CTitleBanner class="shadow-2 rounded-borders"
:title="$t('steps.sharemovement') + ` - ` + seluser.name + ` ` + seluser.surname + ``"
bgcolor="bg-secondary"
clcolor="text-white"
mystyle=" " myclass="myshad" :canopen="true">
<div :class="myclassreq">
<div v-if="!isextralist(seluser)">
<div v-for="(req, index) of arrrequisiti_liberi">
<CRequisito :icon="req.icon" :text="$t(req.textlang) + req.textadd(seluser)"
:icon_error="geticonerror(false)"
:no_check="true"
:isok="req.isok(seluser)"
:info="req.info"></CRequisito>
</div>
</div>
</div>
</CTitleBanner>
<!--<div v-else>
<div class="column justify-center q-gutter-sm q-pa-sm">
<CRequisito icon="fas fa-user" :text="$t('dashboard.notreg')" :isok="false"
@@ -85,7 +110,7 @@
</CTitleBanner>
</div>
</div>
</div>-->
</CTitleBanner>

View File

@@ -16,6 +16,7 @@ export default class CMyToggleList extends Vue {
@Prop({ required: false, default: '' }) public myclass
@Prop({ required: true, default: '' }) public optlab
@Prop({ required: true, default: '' }) public optval
@Prop({ required: false, default: false }) public isarray
public myvalue = ''
public myarrvalues = []
@@ -26,7 +27,13 @@ export default class CMyToggleList extends Vue {
public changeval(newval) {
// Update value
const totale = this.myarrvalues.filter((rec) => rec.valbool).reduce((sum, rec) => sum + rec.value, 0)
let totale = null
if (this.isarray) {
totale = this.myarrvalues.filter((rec) => rec.valbool).map((a) => a.value)
} else {
totale = this.myarrvalues.filter((rec) => rec.valbool).reduce((sum, rec) => sum + rec.value, 0)
}
console.log('totale', totale)
this.myvalue = totale
// Refresh value
@@ -36,15 +43,33 @@ export default class CMyToggleList extends Vue {
public mounted() {
this.myarrvalues = []
// console.table(this.options)
this.options.forEach((rec) => {
const mydata = {
label: this.$t(rec[this.optlab]),
value: rec[this.optval],
valbool: tools.isBitActive(this.value, rec[this.optval])
}
this.myarrvalues.push(mydata)
})
// console.log('value', this.value)
// console.log('optval', this.optval)
// console.log('optlab', this.optlab)
if (this.isarray) {
// console.table(this.options)
this.options.forEach((rec) => {
console.log('rec: ', rec)
const mydata = {
label: this.$t(rec[this.optlab]),
value: rec[this.optval],
valbool: this.value.includes(rec[this.optval])
}
console.log('mydata ', mydata)
this.myarrvalues.push(mydata)
})
} else {
// console.table(this.options)
this.options.forEach((rec) => {
const mydata = {
label: this.$t(rec[this.optlab]),
value: rec[this.optval],
valbool: tools.isBitActive(this.value, rec[this.optval])
}
this.myarrvalues.push(mydata)
})
}
}
}

View File

@@ -36,7 +36,7 @@ export default class CNextZoom extends MixinBase {
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'))
// 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

View File

@@ -1,7 +1,10 @@
.requisiti_on, .requisiti_off{
.requisiti_on, .requisiti_off, .requisiti_off_ko{
margin: 4px;
border-radius: 3rem;
padding: 8px;
padding-left: 14px;
padding-right: 14px;
padding-top: 8px;
padding-bottom: 8px;
}
.requisiti_on {
@@ -12,3 +15,7 @@
border: solid 3px #ef0901;
}
.requisiti_off_ko {
border: solid 3px blue;
}

View File

@@ -9,11 +9,16 @@ export default class CRequisiti extends Vue {
@Prop({ required: true }) public statebool: boolean
@Prop({ required: true }) public msgTrue: string
@Prop({ required: true }) public msgFalse: string
@Prop({ required: false, default: false }) public color_ko: boolean
get getcl() {
if (this.statebool)
return 'requisiti_on'
else
return 'requisiti_off'
else {
if (this.color_ko)
return 'requisiti_off_ko'
else
return 'requisiti_off'
}
}
}

View File

@@ -1,5 +1,5 @@
<template>
<div class="q-ma-md">
<div class="q-ma-sm">
<div :class="getcl">
<div v-if="statebool" v-html="msgTrue"></div>
<div v-else v-html="msgFalse"></div>

View File

@@ -11,12 +11,17 @@ import MixinBase from '@src/mixins/mixin-base'
export default class CRequisito extends MixinBase {
@Prop({ required: true }) public icon: string
@Prop({ required: false, default: 'fas fa-exclamation-triangle' }) public icon_error: string
@Prop({ required: true }) public text: string
@Prop({ required: true }) public isok: boolean
@Prop({ required: false, default: false }) public no_check: boolean
@Prop({ required: true }) public info: string
get checkifok() {
return this.isok ? 'green' : 'red'
if (this.no_check)
return 'blue'
else
return this.isok ? 'green' : 'red'
}
get getris() {
@@ -24,6 +29,6 @@ export default class CRequisito extends MixinBase {
}
get iconris() {
return (this.isok) ? 'fas fa-check' : 'fas fa-exclamation-triangle'
return (this.isok) ? 'fas fa-check' : this.icon_error
}
}

View File

@@ -0,0 +1,36 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { CSignIn } from '../../components/CSignIn'
import { tools } from '../../store/Modules/tools'
@Component({
components: { CSignIn }
})
export default class CSigninNoreg extends Vue {
@Prop({ required: true }) public showregbutt: boolean
public $v
public $q
public $t
public loginOk() {
tools.loginOk(this, true)
}
public loginInCorso() {
tools.loginInCorso(this)
}
public checkErrors(riscode) {
tools.SignIncheckErrors(this, riscode, true)
}
public showNotif(msgcode) {
tools.showNotif(this.$q, this.$t(msgcode))
}
get mythis() {
return this
}
}

View File

@@ -0,0 +1,18 @@
<template>
<div>
<CSignIn :mythis="mythis"
@loginOk="loginOk"
@loginInCorso="loginInCorso"
:showregbutt="false"
@checkErrors="checkErrors"
@showNotif="showNotif">
</CSignIn>
</div>
</template>
<script lang="ts" src="./CSigninNoreg.ts">
</script>
<style lang="scss" scoped>
@import './CSigninNoreg.scss';
</style>

View File

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

View File

@@ -18,7 +18,18 @@ import { CGuidelines } from '../CGuidelines'
import { CVideoPromo } from '../CVideoPromo'
@Component({
components: { CTitleBanner, CMyFieldDb, CMyInnerPage, CVerifyTelegram, CVerifyEmail, CCopyBtn, CVideo, CRequisiti, CGuidelines, CVideoPromo }
components: {
CTitleBanner,
CMyFieldDb,
CMyInnerPage,
CVerifyTelegram,
CVerifyEmail,
CCopyBtn,
CVideo,
CRequisiti,
CGuidelines,
CVideoPromo
}
})
export default class CStatus extends MixinBase {
@@ -27,7 +38,7 @@ export default class CStatus extends MixinBase {
public $t: any
public step = 0
public steptodo = 0
public NUMSTEP_OBBLIGATORI = 9
public NUMSTEP_OBBLIGATORI = 7
public my_dream: string = ''
get numpayment() {
@@ -92,7 +103,7 @@ export default class CStatus extends MixinBase {
descr: '',
page: '',
funccheck(index) {
return tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES)
return tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES.value)
},
funccheck_error(index) {
return true
@@ -109,7 +120,7 @@ export default class CStatus extends MixinBase {
descr: '',
page: '',
funccheck(index) {
return tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI)
return tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI.value)
},
funccheck_error(index) {
return true
@@ -228,10 +239,10 @@ export default class CStatus extends MixinBase {
descr: 'steps.enter_prog_long',
page: '/enter_prog',
funccheck(index) {
return false
return true
},
funccheck_error(index) {
return false
return true
},
funcok() {
return ''
@@ -421,8 +432,20 @@ export default class CStatus extends MixinBase {
}
}
public geterricon(value) {
return 'fas fa-exclamation-triangle'
public geterrcolor(mystep) {
if ((mystep.title === 'steps.sharemovement') || (mystep.title === 'dashboard.inv_attivi')) {
return 'blue'
} else {
return 'red'
}
}
public geterricon(value, mystep) {
if ((mystep.title === 'steps.sharemovement') || (mystep.title === 'dashboard.inv_attivi')) {
return 'fas fa-user'
} else {
return 'fas fa-exclamation-triangle'
}
}
get listasel() {
@@ -456,6 +479,10 @@ export default class CStatus extends MixinBase {
}
public geticoncolor(title) {
if (title === 'steps.enter_prog') {
return this.CompletatoRequisiti ? 'blue' : (this.Completato9Req ? 'green' : 'blue')
}
if (title === 'steps.chat_biblio') {
return 'blue'
} else {
@@ -478,7 +505,21 @@ export default class CStatus extends MixinBase {
}
get CompletatoRequisiti() {
return this.VistoZoom && this.getnuminvitati_attivi() >= 2 && this.RequisitoPayment
try {
return this.VistoZoom && this.RequisitoPayment &&
this.TelegVerificato &&
(UserStore.state.my.profile.my_dream.length >= 10) &&
tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI.value) &&
tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES.value)
}catch (e) {
return false
}
}
get Completato9Req() {
// return tools.Is9ReqOk(this.dashboard.myself)
return this.CompletatoRequisiti && (this.getnuminvitati_attivi() >= 2)
}
get RequisitoPayment() {
@@ -519,12 +560,12 @@ export default class CStatus extends MixinBase {
}
get stepcompleti() {
return this.getstep === this.NUMSTEP_OBBLIGATORI
return this.getstep >= this.NUMSTEP_OBBLIGATORI
}
public scrolltostep(mystep) {
this.step = mystep
if (mystep > 0 )
if (mystep > 0)
mystep -= 1
const element = document.getElementById('step' + mystep)
tools.scrollToElement(element)

View File

@@ -54,7 +54,8 @@
:done-color="geticoncolor(mystep.title)"
:done="mystep.funccheck(index)"
:error="getiferror(mystep.funccheck_error(index), mystep.funccheck(index))"
:error-icon="geterricon(mystep.funccheck(index))"
:error-icon="geterricon(mystep.funccheck(index), mystep)"
:error-color="geterrcolor(mystep)"
>
<div v-if="mystep.title === 'reg.email'">
<CVerifyEmail>
@@ -138,6 +139,10 @@
<div>
<CRequisiti :statebool="RequisitoPayment" :msgTrue="$t('steps.paymenttype_long2')"
:msgFalse="$t('steps.paymenttype_long2')">
</CRequisiti>
<CMyFieldDb :title="$t('reg.paymenttype')"
table="users"
mykey="profile"
@@ -259,9 +264,9 @@
</div>
<div v-else-if="mystep.title === 'steps.sharemovement'">
<CRequisiti :statebool="getnuminvitati() >= 2" :msgTrue="$t('steps.sharemovement_hai_invitato')"
<!--<CRequisiti :statebool="getnuminvitati() >= 2" :msgTrue="$t('steps.sharemovement_hai_invitato')"
:msgFalse="$t('steps.sharemovement_devi_invitare_almeno_2')">
</CRequisiti>
</CRequisiti>-->
<q-btn class="q-mb-md" rounded size="md" color="primary" to="/dashboard"
:label="$t('pages.dashboard')"></q-btn>
@@ -318,8 +323,9 @@
:msgFalse="$t('steps.enter_prog_completa_requisiti')">
</CRequisiti>
<CRequisiti :statebool="CompletatoRequisiti" :msgTrue="$t('steps.enter_prog_status')"
:msgFalse="$t('steps.enter_prog_status')">
<CRequisiti v-if="Completato9Req" :statebool="Completato9Req" :msgTrue="$t('steps.enter_nave_9req_ok')"
:msgFalse="$t('steps.enter_nave_9req_ko')">
</CRequisiti>
</div>

View File

@@ -100,7 +100,7 @@ export default class CStatusReg extends MixinBase {
UserStore.state.my.verified_email = true
this.riaggiorna()
}
if (UserStore.state.my.profile) {
if (UserStore.state.my.profile && this.datastat.checkuser.profile) {
if ((UserStore.state.my.profile.teleg_id <= 0 && this.datastat.checkuser.profile.teleg_id > 0) ||
(UserStore.state.my.profile.teleg_id !== this.datastat.checkuser.profile.teleg_id > 0)) {
UserStore.state.my.profile.teleg_id = this.datastat.checkuser.profile.teleg_id

View File

@@ -10,7 +10,7 @@
<CCardState :mytext="$t('pages.statusreg.reg')" :myval="datastat.num_reg" :myperc="100"></CCardState>
<CCardState :mytext="$t('stat.requisiti')" :isperc="true" :myval="datastat.num_requisiti"
:myperc="calcperc(datastat.num_requisiti, datastat.num_reg) "
color="blue"
mycolor="blue"
:textadd="` / ` + datastat.num_reg"></CCardState>
<!--<CCardState :mytext="$t('pages.statusreg.giainlista')" :isperc="true" :myval="datastat.num_reg_lista"-->
@@ -22,7 +22,7 @@
<CCardStat :mytext="$t('stat.dream')" :myval="datastat.num_users_dream"></CCardStat>
<CCardStat :mytext="$t('stat.modalita_pagamento')" :myval="datastat.num_modalita_pagamento"></CCardStat>
<CCardStat :mytext="$t('stat.requisiti')" :myval="datastat.num_requisiti"></CCardStat>
<CCardStat :mytext="$t('stat.qualificati')" :myval="datastat.num_qualificati"></CCardStat>
<!--<CCardStat :mytext="$t('stat.qualificati')" :myval="datastat.num_qualificati"></CCardStat>-->
<CCardStat v-if="emailnonverif" :mytext="$t('stat.email_not_verif')" :myval="emailnonverif"
mycol="negative"></CCardStat>
<CCardStat v-if="telegnonattivi" :mytext="$t('stat.telegram_non_attivi')" :myval="telegnonattivi"
@@ -37,6 +37,7 @@
appear
enter-active-class="animazione fadeIn"
leave-active-class="animazione fadeOut">
<q-item v-for="(user, index) in lastsreg" :key="user.username" class="q-mb-xs animated" v-ripple>
<q-item-section avatar>
@@ -72,7 +73,7 @@
<CLineChart :mydata="datastat.reg_daily" :title="$t('stat.reg_daily')">
</CLineChart>
<CLineChart :mydata="datastat.reg_daily" :title="$t('stat.reg_total')" :sum="true"
<CLineChart :mydata="datastat.reg_daily" :title="$t('stat.reg_total')" :offset="datastat.numreg_untilday" :sum="true"
:mycolors="['#0b0', '#666']">
</CLineChart>

View File

@@ -8,10 +8,13 @@ import { validationMixin } from 'vuelidate'
import MixinBase from '../../mixins/mixin-base'
import { IUserFields } from '../../model'
import { shared_consts } from '../../common/shared_vuejs'
import { tools } from '../../store/Modules/tools'
import { CCardState } from '../CCardState'
@Component({
name: 'CUserBadge',
components: { }
components: { CCardState }
})
export default class CUserBadge extends MixinBase {
@@ -69,15 +72,15 @@ export default class CUserBadge extends MixinBase {
if (this.isextralist(user))
return 'grey'
else
return (this.getnumpeople() >= 2) ? 'green' : 'grey'
return (this.getnumpeople(user) >= 2) ? 'green' : 'grey'
}
public isextralist(user) {
return !!user.cell_complete
}
public getnumpeople() {
return this.numpeople
public getnumpeople(user) {
return user.numinvitati
}
public getusername(user) {
@@ -92,4 +95,52 @@ export default class CUserBadge extends MixinBase {
this.$emit('myclick', user)
}
public getnumreq(user) {
let val = tools.getnumrequisiti(user)
if (val === 7) {
val += user.numinvitati >= 2 ? 1 : 0
val += user.numinvitatiattivi >= 2 ? 1 : 0
}
return val
}
public getnumperc(user) {
let perc = (this.getnumreq(user) / 9) * 100
// console.log('numperc', perc)
return perc
}
public getnumpercpeople(user) {
if (user.numinvitati > 2)
return 100
else
return (user.numinvitati / 2) * 100
}
public getcolorpeople(user){
if (user.numinvitati === 1)
return 'blue'
else if (user.numinvitati === 2)
return 'green'
else if (user.numinvitati > 2)
return 'green'
}
public getcolor(user) {
let mycol = this.getnumreq(user) === 7 ? 'orange' : 'red'
if (user.numinvitati >= 2) {
mycol = 'blue'
}
if (user.numinvitatiattivi >= 2) {
mycol = 'green'
}
return mycol
}
}

View File

@@ -15,7 +15,7 @@
<q-item-section>
<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>
<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>
@@ -23,18 +23,24 @@
<q-item-section side>
<div class="row q-gutter-xs justify-center items-center">
<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(user)"></q-icon>
<div>
<CCardState :mytext="$t('pages.statusreg.req')" :myval="getnumreq(user)" :myperc="getnumperc(user)" size="50px" size_mob="40px" fontsize="0.75rem" myclass="my-card-small-stat" :mycolor="getcolor(user)"></CCardState>
</div>
<!--<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>-->
<div>
<CCardState :mytext="$t('pages.statusreg.people')" :myval="getnumpeople(user)" :myperc="getnumpercpeople(user)" size="50px" size_mob="40px" fontsize="0.75rem" myclass="my-card-small-stat" :mycolor="getcolorpeople(user)"></CCardState>
</div>
<div>
<q-btn
fab-mini
icon="fab fa-whatsapp"
color="white" text-color="green" type="a"
size="sm"
:href="tools.getHttpForWhatsapp(user.profile.cell)" target="__blank">
</q-btn>
</div>
</div>
</q-item-section>
</q-item>

View File

@@ -32,14 +32,14 @@ export default class CVideoPromo extends MixinBase {
}
public aggiorna() {
this.accetta_saw_video = tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI)
this.accetta_saw_video = tools.isBitActive(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI.value)
}
public changeval(value) {
if (value)
UserStore.state.my.profile.saw_and_accepted = tools.SetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI)
UserStore.state.my.profile.saw_and_accepted = tools.SetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI.value)
else
UserStore.state.my.profile.saw_and_accepted = tools.UnSetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI)
UserStore.state.my.profile.saw_and_accepted = tools.UnSetBit(UserStore.state.my.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI.value)
const mydata = {
'profile.saw_and_accepted': UserStore.state.my.profile.saw_and_accepted

View File

@@ -13,17 +13,17 @@ import { toolsext } from '@src/store/Modules/toolsext'
import Quasar, { Screen } from 'quasar'
import { static_data } from '../../db/static_data'
import globalroutines from '../../globalroutines'
import MixinUsers from '../../mixins/mixin-users'
import { CMyAvatar } from '../CMyAvatar'
import { CSigninNoreg } from '../CSigninNoreg'
@Component({
name: 'Header',
mixins: [MixinUsers],
components: {
drawer,
messagePopover, CSignIn, CMyAvatar
messagePopover, CSigninNoreg, CMyAvatar
}
})
@@ -345,22 +345,6 @@ export default class Header extends Vue {
return UserStore.state.my.verified_email
}
public loginOk() {
tools.loginOk(this, true)
}
public loginInCorso() {
tools.loginInCorso(this)
}
public checkErrors(riscode) {
tools.SignIncheckErrors(this, riscode)
}
public showNotif(msgcode) {
tools.showNotif(this.$q, this.$t(msgcode))
}
get mythis() {
return this
}

View File

@@ -1,192 +1,188 @@
<template>
<div>
<q-header reveal elevated :class="getClassColorHeader">
<q-toolbar
color="primary"
:glossy="$q.theme === 'mat'"
:inverted="$q.theme === 'ios'"
class="toolbar">
<div>
<q-header reveal elevated :class="getClassColorHeader">
<q-toolbar
color="primary"
:glossy="$q.theme === 'mat'"
:inverted="$q.theme === 'ios'"
class="toolbar">
<q-btn
flat
dense
round
@click="leftDrawerOpen = !leftDrawerOpen"
aria-label="Menu">
<q-icon name="menu"/>
</q-btn>
<q-btn
flat
dense
round
@click="leftDrawerOpen = !leftDrawerOpen"
aria-label="Menu">
<q-icon name="menu"/>
</q-btn>
<div v-if="$q.platform.is.desktop">
<!--I'm only rendered on desktop!-->
</div>
<div v-if="$q.platform.is.desktop">
<!--I'm only rendered on desktop!-->
</div>
<div v-if="$q.platform.is.mobile">
<!--I'm only rendered on mobile!-->
</div>
<div v-if="$q.platform.is.mobile">
<!--I'm only rendered on mobile!-->
</div>
<div v-if="$q.platform.is.electron">
<!--I'm only rendered on Electron!-->
</div>
<div v-if="$q.platform.is.electron">
<!--I'm only rendered on Electron!-->
</div>
<q-btn ripple
size="md"
id="newvers" v-if="isNewVersionAvailable" color="secondary" rounded icon="refresh"
class="btnNewVersShow" @click="RefreshApp" :label="$t('notification.newVersionAvailable')"/>
<q-btn ripple
size="md"
id="newvers" v-if="isNewVersionAvailable" color="secondary" rounded icon="refresh"
class="btnNewVersShow" @click="RefreshApp" :label="$t('notification.newVersionAvailable')"/>
<q-toolbar-title class="row items-center">
<q-avatar>
<img :src="imglogo" height="27" alt="Immagine Logo">
</q-avatar>
<div class="q-mx-sm">{{getappname}}</div>
<div slot="subtitle">{{$t('msg.myDescriz')}} {{ getAppVersion() }}</div>
</q-toolbar-title>
<q-toolbar-title class="row items-center">
<q-avatar>
<img :src="imglogo" height="27" alt="Immagine Logo">
</q-avatar>
<div class="q-mx-sm">{{getappname}}</div>
<div slot="subtitle">{{$t('msg.myDescriz')}} {{ getAppVersion() }}</div>
</q-toolbar-title>
<!--
<div v-if="isAdmin">
<q-btn flat dense round aria-label="">
<q-icon :class="clCloudUpload" nametranslate="cloud_upload"></q-icon>
</q-btn>
<!--
<div v-if="isAdmin">
<q-btn flat dense round aria-label="">
<q-icon :class="clCloudUpload" nametranslate="cloud_upload"></q-icon>
</q-btn>
<q-btn flat dense round aria-label="">
<q-icon :class="clCloudUp_Indexeddb" nametranslate="arrow_upward"></q-icon>
</q-btn>
<q-btn flat dense round aria-label="">
<q-icon :class="clCloudUp_Indexeddb" nametranslate="arrow_upward"></q-icon>
</q-btn>
</div>
-->
</div>
-->
<q-btn
v-if="!isonline && static_data.functionality.SHOW_IF_IS_SERVER_CONNECTION"
flat
dense
round
@click=""
aria-label="Connection"
>
<q-icon :name="iconConn" :class="clIconConn"></q-icon>
<q-icon v-if="isUserNotAuth" name="device_unknown"></q-icon>
</q-btn>
<q-btn-dropdown
stretch
v-if="static_data.lang_available.length > 1"
flat
:label="langshort"
auto-close
>
<q-list bordered>
<q-item clickable v-ripple
v-for="langrec in static_data.lang_available" :key="langrec.value"
@click="lang = langrec.value">
<q-item-section avatar>
<img :src="langrec.image" class="flagimg" alt="flag">
</q-item-section>
<q-item-section>
{{langrec.label}}
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
<div v-if="static_data.functionality.SHOW_MESSAGES">
<message-popover></message-popover>
</div>
<!--
<div class="right-itens">
<label>{{ $t('msg.hello') }}</label> <span v-model="prova"></span> !
</div>-->
<!-- BUTTON USER BAR -->
<q-btn class="q-mx-xs" v-if="static_data.functionality.SHOW_USER_MENU && !isLogged" dense flat round
icon="menu"
@click="rightDrawerOpen = !rightDrawerOpen">
</q-btn>
<q-btn class="q-mx-xs" v-if="static_data.functionality.SHOW_USER_MENU && isLogged" round dense flat
@click="rightDrawerOpen = !rightDrawerOpen">
<CMyAvatar :myimg="getMyImg"></CMyAvatar>
</q-btn>
</q-toolbar>
</q-header>
<q-drawer side="left"
bordered
show-if-above
:breakpoint="500"
v-model="leftDrawerOpen"
:content-class="['bg-grey-1', 'q-pa-sm']"
:content-style="{padding: '0px'}"
<q-btn
v-if="!isonline && static_data.functionality.SHOW_IF_IS_SERVER_CONNECTION"
flat
dense
round
@click=""
aria-label="Connection"
>
<drawer :clBase="clBase"></drawer>
<q-icon :name="iconConn" :class="clIconConn"></q-icon>
<q-icon v-if="isUserNotAuth" name="device_unknown"></q-icon>
</q-btn>
</q-drawer>
<!-- USER BAR -->
<q-drawer v-if="static_data.functionality.SHOW_USER_MENU" v-model="rightDrawerOpen" side="right" elevated>
<div id="profile">
<q-img class="absolute-top" src="../../statics/images/landing_first_section.png"
style="height: 150px" alt="section page">
</q-img>
<div class="absolute-top bg-transparent text-black center_img" style="margin-top: 10px;">
<q-btn-dropdown
stretch
v-if="static_data.lang_available.length > 1"
flat
:label="langshort"
auto-close
>
<q-list bordered>
<q-item clickable v-ripple
<CMyAvatar :myimg="getMyImg"></CMyAvatar>
v-for="langrec in static_data.lang_available" :key="langrec.value"
@click="lang = langrec.value">
<q-item-section avatar>
<img :src="langrec.image" class="flagimg" alt="flag">
</q-item-section>
<q-item-section>
{{langrec.label}}
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
<q-btn class="absolute-top-right" style="margin-right: 10px; color: white;"
dense flat round icon="close" @click="rightDrawerOpen = !rightDrawerOpen">
</q-btn>
<div v-if="isLogged" class="text-weight-bold text-user">{{ Username }} - {{ myName }} <span
v-if="isAdmin"> [Admin]</span><span v-if="isManager"> [Manager]</span></div>
<div v-else class="text-user text-italic bg-red">
{{ $t('user.loggati') }}
</div>
<div v-if="static_data.functionality.SHOW_MESSAGES">
<message-popover></message-popover>
</div>
<div v-if="isLogged && !isEmailVerified" class="text-verified">{{
$t('components.authentication.email_verification.verify_email') }}
</div>
<!--
<div class="right-itens">
<label>{{ $t('msg.hello') }}</label> <span v-model="prova"></span> !
</div>-->
<!--<span class="text-white" v-if="Verificato"> {{$t('reg.verificato')}} </span>-->
<!--<span class="text-white background-red" v-else> {{$t('reg.non_verificato')}} </span>-->
<!-- BUTTON USER BAR -->
<div v-if="isLogged" id="user-actions" class="column justify-center q-gutter-sm q-ma-sm center-150" >
<q-btn rounded color="primary" icon="person" to="/profile">{{$t('pages.profile')}}</q-btn>
<!--<q-btn round color="warning" icon="lock"></q-btn>-->
<q-btn rounded color="negative" icon="exit_to_app" @click='logoutHandler'>{{$t('login.esci')}}</q-btn>
</div>
<q-btn class="q-mx-xs" v-if="static_data.functionality.SHOW_USER_MENU && !isLogged" dense flat round
icon="menu"
@click="rightDrawerOpen = !rightDrawerOpen">
</q-btn>
<q-btn class="q-mx-xs" v-if="static_data.functionality.SHOW_USER_MENU && isLogged" round dense flat
@click="rightDrawerOpen = !rightDrawerOpen">
<CMyAvatar :myimg="getMyImg"></CMyAvatar>
</q-btn>
</div>
<div style="margin-top:120px;"></div>
<div v-show="!isLogged">
<div class="q-ma-md" style="">
<CSignIn :mythis="mythis"
:showregbutt="static_data.functionality.SHOW_REG_BUTTON"
@loginOk="loginOk"
@loginInCorso="loginInCorso"
@checkErrors="checkErrors"
@showNotif="showNotif">
</CSignIn>
</div>
</div>
</q-toolbar>
</div>
<div v-if="isLogged" class="q-mt-lg"><br><br></div>
</q-header>
<slot></slot>
<q-drawer side="left"
bordered
show-if-above
:breakpoint="500"
v-model="leftDrawerOpen"
:content-class="['bg-grey-1', 'q-pa-sm']"
:content-style="{padding: '0px'}"
>
<drawer :clBase="clBase"></drawer>
</q-drawer>
</div>
</q-drawer>
<!-- USER BAR -->
<q-drawer v-if="static_data.functionality.SHOW_USER_MENU" v-model="rightDrawerOpen" side="right" elevated>
<div id="profile">
<q-img class="absolute-top" src="../../statics/images/landing_first_section.png"
style="height: 150px" alt="section page">
</q-img>
<div class="absolute-top bg-transparent text-black center_img" style="margin-top: 10px;">
<CMyAvatar :myimg="getMyImg"></CMyAvatar>
<q-btn class="absolute-top-right" style="margin-right: 10px; color: white;"
dense flat round icon="close" @click="rightDrawerOpen = !rightDrawerOpen">
</q-btn>
<div v-if="isLogged" class="text-weight-bold text-user">{{ Username }} - {{ myName }} <span
v-if="isAdmin"> [Admin]</span><span v-if="isManager"> [Manager]</span></div>
<div v-else class="text-user text-italic bg-red">
{{ $t('user.loggati') }}
</div>
<div v-if="isLogged && !isEmailVerified" class="text-verified">{{
$t('components.authentication.email_verification.verify_email') }}
</div>
<!--<span class="text-white" v-if="Verificato"> {{$t('reg.verificato')}} </span>-->
<!--<span class="text-white background-red" v-else> {{$t('reg.non_verificato')}} </span>-->
<div v-if="isLogged" id="user-actions" class="column justify-center q-gutter-sm q-ma-sm center-150">
<q-btn rounded color="primary" icon="person" to="/profile">{{$t('pages.profile')}}</q-btn>
<!--<q-btn round color="warning" icon="lock"></q-btn>-->
<q-btn rounded color="negative" icon="exit_to_app" @click='logoutHandler'>{{$t('login.esci')}}</q-btn>
</div>
</div>
<div style="margin-top:120px;"></div>
<div v-show="!isLogged">
<div class="q-ma-md" style="">
<CSigninNoreg :showregbutt="static_data.functionality.SHOW_REG_BUTTON">
</CSigninNoreg>
</div>
</div>
</div>
<div v-if="isLogged" class="q-mt-lg"><br><br></div>
<slot></slot>
</q-drawer>
</div>
</template>
<script lang="ts" src="./Header.ts">
</script>
<style lang="scss" scoped>
@import './Header.scss';
@import './Header.scss';
</style>

View File

@@ -111,7 +111,7 @@
<p>Ultimo aggiornamento: {{lastdataupdate}}</p>
</div>
<div v-if="toolsext.isLang('fr')">
<div v-else-if="toolsext.isLang('fr')">
<p class="text-subtitle1">Politique de confidentialité de {{url}}</p>
<p class="text-subtitle1">Information sur le traitement des données personnelles conformément à l'article 13 du
Code civil italien Règlement (UE) n° 2016/679.</p>

View File

@@ -56,3 +56,5 @@ export * from './CRequisito'
export * from './CGuidelines'
export * from './CVideoPromo'
export * from './CMyRequirement'
export * from './CSigninNoreg'
export * from './CMyNave'

19
src/mixins/mixin-nave.ts Normal file
View File

@@ -0,0 +1,19 @@
import Vue from 'vue'
import { GlobalStore, UserStore, MessageStore } from '../store/Modules'
import Component from 'vue-class-component'
import { func_tools } from '../store/Modules/toolsext'
import { tools } from '../store/Modules/tools'
import { IMessage } from '@src/model'
import MixinBase from './mixin-base'
// You can declare a mixin as the same style as components.
@Component
export default class MixinNave extends MixinBase {
public CHISONO_DONATORE: number = 0
public CHISONO_MEDIATORE: number = 3
public CHISONO_SOGNATORE: number = 6
}

View File

@@ -22,6 +22,7 @@ export interface INotData {
arr_nations?: string
lastsreg?: IUserFields[]
checkuser?: ICheckUser | any
numreg_untilday?: number
reg_daily?: string
}

View File

@@ -38,6 +38,7 @@ export interface IDashboard {
downline: any[],
downnotreg: any[],
downbyuser: any[]
arrnavi?: any[]
}
export interface ICalcStat {
@@ -64,6 +65,9 @@ export interface IUserFields {
downline?: IUserFields[]
calcstat?: ICalcStat
dashboard?: IDashboard
qualified?: boolean
numinvitati?: number
numinvitatiattivi?: number
}
/*

View File

@@ -31,30 +31,30 @@
<div class="row">
<CMyFieldDb title="Altezza Logo"
mykey="HEIGHT_LOGO"
serv="true"
:serv="true"
:type="tools.FieldType.number">
</CMyFieldDb>
<CMyFieldDb title="Titolo Discipline"
mykey="DISC_TITLE"
serv="true"
:serv="true"
:type="tools.FieldType.string">
</CMyFieldDb>
</div>
<CMyFieldDb title="Testo Promozione"
mykey="TEXT_PROMO"
serv="true"
:serv="true"
:type="tools.FieldType.html">
</CMyFieldDb>
<div class="row">
<CMyFieldDb title="Numero di Eventi da mostrare"
mykey="SHOW_LAST_N_EV"
serv="true"
:serv="true"
:type="tools.FieldType.number">
</CMyFieldDb>
<CMyFieldDb title="Testo dopo gli Eventi"
mykey="TEXT_AFTER_EV"
serv="true"
:serv="true"
:type="tools.FieldType.html">
</CMyFieldDb>
</div>
@@ -78,17 +78,17 @@
</div>
<CMyFieldDb title="Firma"
mykey="TEXT_SIGN"
serv="true"
:serv="true"
:type="tools.FieldType.html">
</CMyFieldDb>
<CMyFieldDb title="Testo Disclaimer"
mykey="TEXT_DISCLAIMER"
serv="true"
:serv="true"
:type="tools.FieldType.html">
</CMyFieldDb>
<CMyFieldDb title="Testo a piè pagina"
mykey="TEXT_DISC_BOTTOM"
serv="true"
:serv="true"
:type="tools.FieldType.html">
</CMyFieldDb>
@@ -101,32 +101,32 @@
<CMyFieldDb title="Email da cui Inviare la Newsletter"
mykey="EMAIL_FROM"
serv="true"
:serv="true"
:type="tools.FieldType.string">
</CMyFieldDb>
<CMyFieldDb title="Email di Reply"
mykey="EMAIL_REPLY"
serv="true"
:serv="true"
:type="tools.FieldType.string">
</CMyFieldDb>
<CMyFieldDb title="Password email"
mykey="PWD_FROM"
serv="true"
:serv="true"
:type="tools.FieldType.password">
</CMyFieldDb>
<CMyFieldDb title="Servizio SMTP Email ('gmail' per inviare email da Gmail)"
mykey="EMAIL_SERVICE_SEND"
serv="true"
:serv="true"
:type="tools.FieldType.string">
</CMyFieldDb>
<CMyFieldDb title="Porta SMTP"
mykey="EMAIL_PORT"
serv="true"
:serv="true"
:type="tools.FieldType.number">
</CMyFieldDb>
<CMyFieldDb title="Millisecondi di pausa tra una email e l'altra"
mykey="MSEC_PAUSE_SEND"
serv="true"
:serv="true"
:type="tools.FieldType.number">
</CMyFieldDb>
</div>
@@ -136,7 +136,7 @@
<CMyFieldDb title="Messaggio dopo che l'utente ha Prenotato un Evento"
mykey="MSG_REPLY_AFTER_BOOKING"
serv="true"
:serv="true"
:type="tools.FieldType.string">
</CMyFieldDb>
@@ -172,7 +172,7 @@
<div class="text-center">
<CMyFieldDb title="Email di Test"
mykey="EMAIL_TEST"
serv="true"
:serv="true"
:type="tools.FieldType.string">
</CMyFieldDb>
<q-btn :loading="myloading" rounded outline @click="sendNewsletterTest(false)"
@@ -192,7 +192,7 @@
<div class="q-pa-xs q-ma-md q-gutter-md">
<CMyFieldDb title="Template Email da Inviare"
mykey="TEMPLEMAIL_ID"
serv="true"
:serv="true"
:type="tools.FieldType.select"
jointable="templemail">
</CMyFieldDb>

View File

@@ -60,7 +60,7 @@ const msg_enUs = {
saw_video_intro: 'I declare I\'ve seen at least video "4. How can I be part of AYNI"',
chat_biblio: 'Enter AYNI-LIBRARY Chat',
chat_biblio_long: 'You need to enter this Chat to get the latest news and stay in touch with us',
paymenttype: 'Methods of Payment',
paymenttype: 'Methods of Payment (Mandatory Paypal)',
paymenttype_long: 'Choose <strong>at least 2 Payment Methods</strong>, to exchange gifts.<br><br>The <strong>payment methods are: <ul><li><strong>Paypal</strong> (in AYNI it is <strong>obligatory</strong>) because it is a very popular system throughout Europe (the transfer is free of charge) and you can connect prepaid cards, credit cards and bank account <strong>WITHOUT COMMISSIONS</strong>. In this way you won\'t have to share your card or c/c numbers but only the email you used during the registration on Paypal. Available the app for your mobile phone.</li><li><strong>Revolut</strong>: the Revolut Prepaid Card with English IBAN (outside EU) completely free, more free and easy to use. Available the app for mobile.</li>',
paymenttype_paypal: 'How to open a Paypal account (in 2 minutes)',
paymenttype_paypal_carta_conto: 'How to associate a Credit/Debit Card or Bank Account on PayPal',
@@ -76,24 +76,25 @@ const msg_enUs = {
zoom_no_partecipato: 'You have not yet participated in a Zoom (it is a requirement to enter)',
zoom_long: 'You are required to participate in at least 1 Zoom, but it is recommended that you take part in the movement more actively.<br><br><strong>By participating in Zooms the AYNI Staff will record attendance and you will be enabled.</strong>',
zoom_what: 'Tutorial how to install Zoom',
sharemovement_devi_invitare_almeno_2: 'You still haven\'t invited 2 people',
sharemovement_hai_invitato: 'You invited at least 2 people',
// sharemovement_devi_invitare_almeno_2: 'You still haven\'t invited 2 people',
// sharemovement_hai_invitato: 'You invited at least 2 people',
sharemovement_invitati_attivi_si: 'You have at least 2 people invited Active',
sharemovement_invitati_attivi_no: '<strong>Note:</strong>The people you invited, in order to be <strong>Active</strong>, must have <strong>completed all the first 7 Requirements</strong> (see your <strong>Lavagna</strong> to see what they are missing).',
sharemovement: 'Invitation at least 2 people',
sharemovement_long: 'Share the AYNI Movement with at least 2 friends (<strong>advis 3 people</strong>) and invite them to participate in the Welcome Zooms to become part of this great Family &#128516 .<br>.',
sharemovement_long: 'Share the AYNI Movement and invite them to participate in the Welcome Zooms to become part of this great Family &#128516 .<br>.',
inv_attivi_long: '',
enter_prog_status: '<strong>PLEASE NOTE:</strong> The Programming will start as soon as possible after everyone registers on this platform.<br>We will communicate the dates when everyone can leave and make their own gift.<br>',
enter_prog_completa_requisiti: 'Complete all the requirements to be able to enter the programming.',
enter_prog_requisiti_ok: 'You have completed all the requirements to be able to access Programming',
enter_prog_completa_requisiti: 'Complete all the requirements to enter the boarding list.',
enter_prog_requisiti_ok: 'You have completed all 7 requirements to enter the boarding list.<br>You will receive a message in the next few days as soon as your ship is ready!',
enter_nave_9req_ok: 'CONGRATULATIONS! You have completed ALL 9 steps guide! Thank you for helping AYNI to Expand! <br>You will be able to leave very soon with your Journey, making your gift and continuing towards the Dreamer.',
enter_nave_9req_ko: 'Remember that you can help the Movement grow and expand by sharing our journey with everyone!',
enter_prog: 'I\'m going in Programming',
enter_prog_long: 'Satisfied the requirements you will enter the Program, you will be added to the Ticket and the corresponding group chat.<br>',
collaborate: 'Collaboration',
collaborate_long: 'I continue to work with my companions to get to the day of the programming where my ticket will be activated.',
collaborate_long: 'I continue to work with my companions to get to the day when my ship will sail.',
dream: 'I write my dream',
dream_long: 'Write here the Dream for which you entered Ayni and which you wish to realize.<br>It will be shared with all the others to dream together !',
dono: 'Gift',
dono_long: 'I make my gift on the departure date of my Ticket',
dono_long: 'I make my gift on the departure date of my Ship',
support: 'Support the movement',
support_long: 'I support the movement by bringing energy, participating and organizing Zoom, helping and informing newcomers and continuing to spread Ayni\'s vision.',
ricevo_dono: 'I receive my gift and CELEBRATE',
@@ -185,12 +186,13 @@ const msg_enUs = {
notreg: 'Not Registered',
inv_attivi: 'Invited with the 7 Requirements',
numinvitati: 'At least 2 guests',
telefono_wa: 'Contact on Whatsapp who has not registered',
telefono_wa: 'Contact on Whatsapp',
sendnotification: 'Send Notification to the Recipient on Telegram BOT',
ricevuto_dono: 'You received a Gift Invitation {invitato} from {mittente} !',
nessun_invitante: 'No Inviting',
nessun_invitato: 'No_invited',
legenda_title: 'Click on the name of the guest to see the status of his Requirements.'
legenda_title: 'Click on the name of the guest to see the status of his Requirements.',
nave_in_partenza: 'in Partenza il',
},
reg: {
registered: 'Registrato',

View File

@@ -60,7 +60,7 @@ const msg_es = {
saw_video_intro: 'Declaro que he visto al menos el vídeo "4. ¿Cómo puedo ser parte de AYNI?"',
chat_biblio: 'Entra en el chat de la AYNI-BIBLIO',
chat_biblio_long: 'Necesitas entrar en este chat para obtener las últimas noticias y mantenerte en contacto con nosotros.',
paymenttype: 'Métodos de pago',
paymenttype: 'Métodos de pago (Obligatorio Paypal)',
paymenttype_long: 'Elija <strong>al menos 2 métodos de pago</strong>, para intercambiar regalos.<br><br>Los <strong>métodos de pago son: <ul><li><strong>Paypal</strong> (en AYNI es <strong>obligatorio</strong>) porque es un sistema muy popular en toda Europa (la transferencia es gratuita) y se pueden conectar tarjetas de prepago, tarjetas de crédito y cuenta bancaria <strong> SIN COMISIONES</strong>. De esta manera no tendrás que compartir tu tarjeta o números de c/c, sino sólo el correo electrónico que usaste durante el registro en Paypal. Disponible la aplicación para tu teléfono móvil.</li><strong>Revolut</strong>: la Tarjeta Prepagada Revolut con IBAN inglés (fuera de la UE) completamente gratis, más gratis y fácil de usar. Disponible la aplicación para móvil.</li>',
paymenttype_paypal: 'Cómo abrir una cuenta de Paypal (en 2 minutos)',
paymenttype_paypal_carta_conto: 'Cómo asociar una tarjeta de crédito/débito o una cuenta bancaria en PayPal',
@@ -76,24 +76,25 @@ const msg_es = {
zoom_no_partecipato: "Aún no ha participado en un Zoom (es un requisito para entrar)",
zoom_long: "Se requiere que participe en al menos 1 Zoom, pero se recomienda participar en el movimiento de una manera más activa.<br><br><strong>Al participar en los Zooms el personal de AYNI registrará la asistencia y usted estará habilitado.</strong>",
zoom_what: "Tutoriales de cómo instalar Zoom",
sharemovement_devi_invitare_almeno_2: 'Todavía no has invitado a dos personas',
sharemovement_hai_invitato: 'Invitaste al menos a dos personas',
// sharemovement_devi_invitare_almeno_2: 'Todavía no has invitado a dos personas',
// sharemovement_hai_invitato: 'Invitaste al menos a dos personas',
sharemovement_invitati_attivi_si: 'Tienes al menos 2 personas invitadas Activo',
sharemovement_invitati_attivi_no: '<strong>Nota:</strong>Las personas que invitaste, para ser <strong>Activo</strong>, deben haber <strong>completado todos los primeros 7 Requisitos</strong> (ver tu <strong>Lavagna</strong> para ver lo que les falta)',
sharemovement: 'Invitar al menos a 2 personas',
sharemovement_long: 'Comparte el Movimiento AYNI con al menos 2 amigos (<fuerte> aconseja a 3 personas</fuerte>) e invítalos a participar en los Zooms de Bienvenida para formar parte de esta gran Familia &#128516 .<br>',
sharemovement_long: 'Continúo trabajando con mis compañeros para llegar al día en que mi barco zarpe.<br>',
inv_attivi_long: '',
enter_prog_status: '<strong>NOTE:</strong> La programación comenzará lo antes posible después de que todos se registren en esta plataforma.<br>Comunicaremos las fechas en las que todos pueden irse y hacer su propio regalo.<br>',
enter_prog_completa_requisiti: 'Voy a entrar en Programación',
enter_prog_requisiti_ok: 'Ha completado todos los requisitos para poder acceder a la programación',
enter_prog: 'Voy a entrar en Programación',
enter_prog_completa_requisiti: 'Complete todos los requisitos para entrar en la lista de embarque.',
enter_prog_requisiti_ok: 'Ha completado los 7 requisitos para entrar en la lista de embarque.<br>¡Recibirá un mensaje en los próximos días tan pronto como su nave esté lista!',
enter_nave_9req_ok: '¡FELICIDADES! ¡Has completado los 9 pasos de la Guía! ¡Gracias por ayudar a AYNI a expandirse! <br>Podrás salir muy pronto con tu viaje, haciendo tu regalo y continuando hacia el Soñador.',
enter_nave_9req_ko: 'Recuerda que puedes ayudar a que el Movimiento crezca y se expanda compartiendo nuestro viaje con todos!',
enter_prog: 'Voy a entrar en Lista Programación',
enter_prog_long: 'Si se cumplen los requisitos, entrará en el Programa, se le añadirá al Ticket y al correspondiente chat de grupo.<br>',
collaborate: 'Colaboración',
collaborate_long: 'Sigo trabajando con mis compañeros para llegar al día de la programación donde mi boleto será activado.',
dream: 'Escribo mi sueño',
dream_long: 'Escribe aquí el sueño por el que entraste en Ayni y que deseas realizar. ¡Será compartido con todos los demás para soñar juntos!',
dono: 'Regalo',
dono_long: 'Hago mi regalo en la fecha de salida de mi billete',
dono_long: 'Hago mi regalo en la fecha de salida de mi nave',
support: 'Apoyo el movimiento',
support_long: 'Apoyo el movimiento aportando energía, participando y organizando Zoom, ayudando e informando a los recién llegados y continuando difundiendo la visión de Ayni.',
ricevo_dono: 'Recibo mi regalo y CELEBRO',
@@ -184,12 +185,13 @@ const msg_es = {
notreg: 'No Registrado',
inv_attivi: 'Invitado con los 7 requisitos',
numinvitati: 'Al menos 2 invitados',
telefono_wa: 'Contacto en Whatsapp que no se ha registrado',
telefono_wa: 'Contacto en Whatsapp',
sendnotification: 'Enviar notificación al destinatario del telegrama BOT',
ricevuto_dono: 'Usted recibió una invitación de regalo de {invitato} de {mittente} !',
nessun_invitante: 'No invitando',
nessun_invitato: 'No_invitado',
legenda_title: 'Haga clic en el nombre del huésped para ver el estado de sus requisitos',
nave_in_partenza: 'in Partenza il',
},
reg: {
registered: 'Registrato',

View File

@@ -60,7 +60,7 @@ const msg_fr = {
saw_video_intro: 'Je déclare avoir vu au moins la vidéo "4. Comment puis-je faire partie de AYNI"',
chat_biblio: 'Entrez le Chat AYNI-BIBLIO',
chat_biblio_long: 'Vous devez entrer dans ce Chat pour obtenir les dernières nouvelles et rester en contact avec nous',
paymenttype: 'Méthodes de paiement',
paymenttype: 'Méthodes de paiement (Obligatoire Paypal)',
paymenttype_long: 'Choisissez <strong>au moins 2 modes de paiement</strong>, pour échanger des cadeaux.<br><br>Les modes de paiement <strong>sont : <ul><li><strong>Paypal</strong> (en AYNI c\'est <strong>obligatoire</strong>) car c\'est un système très populaire dans toute l\'Europe (le transfert est gratuit) et vous pouvez connecter des cartes prépayées, des cartes de crédit et un compte bancaire <strong> SANS COMMISSIONS</strong>. De cette façon, vous n\'aurez pas à partager vos numéros de carte ou de c/c mais seulement l\'email que vous avez utilisé lors de l\'inscription sur Paypal. Disponible l\'application pour votre téléphone portable.</li><strong>Revolut</strong> : la carte prépayée Revolut avec IBAN anglais (hors UE) complètement gratuite, plus gratuite et facile à utiliser. Disponible l\'application pour mobile.</li>',
paymenttype_paypal: 'Comment ouvrir un compte Paypal (en 2 minutes)Comment ouvrir un compte Paypal (en 2 minutes)',
paymenttype_paypal_carta_conto: "Comment associer une carte de crédit/débit ou un compte bancaire sur PayPal",
@@ -76,24 +76,25 @@ const msg_fr = {
zoom_no_partecipato: "Vous n'avez pas encore participé à un Zoom (il est obligatoire d'entrer)",
zoom_long: "Vous devez participer à au moins un Zoom, mais il est recommandé de participer au mouvement de manière plus active. <br><br><strong>En participant aux Zooms, le personnel de l'AYNI enregistrera votre présence et vous serez activé. </strong>",
zoom_what: "Tutoriels d'installation de Zoom",
sharemovement_devi_invitare_almeno_2: 'Vous n\'avez toujours pas invité 2 personnes',
sharemovement_hai_invitato: 'Vous avez invité au moins deux personnes',
// sharemovement_devi_invitare_almeno_2: 'Vous n\'avez toujours pas invité 2 personnes',
// sharemovement_hai_invitato: 'Vous avez invité au moins deux personnes',
sharemovement_invitati_attivi_si: 'Vous avez au moins 2 personnes invitées Active',
sharemovement_invitati_attivi_no: '<strong>Note:</strong>Les personnes que vous avez invitées, pour être <strong>Actif</strong>, doivent avoir <strong>complété les 7 premières exigences</strong> (voir votre <strong>Lavagna</strong> pour voir ce qu\'il leur manque)',
sharemovement: 'Invitation au moins 2 personnes',
sharemovement_long: 'Partagez le mouvement AYNI avec au moins 2 amis (<fort>conseillez 3 personnes</strong>) et invitez-les à participer aux zooms de bienvenue pour faire partie de cette grande famille &#128516 .<br>.',
sharemovement_long: 'Partagez le mouvement AYNI et invitez-les à participer aux zooms de bienvenue pour faire partie de cette grande famille &#128516 .<br>.',
inv_attivi_long: '',
enter_prog_status: '<strong>Veuillez noter:</strong> La programmation commencera dès que possible après que tout le monde se sera inscrit sur cette plateforme.<br>Nous communiquerons les dates où chacun pourra partir et faire son propre cadeau.<br>',
enter_prog_completa_requisiti: 'Remplissez toutes les conditions pour pouvoir entrer dans la programmation.',
enter_prog_requisiti_ok: 'Vous avez rempli toutes les conditions pour pouvoir accéder à la programmation',
enter_prog: 'Je vais dans la Programmation',
enter_prog_completa_requisiti: 'Remplissez toutes les conditions pour figurer sur la liste d\'embarquement.',
enter_prog_requisiti_ok: 'Vous avez rempli les 7 conditions pour figurer sur la liste d\'embarquement.<br>Vous recevrez un message dans les prochains jours dès que votre bateau sera prêt !',
enter_nave_9req_ok: 'FÉLICITATIONS ! Vous avez suivi les 9 étapes du guide ! Merci d\'avoir aidé AYNI à se développer ! <br> Vous pourrez bientôt partir avec votre Voyage, en faisant votre don et en continuant vers le Rêveur.',
enter_nave_9req_ko: 'N\'oubliez pas que vous pouvez aider le Mouvement à grandir et à s\'étendre en partageant notre voyage avec tout le monde !',
enter_prog: 'Je vais dans la Liste des Programmation',
enter_prog_long: 'Si vous remplissez les conditions requises pour entrer dans le programme, vous serez ajouté au billet et au chat de groupe correspondant<br>',
collaborate: 'Collaboration',
collaborate_long: 'Je continue à travailler avec mes compagnons pour me rendre le jour de la programmation où mon billet sera activé.',
collaborate_long: 'Je continue à travailler avec mes compagnons pour arriver au jour où mon navire prendra la mer.',
dream: 'J\'écris mon rêve',
dream_long: 'Ecrivez ici le Rêve pour lequel vous êtes entré à Ayni et que vous souhaitez réaliser.<br>Il sera partagé avec tous les autres pour rêver ensemble !',
dono: 'Cadeau',
dono_long: 'Je fais mon cadeau à la date de départ de mon billet',
dono_long: 'Je fais mon cadeau à la date de départ de mon nef',
support: 'Je soutiens le mouvement',
support_long: 'Je soutiens le mouvement en apportant de l\'énergie, en participant et en organisant Zoom, en aidant et en informant les nouveaux arrivants et en continuant à diffuser la vision d\'Ayni.',
ricevo_dono: 'Je reçois mon cadeau et je CÉLÈBRE',
@@ -183,12 +184,13 @@ const msg_fr = {
notreg: 'Non enregistré',
inv_attivi: 'Invité avec les 7 exigences',
numinvitati: 'Au moins 2 invités',
telefono_wa: 'Contact sur Whatsapp qui n\'est pas enregistré',
telefono_wa: 'Contact sur Whatsapp',
sendnotification: 'Envoyer la notification au destinataire par télégramme BOT',
ricevuto_dono: 'Vous avez reçu une invitation-cadeau de {invitato} de {mittente} !',
nessun_invitante: 'Pas d\'invitation',
nessun_invitato: 'Non_invité',
legenda_title: 'Cliquez sur le nom de l\'invité pour voir l\'état de ses besoins',
nave_in_partenza: 'in Partenza il',
},
reg: {
registered: 'Registrato',

View File

@@ -18,6 +18,7 @@ const msg_it = {
list: 'Lista',
},
otherpages: {
update: 'Aggiornamento in Corso...',
error404: 'error404',
error404def: 'error404def',
admin: {
@@ -70,8 +71,9 @@ const msg_it = {
saw_video_intro: 'Dichiaro di aver visto almeno il Video \'4. Come faccio a far parte di AYNI\'',
chat_biblio: 'Entra nella Chat AYNI BiblioBacheca',
chat_biblio_long: 'Occorre entrare in questa Chat per ricevere le ultime notizie e rimanere in contatto con noi',
paymenttype: 'Modalità di Pagamento',
paymenttype_long: 'Scegli <strong>almeno 2 Modalità di Pagamento</strong>, per scambiarsi i doni.<br><br>I <strong>metodi di Pagamento sono: <ul><li><strong>Paypal</strong> (in AYNI è <strong>obbligatoria</strong>) perchè è un sistema molto diffuso in tutta Europa (il trasferimento e gratuito) e si possono collegare le carte prepagate, le carte di credito e il conto corrente <strong>SENZA COMMISSIONI</strong>. In questo modo non dovrai condividere i numeri delle tue carte o del c/c ma solo la mail che avrai usato in fase di iscrizione su Paypal. Disponibile l\'app per il cellulare.</li><li><strong>Revolut</strong>: la Carta Prepagata Revolut con IBAN Inglese (fuori UE) completamente gratuita, più libera e semplice da utilizzare. Disponibile l\'app per il cellulare.</li>',
paymenttype: 'Modalità di Pagamento (Paypal)',
paymenttype_long: 'I <strong>metodi di Pagamento sono: <ul><li><strong>Paypal</strong> (in AYNI è <strong>obbligatoria</strong>) perchè è un sistema molto diffuso in tutta Europa (il trasferimento e gratuito) e si possono collegare le carte prepagate, le carte di credito e il conto corrente <strong>SENZA COMMISSIONI</strong>. In questo modo non dovrai condividere i numeri delle tue carte o del c/c ma solo la mail che avrai usato in fase di iscrizione su Paypal. Disponibile l\'app per il cellulare.</li><li><strong>Revolut</strong>: la Carta Prepagata Revolut con IBAN Inglese (fuori UE) completamente gratuita, più libera e semplice da utilizzare. Disponibile l\'app per il cellulare.</li>',
paymenttype_long2: 'E\' obbligatorio avere Paypal<br> Si consiglia di avere a disposizione <strong>almeno 2 Modalità di Pagamento</strong>, per scambiarsi i doni.',
paymenttype_paypal: 'Come Aprire un conto Paypal (in 2 minuti)',
paymenttype_paypal_carta_conto: 'Come associare una carta di Credito/Debito o un Conto Bancario su PayPal',
paymenttype_paypal_link: 'Apri il Conto con Paypal',
@@ -86,30 +88,32 @@ const msg_it = {
zoom_no_partecipato: 'Attualmente non hai ancora partecipato ad uno Zoom (è un requisito per poter entrare)',
zoom_long: 'Si richiede di partecipare ad almeno 1 Zoom, ma è consigliato prendere parte al movimento in maniera più attiva.<br><br><strong>Partecipando agli Zoom lo Staff di AYNI registrerà le presenze e verrai così abilitato.</strong>',
zoom_what: 'Tutorial come installare Zoom',
sharemovement_devi_invitare_almeno_2: 'Ancora non hai invitato 2 persone',
sharemovement_hai_invitato: 'Hai invitato almeno 2 persone',
// sharemovement_devi_invitare_almeno_2: 'Ancora non hai invitato 2 persone',
// sharemovement_hai_invitato: 'Hai invitato almeno 2 persone',
sharemovement_invitati_attivi_si: 'Hai almeno 2 persone invitate Attive',
sharemovement_invitati_attivi_no: '<strong>Nota Bene:</strong>Le persone che hai invitato, per essere <strong>Attive</strong>, devono aver <strong>completato tutti i primi 7 Requisiti</strong> (vedi la tua <strong>Lavagna</strong> per capire cosa gli manca)',
sharemovement: 'Invito almeno 2 persone',
sharemovement_long: 'Condividi il Movimento AYNI con almeno 2 amici (<strong>consigliate 3 persone</strong>) e invitali a partecipare agli Zoom di Benvenuto per entrare a far parte di questa grande Famiglia &#128516 .<br>',
sharemovement: 'Condivido il Movimento',
sharemovement_long: 'Condividi il Movimento AYNI e invitali a partecipare agli Zoom di Benvenuto per entrare a far parte di questa grande Famiglia &#128516 .<br>',
inv_attivi_long: '',
enter_prog_status: '<strong>NOTA BENE:</strong> La Programmazione partirà appena possibile dopo che tutti si saranno registrati su questa piattaforma.<br>Comunicheremo noi le date in cui ognuno potrà partire ed effettuare così il proprio dono.<br>',
enter_prog_completa_requisiti: 'Completa tutti i requisiti richiesti, per poter entrare in programmazione.',
enter_prog_requisiti_ok: 'Hai completato tutti i requisiti per poter accedere alla Programmazione',
enter_prog: 'Entro in Programmazione',
enter_prog_long: 'Soddisfatti i requisiti richiesti entrerai in Programmazione, verrai aggiunto alla Bigliettera e nella chat di gruppo corrispondente.<br>',
enter_prog_completa_requisiti: 'Completa tutti i requisiti richiesti, per poter entrare nella Lista d\'imbarco.',
enter_prog_requisiti_ok: 'Hai completato tutti i 7 requisiti per entrare nella Lista d\'Imbarco.<br>Riceverai un messaggio nei prossimi giorni appena la tua Nave sarà pronta!',
enter_nave_9req_ok: 'COMPLIMENTI! Hai Completato TUTTI i 9 Passi della Guida! Grazie per Aiutare AYNI ad Espandersi!<br>Potrai molto presto partire con il tuo Viaggio, facendo il tuo dono e proseguendo verso il Sognatore',
enter_nave_9req_ko: 'Ricorda che puoi Aiutare a far Crescere ed Espandere il Movimento, Condividendo con chiunque questo nostro viaggio!',
enter_prog: 'Entro nella Lista d\'Imbarco',
enter_prog_long: 'Ricorda che puoi Aiutare a far Crescere ed Espandere il Movimento, Condividendo con chiunque questo nostro viaggio!<br>',
collaborate: 'Collaborazione',
collaborate_long: 'Continuo a collaborare con i miei compagni per arrivare al giorno della programmazione dove si attiverà la mia Bigliettera.',
collaborate_long: 'Continuo a collaborare con i miei compagni per arrivare al giorno in cui salperà la mia Nave.',
dream: 'Scrivo il mio Sogno',
dream_long: 'Scrivi qui il Sogno per il quale sei entrato in Ayni e che desideri realizzare.<br>Sarà condiviso a quello di tutti gli altri per sognare insieme !',
dono: 'Dono',
dono_long: 'Faccio il mio dono nella data di partenza della mia Bigliettera',
dono_long: 'Faccio il mio dono nella data di partenza della mia Nave',
support: 'Sostengo il movimento',
support_long: 'Sostengo il movimento portando Energia, partecipando e organizzando Zoom, aiutando e informando i nuovi arrivati continuando a diffondere la visione di Ayni',
ricevo_dono: 'Ricevo il mio dono e CELEBRO',
ricevo_dono_long: 'Evviva!!!<br><strong>QUESTO MOVIMENTO È REALE E POSSIBILE SE LO FACCIAMO FUNZIONARE TUTTI INSIEME !</strong>',
},
dialog: {
continue: 'Continuare',
close: 'Chiudi',
copyclipboard: 'Copiato negli appunti',
ok: 'Ok',
@@ -194,12 +198,37 @@ const msg_it = {
notreg: 'Non Registrato',
inv_attivi: 'Invitati con i 7 Requisiti',
numinvitati: 'Almeno 2 Invitati',
telefono_wa: 'Contatta su Whatsapp chi non si è registrato',
telefono_wa: 'Contatta su Whatsapp',
sendnotification: 'Invia Notifica al Destinatario su Telegram BOT',
ricevuto_dono: 'Hai ricevuto in Regalo un Invitato {invitato} da parte di {mittente} !',
nessun_invitante: 'Nessun Invitante',
nessun_invitato: 'Nessun Invitato',
legenda_title: 'Clicca sul nome dell\'invitato per vedere lo stato dei suoi Requisiti.'
legenda_title: 'Clicca sul nome dell\'invitato per vedere lo stato dei suoi Requisiti.',
nave_in_partenza: 'in Partenza il',
sonomediatore: 'Quando diventi Meditore vieni contattato da un <strong>TUTOR</strong>, con lui devi:<br><ol class="lista">' +
'<li>Aprire la tua <strong>Gift Chat</strong> (tu come proprietario e il Tutor ' +
'come amministratore) con questo nome: <strong>gg/mm - NAVE numero.numero 🎁AYNI</strong><br>(Esempio: <strong>10/03 - NAVE 2.1 🎁 AYNI</strong>)</li>' +
'<li>Clicca sul nome della chat in alto -> Modifica -> Amministratori -> "Aggiungi Amministratore", seleziona il Tutor nellelenco.</li>' +
'<li>Devi configurare la chat in modo che chi entra vede anche i post precedenti (clicca sul nome della chat in alto, clicca su modifica, ' +
'cambia la "cronologia per i nuovi membri" da nascosta a visibile</li>' +
'<li>Per trovare il <strong>link della Chat appena creata</strong>: clicca sul nome della chat in alto, clicca sulla Matita -> "Tipo di Gruppo" -> "invita nel gruppo tramite link", clicca su "copia link" e incollalo qui sotto, sulla casella <strong>"Link Gift Chat"</strong></li>' +
'<li>Invia il Link della Gift Chat a tutti i Donatori, cliccando sul bottone qui sotto.</li></ol>',
sonosognatore: '<ol class="lista"><li>Quando sei in questa posizione, verrai invitato ad entrare in una <strong>Gift Chat</strong> (Telegram) e qui troverai anche gli altri 7 Donatori, il Mediatore, il Sognatore e un rappresentante dello Staff.</li>' +
'<li>Effettuerai il tuo dono <strong>ESATTAMENTE il giorno indicato</strong> e nella modalità di pagamento che troverai scritto qui. La somma è di 33€.<br></ol>',
link_chat: 'Link della Gift Chat Telegram',
donatori:'Donatori',
donatore:'Donatore',
mediatore:'Mediatore',
sognatore:'Sognatore',
pos2: 'Interm. 2',
pos3: 'Interm. 3',
pos5: 'Interm. 5',
pos6: 'Interm. 6',
entra_in_gift_chat: 'Entra in Gift Chat',
controlla_donatori: 'Controlla Donatori',
invia_link_chat: 'Invia il Link della Gift Chat ai Donatori',
inviare_msg_donatori: '5) Inviare messaggio ai Donatori',
msg_donatori_ok: 'Inviato messaggio ai Donatori',
},
reg: {
registered: 'Registrato',
@@ -217,6 +246,10 @@ const msg_it = {
nuove_registrazioni: 'Se questa è una NUOVA registrazione, dovete contattare la persona che vi ha INVITATO, che vi lascerà il LINK CORRETTO per fare la Registrazione sotto di lui/lei',
you: 'Tu',
cancella_invitato: 'Elimina Invitato',
cancella_account: 'Elimina Profilo',
cancellami: 'Sei sicuro di voler Eliminare completamente la tua Registrazione su AYNI, uscendo così dal movimento? Non potrai piu\' accedere al sito tramite i tuoi dati, Perderai la tua POSIZIONE e i Tuoi Invitati verranno REGALATI a chi ti ha invitato.',
cancellami_2: 'ULTIMO AVVISO! Vuoi uscire Definitivamente da AYNI ?',
account_cancellato: 'Il tuo Profilo è stato cancellato correttamente',
regala_invitato: 'Regala Invitato',
messaggio_invito: 'Messaggio di Invito',
messaggio_invito_msg: 'Invia questo messaggio a tutti coloro a cui vuoi condividere questo Movimento !',

View File

@@ -70,7 +70,7 @@ const msg_pt = {
saw_video_intro: 'Declaro ter visto pelo menos o vídeo "4. Como posso fazer parte do AYNI"',
chat_biblio: 'Entre no AYNI-BIBLIO Chat',
chat_biblio_long: 'Você precisa entrar neste Chat para receber as últimas notícias e ficar em contato conosco.',
paymenttype: 'Formas de Pagamento',
paymenttype: 'Formas de Pagamento (Obrigatório Paypal)',
paymenttype_long: 'Escolha <strong> pelo menos 2 Métodos de pagamento</strong>, para trocar presentes.<br>As formas de pagamento são: <ul><li><strong>Paypal</strong> (em AYNI é <strong>obrigatório</strong>) porque é um sistema muito popular em toda a Europa (a transferência é gratuita) e você pode conectar cartões pré-pagos, cartões de crédito e conta bancária <strong> SEM COMISSÕES</strong>. Desta forma não terá de partilhar o seu cartão ou números de c/c, mas apenas o e-mail que utilizou durante o registo no Paypal. Disponível o aplicativo para o seu celular.</li><br><li><strong>Revolut</strong>: o Revolut Prepaid Card com IBAN inglês (fora da UE) completamente gratuito, mais gratuito e fácil de usar. Disponível o aplicativo para mobile.</li>',
paymenttype_paypal: 'Como abrir uma conta Paypal (em 2 minutos)',
paymenttype_paypal_carta_conto: 'Como associar um cartão de crédito/débito ou conta bancária no PayPal',
@@ -86,24 +86,25 @@ const msg_pt = {
zoom_no_partecipato: 'Você ainda não participou de um Zoom (é um requisito para entrar)',
zoom_long: 'É necessário participar em pelo menos 1 Zoom, mas é recomendável participar mais activamente no movimento.<br><br><strong> Ao participar nos Zooms o staff da AYNI registará a assistência e você estará habilitado.</strong>',
zoom_what: 'Tutorial de como instalar o Zoom',
sharemovement_devi_invitare_almeno_2: 'Você ainda não convidou 2 pessoas',
sharemovement_hai_invitato: 'Você convidou pelo menos 2 pessoas',
// sharemovement_devi_invitare_almeno_2: 'Você ainda não convidou 2 pessoas',
// sharemovement_hai_invitato: 'Você convidou pelo menos 2 pessoas',
sharemovement_invitati_attivi_si: 'Você tem pelo menos 2 pessoas convidadas Ativo',
sharemovement_invitati_attivi_no: '<strong>Nota:</strong>As pessoas que convidaste, para serem <strong>Active</strong>, têm de ter <strong>concluído todos os primeiros 7 Requisitos</strong> (ver o teu <strong>Lavagna</strong> para ver o que lhes falta)',
sharemovement: 'Convite a pelo menos 2 pessoas',
sharemovement_long: 'Partilhe o Movimento AYNI com pelo menos 2 amigos (<strong>advis 3 pessoas</strong>) e convide-os a participar nos Zooms de Boas-vindas para fazer parte desta grande Família &#128516 .<br>',
sharemovement_long: 'Partilhe o Movimento AYNI e convide-os a participar nos Zooms de Boas-vindas para fazer parte desta grande Família &#128516 .<br>',
inv_attivi_long: '',
enter_prog_status: '<strong>PLEASE NOTE:</strong> A Programação começará assim que possível depois de todos se registarem nesta plataforma.<br> Comunicaremos as datas em que todos podem sair e fazer o seu próprio presente.<br>',
enter_prog_completa_requisiti: 'Completar todos os requisitos para poder entrar na programação.',
enter_prog_requisiti_ok: 'Você completou todos os requisitos para poder acessar a Programação',
enter_prog: 'Vou em Programação',
enter_prog_completa_requisiti: 'Preencher todos os requisitos para entrar na lista de embarque.',
enter_prog_requisiti_ok: 'O usuário completou todos os 7 requisitos para entrar na lista de embarque.<br>Você receberá uma mensagem nos próximos dias, assim que o seu navio estiver pronto!',
enter_nave_9req_ok: 'PARABÉNS! Você completou TODOS os 9 passos do Guia! Obrigado por ajudar a AYNI a Expandir! <br>Você poderá partir muito em breve com a sua Jornada, fazendo o seu presente e continuando para o Sonhador.',
enter_nave_9req_ko: 'Lembre-se que você pode ajudar o Movimento a crescer e expandir, compartilhando nossa jornada com todos!',
enter_prog: 'Vou em Lista Programação',
enter_prog_long: 'Satisfeito os requisitos para entrar no Programa, você será adicionado ao Ticket e ao chat do grupo correspondente.<br>',
collaborate: 'Colaboração',
collaborate_long: 'Continuo a trabalhar com os meus companheiros para chegar ao dia da programação onde o meu bilhete vai ser activado.',
collaborate_long: 'Continuo a trabalhar com os meus companheiros para chegar ao dia em que o meu navio vai zarpar.',
dream: 'Eu escrevo o meu sonho',
dream_long: 'Escreva aqui o Sonho pelo qual você entrou no Ayni e que deseja realizar.<br>Será compartilhado com todos os outros para sonharem juntos !',
dono: 'Presente',
dono_long: 'Eu faço o meu presente na data de partida do meu bilhete',
dono_long: 'Eu faço o meu presente na data de partida do meu navio',
support: 'Eu apoio o movimento',
support_long: 'Eu apoio o movimento trazendo energia, participando e organizando o Zoom, ajudando e informando os recém-chegados e continuando a espalhar a visão de Ayni.',
ricevo_dono: 'Eu recebo meu presente e CELEBRATO',
@@ -194,12 +195,13 @@ const msg_pt = {
notreg: 'Não Registado',
inv_attivi: 'Convidado com os 7 Requisitos',
numinvitati: 'Pelo menos 2 convidados',
telefono_wa: 'Contato no Whatsapp quem não se registrou',
telefono_wa: 'Contato no Whatsapp',
sendnotification: 'Enviar Notificação ao Destinatário no Telegrama BOT',
ricevuto_dono: 'Você recebeu um convite de presente {invitato} de {mittente} !',
nessun_invitante: 'Sem Convite',
nessun_invitato: 'Sem Convidados',
legenda_title: 'Clique no nome do convidado para ver o status de seus Requisitos',
nave_in_partenza: 'in Partenza il',
},
reg: {
registered: 'Registrato',

View File

@@ -782,6 +782,33 @@ namespace Actions {
})
}
async function InviaMsgADonatori(context, { msgobj, navemediatore }) {
console.log('InviaMsgADonatori', msgobj)
const mydata = {
idapp: process.env.APP_ID,
tipomsg: tools.TipoMsg.SEND_LINK_CHAT_DONATORI,
msgextra: msgobj.msgextra,
msgpar1: msgobj.msgpar1,
inviareale: msgobj.inviareale,
navemediatore
}
return await Api.SendReq('/dashboard/msgnave', 'POST', mydata)
.then((res) => {
if (res.status === 200) {
if (res.data.code === serv_constants.RIS_CODE_OK) {
return res.data.ris
}
}
return null
})
.catch((error) => {
console.error(error)
return null
})
}
async function loadSite(context) {
// console.log('CalendarStore: loadAfterLogin')
// Load local data
@@ -930,6 +957,7 @@ namespace Actions {
DeleteFile: b.dispatch(DeleteFile),
sendEmailTest: b.dispatch(sendEmailTest),
DuplicateRec: b.dispatch(DuplicateRec),
InviaMsgADonatori: b.dispatch(InviaMsgADonatori),
addDynamicPages: b.dispatch(addDynamicPages)
}

View File

@@ -568,7 +568,7 @@ namespace Actions {
return await Api.SendReq('/users/dbop', 'POST', paramquery)
.then((res) => {
return res
return res.data
}).catch((error) => {
return false
})

View File

@@ -159,6 +159,37 @@ const colpaymenttype = [
AddCol(DeleteRec)
]
const colnavi = [
AddCol({ name: '_id', label_trans: 'others.value' }),
AddCol({ name: 'riga', label_trans: 'reg.riga' }),
AddCol({ name: 'col', label_trans: 'reg.col' }),
AddCol({ name: 'indprimario', label_trans: 'indprimario' }),
AddCol({ name: 'ind_order', label_trans: 'ind_order' }),
AddCol({ name: 'parent_id', label_trans: 'parent_id' }),
AddCol({ name: 'date_start', label_trans: 'date_start', fieldtype: tools.FieldType.date }),
AddCol({ name: 'link_chat', label_trans: 'reg.link_chat' }),
AddCol({ name: 'sent_msg_howto_make_gift', label_trans: 'sent_msg_howto_make_gift', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'made_gift', label_trans: 'made_gift', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'date_made_gift', label_trans: 'date_made_gift', fieldtype: tools.FieldType.date }),
AddCol({ name: 'received_gift', label_trans: 'received_gift', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'date_received_gift', label_trans: 'date_received_gift', fieldtype: tools.FieldType.date }),
AddCol({ name: 'num_tess', label_trans: 'num_tess', fieldtype: tools.FieldType.number }),
AddCol(DeleteRec),
AddCol(DuplicateRec)
]
const collistaingresso = [
AddCol({ name: '_id', label_trans: 'others.value' }),
AddCol({ name: 'indprimario', label_trans: 'indprimario' }),
AddCol({ name: 'ind_order', label_trans: 'ind_order' }),
AddCol({ name: 'date_added', label_trans: 'date_added', fieldtype: tools.FieldType.date }),
AddCol({ name: 'added', label_trans: 'added', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'num_tess', label_trans: 'num_tess', fieldtype: tools.FieldType.number }),
AddCol({ name: 'deleted', label_trans: 'deleted', fieldtype: tools.FieldType.boolean }),
AddCol(DuplicateRec),
AddCol(DeleteRec)
]
const coldisciplines = [
AddCol({ name: 'typol_code', label_trans: 'disc.typol_code' }),
AddCol({ name: 'order', label_trans: 'disc.order', fieldtype: tools.FieldType.number }),
@@ -435,6 +466,7 @@ export const fieldsTable = {
AddCol({ name: 'verified_email', label_trans: 'reg.verified_email', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'profile.saw_zoom_presentation', field: 'profile', subfield: 'saw_zoom_presentation', label_trans: 'reg.saw_zoom_presentation', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'profile.special_req', field: 'profile', subfield: 'special_req', label_trans: 'reg.special_req', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'profile.vuole_ritessersi', field: 'profile', subfield: 'vuole_ritessersi', label_trans: 'reg.vuole_ritessersi', fieldtype: tools.FieldType.boolean }),
AddCol({ name: 'profile.saw_and_accepted', field: 'profile', subfield: 'saw_and_accepted', label_trans: 'reg.saw_and_accepted', fieldtype: tools.FieldType.binary, jointable: 'accepted' }),
AddCol({ name: 'profile.my_dream', field: 'profile', subfield: 'my_dream', label_trans: 'reg.my_dream' }),
AddCol({ name: 'profile.nationality', field: 'profile', subfield: 'nationality', label_trans: 'reg.nationality' }),
@@ -519,6 +551,20 @@ export const fieldsTable = {
colkey: 'key',
collabel: 'label'
},
{
value: 'navi',
label: 'Navi',
columns: colnavi,
colkey: '_id',
collabel: (rec) => rec.riga + '.' + rec.col
},
{
value: 'listaingressos',
label: 'Lista Ingresso',
columns: collistaingresso,
colkey: '_id',
collabel: 'indprimario',
},
{
value: 'disciplines',
label: 'Discipline',
@@ -526,7 +572,6 @@ export const fieldsTable = {
colkey: 'typol_code',
collabel: 'label'
},
{
value: 'newstosent',
label: 'Newsletter da Inviare',
@@ -577,10 +622,8 @@ export const fieldsTable = {
{
value: 'accepted',
label: 'Condizioni',
columns: colTablePermission,
colkey: 'value',
collabel: 'label',
colicon: 'icon',
noshow: true,
},
{

View File

@@ -21,6 +21,7 @@ export const lists = {
DELETE_EXTRALIST: 330,
DELETE_USERLIST: 335,
REGALA_INVITATO: 340,
INVIA_MSG_A_DONATORI: 350,
CAN_EDIT_TABLE: 400,
SHOW_PREV_REC: 401

View File

@@ -52,12 +52,16 @@ export interface INotify {
export const tools = {
CAN_EDIT: 'q-ce',
getprefCountries: ['it', 'si', 'us', 'es', 'pt', 'uk', 'fr', 'de', 'ch'],
getprefCountries: ['it', 'si', 'us', 'es', 'pt', 'uk', 'fr', 'de', 'ch', 'br', 'sk'],
APORTADOR_NONE: '------',
APORTADOR_SOLIDARIO: 'apsol',
TipoMsg: {
SEND_LINK_CHAT_DONATORI: 1,
},
listBestColor: [
'blue',
'green',
@@ -1416,7 +1420,7 @@ export const tools = {
executefunc(myself: any, table, func: number, par: IParamDialog) {
if (func === lists.MenuAction.DELETE) {
console.log('param1', par.param1)
// console.log('param1', par.param1)
CalendarStore.actions.CancelBookingEvent({
ideventbook: par.param1,
notify: par.param2 === true ? '1' : '0'
@@ -1429,7 +1433,7 @@ export const tools = {
tools.showNegativeNotif(myself.$q, myself.$t('cal.cancelederrorbooking'))
})
} else if (func === lists.MenuAction.DELETE_EVENT) {
console.log('param1', par.param1, 'id', par.param1._id)
// console.log('param1', par.param1, 'id', par.param1._id)
CalendarStore.actions.CancelEvent({ id: par.param1._id }).then((ris) => {
if (ris) {
// Remove this record from my list
@@ -1477,7 +1481,7 @@ export const tools = {
tools.showNegativeNotif(myself.$q, myself.$t('db.recfailed'))
})
} else if (func === lists.MenuAction.DELETE_RECTABLE) {
console.log('param1', par.param1)
// console.log('param1', par.param1)
GlobalStore.actions.DeleteRec({ table, id: par.param1 }).then((ris) => {
if (ris) {
myself.ActionAfterYes(func, par.param2, null)
@@ -1486,7 +1490,7 @@ export const tools = {
tools.showNegativeNotif(myself.$q, myself.$t('db.recdelfailed'))
})
} else if (func === lists.MenuAction.DUPLICATE_RECTABLE) {
console.log('param1', par.param1)
// console.log('param1', par.param1)
GlobalStore.actions.DuplicateRec({ table, id: par.param1 }).then((ris) => {
if (ris) {
myself.ActionAfterYes(func, par.param2, ris.data)
@@ -1494,6 +1498,15 @@ export const tools = {
} else
tools.showNegativeNotif(myself.$q, myself.$t('db.recdupfailed'))
})
} else if (func === lists.MenuAction.INVIA_MSG_A_DONATORI) {
// console.log('param1', par.param1)
GlobalStore.actions.InviaMsgADonatori({ msgobj: par.param1, navemediatore: par.param2 }).then((ris) => {
if (ris) {
tools.showPositiveNotif(myself.$q, myself.$t('dashboard.msg_donatori_ok'))
tools.askConfirm(myself.$q, '', ris.strout, translate('dialog.yes'), translate('dialog.no'), this, '', 0, 0, {})
} else
tools.showNegativeNotif(myself.$q, myself.$t('db.recfailed'))
})
}
},
@@ -1505,7 +1518,6 @@ export const tools = {
notifBot: null
}
GlobalStore.actions.saveFieldValue(mydatatosave).then((ris) => {
if (ris) {
tools.showPositiveNotif(myself.$q, myself.$t('db.recupdated'))
@@ -1613,7 +1625,7 @@ export const tools = {
}
if (!(static_data.arrLangUsed.includes(mylang))) {
console.log('non incluso ', mylang)
// console.log('non incluso ', mylang)
mylang = static_data.arrLangUsed[0]
// Metti come default
@@ -1818,6 +1830,14 @@ export const tools = {
return ''
},
getstrshortDate(mytimestamp) {
// console.log('getstrDate', mytimestamp)
if (!!mytimestamp)
return date.formatDate(mytimestamp, 'DD/MM')
else
return ''
},
getstrTime(mytimestamp) {
// console.log('getstrDate', mytimestamp)
if (!!mytimestamp)
@@ -3051,6 +3071,7 @@ export const tools = {
}
} else {
const ris = GlobalStore.getters.getValueSettingsByKey(keystr, serv)
if (ris === '')
if (def !== undefined)
return def
@@ -3170,6 +3191,8 @@ export const tools = {
return 'fa-flag-es'
else if (lang === 'PT')
return 'fa-flag-pt'
else if (lang === 'BR')
return 'fa-flag-br'
else if (lang === 'US')
return 'fa-flag-us'
else if ((lang === 'GB') || (lang === 'UK'))
@@ -3180,6 +3203,8 @@ export const tools = {
return 'fa-flag-fr'
else if (lang === 'SI')
return 'fa-flag-si'
else if (lang === 'SK')
return 'fa-flag-sk'
else if (lang === 'CH')
return 'fa-flag-ch'
else if (lang === 'CM')
@@ -3231,6 +3256,8 @@ export const tools = {
return 'Italy'
} else if (nat === 'SI') {
return 'Slovenia'
} else if (nat === 'SK') {
return 'Slovakia'
} else if (nat === 'ES') {
return 'Spain'
} else if (nat === 'DE') {
@@ -3275,6 +3302,8 @@ export const tools = {
return 'Poland'
} else if (nat === 'EG') {
return 'Egypt'
} else if (nat === 'BR') {
return 'Brazil'
}
},
@@ -3294,7 +3323,38 @@ export const tools = {
val = val.replace('{' + par.strin + '}', par.strout)
})
return val
}
},
isPayPalSel(user) {
let ispaypal = false
if (user.profile.paymenttypes) {
if (user.profile.paymenttypes.includes('paypal')) {
if (user.email_paypal !== '')
ispaypal = true
}
}
return ispaypal
},
getnumrequisiti(user) {
let req = 0
req += user.verified_email ? 1 : 0
req += user.profile.teleg_id > 0 ? 1 : 0
req += this.isBitActive(user.profile.saw_and_accepted, shared_consts.Accepted.CHECK_READ_GUIDELINES.value) ? 1 : 0
req += this.isBitActive(user.profile.saw_and_accepted, shared_consts.Accepted.CHECK_SEE_VIDEO_PRINCIPI.value) ? 1 : 0
req += user.profile.saw_zoom_presentation ? 1 : 0
if (!!user.profile.my_dream)
req += user.profile.my_dream.length >= 10 ? 1 : 0
req += this.isPayPalSel(user) ? 1 : 0
return req
},
Is7ReqOk(user) {
return this.getnumrequisiti(user) === 7
},
// getLocale() {
// if (navigator.languages && navigator.languages.length > 0) {

View File

@@ -5,20 +5,29 @@ import { GlobalStore } from '@store'
import { tools } from '../../../store/Modules/tools'
import { UserStore } from '../../../store/Modules'
import { CTitleBanner } from '../../../components/CTitleBanner'
import { CDateTime } from '../../../components/CDateTime'
import { CMyFieldDb } from '../../../components/CMyFieldDb'
@Component({
components: { CTitleBanner }
components: { CTitleBanner, CDateTime, CMyFieldDb }
})
export default class Dbop extends Vue {
public $t
public ris: any
public ris: any = ''
public riga: number = 0
public numpersone: number = 7
public date_start: Date = new Date()
public col: number = 0
public placca: string = ''
public incaricamento: boolean = false
get tools(){
return tools
}
public async EseguiFunz(miafunz) {
this.$q.dialog({
message: 'Continuare ' + miafunz + ' ?',
message: this.$t('dialog.continue') + ' ' + miafunz + ' ?',
cancel: {
label: this.$t('dialog.cancel')
},
@@ -31,12 +40,31 @@ export default class Dbop extends Vue {
const mydata = {
dbop: miafunz,
riga: this.riga,
col: this.col
col: this.col,
date_start: this.date_start,
numpersone: this.numpersone
}
this.ris = await UserStore.actions.execDbOp({ mydata })
this.incaricamento = true
this.$q.loading.show({ message: this.$t('otherpages.update') })
const ris = await UserStore.actions.execDbOp({ mydata })
this.$q.loading.hide()
await GlobalStore.actions.loadSite()
this.incaricamento = false
console.log('this.ris', this.ris)
this.ris = ''
if (miafunz === 'visuPlacca') {
this.placca = this.ris.placca
this.placca = ris.placca
} else if (miafunz === 'visuListaIngresso' || miafunz === 'visuListaNave' || miafunz === 'visuNave' || miafunz === 'creaNave') {
this.placca = ris.mystr
} else {
this.ris = ris
}
})

View File

@@ -1,7 +1,7 @@
<template>
<div>
<CTitleBanner title="Operazioni su DB:"></CTitleBanner>
<div class="row justify-center q-gutter-sm q-list--bordered center_img" style="max-width: 400px">
<div class="row justify-center q-gutter-sm q-list--bordered center_img" style="max-width: 600px">
<div class="row">
<q-btn label="Passa i codici Telefoni sul campo cell" color="primary"
@click="EseguiFunz('changeCellInt')"></q-btn>
@@ -11,17 +11,84 @@
@click="EseguiFunz('changeEmailLowerCase')"></q-btn>
<br></div>
<div class="row">
<q-btn label="Crea Lista" color="primary" @click="EseguiFunz('creaLista')"></q-btn>
<br></div>
<q-btn label="Crea Utenti Test" color="primary" @click="EseguiFunz('creaUtentiTest')"></q-btn><br>
</div>
<div class="row">
<q-btn label="Crea Billettera" color="primary" @click="EseguiFunz('creaBillettera')"></q-btn>
<br></div>
<q-btn label="IMPOSTARE A TUTTI PAYPAL" color="primary" @click="EseguiFunz('ImpostaATuttiPaypal')"></q-btn><br>
</div>
<div class="row">
<q-btn label="NUM_TESS A 1" color="primary" @click="EseguiFunz('numtessUno')"></q-btn><br>
</div>
<div class="row">
<q-btn label="Inizializza ListaIngresso" color="negative" @click="EseguiFunz('initListaIngresso')"></q-btn><br>
<q-btn label="Crea ListaIngresso" color="negative" @click="EseguiFunz('creaLista')"></q-btn>
</div>
<div class="row">
<q-btn label="Elimina Navi" color="negative" @click="EseguiFunz('delNavi')"></q-btn><br>
</div>
<div class="row">
<q-btn label="Elimina Navi non Partite" color="negative" @click="EseguiFunz('delNaviNoStarted')"></q-btn><br>
</div>
<div>
<CDateTime
:value.sync="date_start"
:label="$t('cal.eventstartdatetime')"
:readonly="false">
</CDateTime>
<q-input v-model="numpersone" type="number" autofocus label="Num Persone to Add" style="width: 50px;"></q-input>
<q-btn label="Crea Nave" color="negative" @click="EseguiFunz('creaNave')"></q-btn>
</div>
<div v-if="!incaricamento" class="row">
<CMyFieldDb title="Riga"
mykey="riga"
:serv="false"
:type="tools.FieldType.number">
</CMyFieldDb>
<CMyFieldDb title="Col"
mykey="col"
:serv="false"
:type="tools.FieldType.number">
</CMyFieldDb>
<CMyFieldDb title="Riga Doni"
mykey="rigadoni"
:serv="false"
:type="tools.FieldType.number">
</CMyFieldDb>
<CMyFieldDb title="Col Doni"
mykey="coldoni"
:serv="false"
:type="tools.FieldType.number">
</CMyFieldDb>
<CMyFieldDb title="Visu_TEST"
mykey="VISU_TEST"
:serv="false"
:type="tools.FieldType.boolean">
</CMyFieldDb>
<CMyFieldDb title="VISU_NAVE_BOT"
mykey="VISU_NAVE_BOT"
:serv="false"
:type="tools.FieldType.boolean">
</CMyFieldDb>
</div>
<div class="row">
<q-btn label="Visualizza Lista Nave" color="primary" @click="EseguiFunz('visuListaNave')"></q-btn><br>
</div>
<div class="row">
<q-btn label="Visualizza ListaIngresso" color="primary" @click="EseguiFunz('visuListaIngresso')"></q-btn><br>
</div>
<div class="row">
<q-btn label="CHECK SE INSERIRE UTENTI IN Nave" color="primary" @click="EseguiFunz('checkInserimentiUtentiInNave')"></q-btn><br>
</div>
<div class="row">
<q-input v-model="riga" type="number" autofocus label="Riga" style="width: 50px;"></q-input>
<q-input v-model="col" type="number" autofocus label="Col" style="width: 50px;"></q-input>
<q-btn label="Visualizza Placca" color="primary" @click="EseguiFunz('visuPlacca')"></q-btn>
<q-input v-model="placca" autofocus label="Col" style="width: 300px; height: 400px;"></q-input>
<q-btn label="Visualizza Nave da 8" color="primary" @click="EseguiFunz('visuPlacca')"></q-btn><br>
<q-btn label="Visualizza Nave" color="primary" @click="EseguiFunz('visuNave')"></q-btn><br>
</div>
<div class="row">
<q-input v-model="placca" type="textarea" autofocus label="Placca" autogrow style="width: 500px; height: 400px;"></q-input>
<br>
</div>
</div>

View File

@@ -1,39 +1,14 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { CSignIn } from '../../../components/CSignIn'
import { toolsext } from '../../../store/Modules/toolsext'
import { UserStore } from '../../../store/Modules'
import globalroutines from '../../../globalroutines/index'
import { tools } from '../../../store/Modules/tools'
// import {Loading, QSpinnerFacebook, QSpinnerGears} from 'quasar'
import CSigninNoreg from '../../../components/CSigninNoreg/CSigninNoreg'
@Component({
components: { CSignIn }
components: { CSigninNoreg }
})
export default class Signin extends Vue {
public $v
public $q
public loginOk() {
tools.loginOk(this, true)
}
public loginInCorso() {
tools.loginInCorso(this)
}
public checkErrors(riscode) {
tools.SignIncheckErrors(this, riscode, true)
}
public showNotif(msgcode) {
tools.showNotif(this.$q, this.$t(msgcode))
}
get mythis() {
return this
}
}

View File

@@ -1,12 +1,9 @@
<template>
<q-page padding class="signin">
<CSignIn :mythis="mythis"
:showregbutt="true"
@loginOk="loginOk"
@loginInCorso="loginInCorso"
@checkErrors="checkErrors"
@showNotif="showNotif">
</CSignIn>
<CSigninNoreg :showregbutt="true">
</CSigninNoreg>
</q-page>
</template>

View File

@@ -1,39 +1,7 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import { CSignIn } from '../../../components/CSignIn'
import { toolsext } from '../../../store/Modules/toolsext'
import { UserStore } from '../../../store/Modules'
import globalroutines from '../../../globalroutines/index'
import { tools } from '../../../store/Modules/tools'
// import {Loading, QSpinnerFacebook, QSpinnerGears} from 'quasar'
@Component({
components: { CSignIn }
})
export default class Signin_noreg extends Vue {
public $v
public $q
public loginOk() {
tools.loginOk(this, true)
}
public loginInCorso() {
tools.loginInCorso(this)
}
public checkErrors(riscode) {
tools.SignIncheckErrors(this, riscode, true)
}
public showNotif(msgcode) {
tools.showNotif(this.$q, this.$t(msgcode))
}
get mythis() {
return this
}
}

View File

@@ -1,12 +1,7 @@
<template>
<q-page padding class="signin">
<CSignIn :mythis="mythis"
@loginOk="loginOk"
@loginInCorso="loginInCorso"
:showregbutt="false"
@checkErrors="checkErrors"
@showNotif="showNotif">
</CSignIn>
<CSignInNoreg>
</CSignInNoreg>
</q-page>
</template>

View File

@@ -7,8 +7,12 @@ import { serv_constants } from '../../../store/Modules/serv_constants'
import './vreg.scss'
import { ILinkReg } from '../../../model/other'
import { CSigninNoreg } from '../../../components/CSigninNoreg'
import { GlobalStore } from '../../../store'
@Component({})
@Component({
components: { CSigninNoreg }
})
export default class Vreg extends Vue {
public risultato: string = '---'
public riscode: number = 0
@@ -57,4 +61,8 @@ export default class Vreg extends Vue {
console.log('ERR = ' + err)
})
}
public openrighttoolbar() {
GlobalStore.state.RightDrawerOpen = true
}
}

View File

@@ -34,6 +34,11 @@
</q-banner>
</transition>
<div class="text-center q-mt-md">
<q-btn rounded size="lg" color="primary" @click="openrighttoolbar">{{$t('login.enter')}}
</q-btn>
</div>
</div>
</q-page>

View File

@@ -2,6 +2,8 @@ import { Component, Mixins, Prop, Watch } from 'vue-property-decorator'
import MixinBase from '../../../mixins/mixin-base'
import { CMyFieldDb, CTitleBanner, CProfile, CStatus } from '@components'
import { UserStore } from '../../../store/Modules'
import { GlobalStore } from '../../../store'
import { tools } from '../../../store/Modules/tools'
@Component({
components: { CProfile, CTitleBanner, CMyFieldDb, CStatus }
@@ -18,8 +20,48 @@ export default class Profile extends MixinBase {
get getpayment() {
return UserStore.state.my.profile.paymenttypes
}
get profile() {
return UserStore.state.my.profile
}
public eliminaAccount() {
this.$q.dialog({
message: this.$t('reg.cancellami'),
cancel: {
label: this.$t('dialog.cancel')
},
ok: {
label: this.$t('dialog.yes'),
push: true
},
title: this.$t('pages.profile')
}).onOk(async () => {
this.$q.dialog({
message: this.$t('reg.cancellami_2'),
cancel: {
label: this.$t('dialog.cancel')
},
ok: {
label: this.$t('dialog.yes'),
push: true
},
title: this.$t('pages.profile')
})
.onOk(async () => {
GlobalStore.actions.DeleteRec({ table: tools.TABUSER, id: UserStore.state.my._id })
.then((ris) => {
if (ris) {
tools.showPositiveNotif(this.$q, this.$t('reg.account_cancellato'))
UserStore.actions.logout()
this.$router.replace('/')
} else
tools.showNegativeNotif(this.$q, this.$t('db.recfailed'))
})
})
})
}
}

View File

@@ -92,6 +92,13 @@
</CMyFieldDb>
</CTitleBanner>
<br><br>
<div class="text-center">
<q-btn rounded size="md" color="negative" @click="eliminaAccount" :label="$t('reg.cancella_account')">
</q-btn>
</div>
</div>
</template>