- catalogo

- corretto logica del RefreshToken che non richiedeva il nuovo token, quindi scadeva tutte le volte, richiedendo sempre l'accesso !
This commit is contained in:
Surya Paolo
2025-01-07 17:17:08 +01:00
parent ce86dd51a8
commit 3734762a8b
72 changed files with 2112 additions and 3592650 deletions

View File

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

View File

@@ -90,7 +90,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: true,
},
{
active: true,
active: site.confpages && site.confpages.enableEvents,
order: 20,
path: '/events',
materialIcon: 'fas fa-bullhorn',
@@ -112,7 +112,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: false,
},
{
active: true,
active: site.confpages && site.confpages.showProfile,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
@@ -123,7 +123,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: true,
},
{
active: true,
active: site.confpages && site.confpages.showProfile,
order: 120,
path: '/editprofile',
materialIcon: 'fas fa-user',
@@ -134,7 +134,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: false,
},
{
active: true,
active: site.confpages && site.confpages.showiscrittiMenu,
order: 130,
path: '/friends',
materialIcon: 'fas fa-user-friends',
@@ -229,16 +229,6 @@ function getDynamicPages(site: ISites): IListRoutes[] {
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,

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

BIN
public/images/ferrara.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 KiB

BIN
public/images/riso_home.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -17,6 +17,8 @@ const webpack = require('webpack')
const helpers = require('./helpers')
const envparser = require('./config/envparser')
const package = require('./package.json');
// const ESLintPlugin = require('eslint-webpack-plugin')
module.exports = configure((ctx) => ({
@@ -87,6 +89,7 @@ module.exports = configure((ctx) => ({
// Full list of options: https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build
build: {
env: envparser(),
versionCode: package.version,
vueRouterMode: 'history',
vueCompiler: true,
gzip: false, // gzip true
@@ -149,9 +152,9 @@ module.exports = configure((ctx) => ({
},
devServer: {
https: false,
port: 8089,
port: 8084,
open: false, // opens browser window automatically
hot: true, // Disable hot module replacement
hot: false, // Disable hot module replacement
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
@@ -248,6 +251,8 @@ module.exports = configure((ctx) => ({
'Cookies',
'Loading',
'AppVisibility',
'LocalStorage',
'SessionStorage',
],
get plugins_1() {
return this._plugins;
@@ -308,9 +313,9 @@ module.exports = configure((ctx) => ({
},
manifest: {
name: 'Gruppo Macro',
short_name: 'GruppoMacro',
description: '',
name: 'Riso',
short_name: 'Riso',
description: 'Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.',
display: 'standalone',
orientation: 'portrait',
background_color: '#fff',
@@ -320,24 +325,54 @@ module.exports = configure((ctx) => ({
start_url: "/?homescreen=1",
icons: [
{
src: 'images/gm-android-icon-512x512.png',
src: 'images/riso-android-icon-512x512.png',
sizes: '512x512',
type: 'image/png',
},
{
src: 'images/gm-android-icon-192x192.png',
src: 'images/riso-android-icon-384x384.png',
sizes: '384x384',
type: 'image/png',
},
{
src: 'images/riso-android-icon-192x192.png',
sizes: '192x192',
type: 'image/png',
},
{
src: 'images/gm-apple-touch-icon.png',
src: 'images/riso-android-icon-144x144.png',
sizes: '144x144',
type: 'image/png',
},
{
src: 'images/riso-android-icon-96x96.png',
sizes: '96x96',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-120x120.png',
sizes: '120x120',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-144x144.png',
sizes: '144x144',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-152x152.png',
sizes: '152x152',
type: 'image/png',
},
{
src: 'images/riso-apple-icon-180x180.png',
sizes: '180x180',
type: 'image/png',
},
],
related_applications: [{
"platform": "webapp",
"url": "https://www.gruppomacro.app/manifest.json"
"url": "https://www.riso.app/manifest.json"
}]
},
},
@@ -372,7 +407,7 @@ module.exports = configure((ctx) => ({
builder: {
// https://www.electron.build/configuration/configuration
appId: 'GruppoMacro',
appId: 'Riso',
},
// "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain

View File

@@ -1603,6 +1603,8 @@ export const shared_consts = {
CIRCUIT_PARAMS: {
SCOPERTO_MIN_GRP: 200,
SCOPERTO_MAX_GRP: 400,
SCOPERTO_MIN_CONTO_COMUNITARIO: 500,
SCOPERTO_MAX_CONTO_COMUNITARIO: 1000,
},
FontsInstalled: [
@@ -2017,11 +2019,18 @@ export const shared_consts = {
fido_scoperto_default: 1,
deperimento: 1,
showAlways: 1,
ignoreLimits: 1,
askManagerToEnter: 1,
sendEmailAfterAskingToEnter: 1,
circuitoIndipendente: 1,
creditodiPartenza: 1,
status: 1,
transactionsEnabled: 1,
qta_max_default: 1,
fido_scoperto_default_grp: 1,
qta_max_default_grp: 1,
fido_scoperto_default_contocom: 1,
qta_max_default_contocom: 1,
valuta_per_euro: 1,
symbol: 1,
idCity: 1,
@@ -2236,25 +2245,32 @@ export const shared_consts = {
PRODUCT: 1000,
},
ORDINAMENTO_CATALOGHI: [
{
label: '[Default]',
value: 0,
},
{
label: 'Data di Uscita',
value: 1,
},
{
label: 'Bestseller',
value: 2,
},
{
label: 'Alfabetico',
value: 0,
},
ORDINAMENTO_CATALOGHI_PUBBLICO: [
{ label: '[Nessuno]', value: '' },
{ label: 'Alfabetico', value: 'name' },
{ label: 'Data di Pubblicazione', value: 'date_pub_ts' },
],
ORDINAMENTO_CATALOGHI: [
{ label: '[Nessuno]', value: '' },
{ label: 'Alfabetico', value: 'name' },
{ label: 'Data di Pubblicazione', value: 'date_pub_ts' },
{ label: 'Totale Venduti', value: 'totVen' },
{ label: 'Totale Fatturati', value: 'totFat' },
{ label: 'Venduti Ultimi 3 Mesi', value: 'vLast3M' },
{ label: 'Venduti Ultimi 6 Mesi', value: 'vLast6M' },
{ label: 'Venduti Ultimo Anno', value: 'vLastY' },
{ label: 'Venduti Ultimi 2 Anni', value: 'vLast2Y' },
{ label: 'Fatturati Ultimi 3 Mesi', value: 'fatLast3M' },
{ label: 'Data Ultimo Ordine', value: 'dataUltimoOrdine' },
],
ORDINAMENTO_DIREZIONE: [
{ label: 'Ascendente', value: 1 },
{ label: 'Discendente', value: -1 },
],
VERSIONI_PRODOTTO: [
{
label: '[Nessuno]',

View File

@@ -64,6 +64,7 @@ export default defineComponent({
// Funzione per disegnare il codice a barre
const drawBarcode = () => {
if (value.value) {
JsBarcode("#C" + value.value, value.value, {
format: format.value,
width: widthlines.value,
@@ -75,9 +76,10 @@ export default defineComponent({
textMargin: 0,
marginTop: 0,
fontSize: fontsize.value,
textPosition:"bottom",
textPosition: "bottom",
});
}
}
// Chiamato quando il componente è montato
onMounted(() => {

View File

@@ -711,6 +711,30 @@
</div>
</div>
<div class="row bg-blue-4">
<div class="etichetta">Fatturati:</div>
<CMyValueDb
:editOn="modifOn"
table="productinfos"
:id="myproduct.productInfo._id"
:rec="myproduct.productInfo"
mykey="totFat"
debounce="1000"
:save="updateproductmodif()"
:type="costanti.FieldType.number"
>
</CMyValueDb>
<div class="etichetta">Fatturati Ultimi 3 Mese:</div>
<CMyValueDb
:editOn="modifOn"
table="productinfos"
:id="myproduct.productInfo._id"
:rec="myproduct.productInfo"
mykey="fatLast3M"
debounce="1000"
:save="updateproductmodif()"
:type="costanti.FieldType.number"
>
</CMyValueDb>
<div class="etichetta">Venduti:</div>
<CMyValueDb
:editOn="modifOn"
@@ -723,7 +747,7 @@
:type="costanti.FieldType.number"
>
</CMyValueDb>
<div class="etichetta">Venduti Ultimo Mese:</div>
<div class="etichetta">Venduti Ultimi 3 Mesi:</div>
<CMyValueDb
:editOn="modifOn"
table="productinfos"

View File

@@ -46,6 +46,11 @@ export default defineComponent({
required: false,
default: false,
},
labelBtnAddExtra: {
type: String,
required: false,
default: '',
},
selector: {
type: Object,
required: false,

View File

@@ -43,7 +43,7 @@
labelBtnAddRow="NONE"
:prop_SortFieldsAvailable="mySortFieldsAvailable"
:labelBtnAddExtra_OFF="noButtAdd ? `` : (ind >= 0) ? `Aggiungi ` + costanti.MAINCARDS[ind].strsingolo : ''"
labelBtnAddExtra=""
:labelBtnAddExtra="labelBtnAddExtra"
:extraparams="tools.extraparams(table, {myrecfiltertoggle})"
:prop_showMap="showMap"
@clickButtBar="clickButtBar"

View File

@@ -21,7 +21,13 @@
<q-spinner v-if="loadSaldo" color="primary" size="3em" :thickness="2" />
</div>
<q-btn
v-if="myaccount && !loadSaldo && (grp ? tools.iAmAdminGroup(grp.groupname) : tools.iAmAdminCircuit(circuit.name))"
v-if="
myaccount &&
!loadSaldo &&
(grp
? tools.iAmAdminGroup(grp.groupname)
: tools.iAmAdminCircuit(circuit.name))
"
outline
rounded
dense
@@ -61,6 +67,7 @@
<div :class="$q.screen.lt.sm ? '' : 'row'">
<div class="sezioni">
<CCurrencyV2
v-if="!circuit.ignoreLimits"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="red"
@@ -77,6 +84,7 @@
</div>
<div class="sezioni">
<CCurrencyV2
v-if="!circuit.ignoreLimits"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="green"

View File

@@ -27,11 +27,11 @@
:class="
`q-ma-sm ` + ($q.dark.isActive ? `text-white` : `text-black`)
"
>{{ circuit.numMembers }}</span>
>{{ circuit.numMembers }}</span
>
<q-icon name="fas fa-users" size="xs" color="blue"></q-icon>
</div>
<div v-if="circuit.link_group" :class="` `">
<q-btn
icon="fab fa-telegram"
size="xs"
@@ -107,15 +107,19 @@
caption
lines="1"
>
<q-icon v-if="!circuit.transactionsEnabled" name="fas fa-lock"></q-icon>
<q-icon
v-if="!circuit.transactionsEnabled"
name="fas fa-lock"
></q-icon>
<span class="text-red text-weight-bold">
{{
$t('circuit.transaction_suspended')
}}
{{ $t('circuit.transaction_suspended') }}
</span>
</q-item-label>
<q-item-label @click="naviga(tools.getPathByTableAndRec(table, circuit))" lines="1">
<q-item-label
@click="naviga(tools.getPathByTableAndRec(table, circuit))"
lines="1"
>
<CSaldo
v-if="tools.isUserOk() && username === myusername() && account"
:account="account"
@@ -141,7 +145,9 @@
inline-actions
class="bg-blue text-white"
>
<span v-html="$t('circuit.entra_italia_solo_dopo_aver_fido')"></span>
<span
v-html="$t('circuit.entra_italia_solo_dopo_aver_fido')"
></span>
</q-banner>
<q-banner v-else inline-actions class="bg-blue text-white">
<span v-html="$t('circuit.non_entrato')"></span>
@@ -153,10 +159,14 @@
!userStore.IsRefusedCircuitByName(circuit.name)
"
color="positive"
:label="$t('circuit.apri')"
:label="
circuit.askManagerToEnter
? $t('circuit.ask')
: $t('circuit.apri')
"
@click="
requestToEnterCircuit = true;
groupnameSel = null;
groupnameSel = null;
"
/>
</template>
@@ -165,7 +175,10 @@ groupnameSel = null;
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.USER_CIRCUITS && tools.isUserOk()">
<q-item-section
side
v-if="visu === costanti.USER_CIRCUITS && tools.isUserOk()"
>
<q-item-label>
<q-btn
rounded
@@ -197,7 +210,11 @@ groupnameSel = null;
)
"
>
<q-item-section>{{ $t('circuit.ask') }}</q-item-section>
<q-item-section>{{
circuit.askManagerToEnter
? $t('circuit.ask')
: $t('circuit.enter')
}}</q-item-section>
</q-item>
</q-list>
<q-list
@@ -222,9 +239,7 @@ groupnameSel = null;
"
>
<q-item-section>
{{
$t('shared.refuse_ask')
}}
{{ $t('shared.refuse_ask') }}
</q-item-section>
</q-item>
<q-item
@@ -241,14 +256,15 @@ groupnameSel = null;
"
>
<q-item-section>
{{
$t('shared.cancel_ask')
}}
{{ $t('shared.cancel_ask') }}
</q-item-section>
</q-item>
</q-list>
<q-list
v-else-if="userStore.IsMyCircuitByName(circuit.name) && (saldo === 0 || !saldo)"
v-else-if="
userStore.IsMyCircuitByName(circuit.name) &&
(saldo === 0 || !saldo)
"
style="min-width: 200px"
>
<q-item
@@ -288,7 +304,10 @@ groupnameSel = null;
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.REQ_CIRCUIT && tools.isUserOk()">
<q-item-section
side
v-if="visu === costanti.REQ_CIRCUIT && tools.isUserOk()"
>
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
@@ -309,9 +328,7 @@ groupnameSel = null;
"
>
<q-item-section>
{{
$t('circuit.reject_ask')
}}
{{ $t('circuit.reject_ask') }}
</q-item-section>
</q-item>
</q-list>
@@ -319,7 +336,10 @@ groupnameSel = null;
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.ASK_SENT_CIRCUIT && tools.isUserOk()">
<q-item-section
side
v-if="visu === costanti.ASK_SENT_CIRCUIT && tools.isUserOk()"
>
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
@@ -340,9 +360,7 @@ groupnameSel = null;
"
>
<q-item-section>
{{
$t('shared.refuse_ask')
}}
{{ $t('shared.refuse_ask') }}
</q-item-section>
</q-item>
<q-item
@@ -361,9 +379,7 @@ groupnameSel = null;
"
>
<q-item-section>
{{
$t('shared.cancel_ask')
}}
{{ $t('shared.cancel_ask') }}
</q-item-section>
</q-item>
</q-list>
@@ -373,7 +389,10 @@ groupnameSel = null;
</q-item-section>
</q-item>
<div class="centermydiv text-center" v-if="visu === costanti.ENTER_TO_THE_CIRCUIT">
<div
class="centermydiv text-center"
v-if="visu === costanti.ENTER_TO_THE_CIRCUIT"
>
<q-btn
v-if="
!userStore.IsMyCircuitByName(circuit.name) &&
@@ -382,23 +401,37 @@ groupnameSel = null;
"
icon="fas fa-user-plus"
color="primary"
:label="$t('circuit.ask')"
:label="
circuit.askManagerToEnter ? $t('circuit.ask') : $t('circuit.enter')
"
rounded
@click="
requestToEnterCircuit = true;
groupnameSel = null;
groupnameSel = null;
"
/>
<q-btn v-if="userStore.IsMyCircuitByName(circuit.name)" rounded icon="fas fa-ellipsis-h">
<q-btn
v-if="userStore.IsMyCircuitByName(circuit.name)"
rounded
icon="fas fa-ellipsis-h"
>
<q-menu>
<q-list v-if="true" style="min-width: 150px">
<q-item
clickable
v-close-popup
v-if="true"
@click="(saldo !== 0) ?
tools.showNegativeNotif($q, t('circuit.per_uscire_dal_circuito_occorre_essere_a_zero'), 30000) :
tools.removeFromMyCircuits(
@click="
(saldo < 0)
? tools.showNegativeNotif(
$q,
t(
'circuit.per_uscire_dal_circuito_occorre_essere_a_zero',
{ symbol: circuit.symbol }
),
30000
)
: tools.removeFromMyCircuits(
$q,
userStore.my.username,
circuit.name,
@@ -413,9 +446,7 @@ groupnameSel = null;
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<q-item-section>
{{
$t('circuit.exit_circuit')
}}
{{ $t('circuit.exit_circuit') }}
</q-item-section>
</q-item>
@@ -474,13 +505,19 @@ groupnameSel = null;
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<q-card-section v-if="circuit.symbol === 'RIS'" class="inset-shadow">
<div v-html="t('circuit.disclaimer')"></div>
</q-card-section>
<q-card-section class="inset-shadow">
<div style="font-weight: bold; font-size: 1.25rem">Regolamento:</div>
<q-btn label="vedi Regolamento" @click="showrules = !showrules"></q-btn>
<div v-if="showrules" v-html="getRegulation(circuit.regulation)"></div>
<q-btn
label="vedi Regolamento"
@click="showrules = !showrules"
></q-btn>
<div
v-if="showrules"
v-html="getRegulation(circuit.regulation)"
></div>
</q-card-section>
<q-card-actions align="center">
<q-btn
@@ -490,16 +527,21 @@ groupnameSel = null;
:label="$t('circuit.acceptregulation')"
@click="
requestToEnterCircuit = false;
tools.setRequestCircuit(
tools.setRequestCircuit(
$q,
userStore.my.username,
circuit.name,
true,
groupnameSel ? groupnameSel.groupname : ''
);
);
"
/>
<q-btn outline :label="$t('dialog.cancel')" icon="close" v-close-popup></q-btn>
<q-btn
outline
:label="$t('dialog.cancel')"
icon="close"
v-close-popup
></q-btn>
</q-card-actions>
</q-card>
</q-dialog>
@@ -513,5 +555,5 @@ tools.setRequestCircuit(
</script>
<style lang="scss" scoped>
@import "./CMyCircuit.scss";
@import './CMyCircuit.scss';
</style>

View File

@@ -36,34 +36,6 @@
</div>
</CTitleBanner>
<CTitleBanner
:class="`q-pa-xs `"
:title="t('circuit.tuoi_ultimi_movimenti', { num: numtransaz })"
bgcolor="white"
bgcolor2="lightblue"
:clcolor="`text-indigo`"
:canopen="true"
:small="true"
:open="false"
>
<CMovements @loaded="movcaricati" :username="username" :showbuttolastmov="false">
<div class="row justify-center"><q-btn
rounded
dense
class="text-center"
color="primary"
:label="t('circuit.show_next_mov')"
@click="addlastmov()"
/>
</div>
</CMovements>
<q-inner-loading id="spinner" :showing="loadingvalues">
<q-spinner-tail size="3em" color="primary" />
</q-inner-loading>
<br />
</CTitleBanner>
<div class="row justify-center">
<q-btn
rounded
@@ -100,11 +72,45 @@
</CMyCircuit>
</span>
</div>
</CTitleBanner>
</div>
<div v-if="visu === costanti.FIND_CIRCUIT">
<div>
<slot></slot>
</div>
</CTitleBanner>
<CTitleBanner
:class="`q-pa-xs `"
:title="t('circuit.tuoi_ultimi_movimenti', { num: numtransaz })"
bgcolor="white"
bgcolor2="lightblue"
:clcolor="`text-indigo`"
:canopen="true"
:small="true"
:open="false"
>
<CMovements
@loaded="movcaricati"
:username="username"
:showbuttolastmov="false"
>
<div class="row justify-center">
<q-btn
rounded
dense
class="text-center"
color="primary"
:label="t('circuit.show_next_mov')"
@click="addlastmov()"
/>
</div>
</CMovements>
<q-inner-loading id="spinner" :showing="loadingvalues">
<q-spinner-tail size="3em" color="primary" />
</q-inner-loading>
<br />
</CTitleBanner>
</div>
</div>
<div v-else>
<q-list class="width-container">

View File

@@ -493,8 +493,10 @@ export default defineComponent({
productTypes: [],
excludeproductTypes: [],
editore: [],
argomenti: [],
author: '',
sort: costanti.SORT_PUBDATE,
sort_field: '',
sort_dir: 0,
arrProdottiSpeciali: [],
}
@@ -783,10 +785,22 @@ export default defineComponent({
if (arrschede) {
arrschede.forEach((recscheda: ISchedaSingola) => {
arr.push({ label: recscheda.scheda!.name, value: recscheda.scheda!._id })
let pagename = ''
if (recscheda.scheda) {
if (recscheda.idPageOrig) {
const page = globalStore.getPageById(recscheda.idPageOrig)
pagename = page ? page.title! : ''
}
if (pagename)
pagename = '[Pag: ' + pagename + '] '
const mylabel = pagename + (recscheda.scheda ? recscheda.scheda!.name : '')
arr.push({ label: mylabel, value: recscheda.scheda!._id })
}
});
}
return arr
}

View File

@@ -1390,7 +1390,7 @@
v-if="enableEdit && myel.catalogo"
rounded
outlined
v-model="myel.catalogo.sort"
v-model="myel.catalogo.sort_field"
:options="shared_consts.ORDINAMENTO_CATALOGHI"
@update:model-value="modifElem"
label="Ordinamento"
@@ -1399,6 +1399,20 @@
map-options
>
</q-select>
<q-select
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
v-if="enableEdit && myel.catalogo"
rounded
outlined
v-model="myel.catalogo.sort_dir"
:options="shared_consts.ORDINAMENTO_DIREZIONE"
@update:model-value="modifElem"
label="Direzione"
style="width: 200px"
emit-value
map-options
>
</q-select>
<q-select
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
@@ -1411,7 +1425,7 @@
:options="shared_consts.VERSIONI_PRODOTTO"
@update:model-value="modifElem"
multiple
label="Includi"
label="Includi Stato Prodotto"
style="width: 300px"
emit-value
map-options
@@ -1431,7 +1445,7 @@
:options="shared_consts.VERSIONI_PRODOTTO"
@update:model-value="modifElem"
multiple
label="Escludi"
label="Escludi Stato Prodotto"
style="width: 300px"
emit-value
map-options
@@ -1442,7 +1456,7 @@
v-if="enableEdit"
rounded
outlined
v-model="myel.catalogo.Editore"
v-model="myel.catalogo.editore"
:options="Products.publishers"
@update:model-value="modifElem"
multiple
@@ -1454,6 +1468,39 @@
option-label="name"
>
</q-select>
<q-select
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
v-if="enableEdit"
rounded
outlined
v-model="myel.catalogo.Argomenti"
:options="Products.catprods"
@update:model-value="modifElem"
multiple
label="Argomenti"
style="width: 300px"
emit-value
map-options
option-value="_id"
option-label="name"
>
</q-select>
<q-select
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
v-if="enableEdit"
rounded
outlined
v-model="myel.catalogo.idCollana"
:options="Products.collane"
@update:model-value="modifElem"
label="Collana"
style="width: 300px"
emit-value
map-options
option-value="idCollana"
option-label="descrizione"
>
</q-select>
</div>
</q-expansion-item>
<q-expansion-item
@@ -1579,6 +1626,7 @@
@update:model-value="modifElem"
v-model="recscheda.scheda.name"
filled
debounce="1000"
v-on:keyup.enter="saveElem"
>
</q-input>
@@ -1655,7 +1703,7 @@
v-if="enableEdit && myel.catalogo"
rounded
outlined
v-model="recscheda.scheda.sort"
v-model="recscheda.scheda.sort_field"
:options="shared_consts.ORDINAMENTO_CATALOGHI"
@update:model-value="modifElem"
label="Ordinamento"
@@ -1664,6 +1712,22 @@
map-options
>
</q-select>
<q-select
:behavior="
$q.platform.is.ios === true ? 'dialog' : 'menu'
"
v-if="enableEdit && myel.catalogo"
rounded
outlined
v-model="myel.catalogo.sort_dir"
:options="shared_consts.ORDINAMENTO_DIREZIONE"
@update:model-value="modifElem"
label="Direzione"
style="width: 200px"
emit-value
map-options
>
</q-select>
<q-select
:behavior="
$q.platform.is.ios === true ? 'dialog' : 'menu'
@@ -1713,7 +1777,7 @@
v-if="enableEdit"
rounded
outlined
v-model="recscheda.scheda.Editore"
v-model="recscheda.scheda.editore"
:options="Products.publishers"
@update:model-value="modifElem"
multiple
@@ -2033,6 +2097,7 @@
@saveFieldElem="saveFieldElem"
@update:model-value="modifElem"
label="Testo"
debounce="1000"
>
</CMyText>
</div>
@@ -2061,6 +2126,7 @@
@saveFieldElem="saveFieldElem"
@update:model-value="modifElem"
label="Testo"
debounce="1000"
>
</CMyText>
</div>

View File

@@ -225,7 +225,7 @@ export default defineComponent({
function clickOnElem() {
if (props.editOn) {
enableEdit.value = true
console.log('selElemClick', props.myelem)
// console.log('selElemClick', props.myelem)
emit('selElemClick', props.myelem)
}
}

View File

@@ -111,6 +111,7 @@
<div :class="$q.screen.lt.sm ? '' : 'row'">
<div class="sezioni">
<CCurrencyV2
v-if="!circuit.ignoreLimits"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="red"
@@ -127,6 +128,7 @@
</div>
<div class="sezioni">
<CCurrencyV2
v-if="!circuit.ignoreLimits"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="green"

View File

@@ -1,9 +1,9 @@
const msg_website_it = {
ws: {
sitename: 'Gruppo Macro',
siteshortname: 'Gruppo Macro',
description: '',
keywords: '',
sitename: 'Riso',
siteshortname: 'RISO',
description: 'Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.',
keywords: 'riso, piattaforma di scambio, rete italiana scambio orizzontale, riso app, riso piattaforma, scambio e baratto, momenta RIS',
},
hours: {
descr: 'Descrizione',
@@ -16,35 +16,23 @@ const msg_website_it = {
pages: {
home: 'Home',
profile: 'Profilo',
install_site: 'Installa Sito',
profile2: 'ProfiloU',
mypage2: 'mypage2',
myservice2: 'myservice2',
myhosps2: 'myhosps2',
mygood2: 'mygood2',
catalogo: 'Catalogo',
fundraising: 'Sostieni il Progetto',
notifs: 'Configura le Notifiche',
unsubscribe: 'Disiscriviti',
unsubscribe_user: 'Disiscriviti User',
test: 'Test',
projects: 'Progetti',
report: 'Report Ore',
producer: 'Produttore',
orderinfo: 'Ordini Effettuati',
products: 'Prodotti',
cash: 'Cassa',
productInfos: 'Info Prodotti',
listinoprodotti: 'Listino Prodotti',
productslist: 'Lista Prodotti',
collabora: 'Collabora',
categories: 'Categorie',
storehouses: 'Magazzino',
providers: 'Fornitori',
catprods: 'Categorie',
subcatprods: 'Sotto-Categorie',
gasordine: 'Gas Ordine',
scontisticas: 'Scontistica',
departments: 'Uffici',
orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti',
@@ -133,11 +121,15 @@ const msg_website_it = {
only_residenti: 'Solo Residenti',
only_consiglio: 'Solo Consiglieri',
color: 'Colore',
gasordini: 'Gas Ordini',
gestoreordini: 'Gestore Ordini',
mainMenu: 'Menu Principale',
subtitle: 'Sottotitolo',
lang: 'Lingua',
keywords: 'Parole Chiave',
desctiption: 'Descrizione',
heightimg: 'Altezza Immagine',
},
msg: {
myAppName: 'Più che Buono',
myAppName: 'Riso',
myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito',
underconstruction: 'App in costruzione...',
myDescriz: '',

View File

@@ -67,6 +67,39 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: 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,
order: 15,
@@ -78,6 +111,17 @@ function getDynamicPages(site: ISites): IListRoutes[] {
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,
@@ -90,7 +134,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: true,
},
{
active: site.confpages && site.confpages.enableEvents,
active: true,
order: 20,
path: '/events',
materialIcon: 'fas fa-bullhorn',
@@ -112,7 +156,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: false,
},
{
active: site.confpages && site.confpages.showProfile,
active: true,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
@@ -123,7 +167,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: true,
},
{
active: site.confpages && site.confpages.showProfile,
active: true,
order: 120,
path: '/editprofile',
materialIcon: 'fas fa-user',
@@ -134,7 +178,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
infooter: false,
},
{
active: site.confpages && site.confpages.showiscrittiMenu,
active: true,
order: 130,
path: '/friends',
materialIcon: 'fas fa-user-friends',
@@ -229,6 +273,16 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: false,
infooter: false,
},
{
active: true,
order: 150,
path: '/sostieniilprogetto',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
inmenu: false,
infooter: false,
},
{
active: true,
order: 80,

View File

@@ -421,7 +421,8 @@ export type StateConnection = 'online' | 'offline'
export interface IFilterCatalogo {
author: string
sort: number
sort_field: string
sort_dir: number
publisher: string
type: string
ageGroup: string
@@ -797,8 +798,11 @@ export interface IMyScheda {
productTypes?: number[]
excludeproductTypes?: number[]
editore?: string[]
argomenti?: string[]
collana?: string
author?: string
sort?: number
sort_field?: string
sort_dir?: number
arrProdottiSpeciali?: string[]
}
@@ -810,6 +814,7 @@ export interface ISchedaSingola {
numPagineMax?: number,
// In Memoria
idPageOrig?: string
arrProdToShow?: IProduct[][][]
}
@@ -819,8 +824,11 @@ export interface ICatalogo {
excludeproductTypes?: number[]
formato?: string[]
Categoria?: string[]
Editore?: string[]
sort?: number
editore?: string[]
argomenti?: string[]
collana?: string
sort_field?: string
sort_dir?: number
pdf?: boolean
pdf_filename?: string
printable?: boolean
@@ -834,7 +842,7 @@ export interface ICatalogo {
dimensioni_def?: IElementiPagina
arrSchede?: ISchedaSingola[]
aggiorna: number
aggiorna?: number
}
@@ -984,6 +992,7 @@ export interface IColGridTable {
extrafield?: string
tipoconto?: number
path?: string
onlyforAdmin?: boolean
}
export interface ITableRec {
@@ -1340,10 +1349,16 @@ export interface ICircuit {
qta_max_default?: number
fido_scoperto_default_grp?: number
qta_max_default_grp?: number
fido_scoperto_default_contocom?: number
qta_max_default_contocom?: number
data_costituz?: Date
deperimento: boolean
showAlways: boolean
ignoreLimits: boolean
askManagerToEnter?: boolean
sendEmailAfterAskingToEnter?: boolean
circuitoIndipendente?: boolean
creditodiPartenza?: number
transactionsEnabled: boolean
status: number
freq_deper?: string

View File

@@ -34,6 +34,8 @@ export interface IProductInfo {
checkout_link?: string
idAuthors?: string[]
authors?: string[]
idCollana?: string
collana?: string
collezione?: string
idPublisher?: string
publisher?: IPublisher
@@ -45,7 +47,9 @@ export interface IProductInfo {
short_descr: string
totVen?: number,
totFat?: number,
vLast3M?: number,
fatLast3M?: number,
vLast6M?: number,
vLastY?: number,
vLast2Y?: number,
@@ -173,6 +177,7 @@ export interface IProductsState {
cart: ICart
orders: IOrderCart[]
catprods: ICatProd[]
collane?: ICollana[]
catprods_gas: ICatProd[]
subcatprods: ISubCatProd[]
productInfos: IProductInfo[]
@@ -209,11 +214,19 @@ export interface ICategory {
export interface ICatProd {
_id?: any
name: string,
descr_estesa?: string,
img?: string,
icon?: string,
color?: string,
}
export interface ICollana {
_id?: any
idCollana: number,
descrizione: string,
descrizione_estesa?: string,
}
export interface ICatAI {
_id?: any
name: string,

View File

View File

@@ -0,0 +1,34 @@
import { colTableCollane } from '@src/store/Modules/fieldsTable'
import { CImgText } from '../../../components/CImgText/index'
import { defineComponent } from 'vue'
import { CCard } from '@/components/CCard'
import { CMyPage } from '@/components/CMyPage'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CGridTableRec } from '@/components/CGridTableRec'
import MixinMetaTags from '../../../mixins/mixin-metatags'
export default defineComponent({
name: 'Collane',
components: { CImgText, CCard, CMyPage, CTitleBanner, CGridTableRec },
setup() {
const pagination = {
sortBy: 'name',
descending: false,
page: 2,
rowsPerPage: 5
// rowsNumber: xx if getting data from a server
}
const { setmeta } = MixinMetaTags()
return {
colTableCollane,
setmeta,
}
}
})

View File

@@ -0,0 +1,31 @@
<template>
<CMyPage title="Collane" imgbackground="images/produttori.jpg" sizes="max-height: 120px">
<span>{{
setmeta({
title: 'Collane',
description: '',
keywords: '',
})
}}
</span>
<div class="q-ma-sm q-gutter-sm q-pa-xs">
<CTitleBanner title="Collane"></CTitleBanner>
<CGridTableRec
prop_mytable="collanas"
prop_mytitle="Collane"
:prop_mycolumns="colTableCollane"
prop_colkey="name"
nodataLabel="Nessuna Collana"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato">
</CGridTableRec>
</div>
</CMyPage>
</template>
<script lang="ts" src="./collane.ts">
</script>
<style lang="scss" scoped>
@import 'collane.scss';
</style>

View File

@@ -48,6 +48,15 @@ export default defineComponent({
arrPages.value.push(rec)
}
// Aggiungi anche le pagine cancellate, in cui gli elementi non hanno più una pagina collegata
for (const elem of globalStore.myelems) {
const pagetofind = arrPages.value.find((page: any) => page.value === elem.idPage)
if (!pagetofind) {
// non c'è in lista:
arrPages.value.push({label: 'pag non trovata: ' + elem.idPage, value: elem.idPage})
}
}
// filtercustom.value = [{ userId: userStore.my._id }]

File diff suppressed because one or more lines are too long

View File

@@ -130,55 +130,12 @@ export const Api = {
}
},
async SendReqBase(url: string, method: string, mydata: any, setAuthToken = false, evitaloop = false, myformdata?: any, responsedata?: any): Promise<Types.AxiosSuccess | Types.AxiosError> {
const mydataout = {
...mydata,
keyappid: process.env.PAO_APP_ID,
idapp: process.env.APP_ID,
}
async checkTokenScaduto(status: number, evitaloop: boolean, resolve: any, reject: any, url: string, method: string, mydata: any, setAuthToken = false) {
const userStore = useUserStore()
const globalStore = useGlobalStore()
const $router = useRouter()
userStore.setServerCode(tools.EMPTY)
userStore.setResStatus(0)
return new Promise((resolve, reject) => sendRequest(url, method, mydataout, myformdata, responsedata)
.then((res) => {
setTimeout(() => {
if (method === 'get') {
globalStore.connData.downloading_server = 0
} else {
globalStore.connData.uploading_server = 0
globalStore.connData.downloading_server = 0
}
}, 1000)
if (res.status) {
userStore.setResStatus(res.status)
if (res.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
userStore.setAuth('', '')
return reject({ code: toolsext.ERR_AUTHENTICATION })
}
}
if (tools.isDebug())
console.log(' ----> ', res)
return resolve(res)
})
.catch(async (error) => {
setTimeout(() => {
if (method === 'get') {
globalStore.connData.downloading_server = -1
} else {
globalStore.connData.uploading_server = -1
globalStore.connData.downloading_server = -1
}
}, 1000)
if (error.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) {
if (status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) {
try {
console.log('Token Scaduto.')
const newAccessToken = await this.refreshToken();
@@ -199,6 +156,68 @@ export const Api = {
return reject({ code: toolsext.ERR_AUTHENTICATION })
}
}
return null
}
},
async SendReqBase(url: string, method: string, mydata: any, setAuthToken = false, evitaloop = false, myformdata?: any, responsedata?: any): Promise<Types.AxiosSuccess | Types.AxiosError> {
const mydataout = {
...mydata,
keyappid: process.env.PAO_APP_ID,
idapp: process.env.APP_ID,
}
const userStore = useUserStore()
const globalStore = useGlobalStore()
const $router = useRouter()
userStore.setServerCode(tools.EMPTY)
userStore.setResStatus(0)
return new Promise((resolve, reject) => sendRequest(url, method, mydataout, myformdata, responsedata)
.then(async (res) => {
setTimeout( () => {
if (method === 'get') {
globalStore.connData.downloading_server = 0
} else {
globalStore.connData.uploading_server = 0
globalStore.connData.downloading_server = 0
}
}, 1000)
if (res.status) {
userStore.setResStatus(res.status)
if (res.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
userStore.setAuth('', '')
return reject({ code: toolsext.ERR_AUTHENTICATION })
}
}
const ret = await this.checkTokenScaduto(res.status, evitaloop, resolve, reject, url, method, mydataout, setAuthToken)
if (ret) {
return ret
}
if (tools.isDebug())
console.log(' ----> ', res)
return resolve(res)
})
.catch(async (error) => {
setTimeout(() => {
if (method === 'get') {
globalStore.connData.downloading_server = -1
} else {
globalStore.connData.uploading_server = -1
globalStore.connData.downloading_server = -1
}
}, 1000)
const ret = await this.checkTokenScaduto(error.status, evitaloop, resolve, reject, url, method, mydataout, setAuthToken)
if (ret) {
return ret
}
console.log('ERROR', error)
@@ -206,6 +225,7 @@ export const Api = {
}))
},
/**
* Creates a Promise that resolves after a specified number of milliseconds.
* Useful for creating delayed operations or pause in async functions.
@@ -229,7 +249,7 @@ export const Api = {
* // Usage with Promise chaining
* delay(1000).then(() => console.log('1 second passed'));
*/
async delay (ms: number): Promise<void> {
async delay(ms: number): Promise<void> {
// Input validation
if (ms < 0) {
throw new Error('Delay time cannot be negative');
@@ -253,7 +273,13 @@ export const Api = {
const response = await this.SendReqBase(url, method, mydata, setAuthToken, evitaloop, myformdata, responsedata);
return response;
} catch (error: any) {
if (retryCount > 0) {
let riprova = true
try {
riprova = (error.status !== 403);
} catch (e) {
}
if (retryCount > 0 && riprova) {
// (!error.hasOwnProperty('data') || (error.hasOwnProperty('data') && !error.data.error.hasOwnProperty('code')) && (!error.hasOwnProperty('msgerr')))
console.log(`❌❌❌ Retrying request. Attempts remaining: ${retryCount}`);
await this.delay(retryDelay);

View File

@@ -29,7 +29,7 @@ export const costanti = {
'excludeproductTypes',
'misure',
'Categoria',
'Editore',
'editore',
'pdf',
'Printable',
'numschede_perCol',
@@ -500,8 +500,4 @@ export const costanti = {
TESTO_BORDATO: 5,
},
SORT_DEFAULT: 0,
SORT_PUBDATE: 1,
SORT_BESTSELLER: 2,
}

View File

@@ -103,6 +103,7 @@ function AddCol(params: IColGridTable) {
filter_field: (params.filter_field === undefined) ? '' : params.filter_field,
isadvanced_field: (params.isadvanced_field === undefined) ? false : params.isadvanced_field,
path: (params.path === undefined) ? '' : params.path,
onlyforAdmin: (params.onlyforAdmin === undefined) ? false : params.onlyforAdmin,
}
}
@@ -188,10 +189,13 @@ export const colmyScheda = [
AddCol({ name: 'productTypes', label_trans: 'productTypes', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'excludeproductTypes', label_trans: 'excludeproductTypes', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'Editore', label_trans: 'Editore' }),
AddCol({ name: 'author', label_trans: 'author' }),
AddCol({ name: 'sort', label_trans: 'catalogo.sort', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'arrProdottiSpeciali', label_trans: 'Editore' }),
AddCol({ name: 'editore', label_trans: 'editore' }),
AddCol({ name: 'author', label_trans: 'scheda.author' }),
AddCol({ name: 'argomenti', label_trans: 'scheda.argomenti' }),
AddCol({ name: 'idCollana', label_trans: 'scheda.idCollana' }),
AddCol({ name: 'sort_field', label_trans: 'catalogo.sort_field', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'sort_dir', label_trans: 'catalogo.sort_dir', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'arrProdottiSpeciali', label_trans: 'editore' }),
]
export const colmyelCatalogo = [
@@ -199,7 +203,9 @@ export const colmyelCatalogo = [
AddCol({ name: 'excludeproductTypes', label_trans: 'excludeproductTypes', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'pdf', label_trans: 'pdf' }),
AddCol({ name: 'pdf_filename', label_trans: 'pdf_filename' }),
AddCol({ name: 'Editore', label_trans: 'Editore' }),
AddCol({ name: 'editore', label_trans: 'editore' }),
AddCol({ name: 'argomenti', label_trans: 'scheda.argomenti' }),
AddCol({ name: 'idCollana', label_trans: 'scheda.idCollana' }),
AddCol({ name: 'width', label_trans: 'width', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'height', label_trans: 'height', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'optcatalogo.', label_trans: 'catalogo.optcatalogo.', fieldtype: costanti.FieldType.number }),
@@ -280,6 +286,7 @@ export const colmsg_templates = [
]
export const colmypage = [
AddCol({ name: '_id', label_trans: 'index', fieldtype: costanti.FieldType.string }),
AddCol({ name: 'path', label_trans: 'pages.path' }),
AddCol({ name: 'icon', label_trans: 'pages.icon' }),
AddCol({ name: 'order', label_trans: 'pages.order', fieldtype: costanti.FieldType.number }),
@@ -497,12 +504,20 @@ export const colTablecategories = [
export const colTableCatProd = [
AddCol({ name: 'name', label_trans: 'categories.name' }),
AddCol({ name: 'descr_estesa', label_trans: 'categories.descr_estesa' }),
AddCol({ name: 'img', label_trans: 'categories.img' }),
AddCol({ name: 'icon', label_trans: 'categories.icon' }),
AddCol({ name: 'color', label_trans: 'categories.color' }),
AddCol(DeleteRec),
AddCol(DuplicateRec),
]
export const colTableCollane = [
AddCol({ name: 'idCollana', label_trans: 'collane.idCollana', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'descrizione', label_trans: 'collane.descrizione' }),
AddCol({ name: 'descrizione_estesa', label_trans: 'collane.descrizione_estesa' }),
AddCol(DeleteRec),
AddCol(DuplicateRec),
]
export const colTableCatAI = [
AddCol({ name: 'name', label_trans: 'categories.name' }),
@@ -2317,6 +2332,12 @@ export const colTableProductInfos = [
fieldtype: costanti.FieldType.multiselect,
jointable: 'catprods',
}),
AddCol({
name: 'idCollana',
label_trans: 'products.category',
fieldtype: costanti.FieldType.select,
jointable: 'collanas',
}),
AddCol({ name: 'color', label_trans: 'products.color' }),
AddCol({ name: 'size', label_trans: 'products.size' }),
AddCol({ name: 'weight', label_trans: 'products.weight', fieldtype: costanti.FieldType.number }),
@@ -3600,11 +3621,17 @@ export const colTableCircuitComplete = [
AddCol({ name: 'qta_max_default', label_trans: 'circuit.qta_max_default', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'fido_scoperto_default_grp', label_trans: 'circuit.fido_scoperto_default_grp', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'qta_max_default_grp', label_trans: 'circuit.qta_max_default_grp', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'fido_scoperto_default_contocom', label_trans: 'circuit.fido_scoperto_default_contocom', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'qta_max_default_contocom', label_trans: 'circuit.qta_max_default_contocom', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'data_costituz', label_trans: 'circuit.data_costituz', fieldtype: costanti.FieldType.date }),
AddCol({ name: 'deperimento', label_trans: 'circuit.deperimento', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'showAlways', label_trans: 'circuit.showAlways', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'ignoreLimits', label_trans: 'circuit.ignoreLimits', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'transactionsEnabled', label_trans: 'circuit.transactionsEnabled', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'showAlways', label_trans: 'circuit.showAlways', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'ignoreLimits', label_trans: 'circuit.ignoreLimits', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'transactionsEnabled', label_trans: 'circuit.transactionsEnabled', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'askManagerToEnter', label_trans: 'circuit.askManagerToEnter', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'sendEmailAfterAskingToEnter', label_trans: 'circuit.sendEmailAfterAskingToEnter', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'circuitoIndipendente', label_trans: 'circuit.circuitoIndipendente', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'creditodiPartenza', label_trans: 'circuit.creditodiPartenza', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'freq_deper', label_trans: 'circuit.freq_deper' }),
AddCol({ name: 'minuto_deper', label_trans: 'circuit.minuto_deper', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'ora_deper', label_trans: 'circuit.ora_deper', fieldtype: costanti.FieldType.number }),
@@ -3641,6 +3668,9 @@ export const colTableCircuitComplete = [
sortable: true,
showWhen: 0
}),
AddCol({ name: 'circuitoIndipendente', label_trans: 'circuit.circuitoIndipendente', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'askManagerToEnter', label_trans: 'circuit.askManagerToEnter', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'sendEmailAfterAskingToEnter', label_trans: 'circuit.sendEmailAfterAskingToEnter', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol(ModifRec),
AddCol(DeleteRec),
AddCol(DuplicateRec),
@@ -3693,10 +3723,12 @@ export const colTableCircuit = [
fieldtype: costanti.FieldType.multiselect,
jointable: 'visibilGroup',
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
onlyforAdmin: true,
}),
AddCol({
name: 'systemUserId', label_trans: 'circuit.systemUserId', fieldtype: costanti.FieldType.select, jointable: 'users',
showWhen: costanti.showWhen.InEdit + costanti.showWhen.InView,
onlyforAdmin: true
}),
AddCol({
name: 'createdBy', label_trans: 'circuit.founder', fieldtype: costanti.FieldType.select, jointable: 'users',
@@ -3730,6 +3762,8 @@ export const colTableCircuit = [
}),
AddCol({ name: 'fido_scoperto_default_grp', label_trans: 'circuit.fido_scoperto_default_grp', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'qta_max_default_grp', label_trans: 'circuit.qta_max_default_grp', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'fido_scoperto_default_contocom', label_trans: 'circuit.fido_scoperto_default_contocom', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'qta_max_default_contocom', label_trans: 'circuit.qta_max_default_contocom', fieldtype: costanti.FieldType.currency }),
AddCol({ name: 'valuta_per_euro', label_trans: 'circuit.valuta_per_euro', fieldtype: costanti.FieldType.number }),
AddCol({
name: 'totCircolante', label_trans: 'circuit.totCircolante',
@@ -3743,14 +3777,19 @@ export const colTableCircuit = [
}),
AddCol({ name: 'regulation', label_trans: 'circuit.regulation', fieldtype: costanti.FieldType.html, required: false }),
AddCol({ name: 'deperimento', label_trans: 'circuit.deperimento', fieldtype: costanti.FieldType.boolean, disable: true }),
AddCol({ name: 'showAlways', label_trans: 'circuit.showAlways', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'ignoreLimits', label_trans: 'circuit.ignoreLimits', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'transactionsEnabled', label_trans: 'circuit.transactionsEnabled', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'showAlways', label_trans: 'circuit.showAlways', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'ignoreLimits', label_trans: 'circuit.ignoreLimits', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'transactionsEnabled', label_trans: 'circuit.transactionsEnabled', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'askManagerToEnter', label_trans: 'circuit.askManagerToEnter', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'sendEmailAfterAskingToEnter', label_trans: 'circuit.sendEmailAfterAskingToEnter', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'circuitoIndipendente', label_trans: 'circuit.circuitoIndipendente', fieldtype: costanti.FieldType.boolean, onlyforAdmin: true }),
AddCol({ name: 'creditodiPartenza', label_trans: 'circuit.creditodiPartenza', fieldtype: costanti.FieldType.number }),
AddCol({
name: 'status', label_trans: 'circuit.status',
fieldtype: costanti.FieldType.select,
jointable: 'statuscircuit',
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
onlyforAdmin: true
}
),
AddCol({ name: 'data_costituz', label_trans: 'circuit.data_costituz', fieldtype: costanti.FieldType.date }),
@@ -4110,6 +4149,13 @@ export const fieldsTable = {
colkey: '_id',
collabel: 'name',
},
{
value: 'collanas',
label: 'Collane',
columns: colTableCollane,
colkey: 'idCollana',
collabel: 'descrizione',
},
{
value: 'catais',
label: 'Categorie AI',

View File

@@ -6616,6 +6616,10 @@ export const tools = {
check = check && tools.isBitActive(col.showWhen, costanti.showWhen.InPage)
}
if (col.onlyforAdmin) {
check = check && tools.isAdmin()
}
return check
@@ -6648,14 +6652,23 @@ export const tools = {
setRequestCircuit($q: any, username: string, circuitname: string, value: boolean, groupname?: string) {
const userStore = useUserStore()
const circuitStore = useCircuitStore()
userStore.setCircuitCmd($q, t, username, circuitname, shared_consts.CIRCUITCMD.REQ, value, { groupname })
.then((res: any) => {
if (res) {
if (value) {
const mycircuit = circuitStore.getCircuitByName(circuitname)
let msg = t('circuit.already_entered', { circuitname })
if (mycircuit?.askManagerToEnter) {
msg = t('circuit.askedto', { circuitname })
}
// ADD to req
userStore.my.profile.asked_circuits.push(res.circuit)
tools.showPositiveNotif($q, t('circuit.askedto', { circuitname }))
tools.showPositiveNotif($q, msg)
} else {
// REMOVE to req
userStore.my.profile.asked_circuits = userStore.my.profile.asked_circuits.filter((rec: ICircuit) => rec.name !== circuitname)
@@ -6744,7 +6757,7 @@ export const tools = {
userStore.my.profile.asked_circuits = userStore.my.profile.asked_circuits.filter((rec: ICircuit) => rec.name !== circuitname)
}
this.updateMyData(res)
tools.showPositiveNotif($q, t('circuit.cancel_req'))
tools.showPositiveNotif($q, t('circuit.cancel_req', { circuitname }))
}
})
})
@@ -7384,6 +7397,8 @@ export const tools = {
qta_max_default: 200,
fido_scoperto_default_grp: shared_consts.CIRCUIT_PARAMS.SCOPERTO_MIN_GRP,
qta_max_default_grp: shared_consts.CIRCUIT_PARAMS.SCOPERTO_MAX_GRP,
fido_scoperto_default_contocom: shared_consts.CIRCUIT_PARAMS.SCOPERTO_MIN_CONTO_COMUNITARIO,
qta_max_default_contocom: shared_consts.CIRCUIT_PARAMS.SCOPERTO_MAX_CONTO_COMUNITARIO,
valuta_per_euro: 1,
totTransato: 0,
totCircolante: 0,

View File

@@ -13,7 +13,6 @@ import { useGlobalStore } from './globalStore'
import { ref } from 'vue'
import translate from '@src/globalroutines/util'
import products from '@src/rootgen/admin/products/products'
function getRecordOrdersCartEmpty(): IOrderCart {
return {
@@ -149,6 +148,27 @@ export const useProducts = defineStore('Products', {
return arrcat
},
getCatProdsStrByCatProds: (state: IProductsState) => (catProds: ICatProd[]): string => {
let mystr = ''
for (const catprod of catProds) {
const myarrcat = state.catprods.find((rec: ICatProd) => rec._id === catprod)
if (myarrcat) {
if (mystr)
mystr = ' - '
mystr += myarrcat.name
}
}
return mystr
},
getCatProdDescrStrByIdCatProd: (state: IProductsState) => (idCatProd: string): string => {
const myfirstcat = state.catprods.find((rec: ICatProd) => rec._id === idCatProd)
if (myfirstcat) {
return myfirstcat.descr_estesa!
}
return ''
},
getSubCatProdsByGas: (state: IProductsState) => (idGasOrdine: string, idCatProd: string): ISubCatProd[] => {
let arrcat = state.subcatprods
@@ -1267,6 +1287,14 @@ export const useProducts = defineStore('Products', {
return authorString
},
getkeyValStr(chiave: string, valore: any) {
try {
return ` ${chiave} = ${valore} `
} catch (e) {
return ` ${chiave}`
}
},
replaceKeyWordsByProduct(optcatalogo: ICatalogo, myproduct: IProduct, testo: IText) {
if (!myproduct || !testo.contenuto) {
return testo.contenuto;
@@ -1279,14 +1307,24 @@ export const useProducts = defineStore('Products', {
const description = myproduct.productInfo.short_descr || '';
const long_descr = myproduct.productInfo.description || '';
const date_pub = tools.getstrDateShort(myproduct.productInfo.date_pub) || '';
const fatLast3M = myproduct.productInfo.fatLast3M! || 0;
const vLast3M = myproduct.productInfo.vLast3M! || 0;
const vLast6M = myproduct.productInfo.vLast6M! || 0;
const ranking_globale = myproduct.productInfo.rank3M! || 0;
const ranking = myproduct.indiceRanking! || 0;
const venduti = myproduct.productInfo.totVen! || 0;
const fatturati = myproduct.productInfo.totFat! || 0;
const linkvenduti = '<a href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-ordini-by-idarticolo/' + myproduct.productInfo.sku + '" target="_blank">'+venduti+'</a>'
const debugstr = " Rank=" + ranking + "<br> Rank3M=" + (myproduct.productInfo.rank3M! || '') + '<br> Venduti=' + linkvenduti + '<br>vLast3M= ' + vLast3M + '<br>vLast6M= ' + vLast6M + ' <br> Data Pubb=' + date_pub
const linkvenduti = '<a href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-ordini-by-idarticolo/' + myproduct.productInfo.sku + '" target="_blank">' + venduti + '</a>'
const linkfatturati = '<a href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-fatturati-by-idarticolo/' + myproduct.productInfo.sku + '" target="_blank">' + fatturati + '</a>'
const debugstr = this.getkeyValStr('Pubblicato il', date_pub) +
this.getkeyValStr('Rank', ranking) +
this.getkeyValStr('Rank3M', myproduct.productInfo.rank3M) +
this.getkeyValStr('Venduti', linkvenduti) +
this.getkeyValStr('vLast3M', vLast3M) +
this.getkeyValStr('vLast6M', vLast6M) +
this.getkeyValStr('Fatturati', linkfatturati) +
this.getkeyValStr('fatLast3M', fatLast3M)
const truncatedDescription = description.length > maxDescriptionLength
? description.substring(0, description.lastIndexOf(' ', maxDescriptionLength)) + '...'
@@ -1322,6 +1360,9 @@ export const useProducts = defineStore('Products', {
const prezzo = tools.arrotonda2Dec(myproduct.arrvariazioni![0].price) || ''
const prezzo_scontato = tools.arrotonda2Dec(myproduct.arrvariazioni![0].sale_price) || ''
const categoria = this.getCatProdsStrByCatProds(myproduct.productInfo.catprods!)
const sottocategoria = myproduct.productInfo.subcatprods && myproduct.productInfo.subcatprods.length > 0 ? myproduct.productInfo.subcatprods[0].name! : ''
const descr_categoria = myproduct.productInfo.catprods ? this.getCatProdDescrStrByIdCatProd(myproduct.productInfo.catprods![0]) : ''
const misure = myproduct.arrvariazioni![0].misure || ''
const formato = myproduct.arrvariazioni![0].formato || ''
const pagine = myproduct.arrvariazioni![0].pagine || ''
@@ -1337,7 +1378,10 @@ export const useProducts = defineStore('Products', {
'{descrizione_estesa_fdv}': truncatedlongDescription || '',
'{descrizione_estesa}': descrizione_completa_macro || '',
'{debug}': (debugstr) || '',
'{pagine}': (pagine ) || '',
'{categoria}': (categoria) || '',
'{sottocategoria}': (sottocategoria) || '',
'{descr_categoria}': (descr_categoria) || '',
'{pagine}': (pagine) || '',
'{misure}': misure || '',
'{date_pub}': date_pub || '',
'{ranking_globale}': ranking_globale || '',

View File

@@ -321,7 +321,7 @@ export const useUserStore = defineStore('UserStore', {
GroupsListWhereIAmAdminInTheCircuit(circuitname: string): any {
try {
const arr: any = this.my.profile.manage_mygroups.filter((group: IMyGroup) => (group.mycircuits!.findIndex((circ: IMyCircuit) => circ.circuitname === circuitname) >= 0))
console.log('arr', arr)
// console.log('arr', arr)
return arr
} catch (e) {
return []

View File

@@ -1019,7 +1019,9 @@ export const useGlobalStore = defineStore('GlobalStore', {
await globalroutines('readall', 'config', null)
if (tools.isLogged()) {
this.editOn = tools.getCookie('edn', '0') === '1'
}
return isok
},
@@ -1727,6 +1729,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
this.providers = (res.data.providers) ? [...res.data.providers] : []
Products.catprods = (res.data.catprods) ? [...res.data.catprods] : []
Products.collane = (res.data.collane) ? [...res.data.collane] : []
Products.subcatprods = (res.data.subcatprods) ? [...res.data.subcatprods] : []
Products.catprods_gas = (res.data.catprods_gas) ? [...res.data.catprods_gas] : []
Products.authors = (res.data.authors) ? [...res.data.authors] : []
@@ -2303,7 +2306,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
excludeproductTypes: [],
formato: [],
Categoria: [],
Editore: [],
editore: [],
pdf: false,
dimensioni_def: {
pagina: tools.resetRecIDimensioni(null)

View File

@@ -66,7 +66,6 @@ export default defineComponent({
const filter = ref(<IFilterCatalogo>{
author: '',
sort: 1,
publisher: '',
type: '',
ageGroup: ''
@@ -158,7 +157,14 @@ export default defineComponent({
}
})
watch(() => filter.value.sort, (newval, oldval) => {
watch(() => filter.value.sort_field, (newval, oldval) => {
calcArrProducts()
if (tools.scrollTop() > 300) {
tools.scrollToTopValue(300)
}
})
watch(() => filter.value.sort_dir, (newval, oldval) => {
calcArrProducts()
if (tools.scrollTop() > 300) {
@@ -203,7 +209,9 @@ export default defineComponent({
}
function calcArrProducts() {
console.log('calcArrProducts')
// console.log('calcArrProducts')
let arrargomstr: any = []
// eventuali titoli specifici estratti dall'array di Prodotti Selezionati
//const searchtext = getSearchText()
@@ -219,12 +227,19 @@ export default defineComponent({
let boolfiltroVuotoProductTypes = (filtroProductTypes.length === 0 || (filtroProductTypes.length === 1 && (filtroProductTypes[0] === 0)))
let boolfiltroVuotoExcludeProductTypes = filtroExcludeProductTypes.length === 0
let filtroPublishers = optcatalogo.value.Editore || []
let filtroPublishers = optcatalogo.value.editore || []
let boolfiltroVuotoEditore = (filtroPublishers.length === 0)
//console.log('filtroVersione', filtroProductTypes)
let catstr = cat.value || ''
let catstr = ''
if (optcatalogo.value.argomenti) {
// ha la priorità questo scelto sul catalogo
arrargomstr = optcatalogo.value.argomenti
} else {
catstr = cat.value || ''
}
let gasselstr = ''
if (cosa.value === shared_consts.PROD.GAS) {
@@ -240,6 +255,12 @@ export default defineComponent({
if (product && product.productInfo) {
let lowerName = (product.productInfo.name || '').toLowerCase();
let hasCategoria = !catstr || (catstr && (product.productInfo.idCatProds || []).includes(catstr));
let hasArgomentiCat = true
if (arrargomstr && arrargomstr.length > 0) {
hasArgomentiCat = (product.productInfo.idCatProds || []).some(idCat => arrargomstr.includes(idCat))
hasCategoria = true
}
let hasAuthor = !filtroAuthor || (filtroAuthor && (product.productInfo.idAuthors || []).includes(filtroAuthor));
let hasProductTypes = true
@@ -253,7 +274,7 @@ export default defineComponent({
hasProductTypes = !optcatalogo.value.productTypes || (optcatalogo.value.productTypes && (product.productInfo.productTypes || []).some((item: any) => optcatalogo.value.productTypes!.includes(item)))
}
if (optcatalogo.value && !boolfiltroVuotoEditore) {
hasPublished = !optcatalogo.value.Editore || (optcatalogo.value.Editore && optcatalogo.value.Editore.includes(product.productInfo.idPublisher!))
hasPublished = !optcatalogo.value.editore || (optcatalogo.value.editore && optcatalogo.value.editore.includes(product.productInfo.idPublisher!))
}
if (optcatalogo.value && !boolfiltroVuotoExcludeProductTypes) {
@@ -273,7 +294,7 @@ export default defineComponent({
// Check if all words in lowerSearchText are present in lowerName
let allWordsPresent = lowerSearchText.split(/\s+/).every(word => new RegExp(`\\b${word}\\b`, 'i').test(lowerName));
return (codeMatch.test(product.productInfo.code || '') || allWordsPresent) && hasCategoria && hasAuthor && productgassel && hasProductTypes && hasPublished && !hasExcludeProductTypes;
return (codeMatch.test(product.productInfo.code || '') || allWordsPresent) && hasCategoria && hasArgomentiCat && hasAuthor && productgassel && hasProductTypes && hasPublished && !hasExcludeProductTypes;
} else {
console.error('product or product.productInfo is null');
return false;
@@ -281,7 +302,7 @@ export default defineComponent({
});
}
arrprod = getProductsSorted(arrprod, filter.value.sort);
arrprod = getProductsSorted(arrprod, filter.value.sort_field, filter.value.sort_dir);
arrProducts.value = arrprod
@@ -346,6 +367,8 @@ export default defineComponent({
const searchtext = scheda.arrProdottiSpeciali
let arrargomstr: any = []
let arrprod = productStore.getProducts(cosa.value) || [];
let filtroAuthor = filter.value.author || '';
@@ -359,7 +382,14 @@ export default defineComponent({
//console.log('filtroVersione', filtroProductTypes)
let catstr = cat.value || ''
let catstr = ''
if (optcatalogo.value.argomenti) {
// ha la priorità questo scelto sul catalogo
arrargomstr = optcatalogo.value.argomenti
} else {
catstr = cat.value || ''
}
let gasselstr = ''
if (cosa.value === shared_consts.PROD.GAS) {
@@ -376,6 +406,12 @@ export default defineComponent({
let lowerCode = (product.productInfo.code || '').toLowerCase();
let hasCategoria = !catstr || (catstr && (product.productInfo.idCatProds || []).includes(catstr));
let hasArgomentiCat = true
if (arrargomstr && arrargomstr.length > 0) {
hasArgomentiCat = (product.productInfo.idCatProds || []).some(idCat => arrargomstr.includes(idCat))
hasCategoria = true
}
let hasAuthor = !filtroAuthor || (filtroAuthor && (product.productInfo.idAuthors || []).includes(filtroAuthor));
// Check if ANY search term matches the product name or code
@@ -408,47 +444,49 @@ export default defineComponent({
hasExcludeProductTypes = !scheda.excludeproductTypes || (scheda.excludeproductTypes && (product.productInfo.productTypes || []).every((item: any) => scheda.excludeproductTypes!.includes(item)))
}
return searchMatch && hasCategoria && hasAuthor && hasProductTypes && hasPublished && !hasExcludeProductTypes;
return searchMatch && hasCategoria && hasArgomentiCat && hasAuthor && hasProductTypes && hasPublished && !hasExcludeProductTypes;
} else {
console.error('product or product.productInfo is null');
return false;
}
})
arrprod = getProductsSorted(arrprod, scheda?.sort!);
arrprod = getProductsSorted(arrprod, scheda?.sort_field!, scheda?.sort_dir!);
return arrprod
}
function getProductsSorted(arrprod: IProduct[], sort: number) {
// console.log('getProductsSorted', sort)
if (sort === costanti.SORT_PUBDATE) {
function getProductsSorted(arrprod: IProduct[], sort_field: string, sort_dir: number): IProduct[] {
if (sort_field) {
// Crea una copia dell'array per non modificare l'originale
const sortedArr = [...arrprod].sort((a: IProduct, b: IProduct) => {
const valA = a.productInfo?.[sort_field];
const valB = b.productInfo?.[sort_field];
arrprod = arrprod.sort((a: IProduct, b: IProduct) => {
return b.productInfo.date_pub_ts - a.productInfo.date_pub_ts
})
} else if (sort === costanti.SORT_BESTSELLER) {
if (valA === undefined || valB === undefined) {
return 0; // Gestisce il caso in cui il campo non esiste
}
arrprod = arrprod.sort((a: IProduct, b: IProduct) => {
return b.productInfo.vLast6M! - a.productInfo.vLast6M!
})
if (typeof valA === 'number' && typeof valB === 'number') {
return sort_dir === 1 ? valA - valB : valB - valA;
} else {
// Per stringhe o altri tipi
const compA = valA.toString().toLowerCase();
const compB = valB.toString().toLowerCase();
return sort_dir === 1
? compA.localeCompare(compB)
: compB.localeCompare(compA);
}
});
arrprod = arrprod.map((product, index) => {
return {
return sortedArr.map((product, index) => ({
...product,
indiceRanking: index + 1
};
})
console.log('arr', arrprod)
} else if (sort === costanti.SORT_DEFAULT) {
}));
}
return arrprod
return arrprod;
}
function addNextProductToTheView(arrproductfiltrati: IProduct[], indprod: number) {
@@ -518,8 +556,8 @@ export default defineComponent({
arrProdFiltrati = getProductsFilteredByScheda(recscheda.scheda)
indprod = 0
} else {
if (recscheda.scheda?.sort! > 0) {
arrProdFiltrati = getProductsSorted(arrGeneraleProdotti, recscheda.scheda.sort!);
if (recscheda.scheda?.sort_field!) {
arrProdFiltrati = getProductsSorted(arrGeneraleProdotti, recscheda.scheda.sort_field!, recscheda.scheda.sort_dir!);
indprod = 0
} else {
indprod = indprodGenerale
@@ -577,7 +615,7 @@ export default defineComponent({
}
}
console.log('Fine...')
// console.log('Fine...')
}
function getNextProd() {
@@ -610,7 +648,7 @@ export default defineComponent({
}*/
async function mounted() {
console.log('mounted Catalogo')
// console.log('mounted Catalogo')
loadpage.value = false
await productStore.loadProducts()

View File

@@ -87,7 +87,7 @@
<!--<q-select
v-model="filter.publisher"
:options="publishers"
label="Editore"
label="editore"
placeholder="Tutti"
dense
/>
@@ -159,9 +159,9 @@
<div class="row justify-center q-mx-auto">
<q-select
v-model="filter.sort"
v-model="filter.sort_field"
dense
:options="shared_consts.ORDINAMENTO_CATALOGHI"
:options="shared_consts.ORDINAMENTO_CATALOGHI_PUBBLICO"
label="Ordinamento"
placeholder=""
emit-value
@@ -169,6 +169,17 @@
filled
rounded
></q-select>
<q-select
v-model="filter.sort_dir"
dense
:options="shared_consts.ORDINAMENTO_DIREZIONE"
label="Direzione"
placeholder=""
emit-value
map-options
filled
rounded
></q-select>
</div>
<div class="text-center q-py-sm prod_trov">
@@ -479,17 +490,22 @@
2. Eseguire "IMPORTA DESCRIZIONI E LINK DA SITO GRUPPOMACRO (XML)" - importa_descrizioni_e_link.xml
3. Visualizza <a
3. Visualizza
<a
href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-articles-fatturati"
target="_blank"
>Ranking</a> -
<a
href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-articles-sales"
target="_blank"
>Ranking</a
> e controlla se tutto ok
>(Ranking Ordini)</a>
e controlla se tutto ok
4. Esporta il file del Ranking ed importarlo con "IMPORTA RANKING DA JSON"
<a
href="http://vps-88271abb.vps.ovh.net/apimacro/public/export-articles-sales-json"
target="_blank"
>Esporta Ranking</a
>(Esporta Ranking Venduti e Fatturati)</a
>
5. Scarica Catalogo (<a
@@ -516,12 +532,6 @@
>Struttura Campi GM</a
>
<a
href="http://vps-88271abb.vps.ovh.net/apimacro/public/view-articles-sales"
target="_blank"
>Visualizza Descrizioni</a
>
<a
href="https://www.fioredellavita.it/wp-admin/admin.php?page=webappick-manage-feeds"
target="_blank"

View File

@@ -115,6 +115,13 @@ export default defineComponent({
}
})
function getParamCircuitsToView() {
return {
'circuit.name': 1,
'circuit._id': 1,
}
}
function loadAccount() {
// console.log('loadAccount')
account.value = circuit.value ? userStore.getAccountByCircuitId(circuit.value._id) : null
@@ -148,6 +155,10 @@ export default defineComponent({
notifStore.setAsRead(idnotif.value)
users_in_circuit.value = data.users_in_circuit
circuit.value = data.circuit
if (circuit.value!.circuitoIndipendente) {
showrules.value = true
}
} else {
circuit.value = null
users_in_circuit.value = []
@@ -204,7 +215,9 @@ export default defineComponent({
name: 1,
surname: 1,
date_reg: 1,
profile: 1, idapp: 1, 'circuit.name': 1, 'circuit._id': 1
profile: 1,
idapp: 1,
...getParamCircuitsToView(),
}
},
@@ -279,7 +292,7 @@ export default defineComponent({
verified_by_aportador: 1,
admins: 1,
idapp: 1,
'circuit.name': 1, 'circuit._id': 1
...getParamCircuitsToView(),
}
},
{

View File

@@ -43,17 +43,19 @@
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<q-card-section v-if="circuit.symbol === 'RIS'" class="inset-shadow">
<div v-html="t('circuit.disclaimer')"></div>
</q-card-section>
<q-card-section class="inset-shadow">
<div style="font-weight: bold; font-size: 1.25rem">
Regolamento:
{{ t('circuit.regulation') }} {{ circuit.name }}
</div>
<q-btn
v-if="!showrules"
label="vedi Regolamento"
@click="showrules = !showrules"
></q-btn>
<br />
<div
v-if="showrules && circuit"
v-html="getRegulation(circuit.regulation)"
@@ -72,7 +74,7 @@
userStore.my.username,
circuit.name,
true,
groupnameSel ? groupnameSel.groupname : ''
groupnameSel ? groupnameSel.groupname : '',
);
"
/>
@@ -113,11 +115,12 @@
v-close-popup
v-if="true"
@click="
saldo !== 0
saldo < 0
? tools.showNegativeNotif(
$q,
t(
'circuit.per_uscire_dal_circuito_occorre_essere_a_zero'
'circuit.per_uscire_dal_circuito_occorre_essere_a_zero',
{ symbol: circuit.symbol }
),
30000
)
@@ -179,7 +182,7 @@
to="/circuits"
round
icon="fas fa-arrow-circle-left"
style="position: absolute;"
style="position: absolute"
/>
</div>
<div
@@ -215,7 +218,7 @@
rounded
dense
color="green"
style="height: 40px;"
style="height: 40px"
icon="fas fa-redo"
class="q-mx-sm"
@click="aggiornaSaldo()"
@@ -336,7 +339,7 @@
v-if="userStore.IsMyCircuitByName(circuit.name)"
:label="t('circuit.movements_made')"
@click="showMov = !showMov"
icon="img: images/1ris_rosso_100.png"
:icon="tools.getSymbolByCircuit(circuit) === 'RIS' ? 'img: images/1ris_rosso_100.png' : undefined"
rounded
color="primary"
></q-btn>
@@ -394,6 +397,7 @@
v-if="
userStore.my.profile &&
userStore.my.profile.calc &&
!circuit.circuitoIndipendente &&
userStore.my.profile.calc.numGoodsAndServices <= 0 &&
globalStore.site.confpages.showRIS &&
userStore.IsMyCircuitByName(circuit.name)
@@ -414,6 +418,7 @@
<q-banner
v-else-if="
globalStore.site.confpages.showRIS &&
!circuit.circuitoIndipendente &&
userStore.my.profile.calc &&
userStore.my.profile.calc.numGoodsAndServices <= 0
"
@@ -442,14 +447,22 @@
!userStore.IsMyCircuitByName(circuit.name) &&
!userStore.IsAskedCircuitByName(circuit.name) &&
!userStore.IsRefusedCircuitByName(circuit.name) &&
(!circuitStore.isCircuitNational(circuit.name) ||
(circuit.circuitoIndipendente ||
!circuitStore.isCircuitNational(circuit.name) ||
(circuitStore.isCircuitNational(circuit.name) &&
circuitStore.SonoDentroAdAlmeno1CircuitoConFido()))
"
:disable="circuitStore.IsNationalAndNotEnterInLocal(circuit.name)"
:disable="
!circuit.circuitoIndipendente &&
circuitStore.IsNationalAndNotEnterInLocal(circuit.name)
"
icon="fas fa-user-plus"
color="primary"
:label="$t('circuit.ask')"
:label="
circuit.askManagerToEnter
? $t('circuit.ask')
: $t('circuit.enter')
"
@click="
requestToEnterCircuit = true;
groupnameSel = null;
@@ -740,7 +753,7 @@
<q-separator />
<q-card-section>
<div class="text-h8 q-mb-sm">
<div v-if="tools.getSymbolByCircuit(circuit) === 'RIS'" class="text-h8 q-mb-sm">
<div v-html="$t('circuit.aggiuntive')"></div>
</div>
<q-card-section>
@@ -838,6 +851,7 @@
<div :class="$q.screen.lt.sm ? '' : 'row'">
<div class="sezioni">
<CCurrencyValue
v-if="!circuit.ignoreLimits"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="red"
@@ -849,6 +863,7 @@
</div>
<div class="sezioni">
<CCurrencyValue
v-if="!circuit.ignoreLimits"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="green"
@@ -857,6 +872,16 @@
:label="t('circuit.qta_max_default')"
:tips="t('circuit.qta_max_default_tips')"
></CCurrencyValue>
<CCurrencyValue
v-if="circuit.creditodiPartenza > 0"
:symbol="tools.getSymbolByCircuit(circuit)"
:color="tools.getColorByCircuit(circuit)"
color_border="blue"
v-model="circuit.creditodiPartenza"
icon="fas fa-battery-quarter"
:label="t('circuit.creditodiPartenza')"
:tips="t('circuit.creditodiPartenza_tips')"
></CCurrencyValue>
</div>
<!--<div v-if="circuit.qta_max_default_grp" class="sezioni">
<CCurrencyValue
@@ -884,7 +909,7 @@
</div>
-->
</div>
<div class="sezioni">
<div v-if="circuit.totTransato" class="sezioni">
<q-icon name="fas fa-stats" class="iconcirc"></q-icon>
{{ t('circuit.stats') }}:
<br />
@@ -949,13 +974,14 @@
<q-card v-if="circuit.name">
<q-card-section>
<div class="text-h8">{{ t('circuit.regulation') }}:</div>
<div class="text-h8">{{ t('circuit.regulation') }} {{ circuit.name }}: </div>
</q-card-section>
<q-separator />
<q-card-section>
<div class="centermydiv">
<q-btn
v-if="!showrules"
label="vedi Regolamento"
@click="showrules = !showrules"
></q-btn>

View File

@@ -25,6 +25,8 @@ export default defineComponent({
const filter = ref(costanti.MY_CIRCUITS)
const ind = ref(0)
const isfinishLoading = computed(() => globalStore.finishLoading)
function mounted() {
@@ -32,6 +34,9 @@ export default defineComponent({
if (userStore.my.profile.mycircuits.length <= 0) {
filter.value = costanti.FIND_CIRCUIT
}
ind.value = tools.getIndMainCardsByTable(shared_consts.TABLES_CIRCUITS)
// const filt_loaded = tools.getCookie(tools.COOK_SEARCH + tools.CIRCUIT_SEARCH, costanti.FIND_CIRCUIT, true)
// console.log('filt_loaded', filt_loaded)
// filter.value = filt_loaded ? filt_loaded : costanti.FIND_CIRCUIT
@@ -51,6 +56,7 @@ export default defineComponent({
toolsext,
isfinishLoading,
tools,
ind,
}
}
})

View File

@@ -5,11 +5,12 @@
<CMyCircuits v-model="filter" :finder="true" :showfinder="true" :showBarSelection="true">
<CFinder
:ind="tools.getIndMainCardsByTable(shared_consts.TABLES_CIRCUITS)"
:ind="ind"
:table="shared_consts.TABLES_CIRCUITS"
:noButtAdd="!tools.isManager()"
:showFilterPersonal="true"
:showBarSelection="false"
:labelBtnAddExtra="(ind >= 0 && tools.isManager()) ? `Aggiungi ` + costanti.MAINCARDS[ind].strsingolo : ''"
/>
</CMyCircuits>
</div>