- Gruppi (3) - lista degli utenti del gruppo

This commit is contained in:
paoloar77
2022-02-05 23:28:01 +01:00
parent 498c28773f
commit 980ff4b48e
28 changed files with 642 additions and 117 deletions

View File

@@ -8,7 +8,7 @@
:prop_mycolumns="colmySkills"
prop_colkey="idSkill"
col_title="subTitle"
:vertical="true"
:vertical="-1"
:nodataLabel="idSector > 0 ? 'Nessuna Competenza trovata': 'Selezionare un Settore'"
:prop_search="true"
:finder="true"

View File

@@ -90,9 +90,9 @@ export default defineComponent({
default: false,
},
vertical: {
type: Boolean,
type: Number,
required: false,
default: false,
default: 0,
},
prop_codeId: {
type: String,
@@ -181,7 +181,17 @@ export default defineComponent({
type: Boolean,
required: false,
default: false
}
},
visufind: {
type: Number,
required: false,
default: costanti.FIND_PEOPLE,
},
extrafield: {
type: String,
required: false,
default: '',
},
},
components: { CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups },
setup(props, { emit }) {
@@ -242,7 +252,7 @@ export default defineComponent({
const mycodeid = toRef(props, 'prop_codeId')
const myvertical = ref(0)
const myvertical = ref(props.vertical)
const valoriopt = computed(() => (item: any, addall: boolean) => {
// console.log('valoriopt', item.table)
@@ -318,9 +328,11 @@ export default defineComponent({
if (tablesel.value === 'mygroups') {
// is Admin ?
const trovato = rec.admins.find((myuser: any) => myuser.username === userStore.my.username)
if (trovato) {
return !!trovato
if (rec.admins) {
const trovato = rec.admins.find((myuser: any) => myuser.username === userStore.my.username)
if (trovato) {
return !!trovato
}
}
}
@@ -859,7 +871,7 @@ export default defineComponent({
colkey.value = props.prop_colkey
pagination.value = props.prop_pagination
myvertical.value = props.vertical ? -1 : 0
myvertical.value = props.vertical
if (props.finder) {
myvertical.value = tools.getCookie('myv', 0)
}

View File

@@ -297,7 +297,6 @@
<br>
</template>
<template v-slot:item="props">
<div v-if="((showType === costanti.SHOW_USERINFO) && myvertical !== costanti.VISUTABLE_SCHEDA_USER) || ((myvertical === 2) && (tablesel === 'users' || tablesel === 'myskills'))" class="fill-all-width">
<div>
@@ -305,7 +304,8 @@
v-model="filter"
:finder="false"
:mycontact="props.row"
:visu="costanti.FIND_PEOPLE"
:visu="visufind"
:groupname="extrafield"
/>
</div>

View File

@@ -1,4 +1,4 @@
import { defineComponent, PropType, ref, watch } from 'vue'
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { useGlobalStore } from '@store/globalStore'
@@ -75,6 +75,18 @@ export default defineComponent({
required: false,
default: '',
},
rec: {
type: Object,
required: false,
default: null,
},
mycol: {
type: Object as PropType<IColGridTable>,
required: false,
default: () => {
return { name: '' }
},
},
id: {
type: String,
required: false,
@@ -118,6 +130,17 @@ export default defineComponent({
return col.value.fieldtype !== costanti.FieldType.onlydate && col.value.fieldtype !== costanti.FieldType.date
}
function mounted() {
if (props.rec) {
row.value = props.rec
}
if (props.mycol.name !== '') {
col.value = props.mycol
}
}
onMounted(mounted)
return {
tools,
costanti,

View File

View File

@@ -0,0 +1,185 @@
import { defineComponent, onMounted, PropType, ref, watch } from 'vue'
import { useQuasar } from 'quasar'
import { useI18n } from '@/boot/i18n'
import { useGlobalStore } from '@store/globalStore'
import { fieldsTable } from '@store/Modules/fieldsTable'
import { tools } from '@store/Modules/tools'
import { costanti } from '@costanti'
import { CMyPopupEdit } from '@/components/CMyPopupEdit'
import { IColGridTable } from 'model'
import MixinBase from '@/mixins/mixin-base'
export default defineComponent({
name: 'CMyFieldRec',
props: {
table: {
type: String,
required: true,
},
title: {
type: String,
required: false,
default: '',
},
rec: {
type: Object,
required: true,
},
field: {
type: String,
required: false,
default: '',
},
myimg: {
type: String,
required: false,
default: '',
},
canModify: {
type: Boolean,
required: false,
default: true,
},
canEdit: {
type: Boolean,
required: false,
default: false,
},
columns: {
type: Object,
required: false,
default: null,
},
disable: {
type: Boolean,
required: false,
default: false,
},
id: {
type: String,
required: false,
default: '',
},
idmain: {
type: String,
required: false,
default: '',
},
indrec: {
type: Number,
required: false,
default: -1,
},
},
components: { CMyPopupEdit },
setup(props, { emit }) {
const $q = useQuasar()
const { t } = useI18n()
const globalStore = useGlobalStore()
const mytitle = ref('')
const col = ref(<any>{})
const keytab = ref(<any>'')
const optlab = ref('')
const pickup = ref(false)
const tablesel = ref('')
const jointable = ref('')
const recordCol = ref(<any>{})
const mykey = ref('')
const mysubkey = ref('')
const mysubsubkey = ref('')
const { setValDb, getValDb } = MixinBase()
function mounted() {
mytitle.value = props.title
keytab.value = fieldsTable.getKeyByTable(props.table)
optlab.value = fieldsTable.getLabelByTable(props.table)
// recordCol.value = fieldsTable.getrecTableList(props.table)
if (props.columns) {
col.value = props.columns.find((col: any) => col.name === props.field)
} else {
col.value = fieldsTable.getColByTable(props.table, props.field)
}
if (col.value) {
jointable.value = col.value.jointable!
}
const arrk = props.field.split('.')
if (arrk) {
if (arrk.length >= 0)
mykey.value = arrk[0]
if (arrk.length > 1)
mysubkey.value = arrk[1]
if (arrk.length > 2)
mysubsubkey.value = arrk[2]
}
}
function showandsel(row: any, col: any, newval: any, valinitial: any) {
console.log('showandsel CMyFieldDb', row, col, newval)
if (newval !== valinitial)
setValDb($q, mykey.value, newval, col.value.fieldtype, false, props.table, mysubkey.value, props.id, props.indrec, mysubsubkey.value)
}
function withBorder() {
return col.value.fieldtype !== costanti.FieldType.onlydate && col.value.fieldtype !== costanti.FieldType.date
}
function getValue() {
let myvalue = ''
if (mysubkey.value !== '') {
if (props.rec[mykey.value] === undefined) {
myvalue = ''
} else {
myvalue = props.rec[mykey.value][mysubkey.value]
}
} else {
if (mykey.value !== '') {
myvalue = props.rec[mykey.value]
}
}
if (Array.isArray(myvalue)) {
if (myvalue.length === 0)
return null
}
return myvalue
}
function visuElem() {
return !!col.value.name && (props.canEdit || (!props.canEdit && getValue()))
}
onMounted(mounted)
return {
tools,
withBorder,
costanti,
fieldsTable,
globalStore,
mytitle,
col,
keytab,
optlab,
recordCol,
pickup,
tablesel,
jointable,
showandsel,
mykey,
mysubkey,
mysubsubkey,
visuElem,
}
},
})

View File

@@ -0,0 +1,59 @@
<template>
<div class="text-center">
<div v-if="visuElem()" class="row items-center justify-center q-gutter-md q-ma-xs">
<div class="q-ma-xs">
<q-field rounded outlined bg-color="blue-1" dense style="min-width:110px;">
<template v-slot:control>
<div class="centermydiv">
<div v-if="myimg" class="text-center">
<q-img
:src="myimg"
class="text-center"
style="height: 50px; width: 50px;"
:alt="mytitle">
</q-img>
</div>
<div v-if="mytitle" class="self-center full-width no-outline text-center" tabindex="0">{{ mytitle }}</div>
</div>
</template>
</q-field>
</div>
<div :class="` q-ma-sm q-pa-sm col-grow rounded-borders `" :style="withBorder() ? `border: 1px solid #bbb` : ``">
<CMyPopupEdit
v-bind="$attrs"
:isrec="true"
:table="table"
:title="mytitle"
:field="mykey"
:subfield="mysubkey"
:mysubsubkey="mysubsubkey"
:type="col.fieldtype"
:serv="false"
:disable="disable"
:jointable="jointable"
:myimg="myimg"
:canModify="canModify"
:canEdit="canEdit"
:visulabel="true"
:mycol="col"
:tablesel="tablesel"
:pickup="pickup"
v-model:row="rec"
minuteinterval="1"
@showandsave="showandsel"
>
</CMyPopupEdit>
</div>
</div>
</div>
</template>
<script lang="ts" src="./CMyFieldRec.ts">
</script>
<style lang="scss" scoped>
@import './CMyFieldRec.scss';
</style>

View File

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

View File

@@ -38,6 +38,11 @@ export default defineComponent({
required: false,
default: 0,
},
groupname: {
type: String,
required: false,
default: '',
}
},
setup(props, { emit }) {
const userStore = useUserStore()
@@ -218,7 +223,7 @@ export default defineComponent({
function refuseReqFriends(usernameDest: string) {
$q.dialog({
message: t('db.domanda_removefriend', { username: usernameDest }),
message: t('db.domanda_revoke_friend', { username: usernameDest }),
ok: { label: t('dialog.yes'), push: true },
cancel: { label: t('dialog.cancel') },
title: t('db.domanda')

View File

@@ -37,7 +37,8 @@
<CMyUser
:mycontact="mycontact"
@setCmd="setCmd"
:visu="visu">
:visu="visu"
:groupname="groupname">
</CMyUser>
</span>
</q-list>

View File

@@ -36,11 +36,6 @@
<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)">
@@ -67,37 +62,14 @@
</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-btn 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-list v-else-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, false)">
<q-item-section>{{ $t('groups.cancel_ask_group') }}</q-item-section>
</q-item>

View File

@@ -55,8 +55,8 @@ export default defineComponent({
arr = userStore.my.profile.mygroups
} else if (props.modelValue === costanti.MY_GROUPS) {
arr = userStore.my.profile.mygroups
// } else if (props.modelValue === costanti.REQ_GROUP) {
// arr = userStore.my.profile.req_groups
} else if (props.modelValue === costanti.MANAGE_GROUPS) {
arr = userStore.my.profile.manage_mygroups
} else if (props.modelValue === costanti.ASK_SENT_GROUP) {
arr = userStore.my.profile.asked_groups
}
@@ -70,7 +70,8 @@ export default defineComponent({
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 })
mybutt.push({ label: t('mypages.manage_my_groups') + ' (' + numManageGroups.value + ')', value: costanti.MANAGE_GROUPS })
mybutt.push({ label: t('mypages.follow_groups') + ' (' + numMyGroups.value + ')', value: costanti.MY_GROUPS })
if (numAskSentGroups.value > 0 || props.modelValue === costanti.ASK_SENT_GROUP)
mybutt.push({
@@ -81,7 +82,12 @@ export default defineComponent({
return mybutt
})
const numGroups = computed(() => {
const numManageGroups = computed(() => {
const arr = userStore.my.profile.manage_mygroups
return (arr) ? arr.length : 0
})
const numMyGroups = computed(() => {
const arr = userStore.my.profile.mygroups
return (arr) ? arr.length : 0
})
@@ -107,23 +113,6 @@ export default defineComponent({
}
}
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.mygroups = userStore.my.profile.mygroups.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 }),
@@ -142,7 +131,7 @@ export default defineComponent({
function setCmd(cmd: number, groupnameDest: string, value: any = '') {
if (cmd === shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP) {
removeFromMyGroups(groupnameDest)
tools.removeFromMyGroups($q, username.value, groupnameDest)
} else if (cmd === shared_consts.GROUPSCMD.BLOCK_GROUP) {
blockGroup(groupnameDest)
} else if (cmd === shared_consts.GROUPSCMD.SETGROUP) {

View File

@@ -36,6 +36,11 @@ export default defineComponent({
type: Object,
required: true,
},
isrec: {
type: Boolean,
required: false,
default: false,
},
mycol: {
type: Object as PropType<IColGridTable>,
required: true,
@@ -191,36 +196,43 @@ export default defineComponent({
function crea() {
// console.log('crea', isFieldDb())
if (isFieldDb()) {
// mykey -> field
// mysubkey -> subfield
// table -> table
// serv -> serv
// id -> id
// idmain -> idmain
if (props.isrec) {
col.value = props.mycol
// console.table(props)
myvalue.value = getValDb(props.field, props.serv, '', props.table, props.subfield, props.id, props.idmain)
// console.log('myvalue.value', myvalue.value)
col.value.jointable = props.jointable
col.value.fieldtype = props.type
col.value.label = props.title
if (props.type === costanti.FieldType.image) {
myImgGall.value = [{
_id: '',
imagefile: myvalue.value,
// order: 1,
alt: 'img',
}]
}
// console.log('col', col.value);
} else {
col.value = {...props.mycol}
if (isFieldDb()) {
// mykey -> field
// mysubkey -> subfield
// table -> table
// serv -> serv
// id -> id
// idmain -> idmain
// console.table(props)
myvalue.value = getValDb(props.field, props.serv, '', props.table, props.subfield, props.id, props.idmain)
// console.log('myvalue.value', myvalue.value)
col.value.jointable = props.jointable
col.value.fieldtype = props.type
col.value.label = props.title
if (props.type === costanti.FieldType.image) {
myImgGall.value = [{
_id: '',
imagefile: myvalue.value,
// order: 1,
alt: 'img',
}]
}
// console.log('col', col.value);
} else {
col.value = { ...props.mycol }
}
}
console.log('col.value', col.value)
// console.log('CMyFieldDb crea', myvalue)
}
@@ -307,7 +319,7 @@ export default defineComponent({
try {
// console.log('mounted', 'isFieldDb()', isFieldDb())
if (isFieldDb()) {
if (isFieldDb() && !props.isrec) {
} else {
if (props.subfield !== '') {

View File

@@ -25,6 +25,11 @@ export default defineComponent({
visu: {
type: Number,
required: true,
},
groupname: {
type: String,
required: false,
default: '',
}
},
@@ -82,6 +87,7 @@ export default defineComponent({
setCmd,
shared_consts,
userStore,
tools,
}
},
})

View File

@@ -51,6 +51,50 @@
</q-btn>
</q-item-label>
</q-item-section>
<q-item-section side v-if="visu === costanti.REQ_ADD_USER_TO_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="tools.addToMyGroups($q, contact.username, groupname)">
<q-item-section avatar>
<q-icon color="positive" name="fas fa-user-plus" />
</q-item-section>
<q-item-section>
{{ $t('groups.accept_group') }}</q-item-section>
</q-item>
</q-list>
<q-list style="min-width: 200px">
<q-item clickable v-close-popup
@click="tools.cancelReqGroups($q, contact.username, groupname)">
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<q-item-section>{{ $t('groups.refuse_ask_group_short') }}</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_REMOVE_USER_TO_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="tools.removeFromMyGroups($q, contact.username, groupname)">
<q-item-section avatar>
<q-icon color="negative" name="fas fa-user-minus" />
</q-item-section>
<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.ASK_SENT_FRIENDS">
<q-item-label>
<q-btn rounded icon="fas fa-ellipsis-h">

View File

@@ -8,7 +8,7 @@
:prop_mycolumns="colmySkills"
prop_colkey="idSkill"
col_title="subTitle"
:vertical="true"
:vertical="-1"
:choose_visutype="!visuinpage"
:butt_modif_new="!visuinpage"
nodataLabel="Nessuna Competenza inserita"

View File

@@ -14,6 +14,7 @@ export * from './CImgTitle'
export * from './CMyAvatar'
export * from './CMyCart'
export * from './CMyFieldDb'
export * from './CMyFieldRec'
export * from './CMyPage'
export * from './CMyTeacher'
export * from './CProfile'