105 Commits

Author SHA1 Message Date
Surya Paolo
7c1946debe aa 2025-12-17 10:26:12 +01:00
Surya Paolo
7aeced4232 ok 2025-12-17 10:20:07 +01:00
Surya Paolo
6d78f82099 - aggiornamento di tante cose...
- generazione Volantini
- pagina RIS
2025-12-17 10:07:42 +01:00
Surya Paolo
89a8d10eae - verifica email se non è stata verificata (componente)
- altri aggiornamenti grafica PAGERIS.
- OLLAMA AI
2025-12-11 18:34:39 +01:00
Surya Paolo
6fdb101092 categorie 2025-12-07 15:17:37 +01:00
Surya Paolo
f238630dd7 ok 2025-12-07 10:47:58 +01:00
Surya Paolo
a22eca0f58 - aggiornati anche i ContribTypes che appaiono sulla card degli annunci 2025-12-07 10:26:30 +01:00
Surya Paolo
a4ca394e49 - Aggiornate tutte le categorie ottimizzandole.
- Migrazione delle vecchie categ. con quelle nuove.
- Create le Categorie e sottocategorie degli Eventi (a parte).
- Aggiornato la card dell'Ospitalità
2025-12-07 02:13:18 +01:00
Surya Paolo
5d35930dc8 - pagine RISO 2025-12-05 17:56:05 +01:00
Surya Paolo
a51bc5a8a2 - aggiornamenti guida RIS, FAQ
- Editor HTML aggiunto CSS e Script
- Statistiche
- CRISBalanceBar
- Inizio Sync... (ma disattivato)
2025-12-02 22:16:24 +01:00
Surya Paolo
8b6a636a96 - Nuova Home Page RISO Moderna! Passo 1 - la struttura 2025-11-29 21:14:26 +01:00
Surya Paolo
2abdda3b44 - aggiornato Card service, e CGridTableRec. 2025-11-28 21:28:31 +01:00
Surya Paolo
3018542868 - email Abilitazione Circuito RISO 2025-11-28 18:53:37 +01:00
Surya Paolo
cfb830a0ad - fix zona provinciale
- email abilitazione circuito: invio email ad admin
- admin che abilita la fiducia cliccando sul bottone
2025-11-27 23:51:43 +01:00
Surya Paolo
1bd41058a6 - se password errata deve comparire msg giusto 2025-11-27 03:36:06 +01:00
Surya Paolo
281be361ba - comune residenza anche sulla email
- comune non obbligatorio... Skippa
2025-11-27 03:14:56 +01:00
Surya Paolo
2dca358cd3 - corretto altre cose sulla registrazione 2025-11-27 01:11:59 +01:00
Surya Paolo
05bf8ad495 - aggiunto il Comune di Residenza alla REgistrazione e al Tutorial 2025-11-27 00:48:53 +01:00
Surya Paolo
145327a6ca - Corretto campo "Comune di Residenza".
- Aggiornato Completamento Profilo: Comune di Residenza.
- Registrazione
2025-11-26 18:32:05 +01:00
Surya Paolo
b37204f543 - primo aggiornamento myreccard
- aggiunta sito germogliamo.app
- aggiornato login con il parametro "browser_random" che serve per fare un login anche su 2 pagine contemporaneamente.
2025-11-25 17:45:17 +01:00
Surya Paolo
e9fa53a637 - aggiornati form registrazione
- Login
- Password dimenticata
- Aggiorna password.
- Email registrazione
- Ammetti Utente
2025-11-24 17:42:26 +01:00
Surya Paolo
9faaa1a4c3 - aggiornato la guida per installare la App
- aggiornato la Guida Completa e Breve di RISO.
- pagina per ricevere i RIS.
- sistemato problema creazione nuovi Circuiti (admin non corretti).
- corretto giro delle email, invitante, invitato e ricezione msg su telegram.
2025-11-23 01:13:27 +01:00
Surya Paolo
8ab7594f16 - sistemazioni Email : registrazione, invio invito, email di benvenuto
- fix circuito
- profilo
2025-11-21 20:47:35 +01:00
Surya Paolo
3c5287a13c - risolto problema sull'attivazione del Circuito ITA. non arrivava il messaggio
- sistemazioni sul profilo
2025-11-19 19:44:21 +01:00
Surya Paolo
57436f088b - asggiunto bottone "installa app" sulla email di conferma registrazione e anche la Guida "/guida".
- migliorato InvitaAmico
2025-11-19 11:39:36 +01:00
Surya Paolo
05a3617103 - invita amico 2025-11-19 10:09:45 +01:00
Surya Paolo
05dc22dac6 - Installa App e pagina Home Riso. 2025-11-19 01:02:47 +01:00
Surya Paolo
4985e7565d - Sistemato INVITI alla App
- Completamento Profilo
- Registrazione tramite Invito, senza richiedere conferma email.
2025-11-18 23:56:08 +01:00
Surya Paolo
fc569192e7 fix: se aggiungi XLS non si aggiornava la lista correttamente, non ricaricava... 2025-11-18 13:08:47 +01:00
Surya Paolo
4eb8838dbc corretto bug GruppoMacro la lista veniva salvata ma anche aggiornata in memoria con solo gli ID... in questo caso TABLES_NON_AGGIORNARE_IN_MEMORIA_PERCHE_DIVERSA_STRUTTURA gli dice che alcune tabelle non devono essere aggiornate in memoria. 2025-11-18 11:19:32 +01:00
Surya Paolo
b8df3ea721 - aggiornata la grafica della Home di RISO
- Profilo Completition
- Email Verificata
- Invita un Amico (invio di email)
2025-11-15 19:38:39 +01:00
Surya Paolo
d812c6c799 - versione: 1.2.77
- aggiustamenti e miglioramenti estetici
2025-11-03 14:24:10 +01:00
Surya Paolo
a164db8bf3 - migliorata grafica statistiche valori
- corretto pagina profilo
2025-11-03 01:47:21 +01:00
Surya Paolo
7e156ca820 - risolto problema spazi vuoti in cima alla app
- risolto problema sulle card di telegram, immagini non alte uguali e non si vedono bene...
2025-11-02 21:16:41 +01:00
Surya Paolo
d179581b23 - check updates
- risolto problema della generazione dei PDF, avevo modificato in CMyPageElem , se si cambia qualcosa occorre stare attenti a mettere !hideHeader
2025-11-01 12:00:49 +01:00
Surya Paolo
df98ec9471 - corretto problema ROGNOSO : Risolvere la questione "Sessioni multiple", se apro 2 browser l'ultimo va a cancellare il precedente, e mi da errore di email non valida !
Il problema era sulla fetch nel service worker, gestita in quel modo personalizzato, andava in conflitto, non tenendo le chiamate bloccanti, ma uscivano prima che arrivasse la risposta del server.
- Per chi è da tanto che non si collega a RISO, compare "Email non verificata"... (si risolve chiudendo su ESCI e riloggandosi)... però andrebbe sistemata.
(stesso problema di prima).
2025-10-26 02:47:59 +02:00
Surya Paolo
eb0fb72c70 - Sistemato problema del Circuito ITALIA, quando veniva fatta la richiesta di entrare, ancora non si era entrati nel circuito territoriale.
- Ora pertanto viene inviata la richiesta agli admin solo dopo che l'utente viene abilitato al Circuito provinciale.
2025-10-11 18:36:04 +02:00
Surya Paolo
2f39d4f1d9 - corretto componente CDateTime
- aggiunto componente CDateTimeStartEnd
2025-10-05 23:58:57 +02:00
Surya Paolo
58db59a751 modif 2025-10-05 11:16:01 +02:00
Surya Paolo
e827744f51 - aggiornato tabella modifica prodotti.
- codice sconto etichetta.
2025-10-03 18:02:26 +02:00
Surya Paolo
b07d4c822f - Gestore Ordini GAS (aggiornato)
- Possibilità di modificare un record, click sulla matita rossa.
- corretto altre sistemazioni sui valori di minimo e massimo quantità.
2025-10-03 16:28:46 +02:00
Surya Paolo
fc1e9d4666 Versione 1.2.71:
- sistemato il carrello su GruppoMacro e su PiuCheBuono.
- Corretto visualizzazione della scontistica.
- Se un prodotto viene cancellato ora lo cancella anche sul carrello.
2025-10-02 16:17:52 +02:00
Surya Paolo
05c97ab231 - corretto visualizzazione dei prodotti,
- inserimento nuovi prodotti nella tabella.
2025-09-27 20:43:46 +02:00
Surya Paolo
d6c0bcf879 - corretto gruppomacro catalogo, info prodotti, estrazione dati da amazon corretto. 2025-09-27 17:24:40 +02:00
Surya Paolo
c8589e794f - aggiunto componenti per Home Template... ma ancora da provare
- sistemato catprods
- Sistemato menu
2025-09-22 19:09:14 +02:00
Surya Paolo
917cdaa754 - aggiunto FeaturesSection all'editor HTML 2025-09-17 01:21:40 +02:00
Surya Paolo
e40bf8b73d -drag menu continua 2025-09-16 22:18:21 +02:00
Surya Paolo
95fa0b9ac0 - gestione dell'editor delle pagine (non funzionante!) 2025-09-16 17:30:28 +02:00
Surya Paolo
cb3baf3dbb - migliorata la grafica dell'aggiungi elemento. 2025-09-08 20:42:36 +02:00
Surya Paolo
ac84755dbb - sistemato editor di pagine (elementi) 2025-09-08 19:23:41 +02:00
Surya Paolo
cb0c26a43c - Editor Pagine Elementi: Sezione, Righe, Colonne, Elementi. (rows, columns, elems) 2025-09-08 01:02:32 +02:00
Surya Paolo
63d0f865fd - inizio di modifiche all'editor di Pagine Web 2025-09-05 01:05:36 +02:00
Surya Paolo
574f389200 - creato editor di Pagine (iniziato)
- fix: mancano i "t," su alcuni componenti...
2025-09-02 16:22:13 +02:00
Surya Paolo
4f4297ca21 - Modifiche a ProductInfo... Continua 2025-08-29 23:34:37 +02:00
Surya Paolo
5d8e38fea6 galleria prodotto 2025-08-12 19:43:36 +02:00
Surya Paolo
f1f3f5ad07 - Iniziato a scrivere la CHATBOT... 2025-08-09 00:48:44 +02:00
Surya Paolo
6013a624f6 - controllo della @ sull'username telegram (sugli Eventi)
- controllo email di test, se funzionante o no
2025-07-29 12:54:40 +02:00
Surya Paolo
85db3b4a61 - Ricerca delle Organizzazioni, per inviare i RIS. 2025-07-21 22:49:49 +02:00
Surya Paolo
31161b6a32 - entra in Circuito Italia subito, senza aspettare conferma... 2025-07-21 19:44:24 +02:00
Surya Paolo
6779b0ea25 - Poter impostare per ogni Provincia un Circuito RIS specifico, anziché quello provinciale:
Esempio: Napoli: (Circuito RIS Campania) e Sud Sardegna: Cagliari.
2025-07-21 19:08:37 +02:00
Surya Paolo
f12341f780 - Aggiunta possibilità di disattivare i link alle immagini dei libri. (opzione sul catalogo: disattiva_link_immagini) 2025-07-18 10:43:08 +02:00
Surya Paolo
43938023ee - Aggiunta della copertina iniziale nelle raccolte (Catalogo Generale).
- Corretto altezza delle immagini che erano stretchate.
- Fix: poter spostare l'ordinamento dei libri corretto.
2025-07-15 17:46:30 +02:00
Surya Paolo
969e7b726e - corretto import XLS... 2025-07-11 15:03:06 +02:00
Surya Paolo
d37797fdad - Import di un file XLS contenente una lista di libri, all'interno di un catalogo. 2025-07-11 12:55:24 +02:00
Surya Paolo
2ce8a72286 . esportazione lista catalogo direttamente in EXCEL, e scelta dei campi. 2025-07-10 00:43:28 +02:00
Surya Paolo
be0d7efca2 -statistiche OK 2025-07-08 18:01:17 +02:00
Surya Paolo
68dac1b2f4 aa 2025-07-08 17:42:46 +02:00
Surya Paolo
40ec5465b2 - Aggiunto le Statistiche di visualizzazione delle pagine.
- Aggiunto il componente per visualizzare le statistiche
2025-07-08 16:19:12 +02:00
Surya Paolo
7f5ff3da64 - Non funziona l'ammetti il nuovo registrato, sulla App.
- All'interno di una Organizzazione, mostrare se non si è ancora entrati in un Circuito, mettere bottone per Entrare.
2025-07-08 10:24:58 +02:00
Surya Paolo
ee5ac4e554 - aggiornato la versione STAMPA, che non funzionava 2025-07-07 09:37:48 +02:00
Surya Paolo
e7ead2e66a - Raccolte Cataloghi corretto e migliorato.
- Bottoni "Apri" e "PDF".
2025-07-06 23:12:56 +02:00
Surya Paolo
9e95fe622b - Sistemato i Referenti (e non Editori), quando crei un nuovo Catalogo ti imposta la proprietà a te, ma chiunque Collaboratore potrebbe cmq modificartelo. 2025-07-01 12:59:39 +02:00
Surya Paolo
4b65400d50 - inserito il componente per scegliere il colore e la trasparenza, dello sfondo della pagina introduttiva
- corretto i margini del testo e la dimensione del font.
2025-06-29 18:33:20 +02:00
Surya Paolo
99fab39c4b - aggiunto filtro nella lista producttable
- ora compare il bottone aggiungi alla lista solo se non è presente.
2025-06-25 17:48:21 +02:00
Surya Paolo
bfc6ec04f6 - corretto il titolo che lo prendo dall'estrazione del sito... JSON. 2025-06-23 20:45:40 +02:00
Surya Paolo
1298184b2e - Corretta query di estrapolazione libri su GM (Marco)
- aggiornato bestseller su fatlast1Y
- non mostrare piu i libri che non hanno l'immagine (sul catalogo).
- metti online i compressi
2025-06-16 19:36:48 +02:00
Surya Paolo
f146b36173 - Sistemato link pdf che ogni volta che si aggiorna prendeva il PDF dalla cache...
- Raccolta Cataloghi, procedura che li AUTO genera in automatico.
2025-06-13 17:45:57 +02:00
Surya Paolo
286cc4e3a7 - Creazione di un Nuovo Catalogo (e la sua relativa pagina), a partire da un modello ed un catalogo esistente.
- Aggiunta dei bottoni sul Ccatalogocard
2025-06-12 23:49:13 +02:00
Surya Paolo
2dac04fb16 - aggiornato carrello e bottoni sul catalogo 2025-06-12 10:08:07 +02:00
Surya Paolo
d99ad47483 - corretto la gestione degli Sconti
- Duplicare un Catalogo
2025-06-11 01:05:20 +02:00
Surya Paolo
56d1870bc1 - Esporta Lista Carrello (Totale)
- Sconto Applicato
2025-06-09 09:48:34 +02:00
Surya Paolo
664975b1fd - Aggiunto bottone Aggiungi al Carrello sulla lista dei libri dei cataloghi 2025-06-06 00:07:47 +02:00
Surya Paolo
06fe6eb861 - sistemato "Pare che selezionando una condizione, non sempre viene aggiornato il record !"
- Aggiunto filtro "Escludi Editoriale"
2025-06-04 15:46:29 +02:00
Surya Paolo
12f816b738 - Corretto la possibilità di effettuare un Ordine di libri, sul sito gruppomacro.app. arriverà una email a "info@gruppomacro.app". 2025-06-03 01:01:40 +02:00
Surya Paolo
94d844c104 - generazione della raccolta PDF OK !!! 2025-05-30 16:44:55 +02:00
Surya Paolo
72d5574fab - aggiornato la visualoizzazione per scaricare il PDF e per aprirlo 2025-05-30 10:49:25 +02:00
Surya Paolo
5ba3bef8a1 - anche la versione file compressa del PDF ora è ok. 2025-05-29 19:19:35 +02:00
Surya Paolo
67aaf719f4 - generazione del PDF riscritto totalmente
- ora è possibile generarlo anche da backend
- FIX: corretto la qualità del PDF e la dimensione non esatta in pixel...
2025-05-29 18:23:02 +02:00
Surya Paolo
884afe4eb5 - versione 1.2.50 2025-05-23 19:02:45 +02:00
Surya Paolo
3d2d1cbdd7 - Finalmente risolto il calcolo e l'impaginazione del PDF, per WEb e per Stampa (300 dpi) !
- corretto altre cose sulla lista cataloghi.
2025-05-23 16:31:04 +02:00
Surya Paolo
e0583044d7 - corretto footer catalogo
- corretti il path delle immagini (quando hanno lo spazio nel nomefile).
- aggiunto colore di sfondo per il testo descrittivo, in trasparenza
2025-05-21 12:06:09 +02:00
Surya Paolo
fea40922cb - Per generare la sinossi è possibile estrarre con 1 click la descrizione sia da Amazon che da GruppoMacro.
- corretto piccolo bug sul catalogo.
2025-05-20 12:21:31 +02:00
Surya Paolo
8ff204657e - Estrazione dei dati da Amazon
- Ciclo di Estrapolazione di tutti i prodotti ed aggiornamento dei campi scraped e scraped_updated
- Creazione file CSV con i campi modificati.
2025-05-19 17:33:18 +02:00
Surya Paolo
859ba022fa - estrazione dei dati del libro sul sito di Amazon.
- possibilità di visualizzare i dati estratti e di aggiornare i dati, sia solo se vuoti, che sovrascrivere tutti i dati.
2025-05-16 18:52:12 +02:00
Surya Paolo
810815a12a - ver 1.2.47 :
- corretto errore di modifica scheda
- aggiunto scraping (fase 1)
2025-05-16 10:26:29 +02:00
Surya Paolo
b7ecd60fc3 fix altro 2025-05-15 22:37:39 +02:00
Surya Paolo
daeb865e93 corretto altre cose (workbox mancante) 2025-05-15 21:41:25 +02:00
Surya Paolo
685bc34bd0 - ho migliorato la grafica della generazione del PDF e PDF Stampa. 2025-05-15 19:18:50 +02:00
Surya Paolo
9e0634da05 - ottimizzato il caricamento del sito
- ottimizzato il caricamento del catalogo.
2025-05-15 18:22:37 +02:00
Surya Paolo
50015712f5 - sistemato timeout corto
- corretto errori sulla generazione del PDF
- corretto alcune directory
- corretto fs.promise
- corretto CORS !
2025-05-15 14:27:40 +02:00
Surya Paolo
300b8434ef - il catalogo si aggiorna in base alle impostazioni del template anche per la "Stampa" 2025-05-14 20:18:04 +02:00
Surya Paolo
f30cbf072a - Assegnazione di linkIdTemplate anche per la "Pagina di Default", in modo che posso da "Templates" cambiare le impostazioni. 2025-05-14 17:04:18 +02:00
Surya Paolo
fc8a954eb0 - Generazione della Raccolta dei Cataloghi (web e Stampa), e creazione del PDF Online.
- Lista Raccolta Cataloghi, aggiungi/togli catalogo.
2025-05-14 15:02:14 +02:00
Surya Paolo
85faf11d27 - Creazione PDF Temporanei (Generati)
- Assegnazione di questi su PDF OnLine e PDF per Stampa
2025-05-12 18:43:25 +02:00
Surya Paolo
89bbda59b3 - Creazione PDF Temporanei (Generati)
- Assegnazione di questi su PDF OnLine e PDF per Stampa
2025-05-12 18:43:06 +02:00
1255 changed files with 4009056 additions and 32576 deletions

