17 Commits

Author SHA1 Message Date
Surya Paolo
7b746e3b6f - Caricamento Video 2025-12-19 22:59:13 +01:00
Surya Paolo
99d623da79 Versione 1.2.87 2025-12-18 19:45:36 +01:00
Surya Paolo
a305bd8493 - invio RIS... 2025-12-18 19:03:24 +01:00
Surya Paolo
d1a66ef4ea - altro aggiornamento restying
- Invio RIS aggiornato
- Eventi
- Home Page restyling
2025-12-18 16:58:06 +01:00
Surya Paolo
7c1946debe aa 2025-12-17 10:26:12 +01:00
Surya Paolo
7aeced4232 ok 2025-12-17 10:20:07 +01:00
Surya Paolo
6d78f82099 - aggiornamento di tante cose...
- generazione Volantini
- pagina RIS
2025-12-17 10:07:42 +01:00
Surya Paolo
89a8d10eae - verifica email se non è stata verificata (componente)
- altri aggiornamenti grafica PAGERIS.
- OLLAMA AI
2025-12-11 18:34:39 +01:00
Surya Paolo
6fdb101092 categorie 2025-12-07 15:17:37 +01:00
Surya Paolo
f238630dd7 ok 2025-12-07 10:47:58 +01:00
Surya Paolo
a22eca0f58 - aggiornati anche i ContribTypes che appaiono sulla card degli annunci 2025-12-07 10:26:30 +01:00
Surya Paolo
a4ca394e49 - Aggiornate tutte le categorie ottimizzandole.
- Migrazione delle vecchie categ. con quelle nuove.
- Create le Categorie e sottocategorie degli Eventi (a parte).
- Aggiornato la card dell'Ospitalità
2025-12-07 02:13:18 +01:00
Surya Paolo
5d35930dc8 - pagine RISO 2025-12-05 17:56:05 +01:00
Surya Paolo
a51bc5a8a2 - aggiornamenti guida RIS, FAQ
- Editor HTML aggiunto CSS e Script
- Statistiche
- CRISBalanceBar
- Inizio Sync... (ma disattivato)
2025-12-02 22:16:24 +01:00
Surya Paolo
8b6a636a96 - Nuova Home Page RISO Moderna! Passo 1 - la struttura 2025-11-29 21:14:26 +01:00
Surya Paolo
2abdda3b44 - aggiornato Card service, e CGridTableRec. 2025-11-28 21:28:31 +01:00
Surya Paolo
3018542868 - email Abilitazione Circuito RISO 2025-11-28 18:53:37 +01:00
559 changed files with 55659 additions and 11330 deletions

4
.env
View File

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

View File

@@ -1,11 +1,11 @@
VITE_APP_ID="13"
VITE_APP_URL="https://test.riso.app"
VITE_MONGODB_HOST="https://testapi.riso.app"
VITE_LOGO_REG="riso-logo-full.png"
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="1"
VITE_VUE_APP_ISTEST="1"
DIRECTORY_LOCAL="myprojplanet_vite"
DIRECTORY_SERVER="/var/www/nodejs_test.riso_server"
SERVERDIR_WEBSITE="/var/www/test.riso.app"
VITE_DEBUG="0"
VITE_VUE_APP_ISTEST="0"
DIRECTORY_LOCAL=myprojplanet_vite
DIRECTORY_SERVER=/var/www/nodejs_riso_server
SERVERDIR_WEBSITE="/var/www/riso.app"
SERVERPW_WEBSITE="pwdadmin@1AOK"

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

1026
_LIMBO/aaa.scss Normal file

File diff suppressed because it is too large Load Diff

2969
_LIMBO/faq_ris.html Normal file

File diff suppressed because it is too large Load Diff

0
_LIMBO/grid.html Normal file
View File

2293
_LIMBO/risospiegazione.html Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -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.85">
<meta name="version" content="1.2.87">
<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<% } %>">

28
migrate-repos.sh Executable file
View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "riso",
"version": "1.2.85",
"version": "1.2.87",
"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",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "APP_VERSION='1.2.85' PORT=8084 quasar dev",
"dev": "APP_VERSION='1.2.87' PORT=8084 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,35 +21,35 @@
"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=8094 APP_VERSION='1.2.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.87' 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.3.21",
"@cubejs-client/core": "^1.5.11",
"@quasar/extras": "^1.17.0",
"@quasar/quasar-ui-qcalendar": "^4.1.2",
"@types/jsbarcode": "^3.11.4",
"@types/leaflet": "^1.9.18",
"@vue/compat": "^3.5.16",
"@vue/compiler-sfc": "^3.5.16",
"@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.15.0",
"animate.css": "^4.1.1",
"apexcharts": "^4.7.0",
"autoprefixer": "^10.4.21",
"axios": "^1.9.0",
"bcryptjs": "^3.0.2",
"chart.js": "^4.4.9",
"core-js": "^3.43.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.19.0",
"echarts": "6.0.0",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-quasar": "^1.1.0",
"gsap": "^3.13.0",
"jquery": "^3.7.1",
@@ -63,76 +63,77 @@
"mongoose-paginate-v2": "^1.9.1",
"normalize.css": "^8.0.1",
"nprogress": "^0.2.0",
"pinia": "^3.0.3",
"quasar": "^2.18.1",
"pinia": "^3.0.4",
"qrcode-vue3": "^1.7.1",
"quasar": "^2.18.6",
"quasar-extras": "^2.0.9",
"register-service-worker": "^1.7.2",
"scrollreveal": "^4.0.9",
"typescript-eslint": "^8.34.0",
"typescript-eslint": "^8.48.1",
"vee-validate": "^4.15.1",
"vue": "^3.5.16",
"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.5",
"vue-echarts": "^8.0.1",
"vue-i18n": "^11.2.2",
"vue-idb": "^0.2.0",
"vue-property-decorator": "^10.0.0-rc.3",
"vue-router": "^4.5.1",
"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-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.28.0",
"@intlify/unplugin-vue-i18n": "^6.0.8",
"@quasar/app-vite": "^2.2.1",
"@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": "^24.0.1",
"@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.6",
"@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.2.0",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-vue": "^10.6.2",
"file-loader": "^6.2.0",
"globals": "^16.2.0",
"globals": "^16.5.0",
"http-proxy-middleware": "^3.0.5",
"jest": "^30.0.0",
"jest": "^30.2.0",
"json-loader": "^0.5.7",
"nodemon": "^3.1.10",
"npm-check-updates": "^18.0.1",
"parcel": "^2.15.2",
"postcss": "^8.5.5",
"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.4.0",
"typescript": "5.8.3",
"vite-plugin-checker": "^0.9.3",
"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.3",
"vue-tsc": "^2.2.10",
"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",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 424 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

View File

