58 Commits
master ... dev2

Author SHA1 Message Date
Surya Paolo
41fa886bc8 aggiornamento... 2023-04-07 21:10:16 +02:00
Surya Paolo
a8eb6344ef Revert "Aggiornamento a 0.6.1"
This reverts commit 701e1f1968.
2023-04-07 20:07:56 +02:00
Surya Paolo
9c08ebaacd Revert "Aggiornamento a 0.6.1"
This reverts commit 701e1f1968.
2023-04-07 18:38:46 +02:00
Surya Paolo
eb4998dcd2 Revert "Aggiornamento a 0.6.1"
This reverts commit 701e1f1968.
2023-04-07 18:38:22 +02:00
Surya Paolo
799a8a0e15 Revert "nuova veste grafica: myskills, mygoods, mybachecas, myhosps,"
This reverts commit 6fad472211.
2023-04-07 18:24:15 +02:00
Surya Paolo
6e6e363059 Revert "Aggiornamento a 0.6.1"
This reverts commit 701e1f1968.
2023-04-07 18:01:48 +02:00
Surya Paolo
7148b773ea Revert "cambio nome ai circuiti"
This reverts commit 0365c58326.
2023-04-07 17:21:22 +02:00
Surya Paolo
701e1f1968 Aggiornamento a 0.6.1 2023-04-07 17:14:51 +02:00
Surya Paolo
6fad472211 nuova veste grafica: myskills, mygoods, mybachecas, myhosps,
- cambiato id (da numero a stringa)
2023-04-07 02:46:27 +02:00
Surya Paolo
edcd244397 new version Visualizzazione Service 2023-04-04 15:27:03 +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
225 changed files with 13456 additions and 3785 deletions

View File

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

View File

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

27
.env.test.risosrv Executable file
View File

@@ -0,0 +1,27 @@
APP_VERSION="0.5.85"
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>🌱 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>' +
'1) Tramite <strong>Paypal</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>' +
'1) Tramite <strong><a href="https://paypal.me/paoloarena" target="_blank">Paypal</a></strong>:<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; " ' +
'class="row justify-around">' +
'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>' +
'<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 />' +
'<span style="color: red; font-size: 2rem;">❤</span> Sono graditi messaggi sia di suggerimenti che di apprezzamenti.<br>' +
'4) In alternativa scegli tu una forma di Dono <br />' +
'Grazie Mille per l\'Aiuto ed il Supporto' +
'<br>',
},

