Integrazione ECommerce (conversione)

This commit is contained in:
Surya Paolo
2023-11-27 14:40:42 +01:00
parent 6b400448d4
commit f1702d76d6
42 changed files with 1028 additions and 370 deletions

View File

@@ -1,6 +1,6 @@
APP_VERSION="1.0.21" APP_VERSION="1.0.21"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="16" APP_ID="17"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"
DIRECTORY_SERVER="freeplanet_serverside" DIRECTORY_SERVER="freeplanet_serverside"
SERVERDIR_WEBSITE="" SERVERDIR_WEBSITE=""

View File

@@ -147,7 +147,7 @@ module.exports = configure((ctx) => ({
}, },
devServer: { devServer: {
https: false, https: false,
port: 8087, port: 8088,
open: false, // opens browser window automatically open: false, // opens browser window automatically
headers: { headers: {
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',

View File

@@ -1,6 +1,6 @@
APP_VERSION="1.0.20" APP_VERSION="1.0.21"
SERVICE_WORKER_FILE="service-worker.js" SERVICE_WORKER_FILE="service-worker.js"
APP_ID="13" APP_ID="16"
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="newfreeplanet"
DIRECTORY_SERVER="freeplanet_serverside" DIRECTORY_SERVER="freeplanet_serverside"
SERVERDIR_WEBSITE="" SERVERDIR_WEBSITE=""
@@ -12,7 +12,7 @@ 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='piuchebuono-logo-full.png'
TEST_NAME="Paolo" TEST_NAME="Paolo"
TEST_SURNAME="Arena" TEST_SURNAME="Arena"
TEST_EMAIL="" TEST_EMAIL=""

View File

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

View File

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

View File

@@ -1,89 +1,11 @@
import { IEvents } from '../model'; import { IEvents } from '../model';
export const db_data = { export const db_data = {
URL_FACEBOOK: 'https://www.facebook.com/associazioneshen', URL_FACEBOOK: '',
userdata: { userdata: {
calendar_editable: false, calendar_editable: false,
}, },
events: [
{
title: 'Scambi Reiki',
details: 'Nelle serate esperienziali è possibile <span class="boldhigh">Dare e Ricevere</span> un trattamento completo.<br />'
+ 'Possono partecipare le persone che hanno già preso parte al <span class="boldhigh">seminario di 1° livello</span>, ma anche <span class="boldhigh">tutti quelli che hanno il desiderio di conoscere il Reiki</span> e sperimentarlo per la prima volta: in questo caso invitiamo gli interessati a contattarci per un appuntamento prima dellinizio della serata per ricevere le informazioni pratiche.',
date: '2019-07-11',
time: '21:00',
duration: 120,
side: 'left',
bgcolor: 'orange',
icon: 'fas fa-praying-hands',
img: 'images/reiki/reikisfondo.jpg',
where: 'Centro Shen',
// whereicon: 'shen.png',
teacher: 'Cristina Barattoni',
avatar: 'cristina.png',
infoextra: '',
linkpdf: 'files/eventi/Reiki_aMICHI.pdf',
},
{
title: 'Scambi Reiki',
details: 'Nelle serate esperienziali è possibile <span class="boldhigh">Dare e Ricevere</span> un trattamento completo.<br />'
+ 'Possono partecipare le persone che hanno già preso parte al <span class="boldhigh">seminario di 1° livello</span>, ma anche <span class="boldhigh">tutti quelli che hanno il desiderio di conoscere il Reiki</span> e sperimentarlo per la prima volta: in questo caso invitiamo gli interessati a contattarci per un appuntamento prima dellinizio della serata per ricevere le informazioni pratiche.',
date: '2019-07-20',
time: '21:00',
duration: 120,
side: 'left',
bgcolor: 'orange',
icon: 'fas fa-praying-hands',
img: 'images/reiki/reikisfondo.jpg',
where: 'Centro Shen',
// whereicon: 'shen.png',
teacher: 'Cristina Barattoni',
avatar: 'cristina.png',
infoextra: '',
linkpdf: '',
},
{
title: 'Seminario Reiki 1° Livello',
details: 'I seminari vengono organizzati volutamente in gruppi poco numerosi.\n'
+ 'Si crea così un ambiente accogliente e tranquillo con un atmosfera conviviale.<br />'
+ ''
+ 'Per info vedi <a href="reiki/seminari">Seminari Reiki</a>',
date: '2019-07-22',
days: 2,
time: '9:00',
side: 'left',
bgcolor: 'red',
icon: 'fas fa-chalkboard-teacher',
img: 'images/reiki/reikisfondo.jpg',
where: 'Centro Shen',
// whereicon: 'shen.png',
teacher: 'Cristina Barattoni',
avatar: 'cristina.png',
teacher2: 'Elisa Ghizzardi',
avatar2: 'elisa.png',
infoextra: 'sabato e domenica dalle 10.00 alle 18.00',
linkpdf: '',
},
{
title: 'Presentazione Corsi per Operatori del Massaggio del Benessere',
details: 'Vieni alla presentazione dei Corsi!<br>10 settembre a Ravenna, 17 settembre a Lugo',
date: '2019-09-10',
time: '20:30',
duration: 120,
side: 'left',
bgcolor: 'blue',
icon: 'fas fa-praying-hands',
img: 'images/scuolaopbenessere/img1.jpg',
where: 'Centro Shen',
// whereicon: 'shen.png',
teacher: 'Operatori',
avatar: 'cristina.png',
avatar2: 'elisa.png',
infoextra: '',
linkpdf: '',
},
],
} }

View File

@@ -1,8 +1,9 @@
const msg_website_enUs = { const msg_website_enUs = {
ws: { ws: {
sitename: 'Riso', sitename: 'Fiore Della Vita',
siteshortname: 'RISO', siteshortname: 'Fiore Della Vita',
botname: 'Riso BOT', description: '',
keywords: '',
}, },
products: { products: {
quantity: 'Quantità', quantity: 'Quantità',

View File

@@ -1,8 +1,9 @@
const msg_website_es = { const msg_website_es = {
ws: { ws: {
sitename: 'Riso', sitename: 'Fiore Della Vita',
siteshortname: 'RISO', siteshortname: 'Fiore Della Vita',
botname: 'Riso BOT', description: '',
keywords: '',
}, },
products: { products: {
quantity: 'Quantità', quantity: 'Quantità',

View File

@@ -1,8 +1,9 @@
const msg_website_fr = { const msg_website_fr = {
ws: { ws: {
sitename: 'Riso', sitename: 'Fiore Della Vita',
siteshortname: 'RISO', siteshortname: 'Fiore Della Vita',
botname: 'Riso BOT', description: '',
keywords: '',
}, },
homepage: { homepage: {
titlecontatti: 'CONTACTS', titlecontatti: 'CONTACTS',

View File

@@ -1,9 +1,9 @@
const msg_website_it = { const msg_website_it = {
ws: { ws: {
sitename: 'Riso', sitename: 'Fiore Della Vita',
siteshortname: 'RISO', siteshortname: 'Fiore Della Vita',
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: '',
}, },
products: { products: {
quantity: 'Quantità', quantity: 'Quantità',
@@ -131,7 +131,7 @@ const msg_website_it = {
color: 'Colore', color: 'Colore',
}, },
msg: { msg: {
myAppName: 'Riso', myAppName: 'Fiore della Vita',
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

@@ -1,8 +1,9 @@
const msg_website_pt = { const msg_website_pt = {
ws: { ws: {
sitename: 'Riso', sitename: 'Fiore Della Vita',
siteshortname: 'RISO', siteshortname: 'Fiore Della Vita',
botname: 'Riso BOT', description: '',
keywords: '',
}, },
pages: { pages: {
home: 'Home', home: 'Home',

View File

@@ -7,30 +7,6 @@ import {
import { func } from '@store/Modules/fieldsTable' import { func } from '@store/Modules/fieldsTable'
// const SHOW_PROJINTHEMENU = false
//
// let arrlistafavourite = []
// let arrlistaprojtutti = []
// let arrlistaprojmiei = []
// if (SHOW_PROJINTHEMENU) {
// arrlistaprojtutti = Projects.getters.listaprojects(RouteNames.projectsall)
// arrlistaprojmiei = Projects.getters.listaprojects(RouteNames.myprojects)
// arrlistafavourite = Projects.getters.listaprojects(RouteNames.favouriteprojects)
// }
// PROGETTI -> FAVORITI :
// if (arrlistafavourite.length > 0) {
// arrMenu.push({
// icon: 'favorite_border',
// nametranslate: 'pages.' + RouteNames.favouriteprojects,
// urlroute: RouteNames.favouriteprojects,
// level_parent: 0.0,
// level_child: 0.5,
// routes2: arrlistafavourite,
// idelem: ''
// })
// }
const firstPage = { const firstPage = {
active: true, active: true,
order: 5, order: 5,
@@ -46,7 +22,7 @@ const firstPage = {
function getDynamicPages(site: ISites): IListRoutes[] { function getDynamicPages(site: ISites): IListRoutes[] {
const baseroutes: IListRoutes[] = [ const baseroutes: IListRoutes[] = [
{ /*{
active: true, active: true,
order: 5, order: 5,
path: '/', path: '/',
@@ -57,61 +33,6 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: true, inmenu: true,
infooter: true, infooter: true,
}, },
{
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: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: 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,
order: 16,
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{ {
active: true, active: true,
order: 20, order: 20,
@@ -122,145 +43,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true }, meta: { requiresAuth: true },
inmenu: true, inmenu: true,
infooter: true, infooter: true,
}, },*/
{
active: true,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 120,
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 130,
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: site.confpages && site.confpages.enableGroups,
order: 132,
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
},
{
active: true,
order: 136,
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
}, {
active: true,
order: 137,
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
},
{
active: true,
path: '/separator',
name: 'separator',
order: 140,
isseparator: true,
inmenu: true,
},
{
active: true,
order: 130,
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 130,
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 135,
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 132,
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 150,
path: '/fundraising',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
inmenu: false,
infooter: false,
},
{
active: true,
order: 80,
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false
},
] ]
return baseroutes return baseroutes

View File

@@ -1,8 +1,8 @@
{ {
"name": "riso", "name": "piuchebuono",
"version": "0.6.1", "version": "2.0.1",
"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": "PiuCheBuono",
"productName": "Riso", "productName": "PiuCheBuono",
"author": "Paolo Arena", "author": "Paolo Arena",
"private": true, "private": true,
"keywords": [], "keywords": [],
@@ -123,18 +123,17 @@
"crypto": false "crypto": false
}, },
"browserslist": [ "browserslist": [
"last 80 Chrome versions", "last 100 Chrome versions",
"last 40 Firefox versions", "last 40 Firefox versions",
"last 10 Edge versions", "last 20 Edge versions",
"last 45 Safari versions", "last 55 Safari versions",
"last 80 Android versions", "last 90 Android versions",
"last 120 ChromeAndroid versions", "last 250 ChromeAndroid versions",
"last 30 FirefoxAndroid versions", "last 60 FirefoxAndroid versions",
"last 20 iOS versions", "last 35 iOS versions",
"last 10 Opera versions", "last 10 Opera versions",
"> 0.03%", "> 0.03%",
"not dead", "not dead"
"fully supports es6-module"
], ],
"engines": { "engines": {
"node": ">= 16.14.0", "node": ">= 16.14.0",

View File

@@ -147,7 +147,7 @@ module.exports = configure((ctx) => ({
}, },
devServer: { devServer: {
https: false, https: false,
port: 8084, port: 8088,
open: false, // opens browser window automatically open: false, // opens browser window automatically
headers: { headers: {
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
@@ -305,9 +305,9 @@ module.exports = configure((ctx) => ({
}, },
manifest: { manifest: {
name: 'Riso', name: 'Più che Buono',
short_name: 'Riso', short_name: 'PiuCheBuono',
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: 'PiuCheBuono è un GAS e Bottega',
display: 'standalone', display: 'standalone',
orientation: 'portrait', orientation: 'portrait',
background_color: '#fff', background_color: '#fff',
@@ -317,54 +317,54 @@ module.exports = configure((ctx) => ({
start_url: "/?homescreen=1", start_url: "/?homescreen=1",
icons: [ icons: [
{ {
src: 'images/riso-android-icon-512x512.png', src: 'images/fv-android-icon-512x512.png',
sizes: '512x512', sizes: '512x512',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-android-icon-384x384.png', src: 'images/fv-android-icon-384x384.png',
sizes: '384x384', sizes: '384x384',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-android-icon-192x192.png', src: 'images/fv-android-icon-192x192.png',
sizes: '192x192', sizes: '192x192',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-android-icon-144x144.png', src: 'images/fv-android-icon-144x144.png',
sizes: '144x144', sizes: '144x144',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-android-icon-96x96.png', src: 'images/fv-android-icon-96x96.png',
sizes: '96x96', sizes: '96x96',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-apple-icon-120x120.png', src: 'images/fv-apple-icon-120x120.png',
sizes: '120x120', sizes: '120x120',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-apple-icon-144x144.png', src: 'images/fv-apple-icon-144x144.png',
sizes: '144x144', sizes: '144x144',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-apple-icon-152x152.png', src: 'images/fv-apple-icon-152x152.png',
sizes: '152x152', sizes: '152x152',
type: 'image/png', type: 'image/png',
}, },
{ {
src: 'images/riso-apple-icon-180x180.png', src: 'images/fv-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.piuchebuono.app/manifest.json"
}] }]
}, },
}, },
@@ -399,7 +399,7 @@ module.exports = configure((ctx) => ({
builder: { builder: {
// https://www.electron.build/configuration/configuration // https://www.electron.build/configuration/configuration
appId: 'Riso', appId: 'PiuCheBuono',
}, },
// "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

@@ -364,7 +364,7 @@ module.exports = configure((ctx) => ({
], ],
related_applications: [{ related_applications: [{
"platform": "webapp", "platform": "webapp",
"url": "https://www.piuchebuono.app/manifest.json" "url": "https://www.riso.app/manifest.json"
}] }]
}, },
}, },

View File

@@ -75,7 +75,8 @@ export const shared_consts = {
BTN_LOGIN: 260, BTN_LOGIN: 260,
FOOTER: 270, FOOTER: 270,
PROFILETUTORIAL: 280, PROFILETUTORIAL: 280,
VISUVIDEOPROMOANDPDF: 290 VISUVIDEOPROMOANDPDF: 290,
ECOMMERCE: 300,
}, },
QUERYTYPE_MYGROUP: 1, QUERYTYPE_MYGROUP: 1,
@@ -1525,6 +1526,10 @@ export const shared_consts = {
value: 70, value: 70,
label: 'Calendario', label: 'Calendario',
}, },
{
value: 300,
label: 'E-COMMERCE',
},
], ],

View File

@@ -13,6 +13,7 @@ import { tools } from '@store/Modules/tools'
import { shared_consts } from '@/common/shared_vuejs' 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 { COpenStreetMap } from '@src/components/COpenStreetMap' import { COpenStreetMap } from '@src/components/COpenStreetMap'
import { CCardCarousel } from '@src/components/CCardCarousel' import { CCardCarousel } from '@src/components/CCardCarousel'
import { CMyPage } from '@src/components/CMyPage' import { CMyPage } from '@src/components/CMyPage'

View File

@@ -372,13 +372,7 @@
> >
<div class="landing__header"></div> <div class="landing__header"></div>
<div <div
class=" class="landing__hero-content row justify-center q-gutter-xs clgutter"
landing__hero-content
row
justify-center
q-gutter-xs
clgutter
"
> >
<div class="row">&nbsp;</div> <div class="row">&nbsp;</div>
<div class="flex justify-end"> <div class="flex justify-end">
@@ -390,13 +384,7 @@
{{ myel.container }}&nbsp; {{ myel.container }}&nbsp;
</div> </div>
<div <div
class=" class="text-subtitle1 shadow-max big text-italic q-pl-sm"
text-subtitle1
shadow-max
big
text-italic
q-pl-sm
"
> >
{{ myel.container2 }} {{ myel.container2 }}
</div> </div>
@@ -488,9 +476,13 @@
<div v-if="editOn" class="elemEdit">CCheckIfIsLogged</div> <div v-if="editOn" class="elemEdit">CCheckIfIsLogged</div>
<CCheckIfIsLogged :showalways="myel.container"></CCheckIfIsLogged> <CCheckIfIsLogged :showalways="myel.container"></CCheckIfIsLogged>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.VISUVIDEOPROMOANDPDF"> <div
v-else-if="myel.type === shared_consts.ELEMTYPE.VISUVIDEOPROMOANDPDF"
>
<div v-if="editOn" class="elemEdit">Visu Video Promo and PDF</div> <div v-if="editOn" class="elemEdit">Visu Video Promo and PDF</div>
<CVisuVideoPromoAndPDF :showalways="myel.container"></CVisuVideoPromoAndPDF> <CVisuVideoPromoAndPDF
:showalways="myel.container"
></CVisuVideoPromoAndPDF>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.INFO_VERSION"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.INFO_VERSION">
<div>Versione: {{ tools.getvers() }}</div> <div>Versione: {{ tools.getvers() }}</div>
@@ -537,6 +529,10 @@
<div v-if="editOn" class="elemEdit">Pagina Attività</div> <div v-if="editOn" class="elemEdit">Pagina Attività</div>
<CMyActivities></CMyActivities> <CMyActivities></CMyActivities>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.ECOMMERCE">
<div v-if="editOn" class="elemEdit">PRODOTTI ECOMMERCE:</div>
<CECommerce> </CECommerce>
</div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.NOTIFATTOP"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.NOTIFATTOP">
<div v-if="editOn" class="elemEdit">Notifiche in Cima</div> <div v-if="editOn" class="elemEdit">Notifiche in Cima</div>
<CNotifAtTop></CNotifAtTop> <CNotifAtTop></CNotifAtTop>
@@ -582,7 +578,6 @@
<span class="mybanner" <span class="mybanner"
>Chiudere e Riaprire la App, per completare l'Aggiornamento</span >Chiudere e Riaprire la App, per completare l'Aggiornamento</span
> >
</div> </div>
<div v-else> <div v-else>
<span class="mybanner" <span class="mybanner"
@@ -590,7 +585,6 @@
scomparire questo messaggio, chiudere e riaprire la pagina.</span scomparire questo messaggio, chiudere e riaprire la pagina.</span
> >
</div> </div>
</q-banner> </q-banner>
</div> </div>
<div v-else-if="myel.type === shared_consts.ELEMTYPE.BTN_REG"> <div v-else-if="myel.type === shared_consts.ELEMTYPE.BTN_REG">

View File

@@ -0,0 +1,5 @@
$heightBtn: 100%;
.card .product-image {
height: 300px;
}

View File

@@ -0,0 +1,59 @@
import { 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 { useProducts } from '@store/Products'
import { useI18n } from '@/boot/i18n'
import { toolsext } from '@store/Modules/toolsext'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
import { CProductCard } from '@src/components/CProductCard'
export default defineComponent({
name: 'CartList',
components: { CProductCard },
filters: {
capitalize(value: any) {
if (!value) {
return ''
}
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
},
props: {},
setup() {
const userStore = useUserStore()
const globalStore = useGlobalStore()
const productStore = useProducts()
const $router = useRouter()
const $q = useQuasar()
const { t } = useI18n();
function getCart() {
return productStore.getCart()
}
function getProducts() {
return productStore.getProducts()
}
function mounted() {
// Inizializza
}
onMounted(mounted)
return {
userStore,
costanti,
tools,
toolsext,
getCart,
getProducts,
}
}
})

View File

@@ -0,0 +1,21 @@
<template>
<q-page>
<div class="panel">
<div class="container">
<div class="row">
<div class="q-pa-md row items-start q-gutter-md" v-for="(product, index) in getProducts" :key="index">
<CProductCard :product="product"/>
</div>
</div>
</div>
</div>
</q-page>
</template>
<script lang="ts" src="./cartList.ts">
</script>
<style lang="scss" scoped>
@import './cartList';
</style>

View File

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

View File

@@ -0,0 +1,5 @@
$heightBtn: 100%;
.card .product-image {
height: 300px;
}

View File

@@ -0,0 +1,178 @@
import Vue from 'vue'
import { Component, Watch } from 'vue-property-decorator'
import { SingleProject } from '../../../components/projects/SingleProject/index'
import { CTodo } from '../../../components/todos/CTodo'
import { CProgress } from '../../../components/CProgress'
import { CDate } from '../../../components/CDate'
import { Action } from 'vuex'
import Products from '@src/store/Modules/Products'
import { CSingleCart } from '../../../components/CSingleCart'
import { CTitleBanner } from '@components'
import { tools } from '@src/store/Modules/tools'
import { ICart } from '@src/model'
import MixinBase from '@src/mixins/mixin-base'
import { shared_consts } from '@src/common/shared_vuejs'
const namespace: string = 'Products'
@Component({
name: 'checkOut',
components: { SingleProject, CProgress, CTodo, CDate, CSingleCart, CTitleBanner },
filters: {
capitalize(value) {
if (!value) {
return ''
}
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
})
export default class CheckOut extends MixinBase {
public $q: any
public mycart: ICart = {}
public myrec: any[]
public note: string = ''
public statusnow: number = shared_consts.OrderStatus.NONE
public conferma_carrello: boolean = false
public conferma_ordine: boolean = false
/*public $refs: {
singleproject: SingleProject[],
ctodo: CTodo
}*/
get getItemsCart() {
const cart = Products.getters.getCart()
return cart.items || null
}
get getNumItems() {
const cart = Products.getters.getCart()
if (!!cart.items)
return cart.items.length || 0
else
return 0
}
get getCart() {
return Products.getters.getCart()
}
get getNote() {
const cart = Products.getters.getCart()
return cart.note
}
public change_field(fieldname) {
if (this.myrec[fieldname] !== this[fieldname]) {
this.myrec[fieldname] = this[fieldname]
const mydata = {
[fieldname]: this.myrec[fieldname]
}
const aggiorna = fieldname !== 'status'
tools.saveFieldToServer(this, 'carts', this.mycart._id, mydata, aggiorna)
}
}
get myTotalPrice() {
if (Products.state.cart && Products.state.cart.totalPrice) {
return Products.state.cart.totalPrice.toFixed(2)
} else {
return 0
}
}
get myTotalQty() {
if (Products.state.cart) {
return Products.state.cart.totalQty
} else {
return 0
}
}
public async mounted() {
// Products.actions.loadCart()
this.load()
}
public async load() {
this.mycart = this.getCart
this.myrec = Object.keys(this.mycart)
this.note = this.mycart.note
if (this.mycart)
this.statusnow = await Products.actions.UpdateStatusCart({ cart_id: this.mycart._id, status })
console.log('myrec', this.myrec)
}
public CanBeShipped() {
return Products.state.cart.items.filter((rec) => rec.order.product.canBeShipped).length
}
public CanBeBuyOnline() {
return Products.state.cart.items.filter((rec) => rec.order.product.canBeBuyOnline).length
}
get getnumsteps() {
let numsteps = 1
if (this.CanBeShipped())
numsteps++
if (this.CanBeBuyOnline())
numsteps++
return numsteps
}
public docheckout() {
// Può essere spedito?
if (this.CanBeShipped()) {
// mostra form di spedizione
}
if (this.CanBeBuyOnline()) {
// mostra form di acquisto Online
}
}
get nextstep() {
return 0
}
public completeOrder() {
this.$q.dialog({
message: 'Confermare l\'ordine di acquisto di ' + this.myTotalQty + ' prodotti ?',
ok: {
label: this.$t('dialog.yes'),
push: true
},
cancel: {
label: this.$t('dialog.cancel')
},
title: 'Ordine'
}).onOk(async () => {
const status = shared_consts.OrderStatus.CHECKOUT_SENT
this.statusnow = await Products.actions.UpdateStatusCart({ cart_id: this.mycart._id, status })
if (this.statusnow === status) {
tools.showPositiveNotif(this.$q, 'Ordine Confermato')
setTimeout(() => {
this.$router.push('/orderinfo')
}, 2000)
}
// this.change_field('status')
// this.change_field('status')
})
}
}

View File

@@ -0,0 +1,44 @@
<template>
<q-page>
<CTitleBanner title="Carrello"></CTitleBanner>
<div class="panel">
<div>
<div class="container">
<div class="q-pa-sm col items-start q-gutter-xs" v-for="(itemorder, index) in getItemsCart" :key="index">
<CSingleCart :order="itemorder.order" :showall="true"/>
</div>
</div>
<q-separator></q-separator>
<div class="col-6 q-mr-sm" style="text-align: right">
<span class="text-grey q-mr-xs">Totale:</span> <span
class="text-subtitle1 q-mr-sm "> {{ myTotalPrice }}</span>
</div>
<q-input v-if="getNumItems > 0" v-model="note" style="max-width: 400px;" label="Scrivi qui per eventuali note o chiarimenti:"
filled dense
debounce="1000"
autogrow
@input="change_field('note')">
</q-input>
<br>
</div>
<q-stepper-navigation>
<q-btn v-if="statusnow < shared_consts.OrderStatus.CHECKOUT_SENT" rounded icon="fas fa-shopping-cart" color="green" label="Completa l'Ordine" class="q-mb-sm"
:disabled="myTotalQty < 1"
@click="completeOrder"></q-btn>
</q-stepper-navigation>
</div>
</q-page>
</template>
<script lang="ts" src="./checkOut.ts">
</script>
<style lang="scss" scoped>
@import './checkOut';
</style>

View File

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

1
src/views/ecommerce/index.ts Executable file
View File

@@ -0,0 +1 @@
export * from './productsList'

View File

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

View File

@@ -0,0 +1,14 @@
$heightBtn: 100%;
.card .product-image {
height: 300px;
}
.mycol{
color:gray;
}
.q-item__label--caption{
color: blue;
}

View File

@@ -0,0 +1,227 @@
import Vue from 'vue'
import { Component, Watch } from 'vue-property-decorator'
import { SingleProject } from '../../../components/projects/SingleProject/index'
import { CTodo } from '../../../components/todos/CTodo'
import { CProgress } from '../../../components/CProgress'
import { CDate } from '../../../components/CDate'
import { Action } from 'vuex'
import Products from '@src/store/Modules/Products'
import { CSingleCart } from '../../../components/CSingleCart'
import { CTitleBanner } from '@components'
import { tools } from '@src/store/Modules/tools'
import { ICart, IOrderCart } from '@src/model'
import MixinBase from '@src/mixins/mixin-base'
import { shared_consts } from '@src/common/shared_vuejs'
const namespace: string = 'Products'
@Component({
name: 'checkOut',
components: { SingleProject, CProgress, CTodo, CDate, CSingleCart, CTitleBanner },
filters: {
capitalize(value) {
if (!value) {
return ''
}
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
})
export default class OrderInfo extends MixinBase {
public $q: any
public myorderscart: IOrderCart[] = []
public myarrrec: any = {}
public conferma_carrello: boolean = false
public conferma_ordine: boolean = false
public taborders: string = 'incorso'
public filter: string = ''
public statusnow: number = 0
public arrnumstatus: any = []
public columns = [
{
name: 'numorder',
required: true,
align: 'left',
label: 'Numero Ordine',
field: 'numorder',
sortable: true
},
{
name: 'nameSurname',
required: true,
align: 'left',
label: 'Nome',
field: 'nameSurname',
sortable: true
},
{
name: 'created_at',
required: true,
align: 'center',
label: 'Effettuato il',
field: 'created_at',
sortable: true
},
{
name: 'items',
required: true,
label: 'Articoli',
field: 'items',
sortable: true
},
{
name: 'totalPrice',
required: true,
label: 'Totale',
field: 'totalPrice',
sortable: true
},
{
name: 'status',
align: 'center',
required: true,
label: 'Stato',
field: 'status',
sortable: true
}
]
/*public $refs: {
singleproject: SingleProject[],
ctodo: CTodo
}*/
get getOrdersCart() {
return Products.getters.getOrdersCart(this.taborders)
}
get getAllOrdersCart() {
return Products.getters.getOrdersAllCart()
}
public change_field(myorderid, fieldname) {
if (this.myarrrec[myorderid][fieldname] !== this[fieldname]) {
this.myarrrec[myorderid][fieldname] = this[fieldname]
const mydata = {
[fieldname]: this.myarrrec[myorderid][fieldname]
}
const aggiorna = fieldname !== 'status'
tools.saveFieldToServer(this, 'orderscart', myorderid, mydata, aggiorna)
}
}
public updateorders() {
this.myorderscart = this.getOrdersCart
for (const ordercart of this.myorderscart) {
this.myarrrec[ordercart._id] = Object.keys(ordercart)
}
const allorders = this.getAllOrdersCart
for (const status of [
2,
3,
4,
6,
10
]) {
this.arrnumstatus[status] = allorders.filter((rec) => (rec.status === status)).reduce((sum, item) => sum + 1, 0)
}
}
public mounted() {
this.updateorders()
console.log('arrnumstatus;')
console.log(this.arrnumstatus)
this.columns = [...this.columns,
{
name: 'comandi',
align: 'center',
required: false,
label: 'Comandi',
field: 'comandi',
sortable: false
}]
}
public CanBeShipped() {
return Products.state.cart.items.filter((rec) => rec.order.product.canBeShipped).length
}
public CanBeBuyOnline() {
return Products.state.cart.items.filter((rec) => rec.order.product.canBeBuyOnline).length
}
get getnumsteps() {
let numsteps = 1
if (this.CanBeShipped())
numsteps++
if (this.CanBeBuyOnline())
numsteps++
return numsteps
}
public docheckout() {
// Può essere spedito?
if (this.CanBeShipped()) {
// mostra form di spedizione
}
if (this.CanBeBuyOnline()) {
// mostra form di acquisto Online
}
}
get nextstep() {
return 0
}
public clickFunz(order, status) {
if (status === shared_consts.OrderStatus.ORDER_CONFIRMED) {
// Conferma Ordine
}
const statusStr = shared_consts.getStatusStr(status)
this.$q.dialog({
message: 'Impostare l\'ordine n. ' + order.numorder + ' ' + statusStr + ' ?',
ok: {
label: this.$t('dialog.yes'),
push: true
},
cancel: {
label: this.$t('dialog.cancel')
},
title: 'Ordine'
}).onOk(async () => {
this.statusnow = await Products.actions.UpdateOrderStatus({ order_id: order._id, status })
if (this.statusnow === status) {
order.status = this.statusnow
this.updateorders()
tools.showPositiveNotif(this.$q, 'Ordine ' + statusStr)
}
// this.change_field('status')
// this.change_field('status')
})
}
}

View File

@@ -0,0 +1,191 @@
<template>
<q-page>
<CTitleBanner title="Ordini"></CTitleBanner>
<div class="panel">
<q-tabs
v-model="taborders"
inline-label
class="text-blue"
>
<q-tab class="text-black" v-if="this.arrnumstatus[2] > 0" name="incorso" icon="fas fa-tasks" :label="`(` + this.arrnumstatus[2] +`) in Corso`"/>
<q-tab class="text-blue" v-if="this.arrnumstatus[3] > 0" name="confermati" icon="fas fa-calendar" :label="`(` + this.arrnumstatus[3] +`) Confermati`"/>
<q-tab class="text-green" v-if="this.arrnumstatus[4] > 0" name="pagati" icon="fas fa-calendar" :label="`(` + this.arrnumstatus[4] +`) Pagati`"/>
<q-tab class="text-blue-grey-8" v-if="this.arrnumstatus[6] > 0" name="completati" icon="fas fa-check" :label="`(` + this.arrnumstatus[6] +`) Completati`"/>
<q-tab class="text-red" v-if="this.arrnumstatus[10] > 0" name="cancellati" icon="delete" :label="`(` + this.arrnumstatus[10] +`) Cancellati`"/>
</q-tabs>
<div class="q-pa-sm">
<q-table
:grid="$q.screen.lt.sm"
:hide-header="$q.screen.lt.sm"
:columns="columns"
row-key="numorder"
:data="getOrdersCart">
<template v-if="$q.screen.lt.sm" v-slot:item="props">
<div class="q-pa-xs col-xs-12 col-sm-6 col-md-4">
<q-card class="my-card-shadow yes_shadow">
<q-list dense>
<q-item v-for="col in props.cols.filter(col => col.name !== 'desc')" :key="col.name">
<q-item-section>
<q-item-label>{{ col.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label v-if="col.name === 'created_at'" caption>{{
tools.getstrDateTime(col.value)
}}
<span v-if="taborders === 'completati'">
<br>Completato il: {{ tools.getstrDateTime(props.row.completed_at) }}
</span>
</q-item-label>
<q-item-label v-else-if="col.name === 'items'" caption>
<div v-for="item of props.row.items">
<div v-if="!!item.order.product">
{{ item.order.product.name }} ({{ item.order.quantity }})<br>
</div>
</div>
</q-item-label>
<q-item-label v-else-if="col.name === 'totalPrice'" caption>
{{ props.row.totalPrice }}
</q-item-label>
<q-item-label v-else-if="col.name === 'status'" caption>
{{ shared_consts.getStatusStr(props.row.status) }}
</q-item-label>
<q-item-label v-else caption>{{ col.value }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-card>
</div>
</template>
<template v-else v-slot:body="props">
<q-tr :props="props">
<q-td key="numorder" :props="props">
&nbsp; n. {{ props.row.numorder }}
</q-td>
<q-td key="nameSurname" :props="props">
{{ props.row.nameSurname }}
</q-td>
<q-td key="created_at" :props="props">
{{ tools.getstrDateTime(props.row.created_at) }}
<span v-if="taborders === 'completati'">
<br>Completato il:<br>{{ tools.getstrDateTime(props.row.completed_at) }}
</span>
</q-td>
<q-td key="items" :props="props">
<div v-for="item of props.row.items">
<div v-if="!!item.order.product">
{{ item.order.product.name }} ({{ item.order.quantity }})<br>
</div>
</div>
</q-td>
<q-td key="totalPrice" :props="props">
{{ props.row.totalPrice }}
</q-td>
<q-td key="status" :props="props">
<span :class="props.row.status">{{ shared_consts.getStatusStr(props.row.status) }}</span>
</q-td>
<q-td key="comandi" :props="props">
Bottone:
<div v-if="tools.isManager()" class="q-pa-sm">
<q-btn-dropdown rounded dense label="Azioni">
<q-list class="text-primary">
<q-item clickable v-close-popup
@click="clickFunz(props.row, shared_consts.OrderStatus.ORDER_CONFIRMED)">
<q-item-section avatar>
<q-avatar icon="fas fa-list-ol" color="grey" text-color="white"/>
</q-item-section>
<q-item-section>
<q-item-label>Inviato</q-item-label>
</q-item-section>
</q-item>
<q-item clickable v-close-popup
@click="clickFunz(props.row, shared_consts.OrderStatus.ORDER_CONFIRMED)">
<q-item-section avatar>
<q-avatar icon="fas fa-calendar-check" color="secondary" text-color="white"/>
</q-item-section>
<q-item-section>
<q-item-label>Confermato</q-item-label>
</q-item-section>
</q-item>
<q-item clickable v-close-popup @click="clickFunz(props.row, shared_consts.OrderStatus.PAYED)"
color="blue">
<q-item-section avatar>
<q-avatar icon="money" color="positive" text-color="white"/>
</q-item-section>
<q-item-section>
<q-item-label>Pagato</q-item-label>
</q-item-section>
</q-item>
<q-item clickable v-close-popup @click="clickFunz(props.row, shared_consts.OrderStatus.RECEIVED)"
color="blue">
<q-item-section avatar>
<q-avatar icon="fas fa-check" color="primary" text-color="white"/>
</q-item-section>
<q-item-section>
<q-item-label>Completato</q-item-label>
</q-item-section>
</q-item>
<q-item clickable v-close-popup @click="clickFunz(props.row, shared_consts.OrderStatus.CANCELED)"
color="blue">
<q-item-section avatar>
<q-avatar icon="delete" color="negative" text-color="white"/>
</q-item-section>
<q-item-section>
<q-item-label>Cancellato</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</div>
</q-td>
</q-tr>
</template>
</q-table>
</div>
<!--
<div v-for="(ordercart, index) in getOrdersCart" :key="index">
<div>
{{ ordercart.numorder }}<br>
</div>
<div class="container">
<div class="q-pa-sm col items-start q-gutter-xs" v-for="(itemorder, index) in ordercart.items" :key="index">
<CSingleCart :order="itemorder.order" :showall="true" :nomodif="true"/>
</div>
</div>
<q-separator></q-separator>
<div class="col-6 q-mr-sm" style="text-align: right">
<span class="text-grey q-mr-xs">Totale:</span> <span
class="text-subtitle1 q-mr-sm "> {{ ordercart.totalPrice.toFixed(2) }}</span>
</div>
<q-input v-model="ordercart.note" style="max-width: 400px;" label="Note aggiuntive:"
filled dense
debounce="1000"
autogrow
@input="change_field(ordercart.id, 'note')">
</q-input>
<br>
</div>
-->
</div>
</q-page>
</template>
<script lang="ts" src="./orderInfo.ts">
</script>
<style lang="scss" scoped>
@import './orderInfo';
</style>

View File

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

View File

@@ -0,0 +1,5 @@
$heightBtn: 100%;
.card .product-image {
height: 300px;
}

View File

@@ -0,0 +1,51 @@
import Vue from 'vue'
import { Component, Prop, Watch } from 'vue-property-decorator'
import {
IAction,
IDrag, IProduct,
IProductsState, ITodo, ITodosState,
TypeProj
} from '../../../model/index'
import { SingleProject } from '../../../components/projects/SingleProject/index'
import { CTodo } from '../../../components/todos/CTodo'
import { tools } from '../../../store/Modules/tools'
import { toolsext } from '@src/store/Modules/toolsext'
import { lists } from '../../../store/Modules/lists'
import * as ApiTables from '../../../store/Modules/ApiTables'
import { GlobalStore, Projects, Todos } from '@store'
import { UserStore } from '@store'
import { Getter } from 'vuex-class'
import { date, Screen } from 'quasar'
import { CProgress } from '../../../components/CProgress'
import { CDate } from '../../../components/CDate'
import { RouteNames } from '@src/router/route-names'
import { CProductCard } from '@src/components/CProductCard'
import { Action } from 'vuex'
import Products from '@src/store/Modules/Products'
const namespace: string = 'Products'
@Component({
name: 'ProductInfo',
components: { SingleProject, CProgress, CTodo, CDate, CProductCard }
})
export default class ProductInfo extends Vue {
public $q: any
public code: string = ''
public created() {
console.log('created productInfo')
console.log(this.$route)
if (!!this.$route.params.codprod) {
this.code = this.$route.params.codprod.toString()
}
console.log('this.code', this.code)
}
}

View File

@@ -0,0 +1,19 @@
<template>
<q-page>
<div class="panel">
<div class="container">
<div class="row">
<CProductCard :code="code" complete="true"/>
</div>
</div>
</div>
</q-page>
</template>
<script lang="ts" src="./productInfo.ts">
</script>
<style lang="scss" scoped>
@import './productInfo';
</style>

View File

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

View File

@@ -0,0 +1,5 @@
$heightBtn: 100%;
.card .product-image {
height: 300px;
}

View File

@@ -0,0 +1,55 @@
import { 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 { useProducts } from '@store/Products'
import { useI18n } from '@/boot/i18n'
import { toolsext } from '@store/Modules/toolsext'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
import { CProductCard } from '@src/components/CProductCard'
export default defineComponent({
name: 'ProductsList',
components: { CProductCard },
filters: {
capitalize(value: any) {
if (!value) {
return ''
}
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
},
props: {},
setup() {
const userStore = useUserStore()
const globalStore = useGlobalStore()
const productStore = useProducts()
const $router = useRouter()
const $q = useQuasar()
const { t } = useI18n();
function mounted() {
// Inizializza
productStore.loadProducts()
}
function getProducts() {
return productStore.getProducts()
}
onMounted(mounted)
return {
userStore,
costanti,
tools,
toolsext,
getProducts,
}
}
})

View File

@@ -0,0 +1,21 @@
<template>
<q-page>
<div class="panel">
<div class="container">
<div class="row">
<div class="q-pa-md row items-start q-gutter-md" v-for="(product, index) in getProducts" :key="index">
<CProductCard :product="product" :complete="false"/>
</div>
</div>
</div>
</div>
</q-page>
</template>
<script lang="ts" src="./productsList.ts">
</script>
<style lang="scss" scoped>
@import './productsList';
</style>

View File

@@ -0,0 +1,40 @@
import { 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 { useProducts } from '@store/Products'
import { useI18n } from '@/boot/i18n'
import { toolsext } from '@store/Modules/toolsext'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
export default defineComponent({
name: 'Scheletro',
components: { },
props: {},
setup() {
const userStore = useUserStore()
const globalStore = useGlobalStore()
const productStore = useProducts()
const $router = useRouter()
const $q = useQuasar()
const { t } = useI18n();
function mounted() {
// Inizializza
}
onMounted(mounted)
return {
userStore,
costanti,
tools,
toolsext,
}
}
})

View File

@@ -0,0 +1,4 @@
<template>
<div>
</div>
</template>