- Continuazione del Catalogo

This commit is contained in:
Surya Paolo
2024-10-26 17:12:05 +02:00
parent 76b51f5b91
commit baa4188746
62 changed files with 1112 additions and 1697 deletions

View File

@@ -1,17 +1,18 @@
APP_VERSION="1.1.4" APP_VERSION="1.1.4"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="18"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"
DIRECTORY_SERVER="freeplanet_serverside" DIRECTORY_SERVER="freeplanet_serverside"
SERVERDIR_WEBSITE="" SERVERDIR_WEBSITE=""
SERVERPW_WEBSITE="" SERVERPW_WEBSITE=""
APP_URL="https://localhost" APP_URL="https://localhost"
URL_FACEBOOK="https://www.facebook.com/freeplanetapp" URL_FACEBOOK="https://www.facebook.com/freeplanetapp"
PROVA_PAOLO="PROVA ENV FUNZIONA!"
LANG_DEFAULT="it" LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF" PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T" MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="https://localhost:3000" MONGODB_HOST="https://localhost:3000"
LOGO_REG='riso-logo-full.png' LOGO_REG='gruppomacro-logo-full.png'
TEST_NAME="Paolo" TEST_NAME="Paolo"
TEST_SURNAME="Arena" TEST_SURNAME="Arena"
TEST_EMAIL="" TEST_EMAIL=""
@@ -24,5 +25,5 @@ DEBUG="1"
TELEGRAM_SUPPORT="" TELEGRAM_SUPPORT=""
PROJECT_ID_MAIN="5cc0a13fe5c9d156728f400a" PROJECT_ID_MAIN="5cc0a13fe5c9d156728f400a"
TEST_CELL="" TEST_CELL=""
VUE_APP_ISTEST="1" VUE_APP_ISTEST=1
VUE_APP_INLOCALE="1" VUE_APP_INLOCALE=1

View File

