- Invia Ris a e Ricevi Ris

- Tutorial Guidato Passi da Compiere
- Provincia in cui vivi
- Policy aggiornata
This commit is contained in:
Surya Paolo
2023-03-11 01:01:23 +01:00
parent 7a9689125b
commit 80610b3627
61 changed files with 2308 additions and 925 deletions

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.73" APP_VERSION="0.5.75"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.73" APP_VERSION="0.5.75"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.73" APP_VERSION="0.5.75"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.73" APP_VERSION="0.5.75"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.73" APP_VERSION="0.5.75"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.73" APP_VERSION="0.5.75"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="14" APP_ID="14"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -39,6 +39,7 @@ export const shared_consts = {
MAINVIEW: 130, MAINVIEW: 130,
CHECKAPPRUNNING: 135, CHECKAPPRUNNING: 135,
DASHBOARD: 140, DASHBOARD: 140,
CSENDRISTO: 150,
STATUSREG: 160, STATUSREG: 160,
CHECKIFISLOGGED: 170, CHECKIFISLOGGED: 170,
INFO_VERSION: 180, INFO_VERSION: 180,
@@ -170,6 +171,7 @@ export const shared_consts = {
TABLES_USER_INCLUDE_MY: ['mygroups'], TABLES_USER_INCLUDE_MY: ['mygroups'],
TABLES_GETCOMPLETEREC: ['myskills', 'mybachecas', 'myhosps', 'mygoods'], TABLES_GETCOMPLETEREC: ['myskills', 'mybachecas', 'myhosps', 'mygoods'],
TABLES_INSERT_ALMOST_ONE_TO_ENABLE_CIRCUIT: ['myskills', 'myhosps', 'mygoods'],
TABLES_WITH_FILTER_FIELD: ['caldate'], TABLES_WITH_FILTER_FIELD: ['caldate'],
TABLES_WITH_SPECIAL_FILTER: ['pub_to_share'], TABLES_WITH_SPECIAL_FILTER: ['pub_to_share'],
COL_WITH_FILTER_GTE: ['numMaxPeopleHosp'], COL_WITH_FILTER_GTE: ['numMaxPeopleHosp'],
@@ -1308,6 +1310,10 @@ export const shared_consts = {
value: 140, value: 140,
label: 'Dashboard', label: 'Dashboard',
}, },
{
value: 150,
label: 'SendCoinTo',
},
{ {
value: 280, value: 280,
label: 'Tutorial', label: 'Tutorial',

View File

@@ -1,11 +1,11 @@
<template> <template>
<div v-if="numcol === 3" class="col-xs-4 col-sm-4 col-md-3 col-lg-2"> <div v-if="numcol === 3" class="col-xs-4 col-sm-4 col-md-3 col-lg-2">
<div class="q-ma-sm"> <div class="q-ma-sm">
<q-btn v-if="!small" :flat="flat" class="mybox_3" :color="color" rounded push :to="to" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 180)"> <q-btn v-if="!small" :flat="flat" class="mybox_3" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 180)">
<q-icon class="q-ma-sm" :name="icon"/> <q-icon class="q-ma-sm" :name="icon"/>
<div class="q-ma-sm my-text_3 text-cls no-wrap"><span v-html="label"></span></div> <div class="q-ma-sm my-text_3 text-cls no-wrap"><span v-html="label"></span></div>
</q-btn> </q-btn>
<q-btn v-if="small" :flat="flat" class="mybox_small" :color="color" rounded push :to="to" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 180)"> <q-btn v-if="small" :flat="flat" class="mybox_small" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 180)">
<q-icon class="q-ma-sm" :name="icon" size="sm"/> <q-icon class="q-ma-sm" :name="icon" size="sm"/>
<div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div> <div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div>
</q-btn> </q-btn>
@@ -13,11 +13,11 @@
</div> </div>
<div v-else class="col-xs-6 col-sm-6 col-md-4 col-lg-3"> <div v-else class="col-xs-6 col-sm-6 col-md-4 col-lg-3">
<div class="q-ma-sm"> <div class="q-ma-sm">
<q-btn v-if="!small" :flat="flat" class="mybox" :color="color" rounded push :to="to" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 0)"> <q-btn v-if="!small" :flat="flat" class="mybox" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 0)">
<q-icon class="q-ma-sm" size="3rem" :name="icon"/> <q-icon class="q-ma-sm" size="3rem" :name="icon"/>
<div class="q-ma-sm text-h5-diff text-cls no-wrap"><span v-html="label"></span></div> <div class="q-ma-sm text-h5-diff text-cls no-wrap"><span v-html="label"></span></div>
</q-btn> </q-btn>
<q-btn v-if="small" :flat="flat" class="mybox_small" :color="color" rounded push :to="to" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 0)"> <q-btn v-if="small" :flat="flat" class="mybox_small" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 0)">
<q-icon class="q-ma-sm" :name="icon" size="sm"/> <q-icon class="q-ma-sm" :name="icon" size="sm"/>
<div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div> <div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div>
</q-btn> </q-btn>

View File