4
.env
View File

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

View File

@@ -1,12 +1,14 @@
VITE_APP_ID="18" VITE_APP_ID="13"
VITE_APP_URL="https://localhost" VITE_APP_URL="https://localhost"
VITE_MONGODB_HOST="https://localhost:3000" VITE_MONGODB_HOST="https://localhost:3000"
VITE_LOGO_REG='gruppomacro-logo-full.png' DEBUG_VITE_APP_URL="https://192.168.8.182"
DEBUG_VITE_MONGODB_HOST="https://192.168.8.182:3000"
VITE_LOGO_REG='riso-logo-full.png'
VITE_PUBLICKEY_PUSH='BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8' VITE_PUBLICKEY_PUSH='BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8'
VITE_DEBUG="1" VITE_DEBUG="1"
VITE_VUE_APP_ISTEST=0 VITE_VUE_APP_ISTEST=0
VITE_VUE_APP_INLOCALE=1 VITE_VUE_APP_INLOCALE=1
DIRECTORY_LOCAL="newfreeplanet" DIRECTORY_LOCAL="myprojplanet_vite"
DIRECTORY_SERVER="freeplanet_serverside" DIRECTORY_SERVER="freeplanet_serverside"
SERVERDIR_WEBSITE="" SERVERDIR_WEBSITE=""
SERVERPW_WEBSITE="" SERVERPW_WEBSITE=""

View File

@@ -1,13 +1,11 @@
VITE_APP_ID="18" VITE_APP_ID="13"
VITE_APP_URL="https://gruppomacro.app" VITE_APP_URL="https://riso.app"
VITE_MONGODB_HOST="https://api.gruppomacro.app" VITE_MONGODB_HOST="https://api.riso.app"
VITE_LOGO_REG='gruppomacro-logo-full.png' VITE_LOGO_REG='riso-logo-full.png'
VITE_PUBLICKEY_PUSH="BJgo8XR_upbnbMLWgCAUELo6DK7dRXffYAnFOxbaMMz5favBgcQBKT-eISqouO-jRad4Sw8l5nd2wCF6KorGiTc" VITE_PUBLICKEY_PUSH="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
VITE_DEBUG="0" VITE_DEBUG="0"
VITE_VUE_APP_ISTEST="0" VITE_VUE_APP_ISTEST="0"
DIRECTORY_LOCAL="myprojplanet_vite" DIRECTORY_LOCAL=myprojplanet_vite
DIRECTORY_SERVER="/var/www/nodejs_piuchebuono_server" DIRECTORY_SERVER=/var/www/nodejs_riso_server
SERVERDIR_WEBSITE="/var/www/gruppomacro.app" SERVERDIR_WEBSITE="/var/www/riso.app"
SERVERPW_WEBSITE="pwdadmin@1AOK" SERVERPW_WEBSITE="pwdadmin@1AOK"
PORT_SPA="8092"
PORT_PWA="8099"

3
.gitignore vendored
View File

@@ -30,7 +30,8 @@ yarn-error.log
/.scripts /.scripts
key.pem key.pem
public/upload/ public/upload/
upload/ /upload/
scripts/_ALL_SITES/gruppomacro.app/public/upload/
._yarn.lock ._yarn.lock
.gitignore .gitignore
._upload ._upload

View File

