49 Commits

Author SHA1 Message Date
Surya Paolo
e47772ab34 Revert "Aggiornamento a 0.6.1"
This reverts commit 701e1f1968.
2023-04-07 18:01:09 +02:00
Surya Paolo
0365c58326 cambio nome ai circuiti 2023-03-23 15:37:28 +01:00
Surya Paolo
eb53557090 filter visible if selected, different from friends, hosp, and services 2023-03-23 00:42:57 +01:00
Surya Paolo
c28c6c4d8b - Cerca Amici persone: filtro per Regione o Provincia 2023-03-23 00:09:59 +01:00
Surya Paolo
9745133e81 - Find Friends by Region or Province 2023-03-22 22:45:00 +01:00
Surya Paolo
396028748d circuito 2023-03-22 18:10:37 +01:00
Surya Paolo
79cde5c905 - fixed ordinamento tabelle 2023-03-22 16:55:57 +01:00
Surya Paolo
175bba7720 - Provincia obbligatoria, chiedo conferma se non vuole entrare nel circuito. 2023-03-22 15:54:56 +01:00
Surya Paolo
59af1d0b8b - Il circuito viene creato in automatico, quando scegli una provincia. 2023-03-21 18:12:06 +01:00
Surya Paolo
de937c73f7 province visible 2023-03-18 01:27:04 +01:00
Surya Paolo
422a3b6e88 show table movements 2023-03-18 00:57:43 +01:00
Surya Paolo
af04e022eb - Visu Saldo su Home
- SendRisTo
- Movimenti conto Comunitario
- Profilo
2023-03-17 19:07:43 +01:00
Surya Paolo
37c2f08510 - qualifica non ci stava
- lista invia ris ok
2023-03-11 01:29:39 +01:00
Surya Paolo
80610b3627 - Invia Ris a e Ricevi Ris
- Tutorial Guidato Passi da Compiere
- Provincia in cui vivi
- Policy aggiornata
2023-03-11 01:01:23 +01:00
Surya Paolo
7a9689125b - fix: se salvavo un record 'settable' e non era completo con tutti i campi, andava a troncare gli altri precedentemente inseriti
- ordinamento Circuiti per stato e numiscritti e descr
2023-03-05 22:04:28 +01:00
Surya Paolo
3f808189e3 ver 0.5.73:
- corretto invia monete da Conto Collettivo a Utente
- Aggiunto Provincia (tutorial).. in corso...
2023-03-04 10:20:49 +01:00
Surya Paolo
a250700c8b ver 0.5.71:
- Info Conto
- Admin: poter modificare Fido e QtaMax, sia per i Conti Collettivi sia per gli Utenti.
2023-02-23 17:20:54 +01:00
Surya Paolo
c8e0f7922f ver 0.5.71:
- Info Conto
- Admin: poter modificare Fido e QtaMax.
2023-02-23 16:07:52 +01:00
Surya Paolo
19860aa438 - Info sul Conto Collettivo
- HomePage
2023-02-20 02:20:00 +01:00
Surya Paolo
1f5be4624f Lista Richieste e Rifiutati dei Conti Collettivi 2023-02-16 20:13:55 +01:00
Surya Paolo
239cfbe835 Unsubscribe 2023-02-15 21:40:10 +01:00
Surya Paolo
d59eb86d0c fix img profile 2023-02-06 23:50:55 +01:00
Surya Paolo
5c2b28939b - pagine admin: Accounts, Movements e Circuits.
- add change min e max range circuiti (per tutti i record).
2023-02-06 22:58:18 +01:00
Surya Paolo
0234e2323a fix Conti Collettivi + messaggi 2023-02-02 13:53:09 +01:00
Surya Paolo
f79c3b1d77 fix nametoshow 2023-02-02 02:52:27 +01:00
Surya Paolo
d5831e3dbf ver: 0.5.62
Conti Collettivi visibili solo se sei admin...
2023-02-02 02:31:09 +01:00
Surya Paolo
cfa2457147 Invio RIS da User a Conto Comunitario
- Visu movimenti OK
2023-02-01 23:50:58 +01:00
Surya Paolo
97ee2a1129 Conti Comunitari e Collettivi 2023-02-01 16:36:17 +01:00
Surya Paolo
f62ac90b34 go on Conto Comunitario 2023-02-01 01:19:58 +01:00
Surya Paolo
8176902363 Pagina "Attività" non compare bene la scritta Beni e Servizi... ?! 2023-01-29 22:22:41 +01:00
Surya Paolo
23fd5fc5ef Istruzioni per installare l'APP: Android, iOS 2023-01-25 20:52:47 +01:00
Surya Paolo
e58f7249a6 Sulla foto della notifica il click non funziona
check App
2023-01-25 11:55:06 +01:00
Surya Paolo
567f7b4be7 Possibilità di scrivere l'username anche con la chiocciola @ 2023-01-25 10:47:52 +01:00
Surya Paolo
98c0218ef7 Conto Comunitario all'interno di un Circuito 2023-01-21 19:02:26 +01:00
Surya Paolo
42d68eb4b8 fix button registration disabled
Conto Comunitario... passo 2
2023-01-13 12:29:34 +01:00
Surya Paolo
3d77cf671d Conto Comunitario... 2023-01-12 01:03:19 +01:00
Surya Paolo
2acf161d5d 0.5.56 2023-01-09 18:26:27 +01:00
Surya Paolo
b98cda2110 fix SdM
share link
2023-01-09 15:55:18 +01:00
Surya Paolo
a9367d5aef fix strette di mano 2023-01-09 04:05:18 +01:00
Surya Paolo
d684d7a46f Ver 0.5.55
Strette di Mano OK
2023-01-09 02:39:53 +01:00
Surya Paolo
815ca0d565 Stringi la mano (fase prima) 2023-01-08 19:20:25 +01:00
Surya Paolo
4d40efc73a ++Strette di Mano 2023-01-08 02:17:15 +01:00
Surya Paolo
865e1ad738 strette di mano 2023-01-06 15:51:58 +01:00
Surya Paolo
d5d005a714 pagina Attivita + Video e PDF Presentazione 2023-01-05 01:37:25 +01:00
Surya Paolo
98dcea5526 poter visualizzare i propri beni e servizi anche se non sei registrato alla app ! 2023-01-04 02:09:51 +01:00
Surya Paolo
ce4bf65fc4 ver 0.5.51 2023-01-03 16:51:45 +01:00
Surya Paolo
3f9f608d4e Correggere lista circuiti (non compare il titolo e il num. di persone) 2022-12-23 17:12:57 +01:00
Surya Paolo
61451ef994 Fare procedura per cambiare gli username in giro nelle varie tabelle
fix icon Android "Badge" black and white.
2022-12-23 00:37:22 +01:00
Surya Paolo
a8677dc644 Registrazione: far comparire tutti i campi una volta inseriti... cosi comparirà l'errore 2022-12-22 16:48:57 +01:00
219 changed files with 13122 additions and 3755 deletions

View File

@@ -1,4 +1,8 @@
APP_VERSION="0.5.46" <<<<<<< HEAD
APP_VERSION="0.5.83"
=======
APP_VERSION="0.5.85"
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
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,8 @@
APP_VERSION="0.5.46" <<<<<<< HEAD
APP_VERSION="0.5.83"
=======
APP_VERSION="0.5.85"
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

31
.env.test.risosrv Executable file
View File

@@ -0,0 +1,31 @@
<<<<<<< HEAD
APP_VERSION="0.5.83"
=======
APP_VERSION="0.5.85"
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet
DIRECTORY_SERVER=test.freeplanet_serverside
SERVERDIR_WEBSITE="splendidus.it/riso"
APP_URL="https://riso.splendidus.it"
URL_FACEBOOK=""
PROVA_PAOLO=""
LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="https://splendidus.it:3001"
LOGO_REG='riso-logo-full.png'
TEST_NAME=""
TEST_SURNAME=""
TEST_EMAIL=""
TEST_USERNAME=""
TEST_PASSWORD=""
TEST_APORTADOR=""
PUBLICKEY_PUSH="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
IN_CONSTRUCTION="0"
DEBUG="1"
TELEGRAM_SUPPORT=""
PROJECT_ID_MAIN="5cc0a13fe5c9d156728f400a"
TEST_CELL=""
ISTEST=1

View File

@@ -212,27 +212,16 @@ const msg_website_it = {
+ '<li>👥 Aiutando a creare Gruppi Territoriali nella vostra città, impegnandosi a realizzare progetti per il Bene Comune, in onore ai principi Amorevoli e di condivisione.</li>' + '<li>👥 Aiutando a creare Gruppi Territoriali nella vostra città, impegnandosi a realizzare progetti per il Bene Comune, in onore ai principi Amorevoli e di condivisione.</li>'
+ '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>' + '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>'
+ '<li>👨🏻‍💻 Con una <strong>piccola donazione</strong> per le spese dei Server, manutenzione e per i continui sviluppi e miglioramenti</li></ul>' + + '<li>👨🏻‍💻 Con una <strong>piccola donazione</strong> per le spese dei Server, manutenzione e per i continui sviluppi e miglioramenti</li></ul>' +
'1) Tramite <strong>Paypal</strong>:<br>' + '1) Tramite <strong><a href="https://paypal.me/paoloarena" target="_blank">Paypal</a></strong>:<br>' +
'<div style="font-size: 1.5rem; background-color: white; color: blue; border: solid 2px #f00; margin: 10px; padding: 10px; border-radius: 10px; " ' +
'class="row justify-around">' +
'<span><a href="https://paypal.me/paoloarena/1" target="_blank">1€</a></span>' +
'<span><a href="https://paypal.me/paoloarena/2" target="_blank">2€</a></span>' +
'<span><a href="https://paypal.me/paoloarena/5" target="_blank">5€</a></span>' +
'<span><a href="https://paypal.me/paoloarena/10" target="_blank">10€</a></span>' +
'<span><a href="https://paypal.me/paoloarena" target="_blank">scegli</a></span>' +
'</div><em>clicca sull\'importo per fare una <strong>donazione</strong> </em><br>' +
'<br>2) Tramite <strong>Satispay</strong>: <a href="https://www.satispay.com/app/match/link/money-box/S6Y-SVN--62712D42-35B0-4BB9-8511-410C2AB8CD45" target="_blank">Clicca qui</a><br>' + '<br>2) Tramite <strong>Satispay</strong>: <a href="https://www.satispay.com/app/match/link/money-box/S6Y-SVN--62712D42-35B0-4BB9-8511-410C2AB8CD45" target="_blank">Clicca qui</a><br>' +
'<div style="font-size: 1rem; background-color: white; color: blue; border: solid 2px #f00; margin: 5px; padding: 5px; border-radius: 10px; " ' + '<div style="font-size: 1rem; background-color: white; color: blue; border: solid 2px #f00; margin: 5px; padding: 5px; border-radius: 10px; " ' +
'class="row justify-around">' + 'class="row justify-around">' +
'Se ancora non hai Satispay <a href="https://www.satispay.com/promo/PAOLOARENA4">Richiedila cliccando qui</a></br>' + 'Se ancora non hai Satispay <a href="https://www.satispay.com/promo/PAOLOARENA4">Richiedila cliccando qui</a></br>' +
'E\' consigliata se hai un conto bancario come alternativa alla costosa carta di credito/debito</br>' +
'👉🏻 <strong>Registrandoti entrambi riceviamo un Bonus di 5 €</strong></br>' +
'</div>' + '</div>' +
'<br>3) Tramite <strong>Bonifico Bancario</strong>:<br>' + '<br>3) Tramite <strong>Bonifico Bancario</strong>:<br>' +
'(Scrivi a Surya (<a href="mailto:surya@riso.app">surya@riso.app</a>) per ricevere le coordinate</br>' + '(Scrivi a Surya (<a href="https://t.me/surya1977">@surya1977</a>) per le coordinate</br>' +
'' + '' +
'4) In alternativa scegli tu una forma di scambio da donare a Paolo (per scrivergli su Telegram: <a href="https://t.me/surya1977" target="_blank">Surya Paolo</a>)<br />' + '4) In alternativa scegli tu una forma di Dono <br />' +
'<span style="color: red; font-size: 2rem;">❤</span> Sono graditi messaggi sia di suggerimenti che di apprezzamenti.<br>' +
'Grazie Mille per l\'Aiuto ed il Supporto' + 'Grazie Mille per l\'Aiuto ed il Supporto' +
'<br>', '<br>',
}, },

View File

@@ -1,4 +1,8 @@
APP_VERSION="0.5.46" <<<<<<< HEAD
APP_VERSION="0.5.83"
=======
APP_VERSION="0.5.85"
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
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,8 @@
APP_VERSION="0.5.46" <<<<<<< HEAD
APP_VERSION="0.5.83"
=======
APP_VERSION="0.5.85"
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="13"
DIRECTORY_LOCAL=newfreeplanet DIRECTORY_LOCAL=newfreeplanet

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -1,4 +1,8 @@
APP_VERSION="0.5.46" <<<<<<< HEAD
APP_VERSION="0.5.83"
=======
APP_VERSION="0.5.85"
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
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

@@ -125,7 +125,7 @@
</div> </div>
<section :class="$q.dark.isActive ? `bg-black` : `bg-white` + ` padding_gallery text-grey-10 text-center`"> <section :class="($q.dark.isActive) ? `bg-black` : `bg-white`) + ` padding_gallery text-grey-10 text-center`">
<q-carousel <q-carousel
swipeable swipeable

32
aaa.txt Normal file
View File

@@ -0,0 +1,32 @@
TRA CIRCUITI:
Fai la Transazione
Le transazioni extraterritoriali fuori dal circuito devono andare in altra.
- Rita di VICENZA sia partito (con 10) paga a VITERBO.
TRANSAZIONI EXTRATERRITORIALI.
sul circuito Viterbo mi compare la lista delle transazioni extraterr., suddivise per territorio.
e posso scambiare con quelli di Vicenza.
Possibilità di ricevere i RIS da chiunque.
OSPITE
RESIDENTI
- Rita di VICENZA offre un Servizio a Pietro di AGRIGENTO.
- a Sergio gli appare anche Pietro di AGRIGENTO.
-
RITA -10 VICENZA
RITA +20 AGRIGENTO
SERGIO +10 VICENZA
PROFILO:
il "invia monete" compare a tutti, almeno devi essere collegato in 1 circuito.

View File

@@ -0,0 +1,27 @@
#!/bin/bash
source ./.env.test.risosrv
msg="*** Sincronizzazione ??? $DIRECTORY_LOCAL e $SERVERDIR_WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
risposta=$1
fi
cp .env.production .env.prod.bak
cp .env.test.risosrv .env.production
sleep 1
npm run buildpwa
echo "Sincronizzazione $SERVERDIR_WEBSITE in remoto..."
rsync -e 'ssh -p 5522' -a dist/pwa/ root@risosrv:/home/$SERVERDIR_WEBSITE
cp .env.prod.bak .env.production
sleep 1
echo "Finito $SERVERDIR_WEBSITE"

View File