@@ -1,21 +1,9 @@
import { defineConfig } from '#q-app/wrappers';
import { fileURLToPath } from 'node:url';
import path from 'path';
// console.log(process.env)
export default defineConfig((ctx) => {
return {
// https://v2.quasar.dev/quasar-cli/supporting-ts
// https://v2.quasar.dev/quasar-cli/prefetch-feature
// preFetch: true,
// app boot file (/src/boot)
// --> boot files are part of "main.js"
// https://v2.quasar.dev/quasar-cli/boot-files
// boot: ['vue-i18n', 'vue-meta', 'axios', 'vee-validate', 'myconfig', 'local-storage', 'error-handler', 'globalroutines', 'vue-idb', 'dragula', 'guard'],
boot: [
'i18n',
'axios',
@@ -31,56 +19,90 @@ export default defineConfig((ctx) => {
'trackPageViews',
],
// https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css
css: [
'app.scss',
// '~quasar-ui-qcalendar/src/css/calendar-day.sass'
],
css: ['app.scss'],
// https://github.com/quasarframework/quasar/tree/dev/extras
extras: [
// 'ionicons-v4',
// 'mdi-v5',
// 'eva-icons',
// 'themify',
// 'line-awesome',
'ionicons-v4',
// 'mdi-v3',
'fontawesome-v5',
'roboto-font', // optional, you are not bound to it
'material-icons', // optional, you are not bound to it
'roboto-font',
'material-icons',
'material-icons-outlined',
],
// Full list of options: https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build
build: {
target: {
browser: ['es2021', 'chrome100', 'firefox100', 'safari14'],
node: 'node20',
},
sassVariables: 'src/css/variables.scss',
vueRouterMode: 'history',
analyze: false,
transpile: true,
transpileDependencies: [/quasar-ui-qcalendar[\\/]src/],
typescript: {
strict: false,
vueShim: true,
},
// ✅ AGGIUNTO: Config SCSS globale per Vite
extendViteConf(viteConf, { isServer, isClient }) {
// Alias puliti
viteConf.resolve = {
...(viteConf.resolve || {}),
alias: {
...viteConf.resolve.alias,
'#q-app': path.resolve(__dirname, 'node_modules/quasar/app'),
// Alias essenziali (rimuovi duplicati)
'@': path.resolve(__dirname, 'src'),
'@components': path.resolve(__dirname, 'src/components'),
'@views': path.resolve(__dirname, 'src/views'),
'@boot': path.resolve(__dirname, 'src/boot'),
'@store': path.resolve(__dirname, 'src/store'),
'@storemod': path.resolve(__dirname, 'src/store/Modules'),
'@tools': path.resolve(__dirname, 'src/store/Modules/tools.ts'), // ✅ AGGIUNTO
'@costanti': path.resolve(__dirname, 'src/store/Modules/costanti.ts'), // ✅ AGGIUNTO
'@api': path.resolve(__dirname, 'src/store/Api'),
'@utils': path.resolve(__dirname, 'src/utils'),
'@model': path.resolve(__dirname, 'src/model'),
'@classes': path.resolve(__dirname, 'src/classes'),
'@router': path.resolve(__dirname, 'src/router'),
'@css': path.resolve(__dirname, 'src/css'),
'@paths': path.resolve(__dirname, 'src/store/Api/ApiRoutes.ts'),
'@images': path.resolve(__dirname, 'src/assets/images'),
'@icons': path.resolve(__dirname, 'src/public/myicons'),
'@types': path.resolve(__dirname, 'src/types'),
'@services': path.resolve(__dirname, 'src/services'),
},
};
// ✅ AGGIUNTO: SCSS preprocessor con variables.scss globale
viteConf.css = {
...(viteConf.css || {}),
preprocessorOptions: {
scss: {
additionalData: `@use "sass:color"; @use "src/css/variables.scss" as *;`,
},
},
};
},
viteConf: {
server: {
hmr: {
protocol: 'wss', // o 'ws' se usi HTTP
protocol: 'wss',
host: 'localhost',
port: 8094,
},
},
},
target: {
browser: ['es2022', 'firefox115', 'chrome115', 'safari14'],
node: 'node20',
},
sassVariables: 'src/css/variables.scss',
// env: envparser(),
// versionCode: package.version,
vueRouterMode: 'history',
analyze: false, // true
transpile: true,
transpileDependencies: [/quasar-ui-qcalendar[\\/]src/],
beforeDev(api) {
// Se la variabile d'ambiente SKIP_TSC è impostata, disabilita il type checking
if (process.env.SKIP_TSC === 'true') {
console.log('⚠️ TypeScript type checking is disabled');
// Disattiva TypeScript checking per Vite
if (api && api.chainWebpack) {
api.chainWebpack((chain) => {
chain.plugin('fork-ts-checker').tap((args) => {
@@ -91,113 +113,19 @@ export default defineConfig((ctx) => {
}
}
},
// @quasar/app-vite v2.0.3+
envFilter(originalEnv) {
const newEnv = {};
for (const key in originalEnv) {
/* ...decide if it goes in or not... */
if (true) {
newEnv[key] = originalEnv[key];
}
}
// remember to return your processed env
return newEnv;
},
typescript: {
strict: false,
vueShim: true,
extendTsConfig(tsConfig) {
// You can use this hook to extend tsConfig dynamically
// For basic use cases, you can still update the usual tsconfig.json file to override some settings
},
/**
* Folder where Quasar CLI should look for .env* files.
* Can be an absolute path or a relative path to project root directory.
*
* @default project root directory
*/
// envFolder?: string
/**
* Additional .env* files to be loaded.
* Each entry can be an absolute path or a relative path to quasar.config > build > envFolder.
*
* @example ['.env.somefile', '../.env.someotherfile']
*/
// envFiles?: string[];
},
extendViteConf(viteConf, { isServer, isClient }) {
viteConf.resolve = {
...(viteConf.resolve || {}),
alias: {
...viteConf.resolve.alias,
'#q-app': path.resolve(__dirname, 'node_modules/quasar/app'), // Alias per #q-app
app: path.resolve(__dirname),
boot: path.resolve(__dirname, 'src/boot'),
src: path.resolve(__dirname, 'src'),
statics: path.resolve(__dirname, 'src/statics'),
components: path.resolve(__dirname, 'src/components'),
views: path.resolve(__dirname, 'src/views/index.ts'),
images: path.resolve(__dirname, 'src/assets/images'),
maps: path.resolve(__dirname, 'public/maps'),
classes: path.resolve(__dirname, 'src/classes/index.ts'),
fonts: path.resolve(__dirname, 'src/assets/fonts'),
utils: path.resolve(__dirname, 'src/utils/index.ts'),
css: path.resolve(__dirname, 'src/css/variables.scss'),
router: path.resolve(__dirname, 'src/router/index.ts'),
validators: path.resolve(__dirname, 'src/utils/validators.ts'),
methods: path.resolve(__dirname, 'src/utils/methods.ts'),
filters: path.resolve(__dirname, 'src/utils/filters.ts'),
api: path.resolve(__dirname, 'src/store/Api/index.ts'),
paths: path.resolve(__dirname, 'src/store/Api/ApiRoutes.ts'),
modules: path.resolve(__dirname, 'src/store/Modules/index.ts'),
model: path.resolve(__dirname, 'src/model/index.ts'),
'@components': path.resolve(__dirname, 'src/components'),
'@boot': path.resolve(__dirname, 'src/boot'),
'@costanti': path.resolve(__dirname, 'src/store/Modules/costanti.ts'),
'@views': path.resolve(__dirname, 'src/views/index.ts'),
'@src': path.resolve(__dirname, 'src'),
'@css': path.resolve(__dirname, 'src/public/css/variables.scss'),
'@icons': path.resolve(__dirname, 'src/public/public/myicons'),
'@images': path.resolve(__dirname, 'src/public/images/*'),
'@maps': path.resolve(__dirname, 'src/public/maps/*'),
'@classes': path.resolve(__dirname, 'src/classes/index.ts'),
'@utils': path.resolve(__dirname, 'src/utils/index.ts'),
'@router': path.resolve(__dirname, 'src/router/index.ts'),
'@validators': path.resolve(__dirname, 'src/utils/validators.ts'),
'@methods': path.resolve(__dirname, 'src/utils/methods.ts'),
'@api': path.resolve(__dirname, 'src/store/Api/index.ts'),
'@paths': path.resolve(__dirname, 'src/store/Api/ApiRoutes.ts'),
'@storemod': path.resolve(__dirname, 'src/store/Modules'),
'@store': path.resolve(__dirname, 'src/store'),
'@tools': path.resolve(__dirname, 'src/store/Modules/tools.ts'),
'@modules': path.resolve(__dirname, 'src/store/Modules/index.ts'),
'@model': path.resolve(__dirname, 'src/model/index.ts'),
},
};
return originalEnv; // Ritorna tutto per semplicità
},
vitePlugins: [
[
'@intlify/unplugin-vue-i18n/vite',
{
// if you want to use Vue I18n Legacy API, you need to set `compositionOnly: false`
// compositionOnly: false,
// if you want to use named tokens in your Vue I18n messages, such as 'Hello {name}',
// you need to set `runtimeOnly: false`
// runtimeOnly: false,
ssr: ctx.modeName === 'ssr',
// you need to set i18n resource including paths !
include: [fileURLToPath(new URL('./src/i18n', import.meta.url))],
},
],
[
'vite-plugin-checker',
{
@@ -211,60 +139,25 @@ export default defineConfig((ctx) => {
{ server: false },
],
],
// polyfillModulePreload: true,
// viteVuePluginOptions: {},
// extractCSS: false,
// transpile: false,
// Add dependencies for transpiling with Babel (Array of string/regex)
// (from node_modules, which are by default not transpiled).
// Applies only if "transpile" is set to true.
// transpileDependencies: [],
// rtl: true, // https://v2.quasar.dev/options/rtl-supg
// preloadChunks: true,
// showProgress: false,
// gzip: true,
// analyze: true,
// Options below are automatically set depending on the env, set them if you want to override
// extractCSS: false,
// https://v2.quasar.dev/quasar-cli/handling-webpack
// "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain
},
// Full list of options: https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-devServer
devServer: {
https: {
key: path.resolve(__dirname, 'localhost-key.pem'),
cert: path.resolve(__dirname, 'localhost.pem'),
},
port: parseInt(process.env.PORT, 10),
vueDevtools: false, // automatically opening remote Vue Devtools
open: false, // opens browser window automatically
hot: true, // Enable hot module replacement
vueDevtools: false,
open: false,
hot: true,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
},
},
// https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework
framework: {
config: {},
// iconSet: 'material-icons', // Quasar icon set
// lang: 'en-US', // Quasar language pack
// For special cases outside of where the auto-import strategy can have an impact
// (like functional components as one of the examples),
// you can manually specify Quasar components/directives to be available everywhere:
//
components: [
'QLayout',
'QDrawer',
@@ -332,9 +225,10 @@ export default defineConfig((ctx) => {
'QTabPanel',
'QTree',
'QSeparator',
'QPageSticky',
],
directives: ['Ripple', 'ClosePopup'],
_plugins: [
plugins: [
'Meta',
'Dialog',
'Notify',
@@ -344,59 +238,27 @@ export default defineConfig((ctx) => {
'LocalStorage',
'SessionStorage',
],
get plugins_1() {
return this._plugins;
},
set plugins_1(value) {
this._plugins = value;
},
get plugins() {
return this._plugins;
},
set plugins(value) {
this._plugins = value;
},
// iconSet: 'fontawesome-v5',
iconSet: 'material-icons',
lang: 'it', // Quasar language
lang: 'it',
},
animations: 'all', // --- includes all animations
// https://v2.quasar.dev/options/animations
// animations: [],
animations: 'all',
// https://v2.quasar.dev/quasar-cli/developing-ssr/configuring-ssr
ssr: {
pwa: false,
// manualStoreHydration: true,
// manualPostHydrationTrigger: true,
prodPort: 3000, // The default port that the production server should use
// (gets superseded if import.meta.env.PORT is specified at runtime)
prodPort: 3000,
maxAge: 1000 * 60 * 60 * 24 * 30,
// Tell browser when a file from the server should expire from cache (in ms)
middlewares: [
ctx.prod ? 'compression' : '',
'render', // keep this as last one
],
middlewares: [ctx.prod ? 'compression' : '', 'render'],
},
// https://v2.quasar.dev/quasar-cli/developing-pwa/configuring-pwa
pwa: {
workboxMode: 'InjectManifest', // 'GenerateSW' or 'InjectManifest'
workboxMode: 'InjectManifest',
swFilename: 'sw-' + process.env.APP_VERSION + '.js',
workboxOptions: {
swSrc: 'src-pwa/custom-service-worker.js', // Assicurati che il file esista
include: [/\.html$/, /\.js$/, /\.css$/, /\.png$/, /\.svg$/, /\.json$/], // File da precacheare
swSrc: 'src-pwa/custom-service-worker.js',
include: [/\.html$/, /\.js$/, /\.css$/, /\.png$/, /\.svg$/, /\.json$/],
},
suppressWarnings: true,
/*extendGenerateSWOptions(cfg) {
cfg.skipWaiting = false
cfg.clientsClaim = false
},*/
},
sourceFiles: {
@@ -405,36 +267,12 @@ export default defineConfig((ctx) => {
pwaManifestFile: 'src-pwa/manifest.json',
},
// Full list of options: https://v2.quasar.dev/quasar-cli/developing-cordova-apps/configuring-cordova
cordova: {
// noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing
},
// Full list of options: https://v2.quasar.dev/quasar-cli/developing-capacitor-apps/configuring-capacitor
capacitor: {
hideSplashscreen: true,
},
// Full list of options: https://v2.quasar.dev/quasar-cli/developing-electron-apps/configuring-electron
cordova: {},
capacitor: { hideSplashscreen: true },
electron: {
bundler: 'packager', // 'packager' or 'builder'
packager: {
// https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options
// OS X / Mac App Store
// appBundleId: '',
// appCategoryType: '',
// osxSign: '',
// protocol: 'myapp://path',
// Windows only
// win32metadata: { ... }
},
builder: {
// https://www.electron.build/configuration/configuration
appId: '-',
},
bundler: 'packager',
packager: {},
builder: { appId: '-' },
},
};
});

View File

@@ -1,6 +1,6 @@
{
"name": "cnm",
"version": "1.2.85",
"version": "1.2.87",
"description": "Comunita Nuovo Mondo",
"productName": "ComunitaNuovoMondo",
"author": "Surya",
@@ -9,7 +9,7 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8083 APP_VERSION='1.2.85' quasar dev",
"dev": "PORT=8083 APP_VERSION='1.2.87' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production quasar build -m pwa",
@@ -21,8 +21,8 @@
"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=8093 APP_VERSION='1.2.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -25,6 +25,7 @@ const msg_website_it = {
Ammetti: 'Ammetti',
AbilitaCircuito: 'Abilita Circuito',
installaApp: 'Installa App',
VideoPage: 'Video',
fundraising: 'Sostieni il Progetto',
notifs: 'Configura le Notifiche',
unsubscribe: 'Disiscriviti',
@@ -88,6 +89,7 @@ const msg_website_it = {
eventodef: 'Evento:',
prova: 'prova',
dbop: 'Operazioni',
VideoPage: 'Video',
dbopmacro: 'Operazioni Macro',
projall: 'Comunitari',
groups: 'Lista Gruppi',

View File

@@ -36,7 +36,7 @@ const firstPage = {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -51,7 +51,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -62,7 +62,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
@@ -72,7 +72,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/goods',
materialIcon: 'fas fa-tshirt',
name: 'mypages.goods',
component: () => import('@src/root/goods/goods.vue'),
component: () => import('@/root/goods/goods.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -83,7 +83,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/services',
materialIcon: 'fas fa-house-user',
name: 'mypages.services',
component: () => import('@src/root/services/services.vue'),
component: () => import('@/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -94,7 +94,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/activities',
materialIcon: 'fas fa-house-user',
name: 'mypages.activities',
component: () => import('@src/root/activities/activities.vue'),
component: () => import('@/root/activities/activities.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -105,7 +105,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@src/root/provapao/provapao.vue'),
component: () => import('@/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -116,7 +116,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/hosps',
materialIcon: 'fas fa-bed',
name: 'mypages.hosp',
component: () => import('@src/root/hosp/hosp.vue'),
component: () => import('@/root/hosp/hosp.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -127,7 +127,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -138,7 +138,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -149,7 +149,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@src/views/admin/install_site/install_site.vue'),
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -160,7 +160,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -171,7 +171,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@src/views/user/editprofile/editprofile.vue'),
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -182,7 +182,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -193,7 +193,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
@@ -204,7 +204,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -215,7 +215,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@src/views/user/mycircuit/mycircuit.vue'),
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -234,7 +234,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -245,7 +245,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -256,7 +256,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@src/views/user/mypagehosp/mypagehosp.vue'),
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -267,7 +267,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@src/views/user/mypagegood/mypagegood.vue'),
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -278,7 +278,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/sostieniilprogetto',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
component: () => import('@/root/fundraising/fundraising.vue'),
inmenu: false,
infooter: false,
},
@@ -288,7 +288,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false

View File

@@ -62,7 +62,7 @@ const routes_admin: IListRoutes[] = [
path: '/admin/sites',
materialIcon: 'event_seat',
name: 'pages.Sites',
component: () => import('@src/rootgen/admin/sites/sites.vue'),
component: () => import('@/rootgen/admin/sites/sites.vue'),
level_parent: 0.0,
level_child: 0.5,
inmenu: true,
@@ -75,7 +75,7 @@ const routes_admin: IListRoutes[] = [
path: '/admin/cfgserv',
materialIcon: 'event_seat',
name: 'pages.Admin',
component: () => import('@src/views/admin/cfgServer/cfgServer.vue'),
component: () => import('@/views/admin/cfgServer/cfgServer.vue'),
level_parent: 0.0,
level_child: 0.5,
inmenu: true,
@@ -88,7 +88,7 @@ const routes_admin: IListRoutes[] = [
path: '/admin/dbop',
materialIcon: 'event_seat',
name: 'pages.dbop',
component: () => import('@src/views/admin/dbop/dbop.vue'),
component: () => import('@/views/admin/dbop/dbop.vue'),
level_parent: 0.0,
level_child: 0.5,
inmenu: true,
@@ -101,7 +101,7 @@ const routes_admin: IListRoutes[] = [
path: '/admin/importfile',
materialIcon: 'event_seat',
name: 'otherpages.manage.importfile',
component: () => import('@src/rootgen/admin/importdata/importdata.vue'),
component: () => import('@/rootgen/admin/importdata/importdata.vue'),
level_parent: 0.0,
level_child: 0.5,
inmenu: true,
@@ -117,7 +117,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/usereventlist',
materialIcon: 'edit',
name: 'otherpages.admin.usereventlist',
component: () => import('@src/rootgen/admin/eventlist/eventlist.vue'),
component: () => import('@/rootgen/admin/eventlist/eventlist.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -133,7 +133,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/userlist',
materialIcon: 'fas fa-users',
name: 'otherpages.admin.userlist',
component: () => import('@src/rootgen/admin/usersList/usersList.vue'),
component: () => import('@/rootgen/admin/usersList/usersList.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -148,7 +148,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/iscritticonacreis',
materialIcon: 'fas fa-users',
name: 'otherpages.admin.iscritticonacreis',
component: () => import('@src/rootgen/admin/iscritticonacreis/iscritticonacreis.vue'),
component: () => import('@/rootgen/admin/iscritticonacreis/iscritticonacreis.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -164,7 +164,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/zoomlist',
materialIcon: 'fas fa-users',
name: 'otherpages.admin.zoomlist',
component: () => import('@src/rootgen/admin/zoomList/zoomList.vue'),
component: () => import('@/rootgen/admin/zoomList/zoomList.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -178,7 +178,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/tableslist',
materialIcon: 'fas fa-users',
name: 'otherpages.admin.tableslist',
component: () => import('@src/rootgen/admin/tablesList/tablesList.vue'),
component: () => import('@/rootgen/admin/tablesList/tablesList.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -192,7 +192,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/pages',
materialIcon: 'fas fa-file-alt',
name: 'otherpages.admin.pages',
component: () => import('@src/rootgen/admin/pages/pages.vue'),
component: () => import('@/rootgen/admin/pages/pages.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -206,7 +206,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/bot',
materialIcon: 'fas fa-file-alt',
name: 'otherpages.admin.bot',
component: () => import('@src/rootgen/admin/bot/bot.vue'),
component: () => import('@/rootgen/admin/bot/bot.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -240,7 +240,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/msg_template',
materialIcon: 'fas fa-file-alt',
name: 'msgs.messages',
component: () => import('@src/rootgen/admin/msg_template/msg_template.vue'),
component: () => import('@/rootgen/admin/msg_template/msg_template.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -255,7 +255,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/sendpushnotif',
materialIcon: 'event_seat',
name: 'otherpages.manage.sendpushnotif',
component: () => import('@src/rootgen/admin/sendpushnotif/sendpushnotif.vue'),
component: () => import('@/rootgen/admin/sendpushnotif/sendpushnotif.vue'),
level_parent: 0.0,
level_child: 0.5,
inmenu: true,
@@ -269,7 +269,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/gallery',
materialIcon: 'fas fa-file-alt',
name: 'otherpages.admin.gallery',
component: () => import('@src/rootgen/admin/gallery/gallery.vue'),
component: () => import('@/rootgen/admin/gallery/gallery.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -283,7 +283,7 @@ const routes_manager: IListRoutes[] = [
path: '/admin/media',
materialIcon: 'fas fa-file-alt',
name: 'otherpages.admin.media',
component: () => import('@src/rootgen/admin/uploader/uploader.vue'),
component: () => import('@/rootgen/admin/uploader/uploader.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
@@ -301,7 +301,7 @@ const baseroutes: IListRoutes[] = [
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -312,7 +312,7 @@ const baseroutes: IListRoutes[] = [
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -323,7 +323,7 @@ const baseroutes: IListRoutes[] = [
path: '/goods',
materialIcon: 'fas fa-briefcase',
name: 'mypages.goods',
component: () => import('@src/root/goods/goods.vue'),
component: () => import('@/root/goods/goods.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -334,7 +334,7 @@ const baseroutes: IListRoutes[] = [
path: '/services',
materialIcon: 'fas fa-briefcase',
name: 'mypages.services',
component: () => import('@src/root/services/services.vue'),
component: () => import('@/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -345,7 +345,7 @@ const baseroutes: IListRoutes[] = [
path: '/presentazione',
materialIcon: 'fas fa-info',
name: 'pages.presentazione',
component: () => import('@src/root/presentazione/presentazione.vue'),
component: () => import('@/root/presentazione/presentazione.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -356,7 +356,7 @@ const baseroutes: IListRoutes[] = [
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -367,7 +367,7 @@ const baseroutes: IListRoutes[] = [
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@src/views/user/editprofile/editprofile.vue'),
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -378,7 +378,7 @@ const baseroutes: IListRoutes[] = [
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.friends',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -389,7 +389,7 @@ const baseroutes: IListRoutes[] = [
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -400,7 +400,7 @@ const baseroutes: IListRoutes[] = [
path: '/my/:username',
materialIcon: 'fas fa-user',
name: 'pages.profile2',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -411,7 +411,7 @@ const baseroutes: IListRoutes[] = [
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -422,7 +422,7 @@ const baseroutes: IListRoutes[] = [
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -433,7 +433,7 @@ const baseroutes: IListRoutes[] = [
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -444,7 +444,7 @@ const baseroutes: IListRoutes[] = [
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -484,7 +484,7 @@ const baseroutes: IListRoutes[] = [
path: '/404error',
materialIcon: 'fas fa-calendar-plus',
name: 'otherpages.error404',
component: () => import('@src/root/My404page/My404page.vue'),
component: () => import('@/root/My404page/My404page.vue'),
inmenu: false,
infooter: false
},
@@ -494,7 +494,7 @@ const baseroutes: IListRoutes[] = [
order: 8,
path: '/policy',
name: 'pages.policy',
component: () => import('@src/root/policy/policy.vue'),
component: () => import('@/root/policy/policy.vue'),
},*/
{
active: functionality.ENABLE_REGISTRATION,
@@ -502,7 +502,7 @@ const baseroutes: IListRoutes[] = [
path: '/signup/:invited',
materialIcon: 'how_to_reg',
name: 'pages.SignUp',
component: () => import('@src/views/login/signup/signup.vue'),
component: () => import('@/views/login/signup/signup.vue'),
inmenu: false,
infooter: false,
separator: false
@@ -513,7 +513,7 @@ const baseroutes: IListRoutes[] = [
path: '/regok',
materialIcon: 'how_to_reg',
name: 'pages.regok',
component: () => import('@src/views/login/regok/regok.vue'),
component: () => import('@/views/login/regok/regok.vue'),
inmenu: false,
infooter: false,
separator: false,
@@ -524,7 +524,7 @@ const baseroutes: IListRoutes[] = [
path: '/signin',
materialIcon: 'account_circle',
name: 'pages.SignIn',
component: () => import('@src/views/login/signin_noreg/signin_noreg.vue'),
component: () => import('@/views/login/signin_noreg/signin_noreg.vue'),
inmenu: true,
infooter: true
},
@@ -533,28 +533,28 @@ const baseroutes: IListRoutes[] = [
order: 1000,
path: '/vreg',
name: 'pages.vreg',
component: () => import('@src/views/login/vreg/vreg.vue')
component: () => import('@/views/login/vreg/vreg.vue')
},
{
active: true,
order: 1000,
path: '/requestresetpwd',
name: 'pages.requestresetpwd',
component: () => import('@src/views/requestresetpwd/requestresetpwd.vue')
component: () => import('@/views/requestresetpwd/requestresetpwd.vue')
},
{
active: true,
order: 1000,
path: '/updatepassword',
name: 'pages.updatepassword',
component: () => import('@src/views/updatepassword/updatepassword.vue')
component: () => import('@/views/updatepassword/updatepassword.vue')
},
{
active: true,
order: 1000,
path: '/offline',
name: 'Offline',
component: () => import('@src/views/offline/offline.vue')
component: () => import('@/views/offline/offline.vue')
},
{
active: true,
@@ -570,7 +570,7 @@ const baseroutes: IListRoutes[] = [
path: '/calendario-eventi',
materialIcon: 'event',
name: 'pages.calendarioeventi',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: true,
infooter: true
@@ -581,7 +581,7 @@ const baseroutes: IListRoutes[] = [
path: '/admin/newsletter/:idparam',
materialIcon: 'event',
name: 'pages.newsletter.menu',
component: () => import('@src/rootgen/admin/newsletter/newsletter.vue'),
component: () => import('@/rootgen/admin/newsletter/newsletter.vue'),
inmenu: false,
infooter: false
},
@@ -591,7 +591,7 @@ const baseroutes: IListRoutes[] = [
path: '/event/:typol/:eventid',
materialIcon: 'event',
name: 'pages.evento',
component: () => import('@src/root/evento/evento.vue'),
component: () => import('@/root/evento/evento.vue'),
inmenu: false,
infooter: false
},
@@ -601,7 +601,7 @@ const baseroutes: IListRoutes[] = [
path: '/event/:typol',
materialIcon: 'event',
name: 'pages.eventodef',
component: () => import('@src/root/evento/evento.vue'),
component: () => import('@/root/evento/evento.vue'),
inmenu: false,
infooter: false
},

View File

@@ -1,6 +1,6 @@
{
"name": "freeplanet",
"version": "1.2.85",
"version": "1.2.87",
"description": "freeplanet",
"productName": "freeplanet",
"author": "Surya",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8087 APP_VERSION='1.2.85' quasar dev",
"dev": "PORT=8087 APP_VERSION='1.2.87' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"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=8097 APP_VERSION='1.2.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8087 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8097 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8087 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -1,6 +1,6 @@
{
"name": "riso",
"version": "1.2.85",
"version": "1.2.87",
"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",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "APP_VERSION='1.2.85' PORT=8084 quasar dev",
"dev": "APP_VERSION='1.2.87' PORT=8084 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"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=8094 APP_VERSION='1.2.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -38,7 +38,7 @@ const firstPage = {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -53,7 +53,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -64,7 +64,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
@@ -74,7 +74,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/goods',
materialIcon: 'fas fa-tshirt',
name: 'mypages.goods',
component: () => import('@src/root/goods/goods.vue'),
component: () => import('@/root/goods/goods.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -85,7 +85,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/services',
materialIcon: 'fas fa-house-user',
name: 'mypages.services',
component: () => import('@src/root/services/services.vue'),
component: () => import('@/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -96,7 +96,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/activities',
materialIcon: 'fas fa-house-user',
name: 'mypages.activities',
component: () => import('@src/root/activities/activities.vue'),
component: () => import('@/root/activities/activities.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -107,7 +107,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@src/root/provapao/provapao.vue'),
component: () => import('@/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -118,7 +118,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/hosps',
materialIcon: 'fas fa-bed',
name: 'mypages.hosp',
component: () => import('@src/root/hosp/hosp.vue'),
component: () => import('@/root/hosp/hosp.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -129,7 +129,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -140,7 +140,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -151,7 +151,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@src/views/admin/install_site/install_site.vue'),
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -162,7 +162,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -184,7 +184,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -195,7 +195,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
@@ -206,7 +206,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -217,7 +217,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@src/views/user/mycircuit/mycircuit.vue'),
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -236,7 +236,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -247,7 +247,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -258,7 +258,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@src/views/user/mypagehosp/mypagehosp.vue'),
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -269,7 +269,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@src/views/user/mypagegood/mypagegood.vue'),
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -280,7 +280,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/sostieniilprogetto',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
component: () => import('@/root/fundraising/fundraising.vue'),
inmenu: false,
infooter: false,
},
@@ -290,7 +290,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false

View File

@@ -1,6 +1,6 @@
{
"name": "gruppomacro",
"version": "1.2.85",
"version": "1.2.87",
"productName": "Gruppo Macro",
"description": "Il Gruppo Editoriale Macro, attivo dal 1987, è leader europeo nella pubblicazione di libri per il benessere e la consapevolezza. Con oltre 1.500 titoli, promuove una visione armonica del mondo, offrendo opere di autori internazionali e italiani come Gregg Braden, Bruce Lipton, Joe Dispenza, Louise Hay, Eckhart Tolle e molti altri. Scopri un'editoria che abbraccia il corpo, la mente, lo spirito e l'ecologia.",
"author": "Surya",
@@ -9,20 +9,20 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8089 APP_VERSION='1.2.85' quasar dev",
"dev": "PORT=8089 APP_VERSION='1.2.87' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.85' quasar build -m spa",
"buildspa": "APP_VERSION='1.2.87' 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.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8089 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -38,7 +38,7 @@ const firstPage = {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -54,7 +54,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -65,7 +65,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
@@ -75,7 +75,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test-lungo',
materialIcon: 'fas fa-test',
name: 'mypages.test_lungo',
component: () => import('@src/views/testLungo/testLungo.vue'),
component: () => import('@/views/testLungo/testLungo.vue'),
inmenu: false,
infooter: false,
},
@@ -85,7 +85,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@src/root/provapao/provapao.vue'),
component: () => import('@/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -96,7 +96,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -107,7 +107,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -118,7 +118,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@src/views/admin/install_site/install_site.vue'),
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -129,7 +129,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -140,7 +140,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -151,7 +151,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
@@ -162,7 +162,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -173,7 +173,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@src/views/user/mycircuit/mycircuit.vue'),
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -192,7 +192,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -203,7 +203,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -214,7 +214,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@src/views/user/mypagehosp/mypagehosp.vue'),
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -225,7 +225,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@src/views/user/mypagegood/mypagegood.vue'),
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -236,7 +236,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false

View File

@@ -1,6 +1,6 @@
{
"name": "nuovomondo",
"version": "1.2.85",
"version": "1.2.87",
"description": "Nuovo Mondo",
"productName": "Nuovo Mondo",
"author": "Surya",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "APP_VERSION='1.2.85' PORT=8083 quasar dev",
"dev": "APP_VERSION='1.2.87' PORT=8083 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"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=8094 APP_VERSION='1.2.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8083 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -14,7 +14,7 @@ const firstPage = {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -29,7 +29,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -40,7 +40,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -52,7 +52,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -63,7 +63,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -74,7 +74,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@src/views/admin/install_site/install_site.vue'),
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -85,7 +85,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@src/views/user/editprofile/editprofile.vue'),
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -96,7 +96,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -107,7 +107,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -120,7 +120,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
@@ -133,7 +133,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -144,7 +144,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@src/views/user/mycircuit/mycircuit.vue'),
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -163,7 +163,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -174,7 +174,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -185,7 +185,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@src/views/user/mypagehosp/mypagehosp.vue'),
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -196,7 +196,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@src/views/user/mypagegood/mypagegood.vue'),
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -207,7 +207,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/fundraising',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
component: () => import('@/root/fundraising/fundraising.vue'),
inmenu: false,
infooter: false,
},
@@ -217,7 +217,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false

View File

@@ -1,6 +1,6 @@
{
"name": "nutriben",
"version": "1.2.85",
"version": "1.2.87",
"description": "Nutriben",
"productName": "Nutriben",
"author": "Surya",
@@ -9,20 +9,20 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8093 APP_VERSION='1.2.85' quasar dev",
"dev": "PORT=8093 APP_VERSION='1.2.87' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "APP_VERSION='1.2.85' quasar build -m spa",
"buildspa": "APP_VERSION='1.2.87' 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.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8099 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8093 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -38,7 +38,7 @@ const firstPage = {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/nutriben/home/home.vue'),
component: () => import('@/root/nutriben/home/home.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -54,7 +54,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -65,7 +65,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
@@ -75,7 +75,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@src/root/provapao/provapao.vue'),
component: () => import('@/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -86,7 +86,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -97,7 +97,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -108,7 +108,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@src/views/admin/install_site/install_site.vue'),
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -119,7 +119,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -130,7 +130,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@src/views/user/editprofile/editprofile.vue'),
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -141,7 +141,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -152,7 +152,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
@@ -163,7 +163,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -174,7 +174,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@src/views/user/mycircuit/mycircuit.vue'),
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -193,7 +193,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -204,7 +204,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -215,7 +215,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@src/views/user/mypagehosp/mypagehosp.vue'),
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -226,7 +226,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@src/views/user/mypagegood/mypagegood.vue'),
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -237,7 +237,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false

View File

@@ -1,6 +1,6 @@
{
"name": "piuchebuono",
"version": "1.2.85",
"version": "1.2.87",
"description": "PiuCheBuono",
"productName": "PiuCheBuono",
"author": "Surya",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "PORT=8085 APP_VERSION='1.2.85' quasar dev",
"dev": "PORT=8085 APP_VERSION='1.2.87' quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"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=8085 APP_VERSION='1.2.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8085 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8085 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8085 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -14,7 +14,7 @@ const firstPage = {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -29,7 +29,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -40,7 +40,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -52,7 +52,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -63,7 +63,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -74,7 +74,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@src/views/admin/install_site/install_site.vue'),
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -85,7 +85,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@src/views/user/editprofile/editprofile.vue'),
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -96,7 +96,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -107,7 +107,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -120,7 +120,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
@@ -133,7 +133,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -144,7 +144,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@src/views/user/mycircuit/mycircuit.vue'),
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -163,7 +163,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -174,7 +174,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -185,7 +185,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@src/views/user/mypagehosp/mypagehosp.vue'),
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -196,7 +196,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@src/views/user/mypagegood/mypagegood.vue'),
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -207,7 +207,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/fundraising',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
component: () => import('@/root/fundraising/fundraising.vue'),
inmenu: false,
infooter: false,
},
@@ -217,7 +217,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false

View File

@@ -1,6 +1,6 @@
{
"name": "riso",
"version": "1.2.85",
"version": "1.2.87",
"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",
@@ -9,11 +9,11 @@
"license": "MIT",
"type": "module",
"scripts": {
"dev": "APP_VERSION='1.2.85' PORT=8084 quasar dev",
"dev": "APP_VERSION='1.2.87' PORT=8084 quasar dev",
"dev_noCheck": "SKIP_TSC=true quasar dev",
"build": "quasar build",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.85' quasar build -m pwa",
"buildpwa": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"buildpwatest": "NODE_ENV=production APP_VERSION='1.2.87' quasar build -m pwa",
"type-check": "vue-tsc --noEmit",
"type-check:watch": "vue-tsc --noEmit --watch",
"buildspa": "quasar build -m spa",
@@ -21,8 +21,8 @@
"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=8094 APP_VERSION='1.2.85' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.85' quasar dev",
"pwa": "NODE_ENV=development PORT=8094 APP_VERSION='1.2.87' quasar dev -m pwa",
"spa": "NODE_ENV=development PORT=8084 APP_VERSION='1.2.87' quasar dev",
"debug": "quasar dev --mode debug",
"test": "echo \"No test specified\" && exit 0",
"generate-sw": "workbox generateSW workbox-config.js",

View File

@@ -38,7 +38,7 @@ const firstPage = {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -53,7 +53,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/mainview/mainview.vue'),
component: () => import('@/root/mainview/mainview.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -64,7 +64,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@src/views/testServer/testServer.vue'),
component: () => import('@/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
@@ -74,7 +74,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/goods',
materialIcon: 'fas fa-tshirt',
name: 'mypages.goods',
component: () => import('@src/root/goods/goods.vue'),
component: () => import('@/root/goods/goods.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -85,7 +85,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/services',
materialIcon: 'fas fa-house-user',
name: 'mypages.services',
component: () => import('@src/root/services/services.vue'),
component: () => import('@/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -96,7 +96,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/activities',
materialIcon: 'fas fa-house-user',
name: 'mypages.activities',
component: () => import('@src/root/activities/activities.vue'),
component: () => import('@/root/activities/activities.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -107,7 +107,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@src/root/provapao/provapao.vue'),
component: () => import('@/root/provapao/provapao.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -118,7 +118,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/hosps',
materialIcon: 'fas fa-bed',
name: 'mypages.hosp',
component: () => import('@src/root/hosp/hosp.vue'),
component: () => import('@/root/hosp/hosp.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -129,7 +129,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuits',
materialIcon: 'fas fa-coins',
name: 'mypages.circuits',
component: () => import('@src/views/user/mycircuits/mycircuits.vue'),
component: () => import('@/views/user/mycircuits/mycircuits.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -140,7 +140,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@src/root/eventi/eventi.vue'),
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -151,7 +151,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@src/views/admin/install_site/install_site.vue'),
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
@@ -162,7 +162,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@src/views/user/myprofile/myprofile.vue'),
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -184,7 +184,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@src/views/user/myfriends/myfriends.vue'),
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -195,7 +195,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@src/views/user/mygroups/mygroups.vue'),
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
@@ -206,7 +206,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@src/views/user/mygroup/mygroup.vue'),
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -217,7 +217,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/circuit/:path',
materialIcon: 'fas fa-user',
name: 'proj.circuit2',
component: () => import('@src/views/user/mycircuit/mycircuit.vue'),
component: () => import('@/views/user/mycircuit/mycircuit.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -236,7 +236,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mypage/:idBacheca',
materialIcon: 'fas fa-user',
name: 'pages.mypage2',
component: () => import('@src/views/user/mypagebacheca/mypagebacheca.vue'),
component: () => import('@/views/user/mypagebacheca/mypagebacheca.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -247,7 +247,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myservice/:idSkill',
materialIcon: '',
name: 'pages.myservice2',
component: () => import('@src/views/user/myservice/myservice.vue'),
component: () => import('@/views/user/myservice/myservice.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -258,7 +258,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/myhosps/:idHosp',
materialIcon: '',
name: 'pages.myhosps2',
component: () => import('@src/views/user/mypagehosp/mypagehosp.vue'),
component: () => import('@/views/user/mypagehosp/mypagehosp.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -269,7 +269,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/mygood/:idGood',
materialIcon: '',
name: 'pages.mygood2',
component: () => import('@src/views/user/mypagegood/mypagegood.vue'),
component: () => import('@/views/user/mypagegood/mypagegood.vue'),
meta: { requiresAuth: true, newpage: true },
inmenu: false,
infooter: false,
@@ -280,7 +280,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/sostieniilprogetto',
materialIcon: 'fas fa-hand-holding-heart',
name: 'pages.fundraising',
component: () => import('@src/root/fundraising/fundraising.vue'),
component: () => import('@/root/fundraising/fundraising.vue'),
inmenu: false,
infooter: false,
},
@@ -290,7 +290,7 @@ function getDynamicPages(site: ISites): IListRoutes[] {
path: '/calendario-eventi',
materialIcon: 'event',
name: 'ris.calendario_eventi_riso',
component: () => import('@src/root/calendarioeventi/calendarioeventi.vue'),
component: () => import('@/root/calendarioeventi/calendarioeventi.vue'),
extraclass: 'isCalendar',
inmenu: false,
infooter: false

View File

@@ -3,7 +3,7 @@
/* global workbox */
/* global cfgenv */
const VITE_APP_VERSION = '1.2.85';
const VITE_APP_VERSION = '1.2.87';
// Costanti di configurazione
const DYNAMIC_CACHE = 'dynamic-cache-v2';
@@ -117,8 +117,62 @@ self.addEventListener('activate', (event) => {
);
})
);
self.clients.claim(); // SERVE? OPPURE NO ?
});
const USASYNC = false;
// PER ATTIVARE IL SYNC TOGLI L'AREA COMMENTATA DI 'FETCH' QUI SOTTO ....
/*
// Strategia fetch
self.addEventListener('fetch', (event) => {
const { request } = event;
const url = new URL(request.url);
// ============================================
// IMPORTANTE: NON cachare API /sync o /loadsite
// ============================================
if (url.pathname.includes('/api/') ||
url.pathname.includes('/sync') ||
url.pathname.includes('/loadsite')) {
// Lascia passare normalmente - IndexedDB gestisce cache
return;
}
// ============================================
// Cache Strategy per assets statici
// ============================================
if (request.method === 'GET') {
event.respondWith(
caches.match(request).then((cachedResponse) => {
if (cachedResponse) {
return cachedResponse;
}
return fetch(request).then((response) => {
// Non cachare se non è successo
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
// Clona e salva in cache
const responseToCache = response.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(request, responseToCache);
});
return response;
}).catch(() => {
// Offline fallback
if (request.destination === 'document') {
return caches.match('/offline.html');
}
});
})
);
}
});
*/
console.log(
' [ VER-' +
VITE_APP_VERSION +

View File

@@ -1,15 +1,15 @@
import { useRoute, useRouter } from 'vue-router';
import { useQuasar } from 'quasar';
import { BannerCookies } from '@src/components/BannerCookies';
import { BannerCookies } from '@/components/BannerCookies';
import { useI18n } from 'vue-i18n';
import { useGlobalStore } from '@store/globalStore';
import { useUserStore } from '@store/UserStore';
import { MyHeader } from '@src/components/MyHeader';
import { MyFooter } from '@src/components/MyFooter';
import { CCheckUpdatesPWA } from '@src/components/CCheckUpdatesPWA';
import { CFirstPageApp } from '@src/components/CFirstPageApp';
import { MyHeader } from '@/components/MyHeader';
import { MyFooter } from '@/components/MyFooter';
import { CCheckUpdatesPWA } from '@/components/CCheckUpdatesPWA';
import { CFirstPageApp } from '@/components/CFirstPageApp';
import { computed, onMounted, ref, watch } from 'vue';
import { CProvaPao } from '@src/components/CProvaPao';
import { CProvaPao } from '@/components/CProvaPao';
import { tools } from '@tools';
import { toolsext } from '@store/Modules/toolsext';

View File

@@ -1,15 +1,15 @@
// import something here
// import { isEqual } from 'lodash'
// import { ProgressBar } from '@src/store/Modules/Interface'
// import { ProgressBar } from '@/store/Modules/Interface'
// import { UserStore } from "@store"
// @ts-ignore
import { boot } from 'quasar/wrappers'
import { useGlobalStore } from '@src/store/globalStore';
import { useUserStore } from '@src/store/UserStore';
import { tools } from '@src/store/Modules/tools';
import { useGlobalStore } from '@/store/globalStore';
import { useUserStore } from '@/store/UserStore';
import { tools } from '@/store/Modules/tools';
export default boot(({ app, router }) => {
// ******************************************
@@ -35,7 +35,7 @@ export default boot(({ app, router }) => {
globalStore.editOn = tools.getCookie('edn_' + pageKey, '0') === '1'
}
} catch(e) {
}
next()
@@ -53,10 +53,10 @@ export default boot(({ app, router }) => {
//} else {
// next()
//}
// Continue with the navigation
});
/* router.beforeEach((to, from, next) => {

View File

@@ -5,7 +5,7 @@ import axios, {
} from 'axios'
// import { default as VueRouter } from 'vue-router'
import { serv_constants } from '@src/store/Modules/serv_constants'
import { serv_constants } from '@/store/Modules/serv_constants'
// import { TokenHelper } from "./token-helper";
let initialized = false

View File

@@ -5,7 +5,7 @@ import axios, {
} from 'axios'
// import { default as VueRouter } from 'vue-router'
import { serv_constants } from '@src/store/Modules/serv_constants'
import { serv_constants } from '@/store/Modules/serv_constants'
// import { TokenHelper } from "./token-helper";
let initialized = false

View File

@@ -147,7 +147,6 @@ export const shared_consts = {
DASHBOARD: 140,
DASHGROUP: 145,
MOVEMENTS: 148,
CSENDRISTO: 150,
STATUSREG: 160,
CHECKIFISLOGGED: 170,
INFO_VERSION: 180,
@@ -190,6 +189,11 @@ export const shared_consts = {
PAGE_SECTION: 1500,
PROFILE_COMPLETITION: 1510,
RISOHOME: 1600,
RISOHOME_MODERN: 1610,
RISOHOME_PAGFINALE: 1615,
PAGERIS: 1620,
CMYCIRCUITS: 1630,
CREA_VOLANTINO: 1700,
},
QUERYTYPE_MYGROUP: 1,
@@ -321,6 +325,8 @@ export const shared_consts = {
'sectors',
'goods',
'sectorgoods',
'bachecas',
'sectorbachecas',
'catgrps',
'skills',
'subskills',
@@ -440,6 +446,7 @@ export const shared_consts = {
TABLES_REC_ID: [
'skills',
'goods',
'bachecas',
'subskills',
'myskills',
'mybachecas',
@@ -788,98 +795,266 @@ export const shared_consts = {
{
value: 2,
label: 'Si accettano cani',
icon: 'pets',
color: '#795548', // brown
},
{
value: 3,
label: 'Si accettano gatti',
icon: 'pets',
color: '#FF9800', // orange
},
{
value: 4,
label: "E' consentito fumare in casa",
icon: 'smoking_rooms',
color: '#9E9E9E', // grey
},
{
value: 5,
label: 'Accessibile con sedia a rotelle',
icon: 'accessible',
color: '#2196F3', // blue
},
{
value: 6,
label: 'Parcheggio gratuito nella proprietà',
icon: 'local_parking',
color: '#3F51B5', // indigo
},
{
value: 7,
label: 'Wi-fi disponibile',
icon: 'wifi',
color: '#00BCD4', // cyan
},
{
value: 8,
label: 'Sono permessi soggiorni a lungo termine',
icon: 'calendar_month',
color: '#009688', // teal
},
{
value: 9,
label: 'Cucina Vegetariana',
icon: 'restaurant',
color: '#4CAF50', // green
},
{
value: 10,
label: 'Cucina Vegana',
icon: 'spa',
color: '#8BC34A', // light-green
},
{
value: 11,
label: 'Uso della Cucina',
icon: 'kitchen',
color: '#FFC107', // amber
},
{
value: 12,
label: 'Uso della Lavatrice',
icon: 'local_laundry_service',
color: '#607D8B', // blue-grey
},
{
value: 13,
label: 'Aria condizionata',
icon: 'ac_unit',
color: '#03A9F4', // light-blue
},
{
value: 14,
label: 'Ventilatore',
icon: 'air',
color: '#00BCD4', // cyan
},
{
value: 15,
label: "Doccia all'aperto",
icon: 'shower',
color: '#2196F3', // blue
},
{
value: 16,
label: 'TV',
icon: 'tv',
color: '#673AB7', // deep-purple
},
{
value: 17,
label: 'Eventi consentiti',
icon: 'celebration',
color: '#E91E63', // pink
},
{
value: 18,
label: 'Adatto a bambini da 2 a 12 anni',
icon: 'child_care',
color: '#F9A825'
},
{
value: 19,
label: 'Adatto ai neonati (fino ai 2 anni)',
icon: 'baby_changing_station',
color: '#F8BBD0', // pink-light
},
{
value: 20,
label: 'Biancheria inclusa',
icon: 'bed',
color: '#9C27B0', // purple
},
{
value: 21,
label: 'Biancheria su richiesta (a parte)',
icon: 'bedroom_parent',
color: '#673AB7', // deep-purple
},
{
value: 22,
label: 'Asciugamani',
icon: 'dry_cleaning',
color: '#009688', // teal
},
{
value: 23,
label: 'Asciugacapelli',
icon: 'iron',
color: '#F44336', // red
},
{
value: 24,
label: 'Riscaldamento a legna',
icon: 'fireplace',
color: '#FF5722', // deep-orange
},
{
value: 25,
label: 'Riscaldamento a gas',
icon: 'heat_pump',
color: '#FF9800', // orange
},
{
value: 26,
label: 'Colazione inclusa',
icon: 'free_breakfast',
color: '#FFC107', // amber
},
{
value: 27,
label: 'Giardino/Spazio esterno',
icon: 'yard',
color: '#4CAF50', // green
},
{
value: 28,
label: 'Terrazzo/Balcone',
icon: 'balcony',
color: '#CDDC39', // lime
},
{
value: 29,
label: 'Silenzioso/Zona tranquilla',
icon: 'volume_off',
color: '#607D8B', // blue-grey
},
{
value: 30,
label: 'Vicino a mezzi pubblici',
icon: 'directions_bus',
color: '#3F51B5', // indigo
},
{
value: 31,
label: 'Biciclette disponibili',
icon: 'directions_bike',
color: '#009688', // teal
},
{
value: 32,
label: 'Camino',
icon: 'fireplace',
color: '#795548', // brown
},
{
value: 33,
label: 'Barbecue',
icon: 'outdoor_grill',
color: '#F44336', // red
},
{
value: 34,
label: 'Piscina',
icon: 'pool',
color: '#03A9F4', // light-blue
},
{
value: 35,
label: 'Sauna',
icon: 'hot_tub',
color: '#FF5722', // deep-orange
},
{
value: 36,
label: 'Vista panoramica',
icon: 'landscape',
color: '#9C27B0', // purple
},
{
value: 37,
label: 'In campagna',
icon: 'nature',
color: '#4CAF50', // green
},
{
value: 38,
label: 'In montagna',
icon: 'terrain',
color: '#795548', // brown
},
{
value: 39,
label: 'Vicino al mare',
icon: 'beach_access',
color: '#2196F3', // blue
},
{
value: 40,
label: 'Animali da fattoria',
icon: 'agriculture',
color: '#795548', // brown
},
{
value: 41,
label: 'Orto/Permacultura',
icon: 'eco',
color: '#4CAF50', // green
},
{
value: 42,
label: 'Prodotti biologici/km zero',
icon: 'local_florist',
color: '#8BC34A', // light-green
},
{
value: 43,
label: 'Scambio lavoro/volontariato',
icon: 'handshake',
color: '#FF9800', // orange
},
{
value: 44,
label: 'Comunità/Ecovillaggio',
icon: 'groups',
color: '#9C27B0', // purple
},
{
value: 45,
label: 'Energie rinnovabili',
icon: 'solar_power',
color: '#FFEB3B', // yellow
},
],
@@ -1835,11 +2010,6 @@ export const shared_consts = {
label: 'Lista Movimenti',
icon: 'fas fa-list',
},
{
value: 150,
label: 'SendCoinTo',
icon: 'fas fa-wallet',
},
{
value: 280,
label: 'Tutorial',
@@ -1883,6 +2053,11 @@ export const shared_consts = {
label: 'Check Email',
icon: 'fas fa-envelope',
},
{
value: 1700, // CREA_VOLANTINO
label: 'Genera Volantini',
icon: 'fas fa-user-tie',
},
{
value: 120,
label: 'OpenStreetMap',
@@ -1943,6 +2118,26 @@ export const shared_consts = {
label: 'HomePage RISO',
icon: 'fas fa-home',
},
{
value: 1610, // RISOHOME_MODERN
label: 'RISO Home Modern',
icon: 'fas fa-home',
},
{
value: 1615, // RISOHOME_PAGFINALE
label: 'RISO Home (Parte Finale))',
icon: 'fas fa-home',
},
{
value: 1620, // PAGERIS
label: 'Pagina RIS',
icon: 'fas fa-home',
},
{
value: 1630, // CMYCIRCUITS
label: 'CMyCircuits (Old Page)',
icon: 'fas fa-home',
},
{
value: 258,
label: 'Registration',
@@ -2292,6 +2487,7 @@ export const shared_consts = {
link_group: 1,
totCircolante: 1,
totTransato: 1,
numTransazioni: 1,
systemUserId: 1,
createdBy: 1,
date_created: 1,
@@ -2388,9 +2584,9 @@ export const shared_consts = {
} else if (table === this.TABLES_MYBACHECAS) {
proj = {
recSkill: 1,
sector: 1,
idSector: 1,
idSkill: 1,
sectorBacheca: 1,
idSectorBacheca: 1,
idBacheca: 1,
// 'idSubSkill': 1,
idStatusSkill: 1,
idContribType: 1,
@@ -2672,5 +2868,5 @@ export const shared_consts = {
FILETYPE: {
IMG: 1,
PDF: 2,
}
},
};

View File

@@ -0,0 +1,749 @@
<template>
<q-card class="ai-generator-dialog">
<!-- Header -->
<q-card-section class="dialog-header">
<div class="header-content">
<q-icon name="auto_awesome" size="32px" color="amber" />
<div>
<h2>Genera Immagine con AI</h2>
<p>{{ assetTypeLabel }}</p>
</div>
</div>
<q-btn flat round icon="close" @click="$emit('close')" />
</q-card-section>
<q-separator />
<!-- Content -->
<q-card-section class="dialog-body">
<div class="generator-layout">
<!-- Left: Form -->
<div class="form-panel">
<!-- Provider Selection -->
<div class="form-section">
<label class="section-label">Provider AI</label>
<div class="provider-options">
<div
v-for="provider in providers"
:key="provider.value"
class="provider-option"
:class="{ 'is-selected': selectedProvider === provider.value }"
@click="selectedProvider = provider.value"
>
<q-icon :name="provider.icon" size="24px" />
<div class="provider-info">
<span class="provider-name">{{ provider.label }}</span>
<q-badge
v-if="provider.free"
color="green"
text-color="white"
label="Gratis"
/>
</div>
</div>
</div>
</div>
<!-- Prompt -->
<div class="form-section">
<label class="section-label">
Descrivi l'immagine
<q-btn
flat
dense
size="sm"
icon="help_outline"
@click="showPromptTips = true"
>
<q-tooltip>Suggerimenti per prompt efficaci</q-tooltip>
</q-btn>
</label>
<q-input
v-model="prompt"
filled
type="textarea"
rows="4"
placeholder="Descrivi l'immagine che vuoi generare..."
counter
maxlength="1000"
/>
<!-- Quick prompts -->
<div class="quick-prompts">
<span class="quick-label">Suggerimenti rapidi:</span>
<q-chip
v-for="(suggestion, idx) in promptSuggestions"
:key="idx"
clickable
size="sm"
@click="appendToPrompt(suggestion)"
>
{{ suggestion }}
</q-chip>
</div>
</div>
<!-- Negative Prompt -->
<div class="form-section">
<label class="section-label">
Prompt Negativo
<span class="optional">(opzionale)</span>
</label>
<q-input
v-model="negativePrompt"
filled
type="textarea"
rows="2"
placeholder="Cosa NON vuoi vedere nell'immagine..."
/>
<div class="negative-presets">
<q-btn
flat
dense
size="sm"
label="Usa preset standard"
@click="useStandardNegative"
/>
</div>
</div>
<!-- Aspect Ratio -->
<div class="form-section">
<label class="section-label">Formato</label>
<q-btn-toggle
v-model="aspectRatio"
:options="aspectRatioOptions"
spread
no-caps
toggle-color="primary"
class="full-width"
/>
</div>
<!-- Advanced Options -->
<q-expansion-item
icon="tune"
label="Opzioni Avanzate"
header-class="advanced-header"
>
<div class="advanced-options">
<div class="options-row">
<q-input
v-model.number="seed"
type="number"
filled
dense
label="Seed"
hint="Lascia vuoto per casuale"
/>
<q-input
v-model.number="steps"
type="number"
filled
dense
label="Steps"
:min="10"
:max="50"
/>
<q-input
v-model.number="cfg"
type="number"
filled
dense
label="CFG Scale"
:min="1"
:max="20"
step="0.5"
/>
</div>
</div>
</q-expansion-item>
<!-- Generate Button -->
<div class="generate-actions">
<q-btn
color="primary"
icon="auto_awesome"
label="Genera Immagine"
size="lg"
:loading="isGenerating"
:disable="!prompt.trim()"
class="full-width"
@click="generateImage"
/>
</div>
</div>
<!-- Right: Preview -->
<div class="preview-panel">
<div class="preview-container" :class="{ 'has-image': !!generatedImage }">
<template v-if="isGenerating">
<div class="generating-state">
<q-spinner-orbit size="80px" color="primary" />
<p>Generazione in corso...</p>
<span class="time-estimate">Tempo stimato: ~15-30 secondi</span>
</div>
</template>
<template v-else-if="generatedImage">
<img :src="generatedImage" alt="Generated image" class="preview-image" />
<div class="preview-actions">
<q-btn
round
color="white"
text-color="primary"
icon="refresh"
@click="generateImage"
>
<q-tooltip>Rigenera</q-tooltip>
</q-btn>
<q-btn
round
color="green"
icon="check"
@click="confirmImage"
>
<q-tooltip>Usa questa immagine</q-tooltip>
</q-btn>
</div>
</template>
<template v-else>
<div class="empty-preview">
<q-icon name="image" size="80px" color="grey-4" />
<p>L'immagine generata apparirà qui</p>
</div>
</template>
</div>
<!-- Generation History -->
<div v-if="history.length > 0" class="generation-history">
<h4>Generazioni recenti</h4>
<div class="history-grid">
<div
v-for="(item, idx) in history"
:key="idx"
class="history-item"
@click="selectFromHistory(item)"
>
<img :src="item.url" :alt="`Generation ${idx + 1}`" />
</div>
</div>
</div>
</div>
</div>
</q-card-section>
<!-- Prompt Tips Dialog -->
<q-dialog v-model="showPromptTips">
<q-card style="max-width: 500px">
<q-card-section>
<div class="text-h6">💡 Suggerimenti per Prompt Efficaci</div>
</q-card-section>
<q-card-section>
<ul class="tips-list">
<li><strong>Sii specifico:</strong> Descrivi dettagli come colori, stile, atmosfera</li>
<li><strong>Indica lo stile:</strong> "fotorealistico", "illustrazione", "acquerello"</li>
<li><strong>Specifica la qualità:</strong> "high quality", "4k", "detailed"</li>
<li><strong>Evita il testo:</strong> Aggiungi sempre "no text, no letters"</li>
<li><strong>Composizione:</strong> Indica "central composition", "clean layout"</li>
</ul>
<div class="example-prompt q-mt-md">
<strong>Esempio:</strong>
<p class="q-mt-sm">"Mystical autumn forest at golden hour, morning mist between oak trees, photorealistic, cinematic lighting, warm colors, high quality, no text, no letters"</p>
</div>
</q-card-section>
<q-card-actions align="right">
<q-btn flat label="Capito!" color="primary" v-close-popup />
</q-card-actions>
</q-card>
</q-dialog>
</q-card>
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import { useQuasar } from 'quasar';
import { Api } from 'src/store/Api';
import { PROVIDER_OPTIONS, ASPECT_RATIO_OPTIONS } from '../../types/poster.types';
const props = defineProps<{
assetType: 'backgroundImage' | 'mainImage';
template: any;
initialPrompt?: string;
}>();
const emit = defineEmits<{
(e: 'generated', result: { url: string; aiParams: any }): void;
(e: 'close'): void;
}>();
const $q = useQuasar();
// State
const selectedProvider = ref('hf');
const prompt = ref('');
const negativePrompt = ref('');
const aspectRatio = ref('9:16');
const seed = ref<number | null>(null);
const steps = ref(28);
const cfg = ref(7.5);
const isGenerating = ref(false);
const generatedImage = ref<string | null>(null);
const history = ref<{ url: string; prompt: string }[]>([]);
const showPromptTips = ref(false);
// Computed
const assetTypeLabel = computed(() => {
return props.assetType === 'backgroundImage' ? 'Immagine di sfondo' : 'Immagine principale';
});
const providers = computed(() => PROVIDER_OPTIONS);
const aspectRatioOptions = computed(() =>
ASPECT_RATIO_OPTIONS.map(opt => ({
label: opt.label,
value: opt.value
}))
);
const promptSuggestions = computed(() => {
const suggestions = [
'high quality, 4k',
'cinematic lighting',
'no text, no letters',
'photorealistic',
'warm colors',
'dramatic atmosphere'
];
// Add template-specific suggestions
if (props.template?.defaultAiPromptHints?.[props.assetType]) {
const hint = props.template.defaultAiPromptHints[props.assetType];
const words = hint.split(',').slice(0, 3).map((w: string) => w.trim());
return [...words, ...suggestions.slice(0, 3)];
}
return suggestions;
});
// Methods
const appendToPrompt = (text: string) => {
if (prompt.value) {
prompt.value += ', ' + text;
} else {
prompt.value = text;
}
};
const useStandardNegative = () => {
negativePrompt.value = 'text, letters, words, watermark, signature, blurry, low quality, distorted, ugly, bad anatomy, disfigured';
};
const generateImage = async () => {
if (!prompt.value.trim()) {
$q.notify({
type: 'warning',
message: 'Inserisci una descrizione per l\'immagine'
});
return;
}
isGenerating.value = true;
generatedImage.value = null;
try {
const res = await Api.SendReq('/api/assets/generate-ai', 'POST', {
prompt: prompt.value,
negativePrompt: negativePrompt.value,
provider: selectedProvider.value,
aspectRatio: aspectRatio.value,
category: props.assetType === 'backgroundImage' ? 'background' : 'main',
seed: seed.value,
steps: steps.value,
cfg: cfg.value
});
if (res?.data?.success) {
generatedImage.value = res.data.data.file.url;
// Add to history
history.value.unshift({
url: res.data.data.file.url,
prompt: prompt.value
});
// Keep only last 6
if (history.value.length > 6) {
history.value = history.value.slice(0, 6);
}
$q.notify({
type: 'positive',
message: 'Immagine generata con successo!',
icon: 'auto_awesome'
});
} else {
throw new Error(res?.data?.error || 'Errore durante la generazione');
}
} catch (error: any) {
$q.notify({
type: 'negative',
message: error.message || 'Errore durante la generazione',
icon: 'error'
});
} finally {
isGenerating.value = false;
}
};
const confirmImage = () => {
if (!generatedImage.value) return;
emit('generated', {
url: generatedImage.value,
aiParams: {
prompt: prompt.value,
negativePrompt: negativePrompt.value,
provider: selectedProvider.value,
aspectRatio: aspectRatio.value,
seed: seed.value,
steps: steps.value,
cfg: cfg.value
}
});
};
const selectFromHistory = (item: { url: string; prompt: string }) => {
generatedImage.value = item.url;
prompt.value = item.prompt;
};
// Initialize with hint
onMounted(() => {
if (props.initialPrompt) {
prompt.value = props.initialPrompt;
}
useStandardNegative();
});
</script>
<style lang="scss" scoped>
.ai-generator-dialog {
width: 100%;
max-width: 100%;
height: 100vh;
display: flex;
flex-direction: column;
}
.dialog-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 1.5rem;
.header-content {
display: flex;
align-items: center;
gap: 1rem;
h2 {
margin: 0;
font-size: 1.3rem;
font-weight: 600;
}
p {
margin: 0;
font-size: 0.85rem;
color: #888;
}
}
}
.dialog-body {
flex: 1;
overflow: hidden;
padding: 0;
}
.generator-layout {
display: grid;
grid-template-columns: 1fr 1fr;
height: 100%;
@media (max-width: 900px) {
grid-template-columns: 1fr;
}
}
// Form Panel
.form-panel {
padding: 1.5rem;
overflow-y: auto;
border-right: 1px solid #e0e0e0;
}
.form-section {
margin-bottom: 1.5rem;
}
.section-label {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.9rem;
font-weight: 600;
color: #555;
margin-bottom: 0.5rem;
.optional {
font-weight: 400;
color: #999;
font-size: 0.8rem;
}
}
// Provider Options
.provider-options {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
}
.provider-option {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.75rem 1rem;
border: 2px solid #e0e0e0;
border-radius: 12px;
cursor: pointer;
transition: all 0.2s;
flex: 1;
min-width: 140px;
&:hover {
border-color: #667eea;
background: rgba(102, 126, 234, 0.05);
}
&.is-selected {
border-color: #667eea;
background: rgba(102, 126, 234, 0.1);
}
.provider-info {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.provider-name {
font-weight: 500;
font-size: 0.9rem;
}
}
// Quick Prompts
.quick-prompts {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
margin-top: 0.75rem;
.quick-label {
font-size: 0.8rem;
color: #888;
}
}
.negative-presets {
margin-top: 0.5rem;
}
.advanced-header {
background: #fafafa;
}
.advanced-options {
padding: 1rem;
}
.options-row {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.75rem;
}
.generate-actions {
margin-top: 2rem;
}
.full-width {
width: 100%;
}
// Preview Panel
.preview-panel {
padding: 1.5rem;
background: #f5f5f5;
display: flex;
flex-direction: column;
overflow-y: auto;
}
.preview-container {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
background: white;
border-radius: 16px;
overflow: hidden;
min-height: 400px;
position: relative;
&.has-image {
padding: 0;
}
}
.generating-state,
.empty-preview {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 2rem;
color: #888;
p {
margin: 1rem 0 0.5rem;
font-size: 1.1rem;
}
.time-estimate {
font-size: 0.85rem;
color: #aaa;
}
}
.preview-image {
width: 100%;
height: 100%;
object-fit: contain;
}
.preview-actions {
position: absolute;
bottom: 1rem;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 1rem;
padding: 0.75rem 1.5rem;
background: rgba(0, 0, 0, 0.7);
border-radius: 30px;
}
// History
.generation-history {
margin-top: 1.5rem;
h4 {
margin: 0 0 0.75rem;
font-size: 0.9rem;
color: #666;
}
}
.history-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 0.5rem;
@media (max-width: 600px) {
grid-template-columns: repeat(3, 1fr);
}
}
.history-item {
aspect-ratio: 1;
border-radius: 8px;
overflow: hidden;
cursor: pointer;
opacity: 0.7;
transition: all 0.2s;
&:hover {
opacity: 1;
transform: scale(1.05);
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
// Tips Dialog
.tips-list {
margin: 0;
padding-left: 1.25rem;
li {
margin-bottom: 0.75rem;
}
}
.example-prompt {
background: #f5f5f5;
padding: 1rem;
border-radius: 8px;
p {
margin: 0;
font-style: italic;
color: #666;
}
}
// Dark mode
.body--dark {
.form-panel {
border-color: #404040;
}
.provider-option {
border-color: #444;
&:hover,
&.is-selected {
border-color: #667eea;
background: rgba(102, 126, 234, 0.15);
}
}
.preview-panel {
background: #252525;
}
.preview-container {
background: #333;
}
.advanced-header {
background: #333;
}
.example-prompt {
background: #333;
}
}
</style>

View File

@@ -3,7 +3,7 @@ import { useI18n } from 'vue-i18n'
import { tools } from '../../store/Modules/tools'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import { useUserStore } from '@store/UserStore'
import { useGlobalStore } from '@store/globalStore'

View File

@@ -5,9 +5,9 @@ import { useUserStore } from '@store/UserStore'
import { useQuasar } from 'quasar'
import type { IAccomodation} from 'model';
import { IGallery, IImgGallery } from 'model'
import { CMyPage } from '@src/components/CMyPage'
import { CMyPage } from '@/components/CMyPage'
import { tools } from '@tools'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import { useGlobalStore } from '@store/globalStore'
import { costanti } from '@costanti'
import { CMySelect } from '../CMySelect'

View File

@@ -1,5 +1,5 @@
import { defineComponent, onMounted, ref, toRef, watch, toRefs } from 'vue'
import { tools } from '@src/store/Modules/tools'
import { tools } from '@/store/Modules/tools'
import { useQuasar } from 'quasar'
import { useI18n } from 'vue-i18n'

View File

@@ -5,7 +5,7 @@ import { tools } from '../../store/Modules/tools'
import { fieldsTable } from '@store/Modules/fieldsTable'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import type {
ISearchList
@@ -35,11 +35,11 @@ import { useUserStore } from '@store/UserStore'
import { useGlobalStore } from '@store/globalStore'
import { useQuasar, exportFile } from 'quasar'
import { costanti } from '@costanti'
import translate from '@src/globalroutines/util'
import translate from '@/globalroutines/util'
import { toolsext } from '@store/Modules/toolsext'
import { CMyCardPopup } from '@src/components/CMyCardPopup'
import { CMyCardGrpPopup } from '@src/components/CMyCardGrpPopup'
import { CMyCardCircuitPopup } from '@src/components/CMyCardCircuitPopup'
import { CMyCardPopup } from '@/components/CMyCardPopup'
import { CMyCardGrpPopup } from '@/components/CMyCardGrpPopup'
import { CMyCardCircuitPopup } from '@/components/CMyCardCircuitPopup'
import { useRouter } from 'vue-router'
import { table } from 'console'
import { globals } from 'jest.config'
@@ -256,7 +256,11 @@ export default defineComponent({
if (recSector) {
tools.setCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + props.table + costanti.FILTER_SEP + recSector.value, newval)
}
// setCategBySector('sectorgoods', table, newval)
} else if (table === toolsext.TABMYBACHECAS) {
const recSector = searchList.value.find((rec) => rec.table === toolsext.TABSECTORBACHECAS)
if (recSector) {
tools.setCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + props.table + costanti.FILTER_SEP + recSector.value, newval)
}
}

View File

@@ -1,42 +1,188 @@
.text-cls{
font-weight: bold;
// Spacing ridotto
$s-xs: 4px;
$s-sm: 6px;
$s-md: 8px;
// Wrapper moderno
.modern-btn-wrapper {
padding: $s-xs;
&.modern-btn-col-3 {
flex: 0 0 33.333%;
max-width: 33.333%;
@media (max-width: 599px) {
flex: 0 0 33.333%;
max-width: 33.333%;
}
@media (min-width: 600px) and (max-width: 1023px) {
flex: 0 0 33.333%;
max-width: 33.333%;
}
@media (min-width: 1024px) and (max-width: 1439px) {
flex: 0 0 25%;
max-width: 25%;
}
@media (min-width: 1440px) {
flex: 0 0 16.666%;
max-width: 16.666%;
}
}
&.modern-btn-col-2 {
flex: 0 0 50%;
max-width: 50%;
@media (min-width: 600px) and (max-width: 1023px) {
flex: 0 0 50%;
max-width: 50%;
}
@media (min-width: 1024px) and (max-width: 1439px) {
flex: 0 0 33.333%;
max-width: 33.333%;
}
@media (min-width: 1440px) {
flex: 0 0 25%;
max-width: 25%;
}
}
}
.my-text {
font-size: 1rem;
font-weight: bold;
line-height: 1.5rem;
letter-spacing: 0.0125em;
}
.my-text_3 {
font-size: 1rem;
font-weight: bold;
line-height: 1.5rem;
letter-spacing: 0.0125em;
}
.my-text-small {
font-size: 1rem;
line-height: 1rem;
letter-spacing: 0.0125em;
}
.mybox_3 {
min-width: 100px;
min-height: 100px;
// Bottoni moderni
.modern-bigbtn {
width: 100%;
min-height: 90px;
min-width: 90px;
padding: $s-sm;
flex-direction: column;
gap: $s-xs;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
transition: left 0.5s ease;
}
&:hover::before {
left: 100%;
}
&:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
}
.btn-icon {
margin: $s-xs;
font-size: 2rem;
}
.btn-icon-large {
margin: $s-xs;
}
.btn-label,
.btn-label-large {
margin: $s-xs;
font-size: 0.95rem;
font-weight: 700;
line-height: 1.3;
letter-spacing: 0.01em;
text-align: center;
white-space: normal;
word-break: break-word;
}
.btn-label-large {
font-size: 1.1rem;
}
}
.mybox {
min-width: 112px;
min-height: 112px;
.modern-smallbtn {
width: 100%;
min-height: 70px;
min-width: 80px;
padding: $s-sm;
flex-direction: column;
gap: $s-xs;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
transition: left 0.5s ease;
}
&:hover::before {
left: 100%;
}
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
}
.btn-icon-small {
margin: $s-xs;
}
.btn-label-small {
margin: $s-xs;
font-size: 0.85rem;
font-weight: 600;
line-height: 1.2;
letter-spacing: 0.01em;
text-align: center;
white-space: normal;
word-break: break-word;
}
}
.mybox_small {
min-width: 110px;
width: 100%;
}
// Responsive adjustments
@media (max-width: 599px) {
.modern-bigbtn {
min-height: 85px;
min-width: 85px;
.btn-icon {
font-size: 1.8rem;
}
.btn-label {
font-size: 0.85rem;
}
.btn-label-large {
font-size: 1rem;
}
}
.modern-smallbtn {
min-height: 65px;
min-width: 70px;
.btn-label-small {
font-size: 0.75rem;
}
}
}

View File

@@ -1,27 +1,63 @@
<template>
<div v-if="numcol === 3" class="col-xs-4 col-sm-4 col-md-3 col-lg-2">
<div class="q-ma-sm">
<q-btn v-if="!small" :flat="flat" class="mybox_3" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 180)">
<q-icon class="q-ma-sm" :name="icon"/>
<div class="q-ma-sm my-text_3 text-cls no-wrap"><span v-html="label"></span></div>
</q-btn>
<q-btn v-if="small" :flat="flat" class="mybox_small" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 180)">
<q-icon class="q-ma-sm" :name="icon" size="sm"/>
<div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div>
</q-btn>
</div>
<div v-if="numcol === 3" class="modern-btn-wrapper modern-btn-col-3">
<q-btn
v-if="!small"
:flat="flat"
class="modern-bigbtn"
:color="color"
rounded
push
:to="tools.updateLink(to)"
v-bind="$attrs"
:style="tools.getbackgroundGradient(color, 180)"
>
<q-icon class="btn-icon" :name="icon"/>
<div class="btn-label"><span v-html="label"></span></div>
</q-btn>
<q-btn
v-if="small"
:flat="flat"
class="modern-smallbtn"
:color="color"
rounded
push
:to="tools.updateLink(to)"
v-bind="$attrs"
:style="tools.getbackgroundGradient(color, 180)"
>
<q-icon class="btn-icon-small" :name="icon" size="sm"/>
<div class="btn-label-small"><span v-html="label"></span></div>
</q-btn>
</div>
<div v-else class="col-xs-6 col-sm-6 col-md-4 col-lg-3">
<div class="q-ma-sm">
<q-btn v-if="!small" :flat="flat" class="mybox" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 0)">
<q-icon class="q-ma-sm" size="3rem" :name="icon"/>
<div class="q-ma-sm text-h5-diff text-cls no-wrap"><span v-html="label"></span></div>
</q-btn>
<q-btn v-if="small" :flat="flat" class="mybox_small" :color="color" rounded push :to="tools.updateLink(to)" v-bind="$attrs" :style="tools.getbackgroundGradient(color, 0)">
<q-icon class="q-ma-sm" :name="icon" size="sm"/>
<div class="q-ma-xs my-text-small text-cls no-wrap"><span v-html="label"></span></div>
</q-btn>
</div>
<div v-else class="modern-btn-wrapper modern-btn-col-2">
<q-btn
v-if="!small"
:flat="flat"
class="modern-bigbtn"
:color="color"
rounded
push
:to="tools.updateLink(to)"
v-bind="$attrs"
:style="tools.getbackgroundGradient(color, 0)"
>
<q-icon class="btn-icon-large" size="3rem" :name="icon"/>
<div class="btn-label-large"><span v-html="label"></span></div>
</q-btn>
<q-btn
v-if="small"
:flat="flat"
class="modern-smallbtn"
:color="color"
rounded
push
:to="tools.updateLink(to)"
v-bind="$attrs"
:style="tools.getbackgroundGradient(color, 0)"
>
<q-icon class="btn-icon-small" :name="icon" size="sm"/>
<div class="btn-label-small"><span v-html="label"></span></div>
</q-btn>
</div>
</template>

View File

@@ -6,9 +6,9 @@ import { IOperators, ISize } from 'model'
import { useI18n } from 'vue-i18n'
import { useQuasar } from 'quasar'
import { CMySlider } from '@src/components/CMySlider'
import { CMySlider } from '@/components/CMySlider'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
export default defineComponent({
name: 'CBorders',

View File

@@ -2,9 +2,9 @@ import { ref, computed, defineComponent, onMounted } from 'vue';
import { useQuasar } from 'quasar';
import { tools } from '@tools';
import { IMyCard, IMyPage, IOperators } from '@src/model';
import { IMyCard, IMyPage, IOperators } from '@/model';
import objectId from '@src/js/objectId';
import objectId from '@/js/objectId';
export default defineComponent({
name: 'ElementComponent',

View File

@@ -6,7 +6,7 @@ import type { IDiscipline, IEvents } from 'model'
import { useCalendarStore } from '@store/CalendarStore'
import { CMyTeacher } from '@src/components/CMyTeacher'
import { CMyTeacher } from '@/components/CMyTeacher'
// @ts-ignore
import MixinOperator from '../../mixins/mixin-operator'

View File

@@ -1,4 +1,4 @@
import { CCard } from '@src/components/CCard'
import { CCard } from '@/components/CCard'
import MixinOperator from '../../mixins/mixin-operator'
import { defineComponent, ref } from 'vue'

View File

@@ -8,14 +8,14 @@ import { useI18n } from 'vue-i18n';
import { toolsext } from '@store/Modules/toolsext';
import { useQuasar } from 'quasar';
import { costanti } from '@costanti';
import type { ICart, IOrder, IOrderCart, IProduct } from '@src/model/Products';
import { IShareWithUs } from '@src/model/Products';
import type { ICart, IOrder, IOrderCart, IProduct } from '@/model/Products';
import { IShareWithUs } from '@/model/Products';
import { shared_consts } from '@src/common/shared_vuejs';
import { shared_consts } from '@/common/shared_vuejs';
import { CSingleCart } from '../CSingleCart';
import { CTitleBanner } from '@src/components/CTitleBanner';
import { CSelectUserActive } from '@src/components/CSelectUserActive';
import { CTitleBanner } from '@/components/CTitleBanner';
import { CSelectUserActive } from '@/components/CSelectUserActive';
export default defineComponent({
name: 'CCart',

View File

@@ -12,13 +12,13 @@ import {
} from 'vue';
import { tools } from '@tools';
import { CMyFieldDb } from '@src/components/CMyFieldDb';
import { CMyFieldDb } from '@/components/CMyFieldDb';
import { costanti } from '@costanti';
import { useGlobalStore } from '@store/globalStore';
import { useUserStore } from '@store/UserStore';
import { CTitlePage } from '@src/components/CTitlePage';
import { CGridTableRec } from '@src/components/CGridTableRec';
import { CTitlePage } from '@/components/CTitlePage';
import { CGridTableRec } from '@/components/CGridTableRec';
import type { ICatalog, IColGridTable, INewCatalog, ISearchList } from 'model';
import { useI18n } from 'vue-i18n';
import { toolsext } from '@store/Modules/toolsext';

View File

@@ -107,6 +107,13 @@
/>
<div class="row justify-center">
<q-btn
label="Annulla"
v-close-popup
color="primary"
flat
class="q-ml-sm"
/>
<q-btn
label="Aggiungi"
type="submit"
@@ -120,13 +127,6 @@
"
color="primary"
/>
<q-btn
label="Annulla"
v-close-popup
color="primary"
flat
class="q-ml-sm"
/>
</div>
</q-form>
</q-card-section>

View File

@@ -1,8 +1,8 @@
import type { PropType} from 'vue';
import { defineComponent, ref, watch } from 'vue'
import { Catalogo } from '@src/views/ecommerce/catalogo'
import type { IOptCatalogo } from '@src/model'
import { Catalogo } from '@/views/ecommerce/catalogo'
import type { IOptCatalogo } from '@/model'
export default defineComponent({
name: 'CCatalogo',

View File

@@ -21,9 +21,9 @@ import { CViewTable } from '../CViewTable';
import { CMyValueDb } from '../CMyValueDb';
import { CPrice } from '../CPrice';
import { CText } from '../CText';
import { CLabel } from '@src/components/CLabel';
import { CSchedaProdotto } from '@src/components/CSchedaProdotto';
import { CModifTrafiletto } from '@src/components/CModifTrafiletto';
import { CLabel } from '@/components/CLabel';
import { CSchedaProdotto } from '@/components/CSchedaProdotto';
import { CModifTrafiletto } from '@/components/CModifTrafiletto';
import { CBarCode } from '../CBarCode';
import { CTableCupleLabelValue } from '../CTableCupleLabelValue';
@@ -40,12 +40,12 @@ import type {
IVariazione,
IRecFields,
ICatalog,
} from '@src/model';
import { IBaseOrder } from '@src/model';
} from '@/model';
import { IBaseOrder } from '@/model';
import { tools } from '@tools';
import { useProducts } from '@store/Products';
import { shared_consts } from '@src/common/shared_vuejs';
import { shared_consts } from '@/common/shared_vuejs';
import { useRouter } from 'vue-router';
import { costanti } from '@costanti';

View File

@@ -5,8 +5,8 @@ import { useGlobalStore } from '@store/globalStore'
import { useI18n } from 'vue-i18n'
import { tools } from '@tools'
import { costanti } from '@store/Modules/costanti'
import { static_data } from '@src/db/static_data'
import { CRegistration } from '@src/components/CRegistration'
import { static_data } from '@/db/static_data'
import { CRegistration } from '@/components/CRegistration'
export default defineComponent({
name: 'CCheckIfIsLogged',

View File

@@ -13,15 +13,15 @@
<div class="card-icon-wrapper">
<q-icon name="fas fa-sign-in-alt" size="48px" class="card-icon" />
</div>
<div class="card-content">
<h3 class="card-title">Benvenuto su RISO</h3>
<h3 class="card-title">Benvenuto su {{ tools.sitename() }}</h3>
<p class="card-description">
Accedi con le tue credenziali per utilizzare la APP e per unirti
al Circuito di scambio RIS del tuo territorio
ai membri della Community
</p>
</div>
<div class="card-actions">
<q-btn
unelevated
@@ -47,7 +47,7 @@
<span class="telegram-subtitle">Unisciti al gruppo Provinciale</span>
</div>
</div>
<q-btn
rounded
unelevated
@@ -71,7 +71,7 @@
<span class="help-subtitle">Consulta la guida completa</span>
</div>
</div>
<q-btn
rounded
unelevated

View File

@@ -6,9 +6,9 @@ import { useGlobalStore } from '@store/globalStore'
import type { PropType} from 'vue';
import { defineComponent, computed, ref } from 'vue'
import type { IUserFields } from 'model'
import { shared_consts } from '@src/common/shared_vuejs'
import { CLabel } from '@src/components/CLabel'
import { CSendCoins } from '@src/components/CSendCoins'
import { shared_consts } from '@/common/shared_vuejs'
import { CLabel } from '@/components/CLabel'
import { CSendCoins } from '@/components/CSendCoins'
export default defineComponent({
name: 'CContactUser',
@@ -31,6 +31,11 @@ export default defineComponent({
required: false,
default: '',
},
circuitSel: {
type: String,
required: false,
default: '',
},
causalDest: {
type: String,
required: false,

View File

@@ -96,6 +96,7 @@
:to_user="myuser"
:sendRIS="sendRIS"
:causalDest="causalDest"
:circuitname="circuitSel"
@close="
showsendCoinTo = false;
loading = false;

View File

@@ -12,11 +12,11 @@ import { func_tools, toolsext } from '@store/Modules/toolsext'
import { tools } from '@tools'
import { useProducts } from '@store/Products'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import { useRouter } from 'vue-router'
import { costanti } from '@costanti'
import type { IOptCatalogo, IMyScheda, IProduct, ICatalog } from '@src/model'
import type { IOptCatalogo, IMyScheda, IProduct, ICatalog } from '@/model'
export default defineComponent({

View File

@@ -1,9 +1,215 @@
.my-custom-container {
max-width: 100%; /* Imposta la larghezza massima per il contenitore */
// Variables
$border-radius-sm: 8px;
$border-radius-md: 12px;
$transition-fast: 0.2s ease;
.copy-share-container {
width: 100%;
&.small-variant {
font-size: 13px;
}
&.btn-only {
display: inline-flex;
}
}
.wrapword {
overflow: hidden; /* Nasconde il contenuto in eccesso */
white-space: nowrap; /* Impedisce il wrapping del testo */
text-overflow: ellipsis; /* Mostra "..." se il testo è troppo lungo */
// ═══════════════════════════════════════════
// Link Display Wrapper
// ═══════════════════════════════════════════
.link-display-wrapper {
display: flex;
flex-direction: column;
gap: 12px;
width: 100%;
}
// Link Preview Box
.link-preview-box {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
padding: 10px 12px;
background: #f8fafc;
border: 1.5px solid #e2e8f0;
border-radius: $border-radius-sm;
transition: all $transition-fast;
&:hover {
border-color: #cbd5e1;
background: #f1f5f9;
}
&.compact {
padding: 8px 10px;
}
.link-icon {
flex-shrink: 0;
opacity: 0.7;
}
.link-text {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #475569;
font-size: 13px;
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
}
.copy-icon-btn {
flex-shrink: 0;
transition: all $transition-fast;
&:hover {
transform: scale(1.1);
}
}
}
// ═══════════════════════════════════════════
// Action Buttons
// ═══════════════════════════════════════════
.action-buttons {
display: flex;
gap: 10px;
justify-content: center;
flex-wrap: wrap;
&.compact {
gap: 8px;
.q-btn {
min-width: auto;
}
}
.share-btn,
.whatsapp-btn,
.telegram-btn {
flex: 1;
max-width: 160px;
text-transform: none;
font-weight: 600;
font-size: 13px;
&:hover {
transform: translateY(-1px);
}
}
.whatsapp-btn {
&:not(.q-btn--flat) {
background: linear-gradient(135deg, #25d366 0%, #128c7e 100%) !important;
border: none !important;
color: white !important;
}
}
.telegram-btn {
&:not(.q-btn--flat) {
background: linear-gradient(135deg, #0088cc 0%, #0077b5 100%) !important;
border: none !important;
color: white !important;
}
}
}
// ═══════════════════════════════════════════
// Default Layout
// ═══════════════════════════════════════════
.default-layout {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
width: 100%;
.text-preview {
text-align: center;
color: #64748b;
font-size: 14px;
word-break: break-all;
padding: 0 8px;
&.small {
font-size: 12px;
}
}
.share-main-btn {
text-transform: none;
font-weight: 600;
padding: 10px 24px;
box-shadow: 0 2px 8px rgba(102, 126, 234, 0.25);
transition: all $transition-fast;
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.35);
}
}
}
// ═══════════════════════════════════════════
// Copied State Animation
// ═══════════════════════════════════════════
.copied-state {
animation: pulse-success 0.3s ease;
}
@keyframes pulse-success {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
// ═══════════════════════════════════════════
// Dark Mode
// ═══════════════════════════════════════════
.body--dark {
.link-preview-box {
background: #1e293b;
border-color: #334155;
&:hover {
border-color: #475569;
background: #273449;
}
.link-text {
color: #cbd5e1;
}
}
.text-preview {
color: #94a3b8;
}
}
// ═══════════════════════════════════════════
// Responsive
// ═══════════════════════════════════════════
@media (max-width: 400px) {
.action-buttons:not(.compact) {
flex-direction: column;
.share-btn,
.whatsapp-btn,
.telegram-btn {
max-width: 100%;
}
}
}

View File

@@ -1,55 +1,208 @@
import { tools } from '../../store/Modules/tools'
import { useQuasar } from 'quasar'
import { useI18n } from 'vue-i18n'
import { useUserStore } from '@store/UserStore'
import { useGlobalStore } from '@store/globalStore'
import { defineComponent } from 'vue'
import { shared_consts } from '@src/common/shared_vuejs'
import { defineComponent, ref, computed } from 'vue'
import { shared_consts } from '@/common/shared_vuejs'
export default defineComponent({
name: 'CCopyBtnSmall',
props: {
// Testo/link da copiare
texttocopy: {
type: String,
required: true,
},
// Titolo per la condivisione
title: {
type: String,
required: false,
default: 'Condividi questo link',
},
// Messaggio personalizzato per la condivisione
shareMessage: {
type: String,
default: '',
},
// Lunghezza massima del testo visualizzato
maxLength: {
type: Number,
default: 400,
},
// Dimensione compatta
small: {
type: Boolean,
required: false,
default: false,
}
},
// Mostra solo il pulsante (senza link preview)
btn: {
type: Boolean,
default: false,
},
// Mostra solo icona (senza label)
iconOnly: {
type: Boolean,
default: false,
},
// Stile flat
flat: {
type: Boolean,
default: false,
},
// Stile outline
outline: {
type: Boolean,
default: false,
},
// Colore del pulsante
btnColor: {
type: String,
default: 'primary',
},
// Label personalizzata
label: {
type: String,
default: 'Copia link',
},
// Mostra il link preview
showLink: {
type: Boolean,
default: false,
},
// Mostra i pulsanti di azione
showActions: {
type: Boolean,
default: true,
},
// Mostra pulsante Share nativo
showShareBtn: {
type: Boolean,
default: true,
},
// Mostra pulsante WhatsApp
showWhatsApp: {
type: Boolean,
default: true,
},
// Mostra pulsante Telegram
showTelegram: {
type: Boolean,
default: false,
},
},
components: {},
setup(props) {
emits: ['copied', 'shared'],
setup(props, { emit }) {
const $q = useQuasar()
const { t } = useI18n()
async function copytoclipandsend() {
tools.copyStringToClipboard($q, props.texttocopy, true)
// State
const copied = ref(false)
let copyTimeout: ReturnType<typeof setTimeout> | null = null
let msg = 'Questo è il link che puoi condividere per farti inviare i RIS:<br><br>👉🏻 ' + props.texttocopy
// Computed
const truncatedText = computed(() => {
if (!props.texttocopy) return ''
if (props.texttocopy.length <= props.maxLength) return props.texttocopy
return props.texttocopy.substring(0, props.maxLength) + '...'
})
tools.sendMsgTelegramCmd($q, t, shared_consts.MsgTeleg.SHARE_TEXT, false, msg)
const containerClasses = computed(() => ({
'small-variant': props.small,
'btn-only': props.btn && !props.showLink,
}))
}
const shareText = computed(() => {
if (props.shareMessage) return props.shareMessage
return `${props.title}\n\n👉 ${props.texttocopy}`
})
function getclass() {
if (props.small) {
return 'text-h7'
} else {
return 'text-h5'
// Methods
async function handleCopy() {
try {
await navigator.clipboard.writeText(props.texttocopy)
copied.value = true
emit('copied', props.texttocopy)
$q.notify({
type: 'positive',
message: 'Link copiato negli appunti!',
icon: 'check',
timeout: 2000,
position: 'bottom',
})
// Reset stato dopo 2 secondi
if (copyTimeout) clearTimeout(copyTimeout)
copyTimeout = setTimeout(() => {
copied.value = false
}, 2000)
} catch (err) {
// Fallback per browser più vecchi
tools.copyStringToClipboard($q, props.texttocopy, true)
copied.value = true
if (copyTimeout) clearTimeout(copyTimeout)
copyTimeout = setTimeout(() => {
copied.value = false
}, 2000)
}
}
async function handleShare() {
// Prima copia negli appunti
await handleCopy()
// Prova Web Share API
if (navigator.share) {
try {
await navigator.share({
title: props.title,
text: props.shareMessage || 'Ecco il link:',
url: props.texttocopy,
})
emit('shared', 'native')
} catch (err) {
// L'utente ha annullato o errore
console.log('Share cancelled or failed')
}
} else {
// Fallback: usa Telegram come default
handleTelegram()
}
}
function handleWhatsApp() {
const text = encodeURIComponent(shareText.value)
window.open(`https://wa.me/?text=${text}`, '_blank')
emit('shared', 'whatsapp')
}
function handleTelegram() {
const msg = props.shareMessage ||
`Questo è il link che puoi condividere:\n\n👉 ${props.texttocopy}`
tools.sendMsgTelegramCmd($q, t, shared_consts.MsgTeleg.SHARE_TEXT, false, msg)
emit('shared', 'telegram')
}
return {
copytoclipandsend,
// State
copied,
// Computed
truncatedText,
containerClasses,
// Methods
handleCopy,
handleShare,
handleWhatsApp,
handleTelegram,
// Utils
tools,
getclass,
t,
}
},

View File

@@ -1,11 +1,127 @@
<template>
<div class="" style="width: 100%; overflow: hidden;">
<div class="row justify-center">
{{ tools.firstchars(texttocopy, 80) }}
</div>
<div class="row justify-center q-mt-sm">
<q-btn rounded label="Condividi link" color="primary" @click="copytoclipandsend" />
</div>
<div class="copy-share-container" :class="containerClasses">
<!-- Variante: Solo pulsante -->
<template v-if="btn && !showLink">
<q-btn
:size="small ? 'sm' : 'md'"
:round="iconOnly"
:rounded="!iconOnly"
:flat="flat"
:outline="outline"
:unelevated="!flat && !outline"
:color="btnColor"
:icon="copied ? 'check' : 'content_copy'"
:label="iconOnly ? undefined : (copied ? 'Copiato!' : label)"
:class="{ 'copied-state': copied }"
@click="handleCopy"
>
<q-tooltip v-if="iconOnly">{{ copied ? 'Copiato!' : 'Copia link' }}</q-tooltip>
</q-btn>
</template>
<!-- Variante: Link + Azioni -->
<template v-else-if="showLink">
<div class="link-display-wrapper">
<!-- Link Preview -->
<div class="link-preview-box" :class="{ 'compact': small }">
<q-icon name="link" :size="small ? '18px' : '20px'" color="primary" class="link-icon" />
<span class="link-text" :title="texttocopy">
{{ truncatedText }}
</span>
<q-btn
flat
round
dense
:size="small ? 'sm' : 'md'"
:icon="copied ? 'check' : 'content_copy'"
:color="copied ? 'positive' : 'grey-7'"
class="copy-icon-btn"
@click="handleCopy"
>
<q-tooltip>{{ copied ? 'Copiato!' : 'Copia' }}</q-tooltip>
</q-btn>
</div>
<!-- Action Buttons -->
<div v-if="showActions" class="action-buttons" :class="{ 'compact': small }">
<q-btn
v-if="showShareBtn"
:outline="!small"
:flat="small"
:rounded="!small"
:round="small"
:size="small ? 'sm' : 'md'"
color="primary"
:icon="small ? 'share' : undefined"
:label="small ? undefined : 'Condividi'"
class="share-btn"
@click="handleShare"
>
<template v-if="!small" v-slot:prepend>
<q-icon name="share" />
</template>
<q-tooltip v-if="small">Condividi</q-tooltip>
</q-btn>
<q-btn
v-if="showWhatsApp"
:outline="!small"
:flat="small"
:rounded="!small"
:round="small"
:size="small ? 'sm' : 'md'"
color="green"
:icon="small ? 'fab fa-whatsapp' : undefined"
:label="small ? undefined : 'WhatsApp'"
class="whatsapp-btn"
@click="handleWhatsApp"
>
<template v-if="!small" v-slot:prepend>
<q-icon name="fab fa-whatsapp" />
</template>
<q-tooltip v-if="small">WhatsApp</q-tooltip>
</q-btn>
<q-btn
v-if="showTelegram"
:outline="!small"
:flat="small"
:rounded="!small"
:round="small"
:size="small ? 'sm' : 'md'"
color="light-blue"
:icon="small ? 'fab fa-telegram' : undefined"
:label="small ? undefined : 'Telegram'"
class="telegram-btn"
@click="handleTelegram"
>
<template v-if="!small" v-slot:prepend>
<q-icon name="fab fa-telegram" />
</template>
<q-tooltip v-if="small">Telegram</q-tooltip>
</q-btn>
</div>
</div>
</template>
<!-- Variante: Default (testo + bottone) -->
<template v-else>
<div class="default-layout">
<div class="text-preview" :class="{ 'small': small }">
{{ truncatedText }}
</div>
<q-btn
rounded
unelevated
:size="small ? 'sm' : 'md'"
:label="copied ? 'Copiato!' : 'Condividi link'"
:color="copied ? 'positive' : 'primary'"
:icon="copied ? 'check' : 'share'"
class="share-main-btn"
@click="handleShare"
/>
</div>
</template>
</div>
</template>

View File

@@ -1,10 +1,10 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { tools } from '@src/store/Modules/tools'
import { tools } from '@/store/Modules/tools'
import { date, useQuasar } from 'quasar'
import { useI18n } from 'vue-i18n'
import { CCurrencyValue } from '@src/components/CCurrencyValue'
import { CMyFieldDb } from '@src/components/CMyFieldDb'
import { CCurrencyValue } from '@/components/CCurrencyValue'
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { costanti } from '@costanti'

View File

@@ -1,5 +1,5 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { tools } from '@src/store/Modules/tools'
import { tools } from '@/store/Modules/tools'
import { date, useQuasar } from 'quasar'
import { useI18n } from 'vue-i18n'

View File

@@ -6,7 +6,7 @@ import { useRouter } from 'vue-router'
import { useGlobalStore } from '../../store/globalStore'
import { useI18n } from 'vue-i18n'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import type { IMainCard } from '@store/Modules/costanti';
import { costanti } from '@store/Modules/costanti'

View File

@@ -5,7 +5,7 @@ import { useRouter } from 'vue-router'
import { useGlobalStore } from '../../store/globalStore'
import { useI18n } from 'vue-i18n'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import type { IMainCard } from '@costanti';
import { costanti } from '@costanti'

View File

@@ -1,5 +1,5 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { tools } from '@src/store/Modules/tools'
import { tools } from '@/store/Modules/tools'
import { date, useQuasar } from 'quasar'

View File

@@ -1,7 +1,7 @@
import { defineComponent, ref, watch, computed } from 'vue';
import { useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n';
import { tools } from '@src/store/Modules/tools';
import { tools } from '@/store/Modules/tools';
import { toolsext } from '@store/Modules/toolsext';
export default defineComponent({

View File

@@ -1,7 +1,7 @@
import { defineComponent, ref, watch, computed } from 'vue';
import { useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n';
import { tools } from '@src/store/Modules/tools';
import { tools } from '@/store/Modules/tools';
import { toolsext } from '@store/Modules/toolsext';
function toTS(s: string | null): number | null {

View File

@@ -1,6 +1,6 @@
import { defineComponent } from 'vue'
import { ProductsList } from '@src/views/ecommerce'
import { ProductsList } from '@/views/ecommerce'
export default defineComponent({
name: 'CECommerce',

View File

@@ -5,6 +5,8 @@ $card-radius-mobile: 14px;
$transition-smooth: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
$transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
$gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
.stat-card {
position: relative;
width: 100%;
@@ -15,7 +17,7 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
padding: 0;
border-radius: $card-radius-desktop;
background: linear-gradient(145deg, #ffffff 0%, #f8f9fa 100%);
box-shadow:
box-shadow:
0 10px 30px -5px rgba(0, 0, 0, 0.1),
0 0 0 1px rgba(0, 0, 0, 0.02);
transition: $transition-base;
@@ -24,7 +26,7 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
&:hover {
transform: translateY(-6px) scale(1.02);
box-shadow:
box-shadow:
0 20px 40px -8px rgba(0, 0, 0, 0.15),
0 0 0 1px rgba(0, 0, 0, 0.03);
@@ -108,7 +110,7 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
height: 64px;
border-radius: 50%;
background: linear-gradient(145deg, #ffffff, #f5f5f5);
box-shadow:
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.08),
inset 0 1px 2px rgba(255, 255, 255, 0.9);
@@ -158,26 +160,26 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.stat-title {
font-size: 0.75rem;
font-size: 1rem;
font-weight: 600;
letter-spacing: 0.03em;
line-height: 1.3;
opacity: 0.85;
text-transform: uppercase;
margin: 4px 0;
color: #424242;
color: #718096;
@media (max-width: 960px) {
font-size: 0.7rem;
font-size: 0.9rem;
}
@media (max-width: 718px) {
font-size: 0.65rem;
font-size: 0.8rem;
margin: 2px 0;
}
@media (max-width: 480px) {
font-size: 0.6rem;
font-size: 0.8rem;
letter-spacing: 0.02em;
}
}
@@ -195,11 +197,14 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.stat-value {
font-size: 1.5rem;
font-weight: 700;
line-height: 1.1;
letter-spacing: -0.03em;
color: #1a1a1a;
font-size: 1.5rem;
font-weight: 800;
background: $gradient-primary;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
line-height: 1;
padding-bottom: 2px;
@media (max-width: 960px) {
font-size: 1.375rem;
@@ -223,7 +228,7 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
font-size: 0.625rem;
font-weight: 600;
color: white;
box-shadow:
box-shadow:
0 3px 8px rgba(0, 0, 0, 0.2),
inset 0 1px 2px rgba(255, 255, 255, 0.2);
backdrop-filter: blur(8px);
@@ -276,12 +281,10 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
left: -50%;
width: 200%;
height: 200%;
background: linear-gradient(
45deg,
transparent 30%,
rgba(255, 255, 255, 0.4) 50%,
transparent 70%
);
background: linear-gradient(45deg,
transparent 30%,
rgba(255, 255, 255, 0.4) 50%,
transparent 70%);
transform: translateX(-100%) translateY(-100%);
transition: transform 0.8s ease;
pointer-events: none;
@@ -294,8 +297,8 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
border-radius: inherit;
padding: 2px;
background: linear-gradient(145deg, rgba(33, 150, 243, 0.3), rgba(156, 39, 176, 0.3));
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
@@ -307,10 +310,13 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
// Animations
@keyframes pulse {
0%, 100% {
0%,
100% {
opacity: 0.3;
transform: scale(1);
}
50% {
opacity: 0.5;
transform: scale(1.05);
@@ -318,9 +324,12 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes bounce-subtle {
0%, 100% {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-2px);
}
@@ -339,9 +348,11 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 0;
transform: scale(0.5) translateY(10px);
}
60% {
transform: scale(1.1) translateY(-2px);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
@@ -398,12 +409,12 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
.body--dark {
.stat-card {
background: linear-gradient(145deg, #1e1e1e 0%, #2a2a2a 100%);
box-shadow:
box-shadow:
0 10px 30px -5px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(255, 255, 255, 0.05);
&:hover {
box-shadow:
box-shadow:
0 20px 40px -8px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(255, 255, 255, 0.08);
}
@@ -411,7 +422,7 @@ $transition-base: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
.stat-icon-wrapper {
background: linear-gradient(145deg, #2a2a2a, #1e1e1e);
box-shadow:
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 2px rgba(255, 255, 255, 0.05);
}

View File

@@ -6,18 +6,16 @@
<div :class="['stat-content', classColor]">
<!-- Icon con effetto hover e glow -->
<div class="stat-icon-wrapper">
<div class="stat-icon-glow" :style="{ backgroundColor: getGlowColor(classColor) }"></div>
<div
class="stat-icon-glow"
:style="{ backgroundColor: getGlowColor(classColor) }"
></div>
<q-icon
:name="icon"
:class="['stat-icon', classColor]"
/>
</div>
<!-- Title -->
<div class="stat-title">
{{ title }}
</div>
<!-- Value con tipografia gerarchica -->
<div class="stat-value-container">
<div class="stat-value">
@@ -32,11 +30,19 @@
:style="{ backgroundColor: colBack }"
>
<div class="stat-badge-pulse"></div>
<q-icon name="trending_up" size="12px" class="stat-badge-icon" />
<q-icon
name="trending_up"
size="12px"
class="stat-badge-icon"
/>
<span class="stat-badge-text">+{{ value_today }} oggi</span>
</div>
</transition>
</div>
<!-- Title -->
<div class="stat-title">
{{ title }}
</div>
</div>
<!-- Decorative elements -->
@@ -45,9 +51,8 @@
</q-card>
</template>
<script lang="ts" src="./CElemStat.ts">
</script>
<script lang="ts" src="./CElemStat.ts"></script>
<style lang="scss" scoped>
@import "./CElemStat.scss";
@import './CElemStat.scss';
</style>

View File

@@ -12,10 +12,10 @@ import { LandingFooter } from '../LandingFooter'
import { CTitle } from '../CTitle'
import { CImgText } from '../CImgText'
import { CMyEditor } from '../CMyEditor'
import { CDateTime } from '@src/components/CDateTime'
import { CDateTime } from '@/components/CDateTime'
import { CMyAvatar } from '../CMyAvatar'
import { CMySingleEvent } from '@src/components/CMySingleEvent'
import { CMyTeacher } from '@src/components/CMyTeacher'
import { CMySingleEvent } from '@/components/CMySingleEvent'
import { CMyTeacher } from '@/components/CMyTeacher'
import { CMySelect } from '../CMySelect'
import { tools } from '@tools'
import { costanti } from '@costanti'
@@ -26,10 +26,10 @@ import MixinEvents from '../../mixins/mixin-events'
import { useCalendarStore } from '@store/CalendarStore'
import { func_tools, toolsext } from '@store/Modules/toolsext'
import { useMessageStore } from '@store/MessageStore'
import { static_data } from '@src/db/static_data'
import { static_data } from '@/db/static_data'
import { lists } from '@store/Modules/lists'
import translate from '@src/globalroutines/util'
import { shared_consts } from '@src/common/shared_vuejs'
import translate from '@/globalroutines/util'
import { shared_consts } from '@/common/shared_vuejs'
export default defineComponent({
name: 'CEventsCalendar',

View File

@@ -10,24 +10,48 @@
</div>-->
<div>
<!-- display an myevent -->
<q-dialog v-model="displayEvent" :maximized="$q.screen.lt.sm">
<q-card v-if="myevent" class="dialog_card">
<q-dialog
v-model="displayEvent"
:maximized="$q.screen.lt.sm"
>
<q-card
v-if="myevent"
class="dialog_card"
>
<q-toolbar class="bg-primary text-white">
<!--<q-toolbar :class="tools.displayClasses(myevent)"-->
<!--:style="tools.displayStyles(myevent) + ` min-width: `+ tools.myheight_dialog() + `px;`">-->
<q-toolbar-title>
{{ t('cal.event') }}
</q-toolbar-title>
<q-btn v-if="editable" flat round color="white" icon="fas fa-copy">
<q-menu transition-show="flip-right" transition-hide="flip-left">
<q-btn
v-if="editable"
flat
round
color="white"
icon="fas fa-copy"
>
<q-menu
transition-show="flip-right"
transition-hide="flip-left"
>
<q-list style="min-width: 100px">
<q-item clickable @click="duplicateEvent(myevent, 7)">
<q-item
clickable
@click="duplicateEvent(myevent, 7)"
>
<q-item-section>Tra 1 Settimana</q-item-section>
</q-item>
<q-item clickable @click="duplicateEvent(myevent, 14)">
<q-item
clickable
@click="duplicateEvent(myevent, 14)"
>
<q-item-section>Tra 2 Settimane</q-item-section>
</q-item>
<q-item clickable @click="duplicateEvent(myevent, 7, 4)">
<q-item
clickable
@click="duplicateEvent(myevent, 7, 4)"
>
<q-item-section>4 Eventi ogni Settimana</q-item-section>
</q-item>
</q-list>
@@ -86,7 +110,10 @@
:class="`cal__details` + ($q.dark.isActive ? `_darktheme` : ``)"
v-html="myevent.details"
></div>
<div v-if="myevent.teacher" class="cal__teacher">
<div
v-if="myevent.teacher"
class="cal__teacher"
>
<span class="cal__teacher-title"
>{{ t('cal.teacher') }}: <span class="margin_with"></span
></span>
@@ -96,16 +123,17 @@
<CMyTeacher :username="myevent.teacher3"></CMyTeacher>
<CMyTeacher :username="myevent.teacher4"></CMyTeacher>
</div>
<div v-if="myevent.wherecode" class="cal__where">
<div
v-if="myevent.wherecode"
class="cal__where"
>
<!--<span v-if="tools.isMobile()"><br/></span>-->
<span class="cal__where-title">{{ t('cal.where') }}: </span>
<span class="cal__where-content">
<q-chip>
<q-avatar v-if="getWhereIcon(myevent.wherecode)">
<img
:src="
`/images/avatar/` + getWhereIcon(myevent.wherecode)
"
:src="`/images/avatar/` + getWhereIcon(myevent.wherecode)"
alt="Località"
/>
</q-avatar>
@@ -129,17 +157,16 @@
>
<span class="cal__quota-title">{{ t('event.price') }}:</span>
<q-chip>
<span class="cal__quota-content">{{
getPrice(myevent)
}}</span>
<span class="cal__quota-content">{{ getPrice(myevent) }}</span>
</q-chip>
</div>
<div v-if="myevent.dateTimeStart" class="cal__when">
<div
v-if="myevent.dateTimeStart"
class="cal__when"
>
<span class="cal__where-title"
>{{ t('cal.when') }}:
<span
v-html="tools.getstrDateTimeEvent($t, myevent, true)"
></span>
<span v-html="tools.getstrDateTimeEvent($t, myevent, true)"></span>
</span>
</div>
<p
@@ -181,16 +208,33 @@
</q-dialog>
<!-- id_bookedeventadd/edit an myevent -->
<q-dialog v-model="addEvent" no-backdrop-dismiss persistent>
<q-card v-if="addEvent" class="dialog_card">
<q-dialog
v-model="addEvent"
no-backdrop-dismiss
persistent
>
<q-card
v-if="addEvent"
class="dialog_card"
>
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
{{ addOrUpdateEvent() }} {{ t('cal.event') }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
<q-btn
flat
round
color="white"
icon="close"
v-close-popup
></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
<q-form v-if="contextDay" ref="myevent" class="q-gutter-sm">
<q-form
v-if="contextDay"
ref="myevent"
class="q-gutter-sm"
>
<CMySelect
:label="$t('event.typol')"
v-model:value="eventForm.typol"
@@ -254,7 +298,10 @@
/>
</q-tabs>
<q-tab-panels v-model="tabeditor" animated>
<q-tab-panels
v-model="tabeditor"
animated
>
<q-tab-panel name="details">
<div class="q-gutter-sm myflex">
<q-input
@@ -320,7 +367,10 @@
</CMyEditor>
</q-tab-panel>
<q-tab-panel name="settings" class="q-gutter-sm">
<q-tab-panel
name="settings"
class="q-gutter-sm"
>
<!--<q-checkbox v-model="eventForm.allday" :label="$t('cal.alldayevent')"></q-checkbox>-->
<div class="q-gutter-sm row myflex">
@@ -507,28 +557,40 @@
</q-form>
</q-card-section>
<q-card-actions align="right">
<q-btn
:label="$t('dialog.ok')"
color="primary"
@click="saveEvent"
></q-btn>
<q-btn
flat
:label="$t('dialog.cancel')"
color="primary"
v-close-popup
></q-btn>
<q-btn
:label="$t('dialog.ok')"
color="primary"
@click="saveEvent"
></q-btn>
</q-card-actions>
</q-card>
</q-dialog>
<q-dialog v-model="bookEventpage.show" no-backdrop-dismiss>
<q-card v-if="bookEventpage.show" class="dialog_card">
<q-dialog
v-model="bookEventpage.show"
no-backdrop-dismiss
>
<q-card
v-if="bookEventpage.show"
class="dialog_card"
>
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
{{ t('cal.booking') }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
<q-btn
flat
round
color="white"
icon="close"
v-close-popup
></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
@@ -548,16 +610,20 @@
>
{{ myevent.title }}
</q-chip>
<div v-if="myevent.dateTimeStart" class="cal__when">
<div
v-if="myevent.dateTimeStart"
class="cal__when"
>
<span class="cal__where-title"
>{{ t('cal.when') }}:
<span
v-html="tools.getstrDateTimeEvent($t, myevent, true)"
></span>
<span v-html="tools.getstrDateTimeEvent($t, myevent, true)"></span>
</span>
</div>
<div class="q-pa-xs">
<q-card class="text-white windowcol" style="display: block">
<q-card
class="text-white windowcol"
style="display: block"
>
<q-card-section class="q-pa-xs">
<div
style="display: inline-flex"
@@ -583,9 +649,7 @@
style="min-width: 140px"
>
<q-select
:behavior="
$q.platform.is.ios === true ? 'dialog' : 'menu'
"
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
rounded
outlined
v-model="bookEventForm.numpeople"
@@ -614,9 +678,7 @@
style="min-width: 140px; margin-left: 10px"
>
<q-select
:behavior="
$q.platform.is.ios === true ? 'dialog' : 'menu'
"
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
rounded
outlined
v-model="bookEventForm.numpeopleLunch"
@@ -647,9 +709,7 @@
style="min-width: 180px; margin-left: 10px"
>
<q-select
:behavior="
$q.platform.is.ios === true ? 'dialog' : 'menu'
"
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
rounded
outlined
v-model="bookEventForm.numpeopleDinner"
@@ -679,9 +739,7 @@
style="min-width: 180px; margin-left: 10px"
>
<q-select
:behavior="
$q.platform.is.ios === true ? 'dialog' : 'menu'
"
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
rounded
outlined
v-model="bookEventForm.numpeopleDinnerShared"
@@ -726,6 +784,13 @@
</div>
</q-card-section>
<q-card-actions align="right">
<q-btn
flat
:label="$t('dialog.cancel')"
color="primary"
v-close-popup
></q-btn>
<q-btn
v-if="bookEventpage.state === EState.Modifying"
flat
@@ -745,28 +810,31 @@
:label="getTitleBtnBooking()"
color="primary"
@click="saveBookEvent(myevent)"
:disable="
!(bookEventpage.state === EState.Creating || hasModifiedBooking)
"
></q-btn>
<q-btn
flat
:label="$t('dialog.cancel')"
color="primary"
v-close-popup
:disable="!(bookEventpage.state === EState.Creating || hasModifiedBooking)"
></q-btn>
</q-card-actions>
</q-card>
</q-dialog>
<q-dialog v-model="askInfopage.show" no-backdrop-dismiss>
<q-card v-if="askInfopage.show" class="dialog_card">
<q-dialog
v-model="askInfopage.show"
no-backdrop-dismiss
>
<q-card
v-if="askInfopage.show"
class="dialog_card"
>
<q-toolbar class="bg-primary text-white">
<q-toolbar-title>
{{ t('cal.booking') }}
</q-toolbar-title>
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
<q-btn
flat
round
color="white"
icon="close"
v-close-popup
></q-btn>
</q-toolbar>
<q-card-section class="inset-shadow">
@@ -786,12 +854,13 @@
>
{{ myevent.title }}
</q-chip>
<div v-if="myevent.dateTimeStart" class="cal__when">
<div
v-if="myevent.dateTimeStart"
class="cal__when"
>
<span class="cal__where-title"
>{{ t('cal.when') }}:
<span
v-html="tools.getstrDateTimeEvent($t, myevent, true)"
></span>
<span v-html="tools.getstrDateTimeEvent($t, myevent, true)"></span>
</span>
</div>
<div class="q-pa-xs">
@@ -812,18 +881,17 @@
</div>
</q-card-section>
<q-card-actions align="right">
<q-btn
flat
:label="$t('dialog.sendmsg')"
color="primary"
@click="sendMsg(myevent)"
></q-btn>
<q-btn
flat
:label="$t('dialog.cancel')"
color="primary"
v-close-popup
></q-btn>
<q-btn
:label="$t('dialog.sendmsg')"
color="primary"
@click="sendMsg(myevent)"
></q-btn>
</q-card-actions>
</q-card>
</q-dialog>
@@ -956,20 +1024,13 @@
class="q-ma-xs"
:class="badgeClasses(event, 'header')"
:style="badgeStyles(event, 'header')"
style="
width: 10px;
max-width: 10px;
height: 10px;
max-height: 10px;
"
style="width: 10px; max-width: 10px; height: 10px; max-height: 10px"
></q-badge>
</template>
</div>
</template>
<template
#day-body="{
scope: { timestamp, timeStartPos, timeDurationHeight },
}"
#day-body="{ scope: { timestamp, timeStartPos, timeDurationHeight } }"
>
<template
v-for="(event, index) in getEvents(timestamp.date)"
@@ -1012,12 +1073,7 @@
class="my-event-rel justify-center rounded-borders"
:class="badgeClasses(event, 'body')"
:style="
badgeStyles(
event,
'body',
timeStartPos,
timeDurationHeight
)
badgeStyles(event, 'body', timeStartPos, timeDurationHeight)
"
@click.stop.prevent="showEvent(event)"
:draggable="tools.isManager()"
@@ -1087,13 +1143,7 @@
<img
:src="getImgEvent(event)"
@click="selectEvent(event)"
class="
text-left
padding_cell
listaev__tdimg listaev__img
cursor-pointer
q-mx-sm
"
class="text-left padding_cell listaev__tdimg listaev__img cursor-pointer q-mx-sm"
:style="getStyleByEvent(event, event === myevent)"
:alt="event.title"
/>
@@ -1139,9 +1189,7 @@
clickable
@click="duplicateEvent(myevent, 7, 4)"
>
<q-item-section
>4 Eventi ogni Settimana</q-item-section
>
<q-item-section>4 Eventi ogni Settimana</q-item-section>
</q-item>
</q-list>
</q-menu>
@@ -1187,22 +1235,17 @@
</q-chip>
</div>
<div
class="
listaev__date listaev__align_center_mobile
text-center
"
>
<span
v-html="tools.getstrDateTimeEvent($t, event, true)"
></span>
<div class="listaev__date listaev__align_center_mobile text-center">
<span v-html="tools.getstrDateTimeEvent($t, event, true)"></span>
</div>
<div class="listaev__align_center_mobile">
<div style="margin: 10px"></div>
<div v-if="event.internal">
<q-chip color="blue" text-color="white"
<q-chip
color="blue"
text-color="white"
>Evento Interno:</q-chip
>
</div>
@@ -1247,17 +1290,15 @@
<div style="margin: 10px"></div>
<p
:class="
`listaev__details` + ($q.dark.isActive
? `_darktheme`
: ``)
"
:class="`listaev__details` + ($q.dark.isActive ? `_darktheme` : ``)"
v-html="event.details"
></p>
<div v-if="event.teacher" class="">
<div
v-if="event.teacher"
class=""
>
<span class="cal__teacher-title"
>{{ t('cal.teacher') }}:
<span class="margin_with"></span
>{{ t('cal.teacher') }}: <span class="margin_with"></span
></span>
<CMyTeacher :username="event.teacher"></CMyTeacher>
@@ -1265,18 +1306,17 @@
<CMyTeacher :username="event.teacher3"></CMyTeacher>
<CMyTeacher :username="event.teacher4"></CMyTeacher>
<span v-if="event.wherecode" class="">
<span
v-if="event.wherecode"
class=""
>
<span v-if="tools.isMobile()"><br /></span>
<span class="cal__where-title"
>{{ t('cal.where') }}:
</span>
<span class="cal__where-title">{{ t('cal.where') }}: </span>
<q-chip>
<q-avatar v-if="getWhereIcon(event.wherecode)">
<img
:src="
`/images/avatar/` + getWhereIcon(event.wherecode)
"
:src="`/images/avatar/` + getWhereIcon(event.wherecode)"
:alt="event.wherecode"
/>
</q-avatar>
@@ -1293,13 +1333,17 @@
</q-chip>
</span>
</div>
<div v-if="event.contribtype" class="">
<div
v-if="event.contribtype"
class=""
>
<span class="cal__quota-title"
>{{ t('event.price') }}:<span
class="margin_with"
></span
>{{ t('event.price') }}:<span class="margin_with"></span
></span>
<span v-if="!isShowPrice(event)" class="">
<span
v-if="!isShowPrice(event)"
class=""
>
<q-chip
class="glossy"
color="orange"
@@ -1318,9 +1362,7 @@
text-color="white"
icon-right="star"
>
<span class="cal__quota-content">{{
getPrice(event)
}}</span>
<span class="cal__quota-content">{{ getPrice(event) }}</span>
</q-chip>
</div>
@@ -1418,8 +1460,7 @@
</div>
</div>
</template>
<script lang="ts" src="./CEventsCalendar.ts">
</script>
<script lang="ts" src="./CEventsCalendar.ts"></script>
<style lang="scss" scoped>
@import './CEventsCalendar.scss';
</style>

View File

@@ -3,9 +3,9 @@ import { useQuasar } from 'quasar'
import { useI18n } from 'vue-i18n'
import { useUserStore } from '@store/UserStore'
import { useGlobalStore } from '@store/globalStore'
import { CDownloadJsonFile } from '@src/components/CDownloadJsonFile'
import { CDownloadJsonFile } from '@/components/CDownloadJsonFile'
import { PropType, defineComponent, onMounted, ref } from 'vue'
import type { IMyPage } from '@src/model'
import type { IMyPage } from '@/model'
export default defineComponent({
name: 'CExportImportPage',

View File

@@ -17,7 +17,7 @@ import { useGlobalStore } from '../../store/globalStore';
import { useCircuitStore } from '../../store/CircuitStore';
import { useI18n } from 'vue-i18n';
import { shared_consts } from '@src/common/shared_vuejs';
import { shared_consts } from '@/common/shared_vuejs';
import { costanti, IMainCard } from '@store/Modules/costanti';
import { CMyUser } from '../CMyUser';
@@ -35,6 +35,7 @@ import { colmyUserPeople, colmyUserGroup } from '@store/Modules/fieldsTable';
export default defineComponent({
name: 'CFindUsers',
emits: ['clickContact'],
props: {
actionType: {
type: Number,
@@ -46,6 +47,11 @@ export default defineComponent({
required: false,
default: '',
},
enableContactClick: {
type: Boolean,
required: false,
default: false,
},
},
components: {
CMyUser,
@@ -57,7 +63,7 @@ export default defineComponent({
CGridTableRec,
CQRCode,
},
setup(props) {
setup(props, { emit }) {
const userStore = useUserStore();
const globalStore = useGlobalStore();
const circuitStore = useCircuitStore();
@@ -253,6 +259,10 @@ export default defineComponent({
usersList.value.listgroup = receiveRislistgroup;
}
function clickContact(data: any) {
emit('clickContact', data)
}
return {
userStore,
tools,
@@ -277,6 +287,7 @@ export default defineComponent({
extraparams_groups,
filtercustom,
arrfilterand,
clickContact,
};
},
});

View File

@@ -65,6 +65,9 @@
:showCol="false"
:extraparams="extraparams()"
:actionType="actionType"
@clickContact="clickContact"
:enableContactClick="enableContactClick"
>
</CGridTableRec>
</div>
@@ -99,6 +102,8 @@
:extraparams="extraparams_groups()"
:actionType="actionType"
:visufind="costanti.FIND_GROUP"
@clickContact="clickContact"
:enableContactClick="enableContactClick"
>
</CGridTableRec>
</div>

View File

@@ -4,16 +4,16 @@ import {
} from 'vue'
import { tools } from '@tools'
import { CMyFieldDb } from '@src/components/CMyFieldDb'
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { costanti } from '@costanti'
import { useGlobalStore } from '@store/globalStore'
import { useUserStore } from '@store/UserStore'
import { CTitlePage } from '@src/components/CTitlePage'
import { CGridTableRec } from '@src/components/CGridTableRec'
import { CTitlePage } from '@/components/CTitlePage'
import { CGridTableRec } from '@/components/CGridTableRec'
import type { IColGridTable, ISearchList} from 'model';
import { IMyBacheca, IMySkill, ISkill } from 'model'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import { useI18n } from 'vue-i18n'
import { toolsext } from '@store/Modules/toolsext'
import { fieldsTable } from '@store/Modules/fieldsTable'
@@ -306,7 +306,7 @@ export default defineComponent({
}
function getFilterGoods(recGood: any, index: number, arr: any) {
const recsectorGoods: any = searchList.value.find((rec) => rec.table === 'sectorgoods')
const recsectorGoods: any = searchList.value.find((rec) => rec.table === toolsext.TABSECTORGOODS)
// console.log('getFilterSkills', recSkill.idSector, recsectors.value)
if (recsectorGoods && recGood.idSectorGood) {
return recGood.idSectorGood.includes(recsectorGoods.value)
@@ -314,6 +314,15 @@ export default defineComponent({
return true
}
}
function getFilterBachecas(recBacheca: any, index: number, arr: any) {
const recsectorBachecas: any = searchList.value.find((rec) => rec.table === toolsext.TABSECTORBACHECAS)
// console.log('getFilterSkills', recSkill.idSector, recsectors.value)
if (recsectorBachecas && recBacheca.idSectorBacheca) {
return recBacheca.idSectorBacheca.includes(recsectorBachecas.value)
} else {
return true
}
}
function getFilterSubSkills(recSubSkill: any, index: number, arr: any) {
const recskills: any = searchList.value.find((rec) => rec.table === 'skills')
@@ -614,9 +623,9 @@ export default defineComponent({
{
visible: true,
label: 'Settore',
table: toolsext.TABSECTORS,
key: 'idSector',
value: tools.getCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + props.table + costanti.FILTER_SEP + toolsext.TABSECTORS, 0, true),
table: toolsext.TABSECTORBACHECAS,
key: 'idSectorBacheca',
value: tools.getCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + props.table + costanti.FILTER_SEP + toolsext.TABSECTORBACHECAS, 0, true),
arrvalue: [],
type: costanti.FieldType.select,
filter: null,
@@ -624,6 +633,19 @@ export default defineComponent({
notinsearch: false,
useinput: false,
},
{
visible: true,
label: 'Categoria',
table: 'bachecas',
key: 'idBacheca',
value: tools.getCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + props.table + costanti.FILTER_SEP + tools.getCookie(tools.COOK_SEARCH + toolsext.TABSECTORBACHECAS, costanti.FILTER_TUTTI), costanti.FILTER_TUTTI, true),
arrvalue: [],
type: costanti.FieldType.select,
addall: true,
filter: getFilterBachecas,
showcount: true,
useinput: false,
},
{
visible: true,
label: 'Data Inizio',
@@ -898,7 +920,7 @@ export default defineComponent({
{
visible: true,
label: 'Settore',
table: 'sectorgoods',
table: toolsext.TABSECTORGOODS,
key: 'idSectorGood',
value: tools.getCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + props.table + costanti.FILTER_SEP + toolsext.TABSECTORGOODS, 0, true),
arrvalue: [],
@@ -911,7 +933,7 @@ export default defineComponent({
{
visible: true,
label: 'Categoria',
table: 'goods',
table: toolsext.TABGOODS,
key: 'idGood',
value: tools.getCookie(tools.COOK_SEARCH + costanti.FILTER_SEP + props.table + costanti.FILTER_SEP + tools.getCookie(tools.COOK_SEARCH + toolsext.TABSECTORGOODS, costanti.FILTER_TUTTI), costanti.FILTER_TUTTI, true),
arrvalue: [],

View File

@@ -5,10 +5,10 @@ import {
import { tools } from '@tools'
import { shared_consts } from '@src/common/shared_vuejs'
import { shared_consts } from '@/common/shared_vuejs'
import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
import { static_data } from '@src/db/static_data'
import { static_data } from '@/db/static_data'
import { useGlobalStore } from '@store/globalStore'
import { useUserStore } from '@store/UserStore'

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