Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d8e38fea6 | ||
|
|
f1f3f5ad07 | ||
|
|
6013a624f6 | ||
|
|
85db3b4a61 | ||
|
|
31161b6a32 | ||
|
|
6779b0ea25 | ||
|
|
f12341f780 | ||
|
|
43938023ee | ||
|
|
969e7b726e | ||
|
|
d37797fdad | ||
|
|
2ce8a72286 | ||
|
|
be0d7efca2 | ||
|
|
68dac1b2f4 |
4
.env
@@ -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"
|
||||
@@ -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=""
|
||||
|
||||
@@ -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
@@ -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
|
After Width: | Height: | Size: 536 KiB |
@@ -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<% } %>">
|
||||
|
||||
|
||||
20
package.json
@@ -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",
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 81 KiB |
BIN
public/images/layers-2x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/images/layers.png
Normal file
|
After Width: | Height: | Size: 696 B |
BIN
public/images/logo.png
Normal file
|
After Width: | Height: | Size: 424 KiB |
BIN
public/images/marker-icon-2x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/images/marker-icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 30 KiB |
BIN
public/images/riso-android-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/images/riso-android-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/images/riso-android-icon-384x384.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
public/images/riso-android-icon-48x48.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
public/images/riso-android-icon-512x512.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
public/images/riso-android-icon-96x96.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
public/images/riso-apple-icon-114x114.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/images/riso-apple-icon-120x120.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/riso-apple-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/images/riso-apple-icon-152x152.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
public/images/riso-apple-icon-180x180.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/images/riso-apple-icon-57x57.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
public/images/riso-apple-icon-60x60.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
public/images/riso-apple-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
public/images/riso-apple-icon-76x76.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
public/images/riso-apple-icon.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/images/riso-logo-full.png
Normal file
|
After Width: | Height: | Size: 424 KiB |
BIN
public/images/riso_home.png
Normal file
|
After Width: | Height: | Size: 279 KiB |
BIN
public/images/riso_home_dark.png
Normal file
|
After Width: | Height: | Size: 258 KiB |
BIN
public/images/riso_services.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
@@ -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
|
||||
@@ -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
|
||||
BIN
public/myicons/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
public/myicons/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
public/myicons/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/noimg.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
BIN
scripts/_ALL_SITES/gruppomacro.app/public/noimg.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
@@ -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; " ' +
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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>',
|
||||
},
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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>',
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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>',
|
||||
},
|
||||
|
||||
@@ -1 +1 @@
|
||||
TERMINA DI LAVORARE SU riso.app: (Sovrascrivo!)
|
||||
TERMINA DI LAVORARE SU gruppomacro.app: (Sovrascrivo!)
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ export default ({ router }) => {
|
||||
userAgent,
|
||||
username: userStore.my?.username,
|
||||
userId: userStore.my?._id,
|
||||
referrer: document?.referrer || '',
|
||||
};
|
||||
|
||||
// Invia il tracciamento al backend
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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="
|
||||
|
||||
@@ -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"
|
||||
>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
0
src/components/CCsvToXls/CCsvToXls.scss
Executable file
70
src/components/CCsvToXls/CCsvToXls.ts
Executable 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,
|
||||
};
|
||||
},
|
||||
});
|
||||
24
src/components/CCsvToXls/CCsvToXls.vue
Executable 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>
|
||||
1
src/components/CCsvToXls/index.ts
Executable file
@@ -0,0 +1 @@
|
||||
export { default as CCsvToXls } from './CCsvToXls.vue'
|
||||
@@ -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,
|
||||
};
|
||||
},
|
||||
})
|
||||
});
|
||||
|
||||
@@ -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"> </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';
|
||||
|
||||
@@ -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 l’handler 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,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -65,9 +65,9 @@ export default defineComponent({
|
||||
default: true,
|
||||
},
|
||||
heightcarousel: {
|
||||
type: Number,
|
||||
type: String,
|
||||
required: false,
|
||||
default: 0,
|
||||
default: '',
|
||||
},
|
||||
enableExport: {
|
||||
type: Boolean,
|
||||
|
||||
@@ -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)"
|
||||
>
|
||||
|
||||
23
src/components/CImportListaTitoli/CImportListaTitoli.scss
Executable 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;
|
||||
}
|
||||
308
src/components/CImportListaTitoli/CImportListaTitoli.ts
Executable 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,
|
||||
};
|
||||
},
|
||||
});
|
||||
87
src/components/CImportListaTitoli/CImportListaTitoli.vue
Executable 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>
|
||||
1
src/components/CImportListaTitoli/index.ts
Executable file
@@ -0,0 +1 @@
|
||||
export {default as CImportListaTitoli} from './CImportListaTitoli.vue'
|
||||
@@ -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)
|
||||
|
||||
@@ -186,8 +186,6 @@
|
||||
side
|
||||
v-if="visu === costanti.USER_CIRCUITS && tools.isUserOk()"
|
||||
>
|
||||
fidoConcessoUtente: {{ fidoConcessoUtente }}
|
||||
myuser: {{ myuser }}
|
||||
<q-item-label>
|
||||
<q-btn
|
||||
rounded
|
||||
|
||||
@@ -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] = {}
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
@update:model-value="modifElem"
|
||||
:canEdit="true"
|
||||
:canModify="true"
|
||||
:fieldtype="costanti.FieldType.image"
|
||||
:fieldtype="costanti.FieldType.imagerec"
|
||||
@save="saveFielDim"
|
||||
>
|
||||
</CMyFieldRec>
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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="">
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 })
|
||||
|
||||
|
||||