@@ -72,6 +72,7 @@
"vue-scroll-reveal": "^1.0.11", "vue-scroll-reveal": "^1.0.11",
"vue-social-sharing": "^4.0.0-alpha4", "vue-social-sharing": "^4.0.0-alpha4",
"vue-svgicon": "^4.0.0-alpha.3", "vue-svgicon": "^4.0.0-alpha.3",
"vue-timeago3": "^2.3.0",
"vue2-dragula": "^2.5.5", "vue2-dragula": "^2.5.5",
"vuex": "^4.1.0", "vuex": "^4.1.0",
"vuex-router-sync": "^6.0.0-rc.1" "vuex-router-sync": "^6.0.0-rc.1"
@@ -122,15 +123,30 @@
"crypto": false "crypto": false
}, },
"browserslist": [ "browserslist": [
"last 30 Chrome versions", <<<<<<< HEAD
"last 30 Firefox versions", "last 20 Chrome versions",
"last 4 Edge versions", "last 20 Firefox versions",
"last 30 Safari versions", "last 10 Edge versions",
"last 30 Android versions", "last 15 Safari versions",
"last 30 ChromeAndroid versions", "last 60 Android versions",
"last 30 FirefoxAndroid versions", "last 180 ChromeAndroid versions",
"last 18 iOS versions", "last 40 FirefoxAndroid versions",
"last 11 Opera versions" "last 20 iOS versions",
"last 10 Opera versions",
"> 0.1%",
=======
"last 40 Chrome versions",
"last 40 Firefox versions",
"last 10 Edge versions",
"last 35 Safari versions",
"last 60 Android versions",
"last 250 ChromeAndroid versions",
"last 60 FirefoxAndroid versions",
"last 30 iOS versions",
"last 10 Opera versions",
"> 0.05%",
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
"not dead"
], ],
"engines": { "engines": {
"node": ">= 16.14.0", "node": ">= 16.14.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -37,7 +37,7 @@ module.exports = configure((ctx) => ({
// --> boot files are part of "main.js" // --> boot files are part of "main.js"
// https://v2.quasar.dev/quasar-cli/boot-files // https://v2.quasar.dev/quasar-cli/boot-files
// boot: ['vue-i18n', 'vue-meta', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'vue-idb', 'dragula', 'guard'], // boot: ['vue-i18n', 'vue-meta', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'vue-idb', 'dragula', 'guard'],
boot: ['i18n', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'calendar', 'social-sharing'], boot: ['i18n', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'calendar', 'social-sharing', 'timeago'],
// https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css // https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css
css: [ css: [
@@ -238,8 +238,7 @@ module.exports = configure((ctx) => ({
'Ripple', 'Ripple',
'ClosePopup', 'ClosePopup',
], ],
// Quasar plugins _plugins: [
plugins: [
'Meta', 'Meta',
'Dialog', 'Dialog',
'Notify', 'Notify',
@@ -247,13 +246,25 @@ module.exports = configure((ctx) => ({
'Loading', 'Loading',
'AppVisibility', 'AppVisibility',
], ],
get plugins_1() {
return this._plugins;
},
set plugins_1(value) {
this._plugins = value;
},
get plugins() {
return this._plugins;
},
set plugins(value) {
this._plugins = value;
},
iconSet: 'fontawesome-v5', iconSet: 'fontawesome-v5',
lang: 'it', // Quasar language lang: 'it', // Quasar language
}, },
// animations: 'all', // --- includes all animations animations: 'all', // --- includes all animations
// https://v2.quasar.dev/options/animations // https://v2.quasar.dev/options/animations
animations: [], // animations: [],
// https://v2.quasar.dev/quasar-cli/developing-ssr/configuring-ssr // https://v2.quasar.dev/quasar-cli/developing-ssr/configuring-ssr
ssr: { ssr: {
@@ -282,7 +293,7 @@ module.exports = configure((ctx) => ({
pwa: { pwa: {
workboxPluginMode: 'InjectManifest', // 'GenerateSW' or 'InjectManifest' workboxPluginMode: 'InjectManifest', // 'GenerateSW' or 'InjectManifest'
workboxOptions: {}, // only for GenerateSW workboxOptions: {}, // only for GenerateSW
extendGenerateSWOptions (cfg) { extendGenerateSWOptions(cfg) {
cfg.skipWaiting = false cfg.skipWaiting = false
cfg.clientsClaim = false cfg.clientsClaim = false
}, },
@@ -299,8 +310,11 @@ module.exports = configure((ctx) => ({
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.', 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.',
display: 'standalone', display: 'standalone',
orientation: 'portrait', orientation: 'portrait',
background_color: '#ffffff', background_color: '#fff',
theme_color: '#027be3', theme_color: '#027be3',
scope: "/",
id: "/?homescreen=1",
start_url: "/?homescreen=1",
icons: [ icons: [
{ {
src: 'images/riso-android-icon-512x512.png', src: 'images/riso-android-icon-512x512.png',
@@ -348,6 +362,10 @@ module.exports = configure((ctx) => ({
type: 'image/png', type: 'image/png',
}, },
], ],
related_applications: [{
"platform": "webapp",
"url": "https://www.riso.app/manifest.json"
}]
}, },
}, },

11
send_pwa_to_risotest.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
source .env.test.risosrv
cp .env.test.risosrv .env.production
echo "Sincronizzazione in remoto $SERVERDIR_WEBSITE ..."
rsync -e 'ssh -p 5522' -a dist/pwa/ root@risosrv:/home/$SERVERDIR_WEBSITE/
echo "Finito $SERVERDIR_WEBSITE"
cp .env.prod.bak .env.production

View File

@@ -617,7 +617,7 @@ self.addEventListener('push', (event) => {
options = { options = {
body: data.content, body: data.content,
icon: data.icon ? data.icon : '/images/android-chrome-192x192.png', icon: data.icon ? data.icon : '/images/android-chrome-192x192.png',
badge: data.badge ? data.badge : '/images/android-chrome-192x192.png', badge: data.badge ? data.badge : '/images/badge-96x96.png',
data: { data: {
url: data.url, url: data.url,
}, },
@@ -633,7 +633,7 @@ self.addEventListener('push', (event) => {
options = { options = {
body: text, body: text,
icon: '/images/android-chrome-192x192.png', icon: '/images/android-chrome-192x192.png',
badge: '/images/android-chrome-192x192.png', badge: '/images/badge-96x96.png',
data: { data: {
url: '/', url: '/',
}, },

View File

@@ -28,6 +28,7 @@ export default {
const $q = useQuasar() const $q = useQuasar()
const userStore = useUserStore() const userStore = useUserStore()
const $router = useRouter() const $router = useRouter()
const $route = useRoute()
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const { t } = useI18n(); const { t } = useI18n();
@@ -79,15 +80,21 @@ export default {
function mounted() { function mounted() {
console.log('app mounted')
darkcookie.value = tools.getCookie('darkmode', false, false, false) === '-1' darkcookie.value = tools.getCookie('darkmode', false, false, false) === '-1'
globalStore.homescreen = $route.query.homescreen ? $route.query.homescreen : ''
scroll() scroll()
tools.checkApp()
} }
async function created() { async function created() {
tools.initprompt()
tools.checkApp()
try { try {
if (process.env.DEV) { if (process.env.DEV) {
console.info('SESSIONE IN SVILUPPO ! (DEV)') console.info('SESSIONE IN SVILUPPO ! (DEV)')

7
src/boot/timeago.ts Executable file
View File

@@ -0,0 +1,7 @@
//@ts-ignore
import timeago from 'vue-timeago3'
import { boot } from 'quasar/wrappers'
export default boot(({ app }) => {
app.use(timeago)
})

View File

@@ -1 +1 @@
/home/paolo/myproject/freeplanet_serverside/src/server/tools/shared_nodejs.js ../../../freeplanet_serverside/src/server/tools/shared_nodejs.js

View File

@@ -39,12 +39,14 @@ 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,
BOTT_CONDIVIDI: 190, BOTT_CONDIVIDI: 190,
BUTTON: 195, BUTTON: 195,
PRESENTAZIONE: 200, PRESENTAZIONE: 200,
MYACTIVITIES: 205,
NOTIFATTOP: 210, NOTIFATTOP: 210,
CHART: 220, CHART: 220,
CHECKNEWVERSION: 230, CHECKNEWVERSION: 230,
@@ -54,6 +56,7 @@ export const shared_consts = {
REGISTRATION: 258, REGISTRATION: 258,
BTN_LOGIN: 260, BTN_LOGIN: 260,
FOOTER: 270, FOOTER: 270,
PROFILETUTORIAL: 280,
}, },
QUERYTYPE_MYGROUP: 1, QUERYTYPE_MYGROUP: 1,
@@ -63,6 +66,10 @@ export const shared_consts = {
QUERYTYPE_REFUSED_USER_CIRCUIT: 12, QUERYTYPE_REFUSED_USER_CIRCUIT: 12,
QUERYTYPE_LIST_MOVEMENTS: 15, QUERYTYPE_LIST_MOVEMENTS: 15,
QUERYTYPE_LIST_ALLMOVEMENTS: 16, QUERYTYPE_LIST_ALLMOVEMENTS: 16,
QUERYTYPE_LIST_MOVEMENTS_GROUPNAME: 17,
QUERYTYPE_LIST_MOVEMENTS_CONTOCOM: 18,
QUERYTYPE_GROUP_CIRCUIT: 20,
QUERYTYPE_REFUSED_GROUP_CIRCUIT: 22,
FILTER_EXTRALIST_NOT_REGISTERED: 1, FILTER_EXTRALIST_NOT_REGISTERED: 1,
FILTER_EXTRALIST_NOT_CONTACTED: 2, FILTER_EXTRALIST_NOT_CONTACTED: 2,
@@ -87,6 +94,7 @@ export const shared_consts = {
FILTER_USER_NO_VERIFIED_APORTADOR: 2097152, FILTER_USER_NO_VERIFIED_APORTADOR: 2097152,
FILTER_USER_SI_TELEGRAM_ID: 4194304, FILTER_USER_SI_TELEGRAM_ID: 4194304,
FILTER_USER_WITHOUT_USERNAME_TELEGRAM: 8388608, FILTER_USER_WITHOUT_USERNAME_TELEGRAM: 8388608,
FILTER_USER_PROVINCE: 16777216,
OPTIONS_SEARCH_ONLY_FULL_WORDS: 1, OPTIONS_SEARCH_ONLY_FULL_WORDS: 1,
OPTIONS_SEARCH_USER_ONLY_FULL_WORDS: 2, OPTIONS_SEARCH_USER_ONLY_FULL_WORDS: 2,
@@ -96,9 +104,11 @@ export const shared_consts = {
SETTRUST: 121, SETTRUST: 121,
REQFRIEND: 125, REQFRIEND: 125,
SETFRIEND: 132, SETFRIEND: 132,
SETHANDSHAKE: 133,
REMOVE_FROM_MYFRIENDS: 144, REMOVE_FROM_MYFRIENDS: 144,
REFUSE_REQ_FRIEND: 145, REFUSE_REQ_FRIEND: 145,
CANCEL_REQ_FRIEND: 146, CANCEL_REQ_FRIEND: 146,
REMOVE_FROM_MYHANDSHAKE: 147,
BLOCK_USER: 155, BLOCK_USER: 155,
UNBLOCK_USER: 156, UNBLOCK_USER: 156,
REPORT_USER: 158, REPORT_USER: 158,
@@ -164,6 +174,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'],
@@ -171,8 +182,8 @@ export const shared_consts = {
TABLES_WITH_SORTING: ['mybachecas', 'myhosps'], TABLES_WITH_SORTING: ['mybachecas', 'myhosps'],
TABLES_REC_ID: ['skills', 'goods', 'subskills', 'myskills', 'mybachecas', 'myhosps', 'mygoods'], TABLES_REC_ID: ['skills', 'goods', 'subskills', 'myskills', 'mybachecas', 'myhosps', 'mygoods'],
// costanti.VISUTABLE_SCHEDA_USER, VISUTABLE_SCHEDA_GROUP, VISUTABLE_USER_TABGROUP, VISUTABLE_USER_TABCIRCUIT // costanti.VISUTABLE_SCHEDA_USER, VISUTABLE_SCHEDA_GROUP, VISUTABLE_USER_TABGROUP, VISUTABLE_USER_TABCIRCUIT, VISUTABLE_GROUP_CIRCUIT
VERTIC_SHOW_GRID: [-1, 2, -3, -4, -5], VERTIC_SHOW_GRID: [-1, 2, -3, -4, -5, -6],
TABLES_UPDATE_LASTIFIED: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'bots'], TABLES_UPDATE_LASTIFIED: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'bots'],
TABLES_FINDER: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups'], TABLES_FINDER: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups'],
@@ -181,6 +192,9 @@ export const shared_consts = {
TABLES_VISU_LISTA_USER: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'users'], TABLES_VISU_LISTA_USER: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'users'],
TABLES_ORDER_DATE_UPDATED: ['myskills', 'myhosps', 'mygoods'],
TABLES_ORDER_DESCR: ['mygroups'],
TABLES_VISU_IMG: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups'], TABLES_VISU_IMG: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups'],
TABLES_DIRECTORY_A_PARTE: ['mygroups'], TABLES_DIRECTORY_A_PARTE: ['mygroups'],
TABLES_WITH_ADMINS: ['mygroups', 'circuits'], TABLES_WITH_ADMINS: ['mygroups', 'circuits'],
@@ -996,6 +1010,9 @@ export const shared_consts = {
StatusNotifs: { StatusNotifs: {
STATUS_FRIENDS_ACCEPTED: 1, STATUS_FRIENDS_ACCEPTED: 1,
STATUS_FRIENDS_REFUSED: 2, STATUS_FRIENDS_REFUSED: 2,
STATUS_FRIENDS_REPORTED: 3,
STATUS_HANDSHAKE_ACCEPTED: 10,
STATUS_HANDSHAKE_REFUSED: 11,
}, },
GroupsNotifs: { GroupsNotifs: {
@@ -1007,6 +1024,21 @@ export const shared_consts = {
STATUS_GROUPS_REMOVED: 7, STATUS_GROUPS_REMOVED: 7,
}, },
CircuitsNotif: {
STATUS_NONE: 0,
STATUS_NEW: 51,
STATUS_ACCEPTED: 53,
STATUS_REFUSED: 54,
STATUS_BLOCKED: 55,
STATUS_DELETED: 56,
STATUS_REMOVED: 57,
STATUS_SENDCOINSREQ: 58,
STATUS_COINS_ACCEPTED: 60,
STATUS_COINS_REFUSED: 61,
STATUS_COINS_ACCEPTED_SENT: 62,
STATUS_COINS_REFUSED_SENT: 63,
},
QualiNotifs: { QualiNotifs: {
CIRCUITS: 1, CIRCUITS: 1,
OTHERS: 2, OTHERS: 2,
@@ -1062,6 +1094,9 @@ export const shared_consts = {
TYPEDIR_MSGS: 7, TYPEDIR_MSGS: 7,
ID_MSGS_NEW_REC: 1, ID_MSGS_NEW_REC: 1,
TYPEDIR_HANDSHAKE: 10,
ID_HANDSHAKE_ACCEPTED: 2,
TYPEDIR_TEST: 444, TYPEDIR_TEST: 444,
ID_TEST_NEW_REC: 1, ID_TEST_NEW_REC: 1,
}, },
@@ -1216,6 +1251,11 @@ export const shared_consts = {
FASE3_MONETA_ABILITATA: 3, FASE3_MONETA_ABILITATA: 3,
}, },
CIRCUIT_PARAMS: {
SCOPERTO_MIN_GRP: 200,
SCOPERTO_MAX_GRP: 400,
},
FontsInstalled: [ FontsInstalled: [
{ {
label: 'Arial', label: 'Arial',
@@ -1276,6 +1316,14 @@ export const shared_consts = {
value: 140, value: 140,
label: 'Dashboard', label: 'Dashboard',
}, },
{
value: 150,
label: 'SendCoinTo',
},
{
value: 280,
label: 'Tutorial',
},
], ],
TypesElemAdminTools: [ TypesElemAdminTools: [
@@ -1307,6 +1355,10 @@ export const shared_consts = {
value: 200, value: 200,
label: 'Presentazione', label: 'Presentazione',
}, },
{
value: 205,
label: 'Attività',
},
{ {
value: 210, value: 210,
label: 'Notifiche in Top', label: 'Notifiche in Top',

View File

@@ -68,7 +68,7 @@ export default defineComponent({
}) })
function created() { function created() {
console.log('created CAccomodation', props.mylist) // console.log('created CAccomodation', props.mylist)
if (isValid(props.mylist)) { if (isValid(props.mylist)) {
// @ts-ignore // @ts-ignore
let myarr: any = props.mylist let myarr: any = props.mylist

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

@@ -24,23 +24,30 @@ export default defineComponent({
const finishLoading = computed(() => globalStore.finishLoading) const finishLoading = computed(() => globalStore.finishLoading)
const deferredPrompt = computed(() => globalStore.deferredPrompt) const deferredPrompt = computed(() => globalStore.deferredPrompt)
const homescreen = computed(() => globalStore.homescreen)
function initprompt() {
window.addEventListener('beforeinstallprompt', (event) => { const viewiOS = ref(false)
event.preventDefault() const viewAndroid = ref(false)
console.log('beforeinstallprompt !')
// Stash the event so it can be triggered later.
globalStore.deferredPrompt = event
})
}
function installApp() { function installApp() {
if (globalStore.deferredPrompt) if (globalStore.deferredPrompt) {
globalStore.deferredPrompt.prompt() globalStore.deferredPrompt.prompt()
// Wait for the user to respond to the prompt
globalStore.deferredPrompt.userChoice.then((choiceResult: any)=>{
if (choiceResult.outcome === 'accepted') {
globalStore.deferredPrompt = null;
// console.log('User accepted the A2HS prompt');
} else {
// console.log('User dismissed the A2HS prompt');
}
});
}
} }
function mounted() { function mounted() {
initprompt()
tools.checkApp() tools.checkApp()
} }
@@ -54,6 +61,9 @@ export default defineComponent({
installApp, installApp,
isAppRunning, isAppRunning,
deferredPrompt, deferredPrompt,
viewiOS,
viewAndroid,
homescreen,
} }
} }
}) })

View File

@@ -1,15 +1,106 @@
<template> <template>
<div v-if="finishLoading && !isAppRunning && deferredPrompt" class="row justify-center"> <div v-if="false && tools.isDebugOn()" class="bg-red text-white">
<span> isAppRunning: {{ isAppRunning }} - </span>
<span> deferredPrompt: {{ deferredPrompt }} - </span>
<span> homescreen: {{ homescreen }} </span>
</div>
<div v-if="finishLoading" class="row justify-center">
<div v-if="!isAppRunning" class="q-ma-sm">
<!-- App not running -->
<q-btn <q-btn
v-if="deferredPrompt"
glossy glossy
size="xl" size="xl"
label="Installa App" label="Installa App"
@click="installApp" @click="installApp"
icon="fas fa-mobile-alt" icon="fas fa-mobile-alt"
color="white" color="green"
text-color="green" text-color="white"
/> ></q-btn>
<div v-else>
<div v-if="$q.platform.is.ios && $q.platform.is.safari && !tools.isDevelop()">
<q-btn
glossy
size="xl"
label="Installa App"
@click="viewiOS = !viewiOS"
icon="fab fa-apple"
color="green"
text-color="white"
></q-btn>
<q-slide-transition>
<!-- Mostra spiegazione per iOS -->
<div v-if="viewiOS">
<q-img
src="images/install_app_on_ios_1.png"
fit="contain"
style="min-width: 350px"
class="q-my-sm"
></q-img
><br />
<q-img
src="images/install_app_on_ios_1b.jpg"
class="q-mb-md"
></q-img
><br />
<q-img
src="images/install_app_on_ios_2.jpg"
fit="contain"
></q-img>
</div>
</q-slide-transition>
</div>
<div v-if="$q.platform.is.android">
<q-btn
v-if="!tools.isDevelop()"
glossy
size="lg"
label="Installa App"
@click="viewAndroid = !viewAndroid"
icon="fab fa-android"
color="green"
text-color="white"
></q-btn>
<q-slide-transition>
<!-- Mostra spiegazione per Android -->
<div v-if="viewAndroid">
<div class="q-ma-sm text-h6"> 1) Cliccare sui 3 puntini verticali<br>
2) Cliccare sulla voce 'Installa App' o 'Schermata Home'<br>
3) Andare sulla schermata HOME e cliccare sull'icona di RISO.
</div>
<q-img
src="images/install_app_on_android_1.jpg"
fit="contain"
style="min-width: 350px"
class="q-my-sm"
></q-img
><br />
<q-img
src="images/install_app_on_android_2.jpg"
fit="contain"
style="min-width: 350px"
class="q-my-sm"
></q-img
><br />
><br />
<q-img
src="images/install_app_on_android_3.jpg"
fit="contain"
style="min-width: 350px"
class="q-my-sm"
></q-img
><br />
</div>
</q-slide-transition>
</div>
</div>
</div>
</div> </div>
<!--<div class="row justify-center"> <!--<div class="row justify-center">
<CBigBtn <CBigBtn

View File

@@ -6,12 +6,18 @@ import { useI18n } from '@/boot/i18n'
import { tools } from '@store/Modules/tools' import { tools } from '@store/Modules/tools'
import { costanti } from '@store/Modules/costanti' import { costanti } from '@store/Modules/costanti'
import { static_data } from '@src/db/static_data' import { static_data } from '@src/db/static_data'
import { CRegistration } from '@/components/CRegistration'
export default defineComponent({ export default defineComponent({
name: 'CCheckIfIsLogged', name: 'CCheckIfIsLogged',
components: { }, components: { CRegistration },
props: {}, props: {
showalways: {
type: Boolean,
required: false,
default: false,
},
},
setup(props, { emit }) { setup(props, { emit }) {
const userStore = useUserStore() const userStore = useUserStore()

View File

@@ -1,40 +1,132 @@
<template> <template>
<div v-if="!tools.isLogged()"> <div v-if="showalways || (!showalways && !tools.isLogged())">
<div class="q-pa-md q-gutter-sm"> <div class="q-pa-md q-gutter-sm">
<div id="logo" class="text-center"> <div id="logo" class="text-center">
<img id="logoimg" :src="tools.getimglogo()" alt="logo APP"> <q-img
id="logoimg"
:src="tools.getimglogo()"
class="q-my-sm"
alt="logo APP"
style="height: 100px; width: 100px"
/>
</div> </div>
<q-banner rounded class="bg-primary text-white"> <q-banner
<div class="text-h6 text-center"> v-if="site.confpages.videoPromo"
Accedi al menu inserendo le tue credenziali per entrare 🔑<br> rounded
<div class="text-center"> dense
<q-btn push color="white" text-color="blue" label="Clicca qui per Accedere" @click="tools.openrighttoolbar()"/> size="lg"
</div> class="bg-grey-3 shadow-5 q-my-sm"
<br> color="primary q-title"
Entra anche nel <a href="https://riso.app/gruppi_territoriali"><strong>Canale e Gruppo Telegram di RISO</strong></a> scegliendo la tua provincia ! style="text-align: center"
</div> >
<br> <div class="mybanner bg-blue text-white">Video di Presentazione:</div>
<br />
<q-video :src="site.confpages.videoPromo" :ratio="16 / 9"> </q-video>
</q-banner> </q-banner>
<q-banner
v-if="site.confpages.PDFPromo"
rounded
dense
size="lg"
class="bg-grey-3 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">PDF Presentazione RISO:</div>
<br />
<template v-slot:action>
<q-btn
type="a"
rounded
icon="fab fa-telegram"
color="primary"
:href="site.confpages.PDFPromo"
target="_blank"
label="Scarica PDF"
>
</q-btn>
</template>
</q-banner>
<div class="text-h6 text-center">
<transition-group
name="fade"
mode="out-in"
appear
enter-active-class="animazione fadeIn"
leave-active-class="animazione fadeOut"
>
<q-banner
:key="1"
rounded
dense
size="lg"
class="shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<template v-slot:avatar>
<q-icon :key="2" name="signal_wifi_off" color="primary" />
</template>
<div class="mybanner" :key="3">
Accedi per Unirti alla RETE e al Circuito di scambio RIS
</div>
<template v-slot:action>
<q-btn
rounded
icon="fas fa-user"
color="primary"
@click="tools.openrighttoolbar()"
>{{ $t('login.enter') }}
</q-btn>
<CRegistration />
</template>
</q-banner>
</transition-group>
<q-banner
rounded
dense
size="lg"
class="shadow-5"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner" :key="3">
👉🏻 Entra nel canale Telegram per unirti al gruppo Provinciale:
</div>
<template v-slot:action>
<q-btn
type="a"
rounded
icon="fab fa-telegram"
color="primary"
href="https://t.me/+pZ40VpmL1NhkZjE0"
target="_blank"
label="Progetto RISO"
>
</q-btn>
</template>
</q-banner>
</div>
<br />
<q-banner rounded class="bg-green-8 text-white"> <q-banner rounded class="bg-green-8 text-white">
<div class="text-h6 text-center"> <div class="text-h6 text-center">
Visualizza la pagina di Aiuto<br> Visualizza la pagina di Aiuto<br />
<div class="text-center"> <div class="text-center">
<q-btn :color="$q.dark.isActive ? `black` : `white`" push glossy :text-color="$q.dark.isActive ? `white` : `black`" label="Pagina Aiuto" to="/faq"/> <q-btn
:color="$q.dark.isActive ? `black` : `white`"
push
glossy
:text-color="$q.dark.isActive ? `white` : `black`"
label="Pagina Aiuto"
to="/istruzioni"
/>
</div> </div>
</div> </div>
</q-banner> </q-banner>
</div> </div>
<div
v-if="!tools.isLogged() && site.confpages.enableReg && site.confpages.showRegButton"
style="margin:20px; text-align: center;">
<q-btn rounded size="lg" color="primary" @click="tools.openrighttoolbar()">{{ $t('login.enter') }}
</q-btn>
</div>
</div> </div>
</template> </template>

View File

View File

@@ -0,0 +1,73 @@
import { tools } from '../../store/Modules/tools'
import { useQuasar } from 'quasar'
import { useI18n } from '@src/boot/i18n'
import { useUserStore } from '@store/UserStore'
import { useGlobalStore } from '@store/globalStore'
import { defineComponent, PropType, ref } from 'vue'
import { IUserFields } from 'model'
import { shared_consts } from '@/common/shared_vuejs'
import { CLabel } from '@/components/CLabel'
import { CSendCoins } from '@/components/CSendCoins'
export default defineComponent({
name: 'CContactUser',
props: {
myuser: {
type: Object as PropType<IUserFields>,
required: true,
},
showBtnActivities: {
type: Boolean,
required: true,
}
},
components: { CLabel, CSendCoins },
setup(props) {
const $q = useQuasar()
const userStore = useUserStore()
const globalStore = useGlobalStore()
const showsendCoinTo = ref(false)
const showingtooltip = ref(false)
function myusername() {
return userStore.my.username
}
function getLinkUserTelegram() {
if (props.myuser) {
if (!!props.myuser.profile.username_telegram) {
return 'https://t.me/' + props.myuser.profile.username_telegram
}
} else {
return ''
}
}
function getLinkWebSite() {
if (props.myuser) {
let mysite = props.myuser.profile.website!
if (mysite) {
if (!mysite.startsWith('http')) {
mysite = 'https://' + mysite
}
}
return mysite
} else {
return ''
}
}
return {
tools,
userStore,
shared_consts,
showsendCoinTo,
getLinkUserTelegram,
getLinkWebSite,
myusername,
showingtooltip,
}
},
})

View File

@@ -0,0 +1,125 @@
<template>
<div class="row justify-evenly items-center q-pa-sm q-ma-sm">
<div class="q-ma-sx">
<q-btn
v-if="getLinkUserTelegram()"
icon="fab fa-telegram"
color="blue"
:type="tools.isUserOk() ? 'a' : 'btn'"
size="md"
rounded
:label="$t('msgs.telegrammsg')"
:href="tools.isUserOk() ? getLinkUserTelegram() : null"
@click="!tools.isUserOk() ? (showingtooltip = !showingtooltip) : false"
target="__blank"
>
</q-btn>
<div v-else-if="myuser.email" class="row q-ma-sx">
<CLabel
v-bind="$attrs"
:copy="true"
:value="tools.isUserOk() ? myuser.email : ''"
:label="$t('reg.email')"
/>
<q-btn
outline
icon="fas fa-envelope"
:color="$q.dark.isActive ? `shite` : `black`"
:type="tools.isUserOk() ? 'a' : 'btn'"
size="md"
:label="$t('msgs.send_email')"
:href="tools.isUserOk() ? tools.getemailto(myuser.email) : null"
@click="
!tools.isUserOk() ? (showingtooltip = !showingtooltip) : false
"
target="__blank"
>
</q-btn>
</div>
</div>
<div class="q-ma-sx">
<q-btn
v-if="
userStore.getMyCircuitsInCommonByUser(myuser).length > 0 &&
((myuser.username !== userStore.my.username) || userStore.hoContiCollettiviDaAmministrare() || userStore.hoContiComunitariDaAmministrare())
"
icon="fas fa-coins"
color="green"
size="md"
rounded
:label="$t('circuit.sendcoins')"
@click="showsendCoinTo = true"
>
</q-btn>
</div>
<div v-if="myuser._id" class="q-ma-sx">
<q-btn
v-if="getLinkWebSite()"
icon="fas fa-globe"
color="blue"
type="a"
size="md"
rounded
:label="$t('reg.website')"
:href="tools.isUserOk() ? getLinkWebSite() : null"
@click="!tools.isUserOk() ? (showingtooltip = !showingtooltip) : false"
target="__blank"
>
</q-btn>
</div>
</div>
<div class="myrow justify-evenly items-center q-pa-sm q-ma-sm">
<div v-if="myuser._id" class="col-12">
<q-btn
v-if="myuser.username === myusername()"
icon="fas fa-link"
color="blue"
size="md"
rounded
:label="$t('reg.link_reg_and_msg')"
@click="
tools.sendMsgTelegramCmd(
$q,
$t,
shared_consts.MsgTeleg.SHARE_MSGREG,
true
);
"
>
</q-btn>
</div>
<div
v-if="showBtnActivities"
class="col-md-6 col-sm-6 q-ma-xs col-xs-12 text-center"
>
<q-btn
icon="fas fa-house-user"
size="md"
color="orange"
:label="$t('profile.myactivities')"
:to="`/attivita/` + myuser.username"
>
</q-btn>
</div>
<q-tooltip v-if="showingtooltip" class="bg-red text-body2 text-bold" :offset="[10, 10]" v-model="showingtooltip"
>Per contattare la persona:<br />Entra ed Accedi a RISO</q-tooltip
>
</div>
<div v-if="showsendCoinTo">
<CSendCoins
:showprop="showsendCoinTo"
:to_user="myuser"
@close="showsendCoinTo = false"
>
</CSendCoins>
</div>
</template>
<script lang="ts" src="./CContactUser.ts">
</script>
<style lang="scss" scoped>
@import './CContactUser.scss';
</style>

View File

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

View File

View File

@@ -0,0 +1,122 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { tools } from '@src/store/Modules/tools'
import { date, useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { CCurrencyValue } from '@/components/CCurrencyValue'
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { costanti } from '@costanti'
export default defineComponent({
name: 'CCurrencyV2',
components: { CCurrencyValue, CMyFieldDb },
emits: ['save'],
props: {
small: {
type: Boolean,
default: false,
},
label: {
type: String,
required: false,
default: '',
},
tips: {
type: String,
required: false,
default: '',
},
readonly: {
type: Boolean,
required: false,
default: false,
},
symbol: {
type: String,
required: true,
},
color: {
type: String,
required: false,
default: '',
},
color_border: {
type: String,
required: false,
default: '',
},
icon: {
type: String,
required: false,
default: '',
},
modelValue: {
type: [String, Number],
required: true,
default: '',
},
valueextra: {
type: String,
required: false,
default: '',
},
paramTypeAccount: {
type: Number,
required: false,
default: 0,
},
myrecparam: {
type: Object,
required: false,
default: null,
},
admin: {
type: Boolean,
required: false,
default: false,
},
},
setup(props, { emit }) {
const $q = useQuasar()
const { t } = useI18n()
const changeParamValue = ref(false)
const showingtooltip = ref(false)
const myvalue = ref(<any>null)
function created() {
// created
myvalue.value = props.modelValue
}
function changedParamValue(value: boolean) {
changeParamValue.value = value
}
function save(value: any) {
// ricarico
emit('save', value)
myvalue.value = value
}
onMounted(created)
return {
showingtooltip,
t,
tools,
changeParamValue,
changedParamValue,
costanti,
save,
myvalue,
}
},
})

View File

@@ -0,0 +1,47 @@
<template>
<div v-if="myrecparam">
<CCurrencyValue
:symbol="symbol"
:color="color"
:color_border="color_border"
v-model="myvalue"
:icon="icon"
:label="label"
:tips="tips"
:paramTypeAccount="paramTypeAccount"
:myrecparam="myrecparam"
@changedParamValue="changedParamValue"
:admin="admin"
>
</CCurrencyValue>
</div>
<q-dialog v-model="changeParamValue">
<q-card class="dialog_card">
<q-toolbar class="bg-primary text-white">
<q-toolbar-title class="text-h7">
{{ $t('account.settings') }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<CMyFieldDb
v-if="myrecparam"
table="accounts"
:title="tools.getStrByParamTypeAccount(paramTypeAccount)"
:id="myrecparam._id"
:rec="myrecparam"
:mykey="tools.getFieldByParamTypeAccount(paramTypeAccount)"
:type="tools.getTypeByParamTypeAccount(paramTypeAccount)"
@save="save"
/>
</q-card-section>
</q-card>
</q-dialog>
</template>
<script lang="ts" src="./CCurrencyV2.ts">
</script>
<style lang="scss" scoped>
@import './CCurrencyV2.scss';
</style>

View File

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

View File

@@ -4,9 +4,18 @@ import { tools } from '@src/store/Modules/tools'
import { date, useQuasar } from 'quasar' import { date, useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n' import { useI18n } from '@/boot/i18n'
import { costanti } from '@costanti'
export default defineComponent({ export default defineComponent({
name: 'CCurrencyValue', name: 'CCurrencyValue',
components: { },
emits: ['changedParamValue' ],
props: { props: {
modelValue: {
type: [String, Number],
required: false,
default: '',
},
small: { small: {
type: Boolean, type: Boolean,
default: false, default: false,
@@ -45,17 +54,27 @@ export default defineComponent({
required: false, required: false,
default: '', default: '',
}, },
value: {
type: Number,
required: true,
},
valueextra: { valueextra: {
type: String, type: String,
required: false, required: false,
default: '', default: '',
}, },
paramTypeAccount: {
type: Number,
required: false,
default: 0,
},
myrecparam: {
type: Object,
required: false,
default: null,
},
admin: {
type: Boolean,
required: false,
default: false,
},
}, },
components: {},
setup(props, { emit }) { setup(props, { emit }) {
const $q = useQuasar() const $q = useQuasar()
const { t } = useI18n() const { t } = useI18n()
@@ -66,13 +85,13 @@ export default defineComponent({
// created // created
} }
onMounted(created) onMounted(created)
return { return {
showingtooltip, showingtooltip,
t, t,
tools, tools,
costanti,
} }
}, },
}) })

View File

@@ -1,19 +1,52 @@
<template> <template>
<div v-if="small"> <div v-if="small">
<q-chip <q-chip
dense class="cltexth4 chipbooked shadow-5 q-pa-sm2" dense
class="cltexth4 chipbooked shadow-5 q-pa-sm2"
size="md" size="md"
:color="value > 0 ? `green` : value === 0 ? `gray` : `red`" text-color="white" :color="modelValue > 0 ? `green` : modelValue === 0 ? `gray` : `red`"
icon="fas fa-coins"> text-color="white"
{{ tools.roundDec2(value) }} <span class="text-currency">&nbsp;<em class="q-pa-xxs text-white rounded-borders shadow-2" :style="`background-color: ` + (color ? color : '#ff5500')">{{ symbol }}</em></span> icon="fas fa-coins"
>
{{ tools.roundDec2(modelValue) }}
<span class="text-currency"
>&nbsp;<em
class="q-pa-xxs text-white rounded-borders shadow-2"
:style="`background-color: ` + (color ? color : '#ff5500')"
>{{ symbol }}</em
></span
>
</q-chip> </q-chip>
</div> </div>
<div v-else> <div v-else>
<div v-if="value !== null" :class="`text-h5 ` + small ? `bordo_stondato_small`: `bordo_stondato_stretto` + ` full-width`" <div
:style="(!$q.screen.lt.sm && !small ? `min-width: 250px; ` : small ? ` max-width: 120px;` : ``) + (color_border ? `border-color: ` + color_border + `!important;`: '')"> v-if="modelValue !== null"
<div class="text-center text-h7-dense text-italic text-grey-14"> :class="
`text-h5 ` +
(small ? `bordo_stondato_small` : `bordo_stondato_stretto`) +
` full-width`
"
:style="
(!$q.screen.lt.sm && !small
? `min-width: 250px; `
: small
? ` max-width: 120px;`
: ``) +
(color_border ? `border-color: ` + color_border + `!important;` : '')
"
>
<div
:class="
`text-center text-h7-dense text-italic ` +
($q.dark.isActive ? `text-grey-6` : `text-grey-14`)
"
>
<span v-if="small"> <span v-if="small">
<em class="q-px-xs text-white rounded-borders" :style="`background-color: ` + (color ? color : '#ff5500')">{{ symbol }}</em> <em
class="q-px-xs text-white rounded-borders"
:style="`background-color: ` + (color ? color : '#ff5500')"
>{{ symbol }}</em
>
</span> </span>
<span v-else>{{ label }}</span> <span v-else>{{ label }}</span>
</div> </div>
@@ -24,36 +57,51 @@
:readonly="readonly" :readonly="readonly"
type="number" type="number"
rounded rounded
:class="!small ? `q-px-sm text-h5`: `q-px-xs text-h7`" :class="!small ? `q-px-sm text-h5` : `q-px-xs text-h7`"
:color="value > 0 ? `green` : `red`" :color="modelValue > 0 ? `green` : `red`"
> >
<template v-slot:prepend> <template v-slot:prepend>
<!--<img src="https://cdn.quasar.dev/logo-v2/svg/logo.svg">--> <!--<img src="https://cdn.quasar.dev/logo-v2/svg/logo.svg">-->
<q-btn v-if="tips && !small" <q-btn
v-if="tips && !small"
icon="fas fa-info" icon="fas fa-info"
color="primary" text-color="white" color="primary"
text-color="white"
round round
size="sm" size="sm"
@click="showingtooltip = !showingtooltip" @click="showingtooltip = !showingtooltip"
> >
</q-btn> </q-btn>
<q-icon v-else name="fas fa-coins" :size="small ? `xs`: `sm`"/> <q-icon v-else name="fas fa-coins" :size="small ? `xs` : `sm`" />
</template> </template>
<template v-slot:control> <template v-slot:control>
<div :class="`align_elem_right `+ small ? `text-h7` : ``">{{ valueextra }}{{ tools.roundDec2(value) }} <div :class="`align_elem_right ` + (small ? `text-h7` : ``)">
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{ tips }}</q-tooltip> {{ valueextra }}{{ tools.roundDec2(modelValue) }}
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{
tips
}}</q-tooltip>
</div> </div>
</template> </template>
<template v-slot:append> <template v-slot:append>
<div v-if="!small" :class="small ? `text-h7-dense` : `text-h7`"> <div v-if="!small" :class="small ? `text-h7-dense` : `text-h7`">
<em class="q-px-sm text-white rounded-borders" :style="`background-color: ` + (color ? color : '#ff5500')">{{ symbol }}</em> <em
class="q-px-sm text-white rounded-borders"
:style="`background-color: ` + (color ? color : '#ff5500')"
>{{ symbol }}</em
>
</div>
<div v-if="paramTypeAccount && admin">
<q-btn
flat
round
icon="fas fa-pencil-alt"
size="sm"
@click="$emit('changedParamValue', true)"
></q-btn>
</div> </div>
</template> </template>
</q-field> </q-field>
</div> </div>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -20,7 +20,7 @@
} }
.progress-base { .progress-base {
height: 8px; height: 5px;
border-radius: 3px; border-radius: 3px;
background-color: #e9ecef; background-color: #e9ecef;
} }

View File

@@ -1,6 +1,9 @@
<template> <template>
<div class="q-ma-md"> <div class="q-ma-xs">
<div class="row q-my-md shadow" style="border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.12);"> <div
class="row q-my-sm shadow"
style="border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.12)"
>
<!--<div class="col-md-3 col-lg-3 col-sm-12 col-xs-12 box_4" style="border-left: 1px solid #efefef;" <!--<div class="col-md-3 col-lg-3 col-sm-12 col-xs-12 box_4" style="border-left: 1px solid #efefef;"
v-bind:class="{'border-top': $q.platform.is.mobile}"> v-bind:class="{'border-top': $q.platform.is.mobile}">
<q-card class="no-shadow q-pa-sm"> <q-card class="no-shadow q-pa-sm">
@@ -28,53 +31,110 @@
</q-card> </q-card>
</div>--> </div>-->
<div v-for="(rec, index) of visustat" :class="`col-md-3 col-lg-3 col-sm-6 col-xs-6 text-` + rec.color" <div
style="border-left: 1px solid #efefef;" :key="index" v-for="(rec, index) of visustat"
:class="`col-md-3 col-lg-3 col-sm-6 col-xs-6 text-` + rec.color"
style="border-left: 1px solid #efefef"
:key="index"
> >
<q-card class="no-shadow q-pa-sm"> <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 class="text-h4" style="font-weight: 500;letter-spacing: 3px;"> <q-item-label
{{ calcstat.numByTab[rec.table] }} :class="
</q-item-label> (!$q.dark.isActive ? 'text-grey-9' : 'text-white') +
<q-item-label :class="(!$q.dark.isActive? 'text-grey-7':'text-white') + ` title_view_shadow`" style="letter-spacing: 1px;"> ` title_view_shadow`
"
style="letter-spacing: 1px"
>
{{ rec.title }} {{ rec.title }}
</q-item-label> </q-item-label>
<q-item-label lines="3" no-wrap
v-if="rec.subtitle"
:class="
(!$q.dark.isActive ? 'text-grey-8' : 'text-white') +
` title_view_subtitle`
"
>
<span v-html="rec.subtitle"></span>
</q-item-label>
</q-item-section> </q-item-section>
<q-item-section side> <q-item-section side class="small_side" style="right: 4px; position: absolute; ">
<q-icon :name="rec.icon" :class="`text-` + rec.color" size="50px"></q-icon> <q-img v-if="rec.image" :src="rec.image" style="width: 27px;"></q-img>
<q-icon
v-else
:name="rec.icon"
:class="`text-` + rec.color"
size="27px"
></q-icon>
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-item class="q-py-xs" style="min-height: unset"> <q-item class="q-py-xs" style="min-height: unset">
<q-item-section> <q-item-section>
<div class="progress-base q-my-sm"> <div class="progress-base q-my-sm">
<div class="progress-base" :style="tools.getbackgroundGradient(rec.color, 45)"></div> <div
class="progress-base"
:style="tools.getbackgroundGradient(rec.color, 45)"
></div>
</div> </div>
</q-item-section> </q-item-section>
</q-item> </q-item>
</q-card> </q-card>
</div> </div>
</div> </div>
<div class="row q-my-md shadow" style="border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.12);">
<div v-for="(rec, index) of visulinks" :class="`col-md-3 col-lg-3 col-sm-6 col-xs-6 text-` + rec.color" <div class="row" style="margin-top: 4px important; font-size: 0.75rem">
style="border-left: 1px solid #efefef;" :key="index" &nbsp;
</div>
<div
class="row q-my-md shadow"
style="border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.12)"
> >
<q-card class="no-shadow q-pa-sm"> <div
<q-item class="q-pb-none q-pt-xs cursor-pointer" :to="rec.to"> v-for="(rec, index) of visulinks"
:class="`col-md-3 col-lg-3 col-sm-6 col-xs-6 text-` + rec.color"
style="border-left: 1px solid #efefef"
:key="index"
>
<q-card class="no-shadow q-pa-xxs">
<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 :class="(!$q.dark.isActive? 'text-grey-7':'text-white') + ` title_view_shadow`" style="letter-spacing: 0.5px;"> <q-item-label lines="3"
:class="
(!$q.dark.isActive ? 'text-grey-9' : 'text-white') +
` title_view_small_shadow`
"
style="letter-spacing: 0.5px"
>
{{ rec.title }} {{ rec.title }}
</q-item-label> </q-item-label>
<q-item-label
v-if="rec.subtitle"
:class="
(!$q.dark.isActive ? 'text-grey-8' : 'text-white') +
` title_view_subtitle`
"
style="letter-spacing: 0.2px"
>
<span v-html="rec.subtitle"></span>
</q-item-label>
</q-item-section> </q-item-section>
<q-item-section side> <q-item-section side>
<q-icon :name="rec.icon" :class="`text-` + rec.color" size="50px"></q-icon> <q-img v-if="rec.image" :src="rec.image" style="width: 35px"></q-img>
<q-icon
v-else
:name="rec.icon"
:class="`text-` + rec.color"
size="20px"
></q-icon>
</q-item-section> </q-item-section>
</q-item> </q-item>
</q-card> </q-card>
</div> </div>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -1062,7 +1062,7 @@
<div class="q-mt-md"> <div class="q-mt-md">
<div v-if="!mysingleevent && getNumEvents() > 0"> <div v-if="!mysingleevent && getNumEvents() > 0">
<p class="text-subtitle1 text-red bg-amber text-center"> <p class="text-subtitle1 text-white bg-primary text-center">
LISTA PROSSIMI LISTA PROSSIMI
<span v-if="showfirstN > 0">{{ showfirstN }}</span> EVENTI: <span v-if="showfirstN > 0">{{ showfirstN }}</span> EVENTI:
</p> </p>
@@ -1227,7 +1227,7 @@
<q-btn <q-btn
:text-color="$q.dark.isActive ? `white` : `black`" :text-color="$q.dark.isActive ? `white` : `black`"
icon="fas fa-share-alt" icon="fas fa-link"
label="Condividi" label="Condividi"
@click="condividipag(`/event/${event.typol}/${event._id}`)" @click="condividipag(`/event/${event.typol}/${event._id}`)"
></q-btn> ></q-btn>
@@ -1248,9 +1248,9 @@
<p <p
:class=" :class="
`listaev__details` + $q.dark.isActive `listaev__details` + ($q.dark.isActive
? `_darktheme` ? `_darktheme`
: `` : ``)
" "
v-html="event.details" v-html="event.details"
></p> ></p>

View File

@@ -144,6 +144,14 @@ 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()
else if (shared_consts.TABLES_ORDER_DATE_UPDATED.includes(props.table))
return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 0, rowsPerPage: 10 } // date_updated
else if (shared_consts.TABLES_ORDER_DESCR.includes(props.table))
return { sortBy: 'desc', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 }
return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 } return { sortBy: 'date_created', descending: true, page: 1, rowsNumber: 20, rowsPerPage: 20 }
}) })
@@ -180,32 +188,32 @@ export default defineComponent({
const hint = computed(() => { const hint = computed(() => {
if (props.table === toolsext.TABMYGOODS) if (props.table === toolsext.TABMYGOODS)
return 'nome del Bene o settore da cercare' return 'digita il nome del Bene o del settore'
else if (props.table === toolsext.TABMYSKILLS) else if (props.table === toolsext.TABMYSKILLS)
return 'nome del Servizio o settore da cercare' return 'digita il nome del Servizio o del settore'
else if (props.table === toolsext.TABMYGROUPS) else if (props.table === toolsext.TABMYGROUPS)
return 'nome del Gruppo da cercare' return 'digita il nome del Gruppo'
else if (props.table === toolsext.TABCIRCUITS) else if (props.table === toolsext.TABCIRCUITS)
return 'nome del Circuito da cercare' return 'digita il nome della provincia'
else if (props.table === toolsext.TABMYBACHECAS) else if (props.table === toolsext.TABMYBACHECAS)
return 'nome dell\'Evento da cercare' return 'digita il nome dell\'Evento'
else if (props.table === toolsext.TABMYHOSPS) else if (props.table === toolsext.TABMYHOSPS)
return 'nome dell\'Ospitalità da cercare' return 'digita delle parole da cercare nella descrizione dell\'Ospitalità'
return 'nome da cercare' return 'digita una parola da cercare'
}) })
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(() => {
@@ -601,7 +609,8 @@ export default defineComponent({
table: 'regions', table: 'regions',
key: 'idReg', key: 'idReg',
type: costanti.FieldType.select, type: costanti.FieldType.select,
value: tools.getCookie(tools.COOK_SEARCH + 'regions', costanti.FILTER_TUTTI), value: tools.getCookie(tools.COOK_SEARCH + 'regions_hosp', costanti.FILTER_TUTTI),
keycookie: '_hosp',
addall: true, addall: true,
arrvalue: [], arrvalue: [],
filter: null, filter: null,
@@ -613,7 +622,8 @@ export default defineComponent({
table: 'provinces', table: 'provinces',
key: 'idProvince', key: 'idProvince',
type: costanti.FieldType.select, type: costanti.FieldType.select,
value: tools.getCookie(tools.COOK_SEARCH + 'provinces', costanti.FILTER_TUTTI), value: tools.getCookie(tools.COOK_SEARCH + 'provinces_hosp', costanti.FILTER_TUTTI),
keycookie: '_hosp',
addall: true, addall: true,
arrvalue: [], arrvalue: [],
filter: getFilterProvinceByRegion, filter: getFilterProvinceByRegion,
@@ -625,7 +635,8 @@ export default defineComponent({
table: 'cities', table: 'cities',
key: 'idCity', key: 'idCity',
type: costanti.FieldType.select_by_server, type: costanti.FieldType.select_by_server,
value: tools.getCookie(tools.COOK_SEARCH + 'cities', costanti.FILTER_TUTTI), value: tools.getCookie(tools.COOK_SEARCH + 'cities_hosp', costanti.FILTER_TUTTI),
keycookie: '_hosp',
addall: true, addall: true,
arrvalue: [], arrvalue: [],
useinput: true, useinput: true,
@@ -634,18 +645,6 @@ export default defineComponent({
// param1: shared_consts.PARAM_SHOW_PROVINCE, // param1: shared_consts.PARAM_SHOW_PROVINCE,
tablesel: 'cities', tablesel: 'cities',
}, },
{
label: 'Visiblità',
table: 'pub_to_share',
key: 'pub_to_share',
type: costanti.FieldType.select,
value: tools.getCookie(tools.COOK_SEARCH + 'pub_to_share', shared_consts.PUBTOSHARE.ALL, true),
addall: false,
arrvalue: [],
useinput: true,
filter: null,
tablesel: 'pub_to_share',
},
{ {
label: 'Tipologia', label: 'Tipologia',
table: toolsext.TABTYPEHOSP, table: toolsext.TABTYPEHOSP,
@@ -1042,6 +1041,7 @@ export default defineComponent({
mycities: 1, mycities: 1,
sector: 1, sector: 1,
recCatGrp: 1, recCatGrp: 1,
} }
}, },
lookup3: { lookup3: {
@@ -1099,6 +1099,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,
@@ -1115,6 +1116,8 @@ export default defineComponent({
status: 1, status: 1,
transactionsEnabled: 1, transactionsEnabled: 1,
qta_max_default: 1, qta_max_default: 1,
fido_scoperto_default_grp: 1,
qta_max_default_grp: 1,
valuta_per_euro: 1, valuta_per_euro: 1,
symbol: 1, symbol: 1,
idCity: 1, idCity: 1,
@@ -1239,7 +1242,7 @@ export default defineComponent({
username: 1, username: 1,
name: 1, name: 1,
surname: 1, surname: 1,
lasttimeonline: 1, lasttimeonline: 1,
comune: 1, comune: 1,
mycities: 1, mycities: 1,
'profile.img': 1, 'profile.img': 1,
@@ -1310,7 +1313,7 @@ lasttimeonline: 1,
username: 1, username: 1,
name: 1, name: 1,
surname: 1, surname: 1,
lasttimeonline: 1, lasttimeonline: 1,
comune: 1, comune: 1,
mycities: 1, mycities: 1,
'profile.img': 1, 'profile.img': 1,
@@ -1358,7 +1361,7 @@ lasttimeonline: 1,
username: 1, username: 1,
name: 1, name: 1,
surname: 1, surname: 1,
lasttimeonline: 1, lasttimeonline: 1,
comune: 1, comune: 1,
mycities: 1, mycities: 1,
'profile.img': 1, 'profile.img': 1,
@@ -1388,6 +1391,14 @@ lasttimeonline: 1,
} }
} }
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()
@@ -1437,6 +1448,7 @@ lasttimeonline: 1,
hint, hint,
strextra, strextra,
myoptions, myoptions,
mySortFieldsAvailable,
} }
}, },
}) })

View File

@@ -15,7 +15,6 @@
<q-input <q-input
v-model="search" v-model="search"
filled filled
dense
type="search" type="search"
debounce="500" debounce="500"
:hint="t('finder.search_skill')" :hint="t('finder.search_skill')"
@@ -23,7 +22,6 @@
> >
<template v-slot:after> <template v-slot:after>
<q-btn <q-btn
dense
label="" label=""
color="primary" color="primary"
@click="doSearch" @click="doSearch"
@@ -49,6 +47,7 @@
:nodataLabel="noMsgRecord" :nodataLabel="noMsgRecord"
:prop_search="true" :prop_search="true"
:finder="true" :finder="true"
labelElemFind="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 +55,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

@@ -62,6 +62,11 @@ export default defineComponent({
required: false, required: false,
default: '', default: '',
}, },
prop_showfilter: {
type: Boolean,
required: false,
default: false,
},
hint: { hint: {
type: String, type: String,
required: false, required: false,
@@ -102,6 +107,11 @@ export default defineComponent({
required: false, required: false,
default: false, default: false,
}, },
finder_noNullFilters: {
type: Boolean,
required: false,
default: false,
},
vertical: { vertical: {
type: Number, type: Number,
required: false, required: false,
@@ -197,6 +207,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,
@@ -246,6 +268,21 @@ export default defineComponent({
required: false, required: false,
default: '', default: '',
}, },
noaut: {
type: Boolean,
required: false,
default: false,
},
hidetitleIfEmpty: {
type: Boolean,
required: 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,
@@ -277,6 +314,7 @@ export default defineComponent({
const search = ref('') const search = ref('')
const tablesel = ref('') const tablesel = ref('')
const showSpin = ref(false)
const loading = ref(false) const loading = ref(false)
const editOn = computed({ const editOn = computed({
@@ -335,6 +373,9 @@ export default defineComponent({
const myvertical = ref(props.vertical) const myvertical = ref(props.vertical)
const ordinam = ref('')
const ordinam_desc = ref(false)
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)
@@ -396,6 +437,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 = getObjSort(ordinam.value, ordinam_desc.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')
}) })
@@ -511,7 +560,11 @@ export default defineComponent({
function searchval(newval: any, table: any) { function searchval(newval: any, table: any) {
console.log('REFRR searchval', newval, table) console.log('REFRR searchval', newval, table)
tools.setCookie(tools.COOK_SEARCH + table, newval) const myrecfilt = searchList.value.find((rec) => rec.table === table)
let keycookie = tools.COOK_SEARCH + table
if (myrecfilt && myrecfilt.keycookie)
keycookie += myrecfilt.keycookie
tools.setCookie(keycookie, newval)
if (table === toolsext.TABSKILLS) { if (table === toolsext.TABSKILLS) {
const recSector = searchList.value.find((rec) => rec.table === 'sectors') const recSector = searchList.value.find((rec) => rec.table === 'sectors')
@@ -570,12 +623,65 @@ 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;
}
function getObjSort(sortBy: any, descending: any) {
let myobj: any = {}
if (tools.isObject(sortBy)) {
return sortBy
} else if (sortBy) {
sortBy = sortBy + ''
descending = descending + ''
let arrsort = (sortBy && sortBy.indexOf(',') > 0) ? sortBy.split(',') : [];
let arrdescending = (descending && descending.lenght > 1 && descending.indexOf(',') > 0) ? descending.split(',') : [];
if (arrsort.length > 0) {
for (let i = 0; i < arrsort.length; i++) {
let field = arrsort[i].trim()
let risdesc = (tools.isArray(arrdescending) && (arrdescending.length > i)) ? parseInt(arrdescending[i].trim()) : 1;
myobj[field] = getOrderByField(field, risdesc)
}
} else {
myobj[sortBy] = getOrderByField(sortBy, descending ? -1 : 1)
}
}
return myobj
}
function getNumFilterSelected(): number {
let numfilter = 0
for (const item of searchList.value) {
if (!item.notinsearch) {
if (item.value && item.value !== -100) {
console.log(item.label, item.value)
numfilter++
}
}
}
return numfilter
}
// 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')
// console.log('sortBy', sortBy)
let myobj: any = {} let myobj: any = {}
if (sortBy) { if (tools.isObject(sortBy)) {
myobj = sortBy
} else if (tools.isArray(sortBy)) {
myobj = getObjSort(sortBy, descending)
} else if (sortBy) {
myobj = {} myobj = {}
if (descending) { if (descending) {
myobj[sortBy] = -1 myobj[sortBy] = -1
@@ -584,8 +690,6 @@ export default defineComponent({
} }
} }
// console.log('sortBy', sortBy)
const filtersearch: any[] = [] const filtersearch: any[] = []
const filtersearch2: any[] = [] const filtersearch2: any[] = []
const filtersearch3or: any[] = [] const filtersearch3or: any[] = []
@@ -809,7 +913,7 @@ export default defineComponent({
}*/ }*/
} }
// if ((false && nosearch && props.finder) || (props.finder_noNull && nosearch)) { // if ((false && nosearch && props.finder) || (props.finder_noNull && nosearch)) {
if (props.finder_noNull && nosearch) { if ((props.finder_noNull || (props.finder_noNullFilters && getNumFilterSelected() === 0)) && nosearch) {
returnedData.value = [] returnedData.value = []
returnedCount = 0 returnedCount = 0
return true return true
@@ -841,10 +945,10 @@ 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,
noaut: props.noaut,
} }
params.codeId = mycodeid.value params.codeId = mycodeid.value
@@ -931,10 +1035,13 @@ export default defineComponent({
// don't forfunction to update local pagination object // don't forfunction to update local pagination object
pagination.value.page = page pagination.value.page = page
pagination.value.rowsPerPage = rowsPerPage pagination.value.rowsPerPage = rowsPerPage
//pagination.value.sortBy = getObjSort(sortBy, descending)
pagination.value.sortBy = sortBy pagination.value.sortBy = sortBy
ordinam.value = sortBy
ordinam_desc.value = descending
pagination.value.descending = descending pagination.value.descending = descending
console.log('pagination', pagination) // console.log('pagination', pagination)
// ...and turn of loading indicator // ...and turn of loading indicator
loading.value = false loading.value = false
@@ -945,10 +1052,17 @@ 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
descending = ordinam_desc.value
}
sortBy = getObjSort(sortBy, descending)
savefilter() savefilter()
if (!mytable.value) { if (!mytable.value) {
@@ -999,7 +1113,9 @@ export default defineComponent({
// don't forfunction to update local pagination object // don't forfunction to update local pagination object
pagination.value.page = page pagination.value.page = page
pagination.value.rowsPerPage = rowsPerPage pagination.value.rowsPerPage = rowsPerPage
pagination.value.sortBy = sortBy pagination.value.sortBy = getObjSort(sortBy, descending)
ordinam.value = sortBy
ordinam_desc.value = descending
pagination.value.descending = descending pagination.value.descending = descending
// console.log('pagination', pagination) // console.log('pagination', pagination)
@@ -1391,6 +1507,17 @@ export default defineComponent({
tablesel.value = mytable.value tablesel.value = mytable.value
} }
if (!shared_consts.TABLES_ORDER_DATE_UPDATED.includes(tablesel.value) &&
!shared_consts.TABLES_ORDER_DESCR.includes(tablesel.value)) {
console.log('get cookie)')
let v1 = tools.getCookie('s_ordinam_' + tablesel.value, null)
if (v1)
ordinam.value = v1
let v2 = tools.getCookie('s_ordinam_des_' + tablesel.value, null)
if (v2)
ordinam_desc.value = v2
}
// console.log('2) tablesel', tablesel.value) // console.log('2) tablesel', tablesel.value)
changeTable(tablesel.value) changeTable(tablesel.value)
@@ -1650,6 +1777,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()) {
@@ -2172,6 +2303,12 @@ export default defineComponent({
showNotification, showNotification,
editOn, editOn,
newRecordBoolOld, newRecordBoolOld,
showSpin,
userStore,
doSort,
ordinam,
ordinam_desc,
getNumFilterSelected,
} }
} }
}) })

View File

@@ -1,7 +1,5 @@
<template> <template>
<div v-if="tools.isDebugOn()"> <div v-if="tools.isDebugOn()"></div>
</div>
<div :class="$q.screen.lt.sm ? `` : `q-pa-xs`" v-if="isfinishLoading"> <div :class="$q.screen.lt.sm ? `` : `q-pa-xs`" v-if="isfinishLoading">
<q-toggle <q-toggle
v-if="tools.isManager()" v-if="tools.isManager()"
@@ -10,7 +8,11 @@
icon="fas fa-pencil-alt" icon="fas fa-pencil-alt"
> >
</q-toggle> </q-toggle>
<div class="centermydiv q-my-sm" style="text-align: center"> <div
v-if="mytable && visButtRow()"
class="centermydiv q-my-sm"
style="text-align: center"
>
<q-btn <q-btn
v-if="mytable && visButtRow()" v-if="mytable && visButtRow()"
rounded rounded
@@ -26,7 +28,9 @@
v-if="butt_modif_new || mytitle" v-if="butt_modif_new || mytitle"
:class="$q.screen.lt.sm ? `` : `q-gutter-md q-ma-xs` + ` row`" :class="$q.screen.lt.sm ? `` : `q-gutter-md q-ma-xs` + ` row`"
> >
<div class="q-table__title" style="min-width: 150px">{{ mytitle }}</div> <div class="q-table__title" style="min-width: 150px">
{{ mytitle }}
</div>
<q-space></q-space> <q-space></q-space>
<div v-if="butt_modif_new"> <div v-if="butt_modif_new">
<q-btn <q-btn
@@ -46,6 +50,7 @@
<q-btn <q-btn
v-if="mytable && labelBtnAddExtra" v-if="mytable && labelBtnAddExtra"
rounded rounded
outline
size="md" size="md"
color="primary" color="primary"
class="centermydiv q-mb-sm" class="centermydiv q-mb-sm"
@@ -73,7 +78,7 @@
--> -->
</div> </div>
<q-slide-transition> <q-slide-transition>
<div v-show="showfilter"> <div v-show="showfilter || prop_showfilter">
<div <div
v-show="searchList" v-show="searchList"
:class="$q.screen.lt.sm ? `` : `row` + ` text-blue `" :class="$q.screen.lt.sm ? `` : `row` + ` text-blue `"
@@ -244,7 +249,9 @@
color="positive" color="positive"
icon="fas fa-filter" icon="fas fa-filter"
@click="showfilter = !showfilter" @click="showfilter = !showfilter"
></q-btn> ><q-badge v-if="getNumFilterSelected()" color="red" floating transparent> {{ getNumFilterSelected() }} </q-badge>
</q-btn>
<q-btn <q-btn
dense dense
color="orange" color="orange"
@@ -252,7 +259,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=""
@@ -294,7 +315,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="">
@@ -384,6 +405,7 @@
:prop_myrec="row" :prop_myrec="row"
@cmdext="cmdExt" @cmdext="cmdExt"
:editOn="editOn" :editOn="editOn"
:margin_right="margin_right"
> >
</CMyRecCard> </CMyRecCard>
</div> </div>
@@ -419,16 +441,18 @@
v-else-if=" v-else-if="
(showType === costanti.SHOW_GROUPINFO && (showType === costanti.SHOW_GROUPINFO &&
myvertical !== costanti.VISUTABLE_SCHEDA_GROUP) || myvertical !== costanti.VISUTABLE_SCHEDA_GROUP) ||
(myvertical === 2 && tablesel === 'mygroups') (myvertical === 2 && tablesel === 'mygroups') ||
myvertical === costanti.VISUTABLE_GROUP_CIRCUIT
" "
class="fill-all-width" class="fill-all-width"
> >
<div> <div>
<CMyGroups <CMyGroups
v-model="filtergrp" v-model="filtergrp"
:circuitname="circuitname"
:finder="false" :finder="false"
:mygrp="row" :mygrp="row"
:visu="costanti.FIND_GROUP" :visu="visufind ? visufind : costanti.FIND_GROUP"
/> />
</div> </div>
</div> </div>
@@ -438,16 +462,21 @@
" "
> >
<div class="q-pa-xs row items-start q-gutter-xs"> <div class="q-pa-xs row items-start q-gutter-xs">
<q-card <q-card class="my-card text-black">
class="my-card text-white"
:style="
`background: radial-gradient(circle, #cccccc 0%, ` +
(tools.isEntrataByRecMov(row) ? `#aaffaa` : `#ffaaaa`) +
` 100%)`
"
>
<q-toolbar class="bg-primary text-white" style="min-height: 30px"> <q-toolbar class="bg-primary text-white" style="min-height: 30px">
<q-toolbar-title> <q-toolbar-title>
<span class="q-ma-sm">
<q-icon
v-if="tools.isEntrataByRecMov(row)"
name="fas fa-box-tissue"
color="green"
></q-icon>
<q-icon
v-else
name="fas fa-share-square"
color="red"
></q-icon>
</span>
{{ {{
tools.isEntrataByRecMov(row) tools.isEntrataByRecMov(row)
? t('movement.movin') ? t('movement.movin')
@@ -461,7 +490,15 @@
v-if=" v-if="
showColCheck(col, tools.TIPOVIS_SHOW_RECORD, true, 1, row) showColCheck(col, tools.TIPOVIS_SHOW_RECORD, true, 1, row)
" "
class="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
@@ -489,7 +526,7 @@
</div> </div>
</div> </div>
<template v-slot:loading> <template v-slot:loading>
<div class="text-center"> <div v-if="!hidetitleIfEmpty" class="text-center">
<q-spinner-dots color="primary" size="40px" /> <q-spinner-dots color="primary" size="40px" />
</div> </div>
</template> </template>
@@ -1034,7 +1071,7 @@
</q-table> </q-table>
<q-page-sticky <q-page-sticky
v-if="mytable && butt_modif_new" v-if="mytable && butt_modif_new && !hidetitleIfEmpty"
position="bottom-right" position="bottom-right"
:offset="[18, 68]" :offset="[18, 68]"
> >
@@ -1065,6 +1102,18 @@
:prop_myrec="myrecdialog" :prop_myrec="myrecdialog"
> >
</CMyCardCircuitPopup> </CMyCardCircuitPopup>
<<<<<<< HEAD
=======
<CMyCardService v-else-if="mytable === 'myskills'"
:table="mytable" :prop_myrec="myrecdialog">
</CMyCardService>
<CMyCardService v-else-if="mytable === 'mygoods'"
:table="mytable" :prop_myrec="myrecdialog">
</CMyCardService>
<CMyCardService v-else-if="mytable === 'myhosps'"
:table="mytable" :prop_myrec="myrecdialog">
</CMyCardService>
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
<CMyCardPopup v-else :table="mytable" :prop_myrec="myrecdialog"> <CMyCardPopup v-else :table="mytable" :prop_myrec="myrecdialog">
</CMyCardPopup> </CMyCardPopup>
</q-dialog> </q-dialog>
@@ -1131,7 +1180,7 @@
> >
<q-card class="dialog_card"> <q-card class="dialog_card">
<q-bar dense class="bg-primary text-white"> <q-bar dense class="bg-primary text-white">
Nuovo: Nuovo {{ mytitle }}:
<q-space /> <q-space />
<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-bar> </q-bar>
@@ -1205,7 +1254,7 @@
> >
<q-card class="dialog_card"> <q-card class="dialog_card">
<q-bar dense class="bg-primary text-white"> <q-bar dense class="bg-primary text-white">
Nuovo: Nuovo {{ mytitle }}:
<q-space /> <q-space />
<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-bar> </q-bar>
@@ -1334,7 +1383,7 @@
</q-card-actions> </q-card-actions>
</q-card> </q-card>
</q-dialog> </q-dialog>
<br /> <span v-if="!hidetitleIfEmpty"> <br /></span>
</div> </div>
</template> </template>
<script lang="ts" src="./CGridTableRec.ts"> <script lang="ts" src="./CGridTableRec.ts">

View File

@@ -0,0 +1,25 @@
.myflex{
display: flex;
flex: 1;
}
.container{
vertical-align: center;
padding: 5px;
font-size: 1.15rem;
}
.element{
font-weight: bold;
vertical-align: center;
padding: 5px;
font-size: 1.15rem;
}
.title_param{
font-size: 1.25rem;
}
.iconcirc {
margin-right: 4px;
}

View File

@@ -0,0 +1,117 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore'
import { IMyGroup, IImgGallery, IUserFields, IUserProfile, IFriends, ICircuit, IAccount } from 'model'
import { costanti } from '@costanti'
import { shared_consts } from '@/common/shared_vuejs'
import { tools } from '@store/Modules/tools'
import { useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { useRoute, useRouter } from 'vue-router'
import { CUserNonVerif } from '@/components/CUserNonVerif'
import { toolsext } from '@store/Modules/toolsext'
import { CSaldo } from '@/components/CSaldo'
import { CSendCoins } from '@/components/CSendCoins'
import { CCurrencyValue } from '@/components/CCurrencyValue'
import { CCurrencyV2 } from '@/components/CCurrencyV2'
import { useCircuitStore } from '@store/CircuitStore'
export default defineComponent({
name: 'CInfoAccount',
emits: ['setCmd'],
components: {CUserNonVerif, CSaldo, CSendCoins, CCurrencyValue, CCurrencyV2 },
props: {
grp: {
type: Object as PropType<IMyGroup>,
required: true,
},
circuitname: {
type: String,
required: false,
default: '',
},
admin: {
type: Boolean,
required: false,
default: false,
},
account: {
type: Object as PropType<IAccount>,
required: false,
default: null,
},
},
setup(props, { emit }) {
const userStore = useUserStore()
const $q = useQuasar()
const { t } = useI18n()
const $router = useRouter()
const myaccount = ref(<IAccount|undefined>undefined)
const circuitStore = useCircuitStore()
const table = ref(toolsext.TABMYGROUPS)
const circuit = ref(<ICircuit | null | undefined>null)
watch(() => props.grp, (newval, oldval) => {
mounted()
})
function mounted() {
circuit.value = circuitStore.getCircuitByName(props.circuitname)
if (props.account) {
myaccount.value = props.account
} else {
myaccount.value = props.grp.account
}
}
function getImgGroup(group: IMyGroup) {
return userStore.getImgByGroup(group)
}
function naviga(path: string) {
$router.push(path)
}
function setCmd(cmd: number, myusername: string, value: any = '') {
emit('setCmd', cmd, myusername, value)
}
function myusername() {
return userStore.my.username
}
async function save(value: any) {
console.log('save and mounted')
await tools.loadCircuits()
// ricarico
mounted()
}
onMounted(mounted)
return {
costanti,
getImgGroup,
naviga,
setCmd,
shared_consts,
userStore,
tools,
table,
myusername,
circuit,
circuitStore,
t,
myaccount,
save,
}
},
})

View File

@@ -0,0 +1,99 @@
<template>
<div v-if="myaccount && circuit">
<q-card-section>
<div class="text-h6">{{ t('groups.infoaccount') }}</div>
</q-card-section>
<q-separator />
<CSaldo
v-if="tools.isUserOk() && myaccount"
:account="myaccount"
:symbol="circuit.symbol"
:color="circuit.color"
:saldo="myaccount.saldo"
:qtarem="myaccount ? circuitStore.getRemainingCoinsToSend(myaccount) : 0"
>
</CSaldo>
<q-card-section>
<div v-if="myaccount.date_created" class="container">
<q-icon name="fas fa-lightbulb" class="iconcirc"></q-icon>
{{
$t('shared.createddate', {
date: tools.getstrDateYY(myaccount.date_created),
})
}}
</div>
<div
v-if="
!!myaccount.date_updated &&
tools.getstrDate(myaccount.date_updated) !==
tools.getstrDate(myaccount.date_created)
"
class="container"
>
<q-icon name="fas fa-pencil-alt" class="iconcirc"></q-icon>
<span class="element">{{
$t('shared.lastmodify', {
date: tools.getstrDateYY(myaccount.date_updated),
})
}}</span>
</div>
<div :class="$q.screen.lt.sm ? '' : 'row'">
<div class="sezioni">
<CCurrencyV2
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="red"
v-model="myaccount.fidoConcesso"
icon="fas fa-battery-quarter"
:label="t('circuit.fido_scoperto_default')"
:tips="t('circuit.fido_scoperto_default_tips')"
:paramTypeAccount="costanti.ParamTypeAccount.FIDO_CONCESSO"
:myrecparam="myaccount"
:admin="admin"
@save="save"
>
</CCurrencyV2>
</div>
<div class="sezioni">
<CCurrencyV2
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="green"
v-model="myaccount.qta_maxConcessa"
icon="fas fa-battery-quarter"
:label="t('circuit.qta_max_default')"
:tips="t('circuit.qta_max_default_tips')"
:paramTypeAccount="costanti.ParamTypeAccount.QTA_MAXCONCESSA"
:myrecparam="myaccount"
:admin="admin"
@save="save"
>
</CCurrencyV2>
</div>
<div v-if="myaccount.totTransato" class="sezioni">
<CCurrencyValue
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="blue"
v-model="myaccount.totTransato"
icon="fas fa-battery-quarter"
:label="t('circuit.totTransato')"
:tips="t('circuit.totTransato_tips')"
>
</CCurrencyValue>
</div>
</div>
</q-card-section>
</div>
</template>
<script lang="ts" src="./CInfoAccount.ts">
</script>
<style lang="scss" scoped>
@import './CInfoAccount.scss';
</style>

View File

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

View File

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

View File

@@ -0,0 +1,217 @@
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { CMyFieldRec } from '@/components/CMyFieldRec'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CProfile } from '@/components/CProfile'
import { CLabel } from '@/components/CLabel'
import { CCopyBtn } from '@/components/CCopyBtn'
import { CSkill } from '@/components/CSkill'
import { CDateTime } from '@/components/CDateTime'
import { CMyGroup } from '@/components/CMyGroup'
import { CMyCircuit } from '@/components/CMyCircuit'
import { CContactUser } from '@src/components/CContactUser'
import { CNotifAtTop } from '@src/components/CNotifAtTop'
import { CTimeAgo } from '@src/components/CTimeAgo'
import { CSendCoins } from '@/components/CSendCoins'
import { CMyUser } from '@/components/CMyUser'
import { CCheckIfIsLogged } from '@/components/CCheckIfIsLogged'
import { CUserNonVerif } from '@/components/CUserNonVerif'
import { tools } from '@store/Modules/tools'
import { computed, defineComponent, onMounted, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore'
import { useRoute, useRouter } from 'vue-router'
import { useGlobalStore } from '@store/globalStore'
import { useI18n } from '@/boot/i18n'
import { toolsext } from '@store/Modules/toolsext'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
import { ICircuit, IMyCircuit, IMyGroup, IUserFields } from 'model'
import { shared_consts } from '@/common/shared_vuejs'
import { static_data } from '@/db/static_data'
import { fieldsTable } from '@store/Modules/fieldsTable'
import { useNotifStore } from '@store/NotifStore'
import MixinUsers from '@/mixins/mixin-users'
export default defineComponent({
name: 'CMyActivities',
components: {
CProfile, CTitleBanner, CMyFieldDb, CSkill, CDateTime, CCopyBtn, CUserNonVerif, CMyFieldRec, CMyUser,
CMyGroup, CLabel, CMyCircuit, CSendCoins, CNotifAtTop, CCheckIfIsLogged,
CTimeAgo, CContactUser
},
props: {
},
setup(props) {
const userStore = useUserStore()
const globalStore = useGlobalStore()
const $route = useRoute()
const $q = useQuasar()
const { t } = useI18n()
const site = ref(globalStore.site)
const { getRefLink } = MixinUsers()
const animation = ref('fade')
const username = computed(() => $route.params.username ? $route.params.username.toString() : userStore.my.username)
const idnotif = computed(() => $route.query.idnotif ? $route.query.idnotif.toString() : '')
const filtroutente = ref(<any[]>[])
const showPic = ref(false)
const caricato = ref(false)
const myuser = ref(<IUserFields | null>null)
const actualcard = ref('mygoods')
const notifStore = useNotifStore()
const mycards = computed(() => {
return costanti.MAINCARDS.filter((rec: any) => rec.table)
})
const optionsMainCards = ref({})
const listgroupsfiltered = ref(<IMyGroup[]>[])
const listcircuitsfiltered = ref(<IMyCircuit[]>[])
function profile() {
return userStore.my.profile
}
function myusername() {
return userStore.my.username
}
async function loadProfile() {
console.log('loadProfile...', username.value)
try {
// Carica il profilo di quest'utente
if (username.value) {
await userStore.loadUserProfile({ username: username.value, idnotif: idnotif.value }).then((ris) => {
// console.log('loadUserProfile = ', ris)
myuser.value = ris
if (myuser.value) {
filtroutente.value = [{ userId: myuser.value._id }]
notifStore.setAsRead(idnotif.value)
try {
listgroupsfiltered.value = globalStore.mygroups.filter((grp: IMyGroup) => myuser.value!.profile.mygroups.findIndex((rec: IMyGroup) => rec.groupname === grp.groupname) >= 0)
} catch (e) {
listgroupsfiltered.value = []
}
try {
listcircuitsfiltered.value = myuser.value.profile.mycircuits
} catch (e) {
listcircuitsfiltered.value = []
}
}
})
}
caricato.value = true
optionsMainCards.value = tools.getoptionsMainCards(true)
} catch (e) {
console.error('ERR loadProfile', e)
}
}
watch(() => username.value, (to: any, from: any) => {
loadProfile()
})
watch(() => actualcard.value, (to: any, from: any) => {
loadProfile()
})
function mounted() {
loadProfile()
}
function getImgUser() {
if (myuser.value)
return userStore.getImgByProfile(myuser.value)
else
return ''
}
function checkifShow(col: string) {
//++Todo: checkifShow Permessi !
return true
}
function getLinkUserTelegram() {
if (myuser.value) {
if (!!myuser.value.profile.username_telegram) {
return 'https://t.me/' + myuser.value.profile.username_telegram
}
} else {
return ''
}
}
function getLinkWebSite() {
if (myuser.value) {
let site = myuser.value.profile.website!
if (site) {
if (!site.startsWith('http')) {
site = 'https://' + site
}
}
return site
} else {
return ''
}
}
function isMyRecord(username: string) {
return username === userStore.my.username
}
function getlinkpage() {
if (myuser.value)
return self.location.host + '/attivita/' + myuser.value.username
else
return ''
}
onMounted(mounted)
return {
username,
profile,
tools,
costanti,
myuser,
shared_consts,
getImgUser,
checkifShow,
getLinkUserTelegram,
getLinkWebSite,
filtroutente,
showPic,
myusername,
userStore,
t,
static_data,
animation,
isMyRecord,
getRefLink,
fieldsTable,
mycards,
actualcard,
caricato,
listgroupsfiltered,
idnotif,
site,
listcircuitsfiltered,
optionsMainCards,
getlinkpage,
}
}
})

View File

@@ -0,0 +1,242 @@
<template>
<div
v-if="!caricato"
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">
{{ username }}
</div>
<div class="col-12 text-h7">
<q-skeleton :animation="animation" />
</div>
<div class="col-12 text-h8 q-mt-sm">
<q-skeleton :animation="animation" />
</div>
<div class="col-12 text-h8 q-mt-sm">
<q-skeleton :animation="animation" />
</div>
</q-card>
</div>
<div v-else>
<div v-if="myuser">
<div v-if="tools.isUserOk() || tools.isLogged()">
<CNotifAtTop />
</div>
<div class="q-gutter-sm q-pa-sm q-pb-md">
<div
v-if="myuser && myuser.date_reg"
class="fit column no-wrap justify-evenly items-center content-start"
>
<div class="">
<q-avatar size="140px">
<q-img
:src="myuser.profile ? getImgUser(myuser.profile) : ''"
:alt="username"
img-class="imgprofile"
height="140px"
@click="showPic = true"
/>
<q-badge
v-if="tools.isUserOnline(myuser)"
align="top"
floating
color="green"
>online</q-badge
>
</q-avatar>
</div>
<div class="last_access">
OnLine: <CTimeAgo :datetime="myuser.lasttimeonline" />
</div>
<div v-if="myuser.reported">
<CTitleBanner
title="⚠️ L'utente è stato Segnalato per comportamento non idoneo."
bgcolor="bg-red"
clcolor="text-white"
>
</CTitleBanner>
</div>
<div v-if="site && site.confpages && site.confpages.showNameSurname">
<div class="text-h6">
<span v-if="checkifShow('name') && myuser.name">
{{ myuser.name }}</span
>
<span v-if="checkifShow('surname') && myuser.surname"
>&nbsp;{{ myuser.surname }}</span
>
</div>
</div>
<div class="col-12 text-h7 text-blue text-shadow-2">
{{ myuser.username }}
</div>
<br />
<CContactUser :myuser="myuser" :showBtnActivities="false" />
<CTitleBanner
v-if="site.confpages.showCompetenze"
class=""
:title="$t('profile.skills')"
bgcolor="bg-primary"
clcolor="text-white"
myclass="myshad"
:canopen="true"
>
<<<<<<< HEAD
<div v-for="(card, ind) of mycards" :key="ind" :name="card.table">
<q-card class="q-my-md">
<div v-if="card.table === 'mygroups'">
<q-list>
<span
v-for="(grp, index) in listgroupsfiltered"
:key="index"
class="q-my-sm q-mx-none"
clickable
>
<CMyGroup
:mygrp="grp"
:visu="costanti.USER_GROUPS"
=======
<q-tabs
v-model="mytab"
inline-label
dense
class="text-black shadow-2"
>
<q-tab name="my" icon="far fa-user" />
<q-tab name="favorite" icon="far fa-heart" />
<q-tab name="bookmark" icon="far fa-bookmark" />
</q-tabs>
<q-tab-panels
v-model="mytab"
animated
swipeable
vertical
transition-prev="jump-up"
transition-next="jump-up"
>
<q-tab-panel name="my">
<div
v-for="(card, ind) of mycards"
:key="ind"
:name="card.table"
>
<q-card class="q-my-md">
<div v-if="card.table === 'mygroups'">
<q-list>
<span
v-for="(grp, index) in listgroupsfiltered"
:key="index"
class="q-my-sm q-mx-none"
clickable
>
<CMyGroup
:mygrp="grp"
:visu="costanti.USER_GROUPS"
:noaut="true"
>
</CMyGroup>
</span>
</q-list>
</div>
<div v-else-if="card.table === 'circuits'">
<div class="text-h6">{{ card.title }}</div>
<q-list>
<span
v-for="(circuit, index) in listcircuitsfiltered"
:key="index"
class="q-my-sm q-mx-none"
clickable
>
<CMyCircuit
:mycircuit="circuit"
:visu="costanti.USER_CIRCUITS"
:noaut="true"
>
</CMyCircuit>
</span>
</q-list>
</div>
<div v-else>
<CSkill
:table="card.table"
:filtercustom="filtroutente"
:butt_modif_new="isMyRecord(myuser.username)"
:visuinpage="true"
>>>>>>> parent of 701e1f1 (Aggiornamento a 0.6.1)
:noaut="true"
>
</CMyGroup>
</span>
</q-list>
</div>
<div v-else-if="card.table === 'circuits'">
<div class="text-h6">{{ card.title }}</div>
<q-list>
<span
v-for="(circuit, index) in listcircuitsfiltered"
:key="index"
class="q-my-sm q-mx-none"
clickable
>
<CMyCircuit
:mycircuit="circuit"
:visu="costanti.USER_CIRCUITS"
:noaut="true"
>
</CMyCircuit>
</span>
</q-list>
</div>
<div v-else>
<CSkill
:table="card.table"
:filtercustom="filtroutente"
:butt_modif_new="isMyRecord(myuser.username)"
:visuinpage="true"
:noaut="true"
:title="card.title"
/>
</div>
</q-card>
</div>
</CTitleBanner>
</div>
</div>
<div v-if="!tools.isLogged()">
<CCheckIfIsLogged></CCheckIfIsLogged>
</div>
<q-dialog v-model="showPic" full-height full-width>
<img :src="getImgUser()" :alt="username" class="full-width" />
</q-dialog>
<q-page-sticky position="top-right" :offset="[18, 18]">
<q-btn
fab
glossy
class="semi-transparent"
icon="fas fa-link"
color="primary"
@click="tools.copyToClip($q, getlinkpage(), true)"
/>
</q-page-sticky>
</div>
</div>
</template>
<script lang="ts" src="./CMyActivities.ts">
</script>
<style lang="scss" scoped>
@import './CMyActivities.scss';
</style>

View File

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

View File

@@ -95,7 +95,7 @@
<div class="q-ma-sm"> <div class="q-ma-sm">
<q-btn <q-btn
v-if="myrec._id" v-if="myrec._id"
:text-color="$q.dark.isActive ? `white` : `black`" icon="fas fa-share-alt" :text-color="$q.dark.isActive ? `white` : `black`" icon="fas fa-link"
label="Condividi" label="Condividi"
@click="condividipag"></q-btn> @click="condividipag"></q-btn>
</div> </div>

View File

@@ -79,7 +79,7 @@
<div class="q-ma-sm"> <div class="q-ma-sm">
<q-btn <q-btn
v-if="myrec._id" v-if="myrec._id"
:text-color="$q.dark.isActive ? `white` : `black`" icon="fas fa-share-alt" :text-color="$q.dark.isActive ? `white` : `black`" icon="fas fa-link"
label="Condividi" label="Condividi"
@click="condividipag"></q-btn> @click="condividipag"></q-btn>
</div> </div>

View File

@@ -87,8 +87,11 @@ export default defineComponent({
load() load()
} }
function getlinkpage() {
return self.location.host + tools.getPathByTable(props.table, myrec.value._id)
}
function condividipag() { function condividipag() {
const mystr = self.location.host + tools.getPathByTable(props.table, myrec.value._id) const mystr = getlinkpage()
tools.copyStringToClipboard($q, mystr, true) tools.copyStringToClipboard($q, mystr, true)
tools.sendMsgTelegramCmd($q, t, shared_consts.MsgTeleg.SHARE_TEXT, false, mystr) tools.sendMsgTelegramCmd($q, t, shared_consts.MsgTeleg.SHARE_TEXT, false, mystr)
return true return true
@@ -120,6 +123,7 @@ export default defineComponent({
col, col,
condividipag, condividipag,
showBadge, showBadge,
getlinkpage,
} }
} }
}) })

View File

@@ -112,11 +112,24 @@
<div class="q-ma-sm"> <div class="q-ma-sm">
<q-btn <q-btn
v-if="myrec._id" v-if="myrec._id"
:text-color="$q.dark.isActive ? `white` : `black`" icon="fas fa-share-alt" :text-color="$q.dark.isActive ? `white` : `black`" icon="fas fa-link"
label="Condividi" label="Condividi"
@click="condividipag"></q-btn> @click="condividipag"></q-btn>
</div> </div>
</div> </div>
<q-page-sticky
position="top-right"
:offset="[18, 18]"
>
<q-btn
fab
glossy
class="semi-transparent"
icon="fas fa-link"
color="primary"
@click="tools.copyToClip($q, getlinkpage(), true)"
/>
</q-page-sticky>
<br><br> <br><br>
</q-card-section> </q-card-section>

View File

@@ -0,0 +1,197 @@
import { computed, defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CProfile } from '@/components/CProfile'
import { CDateTime } from '@/components/CDateTime'
import { CMyPage } from '@/components/CMyPage'
import { CMyChipList } from '@/components/CMyChipList'
import { CMyFieldRec } from '@/components/CMyFieldRec'
import { CMyUser } from '@/components/CMyUser'
import { CGalleryImages } from '@/components/CGalleryImages'
import { CAccomodation } from '@/components/CAccomodation'
import { tools } from '@store/Modules/tools'
import { useUserStore } from '@store/UserStore'
import { useCalendarStore } from '@store/CalendarStore'
import { useGlobalStore } from '@store/globalStore'
import { useI18n } from '@/boot/i18n'
import { toolsext } from '@store/Modules/toolsext'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
import { IColGridTable, IImgGallery, IUserFields } from 'model'
import { shared_consts } from '@/common/shared_vuejs'
import { colCitys, fieldsTable } from '@store/Modules/fieldsTable'
import { useRoute, useRouter } from 'vue-router'
import { useNotifStore } from '@store/NotifStore'
export default defineComponent({
name: 'CMyCardService',
components: {
CProfile, CTitleBanner,
CMyFieldDb, CDateTime, CMyPage, CMyFieldRec, CAccomodation,
CMyUser, CGalleryImages, CMyChipList
},
props: {
table: {
type: String,
required: true,
},
prop_myrec: {
type: Object as PropType<any>,
required: false,
default: null,
},
idRec: {
type: Number,
required: false,
default: 0
},
nopopup: {
type: Boolean,
required: false,
default: false
},
},
setup(props) {
const userStore = useUserStore()
const calendarStore = useCalendarStore()
const notifStore = useNotifStore()
const globalStore = useGlobalStore()
const $q = useQuasar()
const $route = useRoute()
const { t } = useI18n()
const showPic = ref(false)
const $router = useRouter()
const usersList = ref({ show: false, title: '', list: [] })
const myrec = ref(<any>{})
const col = ref(<IColGridTable>{})
const idnotif = computed(() => $route.query.idnotif ? $route.query.idnotif.toString() : '')
function profile() {
return userStore.my.profile
}
function load() {
// Carica il profilo di quest'utente
if (props.idRec) {
userStore.loadGeneric(props.table, props.idRec, idnotif.value).then((ris) => {
myrec.value = ris
notifStore.setAsRead(idnotif.value)
})
} else {
myrec.value = props.prop_myrec
}
col.value = fieldsTable.getArrColsByTable(props.table)
}
watch(() => props.idRec, (to: any, from: any) => {
load()
})
function mounted() {
load()
}
function getlinkpage() {
return self.location.host + tools.getPathByTable(props.table, myrec.value._id)
}
function condividipag() {
const mystr = getlinkpage()
tools.copyStringToClipboard($q, mystr, true)
tools.sendMsgTelegramCmd($q, t, shared_consts.MsgTeleg.SHARE_TEXT, false, mystr)
return true
}
function showBadge() {
if (shared_consts.TABLES_SHOW_ADTYPE.includes(props.table)) {
return true
}
return false
}
function getRecGoodSkillByRec(rec: any) {
if (props.table === 'myskills')
return rec.recSkill
else if (props.table === 'mygoods')
return rec.recGood
return null
}
function getSectorByRec(rec: any) {
if (props.table === 'myskills')
return rec.sector
else if (props.table === 'mygoods')
return rec.sectorGood
return null
}
function clicca(tipo: any, set: any, title: string) {
if (set && myrec.value.username !== userStore.my.username && tipo === costanti.TIPOFAVBOOK.FAVORITE) {
userStore.setFavorite($q, t, myrec.value._id, props.table, myrec.value);
}
if (set && myrec.value.username !== userStore.my.username && tipo === costanti.TIPOFAVBOOK.BOOKMARK) {
userStore.setBookmark($q, t, myrec.value._id, props.table, myrec.value);
}
if (!set) {
usersList.value.show = true;
usersList.value.title = title;
usersList.value.list = myrec.value.myfav;
}
}
function naviga(path: string) {
$router.push(path)
}
function getTypeHosps() {
let obj = null
if (myrec.value.typeHosp) {
obj = globalStore.getRecordByTableSingle(toolsext.TABTYPEHOSP, myrec.value.typeHosp)
if (obj)
return obj.label
}
return obj
}
onMounted(mounted)
return {
profile,
tools,
costanti,
myrec,
shared_consts,
globalStore,
showPic,
userStore,
t,
fieldsTable,
colCitys,
toolsext,
col,
condividipag,
showBadge,
getlinkpage,
calendarStore,
getSectorByRec,
getRecGoodSkillByRec,
usersList,
clicca,
naviga,
getTypeHosps,
}
}
})

View File

@@ -0,0 +1,433 @@
<template>
<div v-if="myrec && myrec._id" class="fulldiv">
<div class="q-pa-sm row items-start q-gutter-sm full-height fulldiv">
<q-card class="my-card fulldiv" bordered>
<CGalleryImages
v-if="myrec.photos.length > 0"
:imgGallery="myrec.photos"
:directory="'upload/' + tools.getDirectoryGall(myrec, table, '')"
>
</CGalleryImages>
<q-card-actions align="right">
<div class="">
<q-btn
flat
round
:color="userStore.isFavorite(myrec._id, table) ? 'red' : ''"
icon="favorite"
@click="clicca(costanti.TIPOFAVBOOK.FAVORITE, true)"
>
<q-badge
v-if="myrec.myfav"
color="primary"
:label="myrec.myfav.length"
floating
transparent
/>
</q-btn>
</div>
<div class="">
<q-btn
flat
round
:color="userStore.isBookmarked(myrec._id, table) ? 'teal' : ''"
icon="bookmark"
@click="clicca(costanti.TIPOFAVBOOK.BOOKMARK, true)"
>
<q-badge
v-if="myrec.mybook"
color="primary"
:label="myrec.mybook.length"
floating
transparent
/>
</q-btn>
</div>
<div>
<q-btn
flat
round
color="primary"
icon="share"
@click="tools.copyToClip($q, getlinkpage(), true)"
/>
</div>
<div>
<q-btn flat round icon="fas fa-ellipsis-h">
<q-menu>
<q-list v-if="true" style="min-width: 150px">
<q-item
v-if="!nopopup"
clickable
v-close-popup
@click="naviga(tools.getPathByTableAndRec(table, myrec))"
>
<q-item-section avatar>
<q-icon color="blue" name="fas fa-globe" />
</q-item-section>
<q-item-section>
{{ $t('event.openpage') }}
</q-item-section>
</q-item>
<q-separator />
<q-item
clickable
v-close-popup
@click="
clicca(
costanti.TIPOFAVBOOK.FAVORITE,
false,
$t('cmd.favorite')
)
"
>
<q-item-section avatar>
<q-icon color="red" name="favorite" />
</q-item-section>
<q-item-section>
{{ $t('cmd.favorite') }}
</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="
clicca(
costanti.TIPOFAVBOOK.BOOKMARK,
false,
$t('cmd.bookmark')
)
"
>
<q-item-section avatar>
<q-icon color="teal" name="bookmark" />
</q-item-section>
<q-item-section>
{{ $t('cmd.bookmark') }}
</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</div>
</q-card-actions>
<q-separator />
<q-list>
<q-item clickable>
<q-item-section avatar>
<div v-if="showBadge()" class="text-center">
<q-chip
dense
:color="fieldsTable.getColByAdType(myrec.adType)"
text-color="white"
>{{
fieldsTable.getValByTabAndId(table, 'adType', myrec.adType)
}}
</q-chip>
</div>
</q-item-section>
<q-item-section>
<q-item-label v-if="myrec.typeHosp" class="text-bold text-h7">
<q-chip dense color="green" text-color="white"
>{{ getTypeHosps() }}
</q-chip>
</q-item-label>
<q-item-label class="text-bold text-h7">{{
myrec.descr
}}</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="getSectorByRec(myrec)">
<q-item-section avatar>
<q-icon color="blue" name="category" />
</q-item-section>
<q-item-section>
<q-item-label>
<q-chip
v-if="getSectorByRec(myrec) && getSectorByRec(myrec)[0].descr"
class="glossy"
color="blue"
text-color="white"
dense
>
<span class="cal__quota-content">{{
getSectorByRec(myrec)[0].descr
}}</span>
</q-chip>
<q-chip
v-if="
getRecGoodSkillByRec(myrec) &&
getRecGoodSkillByRec(myrec).length > 0 &&
getRecGoodSkillByRec(myrec)[0].descr
"
class="glossy"
dense
color="blue"
text-color="white"
>
<span class="cal__quota-content">{{
getRecGoodSkillByRec(myrec)[0].descr
}}</span>
</q-chip>
</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="myrec.numMaxPeopleHosp" class="q-mt-sm">
<q-item-section avatar>
<q-icon color="blue" name="fas fa-users" />
</q-item-section>
<q-item-section>
<q-item-label class="q-px-xs q-ma-xs">
<span class="accom_maxosp">{{ myrec.numMaxPeopleHosp }}</span
>{{ t('hosps.numMaxPeopleHosp') }}
</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="!!myrec.accomodation && myrec.accomodation.length > 0">
<q-item-section avatar>
<q-icon color="orange" name="fas fa-bed" />
</q-item-section>
<q-item-section>
<q-item-label>
<CAccomodation
v-if="!!myrec.accomodation"
:mylist="myrec.accomodation"
:isInModif="false"
:edit="false"
:canModify="false"
>
</CAccomodation>
</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="!!myrec.preferences && myrec.preferences.length > 0">
<q-item-section avatar>
<q-icon color="red" name="fas fa-asterisk" />
</q-item-section>
<q-item-section>
<q-item-label>
<CMyChipList
:rec="myrec"
:type="costanti.FieldType.multiselect"
:value="myrec.preferences"
:options="
globalStore.getTableJoinByName(
toolsext.TABPREF,
false,
false,
null
)
"
:optval="fieldsTable.getKeyByTable(toolsext.TABPREF)"
:optlab="fieldsTable.getLabelByTable(toolsext.TABPREF)"
:opticon="fieldsTable.getIconByTable(toolsext.TABPREF)"
></CMyChipList>
</q-item-label>
</q-item-section>
</q-item>
<q-separator />
<q-item-label v-if="myrec.note"
><div v-html="myrec.note" class="clBorderService"></div
></q-item-label>
<q-card class="my-card clBorderUser" bordered>
<CMyUser
:mycontact="myrec"
:visu="costanti.FIND_PEOPLE"
@setCmd="tools.setCmd"
>
</CMyUser>
</q-card>
<q-item v-if="myrec.mycities[0].comune">
<q-item-section avatar>
<q-icon color="amber" name="fas fa-map-marker-alt" />
</q-item-section>
<q-item-section>
<q-item-label>
<span v-for="(city, index) in myrec.mycities" :key="index">
<span v-if="city.comune">
{{ city.comune }} ({{ city.prov }})</span
><span v-if="myrec.mycities.length > 1"> - </span>
</span>
</q-item-label>
<q-item-label v-if="myrec.profile.qualifica" caption>{{
myrec.biografia
}}</q-item-label>
</q-item-section>
</q-item>
<q-item clickable v-if="myrec.website">
<q-item-section avatar>
<q-icon color="blue" name="fas fa-globe" />
</q-item-section>
<q-item-section>
<q-item-label lines="1">
<span
v-html="
tools.getlinkhref(myrec.website, 'Visita il Sito Web')
"
/></q-item-label>
</q-item-section>
</q-item>
<q-item clickable v-if="myrec.link_maplocation">
<q-item-section avatar>
<q-icon color="blue" name="fas fa-map-marker-alt" />
</q-item-section>
<q-item-section>
<q-item-label lines="1">
<span
v-html="
tools.getlinkhref(myrec.link_maplocation, 'Apri Mappa')
"
/></q-item-label>
</q-item-section>
</q-item>
<q-item v-if="myrec.idContribType && myrec.idContribType.length > 0">
<q-item-section avatar>
<q-icon color="green" name="fas fa-hand-holding" />
</q-item-section>
<q-item-section>
<q-item-label>
<span
v-for="(reccontr, index) in myrec.idContribType"
:key="index"
>
<q-chip
dense
:color="calendarStore.getColByContribType(reccontr)"
text-color="white"
>
{{ calendarStore.getContribtypeById(reccontr) }}
</q-chip>
</span>
</q-item-label>
</q-item-section>
</q-item>
<q-item>
<q-item-section avatar>
<q-icon color="blue" name="far fa-edit" />
</q-item-section>
<q-item-section>
<q-item-label
><span v-if="myrec.date_updated">{{
tools.getstrDateMonthLong(myrec.date_updated)
}}</span
><span v-else>{{
tools.getstrDateMonthLong(myrec.date_created)
}}</span></q-item-label
>
</q-item-section>
</q-item>
<q-item clickable v-if="false">
<q-item-section avatar>
<q-icon color="red" name="local_gas_station" />
</q-item-section>
<q-item-section>
<q-item-label></q-item-label>
<q-item-label caption>Fill your gas tank.</q-item-label>
</q-item-section>
</q-item>
</q-list>
<q-separator />
<div class="q-mb-xl"></div>
<q-card-actions
v-if="$q.screen.gt.sm || nopopup"
class="text-center justify-center"
>
<q-btn
v-if="myrec.profile.username_telegram"
:label="$t('dialog.contact')"
color="primary"
icon="far fa-comment"
target="_blank"
:type="tools.isUserOk() ? 'a' : 'btn'"
size="md"
rounded
:href="
tools.isUserOk()
? tools.getHttpForTelegram(myrec.profile.username_telegram)
: null
"
/>
<q-btn
v-if="!nopopup"
rounded
outline
:label="$t('dialog.close')"
color="primary"
icon="close"
v-close-popup
/>
</q-card-actions>
</q-card>
<div
v-if="!$q.screen.gt.sm || !nopopup"
class="row absolute-bottom text-shadow custom-caption q-px-md buttons_bottom"
>
<q-btn
v-if="myrec.profile.username_telegram"
:label="$t('dialog.contact')"
color="primary"
icon="far fa-comment"
target="_blank"
:type="tools.isUserOk() ? 'a' : 'btn'"
size="md"
rounded
:href="
tools.isUserOk()
? tools.getHttpForTelegram(myrec.profile.username_telegram)
: null
"
/>
<q-btn
v-if="!nopopup"
rounded
outline
:label="$t('dialog.close')"
color="primary"
icon="close"
v-close-popup
/>
</div>
</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 v-for="(rec, i) in usersList.list" :key="i">
<CMyUser
:mycontact="rec"
:visu="costanti.FIND_PEOPLE"
@setCmd="tools.setCmd"
>
</CMyUser>
</div>
</q-card-section>
</q-card>
</q-dialog>
</template>
<script lang="ts" src="./CMyCardService.ts">
</script>
<style lang="scss" scoped>
@import './CMyCardService.scss';
</style>

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,9 +30,19 @@ 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,
},
noaut: {
type: Boolean,
required: false,
default: false,
} }
}, },
@@ -55,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
@@ -74,7 +89,7 @@ export default defineComponent({
// @ts-ignore // @ts-ignore
const rectofind = circuitStore.listcircuits.find((circ: ICircuit) => circ.name === circuit.value.circuitname!) const rectofind = circuitStore.listcircuits.find((circ: ICircuit) => circ.name === circuit.value.circuitname!)
if (rectofind) { if (rectofind) {
console.log('rectofind', rectofind) // console.log('rectofind', rectofind)
circuit.value = rectofind circuit.value = rectofind
} }
} }
@@ -116,6 +131,9 @@ export default defineComponent({
saldo, saldo,
globalStore, globalStore,
showingtooltip, showingtooltip,
showrules,
requestToEnterCircuit,
groupnameSel,
} }
}, },
}) })

View File

@@ -1,49 +1,113 @@
<template> <template>
<div v-if="tools.isUserOk()"> <div v-if="tools.isUserOk() || noaut">
<div v-if="circuit"> <div v-if="circuit">
<q-item class="q-my-sm bordo_stondato_circuiti" 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-mx-xs">{{ 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> <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()"
:account="account" :account="account"
:symbol="circuit.symbol" :symbol="circuit.symbol"
:color="circuit.color" :color="circuit.color"
@@ -54,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"> <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>
@@ -89,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"> <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"> <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>
@@ -122,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> </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>
<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

@@ -974,6 +974,16 @@
</div> </div>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CHECK_EMAIL"></div> <div v-else-if="myel.type === shared_consts.ELEMTYPE.CHECK_EMAIL"></div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CHECKIFISLOGGED">
<q-select
v-model="myel.container"
:options="[{label: 'Mostra Sempre', value: true }, { label: 'Solo se Offline', value: false}]"
label="Quando mostrarlo"
emit-value
map-options
>
</q-select>
</div>
</div> </div>
</div> </div>
<div> <div>

View File

@@ -12,6 +12,7 @@ import { CTitle } from '@/components/CTitle/index'
import { tools } from '@store/Modules/tools' import { tools } from '@store/Modules/tools'
import { shared_consts } from '@/common/shared_vuejs' import { shared_consts } from '@/common/shared_vuejs'
import { LandingFooter } from '@/components/LandingFooter' import { LandingFooter } from '@/components/LandingFooter'
import { CMyActivities } from '@/components/CMyActivities'
import { COpenStreetMap } from '@src/components/COpenStreetMap' import { COpenStreetMap } from '@src/components/COpenStreetMap'
import { CCardCarousel } from '@src/components/CCardCarousel' import { CCardCarousel } from '@src/components/CCardCarousel'
import { CMyPage } from '@src/components/CMyPage' import { CMyPage } from '@src/components/CMyPage'
@@ -21,6 +22,8 @@ import { CMyEditor } from '@src/components/CMyEditor'
import { CMyFieldRec } from '@src/components/CMyFieldRec' 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 { 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'
@@ -46,7 +49,8 @@ export default defineComponent({
CCardCarousel, COpenStreetMap, CMyPage, CMyPageIntro, CMyEditor, CMyFieldRec, CCardCarousel, COpenStreetMap, CMyPage, CMyPageIntro, CMyEditor, CMyFieldRec,
CSelectColor, CSelectFontSize, CImgPoster, CSelectColor, CSelectFontSize, CImgPoster,
CCheckIfIsLogged, CStatusReg, CDashboard, CMainView, CNotifAtTop, CCheckIfIsLogged, CStatusReg, CDashboard, CMainView, CNotifAtTop,
CPresentazione, CPresentazione, CMyActivities,
CMyProfileTutorial, CSendRISTo,
CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration, CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration,
}, },
emits: ['selElemClick'], emits: ['selElemClick'],

View File

@@ -234,9 +234,9 @@
@click="clickOnElem" @click="clickOnElem"
> >
<q-video <q-video
v-if="!!rec.container" v-if="myel && !!myel.container"
:src="rec.container" :src="myel.container"
:ratio="rec.ratio" :ratio="myel.ratio"
> >
</q-video> </q-video>
</div> </div>
@@ -435,6 +435,10 @@
<div v-if="editOn" class="elemEdit">CMainView</div> <div v-if="editOn" class="elemEdit">CMainView</div>
<CMainView></CMainView> <CMainView></CMainView>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.PROFILETUTORIAL">
<div v-if="editOn" class="elemEdit">CMyProFileTutorual</div>
<CMyProfileTutorial />
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CHECKAPPRUNNING"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.CHECKAPPRUNNING">
<div v-if="editOn" class="elemEdit">CheckAppRunning</div> <div v-if="editOn" class="elemEdit">CheckAppRunning</div>
<CCheckAppRunning /> <CCheckAppRunning />
@@ -442,7 +446,7 @@
<div v-else-if="myel.type === shared_consts.ELEMTYPE.REGISTRATION"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.REGISTRATION">
<div v-if="editOn" class="elemEdit">Registrazione</div> <div v-if="editOn" class="elemEdit">Registrazione</div>
<div v-if="true"> <div>
<CRegistration /> <CRegistration />
</div> </div>
</div> </div>
@@ -472,13 +476,17 @@
<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>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CHECKIFISLOGGED"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.CHECKIFISLOGGED">
<div v-if="editOn" class="elemEdit">CCheckIfIsLogged</div> <div v-if="editOn" class="elemEdit">CCheckIfIsLogged</div>
<CCheckIfIsLogged></CCheckIfIsLogged> <CCheckIfIsLogged :showalways="myel.container"></CCheckIfIsLogged>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.INFO_VERSION"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.INFO_VERSION">
<div>Versione: {{ tools.getvers() }}</div> <div>Versione: {{ tools.getvers() }}</div>
@@ -486,7 +494,7 @@
<div v-else-if="myel.type === shared_consts.ELEMTYPE.BOTT_CONDIVIDI"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.BOTT_CONDIVIDI">
<div class="row justify-evenly items-center q-pa-sm q-ma-sm"> <div class="row justify-evenly items-center q-pa-sm q-ma-sm">
<q-btn <q-btn
icon="fas fa-share-alt" icon="fas fa-link"
color="blue" color="blue"
type="a" type="a"
size="md" size="md"
@@ -521,6 +529,10 @@
<div v-if="editOn" class="elemEdit">Pagina di Presentazione</div> <div v-if="editOn" class="elemEdit">Pagina di Presentazione</div>
<CPresentazione></CPresentazione> <CPresentazione></CPresentazione>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.MYACTIVITIES">
<div v-if="editOn" class="elemEdit">Pagina Attività</div>
<CMyActivities></CMyActivities>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.NOTIFATTOP"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.NOTIFATTOP">
<div v-if="editOn" class="elemEdit">Notifiche in Cima</div> <div v-if="editOn" class="elemEdit">Notifiche in Cima</div>
<CNotifAtTop></CNotifAtTop> <CNotifAtTop></CNotifAtTop>
@@ -573,7 +585,7 @@
rounded rounded
size="md" size="md"
color="primary" color="primary"
to="/signup" to="/registrati"
:label="$t('reg.submit')" :label="$t('reg.submit')"
> >
</q-btn> </q-btn>

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,
@@ -140,8 +145,9 @@ export default defineComponent({
function showandsel(row: any, col: any, newval: any, valinitial: any) { function showandsel(row: any, col: any, newval: any, valinitial: any) {
console.log('showandsel CMyFieldDb', row, col, newval) console.log('showandsel CMyFieldDb', row, col, newval)
if (newval !== valinitial) if (newval !== valinitial) {
setValDb($q, props.mykey, newval, props.type, props.serv, props.table, props.mysubkey, props.id, props.indrec, props.mysubsubkey, props.specialField) setValDb($q, props.mykey, newval, props.type, props.serv, props.table, props.mysubkey, props.id, props.indrec, props.mysubsubkey, props.specialField)
}
} }

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

@@ -73,6 +73,8 @@ export default defineComponent({
arr = userStore.my.profile.friends arr = userStore.my.profile.friends
} else if (props.modelValue === costanti.REQ_FRIENDS) { } else if (props.modelValue === costanti.REQ_FRIENDS) {
arr = userStore.my.profile.req_friends arr = userStore.my.profile.req_friends
} else if (props.modelValue === costanti.HANDSHAKE) {
arr = userStore.my.profile.handshake
} else if (props.modelValue === costanti.ASK_SENT_FRIENDS) { } else if (props.modelValue === costanti.ASK_SENT_FRIENDS) {
arr = userStore.my.profile.asked_friends arr = userStore.my.profile.asked_friends
} else if (props.modelValue === costanti.ASK_TRUST) { } else if (props.modelValue === costanti.ASK_TRUST) {
@@ -93,9 +95,9 @@ export default defineComponent({
const mybutt = [] const mybutt = []
mybutt.push({ label: t('mypages.find_people'), value: costanti.FIND_PEOPLE }) mybutt.push({ label: t('mypages.find_people'), value: costanti.FIND_PEOPLE })
if (costanti.ENABLE_FRIENDS) {
if (numFriends.value > 0 || props.modelValue === costanti.FRIENDS) if (numFriends.value > 0 || props.modelValue === costanti.FRIENDS)
mybutt.push({ label: t('mypages.friends') + ' (' + numFriends.value + ')', value: costanti.FRIENDS }) mybutt.push({ label: t('mypages.friends') + ' (' + numFriends.value + ')', value: costanti.FRIENDS })
if (numReqFriends.value > 0 || props.modelValue === costanti.REQ_FRIENDS) if (numReqFriends.value > 0 || props.modelValue === costanti.REQ_FRIENDS)
mybutt.push({ mybutt.push({
label: t('mypages.request_friends') + ' (' + numReqFriends.value + ')', label: t('mypages.request_friends') + ' (' + numReqFriends.value + ')',
@@ -106,6 +108,11 @@ export default defineComponent({
label: t('mypages.request_sent') + ' (' + numAskSentFriends.value + ')', label: t('mypages.request_sent') + ' (' + numAskSentFriends.value + ')',
value: costanti.ASK_SENT_FRIENDS value: costanti.ASK_SENT_FRIENDS
}) })
}
if (numHandShake.value > 0 || props.modelValue === costanti.HANDSHAKE)
mybutt.push({ label: t('mypages.handshake') + ' (' + numHandShake.value + ')', value: costanti.HANDSHAKE })
if (numAskTrust.value > 0 || props.modelValue === costanti.ASK_TRUST) if (numAskTrust.value > 0 || props.modelValue === costanti.ASK_TRUST)
mybutt.push({ label: t('mypages.request_trust') + ' (' + numAskTrust.value + ')', value: costanti.ASK_TRUST }) mybutt.push({ label: t('mypages.request_trust') + ' (' + numAskTrust.value + ')', value: costanti.ASK_TRUST })
if (numTrusted.value > 0 || props.modelValue === costanti.TRUSTED) if (numTrusted.value > 0 || props.modelValue === costanti.TRUSTED)
@@ -121,11 +128,17 @@ export default defineComponent({
return (arr) ? arr.length : 0 return (arr) ? arr.length : 0
}) })
const numHandShake = computed(() => {
const arr = userStore.my.profile.handshake
return (arr) ? arr.length : 0
})
const numReqFriends = computed(() => { const numReqFriends = computed(() => {
const arr = userStore.my.profile.req_friends const arr = userStore.my.profile.req_friends
return (arr) ? arr.length : 0 return (arr) ? arr.length : 0
}) })
const numAskSentFriends = computed(() => { const numAskSentFriends = computed(() => {
const arr = userStore.my.profile.asked_friends const arr = userStore.my.profile.asked_friends
return (arr) ? arr.length : 0 return (arr) ? arr.length : 0
@@ -161,7 +174,7 @@ export default defineComponent({
// Carica il profilo di quest'utente // Carica il profilo di quest'utente
if (username.value) { if (username.value) {
spinner_visible.value = true spinner_visible.value = true
userStore.loadFriends(username.value).then((ris) => { userStore.loadFriends().then((ris) => {
// console.log('ris', ris) // console.log('ris', ris)
if (ris) { if (ris) {
listTrusted.value = ris.listTrusted ? ris.listTrusted : [] listTrusted.value = ris.listTrusted ? ris.listTrusted : []

View File

@@ -2,3 +2,24 @@
display: flex; display: flex;
flex: 1; flex: 1;
} }
.container{
vertical-align: center;
padding: 5px;
font-size: 1.15rem;
}
.element{
font-weight: bold;
vertical-align: center;
padding: 5px;
font-size: 1.15rem;
}
.title_param{
font-size: 1.25rem;
}
.iconcirc {
margin-right: 4px;
}

View File

@@ -1,6 +1,6 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue' import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore' import { useUserStore } from '@store/UserStore'
import { IMyGroup, IImgGallery, IUserFields, IUserProfile, IFriends } from 'model' import { IMyGroup, IImgGallery, IUserFields, IUserProfile, IFriends, ICircuit, IAccount } 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'
@@ -9,11 +9,16 @@ 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 { toolsext } from '@store/Modules/toolsext' import { toolsext } from '@store/Modules/toolsext'
import { CSaldo } from '@/components/CSaldo'
import { CInfoAccount } from '@/components/CInfoAccount'
import { CSendCoins } from '@/components/CSendCoins'
import { CCurrencyValue } from '@/components/CCurrencyValue'
import { useCircuitStore } from '@store/CircuitStore'
export default defineComponent({ export default defineComponent({
name: 'CMyGroup', name: 'CMyGroup',
emits: ['setCmd'], emits: ['setCmd'],
components: {CUserNonVerif}, components: {CInfoAccount, CUserNonVerif, CSaldo, CSendCoins, CCurrencyValue },
props: { props: {
mygrp: { mygrp: {
type: Object as PropType<IMyGroup | null>, type: Object as PropType<IMyGroup | null>,
@@ -28,7 +33,18 @@ export default defineComponent({
visu: { visu: {
type: Number, type: Number,
required: true, required: true,
} },
circuitname: {
type: String,
required: false,
default: '',
},
noaut: {
type: Boolean,
required: false,
default: false,
},
}, },
setup(props, { emit }) { setup(props, { emit }) {
@@ -40,11 +56,17 @@ export default defineComponent({
const $route = useRoute() const $route = useRoute()
const groupname = ref('') const groupname = ref('')
const circuitStore = useCircuitStore()
const showsendCoinTo = ref(false)
const showAccountInfo = ref(false)
const grp = ref(<IMyGroup | null>null) const grp = ref(<IMyGroup | null>null)
const table = ref(toolsext.TABMYGROUPS) const table = ref(toolsext.TABMYGROUPS)
const circuit = ref(<ICircuit | null | undefined>null)
watch(() => props.mygrp, (newval, oldval) => { watch(() => props.mygrp, (newval, oldval) => {
mounted() mounted()
}) })
@@ -62,6 +84,7 @@ export default defineComponent({
groupname.value = props.mygrp.groupname groupname.value = props.mygrp.groupname
} }
} }
circuit.value = circuitStore.getCircuitByName(props.circuitname)
} }
function getImgGroup(group: IMyGroup) { function getImgGroup(group: IMyGroup) {
@@ -93,6 +116,11 @@ export default defineComponent({
tools, tools,
table, table,
myusername, myusername,
circuit,
circuitStore,
showsendCoinTo,
showAccountInfo,
t,
} }
}, },
}) })

View File

@@ -2,130 +2,587 @@
<div v-if="tools.isUserOk()"> <div v-if="tools.isUserOk()">
<div v-if="grp"> <div v-if="grp">
<q-item class="q-my-sm" clickable> <q-item class="q-my-sm" clickable>
<q-item-section avatar @click="naviga(tools.getPathByGroup(grp, table))"> <q-item-section
avatar
@click="naviga(tools.getPathByGroup(grp, table))"
>
<q-avatar size="60px"> <q-avatar size="60px">
<q-img :src="getImgGroup(grp)" :alt="grp.groupname" img-class="imgprofile" height="60px"/> <q-img
:src="getImgGroup(grp)"
:alt="grp.groupname"
img-class="imgprofile"
height="60px"
/>
</q-avatar> </q-avatar>
</q-item-section> </q-item-section>
<q-item-section @click="naviga(tools.getPathByGroup(grp, table))"> <q-item-section @click="naviga(tools.getPathByGroup(grp, table))">
<q-item-label><strong>{{ grp.title }}</strong> ({{ grp.groupname }}) <q-item-label
><strong>{{ grp.title }}</strong> ({{ grp.groupname }})
</q-item-label>
<q-item-label v-if="grp.descr" caption lines="3"
><em>{{ grp.descr }}</em></q-item-label
>
<q-item-label v-if="grp.account && circuitname" caption lines="2">
<CSaldo
:small="true"
:account="grp.account"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
:saldo="grp.account.saldo"
>
</CSaldo>
</q-item-label> </q-item-label>
<q-item-label v-if="grp.descr" caption lines="3"><em>{{ grp.descr }}</em></q-item-label>
</q-item-section> </q-item-section>
<q-item-section side v-if="visu === costanti.MY_GROUPS">
<q-item-label> <q-item-label>
<q-btn
icon="fas fa-coins"
color="green"
size="md"
dense
@click="showsendCoinTo = true"
>
</q-btn>
</q-item-label>
<q-item-section side>
<q-item-label v-if="visu === costanti.MY_GROUPS">
<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.GROUPSCMD.REMOVE_FROM_MYGROUP, myusername(), '', grp.groupname)"> clickable
<q-item-section>{{ $t('groups.remove_from_mygroups') }}</q-item-section> icon="fas fa-user-minus"
outline
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.remove_from_mygroups')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list v-if="tools.iAmAdminGroup(grp.groupname)" style="min-width: 200px"> <q-list
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.DELETE_GROUP, myusername(), '', grp.groupname)"> v-if="tools.iAmAdminGroup(grp.groupname)"
<q-item-section>{{ $t('groups.delete_group') }}</q-item-section> style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.DELETE_GROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.delete_group')
}}</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 v-if="!tools.iAmAdminGroup(grp.groupname)" clickable icon="fas fa-ban" v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.BLOCK_GROUP, myusername(), '', grp.groupname)"> <q-item
<q-item-section>{{ $t('groups.block_group') }}</q-item-section> v-if="!tools.iAmAdminGroup(grp.groupname)"
clickable
icon="fas fa-ban"
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.BLOCK_GROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.block_group')
}}</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-label v-if="visu === costanti.REQ_ADD_USER_TO_CIRCUIT">
<q-item-section side v-if="visu === costanti.USER_GROUPS">
<q-item-label>
<q-btn rounded :icon="userStore.IsMyGroupByGroupname(grp.groupname) ? `fas fa-ellipsis-h` : `fas fa-user`">
<q-menu>
<q-list v-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && !userStore.IsAskedGroupByGroupname(grp.groupname) && !userStore.IsRefusedGroupByGroupname(grp.groupname))" style="min-width: 200px">
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REQGROUP, myusername(), true, grp.groupname)">
<q-item-section>{{ $t('groups.ask_group') }}</q-item-section>
</q-item>
</q-list>
<q-list v-else-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && userStore.IsAskedGroupByGroupname(grp.groupname) && !userStore.IsRefusedGroupByGroupname(grp.groupname))" style="min-width: 200px">
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REFUSE_REQ_GROUP, myusername(), false, grp.groupname)">
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section>
</q-item>
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REQGROUP, myusername(), false, grp.groupname)">
<q-item-section>{{ $t('shared.cancel_ask') }}</q-item-section>
</q-item>
</q-list>
<q-list v-else-if="userStore.IsMyGroupByGroupname(grp.groupname)" style="min-width: 200px">
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP, myusername(), '', grp.groupname)">
<q-item-section>{{ $t('groups.exit_group') }}</q-item-section>
</q-item>
</q-list>
<q-list v-if="tools.iAmAdminGroup(grp.groupname)" style="min-width: 200px">
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.DELETE_GROUP, myusername(), '', grp.groupname)">
<q-item-section>{{ $t('groups.delete_group') }}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.REQ_GROUP">
<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.GROUPSCMD.REQGROUP, myusername(), false, grp.groupname)"> clickable
<q-item-section>{{ $t('groups.reject_ask_group') }}</q-item-section> 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
clickable
v-close-popup
@click="showAccountInfo = true"
>
<q-item-section avatar>
<q-icon name="fas fa-info" />
</q-item-section>
<q-item-section>{{
$t('groups.infoaccount')
}}</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-label v-else-if="visu === costanti.USER_GROUPS">
<q-item-section side v-if="visu === costanti.ASK_SENT_GROUP"> <q-btn
<q-item-label> rounded
:icon="
userStore.IsMyGroupByGroupname(grp.groupname)
? `fas fa-ellipsis-h`
: `fas fa-user`
"
>
<q-menu>
<q-list
v-if="
!userStore.IsMyGroupByGroupname(grp.groupname) &&
!userStore.IsAskedGroupByGroupname(grp.groupname) &&
!userStore.IsRefusedGroupByGroupname(grp.groupname)
"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REQGROUP,
myusername(),
true,
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.ask_group')
}}</q-item-section>
</q-item>
</q-list>
<q-list
v-else-if="
!userStore.IsMyGroupByGroupname(grp.groupname) &&
userStore.IsAskedGroupByGroupname(grp.groupname) &&
!userStore.IsRefusedGroupByGroupname(grp.groupname)
"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REFUSE_REQ_GROUP,
myusername(),
false,
grp.groupname
)
"
>
<q-item-section>{{
$t('shared.refuse_ask')
}}</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REQGROUP,
myusername(),
false,
grp.groupname
)
"
>
<q-item-section>{{
$t('shared.cancel_ask')
}}</q-item-section>
</q-item>
</q-list>
<q-list
v-else-if="userStore.IsMyGroupByGroupname(grp.groupname)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.exit_group')
}}</q-item-section>
</q-item>
</q-list>
<q-list
v-if="tools.iAmAdminGroup(grp.groupname)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.DELETE_GROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.delete_group')
}}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
<q-item-label v-else-if="visu === costanti.REQ_GROUP">
<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.GROUPSCMD.REFUSE_REQ_GROUP, myusername(), '', grp.groupname)"> clickable
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section> icon="fas fa-user-minus"
</q-item> outline
<q-item clickable icon="fas fa-user-minus" v-close-popup v-close-popup
@click="tools.setCmd($q, shared_consts.GROUPSCMD.CANCEL_REQ_GROUP, myusername(), '', grp.groupname)"> @click="
<q-item-section>{{ $t('shared.cancel_ask') }}</q-item-section> tools.setCmd(
$q,
shared_consts.GROUPSCMD.REQGROUP,
myusername(),
false,
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.reject_ask_group')
}}</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-label v-else-if="visu === costanti.ASK_SENT_GROUP">
<q-item-section side v-if="visu === costanti.FIND_GROUP"> <q-btn rounded icon="fas fa-ellipsis-h">
<q-item-label>
<q-btn rounded :icon="userStore.IsMyGroupByGroupname(grp.groupname) ? `fas fa-ellipsis-h` : `fas fa-user`">
<q-menu> <q-menu>
<q-list v-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && !userStore.IsAskedGroupByGroupname(grp.groupname))" style="min-width: 200px"> <q-list style="min-width: 150px">
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REQGROUP, myusername(), true, grp.groupname)"> <q-item
<q-item-section>{{ $t('groups.ask_group') }}</q-item-section> clickable
icon="fas fa-user-minus"
outline
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REFUSE_REQ_GROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('shared.refuse_ask')
}}</q-item-section>
</q-item>
<q-item
clickable
icon="fas fa-user-minus"
outline
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.CANCEL_REQ_GROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('shared.cancel_ask')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list v-else-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && userStore.IsAskedGroupByGroupname(grp.groupname))" style="min-width: 200px"> </q-menu>
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REFUSE_REQ_GROUP, myusername(), false, grp.groupname)"> </q-btn>
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section> </q-item-label>
</q-item> <q-item-label v-else-if="visu === costanti.FIND_GROUP">
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REQGROUP, myusername(), false, grp.groupname)"> <q-btn
<q-item-section>{{ $t('shared.cancel_ask') }}</q-item-section> rounded
:icon="
userStore.IsMyGroupByGroupname(grp.groupname)
? `fas fa-ellipsis-h`
: `fas fa-user`
"
>
<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-item>
</q-list> </q-list>
<q-list v-else-if="userStore.IsMyGroupByGroupname(grp.groupname)" style="min-width: 200px"> <q-list
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP, myusername(), '', grp.groupname)"> v-if="
<q-item-section>{{ $t('groups.exit_group') }}</q-item-section> !userStore.IsMyGroupByGroupname(grp.groupname) &&
!userStore.IsAskedGroupByGroupname(grp.groupname)
"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REQGROUP,
myusername(),
true,
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.ask_group')
}}</q-item-section>
</q-item> </q-item>
</q-list> </q-list>
<q-list v-if="tools.iAmAdminGroup(grp.groupname)" style="min-width: 200px"> <q-list
<q-item clickable v-close-popup @click="tools.setCmd($q, shared_consts.GROUPSCMD.DELETE_GROUP, myusername(), '', grp.groupname)"> v-else-if="
<q-item-section>{{ $t('groups.delete_group') }}</q-item-section> !userStore.IsMyGroupByGroupname(grp.groupname) &&
userStore.IsAskedGroupByGroupname(grp.groupname)
"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REFUSE_REQ_GROUP,
myusername(),
false,
grp.groupname
)
"
>
<q-item-section>{{
$t('shared.refuse_ask')
}}</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REQGROUP,
myusername(),
false,
grp.groupname
)
"
>
<q-item-section>{{
$t('shared.cancel_ask')
}}</q-item-section>
</q-item>
</q-list>
<q-list
v-else-if="userStore.IsMyGroupByGroupname(grp.groupname)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.exit_group')
}}</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="
tools.removeFromMyCircuits(
$q,
userStore.my.username,
circuitname,
grp.groupname,
$t('circuit.domanda_exit_fromcircuit', {
circuitname,
})
)
"
>
<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>
<q-list
v-if="tools.iAmAdminGroup(grp.groupname)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.GROUPSCMD.DELETE_GROUP,
myusername(),
'',
grp.groupname
)
"
>
<q-item-section>{{
$t('groups.delete_group')
}}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
<q-item-label v-else-if="visu === costanti.REQ_ADD_GROUP_TO_CIRCUIT">
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list v-if="true" style="min-width: 150px">
<q-item
clickable
v-close-popup
@click="
tools.addGroupToMyCircuits($q, grp.groupname, circuitname)
"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-user-plus" />
</q-item-section>
<q-item-section>
{{ $t('circuit.accept') }}
</q-item-section>
</q-item>
</q-list>
<q-list style="min-width: 200px">
<q-item
clickable
v-close-popup
@click="
tools.refuseReqCircuit(
$q,
myusername(),
circuitname,
grp.groupname
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<q-item-section>{{
$t('shared.refuse_ask')
}}</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="
tools.cancelReqCircuit(
$q,
myusername(),
circuitname,
grp.groupname
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</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>
@@ -138,11 +595,35 @@
<div v-else> <div v-else>
<CUserNonVerif></CUserNonVerif> <CUserNonVerif></CUserNonVerif>
</div> </div>
<div v-if="showsendCoinTo">
<CSendCoins
:showprop="showsendCoinTo"
:to_group="grp"
:circuitname="circuitname"
@close="showsendCoinTo = false"
>
</CSendCoins>
</div>
<q-dialog v-model="showAccountInfo" full-height full-width>
<q-card v-if="circuit">
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
{{ grp.title }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<CInfoAccount
:grp="grp"
:circuitname="circuitname"
:admin="tools.iAmAdminCircuit(circuitname)"
/>
</q-card>
</q-dialog>
</template> </template>
<script lang="ts" src="./CMyGroup.ts"> <script lang="ts" src="./CMyGroup.ts">
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import './CMyGroup.scss'; @import './CMyGroup.scss';
</style> </style>

View File

@@ -0,0 +1,4 @@
.myflex{
display: flex;
flex: 1;
}

View File

@@ -0,0 +1,122 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore'
import { IMyGroup, IImgGallery, IUserFields, IUserProfile, IFriends, ICircuit, IAccount } from 'model'
import { costanti } from '@costanti'
import { shared_consts } from '@/common/shared_vuejs'
import { tools } from '@store/Modules/tools'
import { useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { useRoute, useRouter } from 'vue-router'
import { toolsext } from '@store/Modules/toolsext'
import { useCircuitStore } from '@store/CircuitStore'
export default defineComponent({
name: 'CMyGroupOnlyView',
emits: ['setCmd'],
components: {},
props: {
mygrp: {
type: Object as PropType<IMyGroup | null>,
required: false,
default: null,
},
mygroupname: {
type: String,
required: false,
default: null,
},
visu: {
type: Number,
required: true,
},
circuitname: {
type: String,
required: false,
default: '',
},
noaut: {
type: Boolean,
required: false,
default: false,
},
labelextra: {
type: String,
required: false,
default: '',
},
},
setup(props, { emit }) {
const userStore = useUserStore()
const $q = useQuasar()
const { t } = useI18n()
const $router = useRouter()
const $route = useRoute()
const groupname = ref('')
const circuitStore = useCircuitStore()
const showsendCoinTo = ref(false)
const grp = ref(<IMyGroup | null>null)
const table = ref(toolsext.TABMYGROUPS)
const circuit = ref(<ICircuit | null | undefined>null)
watch(() => props.mygrp, (newval, oldval) => {
mounted()
})
function mounted() {
if (!props.mygrp) {
if (props.mygroupname) {
groupname.value = props.mygroupname
//++Todo: carica contact
grp.value = null
}
} else {
if (props.mygrp) {
grp.value = props.mygrp
groupname.value = props.mygrp.groupname
}
}
circuit.value = circuitStore.getCircuitByName(props.circuitname)
}
function getImgGroup(group: IMyGroup) {
return userStore.getImgByGroup(group)
}
function naviga(path: string) {
$router.push(path)
}
function setCmd(cmd: number, myusername: string, value: any = '') {
emit('setCmd', cmd, myusername, value)
}
function myusername() {
return userStore.my.username
}
onMounted(mounted)
return {
grp,
costanti,
getImgGroup,
naviga,
setCmd,
shared_consts,
userStore,
tools,
table,
myusername,
circuit,
showsendCoinTo,
}
},
})

View File

@@ -0,0 +1,41 @@
<template>
<div v-if="tools.isUserOk()">
<div v-if="grp">
<q-item class="q-my-sm" clickable>
<q-item-section
avatar
@click="naviga(tools.getPathByGroup(grp, table))"
>
<q-item-label v-if="labelextra"
><strong>{{ labelextra }}</strong></q-item-label
>
<q-avatar size="60px">
<q-img
:src="getImgGroup(grp)"
:alt="grp.groupname"
img-class="imgprofile"
height="60px"
/>
</q-avatar>
</q-item-section>
<q-item-section @click="naviga(tools.getPathByGroup(grp, table))">
<q-item-label
><strong>{{ grp.title }}</strong> ({{ grp.groupname }})
</q-item-label>
<q-item-label v-if="grp.descr" caption lines="3"
><em>{{ grp.descr }}</em></q-item-label
>
</q-item-section>
</q-item>
</div>
</div>
<div v-else></div>
</template>
<script lang="ts" src="./CMyGroupOnlyView.ts">
</script>
<style lang="scss" scoped>
@import './CMyGroupOnlyView.scss';
</style>

View File

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

View File

@@ -44,6 +44,11 @@ export default defineComponent({
required: false, required: false,
default: 0, default: 0,
}, },
circuitname: {
type: String,
required: false,
default: '',
},
}, },
setup(props, { emit }) { setup(props, { emit }) {
const userStore = useUserStore() const userStore = useUserStore()
@@ -112,6 +117,8 @@ export default defineComponent({
function mounted() { function mounted() {
username.value = userStore.my.username username.value = userStore.my.username
if (props.finder)
loadGroups() loadGroups()
} }

View File

@@ -27,7 +27,7 @@
class="q-my-sm" class="q-my-sm"
clickable clickable
> >
<CMyGroup :mygrp="grp" :visu="modelValue"> </CMyGroup> <CMyGroup :mygrp="grp" :visu="modelValue" :circuitname="circuitname"> </CMyGroup>
</span> </span>
</q-list> </q-list>
</div> </div>
@@ -35,7 +35,7 @@
<div v-else> <div v-else>
<q-list class="width-container"> <q-list class="width-container">
<span class="q-my-sm" clickable> <span class="q-my-sm" clickable>
<CMyGroup :mygrp="mygrp" :visu="visu"> </CMyGroup> <CMyGroup :mygrp="mygrp" :visu="visu" :circuitname="circuitname"> </CMyGroup>
</span> </span>
</q-list> </q-list>
</div> </div>

Some files were not shown because too many files have changed in this diff Show More