@@ -1,9 +1,8 @@
{ {
"singleAttributePerLine": true, "singleAttributePerLine": true,
"printWidth": 120, "printWidth": 90,
"tabWidth": 2, "tabWidth": 2,
"useTabs": false, "useTabs": false,
"semi": true,
"singleQuote": true, "singleQuote": true,
"trailingComma": "es5", "trailingComma": "es5",
"bracketSpacing": true, "bracketSpacing": true,

21
.vscode/launch.json vendored
View File

@@ -4,13 +4,6 @@
// Per altre informazioni, visitare: https://go.microsoft.com/fwlink/?linkid=830387 // Per altre informazioni, visitare: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{
"command": "npm run dev_noCheck",
"name": "DEV (no-check-TS)",
"request": "launch",
"type": "node-terminal",
"sourceMaps": false,
},
{ {
"command": "npm run dev", "command": "npm run dev",
"name": "DEV", "name": "DEV",
@@ -24,13 +17,6 @@
"type": "node-terminal", "type": "node-terminal",
"sourceMaps": false, "sourceMaps": false,
}, },
{
"command": "npm run lint",
"name": "Lint (Check ERRORI)",
"request": "launch",
"type": "node-terminal",
"sourceMaps": false
},
{ {
"command": "npm run pwa", "command": "npm run pwa",
"name": "PWA", "name": "PWA",
@@ -40,6 +26,13 @@
"NODE_ENV": "development" "NODE_ENV": "development"
} }
}, },
{
"command": "npm run lint",
"name": "Lint (Check ERRORI)",
"request": "launch",
"type": "node-terminal",
"sourceMaps": false
},
{ {
"type": "chrome", "type": "chrome",
"request": "launch", "request": "launch",

BIN
1_module copia.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,234 @@
SELECT T.*
,i.DescrizioneTipologia
,f.DescrizioneStatoProdotto
,n.DescrizioneFormato
,y.DescrizioneCollana
,z.AutoriCompleti
,i2.DescrArgomento
,z3.CasaEditrice
,q.QtaDisponibile
FROM
T_WEB_Articoli T
WITH (noLock)
RIGHT JOIN
( SELECT IdArticolo,
MAX(DataOra) AS data
FROM
T_WEB_Articoli
GROUP BY
IdArticolo ) b
ON
T.IdArticolo = b.IdArticolo
AND T.DataOra = b.data
RIGHT JOIN
( SELECT
e.IdStatoProdotto,
e.Descrizione as DescrizioneStatoProdotto
FROM
T_WEB_StatiProdotto e
JOIN
(
SELECT
IdStatoProdotto,
MAX(DataOra) as data1
FROM
T_WEB_StatiProdotto
GROUP BY
IdStatoProdotto ) c
ON
e.IdStatoProdotto = c.IdStatoProdotto
AND e.DataOra = c.data1 ) f
ON
T.IdStatoProdotto = f.IdStatoProdotto
RIGHT JOIN
(
SELECT
g.IdTipologia,
g.Descrizione as DescrizioneTipologia
FROM
T_WEB_Tipologie g
JOIN
(
SELECT
IdTipologia,
MAX(DataOra) as data1
FROM
T_WEB_Tipologie
GROUP BY
IdTipologia ) h
ON
g.IdTipologia = h.IdTipologia
AND g.DataOra = h.data1 ) i
ON
T.IdTipologia = i.IdTipologia
RIGHT JOIN
(
SELECT
l.IdTipoFormato,
l.Descrizione as DescrizioneFormato
FROM
T_WEB_TipiFormato l
JOIN
(
SELECT
IdTipoFormato,
MAX(DataOra) as data1
FROM
T_WEB_TipiFormato
GROUP BY
IdTipoFormato ) m
ON
l.IdTipoFormato = m.IdTipoFormato
AND l.DataOra = m.data1 ) n
ON
T.IdTipoFormato = n.IdTipoFormato
RIGHT JOIN
(
SELECT
v.IdCollana,
v.Descrizione as DescrizioneCollana
FROM
T_WEB_Collane v
INNER JOIN
(
SELECT
IdCollana,
MAX(ID) as MaxID
FROM
T_WEB_Collane
GROUP BY
IdCollana ) x
ON
v.IdCollana = x.IdCollana
AND v.ID = x.MaxID ) y
ON
T.IdCollana = y.IdCollana
RIGHT JOIN
(
SELECT
g2.IdArgomento,
g2.Descrizione as DescrArgomento
FROM
T_WEB_Argomenti g2
INNER JOIN
(
SELECT
IdArgomento,
MAX(DataOra) as data12
FROM
T_WEB_Argomenti
GROUP BY
IdArgomento ) h
ON
g2.IdArgomento = h.IdArgomento
AND g2.DataOra = h.data12 ) i2
ON
T.ListaArgomenti = i2.IdArgomento
RIGHT JOIN ( SELECT
o.Codice,
o.QtaDisponibile
FROM
T_WEB_Disponibile o
JOIN
(
SELECT
Codice,
MAX(DataOra) as data1
FROM
T_WEB_Disponibile
GROUP BY
Codice ) p
ON
o.Codice = p.Codice
AND o.DataOra = p.data1 ) q
ON
T.IdArticolo = q.Codice
RIGHT JOIN
(
SELECT
a3.IdMarchioEditoriale,
a3.Descrizione as CasaEditrice
FROM
T_WEB_MarchiEditoriali a3
JOIN
(
SELECT
IdMarchioEditoriale,
MAX(DataOra) as maxData
FROM
T_WEB_MarchiEditoriali
GROUP BY
IdMarchioEditoriale ) aa3
ON
a3.IdMarchioEditoriale = aa3.IdMarchioEditoriale
AND a3.DataOra = aa3.maxData ) z3
ON
T.IdMarchioEditoriale = z3.IdMarchioEditoriale
RIGHT JOIN
(
SELECT T1.IdArticolo, STUFF((
SELECT
',' + ISNULL(A2.AutoreCompleto, '')
FROM
(
SELECT
CAST('<root><x>' + REPLACE(T1.ListaAutori, ',', '</x><x>') + '</x></root>' AS XML) AS DataXML ) X
CROSS APPLY
X.DataXML.nodes('/root/x') AS A(x)
CROSS APPLY
(
SELECT
TRY_CAST(LTRIM(RTRIM(A.x.value('.', 'VARCHAR(100)'))) AS INT) AS AutoreID ) CA
LEFT JOIN
(
SELECT
a.IdAutore,
CONCAT(a.Nome, ' ', a.Cognome) AS AutoreCompleto
FROM
T_WEB_Autori a
RIGHT JOIN
(
SELECT
IdAutore,
MAX(DataOra) AS maxData
FROM
T_WEB_Autori
GROUP BY
IdAutore ) aa
ON
a.IdAutore = aa.IdAutore
AND a.DataOra = aa.maxData
) A2
ON
CA.AutoreID = A2.IdAutore FOR XML PATH(''),
TYPE ).value('.', 'NVARCHAR(MAX)') ,
1 ,
1 ,
'') AS AutoriCompleti
FROM T_WEB_Articoli T1
WHERE t1.DataOra = (select max(DataOra) AS DataOra from T_web_articoli As h WHERE h.IdArticolo = T1.IdArticolo)
GROUP BY T1.IdArticolo, T1.ListaAutori ) z ON T.IdArticolo = z.IdArticolo
WHERE
(
DescrizioneStatoProdotto = 'In commercio'
OR DescrizioneStatoProdotto = 'Prossima uscita/pubblicazione'
OR DescrizioneStatoProdotto = 'Prossima uscita'
OR DescrizioneStatoProdotto = 'In prevendita'
OR DescrizioneStatoProdotto = '2023 in commercio')
AND (
DescrizioneTipologia = 'Libri'
OR DescrizioneTipologia = 'Cartolibro'
OR DescrizioneTipologia = 'Carte')
AND (
Ean13 NOT LIKE 'USATO%')
ORDER BY T.IdArticolo DESC, Id DESC

1026
_LIMBO/aaa.scss Normal file

File diff suppressed because it is too large Load Diff

284201
_LIMBO/dati.js Normal file

File diff suppressed because it is too large Load Diff

467
_LIMBO/esempio.htm Normal file
View File

@@ -0,0 +1,467 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Carrello Prodotti - Design Moderno</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.cart-container {
max-width: 800px;
margin: 0 auto;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(20px);
border-radius: 24px;
padding: 32px;
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.15);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.cart-header {
text-align: center;
margin-bottom: 40px;
}
.cart-title {
font-size: 2.5rem;
font-weight: 700;
background: linear-gradient(135deg, #667eea, #764ba2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 8px;
}
.cart-subtitle {
color: #6b7280;
font-size: 1.1rem;
}
.product-card {
background: #ffffff;
border-radius: 20px;
padding: 24px;
margin-bottom: 20px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(0, 0, 0, 0.05);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateY(0);
}
.product-card:hover {
transform: translateY(-4px);
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.15);
}
.product-card.removing {
opacity: 0;
transform: translateX(100px);
transition: all 0.5s ease;
}
.product-content {
display: flex;
align-items: center;
gap: 20px;
}
.product-image {
width: 80px;
height: 80px;
border-radius: 16px;
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
flex-shrink: 0;
}
.product-info {
flex: 1;
}
.product-name {
font-size: 1.3rem;
font-weight: 600;
color: #1f2937;
margin-bottom: 4px;
}
.product-price {
font-size: 1.1rem;
color: #6b7280;
margin-bottom: 8px;
}
.product-total {
font-size: 1.2rem;
font-weight: 700;
color: #059669;
}
.quantity-controls {
display: flex;
align-items: center;
gap: 16px;
margin-top: 16px;
}
.quantity-btn {
width: 48px;
height: 48px;
border: none;
border-radius: 12px;
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
font-size: 1.2rem;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
}
.quantity-btn:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(102, 126, 234, 0.4);
}
.quantity-btn:active {
transform: translateY(0);
}
.quantity-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
.quantity-display {
min-width: 60px;
text-align: center;
font-size: 1.4rem;
font-weight: 600;
color: #1f2937;
background: #f8fafc;
border-radius: 12px;
padding: 12px 16px;
border: 2px solid #e2e8f0;
transition: all 0.3s ease;
}
.quantity-display.updating {
transform: scale(1.1);
border-color: #667eea;
background: #eff6ff;
}
.remove-btn {
background: linear-gradient(135deg, #ef4444, #dc2626);
color: white;
border: none;
border-radius: 12px;
padding: 12px 20px;
font-size: 0.9rem;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
margin-left: auto;
}
.remove-btn:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(239, 68, 68, 0.3);
}
.cart-summary {
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
border-radius: 20px;
padding: 24px;
margin-top: 32px;
text-align: center;
opacity: 1;
transition: all 0.3s ease;
}
.cart-summary.hidden {
opacity: 0;
transform: translateY(20px);
}
.total-amount {
font-size: 2rem;
font-weight: 700;
margin-bottom: 8px;
}
.total-items {
opacity: 0.9;
margin-bottom: 20px;
}
.checkout-btn {
background: rgba(255, 255, 255, 0.2);
border: 2px solid rgba(255, 255, 255, 0.3);
color: white;
padding: 16px 32px;
border-radius: 12px;
font-size: 1.1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
}
.checkout-btn:hover {
background: rgba(255, 255, 255, 0.3);
transform: translateY(-2px);
}
.empty-cart {
text-align: center;
padding: 60px 20px;
color: #6b7280;
opacity: 0;
transition: opacity 0.5s ease;
}
.empty-cart.show {
opacity: 1;
}
.empty-cart i {
font-size: 4rem;
margin-bottom: 20px;
opacity: 0.5;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.05); }
}
.pulse {
animation: pulse 0.3s ease-in-out;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in {
animation: fadeInUp 0.5s ease forwards;
}
@media (max-width: 768px) {
.product-content {
flex-direction: column;
text-align: center;
}
.quantity-controls {
justify-content: center;
}
.remove-btn {
margin: 16px auto 0;
}
}
</style>
</head>
<body>
<div class="cart-container">
<div class="cart-header">
<h1 class="cart-title">
<i class="fas fa-shopping-cart"></i>
Il Tuo Carrello
</h1>
<p class="cart-subtitle">Gestisci i tuoi prodotti preferiti</p>
</div>
<div id="empty-cart" class="empty-cart">
<i class="fas fa-shopping-bag"></i>
<h3>Il tuo carrello è vuoto</h3>
<p>Aggiungi alcuni prodotti per iniziare!</p>
</div>
<div id="cart-items"></div>
<div id="cart-summary" class="cart-summary">
<div class="total-amount" id="total-amount">€0.00</div>
<p class="total-items" id="total-items">0 articoli nel carrello</p>
<button class="checkout-btn" onclick="checkout()">
<i class="fas fa-credit-card"></i>
Procedi al Checkout
</button>
</div>
</div>
<script>
// Dati del carrello
let cartItems = [
{ id: 1, name: 'iPhone 15 Pro', price: 1199.99, quantity: 1, emoji: '📱' },
{ id: 2, name: 'MacBook Air M3', price: 1299.99, quantity: 2, emoji: '💻' },
{ id: 3, name: 'AirPods Pro', price: 279.99, quantity: 1, emoji: '🎧' },
{ id: 4, name: 'Apple Watch', price: 399.99, quantity: 1, emoji: '⌚' }
];
// Elementi DOM
const cartItemsContainer = document.getElementById('cart-items');
const emptyCartDiv = document.getElementById('empty-cart');
const cartSummaryDiv = document.getElementById('cart-summary');
const totalAmountSpan = document.getElementById('total-amount');
const totalItemsSpan = document.getElementById('total-items');
// Funzioni di calcolo
function calculateTotal() {
return cartItems.reduce((total, item) => total + (item.price * item.quantity), 0);
}
function calculateTotalItems() {
return cartItems.reduce((total, item) => total + item.quantity, 0);
}
// Funzione per creare HTML di un prodotto
function createProductHTML(item) {
return `
<div class="product-card fade-in" data-id="${item.id}">
<div class="product-content">
<div class="product-image">
${item.emoji}
</div>
<div class="product-info">
<h3 class="product-name">${item.name}</h3>
<p class="product-price">€${item.price.toFixed(2)} / unità</p>
<p class="product-total">Totale: €${(item.price * item.quantity).toFixed(2)}</p>
<div class="quantity-controls">
<button
class="quantity-btn"
onclick="decreaseQuantity(${item.id})"
${item.quantity <= 1 ? 'disabled' : ''}
>
<i class="fas fa-minus"></i>
</button>
<div class="quantity-display" id="qty-${item.id}">
${item.quantity}
</div>
<button
class="quantity-btn"
onclick="increaseQuantity(${item.id})"
>
<i class="fas fa-plus"></i>
</button>
</div>
</div>
<button
class="remove-btn"
onclick="removeItem(${item.id})"
>
<i class="fas fa-trash"></i>
Rimuovi
</button>
</div>
</div>
`;
}
// Funzione per aggiornare l'interfaccia
function updateUI() {
// Aggiorna contenuto carrello
if (cartItems.length === 0) {
cartItemsContainer.innerHTML = '';
emptyCartDiv.classList.add('show');
cartSummaryDiv.classList.add('hidden');
} else {
emptyCartDiv.classList.remove('show');
cartSummaryDiv.classList.remove('hidden');
cartItemsContainer.innerHTML = cartItems.map(createProductHTML).join('');
}
// Aggiorna totali
const total = calculateTotal();
const totalItems = calculateTotalItems();
totalAmountSpan.textContent = `${total.toFixed(2)}`;
totalItemsSpan.textContent = `${totalItems} ${totalItems === 1 ? 'articolo' : 'articoli'} nel carrello`;
}
// Funzioni per gestire quantità
function increaseQuantity(itemId) {
const item = cartItems.find(item => item.id === itemId);
if (item) {
item.quantity++;
// Animazione feedback
const qtyDisplay = document.getElementById(`qty-${itemId}`);
qtyDisplay.classList.add('updating');
setTimeout(() => qtyDisplay.classList.remove('updating'), 300);
updateUI();
}
}
function decreaseQuantity(itemId) {
const item = cartItems.find(item => item.id === itemId);
if (item && item.quantity > 1) {
item.quantity--;
// Animazione feedback
const qtyDisplay = document.getElementById(`qty-${itemId}`);
qtyDisplay.classList.add('updating');
setTimeout(() => qtyDisplay.classList.remove('updating'), 300);
updateUI();
}
}
// Funzione per rimuovere prodotto
function removeItem(itemId) {
const productCard = document.querySelector(`[data-id="${itemId}"]`);
productCard.classList.add('removing');
setTimeout(() => {
cartItems = cartItems.filter(item => item.id !== itemId);
updateUI();
}, 500);
}
// Funzione checkout
function checkout() {
const total = calculateTotal();
const totalItems = calculateTotalItems();
alert(`Checkout per €${total.toFixed(2)} - ${totalItems} articoli`);
}
// Inizializza l'interfaccia
document.addEventListener('DOMContentLoaded', function() {
updateUI();
});
</script>
</body>
</html>

2969
_LIMBO/faq_ris.html Normal file

File diff suppressed because it is too large Load Diff

482
_LIMBO/prova.json Normal file
View File

@@ -0,0 +1,482 @@
{
"_id": "67c081c848070128c51a85f9",
"idCity": [
6846
],
"visibility": [
0
],
"photos": [],
"date_created": "2025-02-27T15:16:24.794Z",
"admins": [
{
"username": "EmanuelaBattiston",
"_id": "68e677e16e7cd5feeb0bb540",
"profile": {
"img": "file_1558.jpg"
}
},
{
"username": "Surya1977",
"_id": "68e677e16e7cd5feeb0bb541"
}
],
"date_updated": "2025-10-08T14:40:33.593Z",
"idCatGrp": [
34,
37,
18,
4,
8,
41
],
"note": "",
"groupname": "GruppoYurta",
"website": "",
"link_telegram": "",
"title": "Gruppo Yurta Bagnarola Pn",
"descr": "Gruppo Yurta ",
"mycircuits": [
{
"_id": "64ede1fb25cbe40cd4a5f156",
"idCity": [
5429
],
"visibility": [],
"compara_valuta": 1,
"compara_euro": 1,
"valuta_per_euro": 1,
"deleted": false,
"numMembers": 48,
"status": 3,
"idapp": "13",
"name": "Circuito RIS Pordenone",
"path": "rispordenone",
"strProv": "PN",
"photos": [],
"color": "#ff5500",
"deperimento": false,
"transactionsEnabled": true,
"symbol": "RIS",
"fido_scoperto_default": 100,
"qta_max_default": 200,
"fido_scoperto_default_grp": 200,
"qta_max_default_grp": 400,
"totTransato": 1239.67,
"totCircolante": 298.8,
"date_created": "2023-08-29T12:18:03.441Z",
"admins": [
{
"_id": "652daab56db4df3e408322f7",
"username": "vivy_BORGO_cohousing",
"date": "2023-10-16T21:27:17.466Z"
},
{
"_id": "6771a4d6e9c03f06f5a6c8d1",
"username": "Rita_Lila",
"date": "2024-12-29T19:36:54.054Z"
}
],
"req_users": [
{
"username": "elpapais",
"date": "2024-07-26T13:48:57.280Z"
},
{
"username": "Funnyface",
"date": "2025-07-09T03:54:40.132Z"
}
],
"refused_users": [],
"req_groups": [
{
"groupname": "GruppoYurta",
"date": "2025-03-02T17:40:09.375Z"
}
],
"refused_groups": [],
"__v": 0,
"date_updated": "2024-12-12T17:10:07.913Z",
"createdBy": "surya1977",
"link_group": "https://t.me/+xXhBrUdnAL5mMjQ0",
"regulation": "",
"account": {
"_id": "67c497f9da76b7d9485f947d",
"importo_iniziale": 0,
"saldo": -4,
"totTransato": 4,
"saldo_pend": -4,
"totTransato_pend": 4,
"deleted": false,
"idapp": "13",
"username": "",
"groupname": "GruppoYurta",
"contocom": "",
"circuitId": "64ede1fb25cbe40cd4a5f156",
"deperibile": false,
"fidoConcesso": 200,
"qta_maxConcessa": 400,
"numtransactions": 1,
"date_created": "2025-03-02T17:40:09.370Z",
"__v": 0,
"date_updated": "2025-04-16T21:37:20.921Z"
}
},
{
"_id": "6530e646e6173ad77d585a59",
"idCity": [
4647
],
"visibility": [],
"compara_valuta": 1,
"compara_euro": 1,
"valuta_per_euro": 1,
"deleted": false,
"numMembers": 642,
"status": 3,
"name": "Circuito RIS Italia",
"subname": "",
"photos": [
{
"imagefile": "italia.jpg",
"_id": "65f4a4fced899d0f453a446e"
}
],
"admins": [
{
"username": "surya1977",
"_id": "6530e6466db4df3e4084e559"
},
{
"username": "ElenaEspx",
"date": "2023-12-02T13:58:54.136Z",
"_id": "656b381e896ebebd4352fee5"
},
{
"username": "LorenzoVT",
"date": "2023-12-02T16:23:01.100Z",
"_id": "656b59e5896ebebd43537648"
},
{
"username": "sergiomazzanti",
"date": "2023-12-03T19:26:14.691Z",
"_id": "656cd656e5afbcdb03401577"
},
{
"username": "GaetanoSant",
"date": "2024-04-01T15:08:31.262Z",
"_id": "660acdef3d8585261113e378"
}
],
"color": "#ff5500",
"deperimento": false,
"transactionsEnabled": true,
"symbol": "RIS",
"fido_scoperto_default": 200,
"qta_max_default": 400,
"fido_scoperto_default_grp": 400,
"qta_max_default_grp": 800,
"totTransato": 3235.98,
"totCircolante": 1788.66,
"idapp": "13",
"path": "ris_italia",
"longdescr": "Questo è il Circuito RIS Italia Nazionale",
"strProv": "ITA",
"createdBy": "surya1977",
"date_updated": "2025-11-19T16:49:21.786Z",
"req_users": [
{
"username": "MaxCerba",
"date": "2024-01-12T19:30:09.852Z"
},
{
"username": "moretta369",
"date": "2024-02-09T11:18:39.053Z"
},
{
"username": "Pennyboh",
"date": "2024-05-05T13:26:41.414Z"
},
{
"username": "matslats",
"date": "2024-05-11T07:35:03.008Z"
},
{
"username": "Versolaluce",
"date": "2024-05-13T14:59:17.053Z"
},
{
"username": "Nonnapapera",
"date": "2024-05-25T16:02:41.456Z"
},
{
"username": "bluvero",
"date": "2024-06-01T19:33:42.158Z"
},
{
"username": "HERMESRISO",
"date": "2024-06-01T19:48:33.955Z"
},
{
"username": "FrancescaM68",
"date": "2024-06-08T15:59:07.476Z"
},
{
"username": "lucamop",
"date": "2024-06-09T19:06:30.339Z"
},
{
"username": "Cinestesico",
"date": "2024-06-14T13:51:24.025Z"
},
{
"username": "BeataLei",
"date": "2024-06-25T08:10:37.853Z"
},
{
"username": "Fabiozero",
"date": "2024-06-30T18:46:27.545Z"
},
{
"username": "Giory73",
"date": "2024-07-03T06:37:53.633Z"
},
{
"username": "nadia_blu",
"date": "2024-07-20T10:49:53.924Z"
},
{
"username": "evi4evi",
"date": "2024-07-26T14:23:55.533Z"
},
{
"username": "edellatorre",
"date": "2024-07-27T18:26:24.688Z"
},
{
"username": "Carlo",
"date": "2024-07-27T19:45:29.135Z"
},
{
"username": "Moscadri",
"date": "2024-08-01T16:00:26.567Z"
},
{
"username": "LaMis69",
"date": "2024-08-03T18:59:12.520Z"
},
{
"username": "Lamary",
"date": "2024-08-05T04:42:44.688Z"
},
{
"username": "Germana69",
"date": "2024-08-20T20:05:04.213Z"
},
{
"username": "A_tempesta",
"date": "2024-09-22T11:56:09.201Z"
},
{
"username": "mammalella960",
"date": "2024-10-05T10:37:22.645Z"
},
{
"username": "stefanci87",
"date": "2024-10-12T12:18:00.174Z"
},
{
"username": "clarajam",
"date": "2024-10-17T09:25:01.462Z"
},
{
"username": "iceborg500",
"date": "2024-11-20T12:14:51.302Z"
},
{
"username": "francomario",
"date": "2024-12-09T21:57:33.730Z"
},
{
"username": "cristy",
"date": "2024-12-17T11:40:35.792Z"
},
{
"username": "Carla57",
"date": "2025-01-22T17:50:35.640Z"
},
{
"username": "Dasete68",
"date": "2025-02-01T20:31:10.078Z"
},
{
"username": "Mariarosa2025",
"date": "2025-02-02T17:41:51.850Z"
},
{
"username": "Lisa_Logozzo_albergo_del_pastore",
"date": "2025-02-23T18:37:27.362Z"
},
{
"username": "ClaudioPoliPaneArtigianale",
"date": "2025-03-11T11:15:59.012Z"
},
{
"username": "Dantib93",
"date": "2025-03-13T19:49:58.109Z"
},
{
"username": "sbubovic",
"date": "2025-03-16T21:52:00.958Z"
},
{
"username": "sdhc5Giancarlo",
"date": "2025-03-18T20:38:16.668Z"
},
{
"username": "Nicmestre",
"date": "2025-05-08T15:50:19.266Z"
},
{
"username": "ginoarrigo",
"date": "2025-07-30T14:03:30.143Z"
},
{
"username": "FaniaFida",
"date": "2025-08-12T06:38:18.063Z"
},
{
"username": "SismaLux",
"date": "2025-08-16T14:49:00.704Z"
},
{
"username": "valeindaco27",
"date": "2025-09-10T10:19:55.354Z"
},
{
"username": "WellnessProfessionalTreatments1",
"date": "2025-09-17T19:24:29.998Z"
},
{
"username": "manuelaFio",
"date": "2025-10-01T09:20:05.388Z"
},
{
"username": "Merylilith",
"date": "2025-10-02T09:48:26.045Z"
},
{
"username": "Fabiobrent",
"date": "2025-10-05T12:21:03.635Z"
},
{
"username": "attenomis67",
"date": "2025-10-08T22:31:40.981Z"
},
{
"username": "fioretav",
"date": "2025-10-18T03:13:23.773Z"
},
{
"username": "Toninonature",
"date": "2025-10-19T21:18:37.796Z"
},
{
"username": "surya4",
"date": "2025-11-11T16:37:40.467Z"
},
{
"username": "surya8",
"date": "2025-11-18T22:20:20.964Z"
}
],
"refused_users": [],
"req_groups": [
{
"groupname": "PiuCheBuono(GaseBottega)",
"date": "2024-01-03T10:32:03.312Z"
},
{
"groupname": "GruppoYurta",
"date": "2025-03-02T17:41:12.653Z"
},
{
"groupname": "LaValledelMirto",
"date": "2025-05-17T06:42:18.212Z"
}
],
"refused_groups": [],
"date_created": "2023-10-19T08:18:14.701Z",
"__v": 0,
"regulation": "",
"showAlways": true,
"isCircItalia": true,
"circuitiExtraProv": true,
"account": {
"_id": "67c49838da76b7d9485f947f",
"importo_iniziale": 0,
"saldo": 17,
"totTransato": 17,
"saldo_pend": 17,
"totTransato_pend": 17,
"deleted": false,
"idapp": "13",
"username": "",
"groupname": "GruppoYurta",
"contocom": "",
"circuitId": "6530e646e6173ad77d585a59",
"deperibile": false,
"fidoConcesso": 400,
"qta_maxConcessa": 800,
"numtransactions": 4,
"date_created": "2025-03-02T17:41:12.650Z",
"__v": 0,
"date_updated": "2025-04-16T20:33:06.262Z"
}
}
],
"recCatGrp": [
{
"_id": 4,
"descr": "Prodotti Artigianali e Artistici",
"__v": 0,
"color": "#9C27B0",
"icon": "fa fa-paint-brush"
},
{
"_id": 8,
"descr": "Servizi Formativi ed Educativi",
"__v": 0,
"color": "#FFC107",
"icon": "fa fa-book"
},
{
"_id": 18,
"descr": "Salute e Benessere",
"__v": 0,
"color": "#E91E63",
"icon": "fa fa-heart"
},
{
"_id": 34,
"descr": "Attività Ricreative e di Intrattenim.",
"__v": 0,
"color": "#FF5722",
"icon": "fa fa-music"
},
{
"_id": 37,
"descr": "Cura della persona",
"__v": 0,
"color": "#FFEB3B",
"icon": "fa fa-user"
},
{
"_id": 41,
"descr": "Servizi e prodotti per la casa",
"__v": 0,
"color": "#FF9800",
"icon": "fa fa-home"
}
]
}

113
_LIMBO/queryoriginale.sql Normal file
View File

@@ -0,0 +1,113 @@
SELECT TOP 10000
T.*
,i.DescrizioneTipologia
,f.DescrizioneStatoProdotto
,n.DescrizioneFormato
,y.DescrizioneCollana
,z.AutoriCompleti
,i2.DescrArgomento
,z3.CasaEditrice ,q.QtaDisponibile FROM T_WEB_Articoli T
JOIN(
SELECT IdArticolo, MAX(DataOra) AS data
FROM T_WEB_Articoli
GROUP BY IdArticolo
) b ON T.IdArticolo = b.IdArticolo AND T.DataOra = b.data LEFT JOIN(
SELECT e.IdStatoProdotto, e.Descrizione as DescrizioneStatoProdotto
FROM T_WEB_StatiProdotto e
JOIN(
SELECT IdStatoProdotto, MAX(DataOra) as data1
FROM T_WEB_StatiProdotto
GROUP BY IdStatoProdotto
) c ON e.IdStatoProdotto = c.IdStatoProdotto AND e.DataOra = c.data1
) f ON T.IdStatoProdotto = f.IdStatoProdotto
LEFT JOIN(
SELECT g.IdTipologia, g.Descrizione as DescrizioneTipologia
FROM T_WEB_Tipologie g
JOIN(
SELECT IdTipologia, MAX(DataOra) as data1
FROM T_WEB_Tipologie
GROUP BY IdTipologia
) h ON g.IdTipologia = h.IdTipologia AND g.DataOra = h.data1
) i ON T.IdTipologia = i.IdTipologia
LEFT JOIN(
SELECT l.IdTipoFormato, l.Descrizione as DescrizioneFormato
FROM T_WEB_TipiFormato l
JOIN(
SELECT IdTipoFormato, MAX(DataOra) as data1
FROM T_WEB_TipiFormato
GROUP BY IdTipoFormato
) m ON l.IdTipoFormato = m.IdTipoFormato AND l.DataOra = m.data1
) n ON T.IdTipoFormato = n.IdTipoFormato
LEFT JOIN(
SELECT v.IdCollana, v.Descrizione as DescrizioneCollana
FROM T_WEB_Collane v
INNER JOIN(
SELECT IdCollana, MAX(ID) as MaxID
FROM T_WEB_Collane
GROUP BY IdCollana
) x ON v.IdCollana = x.IdCollana AND v.ID = x.MaxID
) y ON T.IdCollana = y.IdCollana
LEFT JOIN(
SELECT g2.IdArgomento, g2.Descrizione as DescrArgomento
FROM T_WEB_Argomenti g2
INNER JOIN(
SELECT IdArgomento, MAX(DataOra) as data12
FROM T_WEB_Argomenti
GROUP BY IdArgomento
) h ON g2.IdArgomento = h.IdArgomento AND g2.DataOra = h.data12
) i2 ON T.ListaArgomenti = i2.IdArgomento
LEFT JOIN(
SELECT
T1.IdArticolo,
STUFF((
SELECT ',' + ISNULL(A2.AutoreCompleto, '')
FROM(
SELECT CAST('<root><x>' + REPLACE(T1.ListaAutori, ',', '</x><x>') + '</x></root>' AS XML) AS DataXML
) X
CROSS APPLY X.DataXML.nodes('/root/x') AS A(x)
CROSS APPLY(
SELECT TRY_CAST(LTRIM(RTRIM(A.x.value('.', 'VARCHAR(100)'))) AS INT) AS AutoreID
) CA
JOIN(
SELECT a.IdAutore, CONCAT(a.Nome, ' ', a.Cognome) AS AutoreCompleto
FROM T_WEB_Autori a
JOIN(
SELECT IdAutore, MAX(DataOra) AS maxData
FROM T_WEB_Autori
GROUP BY IdAutore
) aa ON a.IdAutore = aa.IdAutore AND a.DataOra = aa.maxData
) A2 ON CA.AutoreID = A2.IdAutore
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS AutoriCompleti
FROM T_WEB_Articoli T1
GROUP BY T1.IdArticolo, T1.ListaAutori
) z ON T.IdArticolo = z.IdArticolo
LEFT JOIN(
SELECT a3.IdMarchioEditoriale, a3.Descrizione as CasaEditrice
FROM T_WEB_MarchiEditoriali a3
JOIN(
SELECT IdMarchioEditoriale, MAX(DataOra) as maxData
FROM T_WEB_MarchiEditoriali
GROUP BY IdMarchioEditoriale
) aa3 ON a3.IdMarchioEditoriale = aa3.IdMarchioEditoriale AND a3.DataOra = aa3.maxData
) z3 ON T.IdMarchioEditoriale = z3.IdMarchioEditoriale LEFT JOIN(
SELECT o.Codice, o.QtaDisponibile
FROM T_WEB_Disponibile o
JOIN(
SELECT Codice, MAX(DataOra) as data1
FROM T_WEB_Disponibile
GROUP BY Codice
) p ON o.Codice = p.Codice AND o.DataOra = p.data1
) q ON T.IdArticolo = q.Codice WHERE
(DescrizioneStatoProdotto = 'In commercio' OR
DescrizioneStatoProdotto = 'Prossima uscita/pubblicazione' OR
DescrizioneStatoProdotto = 'Prossima uscita' OR
DescrizioneStatoProdotto = 'In prevendita' OR
DescrizioneStatoProdotto = '2023 in commercio')
AND
(DescrizioneTipologia = 'Libri' OR
DescrizioneTipologia = 'Cartolibro' OR
DescrizioneTipologia = 'Carte')
AND
(Ean13 NOT LIKE 'USATO%')

2293
_LIMBO/risospiegazione.html Normal file

File diff suppressed because it is too large Load Diff

63
_LIMBO/tutorial.htm Normal file
View File

@@ -0,0 +1,63 @@
<div>
<br>
</div>
<div>
<b>
<font size="4">TUTORIAL</font>
</b>
</div>
<div>
<ul>
<li>
<font size="4">
<a href="https://gruppomacro.app/upload/video/Come_generare_un_Catalogo_Personalizzato.mp4?id=1">
Come generare un Catalogo Personalizzato
</a>
(1 luglio 2025)
</font>
</li>
<li>
<font size="4">
<a href="https://gruppomacro.app/upload/video/Come_cercare_un_Libro.mp4">
Come cercare un Libro
</a>
(23 giugno 2025)
</font>
</li>
<li>
<font size="4">
<a href="https://gruppomacro.app/upload/video/Come_Inserire_la_sinossi_del_libri_sul_Catalogo.mp4">
Come inserire la Sinossi di un libro
</a>
(30 maggio 2025)
</font>
</li>
<li>
<font size="4">
<a href="https://gruppomacro.app/upload/video/Come_generare_un_catalogo_per_argomento.mp4">
Come generare un Catalogo per argomento
</a>
(30 maggio 2025)
</font>
</li>
<li>
<font size="4">
<a href="https://gruppomacro.app/upload/video/Creazione_di_una_Lista_di_un_Catalogo.mp4">
Come creare (ed aggiornare) una lista di libri del Catalogo
</a>
(6 maggio 2025)
</font>
</li>
<li>
<font size="4">
<a href="https://gruppomacro.app/upload/video/Aggiungere_la_Sinossi_di_un_libro.mp4">
Come aggiungere la sinossi (trafiletto) di un libro
</a>
(6 maggio 2025)
</font>
</li>
</ul>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
files.zip Normal file

Binary file not shown.

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
install_app_on_safari.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

28
migrate-repos.sh Executable file
View File

@@ -0,0 +1,28 @@
#!/bin/bash
# Salva come migrate-repos.sh
GITEA_URL="http://95.216.147.38:3000"
USERNAME="surya"
TOKEN="8ed0622aac269414f4d333d0c89e22b1c42dd4d1" # Crea su Gitea: Settings → Applications → Generate Token
SEARCH_PATH="$HOME/myproject"
# Trova tutti i repository
find "$SEARCH_PATH" -name ".git" -type d 2>/dev/null | while read gitdir; do
REPO_PATH=$(dirname "$gitdir")
REPO_NAME=$(basename "$REPO_PATH")
echo "Processing: $REPO_NAME"
# Crea repository su Gitea via API
curl -X POST "$GITEA_URL/api/v1/user/repos" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$REPO_NAME\",\"private\":false}"
# Push
cd "$REPO_PATH"
git remote remove origin 2>/dev/null
git remote add origin "$GITEA_URL/$USERNAME/$REPO_NAME.git"
git push -u origin --all
git push -u origin --tags
done

View File

@@ -1,143 +1,139 @@
{ {
"name": "gruppomacro", "name": "riso",
"version": "1.2.42", "version": "1.2.86",
"description": "Gruppo Macro", "productName": "Riso 💚 - Rete Italiana Scambio orizzontale",
"productName": "Gruppo Macro", "description": "Progetto RISO (Rete Italiana Scambio orizzontale) promuove una rete di comunità locali che favoriscono scambi di beni, servizi e ospitalità. Con l'App RISO, sviluppata per facilitare il baratto, il dono e l'uso di monete alternative come i RIS, il progetto crea legami autentici basati sulla fiducia e sostenibilità. Partecipa agli scambi e costruisci una comunità più consapevole e autosufficiente.",
"author": "Surya", "author": "Surya",
"private": true, "private": true,
"keywords": [], "keywords": [],
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "PORT=8089 APP_VERSION='1.2.42' quasar dev", "dev": "APP_VERSION='1.2.86' PORT=8084 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev", "dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build", "build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.42' quasar build -m pwa", "buildpwa": "NODE_ENV=production APP_VERSION='1.2.86' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.42' quasar build -m pwa", "buildpwatest": "NODE_ENV=production APP_VERSION='1.2.86' quasar build -m pwa",
"type-check": "vue-tsc --noEmit", "type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch", "type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.42' quasar build -m spa", "buildspa": "quasar build -m spa",
"lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"", "lint": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\"",
"lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt", "lintfile": "eslint --ext .js,.ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt", "lintfileNoJS": "eslint --ext .ts,.vue --ignore-path .gitignore ./ > file.out.txt",
"fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt", "fix": "eslint -c ./eslint.config.js \"./src*/**/*.{ts,js,cjs,mjs,vue}\" --ignore-pattern .gitignore ./ --fix > file.out.txt",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.42' quasar dev -m pwa", "pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.86' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.42' quasar dev", "spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.86' quasar dev",
"debug": "quasar dev --mode debug", "debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0", "test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js", "generate-sw": "workbox generateSW workbox-config.js",
"postinstall": "quasar prepare" "postinstall": "quasar prepare"
}, },
"dependencies": { "dependencies": {
"@cubejs-client/core": "^1.2.26", "@cubejs-client/core": "^1.5.11",
"@quasar/extras": "^1.16.17", "@quasar/extras": "^1.17.0",
"@quasar/quasar-ui-qcalendar": "^4.1.2", "@quasar/quasar-ui-qcalendar": "^4.1.2",
"@syncfusion/ej2-vue-pdfviewer": "^29.1.40",
"@types/jsbarcode": "^3.11.4", "@types/jsbarcode": "^3.11.4",
"@types/leaflet": "^1.9.17", "@types/leaflet": "^1.9.21",
"@vue/compat": "^3.5.13", "@vue/compat": "^3.5.25",
"@vue/compiler-sfc": "^3.5.13", "@vue/compiler-sfc": "^3.5.25",
"@vuelidate/core": "^2.0.3", "@vuelidate/core": "^2.0.3",
"@vuelidate/validators": "^2.0.4", "@vuelidate/validators": "^2.0.4",
"acorn": "^8.14.1", "acorn": "^8.15.0",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"apexcharts": "^4.7.0", "apexcharts": "^5.3.6",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.22",
"axios": "^1.8.4", "axios": "^1.13.2",
"bcryptjs": "^3.0.2", "bcryptjs": "^3.0.3",
"chart.js": "^4.4.8", "chart.js": "^4.5.1",
"core-js": "^3.41.0", "core-js": "^3.47.0",
"crypto-browserify": "^3.12.1", "crypto-browserify": "^3.12.1",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"echarts": "5.6.0", "echarts": "6.0.0",
"eslint-plugin-n": "^17.16.2", "eslint-plugin-n": "^17.23.1",
"eslint-plugin-quasar": "^1.1.0", "eslint-plugin-quasar": "^1.1.0",
"graphql": "^16.10.0", "gsap": "^3.13.0",
"graphql-tag": "^2.12.6",
"gsap": "^3.12.7",
"html2pdf.js": "^0.10.3",
"jquery": "^3.7.1", "jquery": "^3.7.1",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"jsbarcode": "^3.11.6", "jsbarcode": "^3.12.1",
"leaflet": "^1.9.4", "leaflet": "^1.9.4",
"leaflet-routing-machine": "^3.2.12", "leaflet-routing-machine": "^3.2.12",
"leaflet.markercluster": "^1.5.3", "leaflet.markercluster": "^1.5.3",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mongoose-paginate-v2": "^1.9.1",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"pinia": "^3.0.1", "pinia": "^3.0.4",
"qrcode-vue3": "^1.7.1", "qrcode-vue3": "^1.7.1",
"quasar": "^2.18.1", "quasar": "^2.18.6",
"quasar-extras": "^2.0.9", "quasar-extras": "^2.0.9",
"register-service-worker": "^1.7.2", "register-service-worker": "^1.7.2",
"scrollreveal": "^4.0.9", "scrollreveal": "^4.0.9",
"typescript-eslint": "^8.27.0", "typescript-eslint": "^8.48.1",
"vee-validate": "^4.15.0", "vee-validate": "^4.15.1",
"vue": "^3.5.13", "vue": "^3.5.25",
"vue-class-component": "^8.0.0-rc.1", "vue-class-component": "^8.0.0-rc.1",
"vue-country-code": "^1.1.3", "vue-country-code": "^1.1.3",
"vue-echarts": "^7.0.3", "vue-echarts": "^8.0.1",
"vue-i18n": "^11.1.2", "vue-i18n": "^11.2.2",
"vue-idb": "^0.2.0", "vue-idb": "^0.2.0",
"vue-image-zoomer": "^2.4.4",
"vue-property-decorator": "^10.0.0-rc.3", "vue-property-decorator": "^10.0.0-rc.3",
"vue-router": "^4.5.0", "vue-router": "^4.6.3",
"vue-scroll-reveal": "^2.1.0", "vue-scroll-reveal": "^2.1.0",
"vue-social-sharing": "^4.0.0-alpha4", "vue-social-sharing": "^4.0.0-alpha4",
"vue-svgicon": "^4.0.0-alpha.3", "vue-svgicon": "^4.0.0-alpha.3",
"vue-timeago3": "^2.3.2", "vue-timeago3": "^2.3.2",
"vue2-dragula": "^2.5.5", "vue2-dragula": "^2.5.5",
"vue3-apexcharts": "^1.8.0", "vue3-apexcharts": "^1.10.0",
"vue3-pdf-app": "^1.0.3",
"vue3-qr-reader": "^1.0.0", "vue3-qr-reader": "^1.0.0",
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",
"vuex": "^4.1.0", "vuex": "^4.1.0",
"vuex-router-sync": "^6.0.0-rc.1", "vuex-router-sync": "^6.0.0-rc.1",
"workbox-core": "^7.3.0", "workbox-core": "^7.4.0",
"workbox-precaching": "^7.3.0", "workbox-precaching": "^7.4.0",
"workbox-routing": "^7.3.0", "workbox-routing": "^7.4.0",
"workbox-strategies": "^7.3.0", "workbox-strategies": "^7.4.0",
"workbox-window": "^7.3.0" "workbox-window": "^7.4.0",
"xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.23.0", "@eslint/js": "^9.39.1",
"@intlify/unplugin-vue-i18n": "^6.0.5", "@intlify/unplugin-vue-i18n": "^11.0.1",
"@quasar/app-vite": "^2.1.4", "@quasar/app-vite": "^2.4.0",
"@types/google.maps": "^3.58.1", "@types/google.maps": "^3.58.1",
"@types/jest": "^29.5.14", "@types/jest": "^30.0.0",
"@types/js-cookie": "^3.0.6", "@types/js-cookie": "^3.0.6",
"@types/node": "^22.13.11", "@types/node": "^24.10.1",
"@types/nprogress": "^0.2.3", "@types/nprogress": "^0.2.3",
"@types/vue-tel-input": "^2.1.7", "@types/vue-tel-input": "^2.1.7",
"@types/vuelidate": "^0.7.22", "@types/vuelidate": "^0.7.22",
"@vue/devtools": "^7.7.2", "@vue/devtools": "^8.0.5",
"@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.5.0", "@vue/eslint-config-typescript": "^14.6.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.22",
"eslint": "9", "eslint": "9",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-vue": "^10.0.0", "eslint-plugin-vue": "^10.6.2",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"globals": "^16.0.0", "globals": "^16.5.0",
"http-proxy-middleware": "^3.0.3", "http-proxy-middleware": "^3.0.5",
"jest": "^29.7.0", "jest": "^30.2.0",
"json-loader": "^0.5.7", "json-loader": "^0.5.7",
"nodemon": "^3.1.9", "nodemon": "^3.1.11",
"npm-check-updates": "^17.1.16", "npm-check-updates": "^19.1.2",
"parcel": "^2.14.1", "parcel": "^2.16.1",
"postcss": "^8.5.3", "postcss": "^8.5.6",
"postcss-loader": "^8.1.1", "postcss-loader": "^8.2.0",
"prettier": "3", "prettier": "3",
"strip-ansi": "=7.1.0", "strip-ansi": "=7.1.2",
"ts-jest": "^29.2.6", "ts-jest": "^29.4.6",
"typescript": "5.7.3", "typescript": "5.9.3",
"vite-plugin-checker": "^0.9.1", "vite-plugin-checker": "^0.11.0",
"vue-cli-plugin-element-ui": "^1.1.4", "vue-cli-plugin-element-ui": "^1.1.4",
"vue-eslint-parser": "^10.1.1", "vue-eslint-parser": "^10.2.0",
"vue-tsc": "^2.2.8", "vue-tsc": "^3.1.5",
"vueify": "^9.4.1", "vueify": "^9.4.1",
"workbox-build": "^7.3.0" "workbox-build": "^7.4.0"
}, },
"engines": { "engines": {
"node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18", "node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
public/images/all_together.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

195
public/images/avatar-1.svg Executable file
View File

@@ -0,0 +1,195 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="56px" height="56px"
viewBox="0 0 188.148 188.148" style="enable-background:new 0 0 188.148 188.148;" xml:space="preserve">
<g>
<g>
<defs>
<circle id="SVGID_1_" cx="94.074" cy="94.074" r="94.074"/>
</defs>
<use xlink:href="#SVGID_1_" style="overflow:visible;fill:#EB6D4A;"/>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<path style="clip-path:url(#SVGID_2_);fill:#ECC19C;" d="M135.938,52.784V84.05c0,0.453-0.011,0.905-0.021,1.357
c-0.02,0.936-0.072,1.871-0.154,2.796c-0.02,0.319-0.052,0.637-0.093,0.956c-0.134,1.326-0.318,2.632-0.555,3.928
c-0.083,0.432-0.165,0.853-0.258,1.275c-0.01,0.092-0.03,0.175-0.051,0.257c-0.083,0.432-0.186,0.854-0.288,1.275
c-0.041,0.226-0.103,0.452-0.154,0.679c-0.052,0.195-0.103,0.391-0.164,0.586c-0.217,0.843-0.463,1.666-0.721,2.488
c-0.123,0.391-0.246,0.771-0.38,1.162c-0.011,0.041-0.031,0.082-0.041,0.123c-0.124,0.349-0.247,0.699-0.37,1.048
c-0.041,0.103-0.082,0.205-0.124,0.319c-0.123,0.329-0.246,0.658-0.38,0.987c-0.154,0.401-0.318,0.792-0.483,1.183
c-0.144,0.35-0.298,0.699-0.452,1.049c-0.02,0.062-0.052,0.113-0.072,0.174c-0.175,0.37-0.339,0.741-0.514,1.1
c-0.175,0.38-0.36,0.761-0.556,1.142c-0.37,0.75-0.771,1.501-1.172,2.231c-0.185,0.329-0.37,0.658-0.556,0.987
c-1.583,2.725-3.341,5.285-5.253,7.649c-0.258,0.339-0.524,0.668-0.802,0.987c-0.381,0.462-0.772,0.915-1.162,1.357
c-0.35,0.391-0.699,0.781-1.059,1.162c-0.987,1.059-1.995,2.067-3.023,3.013c-0.205,0.206-0.422,0.391-0.638,0.586
c-0.349,0.319-0.698,0.627-1.059,0.925c-0.277,0.247-0.565,0.483-0.854,0.72c-0.74,0.606-1.48,1.192-2.23,1.737
c-0.309,0.237-0.628,0.463-0.946,0.679c-0.514,0.37-1.038,0.72-1.563,1.059c-0.288,0.195-0.586,0.38-0.885,0.555
c-1.049,0.648-2.107,1.244-3.156,1.758c-0.257,0.133-0.514,0.257-0.771,0.38c-0.258,0.123-0.524,0.247-0.802,0.37
c-0.34,0.154-0.679,0.298-1.018,0.432c-0.134,0.062-0.268,0.113-0.401,0.154c-0.4,0.165-0.812,0.319-1.213,0.452
c-0.504,0.185-1.018,0.339-1.521,0.483c-0.35,0.103-0.709,0.195-1.059,0.277c-0.021,0.011-0.041,0.021-0.072,0.021
c-0.35,0.082-0.699,0.165-1.049,0.226c-0.093,0.021-0.184,0.041-0.277,0.051c-0.288,0.051-0.576,0.103-0.864,0.134
c-0.411,0.062-0.822,0.113-1.233,0.134c-0.143,0.02-0.277,0.031-0.422,0.031c-0.328,0.021-0.657,0.031-0.977,0.031h-0.03
c-0.319,0-0.638-0.01-0.956-0.031c-0.124,0-0.247-0.01-0.371-0.031c-0.287-0.01-0.586-0.042-0.894-0.083
c-0.062,0-0.134-0.01-0.195-0.02c-0.381-0.051-0.761-0.113-1.152-0.185c-0.328-0.051-0.657-0.124-0.997-0.206
c-1.758-0.401-3.567-1.007-5.397-1.82c-1.563-0.689-3.146-1.521-4.719-2.488c-0.792-0.483-1.584-0.997-2.365-1.542
c-0.391-0.278-0.781-0.555-1.172-0.843c-1.224-0.895-2.437-1.871-3.63-2.92c-0.328-0.298-0.657-0.596-0.986-0.905
c-0.329-0.298-0.658-0.606-0.977-0.904c-0.803-0.771-1.584-1.573-2.345-2.406c-0.298-0.318-0.596-0.647-0.895-0.987
c-0.822-0.925-1.624-1.881-2.385-2.879c-0.299-0.36-0.576-0.73-0.854-1.1c-1.038-1.377-2.025-2.817-2.951-4.308
c-0.246-0.401-0.493-0.813-0.729-1.213c-0.288-0.483-0.565-0.976-0.843-1.47c-1.028-1.851-1.975-3.773-2.797-5.758
c-0.123-0.288-0.247-0.576-0.35-0.863c-0.165-0.37-0.309-0.751-0.442-1.121c-0.205-0.545-0.4-1.09-0.586-1.635
c-0.185-0.545-0.359-1.1-0.534-1.655c-0.165-0.535-0.319-1.069-0.463-1.614c-0.165-0.576-0.318-1.162-0.452-1.758
c-0.011-0.062-0.031-0.123-0.041-0.185c-0.195-0.822-0.37-1.655-0.524-2.498c-0.206-1.111-0.37-2.242-0.494-3.383
c-0.051-0.36-0.082-0.72-0.113-1.08c-0.041-0.38-0.071-0.751-0.092-1.131c-0.052-0.689-0.083-1.388-0.104-2.087
c-0.01-0.453-0.021-0.905-0.021-1.357V52.784c0-23.102,18.723-41.834,41.825-41.855h0.041c3.188,0,6.292,0.359,9.273,1.028
c2.725,0.617,5.347,1.501,7.835,2.622c3.393,1.522,6.549,3.475,9.387,5.809c2.385,1.954,4.555,4.154,6.446,6.58
C132.607,34.083,135.938,43.038,135.938,52.784z"/>
<path style="clip-path:url(#SVGID_2_);fill:#ECC19C;" d="M148.613,200.741v0.01H39.538v-0.01c0-6.158,1.018-12.091,2.91-17.612
c0.339-0.997,0.709-1.984,1.11-2.961v-0.01c0.4-0.977,0.822-1.933,1.274-2.879c1.8-3.794,4.041-7.341,6.642-10.59
c0.658-0.812,1.326-1.604,2.016-2.365c0.339-0.391,0.699-0.771,1.059-1.151c0.36-0.37,0.72-0.74,1.09-1.11
c1.841-1.84,3.814-3.526,5.892-5.079c1.038-0.771,2.087-1.491,3.177-2.19c1.09-0.689,2.2-1.347,3.331-1.964
c0.021-0.02,0.041-0.02,0.041-0.02c0.442-0.236,0.874-0.493,1.306-0.761c0.854-0.514,1.696-1.069,2.499-1.665
c0.411-0.288,0.802-0.586,1.192-0.905c0.925-0.74,1.819-1.532,2.673-2.365c0.277-0.277,0.556-0.555,0.833-0.843
c0.575-0.597,1.12-1.224,1.645-1.861c0.258-0.308,0.515-0.627,0.751-0.946c0.247-0.318,0.483-0.647,0.72-0.977
c1.83-2.55,3.3-5.356,4.38-8.349c1.306-3.64,2.015-7.557,2.015-11.649l7.948,0.041l8.173,0.041c0,4.04,0.689,7.916,1.964,11.515
c1.06,3.002,2.529,5.809,4.329,8.359c1.871,2.652,4.102,5.017,6.631,7.042c0.381,0.309,0.761,0.607,1.142,0.884
c0.37,0.278,0.75,0.545,1.141,0.802c0.083,0.062,0.154,0.113,0.237,0.165c0.37,0.247,0.74,0.494,1.131,0.72
c0.421,0.257,0.854,0.514,1.285,0.751c0.071,0.02,0.134,0.051,0.185,0.093c0.905,0.504,1.8,1.028,2.674,1.573
c0.421,0.257,0.843,0.524,1.254,0.823c0.854,0.555,1.687,1.141,2.498,1.758c0,0.011,0.011,0.011,0.011,0.011h0.01
c2.077,1.552,4.041,3.248,5.881,5.079C142.496,172.015,148.613,185.648,148.613,200.741z"/>
<path style="clip-path:url(#SVGID_2_);fill:#C7D4E2;" d="M148.614,200.743H39.539c0-6.159,1.019-12.091,2.91-17.612
c0.339-0.998,0.709-1.984,1.11-2.961c-0.011-0.011,0-0.011,0-0.011c0.391-0.977,0.822-1.933,1.274-2.878
c1.8-3.794,4.041-7.341,6.642-10.59c0.658-0.813,1.327-1.604,2.016-2.365c0.339-0.391,0.699-0.771,1.059-1.151
c0.36-0.37,0.72-0.74,1.09-1.11c1.841-1.84,3.814-3.527,5.892-5.079c1.038-0.771,2.087-1.491,3.177-2.19
c1.09-0.699,2.2-1.357,3.331-1.974c0.021-0.02,0.041-0.01,0.041-0.01v-0.01c0.442-0.247,0.874-0.494,1.306-0.751
c1.285-0.781,2.52-1.645,3.671-2.591c0.01,0.01,0.01,0.01,0.021,0.02c5.325,5.449,12.738,8.831,20.964,8.852h0.082
c8.225,0,15.669-3.393,21.015-8.842l0.011-0.01c0.729,0.606,1.49,1.172,2.272,1.696c0.082,0.061,0.154,0.113,0.236,0.164
c0.37,0.247,0.75,0.483,1.131,0.72c0.422,0.257,0.854,0.504,1.285,0.74c0.072,0.02,0.123,0.061,0.185,0.092
c0.905,0.504,1.8,1.028,2.674,1.583c0.421,0.257,0.843,0.524,1.254,0.823c0.854,0.545,1.687,1.141,2.498,1.758h0.021
c2.088,1.563,4.051,3.259,5.881,5.089C142.497,172.017,148.614,185.65,148.614,200.743z"/>
<path style="clip-path:url(#SVGID_2_);fill:#543E36;" d="M135.938,84.05c0,0.453-0.011,0.905-0.021,1.357
c-0.02,0.936-0.072,1.871-0.154,2.796c-0.02,0.319-0.052,0.637-0.093,0.956c-0.134,1.326-0.318,2.632-0.555,3.928
c-0.083,0.432-0.165,0.853-0.258,1.275c-0.01,0.092-0.03,0.175-0.051,0.257c-0.083,0.432-0.186,0.854-0.288,1.275
c-0.052,0.247-0.113,0.483-0.186,0.72c-0.03,0.185-0.082,0.37-0.133,0.545c-0.217,0.843-0.463,1.666-0.721,2.488
c-0.123,0.391-0.246,0.771-0.38,1.162c-0.011,0.041-0.031,0.082-0.041,0.123c-0.124,0.349-0.247,0.699-0.37,1.048
c-0.041,0.103-0.082,0.205-0.124,0.319c-0.123,0.329-0.246,0.658-0.38,0.987c-0.154,0.401-0.318,0.792-0.483,1.183
c-0.144,0.35-0.298,0.699-0.452,1.049c-0.02,0.062-0.052,0.113-0.072,0.174c-0.175,0.37-0.339,0.741-0.514,1.1
c-0.175,0.38-0.36,0.761-0.556,1.142c-0.37,0.75-0.771,1.501-1.172,2.231c-0.185,0.329-0.37,0.658-0.556,0.987
c-1.583,2.725-3.341,5.285-5.253,7.649c-0.258,0.339-0.524,0.668-0.802,0.987c-0.381,0.462-0.772,0.915-1.162,1.357
c-0.35,0.391-0.699,0.781-1.059,1.162c-0.987,1.059-1.995,2.067-3.023,3.013c-0.205,0.206-0.422,0.391-0.638,0.586
c-0.349,0.319-0.698,0.627-1.059,0.925c-0.277,0.247-0.565,0.483-0.854,0.72c-0.74,0.606-1.48,1.192-2.23,1.737
c-0.309,0.237-0.628,0.463-0.946,0.679c-0.514,0.37-1.038,0.72-1.563,1.059c-0.288,0.195-0.586,0.38-0.885,0.555
c-1.049,0.648-2.107,1.244-3.156,1.758c-0.257,0.133-0.514,0.257-0.771,0.38c-0.258,0.123-0.524,0.247-0.802,0.37
c-0.34,0.154-0.679,0.298-1.018,0.432c-0.134,0.062-0.268,0.113-0.401,0.154c-0.4,0.165-0.812,0.319-1.213,0.452
c-0.504,0.185-1.018,0.339-1.521,0.483c-0.35,0.103-0.709,0.195-1.059,0.277c-0.021,0.011-0.041,0.021-0.072,0.021
c-0.35,0.082-0.699,0.165-1.049,0.226c-0.093,0.021-0.184,0.041-0.277,0.051c-0.288,0.051-0.576,0.103-0.864,0.134
c-0.411,0.062-0.822,0.113-1.233,0.134c-0.143,0.02-0.277,0.031-0.422,0.031c-0.328,0.021-0.657,0.031-0.977,0.031h-0.03
c-0.319,0-0.638-0.01-0.956-0.031c-0.124,0-0.247-0.01-0.371-0.031c-0.287-0.01-0.586-0.042-0.894-0.083
c-0.062,0-0.134-0.01-0.195-0.02c-0.381-0.051-0.761-0.113-1.152-0.185c-0.328-0.051-0.657-0.124-0.997-0.206
c-1.758-0.401-3.567-1.007-5.397-1.82c-1.563-0.689-3.146-1.521-4.719-2.488c-0.792-0.473-1.573-0.987-2.365-1.542
c-0.391-0.278-0.781-0.555-1.172-0.843c-1.224-0.895-2.437-1.871-3.63-2.92c-0.328-0.298-0.657-0.596-0.986-0.905
c-0.329-0.298-0.658-0.606-0.977-0.904c-0.803-0.771-1.584-1.573-2.345-2.406c-0.298-0.318-0.596-0.647-0.895-0.987
c-0.822-0.925-1.624-1.881-2.385-2.879c-0.299-0.36-0.576-0.73-0.854-1.1c-1.038-1.377-2.025-2.817-2.951-4.308
c-0.246-0.401-0.493-0.813-0.729-1.213c-0.288-0.483-0.565-0.976-0.843-1.47c-1.028-1.851-1.975-3.773-2.797-5.758
c-0.123-0.288-0.247-0.576-0.35-0.863c-0.165-0.37-0.309-0.751-0.442-1.121c-0.205-0.545-0.4-1.09-0.586-1.635
c-0.185-0.545-0.359-1.1-0.534-1.655c-0.165-0.535-0.319-1.069-0.463-1.614c-0.165-0.576-0.318-1.162-0.452-1.758
c-0.011-0.062-0.031-0.123-0.041-0.185c-0.195-0.822-0.37-1.655-0.524-2.498c-0.206-1.111-0.37-2.242-0.494-3.383
c-0.051-0.36-0.082-0.72-0.113-1.08c-0.041-0.38-0.071-0.751-0.092-1.131c-0.052-0.689-0.083-1.388-0.104-2.087
c-0.01-0.453-0.021-0.905-0.021-1.357l6.684,13.14l11.484,5.007l13.581,1.224l10.076,0.915h0.062l9.428,0.854l21.005,1.892
L135.938,84.05z"/>
<path style="clip-path:url(#SVGID_2_);fill:#543E36;" d="M127.023,26.968c-2.046,4.637-4.709,8.945-7.855,12.852
c-0.185,0.227-0.37,0.453-0.565,0.679c-6.446,7.762-14.897,13.798-24.562,17.324c-2.54,0.936-5.161,1.696-7.855,2.262
c-1.799,0.38-3.629,0.679-5.49,0.895c-2.139,0.236-4.318,0.36-6.528,0.36c-2.529,0-5.007-0.165-7.443-0.483
c-2.386-0.298-4.72-0.74-7.002-1.336c-1.306-0.329-2.581-0.709-3.846-1.131c-1.244-0.411-2.457-0.864-3.66-1.357v-4.246
c0-23.102,18.723-41.834,41.825-41.855h0.041c3.188,0,6.292,0.359,9.273,1.028c2.725,0.617,5.347,1.501,7.835,2.622
c3.393,1.522,6.549,3.475,9.387,5.809C122.962,22.341,125.132,24.542,127.023,26.968z"/>
<path style="clip-path:url(#SVGID_2_);fill:#543E36;" d="M135.938,52.784v8.235c-7.136-5.521-13.047-12.502-17.314-20.48
c-0.01-0.01-0.01-0.031-0.021-0.041c-4.194-7.834-6.796-16.625-7.412-25.92c3.393,1.522,6.549,3.475,9.387,5.809
c2.385,1.954,4.555,4.154,6.446,6.58C132.607,34.083,135.938,43.038,135.938,52.784z"/>
<path style="clip-path:url(#SVGID_2_);fill:#543E36;" d="M57.12,56.013c-0.441,0.771-0.843,1.563-1.244,2.375
c-0.153,0.318-0.308,0.658-0.462,0.987c-2.025,4.503-3.044,8.924-3.188,12.914c0,0.113-0.011,0.236-0.011,0.35V56.517
c0-0.576,0.021-1.142,0.021-1.697C53.861,55.242,55.485,55.653,57.12,56.013z"/>
<path style="clip-path:url(#SVGID_2_);fill:#543E36;" d="M131.054,56.013c0.622,1.093,1.177,2.213,1.71,3.361
c2.088,4.643,3.11,9.178,3.198,13.268V56.512c0-0.567-0.021-1.134-0.021-1.688C134.318,55.243,132.697,55.648,131.054,56.013z"/>
<path style="clip-path:url(#SVGID_2_);fill:#1A1A1A;" d="M130.972,60.167c0-0.175-0.134-0.329-0.309-0.35
c-1.48-0.226-8.143-1.142-15.309-1.142c-8.133,0-18.63,2.55-20.46,2.55H93.27c-0.854,0-3.588-0.555-7.084-1.141
c-4.02-0.679-9.037-1.409-13.376-1.409c-5.243,0-10.22,0.494-13.088,0.843c-1.049,0.124-1.82,0.236-2.221,0.298
c-0.175,0.021-0.309,0.175-0.309,0.35l-0.082,4.369c0,0.154,0.093,0.288,0.236,0.35l0.493,0.175
c0.73,0.278,0.669,13.448,4.596,16.738c2.334,1.943,4.411,3.053,13.16,3.053c5.069,0,8.256-1.367,11.279-5.449
c2.18-2.93,4.112-9.86,4.112-9.86c0.586-2.858,2.714-3.084,3.054-3.105c0.021,0,0.041,0,0.041,0c0.071,0,2.468,0.041,3.095,3.105
c0,0,1.933,6.93,4.112,9.86c3.022,4.082,6.21,5.449,11.278,5.449c8.75,0,10.826-1.11,13.16-3.053
c3.928-3.29,3.866-16.46,4.596-16.738l0.494-0.175c0.143-0.062,0.236-0.195,0.236-0.35L130.972,60.167z M86.875,75.753
c-1.285,3.043-4.606,6.971-9.284,7.207c-14.034,0.709-14.682-3.208-15.587-6.313c-0.915-3.105-1.151-5.83-0.792-8.935
c0.37-3.105,1.152-4.925,2.561-5.84c0.606-0.401,1.265-0.761,2.951-1.018c1.511-0.226,3.845-0.36,7.731-0.36
c2.251,0,4.359,0.175,6.24,0.483c4.997,0.802,8.369,2.499,8.369,4.174C89.064,66.294,88.776,71.249,86.875,75.753z
M126.159,76.647c-0.904,3.105-1.552,7.022-15.586,6.313c-4.678-0.236-7.999-4.164-9.284-7.207
c-1.902-4.503-2.189-9.459-2.189-10.6c0-2.303,6.395-4.658,14.609-4.658c8.215,0,9.53,0.617,10.683,1.378
c1.408,0.915,2.189,2.735,2.56,5.84C127.312,70.818,127.075,73.543,126.159,76.647z"/>
<g style="clip-path:url(#SVGID_2_);">
<path style="fill:#543E36;" d="M94.123,90.65l-0.011,10.138l-0.01,3.547v2.786l-0.011,9.253v0.01l-0.01-0.01h-0.011l-0.03-0.021
L53.604,95.771c-0.011-0.062-0.031-0.123-0.041-0.185c-0.195-0.822-0.37-1.655-0.524-2.498c-0.206-1.111-0.37-2.242-0.494-3.383
c-0.051-0.36-0.082-0.72-0.113-1.08c-0.041-0.38-0.071-0.751-0.092-1.131c-0.052-0.689-0.083-1.388-0.104-2.087
c-0.01-0.453-0.021-0.905-0.021-1.357V71.764c0,0.175,0.011,0.35,0.011,0.524c0.082,2.971,0.555,6.241,1.47,9.582
c0.71,2.57,1.594,4.945,2.622,7.063v0.01c2.694,5.604,6.303,9.407,9.623,10.024c0.206,0.031,0.422,0.051,0.628,0.072
c1.285,0.144,2.632,0.226,4.02,0.226c5.243,0,9.901-4.215,12.831-5.922c0.021-0.01,0.041-0.021,0.062-0.031
c0.154-0.093,0.309-0.185,0.442-0.278c0.041-0.031,0.082-0.051,0.123-0.072c2.468-1.409,6.025-2.303,9.994-2.313H94.123z"/>
<path style="fill:#543E36;" d="M135.947,71.764l-0.01,12.286c0,3.085-0.288,6.107-0.822,9.038
c-0.217,1.172-0.463,2.333-0.751,3.485l-9.49,13.705l-30.782,6.097h-0.01l-0.011,0.01v-0.01l-0.03-25.727h0.082
c3.969,0.01,7.536,0.905,10.004,2.313c0.041,0.021,0.071,0.041,0.113,0.072c0.144,0.093,0.298,0.185,0.452,0.278
c0.01,0.01,0.03,0.021,0.051,0.031c2.941,1.707,7.588,5.925,12.832,5.925c1.388,0,2.734-0.082,4.019-0.226
c0.216-0.021,0.422-0.041,0.638-0.072c3.311-0.617,6.93-4.421,9.613-10.024v-0.01c1.027-2.118,1.912-4.493,2.621-7.063
c0.926-3.393,1.409-6.703,1.471-9.716C135.947,72.021,135.947,71.897,135.947,71.764z"/>
</g>
<ellipse style="clip-path:url(#SVGID_2_);fill:#ECC19C;" cx="94.074" cy="103.955" rx="10.255" ry="3.17"/>
<g style="clip-path:url(#SVGID_2_);">
<path style="fill:#435363;" d="M64.131,155.174v56.558h-4.369v-53.37c0.586-0.473,1.172-0.936,1.769-1.378
C62.384,156.347,63.247,155.75,64.131,155.174z"/>
<polygon style="fill:#435363;" points="124.021,155.185 124.021,200.741 124.021,211.732 128.39,211.732 128.39,200.741
128.39,158.372 "/>
</g>
<g style="clip-path:url(#SVGID_2_);">
<g>
<polygon style="fill:#141720;" points="82.113,151.713 94.074,166.049 106.036,151.713 "/>
<path style="fill:#141720;" d="M94.074,225.437h-7.073l5.11-65.8c0.215,0.837,3.712,0.837,3.927,0l5.11,65.8H94.074z"/>
</g>
<g>
<path style="fill:#E7ECF2;" d="M94.07,151.638l-0.03,0.051l-0.011,0.021l-4.966,8.338l-4.637,7.772l-12.554-17.447
c0.401-0.288,0.802-0.596,1.183-0.915c0.01,0.01,0.01,0.01,0.021,0.021c2.518-2.005,4.76-4.359,6.621-6.991l14.343,9.13
L94.07,151.638z"/>
<path style="fill:#E7ECF2;" d="M116.278,150.373l-12.554,17.447l-4.637-7.772l-4.977-8.338l-0.041-0.072l14.436-9.191
c1.871,2.652,4.102,5.017,6.631,7.042C115.518,149.797,115.897,150.096,116.278,150.373z"/>
</g>
</g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

BIN
public/images/cibo_sano.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

BIN
public/images/cover.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

BIN
public/images/de.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

BIN
public/images/es.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
public/images/gb.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

BIN
public/images/group-together.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
public/images/hand_people.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

BIN
public/images/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
public/images/it.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
public/images/layers-2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/images/layers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

BIN
public/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

BIN
public/images/mountains.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1 @@
<svg id="457bf273-24a3-4fd8-a857-e9b918267d6a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="698" height="698" viewBox="0 0 698 698"><defs><linearGradient id="b247946c-c62f-4d08-994a-4c3d64e1e98f" x1="349" y1="698" x2="349" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="gray" stop-opacity="0.25"/><stop offset="0.54" stop-color="gray" stop-opacity="0.12"/><stop offset="1" stop-color="gray" stop-opacity="0.1"/></linearGradient></defs><title>profile pic</title><g opacity="0.5"><circle cx="349" cy="349" r="349" fill="url(#b247946c-c62f-4d08-994a-4c3d64e1e98f)"/></g><circle cx="349.68" cy="346.77" r="341.64" fill="#f5f5f5"/><path d="M601,790.76a340,340,0,0,0,187.79-56.2c-12.59-68.8-60.5-72.72-60.5-72.72H464.09s-45.21,3.71-59.33,67A340.07,340.07,0,0,0,601,790.76Z" transform="translate(-251 -101)" fill="#536dfe"/><circle cx="346.37" cy="339.57" r="164.9" fill="#333"/><path d="M293.15,476.92H398.81a0,0,0,0,1,0,0v84.53A52.83,52.83,0,0,1,346,614.28h0a52.83,52.83,0,0,1-52.83-52.83V476.92a0,0,0,0,1,0,0Z" opacity="0.1"/><path d="M296.5,473h99a3.35,3.35,0,0,1,3.35,3.35v81.18A52.83,52.83,0,0,1,346,610.37h0a52.83,52.83,0,0,1-52.83-52.83V476.35A3.35,3.35,0,0,1,296.5,473Z" fill="#fdb797"/><path d="M544.34,617.82a152.07,152.07,0,0,0,105.66.29v-13H544.34Z" transform="translate(-251 -101)" opacity="0.1"/><circle cx="346.37" cy="372.44" r="151.45" fill="#fdb797"/><path d="M489.49,335.68S553.32,465.24,733.37,390l-41.92-65.73-74.31-26.67Z" transform="translate(-251 -101)" opacity="0.1"/><path d="M489.49,333.78s63.83,129.56,243.88,54.3l-41.92-65.73-74.31-26.67Z" transform="translate(-251 -101)" fill="#333"/><path d="M488.93,325a87.49,87.49,0,0,1,21.69-35.27c29.79-29.45,78.63-35.66,103.68-69.24,6,9.32,1.36,23.65-9,27.65,24-.16,51.81-2.26,65.38-22a44.89,44.89,0,0,1-7.57,47.4c21.27,1,44,15.4,45.34,36.65.92,14.16-8,27.56-19.59,35.68s-25.71,11.85-39.56,14.9C608.86,369.7,462.54,407.07,488.93,325Z" transform="translate(-251 -101)" fill="#333"/><ellipse cx="194.86" cy="372.3" rx="14.09" ry="26.42" fill="#fdb797"/><ellipse cx="497.8" cy="372.3" rx="14.09" ry="26.42" fill="#fdb797"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
public/images/noimg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/images/opz1-icon-96x96.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
public/images/opz2-icon-96x96.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
public/images/paypal.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
public/images/regalo.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
public/images/revolut.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

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: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

457
public/js/fetch.js Executable file
View File

@@ -0,0 +1,457 @@
(function (self) {
if (self.fetch) {
return
}
const support = {
searchParams: 'URLSearchParams' in self,
iterable: 'Symbol' in self && 'iterator' in Symbol,
blob: 'FileReader' in self && 'Blob' in self && (function () {
try {
new Blob()
return true
} catch (e) {
return false
}
}()),
formData: 'FormData' in self,
arrayBuffer: 'ArrayBuffer' in self,
}
if (support.arrayBuffer) {
const viewClasses = [
'[object Int8Array]',
'[object Uint8Array]',
'[object Uint8ClampedArray]',
'[object Int16Array]',
'[object Uint16Array]',
'[object Int32Array]',
'[object Uint32Array]',
'[object Float32Array]',
'[object Float64Array]',
]
var isDataView = function (obj) {
return obj && DataView.prototype.isPrototypeOf(obj)
}
var isArrayBufferView = ArrayBuffer.isView || function (obj) {
return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
}
}
function normalizeName(name) {
if (typeof name !== 'string') {
name = String(name)
}
if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
throw new TypeError('Invalid character in header field nametranslate')
}
return name.toLowerCase()
}
function normalizeValue(value) {
if (typeof value !== 'string') {
value = String(value)
}
return value
}
// Build a destructive iterator for the value list
function iteratorFor(items) {
const iterator = {
next() {
const value = items.shift()
return { done: value === undefined, value }
},
}
if (support.iterable) {
iterator[Symbol.iterator] = function () {
return iterator
}
}
return iterator
}
function Headers(headers) {
this.map = {}
if (headers instanceof Headers) {
headers.forEach(function (value, name) {
this.append(name, value)
}, this)
} else if (Array.isArray(headers)) {
headers.forEach(function (header) {
this.append(header[0], header[1])
}, this)
} else if (headers) {
Object.getOwnPropertyNames(headers).forEach(function (name) {
this.append(name, headers[name])
}, this)
}
}
Headers.prototype.append = function (name, value) {
name = normalizeName(name)
value = normalizeValue(value)
const oldValue = this.map[name]
this.map[name] = oldValue ? `${oldValue},${value}` : value
}
Headers.prototype.delete = function (name) {
delete this.map[normalizeName(name)]
}
Headers.prototype.get = function (name) {
name = normalizeName(name)
return this.has(name) ? this.map[name] : null
}
Headers.prototype.has = function (name) {
return this.map.hasOwnProperty(normalizeName(name))
}
Headers.prototype.set = function (name, value) {
this.map[normalizeName(name)] = normalizeValue(value)
}
Headers.prototype.forEach = function (callback, thisArg) {
for (const name in this.map) {
if (this.map.hasOwnProperty(name)) {
callback.call(thisArg, this.map[name], name, this)
}
}
}
Headers.prototype.keys = function () {
const items = []
this.forEach((value, name) => { items.push(name) })
return iteratorFor(items)
}
Headers.prototype.values = function () {
const items = []
this.forEach((value) => { items.push(value) })
return iteratorFor(items)
}
Headers.prototype.entries = function () {
const items = []
this.forEach((value, name) => { items.push([name, value]) })
return iteratorFor(items)
}
if (support.iterable) {
Headers.prototype[Symbol.iterator] = Headers.prototype.entries
}
function consumed(body) {
if (body.bodyUsed) {
return Promise.reject(new TypeError('Already read'))
}
body.bodyUsed = true
}
function fileReaderReady(reader) {
return new Promise((resolve, reject) => {
reader.onload = function () {
resolve(reader.result)
}
reader.onerror = function () {
reject(reader.error)
}
})
}
function readBlobAsArrayBuffer(blob) {
const reader = new FileReader()
const promise = fileReaderReady(reader)
reader.readAsArrayBuffer(blob)
return promise
}
function readBlobAsText(blob) {
const reader = new FileReader()
const promise = fileReaderReady(reader)
reader.readAsText(blob)
return promise
}
function readArrayBufferAsText(buf) {
const view = new Uint8Array(buf)
const chars = new Array(view.length)
for (let i = 0; i < view.length; i++) {
chars[i] = String.fromCharCode(view[i])
}
return chars.join('')
}
function bufferClone(buf) {
if (buf.slice) {
return buf.slice(0)
}
const view = new Uint8Array(buf.byteLength)
view.set(new Uint8Array(buf))
return view.buffer
}
function Body() {
this.bodyUsed = false
this._initBody = function (body) {
this._bodyInit = body
if (!body) {
this._bodyText = ''
} else if (typeof body === 'string') {
this._bodyText = body
} else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
this._bodyBlob = body
} else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
this._bodyFormData = body
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
this._bodyText = body.toString()
} else if (support.arrayBuffer && support.blob && isDataView(body)) {
this._bodyArrayBuffer = bufferClone(body.buffer)
// IE 10-11 can't handle a DataView body.
this._bodyInit = new Blob([this._bodyArrayBuffer])
} else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
this._bodyArrayBuffer = bufferClone(body)
} else {
throw new Error('unsupported BodyInit type')
}
if (!this.headers.get('content-type')) {
if (typeof body === 'string') {
this.headers.set('content-type', 'text/plain;charset=UTF-8')
} else if (this._bodyBlob && this._bodyBlob.type) {
this.headers.set('content-type', this._bodyBlob.type)
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
}
}
}
if (support.blob) {
this.blob = function () {
const rejected = consumed(this)
if (rejected) {
return rejected
}
if (this._bodyBlob) {
return Promise.resolve(this._bodyBlob)
} if (this._bodyArrayBuffer) {
return Promise.resolve(new Blob([this._bodyArrayBuffer]))
} if (this._bodyFormData) {
throw new Error('could not read FormData body as blob')
} else {
return Promise.resolve(new Blob([this._bodyText]))
}
}
this.arrayBuffer = function () {
if (this._bodyArrayBuffer) {
return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
}
return this.blob().then(readBlobAsArrayBuffer)
}
}
this.text = function () {
const rejected = consumed(this)
if (rejected) {
return rejected
}
if (this._bodyBlob) {
return readBlobAsText(this._bodyBlob)
} if (this._bodyArrayBuffer) {
return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
} if (this._bodyFormData) {
throw new Error('could not read FormData body as text')
} else {
return Promise.resolve(this._bodyText)
}
}
if (support.formData) {
this.formData = function () {
return this.text().then(decode)
}
}
this.json = function () {
return this.text().then(JSON.parse)
}
return this
}
// HTTP methods whose capitalization should be normalized
const methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
function normalizeMethod(method) {
const upcased = method.toUpperCase()
return (methods.indexOf(upcased) > -1) ? upcased : method
}
function Request(input, options) {
options = options || {}
let { body } = options
if (input instanceof Request) {
if (input.bodyUsed) {
throw new TypeError('Already read')
}
this.url = input.url
this.credentials = input.credentials
if (!options.headers) {
this.headers = new Headers(input.headers)
}
this.method = input.method
this.mode = input.mode
if (!body && input._bodyInit != null) {
body = input._bodyInit
input.bodyUsed = true
}
} else {
this.url = String(input)
}
this.credentials = options.credentials || this.credentials || 'omit'
if (options.headers || !this.headers) {
this.headers = new Headers(options.headers)
}
this.method = normalizeMethod(options.method || this.method || 'GET')
this.mode = options.mode || this.mode || null
this.referrer = null
if ((this.method === 'GET' || this.method === 'HEAD') && body) {
throw new TypeError('Body not allowed for GET or HEAD requests')
}
this._initBody(body)
}
Request.prototype.clone = function () {
return new Request(this, { body: this._bodyInit })
}
function decode(body) {
const form = new FormData()
body.trim().split('&').forEach((bytes) => {
if (bytes) {
const split = bytes.split('=')
const name = split.shift().replace(/\+/g, ' ')
const value = split.join('=').replace(/\+/g, ' ')
form.append(decodeURIComponent(name), decodeURIComponent(value))
}
})
return form
}
function parseHeaders(rawHeaders) {
const headers = new Headers()
rawHeaders.split(/\r?\n/).forEach((line) => {
const parts = line.split(':')
const key = parts.shift().trim()
if (key) {
const value = parts.join(':').trim()
headers.append(key, value)
}
})
return headers
}
Body.call(Request.prototype)
function Response(bodyInit, options) {
if (!options) {
options = {}
}
this.type = 'default'
this.status = 'status' in options ? options.status : 200
this.ok = this.status >= 200 && this.status < 300
this.statusText = 'statusText' in options ? options.statusText : 'OK'
this.headers = new Headers(options.headers)
this.url = options.url || ''
this._initBody(bodyInit)
}
Body.call(Response.prototype)
Response.prototype.clone = function () {
return new Response(this._bodyInit, {
status: this.status,
statusText: this.statusText,
headers: new Headers(this.headers),
url: this.url,
})
}
Response.error = function () {
const response = new Response(null, { status: 0, statusText: '' })
response.type = 'error'
return response
}
const redirectStatuses = [301, 302, 303, 307, 308]
Response.redirect = function (url, status) {
if (redirectStatuses.indexOf(status) === -1) {
throw new RangeError('Invalid status code')
}
return new Response(null, { status, headers: { location: url } })
}
self.Headers = Headers
self.Request = Request
self.Response = Response
self.fetch = function (input, init) {
return new Promise((resolve, reject) => {
const request = new Request(input, init)
const xhr = new XMLHttpRequest()
xhr.onload = function () {
const options = {
status: xhr.status,
statusText: xhr.statusText,
headers: parseHeaders(xhr.getAllResponseHeaders() || ''),
}
options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
const body = 'response' in xhr ? xhr.response : xhr.responseText
resolve(new Response(body, options))
}
xhr.onerror = function () {
reject(new TypeError('Network request failed'))
}
xhr.ontimeout = function () {
reject(new TypeError('Network request failed'))
}
xhr.open(request.method, request.url, true)
if (request.credentials === 'include') {
xhr.withCredentials = true
}
if ('responseType' in xhr && support.blob) {
xhr.responseType = 'blob'
}
request.headers.forEach((value, name) => {
xhr.setRequestHeader(name, value)
})
xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
})
}
self.fetch.polyfill = true
}(typeof self !== 'undefined' ? self : this));

25
public/js/globalenv.js Executable file
View File

@@ -0,0 +1,25 @@
// importScripts('/public/js/immortal-db.min.js');
/*
const cfgenv = {
website: 'http://localhost:8081',
serverweb: 'http://localhost:3000',
dbname: 'mydb3',
dbversion: 10,
}
*/
/*
async function clearAllDataImmortal(table) {
console.log('clearAllDataImmortal', table)
const db = ImmortalDB.ImmortalDB
await db.remove(table)
}
async function writeDataImmortal(table, datavalue) {
console.log('writeDataImmortal', table, datavalue)
const db = ImmortalDB.ImmortalDB
await db.set(table, datavalue)
}
*/

307
public/js/idb.js Executable file
View File

@@ -0,0 +1,307 @@
(function () {
// console.log('LOADING IDB.JS .....')
function toArray(arr) {
return Array.prototype.slice.call(arr);
}
function promisifyRequest(request) {
return new Promise((resolve, reject) => {
request.onsuccess = function () {
resolve(request.result);
};
request.onerror = function () {
reject(request.error);
};
});
}
function promisifyRequestCall(obj, method, args) {
let request;
const p = new Promise((resolve, reject) => {
request = obj[method].apply(obj, args);
promisifyRequest(request).then(resolve, reject);
});
p.request = request;
return p;
}
function promisifyCursorRequestCall(obj, method, args) {
const p = promisifyRequestCall(obj, method, args);
return p.then((value) => {
if (!value) return;
return new Cursor(value, p.request);
});
}
function proxyProperties(ProxyClass, targetProp, properties) {
properties.forEach((prop) => {
Object.defineProperty(ProxyClass.prototype, prop, {
get() {
return this[targetProp][prop];
},
set(val) {
this[targetProp][prop] = val;
},
});
});
}
function proxyRequestMethods(ProxyClass, targetProp, Constructor, properties) {
properties.forEach((prop) => {
if (!(prop in Constructor.prototype)) return;
ProxyClass.prototype[prop] = function () {
return promisifyRequestCall(this[targetProp], prop, arguments);
};
});
}
function proxyMethods(ProxyClass, targetProp, Constructor, properties) {
properties.forEach((prop) => {
if (!(prop in Constructor.prototype)) return;
ProxyClass.prototype[prop] = function () {
return this[targetProp][prop].apply(this[targetProp], arguments);
};
});
}
function proxyCursorRequestMethods(ProxyClass, targetProp, Constructor, properties) {
properties.forEach((prop) => {
if (!(prop in Constructor.prototype)) return;
ProxyClass.prototype[prop] = function () {
return promisifyCursorRequestCall(this[targetProp], prop, arguments);
};
});
}
function Index(index) {
this._index = index;
}
proxyProperties(Index, '_index', [
'name',
'keyPath',
'multiEntry',
'unique',
]);
proxyRequestMethods(Index, '_index', IDBIndex, [
'get',
'getKey',
'getAll',
'getAllKeys',
'count',
]);
proxyCursorRequestMethods(Index, '_index', IDBIndex, [
'openCursor',
'openKeyCursor',
]);
function Cursor(cursor, request) {
this._cursor = cursor;
this._request = request;
}
proxyProperties(Cursor, '_cursor', [
'direction',
'key',
'primaryKey',
'value',
]);
proxyRequestMethods(Cursor, '_cursor', IDBCursor, [
'update',
'delete',
]);
// proxy 'next' methods
['advance', 'continue', 'continuePrimaryKey'].forEach((methodName) => {
if (!(methodName in IDBCursor.prototype)) return;
Cursor.prototype[methodName] = function () {
const cursor = this;
const args = arguments;
return Promise.resolve().then(() => {
cursor._cursor[methodName].apply(cursor._cursor, args);
return promisifyRequest(cursor._request).then((value) => {
if (!value) return;
return new Cursor(value, cursor._request);
});
});
};
});
function ObjectStore(store) {
this._store = store;
}
ObjectStore.prototype.createIndex = function () {
return new Index(this._store.createIndex.apply(this._store, arguments));
};
ObjectStore.prototype.index = function () {
return new Index(this._store.index.apply(this._store, arguments));
};
proxyProperties(ObjectStore, '_store', [
'name',
'keyPath',
'indexNames',
'autoIncrement',
]);
proxyRequestMethods(ObjectStore, '_store', IDBObjectStore, [
'put',
'add',
'delete',
'clear',
'get',
'getAll',
'getKey',
'getAllKeys',
'count',
]);
proxyCursorRequestMethods(ObjectStore, '_store', IDBObjectStore, [
'openCursor',
'openKeyCursor',
]);
proxyMethods(ObjectStore, '_store', IDBObjectStore, [
'deleteIndex',
]);
function Transaction(idbTransaction) {
this._tx = idbTransaction;
this.complete = new Promise((resolve, reject) => {
idbTransaction.oncomplete = function () {
resolve();
};
idbTransaction.onerror = function () {
reject(idbTransaction.error);
};
idbTransaction.onabort = function () {
reject(idbTransaction.error);
};
});
}
Transaction.prototype.objectStore = function () {
return new ObjectStore(this._tx.objectStore.apply(this._tx, arguments));
};
proxyProperties(Transaction, '_tx', [
'objectStoreNames',
'mode',
]);
proxyMethods(Transaction, '_tx', IDBTransaction, [
'abort',
]);
function UpgradeDB(db, oldVersion, transaction) {
this._db = db;
this.oldVersion = oldVersion;
this.transaction = new Transaction(transaction);
}
UpgradeDB.prototype.createObjectStore = function () {
return new ObjectStore(this._db.createObjectStore.apply(this._db, arguments));
};
proxyProperties(UpgradeDB, '_db', [
'name',
'version',
'objectStoreNames',
]);
proxyMethods(UpgradeDB, '_db', IDBDatabase, [
'deleteObjectStore',
'close',
]);
function DB(db) {
this._db = db;
}
DB.prototype.transaction = function () {
return new Transaction(this._db.transaction.apply(this._db, arguments));
};
proxyProperties(DB, '_db', [
'name',
'version',
'objectStoreNames',
]);
proxyMethods(DB, '_db', IDBDatabase, [
'close',
]);
// Add cursor iterators
// TODO: remove this once browsers do the right thing with promises
['openCursor', 'openKeyCursor'].forEach((funcName) => {
[ObjectStore, Index].forEach((Constructor) => {
Constructor.prototype[funcName.replace('open', 'iterate')] = function () {
const args = toArray(arguments);
const callback = args[args.length - 1];
const nativeObject = this._store || this._index;
const request = nativeObject[funcName].apply(nativeObject, args.slice(0, -1));
request.onsuccess = function () {
callback(request.result);
};
};
});
});
// polyfill getAll
[Index, ObjectStore].forEach((Constructor) => {
if (Constructor.prototype.getAll) return;
Constructor.prototype.getAll = function (query, count) {
const instance = this;
const items = [];
return new Promise((resolve) => {
instance.iterateCursor(query, (cursor) => {
if (!cursor) {
resolve(items);
return;
}
items.push(cursor.value);
if (!!count && items.length == count) {
resolve(items);
return;
}
cursor.continue();
});
});
};
});
const exp = {
open(name, version, upgradeCallback) {
const p = promisifyRequestCall(indexedDB, 'open', [name, version]);
const { request } = p;
request.onupgradeneeded = function (event) {
if (upgradeCallback) {
upgradeCallback(new UpgradeDB(request.result, event.oldVersion, request.transaction));
}
};
return p.then((db) => new DB(db));
},
delete(name) {
return promisifyRequestCall(indexedDB, 'deleteDatabase', [name]);
},
};
if (typeof module !== 'undefined') {
module.exports = exp;
module.exports.default = module.exports;
} else {
self.idb = exp;
}
}());

Some files were not shown because too many files have changed in this diff Show More