Compare commits
105 Commits
FrontEnd-v
...
product_in
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c1946debe | ||
|
|
7aeced4232 | ||
|
|
6d78f82099 | ||
|
|
89a8d10eae | ||
|
|
6fdb101092 | ||
|
|
f238630dd7 | ||
|
|
a22eca0f58 | ||
|
|
a4ca394e49 | ||
|
|
5d35930dc8 | ||
|
|
a51bc5a8a2 | ||
|
|
8b6a636a96 | ||
|
|
2abdda3b44 | ||
|
|
3018542868 | ||
|
|
cfb830a0ad | ||
|
|
1bd41058a6 | ||
|
|
281be361ba | ||
|
|
2dca358cd3 | ||
|
|
05bf8ad495 | ||
|
|
145327a6ca | ||
|
|
b37204f543 | ||
|
|
e9fa53a637 | ||
|
|
9faaa1a4c3 | ||
|
|
8ab7594f16 | ||
|
|
3c5287a13c | ||
|
|
57436f088b | ||
|
|
05a3617103 | ||
|
|
05dc22dac6 | ||
|
|
4985e7565d | ||
|
|
fc569192e7 | ||
|
|
4eb8838dbc | ||
|
|
b8df3ea721 | ||
|
|
d812c6c799 | ||
|
|
a164db8bf3 | ||
|
|
7e156ca820 | ||
|
|
d179581b23 | ||
|
|
df98ec9471 | ||
|
|
eb0fb72c70 | ||
|
|
2f39d4f1d9 | ||
|
|
58db59a751 | ||
|
|
e827744f51 | ||
|
|
b07d4c822f | ||
|
|
fc1e9d4666 | ||
|
|
05c97ab231 | ||
|
|
d6c0bcf879 | ||
|
|
c8589e794f | ||
|
|
917cdaa754 | ||
|
|
e40bf8b73d | ||
|
|
95fa0b9ac0 | ||
|
|
cb3baf3dbb | ||
|
|
ac84755dbb | ||
|
|
cb0c26a43c | ||
|
|
63d0f865fd | ||
|
|
574f389200 | ||
|
|
4f4297ca21 | ||
|
|
5d8e38fea6 | ||
|
|
f1f3f5ad07 | ||
|
|
6013a624f6 | ||
|
|
85db3b4a61 | ||
|
|
31161b6a32 | ||
|
|
6779b0ea25 | ||
|
|
f12341f780 | ||
|
|
43938023ee | ||
|
|
969e7b726e | ||
|
|
d37797fdad | ||
|
|
2ce8a72286 | ||
|
|
be0d7efca2 | ||
|
|
68dac1b2f4 | ||
|
|
40ec5465b2 | ||
|
|
7f5ff3da64 | ||
|
|
ee5ac4e554 | ||
|
|
e7ead2e66a | ||
|
|
9e95fe622b | ||
|
|
4b65400d50 | ||
|
|
99fab39c4b | ||
|
|
bfc6ec04f6 | ||
|
|
1298184b2e | ||
|
|
f146b36173 | ||
|
|
286cc4e3a7 | ||
|
|
2dac04fb16 | ||
|
|
d99ad47483 | ||
|
|
56d1870bc1 | ||
|
|
664975b1fd | ||
|
|
06fe6eb861 | ||
|
|
12f816b738 | ||
|
|
94d844c104 | ||
|
|
72d5574fab | ||
|
|
5ba3bef8a1 | ||
|
|
67aaf719f4 | ||
|
|
884afe4eb5 | ||
|
|
3d2d1cbdd7 | ||
|
|
e0583044d7 | ||
|
|
fea40922cb | ||
|
|
8ff204657e | ||
|
|
859ba022fa | ||
|
|
810815a12a | ||
|
|
b7ecd60fc3 | ||
|
|
daeb865e93 | ||
|
|
685bc34bd0 | ||
|
|
9e0634da05 | ||
|
|
50015712f5 | ||
|
|
300b8434ef | ||
|
|
f30cbf072a | ||
|
|
fc8a954eb0 | ||
|
|
85faf11d27 | ||
|
|
89bbda59b3 |
4
.env
@@ -1,6 +1,6 @@
|
||||
VITE_APP_VERSION="1.2.42"
|
||||
VITE_APP_VERSION="1.2.86"
|
||||
VITE_LANG_DEFAULT="it"
|
||||
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_VUE_ROUTER_MODE="history"
|
||||
@@ -1,12 +1,14 @@
|
||||
VITE_APP_ID="18"
|
||||
VITE_APP_ID="13"
|
||||
VITE_APP_URL="https://localhost"
|
||||
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_DEBUG="1"
|
||||
VITE_VUE_APP_ISTEST=0
|
||||
VITE_VUE_APP_INLOCALE=1
|
||||
DIRECTORY_LOCAL="newfreeplanet"
|
||||
DIRECTORY_LOCAL="myprojplanet_vite"
|
||||
DIRECTORY_SERVER="freeplanet_serverside"
|
||||
SERVERDIR_WEBSITE=""
|
||||
SERVERPW_WEBSITE=""
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
VITE_APP_ID="18"
|
||||
VITE_APP_URL="https://gruppomacro.app"
|
||||
VITE_MONGODB_HOST="https://api.gruppomacro.app"
|
||||
VITE_LOGO_REG='gruppomacro-logo-full.png'
|
||||
VITE_PUBLICKEY_PUSH="BJgo8XR_upbnbMLWgCAUELo6DK7dRXffYAnFOxbaMMz5favBgcQBKT-eISqouO-jRad4Sw8l5nd2wCF6KorGiTc"
|
||||
VITE_APP_ID="13"
|
||||
VITE_APP_URL="https://riso.app"
|
||||
VITE_MONGODB_HOST="https://api.riso.app"
|
||||
VITE_LOGO_REG='riso-logo-full.png'
|
||||
VITE_PUBLICKEY_PUSH="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
|
||||
VITE_DEBUG="0"
|
||||
VITE_VUE_APP_ISTEST="0"
|
||||
DIRECTORY_LOCAL="myprojplanet_vite"
|
||||
DIRECTORY_SERVER="/var/www/nodejs_piuchebuono_server"
|
||||
SERVERDIR_WEBSITE="/var/www/gruppomacro.app"
|
||||
DIRECTORY_LOCAL=myprojplanet_vite
|
||||
DIRECTORY_SERVER=/var/www/nodejs_riso_server
|
||||
SERVERDIR_WEBSITE="/var/www/riso.app"
|
||||
SERVERPW_WEBSITE="pwdadmin@1AOK"
|
||||
PORT_SPA="8092"
|
||||
PORT_PWA="8099"
|
||||
3
.gitignore
vendored
@@ -30,7 +30,8 @@ yarn-error.log
|
||||
/.scripts
|
||||
key.pem
|
||||
public/upload/
|
||||
upload/
|
||||
/upload/
|
||||
scripts/_ALL_SITES/gruppomacro.app/public/upload/
|
||||
._yarn.lock
|
||||
.gitignore
|
||||
._upload
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
{
|
||||
"singleAttributePerLine": true,
|
||||
"printWidth": 120,
|
||||
"printWidth": 90,
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "es5",
|
||||
"bracketSpacing": true,
|
||||
|
||||
21
.vscode/launch.json
vendored
@@ -4,13 +4,6 @@
|
||||
// Per altre informazioni, visitare: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "npm run dev_noCheck",
|
||||
"name": "DEV (no-check-TS)",
|
||||
"request": "launch",
|
||||
"type": "node-terminal",
|
||||
"sourceMaps": false,
|
||||
},
|
||||
{
|
||||
"command": "npm run dev",
|
||||
"name": "DEV",
|
||||
@@ -24,13 +17,6 @@
|
||||
"type": "node-terminal",
|
||||
"sourceMaps": false,
|
||||
},
|
||||
{
|
||||
"command": "npm run lint",
|
||||
"name": "Lint (Check ERRORI)",
|
||||
"request": "launch",
|
||||
"type": "node-terminal",
|
||||
"sourceMaps": false
|
||||
},
|
||||
{
|
||||
"command": "npm run pwa",
|
||||
"name": "PWA",
|
||||
@@ -40,6 +26,13 @@
|
||||
"NODE_ENV": "development"
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "npm run lint",
|
||||
"name": "Lint (Check ERRORI)",
|
||||
"request": "launch",
|
||||
"type": "node-terminal",
|
||||
"sourceMaps": false
|
||||
},
|
||||
{
|
||||
"type": "chrome",
|
||||
"request": "launch",
|
||||
|
||||
BIN
1_module copia.jpg
Normal file
|
After Width: | Height: | Size: 536 KiB |
1778
_LIMBO/Casi d'Uso Ollama - Esempi Pratici.html
Normal file
234
_LIMBO/QueryFdevCatalogo.sql
Normal 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
284201
_LIMBO/dati.js
Normal file
467
_LIMBO/esempio.htm
Normal 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
0
src/rootgen/admin/gestoreordini_old/gestoreordini.scss → _LIMBO/grid.html
Executable file → Normal file
482
_LIMBO/prova.json
Normal 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
@@ -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
63
_LIMBO/tutorial.htm
Normal 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>
|
||||
|
||||
BIN
favicon.ico
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -10,7 +10,7 @@
|
||||
<meta name="description" content="<%= productDescription %>">
|
||||
<meta name="format-detection" content="telephone=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"
|
||||
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<% } %>">
|
||||
|
||||
|
||||
BIN
install_app_on_ios_safari_butt.jpg
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
install_app_on_safari.jpg
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
28
migrate-repos.sh
Executable 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
|
||||
138
package.json
@@ -1,143 +1,139 @@
|
||||
{
|
||||
"name": "gruppomacro",
|
||||
"version": "1.2.42",
|
||||
"description": "Gruppo Macro",
|
||||
"productName": "Gruppo Macro",
|
||||
"name": "riso",
|
||||
"version": "1.2.86",
|
||||
"productName": "Riso 💚 - Rete Italiana Scambio orizzontale",
|
||||
"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",
|
||||
"private": true,
|
||||
"keywords": [],
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"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",
|
||||
"build": "quasar build",
|
||||
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.42' quasar build -m pwa",
|
||||
"buildpwatest": "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.86' quasar build -m pwa",
|
||||
"type-check": "vue-tsc --noEmit",
|
||||
"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}\"",
|
||||
"lintfile": "eslint --ext .js,.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",
|
||||
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.42' quasar dev -m pwa",
|
||||
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.42' quasar dev",
|
||||
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.86' quasar dev -m pwa",
|
||||
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.86' quasar dev",
|
||||
"debug": "quasar dev --mode debug",
|
||||
"test": "echo \"No test specified\" && exit 0",
|
||||
"generate-sw": "workbox generateSW workbox-config.js",
|
||||
"postinstall": "quasar prepare"
|
||||
},
|
||||
"dependencies": {
|
||||
"@cubejs-client/core": "^1.2.26",
|
||||
"@quasar/extras": "^1.16.17",
|
||||
"@cubejs-client/core": "^1.5.11",
|
||||
"@quasar/extras": "^1.17.0",
|
||||
"@quasar/quasar-ui-qcalendar": "^4.1.2",
|
||||
"@syncfusion/ej2-vue-pdfviewer": "^29.1.40",
|
||||
"@types/jsbarcode": "^3.11.4",
|
||||
"@types/leaflet": "^1.9.17",
|
||||
"@vue/compat": "^3.5.13",
|
||||
"@vue/compiler-sfc": "^3.5.13",
|
||||
"@types/leaflet": "^1.9.21",
|
||||
"@vue/compat": "^3.5.25",
|
||||
"@vue/compiler-sfc": "^3.5.25",
|
||||
"@vuelidate/core": "^2.0.3",
|
||||
"@vuelidate/validators": "^2.0.4",
|
||||
"acorn": "^8.14.1",
|
||||
"acorn": "^8.15.0",
|
||||
"animate.css": "^4.1.1",
|
||||
"apexcharts": "^4.7.0",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"axios": "^1.8.4",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"chart.js": "^4.4.8",
|
||||
"core-js": "^3.41.0",
|
||||
"apexcharts": "^5.3.6",
|
||||
"autoprefixer": "^10.4.22",
|
||||
"axios": "^1.13.2",
|
||||
"bcryptjs": "^3.0.3",
|
||||
"chart.js": "^4.5.1",
|
||||
"core-js": "^3.47.0",
|
||||
"crypto-browserify": "^3.12.1",
|
||||
"date-fns": "^4.1.0",
|
||||
"echarts": "5.6.0",
|
||||
"eslint-plugin-n": "^17.16.2",
|
||||
"echarts": "6.0.0",
|
||||
"eslint-plugin-n": "^17.23.1",
|
||||
"eslint-plugin-quasar": "^1.1.0",
|
||||
"graphql": "^16.10.0",
|
||||
"graphql-tag": "^2.12.6",
|
||||
"gsap": "^3.12.7",
|
||||
"html2pdf.js": "^0.10.3",
|
||||
"gsap": "^3.13.0",
|
||||
"jquery": "^3.7.1",
|
||||
"js-cookie": "^3.0.5",
|
||||
"jsbarcode": "^3.11.6",
|
||||
"jsbarcode": "^3.12.1",
|
||||
"leaflet": "^1.9.4",
|
||||
"leaflet-routing-machine": "^3.2.12",
|
||||
"leaflet.markercluster": "^1.5.3",
|
||||
"localforage": "^1.10.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mongoose-paginate-v2": "^1.9.1",
|
||||
"normalize.css": "^8.0.1",
|
||||
"nprogress": "^0.2.0",
|
||||
"pinia": "^3.0.1",
|
||||
"pinia": "^3.0.4",
|
||||
"qrcode-vue3": "^1.7.1",
|
||||
"quasar": "^2.18.1",
|
||||
"quasar": "^2.18.6",
|
||||
"quasar-extras": "^2.0.9",
|
||||
"register-service-worker": "^1.7.2",
|
||||
"scrollreveal": "^4.0.9",
|
||||
"typescript-eslint": "^8.27.0",
|
||||
"vee-validate": "^4.15.0",
|
||||
"vue": "^3.5.13",
|
||||
"typescript-eslint": "^8.48.1",
|
||||
"vee-validate": "^4.15.1",
|
||||
"vue": "^3.5.25",
|
||||
"vue-class-component": "^8.0.0-rc.1",
|
||||
"vue-country-code": "^1.1.3",
|
||||
"vue-echarts": "^7.0.3",
|
||||
"vue-i18n": "^11.1.2",
|
||||
"vue-echarts": "^8.0.1",
|
||||
"vue-i18n": "^11.2.2",
|
||||
"vue-idb": "^0.2.0",
|
||||
"vue-image-zoomer": "^2.4.4",
|
||||
"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-social-sharing": "^4.0.0-alpha4",
|
||||
"vue-svgicon": "^4.0.0-alpha.3",
|
||||
"vue-timeago3": "^2.3.2",
|
||||
"vue2-dragula": "^2.5.5",
|
||||
"vue3-apexcharts": "^1.8.0",
|
||||
"vue3-pdf-app": "^1.0.3",
|
||||
"vue3-apexcharts": "^1.10.0",
|
||||
"vue3-qr-reader": "^1.0.0",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"vuex": "^4.1.0",
|
||||
"vuex-router-sync": "^6.0.0-rc.1",
|
||||
"workbox-core": "^7.3.0",
|
||||
"workbox-precaching": "^7.3.0",
|
||||
"workbox-routing": "^7.3.0",
|
||||
"workbox-strategies": "^7.3.0",
|
||||
"workbox-window": "^7.3.0"
|
||||
"workbox-core": "^7.4.0",
|
||||
"workbox-precaching": "^7.4.0",
|
||||
"workbox-routing": "^7.4.0",
|
||||
"workbox-strategies": "^7.4.0",
|
||||
"workbox-window": "^7.4.0",
|
||||
"xlsx": "^0.18.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.23.0",
|
||||
"@intlify/unplugin-vue-i18n": "^6.0.5",
|
||||
"@quasar/app-vite": "^2.1.4",
|
||||
"@eslint/js": "^9.39.1",
|
||||
"@intlify/unplugin-vue-i18n": "^11.0.1",
|
||||
"@quasar/app-vite": "^2.4.0",
|
||||
"@types/google.maps": "^3.58.1",
|
||||
"@types/jest": "^29.5.14",
|
||||
"@types/jest": "^30.0.0",
|
||||
"@types/js-cookie": "^3.0.6",
|
||||
"@types/node": "^22.13.11",
|
||||
"@types/node": "^24.10.1",
|
||||
"@types/nprogress": "^0.2.3",
|
||||
"@types/vue-tel-input": "^2.1.7",
|
||||
"@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-typescript": "^14.5.0",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"@vue/eslint-config-typescript": "^14.6.0",
|
||||
"autoprefixer": "^10.4.22",
|
||||
"eslint": "9",
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-vue": "^10.0.0",
|
||||
"eslint-plugin-import": "^2.32.0",
|
||||
"eslint-plugin-vue": "^10.6.2",
|
||||
"file-loader": "^6.2.0",
|
||||
"globals": "^16.0.0",
|
||||
"http-proxy-middleware": "^3.0.3",
|
||||
"jest": "^29.7.0",
|
||||
"globals": "^16.5.0",
|
||||
"http-proxy-middleware": "^3.0.5",
|
||||
"jest": "^30.2.0",
|
||||
"json-loader": "^0.5.7",
|
||||
"nodemon": "^3.1.9",
|
||||
"npm-check-updates": "^17.1.16",
|
||||
"parcel": "^2.14.1",
|
||||
"postcss": "^8.5.3",
|
||||
"postcss-loader": "^8.1.1",
|
||||
"nodemon": "^3.1.11",
|
||||
"npm-check-updates": "^19.1.2",
|
||||
"parcel": "^2.16.1",
|
||||
"postcss": "^8.5.6",
|
||||
"postcss-loader": "^8.2.0",
|
||||
"prettier": "3",
|
||||
"strip-ansi": "=7.1.0",
|
||||
"ts-jest": "^29.2.6",
|
||||
"typescript": "5.7.3",
|
||||
"vite-plugin-checker": "^0.9.1",
|
||||
"strip-ansi": "=7.1.2",
|
||||
"ts-jest": "^29.4.6",
|
||||
"typescript": "5.9.3",
|
||||
"vite-plugin-checker": "^0.11.0",
|
||||
"vue-cli-plugin-element-ui": "^1.1.4",
|
||||
"vue-eslint-parser": "^10.1.1",
|
||||
"vue-tsc": "^2.2.8",
|
||||
"vue-eslint-parser": "^10.2.0",
|
||||
"vue-tsc": "^3.1.5",
|
||||
"vueify": "^9.4.1",
|
||||
"workbox-build": "^7.3.0"
|
||||
"workbox-build": "^7.4.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18",
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
public/images/1ris_rosso.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
BIN
public/images/1ris_rosso_100.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
public/images/all_together.jpg
Executable file
|
After Width: | Height: | Size: 211 KiB |
195
public/images/avatar-1.svg
Executable 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 |
BIN
public/images/badge-96x96.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/images/calendario_eventi.jpg
Executable file
|
After Width: | Height: | Size: 63 KiB |
BIN
public/images/cerchio_riso.jpg
Normal file
|
After Width: | Height: | Size: 323 KiB |
BIN
public/images/cibo_sano.jpg
Executable file
|
After Width: | Height: | Size: 231 KiB |
BIN
public/images/cover.jpg
Executable file
|
After Width: | Height: | Size: 225 KiB |
BIN
public/images/de.png
Executable file
|
After Width: | Height: | Size: 107 B |
BIN
public/images/es.png
Executable file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/images/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
public/images/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
public/images/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/images/gb.png
Executable file
|
After Width: | Height: | Size: 597 B |
BIN
public/images/group-together.jpg
Executable file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/images/hand_people.jpg
Executable file
|
After Width: | Height: | Size: 180 KiB |
BIN
public/images/hero/cerchio_riso.jpg
Normal file
|
After Width: | Height: | Size: 323 KiB |
BIN
public/images/hero/mercatino_riso.jpg
Normal file
|
After Width: | Height: | Size: 217 KiB |
BIN
public/images/hero/riso_home_app.png
Normal file
|
After Width: | Height: | Size: 279 KiB |
BIN
public/images/icon.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
BIN
public/images/install_app_on_android_1.jpg
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/images/install_app_on_android_2.jpg
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
public/images/install_app_on_android_3.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/images/install_app_on_ios_1.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
public/images/install_app_on_ios_1b.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
public/images/install_app_on_ios_2.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/images/install_app_on_safari.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/images/it.png
Executable file
|
After Width: | Height: | Size: 179 B |
BIN
public/images/landing_first_section.png
Executable file
|
After Width: | Height: | Size: 68 KiB |
BIN
public/images/layers-2x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/images/layers.png
Normal file
|
After Width: | Height: | Size: 696 B |
BIN
public/images/logo.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
public/images/mappa_mentale_riso.jpg
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
public/images/marker-icon-2x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/images/marker-icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/images/marker-shadow.png
Normal file
|
After Width: | Height: | Size: 618 B |
BIN
public/images/mountains.jpg
Executable file
|
After Width: | Height: | Size: 154 KiB |
BIN
public/images/noimg-user.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
1
public/images/noimg-user.svg
Normal 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
|
After Width: | Height: | Size: 14 KiB |
BIN
public/images/opz1-icon-96x96.jpg
Executable file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/images/opz2-icon-96x96.jpg
Executable file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/images/paypal.jpg
Executable file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
public/images/regalo.jpg
Executable file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/images/revolut.jpg
Executable file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
public/images/riso-android-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
public/images/riso-android-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
public/images/riso-android-icon-36x36.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/images/riso-android-icon-384x384.png
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
public/images/riso-android-icon-48x48.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
public/images/riso-android-icon-512x512.png
Normal file
|
After Width: | Height: | Size: 276 KiB |
BIN
public/images/riso-android-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
public/images/riso-android-icon-96x96.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/images/riso-apple-icon-114x114.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/riso-apple-icon-120x120.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/images/riso-apple-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
public/images/riso-apple-icon-152x152.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/images/riso-apple-icon-180x180.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
public/images/riso-apple-icon-57x57.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
public/images/riso-apple-icon-60x60.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
public/images/riso-apple-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
public/images/riso-apple-icon-76x76.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
public/images/riso-logo-full.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
public/images/riso_home.png
Normal file
|
After Width: | Height: | Size: 279 KiB |
BIN
public/images/riso_home_dark.png
Normal file
|
After Width: | Height: | Size: 258 KiB |
BIN
public/images/riso_quadrato.jpg
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
public/images/riso_services.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
457
public/js/fetch.js
Executable 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
@@ -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
@@ -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;
|
||||
}
|
||||
}());
|
||||