This commit is contained in:
paoloar77
2022-02-03 00:33:05 +01:00
parent d7480fd489
commit 124cb5cc64
96 changed files with 1944 additions and 2611 deletions

View File

@@ -1,23 +1,23 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="12"
APP_ID="1"
DIRECTORY_LOCAL="newfreeplanet"
DIRECTORY_SERVER="freeplanet_serverside"
SERVERDIR_WEBSITE=""
SERVERPW_WEBSITE=""
APP_URL="http://localhost"
URL_FACEBOOK="https://www.facebook.com/"
URL_FACEBOOK="https://www.facebook.com/freeplanetapp"
PROVA_PAOLO="PROVA ENV FUNZIONA!"
LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="http://192.168.0.200:3000"
LOGO_REG="freeplanet-logo-full.svg"
LOGO_REG='insiemesipuo-logo-full.png'
TEST_NAME="Paolo"
TEST_SURNAME="Arena"
TEST_EMAIL="perseo@freeplanet.app"
TEST_EMAIL="paolo@freeplanet.app"
TEST_USERNAME="paoloar773"
TEST_PASSWORD="passpao1fr@1A"
TEST_PASSWORD=""
TEST_APORTADOR=""
PUBLICKEY_PUSH='BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8'
IN_CONSTRUCTION="0"

View File

@@ -1,18 +1,18 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="12"
APP_ID="1"
DIRECTORY_LOCAL=newfreeplanet
DIRECTORY_SERVER=freeplanet_serverside
SERVERDIR_WEBSITE=popolodelnuovomondo.app
SERVERDIR_WEBSITE=www.insiemesipuo.app
SERVERPW_WEBSITE=pwdadmin@1AOK
APP_URL="https://popolodelnuovomondo.insiemesipuo.app"
URL_FACEBOOK="https://www.facebook.com/"
PROVA_PAOLO="PROVA ENV FUNZIONA!"
APP_URL="https://www.insiemesipuo.app"
URL_FACEBOOK=""
PROVA_PAOLO=""
LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="https://www.freeplanet.app:3000"
LOGO_REG='freeplanet-logo-full.svg'
LOGO_REG='insiemesipuo-logo-full.png'
TEST_NAME=""
TEST_SURNAME=""
TEST_EMAIL=""
@@ -22,7 +22,7 @@ TEST_APORTADOR="------"
PUBLICKEY_PUSH="BNM-cEpTbPVc_ujXf3QOC8ggf7b-X44P44esfJUWqNOFq1XhWCoZJpOi71_cbXC5SnfO9HassQ6OouAYgtBA9Pw"
IN_CONSTRUCTION="1"
DEBUG="1"
TELEGRAM_SUPPORT="https://t.me/freeplanet_supporto"
TELEGRAM_SUPPORT="https://t.me/"
PROJECT_ID_MAIN="5cc0a13fe5c9d156728f400a"
TEST_CELL=""
ISTEST=0

View File

@@ -1,23 +1,23 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="12"
APP_ID="1"
DIRECTORY_LOCAL=newfreeplanet
DIRECTORY_SERVER=test.freeplanet_serverside
SERVERDIR_WEBSITE="testpopolodelnuovomondo.app"
SERVERDIR_WEBSITE="test.insiemesipuo.app"
SERVERPW_WEBSITE="pwdadmin@1AOK"
APP_URL="https://testpopolodelnuovomondo.insiemesipuo.app"
URL_FACEBOOK="https://www.facebook.com/"
PROVA_PAOLO="PROVA ENV FUNZIONA!"
APP_URL="https://test.insiemesipuo.app"
URL_FACEBOOK=""
PROVA_PAOLO=""
LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="https://test.freeplanet.app:3001"
LOGO_REG="freeplanet-logo-full.svg"
LOGO_REG='insiemesipuo-logo-full.png'
TEST_NAME="Paolo"
TEST_SURNAME="Arena"
TEST_EMAIL="paolo@freeplanet.app"
TEST_USERNAME="paoloar77"
TEST_PASSWORD="passpao1fr@1A"
TEST_PASSWORD=""
TEST_APORTADOR=""
PUBLICKEY_PUSH="BNRBtL3iaLVGW-aQckwQBmh5uKKzcizOZsMjnzCtSuHkssEhbyioEN2E_CwItDLDShMO-OQ1uhK51ty6zG_gCT8"
IN_CONSTRUCTION="0"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="1"
DIRECTORY_LOCAL="newfreeplanet"
@@ -11,7 +11,7 @@ PROVA_PAOLO="PROVA ENV FUNZIONA!"
LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="http://192.168.1.8:3000"
MONGODB_HOST="http://192.168.0.200:3000"
LOGO_REG="freeplanet-logo-full.svg"
TEST_NAME="Paolo"
TEST_SURNAME="Arena"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="1"
DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="1"
DIRECTORY_LOCAL=newfreeplanet

File diff suppressed because one or more lines are too long

View File

