- Migliorata la Notifica degli Eventi su Telegram

- Gli annunci (beni/servizi/ospitalità) ora possono essere visti anche tramite un link, anche per chi non è dentro alla App.
- Aggiunto bottone "Aggiorna" per aggiornare il Saldo attuale.
- I "Conti Collettivi" ora vengono chiamati Gruppi (o Conto di Gruppo).
This commit is contained in:
Surya Paolo
2023-10-01 01:24:55 +02:00
parent bfceb64811
commit 31598e3fbd
43 changed files with 784 additions and 515 deletions

View File

@@ -15,6 +15,7 @@ export const shared_consts = {
color: 'green',
},
},
LIMIT_NOTIF_FOR_USER: 200,
ELEMTYPE: {
TITLE: 5,
@@ -57,6 +58,7 @@ export const shared_consts = {
BTN_LOGIN: 260,
FOOTER: 270,
PROFILETUTORIAL: 280,
VISUVIDEOPROMOANDPDF: 290
},
QUERYTYPE_MYGROUP: 1,
@@ -1464,6 +1466,10 @@ export const shared_consts = {
value: 270,
label: 'Footer',
},
{
value: 280,
label: 'Visu Promo and PDF',
},
{
value: 40,
label: 'Separatore',
@@ -1766,6 +1772,7 @@ export const shared_consts = {
lasttimeonline: 1,
comune: 1,
mycities: 1,
lang: 1,
'profile.img': 1,
'profile.mygroups': 1,
'profile.mycircuits': 1,

View File

@@ -33,6 +33,7 @@ export default defineComponent({
costanti,
static_data,
site,
t,
}
}
})

View File

@@ -1,56 +1,7 @@
<template>
<div v-if="showalways || (!showalways && !tools.isLogged())">
<div class="q-pa-md q-gutter-sm">
<div id="logo" class="text-center">
<q-img
id="logoimg"
:src="tools.getimglogo()"
class="q-my-sm"
alt="logo APP"
style="height: 100px; width: 100px"
/>
</div>
<q-banner
v-if="site.confpages.videoPromo"
rounded
dense
size="lg"
class="bg-grey-3 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">Video di Presentazione:</div>
<br />
<q-video :src="site.confpages.videoPromo" :ratio="16 / 9"> </q-video>
</q-banner>
<q-banner
v-if="site.confpages.PDFPromo"
rounded
dense
size="lg"
class="bg-grey-3 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">PDF Presentazione RISO:</div>
<br />
<template v-slot:action>
<q-btn
type="a"
rounded
icon="fab fa-telegram"
color="primary"
:href="site.confpages.PDFPromo"
target="_blank"
label="Scarica PDF"
>
</q-btn>
</template>
</q-banner>
<div class="text-h6 text-center">
<div class=" text-center">
<transition-group
name="fade"
mode="out-in"
@@ -61,30 +12,33 @@
<q-banner
:key="1"
rounded
dense
size="lg"
class="shadow-5 q-my-sm"
class="text-white bg-red"
color="primary q-title"
style="text-align: center"
>
<template v-slot:avatar>
<q-icon :key="2" name="signal_wifi_off" color="primary" />
<q-icon :key="2" name="fas fa-sign-in-alt" color="white" />
</template>
<div class="mybanner" :key="3">
Accedi per Unirti alla RETE e al Circuito di scambio RIS
<div :key="3">
Accedi con le tue credenziali per utilizzare la APP e per unirti
al Circuito di scambio RIS del tuo territorio
</div>
<template v-slot:action>
<q-btn
rounded
icon="fas fa-user"
color="primary"
@click="tools.openrighttoolbar()"
>{{ $t('login.enter') }}
</q-btn>
<CRegistration />
<div>
<q-btn
flat
color="white"
@click="tools.openrighttoolbar()"
>{{ $t('login.enter') }}
</q-btn>
</div>
<!--<CRegistration />-->
</template>
</q-banner>
</transition-group>
<q-separator inset />
<br>
<q-banner
rounded
dense

View File

@@ -141,13 +141,13 @@ export default defineComponent({
const mypagination = computed(() => {
if (props.table === toolsext.TABMYBACHECAS)
return { sortBy: 'dateTimeStart', descending: false, page: 1, rowsNumber: 20, rowsPerPage: 20 }
return { sortBy: 'dateTimeStart', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 }
else if (props.table === toolsext.TABMYGROUPS)
return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 }
return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 0, rowsPerPage: 10 }
else if (props.table === toolsext.TABMOVEMENTS)
return { sortBy: 'transactionDate', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 }
return { sortBy: 'transactionDate', descending: true, page: 1, rowsNumber: 0, rowsPerPage: 20 }
else if (props.table === toolsext.TABCIRCUITS)
return { sortBy: 'numMembers', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 }
return { sortBy: 'numMembers', descending: true, page: 1, rowsNumber: 0, rowsPerPage: 20 }
else if (props.table === toolsext.TABUSER)
return userStore.getMypaginationMembers()
else if (shared_consts.TABLES_ORDER_DATE_UPDATED.includes(props.table))
@@ -155,7 +155,7 @@ export default defineComponent({
else if (shared_consts.TABLES_ORDER_DESCR.includes(props.table))
return { sortBy: 'desc', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 }
return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 }
return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 0, rowsPerPage: 10 }
})
const searchList = computed(() => {

View File

@@ -58,7 +58,7 @@
:defaultnewrec="tools.getdefaultnewrec(table)"
labelBtnAddRow="NONE"
:prop_SortFieldsAvailable="mySortFieldsAvailable"
:labelBtnAddExtra="noButtAdd ? `` : ``"
:labelBtnAddExtra="noButtAdd ? `` : (ind >= 0) ? `Aggiungi ` + costanti.MAINCARDS[ind].strsingolo : ''"
:extraparams="tools.extraparams(table, {myrecfiltertoggle})"
>
</CGridTableRec>

View File

@@ -49,13 +49,18 @@ export default defineComponent({
type: String,
required: true,
},
subtitle: {
type: String,
required: false,
default: '',
},
prop_mytable: {
type: String,
required: false,
default: '',
},
prop_mycolumns: {
type: Object as PropType<[]>,
type: Object as PropType<any[]>,
required: false,
default: null,
},
@@ -303,9 +308,10 @@ export default defineComponent({
const globalStore = useGlobalStore()
const isfinishLoading = computed(() => globalStore.finishLoading)
const pagination = ref({ sortBy: 'desc', descending: false, page: 1, rowsNumber: 10, rowsPerPage: 10 } as IPagination)
const pagination = ref({ sortBy: 'desc', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 } as IPagination)
const addRow = ref('Aggiungi')
const actmonth = ref('')
const newRecordBool = ref(false)
const newRecordBoolOld = ref(false)
@@ -317,7 +323,7 @@ export default defineComponent({
const mytable = ref('')
const mytitle = ref('')
const mycolumns = ref([])
const mycolumns = ref([] as any[])
const colkey = ref('')
const search = ref('')
@@ -326,6 +332,7 @@ export default defineComponent({
const showNotification = ref(false)
const loading = ref(false)
const alreadymounting = ref(false)
const editOn = computed({
get: () => globalStore.editOn,
set: val => {
@@ -343,13 +350,13 @@ export default defineComponent({
const myinfscroll = ref(null)
const serverData: any = ref([])
const serverData: any = ref([] as any[])
const numRecLoaded = ref(0)
const spinner_visible = ref(false)
const changetable = ref(false)
const searchList = ref([] as ISearchList[])
const actual = ''
const actual = ref(<any>'')
let idsel = ''
const colsel = ref({ name: '', field: '', sortable: false } as IColGridTable | null)
@@ -386,11 +393,14 @@ export default defineComponent({
const ordinam_desc = ref(false)
const valoriopt = computed(() => (item: any, addall: boolean, addnone: boolean) => {
const getNumRecFromQuery = computed(() => () => {
return serverData.value.length
})
const valoriopt = computed(() => (item: any, addall?: boolean, addnone?: boolean) => {
// console.log('valoriopt', item.table)
return globalStore.getTableJoinByName(item.table, addall, addnone, item.filter)
})
const lengthopt = computed(() => (item: any, addall: boolean, addnone: boolean) => {
const lengthopt = computed(() => (item: any, addall: boolean, addnone?: boolean) => {
// console.log('valoriopt', item.table)
const valori = globalStore.getTableJoinByName(item.table, addall, addnone, item.filter)
return (valori ? valori.length : 0)
@@ -1094,6 +1104,7 @@ export default defineComponent({
myinfscroll.value.resume()
}
done()
alreadymounting.value = true
return
}
@@ -1158,6 +1169,8 @@ export default defineComponent({
// console.log(' ...DONE ')
done(pagination.value.rowsNumber === 0 ? true : false)
alreadymounting.value = true
})
} else {
startsearch.value = false
@@ -1169,7 +1182,6 @@ export default defineComponent({
}
}
function refresh_arr() {
const myarr = [...serverData.value]
serverData.value = []
@@ -1185,7 +1197,7 @@ export default defineComponent({
}
function refresh_infscroll(done: any) {
// console.log('refresh_infscroll', 'pag', pagination.value.rowsNumber)
console.log('refresh_infscroll', 'pag', pagination.value.rowsNumber, 'done', done)
rowclicksel.value = null
onUpdateData(0,
@@ -1197,7 +1209,7 @@ export default defineComponent({
function refresh() {
// console.log('refresh', 'startsearch', startsearch.value)
console.log('refresh', 'startsearch', startsearch.value)
clickbuttsearch.value = true
// console.log('refresh')
@@ -1508,12 +1520,13 @@ export default defineComponent({
myvertical.value = props.vertical
// myvertical.value = tools.getCookie('myv_' + props.prop_mytable, props.vertical)
showfilter.value = tools.getCookie('s_adv', '0') !== '0'
showfilter.value = props.prop_showfilter || (tools.getCookie('s_adv', '0') !== '0')
}
function mounted() {
searchList.value = props.prop_searchList
// console.log('GridTable mounted', tablesel.value)
// console.log('props.filtercustom', props.filtercustom)
@@ -1548,7 +1561,8 @@ export default defineComponent({
// console.log('2) tablesel', tablesel.value)
changeTable(tablesel.value)
changeTable(tablesel.value, true)
}
@@ -1696,7 +1710,7 @@ export default defineComponent({
}
}
function changeTable(mysel: any) {
function changeTable(mysel: any, mounted: boolean) {
// console.log('changeTable', tablesel.value)
changetable.value = true
if (tablesel.value === undefined || tablesel.value === '')
@@ -2171,7 +2185,7 @@ export default defineComponent({
if (index > 1) {
// console.log('onLoadScroll', index, 'RECLOAD', numRecLoaded.value, 'ROWS: ', pagination.value.rowsNumber, 'PAGE: ', pagination.value.page)
if (numRecLoaded.value < pagination.value.rowsNumber || (pagination.value.rowsNumber <= 0 && clickbuttsearch.value)) {
if ((numRecLoaded.value < pagination.value.rowsNumber || (pagination.value.rowsNumber <= 0 && clickbuttsearch.value))) {
if (pagination.value.rowsNumber === 0) {
pagination.value.page = 0
}
@@ -2369,6 +2383,9 @@ export default defineComponent({
lengthopt,
update_col,
startsearch,
getNumRecFromQuery,
actmonth,
alreadymounting,
}
}
})

View File

@@ -66,19 +66,27 @@
<q-spinner-tail size="2em" color="primary" />
</q-inner-loading>
<CTitleBanner
v-if="subtitle"
:title="subtitle"
bgcolor="bg-blue"
clcolor="text-white"
>
</CTitleBanner>
<div v-if="shared_consts.VERTIC_SHOW_GRID.includes(myvertical)">
<div v-if="(prop_search || canEdit) && finder" class="q-my-xs text-right">
<!--<q-btn
size="sm"
dense
icon="fas fa-filter"
:label="$t('grid.showfilters')"
:label="t('grid.showfilters')"
@click="showfilter = !showfilter"
></q-btn>
-->
</div>
<q-slide-transition>
<div v-show="showfilter || prop_showfilter">
<div v-show="showfilter">
<div
v-show="searchList"
:class="$q.screen.lt.sm ? `` : `row` + ` text-blue `"
@@ -89,7 +97,7 @@
v-if="
(item.type === costanti.FieldType.select ||
item.type === costanti.FieldType.select_by_server) &&
lengthopt(item, false) > 1
lengthopt(item, false, false) > 1
"
:label="labelcombo(item)"
v-model:value="item.value"
@@ -108,7 +116,7 @@
:icon_alternative="item.icon"
:optval="fieldsTable.getKeyByTable(item.table)"
:optlab="fieldsTable.getLabelByTable(item.table)"
:options="valoriopt(item, false)"
:options="valoriopt(item, false, false)"
:filter="item.filter"
:filter_extra="item.filter_extra"
:useinput="
@@ -236,7 +244,7 @@
>
<q-btn
dense
label="Filtra Ricerca"
:label="!showfilter ? 'Apri Filtri' : 'Chiudi Filtri'"
color="positive"
icon="fas fa-filter"
@click="showfilter = !showfilter"
@@ -249,18 +257,11 @@
{{ getNumFilterSelected() }}
</q-badge>
</q-btn>
<q-btn
dense
icon="add"
color="primary"
@click="createNewRecordDialog"
/>
<q-btn
dense
color="orange"
icon="fas fa-bell"
label="Avvisami se..."
label="Notifiche"
@click="showNotification = !showNotification"
></q-btn>
</div>
@@ -272,11 +273,14 @@
type="search"
debounce="500"
:hint="hint"
:error-message="noresultLabel"
:error="getNumRecFromQuery() === 0 && !startsearch"
label="Cerca"
v-on:keyup.enter="doSearch"
>
<template v-slot:prepend>
<q-icon name="search" />
<q-spinner-oval v-if="startsearch" color="primary" size="1em" />
<q-icon v-else name="search" />
</template>
<template v-slot:after>
<q-select
@@ -320,7 +324,7 @@
multiple
dense
options-dense
:display-value="$t('grid.columns')"
:display-value="t('grid.columns')"
emit-value
map-options
:options="mycolumns"
@@ -330,11 +334,13 @@
</q-select>
</div>
<div v-if="pagination.rowsNumber === 1 && prop_search">
{{ pagination.rowsNumber }} elemento trovato
</div>
<div v-if="pagination.rowsNumber > 1 && prop_search">
{{ pagination.rowsNumber }} {{ labelElemFind }}
<div class="q-ma-sm">
<div v-if="pagination.rowsNumber === 1 && prop_search">
{{ pagination.rowsNumber }} elemento trovato
</div>
<div v-if="pagination.rowsNumber > 1 && prop_search">
{{ pagination.rowsNumber }} {{ labelElemFind }}
</div>
</div>
<div v-if="choose_visutype && $q.screen.gt.xs" class="">
@@ -355,15 +361,16 @@
</div>
<q-infinite-scroll
ref="myinfscroll"
v-if="shared_consts.VERTIC_SHOW_GRID.includes(myvertical) && !loading"
v-if="
shared_consts.VERTIC_SHOW_GRID.includes(myvertical) &&
!loading &&
alreadymounting
"
:initial-index="0"
@load="onLoadScroll"
:offset="350"
debounce="300"
>
<div v-if="numRecLoaded === 0 && !startsearch">
<div class="text-grey text-italic">{{ nodataLabel }}</div>
</div>
<div v-if="showHeaderCol">
<div
v-for="col in mycolumns"
@@ -571,13 +578,15 @@
</div>
</div>
<template v-slot:loading>
<div class="row justify-center q-my-md">
<q-spinner-dots color="primary" size="40px" />
</div>
<div class="row justify-center q-my-md">
<q-spinner-dots color="primary" size="40px" />
</div>
</template>
</q-infinite-scroll>
<q-table
v-else
v-else-if="
!shared_consts.VERTIC_SHOW_GRID.includes(myvertical) && !loading
"
:grid="shared_consts.VERTIC_SHOW_GRID.includes(myvertical)"
:grid-header="
shared_consts.VERTIC_SHOW_GRID.includes(myvertical) &&
@@ -654,15 +663,6 @@
>
<span style="display: none">{{ (actual = null) }}</span>
<q-btn
v-if="enableExport"
color="primary"
icon-right="archive"
:label="t('export.csv')"
no-caps
@click="exportTable"
/>
<q-select
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
v-if="tablesList"
@@ -677,6 +677,15 @@
>
</q-select>
<q-btn
v-if="enableExport"
color="primary"
icon-right="archive"
:label="t('export.csv')"
no-caps
@click="exportTable"
/>
<div class="row">
<q-toggle
v-for="(filt, index) of arrfilters"
@@ -857,6 +866,8 @@
type="search"
debounce="500"
:hint="hint"
:error-message="noresultLabel"
:error="getNumRecFromQuery() === 0 && !startsearch"
label="Cerca"
v-on:keyup.enter="doSearch"
>
@@ -889,7 +900,7 @@
multiple
dense
options-dense
:display-value="$t('grid.columns')"
:display-value="t('grid.columns')"
emit-value
map-options
:options="mycolumns"
@@ -1278,13 +1289,13 @@
</q-card-section>
<q-card-actions align="center">
<q-btn
:label="$t('dialog.insert')"
:label="t('dialog.insert')"
color="primary"
@click="saveNewRecord"
></q-btn>
<q-btn
flat
:label="$t('dialog.cancel')"
:label="t('dialog.cancel')"
color="primary"
v-close-popup
@click="annulla"
@@ -1352,13 +1363,13 @@
</q-card-section>
<q-card-actions align="center">
<q-btn
:label="$t('dialog.save')"
:label="t('dialog.save')"
color="primary"
@click="saveNewRecord"
></q-btn>
<q-btn
flat
:label="$t('dialog.cancel')"
:label="t('dialog.cancel')"
color="primary"
v-close-popup
@click="annulla"
@@ -1417,13 +1428,13 @@
</q-card-section>
<q-card-actions align="center">
<q-btn
:label="$t('dialog.ok')"
:label="t('dialog.ok')"
color="primary"
@click="saverecModif"
></q-btn>
<q-btn
flat
:label="$t('dialog.cancel')"
:label="t('dialog.cancel')"
color="primary"
@click="cancelrecModif"
></q-btn>

View File

@@ -298,7 +298,7 @@ export default defineComponent({
const globalStore = useGlobalStore()
const isfinishLoading = computed(() => globalStore.finishLoading)
const pagination = ref({ sortBy: 'desc', descending: false, page: 1, rowsNumber: 10, rowsPerPage: 10 } as IPagination)
const pagination = ref({ sortBy: 'desc', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 } as IPagination)
const addRow = ref('Aggiungi')

View File

@@ -6,6 +6,7 @@
<q-separator />
<CSaldo
v-if="tools.isUserOk() && myaccount"
:account="myaccount"

View File

@@ -169,11 +169,12 @@ export default defineComponent({
return userStore.my.profile
}
function load() {
async function load() {
// Carica il record
if (props.idRec) {
userStore.loadGeneric(props.table, props.idRec, idnotif.value).then((ris) => {
await userStore.loadGeneric(props.table, props.idRec, idnotif.value).then((ris) => {
console.log('myrec', myrec)
myrec.value = ris
notifStore.setAsRead(idnotif.value)
})
@@ -233,6 +234,10 @@ export default defineComponent({
}
async function clicca(tipo: any, myset: any, title: string) {
if (!userStore.my.username) {
return
}
let mylist = null
if (tipo === costanti.TIPOFAVBOOK.FAVORITE) {
if (myset) {

View File

@@ -2,7 +2,6 @@
<div v-if="myrec && myrec._id" class="fulldiv">
<div class="q-pa-sm row items-start q-gutter-sm full-height fulldiv">
<q-card class="my-card fulldiv" bordered>
idRec: {{ idRec }}
<CGalleryImages
v-if="myrec.photos.length > 0"
:imgGallery="myrec.photos"
@@ -41,6 +40,7 @@
<div class="">
<q-btn flat round color="blue" icon="far fa-eye">
<q-badge
v-if="myrec.myreact"
color="primary"
:label="myrec.myreact.numseen ? myrec.myreact.numseen : 0"
floating
@@ -61,6 +61,7 @@
@click="clicca(costanti.TIPOFAVBOOK.FAVORITE, true, '')"
>
<q-badge
v-if="myrec.myreact"
color="primary"
:label="myrec.myreact.numfav ? myrec.myreact.numfav : 0"
floating
@@ -81,6 +82,7 @@
@click="clicca(costanti.TIPOFAVBOOK.BOOKMARK, true, '')"
>
<q-badge
v-if="myrec.myreact"
color="primary"
:label="myrec.myreact.numbook ? myrec.myreact.numbook : 0"
floating
@@ -124,7 +126,7 @@
</q-item-section>
</q-item>
<q-item
v-if="!nopopup"
v-if="!nopopup && myrec.myreact"
clickable
v-close-popup
@click="naviga(tools.getPathByTableAndRec(table, myrec))"
@@ -138,6 +140,7 @@
</q-item>
<q-separator />
<q-item
v-if="myrec.myreact"
clickable
v-close-popup
@click="
@@ -166,6 +169,7 @@
</q-item-section>
</q-item>
<q-item
v-if="myrec.myreact"
clickable
v-close-popup
@click="
@@ -223,6 +227,7 @@
</q-item-section>
</q-item>
<q-item
v-if="myrec.myreact"
clickable
v-close-popup
@click="

View File

@@ -115,6 +115,7 @@
:qtarem="qtarem"
>
</CSaldo>
</q-item-label>
</q-item-section>
@@ -328,8 +329,10 @@
</q-item-section>
</q-item>
<div class="centermydiv text-center" v-if="visu === costanti.ENTER_TO_THE_CIRCUIT">
<div
class="centermydiv text-center"
v-if="visu === costanti.ENTER_TO_THE_CIRCUIT"
>
<q-btn
v-if="
!userStore.IsMyCircuitByName(circuit.name) &&
@@ -338,7 +341,6 @@
"
icon="fas fa-user-plus"
color="primary"
:label="$t('circuit.ask')"
@click="
requestToEnterCircuit = true;
@@ -441,7 +443,10 @@
<div style="font-weight: bold; font-size: 1.25rem">Regolamento:</div>
<q-btn label="vedi Regolamento" @click="showrules = !showrules">
</q-btn>
<div v-if="showrules" v-html="getRegulation(circuit.regulation)"></div>
<div
v-if="showrules"
v-html="getRegulation(circuit.regulation)"
></div>
</q-card-section>
<q-card-actions align="center">
<q-btn

View File

@@ -119,9 +119,11 @@ export default defineComponent({
}
function mounted() {
async function mounted() {
console.log(' ## INIZIO MOUNT ')
username.value = userStore.my.username
loadCircuits()
await loadCircuits()
console.log(' -- FINE MOUNT ')
}
function updateValue(val: number) {

View File

@@ -34,6 +34,7 @@ import { CNotifAtTop } from '@src/components/CNotifAtTop'
import { CPresentazione } from '@src/components/CPresentazione'
import { CRegistration } from '@src/components/CRegistration'
import { CShareSocial } from '@src/components/CShareSocial'
import { CVisuVideoPromoAndPDF } from '@src/components/CVisuVideoPromoAndPDF'
import MixinMetaTags from '@/mixins/mixin-metatags'
import MixinBase from '@/mixins/mixin-base'
@@ -52,6 +53,7 @@ export default defineComponent({
CPresentazione, CMyActivities,
CMyProfileTutorial, CSendRISTo,
CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration,
CVisuVideoPromoAndPDF,
},
emits: ['selElemClick'],
props: {

View File

@@ -488,6 +488,10 @@
<div v-if="editOn" class="elemEdit">CCheckIfIsLogged</div>
<CCheckIfIsLogged :showalways="myel.container"></CCheckIfIsLogged>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.VISUVIDEOPROMOANDPDF">
<div v-if="editOn" class="elemEdit">Visu Video Promo and PDF</div>
<CVisuVideoPromoAndPDF :showalways="myel.container"></CVisuVideoPromoAndPDF>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.INFO_VERSION">
<div>Versione: {{ tools.getvers() }}</div>
</div>

View File

@@ -181,12 +181,12 @@
><q-icon dense color="blue" name="far fa-check-circle" />
</span>
</span>
<span class="q-mx-xxs">{{ myrec.myreact.numseen ? myrec.myreact.numseen : 0 }}</span>
<span class="q-mx-xxs" v-if="myrec.myreact">{{ myrec.myreact.numseen ? myrec.myreact.numseen : 0 }}</span>
<span class="q-mx-xxs"
><q-icon dense color="blue" name="far fa-eye" />
</span>
<span class="q-mx-xxs">&nbsp;</span>
<span class="">{{ myrec.myreact.numfav ? myrec.myreact.numfav : 0 }}</span>
<span class="" v-if="myrec.myreact">{{ myrec.myreact.numfav ? myrec.myreact.numfav : 0 }}</span>
<span class="q-mx-xxs"
><q-icon
dense

View File

@@ -2,7 +2,7 @@ import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { tools } from '@src/store/Modules/tools'
import { CCurrencyValue } from '../CCurrencyValue'
import { useCircuitStore } from '@store/CircuitStore'
import { date, useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { IAccount, ISpecialField } from 'model'
@@ -57,11 +57,12 @@ export default defineComponent({
const showingtooltip = ref(false)
const visuTransac = ref(false)
const circuitStore = useCircuitStore()
function created() {
// created
}
onMounted(created)
return {
@@ -72,7 +73,7 @@ export default defineComponent({
color_border,
visuTransac,
costanti,
circuitStore,
}
},
})

View File

@@ -39,7 +39,9 @@ export default defineComponent({
const loading = ref(false)
const site = ref(globalStore.site)
const site = computed(() => {
return globalStore.site
})
const myForm = ref(null)

View File

@@ -1,6 +1,7 @@
ù<template>
<div>
<div class="q-my-xs">
title: {{title}}
<CGridTableRec
v-if="filtercustom.length > 0 && col && col.length > 0"
:prop_mytable="table"
@@ -13,10 +14,10 @@
:vertical="costanti.VISUTABLE_LISTA"
:choose_visutype="!visuinpage"
:butt_modif_new="!visuinpage"
nodataLabel="Nessun dato presente"
nodataLabel=" "
:prop_search="false"
:visuinpage="visuinpage"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
noresultLabel="La ricerca non ha ottenuto nessun risultato"
:defaultnewrec="tools.getdefaultnewrec(table, {groupname})"
:filtercustom="filtercustom"
v-bind="$attrs"

View File

@@ -6,6 +6,7 @@
<q-separator />
<CSaldo
v-if="tools.isUserOk() && myaccount"
:account="myaccount"

View File

@@ -0,0 +1,6 @@
#logoimg {
height: 300px;
width: auto;
@media screen and (max-width: 600px) {
}
}

View File

@@ -0,0 +1,38 @@
import { defineComponent, ref, computed, PropType, toRef } from 'vue'
import { useUserStore } from '@store/UserStore'
import { useRouter } from 'vue-router'
import { useGlobalStore } from '@store/globalStore'
import { useI18n } from '@/boot/i18n'
import { tools } from '@store/Modules/tools'
import { costanti } from '@store/Modules/costanti'
import { static_data } from '@src/db/static_data'
export default defineComponent({
name: 'CVisuVideoPromoAndPDF',
components: { },
props: {
showalways: {
type: Boolean,
required: false,
default: false,
},
},
setup(props, { emit }) {
const userStore = useUserStore()
const $router = useRouter()
const globalStore = useGlobalStore()
const { t } = useI18n()
const site = ref(globalStore.site)
return {
userStore,
tools,
costanti,
static_data,
site,
t,
}
}
})

View File

@@ -0,0 +1,61 @@
<template>
<div v-if="showalways || (!showalways && !tools.isLogged())">
<div class="q-pa-md q-gutter-sm">
<div id="logo" class="text-center">
<q-img
id="logoimg"
:src="tools.getimglogo()"
class="q-my-sm"
alt="logo APP"
style="height: 100px; width: 100px"
/>
</div>
<q-banner
v-if="site.confpages.videoPromo"
rounded
dense
size="lg"
class="bg-grey-3 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">Video di Presentazione:</div>
<br />
<q-video :src="site.confpages.videoPromo" :ratio="16 / 9"> </q-video>
</q-banner>
<q-banner
v-if="site.confpages.PDFPromo"
rounded
dense
size="lg"
class="bg-grey-3 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">PDF Presentazione RISO:</div>
<br />
<template v-slot:action>
<q-btn
type="a"
rounded
icon="fab fa-telegram"
color="primary"
:href="site.confpages.PDFPromo"
target="_blank"
label="Scarica PDF"
>
</q-btn>
</template>
</q-banner>
</div>
</div>
</template>
<script lang="ts" src="./CVisuVideoPromoAndPDF.ts">
</script>
<style lang="scss" scoped>
@import './CVisuVideoPromoAndPDF.scss';
</style>

View File

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

View File

@@ -781,6 +781,7 @@ export interface ISearchList {
useinput: boolean
notinsearch?: boolean
addall?: boolean
addnone?: boolean
keycookie?: string
showcount?: boolean
tablesel?: string
@@ -818,6 +819,7 @@ export interface IMsgGlobParam {
typesend: number
sendreally?: boolean
textaddTelegram?: string
textcontent_Telegram?: string
linkaddTelegram?: string
}

View File

@@ -108,6 +108,7 @@ export interface IUserProfile {
username_telegram?: string
website?: string
teleg_id?: number
teleg_id_old?: number
teleg_checkcode?: number
paymenttypes?: IPaymentType[]
manage_telegram?: boolean

View File

@@ -238,7 +238,7 @@ const msg_it = {
domanda_addtogroup: 'Aggiungi {username} al gruppo {groupname}?',
domanda_addfidotocircuit: 'Abilita il fido a {username} al {circuitname}?',
domanda_addtocircuit: 'Aggiungi {username} al {circuitname}?',
domanda_addgrouptocircuit: 'Aggiungi il Conto Collettivo {groupname} al {circuitname}?',
domanda_addgrouptocircuit: 'Aggiungi il Conto del Gruppo {groupname} al {circuitname}?',
addedfriend: 'Aggiunto alla lista di Amici',
addedhandshake: 'Aggiunto alla lista Strette di Mano',
addedgroup: 'Aggiunto al Gruppo',
@@ -536,14 +536,14 @@ const msg_it = {
sospeso: 'Sospeso',
username: 'Username',
username_reg: 'Username',
username_reg_collettivo: 'Username Collettivo',
username_reg_collettivo: 'Username Gruppo',
username_hint: 'caratteri consentiti: tratteggio (_)',
username_pseudonimo: 'Username (Pseudonimo)',
username_short: 'Username',
name: 'Nome',
insert_name: 'Inserisci il tuo Nome (o Soprannome)',
name_opt: 'Nome (Facoltativo)',
name_opt_collettivo: 'Nome del Collettivo',
name_opt_collettivo: 'Nome del Gruppo',
surname: 'Cognome',
insert_surname: 'Inserisci il Cognome',
surname_opt: 'Cognome (facoltativo)',
@@ -873,9 +873,9 @@ const msg_it = {
new_rec_bacheca_descr: 'Avvisami quando viene aggiunto un Annuncio:',
friends: 'Richieste di Amicizia',
groups: 'Gruppi',
friends_descr: 'Avvisami se:',
friends_descr: 'Notifiche:',
events: 'Eventi',
events_descr: 'Avvisami se:',
events_descr: 'Notifiche:',
circuits: 'Circuiti',
circuits_descr: 'Avvisami:',
booking: 'Prenotazioni',
@@ -1179,7 +1179,7 @@ const msg_it = {
hidden_descr: 'il Gruppo non sarà visibile nella ricerca',
page: 'Pagina',
circuits: 'Circuiti',
groupname: 'Conto Collettivo',
groupname: 'Gruppo',
contocom: 'Conto Comunitario',
events: 'Eventi',
},
@@ -1226,11 +1226,11 @@ const msg_it = {
vaialcircuito: 'Vai al Circuito',
iscritti: 'iscritti trovati',
coins_requestedris: 'Il tuo utente {username} sarà visibile sulla lista dei riceventi per 8 ore. Fai cliccare \'Invia RIS a..\' a chi ti deve inviare i RIS.',
coins_requestedrisgroup: 'Il Conto Collettivo {groupname} sarà visibile sulla lista dei riceventi per 8 ore. Fai cliccare \'Invia RIS a..\' a chi ti deve inviare i RIS.',
coins_requestedrisgroup: 'Il Conto del Gruppo {groupname} sarà visibile sulla lista dei riceventi per 8 ore. Fai cliccare \'Invia RIS a..\' a chi ti deve inviare i RIS.',
lista_ricev_title: 'Questa è la lista degli Utenti che hanno cliccato su "Ricevi RIS" nelle ultime 8 ore',
info: 'Informazioni su questo Circuito',
aggiuntive: 'Il Circuito è una una rete di individui, che fanno riferimento ad un territorio provinciale, nella quale ciascuno può offrire i propri talenti, competenze e produzioni (Beni, Servizi, Ospitalità, ecc.) e riceverne da altri, utilizzando anche i <strong>RIS</strong> come metodo di scambio, sulla base di <strong>relazioni di fiducia</strong>.',
collettivi_info: 'Il Conto Collettivo è affidato ad un gruppo di persone, attivo nel territorio provinciale, che lo utilizza per organizzare iniziative di interesse comune, nello spirito di Riso.',
collettivi_info: 'Un Gruppo attivo nel territorio provinciale, che condivida le finalità del Progetto RISO, può creare un Profilo del Gruppo ed attivare un proprio Conto all\'interno del Circuito RIS in cui è presente.',
name: 'Nome Circuito',
path: 'Nome Pagina',
subname: 'SottoNome',
@@ -1303,7 +1303,7 @@ const msg_it = {
sendcoins: 'Invia RIS',
sendcoins_toso: 'Invia RIS a',
receive_coins: 'Ricevi RIS',
info_contocom: 'Il conto Comunitario potrà essere utilizzato per facilitare gli scambi tra gli iscritti, finanziare progetti per la provincia, aiutare situazioni particolari.',
info_contocom: 'Il Conto Comunitario viene gestito collettivamente dai membri del Circuito Territoriale ed utilizzato per progetti comuni, per investimenti di solidarietà o per fare fronte ad eventuali situazioni di difficol.',
sendcoins_tocom: 'Invia RIS a Conto Comunitario',
sendcoinsto: 'Invia {qty} {coin} a {dest}',
question_sendcoinsto: 'Inviare {qty} {coin} a {dest}?',
@@ -1317,16 +1317,19 @@ const msg_it = {
refuse_coins_qty: 'Rifiuta',
refuse_coins: 'Rifiuta RIS',
movements: 'Movimenti',
movements_made: 'Movimenti effettuati',
contocomunitario: 'Conto Comunitario',
conticollettivi: 'Conti Collettivi',
listaconticollettivi: 'Lista Conti Collettivi',
comunitario: 'Comunitario',
conticollettivi: 'Gruppi',
contideigruppi: 'Conti dei Gruppi',
listaconticollettivi: 'Lista Gruppi',
qta_remaining_to_send: 'Quantità massima inviabile {maxqta} {symbol}',
qta_not_valid: 'Quantità non valida',
qta_max_to_send: 'Quantità massima inviabile {maxqta} {symbol}',
transaction_suspended: 'Transazioni sospese',
choosecontocom: 'Scegli il tuo Conto Collettivo',
choosecontocom: 'Scegli il Conto del Gruppo',
contocom: 'Conto Comunitario',
contocoll: 'Conto Collettivo',
contocoll: 'Conto del Gruppo',
user: 'Utente',
sender: 'Mittente',
dest: 'Destinatario',
@@ -1358,10 +1361,10 @@ const msg_it = {
movement: {
transactionDate: 'Data Transazione',
accountFromId: 'Dal Conto',
accountFromCollId: 'Dal Conto Collettivo',
accountFromCollId: 'Dal Conto del Gruppo',
accountFromComId: 'Dal Conto Com.',
accountToId: 'Al Conto',
accountToCollId: 'Al Conto Collettivo',
accountToCollId: 'Al Conto del Gruppo',
accountToComId: 'Al Conto Com.',
amount_sent: 'Quantità inviate',
amount_to_send: 'Quantità da inviare',
@@ -1374,15 +1377,16 @@ const msg_it = {
movin: 'RIS Ricevuti',
movout: 'RIS Inviati',
from: 'Inviate da:',
fromCColl: 'Inviate dal Conto Collettivo:',
fromCColl: 'Inviate dal Conto del Gruppo:',
fromCCom: 'Inviate dal Conto Comunitario:',
to: 'A favore di:',
toCColl: 'Al Conto Collettivo:',
toCColl: 'Al Conto del Gruppo:',
toCCom: 'Al Conto Comunitario:',
pendingtransaction: '* Transazioni Pendenti',
viewpendingtransaction: 'Vedi Transazioni Pendenti',
onlymymov: 'Mostra solo i miei movimenti',
showsaldi: 'Mostra i Saldi dei membri',
updatewallet: 'Aggiorna',
},
editor: {
showtool: 'Mostra strumenti per formattare il testo',

View File

@@ -69,11 +69,11 @@ export const useCircuitStore = defineStore('CircuitStore', {
return 'red'
},
getCircuitByName(circuitname: string): ICircuit | undefined | null {
getCircuitByName(circuitname: string): ICircuit | undefined | null {
return this.listcircuits.find((rec: ICircuit) => rec.name === circuitname)
},
getCircuitByProvince(prov: string): ICircuit | undefined | null {
getCircuitByProvince(prov: string): ICircuit | undefined | null {
return this.listcircuits.find((rec: ICircuit) => rec.strProv === prov)
},
@@ -81,20 +81,20 @@ export const useCircuitStore = defineStore('CircuitStore', {
return this.listcircuits.find((rec: ICircuit) => rec._id === circuitId)
},
getNameByCircuitId(circuitId: string): string {
getNameByCircuitId(circuitId: string): string {
const circuit = this.getCircuitByCircuitId(circuitId);
return circuit && circuit.name ? circuit.name : ''
},
getCircuitsLabelValue(): any {
getCircuitsLabelValue(): any {
let arr = []
for (const circ of this.listcircuits) {
arr.push({label: circ.name, value: circ._id})
arr.push({ label: circ.name, value: circ._id })
}
return arr
},
getCircuitByPath(circuitpath: string): ICircuit | null {
getCircuitByPath(circuitpath: string): ICircuit | null {
const ris = this.listcircuits.find((rec: ICircuit) => rec.path === circuitpath)
return ris ? ris : null
},
@@ -109,7 +109,18 @@ export const useCircuitStore = defineStore('CircuitStore', {
},
getCircuitsListByGroup(mygrp: IMyGroup): ICircuit[] {
async aggiornaSaldo(circuitId: string) {
return Api.SendReq('/users/updatesaldo', 'POST', { circuitId })
.then((res) => {
if (res.data.ris)
tools.updateMyData(res.data.ris)
}).catch((error) => {
return {}
})
},
getCircuitsListByGroup(mygrp: IMyGroup): ICircuit[] {
return this.listcircuits.filter((rec: ICircuit) => mygrp.mycircuits!.findIndex((circ: IMyCircuit) => circ.circuitname === rec.name) >= 0)
},
@@ -122,21 +133,21 @@ export const useCircuitStore = defineStore('CircuitStore', {
},
getAccountByCircuitId(circuitId: string): any {
if (this.listaccounts) {
/*if (this.listaccounts) {
return this.listaccounts.find((rec: IAccount) => rec.circuitId === circuitId)
}
return null
return null*/
},
getAccountsListNameValue(): any[] {
let arr = []
if (this.listaccounts) {
for (const acc of this.listaccounts) {
let chi = acc.username ? acc.username : (acc.groupname ? 'Collettivo: ' + acc.groupname : 'Comunitario: ' + acc.contocom)
let chi = acc.username ? acc.username : (acc.groupname ? 'Gruppo: ' + acc.groupname : 'Comunitario: ' + acc.contocom)
if (acc.circuitId) {
chi = '[' + this.getNameByCircuitId(acc.circuitId) + '] ' + chi
}
arr.push({label: chi, value: acc._id})
arr.push({ label: chi, value: acc._id })
}
}
return arr

View File

@@ -689,7 +689,7 @@ export const colmyMovementTable = [
AddCol({ name: 'transactionDate', label_trans: 'movement.transactionDate', fieldtype: costanti.FieldType.date }),
AddCol({
name: 'userfrom.username',
label_trans: 'reg.username',
label_trans: 'circuit.sender',
field: 'userfrom',
subfield: 'username',
tipovisu: costanti.TipoVisu.LINK,
@@ -724,7 +724,7 @@ export const colmyMovementTable = [
}),
AddCol({
name: 'userto.username',
label_trans: 'reg.username',
label_trans: 'circuit.dest',
field: 'userto',
subfield: 'username',
foredit: false,

View File

@@ -4767,6 +4767,7 @@ export const tools = {
getnumrequisiti(user: IUserFields) {
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
@@ -5111,7 +5112,7 @@ export const tools = {
TelegVerificato(): boolean {
const userStore = useUserStore()
return userStore.my.profile ? userStore.my.profile.teleg_id! > 0 : false
return userStore.my.profile ? userStore.my.profile.teleg_id! > 0 || userStore.my.profile.teleg_id_old! > 0 : false
},
isDebugOn(): boolean {

View File

@@ -190,7 +190,7 @@ export const useNotifStore = defineStore('NotifStore', {
},
async updateNotifDataFromServer({ username, lastdataread }: { username: string, lastdataread: Date }) {
// console.log('updateNotifDataFromServer', username, lastdataread)
console.log('updateNotifDataFromServer', username, lastdataread)
return Api.SendReq(`/sendnotif/${username}/${lastdataread}/${process.env.APP_ID}`, 'GET', null)
.then((res) => {
@@ -210,6 +210,7 @@ export const useNotifStore = defineStore('NotifStore', {
})
},
async SendNotifEvent(notif: INotif) {
console.log('SendNotifEvent', notif)

View File

@@ -608,15 +608,19 @@ export const useUserStore = defineStore('UserStore', {
return tools.getUrlSite() + '/registrati/' + username
},
isTelegIdOk(): boolean {
return (this.my.profile.teleg_id! > 0 || this.my.profile.teleg_id_old! > 0)
},
isUserOk(): boolean {
const globalStore = useGlobalStore()
if (globalStore.site.confpages.enableRegMultiChoice) {
return ((this.my.profile.teleg_id! > 0 && this.isUsernameTelegOk()) || this.my.verified_email!) && this.my.verified_by_aportador!
return ((this.isTelegIdOk() && this.isUsernameTelegOk()) || this.my.verified_email!) && this.my.verified_by_aportador!
} else {
return this.my.profile.teleg_id! > 0 && this.my.verified_by_aportador! && this.isUsernameTelegOk()
return this.isTelegIdOk() && this.my.verified_by_aportador! && this.isUsernameTelegOk()
}
// return this.my.verified_email! && this.my.profile.teleg_id! > 0 && this.my.verified_by_aportador!
// return this.my.verified_email! && this.isTelegIdOk() && this.my.verified_by_aportador!
},
isUserWaitingVerifAportador(): boolean {
@@ -625,17 +629,17 @@ export const useUserStore = defineStore('UserStore', {
isOldRegNotFinished(): boolean {
return tools.isLogged() && ((!this.my.profile.teleg_id || this.my.profile.teleg_id <= 0) || !this.isUsernameTelegOk())
// return this.my.verified_email! && this.my.profile.teleg_id! > 0 && this.my.verified_by_aportador!
// return this.my.verified_email! && this.isTelegIdOk() && this.my.verified_by_aportador!
},
isTelegOk(): boolean {
return this.my.profile.teleg_id! > 0
// return this.my.verified_email! && this.my.profile.teleg_id! > 0 && this.my.verified_by_aportador!
return this.isTelegIdOk()
// return this.my.verified_email! && this.isTelegIdOk() && this.my.verified_by_aportador!
},
isUsernameTelegOk(): boolean {
return !!this.my.profile.username_telegram
// return this.my.verified_email! && this.my.profile.teleg_id! > 0 && this.my.verified_by_aportador!
// return this.my.verified_email! && this.isTelegIdOk() && this.my.verified_by_aportador!
},
getNameSurnameByUserId(userId: string): string {
@@ -1702,6 +1706,12 @@ export const useUserStore = defineStore('UserStore', {
.then((res) => {
if (res && res.data.state === 1) {
if (myrec) {
if (!myrec.myreact) {
myrec.myreact = {
numfav: 0,
}
}
if (!recreaction)
this.my.profile.reaction.push({ id: objectId(), idrec: id, tab, username: this.my.username, fav: true })
else
@@ -1739,6 +1749,11 @@ export const useUserStore = defineStore('UserStore', {
return await Api.SendReq('/reactions/cmd', 'POST', { cmd: CMD_REACTION.SET_ATTEND, id, tab, value })
.then((res) => {
if (res && res.data.state === 1) {
if (!myrec.myreact) {
myrec.myreact = {
numattend: 0,
}
}
if (!myrec.myreact.attend)
myrec.myreact.attend = false
// create a record
@@ -1800,6 +1815,11 @@ export const useUserStore = defineStore('UserStore', {
return await Api.SendReq('/reactions/cmd', 'POST', { cmd: CMD_REACTION.SET_BOOKMARK, id, tab, value })
.then((res) => {
if (res && res.data.state === 1) {
if (!myrec.myreact) {
myrec.myreact = {
numseen: 0,
}
}
if (!myrec.mybook)
myrec.mybook = []
if (!recreaction)
@@ -1813,8 +1833,8 @@ export const useUserStore = defineStore('UserStore', {
//++ this.my.profile.reaction = tools.removeIObjectOnce(this.my.profile.reaction, { id, tab, })
if ((myrec && myrec.mybook) && recreaction)
recreaction.book = false
myrec.myreact.numbook--
//myrec.mybook = myrec.mybook.filter((rec: IFavBook) => rec.username !== this.my.username)
myrec.myreact.numbook--
//myrec.mybook = myrec.mybook.filter((rec: IFavBook) => rec.username !== this.my.username)
tools.showNegativeNotif($q, t('cmd.bookmark_unset'))
}
}).catch((error) => {
@@ -1856,6 +1876,11 @@ export const useUserStore = defineStore('UserStore', {
.then((res) => {
if (res && res.data.state === 1) {
if (value) {
if (!myrec.myreact) {
myrec.myreact = {
numseen: 0,
}
}
myrec.myreact.numseen++
if (!recreaction)
this.my.profile.reaction.push({ id: objectId(), idrec: id, tab, username: this.my.username, seen: true })

View File

@@ -538,6 +538,14 @@
></q-btn>
<br />
</div>
<div class="row">
<q-btn
label="Rimuovi i profile.favorite, bookmark, attend, seen"
color="negative"
@click="EseguiFunz('removeRecordsFav')"
></q-btn>
<br />
</div>
</template>
<script lang="ts" src="./dbop.ts">
</script>

View File

@@ -51,22 +51,26 @@ export default defineComponent({
const showsendCoinTo = ref(false)
const showrules = ref(false)
const showMov = ref(false)
const animation = ref('fade')
const path = computed(() => $route.params.path ? $route.params.path.toString() : '')
const idnotif = computed(() => $route.query.idnotif ? $route.query.idnotif.toString() : '')
const circuitpath_loaded = ref('')
const filtroutente = ref([] as any[])
const showPic = ref(false)
const loadSaldo = ref(false)
const circuit = ref({} as ICircuit | null)
const account = computed(() => circuit.value ? userStore.getAccountByCircuitId(circuit.value._id) : null)
const account = ref(<IAccount | null>null)
const mystatus = ref(0 as number)
const users_in_circuit = ref([] as IFriends[])
const qtarem = computed(() => account.value ? circuitStore.getRemainingCoinsToSend(account.value) : 0)
const saldo = computed(() => account.value ? account.value.saldo : 0)
const qtarem = ref(0)
const saldo = ref(0)
const loading = ref(false)
const requestToEnterCircuit = ref(false)
@@ -86,215 +90,240 @@ export default defineComponent({
const cities = ref([] as ICity[])
const fidoConcesso = computed(() => account.value ? account.value.fidoConcesso : circuit.value!.fido_scoperto_default)
const qtaMax = computed(() => account.value ? account.value.qta_maxConcessa : circuit.value!.qta_max_default)
const fidoConcesso = ref(<any>0)
const qtaMax = ref(<any>0)
watch(() => path.value, (to: any, from: any) => {
loadCircuit()
if (circuitpath_loaded.value !== path.value)
loadCircuit()
})
watch(() => tabcircuit.value, (to: any, from: any) => {
tools.setCookie(tools.COOK_TAB_CIRCUIT + path.value, tabcircuit.value)
})
watch(() => circuit.value, (to: any, from: any) => {
if (to) {
loadAccount()
}
})
function loadAccount() {
// console.log('loadAccount')
account.value = circuit.value ? userStore.getAccountByCircuitId(circuit.value._id) : null
// console.log('saldo', account.value!.saldo)
fidoConcesso.value = account.value ? account.value.fidoConcesso : (circuit.value ? circuit.value.fido_scoperto_default : 0)
qtaMax.value = account.value ? account.value.qta_maxConcessa : (circuit.value ? circuit.value.qta_max_default : 0)
qtarem.value = account.value ? circuitStore.getRemainingCoinsToSend(account.value) : 0
saldo.value = account.value ? account.value.saldo : 0
}
function profile() {
return userStore.my.profile
}
async function loadCircuit() {
console.log(' *** INIZIO loadCircuit')
loading.value = true
// Carica il profilo di quest'utente
if (path.value) {
circuit.value = null
users_in_circuit.value = []
await userStore.loadCircuit(path.value, idnotif.value).then(({ data, status }: { data: any, status: number }) => {
console.log('data', data)
if (data) {
notifStore.setAsRead(idnotif.value)
users_in_circuit.value = data.users_in_circuit
circuit.value = data.circuit
} else {
circuit.value = null
users_in_circuit.value = []
}
if (!loading.value) {
loading.value = true
// Carica il profilo di quest'utente
if (path.value) {
circuitpath_loaded.value = path.value
circuit.value = null
users_in_circuit.value = []
await userStore.loadCircuit(path.value, idnotif.value).then(({ data, status }: { data: any, status: number }) => {
// console.log('data', data)
if (data) {
notifStore.setAsRead(idnotif.value)
users_in_circuit.value = data.users_in_circuit
circuit.value = data.circuit
} else {
circuit.value = null
users_in_circuit.value = []
}
mystatus.value = status
loadAccount()
searchList.value = []
if (circuit.value) {
let addquerysingle = [
mystatus.value = status
];
searchList.value = []
if (circuit.value) {
let addquerysingle = [
filterextra.value = [{
$match: {
idapp: process.env.APP_ID,
'profile.mycircuits': {
$elemMatch: { circuitname: { $eq: circuit.value.name } },
];
filterextra.value = [{
$match: {
idapp: process.env.APP_ID,
'profile.mycircuits': {
$elemMatch: { circuitname: { $eq: circuit.value.name } },
},
},
},
},
{
$lookup: {
from: 'circuits',
as: 'circuit',
let: { circuitname: circuit.value.name, idapp: '$idapp' },
pipeline: [
{
$match:
{
$lookup: {
from: 'circuits',
as: 'circuit',
let: { circuitname: circuit.value.name, idapp: '$idapp' },
pipeline: [
{
$expr:
$match:
{
$and:
[
{ $eq: ['$name', '$$circuitname'] },
{ $eq: ['$idapp', '$$idapp'] },
$expr:
{
$and:
[
{ $eq: ['$name', '$$circuitname'] },
{ $eq: ['$idapp', '$$idapp'] },
],
],
},
},
},
},
],
],
},
},
{ $unwind: '$circuit' },
{
$project: {
username: 1,
name: 1,
surname: 1,
date_reg: 1,
profile: 1, idapp: 1, 'circuit.name': 1, 'circuit._id': 1
}
},
},
{ $unwind: '$circuit' },
{
$project: {
username: 1,
name: 1,
surname: 1,
date_reg: 1,
profile: 1, idapp: 1, 'circuit.name': 1, 'circuit._id': 1
}
},
{
$lookup: {
from: 'accounts',
as: 'account',
let: { username: '$username', idapp: '$idapp', circuitId: '$circuit._id' },
pipeline: [
{
$match:
{
$lookup: {
from: 'accounts',
as: 'account',
let: { username: '$username', idapp: '$idapp', circuitId: '$circuit._id' },
pipeline: [
{
$expr:
$match:
{
$and:
[
{ $eq: ['$$username', '$username'] },
{ $eq: ['$$idapp', '$idapp'] },
{ $eq: ['$$circuitId', '$circuitId'] },
],
$expr:
{
$and:
[
{ $eq: ['$$username', '$username'] },
{ $eq: ['$$idapp', '$idapp'] },
{ $eq: ['$$circuitId', '$circuitId'] },
],
},
},
},
},
],
},
},
{ $unwind: '$account' },
]
filterextra_group.value = [{
$match: {
idapp: process.env.APP_ID,
'mycircuits': {
$elemMatch: { circuitname: { $eq: circuit.value.name } },
],
},
},
},
{ $unwind: '$account' },
]
{
$lookup: {
from: 'circuits',
as: 'circuit',
let: { circuitname: circuit.value.name, idapp: '$idapp' },
pipeline: [
{
$match:
{
$expr:
{
$and:
[
{ $eq: ['$name', '$$circuitname'] },
{ $eq: ['$idapp', '$$idapp'] },
],
},
},
filterextra_group.value = [{
$match: {
idapp: process.env.APP_ID,
'mycircuits': {
$elemMatch: { circuitname: { $eq: circuit.value.name } },
},
],
},
},
},
{ $unwind: '$circuit' },
{
$project: {
groupname: 1,
title: 1,
descr: 1,
photos: 1,
surname: 1,
admins: 1,
idapp: 1,
'circuit.name': 1, 'circuit._id': 1
}
},
{
$lookup: {
from: 'accounts',
as: 'account',
let: { groupname: '$groupname', idapp: '$idapp', circuitId: '$circuit._id' },
pipeline: [
{
$match:
{
$lookup: {
from: 'circuits',
as: 'circuit',
let: { circuitname: circuit.value.name, idapp: '$idapp' },
pipeline: [
{
$expr:
$match:
{
$and:
[
{ $eq: ['$groupname', '$$groupname'] },
{ $eq: ['$idapp', '$$idapp'] },
{ $eq: ['$circuitId', '$$circuitId'] },
$expr:
{
$and:
[
{ $eq: ['$name', '$$circuitname'] },
{ $eq: ['$idapp', '$$idapp'] },
],
],
},
},
},
},
],
],
},
},
{ $unwind: '$circuit' },
{
$project: {
groupname: 1,
title: 1,
descr: 1,
photos: 1,
surname: 1,
admins: 1,
idapp: 1,
'circuit.name': 1, 'circuit._id': 1
}
},
{
$lookup: {
from: 'accounts',
as: 'account',
let: { groupname: '$groupname', idapp: '$idapp', circuitId: '$circuit._id' },
pipeline: [
{
$match:
{
$expr:
{
$and:
[
{ $eq: ['$groupname', '$$groupname'] },
{ $eq: ['$idapp', '$$idapp'] },
{ $eq: ['$circuitId', '$$circuitId'] },
},
{
$unwind: '$account',
},
{
$match: { 'account.groupname': { $exists: true, $ne: '' } }
},
]
}
arrfilterand.value = []
filtercustom_rich.value = []
],
},
},
},
],
},
if (userStore.my.username && circuit.value)
groupsListAdmin.value = userStore.GroupsListWhereIAmAdmin()
},
{
$unwind: '$account',
},
{
$match: { 'account.groupname': { $exists: true, $ne: '' } }
},
]
}
arrfilterand.value = []
filtercustom_rich.value = []
// filtroutente.value = [{ userId: userStore.my._id }]
})
if (userStore.my.username && circuit.value)
groupsListAdmin.value = userStore.GroupsListWhereIAmAdmin()
// filtroutente.value = [{ userId: userStore.my._id }]
})
}
loading.value = false
console.log(' ___ FINE loadCircuit')
}
loading.value = false
}
async function mounted() {
function mounted() {
tabcircuit.value = tools.getCookie(tools.COOK_TAB_CIRCUIT + path.value, 'info')
await loadCircuit()
loadCircuit()
}
@@ -329,6 +358,7 @@ export default defineComponent({
username: 1,
name: 1,
surname: 1,
lang: 1,
'profile.img': 1,
'profile.mycircuits': 1,
'profile.qualifica': 1,
@@ -430,7 +460,7 @@ export default defineComponent({
function getRegulation(reg: string) {
let strreg = reg + ''
if (!reg) {
const mystringa = t('circuit.regolamento', {nomecircuito: circuit.value!.name})
const mystringa = t('circuit.regolamento', { nomecircuito: circuit.value!.name })
return mystringa
} else {
return reg
@@ -438,6 +468,13 @@ export default defineComponent({
}
async function aggiornaSaldo() {
loadSaldo.value = true
await circuitStore.aggiornaSaldo(circuit.value!._id);
loadAccount()
loadSaldo.value = false
}
onMounted(mounted)
return {
@@ -500,6 +537,10 @@ export default defineComponent({
getRegulation,
fidoConcesso,
qtaMax,
showMov,
loadAccount,
aggiornaSaldo,
loadSaldo,
}
}
})

View File

@@ -129,6 +129,134 @@
>
</CSaldo>
</div>
<q-dialog v-model="showMov" :maximized="$q.screen.lt.sm" permanent>
<q-card class="dialog_card">
<q-bar dense class="bg-primary text-white">
{{ t('circuit.movements') }}:
<q-space />
<q-btn
flat
round
color="white"
icon="close"
v-close-popup
></q-btn>
</q-bar>
<q-card-section class="inset-shadow">
<q-toggle
v-model="showonlymine"
:label="t('movement.onlymymov')"
></q-toggle>
<q-toggle v-model="tabellare" label="Tabella"></q-toggle>
<CGridTableRec
v-if="tabellare && !loading"
prop_mytable="movements"
prop_mytitle=""
:prop_mycolumns="colmyMovementTable"
prop_colkey="_id"
col_title="Lista Movimenti"
:vertical="0"
nodataLabel="Nessun Movimento effettuato"
:prop_search="true"
:enableExport="true"
hint="nota da trovare (tabella)"
:finder="false"
:choose_visutype="false"
:finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="movimenti non trovati con questa ricerca"
:arrfilters="arrfilterand"
:filtercustom="filtercustom_rich"
filterextra=""
:filterextra2="filterextra2"
:prop_searchList="searchList"
:prop_pagination="{
sortBy: 'transactionDate',
descending: true,
page: 1,
rowsNumber: 0,
rowsPerPage: 20,
}"
:showType="costanti.SHOW_MOVEMENTS"
:showCol="true"
:showHeaderCol="true"
:extraparams="extraparams_movs()"
extrafield=""
:visufind="costanti.FRIENDS"
>
</CGridTableRec>
<CGridTableRec
v-else-if="!loading"
prop_mytable="movements"
prop_mytitle=""
:prop_mycolumns="colmyMovement"
prop_colkey="_id"
col_title="Lista Movimenti"
:vertical="costanti.VISUTABLE_LISTA"
nodataLabel="Nessun Movimento effettuato"
:enableExport="true"
:prop_search="true"
hint="nota da trovare"
:finder="false"
:choose_visutype="false"
:finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="movimenti non trovati con questa ricerca"
:arrfilters="arrfilterand"
:filtercustom="filtercustom_rich"
:prop_searchList="searchList"
:prop_pagination="{
sortBy: 'transactionDate',
descending: true,
page: 1,
rowsNumber: 20,
rowsPerPage: 20,
}"
:showType="costanti.SHOW_MOVEMENTS"
:showCol="false"
:showHeaderCol="false"
:extraparams="extraparams_movs()"
extrafield=""
:visufind="costanti.FRIENDS"
>
</CGridTableRec>
</q-card-section>
</q-card>
</q-dialog>
</div>
<div class="text-center">
<q-spinner
v-if="loadSaldo"
color="primary"
size="3em"
:thickness="2"
/>
</div>
<q-btn
v-if="account && !loadSaldo"
outline
rounded
dense
color="green"
icon="fas fa-redo"
:label="t('movement.updatewallet')"
@click="aggiornaSaldo()"
>
</q-btn>
<div class="q-ma-sm text-center">
<q-btn
v-if="userStore.IsMyCircuitByName(circuit.name)"
:label="t('circuit.movements_made')"
@click="showMov = !showMov"
icon="fas fa-coins"
rounded
color="primary"
></q-btn>
</div>
<q-banner
@@ -303,9 +431,9 @@
></q-tab>
<q-tab
v-if="userStore.IsMyCircuitByName(circuit.name)"
:label="t('circuit.movements')"
name="mov"
icon="fas fa-coins"
:label="t('circuit.comunitario')"
name="comunitario"
icon="fas fa-campground"
></q-tab>
<q-tab
v-if="!!circuit.note"
@@ -321,6 +449,7 @@
style="max-width: 500px"
v-if="tools.iCanShowCircuitsMember(circuit)"
>
<div class="text-h6">{{ t('circuit.contideigruppi') }}:</div>
<div class="text-h7 q-mb-sm">
<div v-html="$t('circuit.collettivi_info')"></div>
</div>
@@ -514,7 +643,7 @@
prop_colkey="_id"
col_title=""
:vertical="costanti.VISUTABLE_GROUP_CIRCUIT"
nodataLabel="Nessun Conto Collettivo Rifiutato"
nodataLabel="Nessun Conto di Gruppo Rifiutato"
:prop_search="false"
hint="Gruppo da trovare"
:finder="false"
@@ -522,7 +651,7 @@
:finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="Conto Collettivo non trovato"
noresultLabel="Conto di Gruppo non trovato"
:arrfilters="arrfilterand"
:filtercustom="filtercustom_rich"
:filterextra2="filterextra2"
@@ -537,88 +666,6 @@
</q-tab-panel>
</q-tab-panels>
</q-tab-panel>
<q-tab-panel name="mov">
<q-toggle
v-model="showonlymine"
:label="t('movement.onlymymov')"
></q-toggle>
<q-toggle v-model="tabellare" label="Tabella"></q-toggle>
<CGridTableRec
v-if="tabellare && !loading"
prop_mytable="movements"
prop_mytitle=""
:prop_mycolumns="colmyMovementTable"
prop_colkey="_id"
col_title="Lista Movimenti"
:vertical="0"
nodataLabel="Nessun Movimento effettuato"
:prop_search="true"
:enableExport="true"
hint="nota da trovare (tabella)"
:finder="false"
:choose_visutype="false"
:finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="movimenti non trovati con questa ricerca"
:arrfilters="arrfilterand"
:filtercustom="filtercustom_rich"
filterextra=""
:filterextra2="filterextra2"
:prop_searchList="searchList"
:prop_pagination="{
sortBy: 'transactionDate',
descending: true,
page: 1,
rowsNumber: 20,
rowsPerPage: 20,
}"
:showType="costanti.SHOW_MOVEMENTS"
:showCol="true"
:showHeaderCol="true"
:extraparams="extraparams_movs()"
extrafield=""
:visufind="costanti.FRIENDS"
>
</CGridTableRec>
<CGridTableRec
v-else-if="!loading"
prop_mytable="movements"
prop_mytitle=""
:prop_mycolumns="colmyMovement"
prop_colkey="_id"
col_title="Lista Movimenti"
:vertical="costanti.VISUTABLE_LISTA"
nodataLabel="Nessun Movimento effettuato"
:enableExport="true"
:prop_search="true"
hint="nota da trovare"
:finder="false"
:choose_visutype="false"
:finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="movimenti non trovati con questa ricerca"
:arrfilters="arrfilterand"
:filtercustom="filtercustom_rich"
:prop_searchList="searchList"
:prop_pagination="{
sortBy: 'transactionDate',
descending: true,
page: 1,
rowsNumber: 20,
rowsPerPage: 20,
}"
:showType="costanti.SHOW_MOVEMENTS"
:showCol="false"
:showHeaderCol="false"
:extraparams="extraparams_movs()"
extrafield=""
:visufind="costanti.FRIENDS"
>
</CGridTableRec>
</q-tab-panel>
<q-tab-panel name="info">
<div>
<q-card>
@@ -876,48 +923,6 @@
}}</span>
</div>
</q-card>
<q-card v-if="circuit.name">
<q-card-section>
<div class="text-h6">{{ t('circuit.contocomunitario') }}:</div>
<div class="text-h7 q-mb-sm">
{{ $t('circuit.info_contocom') }}
</div>
</q-card-section>
<q-separator />
<q-card-section>
<div class="col-12 text-h7 text-center">
<span v-if="checkifShow('descr')">
<CSaldo
v-if="tools.isUserOk() && circuit.account"
:account="circuit.account"
:symbol="circuit.symbol"
:color="circuit.color"
:saldo="circuit.account.saldo"
:qtarem="
circuit.account
? circuitStore.getRemainingCoinsToSend(
circuit.account
)
: 0
"
>
</CSaldo>
</span>
<div class="">
<q-btn
icon="fas fa-coins"
color="green"
size="md"
rounded
:label="$t('circuit.sendcoins_tocom')"
@click="showsendCoinTo = true"
>
</q-btn>
</div>
</div>
</q-card-section>
</q-card>
</q-tab-panel>
<q-tab-panel name="page">
@@ -1020,7 +1025,50 @@
</q-tab-panel>
</q-tab-panels>
</q-tab-panel>
<q-tab-panel name="mov"> </q-tab-panel>
<q-tab-panel name="comunitario">
<q-card v-if="circuit.name">
<q-card-section>
<div class="text-h6">{{ t('circuit.contocomunitario') }}:</div>
<div class="text-h7 q-mb-sm">
{{ $t('circuit.info_contocom') }}
</div>
</q-card-section>
<q-separator />
<q-card-section>
<div class="col-12 text-h7 text-center">
<span v-if="checkifShow('descr')">
<CSaldo
v-if="tools.isUserOk() && circuit.account"
:account="circuit.account"
:symbol="circuit.symbol"
:color="circuit.color"
:saldo="circuit.account.saldo"
:qtarem="
circuit.account
? circuitStore.getRemainingCoinsToSend(
circuit.account
)
: 0
"
>
</CSaldo>
</span>
<div class="">
<q-btn
icon="fas fa-coins"
color="green"
size="md"
rounded
:label="$t('circuit.sendcoins_tocom')"
@click="showsendCoinTo = true"
>
</q-btn>
</div>
</div>
</q-card-section>
</q-card>
</q-tab-panel>
</q-tab-panels>
<div>
<CGridTableRec

View File

@@ -18,21 +18,22 @@
<CGridTableRec
prop_mytable="users"
prop_mytitle=""
subtitle="Seleziona una Regione o provincia per vedere la lista degli iscritti:"
:prop_mycolumns="colmyUserPeople"
prop_colkey="_id"
col_title="username"
:vertical="costanti.VISUTABLE_LISTA"
nodataLabel="Nessuna persona trovata con questo nome, cognome o username"
nodataLabel=" "
:prop_search="true"
:prop_showfilter="true"
hint="Scegli una Regione o Provincia oppure digita il nome o Username"
hint="Scegli una Regione, Provincia oppure scrivi il nome o Username"
:finder="true"
:choose_visutype="true"
:choose_visutype="false"
:finder_noNull="false"
:finder_noNullFilters="true"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="Username o nome non trovato"
noresultLabel="Username, Nome o Cognome non trovato"
:arrfilters="arrfilterand"
:filtercustom="filtercustom"
:prop_searchList="searchList"

View File

@@ -85,7 +85,7 @@ export default defineComponent({
// Carica il profilo di quest'utente
if (groupname.value) {
await userStore.loadGroup(groupname.value, idnotif.value).then(({ data, status }: { data: any, status: number }) => {
console.log('data', data)
// console.log('data', data)
circuitslist.value = []
if (data) {
mygrp.value = data.mygroup

View File

@@ -13,9 +13,6 @@
</div>
</div>
<div v-else>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<div>
<div
v-if="mygrp.descr"
@@ -541,7 +538,7 @@
sortBy: 'transactionDate',
descending: true,
page: 1,
rowsNumber: 20,
rowsNumber: 0,
rowsPerPage: 20,
}"
:showType="costanti.SHOW_MOVEMENTS"
@@ -667,6 +664,9 @@
</q-card>
</div>
</div>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<q-dialog v-model="showPic" full-height full-width>
<img :src="getImgGrp()" :alt="groupname" class="full-width" />
</q-dialog>

View File

@@ -3,16 +3,17 @@
imgbackground="images/calendario_eventi.jpg"
sizes="max-height: 120px" styleadd="bottom: -20px !important;">
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<CMyCardService
:table="toolsext.TABMYBACHECAS"
:nopopup="true"
:idRec="idBacheca"
>
</CMyCardService>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<!-- <CMyCardPopup
v-if="!!idBacheca"
:table="toolsext.TABMYBACHECAS"

View File

@@ -5,10 +5,6 @@
sizes="max-height: 120px"
styleadd="bottom: -20px !important;"
>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<CMyCardService
v-if="idGood"
:table="toolsext.TABMYGOODS"
@@ -17,6 +13,10 @@
>
</CMyCardService>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<br />
<br />
</CMyPage>

View File

@@ -3,10 +3,6 @@
imgbackground="images/calendario_eventi.jpg"
sizes="max-height: 120px" styleadd="bottom: -20px !important;">
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<CMyCardService
v-if="!!idHosp"
:table="toolsext.TABMYHOSPS"
@@ -18,6 +14,10 @@
<br>
<br>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
</CMyPage>
</template>

View File

@@ -1,18 +1,21 @@
<template>
<CMyPage
:title="username" imgbackground="images/calendario_eventi.jpg"
sizes="max-height: 120px" styleadd="bottom: -20px !important;">
:title="username"
imgbackground="images/calendario_eventi.jpg"
sizes="max-height: 120px"
styleadd="bottom: -20px !important;"
>
<CMyCardService
v-if="idSkill"
:table="toolsext.TABMYSKILLS"
:nopopup="true"
:idRec="idSkill"
>
</CMyCardService>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<div v-else>
<CMyCardService v-if="idSkill"
:table="toolsext.TABMYSKILLS"
:nopopup="true"
:idRec="idSkill">
</CMyCardService>
</div>
<!--
<div class="q-ma-sm q-gutter-sm q-pa-xs">
@@ -38,11 +41,8 @@
</div>
-->
<br>
<br>
<br />
<br />
</CMyPage>
</template>