@@ -127,7 +127,6 @@ const msg_website_it = {
keywords: 'Parole Chiave', keywords: 'Parole Chiave',
desctiption: 'Descrizione', desctiption: 'Descrizione',
heightimg: 'Altezza Immagine', heightimg: 'Altezza Immagine',
heightcarousel: 'Altezza Carosello',
}, },
msg: { msg: {
myAppName: 'Riso', myAppName: 'Riso',

View File

@@ -154,7 +154,7 @@ module.exports = configure((ctx) => ({
https: false, https: false,
port: 8084, port: 8084,
open: false, // opens browser window automatically open: false, // opens browser window automatically
hot: true, // Disable hot module replacement hot: false, // Disable hot module replacement
headers: { headers: {
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Headers': '*',

View File

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

View File

@@ -1,8 +1,8 @@
{ {
"name": "riso", "name": "gruppomacro",
"version": "1.1.4", "version": "1.1.4",
"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": "GruppoMacro",
"productName": "Riso", "productName": "Gruppo Macro",
"author": "Paolo Arena", "author": "Paolo Arena",
"private": true, "private": true,
"keywords": [], "keywords": [],
@@ -54,9 +54,11 @@
"graphql": "^16.9.0", "graphql": "^16.9.0",
"graphql-tag": "^2.12.6", "graphql-tag": "^2.12.6",
"gsap": "^3.12.5", "gsap": "^3.12.5",
"html2canvas": "^1.4.1",
"html2pdf.js": "^0.10.2", "html2pdf.js": "^0.10.2",
"jquery": "^3.7.1", "jquery": "^3.7.1",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"jspdf": "^2.5.2",
"leaflet": "^1.9.4", "leaflet": "^1.9.4",
"leaflet-routing-machine": "^3.2.12", "leaflet-routing-machine": "^3.2.12",
"leaflet.markercluster": "^1.5.3", "leaflet.markercluster": "^1.5.3",
@@ -127,7 +129,6 @@
"jest": "^29.7.0", "jest": "^29.7.0",
"json-loader": "^0.5.7", "json-loader": "^0.5.7",
"node-sass": "^9.0.0", "node-sass": "^9.0.0",
"nodemon": "^3.1.7",
"npm-check-updates": "^17.1.3", "npm-check-updates": "^17.1.3",
"optimize-css-assets-webpack-plugin": "^6.0.1", "optimize-css-assets-webpack-plugin": "^6.0.1",
"parcel": "^2.12.0", "parcel": "^2.12.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -17,8 +17,6 @@ const webpack = require('webpack')
const helpers = require('./helpers') const helpers = require('./helpers')
const envparser = require('./config/envparser') const envparser = require('./config/envparser')
const package = require('./package.json');
// const ESLintPlugin = require('eslint-webpack-plugin') // const ESLintPlugin = require('eslint-webpack-plugin')
module.exports = configure((ctx) => ({ module.exports = configure((ctx) => ({
@@ -89,7 +87,6 @@ module.exports = configure((ctx) => ({
// Full list of options: https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build // Full list of options: https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build
build: { build: {
env: envparser(), env: envparser(),
versionCode: package.version,
vueRouterMode: 'history', vueRouterMode: 'history',
vueCompiler: true, vueCompiler: true,
gzip: false, // gzip true gzip: false, // gzip true
@@ -152,9 +149,9 @@ module.exports = configure((ctx) => ({
}, },
devServer: { devServer: {
https: false, https: false,
port: 8084, port: 8089,
open: false, // opens browser window automatically open: false, // opens browser window automatically
hot: false, // Disable hot module replacement hot: true, // Disable hot module replacement
headers: { headers: {
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Headers': '*',
@@ -251,8 +248,6 @@ module.exports = configure((ctx) => ({
'Cookies', 'Cookies',
'Loading', 'Loading',
'AppVisibility', 'AppVisibility',
'LocalStorage',
'SessionStorage',
], ],
get plugins_1() { get plugins_1() {
return this._plugins; return this._plugins;
@@ -313,9 +308,9 @@ module.exports = configure((ctx) => ({
}, },
manifest: { manifest: {
name: 'Riso', name: 'Gruppo Macro',
short_name: 'Riso', short_name: 'GruppoMacro',
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: '',
display: 'standalone', display: 'standalone',
orientation: 'portrait', orientation: 'portrait',
background_color: '#fff', background_color: '#fff',
@@ -325,54 +320,24 @@ module.exports = configure((ctx) => ({
start_url: "/?homescreen=1", start_url: "/?homescreen=1",
icons: [ icons: [
{ {
src: 'images/riso-android-icon-512x512.png', src: 'images/gm-android-icon-512x512.png',
sizes: '512x512', sizes: '512x512',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-android-icon-384x384.png', src: 'images/gm-android-icon-192x192.png',
sizes: '384x384',
type: 'image/png',
},
{
src: 'images/riso-android-icon-192x192.png',
sizes: '192x192', sizes: '192x192',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-android-icon-144x144.png', src: 'images/gm-apple-touch-icon.png',
sizes: '144x144',
type: 'image/png',
},
{
src: 'images/riso-android-icon-96x96.png',
sizes: '96x96',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-120x120.png',
sizes: '120x120',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-144x144.png',
sizes: '144x144',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-152x152.png',
sizes: '152x152',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-180x180.png',
sizes: '180x180', sizes: '180x180',
type: 'image/png', type: 'image/png',
}, },
], ],
related_applications: [{ related_applications: [{
"platform": "webapp", "platform": "webapp",
"url": "https://www.riso.app/manifest.json" "url": "https://www.gruppomacro.app/manifest.json"
}] }]
}, },
}, },
@@ -407,7 +372,7 @@ module.exports = configure((ctx) => ({
builder: { builder: {
// https://www.electron.build/configuration/configuration // https://www.electron.build/configuration/configuration
appId: 'Riso', appId: 'GruppoMacro',
}, },
// "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain

View File

@@ -168,6 +168,7 @@ export const shared_consts = {
MAPPAGETCOORDINATE: 380, MAPPAGETCOORDINATE: 380,
EDITADDRESSBYCOORD: 390, EDITADDRESSBYCOORD: 390,
GRID_ORIZ: 400, GRID_ORIZ: 400,
QRCODE: 410,
}, },
QUERYTYPE_MYGROUP: 1, QUERYTYPE_MYGROUP: 1,
@@ -1673,6 +1674,10 @@ export const shared_consts = {
value: 400, value: 400,
label: 'Visualizzatore Tabelle', label: 'Visualizzatore Tabelle',
}, },
{
value: 410,
label: 'Qr Code',
},
], ],
TypesElemAdminTools: [ TypesElemAdminTools: [

View File

@@ -19,6 +19,7 @@ export default defineComponent({
Categoria: [], Categoria: [],
Editore: [], Editore: [],
pdf: false, pdf: false,
backgroundimage: '',
}), }),
}, },
}, },

View File

@@ -159,7 +159,7 @@
.book-title { .book-title {
margin: 8px; margin: 8px;
font-family: 'Poppins,sans-serif'; font-family: 'Arial, Poppins,sans-serif';
font-weight: bold; font-weight: bold;
color: #333; color: #333;
display: block; display: block;
@@ -258,6 +258,10 @@
} }
.colfix_prodotti_2 { .colfix_prodotti_2 {
width: 240px;
}
.colfix_prodotti_3 {
width: 170px; width: 170px;
} }
@@ -312,10 +316,10 @@
.scheda-book { .scheda-book {
text-align: center; text-align: center;
margin-left: 20px; //margin-left: 20px;
@media (max-width: 718px) { @media (max-width: 718px) {
margin-left: 5px; //margin-left: 5px;
} }
} }

View File

@@ -66,6 +66,7 @@ export default defineComponent({
Categoria: [], Categoria: [],
Editore: [], Editore: [],
pdf: false, pdf: false,
backgroundimage: '',
}), }),
}, },
}, },

View File

@@ -1,21 +1,27 @@
<template> <template>
<div <div
:class="{ :class="{
'row items-start q-gutter-sm': true, ' items-start q-gutter-sm': true,
}" }"
:style="
optcatalogo.height
? ' height: ' + optcatalogo.height + ' !important; '
: ''
"
> >
<q-spinner v-if="!endload" color="primary" size="3em" :thickness="2" /> <q-spinner v-if="!endload" color="primary" size="3em" :thickness="2" />
<div <div
v-if="!!myproduct && !!myproduct.productInfo" v-if="!!myproduct && !!myproduct.productInfo"
:class="{ :class="{
'my-card-big book-details': complete, 'my-card-big book-details': complete,
'book-card': !complete, 'book-card': !complete && !optcatalogo.pdf,
colfix_prodotti_1: options.quante_col == 'c1', colfix_prodotti_1: options.quante_col == 'c1' && !optcatalogo.pdf,
colfix_prodotti_2: options.quante_col == 'c2', colfix_prodotti_2: options.quante_col == 'c2' && !optcatalogo.pdf,
colfix_prodotti_3: options.quante_col == 'c3' && !optcatalogo.pdf,
}" }"
> >
<q-toggle <q-toggle
v-if="tools.isManager()" v-if="tools.isManager() && !optcatalogo.pdf"
v-model="editOn" v-model="editOn"
class="absolute-top-right" class="absolute-top-right"
color="green" color="green"
@@ -24,7 +30,7 @@
> >
</q-toggle> </q-toggle>
<q-page-sticky <q-page-sticky
v-if="complete" v-if="complete && !optcatalogo.pdf"
position="bottom-right" position="bottom-right"
:offset="[18, 0]" :offset="[18, 0]"
style="z-index: 1000" style="z-index: 1000"
@@ -40,13 +46,22 @@
<q-card-section> <q-card-section>
<div <div
:class="{ 'flex q-pa-sm': true, 'shadow-2': options.in_3d }" :class="{
style="place-content: center" 'flex q-pa-sm': !optcatalogo.pdf,
'shadow-2': options.in_3d,
'items-center': true, // Centrare verticalmente
}"
:style="'justify-items: center; '"
> >
<q-img <q-img
v-if="myproduct.productInfo"
:src=" :src="
productInfo.imagefile myproduct.productInfo.imagefile
? tools.getFullFileNameByImageFile('productInfos', myproduct.myproduct.productInfo.imagefile) ? tools.getFullFileNameByImageFile(
'productInfos',
myproduct.productInfo.imagefile
)
: myproduct.productInfo.image_link : myproduct.productInfo.image_link
" "
:alt="myproduct.productInfo.name" :alt="myproduct.productInfo.name"
@@ -54,7 +69,15 @@
'book-image-fixed': complete, 'book-image-fixed': complete,
'cursor-pointer': !complete, 'cursor-pointer': !complete,
'shadow-4': true, 'shadow-4': true,
'image-wrapper': optcatalogo.pdf,
'items-center': true,
}" }"
:style="
'place-items: center; ' +
(optcatalogo.width
? ' width: ' + optcatalogo.width + ' !important; '
: '')
"
@click="click_opendetail()" @click="click_opendetail()"
> >
<div <div
@@ -62,6 +85,7 @@
style="left: 90%; top: -18px; transform: translateX(-50%)" style="left: 90%; top: -18px; transform: translateX(-50%)"
> >
<q-btn <q-btn
v-if="!optcatalogo.pdf"
color="blue-6" color="blue-6"
class="semi-transparent" class="semi-transparent"
round round
@@ -72,12 +96,6 @@
</div> </div>
</q-img> </q-img>
<!--@click="
complete
? toggleFullScreen
: naviga(`/catalogo/` + myproduct._id + '/' + cosa)
"-->
<div class="scheda-book"> <div class="scheda-book">
<q-card-title> <q-card-title>
<span class="book-title" :data-col="options.quante_col"> <span class="book-title" :data-col="options.quante_col">

View File

@@ -1 +1,49 @@
.pdf-page {
margin-bottom: 20px;
background: white;
}
.page-break-after {
page-break-after: always;
break-after: page;
}
.page-break-before {
page-break-before: always;
break-before: page;
}
.page-break-avoid {
page-break-inside: avoid;
break-inside: avoid;
}
@media print {
.pdf-page {
margin: 0;
page-break-after: always;
}
}
.image-container {
page-break-inside: avoid !important;
break-inside: avoid !important;
margin-bottom: 20px;
}
.image-wrapper {
max-width: 100%;
display: block;
}
.image-wrapper img {
max-width: 100%;
height: auto;
display: block;
}
/* Per forzare una nuova pagina prima dell'immagine se necessario */
.force-new-page {
page-break-before: always;
break-before: page;
}

View File

@@ -53,6 +53,7 @@ export default defineComponent({
Categoria: [], Categoria: [],
Editore: [], Editore: [],
pdf: false, pdf: false,
backgroundimage: '',
}), }),
}, },
}, },

View File

@@ -1,16 +1,14 @@
<template> <template>
<div> <CCatalogoCard
<CCatalogoCard :id="id"
:id="id" :complete="complete"
:complete="complete" :cosa="cosa"
:cosa="cosa" :options="options"
:options="options" @selauthor="selauthor"
@selauthor="selauthor" @opendetail="opendetail"
@opendetail="opendetail" :optcatalogo="optcatalogo"
:optcatalogo="optcatalogo" >
> </CCatalogoCard>
</CCatalogoCard>
</div>
<q-dialog <q-dialog
v-model="opendetailbool" v-model="opendetailbool"
position="top" position="top"

View File

@@ -2,7 +2,7 @@ import {
defineComponent, onMounted, PropType, computed, ref, toRef, watch, defineComponent, onMounted, PropType, computed, ref, toRef, watch,
} from 'vue' } from 'vue'
import { IElemText, IImgGallery, ILabelValue, IMyCard, IMyElem, IMyPage, IOperators } from '@src/model' import { IColGridTable, IElemText, IImgGallery, ILabelValue, IMyCard, IMyElem, IMyPage, IOperators } from '@src/model'
import { useGlobalStore } from '@store/globalStore' import { useGlobalStore } from '@store/globalStore'
import { CImgTitle } from '@/components/CImgTitle' import { CImgTitle } from '@/components/CImgTitle'
@@ -307,6 +307,28 @@ export default defineComponent({
} }
function saveFieldElem(rec: any, newval: any, col: IColGridTable) {
console.log('saveFieldElem', rec, 'newval', newval, 'col', col)
let iscatalogo = costanti.CATALOGO_FIELDS.includes(col.name)
if (col.fieldtype === costanti.FieldType.image) {
if (iscatalogo) {
myel.value.catalogo[col.name] = newval.imagefile
//console.log('SALVATO IN', col.name, newval.imagefile, 'RIS', myel.value.catalogo[col.name])
} else {
myel.value[col.name] = newval.imagefile
}
} else {
if (iscatalogo) {
myel.value.catalogo[col.name] = newval
console.log('SALVATO IN', col.name, newval, 'RIS', myel.value.catalogo[col.name])
} else {
myel.value[col.name] = newval
}
}
}
function saveCard(recpass: IMyCard, myval: any) { function saveCard(recpass: IMyCard, myval: any) {
if (props.myelem.type === shared_consts.ELEMTYPE.CARD) { if (props.myelem.type === shared_consts.ELEMTYPE.CARD) {
if (props.myelem.listcards) { if (props.myelem.listcards) {
@@ -337,8 +359,13 @@ export default defineComponent({
(props.myelem.type === shared_consts.ELEMTYPE.IMAGE)) { (props.myelem.type === shared_consts.ELEMTYPE.IMAGE)) {
myel.value.image = myval myel.value.image = myval
myel.value.vers_img = tools.getGenerateVersionImage() myel.value.vers_img = tools.getGenerateVersionImage()
} else if (props.myelem.type === shared_consts.ELEMTYPE.IMAGE) {
myel.value.image = myval
} }
modifElem() modifElem()
} }
function showAnimation() { function showAnimation() {
@@ -358,10 +385,15 @@ export default defineComponent({
modifElem() modifElem()
}*/ }*/
function generateSizeOptions() { function generateSizeOptions(widthpx: boolean = true) {
const options = []; const options = [];
let add = '';
if (widthpx)
add = 'px'
for (let i = 0; i <= 700; i += 50) { for (let i = 0; i <= 700; i += 50) {
options.push({ label: `${i}px`, value: `${i}px` });
options.push({ label: `${i}${add}`, value: `${i}${add}` });
} }
return options; return options;
} }
@@ -371,6 +403,40 @@ export default defineComponent({
myel.value.widthimg = value; // Aggiorna widthimg con il nuovo valore myel.value.widthimg = value; // Aggiorna widthimg con il nuovo valore
modifElem() modifElem()
} }
function updateCatalogoSizeWidth(value: any) {
// Gestisce l'input dell'utente per un nuovo valore
myel.value.catalogo!.width = value // Aggiorna widthimg con il nuovo valore
modifElem()
}
function updateCatalogoNumSchedePerCol(value: any) {
// Gestisce l'input dell'utente per un nuovo valore
myel.value.catalogo!.numschede_perCol = value // Aggiorna widthimg con il nuovo valore
modifElem()
}
function updateCatalogoNumSchedePerRiga(value: any) {
// Gestisce l'input dell'utente per un nuovo valore
myel.value.catalogo!.numschede_perRiga = value // Aggiorna widthimg con il nuovo valore
modifElem()
}
function updateCatalogoSizeWidthScheda(value: any) {
// Gestisce l'input dell'utente per un nuovo valore
myel.value.catalogo!.widthscheda = value // Aggiorna widthimg con il nuovo valore
modifElem()
}
function updateCatalogoSizeWidthPag(value: any) {
// Gestisce l'input dell'utente per un nuovo valore
myel.value.catalogo!.widthpag = value // Aggiorna widthimg con il nuovo valore
modifElem()
}
function updateCatalogoSizeWidthPagPrintable(value: any) {
// Gestisce l'input dell'utente per un nuovo valore
myel.value.catalogo!.widthpagPrintable = value // Aggiorna widthimg con il nuovo valore
modifElem()
}
function updateCatalogoSizeHeight(value: any) {
myel.value.catalogo!.height = value
modifElem()
}
function updateSizeHeight(value: any) { function updateSizeHeight(value: any) {
myel.value.heightimg = value; // Aggiorna widthimg con il nuovo valore myel.value.heightimg = value; // Aggiorna widthimg con il nuovo valore
@@ -520,6 +586,14 @@ export default defineComponent({
updateClass4, updateClass4,
selectedClasses, selectedClasses,
classiImmagineOptions, classiImmagineOptions,
saveFieldElem,
updateCatalogoSizeWidth,
updateCatalogoSizeHeight,
updateCatalogoSizeWidthScheda,
updateCatalogoSizeWidthPag,
updateCatalogoSizeWidthPagPrintable,
updateCatalogoNumSchedePerCol,
updateCatalogoNumSchedePerRiga,
} }
}, },

View File

@@ -189,7 +189,10 @@
/> />
<q-select <q-select
label="Altezza Carosello:" label="Altezza Carosello:"
v-if="(myel.type === shared_consts.ELEMTYPE.CARD) || (myel.type === shared_consts.ELEMTYPE.GRID_ORIZ)" v-if="
myel.type === shared_consts.ELEMTYPE.CARD ||
myel.type === shared_consts.ELEMTYPE.GRID_ORIZ
"
v-model="myel.heightcarousel" v-model="myel.heightcarousel"
emit-value emit-value
map-options map-options
@@ -226,6 +229,7 @@
style="width: 100px" style="width: 100px"
emit-value emit-value
map-options map-options
@save="saveCard"
> >
</q-select> </q-select>
<q-select <q-select
@@ -464,12 +468,12 @@
:rec="rec" :rec="rec"
field="imagefile" field="imagefile"
@update:model-value="modifElem" @update:model-value="modifElem"
@save="saveCard"
:canEdit="true" :canEdit="true"
:canModify="true" :canModify="true"
:nosaveToDb="true" :nosaveToDb="true"
:path="myel.path" :path="myel.path"
:fieldtype="costanti.FieldType.imgcard" :fieldtype="costanti.FieldType.imgcard"
@save="saveCard"
> >
</CMyFieldRec> </CMyFieldRec>
@@ -861,6 +865,56 @@
</CMyFieldRec> </CMyFieldRec>
</div> </div>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.QRCODE">
<div v-if="enableEdit">
<q-input
dense
label="Link:"
@update:model-value="modifElem"
v-model="myel.container"
filled
v-on:keyup.enter="saveElem"
>
</q-input>
<q-input
dense
label="Testo Link:"
@update:model-value="modifElem"
v-model="myel.container2"
filled
v-on:keyup.enter="saveElem"
>
</q-input>
<q-toggle
v-model="myel.parambool"
color="positive"
label="Leggi"
@update:model-value="modifElem"
></q-toggle>
<q-input
label="NomeFile Img:"
@update:model-value="modifElem"
v-model="myel.image"
filled
dense
v-on:keyup.enter="saveElem"
>
</q-input>
<CMyFieldRec
title="NomeFile Img:"
table="myelems"
:id="myel._id"
:rec="myel"
field="image"
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:path="myel.path"
:fieldtype="costanti.FieldType.image"
>
</CMyFieldRec>
</div>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.IMAGEUPLOAD"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.IMAGEUPLOAD">
<div v-if="enableEdit"> <div v-if="enableEdit">
@@ -1271,6 +1325,15 @@
<div v-if="enableEdit" class="row"> <div v-if="enableEdit" class="row">
<div>Cataloghi:</div> <div>Cataloghi:</div>
<br /> <br />
<q-toggle
v-model="myel.catalogo.pdf"
color="positive"
icon="fas fa-file-pdf"
label="Versione PDF"
@update:model-value="modifElem"
>
</q-toggle>
<br>
<!--++AddCATALOGO_FIELDS--> <!--++AddCATALOGO_FIELDS-->
<q-select <q-select
@@ -1326,14 +1389,191 @@
option-label="name" option-label="name"
> >
</q-select> </q-select>
Versione PDF:
<q-toggle <q-select
v-model="myel.catalogo.pdf" label="Largh. Schede:"
color="positive" v-model="myel.catalogo.widthscheda"
icon="fas fa-file-pdf" emit-value
map-options
:options="generateSizeOptions()"
use-input
use-chips
@input="modifElem"
@new-value="updateCatalogoSizeWidthScheda"
filled
dense
style="width: 150px"
/>
<q-select
label="Largh. Pagina:"
v-model="myel.catalogo.widthpag"
emit-value
map-options
:options="generateSizeOptions(false)"
use-input
use-chips
@input="modifElem"
@new-value="updateCatalogoSizeWidthPag"
filled
dense
style="width: 180px"
/>
<q-select
label="Largh. Immagini:"
v-model="myel.catalogo.width"
emit-value
map-options
:options="generateSizeOptions()"
use-input
use-chips
@input="modifElem"
@new-value="updateCatalogoSizeWidth"
filled
dense
style="width: 180px"
/>
<q-select
label="Altezza Schede:"
v-model="myel.catalogo.height"
emit-value
map-options
:options="generateSizeOptions()"
use-input
use-chips
@input="modifElem"
@new-value="updateCatalogoSizeHeight"
filled
dense
style="width: 180px"
/>
</div>
<div class="sfondo_margine">
Margini:<br />
<q-select
label="Schede per Riga"
v-model="myel.catalogo.numschede_perRiga"
emit-value
map-options
:options="[
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
]"
use-input
use-chips
@input="modifElem"
@new-value="updateCatalogoNumSchedePerRiga"
filled
dense
style="width: 180px"
/>
<q-select
label="Schede per Colonna"
v-model="myel.catalogo.numschede_perCol"
emit-value
map-options
:options="[
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
]"
use-input
use-chips
@input="modifElem"
@new-value="updateCatalogoNumSchedePerCol"
filled
dense
style="width: 180px"
/>
<q-input
dense
label="Margine per Pagina:"
@update:model-value="modifElem" @update:model-value="modifElem"
v-model="myel.catalogo.margine_pagina"
filled
v-on:keyup.enter="saveFieldElem"
> >
</q-toggle> </q-input>
<q-input
dense
label="Margine per Riga:"
@update:model-value="modifElem"
v-model="myel.catalogo.margine_riga"
filled
v-on:keyup.enter="saveFieldElem"
>
</q-input>
</div>
<div>Sfondo:</div>
<div v-if="enableEdit">
Nome File Web: {{ myel.catalogo.backgroundimage }}<br />
<CMyFieldRec
title="Per Web:"
table="catalogo"
:rec="myel.catalogo"
field="backgroundimage"
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
@save="saveFieldElem"
>
</CMyFieldRec>
<br />
<div class="sfondo_print">
Per Stampa:
<q-toggle
v-model="myel.catalogo.printable"
color="positive"
icon="fas fa-file-pdf"
label="Versione Stampabile"
@update:model-value="modifElem"
>
</q-toggle>
<q-input
dense
label="Margine per Pagina:"
@update:model-value="modifElem"
v-model="myel.catalogo.margine_paginaPrintable"
filled
v-on:keyup.enter="saveFieldElem"
>
</q-input>
<q-input
dense
label="Margine per Riga:"
@update:model-value="modifElem"
v-model="myel.catalogo.margine_rigaPrintable"
filled
v-on:keyup.enter="saveFieldElem"
>
</q-input>
Nome File Printable: {{ myel.catalogo.backgroundimage_printable }}
<CMyFieldRec
title="Sfondo:"
table="catalogo"
:rec="myel.catalogo"
field="backgroundimage_printable"
@update:model-value="modifElem"
:canEdit="true"
:canModify="true"
:fieldtype="costanti.FieldType.image"
@save="saveFieldElem"
>
</CMyFieldRec>
<q-select
label="Largh. Pag. Stampa:"
v-model="myel.catalogo.widthpagPrintable"
emit-value
map-options
:options="generateSizeOptions(false)"
use-input
use-chips
@input="modifElem"
@new-value="updateCatalogoSizeWidthPagPrintable"
filled
dense
style="width: 180px"
/>
</div>
</div> </div>
</div> </div>
</q-list> </q-list>

View File

@@ -15,6 +15,7 @@ import { shared_consts } from '@/common/shared_vuejs'
import { LandingFooter } from '@/components/LandingFooter' import { LandingFooter } from '@/components/LandingFooter'
import { CMyActivities } from '@/components/CMyActivities' import { CMyActivities } from '@/components/CMyActivities'
import { CECommerce } from '@/components/CECommerce' import { CECommerce } from '@/components/CECommerce'
import { CQRCode } from '@/components/CQRCode'
import { CAITools } from '@/components/CAITools' import { CAITools } from '@/components/CAITools'
import { CCatalogo } from '@/components/CCatalogo' import { CCatalogo } from '@/components/CCatalogo'
// import { CMapMarker } from '@src/components/CMapMarker.off' // import { CMapMarker } from '@src/components/CMapMarker.off'
@@ -67,7 +68,7 @@ export default defineComponent({
CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration, CTitleBanner, CShareSocial, CCheckAppRunning, CRegistration,
CVisuVideoPromoAndPDF, CECommerce, CCatalogo, CAITools, CVisuVideoPromoAndPDF, CECommerce, CCatalogo, CAITools,
CMapComuni, CMapUsers, CMapGetCoordinates, CMapEditAddressByCoord, CMapComuni, CMapUsers, CMapGetCoordinates, CMapEditAddressByCoord,
CDashGroup, CMovements, CGridOriz, CDashGroup, CMovements, CGridOriz, CQRCode,
// , //CMapMarker, // , //CMapMarker,
}, },
emits: ['selElemClick'], emits: ['selElemClick'],

View File

@@ -88,60 +88,62 @@
:key="groupIndex" :key="groupIndex"
:name="groupIndex" :name="groupIndex"
> >
<div class="row no-wrap justify-start items-center q-px-md full-width"> <div
<template v-for="(rec, cardIndex) in group" :key="cardIndex"> class="row no-wrap justify-start items-center q-px-md full-width"
<div :class="cardColumnClass"> >
<q-card <template v-for="(rec, cardIndex) in group" :key="cardIndex">
:class=" <div :class="cardColumnClass">
`flex-card bordered ` + <q-card
myel.class3 + :class="
(rec.link ? ' titolo_card' : '') `flex-card bordered ` +
" myel.class3 +
:style=" (rec.link ? ' titolo_card' : '')
rec.style + "
`; height: ${ :style="
myel.heightimg || `300px` rec.style +
} !important; width: ${ `; height: ${
myel.widthimg || `300px` myel.heightimg || `300px`
} !important;` } !important; width: ${
" myel.widthimg || `300px`
@click="rec.link ? tools.openUrl(rec.link) : undefined" } !important;`
> "
<div @click="rec.link ? tools.openUrl(rec.link) : undefined"
class="img-container"
:style="`height: ${
myel.heightimg.replace('px', '') * 0.7
}px; overflow: hidden;`"
> >
<q-img
:class="
tools.getClassAnim(myel.anim2) + ` ` + myel.class4
"
:src="tools.getImgFileByElem(myel, rec)"
/>
</div>
<q-card-section>
<div :class="rec.size" :style="`color: ` + rec.color">
{{ tools.getText(rec.alt) }}
</div>
<div <div
:class=" class="img-container"
`q-mt-sm q-mb-xs ` + tools.getClassAnim(myel.anim) :style="`height: ${
" myel.heightimg.replace('px', '') * 0.7
v-html="rec.content" }px; overflow: hidden;`"
></div>
<div
v-if="rec.description"
class="text-caption"
:style="`color: ` + rec.colorsub"
> >
{{ rec.description }} <q-img
:class="
tools.getClassAnim(myel.anim2) + ` ` + myel.class4
"
:src="tools.getImgFileByElem(myel, rec)"
/>
</div> </div>
</q-card-section> <q-card-section>
</q-card> <div :class="rec.size" :style="`color: ` + rec.color">
</div> {{ tools.getText(rec.alt) }}
</template> </div>
</div> <div
:class="
`q-mt-sm q-mb-xs ` + tools.getClassAnim(myel.anim)
"
v-html="rec.content"
></div>
<div
v-if="rec.description"
class="text-caption"
:style="`color: ` + rec.colorsub"
>
{{ rec.description }}
</div>
</q-card-section>
</q-card>
</div>
</template>
</div>
</q-carousel-slide> </q-carousel-slide>
</q-carousel> </q-carousel>
</div> </div>
@@ -236,6 +238,15 @@
></div> ></div>
</div> </div>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.QRCODE">
<div v-if="editOn" class="elemEdit">QRCODE:</div>
<CQRCode
:read="myel.parambool"
:link="myel.container"
:textlink="myel.container2"
:imglogo="tools.getImgFileByElem(myel)"
></CQRCode>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.IMAGE"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.IMAGE">
<div class="text-center"> <div class="text-center">
<div <div
@@ -249,7 +260,7 @@
@click="clickOnElem" @click="clickOnElem"
> >
<q-img <q-img
:src="tools.getImgFileByElem(myel.image)" :src="tools.getImgFileByElem(myel)"
:fit="myel.fit" :fit="myel.fit"
class="img" class="img"
:width="myel.widthimg ? myel.widthimg : undefined" :width="myel.widthimg ? myel.widthimg : undefined"

View File

@@ -173,19 +173,23 @@ export default defineComponent({
if (arrk.length > 2) if (arrk.length > 2)
mysubsubkey.value = arrk[2] mysubsubkey.value = arrk[2]
} }
// console.log('### table', props.table, 'col.value', col.value, 'field', props.field, 'mykey', mykey.value) console.log('### table', props.table, 'col.value', col.value, 'field', props.field, 'mykey', mykey.value, 'mysubkey', mysubkey.value)
} }
function showandsave(row: any, col: any, newval: any, valinitial: any) { function showandsave(row: any, col: any, newval: any, valinitial: any) {
console.log('showandsave CMyFieldDb', row, col, newval) console.log('showandsave CMyFieldDb', row, col, newval)
emit('save', props.rec, newval) emit('save', props.rec, newval, col)
if (props.nosaveToDb) if (props.nosaveToDb)
return return
if (newval !== valinitial) { if (newval !== valinitial) {
tools.saveInDBForTypes($q, mykey.value, newval, props.fieldtype || col.fieldtype, false, props.table, mysubkey.value, props.id, props.indrec, mysubsubkey.value, props.specialField) if (props.id) {
tools.saveInDBForTypes($q, mykey.value, newval, props.fieldtype || col.fieldtype, false, props.table, mysubkey.value, props.id, props.indrec, mysubsubkey.value, props.specialField)
} else {
}
} }
} }

View File

@@ -33,6 +33,11 @@ export default defineComponent({
required: false, required: false,
default: '', default: '',
}, },
imglogo: {
type: String,
required: false,
default: '',
},
read: { read: {
type: Boolean, type: Boolean,
required: false, required: false,
@@ -82,6 +87,7 @@ export default defineComponent({
...toRefs(state), ...toRefs(state),
onDecode, onDecode,
naviga, naviga,
globalStore,
} }
}, },
}) })

View File

@@ -1,5 +1,5 @@
<template> <template>
<div> <div v-if="globalStore.finishLoading">
<div v-if="read"> <div v-if="read">
<div class="stream"> <div class="stream">
<qr-stream @decode="onDecode" class="mb"> <qr-stream @decode="onDecode" class="mb">
@@ -27,8 +27,9 @@
</div> </div>
<div v-else> <div v-else>
<div class="q-ma-sm"> <div class="q-ma-sm">
{{textlink}}<br> {{ textlink }}<br />
{{link}} {{ link }}<br />
Logo: {{imglogo}}<br />
</div> </div>
<qrcode-vue <qrcode-vue
:width="250" :width="250"
@@ -47,10 +48,10 @@
], ],
}, },
}" }"
:image="tools.getimglogo()" :image="imglogo ? imglogo : tools.getimglogo()"
:cornersSquareOptions="{ type: 'dot', color: '#000000' }" :cornersSquareOptions="{ type: 'dot', color: '#000000' }"
:cornersDotOptions="{ type: undefined, color: '#000000' }" :cornersDotOptions="{ type: undefined, color: '#000000' }"
fileExt="png" fileExt="png"
:download="true" :download="true"
:value="link" :value="link"
downloadButton="button_download" downloadButton="button_download"

View File

@@ -2448,4 +2448,45 @@ body.body--dark {
border-radius: 5px; /* Angoli arrotondati */ border-radius: 5px; /* Angoli arrotondati */
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1); /* Leggera ombra per effetto di profondità */ box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1); /* Leggera ombra per effetto di profondità */
margin: 10px 0; /* Spaziatura verticale */ margin: 10px 0; /* Spaziatura verticale */
}
.flex-container-book {
display: flex;
flex-direction: row; /* Allineamento orizzontale */
flex-wrap: wrap;
gap: 10px; /* Spaziatura tra gli elementi */
}
.flex-item-book {
display: flex; /* Rende il div un container flex per allineare i contenuti */
justify-content: center; /* Allineamento orizzontale al centro */
align-items: center; /* Allineamento verticale al centro */
padding: 10px;
flex-grow: 1; /* Opzionale: permette agli elementi di crescere uniformemente */
break-inside: avoid;
page-break-inside: avoid;
}
.card-page {
break-after: page;
page-break-after: always;
}
.card-row {
display: flex;
justify-content: flex-start;
}
.cards-container {
display: flex;
flex-direction: column !important;
width: 100% !important;
}
.sfondo_print{
background-color: #17ead9;
}
.sfondo_margine{
background-color: #d8f38a;
} }

View File

@@ -1,9 +1,9 @@
const msg_website_it = { const msg_website_it = {
ws: { ws: {
sitename: 'Riso', sitename: 'Gruppo Macro',
siteshortname: 'RISO', siteshortname: 'Gruppo Macro',
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: '',
keywords: 'riso, piattaforma di scambio, rete italiana scambio orizzontale, riso app, riso piattaforma, scambio e baratto, momenta RIS', keywords: '',
}, },
hours: { hours: {
descr: 'Descrizione', descr: 'Descrizione',
@@ -16,23 +16,35 @@ const msg_website_it = {
pages: { pages: {
home: 'Home', home: 'Home',
profile: 'Profilo', profile: 'Profilo',
install_site: 'Installa Sito',
profile2: 'ProfiloU', profile2: 'ProfiloU',
mypage2: 'mypage2', mypage2: 'mypage2',
myservice2: 'myservice2', myservice2: 'myservice2',
myhosps2: 'myhosps2', myhosps2: 'myhosps2',
mygood2: 'mygood2', mygood2: 'mygood2',
catalogo: 'Catalogo',
fundraising: 'Sostieni il Progetto', fundraising: 'Sostieni il Progetto',
notifs: 'Configura le Notifiche', notifs: 'Configura le Notifiche',
unsubscribe: 'Disiscriviti', unsubscribe: 'Disiscriviti',
unsubscribe_user: 'Disiscriviti User',
test: 'Test', test: 'Test',
projects: 'Progetti', projects: 'Progetti',
report: 'Report Ore', report: 'Report Ore',
producer: 'Produttore', producer: 'Produttore',
orderinfo: 'Ordini Effettuati', orderinfo: 'Ordini Effettuati',
products: 'Prodotti', products: 'Prodotti',
cash: 'Cassa',
productInfos: 'Info Prodotti',
listinoprodotti: 'Listino Prodotti',
productslist: 'Lista Prodotti', productslist: 'Lista Prodotti',
collabora: 'Collabora', collabora: 'Collabora',
categories: 'Categorie',
storehouses: 'Magazzino', storehouses: 'Magazzino',
providers: 'Fornitori',
catprods: 'Categorie',
subcatprods: 'Sotto-Categorie',
gasordine: 'Gas Ordine',
scontisticas: 'Scontistica',
departments: 'Uffici', departments: 'Uffici',
orders: 'Ordini Ricevuti', orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti', orders2: 'Ordini Ricevuti',
@@ -121,15 +133,11 @@ const msg_website_it = {
only_residenti: 'Solo Residenti', only_residenti: 'Solo Residenti',
only_consiglio: 'Solo Consiglieri', only_consiglio: 'Solo Consiglieri',
color: 'Colore', color: 'Colore',
mainMenu: 'Menu Principale', gasordini: 'Gas Ordini',
subtitle: 'Sottotitolo', gestoreordini: 'Gestore Ordini',
lang: 'Lingua',
keywords: 'Parole Chiave',
desctiption: 'Descrizione',
heightimg: 'Altezza Immagine',
}, },
msg: { msg: {
myAppName: 'Riso', myAppName: 'Più che Buono',
myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito', myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito',
underconstruction: 'App in costruzione...', underconstruction: 'App in costruzione...',
myDescriz: '', myDescriz: '',

View File

@@ -67,39 +67,6 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: false, inmenu: false,
infooter: false, infooter: false,
}, },
{
active: true,
order: 12,
path: '/goods',
materialIcon: 'fas fa-tshirt',
name: 'mypages.goods',
component: () => import('@/root/goods/goods.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/services',
materialIcon: 'fas fa-house-user',
name: 'mypages.services',
component: () => import('@/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/activities',
materialIcon: 'fas fa-house-user',
name: 'mypages.activities',
component: () => import('@/root/activities/activities.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{ {
active: true, active: true,
order: 15, order: 15,
@@ -111,17 +78,6 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: false, inmenu: false,
infooter: false, infooter: false,
}, },
{
active: true,
order: 15,
path: '/hosps',
materialIcon: 'fas fa-bed',
name: 'mypages.hosp',
component: () => import('@/root/hosp/hosp.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{ {
active: site.confpages && site.confpages.enableCircuits, active: site.confpages && site.confpages.enableCircuits,
order: 16, order: 16,
@@ -209,7 +165,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true, newpage: true }, meta: { requiresAuth: true, newpage: true },
inmenu: false, inmenu: false,
infooter: false, infooter: false,
}, },
{ {
active: true, active: true,
order: 137, order: 137,
@@ -276,7 +232,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
{ {
active: true, active: true,
order: 150, order: 150,
path: '/sostieniilprogetto', path: '/fundraising',
materialIcon: 'fas fa-hand-holding-heart', materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising', name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'), component: () => import('@src/root/fundraising/fundraising.vue'),

View File

@@ -681,6 +681,20 @@ export interface ICatalogo {
Categoria: string[] Categoria: string[]
Editore: string[] Editore: string[]
pdf: boolean pdf: boolean
backgroundimage?: string
backgroundimage_printable?: string
widthpag?: number
widthpagPrintable?: number
widthscheda?: string
width?: string
height?: string
printable?: boolean
numschede_perCol?: number
numschede_perRiga?: number
margine_pagina?: string
margine_riga?: string
margine_paginaPrintable?: string
margine_rigaPrintable?: string
} }

View File

@@ -19,6 +19,29 @@ export const costanti = {
CERCO: 2, CERCO: 2,
}, },
CATALOGO_FIELDS: [
'productTypes',
'excludeproductTypes',
'formato',
'Categoria',
'Editore',
'pdf',
'printable',
'backgroundimage',
'backgroundimage_printable',
'width',
'widthscheda',
'widthpag',
'Printable',
'height',
'numschede_perCol',
'numschede_perRiga',
'margine_pagina',
'margine_riga',
'margine_paginaPrintable',
'margine_rigaPrintable',
],
TIPOFAVBOOK: { TIPOFAVBOOK: {
FAVORITE: 1, FAVORITE: 1,
BOOKMARK: 2, BOOKMARK: 2,
@@ -313,6 +336,8 @@ export const costanti = {
VISUTABLE_GRID_ORIZ: -10, VISUTABLE_GRID_ORIZ: -10,
DIR_UPLOAD: 'upload/', DIR_UPLOAD: 'upload/',
DIR_PRODUCTS: 'products/',
DIR_CATALOGO: 'catalogo/',
FRIENDS: 1, FRIENDS: 1,
ASK_TRUST: 2, ASK_TRUST: 2,

View File

@@ -147,6 +147,26 @@ export const colmylistcards = [
AddCol({ name: 'link', label_trans: 'link' }), AddCol({ name: 'link', label_trans: 'link' }),
] ]
export const colmyelCatalogo = [
AddCol({ name: 'productTypes', label_trans: 'productTypes', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'excludeproductTypes', label_trans: 'excludeproductTypes', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'pdf', label_trans: 'pdf' }),
AddCol({ name: 'Editore', label_trans: 'Editore' }),
AddCol({ name: 'backgroundimage', label_trans: 'backgroundimage', fieldtype: costanti.FieldType.image }),
AddCol({ name: 'backgroundimage_printable', label_trans: 'backgroundimage_printable', fieldtype: costanti.FieldType.image }),
AddCol({ name: 'widthscheda', label_trans: 'widthscheda', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'widthpag', label_trans: 'widthpag', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'widthpagPrintable', label_trans: 'widthpagPrintable', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'width', label_trans: 'width', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'height', label_trans: 'height', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'numschede_perCol', label_trans: 'numschede_perCol', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'numschede_perRiga', label_trans: 'numschede_perRiga', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'margine_pagina', label_trans: 'margine_pagina', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'margine_riga', label_trans: 'margine_riga', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'margine_paginaPrintable', label_trans: 'margine_paginaPrintable', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'margine_rigaPrintable', label_trans: 'margine_rigaPrintable', fieldtype: costanti.FieldType.string }),
]
export const colmyelems = [ export const colmyelems = [
AddCol({ name: 'active', label_trans: 'myelems.active', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'active', label_trans: 'myelems.active', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'path', label_trans: 'myelems.path' }), AddCol({ name: 'path', label_trans: 'myelems.path' }),
@@ -4131,6 +4151,13 @@ export const fieldsTable = {
colkey: '_id', colkey: '_id',
collabel: 'title', collabel: 'title',
}, },
{
value: 'catalogo',
label: 'Elementi Catalogo',
columns: colmyelCatalogo,
colkey: '_id',
collabel: 'title',
},
{ {
value: 'listcards', value: 'listcards',
label: 'Elementi', label: 'Elementi',

View File

@@ -7972,6 +7972,8 @@ export const tools = {
return '' return ''
} else if (elem.type === shared_consts.ELEMTYPE.IMAGE) { } else if (elem.type === shared_consts.ELEMTYPE.IMAGE) {
return costanti.DIR_UPLOAD + 'pages/' + elem.path + '/' + elem.container + addtourl return costanti.DIR_UPLOAD + 'pages/' + elem.path + '/' + elem.container + addtourl
} else if (elem.type === shared_consts.ELEMTYPE.QRCODE) {
return costanti.DIR_UPLOAD + 'pages/' + elem.path + '/' + elem.image + addtourl
} else { } else {
return costanti.DIR_UPLOAD + 'pages/' + elem.path + '/' + elem.image + addtourl return costanti.DIR_UPLOAD + 'pages/' + elem.path + '/' + elem.image + addtourl
} }

View File

@@ -2192,6 +2192,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
Categoria: [], Categoria: [],
Editore: [], Editore: [],
pdf: false, pdf: false,
backgroundimage: '',
} }
} }

View File

@@ -51,4 +51,13 @@ $heightBtn: 100%;
color: black; color: black;
text-align: center; text-align: center;
}
.fixed-width {
width: var(--width) !important; /* Usa una variabile CSS */
}
.break {
flex-basis: 100%;
height: 0;
} }

View File

@@ -1,4 +1,4 @@
import { defineComponent, onMounted, ref, watch, computed, onBeforeUnmount, PropType } from 'vue' import { defineComponent, onMounted, ref, watch, computed, onBeforeUnmount, PropType, nextTick } from 'vue'
import { tools } from '@store/Modules/tools' import { tools } from '@store/Modules/tools'
import { useUserStore } from '@store/UserStore' import { useUserStore } from '@store/UserStore'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
@@ -72,6 +72,7 @@ export default defineComponent({
const mycolumns = ref([]) const mycolumns = ref([])
const tabvisu = ref('categorie') const tabvisu = ref('categorie')
const tabcatalogo = ref('visu')
const searchList = ref([] as ISearchList[]) const searchList = ref([] as ISearchList[])
@@ -266,7 +267,7 @@ export default defineComponent({
}); });
} }
console.log('filter.value.sort', filter.value.sort) // console.log('filter.value.sort', filter.value.sort)
// sort using filter.value.sort : // sort using filter.value.sort :
if (filter.value.sort === costanti.SORT_PUBDATE) { if (filter.value.sort === costanti.SORT_PUBDATE) {
@@ -427,6 +428,8 @@ export default defineComponent({
} }
const generatePDF = async () => { const generatePDF = async () => {
await nextTick()
$q.loading.show({ $q.loading.show({
message: 'Caricamento immagini e generazione PDF in corso...' message: 'Caricamento immagini e generazione PDF in corso...'
}) })
@@ -435,14 +438,26 @@ export default defineComponent({
const element = document.getElementById('pdf-content') const element = document.getElementById('pdf-content')
const opt = { const opt = {
margin: 1, margin: [0.1, 0.1, 0.1, 0.1],
filename: 'catalogo_libri.pdf', filename: 'catalogo_completo.pdf',
image: { type: 'jpeg', quality: 0.98 }, image: {
html2canvas: { scale: 2, useCORS: true }, type: 'jpeg',
jsPDF: { unit: 'in', format: 'a4', orientation: 'portrait' } quality: 0.98
},
html2canvas: {
scale: 2,
useCORS: true,
letterRendering: true,
},
jsPDF: {
unit: 'in',
format: 'a4',
orientation: 'portrait',
compress: true
},
} }
await html2pdf().from(element).set(opt).save() await html2pdf().set(opt).from(element).save()
$q.loading.hide() $q.loading.hide()
$q.notify({ $q.notify({
@@ -461,6 +476,59 @@ export default defineComponent({
} }
} }
function getWidthPerc(): string {
let mynum = props.optcatalogo.numschede_perRiga! + 0
return (100 / mynum) + '%'
}
function getCardStyle(index: any) {
return {
'place-content': 'center',
'flex': `0 1 ${props.optcatalogo.widthscheda}`,
'width': getWidthPerc(), // per N elementi per riga
// 'margin-bottom': props.optcatalogo.margine_pagina, // spazio tra le righe
}
}
function groupedPages() {
const schedePerRiga = props.optcatalogo.numschede_perRiga || 1
const schedePerCol = props.optcatalogo.numschede_perCol || 1
const schedePerPagina = schedePerRiga * schedePerCol
const pages = []
// Iterate attraverso l'array prodotti con step = schedePerPagina
for (let pageStart = 0; pageStart < arrProducts.value.length; pageStart += schedePerPagina) {
const page = []
// Crea le righe per questa pagina
for (let rowStart = 0; rowStart < schedePerCol; rowStart++) {
const row = []
// Riempi ogni riga con il numero corretto di prodotti
for (let col = 0; col < schedePerRiga; col++) {
const productIndex = pageStart + (rowStart * schedePerRiga) + col
if (productIndex < arrProducts.value.length) {
row.push(arrProducts.value[productIndex])
} else {
// Opzionale: riempi con null se non ci sono abbastanza prodotti
row.push(null)
}
}
page.push(row)
}
pages.push(page)
}
return pages
}
onMounted(mounted) onMounted(mounted)
return { return {
@@ -498,6 +566,10 @@ export default defineComponent({
getSearchText, getSearchText,
generatePDF, generatePDF,
pdfContent, pdfContent,
tabcatalogo,
getCardStyle,
getWidthPerc,
groupedPages,
} }
} }
}) })

View File

@@ -1,38 +1,66 @@
<template> <template>
<q-page> <q-page>
<q-btn v-if="optcatalogo.pdf" label="Crea PDF" @click="generatePDF"></q-btn> <q-tabs
<!--<div ref="pdfContent" class="pdf-content">--> v-if="optcatalogo.pdf"
v-model="tabcatalogo"
<div class="text-center"> dense
<q-spinner v-if="!loadpage" color="primary" size="3em" :thickness="2" /> class="bg-green text-white"
</div> >
<div v-if="loadpage" class="panel"> <q-tab name="visu" icon="fas fa-eye" label="Visualizza"> </q-tab>
<div class="container"> <q-tab name="sfondo" icon="fas fa-image" label="Sfondo"> </q-tab>
<q-tabs v-model="tabvisu" dense class="bg-indigo text-white"> <q-tab name="opzioni" icon="fas fa-save" label="Opzioni"> </q-tab>
<q-tab name="categorie" icon="fas fa-folder-open" label="Categorie"> </q-tabs>
<q-badge v-if="cat" color="red" floating>1</q-badge> <q-tab-panels v-model="tabcatalogo" animated class="">
</q-tab> <q-tab-panel name="visu">
<q-tab name="autori" icon="fas fa-user" label="Autori"> <q-btn
<q-badge v-if="filter.author" color="red" floating>1</q-badge> v-if="optcatalogo.pdf"
</q-tab> label="Crea PDF"
<q-tab name="ricerca" icon="fas fa-search" label="Cerca"> @click="generatePDF"
<q-badge v-if="getSearchText()" color="red" floating>1</q-badge> ></q-btn>
</q-tab> <div class="row q-gutter-xs justify-center q-mx-auto bg-blue-1">
</q-tabs> <div class="text-center">
<q-tab-panels v-model="tabvisu" animated class=""> <q-spinner
<q-tab-panel name="categorie"> v-if="!loadpage"
<div class="row q-gutter-xs justify-center q-mx-auto bg-blue-1"> color="primary"
<div v-for="(reccat, index) in getCatProds()" :key="index"> size="3em"
<span :thickness="2"
:class="{ />
category: true, </div>
category_sel: cat === reccat.value, <div v-if="loadpage" class="panel">
}" <div class="container">
@click="cat = reccat.value" <q-tabs v-model="tabvisu" dense class="bg-indigo text-white">
>{{ reccat.label }} <q-tab
</span> name="categorie"
| icon="fas fa-folder-open"
<!--<q-btn label="Categorie"
>
<q-badge v-if="cat" color="red" floating>1</q-badge>
</q-tab>
<q-tab name="autori" icon="fas fa-user" label="Autori">
<q-badge v-if="filter.author" color="red" floating>1</q-badge>
</q-tab>
<q-tab name="ricerca" icon="fas fa-search" label="Cerca">
<q-badge v-if="getSearchText()" color="red" floating
>1</q-badge
>
</q-tab>
</q-tabs>
<q-tab-panels v-model="tabvisu" animated class="">
<q-tab-panel name="categorie">
<div
class="row q-gutter-xs justify-center q-mx-auto bg-blue-1"
>
<div v-for="(reccat, index) in getCatProds()" :key="index">
<span
:class="{
category: true,
category_sel: cat === reccat.value,
}"
@click="cat = reccat.value"
>{{ reccat.label }}
</span>
|
<!--<q-btn
:push="cat === reccat.value" :push="cat === reccat.value"
dense dense
:size="tools.isMobile() ? '0.70rem' : '1rem'" :size="tools.isMobile() ? '0.70rem' : '1rem'"
@@ -44,37 +72,37 @@
@click="cat = reccat.value" @click="cat = reccat.value"
> >
</q-btn>--> </q-btn>-->
</div> </div>
</div> </div>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="autori"> <q-tab-panel name="autori">
<q-toolbar> <q-toolbar>
<q-select <q-select
class="full-width" class="full-width"
v-model="filter.author" v-model="filter.author"
:options="optauthors" :options="optauthors"
label="Autore" label="Autore"
placeholder="Tutti" placeholder="Tutti"
emit-value emit-value
map-options map-options
use-input use-input
hide-selected hide-selected
fill-input fill-input
stack-label stack-label
use-chips use-chips
filled filled
rounded rounded
@filter="filterFn" @filter="filterFn"
> >
<template v-slot:append> <template v-slot:append>
<q-icon <q-icon
v-if="filter.author !== ''" v-if="filter.author !== ''"
class="cursor-pointer" class="cursor-pointer"
name="clear" name="clear"
@click.stop.prevent="filter.author = ''" @click.stop.prevent="filter.author = ''"
/> </template /> </template
></q-select> ></q-select>
<!--<q-select <!--<q-select
v-model="filter.publisher" v-model="filter.publisher"
:options="publishers" :options="publishers"
label="Editore" label="Editore"
@@ -95,176 +123,270 @@
placeholder="Tutte" placeholder="Tutte"
dense dense
/>--> />-->
</q-toolbar> </q-toolbar>
</q-tab-panel> </q-tab-panel>
<q-tab-panel name="ricerca"> <q-tab-panel name="ricerca">
<div class="col" v-for="(item, index) in searchList" :key="index"> <div
<CMySelect class="col"
:col="fieldsTable.getColByColumns(mycolumns, item.key)" v-for="(item, index) in searchList"
v-if=" :key="index"
item.type === costanti.FieldType.select || >
item.type === costanti.FieldType.select_by_server <CMySelect
" :col="fieldsTable.getColByColumns(mycolumns, item.key)"
:label=" v-if="
item.value && item.value._id > 0 item.type === costanti.FieldType.select ||
? undefined item.type === costanti.FieldType.select_by_server
: labelcombo(item) "
" :label="
v-model:value="item.value" item.value && item.value._id > 0
:addall="item.addall" ? undefined
:addnone="item.addnone" : labelcombo(item)
:addlast="true" "
:tablesel=" v-model:value="item.value"
item.type === costanti.FieldType.select_by_server :addall="item.addall"
? item.tablesel :addnone="item.addnone"
: '' :addlast="true"
" :tablesel="
:pickup="item.type === costanti.FieldType.select_by_server" item.type === costanti.FieldType.select_by_server
:label-color="$q.dark.isActive ? 'white' : 'black'" ? item.tablesel
myclass="comboselector" : ''
color="primary" "
:dense="true" :pickup="
:icon_alternative="item.icon" item.type === costanti.FieldType.select_by_server
:optval="fieldsTable.getKeyByTable(item.table)" "
:optlab="fieldsTable.getLabelByTable(item.table)" :label-color="$q.dark.isActive ? 'white' : 'black'"
:options="valoriopt(item, false)" myclass="comboselector"
:filter="item.filter" color="primary"
:filter_extra="item.filter_extra" :dense="true"
style="font-size: 0.8rem !important" :icon_alternative="item.icon"
:useinput=" :optval="fieldsTable.getKeyByTable(item.table)"
item.useinput && :optlab="fieldsTable.getLabelByTable(item.table)"
item.type !== costanti.FieldType.select_by_server :options="valoriopt(item, false)"
" :filter="item.filter"
> :filter_extra="item.filter_extra"
</CMySelect> style="font-size: 0.8rem !important"
</div> :useinput="
</q-tab-panel> item.useinput &&
</q-tab-panels> item.type !== costanti.FieldType.select_by_server
"
>
</CMySelect>
</div>
</q-tab-panel>
</q-tab-panels>
<div class="row justify-center q-mx-auto"> <div class="row justify-center q-mx-auto">
<q-select <q-select
v-model="filter.sort" v-model="filter.sort"
dense dense
:options="costanti.ORDINAMENTO_CATALOGHI" :options="costanti.ORDINAMENTO_CATALOGHI"
label="Ordinamento" label="Ordinamento"
placeholder="" placeholder=""
emit-value emit-value
map-options map-options
filled filled
rounded rounded
></q-select> ></q-select>
</div>
<div class="text-center q-py-sm prod_trov">
<span v-show="productStore.getNumProdTot() !== arrProducts.length">{{
t('ecomm.prodotti_trovati', {
qta: arrProducts.length,
qtatot: productStore.getNumProdTot(),
})
}}</span>
</div>
<div class="row justify-around" v-if="tools.isManager() && false">
<q-toggle
v-model="show_hide"
push
label="Mostra Nascosti"
rounded
glossy
toggle-color="primary"
></q-toggle>
</div>
<div class="row justify-around">
<div>
<q-infinite-scroll
v-if="!optcatalogo.pdf && arrLoaded && arrLoaded.length > 0"
ref="myinfscroll"
:initial-index="0"
@load="onLoadScroll"
:offset="2000"
debounce="200"
class="q-pa-xs row items-start"
style="place-content: center"
>
<div
class="q-pa-xs"
v-for="(product, index) in arrLoaded"
:key="index"
>
<CContainerCatalogoCard
v-if="
product.active ||
(show_hide &&
productInfo.productTypes.includes(
shared_consts.PRODUCTTYPE.PRODUCT
))
"
:id="product._id"
:complete="false"
:cosa="cosa"
:optcatalogo="optcatalogo"
:options="{
show_short_descr: false,
show_price: false,
show_cat: false,
quante_col: 'c2',
in_3d: false,
}"
@selauthor="selauthor"
/>
<CProductCard
v-else-if="product.active || show_hide"
:id="product._id"
:complete="false"
:cosa="cosa"
/>
</div> </div>
<template v-slot:loading>
<div class="text-center"> <div class="text-center q-py-sm prod_trov">
<q-spinner-dots color="primary" size="40px" /> <span
</div> v-show="productStore.getNumProdTot() !== arrProducts.length"
</template> >{{
</q-infinite-scroll> t('ecomm.prodotti_trovati', {
<div qta: arrProducts.length,
v-else qtatot: productStore.getNumProdTot(),
id="pdf-content" })
class="q-pa-xs row items-start" }}</span
style="place-content: center" >
v-for="(product, index) in arrProducts" </div>
:key="index" <div class="row justify-around" v-if="tools.isManager() && false">
> <q-toggle
<CContainerCatalogoCard v-if="!optcatalogo.pdf"
v-if=" v-model="show_hide"
product.active || push
(show_hide && label="Mostra Nascosti"
productInfo.productTypes.includes( rounded
shared_consts.PRODUCTTYPE.PRODUCT glossy
)) toggle-color="primary"
" ></q-toggle>
:id="product._id" </div>
:complete="false"
:cosa="cosa" <div
:optcatalogo="optcatalogo" id="pdf-content"
:options="{ ref="pdfContent"
show_short_descr: false, :class="{ 'fixed-width': true }"
show_price: false, :style="{
show_cat: false, backgroundImage: `url(${
quante_col: 'c2', costanti.DIR_UPLOAD +
in_3d: false, costanti.DIR_CATALOGO +
(optcatalogo.printable
? optcatalogo.backgroundimage_printable
: optcatalogo.backgroundimage)
})`,
backgroundSize: 'contain',
'--width':
(optcatalogo.printable
? optcatalogo.widthpagPrintable
: optcatalogo.widthpag) + 'px',
}" }"
@selauthor="selauthor" >
/> <div class="flex-container-book">
<CProductCard <q-infinite-scroll
v-else-if="product.active || show_hide" v-if="!optcatalogo.pdf && arrLoaded && arrLoaded.length > 0"
:id="product._id" ref="myinfscroll"
:complete="false" :initial-index="0"
:cosa="cosa" @load="onLoadScroll"
/> :offset="2000"
debounce="200"
class="q-pa-xs row items-start"
style="place-content: center"
>
<div
class="q-pa-xs"
v-for="(product, index) in arrLoaded"
:key="index"
>
<CContainerCatalogoCard
v-if="
product.active ||
(show_hide &&
productInfo.productTypes.includes(
shared_consts.PRODUCTTYPE.PRODUCT
))
"
:id="product._id"
:complete="false"
:cosa="cosa"
:optcatalogo="optcatalogo"
:options="{
show_short_descr: false,
show_price: false,
show_cat: false,
quante_col: 'c2',
in_3d: false,
}"
@selauthor="selauthor"
/>
<CProductCard
v-else-if="product.active || show_hide"
:id="product._id"
:complete="false"
:cosa="cosa"
/>
</div>
<template v-slot:loading>
<div class="text-center">
<q-spinner-dots color="primary" size="40px" />
</div>
</template>
</q-infinite-scroll>
<div v-else class="cards-container">
<!-- Itera sulle pagine -->
<div
v-for="(page, pageIndex) in groupedPages()"
:key="pageIndex"
class="card-page"
:style="`margin-bottom: ${optcatalogo.printable ? optcatalogo.margine_paginaPrintable : optcatalogo.margine_pagina};`"
>
<!-- Itera sulle righe di ogni pagina -->
<div
v-for="(row, rowIndex) in page"
:key="`${pageIndex}-${rowIndex}`"
class="card-row"
:style="`margin-bottom: ${optcatalogo.printable ? optcatalogo.margine_rigaPrintable : optcatalogo.margine_riga};`"
>
<!-- Itera sui prodotti di ogni riga -->
<div
v-for="(product, colIndex) in row"
:key="`${pageIndex}-${rowIndex}-${colIndex}`"
class="flex-item-book image-container"
:style="
'place-content: center; ' +
('flex: 0 1 ' + optcatalogo.widthscheda + '; ')
"
>
<CContainerCatalogoCard
v-if="
product && product.active ||
(show_hide &&
productInfo.productTypes.includes(
shared_consts.PRODUCTTYPE.PRODUCT
))
"
:id="product._id"
:complete="false"
:cosa="cosa"
:optcatalogo="optcatalogo"
:options="{
show_short_descr: false,
show_price: false,
show_cat: false,
quante_col: 'c2',
in_3d: false,
}"
@selauthor="selauthor"
/>
<CProductCard
v-else-if="product && (product.active || show_hide)"
:id="product._id"
:complete="false"
:cosa="cosa"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </q-tab-panel>
</div> <q-tab-panel name="sfondo">
<div class="row q-gutter-xs justify-center q-mx-auto bg-blue-1">
<div>
Sfondo:
{{
costanti.DIR_UPLOAD +
costanti.DIR_CATALOGO +
optcatalogo.backgroundimage
}}
</div>
<q-img
:src="
costanti.DIR_UPLOAD +
costanti.DIR_CATALOGO +
optcatalogo.backgroundimage
"
>
</q-img>
<div>
Sfondo Stampa:
{{
costanti.DIR_UPLOAD +
costanti.DIR_CATALOGO +
optcatalogo.backgroundimage_printable
}}
</div>
<q-img
:src="
costanti.DIR_UPLOAD +
costanti.DIR_CATALOGO +
optcatalogo.backgroundimage_printable
"
>
</q-img>
</div>
</q-tab-panel>
<q-tab-panel name="opzioni">
<div class="row q-gutter-xs justify-center q-mx-auto bg-blue-1"></div>
</q-tab-panel>
</q-tab-panels>
<!--<div ref="pdfContent" class="pdf-content">-->
</q-page> </q-page>
</template> </template>

View File

@@ -4843,7 +4843,7 @@ chart.js@^4.4.4:
dependencies: dependencies:
"@kurkle/color" "^0.3.0" "@kurkle/color" "^0.3.0"
chokidar@3.6.0, chokidar@^3.4.2, chokidar@^3.5.2, chokidar@^3.5.3: chokidar@3.6.0, chokidar@^3.4.2, chokidar@^3.5.3:
version "3.6.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
@@ -5676,7 +5676,7 @@ debug@2.6.9:
dependencies: dependencies:
ms "2.0.0" ms "2.0.0"
debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.6, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.6, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4:
version "4.3.7" version "4.3.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
@@ -7580,7 +7580,7 @@ html-webpack-plugin@5.6.0, html-webpack-plugin@^5.6.0:
pretty-error "^4.0.0" pretty-error "^4.0.0"
tapable "^2.0.0" tapable "^2.0.0"
html2canvas@^1.0.0, html2canvas@^1.0.0-rc.5: html2canvas@^1.0.0, html2canvas@^1.0.0-rc.5, html2canvas@^1.4.1:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543"
integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==
@@ -7782,11 +7782,6 @@ ieee754@^1.1.13:
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore-by-default@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==
ignore-walk@^6.0.4: ignore-walk@^6.0.4:
version "6.0.5" version "6.0.5"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd"
@@ -8741,11 +8736,6 @@ js-yaml@~3.7.0:
argparse "^1.0.7" argparse "^1.0.7"
esprima "^2.6.0" esprima "^2.6.0"
jsbarcode@^3.5.8:
version "3.11.6"
resolved "https://registry.yarnpkg.com/jsbarcode/-/jsbarcode-3.11.6.tgz#96e8fbc3395476e162982a6064b98a09b5ea02c0"
integrity sha512-G5TKGyKY1zJo0ZQKFM1IIMfy0nF2rs92BLlCz+cU4/TazIc4ZH+X1GYeDRt7TKjrYqmPfTjwTBkU/QnQlsYiuA==
jsbn@1.1.0: jsbn@1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040"
@@ -8844,7 +8834,7 @@ jsonpointer@^5.0.0:
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
jspdf@^2.3.1: jspdf@^2.3.1, jspdf@^2.5.2:
version "2.5.2" version "2.5.2"
resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-2.5.2.tgz#3c35bb1063ee3ad9428e6353852b0d685d1f923a" resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-2.5.2.tgz#3c35bb1063ee3ad9428e6353852b0d685d1f923a"
integrity sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ== integrity sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==
@@ -9959,22 +9949,6 @@ node-sass@^9.0.0:
stdout-stream "^1.4.0" stdout-stream "^1.4.0"
"true-case-path" "^2.2.1" "true-case-path" "^2.2.1"
nodemon@^3.1.7:
version "3.1.7"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.7.tgz#07cb1f455f8bece6a499e0d72b5e029485521a54"
integrity sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==
dependencies:
chokidar "^3.5.2"
debug "^4"
ignore-by-default "^1.0.1"
minimatch "^3.1.2"
pstree.remy "^1.1.8"
semver "^7.5.3"
simple-update-notifier "^2.0.0"
supports-color "^5.5.0"
touch "^3.1.0"
undefsafe "^2.0.5"
nopt@^5.0.0: nopt@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
@@ -11384,11 +11358,6 @@ pseudomap@^1.0.2:
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
pstree.remy@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
public-encrypt@^4.0.0: public-encrypt@^4.0.0:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
@@ -12289,13 +12258,6 @@ sigstore@^2.2.0:
"@sigstore/tuf" "^2.3.4" "@sigstore/tuf" "^2.3.4"
"@sigstore/verify" "^1.2.1" "@sigstore/verify" "^1.2.1"
simple-update-notifier@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb"
integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==
dependencies:
semver "^7.5.3"
sirv@^2.0.3: sirv@^2.0.3:
version "2.0.4" version "2.0.4"
resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0"
@@ -12836,7 +12798,7 @@ supports-color@^3.2.3:
dependencies: dependencies:
has-flag "^1.0.0" has-flag "^1.0.0"
supports-color@^5.3.0, supports-color@^5.5.0: supports-color@^5.3.0:
version "5.5.0" version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
@@ -13063,11 +13025,6 @@ totalist@^3.0.0:
resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8"
integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==
touch@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694"
integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==
tr46@^1.0.1: tr46@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
@@ -13298,11 +13255,6 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3" has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2" which-boxed-primitive "^1.0.2"
undefsafe@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
undici-types@~6.19.2: undici-types@~6.19.2:
version "6.19.8" version "6.19.8"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
@@ -13521,13 +13473,6 @@ vendors@^1.0.0:
resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
vue-barcode@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/vue-barcode/-/vue-barcode-1.3.0.tgz#c1a4fede73b2d45cdd154a176d6fd0e20fb32df0"
integrity sha512-DxQ0hxes/dP6GajsJumpW6jV14VwlnTwStZbtE6G0wkewuJVDoDOdxUr5seGuxsMT9fJ0aty4X47Z5TG0M/gxg==
dependencies:
jsbarcode "^3.5.8"
vue-class-component@^6.0.0, vue-class-component@^6.2.0: vue-class-component@^6.0.0, vue-class-component@^6.2.0:
version "6.3.2" version "6.3.2"
resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-6.3.2.tgz#e6037e84d1df2af3bde4f455e50ca1b9eec02be6" resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-6.3.2.tgz#e6037e84d1df2af3bde4f455e50ca1b9eec02be6"