- aggiunto il Comune di Residenza alla REgistrazione e al Tutorial

This commit is contained in:
Surya Paolo
2025-11-27 00:48:53 +01:00
parent 145327a6ca
commit 05bf8ad495
25 changed files with 392 additions and 194 deletions

View File

@@ -236,6 +236,7 @@ export const shared_consts = {
FILTER_SENZA_NOTE: 1073741824, FILTER_SENZA_NOTE: 1073741824,
FILTER_DA_CONTATTARE: 2147483648, FILTER_DA_CONTATTARE: 2147483648,
FILTER_FACILITATORE: 4294967296, FILTER_FACILITATORE: 4294967296,
FILTER_USER_COMUNE: 8589934592,
OPTIONS_SEARCH_ONLY_FULL_WORDS: 1, OPTIONS_SEARCH_ONLY_FULL_WORDS: 1,
OPTIONS_SEARCH_USER_ONLY_FULL_WORDS: 2, OPTIONS_SEARCH_USER_ONLY_FULL_WORDS: 2,

View File

@@ -1163,6 +1163,10 @@ export default defineComponent({
filtercustom.push({ filtercustom.push({
'profile.resid_province': { $exists: true, $ne: '' }, 'profile.resid_province': { $exists: true, $ne: '' },
}); });
} else if (myitemsingle === shared_consts.FILTER_USER_COMUNE) {
filtercustom.push({
'profile.resid_str_comune': { $exists: true, $ne: '' },
});
} else if (myitemsingle === shared_consts.FILTER_USER_TELEGRAM_BLOCKED) { } else if (myitemsingle === shared_consts.FILTER_USER_TELEGRAM_BLOCKED) {
filtercustom.push({ 'profile.teleg_id_old': { $gt: 1 } }); filtercustom.push({ 'profile.teleg_id_old': { $gt: 1 } });
} else if (myitemsingle === shared_consts.FILTER_NOTE) { } else if (myitemsingle === shared_consts.FILTER_NOTE) {

View File

@@ -629,6 +629,7 @@
v-else v-else
:table="tablesel" :table="tablesel"
:prop_myrec="row" :prop_myrec="row"
:index-row="indexrow"
@cmdext="cmdExt" @cmdext="cmdExt"
:editOn="editOn" :editOn="editOn"
:margin_right="margin_right" :margin_right="margin_right"

View File

@@ -563,12 +563,10 @@ $gradient-hover: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118,
} }
.q-btn { .q-btn {
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(8px); backdrop-filter: blur(8px);
transition: all $transition-speed ease; transition: all $transition-speed ease;
&:hover { &:hover {
background: rgba(0, 0, 0, 0.7);
transform: scale(1.1) rotate(90deg); transform: scale(1.1) rotate(90deg);
} }
} }
@@ -707,6 +705,14 @@ $gradient-hover: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118,
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
} }
// Mantieni i colori Quasar per i chip colorati
&.text-white,
&.q-chip--colored {
:deep(.q-chip__content) {
color: inherit;
}
}
} }
// ======================================== // ========================================

View File

@@ -511,7 +511,7 @@
text-color="white" text-color="white"
dense dense
> >
<span class="cal__quota-content">{{ <span>{{
getSectorByRec(myrec)[0].descr getSectorByRec(myrec)[0].descr
}}</span> }}</span>
</q-chip> </q-chip>
@@ -526,7 +526,7 @@
color="blue" color="blue"
text-color="white" text-color="white"
> >
<span class="cal__quota-content">{{ <span>{{
getRecGoodSkillByRec(myrec)[0].descr getRecGoodSkillByRec(myrec)[0].descr
}}</span> }}</span>
</q-chip> </q-chip>

View File

