diff --git a/src/common/shared_vuejs.ts b/src/common/shared_vuejs.ts index 8bdab685..04773af9 100755 --- a/src/common/shared_vuejs.ts +++ b/src/common/shared_vuejs.ts @@ -17,8 +17,8 @@ export const shared_consts = { QUERYTYPE_MYGROUP: 1, QUERYTYPE_REFUSED_USER_GRP: 2, - ALL_SAW_AND_ACCEPTED: 3, + QUERYTYPE_CIRCUIT: 10, FILTER_EXTRALIST_NOT_REGISTERED: 1, FILTER_EXTRALIST_NOT_CONTACTED: 2, @@ -125,6 +125,8 @@ export const shared_consts = { TABLES_VISU_IMG: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups'], TABLES_DIRECTORY_A_PARTE: ['mygroups'], + TABLES_WITH_ADMINS: ['mygroups', 'circuits'], + TABLES_DIRECTORY_SINGLE_IMG: ['circuits'], VISIB_ALL: 0, VISIB_ONLYIF_VERIFIED: 1, diff --git a/src/components/CFinder/CFinder.ts b/src/components/CFinder/CFinder.ts index f901f97b..60dbe5e1 100755 --- a/src/components/CFinder/CFinder.ts +++ b/src/components/CFinder/CFinder.ts @@ -49,6 +49,7 @@ export default defineComponent({ const searchList_Servizi = ref([]) const searchList_Beni = ref([]) const searchList_MyGroups = ref([]) + const searchList_MyCircuits = ref([]) const searchList_Events = ref([]) const searchList_Hosp = ref([]) @@ -89,6 +90,12 @@ export default defineComponent({ $elemMatch: { username: { $eq: userStore.my.username } } }, }] + } else if (props.table === toolsext.TABCIRCUITS) { + filtercustom.value = [{ + 'admins': { + $elemMatch: { username: { $eq: userStore.my.username } } + }, + }] } else { filtercustom.value = [{ userId: userStore.my._id }] @@ -118,6 +125,8 @@ export default defineComponent({ return searchList_Servizi.value else if (props.table === toolsext.TABMYGROUPS) return searchList_MyGroups.value + else if (props.table === toolsext.TABCIRCUITS) + return searchList_MyCircuits.value else if (props.table === toolsext.TABMYBACHECAS) return searchList_Events.value else if (props.table === toolsext.TABMYHOSPS) @@ -133,6 +142,8 @@ export default defineComponent({ return costanti.SHOW_MYCARD else if (props.table === toolsext.TABMYGROUPS) return costanti.SHOW_MYCARD + else if (props.table === toolsext.TABCIRCUITS) + return costanti.SHOW_MYCARD return costanti.SHOW_MYCARD }) @@ -144,6 +155,8 @@ export default defineComponent({ return 'nome del Servizio o settore da cercare' else if (props.table === toolsext.TABMYGROUPS) return 'nome del Gruppo da cercare' + else if (props.table === toolsext.TABCIRCUITS) + return 'nome del Circuito da cercare' else if (props.table === toolsext.TABMYBACHECAS) return 'nome dell\'Evento da cercare' else if (props.table === toolsext.TABMYHOSPS) @@ -172,6 +185,8 @@ export default defineComponent({ return 'Nessun Servizio trovato con i filtri selezionati' else if (props.table === toolsext.TABMYGROUPS) return 'Nessun Gruppo trovato con i filtri selezionati' + else if (props.table === toolsext.TABCIRCUITS) + return 'Nessun Circuito trovato con i filtri selezionati' else if (props.table === toolsext.TABMYBACHECAS) return 'Nessun Evento trovato con i filtri selezionati' else if (props.table === toolsext.TABMYHOSPS) @@ -817,6 +832,21 @@ export default defineComponent({ ] + searchList_MyCircuits.value = [ + { + label: 'Regione', + table: 'regions', + key: 'idReg', + type: costanti.FieldType.select, + value: tools.getCookie(tools.COOK_SEARCH + 'regions', costanti.FILTER_TUTTI), + addall: true, + arrvalue: [], + filter: null, + useinput: false, + icon: 'fas fa-globe-europe' + }, + ] + searchList_MyGroups.value = [ { label: 'Regione', @@ -1247,6 +1277,8 @@ export default defineComponent({ return tools.getdefaultnewrec_MyGoods() } else if (props.table === toolsext.TABMYGROUPS) { return tools.getdefaultnewrec_MyGroup() + } else if (props.table === toolsext.TABCIRCUITS) { + return tools.getdefaultnewrec_Circuit() } return null } diff --git a/src/components/CGridTableRec/CGridTableRec.ts b/src/components/CGridTableRec/CGridTableRec.ts index 6bb688a6..7c260655 100755 --- a/src/components/CGridTableRec/CGridTableRec.ts +++ b/src/components/CGridTableRec/CGridTableRec.ts @@ -25,6 +25,7 @@ import { CMyGroups } from '../CMyGroups' import { CMyFieldDb } from '../CMyFieldDb' import { CMyRecCard } from '../CMyRecCard' import { CMyRecGrpCard } from '../CMyRecGrpCard' +import { CMyRecCircuitCard } from '../CMyRecCircuitCard' import { CMySelect } from '../CMySelect' import { CTitleBanner } from '../CTitleBanner' @@ -36,6 +37,7 @@ import translate from '@/globalroutines/util' import { toolsext } from '@store/Modules/toolsext' import { CMyCardPopup } from '@/components/CMyCardPopup' import { CMyCardGrpPopup } from '@/components/CMyCardGrpPopup' +import { CMyCardCircuitPopup } from '@/components/CMyCardCircuitPopup' import { useRouter } from 'vue-router' export default defineComponent({ @@ -216,7 +218,9 @@ export default defineComponent({ default: '', }, }, - components: { CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups, CMyUser, CMyRecCard, CMyCardPopup, CMyRecGrpCard, CMyCardGrpPopup }, + components: { CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups, + CMyUser, CMyRecCard, CMyCardPopup, CMyRecGrpCard, CMyCardGrpPopup, CMyCardCircuitPopup, + CMyRecCircuitCard }, setup(props, { emit }) { const $q = useQuasar() const { t } = useI18n() @@ -918,6 +922,7 @@ export default defineComponent({ } function refresh_infscroll(done: any) { + console.log('refresh_infscroll') rowclicksel.value = null onUpdateData(0, diff --git a/src/components/CGridTableRec/CGridTableRec.vue b/src/components/CGridTableRec/CGridTableRec.vue index b79758e2..5af8bbd6 100755 --- a/src/components/CGridTableRec/CGridTableRec.vue +++ b/src/components/CGridTableRec/CGridTableRec.vue @@ -228,6 +228,13 @@ @cmdext="cmdExt" > + +
- -
- -
- {{ actual = tools.getstrVeryShortDate(props.row.dateTimeStart) }} - {{ tools.getstrDateLong(props.row.dateTimeStart) }} -
-
- - - - - - -
-
-
- - - - - -
- -
-
-
- - -
- -
-
@@ -738,6 +684,12 @@ :prop_myrec="myrecdialog"> + + + , + required: false, + default: null, + }, + idRec: { + type: Number, + required: false, + default: 0 + } + }, + setup(props) { + + const userStore = useUserStore() + const notifStore = useNotifStore() + const globalStore = useGlobalStore() + const $q = useQuasar() + const $route = useRoute() + const { t } = useI18n() + + const showPic = ref(false) + + const idnotif = computed(() => $route.query.idnotif ? $route.query.idnotif.toString() : '') + + const myrec = ref({}) + const col = ref({}) + + function profile() { + return userStore.my.profile + } + + function load() { + // Carica il profilo di quest'utente + if (props.idRec && props.idRec > 0) { + userStore.loadGeneric(props.table, props.idRec, idnotif.value).then((ris) => { + myrec.value = ris + notifStore.setAsRead(idnotif.value) + }) + + } else { + myrec.value = props.prop_myrec + } + + col.value = fieldsTable.getArrColsByTable(props.table) + } + + watch(() => props.idRec, (to: any, from: any) => { + load() + }) + + function mounted() { + load() + } + + function condividipag() { + const msg = self.location.host + tools.getPathByCircuit(myrec.value, props.table) + return tools.copyStringToClipboard($q, msg, true) + } + + onMounted(mounted) + + return { + profile, + tools, + costanti, + myrec, + shared_consts, + globalStore, + showPic, + userStore, + t, + fieldsTable, + colCitys, + toolsext, + col, + condividipag, + } + } +}) diff --git a/src/components/CMyCardCircuitPopup/CMyCardCircuitPopup.vue b/src/components/CMyCardCircuitPopup/CMyCardCircuitPopup.vue new file mode 100644 index 00000000..79e11ebd --- /dev/null +++ b/src/components/CMyCardCircuitPopup/CMyCardCircuitPopup.vue @@ -0,0 +1,100 @@ + + + + + + diff --git a/src/components/CMyCardCircuitPopup/index.ts b/src/components/CMyCardCircuitPopup/index.ts new file mode 100644 index 00000000..b5c492eb --- /dev/null +++ b/src/components/CMyCardCircuitPopup/index.ts @@ -0,0 +1 @@ +export { default as CMyCardCircuitPopup } from './CMyCardCircuitPopup.vue' diff --git a/src/components/CMyCircuit/CMyCircuit.scss b/src/components/CMyCircuit/CMyCircuit.scss new file mode 100755 index 00000000..b892863a --- /dev/null +++ b/src/components/CMyCircuit/CMyCircuit.scss @@ -0,0 +1,4 @@ +.myflex{ + display: flex; + flex: 1; +} diff --git a/src/components/CMyCircuit/CMyCircuit.ts b/src/components/CMyCircuit/CMyCircuit.ts new file mode 100755 index 00000000..96e48251 --- /dev/null +++ b/src/components/CMyCircuit/CMyCircuit.ts @@ -0,0 +1,93 @@ +import { defineComponent, onMounted, PropType, ref, watch } from 'vue' +import { useUserStore } from '@store/UserStore' +import { ICircuit, IImgGallery, IUserFields, IUserProfile, IFriends } 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' +import { CUserNonVerif } from '@/components/CUserNonVerif' +import { toolsext } from '@store/Modules/toolsext' + +export default defineComponent({ + name: 'CMyCircuit', + emits: ['setCmd'], + components: {CUserNonVerif}, + props: { + mycircuit: { + type: Object as PropType, + required: false, + default: null, + }, + circuitname: { + 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 circuit = ref(null) + + const table = ref(toolsext.TABCIRCUITS) + + watch(() => props.mycircuit, (newval, oldval) => { + mounted() + }) + + function mounted() { + if (!props.mycircuit) { + if (props.circuitname) { + circuit.value = null + } + } else { + if (props.mycircuit) { + circuit.value = props.mycircuit + } + } + } + + function getImgCircuit(circuit: ICircuit) { + return userStore.getImgByCircuit(circuit) + } + + function naviga(path: string) { + $router.push(path) + } + + function setCmd(cmd: number, myusername: string, value: any = '') { + emit('setCmd', cmd, myusername, value) + } + + function myusername() { + return userStore.my.username + } + + onMounted(mounted) + + return { + circuit, + costanti, + getImgCircuit, + naviga, + setCmd, + shared_consts, + userStore, + tools, + table, + myusername, + } + }, +}) diff --git a/src/components/CMyCircuit/CMyCircuit.vue b/src/components/CMyCircuit/CMyCircuit.vue new file mode 100755 index 00000000..d44dbfa1 --- /dev/null +++ b/src/components/CMyCircuit/CMyCircuit.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/components/CMyCircuit/index.ts b/src/components/CMyCircuit/index.ts new file mode 100755 index 00000000..d13bb6ff --- /dev/null +++ b/src/components/CMyCircuit/index.ts @@ -0,0 +1 @@ +export { default as CMyCircuit } from './CMyCircuit.vue' diff --git a/src/components/CMyCircuits/CMyCircuits.scss b/src/components/CMyCircuits/CMyCircuits.scss new file mode 100755 index 00000000..e69de29b diff --git a/src/components/CMyCircuits/CMyCircuits.ts b/src/components/CMyCircuits/CMyCircuits.ts new file mode 100755 index 00000000..2e39e74e --- /dev/null +++ b/src/components/CMyCircuits/CMyCircuits.ts @@ -0,0 +1,131 @@ +import { CMyCircuit } from '@/components/CMyCircuit' +import { computed, defineComponent, onMounted, PropType, ref, toRef } from 'vue' +import { useUserStore } from '@store/UserStore' +import { useCircuitStore } from '@store/CircuitStore' +import { useI18n } from '@/boot/i18n' +import { useQuasar } from 'quasar' +import { costanti } from '@costanti' +import { ICircuit, ISearchList, IUserFields } from 'model' +import { shared_consts } from '@/common/shared_vuejs' +import { tools } from '@store/Modules/tools' +import { CUserNonVerif } from '@/components/CUserNonVerif' + + +export default defineComponent({ + name: 'CMyCircuits', + components: { CMyCircuit, CUserNonVerif }, + emits: ['update:modelValue'], + props: { + modelValue: { + type: Number, + required: false, + default: 0, + }, + finder: { + type: Boolean, + required: true, + }, + circuit: { + type: Object as PropType, + required: false, + default: null, + }, + circuitname: { + type: String, + required: false, + default: null, + }, + visu: { + type: Number, + required: false, + default: 0, + }, + }, + setup(props, { emit }) { + const userStore = useUserStore() + const circuitStore = useCircuitStore() + const $q = useQuasar() + const { t } = useI18n() + + const username = ref('') + + const filtroutente = ref([]) + + const listcircuitsfiltered = computed(() => { + let arr: any[] = [] + try { + if (props.modelValue === costanti.CIRCUITS) { + arr = circuitStore.listcircuits + } else if (props.modelValue === costanti.MY_USERACCOUNTS ) { + arr = userStore.my.profile.listUserAccounts + } else if (props.modelValue === costanti.MANAGE_CIRCUITS) { + // arr = userStore.my.profile.manage_mycircuits + } else if (props.modelValue === costanti.ASK_SENT_CIRCUIT) { + arr = userStore.my.profile.asked_circuits + } + } catch (e) { + arr = [] + } + + return arr + }) + + const myoptions = computed(() => { + const mybutt = [] + mybutt.push({ label: t('mypages.find_circuit'), value: costanti.FIND_CIRCUIT }) + mybutt.push({ label: t('mypages.follow_circuits') + ' (' + numMyCircuits.value + ')', value: costanti.MY_USERACCOUNTS }) + // mybutt.push({ label: t('mypages.manage_my_circuits') + ' (' + numManageCircuits.value + ')', value: costanti.MANAGE_CIRCUITS }) + + + if (numAskSentCircuits.value > 0 || props.modelValue === costanti.ASK_SENT_CIRCUIT) + mybutt.push({ + label: t('mypages.request_sent_circuits') + ' (' + numAskSentCircuits.value + ')', + value: costanti.ASK_SENT_CIRCUIT + }) + + + return mybutt + }) + + + const numMyCircuits = computed(() => { + const arr = userStore.my.profile.listUserAccounts + return (arr) ? arr.length : 0 + }) + + const numAskSentCircuits = computed(() => { + const arr = userStore.my.profile.asked_circuits + return (arr) ? arr.length : 0 + }) + + async function loadCircuits() { + // Carica il profilo di quest'utente + if (username.value) { + filtroutente.value = await tools.loadCircuits() + } + } + + function mounted() { + username.value = userStore.my.username + loadCircuits() + + } + + function updateValue(val: number) { + emit('update:modelValue', val) + } + + onMounted(mounted) + + return { + tools, + costanti, + shared_consts, + filtroutente, + listcircuitsfiltered, + updateValue, + myoptions, + userStore, + } + } +}) diff --git a/src/components/CMyCircuits/CMyCircuits.vue b/src/components/CMyCircuits/CMyCircuits.vue new file mode 100755 index 00000000..7a83af77 --- /dev/null +++ b/src/components/CMyCircuits/CMyCircuits.vue @@ -0,0 +1,55 @@ + + + + + + diff --git a/src/components/CMyCircuits/index.ts b/src/components/CMyCircuits/index.ts new file mode 100755 index 00000000..4f862678 --- /dev/null +++ b/src/components/CMyCircuits/index.ts @@ -0,0 +1 @@ +export {default as CMyCircuits} from './CMyCircuits.vue' diff --git a/src/components/CMyGroup/CMyGroup.vue b/src/components/CMyGroup/CMyGroup.vue index b582148c..c617c107 100755 --- a/src/components/CMyGroup/CMyGroup.vue +++ b/src/components/CMyGroup/CMyGroup.vue @@ -83,7 +83,7 @@ - + diff --git a/src/components/CMyRecCircuitCard/CMyRecCircuitCard.scss b/src/components/CMyRecCircuitCard/CMyRecCircuitCard.scss new file mode 100755 index 00000000..8c313dec --- /dev/null +++ b/src/components/CMyRecCircuitCard/CMyRecCircuitCard.scss @@ -0,0 +1,30 @@ +.myflex{ + display: flex; + flex: 1; +} + +.text_user_city{ + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + font-size: 0.85rem; + color: grey; +} + + +.actualdate{ + +} + + +.cardrec{ + @media (min-width: 500px) { + margin: 1px; + padding: 4px; + } + +} + +.text_title{ + color: blue; +} diff --git a/src/components/CMyRecCircuitCard/CMyRecCircuitCard.ts b/src/components/CMyRecCircuitCard/CMyRecCircuitCard.ts new file mode 100755 index 00000000..66f31fed --- /dev/null +++ b/src/components/CMyRecCircuitCard/CMyRecCircuitCard.ts @@ -0,0 +1,74 @@ +import { defineComponent, onMounted, PropType, ref, watch } from 'vue' +import { useUserStore } from '@store/UserStore' +import { IImgGallery, IUserFields, IUserProfile } from 'model' +import { costanti } from '@costanti' +import { shared_consts } from '@/common/shared_vuejs' +import { fieldsTable } from '@store/Modules/fieldsTable' +import { tools } from '@store/Modules/tools' +import { toolsext } from '@store/Modules/toolsext' +import { useQuasar } from 'quasar' +import { useI18n } from '@/boot/i18n' +import { CMyCardPopup } from '@/components/CMyCardPopup' +// import { useRouter } from 'vue-router' + +export default defineComponent({ + name: 'CMyRecCircuitCard', + components: { CMyCardPopup }, + emits: ['setCmd', 'cmdext'], + props: { + table: { + type: String, + required: true, + }, + prop_myrec: { + type: Object as PropType, + required: false, + default: null, + }, + }, + + setup(props, { emit }) { + + const userStore = useUserStore() + // const $q = useQuasar() + const { t } = useI18n() + // const $router = useRouter() + + const myrec = ref(null) + + watch(() => props.prop_myrec, (newval, oldval) => { + + mounted() + }) + + function mounted() { + if (props.prop_myrec) { + myrec.value = props.prop_myrec + } + } + + function setCmd($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) { + emit('cmdext', cmd, val1, val2) + } + + onMounted(mounted) + + return { + t, + myrec, + costanti, + // naviga, + setCmd, + shared_consts, + userStore, + tools, + toolsext, + fieldsTable, + cmdExt, + } + }, +}) diff --git a/src/components/CMyRecCircuitCard/CMyRecCircuitCard.vue b/src/components/CMyRecCircuitCard/CMyRecCircuitCard.vue new file mode 100755 index 00000000..22a5bf61 --- /dev/null +++ b/src/components/CMyRecCircuitCard/CMyRecCircuitCard.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/components/CMyRecCircuitCard/index.ts b/src/components/CMyRecCircuitCard/index.ts new file mode 100755 index 00000000..2eb354d8 --- /dev/null +++ b/src/components/CMyRecCircuitCard/index.ts @@ -0,0 +1 @@ +export { default as CMyRecCircuitCard } from './CMyRecCircuitCard.vue' diff --git a/src/components/index.ts b/src/components/index.ts index 40df9f78..8b25d9ec 100755 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -43,12 +43,15 @@ export * from './CMyUser' export * from './CVerifyTelegram' export * from './CMyFriends' export * from './CMyGroups' +export * from './CMyCircuits' export * from './CDashboard' export * from './CMainView' export * from './CLabel' export * from './CBigBtn' export * from './CMyRecCard' export * from './CMyRecGrpCard' +export * from './CMyRecCircuitCard' +export * from './CMyCardCircuitPopup' export * from './CPresentazione' export * from './CAccomodation' export * from './COpenStreetMap' diff --git a/src/db/static_data.ts b/src/db/static_data.ts index 2bc95162..df30667d 100755 --- a/src/db/static_data.ts +++ b/src/db/static_data.ts @@ -24,6 +24,7 @@ const functionality: IFunctionality = { ENABLE_ECOMMERCE: false, ENABLE_REG_ISP: true, ENABLE_GROUPS: true, + ENABLE_CIRCUITS: true, SHOW_COMPETENZE: true, ENABLE_VIEW_GROUPS: true, ENABLE_VIEW_USERS: true, @@ -588,6 +589,17 @@ const baseroutes: IListRoutes[] = [ inmenu: true, infooter: true, }, + { + active: functionality.ENABLE_CIRCUITS, + order: 133, + path: '/circuits', + materialIcon: 'fas fa-coins', + name: 'mypages.circuits', + component: () => import('@/views/user/mycircuits/mycircuits.vue'), + meta: { requiresAuth: true }, + inmenu: true, + infooter: true, + }, { active: true, order: 135, @@ -609,6 +621,16 @@ const baseroutes: IListRoutes[] = [ meta: { requiresAuth: true, newpage: true }, inmenu: false, infooter: false, + },{ + active: true, + order: 137, + path: '/circuit/:name', + materialIcon: 'fas fa-user', + name: 'proj.circuit2', + component: () => import('@/views/user/mycircuit/mycircuit.vue'), + meta: { requiresAuth: true, newpage: true }, + inmenu: false, + infooter: false, }, { active: true, diff --git a/src/model/GlobalStore.ts b/src/model/GlobalStore.ts index 54b8e785..c855da39 100755 --- a/src/model/GlobalStore.ts +++ b/src/model/GlobalStore.ts @@ -1,5 +1,5 @@ import { IAction } from '@src/model/Projects' -import { IMyGroup, IPaymentType } from '@src/model/UserStore' +import { IFriends, IMyGroup, IPaymentType } from '@src/model/UserStore' import { IDepartment, IProducer, IShareWithUs, IStorehouse, } from '@src/model/Products' @@ -498,6 +498,7 @@ export interface IFunctionality { ENABLE_REG_ISP?: boolean SHOW_NAMESURNAME?: boolean ENABLE_GROUPS?: boolean + ENABLE_CIRCUITS?: boolean SHOW_COMPETENZE?: boolean ENABLE_VIEW_GROUPS?: boolean ENABLE_VIEW_USERS?: boolean @@ -888,6 +889,7 @@ export interface ICircuitList { inscription_date?: Date } + export interface ICircuit { _id: number groupnameId: string @@ -916,5 +918,17 @@ export interface ICircuit { ultimo_deper?: Date durata_deper?: number img_logo?: string + date_created?: Date + date_updated?: Date + admins?: IFriends[] + createdBy?: string } +export interface IAccount { + username: string + circuitId: number + name: string + deperibile?: boolean + importo_iniziale?: number + saldo?: number +} diff --git a/src/model/UserStore.ts b/src/model/UserStore.ts index a2c56be5..e9e6ce8c 100755 --- a/src/model/UserStore.ts +++ b/src/model/UserStore.ts @@ -1,6 +1,6 @@ import { IToken } from '@model/other' import { ICart, IOrderCart, IShareWithUs } from '@src/model/Products' -import { ICircuit, ICircuitList, IGallery, IImgGallery } from '@model/GlobalStore' +import { IAccount, ICircuit, ICircuitList, IGallery, IImgGallery } from '@model/GlobalStore' const enum ESexType { None = 0, @@ -100,6 +100,12 @@ export interface IUserProfile { asked_groups: any[] refused_groups: any[] list_usersgroup?: IFriends[] + + asked_circuits: any[] + refused_circuits: any[] + listUserAccounts: IAccount[] + manage_mycircuits?: ICircuit[] + } export interface IPaymentType { diff --git a/src/statics/lang/it.js b/src/statics/lang/it.js index cb30f236..40e3427d 100755 --- a/src/statics/lang/it.js +++ b/src/statics/lang/it.js @@ -693,6 +693,7 @@ const msg_it = { themebgcolor: 'Tema Colore Sfondo', group: 'Gruppo', group2: 'Gruppo2', + circuit2: 'Circuit2', respUsername: 'Responsabile', viceRespUsername: 'Vice Responsabile', vice2RespUsername: 'Vice 2 Responsabile', @@ -996,6 +997,9 @@ const msg_it = { trusted: 'Fiducia Accettata', rejected: 'Rifiutati', provapao: 'Prova pao', + circuits: 'Circuiti', + find_circuit: 'Cerca Circuito', + follow_circuits: 'Circuiti di cui fai parte', }, friends: { accept_trust: 'Accetta Fiducia', diff --git a/src/store/CircuitStore.ts b/src/store/CircuitStore.ts new file mode 100755 index 00000000..041a65e9 --- /dev/null +++ b/src/store/CircuitStore.ts @@ -0,0 +1,54 @@ +import { defineStore } from 'pinia' + +import { + ICircuit, +} from '@src/model' +import { tools } from '@store/Modules/tools' +import translate from '@src/globalroutines/util' + +import * as Types from '@src/store/Api/ApiTypes' +import { useGlobalStore } from '@store/globalStore' +import { serv_constants } from '@store/Modules/serv_constants' +import { Api } from '@api' +import { toolsext } from '@store/Modules/toolsext' +import { static_data } from '@src/db/static_data' + + +import { shared_consts } from '@/common/shared_vuejs' +import { costanti } from '@costanti' + +import globalroutines from '../globalroutines/index' + +export const useCircuitStore = defineStore('CircuitStore', { + state: () => ({ + listcircuits: [] + }), + + getters: { + + + }, + + actions: { + getImgByCircuit(circ: ICircuit): string { + + try { + return costanti.DIR_UPLOAD + 'circuits/' + circ.img_logo + } catch (e) { + } + return 'images/noimg.png' + }, + + + async loadCircuits() { + return Api.SendReq('/users/circuits', 'POST', null) + .then((res) => { + return res.data + }).catch((error) => { + return {} + }) + + }, + + }, +}) diff --git a/src/store/Modules/costanti.ts b/src/store/Modules/costanti.ts index e2b67a0d..7b61f3b6 100755 --- a/src/store/Modules/costanti.ts +++ b/src/store/Modules/costanti.ts @@ -180,6 +180,7 @@ export const costanti = { FIND_PEOPLE: 10, GROUPS: 11, + CIRCUITS: 12, GRP_REJECTED: 14, REQ_GROUP: 15, ASK_SENT_GROUP: 16, @@ -189,6 +190,12 @@ export const costanti = { CREATE_GROUP: 30, MANAGE_GROUPS: 31, ADMIN_GROUPS: 40, + FIND_CIRCUIT: 50, + MY_USERACCOUNTS: 51, + CREATE_CIRCUIT: 52, + MANAGE_CIRCUITS: 53, + ADMIN_CIRCUITS: 54, + ASK_SENT_CIRCUIT: 55, CMD_DELETE: 1, CMD_MODIFY: 2, diff --git a/src/store/Modules/fieldsTable.ts b/src/store/Modules/fieldsTable.ts index d642c8f8..b8c50153 100755 --- a/src/store/Modules/fieldsTable.ts +++ b/src/store/Modules/fieldsTable.ts @@ -614,13 +614,6 @@ export const colmyUserGroup = [ sortable: true, showWhen: 0 }), - AddCol({ - name: 'date_updated', label_trans: 'reg.pub_updated', fieldtype: costanti.FieldType.onlydate, - required: false, - visible: false, - sortable: true, - showWhen: 0 - }), AddCol({ name: 'photos', label_trans: 'skill.photos', @@ -2416,6 +2409,28 @@ export const colTableCircuitComplete = [ AddCol({ name: 'ultimo_deper', label_trans: 'circuit.ultimo_deper', fieldtype: costanti.FieldType.date }), AddCol({ name: 'durata_deper', label_trans: 'circuit.durata_deper', fieldtype: costanti.FieldType.number }), AddCol({ name: 'img_logo', label_trans: 'circuit.img_logo' }), + AddCol({ + name: 'admins', + label_trans: 'groups.admins', + fieldtype: costanti.FieldType.multiselect, + jointable: 'friendsandme', + field_outtype: costanti.FieldType.object, + showWhen: costanti.showWhen.InView_OnlyifExist, + }), + AddCol({ + name: 'date_created', label_trans: 'reg.pub_created', fieldtype: costanti.FieldType.onlydate, + required: false, + visible: false, + sortable: true, + showWhen: 0 + }), + AddCol({ + name: 'date_updated', label_trans: 'reg.pub_updated', fieldtype: costanti.FieldType.onlydate, + required: false, + visible: false, + sortable: true, + showWhen: 0 + }), AddCol(DeleteRec), AddCol(DuplicateRec), ] @@ -2435,7 +2450,7 @@ export const colTableCircuit = [ AddCol(DuplicateRec), ] -export const colTableAccount = [ +export const colmyUserCircuit = [ AddCol({ name: 'circuitId', label_trans: 'account.circuitId', fieldtype: costanti.FieldType.number }), AddCol({ name: 'userId', label_trans: 'account.users', fieldtype: costanti.FieldType.select, jointable: 'users', }), AddCol({ name: 'name', label_trans: 'circuit.name' }), @@ -2575,7 +2590,7 @@ export const fieldsTable = { }, accountslist() { - return colTableAccount + return colmyUserCircuit }, movslist() { diff --git a/src/store/Modules/tools.ts b/src/store/Modules/tools.ts index 9f42dc83..8240f160 100644 --- a/src/store/Modules/tools.ts +++ b/src/store/Modules/tools.ts @@ -3,7 +3,7 @@ import { IColGridTable, IColl, ICollaborations, IDataToSet, - IEvents, IFriends, IMyGroup, + IEvents, IFriends, IMyGroup, ICircuit, IListRoutes, IParamDialog, IPathFile, @@ -36,6 +36,7 @@ import { serv_constants } from '@store/Modules/serv_constants' import { useProjectStore } from '@store/Projects' import { useTodoStore } from '@store/Todos' import { useUserStore } from '@store/UserStore' +import { useCircuitStore } from '@store/CircuitStore' import { useCalendarStore } from '@store/CalendarStore' import { Router } from 'vue-router' import { AxiosResponse, default as Axios } from 'axios' @@ -65,6 +66,7 @@ export const tools = { FRIENDS_SEARCH: 'FR_SE', GROUP_SEARCH: 'GR_SE', + CIRCUIT_SEARCH: 'CI_SE', getprefCountries: ['it', 'es', 'us'], @@ -5159,6 +5161,28 @@ export const tools = { return risultato + }, + iAmAdminCircuit(name: string) { + const userStore = useUserStore() + + let risultato = false + + if (userStore.my.profile.manage_mycircuits) { + const ris = userStore.my.profile.manage_mycircuits.find((circuit: ICircuit) => { + if (circuit.name === name) { + return true + } + }) + // console.log('ris', ris) + if (ris && ris.admins) { + const isadmin = ris.admins.find((user: IFriends) => user.username === userStore.my.username) + risultato = !!isadmin + } + + } + + return risultato + }, iAmPartOfThisGroup(grp: IMyGroup) { @@ -5238,6 +5262,68 @@ export const tools = { return risultato + }, + iAmTheCreatorOfTheCircuit(name: string) { + const userStore = useUserStore() + + let risultato = false + + if (userStore.my.profile.manage_mycircuits) { + const ris = userStore.my.profile.manage_mycircuits.find((circuit: ICircuit) => { + if (circuit.name === name) { + return true + } + }) + // console.log('ris', ris) + return (ris && ris.createdBy === userStore.my.username) + + } + + return risultato + + }, + + isUserTheCreatorOfThCircuit(name: string, username: string) { + const userStore = useUserStore() + + let risultato = false + + if (userStore.my.profile.manage_mycircuits) { + const ris = userStore.my.profile.manage_mycircuits.find((circuit: ICircuit) => { + if (circuit.name === name) { + return true + } + }) + // console.log('ris', ris) + return (ris && ris.createdBy === username) + + } + + return risultato + + }, + + isUserAdminCircuit(name: string, username: string) { + const userStore = useUserStore() + + let risultato = false + + if (userStore.my.profile.manage_mycircuits) { + const ris = userStore.my.profile.manage_mycircuits.find((circuit: ICircuit) => { + if (circuit.name === name) { + return true + } + }) + // console.log('ris', ris) + if (ris && ris.admins) { + const isadmin = ris.admins.find((user: IFriends) => user.username === username) + risultato = !!isadmin + } + + } + + return risultato + }, setCmd($q: any, cmd: number, username: string, value: any, dest: string) { @@ -5457,6 +5543,15 @@ export const tools = { link_telegram: '', } }, + getdefaultnewrec_Circuit(): any { + return { + _id: 0, + name: '', + subname: '', + img_logo: '', + admins: [], + } + }, getdefaultnewrec_MyBacheca(): any { @@ -5508,6 +5603,8 @@ export const tools = { return 'mygood' } else if (table === toolsext.TABMYGROUPS) { return 'grp' + } else if (table === toolsext.TABCIRCUITS) { + return 'circuit' } return '' @@ -5516,6 +5613,8 @@ export const tools = { getFullFileName(arrimage: IImgGallery[], table: string, username: string, groupname: string) { if (shared_consts.TABLES_DIRECTORY_A_PARTE.includes(table)) { return `upload/${table}/` + groupname + '/' + arrimage[0].imagefile + } else if (shared_consts.TABLES_DIRECTORY_SINGLE_IMG.includes(table)) { + return `upload/${table}/` + groupname + '/' + arrimage[0].imagefile } else { if (arrimage && arrimage.length > 0) { return 'upload/profile/' + username + '/' + table + '/' + arrimage[0].imagefile @@ -5533,7 +5632,7 @@ export const tools = { if ((userStore.isAdmin || userStore.isManager)) return true - if (tablesel === toolsext.TABMYGROUPS) { + if (shared_consts.TABLES_WITH_ADMINS.includes(tablesel)) { // is Admin ? if (rec.admins) { const trovato = rec.admins.find((myuser: any) => myuser.username === userStore.my.username) @@ -5561,6 +5660,8 @@ export const tools = { return '/' + tools.getDirectoryByTable(table) + '/' + rec['_id'] } else if (table === toolsext.TABMYGROUPS) { return '/grp/' + rec.groupname + } else if (table === toolsext.TABCIRCUITS) { + return '/circuit/' + rec.name } return '' @@ -5570,6 +5671,10 @@ export const tools = { return '/' + tools.getDirectoryByTable(table) + '/' + grp.groupname }, + getPathByCircuit(grp: any, table: string) { + return '/' + tools.getDirectoryByTable(table) + '/' + grp.name + }, + getPathByTable(table: string, pagename: string) { return '/' + tools.getDirectoryByTable(table) + '/' + pagename }, @@ -5693,6 +5798,30 @@ export const tools = { return [] }, + async loadCircuits() { + const userStore = useUserStore() + const circuitStore = useCircuitStore() + // Carica il profilo di quest'utente + + await userStore.loadCircuits().then((ris) => { + // console.log('ris', ris) + if (ris) { + + circuitStore.listcircuits = ris.listcircuits ? ris.listcircuits : [] + + // to Refresh Data User Accounts: + userStore.my.profile.listUserAccounts = ris.listUserAccounts ? ris.listUserAccounts : [] + + // Others not loaded at the beginning: + userStore.my.profile.asked_circuits = ris.listSentRequestCircuits ? ris.listSentRequestCircuits : [] + userStore.my.profile.refused_circuits = ris.listRefusedCircuits ? ris.listRefusedCircuits : [] + return [{ userId: userStore.my._id }] + } + }) + + return [] + }, + async loadrecProfile() { const userStore = useUserStore() diff --git a/src/store/Modules/toolsext.ts b/src/store/Modules/toolsext.ts index 182a61d4..ee304ba2 100755 --- a/src/store/Modules/toolsext.ts +++ b/src/store/Modules/toolsext.ts @@ -93,6 +93,7 @@ export const toolsext = { TABLOCACCOM: 'locaccoms', TABPREF: 'hosps_preferences', TABPEOPLE: 'people', + TABCIRCUITS: 'circuits', SERVKEY_VERS: 'vers', ERR_GENERICO: -1, diff --git a/src/store/UserStore.ts b/src/store/UserStore.ts index 04d2a443..8db81120 100755 --- a/src/store/UserStore.ts +++ b/src/store/UserStore.ts @@ -1,6 +1,7 @@ import { defineStore } from 'pinia' import { + ICircuit, IFriends, IMsgGlobParam, ISigninOptions, ISignupOptions, IUserFields, IUserNotifType, IUserProfile, IUserState, @@ -63,6 +64,10 @@ export const DefaultUser: IUserFields = { notif_regions: [], notif_sectors: [], notif_sector_goods: [], + asked_circuits: [], + refused_circuits: [], + listUserAccounts: [], + manage_mycircuits: [], }, cart: { userId: '', @@ -115,6 +120,11 @@ export const DefaultProfile: IUserProfile = { notif_regions: [], notif_sectors: [], notif_sector_goods: [], + + asked_circuits: [], + refused_circuits: [], + listUserAccounts: [], + manage_mycircuits: [], } export const useUserStore = defineStore('UserStore', { @@ -202,6 +212,16 @@ export const useUserStore = defineStore('UserStore', { return false }, + IsMyCircuitByGroupname(mycircuit: string): boolean { + + /*if (this.my.profile.mycircuit) + return this.my.profile.mycircuit.findIndex((rec) => rec.name === name) >= 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 @@ -277,6 +297,15 @@ export const useUserStore = defineStore('UserStore', { return '' }, + getImgByCircuit(circ: ICircuit): string { + + try { + return costanti.DIR_UPLOAD + 'circuits/' + circ.img_logo + } catch (e) { + } + return 'images/noimg.png' + }, + getImgByGroup(group: IMyGroup): string { try { @@ -1063,6 +1092,21 @@ export const useUserStore = defineStore('UserStore', { }, + async loadCIrcuit(name: string, idnotif: string) { + const data = { + name, + idnotif, + } + + return Api.SendReq('/circuit/load', 'POST', data) + .then((res) => { + return {data: res.data, status: res.status} + }).catch((error) => { + return {data: null, status: error.status} + }) + + }, + async loadSkill(idSkill: string) { const data = { idSkill @@ -1116,6 +1160,16 @@ export const useUserStore = defineStore('UserStore', { }, + async loadCircuits() { + return Api.SendReq('/users/circuits', '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) => { diff --git a/src/views/user/mycircuit/mycircuit.scss b/src/views/user/mycircuit/mycircuit.scss new file mode 100755 index 00000000..288fd036 --- /dev/null +++ b/src/views/user/mycircuit/mycircuit.scss @@ -0,0 +1,29 @@ +.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; +} + +.members, .admins, .creator, .element{ + font-weight: bold; + vertical-align: center; + padding: 5px; +} + + +.title_param{ + font-size: 1.25rem; +} diff --git a/src/views/user/mycircuit/mycircuit.ts b/src/views/user/mycircuit/mycircuit.ts new file mode 100755 index 00000000..90528618 --- /dev/null +++ b/src/views/user/mycircuit/mycircuit.ts @@ -0,0 +1,214 @@ +import { CGridTableRec } from '@/components/CGridTableRec' +import { CMyFriends } from '@/components/CMyFriends' +import { CMyUser } from '@/components/CMyUser' +import { CTitleBanner } from '@/components/CTitleBanner' +import { CProfile } from '@/components/CProfile' +import { CCheckIfIsLogged } from '@/components/CCheckIfIsLogged' +import { CMyFieldRec } from '@/components/CMyFieldRec' +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 { ICity, IFriends, ICircuit, ISearchList, IUserFields } from 'model' +import { shared_consts } from '@/common/shared_vuejs' +import { colmyUserPeople, colmyUserCircuit } from '@store/Modules/fieldsTable' +import { useNotifStore } from '@store/NotifStore' + + +export default defineComponent({ + name: 'mycircuit', + components: { CProfile, CTitleBanner, CMyFieldRec, CSkill, CDateTime, CMyFriends, CGridTableRec, CMyUser, CCheckIfIsLogged }, + props: {}, + setup() { + const userStore = useUserStore() + const notifStore = useNotifStore() + const $route = useRoute() + const $q = useQuasar() + const { t } = useI18n() + + const animation = ref('fade') + + const name = computed(() => $route.params.name ? $route.params.name.toString() : '') + const idnotif = computed(() => $route.query.idnotif ? $route.query.idnotif.toString() : '') + + const filtroutente = ref([]) + const showPic = ref(false) + + const circuit = ref({}) + const mystatus = ref(0) + const users_in_circuit = ref([]) + + const loading = ref(false) + + const tabgrp = ref('info') + const tabmembers = ref('all') + const tab = ref('membri') + + const arrfilterand: any = ref([]) + const filtercustom: any = ref([]) + const filtercustom_rich: any = ref([]) + const searchList = ref([]) + + const cities = ref([]) + + function profile() { + return userStore.my.profile + } + + function circuitname() { + return userStore.my.username + } + + async function loadCircuit() { + // Carica il profilo di quest'utente + if (name.value) { + await userStore.loadCIrcuit(name.value, idnotif.value).then(({ data, status }: {data: any, status: number}) => { + console.log('data', data) + if (data) { + circuit.value = data.circuit + cities.value = data.cities + notifStore.setAsRead(idnotif.value) + users_in_circuit.value = data.users_in_circuit + } else { + circuit.value = null + users_in_circuit.value = [] + } + + mystatus.value = status + + loading.value = false + // filtroutente.value = [{ userId: userStore.my._id }] + }) + + } + } + + watch(() => name.value, (to: any, from: any) => { + loadCircuit() + }) + + async function mounted() { + loading.value = true + await loadCircuit() + + searchList.value = [] + filtercustom.value = [{ 'profile.mycircuits': { $elemMatch: {name: {$eq: name.value }} } } ] + + arrfilterand.value = [] + filtercustom_rich.value = [] + //++TODO: sistemare la filtercustom ... richieste... + } + + function getImgGrp() { + if (circuit.value) + return userStore.getImgByCircuit(circuit.value) + else + return '' + } + + function checkifShow(col: string) { + //++Todo: checkifShow Permessi ! + return true + } + + + + + function extraparams() { + let lk_tab = 'users' + let lk_LF = 'userId' + let lk_FF = '_id' + let lk_as = 'user' + let af_objId_tab = 'myId' + + return { + lookup1: { + lk_tab, + lk_LF, + lk_FF, + lk_as, + af_objId_tab, + lk_proj: { + 'username': 1, + 'profile.img': 1, + 'profile.mycircuits': 1, + 'profile.qualifica': 1, + reported: 1, + date_report: 1, + username_who_report: 1, + } + }, + } + } + + function extraparams_rich() { + return { + querytype: shared_consts.QUERYTYPE_CIRCUIT, + myid: circuit.value ? circuit.value._id : '', + } + } + + function extraparams_refused() { + return { + + } + } + + function numUsers() { + return users_in_circuit.value ? users_in_circuit.value.length : 0 + } + function numAdmins() { + return (circuit.value && circuit.value.admins) ? circuit.value.admins.length : 0 + } + function listaAdmins() { + return (circuit.value && circuit.value.admins) ? circuit.value.admins.map((rec) => rec.username).join(', ') : '' + } + + + onMounted(mounted) + + return { + name, + profile, + tools, + costanti, + circuit, + shared_consts, + getImgGrp, + checkifShow, + + filtroutente, + showPic, + circuitname, + userStore, + t, + animation, + arrfilterand, + filtercustom, + filtercustom_rich, + searchList, + colmyUserPeople, + colmyUserCircuit, + extraparams, + extraparams_rich, + extraparams_refused, + tab, + tabgrp, + tabmembers, + numUsers, + numAdmins, + listaAdmins, + users_in_circuit, + loading, + mystatus, + cities, + } + } +}) diff --git a/src/views/user/mycircuit/mycircuit.vue b/src/views/user/mycircuit/mycircuit.vue new file mode 100755 index 00000000..5abc5e3c --- /dev/null +++ b/src/views/user/mycircuit/mycircuit.vue @@ -0,0 +1,401 @@ + + + + + + diff --git a/src/views/user/mycircuits/mycircuits.scss b/src/views/user/mycircuits/mycircuits.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/views/user/mycircuits/mycircuits.ts b/src/views/user/mycircuits/mycircuits.ts new file mode 100755 index 00000000..76880279 --- /dev/null +++ b/src/views/user/mycircuits/mycircuits.ts @@ -0,0 +1,50 @@ +import { CMyCircuits } from '@/components/CMyCircuits' +import { CFinder } from '@/components/CFinder' +import { CGridTableRec } from '@/components/CGridTableRec' +import { tools } from '@store/Modules/tools' +import { toolsext } from '@store/Modules/toolsext' +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 { colmyUserCircuit } from '@store/Modules/fieldsTable' +import { costanti } from '@costanti' +import { shared_consts } from '@/common/shared_vuejs' + +export default defineComponent({ + name: 'mycircuits', + components: { CMyCircuits, CGridTableRec, CFinder }, + props: {}, + setup() { + const userStore = useUserStore() + const globalStore = useGlobalStore() + const { t } = useI18n() + + const filter = ref(costanti.FIND_CIRCUIT) + + const isfinishLoading = computed(() => globalStore.finishLoading) + + function mounted() { + + const filt_loaded = tools.getCookie(tools.COOK_SEARCH + tools.CIRCUIT_SEARCH, costanti.FIND_CIRCUIT, true) + console.log('filt_loaded', filt_loaded) + filter.value = filt_loaded ? filt_loaded : costanti.FIND_CIRCUIT + } + + watch(() => filter.value, (newval: any, oldval) => { + tools.setCookie(tools.COOK_SEARCH + tools.CIRCUIT_SEARCH, newval) + + }) + onMounted(mounted) + + return { + filter, + costanti, + shared_consts, + colmyUserCircuit, + toolsext, + isfinishLoading, + } + } +}) diff --git a/src/views/user/mycircuits/mycircuits.vue b/src/views/user/mycircuits/mycircuits.vue new file mode 100755 index 00000000..bdd43ca5 --- /dev/null +++ b/src/views/user/mycircuits/mycircuits.vue @@ -0,0 +1,27 @@ + + + + + + diff --git a/src/views/user/mygroup/mygroup.vue b/src/views/user/mygroup/mygroup.vue index 00f6d569..7b56361b 100755 --- a/src/views/user/mygroup/mygroup.vue +++ b/src/views/user/mygroup/mygroup.vue @@ -236,6 +236,14 @@ + Scegli il Circuito + + mygrp.circuits_list {{mygrp.circuits_list}} + + Mostra la lista dei Circuiti Esistenti + (come la lista gruppi, in formato scheda) + con possibilità di aggiungerli ai gruppi in cui sei Admin +