- aggiornamento refreshtoken (parte 1)

- PCB: fix listino
This commit is contained in:
Surya Paolo
2024-04-09 21:57:04 +02:00
parent ae08bc9ad6
commit 62c0f497e5
84 changed files with 317 additions and 301 deletions

View File

@@ -1,6 +1,6 @@
APP_VERSION="1.0.33"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13"
APP_ID="17"
DIRECTORY_LOCAL="newfreeplanet"
DIRECTORY_SERVER="freeplanet_serverside"
SERVERDIR_WEBSITE=""
@@ -12,7 +12,7 @@ LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="https://localhost:3000"
LOGO_REG='riso-logo-full.png'
LOGO_REG='piuchebuono-logo-full.png'
TEST_NAME="Paolo"
TEST_SURNAME="Arena"
TEST_EMAIL=""

View File

@@ -43,7 +43,6 @@
"bcryptjs": "^2.4.3",
"chart.js": "^4.4.2",
"core-js": "^3.36.1",
"crypto": "^1.0.1",
"crypto-browserify": "^3.12.0",
"date-fns": "^3.6.0",
"dotenv": "^16.4.5",

View File

@@ -68,6 +68,7 @@ module.exports = configure((ctx) => ({
views: path.resolve(__dirname, 'src/views/index.ts'),
icons: path.resolve(__dirname, 'src/assets/icons'),
images: path.resolve(__dirname, 'src/assets/images'),
maps: path.resolve(__dirname, 'src/public/maps'),
classes: path.resolve(__dirname, 'src/classes/index.ts'),
fonts: path.resolve(__dirname, 'src/assets/fonts'),
utils: path.resolve(__dirname, 'src/utils/index.ts'),
@@ -107,6 +108,7 @@ module.exports = configure((ctx) => ({
.set('@css', path.resolve(__dirname, 'src/public/css/variables.scss'))
.set('@icons', path.resolve(__dirname, 'src/public/icons/*'))
.set('@images', path.resolve(__dirname, 'src/public/images/*'))
.set('@maps', path.resolve(__dirname, 'src/public/maps/*'))
.set('@classes', path.resolve(__dirname, 'src/classes/index.ts'))
.set('@utils', path.resolve(__dirname, 'src/utils/index.ts'))
.set('@utils', path.resolve(__dirname, 'src/utils/*'))

View File

@@ -1 +1 @@
TERMINA DI LAVORARE SU piuchebuono.app: (Sovrascrivo !)
TERMINA DI LAVORARE SU riso.app: (Sovrascrivo !)

View File

@@ -1,8 +1,8 @@
{
"name": "riso",
"version": "0.6.1",
"description": "Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.",
"productName": "Riso",
"name": "piuchebuono",
"version": "2.0.1",
"description": "PiuCheBuono",
"productName": "PiuCheBuono",
"author": "Paolo Arena",
"private": true,
"keywords": [],
@@ -43,6 +43,7 @@
"bcryptjs": "^2.4.3",
"chart.js": "^4.4.2",
"core-js": "^3.36.1",
"crypto": "^1.0.1",
"crypto-browserify": "^3.12.0",
"date-fns": "^3.6.0",
"dotenv": "^16.4.5",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

BIN
public/images/foto1.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 87 KiB

BIN
public/images/foto2.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 140 KiB

BIN
public/images/foto3.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

BIN
public/images/noi4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -68,7 +68,6 @@ module.exports = configure((ctx) => ({
views: path.resolve(__dirname, 'src/views/index.ts'),
icons: path.resolve(__dirname, 'src/assets/icons'),
images: path.resolve(__dirname, 'src/assets/images'),
maps: path.resolve(__dirname, 'src/public/maps'),
classes: path.resolve(__dirname, 'src/classes/index.ts'),
fonts: path.resolve(__dirname, 'src/assets/fonts'),
utils: path.resolve(__dirname, 'src/utils/index.ts'),
@@ -95,6 +94,7 @@ module.exports = configure((ctx) => ({
transpileDependencies: [
/quasar-ui-qcalendar[\\/]src/
],
devtool: 'source-map',
chainWebpack(chain, { isServer, isClient }) {
chain.resolve.alias
@@ -108,7 +108,6 @@ module.exports = configure((ctx) => ({
.set('@css', path.resolve(__dirname, 'src/public/css/variables.scss'))
.set('@icons', path.resolve(__dirname, 'src/public/icons/*'))
.set('@images', path.resolve(__dirname, 'src/public/images/*'))
.set('@maps', path.resolve(__dirname, 'src/public/maps/*'))
.set('@classes', path.resolve(__dirname, 'src/classes/index.ts'))
.set('@utils', path.resolve(__dirname, 'src/utils/index.ts'))
.set('@utils', path.resolve(__dirname, 'src/utils/*'))
@@ -149,9 +148,8 @@ module.exports = configure((ctx) => ({
},
devServer: {
https: false,
port: 8084,
port: 8088,
open: false, // opens browser window automatically
hot: false, // Disable hot module replacement
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
@@ -297,8 +295,8 @@ module.exports = configure((ctx) => ({
workboxPluginMode: 'InjectManifest', // 'GenerateSW' or 'InjectManifest'
workboxOptions: {}, // only for GenerateSW
extendGenerateSWOptions(cfg) {
cfg.skipWaiting = false
cfg.clientsClaim = false
cfg.skipWaiting = true
cfg.clientsClaim = true
},
// for the custom service worker ONLY (/src-pwa/custom-service-worker.[js|ts])
// if using workbox in InjectManifest mode
@@ -308,9 +306,9 @@ module.exports = configure((ctx) => ({
},
manifest: {
name: 'Riso',
short_name: 'Riso',
description: 'Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.',
name: 'Più che Buono',
short_name: 'PiuCheBuono',
description: 'PiuCheBuono è un GAS e Bottega',
display: 'standalone',
orientation: 'portrait',
background_color: '#fff',
@@ -320,54 +318,54 @@ module.exports = configure((ctx) => ({
start_url: "/?homescreen=1",
icons: [
{
src: 'images/riso-android-icon-512x512.png',
src: 'images/pcb-android-icon-512x512.png',
sizes: '512x512',
type: 'image/png',
},
{
src: 'images/riso-android-icon-384x384.png',
src: 'images/pcb-android-icon-384x384.png',
sizes: '384x384',
type: 'image/png',
},
{
src: 'images/riso-android-icon-192x192.png',
src: 'images/pcb-android-icon-192x192.png',
sizes: '192x192',
type: 'image/png',
},
{
src: 'images/riso-android-icon-144x144.png',
src: 'images/pcb-android-icon-144x144.png',
sizes: '144x144',
type: 'image/png',
},
{
src: 'images/riso-android-icon-96x96.png',
src: 'images/pcb-android-icon-96x96.png',
sizes: '96x96',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-120x120.png',
src: 'images/pcb-apple-icon-120x120.png',
sizes: '120x120',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-144x144.png',
src: 'images/pcb-apple-icon-144x144.png',
sizes: '144x144',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-152x152.png',
src: 'images/pcb-apple-icon-152x152.png',
sizes: '152x152',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-180x180.png',
src: 'images/pcb-apple-icon-180x180.png',
sizes: '180x180',
type: 'image/png',
},
],
related_applications: [{
"platform": "webapp",
"url": "https://www.riso.app/manifest.json"
"url": "https://www.piuchebuono.app/manifest.json"
}]
},
},
@@ -402,7 +400,7 @@ module.exports = configure((ctx) => ({
builder: {
// https://www.electron.build/configuration/configuration
appId: 'Riso',
appId: 'PiuCheBuono',
},
// "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain

View File

@@ -468,6 +468,7 @@ self.addEventListener('sync', function (event) {
let table = multiparams[1]
let method = multiparams[2]
let token = multiparams[3]
let refreshToken = multiparams[4]
// let lang = multiparams[3]
if (cmd === 'sync-todos') {
@@ -477,6 +478,7 @@ self.addEventListener('sync', function (event) {
headers.append('content-Type', 'application/json')
headers.append('Accept', 'application/json')
headers.append('x-auth', token)
headers.append('x-refrTok', refreshToken)
// console.log('A1) INIZIO.............................................................');

View File

@@ -19,6 +19,7 @@ function handle(status: number, exclude: number[]) {
return exclude.find(o => o === status) === undefined
}
export function UseAxios(router: any) { // VueRouter
if (!initialized) {
// @ts-ignore
@@ -42,10 +43,10 @@ export function UseAxios(router: any) { // VueRouter
return config
})
axios.interceptors.response.use(undefined, (config: AxiosError) => {
axios.interceptors.response.use(undefined, (error: AxiosError) => {
// @ts-ignore
const { response } = config
const exclude = (<IRequestConfig>config.config).ignore || []
const { response } = error
const exclude = (<IRequestConfig>error.config).ignore || []
if (response) {
if (response.status === 401 && handle(response.status, exclude)) {
@@ -59,10 +60,11 @@ export function UseAxios(router: any) { // VueRouter
if (response.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN && handle(response.status, exclude)) {
window.setTimeout(() => router.replace('/forbidden'), 200)
// } else if (response.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) {
}
}
return config
return error
})
initialized = true

View File

@@ -4,47 +4,40 @@
</div>
<q-card class="dialog_card q-mb-lg" v-if="myrec">
<q-footer
class="bg-white small-screen-only text-center"
bordered
>
<q-footer class="bg-white small-screen-only text-center" bordered>
<q-btn push rounded color="primary" icon="close" label="Chiudi" v-close-popup></q-btn>
</q-footer>
<q-bar dense class="bg-primary text-white">
{{ myrec.title }} ({{ myrec.groupname }})
<q-space/>
<q-space />
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-bar>
<q-card-section class="inset-shadow">
<!-- Per ora visualizzo solo la Prima Immagine -->
<div class="text-center">
<q-img
v-if="tools.getValue(myrec, 'photos', '')"
:src="tools.getFullFileName(tools.getValue(myrec, 'photos', ''), table, myrec.username, myrec.groupname)"
class="img"
alt="immagine del gruppo"></q-img>
alt="immagine del gruppo"
></q-img>
</div>
<!--:title="t(mycol.label_trans)"-->
<div v-for="(mycol, index) of col" :key="index">
<div
v-if="(mycol.visible && (tools.checkIfShowField(mycol, tools.TIPOVIS_SHOW_RECORD, false, tools.getValue(myrec, mycol.field, mycol.subfield))))">
<div v-if="mycol.fieldtype === costanti.FieldType.html && tools.getValue(myrec, mycol.field, mycol.subfield)">
<div class="note-bacheca"
v-html="tools.getValue(myrec, mycol.field, mycol.subfield)">
</div>
v-if="(mycol.visible && (tools.checkIfShowField(mycol, tools.TIPOVIS_SHOW_RECORD, false, tools.getValue(myrec, mycol.field, mycol.subfield))))"
>
<div
v-if="mycol.fieldtype === costanti.FieldType.html && tools.getValue(myrec, mycol.field, mycol.subfield)"
>
<div class="note-bacheca" v-html="tools.getValue(myrec, mycol.field, mycol.subfield)"></div>
</div>
<div v-else-if="mycol.name === 'name'">
<div class="text-bacheca">
{{ tools.getValue(myrec, mycol.field, mycol.subfield) }}
</div>
</div>
<div v-else-if="mycol.name === 'photos' && myrec.photos.length <= 1">
<div class="text-bacheca">{{ tools.getValue(myrec, mycol.field, mycol.subfield) }}</div>
</div>
<div v-else-if="mycol.name === 'photos' && myrec.photos.length <= 1"></div>
<div v-else-if="mycol.name === 'admins'">
<CMyFieldRec
title="Amministratori:"
@@ -53,9 +46,8 @@
:rec="myrec"
:field="mycol.field"
:canEdit="false"
:canModify="false">
</CMyFieldRec>
:canModify="false"
></CMyFieldRec>
</div>
<CMyFieldRec
v-else
@@ -64,30 +56,35 @@
:rec="myrec"
:field="mycol.field"
:canEdit="false"
:canModify="false">
</CMyFieldRec>
:canModify="false"
></CMyFieldRec>
</div>
</div>
<div class="row q-ma-sm q-pa-sm justify-center">
<div class="q-ma-sm">
<q-btn
icon="far fa-file-alt" label="Apri" color="primary" text-color="white"
icon="far fa-file-alt"
label="Apri"
color="primary"
text-color="white"
:to="tools.getToByCol(col, table, myrec)"
/>
</div>
<div class="q-ma-sm">
<q-btn
v-if="myrec._id"
:text-color="$q.dark.isActive ? `white` : `black`" icon="fas fa-link"
:text-color="$q.dark.isActive ? `white` : `black`"
icon="fas fa-link"
label="Condividi"
@click="condividipag"></q-btn>
@click="condividipag"
></q-btn>
</div>
</div>
<br><br>
<br />
<br />
</q-card-section>
</q-card>
</template>
@@ -95,6 +92,6 @@
</script>
<style lang="scss" scoped>
@import './CMyCardGrpPopup.scss';
@import "./CMyCardGrpPopup.scss";
</style>

View File

@@ -29,7 +29,7 @@
@click.stop="tools.copyToClip($q, getlinkpage(), true)"
>
<q-item-section avatar>
<q-icon color="blue" name="fas fa-share" />
<q-icon color="blue" name="fas fa-share" />
</q-item-section>
<q-item-section>
{{ $t('reaction.condividi') }}

View File

@@ -112,7 +112,8 @@ export default defineComponent({
const neworder = ref(<number | undefined>0)
const myel = toRef(props, 'myelem')
const myel = ref(<IMyElem>{})
const newtype = ref(<any>'')
const isAppRunning = computed(() => globalStore.isAppRunning )
@@ -170,7 +171,7 @@ export default defineComponent({
const newrec = props.myelem
newrec._id = undefined
newrec.order = order ? order : newrec.order! + 10
newrec.order = order ? order : (newrec.order! + 10)
globalStore.addNewElem($q, t, newrec)
}
@@ -204,6 +205,9 @@ export default defineComponent({
}
function mounted() {
console.log('mounted elem ')
console.log(props.myelem.type)
myel.value = props.myelem
neworder.value = props.myelem.order
if (props.myelem)
@@ -240,7 +244,7 @@ export default defineComponent({
}
function showFit() {
if (props.myelem.type)
if (props.myelem && props.myelem.type)
return [shared_consts.ELEMTYPE.TEXT].includes(props.myelem.type)
else
return false

View File

@@ -9,7 +9,7 @@
"
@click="clickOnElem"
>
<div>
<div v-if="myel.type">
<div v-if="myel.type === shared_consts.ELEMTYPE.TEXT">
<transition
appear
@@ -636,7 +636,7 @@
rounded
size="md"
color="primary"
to="/registrati/" + tools.getInvitante()
:to="`/registrati/${tools.getInvitante()}`"
:label="$t('reg.submit')"
>
</q-btn>

View File

@@ -90,11 +90,12 @@ export default defineComponent({
})
function load() {
// console.log('load', mypathin.value)
console.log('load', mypathin.value)
if (mypathin.value !== '') {
globalStore.loadPage('/' + mypathin.value, 'cmypageelem').then(ris => {
rec.value = ris
console.log('LoadPage', ris)
})
}

View File

@@ -32,6 +32,7 @@
@click="visuEditor = false; selElem = {};"
></q-btn>
</q-bar>
<CMyEditElem
:myelem="selElem"
:editOn="true"
@@ -75,6 +76,7 @@
<div v-for="(myelem, ind) in myelems" :key="ind">
<div>
<CMyElem
v-if="(myelem.active || editOn) && !!rec.path"
:myelem="myelem"

View File

@@ -8,6 +8,8 @@ const msg_website_enUs = {
products: {
quantity: 'Quantità',
quantityAvailable: 'Disponibili',
stockQty: 'In Magazzino',
stockBloccatiQty: 'Bloccati In Magazzino',
weight: 'Peso',
stars: 'Voto',
color: 'Colore',
@@ -36,6 +38,7 @@ const msg_website_enUs = {
productslist: 'Lista Prodotti',
collabora: 'Collabora',
storehouses: 'Magazzino',
providers: 'Fornitori',
departments: 'Uffici',
orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti',

View File

@@ -8,6 +8,7 @@ const msg_website_es = {
products: {
quantity: 'Quantità',
quantityAvailable: 'Disponibili',
stockQty: 'In Magazzino',
weight: 'Peso',
stars: 'Voto',
color: 'Colore',

View File

@@ -1,9 +1,9 @@
const msg_website_it = {
ws: {
sitename: 'Riso',
siteshortname: 'RISO',
description: 'Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.',
keywords: 'riso, piattaforma di scambio, rete italiana scambio orizzontale, riso app, riso piattaforma, scambio e baratto, momenta RIS',
sitename: 'Più che Buono',
siteshortname: 'Più che Buono',
description: '',
keywords: '',
},
hours: {
descr: 'Descrizione',
@@ -16,23 +16,35 @@ const msg_website_it = {
pages: {
home: 'Home',
profile: 'Profilo',
install_site: 'Installa Sito',
profile2: 'ProfiloU',
mypage2: 'mypage2',
myservice2: 'myservice2',
myhosps2: 'myhosps2',
mygood2: 'mygood2',
catalogo: 'Catalogo',
fundraising: 'Sostieni il Progetto',
notifs: 'Configura le Notifiche',
unsubscribe: 'Disiscriviti',
unsubscribe_user: 'Disiscriviti User',
test: 'Test',
projects: 'Progetti',
report: 'Report Ore',
producer: 'Produttore',
orderinfo: 'Ordini Effettuati',
products: 'Prodotti',
cash: 'Cassa',
productInfos: 'Info Prodotti',
listinoprodotti: 'Listino Prodotti',
productslist: 'Lista Prodotti',
collabora: 'Collabora',
categories: 'Categorie',
storehouses: 'Magazzino',
providers: 'Fornitori',
catprods: 'Categorie',
subcatprods: 'Sotto-Categorie',
gasordine: 'Gas Ordine',
scontisticas: 'Scontistica',
departments: 'Uffici',
orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti',
@@ -121,9 +133,11 @@ const msg_website_it = {
only_residenti: 'Solo Residenti',
only_consiglio: 'Solo Consiglieri',
color: 'Colore',
gasordini: 'Gas Ordini',
gestoreordini: 'Gestore Ordini',
},
msg: {
myAppName: 'Riso',
myAppName: 'Più che Buono',
myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito',
underconstruction: 'App in costruzione...',
myDescriz: '',

View File

@@ -7,30 +7,6 @@ import {
import { func } from '@store/Modules/fieldsTable'
// const SHOW_PROJINTHEMENU = false
//
// let arrlistafavourite = []
// let arrlistaprojtutti = []
// let arrlistaprojmiei = []
// if (SHOW_PROJINTHEMENU) {
// arrlistaprojtutti = Projects.getters.listaprojects(RouteNames.projectsall)
// arrlistaprojmiei = Projects.getters.listaprojects(RouteNames.myprojects)
// arrlistafavourite = Projects.getters.listaprojects(RouteNames.favouriteprojects)
// }
// PROGETTI -> FAVORITI :
// if (arrlistafavourite.length > 0) {
// arrMenu.push({
// icon: 'favorite_border',
// nametranslate: 'pages.' + RouteNames.favouriteprojects,
// urlroute: RouteNames.favouriteprojects,
// level_parent: 0.0,
// level_child: 0.5,
// routes2: arrlistafavourite,
// idelem: ''
// })
// }
const firstPage = {
active: true,
order: 5,
@@ -57,72 +33,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: true,
infooter: true,
},
{
active: true,
order: 400,
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
{
active: true,
order: 12,
path: '/goods',
materialIcon: 'fas fa-tshirt',
name: 'mypages.goods',
component: () => import('@/root/goods/goods.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/services',
materialIcon: 'fas fa-house-user',
name: 'mypages.services',
component: () => import('@/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 15,
path: '/hosps',
materialIcon: 'fas fa-bed',
name: 'mypages.hosp',
component: () => import('@/root/hosp/hosp.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: site.confpages && site.confpages.enableCircuits,
order: 16,
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
/*{
active: true,
order: 20,
path: '/events',
@@ -132,6 +43,17 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},*/
{
active: site.confpages && site.confpages.showProfile,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
@@ -145,18 +67,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: false,
},
{
active: true,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
active: site.confpages && site.confpages.showProfile,
order: 120,
path: '/editprofile',
materialIcon: 'fas fa-user',
@@ -167,7 +78,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: false,
},
{
active: true,
active: site.confpages && site.confpages.showiscrittiMenu,
order: 130,
path: '/friends',
materialIcon: 'fas fa-user-friends',
@@ -177,6 +88,19 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: true,
infooter: true,
},
{
active: site.confpages && site.confpages.enableCircuits,
order: 16,
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
onlyAdmin: true,
onlyManager: true,
},
{
active: site.confpages && site.confpages.enableGroups,
order: 132,
@@ -187,6 +111,8 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
onlyAdmin: true,
onlyManager: true,
},
{
active: true,

View File

@@ -247,6 +247,7 @@ export interface IConfPages {
enableTodos: boolean
enableRegByBot: boolean
enableRegMultiChoice: boolean
enableTokenExpired: boolean
enableDebugOn: boolean
enabledRegNeedTelegram: boolean
showViewGroups: boolean

View File

@@ -2,6 +2,7 @@ export interface IToken {
access: string
// browser: string
token: string
refreshToken: string
data_login: Date
}

View File

@@ -633,6 +633,16 @@
:type="costanti.FieldType.boolean"
>
</CMyFieldDb>
<CMyFieldDb
table="sites"
:title="$t('confpages.enableTokenExpired')"
:id="mysite._id"
:rec="mysite"
mykey="confpages"
mysubkey="enableTokenExpired"
:type="costanti.FieldType.boolean"
>
</CMyFieldDb>
<CMyFieldDb
table="sites"
:title="$t('confpages.enableDebugOn')"

View File

@@ -436,7 +436,7 @@ export default defineComponent({
strris += addfield(col, 'link', rec, {}); col++;
strris += addfield(col, 'perc_iva', rec, {}); col++;
strris += addfield(col, 'price_acquistato', rec, { isnumero: true }); col++;
strris += addfield(col, 'price_acquistato', rec, { isnumero: true, iseuro: true }); col++;
strris += addfield(col, 'minBuyQty', rec, { isnumero: true }); col++;
strris += addfield(col, 'minStepQty', rec, { isnumero: true }); col++;

View File

@@ -1583,6 +1583,7 @@ const msg_it = {
enableTodos: 'Mostra Todos',
enableRegByBot: 'Registratione By Bot',
enableRegMultiChoice: 'Registratione a Scelta tra Email e Telegram',
enableTokenExpired: 'Attiva Scadenza Token',
enableDebugOn: 'Attiva Debug',
enabledRegNeedTelegram: 'Reg con Telegram',
showViewGroups: 'Bott. Gruppi',

View File

@@ -63,6 +63,7 @@ async function Request(type: string, path: string, payload: any): Promise<Types.
headers: {
'Content-Type': 'application/json',
'x-auth': userStore.x_auth_token,
'x-refrTok': userStore.refreshToken,
},
})
ricevuto = true
@@ -75,20 +76,24 @@ async function Request(type: string, path: string, payload: any): Promise<Types.
if (response && (response.status === 200)) {
let x_auth_token = ''
let refreshToken = ''
try {
if (setAuthToken || (path === '/users/login')) {
x_auth_token = String(response.headers['x-auth'])
refreshToken = String(response.headers['x-refrTok'])
if (x_auth_token === '') {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
}
if (setAuthToken) {
userStore.UpdatePwd(x_auth_token)
userStore.UpdatePwd(x_auth_token, refreshToken)
localStorage.setItem(toolsext.localStorage.token, x_auth_token)
localStorage.setItem(toolsext.localStorage.refreshToken, refreshToken)
}
userStore.setAuth(x_auth_token)
userStore.setAuth(x_auth_token, refreshToken)
localStorage.setItem(toolsext.localStorage.token, x_auth_token)
localStorage.setItem(toolsext.localStorage.refreshToken, refreshToken)
}
globalStore.setStateConnection(ricevuto ? 'online' : 'offline')
@@ -96,7 +101,7 @@ async function Request(type: string, path: string, payload: any): Promise<Types.
} catch (e) {
if (setAuthToken) {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
userStore.setAuth('')
userStore.setAuth('', '')
}
globalStore.setStateConnection(ricevuto ? 'online' : 'offline')
return Promise.reject(new Types.AxiosError(serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN, null, toolsext.ERR_AUTHENTICATION))
@@ -112,6 +117,7 @@ async function Request(type: string, path: string, payload: any): Promise<Types.
headers: {
'Content-Type': 'application/json',
'x-auth': userStore.x_auth_token,
'x-refrTok': userStore.refreshToken,
},
})
ricevuto = true
@@ -122,6 +128,7 @@ async function Request(type: string, path: string, payload: any): Promise<Types.
headers: {
'Content-Type': 'multipart/form-data',
'x-auth': userStore.x_auth_token,
'x-refrTok': userStore.refreshToken,
},
})
ricevuto = true

View File

@@ -85,6 +85,38 @@ export const Api = {
})
},
async refreshToken() {
// Implementa la logica per ottenere un nuovo token utilizzando il refreshToken
// Potrebbe essere una chiamata al server simile a sendRequest()
// Se il refreshToken è valido, salva il nuovo token e restituiscilo
// Altrimenti, gestisci il caso di refreshToken scaduto o invalido, e.g., redirecting to login
try {
console.log('refreshToken')
const response = await axios.post('/users/newTok', {
refreshToken: localStorage.getItem(toolsext.localStorage.refreshToken)
});
// Save the new access token in local storage
localStorage.setItem(toolsext.localStorage.token, response.data.accessToken);
// Reset the refresh token if it was reset by the server
if (response.data.refreshToken) {
localStorage.setItem(toolsext.localStorage.refreshToken, response.data.refreshToken);
}
// Return the new access token
return response.data.accessToken;
} catch (error) {
// Handle the error, for example by logging out the user
console.error(error);
localStorage.removeItem(toolsext.localStorage.token);
localStorage.removeItem(toolsext.localStorage.refreshToken);
throw error;
}
},
async SendReq(url: string, method: string, mydata: any, setAuthToken = false): Promise<Types.AxiosSuccess | Types.AxiosError> {
const mydataout = {
...mydata,
@@ -103,7 +135,7 @@ export const Api = {
userStore.setResStatus(0)
// eslint-disable-next-line @typescript-eslint/no-misused-promises
return new Promise((resolve, reject) => sendRequest(url, method, mydataout)
.then((res) => {
.then(async (res) => {
// console.log('status:', res.status)
setTimeout(() => {
@@ -121,9 +153,24 @@ export const Api = {
// Forbidden
// You probably is connectiong with other page...
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
userStore.setAuth('')
userStore.setAuth('', '')
// $router.push('/signin')
return reject({ code: toolsext.ERR_AUTHENTICATION })
} else if (res.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) {
console.log('Token Expired')
// Prova ad ottenere un nuovo token di accesso
try {
// Se il token è scaduto, allora faccio la richiesta di un NUOVO TOKEN, passandogli refreshToken
const newAccessToken = await this.refreshToken();
userStore.setAuth(newAccessToken, userStore.refreshToken);
// Riprova l'originale SendReq con il nuovo token.
// Assicurati di evitare un loop infinito in caso di errori continui
return resolve(this.SendReq(url, method, mydata, setAuthToken));
} catch (error) {
// Gestisci errore di refresh token (es. redirect a signin)
return reject(error);
}
}
}
if (tools.isDebug())
@@ -162,7 +209,7 @@ export const Api = {
let lettoqualcosa = false
// console.log('A1) INIZIO.............................................................')
return globalroutines( 'readall', tablesync, null)
return globalroutines('readall', tablesync, null)
.then((alldata) => {
if (alldata === undefined) {
console.log('alldata NON DEFINITA')
@@ -184,10 +231,10 @@ export const Api = {
.then((ris) => {
ReceiveResponsefromServer(tablesync, nametab, method, ris.data)
lettoqualcosa = true
return globalroutines( 'delete', tablesync, null, rec._id)
return globalroutines('delete', tablesync, null, rec._id)
})
.then(() => {
return globalroutines( 'delete', 'swmsg', null, mystrparam)
return globalroutines('delete', 'swmsg', null, mystrparam)
}).catch((err) => {
if (err.msgerr) {
if (err.msgerr.message.includes('Failed to fetch') || err.msgerr.message.includes('Network Error')) {
@@ -196,7 +243,7 @@ export const Api = {
}
console.log(' [Alternative] !!!!!!!!!!!!!!! Error while sending data', err, errorfromserver, 'lettoqualcosa', lettoqualcosa)
if (!errorfromserver) {
return globalroutines( 'delete', 'swmsg', null, mystrparam)
return globalroutines('delete', 'swmsg', null, mystrparam)
}
})
})

View File

@@ -28,6 +28,7 @@ export const serv_constants = {
RIS_CODE_LOGIN_OK: 1,
RIS_ISCRIZIONE_OK: 5,
RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN: 403,
RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED: 408,
RIS_CODE_TOKEN_RESETPASSWORD_NOT_FOUND: -23,

View File

@@ -4396,7 +4396,7 @@ export const tools = {
},
getheaders() {
const userStore = useUserStore()
return [{ name: 'x-auth', value: userStore.x_auth_token }]
return [{ name: 'x-auth', value: userStore.x_auth_token }, { name: 'x-refrTok', value: userStore.refreshToken }]
},
getextfile(filename: string) {
@@ -8510,8 +8510,12 @@ export const tools = {
},
getInvitante() {
const invitante = tools.getCookie(tools.APORTADOR_SOLIDARIO)
return invitante ? invitante : ''
try {
const invitante = tools.getCookie(tools.APORTADOR_SOLIDARIO, '')
return invitante ? invitante : ''
} catch (e) {
return ''
}
},
contieneSlash(str: string) {

View File

@@ -117,6 +117,7 @@ export const toolsext = {
leftDrawerOpen: 'ldo',
userId: 'uid',
token: 'tk',
refreshToken: 'rt',
username: 'uname',
name: 'nm',
surname: 'sn',

View File

@@ -196,6 +196,7 @@ export const useUserStore = defineStore('UserStore', {
servercode: 0,
resStatus: 0,
x_auth_token: '',
refreshToken: '',
isLogged: false,
isAdmin: false,
isManager: false,
@@ -803,6 +804,7 @@ export const useUserStore = defineStore('UserStore', {
this.resStatus = 0
this.isLogged = false
this.x_auth_token = ''
this.refreshToken = ''
return true
},
@@ -1115,7 +1117,7 @@ export const useUserStore = defineStore('UserStore', {
this.my.tokens = []
this.resetArrToken(this.my.tokens)
this.my.tokens.push({ access: 'auth', token: this.x_auth_token, data_login: tools.getDateNow() })
this.my.tokens.push({ access: 'auth', token: this.x_auth_token, refreshToken: this.refreshToken, data_login: tools.getDateNow() })
} catch (e) {
console.log('Error authUser: ' + e)
@@ -1139,6 +1141,7 @@ export const useUserStore = defineStore('UserStore', {
if (myuser.profile !== undefined) tools.localStSetItem(toolsext.localStorage.img, (myuser.profile.img) ? String(myuser.profile.img) || '' : '')
else tools.localStSetItem(toolsext.localStorage.img, '')
localStorage.setItem(toolsext.localStorage.token, this.x_auth_token)
localStorage.setItem(toolsext.localStorage.refreshToken, this.refreshToken)
localStorage.setItem(toolsext.localStorage.expirationDate, expirationDate.toString())
tools.localStSetItem(toolsext.localStorage.isLogged, String(true))
tools.localStSetItem(toolsext.localStorage.verified_email, String(myuser.verified_email))
@@ -1200,6 +1203,7 @@ export const useUserStore = defineStore('UserStore', {
tools.localStSetItem(toolsext.localStorage.name, newuser.name)
tools.localStSetItem(toolsext.localStorage.surname, newuser.surname)
localStorage.setItem(toolsext.localStorage.token, this.x_auth_token)
localStorage.setItem(toolsext.localStorage.refreshToken, this.refreshToken)
localStorage.setItem(toolsext.localStorage.expirationDate, expirationDate.toString())
tools.localStSetItem(toolsext.localStorage.verified_email, String(false))
tools.localStSetItem(toolsext.localStorage.verified_by_aportador, String(false))
@@ -1223,12 +1227,13 @@ export const useUserStore = defineStore('UserStore', {
})
},
UpdatePwd(x_auth_token: string) {
UpdatePwd(x_auth_token: string, refreshToken: string) {
this.x_auth_token = x_auth_token
this.refreshToken = refreshToken
if (!this.my.tokens) {
this.my.tokens = []
}
this.my.tokens.push({ access: 'auth', token: x_auth_token, data_login: tools.getDateNow() })
this.my.tokens.push({ access: 'auth', token: x_auth_token, refreshToken, data_login: tools.getDateNow() })
},
setServerCode(num: number) {
@@ -1239,8 +1244,9 @@ export const useUserStore = defineStore('UserStore', {
this.resStatus = status
},
setAuth(x_auth_token: string) {
setAuth(x_auth_token: string, refreshToken: string) {
this.x_auth_token = x_auth_token
this.refreshToken = refreshToken
},
resetArrToken(arrtokens: IToken[]) {
@@ -1297,7 +1303,7 @@ export const useUserStore = defineStore('UserStore', {
},
async signin(router: Router, authData: ISigninOptions) {
console.log('LOGIN signin')
// console.log('LOGIN signin')
const globalStore = useGlobalStore()
const options = {
@@ -1324,7 +1330,7 @@ export const useUserStore = defineStore('UserStore', {
let myres: any
console.log('executing login...')
// console.log('executing login...')
return await Api.SendReq('/users/login', 'POST', usertosend, true)
.then((res) => {
@@ -1435,7 +1441,7 @@ export const useUserStore = defineStore('UserStore', {
this.isLogged = isok && isLogged
// console.log('this.isLogged', this.isLogged, 'isok', isok, 'isLogged', isLogged)
console.log('this.isLogged', this.isLogged, 'isok', isok, 'isLogged', isLogged)
if (globalStore.site.confpages && globalStore.site.confpages.enableTodos)
await todos.dbLoad({ checkPending: true })
@@ -1476,17 +1482,20 @@ export const useUserStore = defineStore('UserStore', {
this.lang = tools.getItemLS(toolsext.localStorage.lang)
const token = localStorage.getItem(toolsext.localStorage.token)
let refreshToken = localStorage.getItem(toolsext.localStorage.refreshToken)
if (!refreshToken)
refreshToken = ''
if (token) {
const expirationDateStr = localStorage.getItem(toolsext.localStorage.expirationDate)
const expirationDate = new Date(String(expirationDateStr))
const now = tools.getDateNow()
if (now < expirationDate) {
this.setAuth(token)
isLogged = true
} else {
// ++ ?? che fare qui
this.setAuth(token, refreshToken)
if (globalStore.site.confpages.enableTokenExpired) {
if (token && refreshToken) {
isLogged = true
} else {
if (token) {
isLogged = true
}
}
}
} else {
isLogged = tools.isLogged()

View File

@@ -180,6 +180,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
enableTodos: false,
enableRegByBot: false,
enableRegMultiChoice: false,
enableTokenExpired: false,
enabledRegNeedTelegram: false,
enableDebugOn: false,
showButtHome: false,
@@ -874,7 +875,11 @@ export const useGlobalStore = defineStore('GlobalStore', {
async deleteSubscriptionToServer() {
console.log('DeleteSubscriptionToServer: ')
try {
return Api.SendReq('/subscribe/del', 'DELETE', null)
}catch (e) {
console.error('deleteSubscriptionToServer')
}
},
async clearDataAfterLogout() {
@@ -946,7 +951,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
},
async checkUpdates() {
// console.log('checkUpdates')
console.log('checkUpdates')
const userStore = useUserStore()

View File

@@ -216,6 +216,10 @@ export default defineComponent({
return null
}
function getlinkpage() {
return tools.getFullCurrentUrl()
}
onMounted(mounted)
return {
@@ -263,6 +267,7 @@ export default defineComponent({
circuitIndex,
circuitslistOpt,
filtroeventsgroup,
getlinkpage,
}
}
})

View File

@@ -4,9 +4,8 @@
<div v-if="!mygrp && !loading">
<div v-if="mystatus === 403">
<h3>
Non hai i permessi per accedere al Gruppo.<br />
Occorre prima registrarsi alla App
Non hai i permessi per accedere al Gruppo.
<br />Occorre prima registrarsi alla App
</h3>
</div>
<div v-else>
@@ -19,7 +18,7 @@
v-if="mygrp.descr"
class="fit column no-wrap justify-evenly items-center content-start"
>
<div class="">
<div class>
<q-avatar size="140px">
<q-img
:src="getImgGrp()"
@@ -32,14 +31,12 @@
</div>
<div class="text-h6">
<span v-if="checkifShow('name')"> {{ mygrp.title }}</span>
<span v-if="checkifShow('name')">{{ mygrp.title }}</span>
</div>
<div
v-if="mygrp.title !== mygrp.groupname"
class="col-12 text-h7 text-blue text-shadow-2"
>
{{ mygrp.groupname }}
</div>
>{{ mygrp.groupname }}</div>
<q-banner
v-if="userStore.IsRefusedGroupByGroupname(mygrp.groupname)"
@@ -47,8 +44,8 @@
class="bg-red text-white"
style="text-align: center"
>
<em style="font-weight: bold">{{ $t('db.youarerefusedgroup') }}</em
><br />
<em style="font-weight: bold">{{ $t('db.youarerefusedgroup') }}</em>
<br />
</q-banner>
<div>
@@ -95,9 +92,11 @@
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<q-item-section>{{
$t('groups.exit_group')
}}</q-item-section>
<q-item-section>
{{
$t('groups.exit_group')
}}
</q-item-section>
</q-item>
<q-list
@@ -123,9 +122,11 @@
<q-item-section avatar>
<q-icon color="negative" name="fas fa-trash-alt" />
</q-item-section>
<q-item-section>{{
$t('groups.delete_group')
}}</q-item-section>
<q-item-section>
{{
$t('groups.delete_group')
}}
</q-item-section>
</q-item>
</q-list>
</q-list>
@@ -151,10 +152,20 @@
/>
</div>
</div>
<div
v-if="mygrp.descr"
class="no-wrap justify-evenly items-center content-start"
>
<div class="absolute-top-right q-mr-sm q-my-md q-pt-lg">
<div class="column">
<q-btn
flat
round
color="blue"
icon="share"
style="z-index: 1"
@click.stop="tools.copyToClip($q, getlinkpage(), true)"
></q-btn>
</div>
</div>
<div v-if="mygrp.descr" class="no-wrap justify-evenly items-center content-start">
<!--
<q-btn
v-if="tools.iAmAdminGroup(groupname)" icon="fas fa-pencil-alt"
@@ -166,11 +177,7 @@
-->
<q-tabs v-model="tabgrp" class="text-blue">
<q-tab
:label="t('shared.info1')"
name="info"
icon="fas fa-info"
></q-tab>
<q-tab :label="t('shared.info1')" name="info" icon="fas fa-info"></q-tab>
<q-tab
v-if="
tools.iCanShowGroupsMember(mygrp) ||
@@ -189,11 +196,7 @@
name="circuits"
icon="fas fa-coins"
></q-tab>
<q-tab
:label="t('groups.events')"
name="events"
icon="fas fa-bullhorn"
></q-tab>
<q-tab :label="t('groups.events')" name="events" icon="fas fa-bullhorn"></q-tab>
</q-tabs>
<q-tab-panels v-model="tabgrp" animated>
@@ -220,7 +223,7 @@
v-if="
!!mygrp.date_updated &&
tools.getstrshortDate(mygrp.date_updated) !==
tools.getstrshortDate(mygrp.createdBy)
tools.getstrshortDate(mygrp.createdBy)
"
class="element"
>
@@ -244,9 +247,7 @@
<q-icon name="fas fa-lock"></q-icon>
</div>
<div>
<div class="title_param">
{{ $t('groups.private') }}
</div>
<div class="title_param">{{ $t('groups.private') }}</div>
{{ $t('groups.private_descr') }}
</div>
</div>
@@ -274,9 +275,10 @@
</div>
<div>
<div class="title_param">
<div v-for="(city, index) of cities" :key="index">
{{ city.comune }} ({{ city.prov }})
</div>
<div
v-for="(city, index) of cities"
:key="index"
>{{ city.comune }} ({{ city.prov }})</div>
</div>
</div>
</div>
@@ -304,8 +306,7 @@
:mycontact="user"
:visu="costanti.FIND_PEOPLE"
@setCmd="tools.setCmd"
>
</CMyUser>
></CMyUser>
</div>
</q-card-section>
</q-card>
@@ -334,8 +335,7 @@
:label="$t('msgs.telegrammsg')"
:href="getLinkGrpTelegram()"
target="__blank"
>
</q-btn>
></q-btn>
</div>
<div class="col-6 q-ma-xs">
<q-btn
@@ -348,8 +348,7 @@
:label="$t('reg.website')"
:href="getLinkWebSite()"
target="__blank"
>
</q-btn>
></q-btn>
</div>
</q-card-section>
</q-card>
@@ -400,10 +399,10 @@
<q-tab-panel name="rich">
<CGridTableRec
prop_mytable="mygroups"
prop_mytitle=""
prop_mytitle
:prop_mycolumns="colmyUserPeople"
prop_colkey="_id"
col_title=""
col_title
:vertical="costanti.VISUTABLE_USER_TABGROUP"
nodataLabel="Nessuna Richiesta in sospeso"
:prop_search="false"
@@ -422,16 +421,15 @@
:extraparams="extraparams_rich()"
:extrafield="groupname"
:visufind="costanti.REQ_ADD_USER_TO_GROUP"
>
</CGridTableRec>
></CGridTableRec>
</q-tab-panel>
<q-tab-panel name="refused">
<CGridTableRec
prop_mytable="mygroups"
prop_mytitle=""
prop_mytitle
:prop_mycolumns="colmyUserPeople"
prop_colkey="_id"
col_title=""
col_title
:vertical="costanti.VISUTABLE_SCHEDA_GROUP"
nodataLabel="Nessun utente Rifiutato"
:prop_search="false"
@@ -450,8 +448,7 @@
:extraparams="extraparams_refused()"
:extrafield="groupname"
:visufind="costanti.REQ_ADD_USER_TO_GROUP"
>
</CGridTableRec>
></CGridTableRec>
</q-tab-panel>
</q-tab-panels>
</q-tab-panel>
@@ -464,7 +461,7 @@
map-options
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
>
<template v-slot:prepend> </template>
<template v-slot:prepend></template>
<template v-slot:option="scope">
<q-item v-bind="scope.itemProps">
<q-item-section>
@@ -480,19 +477,11 @@
class="text-blue"
no-caps
>
<q-tab
:label="t('shared.info1')"
name="info"
icon="fas fa-info"
></q-tab>
<q-tab
:label="t('circuit.movements')"
name="mov"
icon="fas fa-coins"
></q-tab>
<q-tab :label="t('shared.info1')" name="info" icon="fas fa-info"></q-tab>
<q-tab :label="t('circuit.movements')" name="mov" icon="fas fa-coins"></q-tab>
</q-tabs>
</q-tab-panel>
<q-tab-panel name="events"> </q-tab-panel>
<q-tab-panel name="events"></q-tab-panel>
</q-tab-panels>
<div v-if="tabgrp === 'circuits' && tabcircuit === 'info'">
@@ -517,7 +506,7 @@
<CGridTableRec
v-if="tabellare && !loading"
prop_mytable="movements"
prop_mytitle=""
prop_mytitle
:prop_mycolumns="colmyMovementTable"
prop_colkey="_id"
col_title="Lista Movimenti"
@@ -532,7 +521,7 @@
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="movimenti non trovati con questa ricerca"
filterextra=""
filterextra
:prop_pagination="{
sortBy: 'transactionDate',
descending: true,
@@ -546,14 +535,13 @@
:extraparams="
getExtraparams_movs_grp(circuitslist[circuitIndex])
"
extrafield=""
extrafield
:visufind="costanti.FRIENDS"
>
</CGridTableRec>
></CGridTableRec>
<CGridTableRec
v-else-if="!loading"
prop_mytable="movements"
prop_mytitle=""
prop_mytitle
:prop_mycolumns="colmyMovement"
prop_colkey="_id"
col_title="Lista Movimenti"
@@ -581,10 +569,9 @@
:extraparams="
getExtraparams_movs_grp(circuitslist[circuitIndex])
"
extrafield=""
extrafield
:visufind="costanti.FRIENDS"
>
</CGridTableRec>
></CGridTableRec>
</div>
</div>
<div v-if="tabgrp === 'events'">
@@ -603,7 +590,7 @@
<CGridTableRec
ref="tabMembri"
prop_mytable="users"
prop_mytitle=""
prop_mytitle
:prop_mycolumns="colmyUserPeople"
prop_colkey="_id"
col_title="username"
@@ -629,27 +616,16 @@
? costanti.REQ_REMOVE_USER_TO_GROUP
: costanti.FIND_PEOPLE
"
>
</CGridTableRec>
></CGridTableRec>
</div>
</div>
<div
v-else
class="fit column no-wrap justify-evenly items-center content-start"
>
<q-skeleton
type="QAvatar"
size="140px"
height="140px"
animation="fade"
/>
<div v-else class="fit column no-wrap justify-evenly items-center content-start">
<q-skeleton type="QAvatar" size="140px" height="140px" animation="fade" />
<q-card flat bordered style="width: 250px">
<div class="text-h6">
<q-skeleton :animation="animation" />
</div>
<div class="col-12 text-h7 text-grey text-center">
{{ groupname }}
</div>
<div class="col-12 text-h7 text-grey text-center">{{ groupname }}</div>
<div class="col-12 text-h7">
<q-skeleton :animation="animation" />
</div>
@@ -677,6 +653,6 @@
</script>
<style lang="scss" scoped>
@import './mygroup.scss';
@import "./mygroup.scss";
</style>

View File

@@ -5508,11 +5508,6 @@ crypto-random-string@^4.0.0:
dependencies:
type-fest "^1.0.1"
crypto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037"
integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==
css-color-names@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
@@ -14842,6 +14837,7 @@ workbox-window@6.6.1:
workbox-core "6.6.1"
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
name wrap-ansi-cjs
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==