@@ -14,7 +14,7 @@ export default defineComponent({
props: { props: {
showalways: { showalways: {
type: Boolean, type: Boolean,
required: true, required: false,
default: false, default: false,
}, },
}, },

View File

@@ -38,7 +38,7 @@
:key="index" :key="index"
> >
<q-card class="no-shadow q-pa-xs"> <q-card class="no-shadow q-pa-xs">
<q-item class="q-pb-none q-pt-xs cursor-pointer" :to="rec.to"> <q-item class="q-pb-none q-pt-xs cursor-pointer" :to="tools.updateLink(rec.to)">
<q-item-section> <q-item-section>
<q-item-label <q-item-label
:class=" :class="
@@ -100,7 +100,7 @@
:key="index" :key="index"
> >
<q-card class="no-shadow q-pa-xxs"> <q-card class="no-shadow q-pa-xxs">
<q-item class="q-pb-none q-pt-xs cursor-pointer" :to="rec.to"> <q-item class="q-pb-none q-pt-xs cursor-pointer" :to="tools.updateLink(rec.to)">
<q-item-section> <q-item-section>
<q-item-label lines="3" <q-item-label lines="3"
:class=" :class="
@@ -124,7 +124,7 @@
</q-item-section> </q-item-section>
<q-item-section side> <q-item-section side>
<q-img v-if="rec.image" :src="rec.image" style="width: 35px">IMAGE</q-img> <q-img v-if="rec.image" :src="rec.image" style="width: 35px"></q-img>
<q-icon <q-icon
v-else v-else
:name="rec.icon" :name="rec.icon"

View File

@@ -144,6 +144,10 @@ export default defineComponent({
return { sortBy: 'dateTimeStart', descending: false, page: 1, rowsNumber: 20, rowsPerPage: 20 } return { sortBy: 'dateTimeStart', descending: false, page: 1, rowsNumber: 20, rowsPerPage: 20 }
else if (props.table === toolsext.TABMOVEMENTS) 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: 20, rowsPerPage: 20 }
else if (props.table === toolsext.TABCIRCUITS)
return { sortBy: 'numMembers', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 }
else if (props.table === toolsext.TABUSER)
return userStore.getMypaginationMembers()
return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 } return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 }
}) })
@@ -197,15 +201,15 @@ export default defineComponent({
const visuType = computed(() => { const visuType = computed(() => {
if (props.table === toolsext.TABMYGOODS) if (props.table === toolsext.TABMYGOODS)
return $q.screen.gt.xs return false
else if (props.table === toolsext.TABMYSKILLS) else if (props.table === toolsext.TABMYSKILLS)
return $q.screen.gt.xs return false
else if (props.table === toolsext.TABMYGROUPS) else if (props.table === toolsext.TABMYGROUPS)
return $q.screen.gt.xs return false
else if (props.table === toolsext.TABMYBACHECAS) else if (props.table === toolsext.TABMYBACHECAS)
return $q.screen.gt.xs return false
return $q.screen.gt.xs return false // $q.screen.gt.xs
}) })
const noMsgRecord = computed(() => { const noMsgRecord = computed(() => {
@@ -1100,6 +1104,7 @@ export default defineComponent({
groupnameId: 1, groupnameId: 1,
path: 1, path: 1,
name: 1, name: 1,
strProv: 1,
subname: 1, subname: 1,
longdescr: 1, longdescr: 1,
regulation: 1, regulation: 1,
@@ -1391,6 +1396,14 @@ export default defineComponent({
} }
} }
function mySortFieldsAvailable() {
if (props.table === toolsext.TABUSER) {
return userStore.getSortFieldsAvailable()
}
return []
}
function getdefaultnewrec(): any { function getdefaultnewrec(): any {
if (props.table === toolsext.TABMYSKILLS) { if (props.table === toolsext.TABMYSKILLS) {
return tools.getdefaultnewrec_MySkill() return tools.getdefaultnewrec_MySkill()
@@ -1440,6 +1453,7 @@ export default defineComponent({
hint, hint,
strextra, strextra,
myoptions, myoptions,
mySortFieldsAvailable,
} }
}, },
}) })

View File

@@ -49,6 +49,7 @@
:nodataLabel="noMsgRecord" :nodataLabel="noMsgRecord"
:prop_search="true" :prop_search="true"
:finder="true" :finder="true"
labelElemFind="circuiti trovati"
:choose_visutype="visuType" :choose_visutype="visuType"
:butt_modif_new="true && !noButtAdd" :butt_modif_new="true && !noButtAdd"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato" noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
@@ -56,8 +57,8 @@
:filtercustom="filtercustom" :filtercustom="filtercustom"
:prop_searchList="searchList" :prop_searchList="searchList"
:defaultnewrec="getdefaultnewrec" :defaultnewrec="getdefaultnewrec"
:selector="selector"
labelBtnAddRow="NONE" labelBtnAddRow="NONE"
:prop_SortFieldsAvailable="mySortFieldsAvailable"
:labelBtnAddExtra="noButtAdd ? `` : ``" :labelBtnAddExtra="noButtAdd ? `` : ``"
:extraparams="extraparams()" :extraparams="extraparams()"
> >

View File

@@ -197,6 +197,18 @@ export default defineComponent({
return { sortBy: 'desc', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 } return { sortBy: 'desc', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 }
}, },
}, },
prop_SortFieldsAvailable: {
type: Array,
required: false,
default: () => {
return []
},
},
margin_right: {
type: Number,
required: false,
default: 0,
},
defaultnewrec: { defaultnewrec: {
type: Function, type: Function,
required: false, required: false,
@@ -256,6 +268,11 @@ export default defineComponent({
required: false, required: false,
default: false, default: false,
}, },
labelElemFind: {
type: String,
required: false,
default: 'elementi trovati',
}
}, },
components: { components: {
CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups, CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups,
@@ -346,6 +363,8 @@ export default defineComponent({
const myvertical = ref(props.vertical) const myvertical = ref(props.vertical)
const ordinam = ref('')
const valoriopt = computed(() => (item: any, addall: boolean, addnone: boolean) => { const valoriopt = computed(() => (item: any, addall: boolean, addnone: boolean) => {
// console.log('valoriopt', item.table) // console.log('valoriopt', item.table)
@@ -407,6 +426,14 @@ export default defineComponent({
} }
}) })
watch(() => ordinam.value, (to: any, from: any) => {
if (pagination.value.sortBy !== ordinam.value) {
tools.setCookie('s_ordinam_' + props.prop_mytable, ordinam.value)
pagination.value.sortBy = ordinam.value
refresh()
}
})
watch(() => showfilter.value, (newval: any, from: any) => { watch(() => showfilter.value, (newval: any, from: any) => {
tools.setCookie('s_adv', newval ? '1' : '0') tools.setCookie('s_adv', newval ? '1' : '0')
}) })
@@ -581,17 +608,30 @@ export default defineComponent({
return returnedCount return returnedCount
} }
function getOrderByField(field: string, precorder: number): number {
if ((field === 'date_reg') || (field === 'numMembers')) {
return -1;
}
return precorder ? precorder : 1;
}
// emulate ajax call // emulate ajax call
// SELECT * FROM ... WHERE...LIMIT... // SELECT * FROM ... WHERE...LIMIT...
async function fetchFromServer(startRow: any, endRow: any, param_myfilter: any, param_myfilterand: any, sortBy: any, descending: any) { async function fetchFromServer(startRow: any, endRow: any, param_myfilter: any, param_myfilterand: any, sortBy: any, descending: any) {
// console.log('fetchFromServer') // console.log('fetchFromServer')
let myobj: any = {} let myobj: any = {}
if (sortBy) { if (sortBy) {
myobj = {} let arrsort = sortBy.split(',');
if (descending) { let arrdescending = (descending && descending.length > 0) ? descending.split(',') : [];
myobj[sortBy] = -1 if (arrsort) {
for (let i = 0; i < arrsort.length; i++) {
let field = arrsort[i].trim()
myobj[field] = (tools.isArray(arrdescending) && (arrdescending.length > [i])) ? parseInt(arrdescending[i].trim()) : 1;
myobj[field] = getOrderByField(field, myobj[field])
}
} else { } else {
myobj[sortBy] = 1 myobj[sortBy] = getOrderByField(sortBy, descending ? -1 : 1)
} }
} }
@@ -852,7 +892,6 @@ export default defineComponent({
// @ts-ignore // @ts-ignore
filter_gte, filter_gte,
sortBy: myobj, sortBy: myobj,
descending,
userId: userStore.my._id, userId: userStore.my._id,
codeId: '', codeId: '',
options: props.options, options: props.options,
@@ -944,6 +983,7 @@ export default defineComponent({
pagination.value.page = page pagination.value.page = page
pagination.value.rowsPerPage = rowsPerPage pagination.value.rowsPerPage = rowsPerPage
pagination.value.sortBy = sortBy pagination.value.sortBy = sortBy
ordinam.value = sortBy
pagination.value.descending = descending pagination.value.descending = descending
console.log('pagination', pagination) console.log('pagination', pagination)
@@ -957,10 +997,13 @@ export default defineComponent({
} }
function onUpdateData(index: number, myprops: any, done: any) { function onUpdateData(index: number, myprops: any, done: any) {
const { page, rowsPerPage, rowsNumber, sortBy, descending } = myprops.pagination let { page, rowsPerPage, rowsNumber, sortBy, descending } = myprops.pagination
const myfilternow = myfilter.value const myfilternow = myfilter.value
const myfilterandnow = myfilterand.value const myfilterandnow = myfilterand.value
if (ordinam.value)
sortBy = ordinam.value
savefilter() savefilter()
if (!mytable.value) { if (!mytable.value) {
@@ -1012,6 +1055,7 @@ export default defineComponent({
pagination.value.page = page pagination.value.page = page
pagination.value.rowsPerPage = rowsPerPage pagination.value.rowsPerPage = rowsPerPage
pagination.value.sortBy = sortBy pagination.value.sortBy = sortBy
ordinam.value = sortBy
pagination.value.descending = descending pagination.value.descending = descending
// console.log('pagination', pagination) // console.log('pagination', pagination)
@@ -1392,6 +1436,7 @@ export default defineComponent({
tablesel.value = tools.getCookie('tablesel', tablesel.value) tablesel.value = tools.getCookie('tablesel', tablesel.value)
} }
myfilterand.value = props.filterdef myfilterand.value = props.filterdef
// myfiltercustom.value = props.filtercustom // myfiltercustom.value = props.filtercustom
// console.log('tablesel', tablesel) // console.log('tablesel', tablesel)
@@ -1403,6 +1448,8 @@ export default defineComponent({
tablesel.value = mytable.value tablesel.value = mytable.value
} }
ordinam.value = tools.getCookie('s_ordinam_' + tablesel.value, null)
// console.log('2) tablesel', tablesel.value) // console.log('2) tablesel', tablesel.value)
changeTable(tablesel.value) changeTable(tablesel.value)
@@ -1662,6 +1709,10 @@ export default defineComponent({
// console.log('REFRR - doSearch') // console.log('REFRR - doSearch')
refresh() refresh()
} }
function doSort() {
refresh()
}
function changefuncAct(newval: any) { function changefuncAct(newval: any) {
if (!disabilita()) { if (!disabilita()) {
@@ -2186,6 +2237,8 @@ export default defineComponent({
newRecordBoolOld, newRecordBoolOld,
showSpin, showSpin,
userStore, userStore,
doSort,
ordinam,
} }
} }
}) })

View File

@@ -257,7 +257,21 @@
@click="showNotification" @click="showNotification"
></q-btn> ></q-btn>
</template> </template>
<template v-if="searchList && finder" v-slot:after> <template v-slot:after>
<q-select
v-if="prop_SortFieldsAvailable.length > 0"
:behavior="'menu'"
rounded
outlined
dense
v-model="ordinam"
:options="prop_SortFieldsAvailable"
label="Ordinamento:"
emit-value
map-options
style="min-width:120px;"
>
</q-select>
<q-btn <q-btn
dense dense
label="" label=""
@@ -299,7 +313,7 @@
{{ pagination.rowsNumber }} elemento trovato {{ pagination.rowsNumber }} elemento trovato
</div> </div>
<div v-if="pagination.rowsNumber > 1 && prop_search"> <div v-if="pagination.rowsNumber > 1 && prop_search">
{{ pagination.rowsNumber }} elementi trovati {{ pagination.rowsNumber }} {{labelElemFind}}
</div> </div>
<div v-if="choose_visutype && $q.screen.gt.xs" class=""> <div v-if="choose_visutype && $q.screen.gt.xs" class="">
@@ -389,6 +403,7 @@
:prop_myrec="row" :prop_myrec="row"
@cmdext="cmdExt" @cmdext="cmdExt"
:editOn="editOn" :editOn="editOn"
:margin_right="margin_right"
> >
</CMyRecCard> </CMyRecCard>
</div> </div>
@@ -473,7 +488,15 @@
v-if=" v-if="
showColCheck(col, tools.TIPOVIS_SHOW_RECORD, true, 1, row) showColCheck(col, tools.TIPOVIS_SHOW_RECORD, true, 1, row)
" "
:class="!col.extrafield || (col.extrafield && (col.tipovisu !== costanti.TipoVisu.LINK || (col.tipovisu === costanti.TipoVisu.LINK && userStore.getImgByProfile(row, true, col)))) ? `tdclass` : ``" :class="
!col.extrafield ||
(col.extrafield &&
(col.tipovisu !== costanti.TipoVisu.LINK ||
(col.tipovisu === costanti.TipoVisu.LINK &&
userStore.getImgByProfile(row, true, col))))
? `tdclass`
: ``
"
> >
<div :class="getclrow(row)"> <div :class="getclrow(row)">
<CMyPopupEdit <CMyPopupEdit

View File

@@ -1,23 +1,43 @@
<template> <template>
<div> <div v-if="tools.isUserOk()">
<div class="row q-ma-sm shadow justify-center" style="border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.12);"> <div
<CBigBtn class="row q-ma-sm shadow justify-center"
v-for="(card, ind) of cardsbig" :key="ind" style="border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.12)"
:label="card.title" :to="card.to" :icon="card.icon" :color="card.color" :text-color="!!card.textcolor ? card.textcolor : ''" >
:small="card.small" <CBigBtn
:numcol="2" v-for="(card, ind) of cardsbig"
:hint="card.hint" :disable="card.disable"> :key="ind"
</CBigBtn> :label="card.title"
:to="card.to"
:icon="card.icon"
:color="card.color"
:text-color="!!card.textcolor ? card.textcolor : ''"
:small="card.small"
:numcol="2"
:hint="card.hint"
:disable="card.disable"
>
</CBigBtn>
</div> </div>
<div class="row shadow justify-center" style="border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.12);"> <div
<CBigBtn class="row shadow justify-center"
v-for="(card, ind) of cardssmall" :key="ind" style="border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.12)"
glossy >
:label="card.title" :to="card.to" :icon="card.icon" :color="card.color" :text-color="!!card.textcolor ? card.textcolor : ''" <CBigBtn
:small="card.small" v-for="(card, ind) of cardssmall"
:numcol="3" :key="ind"
:hint="card.hint" :disable="card.disable"> glossy
</CBigBtn> :label="card.title"
:to="card.to"
:icon="card.icon"
:color="card.color"
:text-color="!!card.textcolor ? card.textcolor : ''"
:small="card.small"
:numcol="3"
:hint="card.hint"
:disable="card.disable"
>
</CBigBtn>
</div> </div>
</div> </div>
<!--<div class="row justify-center"> <!--<div class="row justify-center">

View File

@@ -2,7 +2,7 @@ import { computed, defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore' import { useUserStore } from '@store/UserStore'
import { useCircuitStore } from '@store/CircuitStore' import { useCircuitStore } from '@store/CircuitStore'
import { ICircuit, IImgGallery, IUserFields, IUserProfile, IFriends, IAccount, IMyCircuit } from 'model' import { ICircuit, IImgGallery, IUserFields, IUserProfile, IFriends, IAccount, IMyCircuit, IMyGroup } from 'model'
import { costanti } from '@costanti' import { costanti } from '@costanti'
import { shared_consts } from '@/common/shared_vuejs' import { shared_consts } from '@/common/shared_vuejs'
import { tools } from '@store/Modules/tools' import { tools } from '@store/Modules/tools'
@@ -11,13 +11,14 @@ import { useI18n } from '@/boot/i18n'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { CUserNonVerif } from '@/components/CUserNonVerif' import { CUserNonVerif } from '@/components/CUserNonVerif'
import { CSaldo } from '@/components/CSaldo' import { CSaldo } from '@/components/CSaldo'
import { CTitleBanner } from '@/components/CTitleBanner'
import { toolsext } from '@store/Modules/toolsext' import { toolsext } from '@store/Modules/toolsext'
import { useGlobalStore } from '@store/globalStore' import { useGlobalStore } from '@store/globalStore'
export default defineComponent({ export default defineComponent({
name: 'CMyCircuit', name: 'CMyCircuit',
emits: ['setCmd'], emits: ['setCmd'],
components: {CUserNonVerif, CSaldo}, components: {CUserNonVerif, CSaldo, CTitleBanner},
props: { props: {
mycircuit: { mycircuit: {
type: Object as PropType<ICircuit | null>, type: Object as PropType<ICircuit | null>,
@@ -29,6 +30,11 @@ export default defineComponent({
required: false, required: false,
default: null, default: null,
}, },
prop_groupnameSel: {
type: Object as PropType<IMyGroup | null>,
required: false,
default: null,
},
visu: { visu: {
type: Number, type: Number,
required: true, required: true,
@@ -60,12 +66,16 @@ export default defineComponent({
const table = ref(toolsext.TABCIRCUITS) const table = ref(toolsext.TABCIRCUITS)
const showingtooltip = ref(false) const showingtooltip = ref(false)
const showrules = ref(false)
const requestToEnterCircuit = ref(false)
const groupnameSel = ref(<IMyGroup | null>null)
watch(() => props.mycircuit, (newval, oldval) => { watch(() => props.mycircuit, (newval, oldval) => {
mounted() mounted()
}) })
function mounted() { function mounted() {
groupnameSel.value = props.prop_groupnameSel
if (!props.mycircuit) { if (!props.mycircuit) {
if (props.circuitname) { if (props.circuitname) {
circuit.value = null circuit.value = null
@@ -121,6 +131,9 @@ export default defineComponent({
saldo, saldo,
globalStore, globalStore,
showingtooltip, showingtooltip,
showrules,
requestToEnterCircuit,
groupnameSel,
} }
}, },
}) })

View File

@@ -1,48 +1,111 @@
<template> <template>
<div v-if="tools.isUserOk() || noaut"> <div v-if="tools.isUserOk() || noaut">
<div v-if="circuit"> <div v-if="circuit">
<q-item :class="`q-my-sm bordo_stondato_circuiti ` + ($q.dark.isActive ? `text-white` : `text-black`)" clickable> <q-item
<q-item-section avatar @click="naviga(tools.getPathByTableAndRec(table, circuit))"> :class="
`q-my-sm bordo_stondato_circuiti ` +
($q.dark.isActive ? `text-white` : `text-black`)
"
clickable
>
<q-item-section
v-if="visu !== costanti.ENTER_TO_THE_CIRCUIT"
avatar
@click="naviga(tools.getPathByTableAndRec(table, circuit))"
>
<q-avatar size="60px"> <q-avatar size="60px">
<q-img :src="getImgCircuit(circuit)" :alt="circuit.name" img-class="imgprofile" height="60px"/> <q-img
:src="getImgCircuit(circuit)"
:alt="circuit.name"
img-class="imgprofile"
height="60px"
/>
</q-avatar> </q-avatar>
<div :class="`q-ma-xs q-px-xs shadow-2 rounded-borders `"><span :class="`q-ma-sm `+ ($q.dark.isActive ? `text-white` : `text-black`)">{{ circuit.numMembers }}</span> <div :class="`q-ma-xs q-px-xs shadow-2 rounded-borders `">
<span
:class="
`q-ma-sm ` + ($q.dark.isActive ? `text-white` : `text-black`)
"
>{{ circuit.numMembers }}</span
>
<q-icon name="fas fa-users" size="xs" color="blue"></q-icon> <q-icon name="fas fa-users" size="xs" color="blue"></q-icon>
</div> </div>
</q-item-section> </q-item-section>
<q-item-section :class="$q.dark.isActive ? `text-white` : `text-black`"> <q-item-section :class="$q.dark.isActive ? `text-white` : `text-black`">
<q-item-label @click="naviga(tools.getPathByTableAndRec(table, circuit))"><strong>{{ circuit.name }}</strong> <span <q-item-label
v-if="circuit.subname"> ({{ circuit.subname }})</span> @click="naviga(tools.getPathByTableAndRec(table, circuit))"
><strong>{{ circuit.name }}</strong>
<span v-if="circuit.subname"> ({{ circuit.subname }})</span>
</q-item-label> </q-item-label>
<q-item-label @click="naviga(tools.getPathByTableAndRec(table, circuit))" v-if="circuit.longdescr" caption lines="3"><em>{{ circuit.longdescr }}</em> <q-item-label
@click="naviga(tools.getPathByTableAndRec(table, circuit))"
v-if="circuit.longdescr"
caption
lines="3"
><em>{{ circuit.longdescr }}</em>
</q-item-label>
<q-item-label v-if="visu === costanti.ENTER_TO_THE_CIRCUIT" caption>
<span> Membri: {{ circuit.numMembers }}</span>
</q-item-label> </q-item-label>
<q-item-label caption lines="3"> <q-item-label caption lines="3">
<q-chip <q-chip
v-if="circuit.status !== undefined && circuit.status !== 0" :color="circuitStore.getColorCircuitClass(circuit)" v-if="circuit.status !== undefined && circuit.status !== 0"
:color="circuitStore.getColorCircuitClass(circuit)"
text-color="white" text-color="white"
size="sm" size="sm"
:icon="globalStore.getValueByTableSingle('statuscircuit', circuit.status, 'icon')">{{ :icon="
globalStore.getValueByTableSingle('statuscircuit', circuit.status) globalStore.getValueByTableSingle(
'statuscircuit',
circuit.status,
'icon'
)
"
>{{
globalStore.getValueByTableSingle(
'statuscircuit',
circuit.status
)
}} }}
<q-btn <q-btn
class="q-ml-sm" class="q-ml-sm"
icon="fas fa-info" color="primary" text-color="white" icon="fas fa-info"
color="primary"
text-color="white"
size="xs" size="xs"
round round
@click="showingtooltip = !showingtooltip"> @click="showingtooltip = !showingtooltip"
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{globalStore.getValueByTableSingle('statuscircuit', circuit.status, 'hint')}}</q-tooltip> >
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{
globalStore.getValueByTableSingle(
'statuscircuit',
circuit.status,
'hint'
)
}}</q-tooltip>
</q-btn> </q-btn>
</q-chip> </q-chip>
</q-item-label> </q-item-label>
<q-item-label v-if="(!circuit.transactionsEnabled) && (circuit.status === shared_consts.CIRCUIT_STATUS.FASE3_MONETA_ABILITATA)" caption lines="1"> <q-item-label
v-if="
!circuit.transactionsEnabled &&
circuit.status ===
shared_consts.CIRCUIT_STATUS.FASE3_MONETA_ABILITATA
"
caption
lines="1"
>
<q-icon v-if="!circuit.transactionsEnabled" name="fas fa-lock"> <q-icon v-if="!circuit.transactionsEnabled" name="fas fa-lock">
</q-icon> </q-icon>
<span class="text-red text-weight-bold">{{ $t('circuit.transaction_suspended') }}</span> <span class="text-red text-weight-bold">{{
$t('circuit.transaction_suspended')
}}</span>
</q-item-label> </q-item-label>
<q-item-label @click="naviga(tools.getPathByTableAndRec(table, circuit))" lines="1"> <q-item-label
@click="naviga(tools.getPathByTableAndRec(table, circuit))"
lines="1"
>
<CSaldo <CSaldo
v-if="tools.isUserOk()" v-if="tools.isUserOk()"
:account="account" :account="account"
@@ -55,34 +118,124 @@
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-if="visu === costanti.USER_CIRCUITS && tools.isUserOk()"> <q-item-section
side
v-if="visu === costanti.USER_CIRCUITS && tools.isUserOk()"
>
<q-item-label> <q-item-label>
<q-btn rounded :icon="userStore.IsMyCircuitByName(circuit.name) ? `fas fa-ellipsis-h` : `fas fa-user`"> <q-btn
rounded
:icon="
userStore.IsMyCircuitByName(circuit.name)
? `fas fa-ellipsis-h`
: `fas fa-user`
"
>
<q-menu> <q-menu>
<q-list <q-list
v-if="(!userStore.IsMyCircuitByName(circuit.name) && !userStore.IsAskedCircuitByName(circuit.name) && !userStore.IsRefusedCircuitByName(circuit.name))" v-if="
style="min-width: 200px"> !userStore.IsMyCircuitByName(circuit.name) &&
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.CIRCUITCMD.REQ, myusername(), true, circuitname)"> !userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsRefusedCircuitByName(circuit.name)
"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.REQ,
myusername(),
true,
circuitname
)
"
>
<q-item-section>{{ $t('circuit.ask') }}</q-item-section> <q-item-section>{{ $t('circuit.ask') }}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list <q-list
v-else-if="(!userStore.IsMyCircuitByName(circuit.name) && userStore.IsAskedCircuitByName(circuit.name) && !userStore.IsRefusedCircuitByName(circuit.name))" v-else-if="
style="min-width: 200px"> !userStore.IsMyCircuitByName(circuit.name) &&
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.CIRCUITCMD.REQ, myusername(), false, circuit.name)"> userStore.IsAskedCircuitByName(circuit.name) &&
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section> !userStore.IsRefusedCircuitByName(circuit.name)
"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.REQ,
myusername(),
false,
circuit.name
)
"
>
<q-item-section>{{
$t('shared.refuse_ask')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.CIRCUITCMD.REQ, myusername(), false, circuit.name)"> <q-item
<q-item-section>{{ $t('shared.cancel_ask') }}</q-item-section> clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.REQ,
myusername(),
false,
circuit.name
)
"
>
<q-item-section>{{
$t('shared.cancel_ask')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list v-else-if="userStore.IsMyCircuitByName(circuit.name)" style="min-width: 200px"> <q-list
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.CIRCUITCMD.REMOVE_FROM_MYLIST, myusername(), '', circuit.name)"> v-else-if="userStore.IsMyCircuitByName(circuit.name)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.REMOVE_FROM_MYLIST,
myusername(),
'',
circuit.name
)
"
>
<q-item-section>{{ $t('circuit.exit') }}</q-item-section> <q-item-section>{{ $t('circuit.exit') }}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list v-if="tools.iAmAdminCircuit(circuit.name)" style="min-width: 200px"> <q-list
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.CIRCUITCMD.DELETE, myusername(), '', circuit.name)"> v-if="tools.iAmAdminCircuit(circuit.name)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.DELETE,
myusername(),
'',
circuit.name
)
"
>
<q-item-section>{{ $t('circuit.delete') }}</q-item-section> <q-item-section>{{ $t('circuit.delete') }}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
@@ -90,32 +243,83 @@
</q-btn> </q-btn>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-if="visu === costanti.REQ_CIRCUIT && tools.isUserOk()"> <q-item-section
side
v-if="visu === costanti.REQ_CIRCUIT && tools.isUserOk()"
>
<q-item-label> <q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="tools.setCmd($q, shared_consts.CIRCUITCMD.REFUSE_REQ, myusername(), false, circuit.name)"> clickable
<q-item-section>{{ $t('circuit.reject_ask') }}</q-item-section> icon="fas fa-user-minus"
outline
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.REFUSE_REQ,
myusername(),
false,
circuit.name
)
"
>
<q-item-section>{{
$t('circuit.reject_ask')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
</q-btn> </q-btn>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-if="visu === costanti.ASK_SENT_CIRCUIT && tools.isUserOk()"> <q-item-section
side
v-if="visu === costanti.ASK_SENT_CIRCUIT && tools.isUserOk()"
>
<q-item-label> <q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="tools.setCmd($q, shared_consts.CIRCUITCMD.REFUSE_REQ, myusername(), '', circuit.name)"> clickable
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section> icon="fas fa-user-minus"
outline
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.REFUSE_REQ,
myusername(),
'',
circuit.name
)
"
>
<q-item-section>{{
$t('shared.refuse_ask')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="tools.setCmd($q, shared_consts.CIRCUITCMD.CANCEL_REQ, myusername(), '', circuit.name)"> clickable
<q-item-section>{{ $t('shared.cancel_ask') }}</q-item-section> icon="fas fa-user-minus"
outline
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.CANCEL_REQ,
myusername(),
'',
circuit.name
)
"
>
<q-item-section>{{
$t('shared.cancel_ask')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
@@ -123,7 +327,161 @@
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
</q-item> </q-item>
<div class="centermydiv" v-if="visu === costanti.ENTER_TO_THE_CIRCUIT">
<q-btn
v-if="
!userStore.IsMyCircuitByName(circuit.name) &&
!userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsRefusedCircuitByName(circuit.name)
"
icon="fas fa-user-plus"
color="primary"
:label="$t('circuit.ask')"
@click="
requestToEnterCircuit = true;
groupnameSel = null;
"
/>
<q-btn
v-if="userStore.IsMyCircuitByName(circuit.name)"
rounded
icon="fas fa-ellipsis-h"
>
<q-menu>
<q-list v-if="true" style="min-width: 150px">
<q-item
clickable
v-close-popup
v-if="saldo === 0"
@click="
tools.removeFromMyCircuits(
$q,
userStore.my.username,
circuit.name,
'',
$t('circuit.domanda_exit_fromcircuit', {
circuitname: circuit.name,
})
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<q-item-section>{{
$t('circuit.exit_circuit')
}}</q-item-section>
</q-item>
<q-list
v-if="tools.iAmAdminCircuit(circuit.name)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.DELETE,
userStore.my.username,
'',
circuit.name
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-trash-alt" />
</q-item-section>
<q-item-section>{{ $t('circuit.delete') }}</q-item-section>
</q-item>
</q-list>
</q-list>
</q-menu>
</q-btn>
<div
v-if="
userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsMyCircuitByName(circuit.name)
"
>
<CTitleBanner
:title="$t('circuit.wait_acceptation')"
bgcolor="bg-primary"
clcolor="text-white"
>
</CTitleBanner>
</div>
<q-btn
v-if="
userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsMyCircuitByName(circuit.name)
"
icon="fas fa-user-minus"
flat
outline
:label="$t('shared.cancel_ask_short')"
@click="
tools.cancelReqCircuit($q, userStore.my.username, circuit.name)
"
/>
</div>
</div> </div>
<q-dialog
v-model="requestToEnterCircuit"
maximized
transition-show="slide-up"
transition-hide="slide-down"
>
<q-card v-if="circuit" class="dialog_card">
<q-toolbar class="bg-primary text-white" dense>
<!--<q-toolbar :class="tools.displayClasses(myevent)"-->
<!--:style="tools.displayStyles(myevent) + ` min-width: `+ tools.myheight_dialog() + `px;`">-->
<q-toolbar-title>
{{ circuit.name }}
<div v-if="groupnameSel">Gruppo: {{ groupnameSel.groupname }}</div>
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<div v-html="t('circuit.disclaimer')"></div>
</q-card-section>
<q-card-section class="inset-shadow">
<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="circuit.regulation"></div>
</q-card-section>
<q-card-actions align="center">
<q-btn
class="centeritems"
icon="fas fa-user-plus"
color="positive"
:label="$t('circuit.acceptregulation')"
@click="
requestToEnterCircuit = false;
tools.setRequestCircuit(
$q,
userStore.my.username,
circuit.name,
true,
groupnameSel ? groupnameSel.groupname : ''
);
"
/>
<q-btn
outline
:label="$t('dialog.cancel')"
icon="close"
v-close-popup
></q-btn>
</q-card-actions>
</q-card>
</q-dialog>
</div> </div>
<div v-else> <div v-else>
<CUserNonVerif></CUserNonVerif> <CUserNonVerif></CUserNonVerif>

View File

@@ -23,6 +23,7 @@ import { CMyFieldRec } from '@src/components/CMyFieldRec'
import { CSelectColor } from '@src/components/CSelectColor' import { CSelectColor } from '@src/components/CSelectColor'
import { CMainView } from '@src/components/CMainView' import { CMainView } from '@src/components/CMainView'
import { CMyProfileTutorial } from '@src/components/CMyProfileTutorial' import { CMyProfileTutorial } from '@src/components/CMyProfileTutorial'
import { CSendRISTo } from '@src/components/CSendRISTo'
import { CDashboard } from '@src/components/CDashboard' import { CDashboard } from '@src/components/CDashboard'
import { CCheckAppRunning } from '@src/components/CCheckAppRunning' import { CCheckAppRunning } from '@src/components/CCheckAppRunning'
import { CStatusReg } from '@src/components/CStatusReg' import { CStatusReg } from '@src/components/CStatusReg'
@@ -49,7 +50,7 @@ export default defineComponent({
CSelectColor, CSelectFontSize, CImgPoster, CSelectColor, CSelectFontSize, CImgPoster,
CCheckIfIsLogged, CStatusReg, CDashboard, CMainView, CNotifAtTop, CCheckIfIsLogged, CStatusReg, CDashboard, CMainView, CNotifAtTop,
CPresentazione, CMyActivities, CPresentazione, CMyActivities,
CMyProfileTutorial, CMyProfileTutorial, CSendRISTo,
CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration, CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration,
}, },
emits: ['selElemClick'], emits: ['selElemClick'],

View File

@@ -476,6 +476,10 @@
<div v-if="editOn" class="elemEdit">CDashboard</div> <div v-if="editOn" class="elemEdit">CDashboard</div>
<CDashboard></CDashboard> <CDashboard></CDashboard>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CSENDRISTO">
<div v-if="editOn" class="elemEdit">CSendRISTo</div>
<CSendRISTo></CSendRISTo>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.STATUSREG"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.STATUSREG">
<div v-if="editOn" class="elemEdit">CStatusReg</div> <div v-if="editOn" class="elemEdit">CStatusReg</div>
<CStatusReg> </CStatusReg> <CStatusReg> </CStatusReg>

View File

@@ -18,6 +18,11 @@ export default defineComponent({
type: String, type: String,
required: true, required: true,
}, },
hint: {
type: String,
required: false,
default: '',
},
mykey: { mykey: {
type: String, type: String,
required: true, required: true,

View File

@@ -29,6 +29,7 @@
:rec="rec" :rec="rec"
:isrec="!!rec" :isrec="!!rec"
:table="table" :table="table"
:hint="hint"
:title="title" :title="title"
:field="mykey" :field="mykey"
:filter="filter" :filter="filter"

View File

@@ -37,9 +37,6 @@
<q-item-label> <q-item-label>
<q-btn <q-btn
v-if="
userStore.my.profile.calc.numGoodsAndServices > 0 && circuitname
"
icon="fas fa-coins" icon="fas fa-coins"
color="green" color="green"
size="md" size="md"
@@ -56,6 +53,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
tools.setCmd( tools.setCmd(
@@ -122,6 +120,33 @@
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item
clickable
v-close-popup
dense
@click="showsendCoinTo = true"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-coins" />
</q-item-section>
<q-item-section>{{
$t('circuit.sendcoins')
}}</q-item-section>
</q-item>
<q-item
v-if="tools.iAmAdminGroup(grp.groupname)"
clickable
v-close-popup
dense
@click="tools.receiveRisGroup(grp.groupname, $q, $t)"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-download" />
</q-item-section>
<q-item-section>{{
$t('circuit.receive_coins')
}}</q-item-section>
</q-item>
<q-item <q-item
clickable clickable
v-close-popup v-close-popup
@@ -271,6 +296,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
tools.setCmd( tools.setCmd(
@@ -297,6 +323,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
tools.setCmd( tools.setCmd(
@@ -315,6 +342,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
tools.setCmd( tools.setCmd(
@@ -344,6 +372,21 @@
" "
> >
<q-menu> <q-menu>
<q-list>
<q-item
clickable
v-close-popup
dense
@click="showsendCoinTo = true"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-coins" />
</q-item-section>
<q-item-section>{{
$t('circuit.sendcoins')
}}</q-item-section>
</q-item>
</q-list>
<q-list <q-list
v-if=" v-if="
!userStore.IsMyGroupByGroupname(grp.groupname) && !userStore.IsMyGroupByGroupname(grp.groupname) &&
@@ -569,7 +612,11 @@
</q-toolbar-title> </q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn> <q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar> </q-toolbar>
<CInfoAccount :grp="grp" :circuitname="circuitname" :admin="tools.iAmAdminCircuit(circuitname)" /> <CInfoAccount
:grp="grp"
:circuitname="circuitname"
:admin="tools.iAmAdminCircuit(circuitname)"
/>
</q-card> </q-card>
</q-dialog> </q-dialog>
</template> </template>

View File

@@ -209,6 +209,7 @@
:maxlength="col.maxlength ? col.maxlength : undefined" :maxlength="col.maxlength ? col.maxlength : undefined"
:disable="disable" :disable="disable"
:readonly="disable" :readonly="disable"
:hint="hint"
:type=" :type="
col.fieldtype === costanti.FieldType.crypted col.fieldtype === costanti.FieldType.crypted
? `password` ? `password`
@@ -1036,6 +1037,8 @@
:readonly="col.disable || disable" :readonly="col.disable || disable"
:title="col.title ? col.title : col.titlepopupedit" :title="col.title ? col.title : col.titlepopupedit"
buttons buttons
:label-set="$t('dialog.save')"
:label-cancel="$t('dialog.cancel')"
persistent persistent
@save="SaveValueInt" @save="SaveValueInt"
@show="OpenEdit" @show="OpenEdit"

View File

@@ -2,3 +2,12 @@
display: flex; display: flex;
flex: 1; flex: 1;
} }
.q-stepper__tab {
padding: 3px 3px !important;
}
.q-stepper__step-inner{
padding-left: 24px !important;
padding-right: 2px !important;
}

View File

@@ -5,21 +5,28 @@ import { costanti } from '@costanti'
import { shared_consts } from '@/common/shared_vuejs' import { shared_consts } from '@/common/shared_vuejs'
import { tools } from '@store/Modules/tools' import { tools } from '@store/Modules/tools'
import { useQuasar } from 'quasar' import { useQuasar } from 'quasar'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CSendCoins } from '@/components/CSendCoins' import { CSendCoins } from '@/components/CSendCoins'
import { CSkill } from '@/components/CSkill'
import { CMyFieldRec } from '@/components/CMyFieldRec' import { CMyFieldRec } from '@/components/CMyFieldRec'
import { CSaldo } from '@/components/CSaldo' import { CSaldo } from '@/components/CSaldo'
import { CMySelectCity } from '@/components/CMySelectCity' import { CMySelectCity } from '@/components/CMySelectCity'
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { CMyCircuit } from '@/components/CMyCircuit'
import { CMySelect } from '@/components/CMySelect' import { CMySelect } from '@/components/CMySelect'
import { CMyUserOnlyView } from '@/components/CMyUserOnlyView'
import { CUserInfoAccount } from '@/components/CUserInfoAccount' import { CUserInfoAccount } from '@/components/CUserInfoAccount'
import { useI18n } from '@/boot/i18n' import { useI18n } from '@/boot/i18n'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { useCircuitStore } from '@store/CircuitStore' import { useCircuitStore } from '@store/CircuitStore'
const STEP_NAME_SURNAME = 2
export default defineComponent({ export default defineComponent({
name: 'CMyProfileTutorial', name: 'CMyProfileTutorial',
components: { components: {
CSendCoins, CSaldo, CUserInfoAccount, CSendCoins, CSaldo, CUserInfoAccount,
CMySelectCity, CMyFieldRec, CMySelect CMySelectCity, CMyFieldRec, CSkill, CMyUserOnlyView, CTitleBanner, CMySelect, CMyFieldDb, CMyCircuit
}, },
emits: ['setCmd'], emits: ['setCmd'],
props: { props: {
@@ -45,39 +52,158 @@ export default defineComponent({
const $route = useRoute() const $route = useRoute()
const showAccountInfo = ref(false) const showAccountInfo = ref(false)
const slidestep = ref('1') const step = ref(1)
const username = ref('') const username = ref('')
const showsendCoinTo = ref(false) const showsendCoinTo = ref(false)
const mycircuit = ref(<ICircuit | undefined | null>null)
const contact = ref(<IUserFields | null>null) const contact = ref(<IUserFields | null>null)
const circuit = ref(<ICircuit | null | undefined>null)
const filtroutente = ref(<any[]>[])
const stepTut = computed(() => userStore.my.profile.stepTutorial)
const noNameSurname = computed(() => userStore.my.profile.noNameSurname)
const mycards = computed(() => {
return costanti.MAINCARDS.filter((rec: any) => shared_consts.TABLES_INSERT_ALMOST_ONE_TO_ENABLE_CIRCUIT.includes(rec.table))
})
const strProv = computed(() => {
if (contact.value && contact.value.profile.resid_province) {
return contact.value.profile.resid_province
} else {
return ''
}
})
watch(() => strProv.value, (newval: string, oldval: string) => {
mycircuit.value = circuitStore.getCircuitByProvince(strProv.value)
})
watch(() => step.value, (newval: number, oldval: number) => {
if (step.value > userStore.my.profile.stepTutorial)
userStore.my.profile.stepTutorial = step.value
userStore.saveStepTutorial(step.value)
if (step.value >= numstep.value) {
tools.scrollToTop()
}
if (step.value === STEP_NAME_SURNAME + 1) {
let index = step.value
console.log('Salva ', arrStep[index])
if ((contact.value ? !!contact.value.name : false) && contact.value!.name) {
// nome esistente
userStore.savenoNameSurname(false)
} else {
userStore.savenoNameSurname(true)
}
}
})
const arrStep = [ const arrStep = [
{ {
label: t('tutorial.step_residence_title'), step: 1,
title: t('tutorial.step_residence_title'),
extratitle: function () { return ': ' + contact.value!.profile.resid_province },
label: t('tutorial.step_residence'),
checkOk: function () { return contact.value ? !!contact.value.profile.resid_province : false }, checkOk: function () { return contact.value ? !!contact.value.profile.resid_province : false },
step: '1',
icon: 'house' icon: 'house'
} },
{
step: STEP_NAME_SURNAME, // 2
title: t('tutorial.step_nomecognome_title'),
extratitle: function () { return ': ' + (contact.value ? tools.getNomeUtenteEUsernameByRecUser(contact.value) : '') },
label: t('tutorial.step_nomecognome'),
checkOk: function () { return ((contact.value ? !!contact.value.name : false) || userStore.my.profile.noNameSurname) },
icon: 'user'
},
{
step: 3,
title: t('tutorial.step_circuito_title'),
extratitle: function () { return mycircuit.value ? ': ' + mycircuit.value.name : '' },
label: t('tutorial.step_circuito'),
label_ok: t('tutorial.step_circuito_ok'),
checkOk: function () {
if (mycircuit.value) {
return (userStore.IsMyCircuitByName(mycircuit.value.name) ||
userStore.IsAskedCircuitByName(mycircuit.value.name))
}
return false
},
icon: 'img: images/1ris_rosso_100.png',
},
{
step: 4,
title: t('tutorial.step_beniservizi_title'),
extratitle: function () { return ': (' + userStore.my.profile.calc.numGoodsAndServices + ')' },
label: t('tutorial.step_beniservizi'),
checkOk: function () {
return userStore.my.profile.calc.numGoodsAndServices! > 0
},
icon: 'fas fa-tshirt',
},
{
step: 5,
title: t('tutorial.step_foto_title'),
extratitle: function () { return ': (' + (userStore.my.profile.img ? t('dialog.yes') : t('dialog.no')) + ')' },
label: t('tutorial.step_foto'),
checkOk: function () {
return !!userStore.my.profile.img
},
icon: 'fas fa-tshirt',
},
{
step: 6,
title: t('tutorial.step_fine_title'),
extratitle: function () { return '' },
label: t('tutorial.step_fine'),
checkOk: function () {
return true
},
icon: 'fas fa-tshirt',
},
] ]
const numstep = computed(() => arrStep.length) const numstep = computed(() => arrStep.length)
const progressStep = computed(() => { const prStep = computed(() => {
let prStep = 0
return prStep / numstep.value let num = 0
for (const mystep of arrStep) {
if (mystep.checkOk())
num++
}
return num
}) })
const progressLabel = computed(() => (progressStep.value * 100).toFixed(2) + '%') const progressStep = computed(() => {
if (numstep.value > 0)
return prStep.value / numstep.value
else
return 0
})
const progressLabel = computed(() => (progressStep.value * 100).toFixed(0) + '%')
watch(() => props.mycontact, (newval, oldval) => { watch(() => props.mycontact, (newval, oldval) => {
console.log('watch: mycontact') updatestart()
mounted()
}) })
function mounted() { watch(() => tools.isUserOk(), (newval, oldval) => {
if (userStore.isUserOk()) {
updatestart()
}
})
function updatestart() {
if (!props.mycontact) { if (!props.mycontact) {
if (props.myusername) { if (props.myusername) {
username.value = props.myusername username.value = props.myusername
@@ -93,7 +219,36 @@ export default defineComponent({
} }
} }
mycircuit.value = circuitStore.getCircuitByProvince(strProv.value)
if (contact.value)
filtroutente.value = [{ userId: contact.value._id }]
step.value = userStore.my.profile.stepTutorial ? userStore.my.profile.stepTutorial : 1
if (step.value > numstep.value)
step.value = numstep.value
// circuit.value = circuitStore.getCircuitByName(props.circuitname) // circuit.value = circuitStore.getCircuitByName(props.circuitname)
if (!userStore.my.profile.stepTutorial || userStore.my.profile.stepTutorial === 0) {
userStore.my.profile.stepTutorial = 1
}
userStore.my.profile.stepTutorial = getFirstStepToFill()
}
function getFirstStepToFill() {
let num = 1
for (const mystep of arrStep) {
if (mystep.checkOk())
num++
else
break
}
return num
} }
function getImgUser(profile: IUserFields) { function getImgUser(profile: IUserFields) {
@@ -117,7 +272,7 @@ export default defineComponent({
const checkifDisabled = computed(() => { const checkifDisabled = computed(() => {
let ret = true let ret = true
let mystep = parseInt(slidestep.value) let mystep = step.value
if (mystep > 0) { if (mystep > 0) {
return !arrStep[mystep - 1].checkOk() return !arrStep[mystep - 1].checkOk()
} else { } else {
@@ -125,6 +280,37 @@ export default defineComponent({
} }
}) })
function clickFinish() {
userStore.my.profile.stepTutorial = numstep.value + 1
step.value = numstep.value + 1
}
function numStepCompleted() {
return prStep.value
}
function completed() {
return prStep.value === numstep.value
}
function getColorTutorial() {
return completed() ? 'bg-green-5' : 'bg-primary'
}
function getColor() {
if (numStepCompleted()) {
return 'positive'
} else {
return 'primary'
}
}
function mounted() {
if (userStore.isUserOk()) {
updatestart()
}
}
onMounted(mounted) onMounted(mounted)
return { return {
@@ -137,12 +323,23 @@ export default defineComponent({
shared_consts, shared_consts,
tools, tools,
showsendCoinTo, showsendCoinTo,
circuit,
showAccountInfo, showAccountInfo,
slidestep, step,
numstep, numstep,
progressLabel, progressLabel,
progressStep,
arrStep, arrStep,
strProv,
mycircuit,
userStore,
clickFinish,
mycards,
filtroutente,
getColor,
stepTut,
completed,
getColorTutorial,
getFirstStepToFill,
} }
}, },
}) })

View File

@@ -1,103 +1,209 @@
<template> <template>
<div v-if="contact"> <div v-if="contact">
<div class="text-center bg-green text-white text-h6"> <div class="row items-center">
{{ $t('tutorial.title') }} - <div :class="step >= numstep ? 'col-10' : 'col-12'">
<span class="text-h7" <CTitleBanner
>({{ class="q-pa-none"
$t('tutorial.step', { step: slidestep, numstep: numstep }) :title="
}})</span !progressStep
> ? $t('tutorial.title') + ` (` + progressLabel + `)`
</div> : $t('tutorial.title_completed') + ` (` + progressLabel + `)`
<q-linear-progress size="25px" :value="progressStep" color="accent"> "
<div class="absolute-full flex flex-center"> :bgcolor="getColorTutorial()"
<q-badge color="white" text-color="accent" :label="progressLabel1" /> clcolor="text-white"
</div> myclass="myshad"
</q-linear-progress> :canopen="!completed()"
:header="step < numstep"
<div class="q-gutter-sm">
<q-carousel
ref="carousel"
v-model="slidestep"
transition-prev="slide-right"
transition-next="slide-left"
swipeable
animated
control-color="white"
padding
arrows
height="250px"
class="bg-blue text-white shadow-1 rounded-borders"
>
<q-carousel-slide
v-for="(recstep, index) in arrStep"
:key="index"
:name="recstep.step"
class="column no-wrap flex-center"
> >
<q-icon :name="recstep.icon" size="36px" /> <q-slide-transition>
<div class="q-mt-sm text-center"></div> <div v-show="step < numstep">
<div v-if="recstep.step === '1'" class="q-mt-sm text-center"> <div class="q-my-sm">
<CMySelectCity <q-linear-progress
:label="$t('reg.resid_province')" stripe
table="users" size="25px"
jointable="provinces" :value="progressStep"
v-model="contact.profile.resid_province" :color="getColor()"
myclass="selectorwide" >
:db_type="costanti.FieldType.string" <div class="absolute-full flex flex-center">
db_field="profile" <q-badge
db_subfield="resid_province" color="white"
:db_id="contact._id" text-color="accent"
:db_rec="contact" :label="
> $t('tutorial.completed_step', { perc: progressLabel })
</CMySelectCity> "
</div> />
</q-carousel-slide> </div>
</q-linear-progress>
</div>
<CMyUserOnlyView
:mycontact="contact"
:visu="costanti.FIND_PEOPLE"
>
</CMyUserOnlyView>
<template v-slot:control> <div class="">
<q-carousel-control <q-stepper
position="bottom-right" v-model="step"
:offset="[18, 18]" ref="stepper"
class="q-gutter-xs" color="primary"
> animated
<q-btn vertical
v-if="slidestep !== '1'" header-nav
push >
icon="arrow_left" <q-step
:label="$t('dialog.indietro')" v-for="(recstep, index) in arrStep"
@click="$refs.carousel.previous()" :key="index"
/> :name="recstep.step"
<q-btn :title="recstep.title + recstep.extratitle()"
v-if="slidestep !== '4'" :icon="recstep.icon"
push :done="recstep.checkOk()"
icon="arrow_right" done-color="positive"
:label="$t('dialog.avanti')" >
:disabled="checkifDisabled" <div
@click="!checkifDisabled ? $refs.carousel.next() : null" v-if="recstep.checkOk() && recstep.label_ok"
/> v-html="recstep.label_ok"
</q-carousel-control> ></div>
</template> <div v-else v-html="recstep.label"></div>
</q-carousel> <br />
<div class="row justify-center"> <q-banner v-if="step === 1" class="bg-blue-8 text-white">
<q-btn-toggle <CMySelectCity
glossy :label="$t('reg.resid_province')"
v-model="slidestep" table="users"
:options="[ jointable="provinces"
{ label: '1', value: '1' }, v-model="contact.profile.resid_province"
{ label: 2, value: '2' }, myclass="selectorwide text-white"
{ label: 3, value: '3' }, :db_type="costanti.FieldType.string"
{ label: 4, value: '4' }, db_field="profile"
]" db_subfield="resid_province"
/> :db_id="contact._id"
:db_rec="contact"
>
</CMySelectCity>
</q-banner>
<div v-else-if="step === 2">
<q-banner class="bg-blue-8 text-white">
<div class="myrow">
<CMyFieldDb
:title="$t('reg.name')"
table="users"
mykey="name"
:hint="$t('reg.insert_name')"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
:title="$t('reg.surname')"
table="users"
mykey="surname"
:hint="$t('reg.insert_surname')"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
</div>
</q-banner>
</div>
<div v-else-if="step === 3" class="">
<CMyCircuit
:mycircuit="mycircuit"
:visu="costanti.ENTER_TO_THE_CIRCUIT"
>
</CMyCircuit>
</div>
<div v-else-if="step === 4" class="">
<div
v-for="(card, ind) of mycards"
:key="ind"
:name="card.table"
>
<q-card class="q-my-md">
<div>
<CSkill
:table="card.table"
:filtercustom="filtroutente"
:butt_modif_new="true"
:visuinpage="true"
:noaut="true"
:title="card.title"
/>
</div>
</q-card>
</div>
</div>
<div v-else-if="step === 5" class="">
<div class="myrow">
<CMyFieldDb
:title="$t('reg.photo')"
table="users"
mykey="profile"
mysubkey="img"
:type="costanti.FieldType.image"
>
</CMyFieldDb>
</div>
{{ $t('tutorial.step_altri_in_profilo') }}
<q-btn
glossy
label="Modifica Profilo"
icon="fas fa-pencil-alt"
color="primary"
to="/editprofile"
/>
</div>
<div v-else-if="step === 6" class=""></div>
<q-stepper-navigation>
<q-btn
v-if="step > 1"
flat
color="primary"
@click="$refs.stepper.previous()"
:label="$t('dialog.indietro')"
class="q-ml-sm"
/>
<q-btn
@click="
step === numstep
? clickFinish()
: $refs.stepper.next()
"
color="primary"
:label="
step === numstep
? $t('dialog.finish')
: $t('dialog.avanti')
"
/>
</q-stepper-navigation>
</q-step>
</q-stepper>
</div>
</div>
</q-slide-transition>
</CTitleBanner>
</div> </div>
<q-btn
v-if="step >= numstep"
:class="`col-2 ` + getColorTutorial()"
icon="fas fa-arrow-right"
color="text-white"
dense
size="md"
:label="$t('dialog.vai')"
@click="step = getFirstStepToFill()"
>
</q-btn>
</div> </div>
</div> </div>
<q-dialog v-model="showAccountInfo" full-height full-width> <q-dialog v-model="showAccountInfo" full-height full-width>
<q-card v-if="true"> <q-card v-if="true">
<q-toolbar class="bg-primary text-white"> <q-toolbar class="bg-primary">
<q-toolbar-title class="text-h7"> <q-toolbar-title class="text-h7">
{{ tools.getNomeUtenteByRecUser(contact) }} {{ tools.getNomeUtenteEUsernameByRecUser(contact) }}
</q-toolbar-title> </q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn> <q-btn flat round icon="close" v-close-popup></q-btn>
</q-toolbar> </q-toolbar>
</q-card> </q-card>
</q-dialog> </q-dialog>
@@ -106,6 +212,6 @@
<script lang="ts" src="./CMyProfileTutorial.ts"> <script lang="ts" src="./CMyProfileTutorial.ts">
</script> </script>
<style lang="scss" scoped> <style lang="scss">
@import './CMyProfileTutorial.scss'; @import './CMyProfileTutorial.scss';
</style> </style>

View File

@@ -29,6 +29,11 @@ export default defineComponent({
type: Boolean, type: Boolean,
required: false, required: false,
default: false, default: false,
},
margin_right: {
type: Number,
required: false,
default: 0,
} }
}, },

View File

@@ -1,7 +1,7 @@
<!--suppress ALL --> <!--suppress ALL -->
<template> <template>
<div class="q-py-xs centermydiv cardrec" <div class="q-py-xs centermydiv cardrec"
:style="`max-width: `+ (tools.getwidth($q) - 20) +`px; ` + ($q.screen.lt.sm ? (`min-width: `+ (tools.getwidth($q) - 20) +`px;`) : ``)"> :style="`max-width: `+ (tools.getwidth($q) - 20) +`px; ` + ($q.screen.lt.sm ? (`min-width: `+ (tools.getwidth($q) - (20 + margin_right)) +`px;`) : ``)">
<q-item v-if="myrec" clickable v-ripple :class="`shadow-2 q-btn--rounded ` + ($q.dark.isActive ? `bg-black`: `bg-teal-1`)"> <q-item v-if="myrec" clickable v-ripple :class="`shadow-2 q-btn--rounded ` + ($q.dark.isActive ? `bg-black`: `bg-teal-1`)">
@@ -57,7 +57,7 @@
</q-item-section> </q-item-section>
<q-item-section side v-if="tools.canModifyThisRec(myrec) || editOn"> <q-item-section side v-if="tools.canModifyThisRec(myrec) || editOn">
<q-item-label> <q-item-label>
<q-btn rounded icon="fas fa-pencil-alt"> <q-btn rounded dense icon="fas fa-pencil-alt">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable v-close-popup <q-item clickable v-close-popup

View File

@@ -55,7 +55,7 @@
</q-item-section> </q-item-section>
<q-item-section side v-if="tools.canModifyThisRec(circuit, table)"> <q-item-section side v-if="tools.canModifyThisRec(circuit, table)">
<q-item-label> <q-item-label>
<q-btn rounded icon="fas fa-pencil-alt"> <q-btn rounded dense icon="fas fa-pencil-alt">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable v-close-popup <q-item clickable v-close-popup

View File

@@ -42,7 +42,7 @@
</q-item-section> </q-item-section>
<q-item-section side v-if="tools.canModifyThisRec(myrec, table)"> <q-item-section side v-if="tools.canModifyThisRec(myrec, table)">
<q-item-label> <q-item-label>
<q-btn rounded icon="fas fa-pencil-alt"> <q-btn rounded dense icon="fas fa-pencil-alt">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable v-close-popup <q-item clickable v-close-popup

View File

@@ -13,6 +13,7 @@
:optlab="fieldsTable.getLabelByTable(jointable)" :optlab="fieldsTable.getLabelByTable(jointable)"
:options="globalStore.getTableJoinByName(jointable, false, false, '')" :options="globalStore.getTableJoinByName(jointable, false, false, '')"
:useinput="false" :useinput="false"
:dark="true"
@update:value="changevalRec" @update:value="changevalRec"
> >
</CMySelect> </CMySelect>

View File

@@ -197,6 +197,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
setCmd( setCmd(
@@ -393,6 +394,25 @@
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list v-if="true" style="min-width: 150px"> <q-list v-if="true" style="min-width: 150px">
<q-item
v-if="
userStore.getMyCircuitsInCommonByUser(contact).length > 0 &&
(contact.username !== userStore.my.username ||
userStore.hoContiCollettiviDaAmministrare() ||
userStore.hoContiComunitariDaAmministrare())
"
clickable
v-close-popup
dense
@click="showsendCoinTo = true"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-coins" />
</q-item-section>
<q-item-section>{{
$t('circuit.sendcoins')
}}</q-item-section>
</q-item>
<q-item <q-item
clickable clickable
v-close-popup v-close-popup
@@ -553,6 +573,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
setCmd( setCmd(
@@ -657,6 +678,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
setCmd( setCmd(
@@ -694,6 +716,25 @@
> >
<q-menu> <q-menu>
<q-list style="min-width: 200px"> <q-list style="min-width: 200px">
<q-item
v-if="
userStore.getMyCircuitsInCommonByUser(contact).length > 0 &&
(contact.username !== userStore.my.username ||
userStore.hoContiCollettiviDaAmministrare() ||
userStore.hoContiComunitariDaAmministrare())
"
clickable
v-close-popup
dense
@click="showsendCoinTo = true"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-coins" />
</q-item-section>
<q-item-section>{{
$t('circuit.sendcoins')
}}</q-item-section>
</q-item>
<q-item <q-item
v-if=" v-if="
costanti.ENABLE_FRIENDS && costanti.ENABLE_FRIENDS &&
@@ -852,6 +893,7 @@
<q-item <q-item
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
setCmd( setCmd(

View File

@@ -3,18 +3,46 @@
<q-item class="q-my-sm" clickable> <q-item class="q-my-sm" clickable>
<q-item-section avatar @click="naviga(`/my/` + contact.username)"> <q-item-section avatar @click="naviga(`/my/` + contact.username)">
<q-avatar size="60px"> <q-avatar size="60px">
<q-img :src="getImgUser(contact)" :alt="contact.username" img-class="imgprofile" height="60px"/> <q-img
:src="getImgUser(contact)"
:alt="contact.username"
img-class="imgprofile"
height="60px"
/>
</q-avatar> </q-avatar>
</q-item-section> </q-item-section>
<q-item-section @click="naviga(`/my/` + contact.username)"> <q-item-section @click="naviga(`/my/` + contact.username)">
<q-item-label v-if="labelextra && (labelextra !== contact.username)"><strong>{{ labelextra }}</strong></q-item-label> <q-item-label v-if="labelextra && labelextra !== contact.username"
<q-item-label><span class="username">{{ contact.username }}</span> <span v-if="contact.name">({{ contact.name }} {{ contact.surname }})</span> ><strong>{{ labelextra }}</strong></q-item-label
>
<q-item-label v-if="contact.name"
><span class="username"
>{{ contact.name }}
<span v-if="contact.surname">{{ contact.surname }}</span></span
>
({{ contact.username }})
</q-item-label> </q-item-label>
<q-item-label v-if="contact.reported" caption lines="1"><em style="color: red; font-weight: bold">{{ $t('db.reporteduser', {date_report: tools.getstrDateTimeShort(contact.date_report)}) }}</em></q-item-label> <q-item-label v-else
<q-item-label v-if="contact.profile" caption lines="1"><em>{{ contact.profile.qualifica }}</em></q-item-label> ><span class="username">{{ contact.username }}</span>
<span v-if="contact.name"
>({{ contact.name }} {{ contact.surname }})</span
>
</q-item-label>
<q-item-label v-if="contact.reported" caption lines="1"
><em style="color: red; font-weight: bold">{{
$t('db.reporteduser', {
date_report: tools.getstrDateTimeShort(contact.date_report),
})
}}</em></q-item-label
>
<q-item-label v-if="contact.profile" caption lines="1"
><em>{{ contact.profile.qualifica }}</em></q-item-label
>
<q-item-label caption lines="1"></q-item-label> <q-item-label caption lines="1"></q-item-label>
<q-item-label v-if="labelFooter" lines="1"><em>{{ labelFooter }}</em></q-item-label> <q-item-label v-if="labelFooter" lines="1"
><em>{{ labelFooter }}</em></q-item-label
>
</q-item-section> </q-item-section>
<q-item-section side v-if="visu === costanti.FRIENDS"> <q-item-section side v-if="visu === costanti.FRIENDS">
@@ -22,15 +50,43 @@
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="setCmd($q, shared_consts.FRIENDSCMD.REMOVE_FROM_MYFRIENDS, userStore.my.username, '', contact.username)"> clickable
<q-item-section>{{ $t('friends.remove_from_myfriends') }}</q-item-section> icon="fas fa-user-minus"
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.REMOVE_FROM_MYFRIENDS,
userStore.my.username,
'',
contact.username
)
"
>
<q-item-section>{{
$t('friends.remove_from_myfriends')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable icon="fas fa-ban" v-close-popup <q-item
@click="setCmd($q, shared_consts.FRIENDSCMD.BLOCK_USER, userStore.my.username, '', contact.username)"> clickable
<q-item-section>{{ $t('friends.block_user') }}</q-item-section> icon="fas fa-ban"
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.BLOCK_USER,
userStore.my.username,
'',
contact.username
)
"
>
<q-item-section>{{
$t('friends.block_user')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
@@ -42,14 +98,43 @@
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list v-if="true" style="min-width: 150px"> <q-list v-if="true" style="min-width: 150px">
<q-item clickable v-close-popup @click="setCmd($q, shared_consts.FRIENDSCMD.SETFRIEND, userStore.my.username, '', contact.username)"> <q-item
<q-item-section>{{ $t('friends.accept_friend') }}</q-item-section> clickable
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.SETFRIEND,
userStore.my.username,
'',
contact.username
)
"
>
<q-item-section>{{
$t('friends.accept_friend')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="setCmd($q, shared_consts.FRIENDSCMD.REQFRIEND, userStore.my.username, false, contact.username, false)"> clickable
<q-item-section>{{ $t('friends.reject_ask_friend') }}</q-item-section> icon="fas fa-user-minus"
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.REQFRIEND,
userStore.my.username,
false,
contact.username,
false
)
"
>
<q-item-section>{{
$t('friends.reject_ask_friend')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
@@ -61,10 +146,13 @@
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list v-if="true" style="min-width: 150px"> <q-list v-if="true" style="min-width: 150px">
<q-item
<q-item clickable v-close-popup @click="tools.addToMyGroups($q, contact.username, groupname)"> clickable
v-close-popup
@click="tools.addToMyGroups($q, contact.username, groupname)"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="positive" name="fas fa-user-plus"/> <q-icon color="positive" name="fas fa-user-plus" />
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
{{ $t('groups.accept_group') }} {{ $t('groups.accept_group') }}
@@ -72,70 +160,136 @@
</q-item> </q-item>
</q-list> </q-list>
<q-list style="min-width: 200px"> <q-list style="min-width: 200px">
<q-item clickable v-close-popup <q-item
@click="tools.refuseReqGroup($q, contact.username, groupname)"> clickable
v-close-popup
@click="tools.refuseReqGroup($q, contact.username, groupname)"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section> <q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section>
</q-item> </q-item>
<q-item clickable v-close-popup <q-item
@click="tools.cancelReqGroups($q, contact.username, groupname)"> clickable
v-close-popup
@click="
tools.cancelReqGroups($q, contact.username, groupname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('shared.cancel_ask_short') }}</q-item-section> <q-item-section>{{
$t('shared.cancel_ask_short')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
</q-btn> </q-btn>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-else-if="visu === costanti.REQ_REMOVE_USER_TO_GROUP"> <q-item-section
side
v-else-if="visu === costanti.REQ_REMOVE_USER_TO_GROUP"
>
<q-item-label v-if="contact.username !== userStore.my.username"> <q-item-label v-if="contact.username !== userStore.my.username">
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable v-if="!tools.isUserAdminGroup(groupname, contact.username)" v-close-popup @click="tools.addtoAdminOfMyGroup($q, contact.username, groupname)"> <q-item
clickable
v-if="!tools.isUserAdminGroup(groupname, contact.username)"
v-close-popup
@click="
tools.addtoAdminOfMyGroup($q, contact.username, groupname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="positive" name="fas fa-user-shield"/> <q-icon color="positive" name="fas fa-user-shield" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('groups.addasadmin') }}</q-item-section> <q-item-section>{{ $t('groups.addasadmin') }}</q-item-section>
</q-item> </q-item>
<q-item clickable v-if="tools.isUserAdminGroup(groupname, contact.username) && tools.iAmTheCreatorOfTheGroup(groupname)" v-close-popup @click="tools.removeAdminOfMyGroup($q, contact.username, groupname)"> <q-item
clickable
v-if="
tools.isUserAdminGroup(groupname, contact.username) &&
tools.iAmTheCreatorOfTheGroup(groupname)
"
v-close-popup
@click="
tools.removeAdminOfMyGroup($q, contact.username, groupname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-times"/> <q-icon color="negative" name="fas fa-user-times" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('groups.remove_as_admin') }}</q-item-section> <q-item-section>{{
$t('groups.remove_as_admin')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable v-if="!tools.isUserTheCreatorOfTheGroup(groupname, contact.username)" v-close-popup @click="tools.removeFromMyGroups($q, contact.username, groupname)"> <q-item
clickable
v-if="
!tools.isUserTheCreatorOfTheGroup(
groupname,
contact.username
)
"
v-close-popup
@click="
tools.removeFromMyGroups($q, contact.username, groupname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('groups.remove_from_mygroups') }}</q-item-section> <q-item-section>{{
$t('groups.remove_from_mygroups')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable v-close-popup @click="tools.reportUser($q, userStore.my.username, contact.username)"> <q-item
clickable
v-close-popup
@click="
tools.reportUser(
$q,
userStore.my.username,
contact.username
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-flag"/> <q-icon color="negative" name="fas fa-flag" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('friends.report_user') }}</q-item-section> <q-item-section>{{
$t('friends.report_user')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
</q-btn> </q-btn>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-else-if="visu === costanti.REQ_ADD_USER_TO_CIRCUIT"> <q-item-section
side
v-else-if="visu === costanti.REQ_ADD_USER_TO_CIRCUIT"
>
<q-item-label> <q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list v-if="true" style="min-width: 150px"> <q-list v-if="true" style="min-width: 150px">
<q-item
<q-item clickable v-close-popup @click="tools.addToMyCircuits($q, contact.username, circuitname)"> clickable
v-close-popup
@click="
tools.addToMyCircuits($q, contact.username, circuitname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="positive" name="fas fa-user-plus"/> <q-icon color="positive" name="fas fa-user-plus" />
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
{{ $t('circuit.accept') }} {{ $t('circuit.accept') }}
@@ -143,55 +297,128 @@
</q-item> </q-item>
</q-list> </q-list>
<q-list style="min-width: 200px"> <q-list style="min-width: 200px">
<q-item clickable v-close-popup <q-item
@click="tools.refuseReqCircuit($q, contact.username, circuitname)"> clickable
v-close-popup
@click="
tools.refuseReqCircuit($q, contact.username, circuitname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section> <q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section>
</q-item> </q-item>
<q-item clickable v-close-popup <q-item
@click="tools.cancelReqCircuit($q, contact.username, circuitname)"> clickable
v-close-popup
@click="
tools.cancelReqCircuit($q, contact.username, circuitname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('shared.cancel_ask_short') }}</q-item-section> <q-item-section>{{
$t('shared.cancel_ask_short')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
</q-btn> </q-btn>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-else-if="visu === costanti.REQ_REMOVE_USER_TO_CIRCUIT"> <q-item-section
side
v-else-if="visu === costanti.REQ_REMOVE_USER_TO_CIRCUIT"
>
<q-item-label v-if="contact.username !== userStore.my.username"> <q-item-label v-if="contact.username !== userStore.my.username">
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable v-if="!tools.isUserAdminCircuit(circuitname, contact.username)" v-close-popup @click="tools.addtoAdminOfCircuit($q, contact.username, circuitname)"> <q-item
clickable
v-if="
!tools.isUserAdminCircuit(circuitname, contact.username)
"
v-close-popup
@click="
tools.addtoAdminOfCircuit($q, contact.username, circuitname)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="positive" name="fas fa-user-shield"/> <q-icon color="positive" name="fas fa-user-shield" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('circuit.addasadmin') }}</q-item-section> <q-item-section>{{
$t('circuit.addasadmin')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable v-if="tools.isUserAdminCircuit(circuitname, contact.username) && tools.iAmTheCreatorOfTheCircuit(circuitname)" v-close-popup @click="tools.removeAdminOfCircuit($q, contact.username, circuitname)"> <q-item
clickable
v-if="
tools.isUserAdminCircuit(circuitname, contact.username) &&
tools.iAmTheCreatorOfTheCircuit(circuitname)
"
v-close-popup
@click="
tools.removeAdminOfCircuit(
$q,
contact.username,
circuitname
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-times"/> <q-icon color="negative" name="fas fa-user-times" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('circuit.remove_as_admin') }}</q-item-section> <q-item-section>{{
$t('circuit.remove_as_admin')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable v-if="!tools.isUserTheCreatorOfTheCircuit(circuitname, contact.username)" v-close-popup @click="tools.removeFromMyCircuits($q, contact.username, circuitname, '')"> <q-item
clickable
v-if="
!tools.isUserTheCreatorOfTheCircuit(
circuitname,
contact.username
)
"
v-close-popup
@click="
tools.removeFromMyCircuits(
$q,
contact.username,
circuitname,
''
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('circuit.remove_from_mycircuit') }}</q-item-section> <q-item-section>{{
$t('circuit.remove_from_mycircuit')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable v-close-popup @click="tools.reportUser($q, userStore.my.username, contact.username)"> <q-item
clickable
v-close-popup
@click="
tools.reportUser(
$q,
userStore.my.username,
contact.username
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-flag"/> <q-icon color="negative" name="fas fa-flag" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('friends.report_user') }}</q-item-section> <q-item-section>{{
$t('friends.report_user')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
@@ -203,9 +430,24 @@
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="setCmd($q, shared_consts.FRIENDSCMD.CANCEL_REQ_FRIEND, userStore.my.username, '', contact.username, '')"> clickable
<q-item-section>{{ $t('friends.cancel_ask_friend') }}</q-item-section> icon="fas fa-user-minus"
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.CANCEL_REQ_FRIEND,
userStore.my.username,
'',
contact.username,
''
)
"
>
<q-item-section>{{
$t('friends.cancel_ask_friend')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
@@ -214,28 +456,81 @@
</q-item-section> </q-item-section>
<q-item-section side v-else-if="visu === costanti.ASK_TRUST"> <q-item-section side v-else-if="visu === costanti.ASK_TRUST">
<q-item-label> <q-item-label>
<q-btn color="positive" :label="$t('friends.accept_trust')" <q-btn
@click="setCmd($q, shared_consts.FRIENDSCMD.SETTRUST, userStore.my.username, true, contact.username)"/> color="positive"
:label="$t('friends.accept_trust')"
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.SETTRUST,
userStore.my.username,
true,
contact.username
)
"
/>
</q-item-label> </q-item-label>
<q-item-label> <q-item-label>
<q-btn color="negative" :label="$t('friends.refuse_trust')" <q-btn
@click="setCmd($q, shared_consts.FRIENDSCMD.SETTRUST, userStore.my.username, false, contact.username)"/> color="negative"
:label="$t('friends.refuse_trust')"
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.SETTRUST,
userStore.my.username,
false,
contact.username
)
"
/>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-else-if="visu === costanti.TRUSTED"> <q-item-section side v-else-if="visu === costanti.TRUSTED">
<q-item-label> <q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list v-if="!userStore.IsMyFriendByUsername(contact.username)" style="min-width: 200px"> <q-list
<q-item clickable icon="fas fa-user-plus" v-close-popup v-if="!userStore.IsMyFriendByUsername(contact.username)"
@click="setCmd($q, shared_consts.FRIENDSCMD.REQFRIEND, userStore.my.username, true, contact.username)"> style="min-width: 200px"
<q-item-section>{{ $t('friends.ask_friend') }}</q-item-section> >
<q-item
clickable
icon="fas fa-user-plus"
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.REQFRIEND,
userStore.my.username,
true,
contact.username
)
"
>
<q-item-section>{{
$t('friends.ask_friend')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list style="min-width: 200px"> <q-list style="min-width: 200px">
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="setCmd($q, shared_consts.FRIENDSCMD.SETTRUST, userStore.my.username, false, contact.username)"> clickable
<q-item-section>{{ $t('friends.reject_trust') }}</q-item-section> icon="fas fa-user-minus"
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.SETTRUST,
userStore.my.username,
false,
contact.username
)
"
>
<q-item-section>{{
$t('friends.reject_trust')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
@@ -244,38 +539,104 @@
</q-item-section> </q-item-section>
<q-item-section side v-else-if="visu === costanti.FIND_PEOPLE"> <q-item-section side v-else-if="visu === costanti.FIND_PEOPLE">
<q-item-label> <q-item-label>
<q-btn
<q-btn v-if="contact.username !== userStore.my.username" rounded v-if="contact.username !== userStore.my.username"
:icon="userStore.IsMyFriendByUsername(contact.username) ? `fas fa-ellipsis-h` : `fas fa-user`"> rounded
:icon="
userStore.IsMyFriendByUsername(contact.username)
? `fas fa-ellipsis-h`
: `fas fa-user`
"
>
<q-menu> <q-menu>
<q-list style="min-width: 200px"> <q-list style="min-width: 200px">
<q-item v-if="(!userStore.IsMyFriendByUsername(contact.username) && !userStore.IsAskedFriendByUsername(contact.username))" <q-item
clickable v-close-popup @click="setCmd($q, shared_consts.FRIENDSCMD.REQFRIEND, userStore.my.username, true, contact.username)"> v-if="
!userStore.IsMyFriendByUsername(contact.username) &&
!userStore.IsAskedFriendByUsername(contact.username)
"
clickable
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.REQFRIEND,
userStore.my.username,
true,
contact.username
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="positive" name="fas fa-user-plus"/> <q-icon color="positive" name="fas fa-user-plus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('friends.ask_friend') }}</q-item-section> <q-item-section>{{
$t('friends.ask_friend')
}}</q-item-section>
</q-item> </q-item>
<q-item v-else-if="(!userStore.IsMyFriendByUsername(contact.username) && userStore.IsAskedFriendByUsername(contact.username))" <q-item
clickable v-close-popup @click="setCmd($q, shared_consts.FRIENDSCMD.REQFRIEND, userStore.my.username, false, contact.username)"> v-else-if="
!userStore.IsMyFriendByUsername(contact.username) &&
userStore.IsAskedFriendByUsername(contact.username)
"
clickable
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.REQFRIEND,
userStore.my.username,
false,
contact.username
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('friends.cancel_ask_friend') }}</q-item-section> <q-item-section>{{
$t('friends.cancel_ask_friend')
}}</q-item-section>
</q-item> </q-item>
<q-item v-else-if="userStore.IsMyFriendByUsername(contact.username)" style="min-width: 200px" <q-item
clickable v-close-popup v-else-if="userStore.IsMyFriendByUsername(contact.username)"
@click="setCmd($q, shared_consts.FRIENDSCMD.REMOVE_FROM_MYFRIENDS, userStore.my.username, '', contact.username)"> style="min-width: 200px"
clickable
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.REMOVE_FROM_MYFRIENDS,
userStore.my.username,
'',
contact.username
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus"/> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('friends.remove_from_myfriends') }}</q-item-section> <q-item-section>{{
$t('friends.remove_from_myfriends')
}}</q-item-section>
</q-item> </q-item>
<q-item clickable v-close-popup @click="tools.reportUser($q, userStore.my.username, contact.username)"> <q-item
clickable
v-close-popup
@click="
tools.reportUser(
$q,
userStore.my.username,
contact.username
)
"
>
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-flag"/> <q-icon color="negative" name="fas fa-flag" />
</q-item-section> </q-item-section>
<q-item-section>{{ $t('friends.report_user') }}</q-item-section> <q-item-section>{{
$t('friends.report_user')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>
@@ -287,9 +648,23 @@
<q-btn rounded icon="fas fa-ellipsis-h"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-menu> <q-menu>
<q-list style="min-width: 200px"> <q-list style="min-width: 200px">
<q-item clickable icon="fas fa-user-minus" v-close-popup <q-item
@click="setCmd($q, shared_consts.FRIENDSCMD.SETTRUST, userStore.my.username, true, contact.username)"> clickable
<q-item-section>{{ $t('friends.accept_trust') }}</q-item-section> icon="fas fa-user-minus"
v-close-popup
@click="
setCmd(
$q,
shared_consts.FRIENDSCMD.SETTRUST,
userStore.my.username,
true,
contact.username
)
"
>
<q-item-section>{{
$t('friends.accept_trust')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
</q-menu> </q-menu>

View File

@@ -7,17 +7,17 @@
@show="qtyRef ? qtyRef.focus() : ''" @show="qtyRef ? qtyRef.focus() : ''"
> >
<q-card class="dialog_card"> <q-card class="dialog_card">
<q-toolbar class="bg-primary text-white"> <q-bar class="bg-primary text-white">
<q-toolbar-title> {{ $t('circuit.sendcoins') }}
{{ $t('circuit.sendcoins') }} <q-space />
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn> <q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar> </q-bar>
<q-card-section class="q-pa-xs inset-shadow"> <q-card-section class="q-px-xs inset-shadow">
<q-select <q-select
v-if="!circuitname" v-if="!circuitname"
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'" :behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
rounded rounded
dense
outlined outlined
v-model="circuitsel" v-model="circuitsel"
:options="bothcircuits" :options="bothcircuits"

View File

View File

@@ -0,0 +1,87 @@
import { computed, defineComponent, PropType, ref } from 'vue'
import { ICalcStat, IOperators } from '../../model'
import { useUserStore } from '../../store/UserStore'
import { useRouter } from 'vue-router'
import { useGlobalStore } from '../../store/globalStore'
import { useI18n } from '../../boot/i18n'
import { shared_consts } from '@src/common/shared_vuejs'
import { costanti, IMainCard } from '@store/Modules/costanti'
import { CMyUser } from '../CMyUser'
import { CMyGroup } from '../CMyGroup'
import { tools } from '@store/Modules/tools'
import { useQuasar } from 'quasar'
export default defineComponent({
name: 'CSendRISTo',
props: {},
components: { CMyUser, CMyGroup },
setup(props) {
const userStore = useUserStore()
const globalStore = useGlobalStore()
const { t } = useI18n()
const $q = useQuasar()
const $router = useRouter()
const receiveRislist = computed(() => globalStore.datastat ? globalStore.datastat.receiveRislist : [])
const receiveRislistgroup = computed(() => globalStore.datastat ? globalStore.datastat.receiveRislistgroup : [])
const usersList = ref(<any>{ show: false, title: '', list: [], listgroup: [] })
const tipoConto = ref(costanti.AccountType.USER)
const loading = ref(false)
const arrTypesAccounts = ref(<any>[
{
label: t('circuit.user'),
value: costanti.AccountType.USER,
},
{
label: t('circuit.conticollettivi'),
value: costanti.AccountType.COLLECTIVE_ACCOUNT,
}
])
function sendCoinsToClick() {
if ((receiveRislist.value && receiveRislist.value.length > 0 || (receiveRislistgroup.value && receiveRislistgroup.value.length > 0))) {
usersList.value.show = true;
usersList.value.title = 'Lista Utenti Riceventi';
usersList.value.list = receiveRislist.value;
usersList.value.listgroup = receiveRislistgroup.value;
} else {
$router.push(tools.updateLink('/circuits'))
}
}
async function updateUserListRIS() {
const userStore = useUserStore()
loading.value = true
await globalStore.getStatSite()
usersList.value.list = globalStore.datastat!.receiveRislist
usersList.value.listgroup = globalStore.datastat!.receiveRislistgroup
loading.value = false
}
return {
userStore,
tools,
costanti,
shared_consts,
usersList,
receiveRislist,
receiveRislistgroup,
sendCoinsToClick,
arrTypesAccounts,
tipoConto,
updateUserListRIS,
loading,
}
},
})

View File

@@ -0,0 +1,113 @@
<template>
<div class="row text-center justify-evenly items-center">
<div class="q-mb-sm">
<q-btn
icon="fas fa-upload"
color="primary"
size="md"
rounded
:label="$t('circuit.sendcoins_toso')"
@click="sendCoinsToClick"
>
</q-btn>
&nbsp;
<q-btn
icon="fas fa-download"
color="primary"
size="md"
rounded
:label="$t('circuit.receive_coins')"
@click="tools.receiveRis($q, $t)"
>
</q-btn>
</div>
</div>
<q-dialog v-model="usersList.show">
<q-card class="dialog_card">
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
{{ usersList.title }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<div>{{ $t('circuit.lista_ricev_title') }}</div>
<div class="row centeritems justify-evenly items-center">
<q-btn
icon="fas fa-wifi"
rounded
glossy
color="primary"
:label="$t('dialog.update')"
:disable="loading"
@click="updateUserListRIS()"
>
</q-btn>
<q-spinner-radio v-if="loading" class="q-ma-sm" color="brown" />
</div>
<br />
<div class="row centeritems">
<q-btn-toggle
v-if="arrTypesAccounts.length > 0"
v-model="tipoConto"
class="my-custom-toggle"
no-caps
rounded
unelevated
toggle-color="primary"
color="white"
text-color="primary"
:options="arrTypesAccounts"
/>
<div v-if="tipoConto === costanti.AccountType.USER">
<div v-for="(rec, i) in usersList.list" :key="i">
<CMyUser
:mycontact="rec"
:visu="costanti.FIND_PEOPLE"
@setCmd="tools.setCmd"
>
</CMyUser>
</div>
</div>
<div
v-else-if="tipoConto === costanti.AccountType.COLLECTIVE_ACCOUNT"
>
<div v-for="(grp, i) in usersList.listgroup" :key="i">
<CMyGroup :mygrp="grp" :visu="costanti.USER_GROUPS" :noaut="true">
</CMyGroup>
</div>
</div>
</div>
</q-card-section>
<q-card-actions align="center">
<q-btn
rounded
icon="close"
v-close-popup
:label="$t('dialog.close')"
></q-btn>
<q-btn
rounded
:label="$t('circuit.vaialcircuito')"
color="primary"
:to="tools.updateLink('/circuits')"
>
</q-btn>
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script lang="ts" src="./CSendRISTo.ts">
</script>
<style lang="scss" scoped>
@import './CSendRISTo.scss';
</style>

View File

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

View File

@@ -22,7 +22,8 @@
:extraparams="extraparams" :extraparams="extraparams"
:noaut="noaut" :noaut="noaut"
:hidetitleIfEmpty="true" :hidetitleIfEmpty="true"
:labelBtnAddExtra="`Aggiungi ` + title"> :labelBtnAddExtra="`Aggiungi ` + title"
:margin_right="30">
</CGridTableRec> </CGridTableRec>
</div> </div>

View File

@@ -64,6 +64,8 @@ export default defineComponent({
lastssharedlink: [], lastssharedlink: [],
diffusorilist: [], diffusorilist: [],
strettelist: [], strettelist: [],
receiveRislist: [],
receiveRislistgroup: [],
checkuser: { verified_email: false } checkuser: { verified_email: false }
}) })

View File

@@ -52,6 +52,11 @@ export default defineComponent({
required: false, required: false,
default: '', default: '',
}, },
header: {
type: Boolean,
required: false,
default: false,
}
}, },
components: {}, components: {},
emits: ['apri'], emits: ['apri'],

View File

@@ -1,21 +1,63 @@
<template> <template>
<div> <div>
<q-header v-if="header && myvisible" elevated reveal>
<q-banner
inline-actions
rounded
dense
:class="
bgcolor +
` cursor-pointer q-my-sm ` +
clcolor +
` ` +
myclass +
' ' +
getclass()
"
style="text-align: center"
@click="apri()"
>
<template v-slot:avatar>
<q-icon v-if="canopen && icon" :name="icon" color="white" />
</template>
<template v-slot:action>
<div class="cursor-pointer">
<q-icon v-if="canopen" :name="iconopen()" color="white" />
</div>
</template>
<span :class="`mybanner ` + myclasstext" :style="mystyle">{{
title
}}</span>
</q-banner>
</q-header>
<q-banner <q-banner
v-else
inline-actions inline-actions
rounded dense rounded
:class="bgcolor+` cursor-pointer q-my-sm `+clcolor+ ` ` + myclass + ' ' + getclass()" dense
style="text-align: center; " :class="
bgcolor +
` cursor-pointer q-my-sm ` +
clcolor +
` ` +
myclass +
' ' +
getclass()
"
style="text-align: center"
@click="apri()" @click="apri()"
> >
<template v-slot:avatar> <template v-slot:avatar>
<q-icon v-if="canopen && icon" :name="icon" color="white"/> <q-icon v-if="canopen && icon" :name="icon" color="white" />
</template> </template>
<template v-slot:action> <template v-slot:action>
<div class="cursor-pointer"> <div class="cursor-pointer">
<q-icon v-if="canopen" :name="iconopen()" color="white"/> <q-icon v-if="canopen" :name="iconopen()" color="white" />
</div> </div>
</template> </template>
<span :class="`mybanner `+ myclasstext" :style="mystyle">{{ title }}</span> <span :class="`mybanner ` + myclasstext" :style="mystyle">{{
title
}}</span>
</q-banner> </q-banner>
<q-slide-transition> <q-slide-transition>
@@ -24,13 +66,15 @@
<slot></slot> <slot></slot>
</div> </div>
<div <div
v-if="imgpreview" class="text-center cursor-pointer clBorderSteps" style="opacity: 0.5;" v-if="imgpreview"
@click="myvisible = !myvisible"> class="text-center cursor-pointer clBorderSteps"
style="opacity: 0.5"
@click="myvisible = !myvisible"
>
<q-img :src="imgpreview" class="img"></q-img> <q-img :src="imgpreview" class="img"></q-img>
</div> </div>
</div> </div>
</q-slide-transition> </q-slide-transition>
</div> </div>
</template> </template>

View File

@@ -35,7 +35,7 @@
v-if="site.confpages.showViewCircuits" v-if="site.confpages.showViewCircuits"
class="mylabfooter" class="mylabfooter"
:label="$t('tabdown.circuits')" :label="$t('tabdown.circuits')"
to="/circuits" :to="tools.updateLink('/circuits')"
icon="img: images/1ris_rosso_100.png" icon="img: images/1ris_rosso_100.png"
/> />
<q-route-tab <q-route-tab

View File

@@ -1,483 +1,144 @@
<template> <template>
<q-page class="q-pa-md"> <q-page class="q-pa-md">
<div v-if="toolsext.isLang('it')"> <div v-if="toolsext.isLang('it')">
<p class="text-subtitle1">Privacy Policy di {{url}}</p> <p class="text-subtitle1">Privacy Policy di {{ url }}</p>
<p class="text-subtitle1">Informativa sul trattamento dei dati personali ai sensi dellart. 13 del <p class="text-subtitle1">
Regolamento Informativa sul trattamento dei dati personali.
(UE) n. 2003 n.196</p> </p>
<p>Ai sensi dellart. 13 del Regolamento (UE) n. 2003 n.196, anche denominato General Data Protection <p>I dati personali verranno utilizzati solo ai fini dell'utilizzo della piattaforma.
Regulation Crediamo in un mondo Libero e fiducioso.
(di seguito il GDPR), {{SiteName}} La informa che i Suoi dati personali (di seguito i Dati), Le uniche "regole" a cui sottostiamo sono quelle Universali e Naturali dove chi fa del male al prossimo,
saranno trattati nel rispetto di quanto previsto dal GDPR e di ogni normativa applicabile in riferimento gli ritornerà indietro tante volte,
al trattamento dei dati personali in conformità allinformativa che segue.</p> esattamente come chi fa del bene al prossimo,
verrà ricompensato in qualche modo e in qualche tempo.
</p>
<p><span class="text-subtitle2">1. Titolare del trattamento</span><br/> <p>
{{ownerDataName}}</p> <span class="text-subtitle2">1. Titolare del trattamento</span><br />
<p><span class="boldhigh">Responsabile trattamento e protezione dati:</span><br/> {{ ownerDataName }}
{{managerData}} </p>
<p>
<span class="boldhigh">Responsabile trattamento e protezione dati:</span
><br />
{{ managerData }}
</p> </p>
<p class="text-subtitle2">2. Categorie di Dati</p> <p class="text-subtitle2">2. Categorie di Dati</p>
<p>I Dati trattati dal Titolare includono: {{includeData}}.</p> <p>I Dati trattati dal Titolare includono: {{ includeData }}.</p>
<p class="text-subtitle2">3. Finalità e base giuridica del trattamento. Legittimo interesse.</p> <p class="text-subtitle2">3. Modalità del trattamento.</p>
<p>I Dati saranno trattati per ladempimento di finalità informative, commerciali e amministrative ad <p>
obblighi di legge, ai sensi dellart. 6, comma 1, lettera b) e c) del GDPR, nonché il perseguimento del I Suoi Dati sono raccolti e registrati in modo lecito e secondo
legittimo correttezza per le finalità della piattaforma e sono trattati anche con
interesse del Titolare, allart. 6, comma 1, lettera f del GDPR, in riferimento a: lausilio di strumenti elettronici, anche mediante
rispetto di procedure amministrative interne e adempimento di obblighi di legge o regolamenti vigenti in linserimento e lorganizzazione in database e, comunque, in modo
{{country}}; tale da garantire la sicurezza e la riservatezza dei Dati stessi.
linvio di comunicazioni di natura informativa, commerciale e promozionale.</p> </p>
<p>In ogni caso, il trattamento dei Suoi Dati effettuato sulla base del proprio legittimo interesse del <p class="text-subtitle2">4. Destinatari o categorie di destinatari.</p>
Titolare avviene, oltre che nel rispetto di quanto previsto allart. 6, comma 1, lettera f del GDPR, anche in
conformità
a quanto disposto al considerando n. 47 e allOpinion n. 6/2014 Article 29 Data Protection Working
Party, par. III.3.1.</p>
<p class="text-subtitle2">4. Modalità del trattamento.</p> <p>
I Dati potranno essere resi accessibili, portati a conoscenza di o
comunicati ai seguenti soggetti, i quali saranno nominati dal Titolare,
a seconda dei casi, quali responsabili la cui lista è disponibile
presso la sede del Titolare o incaricati: - collaboratori a
qualsivoglia titolo del Titolare; - soggetti pubblici o privati, persone
fisiche o giuridiche, di cui il Titolare si avvalga per lo svolgimento
delle attività strumentali al raggiungimento della finalità di cui sopra
o a cui il Titolare sia tenuto a comunicare i Dati SOLO IN CASO DI VERA
NECESSITA', solo per difendere un'eventuale torto subìto, purchè non
vada contro la libertà dell'individuo e segua la regola del BUON SENSO.
</p>
<p>I Suoi Dati sono raccolti e registrati in modo lecito e secondo correttezza per le finalità sopra <p>In ogni caso, i Dati NON SARANNO DIFFUSI.</p>
indicate e sono trattati anche con lausilio di strumenti elettronici e automatizzati, anche mediante
linserimento e
lorganizzazione in banche dati, in conformità a quanto disposto dal GDPR in materia di misure di
sicurezza, e, comunque, in modo tale da garantire la sicurezza e la riservatezza dei Dati stessi.</p>
<p class="text-subtitle2">5. Destinatari o categorie di destinatari.</p> <p class="text-subtitle2">5. Luogo</p>
<p>I Dati potranno essere resi accessibili, portati a conoscenza di o comunicati ai seguenti soggetti, i <p>
quali saranno nominati dal Titolare, a seconda dei casi, quali responsabili la cui lista è disponibile I Dati sono trattati presso le sedi operative del Titolare ed in ogni
presso la sede del Titolare o incaricati: altro luogo in cui le parti coinvolte nel trattamento siano localizzate.
dipendenti e/o collaboratori a qualsivoglia titolo del Titolare; Per ulteriori informazioni, contattare il Titolare agli estremi
soggetti pubblici o privati, persone fisiche o giuridiche, di cui il Titolare si avvalga per lo riportati in apertura.
svolgimento delle attività strumentali al raggiungimento della finalità di cui sopra o a cui il Titolare sia </p>
tenuto a
comunicare i Dati in forza di obblighi legali o contrattuali.</p>
<p>In ogni caso, i Dati non saranno diffusi.</p> <p class="text-subtitle2">6. Periodo di conservazione.</p>
<p class="text-subtitle2">6. Luogo</p> <p>
I Dati saranno conservati per un periodo di tempo non superiore a 10
(dieci) anni per finalità amministrative e, comunque, per il tempo
strettamente necessario al perseguimento dellinteresse legittimo del
Titolare. Salvo che l'utente, in ogni momento, può decidere di
cancellare la propria utenza e quindi tutti i dati al suo interno.
</p>
<p>I Dati sono trattati presso le sedi operative del Titolare ed in ogni altro luogo in cui le parti <p class="text-subtitle2">
coinvolte nel trattamento siano localizzate. Per ulteriori informazioni, contattare il Titolare agli estremi 7. Diritti di accesso, cancellazione, limitazione e portabilità.
riportati in </p>
apertura.</p>
<p class="text-subtitle2">7. Periodo di conservazione.</p> <p>
Il Titolare La informa che Le sono riconosciuti i relativi diritti.
A titolo esemplificativo, inviando specifica
richiesta allindirizzo email {{ owneremail }}, Lei potrà: ottenere la
conferma che sia o meno in corso un trattamento di dati personali che La
riguardano; qualora un trattamento sia in corso, ottenere laccesso ai
dati e alle informazioni relative al trattamento, nonché richiedere una
copia dei dati stessi; ottenere la rettifica dei dati inesatti e
lintegrazione dei dati personali incompleti; ottenere, la cancellazione
dei Dati che La riguardano; ottenere la limitazione del trattamento dei
Dati che La riguardano; ricevere i Dati che La riguardano in un formato
strutturato, di uso comune e leggibile da dispositivo automatico e
richiedere la loro trasmissione ad un altro titolare, se tecnicamente
fattibile.
</p>
<p>I Dati saranno conservati per un periodo di tempo non superiore a 10 (dieci) anni per finalità <p class="text-subtitle2">8. Diritto di opposizione.</p>
amministrative e, comunque, per il tempo strettamente necessario al perseguimento dellinteresse legittimo del
Titolare.</p>
<p class="text-subtitle2">8. Diritti di accesso, cancellazione, limitazione e portabilità.</p> <p>
Lei godrà altresì del diritto di opporsi in qualsiasi momento al
<p>Il Titolare La informa che Le sono riconosciuti i diritti di cui agli artt. da 15 a 20 del GDPR. A titolo trattamento dei propri Dati effettuato per il perseguimento del
esemplificativo, inviando specifica richiesta allindirizzo email {{owneremail}}, Lei potrà: legittimo interesse del Titolare scrivendo allindirizzo email
ottenere la conferma che sia o meno in corso un trattamento di dati personali che La riguardano; {{ owneremail }}. In caso di opposizione, i Dati non saranno più oggetto
qualora un trattamento sia in corso, ottenere laccesso ai dati e alle informazioni relative al di trattamento, sempre che non sussistano motivi legittimi per procedere
trattamento, nonché richiedere una copia dei dati stessi; al trattamento che prevalgono sugli interessi, sui diritti e sulle
ottenere la rettifica dei dati inesatti e lintegrazione dei dati personali incompleti; libertà degli interessati, oppure per laccertamento, lesercizio o la
ottenere, qualora sussista una delle condizioni previste dallart. 17 del GDPR, la cancellazione dei difesa di un diritto in sede giudiziaria.
Dati che La riguardano; ottenere, nei casi previsti dallart. 18 del GDPR, la limitazione del trattamento dei </p>
Dati che La
riguardano; ricevere i Dati che La riguardano in un formato strutturato, di uso comune e leggibile da
dispositivo
automatico e richiedere la loro trasmissione ad un altro titolare, se tecnicamente fattibile.</p>
<p class="text-subtitle2">9. Diritto di opposizione.</p>
<p>Ai sensi dellart. 21 del GDPR, Lei godrà altresì del diritto di opporsi in qualsiasi momento al
trattamento dei propri Dati effettuato per il perseguimento del legittimo interesse del Titolare scrivendo
allindirizzo email
{{owneremail}}. In caso di opposizione, i Dati non saranno più oggetto di trattamento, sempre che non
sussistano motivi legittimi per procedere al trattamento che prevalgono sugli interessi, sui diritti e sulle
libertà degli interessati, oppure per laccertamento, lesercizio o la difesa di un diritto in sede
giudiziaria.</p>
<p class="text-subtitle2">Responsabile della protezione dei dati</p> <p class="text-subtitle2">Responsabile della protezione dei dati</p>
<p>Il titolare ha provveduto a nominare il responsabile della protezione dei dati che è contattabile alla <p>
seguente casella di posta elettronica {{owneremail}}.</p> Il titolare ha provveduto a nominare il responsabile della protezione
dei dati che è contattabile alla seguente casella di posta elettronica
<p class="text-subtitle2">10. Diritto di proporre reclamo al Garante.</p> {{ owneremail }}.
<p>Il Titolare La informa altresì che potrà proporre reclamo al Garante per la Protezione dei Dati Personali nel
caso in cui ritenga che siano stati violati i diritti di cui è titolare ai sensi del GDPR o di qualsiasi altra
normativa applicabile, secondo le modalità indicate sul sito internet del Garante per la Protezione dei Dati
Personali accessibile allindirizzo: <a href="http://www.garanteprivacy.it" target="_blank">www.garanteprivacy.it</a>.
</p> </p>
<p>Ultimo aggiornamento: {{lastdataupdate}}</p> <p class="text-subtitle2">9. Diritto di proporre reclamo al Garante.</p>
<p>
Il Titolare La informa altresì che potrà proporre reclamo al Garante per
la Protezione dei Dati Personali nel caso in cui ritenga che siano stati
violati i diritti di cui è titolare o di qualsiasi altra normativa
applicabile.
</p>
<p class="text-subtitle2">10. Suggerimenti</p>
<p>Il Buon Senso ci suggerisce che se riteniamo alcuni dati personali troppo "sensibili",
è opportuno non inserirli affatto all'interno di qualsiasi sito web o piattaforma.
Potete ad esempio non inserire il vostro Nome e Cognome, visto che sono facoltativi, o metterli fittizzi.
Quanto una persona è conosciuta dalla rete potremmo in qualche modo "misurarla" in base a quante "Strette di Mano" ha ottenuto dalle persone.
</p>
<p>Ultimo aggiornamento: {{ lastdataupdate }}</p>
</div> </div>
<div v-else-if="toolsext.isLang('fr')"> <div v-else-if="toolsext.isLang('fr')"></div>
<p class="text-subtitle1">Politique de confidentialité de {{url}}</p> <div v-else-if="toolsext.isLang('es')"></div>
<p class="text-subtitle1">Information sur le traitement des données personnelles conformément à l'article 13 du <div v-else></div>
Code civil italien Règlement (UE) n° 2003 n.196.</p>
<p>En vertu de l'article 13 du règlement (UE) n° 2003 n.196, également appelé protection générale des données
Règlement
(ci-après le "GDPR"), {{SiteName}}} Nous vous informons que vos données personnelles (ci-après dénommées les
"Données"),
sera traitée conformément aux dispositions du GDPR et de toute législation applicable en matière de
au traitement des données à caractère personnel conformément aux informations ci-dessous.</p>
<p><span class="text-subtitle2">1. Contrôleur de données</span><br/>
{{ownerDataName}}</p>
<p><span class="boldhigh">Responsable du traitement et de la protection des données:</span><br/>
{{managerData}}
</p>
<p class="text-subtitle2">2. Catégories de données</p>
<p>Les données traitées par le contrôleur des données comprennent: {{includeData}}.</p>.
<p class="text-subtitle2">3. Objectif et base juridique du traitement. Intérêt légitime.</p>
<p>Les données seront traitées à des fins informatives, commerciales et administratives pour
obligations légales en vertu de l'article 6, paragraphe 1, points b) et c) du GDPR, ainsi que la poursuite de la
l'intérêt du titulaire, à l'article 6, paragraphe 1, lettre f du GDPR, en référence à
le respect des procédures administratives internes et l'exécution des obligations légales ou des réglementations
en vigueur dans {{ country }}
l'envoi de communications à caractère informatif, commercial et promotionnel.</p>
<p> En tout état de cause, le traitement de vos données effectué sur la base de votre intérêt légitime à
En plus des dispositions de l'article 6, paragraphe 1, lettre f du GDPR, le propriétaire est également en
conformité aux dispositions du considérant 47 et de l'avis n° 6/2014 Article 29 Protection des données
Parti, par. III.3.1.</p>
<p class="text-subtitle2">4. Modalités de traitement.</p>
<p>Vos données sont collectées et enregistrées de manière légale et correcte pour les objectifs ci-dessus
indiquées et sont également traitées à l'aide d'outils électroniques et automatisés, notamment par l'insertion
et la
l'organisation en bases de données, conformément aux dispositions du GDPR sur les mesures de
et, en tout état de cause, de manière à garantir la sécurité et la confidentialité des données elles-mêmes.</p>
<p class="text-subtitle2">5. Bénéficiaires ou catégories de bénéficiaires.</p>
<p>Les données peuvent être rendues accessibles, portées à la connaissance ou communiquées aux sujets suivants
qui sera nommé par le propriétaire, selon le cas, comme responsable - dont la liste est disponible
au siège social du propriétaire - ou des personnes responsables :
les employés et/ou collaborateurs à quelque titre que ce soit du propriétaire ;
des sujets publics ou privés, personnes physiques ou morales, dont le titulaire se prévaut de la
l'exercice des activités qui contribuent à la réalisation de l'objectif susmentionné ou auxquelles le
propriétaire est tenu
communiquer les données en vertu d'obligations légales ou contractuelles.</p>
<p> En tout état de cause, les données ne seront pas diffusées.</p>
<p class="text-subtitle2">6. Lieu</p>
<p>Les données sont traitées dans les bureaux du propriétaire et dans tout autre lieu les parties
impliqués dans le traitement sont localisés. Pour de plus amples informations, veuillez contacter le responsable
du traitement aux coordonnées indiquées dans
ouverture.</p>
<p class="text-subtitle2">7. Période de conservation.</p>
<p>Les données seront conservées pendant une période n'excédant pas 10 (dix) ans aux fins suivantes
administratif et, en tout état de cause, pendant le temps strictement nécessaire à la poursuite de l'intérêt
légitime de la Propriétaire.</p>
<p class="text-subtitle2">8. Droits d'accès, suppression, restriction et portabilité.</p>
<p>Le propriétaire vous informe que vous bénéficiez des droits énoncés aux articles 15 à 20 du GDPR. Par le biais de
Par exemple, en envoyant une demande spécifique à l'adresse électronique {{owneremail}}, vous pouvez :
obtenir la confirmation que des données à caractère personnel vous concernant sont traitées ou non ;
si un traitement est en cours, obtenir l'accès aux données et informations relatives à la
traitement et demander une copie des données ;
obtenir la rectification des données inexactes et l'intégration des données personnelles incomplètes ;
pour obtenir, si l'une des conditions prévues à l'article 17 du RDPI est remplie, l'annulation de la
Données vous concernant ; pour obtenir, dans les cas prévus par l'art. 18 du GDPR, la limitation du traitement de vos données personnelles.
Les données que La
à l'égard ; recevoir les données vous concernant dans un format structuré, d'usage courant et lisible par
dispositif
automatique et demander leur transmission à un autre propriétaire, si cela est techniquement possible.</p>
<p class="text-subtitle2">9. Droit d'opposition.</p>
<p> Conformément à l'article 21 du GDPR, vous avez également le droit de vous opposer à tout moment à la
le traitement de ses propres données effectué dans la poursuite de l'intérêt légitime du responsable du traitement, en écrivant
à l'adresse électronique
{{owneremail}} En cas d'opposition, les données ne seront plus traitées, à condition que vous ne
il existe des motifs légitimes de traitement, qui l'emportent sur les intérêts, les droits et les intérêts de la personne concernée.
la liberté des personnes concernées, ou pour l'établissement, l'exercice ou la défense d'un droit au siège
judiciaire.</p>
<p class="text-subtitle2">Agent de protection des données</p>.
<p>Le responsable du traitement des données a désigné un délégué à la protection des données qui peut être contacté au
boîte aux lettres suivante {{owneremail}}.</p>
<p class="text-subtitle2">10. Droit de déposer une plainte auprès du garant.</p>
<p>Le propriétaire vous informe également que vous pouvez déposer une plainte auprès du Garant pour la protection des données à caractère personnel dans le
si elle considère que ses droits en vertu de la GDPR ou de toute autre loi ont été violés
la législation applicable, selon les modalités indiquées sur le site web du contrôleur de la protection des données
Personnel accessible à l'adresse : <a href="http://www.garanteprivacy.it" target="_blank">www.garanteprivacy.it</a>.
</p>
<p>Dernière mise à jour : {{lastdataupdate}}</p>
</div>
<div v-else-if="toolsext.isLang('es')">
<p class="text-subtitle1">Política de privacidad de {{url}}</p>
<p class="text-subtitle1">Información sobre el procesamiento de datos personales de conformidad con el art.
13 del Reglamento (UE) n. 2003 n.196</p>
<p>Según el art. 13 del Reglamento (UE) n. 2003 n.196, también llamado Reglamento general de protección de
datos (de seguido del "RGPD"), {{SiteName}} le informa que sus datos personales (en adelante, los
"Datos"), será tratado de conformidad con las disposiciones del GDPR y cualquier legislación
aplicable con referencia a procesamiento de datos personales de acuerdo con la siguiente
información.</p>
<p><span class="text-subtitle2">1. Controlador de datos</span><br/>
{{ownerDataName}}</p>
<p><span class="boldhigh">Gerente de procesamiento y protección de datos:</span><br/>
{{managerData}}
</p>
<p>El administrador de protección de datos puede ser contactado por correo electrónico:
{{owneremail}} para obtener información sobre el procesamiento de los datos comunicados o recopilados en
el transcurso de
navegación en este sitio, de conformidad con la legislación vigente sobre privacidad.</p>
<p class="text-subtitle2"> 2. Categorías de datos </p>
<p>Los datos procesados por el propietario incluyen: {{includeData}}. </p>
<p class="text-subtitle2"> 3. Finalidad y fundamento jurídico del procesamiento. Interés legítimo. </p>
            <p>Los datos serán procesados para el cumplimiento de fines informativos, comerciales y
administrativos.
obligaciones de ley, de conformidad con el art. 6, párrafo 1, letra b) yc) del GDPR, así
como la búsqueda de lo legítimo interés
del titular, en el art. 6, párrafo 1, letra f del RGPD, con referencia a:
cumplimiento de procedimientos administrativos internos y cumplimiento de obligaciones
legales o regulaciones vigentes en
{{country}};
envío de información, comunicaciones comerciales y promocionales. </p>
            <p>En cualquier caso, el procesamiento de sus datos se basa en su interés legítimo
titular se produce, así como en cumplimiento de lo dispuesto en el art. 6, párrafo 1, letra
f del
RGPD, también en conformidad a lo dispuesto en el considerando n. 47 y la opinión n. 6/2014 Artículo 29
Protección de
datos de trabajo partido, par. III.3.1. </p>
            <p class="text-subtitle2"> 4. Métodos de procesamiento. </p>
            <p>Sus datos se recopilan y registran de manera legal y correcta para los fines anteriores
indicado y También se procesan con la ayuda de herramientas electrónicas y automatizadas,
también a través de la inserción y la organización en bases de datos, de conformidad con las disposiciones
del GDPR
sobre medidas de seguridad y, sin embargo, de tal manera que garantice la seguridad y confidencialidad de
los
Datos. </p>
            <p class="text-subtitle2"> 5. Destinatarios o categorías de destinatarios. </p>
            <p>Los datos se pueden hacer accesibles, señalar o comunicar a los siguientes sujetos, i
que
serán designados por el controlador de datos, según sea el caso, como controladores de
datos, cuya lista está disponible
en el
sede del propietario - o personas a cargo:
empleados y / o colaboradores en cualquier capacidad del controlador de datos;
sujetos públicos o privados, personas físicas o jurídicas, para las cuales el controlador de datos hace uso de
progreso de actividades instrumentales para el logro de los propósitos antes mencionados o para las cuales se
requiere el controlador de datos para comunicar los datos en virtud de obligaciones legales o contractuales. </p>
            <p>En cualquier caso, los datos no serán revelados. </p>
            <p class="text-subtitle2"> 6. Localización </p>
            <p>Los datos se procesan en las oficinas operativas del controlador de datos y en cualquier otro lugar
donde las partes involucrado en
Los tratamientos son localizados. Para obtener más información, póngase en contacto con el propietario en los
detalles anteriores. en apertura. </p>
            <p class="text-subtitle2"> 7. Período de retención. </p>
            <p>Los Datos se conservarán por un período de tiempo que no exceda los 10 (diez) años para fines
administrativo y, sin embargo, por el tiempo estrictamente necesario para perseguir el interés legítimo del
Propietario. </p>
            <p class="text-subtitle2"> 8. Derechos de acceso, cancelación, limitación y portabilidad. </p>
            <p>El propietario le informa que tiene derecho a los derechos establecidos en los artículos del
15 al 20 del GDPR. En nombre de
Por ejemplo, al enviar una solicitud específica a la dirección de correo electrónico
{{owneremail}}, puede:
obtener confirmación de que sus datos personales se están procesando o no;
Si un tratamiento está en curso, obtenga acceso a los datos e información relacionados con
tratamiento así como solicitar una copia de los datos;
obtener la corrección de datos inexactos y la integración de datos personales incompletos;
obtener, si alguna de las condiciones establecidas por el art. 17 del RGPD, la cancelación
de datos que te concierne;
obtener, en los casos previstos por el art. 18 del RGPD, la limitación del procesamiento de
los Datos que te concierne;
recibir los datos que le conciernen en un formato estructurado, comúnmente utilizado y
legible por dispositivo automático
y solicite su transmisión a otro propietario, si es técnicamente posible. </p>
<p class="text-subtitle2"> 9. Oposición a la derecha. </p>
            <p>Según el art. 21 del RGPD, también disfrutará del derecho de objetar en cualquier momento
procesamiento de datos propios llevado a cabo para la búsqueda del interés legítimo del propietario
escribiendo a la dirección
correo electrónico {{owneremail}}. En caso de oposición, los datos ya no se procesarán, a menos que se
Hay razones legítimas para proceder con el procesamiento que prevalecen sobre los intereses, derechos y
sobre las libertades de las partes interesadas, o para la determinación, el ejercicio o la defensa de un
derecho en
sede judicial. </p>
            <p class="text-subtitle2"> Oficial de protección de datos </p>
            <p>El propietario ha designado al responsable de protección de datos con el que puede contactar
siguiente dirección de correo electrónico {{owneremail}}. </p>
            <p class="text-subtitle2"> 10. Derecho a presentar una queja ante el Garante. </p>
            <p>El controlador de datos también le informa que puede presentar una queja ante el garante para
la protección de datos personales en caso de que crea que los derechos que posee bajo el GDPR o de han sido
violados cualquier otra legislación aplicable, de la manera indicada en el sitio web del Garante para
Protección de datos personales accesibles en la dirección: <a
href="https://www.garante.es/politica-de-privacidad/" target="_blank">https://www.garante.es/politica-de-privacidad/</a>.
            </p>
            <p>Última actualización: {{lastdataupdate}} </p>
</div>
<div v-else>
<p class="text-subtitle1">Privacy Policy {{url}}</p>
<p class="text-subtitle1">Information on the processing of personal data in accordance with art. 13 of the
Regulation
(EU) No 2003 n.196</p>
<p>In accordance with art. 13 of Regulation (EU) no. 2003 n.196, also called General Data Protection
Regulation
(hereinafter the "GDPR"), {{SiteName}}} informs you that your personal data (hereinafter the "Data"),
will be treated in compliance with the provisions of the GDPR and any applicable legislation in reference to
to the processing of personal data in accordance with the information below.</p>
<p><span class="text-subtitle2">1. Data Controller</span><br/>
{{ownerDataName}}</p>
<p><span class="boldhigh">Data processing and data protection officer:</span><br/>
{{managerDate}}
</p>
<p class="text-subtitle2">2. Data Categories</p>
<p>Data processed by the Data Controller includes: {{includeData}}.</p>.
<p class="text-subtitle2">3. Purpose and legal basis of the processing. Legitimate interest.</p>
<p>Data will be processed for the fulfilment of informative, commercial and administrative purposes to
legal obligations, pursuant to Article 6, paragraph 1, letters b) and c) of the GDPR, as well as the pursuit of the
legitimate
interest of the Holder, in art. 6, paragraph 1, letter f of the GDPR, with reference to:
compliance with internal administrative procedures and fulfillment of legal obligations or regulations in force in
{{country}}
the sending of communications of an informative, commercial and promotional nature.</p>
<p>In any case, the processing of your Data carried out on the basis of your legitimate interest of
In addition to the provisions of art. 6, paragraph 1, letter f of the GDPR, the Owner is also in
compliance
to the provisions of recital 47 and Opinion No 6/2014 Article 29 Data Protection Working
Party, par. III.3.1.</p>
<p class="text-subtitle2">4. Treatment modalities.</p>
<p>Your Data are collected and recorded in a lawful and correct manner for the above purposes
indicated and are also processed with the aid of electronic and automated tools, including by means of
insertion and
the organisation into databases, in accordance with the provisions of the GDPR on measures of
security, and, in any case, in such a way as to guarantee the security and confidentiality of the Data itself.</p>
<p class="text-subtitle2">5. Recipients or categories of recipients.</p>
<p>Data may be made accessible, brought to the knowledge of or communicated to the following subjects, the
who will be appointed by the Owner, as the case may be, as responsible - whose list is available
at the registered office of the Owner - or persons in charge:
employees and/or collaborators in any capacity of the Owner;
public or private subjects, natural or legal persons, of which the Holder avails himself for the
carrying out the activities instrumental to the achievement of the above mentioned purpose or to which the Owner is
bound to
communicate the Data by virtue of legal or contractual obligations.</p>
<p>In any case, the Data will not be disseminated.</p>
<p class="text-subtitle2">6. Place</p>
<p>Data are processed at the Owner's operating offices and in any other place where the parties
involved in the treatment are localized. For further information, please contact the Data Controller at the following contact details
reported in
opening.</p>
<p class="text-subtitle2">7. Conservation period.</p>
<p>Data will be kept for a period of time not exceeding 10 (ten) years for the following purposes
administrative and, in any case, for the time strictly necessary for the pursuit of the legitimate interest of the
Owner.</p>
<p class="text-subtitle2">8. Access rights, deletion, restriction and portability.</p>
<p>The Owner informs you that you are entitled to the rights set out in articles 15 to 20 of the GDPR. By way of
example, by sending a specific request to the email address {{owneremail}}, you can:
obtain confirmation whether or not personal data concerning you is being processed;
if a processing operation is in progress, obtain access to the data and information relating to the
processing and request a copy of the data;
obtain rectification of inaccurate data and integration of incomplete personal data;
</p>
<p class="text-subtitle2">8. Access rights, deletion, restriction and portability.</p>
<p>The Owner informs you that you are entitled to the rights set out in articles 15 to 20 of the GDPR. By way of
example, by sending a specific request to the email address {{owneremail}}, you can:
obtain confirmation whether or not personal data concerning you is being processed;
if a processing operation is in progress, obtain access to the data and information relating to the
processing and request a copy of the data;
obtain rectification of inaccurate data and integration of incomplete personal data;
to obtain, if one of the conditions provided for in art. 17 of the GDPR is met, the cancellation of the
Data concerning you; to obtain, in the cases provided for by art. 18 of the GDPR, the limitation of the treatment of your personal data.
Data that La
regard; receive the Data concerning you in a structured format, in common use and readable by
device
automatic and request their transmission to another owner, if technically feasible.</p>
<p class="text-subtitle2">9. Right of opposition.</p>
<p>In accordance with Art. 21 of the GDPR, you also have the right to object at any time to the
processing of its own Data carried out for the pursuit of the legitimate interest of the Data Controller by writing
at the email address
{{owneremail}} In case of opposition, the Data will no longer be processed, provided that you do not
there are legitimate grounds for processing, which override the interests, rights and interests of the data subject.
freedom of the persons concerned, or for the establishment, exercise or defence of a right in headquarters
judicial.</p>
<p class="text-subtitle2">Data Protection Officer</p>.
<p>The data controller has appointed a data protection officer who is contactable at the
following mailbox {{owneremail}}.</p>
<p class="text-subtitle2">10. Right to lodge a complaint with the Guarantor.</p>
<p>The Owner also informs you that you can lodge a complaint with the Guarantor for the Protection of Personal Data in the
if it considers that its rights under GDPR or any other law have been infringed
applicable legislation, according to the modalities indicated on the website of the Data Protection Supervisor
Personal accessible at the address: <a href="http://www.garanteprivacy.it" target="_blank">www.garanteprivacy.it</a>.
</p>
<p>Last Update: {{lastdataupdate}}</p>
</div>
</q-page> </q-page>
</template> </template>
<script lang="ts" src="./PagePolicy.ts"> <script lang="ts" src="./PagePolicy.ts">
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import './PagePolicy.scss'; @import './PagePolicy.scss';
</style> </style>

View File

@@ -340,17 +340,8 @@ h3 {
} }
.myimgtitle { .myimgtitle {
margin-left: auto; max-width: 100%;
margin-right: auto; height: auto;
width: 400px;
@media (max-width: 718px) {
margin-left: auto;
margin-right: auto;
width: 300px;
}
} }
.my-card-big { .my-card-big {
@@ -730,16 +721,9 @@ h3 {
} }
.img { .img {
margin-left: auto; max-width: 100%;
margin-right: auto; height: auto;
max-height: 350px;
max-width: 350px;
@media (max-width: 718px) {
max-height: 350px;
max-width: 350px;
}
} }
.imgintro { .imgintro {
@@ -1578,6 +1562,11 @@ h3 {
} }
.selectorwide { .selectorwide {
min-width: 250px; min-width: 240px;
font-size: 1rem; font-size: 1rem;
} }
.fit_img {
max-width: 100%;
height: auto;
}

View File

@@ -35,6 +35,8 @@ export interface INotData {
lastsonline?: IUserFields[] lastsonline?: IUserFields[]
lastssharedlink?: IUserFields[] lastssharedlink?: IUserFields[]
diffusorilist?: IUserFields[] diffusorilist?: IUserFields[]
receiveRislist?: IUserFields[]
receiveRislistgroup?: IMyGroup[]
strettelist?: IUserFields[] strettelist?: IUserFields[]
checkuser?: ICheckUser | any checkuser?: ICheckUser | any
numreg_untilday?: number numreg_untilday?: number
@@ -1065,6 +1067,8 @@ export interface ICircuit {
name: string name: string
path: string path: string
subname: string subname: string
idCity: string[]
strProv: string
longdescr: string longdescr: string
systemUserDescr: string systemUserDescr: string
systemUserId: string systemUserId: string

View File

@@ -42,6 +42,7 @@ export interface IMyGroup {
createdBy?: string createdBy?: string
mycircuits?: IMyCircuit[] mycircuits?: IMyCircuit[]
lastdate_reqRisGroup?: Date
account?: IAccount account?: IAccount
} }
@@ -103,6 +104,8 @@ export interface IUserProfile {
handshake: IFriends[] handshake: IFriends[]
mygroups: IMyGroup[] mygroups: IMyGroup[]
mycircuits: IMyCircuit[] mycircuits: IMyCircuit[]
last_circuitpath?: string
lastdate_reqRis?: Date
manage_mygroups: IMyGroup[] manage_mygroups: IMyGroup[]
notifs: IUserNotifType[] notifs: IUserNotifType[]
notif_idCities: number[] notif_idCities: number[]
@@ -110,6 +113,8 @@ export interface IUserProfile {
notif_regions: string[] notif_regions: string[]
notif_sectors: number[] notif_sectors: number[]
notif_sector_goods: number[] notif_sector_goods: number[]
stepTutorial: number
noNameSurname: boolean
// in memory // in memory
asked_friends: any[] asked_friends: any[]

View File

@@ -33,6 +33,8 @@ const msg_it = {
data_choose: 'Scegli la Data', data_choose: 'Scegli la Data',
}, },
profile: { profile: {
info_msg: 'Puoi compilare facoltativamente questi tuoi dati personali.',
info: 'Informazioni su di te',
chisei: 'Chi Sei? Raccontaci di te:', chisei: 'Chi Sei? Raccontaci di te:',
iltuoimpegno: 'Quale è stato il tuo impegno per salvare il pianeta ad oggi?', iltuoimpegno: 'Quale è stato il tuo impegno per salvare il pianeta ad oggi?',
come_aiutare: 'Cosa vorresti fare per aiutare il pianeta?', come_aiutare: 'Cosa vorresti fare per aiutare il pianeta?',
@@ -186,6 +188,7 @@ const msg_it = {
today: 'Oggi', today: 'Oggi',
book: 'Prenota', book: 'Prenota',
avanti: 'Avanti', avanti: 'Avanti',
vai: 'Vai',
indietro: 'Indietro', indietro: 'Indietro',
finish: 'Fine', finish: 'Fine',
sendmsg: 'Invia Messaggio', sendmsg: 'Invia Messaggio',
@@ -533,9 +536,11 @@ const msg_it = {
username_pseudonimo: 'Username (Pseudonimo)', username_pseudonimo: 'Username (Pseudonimo)',
username_short: 'Username', username_short: 'Username',
name: 'Nome', name: 'Nome',
insert_name: 'Inserisci il tuo Nome (o Soprannome)',
name_opt: 'Nome (Facoltativo)', name_opt: 'Nome (Facoltativo)',
name_opt_collettivo: 'Nome del Collettivo', name_opt_collettivo: 'Nome del Collettivo',
surname: 'Cognome', surname: 'Cognome',
insert_surname: 'Inserisci il Cognome',
surname_opt: 'Cognome (facoltativo)', surname_opt: 'Cognome (facoltativo)',
username_login: 'Username o email', username_login: 'Username o email',
scegli_username: 'Inserisci un nome utente per il tuo Profilo:', scegli_username: 'Inserisci un nome utente per il tuo Profilo:',
@@ -567,6 +572,7 @@ const msg_it = {
residency_address: 'Indirizzo di Residenza', residency_address: 'Indirizzo di Residenza',
residency_city: 'Comune di Residenza', residency_city: 'Comune di Residenza',
residency_province: 'Provincia', residency_province: 'Provincia',
provincia: 'Provincia',
residency_zipcode: 'CAP', residency_zipcode: 'CAP',
residency_country: 'Paese', residency_country: 'Paese',
born_country: 'Paese Nascita', born_country: 'Paese Nascita',
@@ -1179,6 +1185,11 @@ const msg_it = {
preferences: 'Preferenze', preferences: 'Preferenze',
}, },
circuit: { circuit: {
vaialcircuito: 'Vai al Circuito',
iscritti: 'iscritti trovati',
wait_acceptation: ' La tua richiesta è stata inoltrata. Entro breve verrai abilitato. Se non ti sei ancora presentato al gruppo verrai contattato.',
coins_requestedris: 'Il tuo username {username} è ora in cima alla lista dei riceventi. 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', info: 'Informazioni su questo Circuito',
name: 'Nome Circuito', name: 'Nome Circuito',
path: 'Nome Pagina', path: 'Nome Pagina',
@@ -1249,6 +1260,8 @@ const msg_it = {
domanda_refuse_circuit: 'Rifiutare la richiesta di {username} per entrare nel Circuito {circuitname}?', domanda_refuse_circuit: 'Rifiutare la richiesta di {username} per entrare nel Circuito {circuitname}?',
refusedcircuit: 'Rifiutato a {username} la richiesta di entrare nel Circuito', refusedcircuit: 'Rifiutato a {username} la richiesta di entrare nel Circuito',
sendcoins: 'Invia RIS', sendcoins: 'Invia RIS',
sendcoins_toso: 'Invia RIS a',
receive_coins: 'Ricevi RIS',
sendcoins_tocom: 'Invia a Conto Comunitario', sendcoins_tocom: 'Invia a Conto Comunitario',
sendcoinsto: 'Invia {qty} {coin} a {dest}', sendcoinsto: 'Invia {qty} {coin} a {dest}',
question_sendcoinsto: 'Inviare {qty} {coin} a {dest}?', question_sendcoinsto: 'Inviare {qty} {coin} a {dest}?',
@@ -1439,10 +1452,24 @@ const msg_it = {
}, },
tutorial: { tutorial: {
title: 'Completa il tuo Profilo', title: 'Completa i passi',
title_completed: 'Passi Completati',
step: 'passo {step} su {numstep}', step: 'passo {step} su {numstep}',
completed_step: 'Profilo completato al {perc}',
step_residence_title: 'Provincia', step_residence_title: 'Provincia',
step_residence: 'Inserisci la Provincia in cui vivi abitualmente, questo ti permetterà di entrare e scambiare nel circuito del tuo territorio.',
step_nomecognome_title: 'Nome',
step_nomecognome: 'Per farti trovare dai tuoi amici puoi inserire <strong>FACOLTATIVAMENTE</strong>, anche un Nome o Soprannome.<br>Per chi lo ritenesse necessario, anche il cognome.<br>Oppure clicca su <strong>Avanti</strong> per continuare.',
step_circuito_title: 'Circuito RIS',
step_circuito: 'Entra nel Circuito del tuo territorio. Potrai così utilizzare il tuo conto personale in RIS, per scambiare Beni, Servizi, ecc.',
step_circuito_ok: 'Ottimo! Sei entrato nel Circuito del tuo territorio. Puoi così utilizzare il tuo conto personale in RIS, per scambiare Beni, Servizi, ecc.',
step_beniservizi_title: 'I Tuoi Annunci',
step_beniservizi: 'Per poter usufruire dei Beni, Servizi ed Ospitalità, è necessario che ogni partecipante si rende disponibile per offrire almeno una di queste cose, aggiungendole alla App.',
step_foto_title: 'Foto Profilo',
step_foto: 'Se vuoi puoi inserire una foto o un\'immagine che ti rappresenta.',
step_altri_in_profilo: 'Per vedere e modificare tutte le altre informazioni di Profilo:',
step_fine_title: 'Fine',
step_fine: 'Hai completato l\'aggiornamento del tuo Profilo. Ricorda che potrai modificarlo, cliccando sulla prima icona in alto a destra 🙎🏻‍♂️ .',
}, },
}, },

View File

@@ -73,6 +73,10 @@ export const useCircuitStore = defineStore('CircuitStore', {
return this.listcircuits.find((rec: ICircuit) => rec.name === circuitname) return this.listcircuits.find((rec: ICircuit) => rec.name === circuitname)
}, },
getCircuitByProvince(prov: string): ICircuit | undefined | null {
return this.listcircuits.find((rec: ICircuit) => rec.strProv === prov)
},
getCircuitByCircuitId(circuitId: string): ICircuit | null | undefined { getCircuitByCircuitId(circuitId: string): ICircuit | null | undefined {
return this.listcircuits.find((rec: ICircuit) => rec._id === circuitId) return this.listcircuits.find((rec: ICircuit) => rec._id === circuitId)
}, },
@@ -138,5 +142,9 @@ export const useCircuitStore = defineStore('CircuitStore', {
return arr return arr
}, },
getSortFieldsAvailable(): any[] {
return [{ label: 'Nome', value: 'name' }, { label: 'Iscritti', value: 'numMembers' }]
},
}, },
}) })

View File

@@ -227,7 +227,7 @@ export const costanti = {
{ {
visible: true, visible: true,
title: 'Assistenza', title: 'Assistenza',
to: '/faq', to: '/istruzioni',
icon: 'fas fa-question', icon: 'fas fa-question',
color: 'yellow', color: 'yellow',
hint: '', hint: '',
@@ -291,6 +291,7 @@ export const costanti = {
USER_CIRCUITS: 60, USER_CIRCUITS: 60,
REQ_CIRCUIT: 65, REQ_CIRCUIT: 65,
ENTER_TO_THE_CIRCUIT: 70,
CMD_DELETE: 1, CMD_DELETE: 1,
CMD_MODIFY: 2, CMD_MODIFY: 2,

View File

@@ -749,7 +749,7 @@ export const colmyUserGroup = [
name: 'groupname', label_trans: 'reg.groupname', required: false, name: 'groupname', label_trans: 'reg.groupname', required: false,
maxlength: 30, maxlength: 30,
allowchar: costanti.ALLOWCHAR_CODE, allowchar: costanti.ALLOWCHAR_CODE,
showWhen: costanti.showWhen.InPage + costanti.showWhen.InEdit showWhen: costanti.showWhen.InPage + costanti.showWhen.NewRec
}), }),
AddCol({ AddCol({
name: 'idCity', name: 'idCity',
@@ -2808,6 +2808,20 @@ export const colTableCircuitComplete = [
remote_field: 'comune', remote_field: 'comune',
required: true, required: true,
}), }),
AddCol({
name: 'strProv',
label_trans: 'reg.provincia',
fieldtype: costanti.FieldType.select,
jointable: 'provinces',
tablesel: 'provinces',
noshowlabel: true,
icon: 'fas fa-map-marker-alt',
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
required: true,
}),
// AddCol({ name: 'strProv', label_trans: 'reg.provincia', fieldtype: costanti.FieldType.string,
// showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
// }),
AddCol({ AddCol({
name: 'visibility', name: 'visibility',
label_trans: 'bot.visibility', label_trans: 'bot.visibility',
@@ -2880,7 +2894,7 @@ export const colTableCircuitComplete = [
] ]
export const colTableCircuit = [ export const colTableCircuit = [
AddCol({ name: '_id', label_trans: 'circuit.Id' }), // da togliere poi // AddCol({ name: '_id', label_trans: 'circuit.Id' }), // da togliere poi
AddCol({ AddCol({
name: 'name', label_trans: 'circuit.name', name: 'name', label_trans: 'circuit.name',
required: true, required: true,
@@ -2909,6 +2923,17 @@ export const colTableCircuit = [
remote_field: 'comune', remote_field: 'comune',
required: true, required: true,
}), }),
AddCol({
name: 'strProv',
label_trans: 'reg.provincia',
fieldtype: costanti.FieldType.select,
jointable: 'provinces',
tablesel: 'provinces',
noshowlabel: true,
icon: 'fas fa-map-marker-alt',
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
required: true,
}),
AddCol({ AddCol({
name: 'visibility', name: 'visibility',
label_trans: 'bot.visibility', label_trans: 'bot.visibility',

View File

@@ -23,7 +23,7 @@ import { lists } from '@store/Modules/lists'
import { costanti } from '@store/Modules/costanti' import { costanti } from '@store/Modules/costanti'
import { copyToClipboard, date, Screen, useQuasar, colors, Cookies, scroll } from 'quasar' import { copyToClipboard, date, Screen, useQuasar, colors, Cookies, scroll } from 'quasar'
const { getScrollTarget, setScrollPosition } = scroll const { getScrollTarget, setVerticalScrollPosition } = scroll
import { func_tools, toolsext } from '@store/Modules/toolsext' import { func_tools, toolsext } from '@store/Modules/toolsext'
import { preloadedimages, static_data } from '@src/db/static_data' import { preloadedimages, static_data } from '@src/db/static_data'
import { useGlobalStore } from '@store/globalStore' import { useGlobalStore } from '@store/globalStore'
@@ -2672,8 +2672,8 @@ export const tools = {
}) })
}, },
showPositiveNotif(q: any, msg: string) { showPositiveNotif(q: any, msg: string, time?: number) {
this.showNotif(q, msg, { color: 'positive', icon: 'notifications' }) this.showNotif(q, msg, { color: 'positive', icon: 'notifications' }, time)
}, },
showNegativeNotif(q: any, msg: string, time = 5000) { showNegativeNotif(q: any, msg: string, time = 5000) {
@@ -4180,6 +4180,9 @@ export const tools = {
return Cookies.remove(mytok) return Cookies.remove(mytok)
}, },
scrollToTopAll() {
window.scrollTo(0,0);
},
scrollToTop() { scrollToTop() {
const element = document.getElementById('mypage') const element = document.getElementById('mypage')
this.scrollToElement(element) this.scrollToElement(element)
@@ -4194,7 +4197,7 @@ export const tools = {
const offset = el.offsetTop const offset = el.offsetTop
const duration = 500 const duration = 500
console.log('target', target, 'offset', offset, 'duration', duration) console.log('target', target, 'offset', offset, 'duration', duration)
setScrollPosition(target, offset, duration) setVerticalScrollPosition(target, offset, duration)
} }
}, },
@@ -7693,6 +7696,56 @@ export const tools = {
return user.name ? user.name + ' ' + (user.surname ? user.surname : '') : user.username return user.name ? user.name + ' ' + (user.surname ? user.surname : '') : user.username
}, },
getNomeUtenteEUsernameByRecUser(user: IUserFields) {
if (user.name)
return user.name + ' ' + user.surname + ' (' + user.username + ')'
else
return user.username
},
updateLink(link: string) {
const userStore = useUserStore()
if (link === '/circuits') {
let path = userStore.my.profile.last_circuitpath
if (path) {
return '/circuit/' + path
}
return link
}
return link
},
async receiveRis($q: any, t: any) {
const userStore = useUserStore()
let username = userStore.my.username
await userStore.setUserReceiveRIS(username, '').then((data) => {
if (data.code === serv_constants.RIS_CODE_OK) {
this.showPositiveNotif($q, t('circuit.coins_requestedris', {username}), 6000)
} else {
this.showNegativeNotif($q, t('db.recfailed'))
}
})
},
async receiveRisGroup(groupname: string, $q: any, t: any) {
const userStore = useUserStore()
await userStore.setUserReceiveRIS('', groupname).then((data) => {
if (data.code === serv_constants.RIS_CODE_OK) {
this.showPositiveNotif($q, t('circuit.coins_requestedris', {groupname}), 6000)
} else {
this.showNegativeNotif($q, t('db.recfailed'))
}
})
},
// FINE ! // FINE !
// getLocale() { // getLocale() {

View File

@@ -69,6 +69,8 @@ export const DefaultUser: IUserFields = {
handshake: [], handshake: [],
mygroups: [], mygroups: [],
mycircuits: [], mycircuits: [],
last_circuitpath: '',
lastdate_reqRis: tools.getLastDateReadReset(),
manage_mygroups: [], manage_mygroups: [],
asked_friends: [], asked_friends: [],
asked_groups: [], asked_groups: [],
@@ -79,6 +81,8 @@ export const DefaultUser: IUserFields = {
notif_regions: [], notif_regions: [],
notif_sectors: [], notif_sectors: [],
notif_sector_goods: [], notif_sector_goods: [],
stepTutorial: 0,
noNameSurname: false,
asked_circuits: [], asked_circuits: [],
refused_circuits: [], refused_circuits: [],
manage_mycircuits: [], manage_mycircuits: [],
@@ -128,6 +132,7 @@ export const DefaultProfile: IUserProfile = {
handshake: [], handshake: [],
mygroups: [], mygroups: [],
mycircuits: [], mycircuits: [],
last_circuitpath: '',
manage_mygroups: [], manage_mygroups: [],
asked_friends: [], asked_friends: [],
asked_groups: [], asked_groups: [],
@@ -138,7 +143,8 @@ export const DefaultProfile: IUserProfile = {
notif_regions: [], notif_regions: [],
notif_sectors: [], notif_sectors: [],
notif_sector_goods: [], notif_sector_goods: [],
stepTutorial: 0,
noNameSurname: false,
asked_circuits: [], asked_circuits: [],
refused_circuits: [], refused_circuits: [],
manage_mycircuits: [], manage_mycircuits: [],
@@ -218,6 +224,15 @@ export const useUserStore = defineStore('UserStore', {
}, },
actions: { actions: {
getMypaginationMembers(): any {
return { sortBy: 'name,username', descending: '1,1', page: 1, rowsNumber: 0, rowsPerPage: 10 }
},
getSortFieldsAvailable(): any[] {
return [{ label: 'Username', value: 'username,name' }, { label: 'Nome', value: 'name,username' }, { label: 'Ultimi reg.', value: 'date_reg,username' }]
},
IsMyFriendByUsername(username: string): boolean { IsMyFriendByUsername(username: string): boolean {
if (this.my.profile.friends) if (this.my.profile.friends)
return this.my.profile.friends.findIndex((rec) => rec.username === username) >= 0 return this.my.profile.friends.findIndex((rec) => rec.username === username) >= 0
@@ -416,6 +431,7 @@ export const useUserStore = defineStore('UserStore', {
}, },
IsMyCircuitByName(circuitname: string): boolean { IsMyCircuitByName(circuitname: string): boolean {
if (this.my.profile.mycircuits) if (this.my.profile.mycircuits)
@@ -483,7 +499,7 @@ export const useUserStore = defineStore('UserStore', {
if (acc.circuit) { if (acc.circuit) {
chi += ' (' + circuitStore.getNameByCircuitId(acc.circuitId) + ')' chi += ' (' + circuitStore.getNameByCircuitId(acc.circuitId) + ')'
} }
arr.push({label: chi, value: acc._id}) arr.push({ label: chi, value: acc._id })
} }
} }
return arr return arr
@@ -823,6 +839,27 @@ export const useUserStore = defineStore('UserStore', {
}) })
}, },
async saveStepTutorial(step: number) {
const mydata = {
_id: this.my._id,
dbop: 'saveStepTut',
value: step,
}
this.my.profile.stepTutorial = step
return await this.execDbOp({mydata})
},
async savenoNameSurname(val: boolean) {
const mydata = {
_id: this.my._id,
dbop: 'noNameSurname',
value: val,
}
if (this.my.profile.noNameSurname !== val) {
this.my.profile.noNameSurname = val
return await this.execDbOp({mydata})
}
},
async newsletterload(paramquery: any) { async newsletterload(paramquery: any) {
return Api.SendReq('/news/load', 'POST', paramquery) return Api.SendReq('/news/load', 'POST', paramquery)
@@ -1323,6 +1360,22 @@ export const useUserStore = defineStore('UserStore', {
}, },
async setUserReceiveRIS(username: string, groupname: string) {
const data = {
username,
groupname,
}
return Api.SendReq('/users/receiveris', 'POST', data)
.then((ris) => {
console.log('out:', ris)
return ris.data
}).catch((error) => {
return {}
})
},
async loadGroup(groupname: string, idnotif: string) { async loadGroup(groupname: string, idnotif: string) {
const data = { const data = {
groupname, groupname,
@@ -1348,6 +1401,7 @@ export const useUserStore = defineStore('UserStore', {
return Api.SendReq('/circuit/load', 'POST', data) return Api.SendReq('/circuit/load', 'POST', data)
.then((res) => { .then((res) => {
this.my.profile.last_circuitpath = path
if (res && res.data.arrrecnotif) { if (res && res.data.arrrecnotif) {
notifStore.updateArrRecNotifFromServer(res.data.arrrecnotif) notifStore.updateArrRecNotifFromServer(res.data.arrrecnotif)
} }

View File

@@ -1688,7 +1688,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
return Api.SendReq('/site/load', 'POST', paramquery) return Api.SendReq('/site/load', 'POST', paramquery)
.then((res) => { .then((res) => {
// console.log('datastat', res) console.log('datastat', res)
this.datastat = res.data.datastat this.datastat = res.data.datastat
return this.datastat return this.datastat
}).catch((error) => { }).catch((error) => {

View File

@@ -397,6 +397,11 @@
</div> </div>
</template> </template>
</q-field> </q-field>
<q-btn
label="Set strProv by IdCity (table circuits)"
color="negative"
@click="EseguiFunz('setstrProvByIdCityCircuits')"
></q-btn>
</div> </div>
</template> </template>
<script lang="ts" src="./dbop.ts"> <script lang="ts" src="./dbop.ts">

View File

@@ -9,6 +9,26 @@
:canopen="true" :canopen="true"
> >
<div class="column"> <div class="column">
<div class="">
<CMyFieldDb
:title="$t('reg.username')"
table="users"
mykey="username"
:disable="true"
:readonly="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
<CMyFieldDb
:title="$t('reg.email')"
table="users"
mykey="email"
:disable="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
</div>
<div> {{ $t('profile.info_msg') }} </div>
<div class="myrow"> <div class="myrow">
<div v-if="site.confpages.showNameSurname"> <div v-if="site.confpages.showNameSurname">
<CMyFieldDb <CMyFieldDb
@@ -28,15 +48,6 @@
</div> </div>
</div> </div>
<div class="myrow"> <div class="myrow">
<CMyFieldDb
:title="$t('reg.username')"
table="users"
mykey="username"
:disable="true"
:readonly="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
<CMyFieldDb <CMyFieldDb
:title="$t('reg.username_telegram')" :title="$t('reg.username_telegram')"
table="users" table="users"
@@ -47,14 +58,6 @@
</CMyFieldDb> </CMyFieldDb>
</div> </div>
<div class="myrow"> <div class="myrow">
<CMyFieldDb
:title="$t('reg.email')"
table="users"
mykey="email"
:disable="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb>
<CMyFieldDb <CMyFieldDb
:title="$t('reg.website')" :title="$t('reg.website')"
table="users" table="users"
@@ -81,10 +84,9 @@
</div> </div>
</CTitleBanner> </CTitleBanner>
<CTitleBanner <CTitleBanner
class="q-pa-xs" class="q-pa-xs"
title="Informazioni su di te" :title="$t('profile.info')"
bgcolor="bg-primary" bgcolor="bg-primary"
clcolor="text-white" clcolor="text-white"
myclass="myshad" myclass="myshad"
@@ -153,19 +155,6 @@
/> />
--> -->
<CMyFieldRec
:title="$t('reg.born_city')"
table="users"
tablesel="cities"
:id="myuser._id"
:rec="myuser"
field="profile.born_city_id"
:sameclassasfielddb="true"
:canEdit="true"
:canModify="true"
>
</CMyFieldRec>
<CMyFieldDb <CMyFieldDb
:title="$t('reg.dateofbirth')" :title="$t('reg.dateofbirth')"
table="users" table="users"

View File

@@ -84,7 +84,6 @@ export default defineComponent({
const filtercustom_rich: any = ref([]) const filtercustom_rich: any = ref([])
const searchList = ref([] as ISearchList[]) const searchList = ref([] as ISearchList[])
const cities = ref([] as ICity[]) const cities = ref([] as ICity[])
watch(() => path.value, (to: any, from: any) => { watch(() => path.value, (to: any, from: any) => {
@@ -164,6 +163,7 @@ export default defineComponent({
username: 1, username: 1,
name: 1, name: 1,
surname: 1, surname: 1,
date_reg: 1,
profile: 1, idapp: 1, 'circuit.name': 1, 'circuit._id': 1 profile: 1, idapp: 1, 'circuit.name': 1, 'circuit._id': 1
} }
@@ -290,6 +290,7 @@ export default defineComponent({
async function mounted() { async function mounted() {
tabcircuit.value = tools.getCookie(tools.COOK_TAB_CIRCUIT + path.value, 'info') tabcircuit.value = tools.getCookie(tools.COOK_TAB_CIRCUIT + path.value, 'info')
await loadCircuit() await loadCircuit()
} }

View File

@@ -23,6 +23,14 @@
<CCheckIfIsLogged></CCheckIfIsLogged> <CCheckIfIsLogged></CCheckIfIsLogged>
</div> </div>
<div v-if="circuit"> <div v-if="circuit">
<div style="align-self: center; vertical-align: middle">
<q-btn
label="Lista Circuiti"
to="/circuits"
rounded
icon="fas fa-arrow-circle-left"
/>
</div>
<div <div
v-if="circuit.name" v-if="circuit.name"
class="fit column no-wrap justify-evenly items-center content-start" class="fit column no-wrap justify-evenly items-center content-start"
@@ -66,7 +74,7 @@
<br /> <br />
<div> <div class="row text-center">
<q-banner <q-banner
v-if=" v-if="
userStore.my.profile && userStore.my.profile &&
@@ -74,15 +82,11 @@
userStore.IsMyCircuitByName(circuit.name) userStore.IsMyCircuitByName(circuit.name)
" "
rounded rounded
class="bg-orange text-white" class="bg-deep-purple text-white"
style="text-align: center" style="text-align: center"
> >
<template v-slot:avatar> <template v-slot:avatar>
<q-icon <q-icon name="fas fa-info" color="red" size="sm" />
name="fas fa-info"
color="red"
size="sm"
/>
</template> </template>
<em style="font-weight: bold">{{ <em style="font-weight: bold">{{
@@ -93,7 +97,7 @@
<q-banner <q-banner
v-else-if="userStore.my.profile.calc.numGoodsAndServices <= 0" v-else-if="userStore.my.profile.calc.numGoodsAndServices <= 0"
rounded rounded
class="bg-orange text-white" class="bg-deep-purple text-white"
style="text-align: center" style="text-align: center"
> >
<template v-slot:avatar> <template v-slot:avatar>
@@ -111,92 +115,99 @@
><br /> ><br />
</q-banner> </q-banner>
<q-btn <div class="centermydiv q-mt-md">
v-if=" <q-btn
!userStore.IsMyCircuitByName(circuit.name) && v-if="
!userStore.IsAskedCircuitByName(circuit.name) && !userStore.IsMyCircuitByName(circuit.name) &&
!userStore.IsRefusedCircuitByName(circuit.name) !userStore.IsAskedCircuitByName(circuit.name) &&
" !userStore.IsRefusedCircuitByName(circuit.name)
icon="fas fa-user-plus" "
color="primary" icon="fas fa-user-plus"
:label="$t('circuit.ask')" color="primary"
@click=" :label="$t('circuit.ask')"
requestToEnterCircuit = true; @click="
groupnameSel = null; requestToEnterCircuit = true;
" groupnameSel = null;
/> "
<q-btn />
v-if="userStore.IsMyCircuitByName(circuit.name)" <q-btn
rounded v-if="userStore.IsMyCircuitByName(circuit.name)"
icon="fas fa-ellipsis-h" rounded
> icon="fas fa-ellipsis-h"
<q-menu> >
<q-list v-if="true" style="min-width: 150px"> <q-menu>
<q-item <q-list v-if="true" style="min-width: 150px">
clickable
v-close-popup
v-if="saldo === 0"
@click="
tools.removeFromMyCircuits(
$q,
userStore.my.username,
circuit.name,
'',
$t('circuit.domanda_exit_fromcircuit', {
circuitname: circuit.name,
})
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<q-item-section>{{
$t('circuit.exit_circuit')
}}</q-item-section>
</q-item>
<q-list
v-if="tools.iAmAdminCircuit(circuit.name)"
style="min-width: 200px"
>
<q-item <q-item
clickable clickable
v-close-popup v-close-popup
v-if="saldo === 0"
@click=" @click="
tools.setCmd( tools.removeFromMyCircuits(
$q, $q,
shared_consts.CIRCUITCMD.DELETE,
userStore.my.username, userStore.my.username,
circuit.name,
'', '',
circuit.name $t('circuit.domanda_exit_fromcircuit', {
circuitname: circuit.name,
})
) )
" "
> >
<q-item-section avatar> <q-item-section avatar>
<q-icon color="negative" name="fas fa-trash-alt" /> <q-icon color="negative" name="fas fa-user-minus" />
</q-item-section> </q-item-section>
<q-item-section>{{ <q-item-section>{{
$t('circuit.delete') $t('circuit.exit_circuit')
}}</q-item-section> }}</q-item-section>
</q-item> </q-item>
</q-list>
</q-list>
</q-menu>
</q-btn>
<q-btn <q-list
v-if=" v-if="tools.iAmAdminCircuit(circuit.name)"
userStore.IsAskedCircuitByName(circuit.name) && style="min-width: 200px"
!userStore.IsMyCircuitByName(circuit.name) >
" <q-item
icon="fas fa-user-minus" clickable
flat v-close-popup
:label="$t('shared.cancel_ask_short')" @click="
@click=" tools.setCmd(
tools.cancelReqCircuit($q, userStore.my.username, circuit.name) $q,
" shared_consts.CIRCUITCMD.DELETE,
/> userStore.my.username,
'',
circuit.name
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-trash-alt" />
</q-item-section>
<q-item-section>{{
$t('circuit.delete')
}}</q-item-section>
</q-item>
</q-list>
</q-list>
</q-menu>
</q-btn>
<q-btn
v-if="
userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsMyCircuitByName(circuit.name)
"
icon="fas fa-user-minus"
flat
outline
:label="$t('shared.cancel_ask_short')"
@click="
tools.cancelReqCircuit(
$q,
userStore.my.username,
circuit.name
)
"
/>
</div>
</div> </div>
</div> </div>
<div <div
@@ -262,6 +273,7 @@
label="Rifiutati" label="Rifiutati"
name="refused" name="refused"
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
></q-tab> ></q-tab>
</q-tabs> </q-tabs>
@@ -320,6 +332,7 @@
" "
icon="fas fa-user-minus" icon="fas fa-user-minus"
flat flat
outline
:label="$t('shared.cancel_ask_short')" :label="$t('shared.cancel_ask_short')"
@click=" @click="
tools.cancelReqCircuit( tools.cancelReqCircuit(
@@ -371,7 +384,7 @@
:prop_search="true" :prop_search="true"
hint="gruppo da trovare" hint="gruppo da trovare"
:finder="false" :finder="false"
:choose_visutype="true" :choose_visutype="false"
:finder_noNull="false" :finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS" :options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false" :butt_modif_new="false"
@@ -388,7 +401,7 @@
:visufind=" :visufind="
tools.iAmAdminCircuit(circuit.name) tools.iAmAdminCircuit(circuit.name)
? costanti.REQ_ADD_USER_TO_CIRCUIT ? costanti.REQ_ADD_USER_TO_CIRCUIT
: costanti.FIND_PEOPLE : costanti.FIND_GROUP
" "
> >
</CGridTableRec> </CGridTableRec>
@@ -404,7 +417,7 @@
:vertical="costanti.VISUTABLE_GROUP_CIRCUIT" :vertical="costanti.VISUTABLE_GROUP_CIRCUIT"
nodataLabel="Nessuna Richiesta Collettiva in sospeso" nodataLabel="Nessuna Richiesta Collettiva in sospeso"
:prop_search="false" :prop_search="false"
hint="Username da trovare" hint="Username o nome da trovare"
:finder="false" :finder="false"
:choose_visutype="false" :choose_visutype="false"
:finder_noNull="false" :finder_noNull="false"
@@ -840,6 +853,7 @@
label="Rifiutati" label="Rifiutati"
name="refused" name="refused"
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
></q-tab> ></q-tab>
</q-tabs> </q-tabs>
@@ -860,9 +874,9 @@
:vertical="costanti.VISUTABLE_LISTA" :vertical="costanti.VISUTABLE_LISTA"
nodataLabel="Nessun Iscritto" nodataLabel="Nessun Iscritto"
:prop_search="true" :prop_search="true"
hint="Username da trovare" hint="Username o nome da trovare"
:finder="false" :finder="false"
:choose_visutype="true" :choose_visutype="false"
:finder_noNull="false" :finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS" :options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false" :butt_modif_new="false"
@@ -873,7 +887,12 @@
:filterextra2="filterextra2" :filterextra2="filterextra2"
:prop_searchList="searchList" :prop_searchList="searchList"
:showType="costanti.SHOW_USERINFO" :showType="costanti.SHOW_USERINFO"
:prop_pagination="userStore.getMypaginationMembers()"
:prop_SortFieldsAvailable="
userStore.getSortFieldsAvailable()
"
:showCol="false" :showCol="false"
:labelElemFind="$t('circuit.iscritti')"
:circuitname="circuit.name" :circuitname="circuit.name"
:extraparams="extraparams()" :extraparams="extraparams()"
:visufind=" :visufind="
@@ -895,7 +914,7 @@
:vertical="costanti.VISUTABLE_USER_TABCIRCUIT" :vertical="costanti.VISUTABLE_USER_TABCIRCUIT"
nodataLabel="Nessuna Richiesta in sospeso" nodataLabel="Nessuna Richiesta in sospeso"
:prop_search="false" :prop_search="false"
hint="Username da trovare" hint="Username o nome da trovare"
:finder="false" :finder="false"
:choose_visutype="false" :choose_visutype="false"
:finder_noNull="false" :finder_noNull="false"
@@ -925,7 +944,7 @@
:vertical="costanti.VISUTABLE_USER_TABCIRCUIT" :vertical="costanti.VISUTABLE_USER_TABCIRCUIT"
nodataLabel="Nessun utente Rifiutato" nodataLabel="Nessun utente Rifiutato"
:prop_search="false" :prop_search="false"
hint="Username da trovare" hint="Username o nome da trovare"
:finder="false" :finder="false"
:choose_visutype="false" :choose_visutype="false"
:finder_noNull="false" :finder_noNull="false"

View File

@@ -28,7 +28,7 @@
:vertical="costanti.VISUTABLE_LISTA" :vertical="costanti.VISUTABLE_LISTA"
nodataLabel=" " nodataLabel=" "
:prop_search="true" :prop_search="true"
hint="Username da trovare" hint="Username o nome da trovare"
:finder="true" :finder="true"
:choose_visutype="true" :choose_visutype="true"
:finder_noNull="true" :finder_noNull="true"

View File

@@ -140,6 +140,7 @@
!userStore.IsMyGroupByGroupname(mygrp.groupname) !userStore.IsMyGroupByGroupname(mygrp.groupname)
" "
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
flat flat
:label="$t('shared.cancel_ask_short')" :label="$t('shared.cancel_ask_short')"
@click=" @click="
@@ -388,6 +389,7 @@
label="Rifiutati" label="Rifiutati"
name="refused" name="refused"
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
></q-tab> ></q-tab>
</q-tabs> </q-tabs>

View File

@@ -436,6 +436,7 @@
/> />
<q-btn <q-btn
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
color="negative" color="negative"
:label="$t('friends.reject_ask_friend')" :label="$t('friends.reject_ask_friend')"
@click=" @click="
@@ -516,6 +517,7 @@
" "
clickable clickable
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
v-close-popup v-close-popup
@click=" @click="
tools.removeFromMyFriends( tools.removeFromMyFriends(
@@ -594,6 +596,7 @@
) )
" "
icon="fas fa-user-minus" icon="fas fa-user-minus"
outline
dense dense
:label="$t('friends.cancel_ask_friend_short')" :label="$t('friends.cancel_ask_friend_short')"
@click=" @click="