Pagina con i link dei Canali territoriali di RISO
Lista Tabelle "Aggiungi" da errore userId... Aggiunto "Servizi" e alcune sue sottocategorie Aggiunto anche la conversione della foto piccola alla Foto Profilo
This commit is contained in:
@@ -8,13 +8,15 @@
|
||||
|
||||
<q-banner rounded class="bg-primary text-white">
|
||||
<div class="text-h6 text-center">
|
||||
Accedi al menu inserendo le tue credenziali 🔑<br><br>
|
||||
Accedi al menu inserendo le tue credenziali per entrare 🔑<br>
|
||||
<div class="text-center">
|
||||
<q-btn color="white" text-color="blue" label="Clicca qui per Accedere" @click="tools.openrighttoolbar()"/>
|
||||
</div>
|
||||
<br>
|
||||
📝 Non sei <strong>Registrato</strong>?<br>
|
||||
👉🏻 Chiedi in chat il link a chi ti ha <strong>invitato</strong>.<br>
|
||||
</div>
|
||||
<template v-slot:action>
|
||||
<q-btn flat color="white" label="Accedi al Login" @click="tools.openrighttoolbar()"/>
|
||||
</template>
|
||||
<br>
|
||||
</q-banner>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -951,6 +951,9 @@ export default defineComponent({
|
||||
// @ts-ignore
|
||||
newRecord.value = props.defaultnewrec()
|
||||
}
|
||||
if (!newRecord.value) {
|
||||
newRecord.value = {}
|
||||
}
|
||||
newRecord.value['userId'] = userStore.my._id
|
||||
newRecord.value['idapp'] = process.env.APP_ID
|
||||
// globalStore.saveTable(mydata).then(ris => console.log('RISULT', ris))
|
||||
|
||||
@@ -554,6 +554,7 @@
|
||||
<q-space/>
|
||||
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
|
||||
</q-bar>
|
||||
|
||||
<q-card-section class="inset-shadow">
|
||||
<div
|
||||
v-for="col in mycolumns" :key="col.name" class="newrec_fields">
|
||||
|
||||
@@ -73,6 +73,7 @@ export default defineComponent({
|
||||
const iamadult = ref(false)
|
||||
const duplicate_email = ref(false)
|
||||
const duplicate_username = ref(false)
|
||||
const visureg = ref(false)
|
||||
|
||||
|
||||
const globalStore = useGlobalStore()
|
||||
@@ -297,6 +298,7 @@ export default defineComponent({
|
||||
t,
|
||||
allowSubmit,
|
||||
myRuleEmail,
|
||||
visureg,
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
@@ -1,228 +1,254 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="text-center">
|
||||
<p>
|
||||
<logo></logo>
|
||||
<CTitleBanner :title="$t('pages.SignUp')"></CTitleBanner>
|
||||
<div v-if="tools.isLogged() && tools.getUsername()" class="text-center">
|
||||
<q-banner
|
||||
rounded
|
||||
class="bg-green text-white"
|
||||
style="text-align: center;"
|
||||
>
|
||||
<span class="mybanner">
|
||||
{{ tools.getUsername() }} sei già correttamente registrato ed hai accesso alla Piattaforma<br>
|
||||
</span>
|
||||
</q-banner>
|
||||
|
||||
<q-banner
|
||||
rounded
|
||||
class="bg-warning text-black"
|
||||
style="text-align: center;"
|
||||
>
|
||||
<span class="mybanner" v-html="t('pages.need_Telegram')"></span>
|
||||
</q-banner>
|
||||
</p>
|
||||
</div>
|
||||
<div class="row q-ma-sm q-pa-sm justify-center">
|
||||
<q-btn class="q-ma-sm" color="primary" icon="fas fa-home" label="Vai alla Home" to="/"></q-btn>
|
||||
|
||||
<div class="q-gutter-sm">
|
||||
|
||||
<q-input
|
||||
v-if="showaportador && signup.aportador_solidario !== tools.APORTADOR_NONE"
|
||||
bg-color="lightblue"
|
||||
:readonly="true"
|
||||
v-model="signup.aportador_solidario"
|
||||
rounded outlined
|
||||
@blur="v$.aportador_solidario.$touch"
|
||||
:error="v$.aportador_solidario.$error"
|
||||
:error-message="tools.errorMsg('aportador_solidario', v$.aportador_solidario)"
|
||||
maxlength="20"
|
||||
debounce="1000"
|
||||
|
||||
:label="$t('reg.aportador_solidario')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<!--<q-input
|
||||
v-model="signup.email"
|
||||
rounded outlined
|
||||
@blur="v$.email.$touch"
|
||||
@update:model-value="changeemail()"
|
||||
:error="v$.email.$invalid"
|
||||
:error-message="tools.errorMsg( 'email', v$.email)"
|
||||
maxlength="50"
|
||||
debounce="2000"
|
||||
:label="$t('reg.email')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="email"/>
|
||||
</template>
|
||||
|
||||
</q-input> -->
|
||||
|
||||
<q-input
|
||||
v-model="signup.email"
|
||||
rounded outlined
|
||||
@update:model-value="changeemail()"
|
||||
maxlength="50"
|
||||
debounce="3000"
|
||||
:rules="[ myRuleEmail ]"
|
||||
lazy-rules
|
||||
:label="$t('reg.email_reg')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="email"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-model="signup.username"
|
||||
rounded outlined
|
||||
@blur="v$.username.$touch"
|
||||
@update:model-value="changeusername"
|
||||
:error="v$.username.$error"
|
||||
@keydown.space="(event) => event.preventDefault()"
|
||||
maxlength="20"
|
||||
:hint="$t('reg.username_hint')"
|
||||
debounce="1000"
|
||||
:error-message="tools.errorMsg( 'username', v$.username)"
|
||||
:label="$t('reg.username_reg')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<div v-if="show_namesurname">
|
||||
<q-input
|
||||
v-model="signup.name"
|
||||
rounded outlined
|
||||
@blur="v$.name.$touch"
|
||||
:error="v$.name.$error"
|
||||
maxlength="30"
|
||||
debounce="1000"
|
||||
:error-message="tools.errorMsg( 'name', v$.name)"
|
||||
:label="$t('reg.name')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-model="signup.surname"
|
||||
rounded outlined
|
||||
:error="v$.surname.$error"
|
||||
@blur="v$.surname.$touch"
|
||||
maxlength="30"
|
||||
debounce="1000"
|
||||
:error-message="tools.errorMsg( 'surname', v$.surname)"
|
||||
:label="$t('reg.surname')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
</div>
|
||||
|
||||
<q-input
|
||||
v-model="signup.password"
|
||||
type="password"
|
||||
rounded outlined
|
||||
@blur="v$.password.$touch"
|
||||
:error="v$.password.$error"
|
||||
:error-message="`${tools.errorMsg( 'password', v$.password)}`"
|
||||
maxlength="30"
|
||||
debounce="1000"
|
||||
:label="$t('reg.password_reg')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="vpn_key"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-model="signup.repeatPassword"
|
||||
type="password"
|
||||
maxlength="30"
|
||||
rounded outlined
|
||||
@blur="v$.repeatPassword.$touch"
|
||||
:error="v$.repeatPassword.$error"
|
||||
:error-message="`${tools.errorMsg( 'repeatpassword', v$.repeatPassword)}`"
|
||||
|
||||
:label="$t('reg.repeatPassword')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="vpn_key"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-if="shownationality"
|
||||
v-model="countryname"
|
||||
:readonly="true"
|
||||
rounded outlined
|
||||
|
||||
debounce="1000"
|
||||
:label="$t('reg.nationality')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<!--<vue-country-code
|
||||
@onSelect="selectcountry"
|
||||
:preferredCountries="tools.getprefCountries"
|
||||
:dropdownOptions="{ disabledDialCode: true }"
|
||||
>
|
||||
|
||||
</vue-country-code>-->
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<div v-if="!tools.isMobile()"><br></div>
|
||||
|
||||
|
||||
<!--<vue-tel-input
|
||||
v-if="showcell"
|
||||
@country-changed="intcode_change()"
|
||||
:value="signup.profile.cell"
|
||||
:placeholder="$t('reg.cell')"
|
||||
maxlength="20"
|
||||
:enabledCountryCode="true"
|
||||
inputClasses="clCell"
|
||||
wrapperClasses="clCellCode">
|
||||
</vue-tel-input>-->
|
||||
|
||||
|
||||
<q-checkbox
|
||||
v-model="signup.terms"
|
||||
color="secondary"
|
||||
@blur="v$.terms.$touch"
|
||||
:error="v$.terms.$error"
|
||||
:error-message="`${tools.errorMsg( 'terms', v$.terms)}`"
|
||||
:label="$t('reg.terms')">
|
||||
|
||||
</q-checkbox>
|
||||
|
||||
<q-checkbox
|
||||
v-if="showadultcheck"
|
||||
v-model="iamadult"
|
||||
color="secondary"
|
||||
:label="$t('reg.onlyadult')">
|
||||
</q-checkbox>
|
||||
|
||||
<div v-if="showadultcheck">
|
||||
<q-btn class="q-ma-sm" color="accent" icon="fas fa-sign" label="Voglio vedere la pagina di Registrazione" @click="visureg = true"></q-btn>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<div class="wrapper">
|
||||
<q-btn rounded size="lg" color="positive" @click="submitOk" :disabled='!allowSubmit()'
|
||||
:label="$t('reg.submit')">
|
||||
</q-btn>
|
||||
</div>
|
||||
<br/><br/><br/>
|
||||
</div>
|
||||
<div v-if="!tools.isLogged() || visureg"
|
||||
class="text-center">
|
||||
<div>
|
||||
|
||||
<p>
|
||||
<logo></logo>
|
||||
|
||||
<q-btn class="q-ma-sm" color="positive" icon="fas fa-home" label="Se sei già Registrato CLICCA QUI" to="/"></q-btn>
|
||||
|
||||
<CTitleBanner :title="$t('pages.SignUp')"></CTitleBanner>
|
||||
|
||||
<q-banner
|
||||
rounded
|
||||
class="bg-warning text-black"
|
||||
style="text-align: center;"
|
||||
>
|
||||
<span class="mybanner" v-html="t('pages.need_Telegram')"></span>
|
||||
</q-banner>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="q-gutter-sm">
|
||||
|
||||
<q-input
|
||||
v-if="showaportador && signup.aportador_solidario !== tools.APORTADOR_NONE"
|
||||
bg-color="lightblue"
|
||||
:readonly="true"
|
||||
v-model="signup.aportador_solidario"
|
||||
rounded outlined
|
||||
@blur="v$.aportador_solidario.$touch"
|
||||
:error="v$.aportador_solidario.$error"
|
||||
:error-message="tools.errorMsg('aportador_solidario', v$.aportador_solidario)"
|
||||
maxlength="20"
|
||||
debounce="1000"
|
||||
|
||||
:label="$t('reg.aportador_solidario')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<!--<q-input
|
||||
v-model="signup.email"
|
||||
rounded outlined
|
||||
@blur="v$.email.$touch"
|
||||
@update:model-value="changeemail()"
|
||||
:error="v$.email.$invalid"
|
||||
:error-message="tools.errorMsg( 'email', v$.email)"
|
||||
maxlength="50"
|
||||
debounce="2000"
|
||||
:label="$t('reg.email')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="email"/>
|
||||
</template>
|
||||
|
||||
</q-input> -->
|
||||
|
||||
<q-input
|
||||
v-model="signup.email"
|
||||
rounded outlined
|
||||
@update:model-value="changeemail()"
|
||||
maxlength="50"
|
||||
debounce="3000"
|
||||
:rules="[ myRuleEmail ]"
|
||||
lazy-rules
|
||||
:label="$t('reg.email_reg')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="email"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-model="signup.username"
|
||||
rounded outlined
|
||||
@blur="v$.username.$touch"
|
||||
@update:model-value="changeusername"
|
||||
:error="v$.username.$error"
|
||||
@keydown.space="(event) => event.preventDefault()"
|
||||
maxlength="20"
|
||||
:hint="$t('reg.username_hint')"
|
||||
debounce="1000"
|
||||
:error-message="tools.errorMsg( 'username', v$.username)"
|
||||
:label="$t('reg.username_reg')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<div v-if="show_namesurname">
|
||||
<q-input
|
||||
v-model="signup.name"
|
||||
rounded outlined
|
||||
@blur="v$.name.$touch"
|
||||
:error="v$.name.$error"
|
||||
maxlength="30"
|
||||
debounce="1000"
|
||||
:error-message="tools.errorMsg( 'name', v$.name)"
|
||||
:label="$t('reg.name')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-model="signup.surname"
|
||||
rounded outlined
|
||||
:error="v$.surname.$error"
|
||||
@blur="v$.surname.$touch"
|
||||
maxlength="30"
|
||||
debounce="1000"
|
||||
:error-message="tools.errorMsg( 'surname', v$.surname)"
|
||||
:label="$t('reg.surname')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="person"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
</div>
|
||||
|
||||
<q-input
|
||||
v-model="signup.password"
|
||||
type="password"
|
||||
rounded outlined
|
||||
@blur="v$.password.$touch"
|
||||
:error="v$.password.$error"
|
||||
:error-message="`${tools.errorMsg( 'password', v$.password)}`"
|
||||
maxlength="30"
|
||||
debounce="1000"
|
||||
:label="$t('reg.password_reg')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="vpn_key"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-model="signup.repeatPassword"
|
||||
type="password"
|
||||
maxlength="30"
|
||||
rounded outlined
|
||||
@blur="v$.repeatPassword.$touch"
|
||||
:error="v$.repeatPassword.$error"
|
||||
:error-message="`${tools.errorMsg( 'repeatpassword', v$.repeatPassword)}`"
|
||||
|
||||
:label="$t('reg.repeatPassword')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<q-icon name="vpn_key"/>
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<q-input
|
||||
v-if="shownationality"
|
||||
v-model="countryname"
|
||||
:readonly="true"
|
||||
rounded outlined
|
||||
|
||||
debounce="1000"
|
||||
:label="$t('reg.nationality')">
|
||||
|
||||
<template v-slot:prepend>
|
||||
<!--<vue-country-code
|
||||
@onSelect="selectcountry"
|
||||
:preferredCountries="tools.getprefCountries"
|
||||
:dropdownOptions="{ disabledDialCode: true }"
|
||||
>
|
||||
|
||||
</vue-country-code>-->
|
||||
</template>
|
||||
|
||||
</q-input>
|
||||
|
||||
<div v-if="!tools.isMobile()"><br></div>
|
||||
|
||||
|
||||
<!--<vue-tel-input
|
||||
v-if="showcell"
|
||||
@country-changed="intcode_change()"
|
||||
:value="signup.profile.cell"
|
||||
:placeholder="$t('reg.cell')"
|
||||
maxlength="20"
|
||||
:enabledCountryCode="true"
|
||||
inputClasses="clCell"
|
||||
wrapperClasses="clCellCode">
|
||||
</vue-tel-input>-->
|
||||
|
||||
|
||||
<q-checkbox
|
||||
v-model="signup.terms"
|
||||
color="secondary"
|
||||
@blur="v$.terms.$touch"
|
||||
:error="v$.terms.$error"
|
||||
:error-message="`${tools.errorMsg( 'terms', v$.terms)}`"
|
||||
:label="$t('reg.terms')">
|
||||
|
||||
</q-checkbox>
|
||||
|
||||
<q-checkbox
|
||||
v-if="showadultcheck"
|
||||
v-model="iamadult"
|
||||
color="secondary"
|
||||
:label="$t('reg.onlyadult')">
|
||||
</q-checkbox>
|
||||
|
||||
<div v-if="showadultcheck">
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<div class="wrapper">
|
||||
<q-btn rounded size="lg" color="positive" @click="submitOk" :disabled='!allowSubmit()'
|
||||
:label="$t('reg.submit')">
|
||||
</q-btn>
|
||||
</div>
|
||||
<br/><br/><br/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -43,6 +43,8 @@ export default defineComponent({
|
||||
num_passeggeri: 0,
|
||||
num_imbarcati: 0,
|
||||
num_teleg_attivo: 0,
|
||||
num_autorizzare: 0,
|
||||
num_autorizzati: 0,
|
||||
email_non_verif: 0,
|
||||
num_teleg_pending: 0,
|
||||
lastsreg: [],
|
||||
|
||||
@@ -7,8 +7,11 @@
|
||||
|
||||
<div class="flex flex-center">
|
||||
|
||||
<CCardState :mytext="$t('pages.statusreg.reg')" :myval="datastat.num_reg"
|
||||
:myperc="100"></CCardState>
|
||||
<CCardState :mytext="$t('pages.statusreg.verifieds')" :myval="datastat.num_teleg_attivo"
|
||||
:myperc="(datastat.num_teleg_attivo / datastat.num_reg) * 100"></CCardState>
|
||||
|
||||
<CCardState :mytext="$t('pages.statusreg.autorizzare')" :myval="datastat.num_autorizzare"
|
||||
:myperc="(datastat.num_autorizzare / datastat.num_teleg_attivo) * 100"></CCardState>
|
||||
|
||||
<div class="q-pa-xs" v-if="datastat.num_part_accepted > 1">
|
||||
<CCardStat :mytext="$t('stat.accepted')" :myval="datastat.num_part_accepted"></CCardStat>
|
||||
|
||||
@@ -8,12 +8,38 @@
|
||||
|
||||
</CVerifyEmail>-->
|
||||
<div v-if="tools.isTelegOk()" class="centeritems">
|
||||
<q-banner inline-actions rounded class="bg-orange text-black">
|
||||
|
||||
<q-banner
|
||||
v-if="!tools.isUsernameTelegOk()"
|
||||
inline-actions rounded class="bg-green-4 text-black">
|
||||
<br>🔑 Ora torna su Telegram ed imposta l'<b>Username di Telegram</b>:<br>
|
||||
<br>
|
||||
💬 In questo modo le persone potranno contattarti su Telegram senza aver bisogno del tuo numero di cellulare, e potranno farlo anche dalla APP.<br>
|
||||
<br>
|
||||
👉🏻 1. Su telegram premi sull'icona (tre linee orizzontali) del menu principale in alto a sinistra.<br>
|
||||
👉🏻 2. Seleziona la voce <b>Impostazioni</b> nel menu.<br>
|
||||
👉🏻 3.Premi su <b>Username</b> nella sezione account.<br>
|
||||
👉🏻 4. Digita il tuo username. (deve essere un nome ancora libero e non già usato da altri).<br>
|
||||
👉🏻 5. Per confermare premi sull'icona con la spunta (V) in alto a destra.<br>
|
||||
|
||||
🏁 Infine vai sul <b>BOT RISO</b> Telegram e scrivi OK nel messaggio.
|
||||
<q-btn rounded color="primary" icon="fab fa-telegram" label="Apri il BOT"
|
||||
type="a"
|
||||
:href="tools.getLinkBotTelegram()" target="_blank"></q-btn>
|
||||
<br><br>
|
||||
|
||||
Se non ci riesci vedi la <a href="https://www.nigiara.it/telegram/come-impostare-uno-username-su-telegram.htm" target="_blank">GUIDA PER IMPOSTARE
|
||||
L'USERNAME SU TELEGRAM</a><br>
|
||||
<br>
|
||||
|
||||
</q-banner>
|
||||
<q-banner v-else
|
||||
inline-actions rounded class="bg-orange text-black">
|
||||
<template v-slot:avatar>
|
||||
<q-icon name="info" color="primary"/>
|
||||
</template>
|
||||
<strong>Appena sarai abilitato, dal tuo invitante {{tools.getAportadorSolidario()}}, ti arriverà una <strong>notifica su Telegram</strong>.<br><br>
|
||||
Se non dovesse arrivarti subito probabilmente {{tools.getAportadorSolidario()}} non ha il cellulare a portata di mano.<br>
|
||||
<strong>Appena sarai abilitato, dal tuo invitante {{ tools.getAportadorSolidario() }}, ti arriverà una <strong>notifica su Telegram</strong>.<br><br>
|
||||
Se non dovesse arrivarti entro 24 ore prova a mandargli un messaggio.<br>
|
||||
</strong>
|
||||
|
||||
<q-btn
|
||||
@@ -26,7 +52,6 @@
|
||||
</q-btn>
|
||||
|
||||
|
||||
|
||||
</q-banner>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -128,6 +128,7 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
function setLangAtt(mylang: string) {
|
||||
|
||||
console.log('LANG =', mylang)
|
||||
// console.log('PRIMA $q.lang.isoName', $q.lang.isoName)
|
||||
|
||||
@@ -189,12 +190,12 @@ export default defineComponent({
|
||||
// tools.showNotif($q, 'IMPOSTA LANG= ' + $i18n.locale)
|
||||
// console.log('IMPOSTA LANG= ' + $i18n.locale)
|
||||
|
||||
userStore.setlang($router, $q.lang.getLocale())
|
||||
|
||||
let mylangtopass = mylang
|
||||
|
||||
mylangtopass = toolsext.checkLangPassed($q, $router, mylangtopass)
|
||||
|
||||
userStore.setlang($router, mylangtopass)
|
||||
|
||||
setshortlang(mylangtopass)
|
||||
|
||||
setLangAtt(mylangtopass)
|
||||
|
||||
Reference in New Issue
Block a user