13 Commits

Author SHA1 Message Date
Surya Paolo
5d8e38fea6 galleria prodotto 2025-08-12 19:43:36 +02:00
Surya Paolo
f1f3f5ad07 - Iniziato a scrivere la CHATBOT... 2025-08-09 00:48:44 +02:00
Surya Paolo
6013a624f6 - controllo della @ sull'username telegram (sugli Eventi)
- controllo email di test, se funzionante o no
2025-07-29 12:54:40 +02:00
Surya Paolo
85db3b4a61 - Ricerca delle Organizzazioni, per inviare i RIS. 2025-07-21 22:49:49 +02:00
Surya Paolo
31161b6a32 - entra in Circuito Italia subito, senza aspettare conferma... 2025-07-21 19:44:24 +02:00
Surya Paolo
6779b0ea25 - Poter impostare per ogni Provincia un Circuito RIS specifico, anziché quello provinciale:
Esempio: Napoli: (Circuito RIS Campania) e Sud Sardegna: Cagliari.
2025-07-21 19:08:37 +02:00
Surya Paolo
f12341f780 - Aggiunta possibilità di disattivare i link alle immagini dei libri. (opzione sul catalogo: disattiva_link_immagini) 2025-07-18 10:43:08 +02:00
Surya Paolo
43938023ee - Aggiunta della copertina iniziale nelle raccolte (Catalogo Generale).
- Corretto altezza delle immagini che erano stretchate.
- Fix: poter spostare l'ordinamento dei libri corretto.
2025-07-15 17:46:30 +02:00
Surya Paolo
969e7b726e - corretto import XLS... 2025-07-11 15:03:06 +02:00
Surya Paolo
d37797fdad - Import di un file XLS contenente una lista di libri, all'interno di un catalogo. 2025-07-11 12:55:24 +02:00
Surya Paolo
2ce8a72286 . esportazione lista catalogo direttamente in EXCEL, e scelta dei campi. 2025-07-10 00:43:28 +02:00
Surya Paolo
be0d7efca2 -statistiche OK 2025-07-08 18:01:17 +02:00
Surya Paolo
68dac1b2f4 aa 2025-07-08 17:42:46 +02:00
143 changed files with 3062 additions and 3593450 deletions

4
.env
View File

@@ -1,6 +1,6 @@
VITE_APP_VERSION="1.2.62"
VITE_APP_VERSION="1.2.67"
VITE_LANG_DEFAULT="it"
VITE_PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
VITE_SERVICE_WORKER_FILE="sw-1.2.62.js"
VITE_SERVICE_WORKER_FILE="sw-1.2.67.js"
VITE_PROJECT_ID_MAIN="5cc0a13fe5c9d156728f400a"
VITE_VUE_ROUTER_MODE="history"

View File

@@ -1,12 +1,12 @@
VITE_APP_ID="18"
VITE_APP_ID="13"
VITE_APP_URL="https://localhost"
VITE_MONGODB_HOST="https://localhost:3000"
VITE_LOGO_REG='gruppomacro-logo-full.png'
VITE_LOGO_REG='riso-logo-full.png'
VITE_PUBLICKEY_PUSH='BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8'
VITE_DEBUG="1"
VITE_VUE_APP_ISTEST=0
VITE_VUE_APP_INLOCALE=1
DIRECTORY_LOCAL="newfreeplanet"
DIRECTORY_LOCAL="myprojplanet_vite"
DIRECTORY_SERVER="freeplanet_serverside"
SERVERDIR_WEBSITE=""
SERVERPW_WEBSITE=""

View File

@@ -1,13 +1,11 @@
VITE_APP_ID="18"
VITE_APP_URL="https://gruppomacro.app"
VITE_MONGODB_HOST="https://api.gruppomacro.app"
VITE_LOGO_REG='gruppomacro-logo-full.png'
VITE_PUBLICKEY_PUSH="BJgo8XR_upbnbMLWgCAUELo6DK7dRXffYAnFOxbaMMz5favBgcQBKT-eISqouO-jRad4Sw8l5nd2wCF6KorGiTc"
VITE_APP_ID="13"
VITE_APP_URL="https://riso.app"
VITE_MONGODB_HOST="https://api.riso.app"
VITE_LOGO_REG='riso-logo-full.png'
VITE_PUBLICKEY_PUSH="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
VITE_DEBUG="0"
VITE_VUE_APP_ISTEST="0"
DIRECTORY_LOCAL="myprojplanet_vite"
DIRECTORY_SERVER="/var/www/nodejs_piuchebuono_server"
SERVERDIR_WEBSITE="/var/www/gruppomacro.app"
SERVERPW_WEBSITE="pwdadmin@1AOK"
PORT_SPA="8089"
PORT_PWA="8099"
DIRECTORY_LOCAL=myprojplanet_vite
DIRECTORY_SERVER=/var/www/nodejs_riso_server
SERVERDIR_WEBSITE="/var/www/riso.app"
SERVERPW_WEBSITE="pwdadmin@1AOK"

3
.gitignore vendored
View File

@@ -30,7 +30,8 @@ yarn-error.log
/.scripts
key.pem
public/upload/
upload/
/upload/
scripts/_ALL_SITES/gruppomacro.app/public/upload/
._yarn.lock
.gitignore
._upload

BIN
1_module copia.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 KiB

View File

@@ -10,7 +10,7 @@
<meta name="description" content="<%= productDescription %>">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="version" content="1.2.62">
<meta name="version" content="1.2.67">
<meta name="viewport"
content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>">

View File