@@ -422,6 +422,17 @@ const baseroutes: IListRoutes[] = [
inmenu: true,
infooter: true,
},
{
active: true,
order: 132,
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 135,
@@ -433,6 +444,17 @@ const baseroutes: IListRoutes[] = [
inmenu: false,
infooter: false,
},
{
active: true,
order: 135,
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 130,

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="1"
DIRECTORY_LOCAL="newfreeplanet"
@@ -11,7 +11,7 @@ PROVA_PAOLO="PROVA ENV FUNZIONA!"
LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="http://192.168.1.8:3000"
MONGODB_HOST="http://192.168.0.200:3000"
LOGO_REG="freeplanet-logo-full.svg"
TEST_NAME="Paolo"
TEST_SURNAME="Arena"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="1"
DIRECTORY_LOCAL=newfreeplanet
@@ -12,7 +12,7 @@ LANG_DEFAULT="it"
PAO_APP_ID="KKPPAA5KJK435J3KSS9F9D8S9F8SD98F9SDF"
MASTER_KEY="KKPPSS5KJK435J3KSS9F9D8S9F8SD3CR3T"
MONGODB_HOST="https://www.freeplanet.app:3000"
LOGO_REG='freeplanet-logo-full.svg'
LOGO_REG='insiemesipuo-logo-full.png'
TEST_NAME=""
TEST_SURNAME=""
TEST_EMAIL=""

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="1"
DIRECTORY_LOCAL=newfreeplanet

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="12"
DIRECTORY_LOCAL="newfreeplanet"

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="12"
DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,4 +1,4 @@
APP_VERSION="0.1.6"
APP_VERSION="0.1.7"
SERVICE_WORKER_FILE="service-worker.js"
APP_ID="12"
DIRECTORY_LOCAL=newfreeplanet

View File

@@ -1,8 +1,8 @@
{
"name": "popolodelnuovomondo",
"version": "0.0.8",
"description": "Popolo Del Nuovo Mondo",
"productName": "Popolo Del Nuovo Mondo",
"name": "insiemesipuo",
"version": "0.1.0",
"description": "Insieme Si Puo",
"productName": "Insieme Si Puo",
"author": "Paolo Arena",
"private": true,
"keywords": [
@@ -23,25 +23,25 @@
"dependencies": {
"axios": "0.21.4",
"@vue/eslint-config-standard": "5.1.2",
"@quasar/extras": "^1.12.4",
"@quasar/quasar-ui-qcalendar": "^4.0.0-beta.12",
"@quasar/extras": "^1.12.2",
"@quasar/quasar-ui-qcalendar": "^4.0.0-beta.11",
"@vue/compat": "^3.2.26",
"@vue/compiler-sfc": "^3.2.26",
"@vuelidate/core": "^2.0.0-alpha.34",
"@vuelidate/validators": "^2.0.0-alpha.26",
"acorn": "^8.7.0",
"autoprefixer": "^10.4.2",
"@vuelidate/core": "^2.0.0-alpha.32",
"@vuelidate/validators": "^2.0.0-alpha.25",
"acorn": "^8.6.0",
"autoprefixer": "^10.4.0",
"bcryptjs": "^2.4.3",
"core-js": "^3.20.3",
"core-js": "^3.20.0",
"crypto": "^1.0.1",
"date-fns": "^2.28.0",
"dotenv": "^11.0.0",
"date-fns": "^2.27.0",
"dotenv": "^10.0.0",
"echarts": "^5.2.2",
"eslint-plugin-quasar": "^1.1.0",
"eslint-plugin-quasar": "^1.0.0",
"eslint-plugin-standard": "^5.0.0",
"graphql": "^16.2.0",
"graphql": "^16.1.0",
"graphql-tag": "^2.12.6",
"gsap": "^3.9.1",
"gsap": "^3.9.0",
"jquery": "^3.6.0",
"js-cookie": "^3.0.1",
"localforage": "^1.10.0",
@@ -49,9 +49,9 @@
"normalize.css": "^8.0.1",
"npm": "^8.3.0",
"nprogress": "^0.2.0",
"pinia": "^2.0.9",
"pinia": "^2.0.6",
"prerender-spa-plugin": "^3.4.0",
"quasar": "^2.4.12",
"quasar": "^2.3.4",
"quasar-extras": "^2.0.9",
"register-service-worker": "^1.7.2",
"vee-validate": "^4.4.10",
@@ -72,9 +72,9 @@
},
"devDependencies": {
"node-sass": "6.0.1",
"webpack": "^5.66.0",
"@quasar/app": "^3.2.9",
"@quasar/quasar-app-extension-qcalendar": "^4.0.0-beta.12",
"webpack": "^5.0.0",
"@quasar/app": "^3.2.5",
"@quasar/quasar-app-extension-qcalendar": "^4.0.0-beta.11",
"@types/bcryptjs": "^2.4.2",
"@types/dotenv": "^8.2.0",
"@types/googlemaps": "^3.43.3",
@@ -84,31 +84,31 @@
"@types/nprogress": "^0.2.0",
"@types/vue-tel-input": "^2.1.2",
"@types/vuelidate": "^0.7.15",
"@typescript-eslint/eslint-plugin": "^5.10.0",
"@typescript-eslint/parser": "^5.10.0",
"eslint": "^8.7.0",
"@typescript-eslint/eslint-plugin": "^5.7.0",
"@typescript-eslint/parser": "^5.7.0",
"eslint": "^8.4.1",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.2.0",
"eslint-plugin-vue": "^8.3.0",
"eslint-plugin-vue": "^8.2.0",
"file-loader": "^6.2.0",
"html-webpack-plugin": "^5.5.0",
"http-proxy-middleware": "^2.0.1",
"jest": "^27.4.5",
"json-loader": "^0.5.7",
"npm-check-updates": "^12.1.0",
"npm-check-updates": "^12.0.5",
"optimize-css-assets-webpack-plugin": "^6.0.1",
"postcss": "^8.4.5",
"postcss-loader": "^6.2.1",
"sass-loader": "^12.4.0",
"strip-ansi": "=7.0.1",
"ts-jest": "^27.1.2",
"ts-jest": "^27.1.1",
"ts-loader": "^9.2.6",
"tslint": "^6.1.3",
"tslint-config-standard": "^9.0.0",
"tslint-loader": "^3.5.4",
"typescript": "^4.5.5",
"typescript": "^4.5.4",
"vue-cli-plugin-element-ui": "^1.1.4",
"vueify": "^9.4.1",
"workbox-webpack-plugin": "^6.4.2"

BIN
public/favicon.ico Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/images/favicon-16x16.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/images/favicon-32x32.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
public/images/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 88 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@@ -146,9 +146,8 @@ module.exports = configure((ctx) => ({
},
devServer: {
https: false,
port: 8083,
port: 8082,
open: false, // opens browser window automatically
liveReload: false,
},
// https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework
@@ -285,21 +284,31 @@ module.exports = configure((ctx) => ({
},
manifest: {
name: 'PopoloDelNuovoMondo',
short_name: 'PdNM',
description: 'Popolo del Nuovo Mondo',
name: 'InsiemeSiPuo',
short_name: 'InsiemeSiPuo',
description: 'Insieme Si Può',
display: 'standalone',
orientation: 'portrait',
background_color: '#ffffff',
theme_color: '#027be3',
icons: [
{
src: 'images/android-chrome-192x192.png',
sizes: '384x384',
src: 'images/isp-android-icon-96x96.png',
sizes: '96x96',
type: 'image/png',
},
{
src: 'images/android-chrome-512x512.png',
src: 'images/isp-android-icon-144x144.png',
sizes: '144x144',
type: 'image/png',
},
{
src: 'images/isp-android-icon-192x192.png',
sizes: '192x192',
type: 'image/png',
},
{
src: 'images/isp-android-icon-512x512.png',
sizes: '512x512',
type: 'image/png',
},
@@ -337,7 +346,7 @@ module.exports = configure((ctx) => ({
builder: {
// https://www.electron.build/configuration/configuration
appId: 'firstproj',
appId: 'InsiemeSiPuo',
},
// "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain

View File

@@ -54,6 +54,17 @@ export const shared_consts = {
FIND_PEOPLE: 166,
},
GROUPSCMD: {
SETTRUST: 1121,
REQGROUP: 1125,
SETGROUP: 1132,
REMOVE_FROM_MYGROUP: 1144,
REFUSE_REQ_GROUP: 1145,
CANCEL_REQ_GROUP: 1146,
BLOCK_GROUP: 1155,
FIND_GROUP: 1166,
},
REPORT_FILT_RESP: 1,
REPORT_FILT_ATTIVITA: 2,
@@ -673,6 +684,21 @@ export const shared_consts = {
},
],
VisibilGroup: [
{
value: 1,
label: 'Pubblico',
},
{
value: 2,
label: 'Privato',
},
{
value: 4,
label: 'Nascosto',
},
],
Permissions: {
Admin: {
value: 1,

View File

@@ -68,7 +68,7 @@ export default defineComponent({
// @ts-ignore
let myarr: any = props.imgGall
gallerylist.value = []
if (myarr) {
if (Array.isArray(myarr)) {
myarr.forEach((pic: any) => {
if (pic.imagefile) {
gallerylist.value.push(pic)

View File

@@ -18,6 +18,7 @@ import { lists } from '@store/Modules/lists'
import { IParamsQuery } from 'model'
import { CMyPopupEdit } from '../CMyPopupEdit'
import { CMyFriends } from '../CMyFriends'
import { CMyGroups } from '../CMyGroups'
import { CMyFieldDb } from '../CMyFieldDb'
import { CMySelect } from '../CMySelect'
import { CTitleBanner } from '../CTitleBanner'
@@ -27,6 +28,7 @@ import { useGlobalStore } from '@store/globalStore'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
import translate from '@/globalroutines/util'
import { toolsext } from '@store/Modules/toolsext'
export default defineComponent({
name: 'CGridTableRec',
@@ -179,7 +181,7 @@ export default defineComponent({
default: false
}
},
components: { CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends },
components: { CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups },
setup(props, { emit }) {
const $q = useQuasar()
const { t } = useI18n()
@@ -234,6 +236,7 @@ export default defineComponent({
const selected: any = ref([])
const filter = ref(0)
const filtergrp = ref(costanti.MY_GROUPS)
const mycodeid = toRef(props, 'prop_codeId')
@@ -1320,6 +1323,7 @@ export default defineComponent({
myfilterand,
tools,
costanti,
toolsext,
fieldsTable,
globalStore,
searchList,
@@ -1329,6 +1333,7 @@ export default defineComponent({
valoriopt,
labelcombo,
filter,
filtergrp,
myvertical,
showColCheck,
getValueExtra,

View File

@@ -35,7 +35,7 @@
<q-spinner-tail size="2em" color="primary"/>
</q-inner-loading>
<q-table
:grid="myvertical === -1 || myvertical === 2"
:grid="myvertical === costanti.VISUTABLE_SCHEDA_USER || myvertical === 2 || myvertical === costanti.VISUTABLE_SCHEDA_GROUP"
flat
bordered
class="my-sticky-header-table"
@@ -89,11 +89,11 @@
<div class="row">
<q-toggle
v-for="(filter, index) of arrfilters"
v-for="(filt, index) of arrfilters"
:key="index"
v-model="myfilterand" :disable="filter.hide"
:val="filter.value"
:label="filter.label">
v-model="myfilterand" :disable="filt.hide"
:val="filt.value"
:label="filt.label">
</q-toggle>
</div>
@@ -244,7 +244,9 @@
<div v-if="choose_visutype" class="">
<q-radio v-model="myvertical" :val="2" label="Lista"
@update:model-value="tools.setCookie('myv', myvertical) "/>
<q-radio v-model="myvertical" :val="-1" label="Scheda"
<q-radio v-if="mytable === toolsext.TABMYGROUPS" v-model="myvertical" :val="costanti.VISUTABLE_SCHEDA_GROUP" label="Scheda"
@update:model-value="tools.setCookie('myv', myvertical) "/>
<q-radio v-else v-model="myvertical" :val="costanti.VISUTABLE_SCHEDA_USER" label="Scheda"
@update:model-value="tools.setCookie('myv', myvertical) "/>
<q-radio v-model="myvertical" :val="0" label="Tabella"
@update:model-value="tools.setCookie('myv', myvertical) "/>
@@ -297,7 +299,7 @@
<template v-slot:item="props">
<div v-if="(showType === costanti.SHOW_USERINFO) || (myvertical === 2)" class="fill-all-width">
<div v-if="((showType === costanti.SHOW_USERINFO) && myvertical !== costanti.VISUTABLE_SCHEDA_USER) || ((myvertical === 2) && (tablesel === 'users' || tablesel === 'myskills'))" class="fill-all-width">
<div>
<CMyFriends
v-model="filter"
@@ -307,6 +309,18 @@
/>
</div>
</div>
<div v-else-if="((showType === costanti.SHOW_GROUPINFO) && myvertical !== costanti.VISUTABLE_SCHEDA_GROUP) || ((myvertical === 2) && (tablesel === 'mygroups'))" class="fill-all-width">
<div>
<CMyGroups
v-model="filtergrp"
:finder="false"
:mygrp="props.row"
:visu="costanti.FIND_GROUP"
/>
</div>
</div>
<div
v-else

View File

@@ -114,6 +114,11 @@ export default defineComponent({
return (arr) ? arr.length : 0
})
const numAskSentGroups = computed(() => {
const arr = userStore.my.profile.asked_groups
return (arr) ? arr.length : 0
})
const numAskTrust = computed(() => {
if (!listTrusted.value)
return 0

View File

@@ -0,0 +1,4 @@
.myflex{
display: flex;
flex: 1;
}

View File

@@ -0,0 +1,86 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore'
import { IMyGroup, IImgGallery, IUserFields, IUserProfile } from 'model'
import { costanti } from '@costanti'
import { shared_consts } from '@/common/shared_vuejs'
import { tools } from '@store/Modules/tools'
import { useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { useRoute, useRouter } from 'vue-router'
export default defineComponent({
name: 'CMyGroup',
emits: ['setCmd'],
props: {
mygrp: {
type: Object as PropType<IMyGroup | null>,
required: false,
default: null,
},
mygroupname: {
type: String,
required: false,
default: null,
},
visu: {
type: Number,
required: true,
}
},
setup(props, { emit }) {
const userStore = useUserStore()
const $q = useQuasar()
const { t } = useI18n()
const $router = useRouter()
const $route = useRoute()
const groupname = ref('')
const grp = ref(<IMyGroup | null>null)
watch(() => props.mygrp, (newval, oldval) => {
mounted()
})
function mounted() {
if (!props.mygrp) {
if (props.mygroupname) {
groupname.value = props.mygroupname
//++Todo: carica contact
grp.value = null
}
} else {
if (props.mygrp) {
grp.value = props.mygrp
groupname.value = props.mygrp.groupname
}
}
}
function getImgGroup(group: IMyGroup) {
return userStore.getImgByGroup(group)
}
function naviga(path: string) {
$router.push(path)
}
function setCmd(cmd: number, myusername: string, value: any = '') {
emit('setCmd', cmd, myusername, value)
}
onMounted(mounted)
return {
grp,
costanti,
getImgGroup,
naviga,
setCmd,
shared_consts,
userStore,
}
},
})

View File

@@ -0,0 +1,123 @@
<template>
<div v-if="grp">
<q-item class="q-my-sm" clickable>
<q-item-section avatar @click="naviga(`/grp/` + grp.groupname)">
<q-avatar size="60px">
<q-img :src="getImgGroup(grp)" :alt="grp.groupname" img-class="imgprofile" height="60px"/>
</q-avatar>
</q-item-section>
<q-item-section @click="naviga(`/grp/` + grp.groupname)">
<q-item-label><strong>{{ grp.name }} {{ grp.surname }}</strong> ({{ grp.groupname }})
</q-item-label>
<q-item-label v-if="grp.profile" caption lines="1"><em>{{ grp.profile.qualifica }}</em></q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.MY_GROUPS">
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup
@click="setCmd(shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP, grp.groupname)">
<q-item-section>{{ $t('groups.remove_from_mygroups') }}</q-item-section>
</q-item>
</q-list>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-ban" v-close-popup @click="setCmd(shared_consts.GROUPSCMD.BLOCK_GROUP, grp.groupname)">
<q-item-section>{{ $t('groups.block_group') }}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.REQ_GROUP">
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list v-if="true" style="min-width: 150px">
<q-item clickable v-close-popup @click="setCmd(shared_consts.GROUPSCMD.SETGROUP, grp.groupname)">
<q-item-section>{{ $t('groups.accept_group') }}</q-item-section>
</q-item>
</q-list>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup
@click="setCmd(shared_consts.GROUPSCMD.REQGROUP, grp.groupname, false)">
<q-item-section>{{ $t('groups.reject_ask_group') }}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.ASK_SENT_GROUPS">
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">
<q-menu>
<q-list style="min-width: 150px">
<q-item clickable icon="fas fa-user-minus" v-close-popup
@click="setCmd(shared_consts.GROUPSCMD.CANCEL_REQ_GROUP, grp.groupname)">
<q-item-section>{{ $t('groups.cancel_ask_group') }}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.FIND_GROUP">
<q-item-label>
<q-btn v-if="grp.admins && grp.admins.includes(userStore.my.username)" rounded :icon="userStore.IsMyGroupByGroupname(grp.groupname) ? `fas fa-ellipsis-h` : `fas fa-user`">
<q-menu>
<q-list v-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && !userStore.IsAskedGroupByGroupname(grp.groupname))" style="min-width: 200px">
<q-item clickable v-close-popup @click="setCmd(shared_consts.GROUPSCMD.REQGROUP, grp.groupname, true)">
<q-item-section>{{ $t('groups.ask_group') }}</q-item-section>
</q-item>
</q-list>
<q-list v-else-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && userStore.IsAskedGroupByUsername(grp.groupname))" style="min-width: 200px">
<q-item clickable v-close-popup @click="setCmd(shared_consts.GROUPSCMD.REQGROUP, grp.groupname, false)">
<q-item-section>{{ $t('groups.cancel_ask_group') }}</q-item-section>
</q-item>
</q-list>
<q-list v-else-if="userStore.IsMyGroupByGroupname(grp.groupname)" style="min-width: 200px">
<q-item clickable v-close-popup @click="setCmd(shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUPS, grp.groupname)">
<q-item-section>{{ $t('groups.remove_from_mygroups') }}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.FIND_GROUP">
<q-item-label>
<q-btn v-if="grp.admins && grp.admins.includes(userStore.my.username)" rounded :icon="userStore.IsMyGroupByGroupname(grp.groupname) ? `fas fa-ellipsis-h` : `fas fa-user`">
<q-menu>
<q-list v-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && !userStore.IsAskedGroupByGroupname(grp.groupname))" style="min-width: 200px">
<q-item clickable v-close-popup @click="setCmd(shared_consts.GROUPSCMD.REQGROUP, grp.groupname, true)">
<q-item-section>{{ $t('groups.ask_group') }}</q-item-section>
</q-item>
</q-list>
<q-list v-else-if="(!userStore.IsMyGroupByGroupname(grp.groupname) && userStore.IsAskedGroupByUsername(grp.groupname))" style="min-width: 200px">
<q-item clickable v-close-popup @click="setCmd(shared_consts.GROUPSCMD.REQGROUP, grp.groupname, false)">
<q-item-section>{{ $t('groups.cancel_ask_group') }}</q-item-section>
</q-item>
</q-list>
<q-list v-else-if="userStore.IsMyGroupByGroupname(grp.groupname)" style="min-width: 200px">
<q-item clickable v-close-popup @click="setCmd(shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUPS, grp.groupname)">
<q-item-section>{{ $t('groups.remove_from_mygroups') }}</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</q-item-label>
</q-item-section>
</q-item>
</div>
</template>
<script lang="ts" src="./CMyGroup.ts">
</script>
<style lang="scss" scoped>
@import './CMyGroup.scss';
</style>

View File

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

View File

View File

@@ -0,0 +1,180 @@
import { CMyGroup } from '@/components/CMyGroup'
import { computed, defineComponent, onMounted, PropType, ref, toRef } from 'vue'
import { useUserStore } from '@store/UserStore'
import { useI18n } from '@/boot/i18n'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
import { IMyGroup, ISearchList, IUserFields } from 'model'
import { shared_consts } from '@/common/shared_vuejs'
import { tools } from '@store/Modules/tools'
export default defineComponent({
name: 'CMyGroups',
components: { CMyGroup },
emits: ['update:modelValue'],
props: {
modelValue: {
type: Number,
required: false,
default: 0,
},
finder: {
type: Boolean,
required: true,
},
mygrp: {
type: Object as PropType<IMyGroup | null>,
required: false,
default: null,
},
mygroupname: {
type: String,
required: false,
default: null,
},
visu: {
type: Number,
required: false,
default: 0,
},
},
setup(props, { emit }) {
const userStore = useUserStore()
const $q = useQuasar()
const { t } = useI18n()
const username = ref('')
const filtroutente = ref(<any[]>[])
const listgroupsfiltered = computed(() => {
let arr: any[] = []
try {
if (props.modelValue === costanti.GROUPS) {
arr = userStore.my.profile.groups
} else if (props.modelValue === costanti.MY_GROUPS) {
arr = userStore.my.profile.groups
// } else if (props.modelValue === costanti.REQ_GROUP) {
// arr = userStore.my.profile.req_groups
} else if (props.modelValue === costanti.ASK_SENT_GROUP) {
arr = userStore.my.profile.asked_groups
}
} catch (e) {
arr = []
}
return arr
})
const myoptions = computed(() => {
const mybutt = []
mybutt.push({ label: t('mypages.find_group'), value: costanti.FIND_GROUP })
mybutt.push({ label: t('mypages.my_groups') + ' (' + numGroups.value + ')', value: costanti.MY_GROUPS })
if (numAskSentGroups.value > 0 || props.modelValue === costanti.ASK_SENT_GROUP)
mybutt.push({
label: t('mypages.request_sent_groups') + ' (' + numAskSentGroups.value + ')',
value: costanti.ASK_SENT_GROUP
})
return mybutt
})
const numGroups = computed(() => {
const arr = userStore.my.profile.groups
return (arr) ? arr.length : 0
})
const numAskSentGroups = computed(() => {
const arr = userStore.my.profile.asked_groups
return (arr) ? arr.length : 0
})
function loadGroups() {
// Carica il profilo di quest'utente
if (username.value) {
userStore.loadGroups(username.value).then((ris) => {
// console.log('ris', ris)
if (ris) {
userStore.my.profile.groups = ris.listUsersGroup ? ris.listUsersGroup : []
userStore.groups = ris.listgroups ? ris.listgroups : []
userStore.my.profile.asked_groups = ris.listSentRequestGroups ? ris.listSentRequestGroups : []
filtroutente.value = [{ userId: userStore.my._id }]
}
})
}
}
function removeFromMyGroups(groupnameDest: string) {
$q.dialog({
message: t('db.domanda_removegroup', { username: groupnameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setGroupsCmd($q, t, username.value, groupnameDest, shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP, null).then((res) => {
if (res) {
userStore.my.profile.groups = userStore.my.profile.groups.filter((rec: IMyGroup) => rec.groupname !== groupnameDest)
tools.showPositiveNotif($q, t('db.removedgroup'))
}
})
})
}
function blockGroup(usernameDest: string) {
$q.dialog({
message: t('db.domanda_blockgroup', { groupname: usernameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setGroupsCmd($q, t, username.value, usernameDest, shared_consts.GROUPSCMD.BLOCK_GROUP, null).then((res) => {
if (res) {
userStore.my.profile.groups = userStore.my.profile.groups.filter((rec: IMyGroup) => rec.groupname !== usernameDest)
tools.showPositiveNotif($q, t('db.blockedgroup'))
}
})
})
}
function setCmd(cmd: number, groupnameDest: string, value: any = '') {
if (cmd === shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP) {
removeFromMyGroups(groupnameDest)
} else if (cmd === shared_consts.GROUPSCMD.BLOCK_GROUP) {
blockGroup(groupnameDest)
} else if (cmd === shared_consts.GROUPSCMD.SETGROUP) {
tools.addToMyGroups($q, username.value, groupnameDest)
} else if (cmd === shared_consts.GROUPSCMD.REQGROUP) {
tools.setRequestGroup($q, username.value, groupnameDest, value)
} else if (cmd === shared_consts.GROUPSCMD.CANCEL_REQ_GROUP) {
tools.cancelReqGroups($q, username.value, groupnameDest)
}
}
function mounted() {
username.value = userStore.my.username
loadGroups()
}
function updateValue(val: number) {
emit('update:modelValue', val)
}
onMounted(mounted)
return {
tools,
costanti,
shared_consts,
filtroutente,
listgroupsfiltered,
setCmd,
updateValue,
myoptions,
}
}
})

View File

@@ -0,0 +1,53 @@
<template>
<div v-if="finder" class="q-gutter-sm q-pa-sm q-pb-sm">
<q-btn-toggle
:model-value="modelValue"
@update:model-value="updateValue"
class="my-custom-toggle"
no-caps
rounded
unelevated
push
toggle-color="primary"
color="white"
text-color="primary"
:options="myoptions"
/>
</div>
<div v-if="finder" class="">
<div v-if="modelValue === costanti.FIND_GROUP">
<slot></slot>
</div>
<div v-else>
<q-list>
<span v-for="(grp, index) in listgroupsfiltered" :key="index" class="q-my-sm" clickable>
<CMyGroup
:mygrp="grp"
@setCmd="setCmd"
:visu="modelValue">
</CMyGroup>
</span>
</q-list>
</div>
</div>
<div v-else>
<q-list class="width-container">
<span class="q-my-sm" clickable>
<CMyGroup
:mygrp="mygrp"
@setCmd="setCmd"
:visu="visu">
</CMyGroup>
</span>
</q-list>
</div>
</template>
<script lang="ts" src="./CMyGroups.ts">
</script>
<style lang="scss" scoped>
@import './CMyGroups';
</style>

View File

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

View File

@@ -399,9 +399,6 @@
</div>
<div v-else-if="col.fieldtype === costanti.FieldType.html">
<div v-if="isInModif">
<div v-if="insertMode">
</div>
<p v-if="isInModif" class="text-center">
{{ $t('event.testo_di_spiegazione') }}:
</p>
@@ -692,7 +689,17 @@
</q-input>
</div>
</q-popup-edit>
<div v-else-if="col.fieldtype === costanti.FieldType.html">
<div v-if="!isFieldDb()">
<CMyEditor
v-model:value="myvalue" :title="!isInModif ? getTitleEditor(col, row) : ''" @keyup.enter.stop
:showButtons="false"
:canModify="canModify"
@update:value="changevalRec"
@showandsave="Savedb">
</CMyEditor>
</div>
</div> </q-popup-edit>
</div>
</div>
</div>

View File

@@ -37,4 +37,5 @@ export * from './CVerifyEmail'
export * from './CMyUser'
export * from './CVerifyTelegram'
export * from './CMyFriends'
export * from './CMyGroups'
// export * from './CPreloadImages'

View File

@@ -1,8 +1,8 @@
const msg_website_enUs = {
ws: {
sitename: 'Comunità Nuovo Mondo',
siteshortname: 'CNM',
botname: 'CNM BOT',
sitename: 'InsiemeSuPuò',
siteshortname: 'InsiemeSuPuò',
botname: 'InsiemeSuPuò BOT',
},
pages: {
home: 'Home',

View File

@@ -1,8 +1,8 @@
const msg_website_es = {
ws: {
sitename: 'AYNI',
siteshortname: 'Ayni',
botname: 'AYNI BOT',
sitename: 'InsiemeSuPuò',
siteshortname: 'InsiemeSuPuò',
botname: 'InsiemeSuPuò BOT',
},
pages: {
home: 'Home',

View File

@@ -1,8 +1,8 @@
const msg_website_fr = {
ws: {
sitename: 'AYNI',
siteshortname: 'Ayni',
botname: 'AYNI BOT',
sitename: 'InsiemeSuPuò',
siteshortname: 'InsiemeSuPuò',
botname: 'InsiemeSuPuò BOT',
},
homepage: {
titlecontatti: 'CONTACTS',

View File

@@ -1,8 +1,8 @@
const msg_website_it = {
ws: {
sitename: 'PopoloDelNuovoMondo',
siteshortname: 'PDNM',
botname: 'il Bot di PdNM',
sitename: 'InsiemeSuPuò',
siteshortname: 'InsiemeSuPuò',
botname: 'il Bot di InsiemeSuPuò',
},
products: {
quantity: 'Quantità',
@@ -128,8 +128,8 @@ const msg_website_it = {
color: 'Colore',
},
msg: {
myAppName: 'FreePlanet',
myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito e senza Pubblicità',
myAppName: 'InsiemeSiPuò',
myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito',
underconstruction: 'App in costruzione...',
myDescriz: '',
sottoTitoloApp: 'Il primo Vero Social',

View File

@@ -1,8 +1,8 @@
const msg_website_pt = {
ws: {
sitename: 'CNM',
siteshortname: 'CNM',
botname: 'CNM BOT',
sitename: 'InsiemeSuPuò',
siteshortname: 'InsiemeSuPuò',
botname: 'InsiemeSuPuò BOT',
},
pages: {
home: 'Home',

View File

@@ -1,8 +1,8 @@
const msg_website_si = {
ws: {
sitename: 'AYNI',
siteshortname: 'Ayni',
botname: 'AYNI BOT',
sitename: 'InsiemeSuPuò',
siteshortname: 'InsiemeSuPuò',
botname: 'InsiemeSuPuò BOT',
},
pages: {
home: 'Domača stran',

View File

@@ -373,7 +373,7 @@ const baseroutes: IListRoutes[] = [
path: '/',
materialIcon: 'home',
name: 'pages.home',
component: () => import('@src/root/home_pdnm/home_pdnm.vue'),
component: () => import('@src/root/home_insiemesipuo/home_insiemesipuo.vue'),
reqauth: false,
inmenu: true,
infooter: true,
@@ -422,6 +422,17 @@ const baseroutes: IListRoutes[] = [
inmenu: true,
infooter: true,
},
{
active: true,
order: 132,
path: '/groups',
materialIcon: 'fas fa-users',
name: 'mypages.groups',
component: () => import('@/views/user/mygroups/mygroups.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 135,
@@ -433,6 +444,17 @@ const baseroutes: IListRoutes[] = [
inmenu: false,
infooter: false,
},
{
active: true,
order: 136,
path: '/grp/:groupname',
materialIcon: 'fas fa-user',
name: 'proj.group2',
component: () => import('@/views/user/mygroup/mygroup.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 130,
@@ -559,7 +581,7 @@ const baseroutes: IListRoutes[] = [
isseparator: true,
inmenu: true,
},
/*{
{
active: true,
order: 80,
path: '/calendario-eventi',
@@ -569,7 +591,7 @@ const baseroutes: IListRoutes[] = [
extraclass: 'isCalendar',
inmenu: true,
infooter: true
},*/
},
{
active: true,
order: 1000,

View File

@@ -1,5 +1,6 @@
import { IToken } from '@model/other'
import { ICart, IOrderCart, IShareWithUs } from '@src/model/Products'
import { IGallery } from '@model/GlobalStore'
const enum ESexType {
None = 0,
@@ -8,10 +9,26 @@ const enum ESexType {
}
export interface IFriends {
username?: string
username: string
date?: Date
}
export interface IMyGroup {
groupname: string
title?: string
descr?: string
photos: IGallery[]
visibility?: number
date_created?: Date
admins?: IFriends[]
req_users?: IFriends[]
blocked?: boolean
website?: string
link_telegram?: string
username_who_block?: string
date_blocked?: Date
}
export interface IUserProfile {
img?: string
nationality?: string
@@ -52,9 +69,11 @@ export interface IUserProfile {
myshares: IShareWithUs[]
friends: IFriends[]
req_friends: IFriends[]
groups: IMyGroup[]
// in memory
asked_friends: any[]
asked_groups: any[]
}
export interface IPaymentType {

View File

@@ -22,17 +22,20 @@
</CVerifyTelegram>
<div v-if="isUserOk()">
<div v-if="isUserOk()">
<q-banner rounded class="bg-primary text-white">
<div class="text-h6 text-center">
Ora Accedi al Bot Telegram <br>
per vedere tutti i Menu e le chat !
</div>
<template v-slot:action>
<q-btn icon="fab fa-telegram" flat color="white" label="Accedi al Bot Telegram" type="a" target="__blank" :href="getLinkBotTelegram()"/>
</template>
</q-banner>
</div>
<CFinder>
</CFinder>
<q-banner rounded class="bg-primary text-white">
<div class="text-h6 text-center">
Ora Accedi al Bot Telegram <br>
per vedere tutti i Menu e le chat !
</div>
<template v-slot:action>
<q-btn icon="fab fa-telegram" flat color="white" label="Accedi al Bot Telegram" type="a" target="__blank" :href="getLinkBotTelegram()"/>
</template>
</q-banner>
</div>
</div>

View File

@@ -23,6 +23,12 @@
<div v-if="isUserOk()">
<div v-if="isUserOk()">
<CFinder>
</CFinder>
<q-banner rounded class="bg-primary text-white">
<div class="text-h6 text-center">
Ora Accedi al Bot Telegram <br>

View File

@@ -461,7 +461,7 @@ const msg_enUs = {
titlegranted: 'Notification Permission Granted!',
statusnot: 'status Notification',
titledenied: 'Notification Permission Denied!',
title_subscribed: 'Subscribed to FreePlanet.app!',
title_subscribed: 'Subscribed to the App!',
subscribed: 'You can now receive Notification and Messages.',
newVersionAvailable: 'Upgrade',
},

View File

@@ -31,6 +31,7 @@ const msg_it = {
product: 'Prodotto',
sito_offline: 'Sito in Aggiornamento',
modifprof: 'Modifica Profilo',
modifgrp: 'Modifica Gruppo',
biografia: 'Biografia',
qualifica: 'Qualifica (in breve)',
update: 'Aggiornamento in Corso...',
@@ -182,19 +183,29 @@ const msg_it = {
friendsadded: 'Aggiunto alla lista di Amici',
domanda_removefriend: 'Rimuovi dagli Amici {username}?',
removedfriend: 'Rimosso dalla lista di Amici',
removedgroup: 'Rimosso dal Gruppo',
domanda_addtofriend: 'Aggiungere agli amici {username}?',
domanda_addtogroup: 'Aggiungi {username} al gruppo {groupname}?',
addedfriend: 'Aggiunto alla lista di Amici',
addedgroup: 'Aggiunto al Gruppo',
domanda_trusted: 'Accettare la Fiducia a {username}?',
trusted: 'Accettato la Fiducia',
domanda_ask_friend: 'Chiedere l\'Amicizia a {username}?',
domanda_ask_group: 'Chiedere l\'invito al Gruppo {groupname}?',
askedtofriend: 'Chiesto l\'Amicizia a {username}',
askedtogroup: 'Chiesto l\'invito al Gruppo {groupname}',
domanda_revoke_friend: 'Revocare la richiesta di Amicizia a {username}?',
domanda_revoke_group: 'Revocare la richiesta al gruppo {groupname}?',
revoketofriend: 'Revocato la richiesta di Amicizia a {username}',
revoketogroup: 'Revocato la richiesta d\'invito al gruppo {groupname}',
domanda_cancel_req_friend: 'Annullare la richiesta di Amicizia a {username}?',
domanda_cancel_req_group: 'Annullare la richiesta d\'invito al gruppo {groupname}?',
cancel_req_friend: 'Annullata la richiesta di Amicizia a {username}',
cancel_req_group: 'Annullata la richiesta al gruppo {groupname}',
domanda_rejectedtrust: 'Rifiutare la Fiducia a {username}?',
rejected: 'Rifiutato la Fiducia',
domanda_blockuser: 'Bloccare {username}?',
domanda_blockgroup: 'Bloccare il gruppo {groupname}?',
blockedfriend: 'Utente Bloccato',
domanda: 'Domanda',
},
@@ -409,6 +420,7 @@ const msg_it = {
note_payment: 'Note Aggiuntive',
country_pay: 'Paese di Destinazione Pagamenti',
username_telegram: 'Username Telegram',
groupname: 'Codice Gruppo',
firstname_telegram: 'Nome Telegram',
lastname_telegram: 'Cognome Telegram',
telegram: 'Chat Telegram \'{botname}\'',
@@ -618,6 +630,7 @@ const msg_it = {
themecolor: 'Tema Colore',
themebgcolor: 'Tema Colore Sfondo',
group: 'Gruppo',
group2: 'Gruppo2',
respUsername: 'Responsabile',
viceRespUsername: 'Vice Responsabile',
vice2RespUsername: 'Vice 2 Responsabile',
@@ -683,7 +696,7 @@ const msg_it = {
showlastschedule: 'Vedi tutto il Calendario',
},
msgs: {
telegrammsg: 'Msg Telegram',
telegrammsg: 'Telegram',
message: 'Messaggio',
messages: 'Messaggi',
nomessage: 'Nessun Messaggio',
@@ -846,7 +859,11 @@ const msg_it = {
},
mypages: {
find_people: 'Cerca Persone',
find_group: 'Cerca Gruppo',
my_groups: 'Miei Gruppi',
create_group: 'Crea Gruppo',
friends: 'Amici',
groups: 'Gruppi',
request_friends: 'Rich. Amicizia',
request_sent_friends: 'Rich. Inviate',
request_trust: 'Rich. Fiducia',
@@ -864,6 +881,15 @@ const msg_it = {
cancel_ask_friend: 'Annulla la richiesta di Amicizia',
cancel_ask_friend_short: 'Annulla richiesta',
reject_ask_friend: 'Rifiuta la richiesta di Amicizia',
},
groups: {
admins: 'Amministratori',
ask_group: 'Chiedi di entrare nel Gruppo',
accept_group: 'Accetta la richiesta per entrare',
remove_from_mygroups: 'Rimuovi dai tuoi Gruppi',
block_group: 'Blocca Gruppo',
cancel_ask_group: 'Annulla la richiesta',
cancel_ask_group_short: 'Annulla richiesta',
}
},

View File

@@ -474,7 +474,7 @@ const msg_pt = {
titlegranted: 'Permesso Notifiche Abilitato!',
statusnot: 'Stato Notifiche',
titledenied: 'Permesso Notifiche Disabilitato!',
title_subscribed: 'Sottoscrizione a FreePlanet.app!',
title_subscribed: 'Sottoscrizione alla App!',
subscribed: 'Ora potrai ricevere i messaggi e le notifiche.',
newVersionAvailable: 'Aggiorna',
},

View File

@@ -9,6 +9,10 @@ export const costanti = {
CONFIG_ID_SHOW_TYPE_TODOS: '3',
SHOW_USERINFO: 1,
SHOW_GROUPINFO: 5,
VISUTABLE_SCHEDA_USER: -1,
VISUTABLE_SCHEDA_GROUP: -3,
DIR_UPLOAD: 'upload/', // upload/
@@ -20,7 +24,17 @@ export const costanti = {
ASK_SENT_FRIENDS: 6,
FIND_PEOPLE: 10,
GROUPS: 11,
GRP_REJECTED: 14,
REQ_GROUP: 15,
ASK_SENT_GROUP: 16,
FIND_GROUP: 20,
MY_GROUPS: 21,
CREATE_GROUP: 30,
FILTER_TUTTI: -100,
TABLES_ARRAY: ['mygroups'],
TABLES_USERNAME_DATE: ['friends', 'friendsandme'],
FuncDialog: {
CANCEL_BOOKING: 1,

View File

@@ -368,6 +368,18 @@ export const colTablePhones = [
AddCol({ name: 'flag', label_trans: 'city.flag' }),
]
export const colTableUsersGeneric = [
AddCol({ name: 'username', label_trans: 'reg.username_short' }),
AddCol({ name: 'date', label_trans: 'reg.date', fieldtype: costanti.FieldType.onlydate,
showWhen: costanti.showWhen.InPage + costanti.showWhen.InView_OnlyifExist }),
]
export const colTableMyGroup = [
AddCol({ name: 'groupname', label_trans: 'reg.groupname' }),
AddCol({ name: 'date', label_trans: 'reg.date', fieldtype: costanti.FieldType.onlydate,
showWhen: costanti.showWhen.InPage + costanti.showWhen.InView_OnlyifExist }),
]
export const colSkills = [
// AddCol({ name: '_id', label_trans: 'index', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'descr', label_trans: 'store.description' }),
@@ -408,11 +420,54 @@ export const colmyUserPeople = [
AddCol({ name: 'name', label_trans: 'reg.name' }),
AddCol({
name: 'profile.img', field: 'profile', subfield: 'img', label_trans: 'reg.img', sortable: false,
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
}),
// AddCol({ name: 'sospeso', label_trans: 'reg.sospeso', fieldtype: costanti.FieldType.boolean }),
// AddCol({ name: 'deleted', label_trans: 'reg.deleted', fieldtype: costanti.FieldType.boolean }),
]
export const colmyUserGroup = [
// AddCol({ name: '_id', label_trans: 'reg.id' }),
AddCol({ name: 'groupname', label_trans: 'reg.groupname', required: true }),
AddCol({ name: 'title', label_trans: 'reg.name', required: true }),
AddCol({
name: 'idSector',
label_trans: 'sectors.name',
fieldtype: costanti.FieldType.select,
required: true,
jointable: 'sectors',
visible: true,
icon: 'category',
}),
AddCol({ name: 'descr', label_trans: 'proj.longdescr', required: true }),
AddCol({ name: 'visibility', label_trans: 'bot.visibility', fieldtype: costanti.FieldType.select, jointable: 'visibilGroup', required: true }),
AddCol({
name: 'admins',
label_trans: 'groups.admins',
fieldtype: costanti.FieldType.multiselect,
jointable: 'friendsandme',
}),
AddCol({
name: 'photos',
label_trans: 'skill.photos',
fieldtype: costanti.FieldType.listimages,
jointable: '',
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
}),
AddCol({
name: 'idCity',
label_trans: 'skill.city',
fieldtype: costanti.FieldType.multiselect_by_server,
jointable: 'cities',
tablesel: 'cities',
noshowlabel: true,
icon: 'fas fa-map-marker-alt',
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView,
}),
AddCol({ name: 'date_created', label_trans: 'reg.date_created', fieldtype: costanti.FieldType.onlydate,
showWhen: costanti.showWhen.InPage + costanti.showWhen.InView_OnlyifExist }),
]
export const colmySkills = [
@@ -807,6 +862,11 @@ const colTablePermission = [
AddCol(DuplicateRec),
]
const colTableGeneric = [
AddCol({ name: 'value', label_trans: 'others.value' }),
AddCol({ name: 'label', label_trans: 'proj.longdescr' }),
]
const colTableOperator = [
AddCol({ name: 'username', label_trans: 'reg.username_short' }),
AddCol({ name: 'name', label_trans: 'reg.name' }),
@@ -1502,6 +1562,7 @@ export const fieldsTable = {
}),
AddCol({
name: 'profile.img', field: 'profile', subfield: 'img', label_trans: 'reg.img', sortable: false,
showWhen: costanti.showWhen.NewRec + costanti.showWhen.InPage + costanti.showWhen.InEdit + costanti.showWhen.InView_OnlyifExist,
}),
AddCol({ name: 'date_reg', label_trans: 'reg.date_reg', fieldtype: costanti.FieldType.date }),
AddCol({ name: 'lasttimeonline', label_trans: 'reg.lasttimeonline', fieldtype: costanti.FieldType.date }),
@@ -1765,13 +1826,21 @@ export const fieldsTable = {
},
{
value: 'visibility',
label: 'Visibilità',
label: 'Visibilità Permessi',
columns: colTablePermission,
colkey: 'value',
collabel: 'label',
colicon: 'icon',
noshow: true,
},
{
value: 'visibilGroup',
label: 'Visibilità',
columns: colTableGeneric,
colkey: 'value',
collabel: 'label',
noshow: true,
},
{
value: 'lang',
label: 'Lingua',
@@ -1893,6 +1962,27 @@ export const fieldsTable = {
collabel: 'value',
remote: true,
},
{
value: 'friends',
label: 'Amici',
columns: colTableUsersGeneric,
colkey: 'username',
collabel: 'username',
},
{
value: 'friendsandme',
label: 'Amici',
columns: colTableUsersGeneric,
colkey: 'username',
collabel: 'username',
},
{
value: 'mygroups',
label: 'Gruppi',
columns: colTableMyGroup,
colkey: 'groupname',
collabel: 'groupname',
},
],
}

View File

@@ -3,7 +3,7 @@ import {
IColGridTable,
IColl,
ICollaborations, IDataToSet,
IEvents, IFriends,
IEvents, IFriends, IMyGroup,
IListRoutes,
IParamDialog,
IPathFile,
@@ -56,6 +56,7 @@ export const tools = {
COOK_SEARCH: 'SEARCH_',
FRIENDS_SEARCH: 'FR_SE',
GROUP_SEARCH: 'GR_SE',
getprefCountries: ['it', 'es', 'us'],
@@ -4422,6 +4423,26 @@ export const tools = {
})
})
},
addToMyGroups($q: any, username: string, groupnameDest: string) {
const userStore = useUserStore()
$q.dialog({
message: t('db.domanda_addtogroup', { username, groupname: groupnameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setGroupsCmd($q, t, username, groupnameDest, shared_consts.GROUPSCMD.SETGROUP, null)
.then((res: any) => {
if (res) {
userStore.my.profile.groups = [...userStore.my.profile.groups, res]
tools.showPositiveNotif($q, t('db.addedgroup'))
}
})
})
},
setRequestFriendship($q: any, username: string, usernameDest: string, value: boolean) {
const userStore = useUserStore()
@@ -4464,6 +4485,48 @@ export const tools = {
})
})
},
setRequestGroup($q: any, username: string, groupnameDest: string, value: boolean) {
const userStore = useUserStore()
let msg = ''
if (value) {
msg = t('db.domanda_ask_group', { groupname: groupnameDest })
} else {
msg = t('db.domanda_revoke_group', { groupname: groupnameDest })
}
$q.dialog({
message: msg,
ok: {
label: t('dialog.yes'),
push: true
},
cancel: {
label: t('dialog.cancel')
},
title: t('db.domanda')
}).onOk(() => {
userStore.setGroupsCmd($q, t, username, groupnameDest, shared_consts.GROUPSCMD.REQGROUP, value)
.then((res: any) => {
if (res) {
if (value) {
// ADD to req Friends
userStore.my.profile.asked_groups.push(res)
tools.showPositiveNotif($q, t('db.askedtogroup', { groupname: groupnameDest }))
} else {
// REMOVE to req Friends
userStore.my.profile.asked_groups = userStore.my.profile.asked_groups.filter((rec: IMyGroup) => rec.groupname !== groupnameDest)
tools.showPositiveNotif($q, t('db.revoketogroup', { groupname: groupnameDest }))
}
} else {
tools.showNegativeNotif($q, t('db.recfailed'))
}
})
})
},
cancelReqFriends($q: any, username: string, usernameDest: string) {
const userStore = useUserStore()
$q.dialog({
@@ -4480,6 +4543,23 @@ export const tools = {
}
})
})
},
cancelReqGroups($q: any, username: string, groupnameDest: string) {
const userStore = useUserStore()
$q.dialog({
message: t('db.domanda_cancel_req_group', { groupname: groupnameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')
}).onOk(() => {
userStore.setGroupsCmd($q, t, username, groupnameDest, shared_consts.GROUPSCMD.CANCEL_REQ_GROUP, null).then((res) => {
if (res) {
userStore.my.profile.asked_groups = userStore.my.profile.asked_groups.filter((rec: IMyGroup) => rec.groupname !== groupnameDest)
tools.showPositiveNotif($q, t('db.cancel_req_group'))
}
})
})
},
CSVToArray(strData: any, strDelimiter: string) {
// Check to see if the delimiter is defined. If not,

View File

@@ -58,6 +58,8 @@ export const func_tools = {
export const toolsext = {
TABUSER: 'users',
TABFRIENDS: 'friends',
TABMYGROUPS: 'mygroups',
TABNAVI: 'navi',
TABLISTAINGRESSO: 'listaingressos',
TABGRADUATORIA: 'graduatorias',
@@ -65,10 +67,10 @@ export const toolsext = {
TABNEWSLETTER: 'newstosent',
TABGALLERY: 'gallery',
TABMAILINGLIST: 'mailinglist',
TABGROUPS: 'groups',
TABMYPAGE: 'mypage',
TABMYBOT: 'mybots',
TABCALZOOM: 'calzoom',
TABGROUPS: 'groups',
TABTEMPLEMAIL: 'templemail',
TABOPZEMAIL: 'opzemail',
TABSHAREWITHUS: 'sharewithus',

View File

@@ -23,6 +23,7 @@ import { Router } from 'vue-router'
import { useProjectStore } from '@store/Projects'
import { shared_consts } from '@/common/shared_vuejs'
import { costanti } from '@costanti'
import { IMyGroup } from '@model/UserStore'
export const DefaultUser: IUserFields = {
_id: '',
@@ -49,7 +50,9 @@ export const DefaultUser: IUserFields = {
myshares: [],
friends: [],
req_friends: [],
groups: [],
asked_friends: [],
asked_groups: [],
},
cart: {
userId: '',
@@ -91,12 +94,15 @@ export const DefaultProfile: IUserProfile = {
myshares: [],
friends: [],
req_friends: [],
groups: [],
asked_friends: [],
asked_groups: [],
}
export const useUserStore = defineStore('UserStore', {
state: () => ({
my: { ...DefaultUser },
groups: [],
lang: process.env.LANG_DEFAULT ? process.env.LANG_DEFAULT : 'it',
repeatPassword: '',
categorySel: 'personal',
@@ -170,6 +176,13 @@ export const useUserStore = defineStore('UserStore', {
return false
},
IsMyGroupByGroupname(groupname: string): boolean {
if (this.my.profile.friends)
return this.my.profile.groups.findIndex((rec) => rec.groupname === groupname) >= 0
else
return false
},
IsAskedFriendByUsername(username: string): boolean {
if (this.my.profile.asked_friends)
return this.my.profile.asked_friends.findIndex((rec) => rec.username === username) >= 0
@@ -177,6 +190,13 @@ export const useUserStore = defineStore('UserStore', {
return false
},
IsAskedGroupByGroupname(groupname: string): boolean {
if (this.my.profile.asked_groups)
return this.my.profile.asked_groups.findIndex((rec: IMyGroup) => rec.groupname === groupname) >= 0
else
return false
},
getUserByUsername(username: string): IUserFields | null {
// Check if is this User!
if (this.my.username === username) return this.my
@@ -210,6 +230,16 @@ export const useUserStore = defineStore('UserStore', {
return 'images/noimg.png'
},
getImgByGroup(group: IMyGroup): string {
try {
//++Todo: Sistemare!
return costanti.DIR_UPLOAD + 'groups/' + group.groupname + '/' + group.photos[0].directory
} catch (e) {
}
return 'images/noimg.png'
},
getRefLink(username: string): string {
if (username === '')
username = this.my.username
@@ -446,6 +476,7 @@ export const useUserStore = defineStore('UserStore', {
// Memory
this.my.profile.asked_friends = []
this.my.profile.asked_groups = []
}
this.isAdmin = tools.isBitActive(this.my.perm, shared_consts.Permissions.Admin.value)
@@ -825,7 +856,7 @@ export const useUserStore = defineStore('UserStore', {
verified_by_aportador,
made_gift,
perm,
profile: { img, teleg_id, myshares: [], friends: [], req_friends: [], asked_friends: [] },
profile: { img, teleg_id, myshares: [], friends: [], req_friends: [], asked_friends: [], groups: [], asked_groups: [] },
})
isLogged = true
@@ -857,6 +888,20 @@ export const useUserStore = defineStore('UserStore', {
},
async loadGroup(groupname: string) {
const data = {
groupname
}
return Api.SendReq('/mygroup/load', 'POST', data)
.then((res) => {
return res.data
}).catch((error) => {
return {}
})
},
async loadSkill(idSkill: string) {
const data = {
idSkill
@@ -881,6 +926,16 @@ export const useUserStore = defineStore('UserStore', {
},
async loadGroups(username: string) {
return Api.SendReq('/users/groups', 'POST', null)
.then((res) => {
return res.data
}).catch((error) => {
return {}
})
},
async setFriendsCmd($q: any, t: any, usernameOrig: string, usernameDest: string, cmd: number, value: any) {
return Api.SendReq('/users/friends/cmd', 'POST', { usernameOrig, usernameDest, cmd, value })
.then((res) => {
@@ -892,6 +947,17 @@ export const useUserStore = defineStore('UserStore', {
},
async setGroupsCmd($q: any, t: any, usernameOrig: string, groupnameDest: string, cmd: number, value: any) {
return Api.SendReq('/users/groups/cmd', 'POST', { usernameOrig, groupnameDest, cmd, value })
.then((res) => {
return res.data
}).catch((error) => {
tools.showNegativeNotif($q, t('db.recfailed'))
return {}
})
},
async importToServerCmd($q: any, t: any, cmd: number, data: any) {
return Api.SendReq('/admin/import', 'POST', { cmd, data })
.then((res) => {

View File

@@ -219,6 +219,12 @@ export const useGlobalStore = defineStore('GlobalStore', {
return calendarStore.bookedevent
else if (table === 'users')
return userStore.usersList
else if (table === 'friends')
return userStore.my.profile.friends
else if (table === 'friendsandme')
return [{username: userStore.my.username }, ...userStore.my.profile.friends]
else if (table === 'mygroups')
return userStore.groups
else if (table === 'sendmsgs')
return messageStore.last_msgs
else if (table === 'settings')
@@ -1356,12 +1362,22 @@ export const useGlobalStore = defineStore('GlobalStore', {
if (table === 'metodo_pagamento') return tools.SelectMetodiPagamento
if (table === 'bottype') return shared_consts.BotType
if (table === 'visibility') return shared_consts.Visibility
if (table === 'visibilGroup') return shared_consts.VisibilGroup
if (table === 'lang') return shared_consts.Lang
if (table === 'regions') return shared_consts.Regions
if (table === 'provinces') return shared_consts.Provinces
let myarr = this.getListByTable(table)
if (costanti.TABLES_ARRAY.includes(table)) {
const newarr = []
for (const value of myarr) {
newarr.push({value, label:value})
}
myarr = newarr
}
if (addall)
myarr = [costanti.FILTER_TUTTI, ...myarr]

View File

@@ -70,6 +70,19 @@
</CTitleBanner>
<CTitleBanner
class="q-pa-xs" title="Competenze e Talenti" bgcolor="bg-primary" clcolor="text-white"
myclass="myshad" :canopen="true">
<CSkill
:filtercustom="filtroutente">
</CSkill>
</CTitleBanner>
<CTitleBanner
class="q-pa-xs" title="Informazioni su di te" bgcolor="bg-primary" clcolor="text-white"
myclass="myshad" :canopen="true">
@@ -159,76 +172,64 @@
</CTitleBanner>
<CTitleBanner
class="q-pa-xs" title="Competenze e Talenti" bgcolor="bg-primary" clcolor="text-white"
myclass="myshad" :canopen="true">
<CSkill
:filtercustom="filtroutente">
</CSkill>
</CTitleBanner>
<!--
<div class="column">
<div class="myrow">
<CMyFieldDb
title="Motivazioni"
table="users"
mykey="profile"
mysubkey="motivazioni"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Competenze e Professionalità"
table="users"
mykey="profile"
mysubkey="competenze_professionalita"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Cosa potrei offrire?"
table="users"
mykey="profile"
mysubkey="cosa_offrire"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Cosa vorrei ricevere?"
table="users"
mykey="profile"
mysubkey="cosa_ricevere"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Altre Comunicazioni"
table="users"
mykey="profile"
mysubkey="altre_comunicazioni"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Come ci hai conosciuto?"
table="users"
mykey="profile"
mysubkey="come_ci_hai_conosciuto"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<!--
<div class="column">
<div class="myrow">
<CMyFieldDb
title="Motivazioni"
table="users"
mykey="profile"
mysubkey="motivazioni"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
-->
<div class="myrow">
<CMyFieldDb
title="Competenze e Professionalità"
table="users"
mykey="profile"
mysubkey="competenze_professionalita"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Cosa potrei offrire?"
table="users"
mykey="profile"
mysubkey="cosa_offrire"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Cosa vorrei ricevere?"
table="users"
mykey="profile"
mysubkey="cosa_ricevere"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Altre Comunicazioni"
table="users"
mykey="profile"
mysubkey="altre_comunicazioni"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
<div class="myrow">
<CMyFieldDb
title="Come ci hai conosciuto?"
table="users"
mykey="profile"
mysubkey="come_ci_hai_conosciuto"
:type="costanti.FieldType.string">
</CMyFieldDb>
</div>
</div>
-->
<!--
<CTitleBanner class="q-pa-xs" :title="$t('pages.payment')" bgcolor="bg-primary" clcolor="text-white"

View File

@@ -0,0 +1,18 @@
.profile {
width: 100%;
margin: 0 auto;
max-width: 450px;
}
.myrow{
display: flex;
@media (max-width: 600px) {
flex-flow: column;
}
}
.qualifica{
border: solid 2px #4198ef;
border-radius: 1rem;
padding: 5px;
}

113
src/views/user/mygroup/mygroup.ts Executable file
View File

@@ -0,0 +1,113 @@
import { CMyFieldDb } from '@/components/CMyFieldDb'
import { CTitleBanner } from '@/components/CTitleBanner'
import { CProfile } from '@/components/CProfile'
import { CSkill } from '@/components/CSkill'
import { CDateTime } from '@/components/CDateTime'
import { tools } from '@store/Modules/tools'
import { computed, defineComponent, onMounted, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore'
import { useRoute, useRouter } from 'vue-router'
import { useGlobalStore } from '@store/globalStore'
import { useI18n } from '@/boot/i18n'
import { toolsext } from '@store/Modules/toolsext'
import { useQuasar } from 'quasar'
import { costanti } from '@costanti'
import { IMyGroup, IUserFields } from 'model'
import { shared_consts } from '@/common/shared_vuejs'
export default defineComponent({
name: 'mygroup',
components: { CProfile, CTitleBanner, CMyFieldDb, CSkill, CDateTime },
props: {},
setup() {
const userStore = useUserStore()
const $route = useRoute()
const $q = useQuasar()
const { t } = useI18n()
const animation = ref('fade')
const groupname = computed(() => $route.params.groupname ? $route.params.groupname.toString() : '')
const filtroutente = ref(<any[]>[])
const showPic = ref(false)
const mygrp = ref(<IMyGroup>{})
function profile() {
return userStore.my.profile
}
function mygrpname() {
return userStore.my.username
}
function loadGroup() {
// Carica il profilo di quest'utente
if (groupname.value) {
userStore.loadGroup(groupname.value).then((ris) => {
mygrp.value = ris
// filtroutente.value = [{ userId: userStore.my._id }]
})
}
}
watch(() => groupname.value, (to: any, from: any) => {
loadGroup()
})
function mounted() {
loadGroup()
}
function getImgGrp() {
return userStore.getImgByGroup(mygrp.value)
}
function checkifShow(col: string) {
//++Todo: checkifShow Permessi !
return true
}
function getLinkGrpTelegram() {
if (!!mygrp.value.link_telegram) {
return 'https://t.me/' + mygrp.value.link_telegram
}
}
function getLinkWebSite() {
let site = mygrp.value.website!
if (site) {
if (!site.startsWith('http')) {
site = 'https://' + site
}
}
return site
}
onMounted(mounted)
return {
groupname,
profile,
tools,
costanti,
mygrp,
shared_consts,
getImgGrp,
checkifShow,
getLinkGrpTelegram,
getLinkWebSite,
filtroutente,
showPic,
mygrpname,
userStore,
t,
animation,
}
}
})

View File

@@ -0,0 +1,114 @@
<template>
<div class="q-gutter-sm q-pa-sm q-pb-md">
<div v-if="mygrp.descr" class="fit column no-wrap justify-evenly items-center content-start">
<div class="">
<q-avatar size="140px">
<q-img :src="getImgGrp()" :alt="username" img-class="imgprofile" height="140px" @click="showPic = true"/>
</q-avatar>
</div>
<div class="text-h6">
<span v-if="checkifShow('name')"> {{ mygrp.title }}</span>
</div>
<div class="col-12 text-h7 text-blue text-shadow-2">
{{ mygrp.groupname }}
</div>
<div class="col-12 text-h7">
<span v-if="checkifShow('descr')">{{ mygrp.descr }}</span>
</div>
<div v-if="mygrp.admins && !mygrp.admins.includes(userStore.my.username)">
<q-btn
v-if="!userStore.IsMyGroupByGroupname(mygrp.groupname) && !userStore.IsAskedGroupByGroupname(mygrp.groupname)"
icon="fas fa-user-plus"
color="primary" :label="$t('groups.ask_group')"
@click="tools.setRequestGroup($q, userStore.my.username, mygrp.groupname, true)"
/>
<q-btn
v-if="userStore.IsAskedGroupByGroupname(mygrp.groupname) && !userStore.IsMyGroupByGroupname(mygrp.groupname)"
icon="fas fa-user-minus"
flat :label="$t('groups.cancel_ask_group_short')"
@click="tools.cancelReqGroups($q, userStore.my.username, mygrp.groupname)"
/>
</div>
<div v-if="mygrp.title">
<br>
</div>
<q-btn
v-if="mygrp.admins.includes(userStore.my.username)" icon="fas fa-pencil-alt"
color="blue"
size="md"
:label="$t('otherpages.modifgrp')"
to="/editgrp">
</q-btn>
<div v-if="mygrp.title" class="myrow justify-evenly items-center q-pa-sm q-ma-sm">
<div class="col-6 q-ma-xs">
<q-btn
v-if="getLinkGrpTelegram()" icon="fab fa-telegram"
color="blue" type="a"
size="md"
rounded
:label="$t('msgs.telegrammsg')"
:href="getLinkGrpTelegram()" target="__blank">
</q-btn>
</div>
<div class="col-6 q-ma-xs">
<q-btn
v-if="getLinkWebSite()" icon="fas fa-globe"
color="blue" type="a"
size="md"
rounded
:label="$t('reg.website')"
:href="getLinkWebSite()" target="__blank">
</q-btn>
</div>
</div>
</div>
<div v-else class="fit column no-wrap justify-evenly items-center content-start">
<q-skeleton type="QAvatar" size="140px" height="140px" animation="fade"/>
<q-card flat bordered style="width: 250px">
<div class="text-h6">
<q-skeleton :animation="animation"/>
</div>
<div class="col-12 text-h7 text-grey text-center">
{{ groupname }}
</div>
<div class="col-12 text-h7">
<q-skeleton :animation="animation"/>
</div>
<div class="col-12 text-h8 q-mt-sm">
<q-skeleton :animation="animation"/>
</div>
<div class="col-12 text-h8 q-mt-sm">
<q-skeleton :animation="animation"/>
</div>
</q-card>
</div>
</div>
<q-dialog
v-model="showPic"
full-height full-width
>
<img :src="getImgGrp()" :alt="groupname" class="full-width">
</q-dialog>
</template>
<script lang="ts" src="./mygroup.ts">
</script>
<style lang="scss" scoped>
@import './mygroup.scss';
</style>

View File

View File

@@ -0,0 +1,105 @@
import { CMyGroups } from '@/components/CMyGroups'
import { CGridTableRec } from '@/components/CGridTableRec'
import { tools } from '@store/Modules/tools'
import { computed, defineComponent, onMounted, ref, watch } from 'vue'
import { useUserStore } from '@store/UserStore'
import { useRoute, useRouter } from 'vue-router'
import { useGlobalStore } from '@store/globalStore'
import { useI18n } from '@/boot/i18n'
import { colmyUserGroup } from '@store/Modules/fieldsTable'
import { ISearchList } from 'model'
import { costanti } from '@costanti'
import { shared_consts } from '@/common/shared_vuejs'
export default defineComponent({
name: 'mygroups',
components: { CMyGroups, CGridTableRec },
props: {},
setup() {
const userStore = useUserStore()
const $route = useRoute()
const { t } = useI18n()
const arrfilterand: any = ref([])
const filtercustom: any = ref([])
const searchList = ref(<ISearchList[]>[])
const filter = ref(costanti.FIND_GROUP)
function mounted() {
searchList.value = []
filtercustom.value = []
arrfilterand.value = []
const filt_loaded = tools.getCookie(tools.COOK_SEARCH + tools.GROUP_SEARCH)
filter.value = filt_loaded ? filt_loaded : costanti.FIND_GROUP
}
watch(() => filter.value, (newval: any, oldval) => {
tools.setCookie(tools.COOK_SEARCH + tools.GROUP_SEARCH, newval)
})
function extraparams() {
let lk_tab = 'mygroups'
let lk_LF = 'userId'
let lk_FF = '_id'
let lk_as = 'group'
let af_objId_tab = 'myId'
return {
lookup1: {
lk_tab,
lk_LF,
lk_FF,
lk_as,
af_objId_tab,
lk_proj: {
groupname: 1,
title: 1,
descr: 1,
img: 1,
visibility: 1,
admins: 1,
idSector: 1,
photos: 1,
idCity: 1,
comune: 1,
}
},
lookup2: {
lk_tab: 'cities',
lk_LF: 'idCity',
lk_FF: '_id',
lk_as: 'comune',
lk_proj: {
groupname: 1,
title: 1,
descr: 1,
img: 1,
idSector: 1,
visibility: 1,
admins: 1,
photos: 1,
idCity: 1,
comune: 1,
}
}
}
}
onMounted(mounted)
return {
filter,
costanti,
shared_consts,
arrfilterand,
filtercustom,
searchList,
colmyUserGroup,
extraparams,
}
}
})

View File

@@ -0,0 +1,46 @@
<template>
<div class="">
<CMyGroups
v-model="filter"
:finder="true"
>
<CGridTableRec
prop_mytable="mygroups"
prop_mytitle=""
:prop_mycolumns="colmyUserGroup"
prop_colkey="_id"
col_title="groupname"
:vertical="true"
nodataLabel=" "
:prop_search="true"
hint="nome del gruppo da trovare"
:finder="true"
:choose_visutype="true"
:finder_noNull="false"
:options="shared_consts.OPTIONS_SEARCH_ONLY_FULL_WORDS"
:butt_modif_new="true"
noresultLabel="nome del gruppo non trovato"
:arrfilters="arrfilterand"
:filtercustom="filtercustom"
:prop_searchList="searchList"
:showType="costanti.SHOW_GROUPINFO"
keyMain=""
:showCol="false"
:extraparams="extraparams()">
</CGridTableRec>
</CMyGroups>
<div v-if="filter === costanti.CREATE_GROUP">
Nuovo Gruppo:
</div>
</div>
</template>
<script lang="ts" src="./mygroups.ts">
</script>
<style lang="scss" scoped>
@import './mygroups.scss';
</style>

View File

@@ -17,7 +17,7 @@ import { shared_consts } from '@/common/shared_vuejs'
export default defineComponent({
name: 'myuser',
name: 'myprofile',
components: { CProfile, CTitleBanner, CMyFieldDb, CSkill, CDateTime },
props: {},
setup() {

View File

@@ -102,6 +102,21 @@
</q-card>
</div>
<CTitleBanner
class="" title="Competenze e Talenti" bgcolor="bg-positive" clcolor="text-white"
myclass="myshad" :canopen="true">
<CSkill
:filtercustom="filtroutente"
:butt_modif_new="false"
>
</CSkill>
</CTitleBanner>
<div v-if="myuser.name">
<CTitleBanner
class="" :title="$t('dashboard.info')" bgcolor="bg-primary" clcolor="text-white"
@@ -124,20 +139,6 @@
</CTitleBanner>
</div>
<CTitleBanner
class="" title="Competenze e Talenti" bgcolor="bg-positive" clcolor="text-white"
myclass="myshad" :canopen="true">
<CSkill
:filtercustom="filtroutente"
:butt_modif_new="false"
>
</CSkill>
</CTitleBanner>
</div>
<q-dialog

View File

@@ -6881,9 +6881,9 @@ is-absolute-url@^3.0.3:
resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
is-accessor-descriptor@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
is-accessor-descriptor@^0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.7.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
dependencies:
kind-of "^3.0.2"
@@ -6983,11 +6983,11 @@ is-date-object@^1.0.1:
has-tostringtag "^1.0.0"
is-descriptor@^0.1.0:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
version "0.1.7"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
dependencies:
is-accessor-descriptor "^0.1.6"
is-accessor-descriptor "^0.1.7"
is-data-descriptor "^0.1.4"
kind-of "^5.0.0"