@@ -2,9 +2,12 @@
// MODERN FIELD DB - COMPACT & PROFESSIONAL // MODERN FIELD DB - COMPACT & PROFESSIONAL
// ======================================== // ========================================
.modern-field-container-con-flex {
display: flex;
}
// Container principale // Container principale
.modern-field-container { .modern-field-container {
display: flex;
align-items: stretch; align-items: stretch;
gap: 12px; gap: 12px;
padding: 8px 12px; padding: 8px 12px;
@@ -111,10 +114,13 @@
} }
} }
// Valore campo (chip/display) .con-flex {
.modern-field-value {
flex: 1; flex: 1;
display: flex; display: flex;
}
// Valore campo (chip/display)
.modern-field-value {
align-items: center; align-items: center;
padding: 8px 12px; padding: 8px 12px;
min-height: 48px; min-height: 48px;
@@ -221,6 +227,7 @@
0% { 0% {
transform: translateX(-100%) rotate(45deg); transform: translateX(-100%) rotate(45deg);
} }
100% { 100% {
transform: translateX(100%) rotate(45deg); transform: translateX(100%) rotate(45deg);
} }

View File

@@ -18,7 +18,8 @@ export default defineComponent({
props: { props: {
title: { title: {
type: String, type: String,
required: true, required: false,
default: '',
}, },
hint: { hint: {
type: String, type: String,
@@ -125,6 +126,11 @@ export default defineComponent({
required: false, required: false,
default: '', default: '',
}, },
myclass: {
type: String,
required: false,
default: '',
},
idmain: { idmain: {
type: String, type: String,
required: false, required: false,
@@ -140,6 +146,16 @@ export default defineComponent({
required: false, required: false,
default: false, default: false,
}, },
isInModif: {
type: Boolean,
required: false,
default: false,
},
nosaveToDb: {
type: Boolean,
required: false,
default: false,
},
notAllowAtChar: { // @ notAllowAtChar: { // @
type: Boolean, type: Boolean,
required: false, required: false,
@@ -163,6 +179,7 @@ export default defineComponent({
console.log('showandsave CMyFieldDb:', newval) console.log('showandsave CMyFieldDb:', newval)
console.log('subkey', props.mysubkey, 'sskey', props.mysubsubkey) console.log('subkey', props.mysubkey, 'sskey', props.mysubsubkey)
if (!props.nosaveToDb)
await tools.saveInDBForTypes($q, props.mykey, newval, props.type, props.serv, props.table, props.mysubkey, props.id, props.indrec, props.mysubsubkey, props.specialField); await tools.saveInDBForTypes($q, props.mykey, newval, props.type, props.serv, props.table, props.mysubkey, props.id, props.indrec, props.mysubsubkey, props.specialField);
emit('savedInDb') emit('savedInDb')

View File

@@ -1,5 +1,9 @@
<template> <template>
<div class="modern-field-container" :class="{ disabled: disable, readonly: !canModify && !canEdit }"> <div class="modern-field-container" :class="{
disabled: disable,
readonly: !canModify,
'modern-field-container-con-flex': !!title
}">
<!-- Label/Titolo --> <!-- Label/Titolo -->
<div v-if="title" class="modern-field-label"> <div v-if="title" class="modern-field-label">
<div class="label-content"> <div class="label-content">
@@ -9,7 +13,7 @@
</div> </div>
<!-- Valore/Edit --> <!-- Valore/Edit -->
<div class="modern-field-value modern-popup-wrapper"> <div class="modern-field-value modern-popup-wrapper" :class="{ 'con-flex': !!title }">
<CMyPopupEdit <CMyPopupEdit
debounce="1000" debounce="1000"
:fielddb="true" :fielddb="true"
@@ -18,7 +22,9 @@
:isrec="!!rec" :isrec="!!rec"
:table="table" :table="table"
:hint="hint" :hint="hint"
:isInModif="isInModif"
:title="title" :title="title"
:myclass="myclass"
:field="mykey" :field="mykey"
:filter="filter" :filter="filter"
:subfield="mysubkey" :subfield="mysubkey"
@@ -41,6 +47,7 @@
:pickup="pickup" :pickup="pickup"
v-model:row="row" v-model:row="row"
minuteinterval="1" minuteinterval="1"
:nosaveToDb="nosaveToDb"
@showandsave="showandsave" @showandsave="showandsave"
@save="save" @save="save"
:notAllowAtChar="notAllowAtChar" :notAllowAtChar="notAllowAtChar"

View File

@@ -14,7 +14,7 @@ import MixinBase from '@src/mixins/mixin-base'
export default defineComponent({ export default defineComponent({
name: 'CMyFieldRec', name: 'CMyFieldRec',
emits: ['save', 'update:rec', 'update_col'], emits: ['save', 'update:rec', 'update_col', 'savedInDb'],
props: { props: {
table: { table: {
type: String, type: String,
@@ -59,6 +59,16 @@ export default defineComponent({
required: false, required: false,
default: false, default: false,
}, },
mysubkey_tosee: {
type: String,
required: false,
default: '',
},
fieldsel_tosee: {
type: String,
required: false,
default: '',
},
disable: { disable: {
type: Boolean, type: Boolean,
required: false, required: false,
@@ -180,7 +190,7 @@ export default defineComponent({
} }
function showandsave(row: any, col: any, newval: any, valinitial: any) { async function showandsave(row: any, col: any, newval: any, valinitial: any) {
console.log('showandsave CMyFieldrec', row, col, newval) console.log('showandsave CMyFieldrec', row, col, newval)
emit('save', props.rec, newval, col) emit('save', props.rec, newval, col)
@@ -189,12 +199,14 @@ export default defineComponent({
if (newval !== valinitial) { if (newval !== valinitial) {
if (props.id) { if (props.id) {
tools.saveInDBForTypes($q, mykey.value, newval, props.fieldtype || col.fieldtype, false, props.table, mysubkey.value, props.id, props.indrec, mysubsubkey.value, props.specialField, row) await tools.saveInDBForTypes($q, mykey.value, newval, props.fieldtype || col.fieldtype, false, props.table, mysubkey.value, props.id, props.indrec, mysubsubkey.value, props.specialField, row)
} else { } else {
} }
} }
emit('savedInDb')
} }
function withBorder() { function withBorder() {

View File

@@ -50,6 +50,8 @@
:mysubsubkey="mysubsubkey" :mysubsubkey="mysubsubkey"
:type="fieldtype || col.fieldtype" :type="fieldtype || col.fieldtype"
:serv="false" :serv="false"
:subfield_to_see="mysubkey_tosee"
:fieldsel_tosee="fieldsel_tosee"
:disable="disable" :disable="disable"
:jointable="jointable" :jointable="jointable"
:myimg="myimg" :myimg="myimg"

View File

@@ -447,3 +447,10 @@
width: 100%; width: 100%;
} }
} }
.class_select.q-select {
@media (max-width: 599px) {
width: 100% !important;
max-width: 100% !important;
}
}

View File

@@ -111,6 +111,11 @@ export default defineComponent({
required: false, required: false,
default: '', default: '',
}, },
myclass: {
type: String,
required: false,
default: '',
},
field2: { field2: {
type: String, type: String,
required: false, required: false,
@@ -824,7 +829,7 @@ export default defineComponent({
} }
async function savefield(value: any, initialval: any, myq: any) { async function savefield(value: any, initialval: any, myq: any) {
if (!props.insertMode) { if (!props.insertMode && !props.nosaveToDb) {
let ret = null; let ret = null;
myvalue.value = value; myvalue.value = value;
return tools.saveInDBForTypes( return tools.saveInDBForTypes(
@@ -843,7 +848,7 @@ export default defineComponent({
} }
} }
async function savefield2(value: any, initialval: any, myq: any) { async function savefield2(value: any, initialval: any, myq: any) {
if (!props.insertMode) { if (!props.insertMode && !props.nosaveToDb) {
let ret = null; let ret = null;
myvalue2.value = value; myvalue2.value = value;
return tools.saveInDBForTypes( return tools.saveInDBForTypes(
@@ -861,49 +866,11 @@ export default defineComponent({
); );
} }
} }
async function savefieldtosee(value: any, initialval: any, myq: any) {
if (!props.insertMode) {
let ret = null;
myvalue2.value = value;
return tools.saveInDBForTypes(
myq,
props.field2,
myvalue2.value,
props.type,
props.serv,
props.table,
props.fieldsel_tosee,
props.id,
props.indrec,
props.mysubsubkey,
props.specialField
);
}
}
function annulla(val: any) { function annulla(val: any) {
emit('annulla', true); emit('annulla', true);
} }
function savefieldboolean(value: any) {
if (myvalue.value === undefined) myvalue.value = 'true';
else myvalue.value = value;
tools.saveInDBForTypes(
$q,
props.field,
myvalue,
props.type,
props.serv,
props.table,
props.subfield,
props.id,
props.indrec,
props.mysubsubkey,
props.specialField
);
}
function Savedb(newVal: any, valinitial: any) { function Savedb(newVal: any, valinitial: any) {
// console.log('Savedb', newVal) // console.log('Savedb', newVal)
@@ -950,7 +917,7 @@ export default defineComponent({
// console.log('Savedb', newVal) // console.log('Savedb', newVal)
emit('showandsave', props.row, props.mycol, newVal, valinitial); emit('showandsave', props.row, props.mycol, newVal, valinitial, myvaltosee.value);
visueditor.value = false; visueditor.value = false;
} }

View File

@@ -1265,6 +1265,7 @@
:addnone="col?.addnone" :addnone="col?.addnone"
:filter_field="col?.filter_field" :filter_field="col?.filter_field"
:value_extra="value_extra" :value_extra="value_extra"
:myclass="myclass"
:optval="fieldsTable.getKeyByTable(col.jointable)" :optval="fieldsTable.getKeyByTable(col.jointable)"
:optlab="fieldsTable.getLabelByTable(col.jointable)" :optlab="fieldsTable.getLabelByTable(col.jointable)"
:options=" :options="
@@ -1763,6 +1764,7 @@
col.fieldtype === costanti.FieldType.select_by_server col.fieldtype === costanti.FieldType.select_by_server
" "
> >
<CMySelect <CMySelect
:type_out="col.field_outtype" :type_out="col.field_outtype"
:col="col" :col="col"
@@ -1794,6 +1796,7 @@
col.filter col.filter
) )
" "
:class="myclass"
:useinput="col.allowNewValue" :useinput="col.allowNewValue"
:addstrrequired="addstrrequired" :addstrrequired="addstrrequired"
:dense="dense" :dense="dense"

View File

@@ -17,7 +17,7 @@ $shadow-md: 0 2px 8px rgba(0, 0, 0, 0.1);
$mobile-breakpoint: 768px; $mobile-breakpoint: 768px;
// ======================================== // ========================================
// WRAPPER CARD // WRAPPER CARD - ALTERNATING COLORS
// ======================================== // ========================================
.rec-card-wrapper { .rec-card-wrapper {
margin: 4px auto; margin: 4px auto;
@@ -26,6 +26,22 @@ $mobile-breakpoint: 768px;
@media (max-width: $mobile-breakpoint) { @media (max-width: $mobile-breakpoint) {
margin: 2px auto; margin: 2px auto;
} }
&.is-even {
.modern-rec-card {
background: linear-gradient(135deg, rgba(49, 154, 239, 0.227) 0%, rgba(25, 118, 210, 0.05) 100%);
border-color: rgba(66, 165, 245, 0.15);
// ... resto degli stili blu
}
}
&.is-odd {
.modern-rec-card {
background: linear-gradient(135deg, rgba(38, 197, 218, 0.159) 0%, rgba(0, 150, 136, 0.05) 100%);
border-color: rgba(38, 198, 218, 0.15);
// ... resto degli stili teal
}
}
} }
// ======================================== // ========================================
@@ -163,15 +179,11 @@ $mobile-breakpoint: 768px;
padding: 8px; padding: 8px;
transition: all $transition-speed ease; transition: all $transition-speed ease;
margin-bottom: 4px; margin-bottom: 4px;
position: relative;
overflow: hidden;
&:hover { &:hover {
box-shadow: $shadow-md; box-shadow: $shadow-md;
border-color: rgba(25, 118, 210, 0.2);
}
&.is-attending {
border-left: 3px solid $positive-color;
background: linear-gradient(to right, rgba(33, 186, 69, 0.05), white);
} }
@media (max-width: $mobile-breakpoint) { @media (max-width: $mobile-breakpoint) {
@@ -224,7 +236,7 @@ $mobile-breakpoint: 768px;
} }
// ======================================== // ========================================
// CONTENT SECTION // CONTENT SECTION - ALTERNATING COLORS
// ======================================== // ========================================
.content-section { .content-section {
padding: 0 8px 0 0 !important; padding: 0 8px 0 0 !important;

View File

@@ -1,19 +1,19 @@
import type { PropType} from 'vue'; import type { PropType } from 'vue';
import { defineComponent, onMounted, ref, watch, computed } from 'vue' import { defineComponent, onMounted, ref, watch, computed } from 'vue';
import { useUserStore } from '@store/UserStore' import { useUserStore } from '@store/UserStore';
import type { IUserFields} from 'model'; import type { IUserFields } from 'model';
import { IImgGallery, IUserProfile } from 'model' import { IImgGallery, IUserProfile } from 'model';
import { costanti } from '@costanti' import { costanti } from '@costanti';
import { shared_consts } from '@src/common/shared_vuejs' import { shared_consts } from '@src/common/shared_vuejs';
import { fieldsTable } from '@store/Modules/fieldsTable' import { fieldsTable } from '@store/Modules/fieldsTable';
import { tools } from '@tools' import { tools } from '@tools';
import { toolsext } from '@store/Modules/toolsext' import { toolsext } from '@store/Modules/toolsext';
import { useQuasar } from 'quasar' import { useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n';
import { CMyCardPopup } from '@src/components/CMyCardPopup' import { CMyCardPopup } from '@src/components/CMyCardPopup';
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router';
import { useCalendarStore } from '@src/store/CalendarStore' import { useCalendarStore } from '@src/store/CalendarStore';
import { useGlobalStore } from '@src/store/globalStore' import { useGlobalStore } from '@src/store/globalStore';
export default defineComponent({ export default defineComponent({
name: 'CMyRecCard', name: 'CMyRecCard',
@@ -29,6 +29,11 @@ export default defineComponent({
required: false, required: false,
default: null, default: null,
}, },
indexRow: {
type: Number,
required: false,
default: 0,
},
editOn: { editOn: {
type: Boolean, type: Boolean,
required: false, required: false,
@@ -38,77 +43,84 @@ export default defineComponent({
type: Number, type: Number,
required: false, required: false,
default: 0, default: 0,
} },
}, },
setup(props, { emit }) { setup(props, { emit }) {
const userStore = useUserStore();
const calendarStore = useCalendarStore();
const globalStore = useGlobalStore();
const $q = useQuasar();
const { t } = useI18n();
const $router = useRouter();
const userStore = useUserStore() const myrec = ref(<any>null);
const calendarStore = useCalendarStore()
const globalStore = useGlobalStore()
const $q = useQuasar()
const { t } = useI18n()
const $router = useRouter()
const myrec = ref(<any>null) const visupage = ref(false);
const visupage = ref(false)
const disabilita = computed(() => { const disabilita = computed(() => {
return props.table === shared_consts.TABLES_MYBACHECAS return props.table === shared_consts.TABLES_MYBACHECAS;
}) });
watch(() => props.prop_myrec, (newval, oldval) => {
mounted()
})
watch(
() => props.prop_myrec,
(newval, oldval) => {
mounted();
}
);
function mounted() { function mounted() {
if (props.prop_myrec) { if (props.prop_myrec) {
myrec.value = props.prop_myrec myrec.value = props.prop_myrec;
} }
} }
function showBadge() { function showBadge() {
if (shared_consts.TABLES_SHOW_ADTYPE.includes(props.table)) { if (shared_consts.TABLES_SHOW_ADTYPE.includes(props.table)) {
return true return true;
} }
return false return false;
} }
function getImgUser(profile: IUserFields) { function getImgUser(profile: IUserFields) {
return userStore.getImgByProfile(profile) return userStore.getImgByProfile(profile);
} }
function naviga(path: string) { function naviga(path: string) {
$router.push(path) $router.push(path);
} }
function setCmd($q: any, cmd: number, myusername: string, value: any, groupname: string) { function setCmd(
emit('setCmd', $q, cmd, myusername, value, groupname) $q: any,
cmd: number,
myusername: string,
value: any,
groupname: string
) {
emit('setCmd', $q, cmd, myusername, value, groupname);
} }
function cmdExt(cmd: any, val1: any, val2: any) { function cmdExt(cmd: any, val1: any, val2: any) {
emit('cmdext', cmd, val1, val2) emit('cmdext', cmd, val1, val2);
} }
function navigaExt(obj: any) { function navigaExt(obj: any) {
cmdExt(costanti.CMD_SHOW_PAGE, null, obj) cmdExt(costanti.CMD_SHOW_PAGE, null, obj);
//let link = shared_consts.getDirectoryByTable(props.table) + '/' + obj._id //let link = shared_consts.getDirectoryByTable(props.table) + '/' + obj._id
//console.log('link', link) //console.log('link', link)
//$router.push(link) //$router.push(link)
} }
function getNameToShow(user: IUserFields, col = null) { function getNameToShow(user: IUserFields, col = null) {
if (myrec.value.groupname) if (myrec.value.groupname) return myrec.value.groupname;
return myrec.value.groupname else return userStore.getNameToShow(user, col);
else
return userStore.getNameToShow(user, col)
} }
function isPartecipero() { function isPartecipero() {
return (props.table === shared_consts.TABLES_MYBACHECAS && calendarStore.isPartecipero(myrec.value._id, props.table)) return (
props.table === shared_consts.TABLES_MYBACHECAS &&
calendarStore.isPartecipero(myrec.value._id, props.table)
);
} }
function computedWidth() { function computedWidth() {
@@ -116,7 +128,7 @@ export default defineComponent({
return `${Math.min(width, 600)}px`; // Limita la larghezza massima a 600px return `${Math.min(width, 600)}px`; // Limita la larghezza massima a 600px
} }
onMounted(mounted) onMounted(mounted);
return { return {
t, t,
@@ -140,6 +152,6 @@ export default defineComponent({
disabilita, disabilita,
globalStore, globalStore,
computedWidth, computedWidth,
} };
}, },
}) });

View File

@@ -1,6 +1,7 @@
<template> <template>
<div <div
class="rec-card-wrapper" class="rec-card-wrapper"
:class="{ 'is-even': indexRow % 2 === 0, 'is-odd': indexRow % 2 !== 0 }"
:style="{ maxWidth: computedWidth() }" :style="{ maxWidth: computedWidth() }"
> >
<!-- Evento Calendar con data grande --> <!-- Evento Calendar con data grande -->

View File

@@ -106,6 +106,7 @@
:label="addstrrequired + label" :label="addstrrequired + label"
input-debounce="300" input-debounce="300"
:input-class="myclass" :input-class="myclass"
:class="myclass"
:options="valori" :options="valori"
:option-value="optval" :option-value="optval"
:option-label="(opt) => getOptionLabel(opt)" :option-label="(opt) => getOptionLabel(opt)"

View File

@@ -76,11 +76,11 @@
<span <span
v-if="contact.profile && contact.profile.resid_str_comune" v-if="contact.profile && contact.profile.resid_str_comune"
class="show_comune_title" class="show_comune_title"
>Comune: >
<span class="show_comune">{{ contact.profile.resid_str_comune }}</span> <span class="show_comune">{{ contact.profile.resid_str_comune }} ({{ contact.profile.resid_province }})</span>
</span> </span>
<span <span
v-if="contact.profile && contact.profile.resid_province" v-if="contact.profile && contact.profile.resid_province && !contact.profile.resid_str_comune"
class="show_province_title" class="show_province_title"
><span class="show_province">({{ contact.profile.resid_province }})</span> ><span class="show_province">({{ contact.profile.resid_province }})</span>
</span> </span>

View File

@@ -233,14 +233,14 @@ $mobile-footer-height: 80px;
} }
.step-line { .step-line {
width: 60px; width: 50px;
height: 3px; height: 3px;
background: linear-gradient(to right, #e0e0e0, #bdbdbd); background: linear-gradient(to right, #e0e0e0, #bdbdbd);
margin: 0 4px; margin: 0 4px;
transition: all $transition-speed ease; transition: all $transition-speed ease;
@media (max-width: $mobile-breakpoint) { @media (max-width: $mobile-breakpoint) {
width: 40px; width: 30px;
} }
.completed + & { .completed + & {
@@ -288,8 +288,8 @@ $mobile-footer-height: 80px;
animation: fadeIn 0.4s ease; animation: fadeIn 0.4s ease;
@media (max-width: $mobile-breakpoint) { @media (max-width: $mobile-breakpoint) {
padding: 0px 16px 16px; padding: 0px 8px 8px;
gap: 12px; gap: 2px;
min-height: calc(100vh - 280px); min-height: calc(100vh - 280px);
} }
@@ -306,7 +306,7 @@ $mobile-footer-height: 80px;
border-bottom: 2px solid rgba(0, 0, 0, 0.05); border-bottom: 2px solid rgba(0, 0, 0, 0.05);
@media (max-width: $mobile-breakpoint) { @media (max-width: $mobile-breakpoint) {
padding-bottom: 12px; padding-bottom: 0px;
} }
.q-icon { .q-icon {

View File

@@ -21,6 +21,8 @@ import {
watch, watch,
} from 'vue'; } from 'vue';
import { CSignIn } from '@src/components/CSignIn'; import { CSignIn } from '@src/components/CSignIn';
import { CMyFieldDb } from '@src/components/CMyFieldDb';
import { CMyFieldRec } from '@src/components/CMyFieldRec';
import { useQuasar } from 'quasar'; import { useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { DefaultProfile, useUserStore } from '@store/UserStore'; import { DefaultProfile, useUserStore } from '@store/UserStore';
@@ -28,6 +30,7 @@ import useValidate from '@vuelidate/core';
import useVuelidate from '@vuelidate/core'; import useVuelidate from '@vuelidate/core';
import { shared_consts } from '@src/common/shared_vuejs'; import { shared_consts } from '@src/common/shared_vuejs';
import { costanti } from '@costanti';
import { minLength, required, sameAs } from '@vuelidate/validators'; import { minLength, required, sameAs } from '@vuelidate/validators';
@@ -49,7 +52,15 @@ import { useInvitaAmicoStore } from 'app/src/stores/useInvitaAmicoStore';
export default defineComponent({ export default defineComponent({
name: 'CSignUp', name: 'CSignUp',
components: { Logo, CTitleBanner, PagePolicy, CCopyBtn, CRegistration }, components: {
Logo,
CTitleBanner,
PagePolicy,
CCopyBtn,
CRegistration,
CMyFieldDb,
CMyFieldRec,
},
props: { props: {
showadultcheck: { showadultcheck: {
type: Boolean, type: Boolean,
@@ -131,7 +142,10 @@ export default defineComponent({
const inputSurname = ref(<any>null); const inputSurname = ref(<any>null);
const inputPassword = ref(<any>null); const inputPassword = ref(<any>null);
const inputPassword2 = ref(<any>null); const inputPassword2 = ref(<any>null);
const inputComune = ref(<any>null);
const noinvito = ref(false); const noinvito = ref(false);
const numStepTotali = ref('5');
const reccomune = ref(<any>{profile: {resid_str_comune: '', resid_comune: ''}});
const submitBtn = ref(<any>null); // AGGIUNGI QUESTA RIGA const submitBtn = ref(<any>null); // AGGIUNGI QUESTA RIGA
@@ -171,6 +185,8 @@ export default defineComponent({
(inputPassword.value && inputPassword.value.hasError) || (inputPassword.value && inputPassword.value.hasError) ||
!inputPassword2.value || !inputPassword2.value ||
(inputPassword2.value && inputPassword2.value.hasError); (inputPassword2.value && inputPassword2.value.hasError);
} else if (slide.value === '4') {
ret = !signup.profile.resid_str_comune || !signup.profile.resid_comune;
} }
return ret; return ret;
@@ -200,6 +216,10 @@ export default defineComponent({
inputPassword.value.focus(); inputPassword.value.focus();
} }
} else if (newSlide === '4') { } else if (newSlide === '4') {
if (inputComune.value) {
inputComune.value.focus();
}
} else if (newSlide === '5') {
if (submitBtn.value) { if (submitBtn.value) {
submitBtn.value.$el.focus(); submitBtn.value.$el.focus();
} }
@@ -243,6 +263,7 @@ export default defineComponent({
complexityUser, complexityUser,
registereduser, registereduser,
}, },
comune: {},
name: { name: {
required: required:
props.collettivo || props.collettivo ||
@@ -501,6 +522,20 @@ export default defineComponent({
onMounted(async () => { onMounted(async () => {
const token = props.token; const token = props.token;
let dev = tools.isDevelop();
// dev = false;
if (dev) {
signup.email = 'test123@prova.com';
signup.username = 'test123';
signup.name = 'Nome';
signup.surname = 'Cognome';
signup.password = 'A12345678';
signup.repeatPassword = 'A12345678';
signup.aportador_solidario = 'surya1977';
}
// Check mobile on mount // Check mobile on mount
checkMobile(); checkMobile();
window.addEventListener('resize', checkMobile); window.addEventListener('resize', checkMobile);
@@ -518,6 +553,19 @@ export default defineComponent({
} }
}); });
function updateComune(row: any, col: any, newval: any, valinit: any, valtosee: any) {
// console.log('updateComune', reccomune.value.profile.resid_comune)
if (!!row.profile.recCity) {
signup.profile.resid_comune = row.profile.recCity._id
signup.profile.resid_str_comune = row.profile.recCity.comune_solo
signup.profile.resid_province = row.profile.recCity.prov
} else {
signup.profile.resid_comune = ''
signup.profile.resid_str_comune = ''
signup.profile.resid_province = ''
}
}
onUnmounted(() => { onUnmounted(() => {
window.removeEventListener('resize', checkMobile); window.removeEventListener('resize', checkMobile);
}); });
@@ -557,10 +605,15 @@ export default defineComponent({
inputSurname, inputSurname,
inputPassword, inputPassword,
inputPassword2, inputPassword2,
inputComune,
shared_consts, shared_consts,
isMobile, isMobile,
submitBtn, submitBtn,
noinvito, noinvito,
costanti,
updateComune,
numStepTotali,
reccomune,
}; };
}, },
}); });

View File

@@ -122,7 +122,7 @@
<!-- Progress Stepper --> <!-- Progress Stepper -->
<div class="progress-stepper"> <div class="progress-stepper">
<div <div
v-for="step in 4" v-for="step in parseInt(numStepTotali)"
:key="step" :key="step"
class="step-item" class="step-item"
:class="{ :class="{
@@ -139,7 +139,7 @@
<span v-else>{{ step }}</span> <span v-else>{{ step }}</span>
</div> </div>
<div <div
v-if="step < 4" v-if="step < parseInt(numStepTotali)"
class="step-line" class="step-line"
></div> ></div>
</div> </div>
@@ -481,10 +481,66 @@
</div> </div>
</q-carousel-slide> </q-carousel-slide>
<!-- Slide 4: Conferma e Policy --> <!-- Slide 4: Comune -->
<q-carousel-slide <q-carousel-slide
name="4" name="4"
class="carousel-slide" class="carousel-slide"
>
<div class="slide-content">
<div class="slide-header">
<q-icon
name="lock_outline"
size="40px"
color="primary"
/>
<h2 class="slide-title">Comune di Residenza</h2>
<p class="slide-subtitle">
Seleziona il tuo comune di residenza, o dove vivi abitualmente, per
connetterti con la Community Locale.
</p>
</div>
<div class="form-fields">
<!--<CMyFieldRec
:nosaveToDb="true"
table="users"
tablesel="cities"
jointable="cities"
:pickup="true"
:type="costanti.FieldType.select_by_server"
:rec="signup"
field="profile.resid_comune"
mysubkey_tosee="resid_str_comune"
fieldsel_tosee="comune"
:canEdit="true"
:canModify="true"
@savedInDb="updateComune"
></CMyFieldRec>-->
<CMyFieldDb
:nosaveToDb="true"
table="users"
tablesel="cities"
mykey="profile"
mysubkey="recCity"
label_trans="reg.resid_str_comune"
:useinput="false"
jointable="cities"
:pickup="true"
myclass="class_select"
:isInModif="true"
:type="costanti.FieldType.select_by_server"
:rec="reccomune"
@showandsave="updateComune"
/>
</div>
</div>
</q-carousel-slide>
<!-- Slide numStepTotali: Conferma e Policy -->
<q-carousel-slide
:name="numStepTotali"
class="carousel-slide"
> >
<div class="slide-content final-slide"> <div class="slide-content final-slide">
<div class="slide-header"> <div class="slide-header">
@@ -527,6 +583,16 @@
/> />
<span>{{ signup.name }} {{ signup.surname }}</span> <span>{{ signup.name }} {{ signup.surname }}</span>
</div> </div>
<div
v-if="signup.profile.resid_str_comune"
class="summary-item"
>
<q-icon
name="home"
color="primary"
/>
<span>{{ signup.profile.resid_str_comune }} ({{ signup.profile.resid_province }})</span>
</div>
</div> </div>
<div class="policy-section"> <div class="policy-section">
@@ -571,7 +637,7 @@
class="nav-btn back-btn" class="nav-btn back-btn"
/> />
<q-btn <q-btn
v-if="slide !== '4'" v-if="slide !== numStepTotali"
unelevated unelevated
color="primary" color="primary"
icon-right="arrow_forward" icon-right="arrow_forward"
@@ -581,7 +647,7 @@
class="nav-btn next-btn" class="nav-btn next-btn"
/> />
<q-btn <q-btn
v-if="slide === '4'" v-if="slide === numStepTotali"
ref="submitBtn" ref="submitBtn"
unelevated unelevated
color="positive" color="positive"
@@ -608,6 +674,7 @@
{ label: '2', value: '2' }, { label: '2', value: '2' },
{ label: '3', value: '3' }, { label: '3', value: '3' },
{ label: '4', value: '4' }, { label: '4', value: '4' },
{ label: '5', value: '5' },
]" ]"
/> />
</div> </div>
@@ -689,16 +756,18 @@
color="primary" color="primary"
/> />
<div> <div>
<p class="text-weight-medium q-mb-sm">Per accedere a RISO hai bisogno di un invito</p> <p class="text-weight-medium q-mb-sm">
<p class="text-body2"> Per accedere a RISO hai bisogno di un invito
L'invito può essere di due tipi:
</p> </p>
<p class="text-body2">L'invito può essere di due tipi:</p>
<ul class="invitation-types"> <ul class="invitation-types">
<li> <li>
<strong>Username dell'invitante:</strong> inserisci lo username di chi ti ha parlato di RISO <strong>Username dell'invitante:</strong> inserisci lo username di chi
ti ha parlato di RISO
</li> </li>
<li> <li>
<strong>Link di registrazione:</strong> usa il link personale che ti è stato inviato via email o messaggio <strong>Link di registrazione:</strong> usa il link personale che ti è
stato inviato via email o messaggio
</li> </li>
</ul> </ul>
</div> </div>
@@ -714,8 +783,9 @@
<div> <div>
<p class="text-weight-medium q-mb-sm">Non conosci nessuno di RISO?</p> <p class="text-weight-medium q-mb-sm">Non conosci nessuno di RISO?</p>
<p class="text-body2"> <p class="text-body2">
Nessun problema! Puoi unirti alla comunità attraverso i nostri gruppi territoriali su Telegram Nessun problema! Puoi unirti alla comunità attraverso i nostri gruppi
oppure contattarci direttamente via email. Saremo felici di darti il benvenuto! 🌱 territoriali su Telegram oppure contattarci direttamente via email. Saremo
felici di darti il benvenuto! 🌱
</p> </p>
</div> </div>
</div> </div>
@@ -728,7 +798,11 @@
color="primary" color="primary"
icon="telegram" icon="telegram"
label="Gruppi Telegram Territoriali" label="Gruppi Telegram Territoriali"
:href="tools.getLinkGruppiTerritorialiTelegram() ? tools.getLinkGruppiTerritorialiTelegram() : ''" :href="
tools.getLinkGruppiTerritorialiTelegram()
? tools.getLinkGruppiTerritorialiTelegram()
: ''
"
target="_blank" target="_blank"
class="action-btn full-width q-mb-sm" class="action-btn full-width q-mb-sm"
no-caps no-caps

View File

@@ -62,6 +62,10 @@ export default defineComponent({
label: 'Telegram BOT Rimosso', label: 'Telegram BOT Rimosso',
value: shared_consts.FILTER_USER_TELEGRAM_BLOCKED value: shared_consts.FILTER_USER_TELEGRAM_BLOCKED
}, },
{
label: 'Comune',
value: shared_consts.FILTER_USER_COMUNE
},
{ {
label: 'Provincia', label: 'Provincia',
value: shared_consts.FILTER_USER_PROVINCE value: shared_consts.FILTER_USER_PROVINCE

View File

@@ -337,9 +337,7 @@
<q-btn <q-btn
label="Replace Username" label="Replace Username"
color="primary" color="primary"
@click=" @click="EseguiFunz('ReplaceUsername', search_username, replace_username)"
EseguiFunz('ReplaceUsername', search_username, replace_username)
"
></q-btn> ></q-btn>
<q-btn <q-btn
label="Esci da tutti i Circuiti a saldo Zero" label="Esci da tutti i Circuiti a saldo Zero"
@@ -350,19 +348,13 @@
label="Replace AportadorSolidario" label="Replace AportadorSolidario"
color="primary" color="primary"
@click=" @click="
EseguiFunz( EseguiFunz('replaceAportadorSolidario', search_username, replace_username)
'replaceAportadorSolidario',
search_username,
replace_username
)
" "
></q-btn> ></q-btn>
<q-btn <q-btn
label="Replace Circuit" label="Replace Circuit"
color="primary" color="primary"
@click=" @click="EseguiFunz('ReplaceCircuitName', search_username, replace_username)"
EseguiFunz('ReplaceCircuitName', search_username, replace_username)
"
></q-btn> ></q-btn>
<br /> <br />
</div> </div>
@@ -383,9 +375,7 @@
<q-btn <q-btn
label="Create Account Circuits" label="Create Account Circuits"
color="primary" color="primary"
@click=" @click="EseguiFunz('CreateAccountCircuits', search_username, replace_username)"
EseguiFunz('CreateAccountCircuits', search_username, replace_username)
"
></q-btn> ></q-btn>
<br /> <br />
</div> </div>
@@ -411,7 +401,11 @@
label="Fiducia Concessa" label="Fiducia Concessa"
style="width: 300px" style="width: 300px"
></q-input> ></q-input>
<q-input v-model="valmax" label="Max Qta" style="width: 300px"></q-input> <q-input
v-model="valmax"
label="Max Qta"
style="width: 300px"
></q-input>
</div> </div>
<div class="row"> <div class="row">
<q-btn <q-btn
@@ -435,14 +429,7 @@
label="Imposta Min e Max per TUTTI i Conti Personali di un Circuito" label="Imposta Min e Max per TUTTI i Conti Personali di un Circuito"
color="primary" color="primary"
@click=" @click="
EseguiFunz( EseguiFunz('ImpostaMinMaxPersonaliCircuito', '', '', valmin, valmax, circuitId)
'ImpostaMinMaxPersonaliCircuito',
'',
'',
valmin,
valmax,
circuitId
)
" "
></q-btn> ></q-btn>
</div> </div>
@@ -526,14 +513,7 @@
label="Imposta Min e Max per i Circuiti Collettivi di DEFAULT" label="Imposta Min e Max per i Circuiti Collettivi di DEFAULT"
color="primary" color="primary"
@click=" @click="
EseguiFunz( EseguiFunz('ImpostaDefMinMaxCollettivi', '', '', defmin, defmax, circuitId)
'ImpostaDefMinMaxCollettivi',
'',
'',
defmin,
defmax,
circuitId
)
" "
></q-btn> ></q-btn>
<br /> <br />
@@ -599,11 +579,22 @@
<br /> <br />
</div> </div>
<q-spinner v-if="incaricamento" color="primary" size="3em" :thickness="2" /> <q-spinner
v-if="incaricamento"
color="primary"
size="3em"
:thickness="2"
/>
<q-field stack-label dense> <q-field
stack-label
dense
>
<template v-slot:control> <template v-slot:control>
<div class="self-center full-width no-outline text-center" tabindex="0"> <div
class="self-center full-width no-outline text-center"
tabindex="0"
>
{{ ris }} {{ ris }}
</div> </div>
</template> </template>
@@ -781,6 +772,14 @@
color="negative" color="negative"
@click="EseguiFunz('convertProductInfos')" @click="EseguiFunz('convertProductInfos')"
></q-btn> ></q-btn>
<div class="row">
<q-btn
label="Rimuovi i dati inutili nella Tabella MySkills"
color="negative"
@click="EseguiFunz('RemoveDatiInutiliMySkill')"
></q-btn>
<br />
</div>
<q-btn <q-btn
label="getGM_Lista_Argomenti" label="getGM_Lista_Argomenti"
color="positive" color="positive"
@@ -805,16 +804,23 @@
<div class="results-content"> <div class="results-content">
{{ risultato }} {{ risultato }}
</div> </div>
<h2 v-if="!!risultatoHTML" class="results-title">Risultati HTML:</h2> <h2
<div v-if="!!risultatoHTML" v-html="risultatoHTML"></div> v-if="!!risultatoHTML"
class="results-title"
>
Risultati HTML:
</h2>
<div
v-if="!!risultatoHTML"
v-html="risultatoHTML"
></div>
</div> </div>
<br /> <br />
<br /> <br />
<br /> <br />
</template> </template>
<script lang="ts" src="./dbop.ts"> <script lang="ts" src="./dbop.ts"></script>
</script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "./dbop"; @import './dbop';
</style> </style>

View File

@@ -112,6 +112,7 @@ export default defineComponent({
'profile.qualifica': 1, 'profile.qualifica': 1,
'profile.note': 1, 'profile.note': 1,
'profile.da_contattare': 1, 'profile.da_contattare': 1,
'profile.resid_str_comune': 1,
'profile.resid_province': 1, 'profile.resid_province': 1,
'mycities.reg': 1, 'mycities.reg': 1,
} }

View File

@@ -713,12 +713,12 @@
v-bind="$attrs" v-bind="$attrs"
:copy="false" :copy="false"
:value=" :value="
userStore.userprofile.profile.resid_str_comune userStore.userprofile.profile.resid_str_comune + (userStore.userprofile.profile.resid_province ? ' (' + userStore.userprofile.profile.resid_province + ')' : '')
" "
label="Comune" label="Comune"
/> />
<CLabel <CLabel
v-if="!!userStore.userprofile.profile.resid_province" v-if="!!userStore.userprofile.profile.resid_province && !userStore.userprofile.profile.resid_str_comune"
v-bind="$attrs" v-bind="$attrs"
:copy="false" :copy="false"
:value=" :value="