@@ -1,28 +1,28 @@
{
"name": "gruppomacro",
"version": "1.2.62",
"description": "Gruppo Macro",
"productName": "Gruppo Macro",
"name": "riso",
"version": "1.2.67",
"productName": "Riso 💚 - Rete Italiana Scambi Orizzontali",
"description": "Progetto RISO (Rete Italiana Scambi Orizzontali) promuove una rete di comunità locali che favoriscono scambi di beni, servizi e ospitalità. Con l'App RISO, sviluppata per facilitare il baratto, il dono e l'uso di monete alternative come i RIS, il progetto crea legami autentici basati sulla fiducia e sostenibilità. Partecipa agli scambi e costruisci una comunità più consapevole e autosufficiente.",
"author": "Surya",
"private": true,
"keywords": [],
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8089 APP_VERSION='1.2.62' quasar dev",
"dev": "APP_VERSION='1.2.67' PORT=8084 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.62' quasar build -m spa",
"buildspa": "quasar build -m spa",
"lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"",
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.67' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

BIN
public/images/layers-2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/images/layers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

BIN
public/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

BIN
public/images/riso_home.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -1,2 +0,0 @@
!function(){'use strict';try{self['workbox:sw:6.1.0']&&_()}catch(t){}const t={backgroundSync:'background-sync',broadcastUpdate:'broadcast-update',cacheableResponse:'cacheable-response',core:'core',expiration:'expiration',googleAnalytics:'offline-ga',navigationPreload:'navigation-preload',precaching:'precaching',rangeRequests:'range-requests',routing:'routing',strategies:'strategies',streams:'streams',recipes:'recipes'};self.workbox=new class{constructor(){return this.v={},this.Pt={debug:'localhost'===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.$t=this.Pt.debug?'dev':'prod',this.jt=!1,new Proxy(this,{get(e,s){if(e[s])return e[s];const o=t[s];return o&&e.loadModule('workbox-'+o),e[s]}})}setConfig(t={}){if(this.jt)throw new Error('Config must be set before accessing workbox.* modules');Object.assign(this.Pt,t),this.$t=this.Pt.debug?'dev':'prod'}loadModule(t){const e=this.St(t);try{importScripts(e),this.jt=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}St(t){if(this.Pt.modulePathCb)return this.Pt.modulePathCb(t,this.Pt.debug);let e=['https://storage.googleapis.com/workbox-cdn/releases/6.1.0'];const s=`${t}.${this.$t}.js`,o=this.Pt.modulePathPrefix;return o&&(e=o.split('/'),''===e[e.length-1]&&e.splice(e.length-1,1)),e.push(s),e.join('/')}}}();
//# sourceMappingURL=workbox-sw.js.map

View File

@@ -1,2 +0,0 @@
!function(){"use strict";try{self["workbox:sw:5.1.4"]&&_()}catch(t){}const t={backgroundSync:"background-sync",broadcastUpdate:"broadcast-update",cacheableResponse:"cacheable-response",core:"core",expiration:"expiration",googleAnalytics:"offline-ga",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams"};self.workbox=new class{constructor(){return this.v={},this.t={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.s=this.t.debug?"dev":"prod",this.o=!1,new Proxy(this,{get(e,s){if(e[s])return e[s];const o=t[s];return o&&e.loadModule("workbox-"+o),e[s]}})}setConfig(t={}){if(this.o)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.t,t),this.s=this.t.debug?"dev":"prod"}loadModule(t){const e=this.i(t);try{importScripts(e),this.o=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}i(t){if(this.t.modulePathCb)return this.t.modulePathCb(t,this.t.debug);let e=["https://storage.googleapis.com/workbox-cdn/releases/5.1.4"];const s=`${t}.${this.s}.js`,o=this.t.modulePathPrefix;return o&&(e=o.split("/"),""===e[e.length-1]&&e.splice(e.length-1,1)),e.push(s),e.join("/")}}}();
//# sourceMappingURL=workbox-sw.js.map

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
public/noimg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,2 +1,2 @@
!function(){"use strict";try{self["workbox:sw:5.1.4"]&&_()}catch(t){}const t={backgroundSync:"background-sync",broadcastUpdate:"broadcast-update",cacheableResponse:"cacheable-response",core:"core",expiration:"expiration",googleAnalytics:"offline-ga",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams"};self.workbox=new class{constructor(){return this.v={},this.t={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.s=this.t.debug?"dev":"prod",this.o=!1,new Proxy(this,{get(e,s){if(e[s])return e[s];const o=t[s];return o&&e.loadModule("workbox-"+o),e[s]}})}setConfig(t={}){if(this.o)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.t,t),this.s=this.t.debug?"dev":"prod"}loadModule(t){const e=this.i(t);try{importScripts(e),this.o=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}i(t){if(this.t.modulePathCb)return this.t.modulePathCb(t,this.t.debug);let e=["https://storage.googleapis.com/workbox-cdn/releases/5.1.4"];const s=`${t}.${this.s}.js`,o=this.t.modulePathPrefix;return o&&(e=o.split("/"),""===e[e.length-1]&&e.splice(e.length-1,1)),e.push(s),e.join("/")}}}();
!function(){"use strict";try{self["workbox:sw:7.3.0"]&&_()}catch(t){}const t={backgroundSync:"background-sync",broadcastUpdate:"broadcast-update",cacheableResponse:"cacheable-response",core:"core",expiration:"expiration",googleAnalytics:"offline-ga",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams",recipes:"recipes"};self.workbox=new class{constructor(){return this.v={},this.Pt={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.$t=this.Pt.debug?"dev":"prod",this.jt=!1,new Proxy(this,{get(e,s){if(e[s])return e[s];const o=t[s];return o&&e.loadModule(`workbox-${o}`),e[s]}})}setConfig(t={}){if(this.jt)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.Pt,t),this.$t=this.Pt.debug?"dev":"prod"}loadModule(t){const e=this.St(t);try{importScripts(e),this.jt=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}St(t){if(this.Pt.modulePathCb)return this.Pt.modulePathCb(t,this.Pt.debug);let e=["https://storage.googleapis.com/workbox-cdn/releases/7.3.0"];const s=`${t}.${this.$t}.js`,o=this.Pt.modulePathPrefix;return o&&(e=o.split("/"),""===e[e.length-1]&&e.splice(e.length-1,1)),e.push(s),e.join("/")}}}();
//# sourceMappingURL=workbox-sw.js.map

View File

@@ -1,6 +1,6 @@
{
"name": "cnm",
"version": "1.2.62",
"version": "1.2.67",
"description": "Comunita Nuovo Mondo",
"productName": "ComunitaNuovoMondo",
"author": "Surya",
@@ -9,7 +9,7 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8083 APP_VERSION='1.2.62' quasar dev",
"dev": "PORT=8083 APP_VERSION='1.2.67' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production quasar build -m pwa",
@@ -21,8 +21,8 @@
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.67' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -1,6 +1,6 @@
{
"name": "freeplanet",
"version": "1.2.62",
"version": "1.2.67",
"description": "freeplanet",
"productName": "freeplanet",
"author": "Surya",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8087 APP_VERSION='1.2.62' quasar dev",
"dev": "PORT=8087 APP_VERSION='1.2.67' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8097 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8087 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8097 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8087 APP_VERSION='1.2.67' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -1,28 +1,28 @@
{
"name": "gruppomacro",
"version": "1.2.62",
"description": "Gruppo Macro",
"version": "1.2.67",
"productName": "Gruppo Macro",
"description": "Il Gruppo Editoriale Macro, attivo dal 1987, è leader europeo nella pubblicazione di libri per il benessere e la consapevolezza. Con oltre 1.500 titoli, promuove una visione armonica del mondo, offrendo opere di autori internazionali e italiani come Gregg Braden, Bruce Lipton, Joe Dispenza, Louise Hay, Eckhart Tolle e molti altri. Scopri un'editoria che abbraccia il corpo, la mente, lo spirito e l'ecologia.",
"author": "Surya",
"private": true,
"keywords": [],
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8089 APP_VERSION='1.2.62' quasar dev",
"dev": "PORT=8089 APP_VERSION='1.2.67' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.62' quasar build -m spa",
"buildspa": "APP_VERSION='1.2.67' quasar build -m spa",
"lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"",
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.67' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",
@@ -92,7 +92,8 @@
"workbox-precaching": "^7.3.0",
"workbox-routing": "^7.3.0",
"workbox-strategies": "^7.3.0",
"workbox-window": "^7.3.0"
"workbox-window": "^7.3.0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@eslint/js": "^9.28.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -217,11 +217,6 @@ const msg_website_it = {
'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>' +
'<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; " ' +

View File

@@ -1,6 +1,6 @@
{
"name": "kolibrilab",
"version": "1.2.62",
"version": "1.2.67",
"description": "kolibrilab",
"productName": "kolibrilab",
"author": "Surya Paolo",
@@ -8,11 +8,11 @@
"keywords": [],
"license": "MIT",
"scripts": {
"dev": "PORT=8083 APP_VERSION='1.2.62' quasar dev",
"dev": "PORT=8083 APP_VERSION='1.2.67' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -20,8 +20,8 @@
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint --ext .ts,.vue --ignore-path .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.67' quasar dev",
"spanorefresh": "NODE_ENV=development NODE_OPTIONS=--max_old_space_size=4096 DEBUG=v8:* quasar dev -m spa",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js"

View File

@@ -1,6 +1,6 @@
{
"name": "nutriben",
"version": "1.2.62",
"version": "1.2.67",
"description": "Nutriben",
"productName": "Nutriben",
"author": "Surya",
@@ -9,20 +9,20 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8093 APP_VERSION='1.2.62' quasar dev",
"dev": "PORT=8093 APP_VERSION='1.2.67' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.62' quasar build -m spa",
"buildspa": "APP_VERSION='1.2.67' quasar build -m spa",
"lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"",
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.67' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -171,18 +171,7 @@ const msg_website_it = {
descr: '<ul class="mylist" style="padding-left: 20px;">'
+ '<li>📱<strong>Condividendo la APP</strong> a tutti coloro che vogliono far parte insieme della crescita e sviluppo di una Nuova Era</li>'
+ '<li>👥 Aiutando a creare Gruppi Territoriali nella vostra città, impegnandosi a realizzare progetti per il Bene Comune, in onore ai principi Amorevoli e di condivisione.</li>'
+ '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>'
+ '<li>👨🏻‍💻 Con una <strong>piccola donazione</strong> per le spese dei Server, manutenzione e per i continui sviluppi e miglioramenti</li></ul>' +
'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>' +
'</div>' +
'<br>3) Tramite <strong>Bonifico Bancario</strong>:<br>' +
'(Scrivi a Surya (<a href="https://t.me/surya1977">@surya1977</a>) per le coordinate</br>' +
'' +
'4) In alternativa scegli tu una forma di Dono <br />' +
+ '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>' +
'Grazie Mille per l\'Aiuto ed il Supporto' +
'<br>',
},

View File

@@ -1,6 +1,6 @@
{
"name": "piuchebuono",
"version": "1.2.62",
"version": "1.2.67",
"description": "PiuCheBuono",
"productName": "PiuCheBuono",
"author": "Surya",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8085 APP_VERSION='1.2.62' quasar dev",
"dev": "PORT=8085 APP_VERSION='1.2.67' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8085 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8085 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8085 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8085 APP_VERSION='1.2.67' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -196,18 +196,7 @@ const msg_website_it = {
descr: '<ul class="mylist" style="padding-left: 20px;">'
+ '<li>📱<strong>Condividendo la APP</strong> a tutti coloro che vogliono far parte insieme della crescita e sviluppo di una Nuova Era</li>'
+ '<li>👥 Aiutando a creare Gruppi Territoriali nella vostra città, impegnandosi a realizzare progetti per il Bene Comune, in onore ai principi Amorevoli e di condivisione.</li>'
+ '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>'
+ '<li>👨🏻‍💻 Con una <strong>piccola donazione</strong> per le spese dei Server, manutenzione e per i continui sviluppi e miglioramenti</li></ul>' +
'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>' +
'</div>' +
'<br>3) Tramite <strong>Bonifico Bancario</strong>:<br>' +
'(Scrivi a Surya (<a href="https://t.me/surya1977">@surya1977</a>) per le coordinate</br>' +
'' +
'4) In alternativa scegli tu una forma di Dono <br />' +
+ '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>' +
'Grazie Mille per l\'Aiuto ed il Supporto' +
'<br>',
},

View File

@@ -1,11 +1,11 @@
VITE_APP_ID="16"
VITE_APP_URL="https://test.piuchebuono.app"
VITE_MONGODB_HOST="https://test.freeplanet.app:3001"
VITE_LOGO_REG='piuchebuono-logo-full.png'
VITE_APP_URL="https://test.riso.app"
VITE_MONGODB_HOST="https://test.riso.app:3001"
VITE_LOGO_REG='riso-logo-full.png'
VITE_PUBLICKEY_PUSH="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
VITE_DEBUG="1"
VITE_VUE_APP_ISTEST=1
DIRECTORY_LOCAL=newfreeplanet
DIRECTORY_SERVER=test.freeplanet_serverside
SERVERDIR_WEBSITE="test.piuchebuono.app"
SERVERDIR_WEBSITE="test.riso.app"
SERVERPW_WEBSITE="pwdadmin@1AOK"

View File

@@ -1,6 +1,6 @@
{
"name": "riso",
"version": "1.2.62",
"version": "1.2.67",
"description": "Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.",
"productName": "Riso",
"author": "Surya",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "APP_VERSION='1.2.62' PORT=8084 quasar dev",
"dev": "APP_VERSION='1.2.67' PORT=8084 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.62' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.67' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,42 +21,41 @@
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.62' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.62' quasar dev",
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.67' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.67' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",
"postinstall": "quasar prepare"
},
"dependencies": {
"@cubejs-client/core": "^1.2.26",
"@quasar/extras": "^1.16.17",
"@cubejs-client/core": "^1.3.21",
"@quasar/extras": "^1.17.0",
"@quasar/quasar-ui-qcalendar": "^4.1.2",
"@types/jsbarcode": "^3.11.4",
"@types/leaflet": "^1.9.17",
"@vue/compat": "^3.5.13",
"@vue/compiler-sfc": "^3.5.13",
"@types/leaflet": "^1.9.18",
"@vue/compat": "^3.5.16",
"@vue/compiler-sfc": "^3.5.16",
"@vuelidate/core": "^2.0.3",
"@vuelidate/validators": "^2.0.4",
"acorn": "^8.14.1",
"acorn": "^8.15.0",
"animate.css": "^4.1.1",
"apexcharts": "^4.7.0",
"autoprefixer": "^10.4.21",
"axios": "^1.8.4",
"axios": "^1.9.0",
"bcryptjs": "^3.0.2",
"chart.js": "^4.4.8",
"core-js": "^3.41.0",
"chart.js": "^4.4.9",
"core-js": "^3.43.0",
"crypto-browserify": "^3.12.1",
"date-fns": "^4.1.0",
"echarts": "5.6.0",
"eslint-plugin-n": "^17.16.2",
"eslint-plugin-n": "^17.19.0",
"eslint-plugin-quasar": "^1.1.0",
"graphql": "^16.10.0",
"graphql-tag": "^2.12.6",
"gsap": "^3.12.7",
"gsap": "^3.13.0",
"html2pdf.js": "^0.10.3",
"jquery": "^3.7.1",
"js-cookie": "^3.0.5",
"jsbarcode": "^3.11.6",
"jsbarcode": "^3.12.1",
"leaflet": "^1.9.4",
"leaflet-routing-machine": "^3.2.12",
"leaflet.markercluster": "^1.5.3",
@@ -64,30 +63,29 @@
"lodash": "^4.17.21",
"normalize.css": "^8.0.1",
"nprogress": "^0.2.0",
"pinia": "^3.0.1",
"qrcode-vue3": "^1.7.1",
"pinia": "^3.0.3",
"quasar": "^2.18.1",
"quasar-extras": "^2.0.9",
"register-service-worker": "^1.7.2",
"scrollreveal": "^4.0.9",
"typescript-eslint": "^8.27.0",
"vee-validate": "^4.15.0",
"vue": "^3.5.13",
"typescript-eslint": "^8.34.0",
"vee-validate": "^4.15.1",
"vue": "^3.5.16",
"vue-class-component": "^8.0.0-rc.1",
"vue-country-code": "^1.1.3",
"vue-echarts": "^7.0.3",
"vue-i18n": "^11.1.2",
"vue-i18n": "^11.1.5",
"vue-idb": "^0.2.0",
"vue-image-zoomer": "^2.4.4",
"vue-property-decorator": "^10.0.0-rc.3",
"vue-router": "^4.5.0",
"vue-router": "^4.5.1",
"vue-scroll-reveal": "^2.1.0",
"vue-social-sharing": "^4.0.0-alpha4",
"vue-svgicon": "^4.0.0-alpha.3",
"vue-timeago3": "^2.3.2",
"vue2-dragula": "^2.5.5",
"vue3-pdf-app": "^1.0.3",
"vue3-apexcharts": "^1.8.0",
"vue3-qr-reader": "^1.0.0",
"vuedraggable": "^4.1.0",
"vuex": "^4.1.0",
"vuex-router-sync": "^6.0.0-rc.1",
"workbox-core": "^7.3.0",
@@ -97,41 +95,41 @@
"workbox-window": "^7.3.0"
},
"devDependencies": {
"@eslint/js": "^9.23.0",
"@intlify/unplugin-vue-i18n": "^6.0.5",
"@quasar/app-vite": "^2.1.4",
"@eslint/js": "^9.28.0",
"@intlify/unplugin-vue-i18n": "^6.0.8",
"@quasar/app-vite": "^2.2.1",
"@types/google.maps": "^3.58.1",
"@types/jest": "^29.5.14",
"@types/js-cookie": "^3.0.6",
"@types/node": "^22.13.11",
"@types/node": "^24.0.1",
"@types/nprogress": "^0.2.3",
"@types/vue-tel-input": "^2.1.7",
"@types/vuelidate": "^0.7.22",
"@vue/devtools": "^7.7.2",
"@vue/devtools": "^7.7.6",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.5.0",
"autoprefixer": "^10.4.21",
"eslint": "9",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-vue": "^10.0.0",
"eslint-plugin-vue": "^10.2.0",
"file-loader": "^6.2.0",
"globals": "^16.0.0",
"http-proxy-middleware": "^3.0.3",
"jest": "^29.7.0",
"globals": "^16.2.0",
"http-proxy-middleware": "^3.0.5",
"jest": "^30.0.0",
"json-loader": "^0.5.7",
"nodemon": "^3.1.9",
"npm-check-updates": "^17.1.16",
"parcel": "^2.14.1",
"postcss": "^8.5.3",
"nodemon": "^3.1.10",
"npm-check-updates": "^18.0.1",
"parcel": "^2.15.2",
"postcss": "^8.5.5",
"postcss-loader": "^8.1.1",
"prettier": "3",
"strip-ansi": "=7.1.0",
"ts-jest": "^29.2.6",
"typescript": "5.7.3",
"vite-plugin-checker": "^0.9.1",
"ts-jest": "^29.4.0",
"typescript": "5.8.3",
"vite-plugin-checker": "^0.9.3",
"vue-cli-plugin-element-ui": "^1.1.4",
"vue-eslint-parser": "^10.1.1",
"vue-tsc": "^2.2.8",
"vue-eslint-parser": "^10.1.3",
"vue-tsc": "^2.2.10",
"vueify": "^9.4.1",
"workbox-build": "^7.3.0"
},

View File

@@ -188,18 +188,7 @@ const msg_website_it = {
descr: '<ul class="mylist" style="padding-left: 20px;">'
+ '<li>📱<strong>Condividendo la APP</strong> a tutti coloro che vogliono far parte insieme della crescita e sviluppo di una Nuova Era</li>'
+ '<li>👥 Aiutando a creare Gruppi Territoriali nella vostra città, impegnandosi a realizzare progetti per il Bene Comune, in onore ai principi Amorevoli e di condivisione.</li>'
+ '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>'
+ '<li>👨🏻‍💻 Con una <strong>piccola donazione</strong> per le spese dei Server, manutenzione e per i continui sviluppi e miglioramenti</li></ul>' +
'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>' +
'</div>' +
'<br>3) Tramite <strong>Bonifico Bancario</strong>:<br>' +
'(Scrivi a Surya (<a href="https://t.me/surya1977">@surya1977</a>) per le coordinate</br>' +
'' +
'4) In alternativa scegli tu una forma di Dono <br />' +
+ '<li>🌱 Sostenendo le persone attorno a voi, e rispettando la nostra vera Casa: Madre Natura e Tutti gli Esseri Viventi. ❤️</li>' +
'Grazie Mille per l\'Aiuto ed il Supporto' +
'<br>',
},

View File

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

View File

@@ -3,7 +3,7 @@
/* global workbox */
/* global cfgenv */
const VITE_APP_VERSION = '1.2.62';
const VITE_APP_VERSION = '1.2.67';
// Costanti di configurazione
const DYNAMIC_CACHE = 'dynamic-cache-v2';

View File

@@ -1,7 +1,7 @@
{
"name": "Gruppo Macro",
"short_name": "GruppoMacro",
"description": "",
"name": "Riso",
"short_name": "Riso",
"description": "Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.",
"display": "standalone",
"orientation": "portrait",
"background_color": "#fff",
@@ -11,17 +11,47 @@
"start_url": "/?homescreen=1",
"icons": [
{
"src": "/images/gm-android-icon-512x512.png",
"src:": "/images/riso-android-icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "/images/gm-android-icon-192x192.png",
"src:": "/images/riso-android-icon-384x384.png",
"sizes": "384x384",
"type": "image/png"
},
{
"src:": "/images/riso-android-icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/images/gm-apple-touch-icon.png",
"src:": "/images/riso-android-icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
{
"src:": "/images/riso-android-icon-96x96.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src:": "/images/riso-apple-icon-120x120.png",
"sizes": "120x120",
"type": "image/png"
},
{
"src:": "/images/riso-apple-icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
{
"src:": "/images/riso-apple-icon-152x152.png",
"sizes": "152x152",
"type": "image/png"
},
{
"src:": "/images/riso-apple-icon-180x180.png",
"sizes": "180x180",
"type": "image/png"
}

View File

@@ -15,6 +15,7 @@ export default ({ router }) => {
userAgent,
username: userStore.my?.username,
userId: userStore.my?._id,
referrer: document?.referrer || '',
};
// Invia il tracciamento al backend

View File

@@ -162,6 +162,7 @@ export const shared_consts = {
CATALOGO: 310,
RACCOLTA: 315,
TOOLSAI: 320,
CHATBOT: 325,
MAPPA: 350,
MAPPAUTENTI: 360,
MAPPACOMUNI: 370,
@@ -1976,6 +1977,14 @@ export const shared_consts = {
value: 315,
label: 'RACCOLTA CATALOGHI',
},
{
value: 320,
label: 'TOOLS AI',
},
{
value: 325,
label: 'CHATBOT',
},
{
value: 350,
label: 'MAPPA',
@@ -2581,4 +2590,9 @@ export const shared_consts = {
NESSUNO: 0,
A_TUTTI: 1,
},
FILETYPE: {
IMG: 1,
PDF: 2,
}
};

View File

@@ -40,6 +40,8 @@ export default defineComponent({
]
const modelList = [
{ label: 'DeepSeek', value: 'deepseek-chat' },
{ label: 'Gemma-2B', value: 'gemma:2b' },
{ label: 'Gemma3', value: 'gemma3:12b' },
]
const outputTypeList = [

View File

@@ -39,6 +39,7 @@ import type {
IProduct,
IVariazione,
IRecFields,
ICatalog,
} from '@src/model';
import { IBaseOrder } from '@src/model';
import { tools } from '@tools';
@@ -58,6 +59,11 @@ export default defineComponent({
required: false,
default: null,
},
myCatalog: {
type: Object as PropType<ICatalog | null>,
required: false,
default: null,
},
id: {
type: String,
required: false,

View File

@@ -55,7 +55,7 @@
:class="[
'flex', // Classi comuni
'image-container',
{ 'shadow-2': options.in_3d && !optcatalogo.pdf }, // Classe condizionale
{ alignContent: 'center', 'shadow-2': options.in_3d && !optcatalogo.pdf }, // Classe condizionale
scheda.testo_right_attaccato.font?.posiz_text ===
costanti.POSIZ_TESTO.IN_BASSO
? ''
@@ -76,7 +76,7 @@
scheda,
true
) ?? '100%',
height: tools.adjustSize(
'height': tools.adjustSize(
optcatalogo,
scheda.dimensioni?.scheda_prodotto?.size?.height,
scheda,
@@ -84,10 +84,13 @@
),
}"
>
<div style="position: relative">
<div
:style="`position: relative; align-content: center;`"
>
<a
:href="myproduct.productInfo.link_macro"
target="_blank"
:href="myCatalog?.disattiva_link_immagini ? null : myproduct.productInfo.link_macro"
:style="myCatalog?.disattiva_link_immagini ? 'cursor: normal !important;' : ''"
>
<q-img
v-if="myproduct.productInfo"
@@ -103,7 +106,7 @@
:fit="scheda.dimensioni?.immagine_prodotto?.size?.fit ?? 'cover'"
:class="{
'book-image-fixed': complete,
'cursor-pointer': !complete,
'cursor-pointer': !complete && !myCatalog?.disattiva_link_immagini,
'shadow-4': !optcatalogo.pdf,
}"
:img-class="optcatalogo.pdf ? 'border-box' : ''"
@@ -117,27 +120,30 @@
optcatalogo,
scheda.dimensioni?.immagine_prodotto?.size?.width,
scheda,
true
true,
options
) && {
width:
tools.adjustSize(
optcatalogo,
scheda.dimensioni?.immagine_prodotto.size?.width,
scheda,
true
true,
options
) + ' !important',
}),
height: scheda.dimensioni?.immagine_prodotto?.size?.height
'max-height': scheda.dimensioni?.immagine_prodotto?.size?.height
? tools.adjustSize(
optcatalogo,
scheda.dimensioni?.immagine_prodotto?.size?.height,
scheda,
false
false,
options
)
: undefined,
display: 'block',
}"
@click.stop.prevent="tools.openUrl(myproduct.productInfo.link_macro)"
@click.stop.prevent="myCatalog?.disattiva_link_immagini ? null : tools.openUrl(myproduct.productInfo.link_macro)"
>
</q-img>
</a>
@@ -152,18 +158,18 @@
z-index: 10;
"
>
<div v-if="!optcatalogo.generazionePDFInCorso">
<div v-if="!optcatalogo.generazionePDFInCorso && !myCatalog?.disattiva_link_immagini">
<q-btn
icon="fas fa-external-link-alt"
color="primary"
class="no-print"
rounded
size="sm"
@click.stop.prevent="tools.openUrl(myproduct.productInfo.link_macro)"
@click.stop.prevent="tools.openUrl(myCatalog?.disattiva_link_immagini ? null : myproduct.productInfo.link_macro)"
>
</q-btn>
</div>
<div v-if="!optcatalogo.generazionePDFInCorso">
<div v-if="!optcatalogo.generazionePDFInCorso && tools.isLogged() && !myCatalog?.disattiva_link_immagini">
<q-btn
icon-right="fas fa-cart-plus"
color="positive"
@@ -177,7 +183,7 @@
</div>
<div
v-if="
(tools.isCollaboratore()) &&
tools.isCollaboratore() &&
!optcatalogo.generazionePDFInCorso &&
(editOn || options.show_edit_book)
"
@@ -195,7 +201,7 @@
color="primary"
icon="fas fa-pencil-alt"
v-if="
(tools.isCollaboratore()) &&
tools.isCollaboratore() &&
!optcatalogo.generazionePDFInCorso &&
(editOn || options.show_edit_book)
"
@@ -203,7 +209,7 @@
<q-list>
<q-item
v-if="
(tools.isCollaboratore()) &&
tools.isCollaboratore() &&
!optcatalogo.generazionePDFInCorso &&
(editOn || options.show_edit_book)
"
@@ -224,7 +230,7 @@
</q-item>
<q-item
v-if="
(tools.isCollaboratore()) &&
tools.isCollaboratore() &&
!optcatalogo.generazionePDFInCorso &&
(editOn || options.show_edit_book)
"
@@ -488,7 +494,8 @@
optcatalogo,
scheda.barcode.size?.gap,
scheda,
true
true,
options
)
"
:width="
@@ -497,7 +504,8 @@
optcatalogo,
scheda.barcode.size?.width,
scheda,
true
true,
options
)
)
"
@@ -506,7 +514,8 @@
optcatalogo,
scheda.barcode.widthlines,
scheda,
true
true,
options
)
"
:height="

View File

@@ -3,7 +3,7 @@
v-if="
((tools.getLinkUserTelegramByUser(myuser) ||
(myuser.email && tools.isEmailVerifiedByUser(myuser))) &&
tools.isUserOk()) ||
tools.isUserOk(true)) ||
showBtnActivities
"
class=""
@@ -40,18 +40,18 @@
</div>
<div class="q-pa-xs">
<q-btn
v-if="tools.getLinkUserTelegramByUser(myuser) && tools.isUserOk()"
v-if="tools.getLinkUserTelegramByUser(myuser) && tools.isUserOk(true)"
icon="fab fa-telegram"
color="blue"
:type="tools.isUserOk() ? 'a' : 'btn'"
:type="tools.isUserOk(true) ? 'a' : 'btn'"
size="md"
rounded
:label="$t('dialog.contact')"
:href="
tools.isUserOk() ? tools.getLinkUserTelegramByUser(myuser) : null
tools.isUserOk(true) ? tools.getLinkUserTelegramByUser(myuser) : null
"
@click="
!tools.isUserOk() ? (showingtooltip = !showingtooltip) : false
!tools.isUserOk(true) ? (showingtooltip = !showingtooltip) : false
"
target="__blank"
>

View File

@@ -16,7 +16,7 @@ import { shared_consts } from '@src/common/shared_vuejs'
import { useRouter } from 'vue-router'
import { costanti } from '@costanti'
import type { IOptCatalogo, IMyScheda, IProduct } from '@src/model'
import type { IOptCatalogo, IMyScheda, IProduct, ICatalog } from '@src/model'
export default defineComponent({
@@ -33,6 +33,11 @@ export default defineComponent({
required: false,
default: null,
},
myCatalog: {
type: Object as PropType<ICatalog | null>,
required: false,
default: null,
},
cosa: {
type: Number,
required: false,

View File

@@ -10,6 +10,7 @@
@opendetail="opendetail"
v-model="optcatalogo"
:scheda="scheda"
:myCatalog="myCatalog"
>
</CCatalogoCard>
<q-dialog
@@ -38,6 +39,7 @@
@selauthor="selauthor"
@updateproductmodif="updateproductmodif"
:scheda="scheda"
:myCatalog="myCatalog"
>
</CCatalogoCard>
</div>

View File

View File

@@ -0,0 +1,70 @@
import {
PropType,
computed,
defineComponent,
onMounted,
ref,
watch,
reactive,
} from 'vue';
import * as XLSX from 'xlsx';
export default defineComponent({
name: 'CCsvToXls',
emits: [],
components: {},
props: {},
setup(props, { emit }) {
const xlsFile = ref<string | null>(null);
const selectFile = () => {
const fileInput = document.querySelector('input[type="file"]') as HTMLInputElement;
fileInput?.click();
};
const onFileChange = (event: Event) => {
const fileInput = event.target as HTMLInputElement;
const file = fileInput?.files ? fileInput.files[0] : null;
if (file && file.type === 'text/csv') {
convertCSVToXLS(file);
} else {
alert('Seleziona un file CSV valido!');
}
};
const convertCSVToXLS = (file: File) => {
const reader = new FileReader();
reader.onload = (e: ProgressEvent<FileReader>) => {
const csvData = e.target?.result as string;
// Usa SheetJS per leggere il CSV
const worksheet = XLSX.utils.csv_to_sheet(csvData);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
// Converte in file Excel (XLS)
const xlsBlob = XLSX.write(workbook, {
bookType: 'xls', // Specifica il formato 'xls'
type: 'blob',
});
// Crea un URL per il file XLS generato
xlsFile.value = URL.createObjectURL(xlsBlob);
};
reader.readAsText(file);
};
function mounted() {}
onMounted(mounted);
return {
onFileChange,
selectFile,
xlsFile,
};
},
});

View File

@@ -0,0 +1,24 @@
<template>
<div>
<q-btn label="Carica CSV" @click="selectFile" color="primary" />
<input
type="file"
ref="csvFile"
accept=".csv"
@change="onFileChange"
style="display: none"
/>
<q-btn
v-if="xlsFile"
:href="xlsFile"
download="converted-file.xls"
label="Scarica XLS"
color="secondary"
/>
</div>
</template>
<script lang="ts" src="./CCsvToXls.ts"></script>
<style lang="scss" scoped>
@import './CCsvToXls.scss';
</style>

View File

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

View File

@@ -1,28 +1,37 @@
import { computed, defineComponent, onMounted, PropType, ref, watch, reactive, toRefs } from 'vue'
import {
computed,
defineComponent,
onMounted,
PropType,
ref,
watch,
reactive,
toRefs,
} from 'vue';
import type { ISearchList } from '../../model';
import { ICalcStat, IOperators } from '../../model'
import { useUserStore } from '../../store/UserStore'
import { useRouter } from 'vue-router'
import { useGlobalStore } from '../../store/globalStore'
import { useCircuitStore } from '../../store/CircuitStore'
import { useI18n } from 'vue-i18n'
import { ICalcStat, IOperators } from '../../model';
import { useUserStore } from '../../store/UserStore';
import { useRouter } from 'vue-router';
import { useGlobalStore } from '../../store/globalStore';
import { useCircuitStore } from '../../store/CircuitStore';
import { useI18n } from 'vue-i18n';
import { shared_consts } from '@src/common/shared_vuejs'
import { costanti, IMainCard } from '@store/Modules/costanti'
import { shared_consts } from '@src/common/shared_vuejs';
import { costanti, IMainCard } from '@store/Modules/costanti';
import { CMyUser } from '../CMyUser'
import { CTitleBanner } from '../CTitleBanner'
import { CMyGroup } from '../CMyGroup'
import { CQRCode } from '../CQRCode'
import { CCopyBtnSmall } from '../CCopyBtnSmall'
import { CContactUser } from '../CContactUser'
import { CGridTableRec } from '../CGridTableRec'
import { CUserInfoAccount } from '../CUserInfoAccount'
import { tools } from '@tools'
import { useQuasar } from 'quasar'
import { CMyUser } from '../CMyUser';
import { CTitleBanner } from '../CTitleBanner';
import { CMyGroup } from '../CMyGroup';
import { CQRCode } from '../CQRCode';
import { CCopyBtnSmall } from '../CCopyBtnSmall';
import { CContactUser } from '../CContactUser';
import { CGridTableRec } from '../CGridTableRec';
import { CUserInfoAccount } from '../CUserInfoAccount';
import { tools } from '@tools';
import { useQuasar } from 'quasar';
import { colmyUserPeople } from '@store/Modules/fieldsTable'
import { colmyUserPeople, colmyUserGroup } from '@store/Modules/fieldsTable';
export default defineComponent({
name: 'CFindUsers',
@@ -39,51 +48,62 @@ export default defineComponent({
},
},
components: {
CMyUser, CMyGroup, CUserInfoAccount, CCopyBtnSmall,
CTitleBanner, CContactUser, CGridTableRec, CQRCode
CMyUser,
CMyGroup,
CUserInfoAccount,
CCopyBtnSmall,
CTitleBanner,
CContactUser,
CGridTableRec,
CQRCode,
},
setup(props) {
const userStore = useUserStore();
const globalStore = useGlobalStore();
const circuitStore = useCircuitStore();
const { t } = useI18n();
const $q = useQuasar();
const $router = useRouter();
const userStore = useUserStore()
const globalStore = useGlobalStore()
const circuitStore = useCircuitStore()
const { t } = useI18n()
const $q = useQuasar()
const $router = useRouter()
const receiveRislist = computed(() =>
globalStore.datastat ? globalStore.datastat.receiveRislist : []
);
const receiveRislistgroup = computed(() =>
globalStore.datastat ? globalStore.datastat.receiveRislistgroup : []
);
const listlinksreg = computed(() =>
globalStore.datastat ? globalStore.datastat.listlinksreg : []
);
const receiveRislist = computed(() => globalStore.datastat ? globalStore.datastat.receiveRislist : [])
const receiveRislistgroup = computed(() => globalStore.datastat ? globalStore.datastat.receiveRislistgroup : [])
const listlinksreg = computed(() => globalStore.datastat ? globalStore.datastat.listlinksreg : [])
const arrfilterand: any = ref([]);
const filtercustom: any = ref([]);
const searchList = ref(<ISearchList[]>[]);
const arrfilterand: any = ref([])
const filtercustom: any = ref([])
const searchList = ref(<ISearchList[]>[])
const filter = ref(costanti.FIND_PEOPLE);
const filter = ref(costanti.FIND_PEOPLE)
const loading = ref(false);
const tipoConto = ref(0);
const loading = ref(false)
const tipoConto = ref(0)
const contact = computed(() => userStore.my);
const contact = computed(() => userStore.my)
const searchType = ref('receivers');
const searchType = ref('receivers')
const usersList = ref(<any>{ show: false, title: '', list: [], listgroup: [] })
const usersList = ref(<any>{ show: false, title: '', list: [], listgroup: [] });
const options = ref([
{
label: 'Lista dei Riceventi di oggi',
value: 'receivers'
value: 'receivers',
},
{
label: 'Cerca per Nome o Username',
value: 'username'
value: 'username',
},
{
label: 'Scansiona il QRCode del Destinatario',
value: 'qrcode'
value: 'qrcode',
},
])
]);
const arrTypesAccounts = ref(<any>[
{
@@ -93,22 +113,20 @@ export default defineComponent({
{
label: t('circuit.conticollettivi'),
value: shared_consts.AccountType.CONTO_DI_GRUPPO,
}
])
},
]);
function getFilterProvinceByRegion(recProvince: any, index: number, arr: any) {
const recreg: any = searchList.value.find((rec) => rec.table === 'regions')
const recreg: any = searchList.value.find((rec) => rec.table === 'regions');
if (recreg) {
return recProvince.reg === recreg.value
return recProvince.reg === recreg.value;
} else {
return true
return true;
}
}
function mounted() {
usersList.value.listlinkreg = listlinksreg
usersList.value.listlinkreg = listlinksreg;
searchList.value = [
{
@@ -123,7 +141,7 @@ export default defineComponent({
arrvalue: [],
filter: null,
useinput: false,
icon: 'fas fa-globe-europe'
icon: 'fas fa-globe-europe',
},
{
visible: true,
@@ -131,7 +149,10 @@ export default defineComponent({
table: 'provinces',
key: 'profile.resid_province',
type: costanti.FieldType.select,
value: tools.getCookie(tools.COOK_SEARCH + 'provinces_fr', costanti.FILTER_TUTTI),
value: tools.getCookie(
tools.COOK_SEARCH + 'provinces_fr',
costanti.FILTER_TUTTI
),
keycookie: '_fr',
addall: true,
arrvalue: [],
@@ -140,21 +161,48 @@ export default defineComponent({
icon: 'flag',
tablesel: 'provinces',
},
]
];
filtercustom.value = []
arrfilterand.value = []
filtercustom.value = [];
arrfilterand.value = [];
const filt_loaded = tools.getCookie(tools.COOK_SEARCH + tools.FRIENDS_SEARCH, costanti.FIND_PEOPLE, true)
filter.value = filt_loaded ? filt_loaded : costanti.FIND_PEOPLE
const filt_loaded = tools.getCookie(
tools.COOK_SEARCH + tools.FRIENDS_SEARCH,
costanti.FIND_PEOPLE,
true
);
filter.value = filt_loaded ? filt_loaded : costanti.FIND_PEOPLE;
updateUserListRIS()
updateUserListRIS();
sendCoinsToClick()
sendCoinsToClick();
}
function extraparams_groups() {
const lk_tab = 'mygroups';
const lk_LF = 'userId';
const lk_FF = '_id';
const lk_as = 'group';
const af_objId_tab = 'myId';
return {
lookup1: {
lk_tab,
lk_LF,
lk_FF,
lk_as,
af_objId_tab,
lk_proj: {
groupname: 1,
title: 1,
descr: 1,
photos: 1,
},
},
};
}
function extraparams() {
return {
lookup1: {
lk_tab: 'provinces',
@@ -175,38 +223,34 @@ export default defineComponent({
'profile.resid_province': 1,
'mycities.reg': 1,
perm: 1,
}
},
},
}
};
}
onMounted(mounted)
onMounted(mounted);
async function updateUserListRIS() {
const userStore = useUserStore()
const userStore = useUserStore();
loading.value = true
loading.value = true;
await globalStore.getStatSite()
await globalStore.getStatSite();
usersList.value.list = receiveRislist
usersList.value.listgroup = receiveRislistgroup
usersList.value.list = receiveRislist;
usersList.value.listgroup = receiveRislistgroup;
// usersList.value.listlinkreg = listlinksreg
loading.value = false
loading.value = false;
}
async function sendCoinsToClick() {
usersList.value.show = true;
usersList.value.title = t('circuit.sendcoins');
usersList.value.list = receiveRislist
usersList.value.listgroup = receiveRislistgroup
usersList.value.list = receiveRislist;
usersList.value.listgroup = receiveRislistgroup;
}
return {
userStore,
tools,
@@ -218,6 +262,7 @@ export default defineComponent({
t,
extraparams,
colmyUserPeople,
colmyUserGroup,
searchList,
options,
searchType,
@@ -227,6 +272,9 @@ export default defineComponent({
receiveRislistgroup,
tipoConto,
CQRCode,
}
extraparams_groups,
filtercustom,
arrfilterand,
};
},
})
});

View File

@@ -6,39 +6,95 @@
:options="options"
color="primary"
/>
<q-tab-panels v-model="searchType" keep-alive animated class="shadow-2 rounded-borders">
<q-tab-panels
v-model="searchType"
keep-alive
animated
class="shadow-2 rounded-borders"
>
<q-tab-panel name="username">
<CGridTableRec
prop_mytable="users"
prop_mytitle=""
subtitle=""
:prop_mycolumns="colmyUserPeople"
prop_colkey="_id"
col_title="username"
:vertical="costanti.VISUTABLE_LISTA"
nodataLabel=" "
:prop_search="true"
:prop_showfilter="true"
hint="Cerca il nome o Username"
:hintinbtnsearch="true"
:findByDebounce="true"
:showSearchOnTop="false"
:finder="true"
:choose_visutype="false"
:finder_noNull="false"
:finder_noNullFilters="true"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="Username, Nome o Cognome non trovato"
:arrfilters="arrfilterand"
:filtercustom="filtercustom"
:prop_searchList="searchList"
:showType="costanti.SHOW_USERINFO"
:showCol="false"
:extraparams="extraparams()"
:actionType="actionType"
>
</CGridTableRec>
<div class="column centeritems">
<q-btn-toggle
v-if="arrTypesAccounts.length > 0"
v-model="tipoConto"
class="my-custom-toggle"
no-caps
rounded
unelevated
toggle-color="primary"
color="white"
text-color="primary"
:options="arrTypesAccounts"
/>
</div>
<div v-if="tipoConto === shared_consts.AccountType.USER">
<CGridTableRec
prop_mytable="users"
prop_mytitle=""
subtitle=""
:prop_mycolumns="colmyUserPeople"
prop_colkey="_id"
col_title="username"
:vertical="costanti.VISUTABLE_LISTA"
nodataLabel=" "
:prop_search="true"
:prop_showfilter="true"
hint="Cerca il nome o Username della persona"
:hintinbtnsearch="true"
:findByDebounce="true"
:showSearchOnTop="false"
:finder="true"
:choose_visutype="false"
:finder_noNull="false"
:finder_noNullFilters="true"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="Username, Nome o Cognome non trovato"
:arrfilters="arrfilterand"
:filtercustom="filtercustom"
:prop_searchList="searchList"
:showType="costanti.SHOW_USERINFO"
:showCol="false"
:extraparams="extraparams()"
:actionType="actionType"
>
</CGridTableRec>
</div>
<div v-else-if="tipoConto === shared_consts.AccountType.CONTO_DI_GRUPPO">
<CGridTableRec
prop_mytable="mygroups"
prop_mytitle=""
subtitle=""
:prop_mycolumns="colmyUserGroup"
prop_colkey="_id"
col_title="groupname"
:vertical="costanti.VISUTABLE_SCHEDA_USER"
nodataLabel=" "
:prop_search="true"
:prop_showfilter="true"
:hint="$t('otherpages.find_group')"
:hintinbtnsearch="true"
:findByDebounce="true"
:showSearchOnTop="false"
:finder="true"
:choose_visutype="false"
:finder_noNull="false"
:finder_noNullFilters="true"
:options="shared_consts.OPTIONS_SEARCH_USER_ALL_WORDS"
:butt_modif_new="false"
noresultLabel="Username, Nome del gruppo non trovato"
:arrfilters="arrfilterand"
:filtercustom="filtercustom"
:prop_searchList="searchList"
:showType="costanti.SHOW_GROUPINFO"
:showCol="false"
:extraparams="extraparams_groups()"
:actionType="actionType"
:visufind="costanti.FIND_GROUP"
>
</CGridTableRec>
</div>
</q-tab-panel>
<q-tab-panel name="receivers">
<div class="column centeritems">
@@ -56,7 +112,10 @@
/>
<div v-if="tipoConto === shared_consts.AccountType.USER">
<div v-for="(rec, i) in usersList.list" :key="i">
<div
v-for="(rec, i) in usersList.list"
:key="i"
>
<div class="q-pa-xs q-ma-xs q-border q-rounded my-custom-border">
<CMyUser
:mycontact="rec"
@@ -74,11 +133,16 @@
</div>
</div>
</div>
<div
v-else-if="tipoConto === shared_consts.AccountType.CONTO_DI_GRUPPO"
>
<div v-for="(grp, i) in usersList.listgroup" :key="i">
<CMyGroup :mygrp="grp" :visu="costanti.USER_GROUPS" :noaut="true">
<div v-else-if="tipoConto === shared_consts.AccountType.CONTO_DI_GRUPPO">
<div
v-for="(grp, i) in usersList.listgroup"
:key="i"
>
<CMyGroup
:mygrp="grp"
:visu="costanti.USER_GROUPS"
:noaut="true"
>
</CMyGroup>
</div>
</div>
@@ -98,9 +162,13 @@
>
</q-btn>
<q-spinner-radio v-if="loading" class="q-ma-sm" color="brown" />
<q-spinner-radio
v-if="loading"
class="q-ma-sm"
color="brown"
/>
<div class="q-ma-sm">&nbsp;</div>
<br>
<br />
</div>
</q-tab-panel>
<q-tab-panel name="qrcode">
@@ -109,8 +177,7 @@
</q-tab-panels>
</template>
<script lang="ts" src="./CFindUsers.ts">
</script>
<script lang="ts" src="./CFindUsers.ts"></script>
<style lang="scss" scoped>
@import './CFindUsers.scss';

View File

@@ -1,14 +1,18 @@
import type { PropType } from 'vue';
import { defineComponent, ref, watch, onMounted, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { useUserStore } from '@store/UserStore'
import { useQuasar } from 'quasar'
import { defineComponent, ref, watch, onMounted, computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { useUserStore } from '@store/UserStore';
import { useQuasar } from 'quasar';
import type { IImgGallery } from 'model';
import { IGallery } from 'model'
import { CMyPage } from '@src/components/CMyPage'
import { tools } from '@tools'
import { useGlobalStore } from '@store/globalStore'
import { costanti } from '@costanti'
import { IGallery } from 'model';
import { CMyPage } from '@src/components/CMyPage';
import { tools } from '@tools';
import { useGlobalStore } from '@store/globalStore';
import { costanti } from '@costanti';
import { shared_consts } from 'app/src/common/shared_vuejs';
import { Api } from 'app/src/store/Api';
import axios from 'app/src/boot/axios';
import { toolsext } from 'app/src/store/Modules/toolsext';
export default defineComponent({
name: 'CGallery',
@@ -41,6 +45,11 @@ export default defineComponent({
required: false,
default: '',
},
filetype: {
type: Number,
required: false,
default: shared_consts.FILETYPE.IMG,
},
quality: {
type: String,
required: false,
@@ -51,6 +60,11 @@ export default defineComponent({
required: false,
default: false,
},
fieldtype: {
type: Number,
required: false,
default: 0,
},
imgGall: {
type: Object as PropType<IImgGallery[] | string | undefined | null>,
required: true,
@@ -59,174 +73,182 @@ export default defineComponent({
emits: ['showandsave'],
components: { CMyPage },
setup(props, { emit }) {
const $q = useQuasar()
const { t } = useI18n()
const userStore = useUserStore()
const globalStore = useGlobalStore()
const $q = useQuasar();
const { t } = useI18n();
const userStore = useUserStore();
const globalStore = useGlobalStore();
const displayGall = ref(false)
const displayGall = ref(false);
const gallerylist = ref(<IImgGallery[]>[])
const maximizedToggle = ref(true)
const gallerylist = ref(<IImgGallery[]>[]);
const maximizedToggle = ref(true);
const fullscreen = ref(false)
const fullscreensrc = ref('')
const fullscreen = ref(false);
const fullscreensrc = ref('');
const uploadOptions = ref({ // qui definisci le opzioni da passare
const upl = ref();
const uploadOptions = ref({
// qui definisci le opzioni da passare
quality: 'original', // esempio di opzione di qualità
resize: true // opzione per abilitare il ridimensionamento
})
resize: true, // opzione per abilitare il ridimensionamento
});
function isValid(myobj: any): boolean {
return (myobj && typeof myobj !== 'string' && typeof myobj !== 'undefined')
return myobj && typeof myobj !== 'string' && typeof myobj !== 'undefined';
}
const isListImgValid = computed(() => {
const arr = getlistimages()
const arr = getlistimages();
if (arr && tools.isArray(arr)) {
return arr.length > 0
return arr.length > 0;
} else {
return !!arr
return !!arr;
}
})
});
watch(() => props.imgGall, (newval, oldval) => {
if (isValid(props.imgGall)) {
// @ts-ignore
gallerylist.value = props.imgGall
watch(
() => props.imgGall,
(newval, oldval) => {
if (isValid(props.imgGall)) {
// @ts-ignore
gallerylist.value = props.imgGall;
}
}
})
);
function created() {
// console.log('created cgallery')
if (isValid(props.imgGall)) {
// @ts-ignore
let myarr: any = props.imgGall
gallerylist.value = []
let myarr: any = props.imgGall;
gallerylist.value = [];
if (Array.isArray(myarr)) {
myarr.forEach((pic: any) => {
if (pic.imagefile) {
gallerylist.value.push(pic)
if (pic?.imagefile) {
gallerylist.value.push(pic);
} else {
gallerylist.value.push(pic);
}
})
});
}
} else {
gallerylist.value = [
]
gallerylist.value = [];
}
uploadOptions.value = {
quality: props.quality,
resize: props.resize,
}
};
}
function getnumimages() {
if (gallerylist.value)
return gallerylist.value.length
else
return 0
if (gallerylist.value) return gallerylist.value.length;
else return 0;
}
function getlistimages() {
if (gallerylist.value)
// return gallerylist.value.slice().sort((a: any, b: any) => a.order! - b.order!)
//return gallerylist.value.filter(filename => !filename)
return gallerylist.value
else
return null
return gallerylist.value;
else return null;
}
function onDragStart(e: any) {
console.log('onDragStart')
e.dataTransfer.setData('text', e.target.id)
e.dataTransfer.dropEffect = 'move'
console.log('onDragStart');
e.dataTransfer.setData('text', e.target.id);
e.dataTransfer.dropEffect = 'move';
}
function onDragEnter(e: any) {
if (props.canModify) {
// don't drop on other draggables
if (e.target.draggable !== true) {
e.target.classList.add('drag-enter')
e.target.classList.add('drag-enter');
}
}
}
function onDragLeave(e: any) {
if (props.canModify) {
e.target.classList.remove('drag-enter')
e.target.classList.remove('drag-enter');
}
}
function onDragOver(e: any) {
if (props.canModify) {
e.preventDefault()
e.preventDefault();
}
}
function onDrop(e: any) {
if (props.canModify) {
console.log('onDrop', e)
e.preventDefault()
console.log('onDrop', e);
e.preventDefault();
// don't drop on other draggables
if (e.target.draggable === true) {
return
return;
}
if (gallerylist.value) {
const draggedId = e.dataTransfer.getData('text')
let dragout = ''
const draggedId = e.dataTransfer.getData('text');
let dragout = '';
try {
dragout = e.target.parentNode.parentNode.parentNode.id
dragout = e.target.parentNode.parentNode.parentNode.id;
} catch (err) {
dragout = ''
dragout = '';
}
const draggedEl = document.getElementById(draggedId)
console.log('draggedId', draggedId, 'draggedEl', draggedEl)
console.log('dragout', dragout)
const draggedEl = document.getElementById(draggedId);
console.log('draggedId', draggedId, 'draggedEl', draggedEl);
console.log('dragout', dragout);
// check if original parent node
if (draggedEl) {
if (draggedEl.parentNode === e.target) {
e.target.classList.remove('drag-enter')
return
e.target.classList.remove('drag-enter');
return;
}
}
const myindexIn = gallerylist.value.findIndex((rec: any) => rec._id === draggedId)
const myrecIn: IImgGallery = gallerylist.value[myindexIn]
const myindexIn = gallerylist.value.findIndex(
(rec: any) => rec._id === draggedId
);
const myrecIn: IImgGallery = gallerylist.value[myindexIn];
let myrecOut: IImgGallery
const myindexout = gallerylist.value.findIndex((rec: any) => rec._id === dragout)
myrecOut = gallerylist.value[myindexout]
let myrecOut: IImgGallery;
const myindexout = gallerylist.value.findIndex(
(rec: any) => rec._id === dragout
);
myrecOut = gallerylist.value[myindexout];
if (myindexIn === myindexout)
return
if (myindexIn === myindexout) return;
tools.array_move(gallerylist.value, myindexIn, myindexout)
tools.array_move(gallerylist.value, myindexIn, myindexout);
// make the exchange
// draggedEl.parentNode.removeChild(draggedEl)
// e.target.appendChild(draggedEl)
e.target.classList.remove('drag-enter')
e.target.classList.remove('drag-enter');
save()
save();
}
}
}
function getclass() {
return (props.edit || displayGall.value) ? (props.isInModif ? 'my-card-gallery' : 'my-card-gallery-noModif') : 'my-card-gallery-view' + ' text-center'
return props.edit || displayGall.value
? props.isInModif
? 'my-card-gallery'
: 'my-card-gallery-noModif'
: 'my-card-gallery-view' + ' text-center';
}
function getclimg() {
let mycl = (props.edit || displayGall.value) ? 'myimg' : 'myimg-view'
if (props.canModify && props.edit)
mycl = mycl + ' myimg-modify'
return mycl
let mycl = props.edit || displayGall.value ? 'myimg' : 'myimg-view';
if (props.canModify && props.edit) mycl = mycl + ' myimg-modify';
return mycl;
}
/*function getlastord() {
@@ -242,79 +264,81 @@ export default defineComponent({
}*/
function uploaded(info: any) {
console.log('uploaded', info)
console.log('uploaded', info);
let vers_img = tools.getGenerateVersionImage()
let vers_img = tools.getGenerateVersionImage();
if (gallerylist.value) {
console.log('vers_img', vers_img)
console.log('vers_img', vers_img);
if (props.single && info.files) {
console.log('gallerylist.value[0]', info.files[0].name)
console.log('gallerylist.value[0]', info.files[0].name);
if (info.files[0].name.imagefile) {
gallerylist.value[0] = info.files[0].name
gallerylist.value[0] = info.files[0].name;
} else {
gallerylist.value[0] = { imagefile: info.files[0].name, vers_img }
gallerylist.value[0] = { imagefile: info.files[0].name, vers_img, fieldtype: props.fieldtype };
}
} else {
for (const file of info.files) {
if (file.name.imagefile) {
gallerylist.value.push(file.name)
gallerylist.value.push(file.name);
} else {
gallerylist.value.push({ imagefile: file.name, vers_img })
gallerylist.value.push({ imagefile: file.name, vers_img, fieldtype: props.fieldtype });
}
}
}
save()
save();
console.log('CGALLERY gallerylist', gallerylist.value)
console.log('CGALLERY gallerylist', gallerylist.value);
}
}
function apri() {
displayGall.value = true
displayGall.value = true;
}
function deleted(rec: any) {
console.log('deleted', rec.imagefile)
console.log('deleted', rec.imagefile);
// console.table(mylistimages)
if (gallerylist.value) {
const index = gallerylist.value.findIndex((elem: any) => elem.imagefile === rec.imagefile)
const index = gallerylist.value.findIndex(
(elem: any) => elem.imagefile === rec.imagefile
);
if (index > -1) {
gallerylist.value.splice(index, 1)
gallerylist.value.splice(index, 1);
}
gallerylist.value = gallerylist.value.filter((elem: any) => typeof elem.imagefile === 'string' && elem.imagefile)
gallerylist.value = gallerylist.value.filter(
(elem: any) => typeof elem.imagefile === 'string' && elem.imagefile
);
// mylistimages = mylistimages.pop((elem) => elem.imagefile !== rec.imagefile)
// console.table(mylistimages)
console.log('single', props.single)
console.log('single', props.single);
save()
save();
}
}
function getfullname(rec: any) {
if (rec) {
return tools.getDirUpload() + props.directory + '/' + rec.imagefile
return tools.getDirUpload() + props.directory + '/' + rec.imagefile;
} else {
return props.imagebak
return props.imagebak;
}
}
function copytoclipboard(rec: any) {
const filename = getfullname(rec)
tools.copyStringToClipboard($q, filename, true)
const filename = getfullname(rec);
tools.copyStringToClipboard($q, filename, true);
}
function deleteFile(rec: any) {
console.log('deleteFile....')
const filename = getfullname(rec)
const filenamerel = filename.replace(/^.*[\\\/]/, '')
console.log('deleteFile....');
const filename = getfullname(rec);
const filenamerel = filename.replace(/^.*[\\\/]/, '');
$q.dialog({
message: 'Eliminare il file ' + filenamerel + '?',
@@ -327,64 +351,134 @@ export default defineComponent({
cancel: true,
persistent: false,
}).onOk(async () => {
// Delete File on server:
const ris = await globalStore.DeleteFile({ filename })
const ris = await globalStore.DeleteFile({ filename });
// console.log('ris', ris)
//if (ris)
deleted(rec)
})
deleted(rec);
});
}
function save() {
console.log('CGallery save', gallerylist.value)
console.log('CGallery save', gallerylist.value);
if (gallerylist.value.length > 0) {
if (!props.single) {
emit('showandsave', gallerylist.value)
emit('showandsave', gallerylist.value);
} else {
emit('showandsave', gallerylist.value[0])
emit('showandsave', gallerylist.value[0]);
}
} else {
emit('showandsave', !props.single ? [] : '')
emit('showandsave', !props.single ? [] : '');
}
}
function close() {
return ''
return '';
}
function getrealdirectory() {
if (props.directory == 'productinfos')
return 'products'
else
return props.directory
if (props.directory == 'productinfos') return 'products';
else return props.directory;
}
function getParamDir() {
return tools.escapeslash(getrealdirectory())
return tools.escapeslash(getrealdirectory());
}
function getUrl() {
const myurl = tools.geturlupload() + getParamDir()
console.log('myurl', myurl)
return myurl
const myurl = tools.geturlupload() + getParamDir();
console.log('myurl', myurl);
return myurl;
}
function ImgFullScreen(mygallery: IImgGallery) {
fullscreen.value = true
fullscreensrc.value = getfullname(mygallery)
fullscreen.value = true;
fullscreensrc.value = getfullname(mygallery);
}
function onRejected(rejectedEntries: any) {
// Notify plugin needs to be installed
// https://quasar.dev/quasar-plugins/notify#Installation
console.log('rejectedEntries', rejectedEntries)
console.log('rejectedEntries', rejectedEntries);
$q.notify({
type: 'negative',
message: 'La Dimensione massima dell\'immagine è di 2 MB'
})
message: "La Dimensione massima dell'immagine è di 2 MB",
});
}
onMounted(created)
function getFileTypeStr() {
let tipo = '';
if (props.filetype === shared_consts.FILETYPE.IMG) tipo = 'Immagine';
else if (props.filetype === shared_consts.FILETYPE.PDF) tipo = 'PDF';
return tipo;
}
function getAccept() {
let tipo = '';
if (props.filetype === shared_consts.FILETYPE.IMG) tipo = 'image/*';
else if (props.filetype === shared_consts.FILETYPE.PDF) tipo = 'application/pdf';
return tipo;
}
function isPDF() {
return props.filetype === shared_consts.FILETYPE.PDF;
}
function isIMG() {
return props.filetype === shared_consts.FILETYPE.IMG;
}
const uploadFactory = async (files: readonly File[]) => {
const userStore = useUserStore();
const url = getUrl();
const buildFormData = () => {
const fd = new FormData();
// "file" è il fieldName atteso dal backend (adegua se diverso)
files.forEach((f) => fd.append('file', f, f.name));
// opzionale: passaggio di options come nel tuo backend
fd.append('options', JSON.stringify({ quality: 'original' }));
return fd;
};
const sendOnce = async () => {
return Api.SendReq(url, 'POST', buildFormData());
};
try {
await sendOnce();
} catch (err: any) {
const status = err?.response?.status;
try {
// usa la tua logica centralizzata
Api.checkTokenScaduto(
status,
/*evitaloop*/ false,
url,
'POST',
null,
/*setAuthToken*/ true
);
if (ret !== null) {
// token aggiornato -> ritenta UNA volta
await sendOnce();
} else {
throw err;
}
} catch (err2: any) {
// se lhandler segnala re-login, mostra messaggio e rilancia
const mystatus = err2?.status || err2?.code;
if (mystatus === toolsext.ERR_RETRY_LOGIN) {
$q.notify({
type: 'warning',
message: 'Sessione scaduta. Effettua nuovamente il login.',
});
}
throw err2;
}
}
};
onMounted(created);
return {
getlistimages,
@@ -415,6 +509,13 @@ export default defineComponent({
costanti,
getrealdirectory,
uploadOptions,
}
}
})
getFileTypeStr,
getAccept,
shared_consts,
isIMG,
isPDF,
upl,
uploadFactory,
};
},
});

View File

@@ -3,46 +3,128 @@
<div v-if="!edit">
<div class="q-pa-xs">
<q-card v-if="isListImgValid" :class="getclass()" @click="apri">
<div v-for="(mygallery, index) in getlistimages()" :key="index">
<q-card
v-if="isListImgValid"
:class="getclass()"
@click="apri"
>
<div
v-for="(mygallery, index) in getlistimages()"
:key="index"
>
<div v-if="index === 0">
<q-img :src="tools.getsrcimg(mygallery, getrealdirectory())" :class="getclimg()" :alt="mygallery.alt">
<div v-if="getnumimages() > 1" class="absolute-bottom text-shadow no-padding">
({{ getnumimages() }})
</div>
</q-img>
<div v-if="filetype === shared_consts.FILETYPE.IMG">
<q-img
:src="tools.getsrcimg(mygallery, getrealdirectory())"
:class="getclimg()"
:alt="mygallery.alt"
>
<div
v-if="getnumimages() > 1"
class="absolute-bottom text-shadow no-padding"
>
({{ getnumimages() }})
</div>
</q-img>
</div>
<div v-else-if="filetype === shared_consts.FILETYPE.PDF">
<div>{{ mygallery.imagefile }}</div>
<q-icon
name="fas fa-file-pdf"
:class="getclimg()"
size="lg"
:title="mygallery.alt"
>
</q-icon>
</div>
</div>
</div>
</q-card>
<div v-else-if="!isInModif && !isListImgValid && imagebak">
<q-card v-if="imagebak !== costanti.NESSUN_IMMAGINE" :class="getclass()" @click="ImgFullScreen(mygallery)">
<q-img :src="imagebak" :class="getclimg()"> </q-img>
</q-card>
</div>
<div v-else>
<q-card :class="getclass()" @click="apri">
<q-img src="/images/noimg.png" :class="getclimg()" alt="no image">
<q-card
v-if="imagebak !== costanti.NESSUN_IMMAGINE"
:class="getclass()"
@click="ImgFullScreen(mygallery)"
>
<q-img
:src="imagebak"
:class="getclimg()"
>
</q-img>
</q-card>
</div>
<q-btn v-if="isInModif" color="primary" @click="apri" icon="fas fa-file-upload" :label="$t('gallery.load_image')">
<div v-else>
<q-card
:class="getclass()"
@click="apri"
>
<q-icon
v-if="filetype === shared_consts.FILETYPE.PDF"
name="fas fa-file-pdf"
size="lg"
:class="getclimg()"
alt="no image"
>
</q-icon>
<q-img
v-else
src="/images/noimg.png"
:class="getclimg()"
alt="no image"
>
</q-img>
</q-card>
</div>
<q-btn
v-if="isInModif"
color="primary"
@click="apri"
icon="fas fa-file-upload"
:label="isIMG() ? $t('gallery.load_image') : $t('gallery.load_pdf')"
>
</q-btn>
</div>
</div>
<div v-else>
<div v-if="!isListImgValid">
<q-btn flat round color="blue" icon="fas fa-tools" size="md" @click="apri"></q-btn>
<q-btn
flat
round
color="blue"
icon="fas fa-tools"
size="md"
@click="apri"
></q-btn>
</div>
<div v-else>
<div class="row">
<!--<q-draggable-rows
v-model="order">-->
<div v-for="(mygallery, index) in getlistimages()" :key="index">
<div class="q-pa-sm q-gutter-sm" @dragenter="onDragEnter" @dragleave="onDragLeave" @dragover="onDragOver">
<q-card :id="mygallery._id" :class="getclass()" :draggable="canModify" @dragstart="onDragStart"
@drop="onDrop">
<q-img :src="tools.getsrcimg(mygallery, getrealdirectory())" :class="getclimg()" :alt="mygallery.alt">
<div
v-for="(mygallery, index) in getlistimages()"
:key="index"
>
<div
class="q-pa-sm q-gutter-sm"
@dragenter="onDragEnter"
@dragleave="onDragLeave"
@dragover="onDragOver"
>
<q-card
:id="mygallery._id"
:class="getclass()"
:draggable="canModify"
@dragstart="onDragStart"
@drop="onDrop"
>
<q-img
:src="tools.getsrcimg(mygallery, getrealdirectory())"
:class="getclimg()"
:alt="mygallery.alt"
>
<div class="absolute-bottom text-shadow">
<!-- <div class="text-h6 text-trans">{{ mygallery.description }} </div> -->
<div class="text-subtitle-carica text-trans">
@@ -51,60 +133,134 @@
</div>
</q-img>
<q-field v-if="canModify" stack-label dense label="Nome File">
<q-field
v-if="canModify"
stack-label
dense
label="Nome File"
>
<template v-slot:control>
<div class="self-center full-width no-outline" tabindex="0">
<div
class="self-center full-width no-outline"
tabindex="0"
>
{{ mygallery.imagefile }}
</div>
</template>
</q-field>
<q-input v-if="canModify" v-model="mygallery.description" dense :label="$t('proj.longdescr')"
@keyup.enter.stop @update:model-value="save" debounce="1000" autofocus>
<q-input
v-if="canModify"
v-model="mygallery.description"
dense
:label="$t('proj.longdescr')"
@keyup.enter.stop
@update:model-value="save"
debounce="1000"
autofocus
>
</q-input>
<q-card-actions align="center">
<q-btn v-if="canModify" flat round color="blue" icon="fas fa-copy" size="sm"
@click="copytoclipboard(mygallery)"></q-btn>
<q-btn v-if="canModify" flat round color="red" icon="fas fa-trash-alt" size="sm"
@click="deleteFile(mygallery)"></q-btn>
<q-btn
v-if="canModify"
flat
round
color="blue"
icon="fas fa-copy"
size="sm"
@click="copytoclipboard(mygallery)"
></q-btn>
<q-btn
v-if="canModify"
flat
round
color="red"
icon="fas fa-trash-alt"
size="sm"
@click="deleteFile(mygallery)"
></q-btn>
</q-card-actions>
</q-card>
</div>
</div>
<div class="q-pa-sm">
<div v-if="edit" class="q-gutter-sm" style="max-height: 200px; width: 208px">
<q-uploader :label="single &&
gallerylist.length > 0 &&
gallerylist[0].imagefile !== ''
? 'Sostituisci Immagine'
: 'Aggiungi Immagine'
" accept="image/*" :url="getUrl()" :headers="tools.getheaders()" :max-file-size="3000000"
:multiple="!single" auto-upload hide-upload-btn no-thumbnails @uploaded="uploaded" @rejected="onRejected"
<div
v-if="edit"
class="q-gutter-sm"
style="max-height: 200px; width: 208px"
>
<q-uploader
:label="
single && gallerylist.length > 0 && gallerylist[0].imagefile !== ''
? 'Sostituisci Immagine'
: 'Aggiungi Immagine'
"
:accept="getAccept()"
:url="getUrl()"
:headers="tools.getheaders()"
:max-file-size="3000000"
:multiple="!single"
auto-upload
hide-upload-btn
no-thumbnails
@uploaded="uploaded"
@rejected="onRejected"
style="width: 208px"
:options="uploadOptions"></q-uploader>
:options="uploadOptions"
></q-uploader>
</div>
</div>
</div>
</div>
</div>
<q-dialog v-model="displayGall" persistent :maximized="maximizedToggle" transition-show="slide-up"
transition-hide="slide-down">
<q-dialog
v-model="displayGall"
persistent
:maximized="maximizedToggle"
transition-show="slide-up"
transition-hide="slide-down"
>
<q-card>
<q-bar class="bg-primary text-white">
<q-space />
<q-btn dense flat icon="minimize" @click="maximizedToggle = false" :disable="!maximizedToggle">
<q-tooltip v-if="maximizedToggle" :class="($q.dark.isActive ? `bg-black` : `bg-white`) + ` text-primary`
">Minimize</q-tooltip>
<q-btn
dense
flat
icon="minimize"
@click="maximizedToggle = false"
:disable="!maximizedToggle"
>
<q-tooltip
v-if="maximizedToggle"
:class="($q.dark.isActive ? `bg-black` : `bg-white`) + ` text-primary`"
>Minimize</q-tooltip
>
</q-btn>
<q-btn dense flat icon="crop_square" @click="maximizedToggle = true" :disable="maximizedToggle">
<q-tooltip v-if="!maximizedToggle" :class="($q.dark.isActive ? `bg-black` : `bg-white`) + ` text-primary`
">Maximize</q-tooltip>
<q-btn
dense
flat
icon="crop_square"
@click="maximizedToggle = true"
:disable="maximizedToggle"
>
<q-tooltip
v-if="!maximizedToggle"
:class="($q.dark.isActive ? `bg-black` : `bg-white`) + ` text-primary`"
>Maximize</q-tooltip
>
</q-btn>
<q-btn dense flat icon="close" v-close-popup>
<q-tooltip :class="($q.dark.isActive ? `bg-black` : `bg-white`) + ` text-primary`
">{{ t('dialog.close') }}</q-tooltip>
<q-btn
dense
flat
icon="close"
v-close-popup
>
<q-tooltip
:class="($q.dark.isActive ? `bg-black` : `bg-white`) + ` text-primary`"
>{{ t('dialog.close') }}</q-tooltip
>
</q-btn>
</q-bar>
@@ -114,23 +270,64 @@
<q-card-section class="q-pt-none">
<div class="row">
<div v-for="(mygallery, index) in getlistimages()" :key="index">
<div class="q-pa-sm barwidth" @dragenter="onDragEnter" @dragleave="onDragLeave" @dragover="onDragOver">
<div
v-for="(mygallery, index) in getlistimages()"
:key="index"
>
<div
class="q-pa-sm barwidth"
@dragenter="onDragEnter"
@dragleave="onDragLeave"
@dragover="onDragOver"
>
<q-bar class="bg-primary text-white">
<q-btn flat round dense icon="menu" class="q-mr-sm" />
<q-btn v-if="canModify" flat round icon="fas fa-copy" size="sm"
@click="copytoclipboard(mygallery)"></q-btn>
<div>Foto {{ index + 1 }}</div>
<q-btn
flat
round
dense
icon="menu"
class="q-mr-sm"
/>
<q-btn
v-if="canModify"
flat
round
icon="fas fa-copy"
size="sm"
@click="copytoclipboard(mygallery)"
></q-btn>
<div v-if="isIMG()">Foto {{ index + 1 }}</div>
<div v-else-if="isPDF()">PDF {{ index + 1 }}</div>
<q-space></q-space>
<q-btn v-if="canModify" flat round color="red" icon="fas fa-trash-alt"
@click="deleteFile(mygallery)"></q-btn>
<q-btn
v-if="canModify"
flat
round
color="red"
icon="fas fa-trash-alt"
@click="deleteFile(mygallery)"
></q-btn>
</q-bar>
<q-card :id="mygallery._id" :class="getclass()" :data-ind="index" :draggable="canModify"
@dragstart="onDragStart" @drop="onDrop">
<q-img :src="tools.getsrcimg(mygallery, getrealdirectory())" :class="getclimg()"
@click="ImgFullScreen(mygallery)" :alt="mygallery.alt">
<div v-if="mygallery.description" class="absolute-bottom text-shadow">
<q-card
:id="mygallery._id"
:class="getclass()"
:data-ind="index"
:draggable="canModify"
@dragstart="onDragStart"
@drop="onDrop"
>
<q-img
v-if="isIMG()"
:src="tools.getsrcimg(mygallery, getrealdirectory())"
:class="getclimg()"
@click="ImgFullScreen(mygallery)"
:alt="mygallery?.alt"
>
<div
v-if="mygallery.description"
class="absolute-bottom text-shadow"
>
<!-- <div class="text-h6 text-trans">{{ mygallery.description }} </div> -->
<div class="text-subtitle-carica text-trans">
{{ mygallery.description }}
@@ -138,51 +335,117 @@
</div>
</q-img>
<q-card-section>
<q-field v-if="canModify" stack-label dense label="Nome File">
<q-field
v-if="canModify"
stack-label
dense
label="Nome File"
>
<template v-slot:control>
<div class="self-center full-width no-outline" tabindex="0">
<div
class="self-center full-width no-outline"
tabindex="0"
>
{{ mygallery.imagefile }}
</div>
</template>
</q-field>
<q-input v-if="canModify" v-model="mygallery.description" dense :label="$t('proj.longdescr')"
@keyup.enter.stop @update:model-value="save" debounce="1000" autofocus>
<q-input
v-if="canModify"
v-model="mygallery.description"
dense
:label="$t('proj.longdescr')"
@keyup.enter.stop
@update:model-value="save"
debounce="1000"
autofocus
>
</q-input>
</q-card-section>
</q-card>
</div>
</div>
<div v-if="canModify" class="q-pa-sm">
<div class="q-gutter-sm" style="max-height: 200px; width: 208px">
<q-uploader label="Aggiungi Immagine" accept="image/*" :url="getUrl()" :headers="tools.getheaders()"
:max-file-size="40000000" multiple auto-upload hide-upload-btn no-thumbnails @uploaded="uploaded"
@rejected="onRejected" style="width: 208px"></q-uploader>
<div
v-if="canModify"
class="q-pa-sm"
>
<div
class="q-gutter-sm"
style="max-height: 200px; width: 208px"
>
<q-uploader
:label="`Aggiungi ` + getFileTypeStr()"
:accept="getAccept()"
:url="getUrl()"
:headers="tools.getheaders()"
:max-file-size="40000000"
multiple
auto-upload
hide-upload-btn
no-thumbnails
@uploaded="uploaded"
@rejected="onRejected"
style="width: 208px"
></q-uploader>
</div>
</div>
<div v-if="!isInModif && !isListImgValid && imagebak">
<q-card :class="getclass()" @click="ImgFullScreen(mygallery)">
<q-img :src="imagebak" :class="getclimg()"> </q-img>
<q-card
:class="getclass()"
@click="ImgFullScreen(mygallery)"
>
<q-img
:src="imagebak"
:class="getclimg()"
>
</q-img>
</q-card>
</div>
</div>
<q-card-actions align="right">
<q-btn v-if="canModify" flat label="Annulla" color="primary" v-close-popup />
<q-btn v-if="canModify" label="salva" color="primary" v-close-popup @click="save" />
<q-btn v-if="!canModify" label="Chiudi" color="primary" v-close-popup />
<q-btn
v-if="canModify"
flat
label="Annulla"
color="primary"
v-close-popup
/>
<q-btn
v-if="canModify"
label="salva"
color="primary"
v-close-popup
@click="save"
/>
<q-btn
v-if="!canModify"
label="Chiudi"
color="primary"
v-close-popup
/>
</q-card-actions>
</q-card-section>
</q-card>
</q-dialog>
<q-dialog v-model="fullscreen" :maximized="false" transition-show="slide-up" transition-hide="slide-down">
<q-dialog
v-model="fullscreen"
:maximized="false"
transition-show="slide-up"
transition-hide="slide-down"
>
<q-card class="my-card">
<q-img v-if="fullscreensrc" alt="fullscreen" :src="fullscreensrc" @click="fullscreen = false"></q-img>
<q-img
v-if="fullscreensrc"
alt="fullscreen"
:src="fullscreensrc"
@click="fullscreen = false"
></q-img>
</q-card>
</q-dialog>
</template>
<script lang="ts" src="./CGallery.ts">
</script>
<script lang="ts" src="./CGallery.ts"></script>
<style lang="scss" scoped>
@import './CGallery.scss';

View File

@@ -65,9 +65,9 @@ export default defineComponent({
default: true,
},
heightcarousel: {
type: Number,
type: String,
required: false,
default: 0,
default: '',
},
enableExport: {
type: Boolean,

View File

@@ -149,7 +149,7 @@
:optval="fieldsTable.getKeyByTable(item.table)"
:optlab="fieldsTable.getLabelByTable(item.table)"
:options="valoriopt(item, item.addall, item.addnone)"
:filter="item && item.filter ? item.filter : ''"
:filter="item && item.filter ? item.filter : null"
:filter_extra="item.filter_extra"
:useinput="item.useinput && item.type !== costanti.FieldType.select_by_server"
>
@@ -173,7 +173,7 @@
:icon_alternative="item.icon"
:optval="fieldsTable.getKeyByTable(item.table)"
:optlab="fieldsTable.getLabelByTable(item.table)"
:filter="item.filter"
:filter="item && item.filter ? item.filter : null"
:filter_extra="item.filter_extra"
:options="valoriopt(item, false)"
:useinput="true"
@@ -197,7 +197,7 @@
stack-label
:useinput="item.useinput"
:options="valoriopt(item, item.addall, item.addnone)"
:filter="item.filter"
:filter="item && item.filter ? item.filter : null"
class="combowidth"
:option-value="fieldsTable.getKeyByTable(item.table)"
>
@@ -825,7 +825,7 @@
:optval="fieldsTable.getKeyByTable(item.table)"
:optlab="fieldsTable.getLabelByTable(item.table)"
:options="valoriopt(item, item.addall, item.addnone)"
:filter="item.filter"
:filter="item && item.filter ? item.filter : null"
:filter_extra="item.filter_extra"
:useinput="item.useinput && item.type !== costanti.FieldType.select_by_server"
>
@@ -854,7 +854,7 @@
:icon_alternative="item.icon"
:optval="fieldsTable.getKeyByTable(item.table)"
:optlab="fieldsTable.getLabelByTable(item.table)"
:filter="item.filter"
:filter="item && item.filter ? item.filter : null"
:filter_extra="item.filter_extra"
:options="valoriopt(item, false)"
:useinput="true"
@@ -879,7 +879,7 @@
stack-label
:useinput="item.useinput"
:options="valoriopt(item, item.addall, item.addnone)"
:filter="item.filter"
:filter="item && item.filter ? item.filter : null"
class="combowidth"
:option-value="fieldsTable.getKeyByTable(item.table)"
>

View File

@@ -0,0 +1,23 @@
button {
margin-top: 10px;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
button:disabled {
background-color: #ccc;
cursor: not-allowed;
}
input[type="file"] {
margin-top: 20px;
}
.error {
color: red;
margin-top: 10px;
}

View File

@@ -0,0 +1,308 @@
import type { PropType } from 'vue';
import {
defineComponent,
ref,
toRef,
computed,
watch,
onMounted,
reactive,
onBeforeUnmount,
} from 'vue';
import { useI18n } from 'vue-i18n';
import { useUserStore } from '@store/UserStore';
import { useGlobalStore } from '@store/globalStore';
import { useQuasar } from 'quasar';
import { tools } from '@tools';
import { useProducts } from '@store/Products';
import { shared_consts } from '@src/common/shared_vuejs';
import { useRouter } from 'vue-router';
import { costanti } from '@costanti';
import * as XLSX from 'xlsx';
import { Api } from 'app/src/store/Api';
export default defineComponent({
name: 'CImportListaTitoli',
emits: ['addArrayTitlesToList'],
props: {},
components: {},
setup(props, { emit }) {
const $q = useQuasar();
const { t } = useI18n();
const userStore = useUserStore();
const globalStore = useGlobalStore();
const Products = useProducts();
// Stati reattivi
const fileData = ref<any[]>([]);
const searchResults = ref<any[]>([]);
const loading = ref(false);
const error = ref<string | null>(null);
const columns = ref([
{
name: 'title',
label: 'Titolo',
field: 'title',
align: 'left',
sortable: true,
},
{
name: 'isbn',
label: 'ISBN',
field: 'isbn',
align: 'left',
sortable: true,
},
{
name: 'select',
label: 'Seleziona',
field: 'select',
align: 'left',
},
]);
const onRequest = (props: any) => {
const { page, rowsPerPage, sortBy, descending } = props.pagination;
const filterValue = filter.value;
const filteredRows = searchResults.value
.filter((row) => {
const title = row.title?.toLowerCase() || '';
const author = row.author?.toLowerCase() || '';
const isbn = row.isbn?.toLowerCase() || '';
return (
title.includes(filterValue.toLowerCase()) ||
author.includes(filterValue.toLowerCase()) ||
isbn.includes(filterValue.toLowerCase())
);
})
.sort((a, b) => {
const sortA = a[sortBy];
const sortB = b[sortBy];
if (descending) {
return sortA < sortB ? 1 : -1;
} else {
return sortA > sortB ? 1 : -1;
}
});
pagination.rowsNumber = filteredRows.length;
pagination.page = page;
pagination.rowsPerPage = rowsPerPage;
pagination.sortBy = sortBy;
pagination.descending = descending;
return {
pagination,
rows: filteredRows.slice((page - 1) * rowsPerPage, page * rowsPerPage),
};
};
const filter = ref('');
const importSelectedBooks = () => {
if (searchResults.value.length === 0) {
$q.notify({
message: t('Nessun libro selezionato'),
color: 'warning',
});
return;
}
// Aggiungi i libri selezionati alla lista dell'utente
emit(
'addArrayTitlesToList',
searchResults.value.filter((row) => row.select)
);
};
const pagination = reactive({
sortBy: 'title',
descending: false,
page: 1,
rowsPerPage: 50,
rowsNumber: searchResults.value.length,
});
const filteredResults = computed(() => {
const { sortBy, descending, page, rowsPerPage, rowsNumber } = pagination;
const firstIndex = (page - 1) * rowsPerPage;
const lastIndex = firstIndex + rowsPerPage;
return searchResults.value.slice(firstIndex, lastIndex).sort((a, b) => {
const aValue = a[sortBy];
const bValue = b[sortBy];
return descending ? bValue.localeCompare(aValue) : aValue.localeCompare(bValue);
});
});
// Gestore del caricamento del file
const handleFileUpload = (event: Event) => {
const file = (event.target as HTMLInputElement).files?.[0];
if (file) {
loading.value = true;
error.value = null;
const reader = new FileReader();
reader.onload = async () => {
try {
// Verifica il tipo di file (CSV o Excel) e parse
if (file.name.endsWith('.csv')) {
fileData.value = await parseCSV(reader.result as string);
} else if (file.name.endsWith('.xls') || file.name.endsWith('.xlsx')) {
fileData.value = await parseExcel(reader.result as ArrayBuffer);
}
} catch (err) {
error.value = 'Errore nel parsing del file: ' + err;
} finally {
loading.value = false;
}
};
// Leggi il file con il metodo appropriato basato sul tipo
if (file.name.endsWith('.csv')) {
reader.readAsText(file);
} else if (file.name.endsWith('.xls') || file.name.endsWith('.xlsx')) {
reader.readAsArrayBuffer(file); // ← Questa è la correzione principale
}
}
};
// Funzione di ricerca dei libri
const searchBooksHandler = async () => {
if (!fileData.value || fileData.value.length === 0) {
return;
}
loading.value = true;
error.value = null;
try {
// Esegui la ricerca con la funzione di backend
searchResults.value = await searchBooks(fileData.value);
if (searchResults.value && searchResults.value.length > 0) {
$q.notify({
message: `Trovati ${searchResults.value.length} libri`,
color: 'positive',
});
}
if (searchResults.value && searchResults.value.length === 0) {
$q.notify({
message: 'Nessun libro importabile',
color: 'negative',
});
}
} catch (err) {
error.value = 'Errore nella ricerca dei libri';
} finally {
loading.value = false;
}
};
async function parseCSV(csvText: string): Promise<any[]> {
// Funzione per analizzare un file CSV
const lines = csvText.split('\n');
const headers = lines[0].split(',');
const data = lines.slice(1).map((line) => {
const values = line.split(',');
return headers.reduce((acc, header, index) => {
acc[header.trim()] = values[index].trim();
return acc;
}, {} as any);
});
return data;
}
async function parseExcel(excelData: ArrayBuffer): Promise<any[]> {
try {
// Debug: verifica il tipo e la dimensione di excelData
console.log('Tipo di excelData:', typeof excelData);
console.log('È ArrayBuffer?', excelData instanceof ArrayBuffer);
console.log('Dimensione excelData:', excelData.byteLength);
// Usa direttamente l'ArrayBuffer con type: 'buffer'
const workbook = XLSX.read(excelData, { type: 'buffer' });
// Controllo se ci sono fogli
if (!workbook.SheetNames || workbook.SheetNames.length === 0) {
throw new Error('Nessun foglio trovato nel file Excel');
}
console.log('Fogli disponibili:', workbook.SheetNames);
// Prendi il nome del primo foglio
const sheetName = workbook.SheetNames[0];
const sheet = workbook.Sheets[sheetName];
// Controllo se il foglio esiste
if (!sheet) {
throw new Error(`Il foglio "${sheetName}" non è stato trovato`);
}
// Debug: mostra la struttura del foglio
console.log('Foglio:', sheetName);
console.log('Range del foglio:', sheet['!ref']);
console.log(
'Tutte le celle:',
Object.keys(sheet).filter((key) => !key.startsWith('!'))
);
// Usa sheet_to_json per convertire il foglio in array di righe
const rows = XLSX.utils.sheet_to_json(sheet, {
header: 1,
defval: '',
raw: false,
});
console.log('Righe estratte:', rows.length);
console.log('Prime 3 righe:', rows.slice(0, 3));
// Filtra le righe completamente vuote
const filteredRows = rows.filter(
(row: any[]) =>
Array.isArray(row) &&
row.some((cell) => cell !== null && cell !== undefined && cell !== '')
);
return filteredRows;
} catch (error) {
console.error("Errore durante l'analisi del file Excel:", error);
throw new Error(`Errore durante l'analisi del file Excel: ${error.message}`);
}
}
async function searchBooks(books: any[]): Promise<any[]> {
const response = await Api.SendReq('/api/search-books', 'POST', { books });
if (response.status !== 200) {
throw new Error('Errore nella risposta del server');
}
return response.data; // Supponiamo che il backend ritorni un array di oggetti con id e title
}
function deselectAll() {
searchResults.value.forEach((row) => (row.select = false));
}
return {
handleFileUpload,
searchBooks: searchBooksHandler,
searchResults,
loading,
error,
fileData,
pagination,
filteredResults,
importSelectedBooks,
filter,
onRequest,
columns,
deselectAll,
};
},
});

View File

@@ -0,0 +1,87 @@
<template>
<div class="row justify-center">
<h3>Carica un file Excel contenente l'ISBN oppure il nome del titolo del libro</h3>
<!-- Input per il file -->
<input
type="file"
@change="handleFileUpload"
accept=".csv, .xls, .xlsx"
/>
<br />
<q-btn
@click="searchBooks"
:disabled="!fileData || loading"
>
Cerca Libri
</q-btn>
<br />
</div>
<div class="">
<!-- Risultati della ricerca -->
<div v-if="searchResults.length">
<h3>{{ searchResults.length }} Libri trovati:</h3>
<br />
<q-btn
@click="deselectAll"
:disabled="!searchResults.length"
color="negative"
dense
>
Deseleziona tutti
</q-btn>
<q-table
:columns="columns"
:rows="searchResults"
row-key="_id"
:filter="filter"
:pagination.sync="pagination"
:loading="loading"
:rows-per-page-options="[0]"
@request="onRequest"
binary-state-sort
>
<template v-slot:top-right>
<!--<q-input
borderless
dense
debounce="300"
v-model="filter"
placeholder="Cerca"
>
<template v-slot:append>
<q-icon name="search" />
</template>
</q-input>-->
</template>
<template v-slot:body-cell-select="props">
<q-td :props="props">
<q-checkbox v-model="props.row.select" />
</q-td>
</template>
</q-table>
<q-btn
color="primary"
@click="importSelectedBooks"
:disabled="!searchResults.some((r) => r.select)"
label="Importa selezionati"
/>
</div>
<!-- Messaggio di errore -->
<div
v-if="error"
class="error"
>
{{ error }}
</div>
</div>
</template>
<script lang="ts" src="./CImportListaTitoli.ts"></script>
<style lang="scss" scoped>
@import './CImportListaTitoli.scss';
</style>

View File

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

View File

@@ -647,7 +647,7 @@ export default defineComponent({
}
async function condividi() {
const mystr = "❇️ Ecco l'annuncio da condividere !\nPuoi copiarlo oppure inoltrarlo a chi vuoi.\n\nE\' utile pubblicarlo anche nel gruppo Telegram RISO territoriale o in <a href=\'https://t.me/riso_gruppo/1911\'>RISO RIevoluzione SOlidale</a> (Topic \'Annunci RISO\') "
const mystr = "❇️ Ecco l'annuncio da condividere !\nPuoi copiarlo oppure inoltrarlo a chi vuoi.\n\nE\' utile pubblicarlo anche nel gruppo Telegram RISO territoriale o in <a href=\'https://riso.app/riso_gruppo\'>☀️💚 RISO - Rete Italiana Scambi Orizzontali</a> (Topic \'Annunci RISO\') "
await tools.sendMsgTelegramCmd($q, t, shared_consts.MsgTeleg.SHARE_TEXT, false, mystr)
tools.copyToClip($q, getlinkpage(), true)

View File

@@ -186,8 +186,6 @@
side
v-if="visu === costanti.USER_CIRCUITS && tools.isUserOk()"
>
fidoConcessoUtente: {{ fidoConcessoUtente }}
myuser: {{ myuser }}
<q-item-label>
<q-btn
rounded

View File

@@ -80,7 +80,7 @@ export default defineComponent({
function saveFielDim(rec: any, newval: any, col: IColGridTable) {
// console.log('saveFielDim', rec, 'newval', newval, 'col', col)
if (col.fieldtype === costanti.FieldType.image) {
if (col.fieldtype === costanti.FieldType.imagerec) {
if (!rec[col.name]) {
rec[col.name] = {}

View File

@@ -54,7 +54,7 @@
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
:fieldtype="costanti.FieldType.imagerec"
@save="saveFielDim"
>
</CMyFieldRec>

View File

@@ -553,9 +553,9 @@ export default defineComponent({
const iscatalogo = costanti.CATALOGO_FIELDS.includes(col.name);
const isscheda = costanti.SCHEDA_FIELDS.includes(col.name);
const isIImg = costanti.IMG_FIELDS.includes(col.name) && col.fieldtype === costanti.FieldType.image;
const isIImg = costanti.IMG_FIELDS.includes(col.name) && col.fieldtype === costanti.FieldType.imagerec;
if (col.fieldtype === costanti.FieldType.image) {
if (col.fieldtype === costanti.FieldType.imagerec) {
if (iscatalogo) {
myel.value.catalogo[col.name] = newval.imagefile;
//console.log('SALVATO IN', col.name, newval.imagefile, 'RIS', myel.value.catalogo[col.name])

View File

@@ -711,7 +711,7 @@
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
:fieldtype="costanti.FieldType.imagerec"
>
</CMyFieldRec>
@@ -760,7 +760,7 @@
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
:fieldtype="costanti.FieldType.imagerec"
>
</CMyFieldRec>
<CMyFieldRec
@@ -772,7 +772,7 @@
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
:fieldtype="costanti.FieldType.imagerec"
>
</CMyFieldRec>
<div class="row">
@@ -947,7 +947,7 @@
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
:fieldtype="costanti.FieldType.imagerec"
>
</CMyFieldRec>
<CMyFieldRec
@@ -1009,7 +1009,7 @@
:canEdit="true"
:canModify="true"
:path="path"
:fieldtype="costanti.FieldType.image"
:fieldtype="costanti.FieldType.imagerec"
>
</CMyFieldRec>
</div>
@@ -1036,7 +1036,7 @@
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
:fieldtype="costanti.FieldType.imagerec"
>
</CMyFieldRec>
<div class="">

View File

@@ -12,6 +12,7 @@ import { CImgTitle } from '../CImgTitle/index'
import { CImgPoster } from '@src/components/CImgPoster'
import { CTitle } from '@src/components/CTitle/index'
import { CGridOriz } from '@src/components/CGridOriz/index'
import { ChatBot } from '@src/components/ChatBot/index'
import { CCatalogList } from '@src/components/CCatalogList/index'
import { CRaccoltaCataloghi } from '@src/components/CRaccoltaCataloghi/index'
import { tools } from '@tools'
@@ -80,6 +81,7 @@ export default defineComponent({
CMapComuni, CMapUsers, CMapGetCoordinates, CMapEditAddressByCoord,
CDashGroup, CMovements, CGridOriz, CQRCode, CCatalogList,
CSearchProduct, CRaccoltaCataloghi, CPageViewStats,
ChatBot,
// , //CMapMarker,
},
emits: ['selElemClick'],

View File

@@ -974,6 +974,15 @@
</div>
<CAITools></CAITools>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.CHATBOT">
<div
v-if="editOn"
class="elemEdit"
>
CHATBOT:
</div>
<ChatBot></ChatBot>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.NOTIFATTOP">
<div
v-if="editOn"

File diff suppressed because it is too large Load Diff

View File

@@ -316,8 +316,6 @@
>
<span style="font-size: 14px">{{ myvalue }}</span>
</div>
</div>
<!-- Componente di selezione del colore -->
@@ -333,7 +331,8 @@
<div
v-else-if="
col.fieldtype === costanti.FieldType.string ||
col.fieldtype === costanti.FieldType.crypted
col.fieldtype === costanti.FieldType.crypted ||
col.fieldtype === costanti.FieldType.username_telegram
"
>
<div
@@ -359,6 +358,19 @@
:rules="[(val) => !!val || !col.required || 'Campo richiesto']"
:label="col.visulabel ? addstrrequired + t(col.label_trans) : col.label"
>
<template
v-if="col.fieldtype === costanti.FieldType.username_telegram"
v-slot:prepend
>
<span class="text-h7 text-blue">@</span>
</template>
<template
v-if="col.fieldtype === costanti.FieldType.username_telegram"
v-slot:prepend
>
<span class="text-h7 text-blue">@</span>
</template>
</q-input>
<q-field v-if="col.showLinkResult && myvalue">
Diventerà: {{ tools.generateURL(col.showLinkResult, myvalue) }}
@@ -520,6 +532,7 @@
{{ t(col.label_trans) }}
</span>
<CGallery
:filetype="shared_consts.FILETYPE.IMG"
:imagebak="
col.showpicprofile_ifnotset
? userStore.getImgByProfile(row, true) === ''
@@ -551,7 +564,7 @@
</CAccomodation>
</div>
<div
v-else-if="col.fieldtype === costanti.FieldType.image"
v-else-if="col.fieldtype === costanti.FieldType.imagerec"
style="text-align: center"
>
<div v-if="canEdit">
@@ -559,6 +572,7 @@
{{ t(col.label_trans ? col.label_trans : '') }}
</span>
<CGallery
:filetype="shared_consts.FILETYPE.IMG"
:imagebak="
col.showpicprofile_ifnotset
? userStore.getImgByProfile(row['profile'], true)
@@ -619,6 +633,76 @@
></q-btn>
</div>
</div>
<div
v-else-if="col.fieldtype === costanti.FieldType.pdf"
style="text-align: center"
>
<div v-if="canEdit">
<span class="text-h7 text-weight-bold row justify-center">
{{ t(col.label_trans ? col.label_trans : '') }}
</span>
<CGallery
:filetype="shared_consts.FILETYPE.PDF"
:imagebak="
col.showpicprofile_ifnotset
? userStore.getImgByProfile(row['profile'], true)
: ''
"
:title="tools.getTitleGall(table)"
:directory="tools.getDirectoryGall(myrow, table, mypath)"
:imgGall="
myvalue && myvalue.imagefile
? [myvalue]
: [{ imagefile: myvalue, vers_img: 1 }]
"
:edit="isviewfield()"
:canModify="canModify"
:isInModif="isInModif"
:single="true"
@update:imgGall="changevalRec"
@showandsave="Savedb"
>
</CGallery>
</div>
<div v-else>
<div
v-if="myvalue"
class="text-center"
>
<q-img
icon="fas fa-file-pdf"
class="text-center"
style="height: 100px; width: 100px"
alt="foto"
>
</q-img>
</div>
<div
v-else
class="text-center"
>
<q-img
:src="
col.showpicprofile_ifnotset
? userStore.getImgByProfile(row['profile'], true)
: '/images/noimg-user.svg'
"
class="text-center"
style="height: 100px; width: 100px"
alt="nessun PDF"
>
</q-img>
</div>
<q-btn
v-if="myvalue"
label="Rimuovi Foto"
color="blue"
icon="fas fa-trash-alt"
size="sm"
@click="removephoto"
></q-btn>
</div>
</div>
<div v-else-if="col.fieldtype === costanti.FieldType.image_and_filename">
<div v-if="canEdit">
{{ t('reg.photo') }}
@@ -643,6 +727,77 @@
? [myvalue]
: [{ imagefile: myvalue, vers_img: 1 }]
"
:fieldtype="col.fieldtype"
:edit="isviewfield()"
:canModify="canModify"
:isInModif="isInModif"
:single="true"
@update:imgGall="changevalRec"
@showandsave="Savedb"
>
</CGallery>
</div>
<div v-else>
<div
v-if="myvalue"
class="text-center"
>
<q-img
:src="myvalue"
class="text-center"
style="height: 100px; width: 100px"
alt="foto"
>
</q-img>
</div>
<div
v-else
class="text-center"
>
<q-img
:src="
col.showpicprofile_ifnotset
? userStore.getImgByProfile(row['profile'], true)
: '/images/noimg-user.svg'
"
class="text-center"
style="height: 100px; width: 100px"
alt="nessuna immagine"
>
</q-img>
</div>
<q-btn
v-if="myvalue"
label="Rimuovi Foto"
color="blue"
icon="fas fa-trash-alt"
size="sm"
@click="removephoto"
></q-btn>
</div>
</div>
<div v-else-if="col.fieldtype === costanti.FieldType.imgfile_sfuso">
<div v-if="canEdit">
{{ t('reg.photo') }}
<CGallery
:imagebak="
col.showpicprofile_ifnotset
? userStore.getImgByProfile(row['profile'], true)
: ''
"
:title="tools.getTitleGall(table)"
:directory="tools.getDirectoryGall(myrow, table, mypath)"
:imgGall="
myvalue && myvalue.imagefile
? [myvalue]
: [
{
imagefile: myvalue,
vers_img: 1,
fieldtype: col.fieldtype,
},
]
"
:edit="isviewfield()"
:canModify="canModify"
:isInModif="isInModif"
@@ -1420,7 +1575,8 @@
<div
v-else-if="
col.fieldtype === costanti.FieldType.string ||
col.fieldtype === costanti.FieldType.crypted
col.fieldtype === costanti.FieldType.crypted ||
col.fieldtype === costanti.FieldType.username_telegram
"
>
<q-input
@@ -1893,6 +2049,40 @@
? [myvalue]
: [{ imagefile: myvalue, vers_img: 1 }]
"
:fieldtype="col.fieldtype"
:edit="isviewfield()"
:canModify="canModify"
:isInModif="isInModif"
:single="true"
@update:imgGall="changevalRec"
@showandsave="Savedb"
>
</CGallery>
</div>
</div>
<div v-else-if="col.fieldtype === costanti.FieldType.imgfile_sfuso">
<div v-if="canEdit">
{{ t('reg.photo') }}
<CGallery
:imagebak="
col.showpicprofile_ifnotset
? userStore.getImgByProfile(row['profile'], true)
: ''
"
:title="tools.getTitleGall(table)"
:directory="tools.getDirectoryGall(myrow, table, mypath)"
:imgGall="
myvalue && myvalue.imagefile
? [myvalue]
: [
{
imagefile: myvalue,
vers_img: 1,
fieldtype: col.fieldtype,
},
]
"
:fieldtype="col.fieldtype"
:edit="isviewfield()"
:canModify="canModify"
:isInModif="isInModif"

View File

@@ -274,7 +274,8 @@ export default defineComponent({
step: STEP_CIRCUIT_ITALIA,
title: t('tutorial.step_circuito_italia_title'),
extratitle: function () { return circuititalia.value ? ': ' + circuititalia.value.name : '' },
label: circuitStore.SonoDentroAdAlmeno1CircuitoConFido() ? t('tutorial.step_circuito_italia') : t('tutorial.non_sono_dentro_al_mio_circuito'),
// label: circuitStore.SonoDentroAdAlmeno1CircuitoConFido() ? t('tutorial.step_circuito_italia') : t('tutorial.non_sono_dentro_al_mio_circuito'),
label: t('tutorial.step_circuito_italia'),
label_ok: t('tutorial.step_circuito_italia_ok'),
checkOk: function () {
if (circuititalia.value) {
@@ -459,8 +460,8 @@ export default defineComponent({
function mounted() {
if (circuitStore.SonoDentroAdAlmeno1CircuitoConFido())
arrStep.value.push({ ...stepCircItalia, indstep: numindstep.value })
//if (circuitStore.SonoDentroAdAlmeno1CircuitoConFido())
arrStep.value.push({ ...stepCircItalia, indstep: numindstep.value })
// arrStep.value.push({ ...stepFine, indstep: numindstep.value })

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