- newsletter: prende la lista utenti (flag news_on)

- Abilita a Tutti la Newsletter news_on
- isCommerciale
- JobsInProgress
- PCB: Corretto Totali che era a zero
This commit is contained in:
Surya Paolo
2025-05-06 18:19:03 +02:00
parent 70f1e5cbf1
commit 57cfa5858b
53 changed files with 1123 additions and 428 deletions

4
.env
View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{ {
"name": "gruppomacro", "name": "gruppomacro",
"version": "1.2.35", "version": "1.2.37",
"description": "Gruppo Macro", "description": "Gruppo Macro",
"productName": "Gruppo Macro", "productName": "Gruppo Macro",
"author": "Surya", "author": "Surya",
@@ -9,20 +9,20 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "PORT=8089 APP_VERSION='1.2.35' quasar dev", "dev": "PORT=8089 APP_VERSION='1.2.37' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev", "dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build", "build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.35' quasar build -m pwa", "buildpwa": "NODE_ENV=production APP_VERSION='1.2.37' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.35' quasar build -m pwa", "buildpwatest": "NODE_ENV=production APP_VERSION='1.2.37' quasar build -m pwa",
"type-check": "vue-tsc --noEmit", "type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch", "type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.35' quasar build -m spa", "buildspa": "APP_VERSION='1.2.37' quasar build -m spa",
"lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"", "lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"",
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt", "lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .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", "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.35' quasar dev -m pwa", "pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.37' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.35' quasar dev", "spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.37' quasar dev",
"debug": "quasar dev --mode debug", "debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0", "test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js", "generate-sw": "workbox generateSW workbox-config.js",
@@ -41,6 +41,7 @@
"@vuelidate/validators": "^2.0.4", "@vuelidate/validators": "^2.0.4",
"acorn": "^8.14.1", "acorn": "^8.14.1",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"apexcharts": "^4.7.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"axios": "^1.8.4", "axios": "^1.8.4",
"bcryptjs": "^3.0.2", "bcryptjs": "^3.0.2",
@@ -87,6 +88,7 @@
"vue-svgicon": "^4.0.0-alpha.3", "vue-svgicon": "^4.0.0-alpha.3",
"vue-timeago3": "^2.3.2", "vue-timeago3": "^2.3.2",
"vue2-dragula": "^2.5.5", "vue2-dragula": "^2.5.5",
"vue3-apexcharts": "^1.8.0",
"vue3-pdf-app": "^1.0.3", "vue3-pdf-app": "^1.0.3",
"vue3-qr-reader": "^1.0.0", "vue3-qr-reader": "^1.0.0",
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",

View File

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

View File

@@ -110,65 +110,6 @@ const routes_admin: IListRoutes[] = [
} }
] ]
const routes_newsletter: IListRoutes[] = [
{
active: true,
order: 10,
name: 'newsletter.template', path: '/admin/newsletter/templemail', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
},
{
active: true,
order: 20,
name: 'newsletter.sendemail', path: '/admin/newsletter/newnewsletter', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
},
{
active: true,
order: 30,
name: 'newsletter.check', path: '/admin/newsletter/check', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
},
{
active: true,
order: 40,
name: 'newsletter.sent', path: '/admin/newsletter/newslist', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
},
{
active: true,
order: 50,
name: 'newsletter.mailinglist', path: '/admin/newsletter/mailinglist', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
},
{
active: true,
order: 60,
name: 'newsletter.settings', path: '/admin/newsletter/settings', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
},
{
active: true,
order: 70,
name: 'newsletter.serversettings', path: '/admin/newsletter/main_settings', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
},
{
active: true,
order: 80,
name: 'newsletter.others', path: '/admin/newsletter/events', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true
}
]
const routes_manager: IListRoutes[] = [ const routes_manager: IListRoutes[] = [
{ {
active: functionality.BOOKING_EVENTS, active: functionality.BOOKING_EVENTS,
@@ -280,7 +221,7 @@ const routes_manager: IListRoutes[] = [
faIcon: 'fa fa-list-alt', faIcon: 'fa fa-list-alt',
materialIcon: 'fas fa-users', materialIcon: 'fas fa-users',
name: 'otherpages.admin.newsletter', name: 'otherpages.admin.newsletter',
routes2: routes_newsletter, routes2: [],
inmenu: false, inmenu: false,
submenu: true, submenu: true,
level_parent: 0.5, level_parent: 0.5,

View File

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

View File

@@ -1,6 +1,6 @@
{ {
"name": "gruppomacro", "name": "gruppomacro",
"version": "1.2.35", "version": "1.2.37",
"description": "Gruppo Macro", "description": "Gruppo Macro",
"productName": "Gruppo Macro", "productName": "Gruppo Macro",
"author": "Surya", "author": "Surya",
@@ -9,20 +9,20 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "PORT=8089 APP_VERSION='1.2.35' quasar dev", "dev": "PORT=8089 APP_VERSION='1.2.37' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev", "dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build", "build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.35' quasar build -m pwa", "buildpwa": "NODE_ENV=production APP_VERSION='1.2.37' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.35' quasar build -m pwa", "buildpwatest": "NODE_ENV=production APP_VERSION='1.2.37' quasar build -m pwa",
"type-check": "vue-tsc --noEmit", "type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch", "type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.35' quasar build -m spa", "buildspa": "APP_VERSION='1.2.37' quasar build -m spa",
"lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"", "lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"",
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt", "lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .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", "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.35' quasar dev -m pwa", "pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.37' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.35' quasar dev", "spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.37' quasar dev",
"debug": "quasar dev --mode debug", "debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0", "test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js", "generate-sw": "workbox generateSW workbox-config.js",
@@ -32,6 +32,7 @@
"@cubejs-client/core": "^1.2.26", "@cubejs-client/core": "^1.2.26",
"@quasar/extras": "^1.16.17", "@quasar/extras": "^1.16.17",
"@quasar/quasar-ui-qcalendar": "^4.1.2", "@quasar/quasar-ui-qcalendar": "^4.1.2",
"@syncfusion/ej2-vue-pdfviewer": "^29.1.40",
"@types/jsbarcode": "^3.11.4", "@types/jsbarcode": "^3.11.4",
"@types/leaflet": "^1.9.17", "@types/leaflet": "^1.9.17",
"@vue/compat": "^3.5.13", "@vue/compat": "^3.5.13",
@@ -40,6 +41,7 @@
"@vuelidate/validators": "^2.0.4", "@vuelidate/validators": "^2.0.4",
"acorn": "^8.14.1", "acorn": "^8.14.1",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"apexcharts": "^4.7.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"axios": "^1.8.4", "axios": "^1.8.4",
"bcryptjs": "^3.0.2", "bcryptjs": "^3.0.2",
@@ -86,6 +88,7 @@
"vue-svgicon": "^4.0.0-alpha.3", "vue-svgicon": "^4.0.0-alpha.3",
"vue-timeago3": "^2.3.2", "vue-timeago3": "^2.3.2",
"vue2-dragula": "^2.5.5", "vue2-dragula": "^2.5.5",
"vue3-apexcharts": "^1.8.0",
"vue3-pdf-app": "^1.0.3", "vue3-pdf-app": "^1.0.3",
"vue3-qr-reader": "^1.0.0", "vue3-qr-reader": "^1.0.0",
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",

View File

@@ -75,6 +75,7 @@ const msg_website_it = {
eventodef: 'Evento:', eventodef: 'Evento:',
prova: 'prova', prova: 'prova',
dbop: 'Operazioni', dbop: 'Operazioni',
dbopmacro: 'Operazioni Macro',
projall: 'Comunitari', projall: 'Comunitari',
groups: 'Lista Gruppi', groups: 'Lista Gruppi',
projectsShared: 'Condivisi da me', projectsShared: 'Condivisi da me',

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{ {
"name": "riso", "name": "riso",
"version": "1.2.35", "version": "1.2.37",
"description": "Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.", "description": "Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.",
"productName": "Riso", "productName": "Riso",
"author": "Surya", "author": "Surya",
@@ -9,11 +9,11 @@
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "APP_VERSION='1.2.35' PORT=8084 quasar dev", "dev": "APP_VERSION='1.2.37' PORT=8084 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev", "dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build", "build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.35' quasar build -m pwa", "buildpwa": "NODE_ENV=production APP_VERSION='1.2.37' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.35' quasar build -m pwa", "buildpwatest": "NODE_ENV=production APP_VERSION='1.2.37' quasar build -m pwa",
"type-check": "vue-tsc --noEmit", "type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch", "type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa", "buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt", "lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .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", "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.35' quasar dev -m pwa", "pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.37' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.35' quasar dev", "spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.37' quasar dev",
"debug": "quasar dev --mode debug", "debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0", "test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js", "generate-sw": "workbox generateSW workbox-config.js",

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

View File

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

View File

@@ -326,6 +326,7 @@ export const shared_consts = {
TABLES_MYGROUPS: 'mygroups', TABLES_MYGROUPS: 'mygroups',
TABLES_ATTIVITAS: 'attivitas', TABLES_ATTIVITAS: 'attivitas',
TABLES_CATALOG: 'catalogs', TABLES_CATALOG: 'catalogs',
TABLES_LISTA_EDITORI: 'lista_editori',
TABFILTRI_UTENTE: 'filtriutente', TABFILTRI_UTENTE: 'filtriutente',
@@ -1110,6 +1111,12 @@ export const shared_consts = {
icon: 'fas fa-paint-brush', icon: 'fas fa-paint-brush',
color: 'green', color: 'green',
}, },
Commerciale: {
value: 256,
label: 'dashboard.Commerciale',
icon: 'fas fa-briefcase',
color: 'brown',
},
}, },
MessageOptions: { MessageOptions: {
@@ -2487,6 +2494,21 @@ export const shared_consts = {
VISU_SEARCHPROD_MODE: { VISU_SEARCHPROD_MODE: {
VISU: 0, VISU: 0,
INSERT: 1, INSERT: 1,
} },
DESTNEWSLETTER: {
LISTA_NEWSLETTER: 0,
UTENTI: 1,
DIARIO: 2,
TEST: 10,
},
DESTNEWSLETTER_ARRAY: [
{value: 0, label: 'LISTA_NEWSLETTER'},
{value: 1, label: 'UTENTI'},
{value: 2, label: 'DIARIO'},
{value: 10, label: 'TEST'},
],
} }

View File

@@ -155,7 +155,7 @@
/> />
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
<q-item-label>Modifica Trafiletto</q-item-label> <q-item-label>Modifica Sinossi</q-item-label>
</q-item-section> </q-item-section>
</q-item> </q-item>
@@ -180,7 +180,7 @@
</q-item>--> </q-item>-->
<q-item <q-item
v-if=" v-if="
tools.isManager() && !optcatalogo.generazionePDFInCorso && (editOn || options.show_edit_book) !optcatalogo.generazionePDFInCorso && (editOn || options.show_edit_book)
" "
clickable clickable
v-close-popup v-close-popup
@@ -683,7 +683,7 @@
> >
<CModifTrafiletto <CModifTrafiletto
v-model="myproduct" v-model="myproduct"
titolo="Trafiletto" titolo="Sinossi"
table="productinfos" table="productinfos"
mykey="descr_trafiletto_catalogo" mykey="descr_trafiletto_catalogo"
:canModify="true" :canModify="true"

View File

@@ -745,6 +745,11 @@ export default defineComponent({
if (recSector) { if (recSector) {
tools.setCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + mytable.value + costanti.FILTER_SEP + table + costanti.FILTER_SEP + recSector.value, newval) tools.setCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + mytable.value + costanti.FILTER_SEP + table + costanti.FILTER_SEP + recSector.value, newval)
} }
} else if (table === shared_consts.TABLES_LISTA_EDITORI) {
const rec = searchList.value.find((rec) => rec.table === table)
if (rec) {
tools.setCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + table + costanti.FILTER_SEP + 'referente', rec.value)
}
// setCategBySector('sectorgoods', table, newval) // setCategBySector('sectorgoods', table, newval)
} else if (table === shared_consts.TAB_CITIES) { } else if (table === shared_consts.TAB_CITIES) {
const rec = searchList.value.find((myrec) => myrec.table === shared_consts.TAB_CITIES) // check if exist const rec = searchList.value.find((myrec) => myrec.table === shared_consts.TAB_CITIES) // check if exist

View File

@@ -40,6 +40,7 @@
> >
<q-tab-panel name="descr"> <q-tab-panel name="descr">
<q-btn <q-btn
v-if="false"
flat flat
round round
dense dense

View File

@@ -18,6 +18,7 @@ import { shared_consts } from '@src/common/shared_vuejs'
import { LandingFooter } from '@src/components/LandingFooter' import { LandingFooter } from '@src/components/LandingFooter'
import { CMyActivities } from '@src/components/CMyActivities' import { CMyActivities } from '@src/components/CMyActivities'
import { CECommerce } from '@src/components/CECommerce' import { CECommerce } from '@src/components/CECommerce'
import { CStatMacro } from '@src/components/CStatMacro'
import { CSearchProduct } from '@src/components/CSearchProduct' import { CSearchProduct } from '@src/components/CSearchProduct'
import { CQRCode } from '@src/components/CQRCode' import { CQRCode } from '@src/components/CQRCode'
import { CAITools } from '@src/components/CAITools' import { CAITools } from '@src/components/CAITools'
@@ -72,7 +73,7 @@ export default defineComponent({
CPresentazione, CMyActivities, CPresentazione, CMyActivities,
CMyProfileTutorial, CSendRISTo, CMyProfileTutorial, CSendRISTo,
CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration, CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration,
CVisuVideoPromoAndPDF, CECommerce, CCatalogo, CAITools, CVisuVideoPromoAndPDF, CECommerce, CCatalogo, CAITools, CStatMacro,
CMapComuni, CMapUsers, CMapGetCoordinates, CMapEditAddressByCoord, CMapComuni, CMapUsers, CMapGetCoordinates, CMapEditAddressByCoord,
CDashGroup, CMovements, CGridOriz, CQRCode, CCatalogList, CDashGroup, CMovements, CGridOriz, CQRCode, CCatalogList,
CSearchProduct, CSearchProduct,

View File

@@ -349,8 +349,8 @@
<div v-if="editOn" class="elemEdit">Cataloghi</div> <div v-if="editOn" class="elemEdit">Cataloghi</div>
<q-tabs v-if="tools.isEditor() || tools.isGrafico()" v-model="tabcatalogo" dense class="bg-green text-white"> <q-tabs v-if="tools.isEditor() || tools.isGrafico()" v-model="tabcatalogo" dense class="bg-green text-white">
<q-tab name="griglia" icon="fas fa-eye" label="Griglia"> </q-tab> <q-tab name="griglia" icon="fas fa-eye" label="Griglia"> </q-tab>
<q-tab name="statistiche" icon="fas fa-chart-pie" label="Statistiche"> </q-tab>
<q-tab name="lista" icon="fas fa-list" label="Lista"> </q-tab> <q-tab name="lista" icon="fas fa-list" label="Lista"> </q-tab>
<q-tab name="cerca" icon="fas fa-book" label="Cerca"> </q-tab>
<q-tab name="tutorial" icon="fas fa-info" label="Tutorial"> </q-tab> <q-tab name="tutorial" icon="fas fa-info" label="Tutorial"> </q-tab>
</q-tabs> </q-tabs>
<q-tab-panels v-model="tabcatalogo" animated keep-alive> <q-tab-panels v-model="tabcatalogo" animated keep-alive>
@@ -358,10 +358,6 @@
<CGridOriz table="catalogs" :tipovisu="costanti.VISUTABLE_TABLELIST" :prop_search="true" :finder="true" <CGridOriz table="catalogs" :tipovisu="costanti.VISUTABLE_TABLELIST" :prop_search="true" :finder="true"
:showMap="false" :prop_modif="tools.isAdmin()"></CGridOriz> :showMap="false" :prop_modif="tools.isAdmin()"></CGridOriz>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="cerca">
<CSearchProduct v-model="myel.catalogo">
</CSearchProduct>
</q-tab-panel>
<q-tab-panel name="griglia"> <q-tab-panel name="griglia">
<CCatalogList :prop_search="myel.parambool" :finder="myel.parambool2" <CCatalogList :prop_search="myel.parambool" :finder="myel.parambool2"
@@ -374,6 +370,11 @@
<q-btn rounded label="Apri Tutorial" color="primary" @click="naviga('/tutorial')"></q-btn> <q-btn rounded label="Apri Tutorial" color="primary" @click="naviga('/tutorial')"></q-btn>
</div> </div>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="statistiche">
<div class="q-pa-md q-ma-sm text-center">
<CStatMacro></CStatMacro>
</div>
</q-tab-panel>
</q-tab-panels> </q-tab-panels>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.STATUSREG"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.STATUSREG">

View File

@@ -143,7 +143,7 @@ export default defineComponent({
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const col = ref(<IColGridTable>{ const col = ref(<IColGridTable>{
name: 'test', fieldtype: 0, showWhen: costanti.showWhen.NewRec + costanti.showWhen.InEdit + costanti.showWhen.InView, visible: true, maxlength: props.maxlength, minlength: props.minlength name: 'test', fieldtype: 0, showWhen: costanti.showWhen.NewRec + costanti.showWhen.InEdit + costanti.showWhen.InView, visible: true, maxlength: props.maxlength, minlength: props.minlength, label_trans: ''
}) })
const row = ref({}) const row = ref({})

View File

@@ -883,9 +883,9 @@
@update:value="changevalRec" @update:value="changevalRec"
@update:model-value="Savedb" @update:model-value="Savedb"
:newvaluefunc="addNewValue" :newvaluefunc="addNewValue"
:filter_table="col.filter_table" :filter_table="col?.filter_table"
:addnone="col.addnone" :addnone="col?.addnone"
:filter_field="col.filter_field" :filter_field="col?.filter_field"
:value_extra="value_extra" :value_extra="value_extra"
:optval="fieldsTable.getKeyByTable(col.jointable)" :optval="fieldsTable.getKeyByTable(col.jointable)"
:optlab="fieldsTable.getLabelByTable(col.jointable)" :optlab="fieldsTable.getLabelByTable(col.jointable)"
@@ -1105,7 +1105,7 @@
@update:model-value="changevalRec" @update:model-value="changevalRec"
:maxlength="col.maxlength ? col.maxlength : undefined" :maxlength="col.maxlength ? col.maxlength : undefined"
type="password" type="password"
@keyup.enter="scope.set" @keyup.enter="changevalRec"
autofocus autofocus
> >
</q-input> </q-input>
@@ -1320,10 +1320,10 @@
:type_out="col.field_outtype" :type_out="col.field_outtype"
:col="col" :col="col"
:row="row" :row="row"
:label="col.label ? col.label : t(col.label_trans)" :label="col.label ? col.label : col.label_trans ? t(col.label_trans) : undefined"
v-model:value="scope.value" v-model:value="scope.value"
:pickup="col.fieldtype === costanti.FieldType.select_by_server" :pickup="col.fieldtype === costanti.FieldType.select_by_server"
:addnone="col.addnone" :addnone="col?.addnone"
:tablesel="col.fieldtype === costanti.FieldType.select_by_server ? tablesel : undefined" :tablesel="col.fieldtype === costanti.FieldType.select_by_server ? tablesel : undefined"
:filter_table="col.filter_table" :filter_table="col.filter_table"
:filter_field="col.filter_field" :filter_field="col.filter_field"

View File

@@ -248,7 +248,7 @@
@update:model-value="changeval" @update:model-value="changeval"
@filter="filterFn" @filter="filterFn"
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'" :behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
:label="addstrrequired + label" :label="label ? addstrrequired + label : undefined"
:use-input="useinput" :use-input="useinput"
@new-value="newvaluefuncfirst" @new-value="newvaluefuncfirst"
emit-value emit-value

View File

@@ -126,7 +126,7 @@ export default defineComponent({
{ name: "name", label: "Titolo del Libro", field: "name", align: "left" }, { name: "name", label: "Titolo del Libro", field: "name", align: "left" },
{ name: "authors", label: "Autore", field: "authors", align: "left" }, { name: "authors", label: "Autore", field: "authors", align: "left" },
{ name: "isbn", label: "ISBN", field: "isbn", align: "left" }, { name: "isbn", label: "ISBN", field: "isbn", align: "left" },
{ name: "trafiletto", label: "Trafiletto", field: "trafiletto", align: "left" }, { name: "trafiletto", label: "Sinossi", field: "trafiletto", align: "left" },
{ name: "catprods", label: "Argomento", field: "catprods", align: "left" }, { name: "catprods", label: "Argomento", field: "catprods", align: "left" },
{ name: "edizione", label: "Edizione", field: "edizione", align: "left" }, { name: "edizione", label: "Edizione", field: "edizione", align: "left" },
{ name: "casaeditrice", label: "Casa Editrice", field: "casaeditrice", align: "left" }, { name: "casaeditrice", label: "Casa Editrice", field: "casaeditrice", align: "left" },

View File

@@ -216,7 +216,7 @@ export default defineComponent({
const arrlist: IRecFields[] = [ const arrlist: IRecFields[] = [
{ {
editOn: true, editOn: true,
label: "Descrizione Trafiletto per Catalogo", label: "Descrizione Sinossi per Catalogo",
title: myproduct.value?.productInfo?.name, title: myproduct.value?.productInfo?.name,
table: "productinfos", table: "productinfos",
id: myproduct.value.productInfo._id, // ID dinamico, da sostituire con il valore reale id: myproduct.value.productInfo._id, // ID dinamico, da sostituire con il valore reale

View File

View File

@@ -0,0 +1,35 @@
import Vue, { computed, defineComponent, onMounted, ref } from 'vue'
import { tools } from '../../store/Modules/tools'
import { useUserStore } from '@store/UserStore'
import { useRouter } from 'vue-router'
import { useGlobalStore } from '@store/globalStore'
import { useI18n } from 'vue-i18n'
import { useQuasar } from 'quasar'
import type { ChartItem, ChartConfiguration } from 'chart.js';
import { Chart, BarController, BarElement, LineController, LinearScale, CategoryScale, PointElement, LineElement, Title } from 'chart.js';
export default defineComponent({
name: 'CStatMacro',
components: {},
setup(props, { emit }) {
const userStore = useUserStore()
const globalStore = useGlobalStore()
const { t } = useI18n()
const q = useQuasar()
function mounted() {
}
onMounted(mounted)
return {
tools,
q,
}
},
})

View File

@@ -0,0 +1,12 @@
<template>
<div>
</div>
</template>
<script lang="ts" src="./CStatMacro.ts">
</script>
<style lang="scss" scoped>
@import './CStatMacro.scss';
</style>

View File

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

View File

@@ -26,6 +26,11 @@ export default defineComponent({
type: String, type: String,
default: '', default: '',
}, },
tipodest: {
required: false,
type: Number,
default: 0,
},
accept: { accept: {
required: false, required: false,
type: Boolean, type: Boolean,
@@ -51,6 +56,7 @@ export default defineComponent({
const email = toRef(props, 'email') const email = toRef(props, 'email')
const idwebsite = toRef(props, 'idwebsite') const idwebsite = toRef(props, 'idwebsite')
const locale = toRef(props, 'locale') const locale = toRef(props, 'locale')
const tipodest = toRef(props, 'tipodest')
const onSubmit = async function a2() { const onSubmit = async function a2() {
if (!accept.value) { if (!accept.value) {
@@ -67,6 +73,7 @@ export default defineComponent({
firstName: name.value, firstName: name.value,
lastName: surname.value, lastName: surname.value,
idwebsite: idwebsite.value, idwebsite: idwebsite.value,
tipodest: tipodest.value,
locale: locale.value, locale: locale.value,
settomailchimp: toolsext.getValDb('MAILCHIMP_ON', true, false), settomailchimp: toolsext.getValDb('MAILCHIMP_ON', true, false),
} }
@@ -114,9 +121,19 @@ export default defineComponent({
accept.value = false accept.value = false
} }
function optionsDest() {
return [
{ label: 'Lista Newsletter', value: 0 },
{ label: 'Utenti', value: 1 },
{ label: 'Diario', value: 2 },
{ label: 'Test', value: 10 },
];
}
return { return {
onSubmit, onSubmit,
onReset, onReset,
optionsDest,
} }
}, },

View File

@@ -1,66 +1,110 @@
<template> <template>
<div> <div>
<div class="q-pa-md q-gutter-sm text-white"> <div class="q-pa-md q-gutter-sm text-white">
<p class="news_title">{{$t('newsletter.title')}}</p> <p class="news_title">{{ $t('newsletter.title') }}</p>
<q-form <q-form
@submit="onSubmit" @submit="onSubmit"
@reset="onReset" @reset="onReset"
class="q-gutter-md" class="q-gutter-md"
> >
<q-input <q-input
filled filled
name="firstName" name="firstName"
dense dense
dark standout dark
v-model="name" standout
:label="t('newsletter.name') + `*`" v-model="name"
:hint="t('newsletter.namehint')" :label="t('newsletter.name') + `*`"
lazy-rules :hint="t('newsletter.namehint')"
:rules="[ val => val && val.length > 0 || $t('newsletter.typesomething')]"> lazy-rules
:rules="[(val) => (val && val.length > 0) || $t('newsletter.typesomething')]"
>
</q-input>
</q-input> <q-input
filled
dense
dark
standout
v-model="surname"
name="lastName"
:label="t('newsletter.surname') + `*`"
:hint="t('newsletter.surnamehint')"
lazy-rules
:rules="[(val) => (val && val.length > 0) || $t('newsletter.typesomething')]"
>
</q-input>
<q-input <q-input
filled filled
dense dense
dark standout dark
v-model="surname" standout
name="lastName" v-model="email"
:label="t('newsletter.surname') + `*`" :label="t('newsletter.email') + `*`"
:hint="t('newsletter.surnamehint')" lazy-rules
lazy-rules :rules="[(val) => (val && val.length > 6) || $t('newsletter.typesomething')]"
:rules="[ val => val && val.length > 0 || $t('newsletter.typesomething')]"> >
</q-input>
</q-input> <q-select
filled
dense
dark
standout
v-model="tipodest"
:options="optionsDest"
:label="$t('newsletter.tipodest') + `*`"
lazy-rules
emit-value
map-options
option-value="value"
option-label="label"
:rules="[(val) => (val && val.length > 0) || $t('newsletter.typesomething')]"
>
</q-select>
<q-input <router-link
filled to="/policy"
dense custom
dark standout v-slot="{ navigate }"
v-model="email" >
:label="t('newsletter.email') + `*`" <span
lazy-rules class="news_link"
:rules="[ val => val && val.length > 6 || $t('newsletter.typesomething')]"> @click="navigate"
@keypress.enter="navigate"
role="link"
>{{ $t('privacy_policy') }}</span
></router-link
>
</q-input> <q-toggle
dark
v-model="accept"
:label="$t('newsletter.acceptlicense')"
/>
<router-link to="/policy" custom v-slot="{ navigate }"> <div>
<span class="news_link" @click="navigate" @keypress.enter="navigate" role="link">{{$t('privacy_policy')}}</span></router-link> <q-btn
:label="$t('newsletter.submit')"
<q-toggle dark v-model="accept" :label="$t('newsletter.acceptlicense')"/> type="submit"
color="primary"
<div> />
<q-btn :label="$t('newsletter.submit')" type="submit" color="primary"/> <q-btn
<q-btn :label="$t('newsletter.reset')" type="reset" color="primary" flat class="q-ml-sm"/> :label="$t('newsletter.reset')"
</div> type="reset"
</q-form> color="primary"
flat
class="q-ml-sm"
/>
</div> </div>
</q-form>
</div> </div>
</div>
</template> </template>
<script lang="ts" src="./FormNewsletter.ts"> <script lang="ts" src="./FormNewsletter.ts"></script>
</script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import './FormNewsletter.scss'; @import './FormNewsletter.scss';
</style> </style>

View File

@@ -188,12 +188,15 @@
<div v-if="isConsiglio()" class="text-weight-bold text-user q-px-xs bg-deep-orange-10"> <div v-if="isConsiglio()" class="text-weight-bold text-user q-px-xs bg-deep-orange-10">
Consiglio Consiglio
</div> </div>
<div v-if="isManager()" class="text-weight-bold text-user bg-blue q-px-xs"> <div v-if="tools.isManager()" class="text-weight-bold text-user bg-blue q-px-xs">
Segreteria Segreteria
</div> </div>
<div v-if="isEditor()" class="text-weight-bold text-user bg-indigo q-px-xs"> <div v-if="tools.isEditor()" class="text-weight-bold text-user bg-indigo q-px-xs">
Editore Editore
</div> </div>
<div v-if="tools.isCommerciale()" class="text-weight-bold text-user bg-brown q-px-xs">
Commerciale
</div>
<div v-if="isFacilitatore()" class="text-weight-bold text-user q-px-xs"> <div v-if="isFacilitatore()" class="text-weight-bold text-user q-px-xs">
Facilitatore Facilitatore
</div> </div>

View File

@@ -93,6 +93,7 @@ export default defineComponent({
if (elem.onlyDepartment) menu += ' isDepartment' if (elem.onlyDepartment) menu += ' isDepartment'
if (elem.onlyFacilitatore) menu += ' isFacilitatore' if (elem.onlyFacilitatore) menu += ' isFacilitatore'
if (elem.onlyEditor) menu += ' isEditor' if (elem.onlyEditor) menu += ' isEditor'
if (elem.onlyCommerciale) menu += ' isCommerciale'
if (elem.onlyGrafico) menu += ' isGrafico' if (elem.onlyGrafico) menu += ' isGrafico'
} }

View File

@@ -40,6 +40,7 @@ export interface ICatalog {
date_updated?: Date, date_updated?: Date,
lista_prodotti?: IProduct[] lista_prodotti?: IProduct[]
isCatalogoGenerale?: boolean
} }
export interface ICatalogState { export interface ICatalogState {

View File

@@ -85,6 +85,12 @@ export interface ITemplEmail {
options?: ISettings[] options?: ISettings[]
} }
export interface IDestNewsletter {
_id?: string
descr?: string
tipodest_id?: number
}
export interface ISettings { export interface ISettings {
_id?: string _id?: string
idapp?: string idapp?: string
@@ -372,6 +378,7 @@ export interface INewsToSent {
label?: string label?: string
activate?: boolean activate?: boolean
templemail_str?: string templemail_str?: string
destnewsletter_str?: string
numemail_tot?: number numemail_tot?: number
numemail_sent?: number numemail_sent?: number
datetoSent?: Date datetoSent?: Date
@@ -495,6 +502,7 @@ export interface IGlobalState {
myelems: IMyElem[], myelems: IMyElem[],
myschedas: ISchedaSingola[], myschedas: ISchedaSingola[],
templemail: ITemplEmail[], templemail: ITemplEmail[],
destnewsletter?: IDestNewsletter[],
opzemail: ISettings[], opzemail: ISettings[],
mailinglist: IMailinglist[], mailinglist: IMailinglist[],
calzoom: ICalZoom[], calzoom: ICalZoom[],
@@ -589,6 +597,7 @@ export interface IListRoutes {
onlyFacilitatore?: boolean onlyFacilitatore?: boolean
color?: string color?: string
onlyEditor?: boolean onlyEditor?: boolean
onlyCommerciale?: boolean
onlyGrafico?: boolean onlyGrafico?: boolean
extraclass?: string extraclass?: string
meta?: any meta?: any

View File

@@ -291,6 +291,7 @@ export interface IUserState {
isTratuttrici?: boolean isTratuttrici?: boolean
isEditor?: boolean isEditor?: boolean
isGrafico?: boolean isGrafico?: boolean
isCommerciale?: boolean
isTeacher?: boolean isTeacher?: boolean
usersList?: IUserFields[] usersList?: IUserFields[]
countusers?: number countusers?: number

View File

@@ -7,7 +7,8 @@ import {
coltemplemail, coltemplemail,
colopzemail, colopzemail,
colmailinglist, colmailinglist,
colmsg_templates, fieldsTable colmsg_templates, fieldsTable,
coldestnewsletter
} from '@src/store/Modules/fieldsTable' } from '@src/store/Modules/fieldsTable'
import type { INewsState } from '@src/model/index'; import type { INewsState } from '@src/model/index';
import { DefaultNewsState } from '@src/model/index' import { DefaultNewsState } from '@src/model/index'
@@ -92,7 +93,8 @@ export default defineComponent({
label: 'Newsletter creata il ' + tools.getstrDateTimeAll(tools.getDateNow()), label: 'Newsletter creata il ' + tools.getstrDateTimeAll(tools.getDateNow()),
activate: true, activate: true,
datetoSent: tools.addMinutes(tools.getDateNow(), minuti), datetoSent: tools.addMinutes(tools.getDateNow(), minuti),
templemail_str: globalStore.gettemplemailbyId(getValDb('TEMPLEMAIL_ID', true)) templemail_str: globalStore.gettemplemailbyId(getValDb('TEMPLEMAIL_ID', true)),
destnewsletter_str: globalStore.getdestnewsletterbyId(getValDb('TEMPLEMAIL_DEST', true)),
} }
await tools.createNewRecord($q, 'newstosent', mynews).then((myrecris) => { await tools.createNewRecord($q, 'newstosent', mynews).then((myrecris) => {
// reload data // reload data
@@ -110,23 +112,25 @@ export default defineComponent({
console.log('Newsletter load') console.log('Newsletter load')
myloadingload.value = true myloadingload.value = true
const myris = await userStore.newsletterload(true) const myris = await userStore.newsletterload(true)
newsstate.value = myris.newsstate if (myris) {
newsstate.value = myris.newsstate
// console.log('newsstate') // console.log('newsstate')
// console.table('globalStore.serv_settings', globalStore.serv_settings) // console.table('globalStore.serv_settings', globalStore.serv_settings)
percsubscribed.value = newsstate.value.totsubscribed / newsstate.value.totemail percsubscribed.value = newsstate.value.totsubscribed / newsstate.value.totemail
if (newsstate.value.lastnewstosent) if (newsstate.value.lastnewstosent)
eseguipolling.value = (eseguipolling.value || newsstate.value.lastnewstosent.starting_job! && !newsstate.value.lastnewstosent.finish_job!) eseguipolling.value = (eseguipolling.value || newsstate.value.lastnewstosent.starting_job! && !newsstate.value.lastnewstosent.finish_job!)
if (newsstate.value.nextnewstosent) if (newsstate.value.nextnewstosent)
eseguipolling.value = eseguipolling.value || true eseguipolling.value = eseguipolling.value || true
// console.log('eseguipolling', eseguipolling) // console.log('eseguipolling', eseguipolling)
myloadingload.value = false myloadingload.value = false
checkifpolling() checkifpolling()
}
} }
function DisableNewsletter() { function DisableNewsletter() {
@@ -202,6 +206,10 @@ export default defineComponent({
return colnewstosent return colnewstosent
} }
function getcoldestnewsletter() {
return coldestnewsletter
}
function getcolmailinglist() { function getcolmailinglist() {
return colmailinglist return colmailinglist
} }
@@ -302,6 +310,7 @@ export default defineComponent({
fieldsTable, fieldsTable,
globalStore, globalStore,
idparam, idparam,
getcoldestnewsletter,
} }
} }
}) })

View File

@@ -1,61 +1,163 @@
<template> <template>
<CMyPage title="Newsletter" keywords="" description="" imgbackground="/images/calendario_eventi.jpg" <CMyPage
sizes="max-height: 120px"> title="Newsletter"
<q-toggle v-model="globalStore.editOn" color="green" icon="fas fa-pencil-alt" dense> keywords=""
description=""
imgbackground="/images/calendario_eventi.jpg"
sizes="max-height: 120px"
>
<q-toggle
v-model="globalStore.editOn"
color="green"
icon="fas fa-pencil-alt"
dense
>
</q-toggle> </q-toggle>
<q-card> <q-card>
<div v-show="false"> <div v-show="false">
<q-tabs v-model="tab" dense class="text-grey" active-color="primary" indicator-color="primary" align="justify" <q-tabs
narrow-indicator> v-model="tab"
<q-tab name="settings" label="Impostazioni"></q-tab> dense
<q-tab name="main_settings" label="Impostaz. Primarie"></q-tab> class="text-grey"
<q-tab name="templemail" label="Template Email"></q-tab> active-color="primary"
<q-tab name="newnewsletter" label="Invia"></q-tab> indicator-color="primary"
<q-tab name="check" label="Controlla"></q-tab> align="justify"
<q-tab name="newslist" label="Già Inviate"></q-tab> narrow-indicator
<q-tab name="mailinglist" label="Lista Contatti (MailingList)"></q-tab> >
<q-tab name="events" label="Altre"></q-tab> <q-tab
name="settings"
label="Impostazioni"
></q-tab>
<q-tab
name="main_settings"
label="Impostaz. Primarie"
></q-tab>
<q-tab
name="templemail"
label="Template Email"
></q-tab>
<q-tab
name="destnewsletter"
label="Destinatari"
></q-tab>
<q-tab
name="newnewsletter"
label="Invia"
></q-tab>
<q-tab
name="check"
label="Controlla"
></q-tab>
<q-tab
name="newslist"
label="Già Inviate"
></q-tab>
<q-tab
name="mailinglist"
label="Lista Contatti (MailingList)"
></q-tab>
<q-tab
name="events"
label="Altre"
></q-tab>
</q-tabs> </q-tabs>
</div> </div>
<q-tab-panels v-model="tab" animated @transition="changetabnews"> <q-tab-panels
v-model="tab"
animated
@transition="changetabnews"
>
<q-tab-panel name="settings"> <q-tab-panel name="settings">
<div class="q-ma-xs q-pa-xs text-center rounded-borders q-list--bordered"> <div class="q-ma-xs q-pa-xs text-center rounded-borders q-list--bordered">
<CTitleBanner title="Impostazioni:"></CTitleBanner> <CTitleBanner title="Impostazioni:"></CTitleBanner>
<div class="row"> <div class="row">
<CMyFieldDb title="Altezza Logo" mykey="HEIGHT_LOGO" :serv="true" :type="costanti.FieldType.number"> <CMyFieldDb
title="Altezza Logo"
mykey="HEIGHT_LOGO"
:serv="true"
:type="costanti.FieldType.number"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Titolo Discipline" mykey="DISC_TITLE" :serv="true" :type="costanti.FieldType.string"> <CMyFieldDb
title="Titolo Discipline"
mykey="DISC_TITLE"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
</div> </div>
<CMyFieldDb title="Testo Promozione" mykey="TEXT_PROMO" :serv="true" :type="costanti.FieldType.html"> <CMyFieldDb
title="Testo Promozione"
mykey="TEXT_PROMO"
:serv="true"
:type="costanti.FieldType.html"
>
</CMyFieldDb> </CMyFieldDb>
<div class="row"> <div class="row">
<CMyFieldDb title="Numero di Eventi da mostrare" mykey="SHOW_LAST_N_EV" :serv="true" <CMyFieldDb
:type="costanti.FieldType.number"> title="Numero di Eventi da mostrare"
mykey="SHOW_LAST_N_EV"
:serv="true"
:type="costanti.FieldType.number"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Testo dopo gli Eventi" mykey="TEXT_AFTER_EV" :serv="true" <CMyFieldDb
:type="costanti.FieldType.html"> title="Testo dopo gli Eventi"
mykey="TEXT_AFTER_EV"
:serv="true"
:type="costanti.FieldType.html"
>
</CMyFieldDb> </CMyFieldDb>
</div> </div>
<div class="row"> <div class="row">
<CMyFieldDb title="Pagina Twitter" mykey="URL_TWITTER" :type="costanti.FieldType.string"> <CMyFieldDb
title="Pagina Twitter"
mykey="URL_TWITTER"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Pagina Facebook" mykey="URL_FACEBOOK" :type="costanti.FieldType.string"> <CMyFieldDb
title="Pagina Facebook"
mykey="URL_FACEBOOK"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Pagina YouTube" mykey="URL_YOUTUBE" :type="costanti.FieldType.string"> <CMyFieldDb
title="Pagina YouTube"
mykey="URL_YOUTUBE"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Pagina Instagram" mykey="URL_INSTAGRAM" :type="costanti.FieldType.string"> <CMyFieldDb
title="Pagina Instagram"
mykey="URL_INSTAGRAM"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
</div> </div>
<CMyFieldDb title="Firma" mykey="TEXT_SIGN" :serv="true" :type="costanti.FieldType.html"> <CMyFieldDb
title="Firma"
mykey="TEXT_SIGN"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Testo Disclaimer" mykey="TEXT_DISCLAIMER" :serv="true" :type="costanti.FieldType.html"> <CMyFieldDb
title="Testo Disclaimer"
mykey="TEXT_DISCLAIMER"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Testo a piè pagina" mykey="TEXT_DISC_BOTTOM" :serv="true" <CMyFieldDb
:type="costanti.FieldType.html"> title="Testo a piè pagina"
mykey="TEXT_DISC_BOTTOM"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
</div> </div>
</q-tab-panel> </q-tab-panel>
@@ -63,44 +165,100 @@
<div class="q-ma-xs q-pa-xs text-center rounded-borders q-list--bordered"> <div class="q-ma-xs q-pa-xs text-center rounded-borders q-list--bordered">
<CTitleBanner title="Impostazioni Server:"></CTitleBanner> <CTitleBanner title="Impostazioni Server:"></CTitleBanner>
<CMyFieldDb title="Email da cui Inviare la Newsletter" mykey="EMAIL_FROM" :serv="true" <CMyFieldDb
:type="costanti.FieldType.string"> title="Email da cui Inviare la Newsletter"
mykey="EMAIL_FROM"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Email di Reply" mykey="EMAIL_REPLY" :serv="true" :type="costanti.FieldType.string"> <CMyFieldDb
title="Email di Reply"
mykey="EMAIL_REPLY"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Password email" mykey="PWD_FROM" :serv="true" :type="costanti.FieldType.password"> <CMyFieldDb
title="Password email"
mykey="PWD_FROM"
:serv="true"
:type="costanti.FieldType.password"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Servizio SMTP Email ('gmail' per inviare email da Gmail)" mykey="EMAIL_SERVICE_SEND" <CMyFieldDb
:serv="true" :type="costanti.FieldType.string"> title="Servizio SMTP Email ('gmail' per inviare email da Gmail)"
mykey="EMAIL_SERVICE_SEND"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Porta SMTP" mykey="EMAIL_PORT" :serv="true" :type="costanti.FieldType.number"> <CMyFieldDb
title="Porta SMTP"
mykey="EMAIL_PORT"
:serv="true"
:type="costanti.FieldType.number"
>
</CMyFieldDb> </CMyFieldDb>
<CMyFieldDb title="Millisecondi di pausa tra una email e l'altra" mykey="MSEC_PAUSE_SEND" :serv="true" <CMyFieldDb
:type="costanti.FieldType.number"> title="Millisecondi di pausa tra una email e l'altra"
mykey="MSEC_PAUSE_SEND"
:serv="true"
:type="costanti.FieldType.number"
>
</CMyFieldDb> </CMyFieldDb>
</div> </div>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="events"> <q-tab-panel name="events">
<CTitleBanner title="Altre Impostazioni:"></CTitleBanner> <CTitleBanner title="Altre Impostazioni:"></CTitleBanner>
<CMyFieldDb title="Messaggio dopo che l'utente ha Prenotato un Evento" mykey="MSG_REPLY_AFTER_BOOKING" <CMyFieldDb
:serv="true" :type="costanti.FieldType.string"> title="Messaggio dopo che l'utente ha Prenotato un Evento"
mykey="MSG_REPLY_AFTER_BOOKING"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="templemail"> <q-tab-panel name="templemail">
<CTitleBanner title="Modelli Email:"></CTitleBanner> <CTitleBanner title="Modelli Email:"></CTitleBanner>
<CGridTableRec prop_mytitle="" prop_mytable="templemail" :prop_mycolumns="getcoltemplemail()" <CGridTableRec
prop_mytitle=""
prop_mytable="templemail"
:prop_mycolumns="getcoltemplemail()"
:prop_colkey="fieldsTable.getKeyByTable('templemail')" :prop_colkey="fieldsTable.getKeyByTable('templemail')"
nodataLabel="Nessuna Email Template attualmente creata" nodataLabel="Nessuna Email Template attualmente creata"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"> noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
>
</CGridTableRec> </CGridTableRec>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="destnewsletter">
<CTitleBanner title="Destinatari:"></CTitleBanner>
<CGridTableRec
prop_mytitle=""
prop_mytable="destnewsletter"
:prop_mycolumns="getcoldestnewsletter()"
:prop_colkey="fieldsTable.getKeyByTable('destnewsletter')"
nodataLabel="Nessun Destinatario attualmente creato"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
>
</CGridTableRec>
</q-tab-panel>
<q-tab-panel name="newnewsletter"> <q-tab-panel name="newnewsletter">
<div class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered"> <div class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered">
<CTitleBanner title="Test Invio Newsletter:"></CTitleBanner> <CTitleBanner title="Test Invio Newsletter:"></CTitleBanner>
<div class="q-pa-xs q-ma-md q-gutter-md"> <div class="q-pa-xs q-ma-md q-gutter-md">
<q-btn v-if="tools.isDebug()" :loading="myloadingprew" rounded outline @click="sendNewsletterTest(true)" <q-btn
color="primary" icon="fas fa-desktop"> v-if="tools.isDebug()"
:loading="myloadingprew"
rounded
outline
@click="sendNewsletterTest(true)"
color="primary"
icon="fas fa-desktop"
>
<span class="q-px-sm">Anteprima</span> <span class="q-px-sm">Anteprima</span>
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
@@ -108,10 +266,21 @@
</template> </template>
</q-btn> </q-btn>
<div class="text-center"> <div class="text-center">
<CMyFieldDb title="Email di Test" mykey="EMAIL_TEST" :serv="true" :type="costanti.FieldType.string"> <CMyFieldDb
title="Email di Test"
mykey="EMAIL_TEST"
:serv="true"
:type="costanti.FieldType.string"
>
</CMyFieldDb> </CMyFieldDb>
<q-btn :loading="myloading" rounded outline @click="sendNewsletterTest(false)" color="primary" <q-btn
icon="email"> :loading="myloading"
rounded
outline
@click="sendNewsletterTest(false)"
color="primary"
icon="email"
>
<span class="q-px-sm">Invia Email di Test</span> <span class="q-px-sm">Invia Email di Test</span>
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
@@ -124,12 +293,32 @@
<CTitleBanner title="Invia Newsletter:"></CTitleBanner> <CTitleBanner title="Invia Newsletter:"></CTitleBanner>
<div class="q-pa-xs q-ma-md q-gutter-md"> <div class="q-pa-xs q-ma-md q-gutter-md">
<CMyFieldDb title="Template Email da Inviare" mykey="TEMPLEMAIL_ID" :serv="true" <CMyFieldDb
:type="costanti.FieldType.select" jointable="templemail"> title="Template Email da Inviare"
mykey="TEMPLEMAIL_ID"
:serv="true"
:type="costanti.FieldType.select"
jointable="templemail"
>
</CMyFieldDb> </CMyFieldDb>
<q-btn :loading="myloading2" rounded outline @click="createNewsletter(3, myloading2)" color="primary" <CMyFieldDb
icon="fas fa-file-alt"> title="Lista Destinatari"
mykey="TEMPLEMAIL_DEST"
:serv="true"
:type="costanti.FieldType.select"
jointable="destnewsletter"
>
</CMyFieldDb>
<q-btn
:loading="myloading2"
rounded
outline
@click="createNewsletter(3, myloading2)"
color="primary"
icon="fas fa-file-alt"
>
<span class="q-px-sm">Crea Nuovo Invio Newsletter Schedulato tra 3 minuti</span> <span class="q-px-sm">Crea Nuovo Invio Newsletter Schedulato tra 3 minuti</span>
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
@@ -137,8 +326,14 @@
</template> </template>
</q-btn> </q-btn>
<br /> <br />
<q-btn :loading="myloading3" rounded outline @click="createNewsletter(10, myloading3)" color="primary" <q-btn
icon="fas fa-clock"> :loading="myloading3"
rounded
outline
@click="createNewsletter(10, myloading3)"
color="primary"
icon="fas fa-clock"
>
<span class="q-px-sm">Crea Nuovo Invio Newsletter Schedulato tra 10 minuti</span> <span class="q-px-sm">Crea Nuovo Invio Newsletter Schedulato tra 10 minuti</span>
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
@@ -146,8 +341,14 @@
</template> </template>
</q-btn> </q-btn>
<br /> <br />
<q-btn :loading="myloading4" rounded outline @click="createNewsletter(60 * 60 * 24, myloading4)" <q-btn
color="primary" icon="fas fa-calendar-day"> :loading="myloading4"
rounded
outline
@click="createNewsletter(60 * 60 * 24, myloading4)"
color="primary"
icon="fas fa-calendar-day"
>
<span class="q-px-sm">Crea Nuovo Invio Newsletter Schedulato tra 1 giorno</span> <span class="q-px-sm">Crea Nuovo Invio Newsletter Schedulato tra 1 giorno</span>
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
@@ -161,85 +362,151 @@
<CTitleBanner title="Prossima Newsletter da Inviare:"></CTitleBanner> <CTitleBanner title="Prossima Newsletter da Inviare:"></CTitleBanner>
</div> </div>
<div v-if="newsstate.nextnewstosent" class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered"> <div
v-if="newsstate.nextnewstosent"
class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered"
>
<q-card class="bg-grey-3 relative-position card-example"> <q-card class="bg-grey-3 relative-position card-example">
<q-card-section> <q-card-section>
<q-chip dense class="shadow-5 q-mb-md" color="orange" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="orange"
text-color="white"
icon="schedule"
>
Modello Email da Inviare: Modello Email da Inviare:
<span class="mlvalue">{{ <span class="mlvalue">{{ newsstate.nextnewstosent.templemail_str }}</span>
newsstate.nextnewstosent.templemail_str
}}</span>
</q-chip> </q-chip>
<br /> <br />
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="orange"
text-color="white"
icon="schedule"
>
Destinatari:
<span class="mlvalue">{{ newsstate.nextnewstosent.destnewsletter_str }}</span>
</q-chip>
<br />
<q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Data Schedulato: Data Schedulato:
<span class="mlvalue">{{ <span class="mlvalue">{{ tools.getstrDateTimeAll(newsstate.nextnewstosent.datetoSent) }}</span>
tools.getstrDateTimeAll(
newsstate.nextnewstosent.datetoSent
)
}}</span>
</q-chip> </q-chip>
<br /> <br />
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Inizio Invio: Inizio Invio:
<span class="mlvalue">{{ <span class="mlvalue">{{ tools.getstrDateTimeAll(newsstate.nextnewstosent.datestartJob) }}</span>
tools.getstrDateTimeAll(
newsstate.nextnewstosent.datestartJob
)
}}</span>
</q-chip> </q-chip>
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Fine Invio: Fine Invio:
<span class="mlvalue">{{ <span class="mlvalue">{{ tools.getstrDateTimeAll(newsstate.nextnewstosent.datefinishJob) }}</span>
tools.getstrDateTimeAll(
newsstate.nextnewstosent.datefinishJob
)
}}</span>
</q-chip> </q-chip>
<br /> <br />
<div v-if=" <div v-if="newsstate.nextnewstosent.starting_job && !newsstate.nextnewstosent.finish_job">
newsstate.nextnewstosent.starting_job && <q-chip
!newsstate.nextnewstosent.finish_job dense
"> class="shadow-5 q-mb-md"
<q-chip dense class="shadow-5 q-mb-md" color="orange" text-color="white" icon="email"> color="orange"
text-color="white"
icon="email"
>
<span class="mlvalue">Invio Newsletter in Corso...</span> <span class="mlvalue">Invio Newsletter in Corso...</span>
</q-chip> </q-chip>
<br /> <br />
</div> </div>
<div> <div>
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Ultima Email inviata: Ultima Email inviata:
<span class="mlvalue">{{ <span class="mlvalue">{{
tools.getstrTimeAll( tools.getstrTimeAll(newsstate.nextnewstosent.lastemailsent_Job)
newsstate.nextnewstosent.lastemailsent_Job
)
}}</span> }}</span>
</q-chip> </q-chip>
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="email"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="email"
>
Inviate: Inviate:
<span class="mlvalue">{{ newsstate.nextnewstosent.numemail_sent }} / <span class="mlvalue"
{{ newsstate.nextnewstosent.numemail_tot }}</span> >{{ newsstate.nextnewstosent.numemail_sent }} /
{{ newsstate.nextnewstosent.numemail_tot }}</span
>
</q-chip> </q-chip>
<q-circular-progress show-value font-size="12px" :value="percsent(true)" size="60px" <q-circular-progress
:thickness="0.22" color="green" track-color="grey-3" class="q-ma-md"> show-value
font-size="12px"
:value="percsent(true)"
size="60px"
:thickness="0.22"
color="green"
track-color="grey-3"
class="q-ma-md"
>
<span class="mlvalue"> {{ percsent(true) }} % </span> <span class="mlvalue"> {{ percsent(true) }} % </span>
</q-circular-progress> </q-circular-progress>
<div class="text-center"> <div class="text-center">
<q-slider v-model="newsstate.nextnewstosent.numemail_sent" :min="0" readonly <q-slider
:max="newsstate.nextnewstosent.numemail_tot" :step="1" label label-always v-model="newsstate.nextnewstosent.numemail_sent"
color="light-green"></q-slider> :min="0"
readonly
:max="newsstate.nextnewstosent.numemail_tot"
:step="1"
label
label-always
color="light-green"
></q-slider>
</div> </div>
</div> </div>
<div v-if="newsstate.nextnewstosent.finish_job"> <div v-if="newsstate.nextnewstosent.finish_job">
<br /> <br />
<q-chip dense class="shadow-5 q-mb-md" color="green" text-color="white" icon="email"> <q-chip
dense
class="shadow-5 q-mb-md"
color="green"
text-color="white"
icon="email"
>
<span class="mlvalue">Invio Newsletter Completato</span> <span class="mlvalue">Invio Newsletter Completato</span>
</q-chip> </q-chip>
</div> </div>
</q-card-section> </q-card-section>
<q-inner-loading id="spinner3" :showing="myloadingload"> <q-inner-loading
<q-spinner-tail color="primary" size="4em"> id="spinner3"
:showing="myloadingload"
>
<q-spinner-tail
color="primary"
size="4em"
>
</q-spinner-tail> </q-spinner-tail>
</q-inner-loading> </q-inner-loading>
</q-card> </q-card>
@@ -256,104 +523,175 @@
<CTitleBanner title="Ultima Newsletter Inviata:"></CTitleBanner> <CTitleBanner title="Ultima Newsletter Inviata:"></CTitleBanner>
</div> </div>
<div v-if="newsstate.lastnewstosent" class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered"> <div
v-if="newsstate.lastnewstosent"
class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered"
>
<q-card class="bg-grey-3 relative-position card-example"> <q-card class="bg-grey-3 relative-position card-example">
<q-card-section> <q-card-section>
<q-chip dense class="shadow-5 q-mb-md" color="orange" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="orange"
text-color="white"
icon="schedule"
>
Modello Email: Modello Email:
<span class="mlvalue">{{ <span class="mlvalue">{{ newsstate.lastnewstosent.templemail_str }}</span>
newsstate.lastnewstosent.templemail_str
}}</span>
</q-chip> </q-chip>
<div class="text-center"></div> <div class="text-center"></div>
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Data Schedulato: Data Schedulato:
<span class="mlvalue">{{ <span class="mlvalue">{{ tools.getstrDateTimeAll(newsstate.lastnewstosent.datetoSent) }}</span>
tools.getstrDateTimeAll(
newsstate.lastnewstosent.datetoSent
)
}}</span>
</q-chip> </q-chip>
<br /> <br />
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Inizio Invio: Inizio Invio:
<span class="mlvalue">{{ <span class="mlvalue">{{ tools.getstrDateTimeAll(newsstate.lastnewstosent.datestartJob) }}</span>
tools.getstrDateTimeAll(
newsstate.lastnewstosent.datestartJob
)
}}</span>
</q-chip> </q-chip>
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Fine Invio: Fine Invio:
<span class="mlvalue">{{ <span class="mlvalue">{{ tools.getstrDateTimeAll(newsstate.lastnewstosent.datefinishJob) }}</span>
tools.getstrDateTimeAll(
newsstate.lastnewstosent.datefinishJob
)
}}</span>
</q-chip> </q-chip>
<br /> <br />
<div v-if=" <div
newsstate.lastnewstosent.activate && v-if="
newsstate.lastnewstosent.starting_job && newsstate.lastnewstosent.activate &&
!newsstate.lastnewstosent.finish_job newsstate.lastnewstosent.starting_job &&
"> !newsstate.lastnewstosent.finish_job
<q-chip dense class="shadow-5 q-mb-md" color="orange" text-color="white" icon="email"> "
>
<q-chip
dense
class="shadow-5 q-mb-md"
color="orange"
text-color="white"
icon="email"
>
<span class="mlvalue">Invio Newsletter in Corso...</span> <span class="mlvalue">Invio Newsletter in Corso...</span>
</q-chip> </q-chip>
<br /> <br />
</div> </div>
<div v-if="!newsstate.lastnewstosent.activate"> <div v-if="!newsstate.lastnewstosent.activate">
<q-chip dense class="shadow-5 q-mb-md" color="red" text-color="white" icon="email"> <q-chip
<span class="mlvalue">L'invio della Newsletter è stato fermato dense
dall'Utente.</span> class="shadow-5 q-mb-md"
color="red"
text-color="white"
icon="email"
>
<span class="mlvalue">L'invio della Newsletter è stato fermato dall'Utente.</span>
</q-chip> </q-chip>
<br /> <br />
</div> </div>
<div> <div>
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="schedule"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="schedule"
>
Ultima Email inviata: Ultima Email inviata:
<span class="mlvalue">{{ <span class="mlvalue">{{ tools.getstrTimeAll(newsstate.lastnewstosent.lastemailsent_Job) }}</span>
tools.getstrTimeAll(
newsstate.lastnewstosent.lastemailsent_Job
)
}}</span>
</q-chip> </q-chip>
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="email"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="email"
>
Inviate: Inviate:
<span class="mlvalue">{{ newsstate.lastnewstosent.numemail_sent }} / <span class="mlvalue"
{{ newsstate.lastnewstosent.numemail_tot }}</span> >{{ newsstate.lastnewstosent.numemail_sent }} /
{{ newsstate.lastnewstosent.numemail_tot }}</span
>
</q-chip> </q-chip>
<q-circular-progress show-value font-size="12px" :value="percsent(false)" size="60px" <q-circular-progress
:thickness="0.5" color="green" track-color="grey-3" class="q-ma-md"> show-value
font-size="12px"
:value="percsent(false)"
size="60px"
:thickness="0.5"
color="green"
track-color="grey-3"
class="q-ma-md"
>
<span class="mlvalue"> {{ percsent(false) }} % </span> <span class="mlvalue"> {{ percsent(false) }} % </span>
</q-circular-progress> </q-circular-progress>
<div class="text-center"> <div class="text-center">
<q-slider v-model="newsstate.lastnewstosent.numemail_sent" :min="0" readonly <q-slider
:max="newsstate.lastnewstosent.numemail_tot" :step="1" label label-always v-model="newsstate.lastnewstosent.numemail_sent"
color="light-green"></q-slider> :min="0"
readonly
:max="newsstate.lastnewstosent.numemail_tot"
:step="1"
label
label-always
color="light-green"
></q-slider>
</div> </div>
</div> </div>
<div v-if="newsstate.lastnewstosent.finish_job"> <div v-if="newsstate.lastnewstosent.finish_job">
<br /> <br />
<q-chip dense class="shadow-5 q-mb-md" color="green" text-color="white" icon="email"> <q-chip
dense
class="shadow-5 q-mb-md"
color="green"
text-color="white"
icon="email"
>
<span class="mlvalue">Invio Newsletter Completato</span> <span class="mlvalue">Invio Newsletter Completato</span>
</q-chip> </q-chip>
</div> </div>
<div v-if="!newsstate.lastnewstosent.finish_job"> <div v-if="!newsstate.lastnewstosent.finish_job">
<q-btn v-if="newsstate.lastnewstosent.activate" :loading="myloadingState" rounded outline <q-btn
@click="DisableNewsletter()" color="negative" icon=""> v-if="newsstate.lastnewstosent.activate"
:loading="myloadingState"
rounded
outline
@click="DisableNewsletter()"
color="negative"
icon=""
>
Ferma l'Invio della Newsletter Ferma l'Invio della Newsletter
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
Disattivazione Invio Newsletter ... Disattivazione Invio Newsletter ...
</template> </template>
</q-btn> </q-btn>
<q-btn v-if="!newsstate.lastnewstosent.activate" :loading="myloadingState" rounded outline <q-btn
@click="EnableNewsletter()" color="positive" icon=""> v-if="!newsstate.lastnewstosent.activate"
:loading="myloadingState"
rounded
outline
@click="EnableNewsletter()"
color="positive"
icon=""
>
Riattiva l'Invio della Newsletter Riattiva l'Invio della Newsletter
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
@@ -362,8 +700,15 @@
</q-btn> </q-btn>
</div> </div>
</q-card-section> </q-card-section>
<q-inner-loading id="spinner2" :showing="myloading"> <q-inner-loading
<q-spinner-tail color="primary" size="4em"> </q-spinner-tail> id="spinner2"
:showing="myloading"
>
<q-spinner-tail
color="primary"
size="4em"
>
</q-spinner-tail>
</q-inner-loading> </q-inner-loading>
</q-card> </q-card>
</div> </div>
@@ -371,51 +716,106 @@
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="newslist"> <q-tab-panel name="newslist">
<CTitleBanner bgcolor="bg-accent" title="Lista Newsletter Inviate:"></CTitleBanner> <CTitleBanner
bgcolor="bg-accent"
title="Lista Newsletter Inviate:"
></CTitleBanner>
<CGridTableRec prop_mytitle="Newsletter" prop_mytable="newstosent" :prop_mycolumns="getcolnewstosent()" <CGridTableRec
:prop_colkey="fieldsTable.getKeyByTable('newstosent')" nodataLabel="Nessuna Newsletter attualmente creata" prop_mytitle="Newsletter"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"> prop_mytable="newstosent"
:prop_mycolumns="getcolnewstosent()"
:prop_colkey="fieldsTable.getKeyByTable('newstosent')"
nodataLabel="Nessuna Newsletter attualmente creata"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
>
</CGridTableRec> </CGridTableRec>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="mailinglist"> <q-tab-panel name="mailinglist">
<div class="q-ma-md rounded-borders q-list--bordered"> <div class="q-ma-md rounded-borders q-list--bordered">
<CTitleBanner title="Lista Contatti:" bgcolor="bg-positive"></CTitleBanner> <CTitleBanner
title="Lista Contatti:"
bgcolor="bg-positive"
></CTitleBanner>
<div class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered"> <div class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered">
<q-chip dense class="shadow-5 q-mb-md" color="blue" text-color="white" icon="email"> <q-chip
dense
class="shadow-5 q-mb-md"
color="blue"
text-color="white"
icon="email"
>
Email Totali: Email Totali:
<span class="mlvalue">{{ newsstate.totemail }}</span> <span class="mlvalue">{{ newsstate.totemail }}</span>
</q-chip> </q-chip>
<q-chip dense class="shadow-5 q-mb-md" color="green" text-color="white" icon="event_available"> <q-chip
dense
class="shadow-5 q-mb-md"
color="green"
text-color="white"
icon="event_available"
>
Email Sottoscritte: Email Sottoscritte:
<span class="mlvalue">{{ newsstate.totsubscribed }}</span> <span class="mlvalue">{{ newsstate.totsubscribed }}</span>
</q-chip> </q-chip>
<q-circular-progress show-value font-size="12px" :value="percsubscribed * 100" size="60px" <q-circular-progress
:thickness="0.22" color="green" track-color="grey-3" class="q-ma-md"> show-value
font-size="12px"
:value="percsubscribed * 100"
size="60px"
:thickness="0.22"
color="green"
track-color="grey-3"
class="q-ma-md"
>
<span class="mlvalue"> {{ progresslabsubscribed() }} </span> <span class="mlvalue"> {{ progresslabsubscribed() }} </span>
</q-circular-progress> </q-circular-progress>
<q-chip dense class="shadow-5 q-mb-md" color="orange" text-color="white" icon=""> <q-chip
dense
class="shadow-5 q-mb-md"
color="orange"
text-color="white"
icon=""
>
Email Desottoscritte: Email Desottoscritte:
<span class="mlvalue">{{ newsstate.totunsubscribed }}</span> <span class="mlvalue">{{ newsstate.totunsubscribed }}</span>
</q-chip> </q-chip>
</div> </div>
<CGridTableRec prop_mytitle="Lista Contatti" :prop_mytable="toolsext.TABMAILINGLIST" <CGridTableRec
:prop_mycolumns="getcolmailinglist()" :prop_colkey="fieldsTable.getKeyByTable('mailinglist')" prop_mytitle="Lista Contatti"
:prop_mytable="toolsext.TABMAILINGLIST"
:prop_mycolumns="getcolmailinglist()"
:prop_colkey="fieldsTable.getKeyByTable('mailinglist')"
nodataLabel="Nessuna Lista Contatti attualmente creata" nodataLabel="Nessuna Lista Contatti attualmente creata"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato"> noresultLabel="Il filtro selezionato non ha trovato nessun risultato"
>
</CGridTableRec> </CGridTableRec>
<CTitleBanner title="Importa lista di Email:"></CTitleBanner> <CTitleBanner title="Importa lista di Email:"></CTitleBanner>
<div class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered"> <div class="q-ma-md q-pa-sm text-center rounded-borders q-list--bordered">
<q-input v-model="mailinglist_imported" autofocus filled bordered color="blue-12" @keyup.enter.stop <q-input
type="textarea"> v-model="mailinglist_imported"
autofocus
filled
bordered
color="blue-12"
@keyup.enter.stop
type="textarea"
>
</q-input> </q-input>
<div class="q-ma-md q-pa-sm text-center"> <div class="q-ma-md q-pa-sm text-center">
<q-btn :loading="myloadingImport" rounded outline :disable="mailinglist_imported === ''" <q-btn
@click="importMailinglist()" color="primary" icon="email"> :loading="myloadingImport"
rounded
outline
:disable="mailinglist_imported === ''"
@click="importMailinglist()"
color="primary"
icon="email"
>
Importa Importa
<template v-slot:loading> <template v-slot:loading>
<q-spinner-hourglass class="on-left" /> <q-spinner-hourglass class="on-left" />
@@ -424,10 +824,21 @@
</q-btn> </q-btn>
</div> </div>
<transition enter-active-class="animated fadeIn" leave-active-class="animated fadeOut" appear> <transition
enter-active-class="animated fadeIn"
leave-active-class="animated fadeOut"
appear
>
<div> <div>
<CTitleBanner v-if="errimport" bgcolor="bg-warning" :title="myrisimport"></CTitleBanner> <CTitleBanner
<CTitleBanner v-if="okimport" :title="myrisimport"></CTitleBanner> v-if="errimport"
bgcolor="bg-warning"
:title="myrisimport"
></CTitleBanner>
<CTitleBanner
v-if="okimport"
:title="myrisimport"
></CTitleBanner>
</div> </div>
</transition> </transition>
</div> </div>
@@ -437,8 +848,7 @@
</q-card> </q-card>
</CMyPage> </CMyPage>
</template> </template>
<script lang="ts" src="./newsletter.ts"> <script lang="ts" src="./newsletter.ts"></script>
</script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import './newsletter.scss'; @import './newsletter.scss';
</style> </style>

View File

@@ -107,6 +107,13 @@ function getRoutesAd(site: ISites) {
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'), component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true, noroute: true inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true, noroute: true
}, },
{
active: true,
order: 10,
name: 'newsletter.destnewsletter', path: '/admin/newsletter/destnewsletter', materialIcon: 'fas fa-users',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
inmenu: true, submenu: true, level_parent: 0.5, level_child: 0.5, onlyManager: true, noroute: true
},
{ {
active: true, active: true,
order: 20, order: 20,

View File

@@ -105,7 +105,7 @@ const msg_it = {
origine: 'Origine', origine: 'Origine',
ingredienti: 'Ingredienti', ingredienti: 'Ingredienti',
descrizione_breve_macro: 'Descrizione Breve Macro', descrizione_breve_macro: 'Descrizione Breve Macro',
descr_trafiletto_catalogo: 'Trafiletto per Cataloghi', descr_trafiletto_catalogo: 'Sinossi per Cataloghi',
descrizione_completa_macro: 'Descrizione Estesa', descrizione_completa_macro: 'Descrizione Estesa',
valori_nutrizionali: 'Valori Nutrizionali', valori_nutrizionali: 'Valori Nutrizionali',
note: 'Note', note: 'Note',
@@ -435,6 +435,10 @@ const msg_it = {
img2: 'Immagine 2', img2: 'Immagine 2',
content2: 'Contenuto 2', content2: 'Contenuto 2',
options: 'Opzioni', options: 'Opzioni',
disclaimer: 'Disclaimer',
piedipagina: 'piedipagina',
firma: 'firma',
}, },
dashboard: { dashboard: {
info: 'Info', info: 'Info',
@@ -465,6 +469,7 @@ const msg_it = {
nave_partita: 'Partita il', nave_partita: 'Partita il',
facilitatore: 'Facilitatore', facilitatore: 'Facilitatore',
Editor: 'Editor', Editor: 'Editor',
Commerciale: 'Commerciale',
zoomeri: 'Zoomeri', zoomeri: 'Zoomeri',
grafico: 'Grafico', grafico: 'Grafico',
/* sonomediatore: 'Quando diventi Meditore vieni contattato da un <strong>FACILITATORE</strong>, con lui devi:<br><ol class="lista">' + /* sonomediatore: 'Quando diventi Meditore vieni contattato da un <strong>FACILITATORE</strong>, con lui devi:<br><ol class="lista">' +
@@ -1117,6 +1122,7 @@ const msg_it = {
serversettings: 'Server', serversettings: 'Server',
others: 'Altro', others: 'Altro',
templemail: 'Modello Email', templemail: 'Modello Email',
destnewsletter: 'Destinatari',
datetoSent: 'DataOra Invio', datetoSent: 'DataOra Invio',
activate: 'Attivato', activate: 'Attivato',
numemail_tot: 'Email Totali', numemail_tot: 'Email Totali',
@@ -2084,6 +2090,11 @@ const msg_it = {
TO_RESOLV: 'Da Risolvere!', TO_RESOLV: 'Da Risolvere!',
}, },
destnewsletter: {
descr: 'Descrizione',
tipodest_id: 'Tipo Destinatario',
}
}, },
}; };

View File

@@ -118,6 +118,7 @@ export const colmailinglist = [
AddCol({ name: 'surname', label_trans: 'reg.surname' }), AddCol({ name: 'surname', label_trans: 'reg.surname' }),
AddCol({ name: 'email', label_trans: 'reg.email' }), AddCol({ name: 'email', label_trans: 'reg.email' }),
AddCol({ name: 'news_on', label_trans: 'newsletter.news_on', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'news_on', label_trans: 'newsletter.news_on', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'diario_on', label_trans: 'newsletter.diario_on', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'email_errata', label_trans: 'newsletter.email_errata', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'email_errata', label_trans: 'newsletter.email_errata', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'lastid_newstosent', label_trans: 'reg.lastid_newstosent', fieldtype: costanti.FieldType.string }), AddCol({ name: 'lastid_newstosent', label_trans: 'reg.lastid_newstosent', fieldtype: costanti.FieldType.string }),
AddCol(DeleteRec), AddCol(DeleteRec),
@@ -151,29 +152,34 @@ export const colTableCatalogList = [
label_trans: 'cataloglist.argomenti', label_trans: 'cataloglist.argomenti',
fieldtype: costanti.FieldType.multiselect, fieldtype: costanti.FieldType.multiselect,
jointable: 'catprtotali', jointable: 'catprtotali',
isadvanced_field: true,
}), }),
AddCol({ AddCol({
name: 'condition_andor', name: 'condition_andor',
label_trans: 'cataloglist.op_andor', label_trans: 'cataloglist.op_andor',
fieldtype: costanti.FieldType.op_andor, fieldtype: costanti.FieldType.op_andor,
isadvanced_field: true,
}), }),
AddCol({ AddCol({
name: 'idCollane', name: 'idCollane',
label_trans: 'cataloglist.collane', label_trans: 'cataloglist.collane',
fieldtype: costanti.FieldType.multiselect, fieldtype: costanti.FieldType.multiselect,
jointable: 'collanastotali', jointable: 'collanastotali',
isadvanced_field: true,
}), }),
AddCol({ AddCol({
name: 'editore', name: 'editore',
label_trans: 'cataloglist.editore', label_trans: 'cataloglist.editore',
fieldtype: costanti.FieldType.multiselect, fieldtype: costanti.FieldType.multiselect,
jointable: 'publishers_totali', jointable: 'publishers_totali',
isadvanced_field: true,
}), }),
AddCol({ AddCol({
name: 'idTipoFormato', name: 'idTipoFormato',
label_trans: 'cataloglist.idTipoFormato', label_trans: 'cataloglist.idTipoFormato',
fieldtype: costanti.FieldType.multiselect, fieldtype: costanti.FieldType.multiselect,
jointable: 't_web_tipiformatos', jointable: 't_web_tipiformatos',
isadvanced_field: true,
}), }),
AddCol({ name: 'descr_introduttiva', label_trans: 'cataloglist.descr_introduttiva', fieldtype: costanti.FieldType.html, maxlength: 1300 }), AddCol({ name: 'descr_introduttiva', label_trans: 'cataloglist.descr_introduttiva', fieldtype: costanti.FieldType.html, maxlength: 1300 }),
@@ -517,10 +523,24 @@ export const colopzemail = [
AddCol(DuplicateRec), AddCol(DuplicateRec),
] ]
export const coldestnewsletter = [
AddCol({ name: 'descr', label_trans: 'destnewsletter.descr' }),
AddCol({
name: 'tipodest_id',
label_trans: 'destnewsletter.tipodest_id',
fieldtype: costanti.FieldType.select,
jointable: 'tipodest',
}),
]
export const coltemplemail = [ export const coltemplemail = [
AddCol({ name: 'subject', label_trans: 'templemail.subject' }), AddCol({ name: 'subject', label_trans: 'templemail.subject' }),
AddCol({ name: 'testoheadermail', label_trans: 'templemail.testoheadermail', fieldtype: costanti.FieldType.html }), AddCol({ name: 'testoheadermail', label_trans: 'templemail.testoheadermail', fieldtype: costanti.FieldType.html }),
AddCol({ name: 'content', label_trans: 'templemail.content', fieldtype: costanti.FieldType.html }), AddCol({ name: 'content', label_trans: 'templemail.content', fieldtype: costanti.FieldType.html }),
AddCol({ name: 'disclaimer', label_trans: 'templemail.disclaimer', fieldtype: costanti.FieldType.html }),
AddCol({ name: 'piedipagina', label_trans: 'templemail.piedipagina', fieldtype: costanti.FieldType.html }),
AddCol({ name: 'firma', label_trans: 'templemail.firma', fieldtype: costanti.FieldType.html }),
AddCol({ name: 'img', label_trans: 'templemail.img' }), AddCol({ name: 'img', label_trans: 'templemail.img' }),
AddCol({ name: 'content2', label_trans: 'templemail.content2', fieldtype: costanti.FieldType.html }), AddCol({ name: 'content2', label_trans: 'templemail.content2', fieldtype: costanti.FieldType.html }),
AddCol({ name: 'img2', label_trans: 'templemail.img2' }), AddCol({ name: 'img2', label_trans: 'templemail.img2' }),
@@ -537,6 +557,7 @@ export const coltemplemail = [
export const colnewstosent = [ export const colnewstosent = [
AddCol({ name: 'label', label_trans: 'event.title' }), AddCol({ name: 'label', label_trans: 'event.title' }),
AddCol({ name: 'templemail_str', label_trans: 'newsletter.templemail' }), AddCol({ name: 'templemail_str', label_trans: 'newsletter.templemail' }),
AddCol({ name: 'destnewsletter_str', label_trans: 'newsletter.destnewsletter' }),
AddCol({ name: 'datetoSent', label_trans: 'newsletter.datetoSent', fieldtype: costanti.FieldType.date }), AddCol({ name: 'datetoSent', label_trans: 'newsletter.datetoSent', fieldtype: costanti.FieldType.date }),
AddCol({ name: 'activate', label_trans: 'newsletter.activate', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'activate', label_trans: 'newsletter.activate', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'numemail_tot', label_trans: 'newsletter.numemail_tot', fieldtype: costanti.FieldType.number }), AddCol({ name: 'numemail_tot', label_trans: 'newsletter.numemail_tot', fieldtype: costanti.FieldType.number }),
@@ -3244,6 +3265,8 @@ export const colTableUsers = [
// AddCol({ name: 'aportador_solidario_ind_order', label_trans: 'reg.aportador_solidario_ind_order' }), // AddCol({ name: 'aportador_solidario_ind_order', label_trans: 'reg.aportador_solidario_ind_order' }),
// AddCol({ name: 'aportador_solidario_nome_completo', label_trans: 'reg.aportador_solidario_nome_completo' }), // AddCol({ name: 'aportador_solidario_nome_completo', label_trans: 'reg.aportador_solidario_nome_completo' }),
AddCol({ name: 'news_on', label_trans: 'reg.news_on', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'news_on', label_trans: 'reg.news_on', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'test', label_trans: 'reg.test', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'diario_on', label_trans: 'reg.diario_on', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'email_errata', label_trans: 'reg.email_errata', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'email_errata', label_trans: 'reg.email_errata', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'lastid_newstosent', label_trans: 'reg.lastid_newstosent', fieldtype: costanti.FieldType.string }), AddCol({ name: 'lastid_newstosent', label_trans: 'reg.lastid_newstosent', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'aportador_solidario', label_trans: 'reg.aportador_solidario' }), AddCol({ name: 'aportador_solidario', label_trans: 'reg.aportador_solidario' }),
@@ -3533,6 +3556,8 @@ export const colTableUsersISP = [
}), }),
AddCol({ name: 'news_on', label_trans: 'reg.news_on', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'news_on', label_trans: 'reg.news_on', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'diario_on', label_trans: 'reg.diario_on', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'test', label_trans: 'reg.test', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'email_errata', label_trans: 'reg.email_errata', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'email_errata', label_trans: 'reg.email_errata', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'lastid_newstosent', label_trans: 'reg.lastid_newstosent', fieldtype: costanti.FieldType.string }), AddCol({ name: 'lastid_newstosent', label_trans: 'reg.lastid_newstosent', fieldtype: costanti.FieldType.string }),
@@ -4628,6 +4653,14 @@ export const fieldsTable = {
collabel: 'subject', collabel: 'subject',
onlyAdmin: true, onlyAdmin: true,
}, },
{
value: 'destnewsletter',
label: 'Dest Newsletter',
columns: coldestnewsletter,
colkey: '_id',
collabel: 'descr',
onlyAdmin: true,
},
{ {
value: 'opzemail', value: 'opzemail',
label: 'Opzioni Email', label: 'Opzioni Email',
@@ -5162,6 +5195,13 @@ export const fieldsTable = {
colkey: 'value', colkey: 'value',
collabel: 'label', collabel: 'label',
}, },
{
value: 'tipodest',
label: 'Template Cataloghi',
columns: colTableGeneric,
colkey: 'value',
collabel: 'label',
},
], ],
} }

View File

@@ -2677,6 +2677,7 @@ export const tools = {
|| (elem.onlyNotSoci && !userStore.my.profile.socio) || (elem.onlyNotSoci && !userStore.my.profile.socio)
|| (elem.onlyFacilitatore && userStore.isFacilitatore) || (elem.onlyFacilitatore && userStore.isFacilitatore)
|| (elem.onlyEditor && userStore.isEditor) || (elem.onlyEditor && userStore.isEditor)
|| (elem.onlyCommerciale && userStore.isCommerciale)
|| (elem.onlyGrafico && userStore.isGrafico) || (elem.onlyGrafico && userStore.isGrafico)
|| (elem.onlyDepartment && userStore.isDepartment) || (elem.onlyDepartment && userStore.isDepartment)
|| ((!elem.onlyAdmin) && (!elem.onlyManager) && (!elem.onlyFacilitatore) && (!elem.onlyEditor) && (!elem.onlyDepartment) || ((!elem.onlyAdmin) && (!elem.onlyManager) && (!elem.onlyFacilitatore) && (!elem.onlyEditor) && (!elem.onlyDepartment)
@@ -3206,6 +3207,11 @@ export const tools = {
return userStore.isGrafico || userStore.isAdmin return userStore.isGrafico || userStore.isAdmin
}, },
isCommerciale() {
const userStore = useUserStore()
return userStore.isCommerciale || userStore.isAdmin
},
isTeacher() { isTeacher() {
const userStore = useUserStore() const userStore = useUserStore()
return userStore.isTeacher return userStore.isTeacher
@@ -7617,7 +7623,7 @@ export const tools = {
// return true // return true
if (shared_consts.TABLES_PER_EDITORI.includes(tablesel)) { if (shared_consts.TABLES_PER_EDITORI.includes(tablesel)) {
if (userStore.isEditor || userStore.isGrafico || userStore.isAdmin) { if (userStore.isCommerciale || userStore.isEditor || userStore.isGrafico || userStore.isAdmin) {
return true return true
} }
} }
@@ -9823,7 +9829,7 @@ export const tools = {
table: 'lista_editori', table: 'lista_editori',
key: 'referenti', key: 'referenti',
type: costanti.FieldType.select, type: costanti.FieldType.select,
value: this.getCookie(this.COOK_SEARCH + costanti.FILTER_SEP + shared_consts.TABLES_CATALOG + costanti.FILTER_SEP + 'referente', costanti.FILTER_TUTTI), value: this.getCookie(this.COOK_SEARCH + costanti.FILTER_SEP + shared_consts.TABLES_LISTA_EDITORI + costanti.FILTER_SEP + 'referente', costanti.FILTER_TUTTI),
keycookie: '', keycookie: '',
addall: true, addall: true,
arrvalue: [], arrvalue: [],

View File

@@ -91,6 +91,7 @@ export const toolsext = {
TABMYBOT: 'bots', TABMYBOT: 'bots',
TABCALZOOM: 'calzoom', TABCALZOOM: 'calzoom',
TABTEMPLEMAIL: 'templemail', TABTEMPLEMAIL: 'templemail',
TABDESTNEWSLETTER: 'destnewsletter',
TABOPZEMAIL: 'opzemail', TABOPZEMAIL: 'opzemail',
TABSHAREWITHUS: 'sharewithus', TABSHAREWITHUS: 'sharewithus',
TABTYPEHOSP: 'typehosps', TABTYPEHOSP: 'typehosps',

View File

@@ -312,14 +312,26 @@ export const useProducts = defineStore('Products', {
return mystr; return mystr;
}, },
getTotaleOrdineByOrdId: (state: IProductsState) => (idOrdine: string, idGasordine: string, mostra_solo_ordini_produttore: boolean): number => { getTotaleOrdineByOrdId: (state: IProductsState) => (idOrdine: string, idGasordine: string, totale: boolean, mostra_solo_ordini_produttore: boolean, status: number): number => {
const arrprod = state.orders.filter((rec: IOrderCart) => { let arrprod = []
if (idGasordine && !rec.items?.some(item => item.order && item.order.idGasordine === idGasordine) || (rec._id !== idOrdine)) {
return false; // Skip records not matching gasordine condition if (totale) {
arrprod = state.orders.filter((rec: IOrderCart) => {
if (idGasordine && !rec.items?.some(item => item.order && item.order.idGasordine === idGasordine) || (rec.status !== status)) {
return false; // Skip records not matching gasordine condition
}
return true;
});
} else {
arrprod = state.orders.filter((rec: IOrderCart) => {
if (idGasordine && !rec.items?.some(item => item.order && item.order.idGasordine === idGasordine) || (rec._id !== idOrdine)) {
return false; // Skip records not matching gasordine condition
}
return true;
});
} }
return true;
});
let subtotalPrice = 0 let subtotalPrice = 0

View File

@@ -1153,6 +1153,7 @@ export const useUserStore = defineStore('UserStore', {
if (res.data) { if (res.data) {
globalStore.serv_settings = res.data.serv_settings globalStore.serv_settings = res.data.serv_settings
globalStore.templemail = res.data.templemail globalStore.templemail = res.data.templemail
globalStore.destnewsletter = res.data.destnewsletter
globalStore.opzemail = res.data.opzemail globalStore.opzemail = res.data.opzemail
} }
@@ -1205,6 +1206,7 @@ export const useUserStore = defineStore('UserStore', {
this.isDepartment = tools.isBitActive(this.my.perm, shared_consts.Permissions.Department.value) this.isDepartment = tools.isBitActive(this.my.perm, shared_consts.Permissions.Department.value)
this.isTeacher = tools.isBitActive(this.my.perm, shared_consts.Permissions.Teacher.value) this.isTeacher = tools.isBitActive(this.my.perm, shared_consts.Permissions.Teacher.value)
this.isEditor = tools.isBitActive(this.my.perm, shared_consts.Permissions.Editor.value) this.isEditor = tools.isBitActive(this.my.perm, shared_consts.Permissions.Editor.value)
this.isCommerciale = tools.isBitActive(this.my.perm, shared_consts.Permissions.Commerciale.value)
this.isGrafico = tools.isBitActive(this.my.perm, shared_consts.Permissions.Grafico.value) this.isGrafico = tools.isBitActive(this.my.perm, shared_consts.Permissions.Grafico.value)
this.my.tokens = [] this.my.tokens = []

View File

@@ -16,7 +16,8 @@ import type {
IOptCatalogo, IOptCatalogo,
IProduct, IProduct,
IProductInfo, IProductInfo,
IVariazione IVariazione,
IDestNewsletter
} from '@model'; } from '@model';
import { import {
ICity, IMySkill, ICity, IMySkill,
@@ -420,6 +421,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
else if (table === toolsext.TABNEWSLETTER) ris = state.newstosent else if (table === toolsext.TABNEWSLETTER) ris = state.newstosent
else if (table === toolsext.TABGALLERY) ris = state.gallery else if (table === toolsext.TABGALLERY) ris = state.gallery
else if (table === toolsext.TABTEMPLEMAIL) ris = state.templemail else if (table === toolsext.TABTEMPLEMAIL) ris = state.templemail
else if (table === toolsext.TABDESTNEWSLETTER) ris = state.destnewsletter
else if (table === toolsext.TABOPZEMAIL) ris = state.opzemail else if (table === toolsext.TABOPZEMAIL) ris = state.opzemail
else if (table === toolsext.TABMAILINGLIST) ris = state.mailinglist else if (table === toolsext.TABMAILINGLIST) ris = state.mailinglist
else if (table === toolsext.TABMYPAGE) ris = state.mypage else if (table === toolsext.TABMYPAGE) ris = state.mypage
@@ -532,6 +534,10 @@ export const useGlobalStore = defineStore('GlobalStore', {
const myrec = mystate.templemail.find((rec) => rec._id === templid) const myrec = mystate.templemail.find((rec) => rec._id === templid)
return (!!myrec) ? myrec.subject! : '' return (!!myrec) ? myrec.subject! : ''
}, },
getdestnewsletterbyId: (mystate: IGlobalState) => (id: string): string => {
const myrec = mystate.destnewsletter.find((rec: IDestNewsletter) => rec._id === id)
return (!!myrec) ? myrec.descr! : ''
},
}, },
@@ -2213,6 +2219,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
else if (table === toolsext.TABCALDATE) myarr = this.getArrDateEvent() else if (table === toolsext.TABCALDATE) myarr = this.getArrDateEvent()
else if (table === toolsext.TABCALALLDATE) myarr = this.getArrAllDateEvent() else if (table === toolsext.TABCALALLDATE) myarr = this.getArrAllDateEvent()
else if (table === toolsext.TABTYPEHOSP) myarr = shared_consts.TypeHosps else if (table === toolsext.TABTYPEHOSP) myarr = shared_consts.TypeHosps
else if (table === 'tipodest') myarr = shared_consts.DESTNEWSLETTER_ARRAY
else if (table === 'versions') myarr = shared_consts.VERSIONI_PRODOTTO else if (table === 'versions') myarr = shared_consts.VERSIONI_PRODOTTO
else if (table === toolsext.TABPEOPLE) myarr = shared_consts.People else if (table === toolsext.TABPEOPLE) myarr = shared_consts.People
else if (table === toolsext.TABTYPEACCOM) myarr = shared_consts.TypeAccom else if (table === toolsext.TABTYPEACCOM) myarr = shared_consts.TypeAccom

View File

@@ -771,6 +771,11 @@
color="positive" color="positive"
@click="EseguiFunz('MyElemSetIdPageInsteadThePah')" @click="EseguiFunz('MyElemSetIdPageInsteadThePah')"
></q-btn> ></q-btn>
<q-btn
label="Abilita a Tutti la Newsletter news_on !"
color="positive"
@click="EseguiFunz('EnableNewsOn_ToAll')"
></q-btn>
<q-btn <q-btn
label="getGM_Lista_Argomenti" label="getGM_Lista_Argomenti"
color="positive" color="positive"

View File

@@ -52,6 +52,16 @@
color="accent" color="accent"
@click="EseguiFunz('updateAllBook', {usaDBGMLocale: true, caricatutti: true})" @click="EseguiFunz('updateAllBook', {usaDBGMLocale: true, caricatutti: true})"
></q-btn> ></q-btn>
<q-btn
label="Statistiche Macro"
color="primary"
@click="EseguiFunz('StatMacro')"
></q-btn>
<q-btn
label="Cancella Prodotti non piu aggiornati da GM"
color="negative"
@click="EseguiFunz('removeProductInfoWithoutDateUpdatedFromGM')"
></q-btn>
<!-- <!--
<q-btn <q-btn

View File

@@ -96,7 +96,7 @@ export default defineComponent({
const generatinglist = ref(false) const generatinglist = ref(false)
const optrigenera = ref<IOptRigenera>({ visibilitaDisp: costanti.DISP.DISPONIBILI, stato: costanti.STATO.IN_COMMERCIO, rig_mod: false }) const optrigenera = ref<IOptRigenera>({ visibilitaDisp: costanti.DISP.DISPONIBILI, stato: costanti.STATO.IN_COMMERCIO, rig_mod: costanti.RIGENERAMOD.SOVRASCRIVI })
const optcatalogo = ref(<IOptCatalogo>{ ...props.modelValue }); const optcatalogo = ref(<IOptCatalogo>{ ...props.modelValue });
@@ -567,6 +567,13 @@ export default defineComponent({
const trovatocatalogo = getCatalogoByMyPage.value const trovatocatalogo = getCatalogoByMyPage.value
if (boolfiltroVuotoProductTypes && boolfiltroVuotoExcludeProductTypes && boolfiltroVuotoidTipologie && boolfiltroVuotoidTipoFormato && boolfiltroVuotoEditore && boolfiltroVuotoCollane && boolfiltroVuotoArgomenti
&& (catstr === '' )
) {
// Nessun filtro selezionato, pertanto non mostrare niente!
return []
}
const arrris = products const arrris = products
.filter((product: IProduct) => { .filter((product: IProduct) => {
if (!product || !product.productInfo) { if (!product || !product.productInfo) {
@@ -580,7 +587,7 @@ export default defineComponent({
if (!(optrigenera.value.visibilitaDisp === costanti.DISP.TUTTI || if (!(optrigenera.value.visibilitaDisp === costanti.DISP.TUTTI ||
(optrigenera.value.visibilitaDisp === costanti.DISP.ESAURITI && productStore.isEsaurito(product)) || (optrigenera.value.visibilitaDisp === costanti.DISP.ESAURITI && productStore.isEsaurito(product)) ||
(optrigenera.value.visibilitaDisp === costanti.DISP.DISPONIBILI && (productStore.isDisponibile(product) || productStore.isPrevendita(product))))) { (optrigenera.value.visibilitaDisp === costanti.DISP.DISPONIBILI && (productStore.isDisponibile(product) || productStore.isPrevendita(product.productInfo))))) {
return false; return false;
} }
if (!(optrigenera.value.stato === costanti.STATO.TUTTI || if (!(optrigenera.value.stato === costanti.STATO.TUTTI ||
@@ -608,9 +615,12 @@ export default defineComponent({
if (!optcatalogo.value.showListaArgomenti) { if (!optcatalogo.value.showListaArgomenti) {
} else { } else {
hasCategoria = (catstr === costanti.NO_CATEGORY) const isCatVuoto = boolfiltroVuotoCat || (product.productInfo.idCatProds || []).length === 0;
? (boolfiltroVuotoCat ? se_tutti_veri : product.productInfo.idCatProds.length === 0) const isCatSenzaArgomento = catstr === costanti.NO_CATEGORY;
: !catstr || (product.productInfo.idCatProds || []).includes(catstr); const isCatCorretto = !catstr || (product.productInfo.idCatProds || []).includes(catstr);
hasCategoria = (isCatSenzaArgomento && isCatVuoto)
? true
: isCatCorretto;
hasArgomentiCat = boolfiltroVuotoArgomenti hasArgomentiCat = boolfiltroVuotoArgomenti
? se_tutti_veri ? se_tutti_veri
@@ -1098,11 +1108,13 @@ export default defineComponent({
// console.log('indadded', indadded) // console.log('indadded', indadded)
if (optcatalogo.value.maxnumlibri! > 0) { if (optcatalogo.value.maxnumlibri! > 0) {
if (indtotale > optcatalogo.value.maxnumlibri!) if (indtotale > optcatalogo.value.maxnumlibri!)
return break
//} else {
// if (indtotale > 5000)
// return } else {
// if (indtotale > 1000)
// break
} }
} }
@@ -1207,7 +1219,8 @@ export default defineComponent({
} }
optrigenera.value.visibilitaDisp = tools.getCookie((showListaArgomenti.value ? 'INC_ES_' : '') + 'VIS_DISP', costanti.DISP.DISPONIBILI) optrigenera.value.visibilitaDisp = tools.getCookie((showListaArgomenti.value ? 'INC_ES_' : '') + 'VIS_DISP', costanti.DISP.DISPONIBILI)
optrigenera.value.rig_mod = tools.getCookie((showListaArgomenti.value ? 'INC_ES_' : '') + 'RIG_MOD', costanti.RIGENERAMOD.AGGIUNGI_SOLO) if (!showListaArgomenti.value)
optrigenera.value.rig_mod = tools.getCookie((showListaArgomenti.value ? 'INC_ES_' : '') + 'RIG_MOD', costanti.RIGENERAMOD.AGGIUNGI_SOLO)
optrigenera.value.stato = tools.getCookie((showListaArgomenti.value ? 'INC_ES_' : '') + 'VIS_STATO', costanti.STATO.IN_COMMERCIO) optrigenera.value.stato = tools.getCookie((showListaArgomenti.value ? 'INC_ES_' : '') + 'VIS_STATO', costanti.STATO.IN_COMMERCIO)
loadpage.value = false loadpage.value = false

View File

@@ -8,13 +8,15 @@
{{ getTitoloCatalogo() }} {{ getTitoloCatalogo() }}
</div> </div>
<div <div
v-if="ispageCatalogata && tools.isEditor() && getCatalogoByMyPage?.referenti.length > 0" v-if="
ispageCatalogata && (tools.isEditor() || tools.isCommerciale()) && getCatalogoByMyPage?.referenti.length > 0
"
class="text-h7 text-center text-red q-ma-sm" class="text-h7 text-center text-red q-ma-sm"
> >
{{ $t('cataloglist.referenti') }}: <span class="text-bold">{{ getReferentiCatalogo() }}</span> {{ $t('cataloglist.referenti') }}: <span class="text-bold">{{ getReferentiCatalogo() }}</span>
</div> </div>
<q-tabs <q-tabs
v-if="optcatalogo.pdf && tools.isEditor()" v-if="optcatalogo.pdf && (tools.isEditor() || tools.isCommerciale())"
v-model="tabcatalogo" v-model="tabcatalogo"
dense dense
class="bg-green text-white" class="bg-green text-white"
@@ -221,32 +223,6 @@
> >
</q-spinner-tail> </q-spinner-tail>
</q-inner-loading> </q-inner-loading>
<div>
<q-btn
v-if="optcatalogo.pdf && !optcatalogo.generazionePDFInCorso"
:label="`Prepara PDF`"
@click="preparePDF"
></q-btn>
<q-btn
v-if="optcatalogo.generazionePDFInCorso"
:label="`Termina Generazione`"
@click="terminaPDF"
></q-btn>
<q-btn
v-if="optcatalogo.pdf && optcatalogo.generazionePDFInCorso"
:label="`Genera PDF ` + getPdfFilename()"
@click="generatePDF()"
color="positive"
></q-btn>
<q-btn
label="Debug"
@click="toggleDebug()"
:push="optcatalogo.indebug"
:color="optcatalogo.indebug ? `positive` : 'primary'"
></q-btn>
</div>
<div class="row justify-center q-mx-auto bg-blue-1"> <div class="row justify-center q-mx-auto bg-blue-1">
<div class="text-center"> <div class="text-center">
<q-spinner <q-spinner
@@ -293,7 +269,7 @@
> >
</q-tab> </q-tab>
<q-tab <q-tab
v-if="showListaArgomenti" v-if="showListaArgomenti && false"
name="ricerca" name="ricerca"
icon="fas fa-search" icon="fas fa-search"
label="Cerca" label="Cerca"
@@ -305,6 +281,13 @@
>1</q-badge >1</q-badge
> >
</q-tab> </q-tab>
<q-tab
v-if="showListaArgomenti"
name="genera"
icon="fas fa-book"
label="Genera"
>
</q-tab>
</q-tabs> </q-tabs>
<q-tab-panels <q-tab-panels
v-model="tabvisu" v-model="tabvisu"
@@ -380,6 +363,32 @@
/>--> />-->
</q-toolbar> </q-toolbar>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="genera">
<div v-if="tools.isEditor() || tools.isCommerciale()">
<q-btn
v-if="optcatalogo.pdf && !optcatalogo.generazionePDFInCorso"
:label="`Prepara PDF`"
@click="preparePDF"
></q-btn>
<q-btn
v-if="optcatalogo.generazionePDFInCorso"
:label="`Termina Generazione`"
@click="terminaPDF"
></q-btn>
<q-btn
v-if="optcatalogo.pdf && optcatalogo.generazionePDFInCorso"
:label="`Genera PDF ` + getPdfFilename()"
@click="generatePDF()"
color="positive"
></q-btn>
<q-btn
label="Debug"
@click="toggleDebug()"
:push="optcatalogo.indebug"
:color="optcatalogo.indebug ? `positive` : 'primary'"
></q-btn>
</div>
</q-tab-panel>
<q-tab-panel name="ricerca"> <q-tab-panel name="ricerca">
<div <div
class="col" class="col"
@@ -785,7 +794,6 @@
</pre> </pre>
</q-tab-panel> </q-tab-panel>
</q-tab-panels> </q-tab-panels>
</div> </div>
</q-page> </q-page>
<CMyDialog <CMyDialog

View File

@@ -315,20 +315,20 @@ export default defineComponent({
watch(() => mostra_codice.value, (newval, oldval) => { watch(() => mostra_codice.value, (newval, oldval) => {
tools.setCookie(tools.COOK_SHOWCODICE, mostra_codice.value ? '1' : '0') tools.setCookie(tools.COOK_SHOWCODICE, mostra_codice.value ? '1' : '0')
updateorders(true) updateorders(true, true)
}) })
watch(() => mostra_cat.value, (newval, oldval) => { watch(() => mostra_cat.value, (newval, oldval) => {
tools.setCookie(tools.COOK_SHOWCAT, mostra_cat.value ? '1' : '0') tools.setCookie(tools.COOK_SHOWCAT, mostra_cat.value ? '1' : '0')
updateorders(true) updateorders(true, true)
}) })
watch(() => showWhichCode.value, (newval, oldval) => { watch(() => showWhichCode.value, (newval, oldval) => {
tools.setCookie(tools.COOK_SHOWCODE, showWhichCode.value.toString()) tools.setCookie(tools.COOK_SHOWCODE, showWhichCode.value.toString())
updateorders(true) updateorders(true, true)
}) })
watch(() => mostra_solo_ordini_produttore.value, (newval, oldval) => { watch(() => mostra_solo_ordini_produttore.value, (newval, oldval) => {
tools.setCookie(tools.COOK_SHOWORDPROD, mostra_solo_ordini_produttore.value ? '1' : '0') tools.setCookie(tools.COOK_SHOWORDPROD, mostra_solo_ordini_produttore.value ? '1' : '0')
updateorders(true) updateorders(false, true)
}) })
// const { setValDb, getValDb } = MixinBase() // const { setValDb, getValDb } = MixinBase()
@@ -381,8 +381,8 @@ export default defineComponent({
return listproductstotal return listproductstotal
} }
function getTotaleOrdineByOrdId(id: string, idGasordine: string): string { function getTotaleOrdineByOrdId(id: string, idGasordine: string, totale: boolean): string {
return productStore.getTotaleOrdineByOrdId(id, idGasordine, mostra_solo_ordini_produttore.value).toFixed(2) return productStore.getTotaleOrdineByOrdId(id, idGasordine, totale, mostra_solo_ordini_produttore.value, taborders.value).toFixed(2)
} }
function getOrdersCartWithTotals(): any[] { function getOrdersCartWithTotals(): any[] {
@@ -428,7 +428,7 @@ export default defineComponent({
return productStore.getOrdersAllCart(storeGasordine.value) return productStore.getOrdersAllCart(storeGasordine.value)
} }
function updateorders(updatetab: boolean) { function updateorders(updatetab: boolean, notupdatetabsel: boolean) {
// Rimuovi dalla lista columns_listaTotali il record "codice_interno" se mostra_codice.value = false // Rimuovi dalla lista columns_listaTotali il record "codice_interno" se mostra_codice.value = false
columns_listafiltrati.value = columns_listaTotali.value.filter((column: any) => { columns_listafiltrati.value = columns_listaTotali.value.filter((column: any) => {
@@ -460,7 +460,8 @@ export default defineComponent({
arrnumstatus.value[status] = allorders.filter((rec) => (rec.status === status)).reduce((sum, item) => sum + 1, 0) arrnumstatus.value[status] = allorders.filter((rec) => (rec.status === status)).reduce((sum, item) => sum + 1, 0)
} }
selectfirstavailable() if (!notupdatetabsel)
selectfirstavailable()
} }
arrout.value = getOrdersCartWithTotals() arrout.value = getOrdersCartWithTotals()

View File

@@ -222,7 +222,8 @@
>{{ >{{
getTotaleOrdineByOrdId( getTotaleOrdineByOrdId(
props.row._id, props.row._id,
storeGasordine storeGasordine,
props.row.user.name === 'TOTALI'
) )
}} }}
€</q-item-label €</q-item-label
@@ -457,7 +458,7 @@
<span <span
:class="props.row.user.name !== 'TOTALI' ? '' : 'totali'" :class="props.row.user.name !== 'TOTALI' ? '' : 'totali'"
>{{ >{{
getTotaleOrdineByOrdId(props.row._id, storeGasordine) getTotaleOrdineByOrdId(props.row._id, storeGasordine, props.row.user.name === 'TOTALI')
}} }}
€</span €</span
> >
@@ -578,7 +579,9 @@
<br> <br>
</div> </div>
--></div> -->
</div>
<div v-else-if="tabpages === shared_consts.OrderPages.LISTA_TOTALI.value"> <div v-else-if="tabpages === shared_consts.OrderPages.LISTA_TOTALI.value">
<div class="q-pa-sm"> <div class="q-pa-sm">
<q-btn <q-btn

View File

@@ -36,7 +36,7 @@ export default defineComponent({
function load() { function load() {
// console.log('load') // console.log('load')
param.value = { em: $route.query.em, mc: $route.query.mc, locale: tools.getLocale(), email: $route.query.email } param.value = { em: $route.query.em, mc: $route.query.mc, locale: tools.getLocale(), email: $route.query.email, diario_on: $route.query.diario }
console.log('idlink = ', param.value) console.log('idlink = ', param.value)
let ris = null; let ris = null;
ris = userStore.unsubscribe_news_on_fielduser(param.value) ris = userStore.unsubscribe_news_on_fielduser(param.value)

View File

@@ -2616,6 +2616,33 @@
magic-string "^0.25.0" magic-string "^0.25.0"
string.prototype.matchall "^4.0.6" string.prototype.matchall "^4.0.6"
"@svgdotjs/svg.draggable.js@^3.0.4":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz#bca1065ec27b1dbae5a92a0558777ed964a395cb"
integrity sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==
"@svgdotjs/svg.filter.js@^3.0.8":
version "3.0.9"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz#758e336b79e73a6797358d655b60842131a9a52b"
integrity sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==
dependencies:
"@svgdotjs/svg.js" "^3.2.4"
"@svgdotjs/svg.js@^3.2.4":
version "3.2.4"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz#4716be92a64c66b29921b63f7235fcfb953fb13a"
integrity sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==
"@svgdotjs/svg.resize.js@^2.0.2":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz#732e4cae15d09ad3021adeac63bc9fad0dc7255a"
integrity sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==
"@svgdotjs/svg.select.js@^4.0.1":
version "4.0.2"
resolved "https://registry.yarnpkg.com/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz#80a10409e6c73206218690eac5c9f94f8c8909b5"
integrity sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==
"@swc/core-darwin-arm64@1.11.12": "@swc/core-darwin-arm64@1.11.12":
version "1.11.12" version "1.11.12"
resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.12.tgz#3fcc7fd52844c1b0486a38b338331c9efa1d240b" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.12.tgz#3fcc7fd52844c1b0486a38b338331c9efa1d240b"
@@ -3790,6 +3817,11 @@
dependencies: dependencies:
vue-demi "^0.13.11" vue-demi "^0.13.11"
"@yr/monotone-cubic-spline@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz#7272d89f8e4f6fb7a1600c28c378cc18d3b577b9"
integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==
abort-controller@^3.0.0: abort-controller@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@@ -3912,6 +3944,18 @@ anymatch@^3.0.3, anymatch@~3.1.2:
normalize-path "^3.0.0" normalize-path "^3.0.0"
picomatch "^2.0.4" picomatch "^2.0.4"
apexcharts@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-4.7.0.tgz#27e578a2fd66847d8ea425aeea1de56d6be42f21"
integrity sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==
dependencies:
"@svgdotjs/svg.draggable.js" "^3.0.4"
"@svgdotjs/svg.filter.js" "^3.0.8"
"@svgdotjs/svg.js" "^3.2.4"
"@svgdotjs/svg.resize.js" "^2.0.2"
"@svgdotjs/svg.select.js" "^4.0.1"
"@yr/monotone-cubic-spline" "^1.0.3"
archiver-utils@^5.0.0, archiver-utils@^5.0.2: archiver-utils@^5.0.0, archiver-utils@^5.0.2:
version "5.0.2" version "5.0.2"
resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-5.0.2.tgz#63bc719d951803efc72cf961a56ef810760dd14d" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-5.0.2.tgz#63bc719d951803efc72cf961a56ef810760dd14d"
@@ -11452,6 +11496,11 @@ vue2-dragula@^2.5.5:
dependencies: dependencies:
dragula "3.7.2" dragula "3.7.2"
vue3-apexcharts@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/vue3-apexcharts/-/vue3-apexcharts-1.8.0.tgz#1984648d966aa91bc4dc3e87fa847f5289f7f1cf"
integrity sha512-5tSD4mXTBbIJ9ir+58qHE6oNtIe0RNgqIRYMKpcsIaxkKtwUww4JhvPkpUFlmiW4OJbbdklgjleXq1lfcM4gdA==
vue3-pdf-app@^1.0.3: vue3-pdf-app@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/vue3-pdf-app/-/vue3-pdf-app-1.0.3.tgz#2f4ad738d7d86e8082a1aacbe498c5a08cb4d226" resolved "https://registry.yarnpkg.com/vue3-pdf-app/-/vue3-pdf-app-1.0.3.tgz#2f4ad738d7d86e8082a1aacbe498c5a08cb4d226"