View File

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

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.5.46"
APP_VERSION="0.6.2"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13"
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,4 @@
APP_VERSION="0.5.46"
APP_VERSION="0.6.2"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="14"
DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -125,7 +125,7 @@
</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
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-social-sharing": "^4.0.0-alpha4",
"vue-svgicon": "^4.0.0-alpha.3",
"vue-timeago3": "^2.3.0",
"vue2-dragula": "^2.5.5",
"vuex": "^4.1.0",
"vuex-router-sync": "^6.0.0-rc.1"
@@ -122,15 +123,17 @@
"crypto": false
},
"browserslist": [
"last 30 Chrome versions",
"last 30 Firefox versions",
"last 4 Edge versions",
"last 30 Safari versions",
"last 30 Android versions",
"last 30 ChromeAndroid versions",
"last 30 FirefoxAndroid versions",
"last 18 iOS versions",
"last 11 Opera versions"
"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%",
"not dead"
],
"engines": {
"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"
// 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: ['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
css: [
@@ -238,8 +238,7 @@ module.exports = configure((ctx) => ({
'Ripple',
'ClosePopup',
],
// Quasar plugins
plugins: [
_plugins: [
'Meta',
'Dialog',
'Notify',
@@ -247,13 +246,25 @@ module.exports = configure((ctx) => ({
'Loading',
'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',
lang: 'it', // Quasar language
},
// animations: 'all', // --- includes all animations
animations: 'all', // --- includes all animations
// https://v2.quasar.dev/options/animations
animations: [],
// animations: [],
// https://v2.quasar.dev/quasar-cli/developing-ssr/configuring-ssr
ssr: {
@@ -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.',
display: 'standalone',
orientation: 'portrait',
background_color: '#ffffff',
background_color: '#fff',
theme_color: '#027be3',
scope: "/",
id: "/?homescreen=1",
start_url: "/?homescreen=1",
icons: [
{
src: 'images/riso-android-icon-512x512.png',
@@ -348,6 +362,10 @@ module.exports = configure((ctx) => ({
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 = {
body: data.content,
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: {
url: data.url,
},
@@ -633,7 +633,7 @@ self.addEventListener('push', (event) => {
options = {
body: text,
icon: '/images/android-chrome-192x192.png',
badge: '/images/android-chrome-192x192.png',
badge: '/images/badge-96x96.png',
data: {
url: '/',
},

View File

@@ -28,6 +28,7 @@ export default {
const $q = useQuasar()
const userStore = useUserStore()
const $router = useRouter()
const $route = useRoute()
const globalStore = useGlobalStore()
const { t } = useI18n();
@@ -79,15 +80,21 @@ export default {
function mounted() {
console.log('app mounted')
darkcookie.value = tools.getCookie('darkmode', false, false, false) === '-1'
globalStore.homescreen = $route.query.homescreen ? $route.query.homescreen : ''
scroll()
tools.checkApp()
}
async function created() {
tools.initprompt()
tools.checkApp()
try {
if (process.env.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,
CHECKAPPRUNNING: 135,
DASHBOARD: 140,
CSENDRISTO: 150,
STATUSREG: 160,
CHECKIFISLOGGED: 170,
INFO_VERSION: 180,
BOTT_CONDIVIDI: 190,
BUTTON: 195,
PRESENTAZIONE: 200,
MYACTIVITIES: 205,
NOTIFATTOP: 210,
CHART: 220,
CHECKNEWVERSION: 230,
@@ -54,6 +56,7 @@ export const shared_consts = {
REGISTRATION: 258,
BTN_LOGIN: 260,
FOOTER: 270,
PROFILETUTORIAL: 280,
},
QUERYTYPE_MYGROUP: 1,
@@ -63,6 +66,10 @@ export const shared_consts = {
QUERYTYPE_REFUSED_USER_CIRCUIT: 12,
QUERYTYPE_LIST_MOVEMENTS: 15,
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_CONTACTED: 2,
@@ -87,6 +94,7 @@ export const shared_consts = {
FILTER_USER_NO_VERIFIED_APORTADOR: 2097152,
FILTER_USER_SI_TELEGRAM_ID: 4194304,
FILTER_USER_WITHOUT_USERNAME_TELEGRAM: 8388608,
FILTER_USER_PROVINCE: 16777216,
OPTIONS_SEARCH_ONLY_FULL_WORDS: 1,
OPTIONS_SEARCH_USER_ONLY_FULL_WORDS: 2,
@@ -96,9 +104,11 @@ export const shared_consts = {
SETTRUST: 121,
REQFRIEND: 125,
SETFRIEND: 132,
SETHANDSHAKE: 133,
REMOVE_FROM_MYFRIENDS: 144,
REFUSE_REQ_FRIEND: 145,
CANCEL_REQ_FRIEND: 146,
REMOVE_FROM_MYHANDSHAKE: 147,
BLOCK_USER: 155,
UNBLOCK_USER: 156,
REPORT_USER: 158,
@@ -160,19 +170,29 @@ export const shared_consts = {
TABLES_MYGOODS: 'mygoods',
TABLES_MYEVENTS: 'myevents',
MYTABS: [{id: 0, table: 'none' },
{id: 1, table: 'myskills'},
{id: 2, table: 'mybachecas' },
{id: 3, table: 'myhosps'} ,
{id: 4, table: 'mygoods'},
{id: 5, table: 'myevents'}
],
TABLES_ENABLE_GETREC_BYID: ['mybachecas', 'myhosps'],
TABLES_USER_INCLUDE_MY: ['mygroups'],
TABLES_GETCOMPLETEREC: ['myskills', 'mybachecas', 'myhosps', 'mygoods'],
TABLES_INSERT_ALMOST_ONE_TO_ENABLE_CIRCUIT: ['myskills', 'myhosps', 'mygoods'],
TABLES_WITH_FILTER_FIELD: ['caldate'],
TABLES_WITH_SPECIAL_FILTER: ['pub_to_share'],
COL_WITH_FILTER_GTE: ['numMaxPeopleHosp'],
TABLES_WITH_DATE: ['mybachecas', 'myhosps'],
TABLES_WITH_SORTING: ['mybachecas', 'myhosps'],
TABLES_REC_ID: ['skills', 'goods', 'subskills', 'myskills', 'mybachecas', 'myhosps', 'mygoods'],
TABLES_FAVORITE_BOOKMARK: ['myskills', 'mygoods', 'mybachecas', 'myhosps'],
// costanti.VISUTABLE_SCHEDA_USER, VISUTABLE_SCHEDA_GROUP, VISUTABLE_USER_TABGROUP, VISUTABLE_USER_TABCIRCUIT
VERTIC_SHOW_GRID: [-1, 2, -3, -4, -5],
// costanti.VISUTABLE_SCHEDA_USER, VISUTABLE_SCHEDA_GROUP, VISUTABLE_USER_TABGROUP, VISUTABLE_USER_TABCIRCUIT, VISUTABLE_GROUP_CIRCUIT
VERTIC_SHOW_GRID: [-1, 2, -3, -4, -5, -6],
TABLES_UPDATE_LASTIFIED: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'bots'],
TABLES_FINDER: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups'],
@@ -181,6 +201,9 @@ export const shared_consts = {
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_DIRECTORY_A_PARTE: ['mygroups'],
TABLES_WITH_ADMINS: ['mygroups', 'circuits'],
@@ -517,6 +540,14 @@ export const shared_consts = {
value: 23,
label: 'Asciugacapelli',
},
{
value: 24,
label: 'Riscaldamento a legna',
},
{
value: 25,
label: 'Riscaldamento a gas',
},
],
Regions: [
@@ -996,6 +1027,9 @@ export const shared_consts = {
StatusNotifs: {
STATUS_FRIENDS_ACCEPTED: 1,
STATUS_FRIENDS_REFUSED: 2,
STATUS_FRIENDS_REPORTED: 3,
STATUS_HANDSHAKE_ACCEPTED: 10,
STATUS_HANDSHAKE_REFUSED: 11,
},
GroupsNotifs: {
@@ -1007,6 +1041,21 @@ export const shared_consts = {
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: {
CIRCUITS: 1,
OTHERS: 2,
@@ -1062,6 +1111,9 @@ export const shared_consts = {
TYPEDIR_MSGS: 7,
ID_MSGS_NEW_REC: 1,
TYPEDIR_HANDSHAKE: 10,
ID_HANDSHAKE_ACCEPTED: 2,
TYPEDIR_TEST: 444,
ID_TEST_NEW_REC: 1,
},
@@ -1216,6 +1268,11 @@ export const shared_consts = {
FASE3_MONETA_ABILITATA: 3,
},
CIRCUIT_PARAMS: {
SCOPERTO_MIN_GRP: 200,
SCOPERTO_MAX_GRP: 400,
},
FontsInstalled: [
{
label: 'Arial',
@@ -1276,6 +1333,14 @@ export const shared_consts = {
value: 140,
label: 'Dashboard',
},
{
value: 150,
label: 'SendCoinTo',
},
{
value: 280,
label: 'Tutorial',
},
],
TypesElemAdminTools: [
@@ -1307,6 +1372,10 @@ export const shared_consts = {
value: 200,
label: 'Presentazione',
},
{
value: 205,
label: 'Attività',
},
{
value: 210,
label: 'Notifiche in Top',
@@ -1486,4 +1555,41 @@ export const shared_consts = {
return ['_id', 'username', 'group', 'email', 'name', 'surname', 'perm', 'date_reg', 'verified_email', 'notask_verif', 'verified_by_aportador', 'trust_modified', 'img', 'ipaddr', 'lasttimeonline', 'profile', 'news_on']
},
getProjectForAll(proj_add: any) {
let proj = {
idContribType: 1,
idCity: 1,
pub_to_share: 1,
adType: 1,
photos: 1,
note: 1,
descr: 1,
date_created: 1,
date_updated: 1,
userId: 1,
username: 1,
name: 1,
surname: 1,
lasttimeonline: 1,
comune: 1,
mycities: 1,
'profile.img': 1,
'profile.mygroups': 1,
'profile.mycircuits': 1,
'profile.qualifica': 1,
'profile.resid_province': 1,
'profile.username_telegram': 1,
'profile.favorite': 1,
'profile.bookmark': 1,
reported: 1,
date_report: 1,
username_who_report: 1,
};
if (proj_add)
proj = Object.assign({}, proj, proj_add);
return proj;
},
}

View File

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

View File

@@ -1,12 +1,8 @@
<template>
<div class="bordo_stondato_blu">
<CTitleBanner class="column" title="Tipi di ospitalità"></CTitleBanner>
<div class="">
<div class="">
<q-btn
v-if="isInModif"
rounded label="Aggiungi Letti" color="positive" @click="add_newbed()">
</q-btn>
<div v-for="(myaccom, index) in getlist()" :key="index">
<div v-if="isInModif" class="row justify-center bordo_stondato_small">
@@ -17,6 +13,8 @@
v-model:value="myaccom.num"
optval="value"
optlab="label"
style="min-width:80px;"
:sola_lettura="!isInModif"
:options="shared_consts.People" :useinput="false"
>
@@ -58,6 +56,10 @@
</div>
</div>
</div>
<q-btn
v-if="isInModif"
rounded label="Aggiungi Letti" color="positive" @click="add_newbed()">
</q-btn>
</div>
</div>
</template>

View File

@@ -1,11 +1,11 @@
<template>
<div v-if="numcol === 3" class="col-xs-4 col-sm-4 col-md-3 col-lg-2">
<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"/>
<div class="q-ma-sm my-text_3 text-cls no-wrap"><span v-html="label"></span></div>
</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"/>
<div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div>
</q-btn>
@@ -13,11 +13,11 @@
</div>
<div v-else class="col-xs-6 col-sm-6 col-md-4 col-lg-3">
<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"/>
<div class="q-ma-sm text-h5-diff text-cls no-wrap"><span v-html="label"></span></div>
</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"/>
<div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div>
</q-btn>

View File

@@ -24,23 +24,30 @@ export default defineComponent({
const finishLoading = computed(() => globalStore.finishLoading)
const deferredPrompt = computed(() => globalStore.deferredPrompt)
const homescreen = computed(() => globalStore.homescreen)
function initprompt() {
window.addEventListener('beforeinstallprompt', (event) => {
event.preventDefault()
console.log('beforeinstallprompt !')
// Stash the event so it can be triggered later.
globalStore.deferredPrompt = event
})
}
const viewiOS = ref(false)
const viewAndroid = ref(false)
function installApp() {
if (globalStore.deferredPrompt)
if (globalStore.deferredPrompt) {
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() {
initprompt()
tools.checkApp()
}
@@ -54,6 +61,9 @@ export default defineComponent({
installApp,
isAppRunning,
deferredPrompt,
viewiOS,
viewAndroid,
homescreen,
}
}
})

View File

@@ -1,15 +1,106 @@
<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
v-if="deferredPrompt"
glossy
size="xl"
label="Installa App"
@click="installApp"
icon="fas fa-mobile-alt"
color="white"
text-color="green"
/>
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 class="row justify-center">
<CBigBtn

View File

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

View File

@@ -1,40 +1,132 @@
<template>
<div v-if="!tools.isLogged()">
<div v-if="showalways || (!showalways && !tools.isLogged())">
<div class="q-pa-md q-gutter-sm">
<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>
<q-banner rounded class="bg-primary text-white">
<div class="text-h6 text-center">
Accedi al menu inserendo le tue credenziali per entrare 🔑<br>
<div class="text-center">
<q-btn push color="white" text-color="blue" label="Clicca qui per Accedere" @click="tools.openrighttoolbar()"/>
</div>
<br>
Entra anche nel <a href="https://riso.app/gruppi_territoriali"><strong>Canale e Gruppo Telegram di RISO</strong></a> scegliendo la tua provincia !
</div>
<br>
<q-banner
v-if="site.confpages.videoPromo"
rounded
dense
size="lg"
class="bg-grey-3 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">Video di Presentazione:</div>
<br />
<q-video :src="site.confpages.videoPromo" :ratio="16 / 9"> </q-video>
</q-banner>
<q-banner
v-if="site.confpages.PDFPromo"
rounded
dense
size="lg"
class="bg-grey-3 shadow-5 q-my-sm"
color="primary q-title"
style="text-align: center"
>
<div class="mybanner bg-blue text-white">PDF Presentazione RISO:</div>
<br />
<template v-slot:action>
<q-btn
type="a"
rounded
icon="fab fa-telegram"
color="primary"
:href="site.confpages.PDFPromo"
target="_blank"
label="Scarica PDF"
>
</q-btn>
</template>
</q-banner>
<div class="text-h6 text-center">
<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">
<div class="text-h6 text-center">
Visualizza la pagina di Aiuto<br>
Visualizza la pagina di Aiuto<br />
<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>
</q-banner>
</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>
</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 { useI18n } from '@/boot/i18n'
import { costanti } from '@costanti'
export default defineComponent({
name: 'CCurrencyValue',
components: { },
emits: ['changedParamValue' ],
props: {
modelValue: {
type: [String, Number],
required: false,
default: '',
},
small: {
type: Boolean,
default: false,
@@ -45,17 +54,27 @@ export default defineComponent({
required: false,
default: '',
},
value: {
type: Number,
required: true,
},
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,
},
},
components: {},
setup(props, { emit }) {
const $q = useQuasar()
const { t } = useI18n()
@@ -66,13 +85,13 @@ export default defineComponent({
// created
}
onMounted(created)
return {
showingtooltip,
t,
tools,
costanti,
}
},
})

View File

@@ -1,19 +1,52 @@
<template>
<div v-if="small">
<q-chip
dense class="cltexth4 chipbooked shadow-5 q-pa-sm2"
dense
class="cltexth4 chipbooked shadow-5 q-pa-sm2"
size="md"
:color="value > 0 ? `green` : value === 0 ? `gray` : `red`" text-color="white"
icon="fas fa-coins">
{{ 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>
:color="modelValue > 0 ? `green` : modelValue === 0 ? `gray` : `red`"
text-color="white"
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>
</div>
<div v-else>
<div v-if="value !== null" :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 text-grey-14">
<div
v-if="modelValue !== null"
: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">
<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 v-else>{{ label }}</span>
</div>
@@ -25,35 +58,50 @@
type="number"
rounded
: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>
<!--<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"
color="primary" text-color="white"
color="primary"
text-color="white"
round
size="sm"
@click="showingtooltip = !showingtooltip"
>
</q-btn>
<q-icon v-else name="fas fa-coins" :size="small ? `xs` : `sm`" />
</template>
<template v-slot:control>
<div :class="`align_elem_right `+ small ? `text-h7` : ``">{{ valueextra }}{{ tools.roundDec2(value) }}
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{ tips }}</q-tooltip>
<div :class="`align_elem_right ` + (small ? `text-h7` : ``)">
{{ valueextra }}{{ tools.roundDec2(modelValue) }}
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{
tips
}}</q-tooltip>
</div>
</template>
<template v-slot:append>
<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>
</template>
</q-field>
</div>
</div>
</div>
</template>

View File

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

View File

@@ -1,6 +1,9 @@
<template>
<div class="q-ma-md">
<div class="row q-my-md shadow" style="border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.12);">
<div class="q-ma-xs">
<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;"
v-bind:class="{'border-top': $q.platform.is.mobile}">
<q-card class="no-shadow q-pa-sm">
@@ -28,53 +31,110 @@
</q-card>
</div>-->
<div 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"
<div
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-item class="q-pb-none q-pt-xs cursor-pointer" :to="rec.to">
<q-card class="no-shadow q-pa-xs">
<q-item class="q-pb-none q-pt-xs cursor-pointer" :to="tools.updateLink(rec.to)">
<q-item-section>
<q-item-label class="text-h4" style="font-weight: 500;letter-spacing: 3px;">
{{ calcstat.numByTab[rec.table] }}
</q-item-label>
<q-item-label :class="(!$q.dark.isActive? 'text-grey-7':'text-white') + ` title_view_shadow`" style="letter-spacing: 1px;">
<q-item-label
:class="
(!$q.dark.isActive ? 'text-grey-9' : 'text-white') +
` title_view_shadow`
"
style="letter-spacing: 1px"
>
{{ rec.title }}
</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 side>
<q-icon :name="rec.icon" :class="`text-` + rec.color" size="50px"></q-icon>
<q-item-section side class="small_side" style="right: 4px; position: absolute; ">
<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>
<q-item class="q-py-xs" style="min-height: unset">
<q-item-section>
<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>
</q-item-section>
</q-item>
</q-card>
</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"
style="border-left: 1px solid #efefef;" :key="index"
<div class="row" style="margin-top: 4px important; font-size: 0.75rem">
&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">
<q-item class="q-pb-none q-pt-xs cursor-pointer" :to="rec.to">
<div
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-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 }}
</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 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>
</q-card>
</div>
</div>
</div>
</template>

View File

@@ -1062,7 +1062,7 @@
<div class="q-mt-md">
<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
<span v-if="showfirstN > 0">{{ showfirstN }}</span> EVENTI:
</p>
@@ -1227,7 +1227,7 @@
<q-btn
:text-color="$q.dark.isActive ? `white` : `black`"
icon="fas fa-share-alt"
icon="fas fa-link"
label="Condividi"
@click="condividipag(`/event/${event.typol}/${event._id}`)"
></q-btn>
@@ -1248,9 +1248,9 @@
<p
:class="
`listaev__details` + $q.dark.isActive
`listaev__details` + ($q.dark.isActive
? `_darktheme`
: ``
: ``)
"
v-html="event.details"
></p>

View File

@@ -144,6 +144,14 @@ export default defineComponent({
return { sortBy: 'dateTimeStart', descending: false, page: 1, rowsNumber: 20, rowsPerPage: 20 }
else if (props.table === toolsext.TABMOVEMENTS)
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 }
})
@@ -180,32 +188,32 @@ export default defineComponent({
const hint = computed(() => {
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)
return 'nome del Servizio o settore da cercare'
return 'digita il nome del Servizio o del settore'
else if (props.table === toolsext.TABMYGROUPS)
return 'nome del Gruppo da cercare'
return 'digita il nome del Gruppo'
else if (props.table === toolsext.TABCIRCUITS)
return 'nome del Circuito da cercare'
return 'digita il nome della provincia'
else if (props.table === toolsext.TABMYBACHECAS)
return 'nome dell\'Evento da cercare'
return 'digita il nome dell\'Evento'
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(() => {
if (props.table === toolsext.TABMYGOODS)
return $q.screen.gt.xs
return false
else if (props.table === toolsext.TABMYSKILLS)
return $q.screen.gt.xs
return false
else if (props.table === toolsext.TABMYGROUPS)
return $q.screen.gt.xs
return false
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(() => {
@@ -601,7 +609,8 @@ export default defineComponent({
table: 'regions',
key: 'idReg',
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,
arrvalue: [],
filter: null,
@@ -613,7 +622,8 @@ export default defineComponent({
table: 'provinces',
key: 'idProvince',
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,
arrvalue: [],
filter: getFilterProvinceByRegion,
@@ -625,7 +635,8 @@ export default defineComponent({
table: 'cities',
key: 'idCity',
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,
arrvalue: [],
useinput: true,
@@ -634,18 +645,6 @@ export default defineComponent({
// param1: shared_consts.PARAM_SHOW_PROVINCE,
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',
table: toolsext.TABTYPEHOSP,
@@ -1042,6 +1041,7 @@ export default defineComponent({
mycities: 1,
sector: 1,
recCatGrp: 1,
}
},
lookup3: {
@@ -1099,6 +1099,7 @@ export default defineComponent({
groupnameId: 1,
path: 1,
name: 1,
strProv: 1,
subname: 1,
longdescr: 1,
regulation: 1,
@@ -1115,6 +1116,8 @@ export default defineComponent({
status: 1,
transactionsEnabled: 1,
qta_max_default: 1,
fido_scoperto_default_grp: 1,
qta_max_default_grp: 1,
valuta_per_euro: 1,
symbol: 1,
idCity: 1,
@@ -1155,6 +1158,7 @@ export default defineComponent({
mygood: 1,
idStatusSkill: 1,
idContribType: 1,
'profile.username_telegram': 1,
idCity: 1,
pub_to_share: 1,
numLevel: 1,
@@ -1176,6 +1180,7 @@ export default defineComponent({
'profile.img': 1,
'profile.mygroups': 1,
'profile.qualifica': 1,
'profile.resid_province': 1,
reported: 1,
date_report: 1,
username_who_report: 1,
@@ -1222,6 +1227,7 @@ export default defineComponent({
myskill: 1,
idStatusSkill: 1,
idContribType: 1,
'profile.username_telegram': 1,
idCity: 1,
pub_to_share: 1,
dateTimeStart: 1,
@@ -1245,6 +1251,7 @@ lasttimeonline: 1,
'profile.img': 1,
'profile.mygroups': 1,
'profile.qualifica': 1,
'profile.resid_province': 1,
reported: 1,
date_report: 1,
username_who_report: 1,
@@ -1297,6 +1304,7 @@ lasttimeonline: 1,
accomodation: 1,
preferences: 1,
idContribType: 1,
'profile.username_telegram': 1,
photos: 1,
idCity: 1,
pub_to_share: 1,
@@ -1343,6 +1351,7 @@ lasttimeonline: 1,
myskill: 1,
idStatusSkill: 1,
idContribType: 1,
'profile.username_telegram': 1,
idCity: 1,
pub_to_share: 1,
numLevel: 1,
@@ -1364,6 +1373,7 @@ lasttimeonline: 1,
'profile.img': 1,
'profile.mygroups': 1,
'profile.qualifica': 1,
'profile.resid_province': 1,
reported: 1,
date_report: 1,
username_who_report: 1,
@@ -1388,6 +1398,14 @@ lasttimeonline: 1,
}
}
function mySortFieldsAvailable() {
if (props.table === toolsext.TABUSER) {
return userStore.getSortFieldsAvailable()
}
return []
}
function getdefaultnewrec(): any {
if (props.table === toolsext.TABMYSKILLS) {
return tools.getdefaultnewrec_MySkill()
@@ -1437,6 +1455,7 @@ lasttimeonline: 1,
hint,
strextra,
myoptions,
mySortFieldsAvailable,
}
},
})

View File

@@ -15,7 +15,6 @@
<q-input
v-model="search"
filled
dense
type="search"
debounce="500"
:hint="t('finder.search_skill')"
@@ -23,7 +22,6 @@
>
<template v-slot:after>
<q-btn
dense
label=""
color="primary"
@click="doSearch"
@@ -49,6 +47,7 @@
:nodataLabel="noMsgRecord"
:prop_search="true"
:finder="true"
labelElemFind="trovati"
:choose_visutype="visuType"
:butt_modif_new="true && !noButtAdd"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
@@ -56,8 +55,8 @@
:filtercustom="filtercustom"
:prop_searchList="searchList"
:defaultnewrec="getdefaultnewrec"
:selector="selector"
labelBtnAddRow="NONE"
:prop_SortFieldsAvailable="mySortFieldsAvailable"
:labelBtnAddExtra="noButtAdd ? `` : ``"
:extraparams="extraparams()"
>

View File

@@ -36,6 +36,7 @@ import { costanti } from '@costanti'
import translate from '@/globalroutines/util'
import { toolsext } from '@store/Modules/toolsext'
import { CMyCardPopup } from '@/components/CMyCardPopup'
import { CMyCardService } from '@/components/CMyCardService'
import { CMyCardGrpPopup } from '@/components/CMyCardGrpPopup'
import { CMyCardCircuitPopup } from '@/components/CMyCardCircuitPopup'
import { useRouter } from 'vue-router'
@@ -62,6 +63,11 @@ export default defineComponent({
required: false,
default: '',
},
prop_showfilter: {
type: Boolean,
required: false,
default: false,
},
hint: {
type: String,
required: false,
@@ -102,6 +108,11 @@ export default defineComponent({
required: false,
default: false,
},
finder_noNullFilters: {
type: Boolean,
required: false,
default: false,
},
vertical: {
type: Number,
required: false,
@@ -197,6 +208,18 @@ export default defineComponent({
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: {
type: Function,
required: false,
@@ -246,11 +269,26 @@ export default defineComponent({
required: false,
default: '',
},
noaut: {
type: Boolean,
required: false,
default: false,
},
hidetitleIfEmpty: {
type: Boolean,
required: false,
default: false,
},
labelElemFind: {
type: String,
required: false,
default: 'elementi trovati',
}
},
components: {
CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups,
CMyUser, CMyRecCard, CMyCardPopup, CMyRecGrpCard, CMyCardGrpPopup, CMyCardCircuitPopup,
CMyRecCircuitCard
CMyRecCircuitCard, CMyCardService
},
setup(props, { emit }) {
const $q = useQuasar()
@@ -277,6 +315,7 @@ export default defineComponent({
const search = ref('')
const tablesel = ref('')
const showSpin = ref(false)
const loading = ref(false)
const editOn = computed({
@@ -335,6 +374,9 @@ export default defineComponent({
const myvertical = ref(props.vertical)
const ordinam = ref('')
const ordinam_desc = ref(false)
const valoriopt = computed(() => (item: any, addall: boolean, addnone: boolean) => {
// console.log('valoriopt', item.table)
@@ -396,6 +438,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) => {
tools.setCookie('s_adv', newval ? '1' : '0')
})
@@ -511,7 +561,11 @@ export default defineComponent({
function searchval(newval: any, table: any) {
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) {
const recSector = searchList.value.find((rec) => rec.table === 'sectors')
@@ -570,12 +624,65 @@ export default defineComponent({
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
// SELECT * FROM ... WHERE...LIMIT...
async function fetchFromServer(startRow: any, endRow: any, param_myfilter: any, param_myfilterand: any, sortBy: any, descending: any) {
// console.log('fetchFromServer')
// console.log('sortBy', sortBy)
let myobj: any = {}
if (sortBy) {
if (tools.isObject(sortBy)) {
myobj = sortBy
} else if (tools.isArray(sortBy)) {
myobj = getObjSort(sortBy, descending)
} else if (sortBy) {
myobj = {}
if (descending) {
myobj[sortBy] = -1
@@ -584,8 +691,6 @@ export default defineComponent({
}
}
// console.log('sortBy', sortBy)
const filtersearch: any[] = []
const filtersearch2: any[] = []
const filtersearch3or: any[] = []
@@ -809,7 +914,7 @@ export default defineComponent({
}*/
}
// 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 = []
returnedCount = 0
return true
@@ -841,10 +946,10 @@ export default defineComponent({
// @ts-ignore
filter_gte,
sortBy: myobj,
descending,
userId: userStore.my._id,
codeId: '',
options: props.options,
noaut: props.noaut,
}
params.codeId = mycodeid.value
@@ -931,10 +1036,13 @@ export default defineComponent({
// don't forfunction to update local pagination object
pagination.value.page = page
pagination.value.rowsPerPage = rowsPerPage
//pagination.value.sortBy = getObjSort(sortBy, descending)
pagination.value.sortBy = sortBy
ordinam.value = sortBy
ordinam_desc.value = descending
pagination.value.descending = descending
console.log('pagination', pagination)
// console.log('pagination', pagination)
// ...and turn of loading indicator
loading.value = false
@@ -945,10 +1053,17 @@ export default defineComponent({
}
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 myfilterandnow = myfilterand.value
if (ordinam.value) {
sortBy = ordinam.value
descending = ordinam_desc.value
}
sortBy = getObjSort(sortBy, descending)
savefilter()
if (!mytable.value) {
@@ -999,7 +1114,9 @@ export default defineComponent({
// don't forfunction to update local pagination object
pagination.value.page = page
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
// console.log('pagination', pagination)
@@ -1391,6 +1508,17 @@ export default defineComponent({
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)
changeTable(tablesel.value)
@@ -1650,6 +1778,10 @@ export default defineComponent({
// console.log('REFRR - doSearch')
refresh()
}
function doSort() {
refresh()
}
function changefuncAct(newval: any) {
if (!disabilita()) {
@@ -2172,6 +2304,12 @@ export default defineComponent({
showNotification,
editOn,
newRecordBoolOld,
showSpin,
userStore,
doSort,
ordinam,
ordinam_desc,
getNumFilterSelected,
}
}
})

View File

@@ -1,7 +1,5 @@
<template>
<div v-if="tools.isDebugOn()">
</div>
<div v-if="tools.isDebugOn()"></div>
<div :class="$q.screen.lt.sm ? `` : `q-pa-xs`" v-if="isfinishLoading">
<q-toggle
v-if="tools.isManager()"
@@ -10,7 +8,11 @@
icon="fas fa-pencil-alt"
>
</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
v-if="mytable && visButtRow()"
rounded
@@ -26,7 +28,9 @@
v-if="butt_modif_new || mytitle"
: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>
<div v-if="butt_modif_new">
<q-btn
@@ -46,6 +50,7 @@
<q-btn
v-if="mytable && labelBtnAddExtra"
rounded
outline
size="md"
color="primary"
class="centermydiv q-mb-sm"
@@ -73,7 +78,7 @@
-->
</div>
<q-slide-transition>
<div v-show="showfilter">
<div v-show="showfilter || prop_showfilter">
<div
v-show="searchList"
:class="$q.screen.lt.sm ? `` : `row` + ` text-blue `"
@@ -244,7 +249,9 @@
color="positive"
icon="fas fa-filter"
@click="showfilter = !showfilter"
></q-btn>
><q-badge v-if="getNumFilterSelected()" color="red" floating transparent> {{ getNumFilterSelected() }} </q-badge>
</q-btn>
<q-btn
dense
color="orange"
@@ -252,7 +259,21 @@
@click="showNotification"
></q-btn>
</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
dense
label=""
@@ -294,7 +315,7 @@
{{ pagination.rowsNumber }} elemento trovato
</div>
<div v-if="pagination.rowsNumber > 1 && prop_search">
{{ pagination.rowsNumber }} elementi trovati
{{ pagination.rowsNumber }} {{ labelElemFind }}
</div>
<div v-if="choose_visutype && $q.screen.gt.xs" class="">
@@ -384,6 +405,7 @@
:prop_myrec="row"
@cmdext="cmdExt"
:editOn="editOn"
:margin_right="margin_right"
>
</CMyRecCard>
</div>
@@ -419,16 +441,18 @@
v-else-if="
(showType === costanti.SHOW_GROUPINFO &&
myvertical !== costanti.VISUTABLE_SCHEDA_GROUP) ||
(myvertical === 2 && tablesel === 'mygroups')
(myvertical === 2 && tablesel === 'mygroups') ||
myvertical === costanti.VISUTABLE_GROUP_CIRCUIT
"
class="fill-all-width"
>
<div>
<CMyGroups
v-model="filtergrp"
:circuitname="circuitname"
:finder="false"
:mygrp="row"
:visu="costanti.FIND_GROUP"
:visu="visufind ? visufind : costanti.FIND_GROUP"
/>
</div>
</div>
@@ -438,16 +462,21 @@
"
>
<div class="q-pa-xs row items-start q-gutter-xs">
<q-card
class="my-card text-white"
:style="
`background: radial-gradient(circle, #cccccc 0%, ` +
(tools.isEntrataByRecMov(row) ? `#aaffaa` : `#ffaaaa`) +
` 100%)`
"
>
<q-card class="my-card text-black">
<q-toolbar class="bg-primary text-white" style="min-height: 30px">
<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)
? t('movement.movin')
@@ -461,7 +490,15 @@
v-if="
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)">
<CMyPopupEdit
@@ -489,7 +526,7 @@
</div>
</div>
<template v-slot:loading>
<div class="text-center">
<div v-if="!hidetitleIfEmpty" class="text-center">
<q-spinner-dots color="primary" size="40px" />
</div>
</template>
@@ -1034,7 +1071,7 @@
</q-table>
<q-page-sticky
v-if="mytable && butt_modif_new"
v-if="mytable && butt_modif_new && !hidetitleIfEmpty"
position="bottom-right"
:offset="[18, 68]"
>
@@ -1053,6 +1090,7 @@
@hide="hidewindow"
:maximized="$q.screen.lt.sm"
>
<CMyCardGrpPopup
v-if="mytable === toolsext.TABMYGROUPS"
:table="mytable"
@@ -1065,6 +1103,9 @@
:prop_myrec="myrecdialog"
>
</CMyCardCircuitPopup>
<CMyCardService v-else-if="shared_consts.TABLES_FAVORITE_BOOKMARK.includes(mytable)"
:table="mytable" :prop_myrec="myrecdialog">
</CMyCardService>
<CMyCardPopup v-else :table="mytable" :prop_myrec="myrecdialog">
</CMyCardPopup>
</q-dialog>
@@ -1131,7 +1172,7 @@
>
<q-card class="dialog_card">
<q-bar dense class="bg-primary text-white">
Nuovo:
Nuovo {{ mytitle }}:
<q-space />
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-bar>
@@ -1205,7 +1246,7 @@
>
<q-card class="dialog_card">
<q-bar dense class="bg-primary text-white">
Nuovo:
Nuovo {{ mytitle }}:
<q-space />
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-bar>
@@ -1334,7 +1375,7 @@
</q-card-actions>
</q-card>
</q-dialog>
<br />
<span v-if="!hidetitleIfEmpty"> <br /></span>
</div>
</template>
<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>
<div>
<div class="row q-ma-sm shadow justify-center" style="border-radius: 4px;border: 1px solid rgba(0, 0, 0, 0.12);">
<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)"
>
<CBigBtn
v-for="(card, ind) of cardsbig" :key="ind"
:label="card.title" :to="card.to" :icon="card.icon" :color="card.color" :text-color="!!card.textcolor ? card.textcolor : ''"
v-for="(card, ind) of cardsbig"
:key="ind"
:label="card.title"
:to="card.to"
:icon="card.icon"
:color="card.color"
:text-color="!!card.textcolor ? card.textcolor : ''"
:small="card.small"
:numcol="2"
:hint="card.hint" :disable="card.disable">
:hint="card.hint"
:disable="card.disable"
>
</CBigBtn>
</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
v-for="(card, ind) of cardssmall" :key="ind"
v-for="(card, ind) of cardssmall"
:key="ind"
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"
:numcol="3"
:hint="card.hint" :disable="card.disable">
:hint="card.hint"
:disable="card.disable"
>
</CBigBtn>
</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,239 @@
<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"
>
<q-tabs
v-model="mytab"
inline-label
dense
class="shadow-2"
>
<q-tab name="my" icon="far fa-user" />
<q-tab name="favorite" icon="favorite" content-class="text-red" />
<q-tab name="bookmark" icon="bookmark" content-class="text-teal" />
</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"
:noaut="true"
:title="card.title"
/>
</div>
</q-card>
</div>
</q-tab-panel>
<q-tab-panel name="favorite">
<div
v-for="(card, ind) of mycards"
:key="ind"
:name="card.table"
>
<q-card class="q-my-md">
<div v-if="card.showfavorite && filtrofavorite(card.table)">
<CSkill
:table="card.table"
:filtercustom="filtrofavorite(card.table)"
:butt_modif_new="false"
:visuinpage="true"
:noaut="false"
:title="card.title"
/>
</div>
</q-card>
</div>
</q-tab-panel>
<q-tab-panel name="bookmark">
<div
v-for="(card, ind) of mycards"
:key="ind"
:name="card.table"
>
<q-card class="q-my-md">
<div v-if="card.showfavorite && filtrobookmark(card.table)">
<CSkill
:table="card.table"
:filtercustom="filtrobookmark(card.table)"
:butt_modif_new="isMyRecord(myuser.username)"
:visuinpage="true"
:noaut="true"
:title="card.title"
/>
</div>
</q-card>
</div>
</q-tab-panel>
</q-tab-panels>
</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">
<q-btn
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"
@click="condividipag"></q-btn>
</div>

View File

@@ -79,7 +79,7 @@
<div class="q-ma-sm">
<q-btn
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"
@click="condividipag"></q-btn>
</div>

View File

@@ -34,9 +34,9 @@ export default defineComponent({
default: null,
},
idRec: {
type: Number,
type: String,
required: false,
default: 0
default: ''
},
nopopup: {
type: Boolean,
@@ -66,7 +66,7 @@ export default defineComponent({
function load() {
// Carica il profilo di quest'utente
if (props.idRec > 0) {
if (props.idRec) {
userStore.loadGeneric(props.table, props.idRec, idnotif.value).then((ris) => {
myrec.value = ris
notifStore.setAsRead(idnotif.value)
@@ -87,8 +87,11 @@ export default defineComponent({
load()
}
function getlinkpage() {
return self.location.host + tools.getPathByTable(props.table, myrec.value._id)
}
function condividipag() {
const mystr = self.location.host + tools.getPathByTable(props.table, myrec.value._id)
const mystr = getlinkpage()
tools.copyStringToClipboard($q, mystr, true)
tools.sendMsgTelegramCmd($q, t, shared_consts.MsgTeleg.SHARE_TEXT, false, mystr)
return true
@@ -120,6 +123,7 @@ export default defineComponent({
col,
condividipag,
showBadge,
getlinkpage,
}
}
})

View File

@@ -1,6 +1,6 @@
<template>
<q-card class="dialog_card q-mb-lg" v-if="myrec._id">
<q-card class="dialog_card q-mb-lg" v-if="myrec && myrec._id">
<q-footer
v-if="!nopopup"
@@ -112,11 +112,24 @@
<div class="q-ma-sm">
<q-btn
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"
@click="condividipag"></q-btn>
</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>
</q-card-section>

View File

@@ -0,0 +1,127 @@
.profile {
width: 100%;
margin: 0 auto;
max-width: 450px;
}
.myrow{
display: flex;
@media (max-width: 600px) {
flex-flow: column;
}
}
.qualifica{
border: solid 2px #4198ef;
border-radius: 1rem;
padding: 5px;
}
.text-bacheca{
margin: 10px;
border: solid 2px #4198ef;
border-radius: 1rem;
padding: 10px;
}
.note-bacheca{
border: solid 2px #C10015;
border-radius: 1rem;
padding: 10px;
}
.img {
margin-left: auto;
margin-right: auto;
max-height: 500px;
max-width: 350px;
@media (max-width: 500px) {
max-height: 500px;
max-width: 400px;
}
}
$graytext: #555;
.cal {
color: black;
font-size: 1rem;
font-weight: 400;
line-height: 1.25rem;
letter-spacing: 0.03333em;
&__title {
color: white;
font-weight: 700;
font-size: 1rem;
padding-bottom: 10px;
}
&__details {
color: black;
}
&__hours {
color: blue;
&-title {
color: $graytext;
}
&-content {
font-weight: 400;
}
}
&__where {
margin-top: 5px;
color: blue;
&-title {
color: $graytext;
}
&-content {
color: darkblue !important;
}
}
&__when {
margin-top: 5px;
color: blue;
&-title {
color: $graytext;
}
&-content {
color: darkblue !important;;
}
}
&__teacher {
margin-top: 5px;
&-title {
color: $graytext;
}
&-content {
color: darkblue !important;;
}
}
&__quota {
margin-top: 5px;
&-title {
color: $graytext;
}
&-content {
}
}
&__img {
width: 100px;
height: 100px;
padding: 10px;
}
}

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,468 @@
<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="red"
:icon="userStore.isFavorite(myrec._id, table) ? 'favorite' : 'far fa-heart'"
@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="teal"
:icon="userStore.isBookmarked(myrec._id, table) ? 'bookmark' : 'far fa-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: 200px">
<q-item
v-if="myrec.profile.username_telegram"
clickable
v-close-popup
>
<q-item-section avatar>
<q-icon color="blue" name="far fa-comment" />
</q-item-section>
<q-item-section>
<a :href="tools.getHttpForTelegram(myrec.profile.username_telegram)" target="_blank">{{ $t('dialog.contact') }} - {{tools.getNomeUtenteByRecUser(myrec)}}</a>
</q-item-section>
</q-item>
<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', {num: myrec.myfav ? myrec.myfav.length : 0})
)
"
>
<q-item-section avatar>
<q-icon color="red" name="favorite" />
</q-item-section>
<q-item-section>
{{ $t('cmd.favorite', {num: myrec.myfav ? myrec.myfav.length : 0}) }}
</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="
clicca(
costanti.TIPOFAVBOOK.BOOKMARK,
false,
$t('cmd.bookmark', {num: myrec.mybook ? myrec.mybook.length : 0})
)
"
>
<q-item-section avatar>
<q-icon color="teal" name="bookmark" />
</q-item-section>
<q-item-section>
{{ $t('cmd.bookmark', {num: myrec.mybook ? myrec.mybook.length : 0}) }}
</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="myrec.dateTimeStart">
<q-item-section avatar>
<q-icon color="green" name="far fa-calendar-alt" />
</q-item-section>
<q-item-section>
<q-item-label>
<span>{{tools.getstrDateMonthTimeLong(myrec.dateTimeStart)}}</span>
</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="myrec.dateTimeEnd">
<q-item-section avatar>
<q-icon color="red" name="far fa-calendar-alt" />
</q-item-section>
<q-item-section>
<q-item-label>
<span>{{tools.getstrDateMonthTimeLong(myrec.dateTimeEnd)}}</span>
</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

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

View File

@@ -2,7 +2,7 @@ import { computed, defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore'
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 { shared_consts } from '@/common/shared_vuejs'
import { tools } from '@store/Modules/tools'
@@ -11,13 +11,14 @@ import { useI18n } from '@/boot/i18n'
import { useRoute, useRouter } from 'vue-router'
import { CUserNonVerif } from '@/components/CUserNonVerif'
import { CSaldo } from '@/components/CSaldo'
import { CTitleBanner } from '@/components/CTitleBanner'
import { toolsext } from '@store/Modules/toolsext'
import { useGlobalStore } from '@store/globalStore'
export default defineComponent({
name: 'CMyCircuit',
emits: ['setCmd'],
components: {CUserNonVerif, CSaldo},
components: {CUserNonVerif, CSaldo, CTitleBanner},
props: {
mycircuit: {
type: Object as PropType<ICircuit | null>,
@@ -29,9 +30,19 @@ export default defineComponent({
required: false,
default: null,
},
prop_groupnameSel: {
type: Object as PropType<IMyGroup | null>,
required: false,
default: null,
},
visu: {
type: Number,
required: true,
},
noaut: {
type: Boolean,
required: false,
default: false,
}
},
@@ -55,12 +66,16 @@ export default defineComponent({
const table = ref(toolsext.TABCIRCUITS)
const showingtooltip = ref(false)
const showrules = ref(false)
const requestToEnterCircuit = ref(false)
const groupnameSel = ref(<IMyGroup | null>null)
watch(() => props.mycircuit, (newval, oldval) => {
mounted()
})
function mounted() {
groupnameSel.value = props.prop_groupnameSel
if (!props.mycircuit) {
if (props.circuitname) {
circuit.value = null
@@ -74,7 +89,7 @@ export default defineComponent({
// @ts-ignore
const rectofind = circuitStore.listcircuits.find((circ: ICircuit) => circ.name === circuit.value.circuitname!)
if (rectofind) {
console.log('rectofind', rectofind)
// console.log('rectofind', rectofind)
circuit.value = rectofind
}
}
@@ -116,6 +131,9 @@ export default defineComponent({
saldo,
globalStore,
showingtooltip,
showrules,
requestToEnterCircuit,
groupnameSel,
}
},
})

View File

@@ -1,49 +1,113 @@
<template>
<div v-if="tools.isUserOk()">
<div v-if="tools.isUserOk() || noaut">
<div v-if="circuit">
<q-item class="q-my-sm bordo_stondato_circuiti" clickable>
<q-item-section avatar @click="naviga(tools.getPathByTableAndRec(table, circuit))">
<q-item
: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-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>
<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>
</div>
</q-item-section>
<q-item-section>
<q-item-label @click="naviga(tools.getPathByTableAndRec(table, circuit))"><strong>{{ circuit.name }}</strong> <span
v-if="circuit.subname"> ({{ circuit.subname }})</span>
<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 v-if="circuit.subname"> ({{ circuit.subname }})</span>
</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 caption lines="3">
<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"
size="sm"
:icon="globalStore.getValueByTableSingle('statuscircuit', circuit.status, 'icon')">{{
globalStore.getValueByTableSingle('statuscircuit', circuit.status)
:icon="
globalStore.getValueByTableSingle(
'statuscircuit',
circuit.status,
'icon'
)
"
>{{
globalStore.getValueByTableSingle(
'statuscircuit',
circuit.status
)
}}
<q-btn
class="q-ml-sm"
icon="fas fa-info" color="primary" text-color="white"
icon="fas fa-info"
color="primary"
text-color="white"
size="xs"
round
@click="showingtooltip = !showingtooltip">
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{globalStore.getValueByTableSingle('statuscircuit', circuit.status, 'hint')}}</q-tooltip>
@click="showingtooltip = !showingtooltip"
>
<q-tooltip :offset="[10, 10]" v-model="showingtooltip">{{
globalStore.getValueByTableSingle(
'statuscircuit',
circuit.status,
'hint'
)
}}</q-tooltip>
</q-btn>
</q-chip>
</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>
<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 @click="naviga(tools.getPathByTableAndRec(table, circuit))" lines="1">
<q-item-label
@click="naviga(tools.getPathByTableAndRec(table, circuit))"
lines="1"
>
<CSaldo
v-if="tools.isUserOk()"
:account="account"
:symbol="circuit.symbol"
:color="circuit.color"
@@ -54,34 +118,124 @@
</q-item-label>
</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-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-list
v-if="(!userStore.IsMyCircuitByName(circuit.name) && !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)">
v-if="
!userStore.IsMyCircuitByName(circuit.name) &&
!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>
</q-list>
<q-list
v-else-if="(!userStore.IsMyCircuitByName(circuit.name) && 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(), false, circuit.name)">
<q-item-section>{{ $t('shared.refuse_ask') }}</q-item-section>
v-else-if="
!userStore.IsMyCircuitByName(circuit.name) &&
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(),
false,
circuit.name
)
"
>
<q-item-section>{{
$t('shared.refuse_ask')
}}</q-item-section>
</q-item>
<q-item 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
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-list>
<q-list 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-list
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>
</q-list>
<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, myusername(), '', circuit.name)">
<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,
myusername(),
'',
circuit.name
)
"
>
<q-item-section>{{ $t('circuit.delete') }}</q-item-section>
</q-item>
</q-list>
@@ -89,32 +243,83 @@
</q-btn>
</q-item-label>
</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-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" 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
clickable
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-list>
</q-menu>
</q-btn>
</q-item-label>
</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-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" 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
clickable
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 clickable icon="fas fa-user-minus" 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
clickable
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-list>
</q-menu>
@@ -122,7 +327,161 @@
</q-item-label>
</q-item-section>
</q-item>
<div class="centermydiv" v-if="visu === costanti.ENTER_TO_THE_CIRCUIT">
<q-btn
v-if="
!userStore.IsMyCircuitByName(circuit.name) &&
!userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsRefusedCircuitByName(circuit.name)
"
icon="fas fa-user-plus"
color="primary"
:label="$t('circuit.ask')"
@click="
requestToEnterCircuit = true;
groupnameSel = null;
"
/>
<q-btn
v-if="userStore.IsMyCircuitByName(circuit.name)"
rounded
icon="fas fa-ellipsis-h"
>
<q-menu>
<q-list v-if="true" style="min-width: 150px">
<q-item
clickable
v-close-popup
v-if="saldo === 0"
@click="
tools.removeFromMyCircuits(
$q,
userStore.my.username,
circuit.name,
'',
$t('circuit.domanda_exit_fromcircuit', {
circuitname: circuit.name,
})
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<q-item-section>{{
$t('circuit.exit_circuit')
}}</q-item-section>
</q-item>
<q-list
v-if="tools.iAmAdminCircuit(circuit.name)"
style="min-width: 200px"
>
<q-item
clickable
v-close-popup
@click="
tools.setCmd(
$q,
shared_consts.CIRCUITCMD.DELETE,
userStore.my.username,
'',
circuit.name
)
"
>
<q-item-section avatar>
<q-icon color="negative" name="fas fa-trash-alt" />
</q-item-section>
<q-item-section>{{ $t('circuit.delete') }}</q-item-section>
</q-item>
</q-list>
</q-list>
</q-menu>
</q-btn>
<div
v-if="
userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsMyCircuitByName(circuit.name)
"
>
<CTitleBanner
:title="$t('circuit.wait_acceptation')"
bgcolor="bg-primary"
clcolor="text-white"
>
</CTitleBanner>
</div>
<q-btn
v-if="
userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsMyCircuitByName(circuit.name)
"
icon="fas fa-user-minus"
flat
outline
:label="$t('shared.cancel_ask_short')"
@click="
tools.cancelReqCircuit($q, userStore.my.username, circuit.name)
"
/>
</div>
</div>
<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 v-else>
<CUserNonVerif></CUserNonVerif>

View File

@@ -974,6 +974,16 @@
</div>
</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>

View File

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

View File

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

View File

@@ -18,6 +18,11 @@ export default defineComponent({
type: String,
required: true,
},
hint: {
type: String,
required: false,
default: '',
},
mykey: {
type: String,
required: true,
@@ -140,8 +145,9 @@ export default defineComponent({
function showandsel(row: any, col: any, newval: any, valinitial: any) {
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)
}
}

View File

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

View File

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

View File

@@ -2,3 +2,24 @@
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

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

View File

@@ -2,130 +2,587 @@
<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-section
avatar
@click="naviga(tools.getPathByGroup(grp, table))"
>
<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-item-section>
<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 v-if="grp.descr" caption lines="3"><em>{{ grp.descr }}</em></q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.MY_GROUPS">
<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-menu>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" 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
clickable
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-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-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-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-section>{{ $t('groups.block_group') }}</q-item-section>
<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-section>{{
$t('groups.block_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.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-item-label v-if="visu === costanti.REQ_ADD_USER_TO_CIRCUIT">
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup
@click="tools.setCmd($q, shared_consts.GROUPSCMD.REQGROUP, myusername(), false, grp.groupname)">
<q-item-section>{{ $t('groups.reject_ask_group') }}</q-item-section>
<q-item
clickable
v-close-popup
dense
@click="showsendCoinTo = true"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-coins" />
</q-item-section>
<q-item-section>{{
$t('circuit.sendcoins')
}}</q-item-section>
</q-item>
<q-item
v-if="tools.iAmAdminGroup(grp.groupname)"
clickable
v-close-popup
dense
@click="tools.receiveRisGroup(grp.groupname, $q, $t)"
>
<q-item-section avatar>
<q-icon color="positive" name="fas fa-download" />
</q-item-section>
<q-item-section>{{
$t('circuit.receive_coins')
}}</q-item-section>
</q-item>
<q-item
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-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.ASK_SENT_GROUP">
<q-item-label>
<q-item-label v-else-if="visu === costanti.USER_GROUPS">
<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-label v-else-if="visu === costanti.REQ_GROUP">
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" 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" 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
clickable
icon="fas fa-user-minus"
outline
v-close-popup
@click="
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-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.FIND_GROUP">
<q-item-label>
<q-btn rounded :icon="userStore.IsMyGroupByGroupname(grp.groupname) ? `fas fa-ellipsis-h` : `fas fa-user`">
<q-item-label v-else-if="visu === costanti.ASK_SENT_GROUP">
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list v-if="(!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-list style="min-width: 150px">
<q-item
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-list>
<q-list v-else-if="(!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-menu>
</q-btn>
</q-item-label>
<q-item-label v-else-if="visu === costanti.FIND_GROUP">
<q-btn
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-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-list
v-if="
!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-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-list
v-else-if="
!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-list>
</q-menu>
@@ -138,6 +595,30 @@
<div v-else>
<CUserNonVerif></CUserNonVerif>
</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>
<script lang="ts" src="./CMyGroup.ts">

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>

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