diff --git a/.env.development b/.env.development index 70307673..69c6ba8c 100755 --- a/.env.development +++ b/.env.development @@ -1,4 +1,4 @@ -APP_VERSION="1.0.15" +APP_VERSION="1.0.16" SERVICE_WORKER_FILE="service-worker.js" APP_ID="13" DIRECTORY_LOCAL="newfreeplanet" diff --git a/.env.example.production b/.env.example.production index 8c4e19e3..c76db795 100755 --- a/.env.example.production +++ b/.env.example.production @@ -1,4 +1,4 @@ -APP_VERSION="1.0.15" +APP_VERSION="1.0.16" SERVICE_WORKER_FILE="service-worker.js" APP_ID="13" DIRECTORY_LOCAL=newfreeplanet diff --git a/.env.test.risosrv b/.env.test.risosrv index 5f57af20..11c4470a 100755 --- a/.env.test.risosrv +++ b/.env.test.risosrv @@ -1,4 +1,4 @@ -APP_VERSION="1.0.15" +APP_VERSION="1.0.16" SERVICE_WORKER_FILE="service-worker.js" APP_ID="13" DIRECTORY_LOCAL=newfreeplanet diff --git a/_ALL_SITES/riso.app/.env.development b/_ALL_SITES/riso.app/.env.development index 70307673..69c6ba8c 100755 --- a/_ALL_SITES/riso.app/.env.development +++ b/_ALL_SITES/riso.app/.env.development @@ -1,4 +1,4 @@ -APP_VERSION="1.0.15" +APP_VERSION="1.0.16" SERVICE_WORKER_FILE="service-worker.js" APP_ID="13" DIRECTORY_LOCAL="newfreeplanet" diff --git a/_ALL_SITES/riso.app/.env.production b/_ALL_SITES/riso.app/.env.production index 4d9cc586..80d2bcaa 100644 --- a/_ALL_SITES/riso.app/.env.production +++ b/_ALL_SITES/riso.app/.env.production @@ -1,4 +1,4 @@ -APP_VERSION="1.0.15" +APP_VERSION="1.0.16" SERVICE_WORKER_FILE="service-worker.js" APP_ID="13" DIRECTORY_LOCAL=newfreeplanet diff --git a/_ALL_SITES/terradellavisione.app/.env.development b/_ALL_SITES/terradellavisione.app/.env.development index 67343b80..8feec825 100755 --- a/_ALL_SITES/terradellavisione.app/.env.development +++ b/_ALL_SITES/terradellavisione.app/.env.development @@ -1,4 +1,4 @@ -APP_VERSION="1.0.15" +APP_VERSION="1.0.16" SERVICE_WORKER_FILE="service-worker.js" APP_ID="14" DIRECTORY_LOCAL="newfreeplanet" diff --git a/src/components/CGridTableRec/CGridTableRec.vue b/src/components/CGridTableRec/CGridTableRec.vue index 624c5d5a..98f248f8 100755 --- a/src/components/CGridTableRec/CGridTableRec.vue +++ b/src/components/CGridTableRec/CGridTableRec.vue @@ -1144,6 +1144,12 @@ :prop_myrec="myrecdialog" > + , + required: false, + default: null, + }, + prop_colkey: { + type: String, + required: false, + default: '', + }, + prop_showfilter: { + type: Boolean, + required: false, + default: false, + }, + hint: { + type: String, + required: false, + default: 'Cerca', + }, + prop_search: { + type: Boolean, + required: false, + default: true, + }, + butt_modif_new: { + type: Boolean, + required: false, + default: true, + }, + finder: { + type: Boolean, + required: false, + default: false, + }, + visuinpage: { + type: Boolean, + required: false, + default: false, + }, + showType: { + type: Number, + required: false, + default: 0, + }, + enableExport: { + type: Boolean, + required: false, + default: false, + }, + finder_noNull: { + type: Boolean, + required: false, + default: false, + }, + finder_noNullFilters: { + type: Boolean, + required: false, + default: false, + }, + vertical: { + type: Number, + required: false, + default: 0, + }, + prop_codeId: { + type: String, + required: false, + default: '', + }, + /* keyMain: { + type: String, + required: false, + default: '', + }, + + */ + nodataLabel: { + type: String, + required: false, + default: '', + }, + labelBtnAddRow: { + type: String, + required: false, + default: 'Aggiungi', + }, + labelBtnAddExtra: { + type: String, + required: false, + default: 'Aggiungi', + }, + noresultLabel: { + type: String, + required: false, + default: '', + }, + tablesList: { + type: Object as PropType, + required: false, + default: null, + }, + prop_searchList: { + type: Object as PropType, + required: false, + default: null, + }, + arrfilters: { + type: Object as PropType, + required: false, + default: null, + }, + filterdef: { + type: Array, + required: false, + default: () => { + return [] + } + }, + filtercustom: { + type: Array, + required: false, + default: () => { + return [] + } + }, + filterextra: { + type: Array, + required: false, + default: () => { + return [] + } + }, + filterextra2: { + type: Array, + required: false, + default: () => { + return [] + } + }, + extraparams: { + required: false, + default: {}, + }, + options: { + required: false, + default: 0, + }, + prop_pagination: { + type: Object as PropType, + required: false, + default: () => { + return { sortBy: 'desc', descending: false, page: 1, rowsNumber: 0, rowsPerPage: 10 } + }, + }, + prop_SortFieldsAvailable: { + type: Array, + required: false, + default: () => { + return [] + }, + }, + margin_right: { + type: Number, + required: false, + default: 0, + }, + defaultnewrec: { + type: Function, + required: false, + }, + col_title: { + type: String, + required: false, + default: '', + }, + col_footer: { + type: String, + required: false, + default: '', + }, + col_tabfooter: { + type: String, + required: false, + default: '', + }, + showCol: { + type: Boolean, + required: false, + default: true + }, + showHeaderCol: { + type: Boolean, + required: false, + default: false + }, + choose_visutype: { + type: Boolean, + required: false, + default: false + }, + visufind: { + type: Number, + required: false, + default: costanti.FIND_PEOPLE, + }, + extrafield: { + type: String, + required: false, + default: '', + }, + circuitname: { + type: String, + required: false, + default: '', + }, + noaut: { + type: Boolean, + required: false, + default: false, + }, + hidetitleIfEmpty: { + type: Boolean, + required: false, + default: false, + }, + labelElemFind: { + type: String, + required: false, + default: 'elementi trovati', + }, + groupname: { + type: String, + required: false, + default: '', + }, + }, + components: { + CMyPopupEdit, CTitleBanner, CMyFieldDb, CMySelect, CMyFriends, CMyGroups, + CMyUser, CMyRecCard, CMyRecGrpCard, + CNotifSettings + }, + setup(props, { emit }) { + const $q = useQuasar() + const { t } = useI18n() + const userStore = useUserStore() + const globalStore = useGlobalStore() + const isfinishLoading = computed(() => globalStore.finishLoading) + + const pagination = ref({ sortBy: 'desc', descending: false, page: 1, rowsNumber: 10, rowsPerPage: 10 } as IPagination) + + const addRow = ref('Aggiungi') + + const newRecordBool = ref(false) + const newRecordBoolOld = ref(false) + const editRecordBool = ref(false) + const newRecord: any = ref({}) + const recSaved: any = ref({}) + const recModif: any = ref({}) + const showInnerDialog: any = ref(false) + + const mytable = ref('') + const mytitle = ref('') + const mycolumns = ref([]) + const colkey = ref('') + const search = ref('') + + const tablesel = ref('') + const showSpin = ref(false) + const showNotification = ref(false) + + const loading = ref(false) + const editOn = computed({ + get: () => globalStore.editOn, + set: val => { + globalStore.editOn = val + }, + }) + + const visupagedialog = ref(false) + const myrecdialog = ref(null) + + const startsearch = ref(false) + const clickbuttsearch = ref(false) + + const $router = useRouter() + + const myinfscroll = ref(null) + + const serverData: any = ref([]) + const numRecLoaded = ref(0) + const spinner_visible = ref(false) + const changetable = ref(false) + const searchList = ref([] as ISearchList[]) + + const actual = '' + + let idsel = '' + const colsel = ref({ name: '', field: '', sortable: false } as IColGridTable | null) + let valPrec = '' + + const separator = 'horizontal' + const myfilter = ref('') + const myfilterand: any = ref([]) + const rowsel: any = ref({}) + const dark = true + const canEdit = ref(false) + + const returnedData: any = ref([]) + let returnedCount = 0 + const colVisib: any = ref([]) + const colNotVisib: any = ref([]) + const colExtra: any = ref([]) + const actualDate: any = ref(null as any) + + const rowclicksel = ref(null as any) + const colclicksel = ref(null) + + const selected: any = ref([]) + const showfilter = ref(false) // filtri avanzati + + const filter = ref(0) + const filtergrp = ref(costanti.MY_GROUPS) + + const mycodeid = toRef(props, 'prop_codeId') + + const myvertical = ref(props.vertical) + + const ordinam = ref('') + const ordinam_desc = ref(false) + + + const valoriopt = computed(() => (item: any, addall: boolean, addnone: boolean) => { + // console.log('valoriopt', item.table) + return globalStore.getTableJoinByName(item.table, addall, addnone, item.filter) + }) + const lengthopt = computed(() => (item: any, addall: boolean, addnone: boolean) => { + // console.log('valoriopt', item.table) + const valori = globalStore.getTableJoinByName(item.table, addall, addnone, item.filter) + return (valori ? valori.length : 0) + }) + + const labelcombo = computed(() => (item: any) => { + let lab = item.label + if (item.showcount) + lab += ' (' + valoriopt.value(item, false, false).length + ')' + return lab + }) + + watch(() => globalStore.addNewRecord, (value: any, oldval: any) => { + if (globalStore.addNewRecord === props.prop_mytable) { + createNewRecordDialog() + globalStore.addNewRecord = '' + } + }) + + watch(() => globalStore.myselector, (value: any, oldval: any) => { + // console.log('******* CGRIDTABLEREC : globalStore.myselector', globalStore.myselector) + // console.log(' . value', value) + const rec = searchList.value.find((myrec) => myrec.table === globalStore.myselector.table) // check if exist + if (rec) { + rec.value = globalStore.myselector.data + + // Reset others tables + const rec2 = searchList.value.find((myrec) => myrec.table === toolsext.TABREGIONS) // check if exist + if (rec2) { + rec2.value = costanti.FILTER_TUTTI + } + const rec3 = searchList.value.find((myrec) => myrec.table === toolsext.TABPROVINCE) // check if exist + if (rec3) { + rec3.value = costanti.FILTER_TUTTI + } + + } + + if (value) { + refresh() + } + }, + ) + + + watch(() => searchList.value, (to: any, from: any) => { + // console.log('watch searchlist', to) + if (searchList.value && !changetable.value) { + console.log('REFRR searchList.value', to) + refresh() + } + }) + watch(() => props.prop_mycolumns, (to: any, from: any) => { + // console.log('watch searchlist', to) + if (mycolumns.value !== props.prop_mycolumns) { + mycolumns.value = props.prop_mycolumns + refresh() + } + }) + + watch(() => ordinam.value, (to: any, from: any) => { + if (pagination.value.sortBy !== ordinam.value) { + tools.setCookie('s_ordinamnew_' + props.prop_mytable, ordinam.value) + // pagination.value.sortBy = getObjSort(ordinam.value, ordinam_desc.value) + // refresh() + } + }) + + watch(() => showfilter.value, (newval: any, from: any) => { + tools.setCookie('s_adv', newval ? '1' : '0') + }) + + watch(() => props.filtercustom, (to: any, from: any) => { + // console.log('filtercustom', to) + if (JSON.stringify(to) !== JSON.stringify(from)) { + console.log('REFRR props.filtercustom', to, from) + refresh() + } + }) + + watch(() => props.extraparams, (to: any, from: any) => { + // console.log('filtercustom', to) + if (to !== from) { + refresh() + } + }) + + $router.beforeResolve((to: any) => { + // console.log('beforeResolve', visupagedialog.value, 'to', to) + + if (visupagedialog.value && !to.meta.newpage) { + // visupagedialog.value = false + // return false + } + + }) + + function setCategBySector(tablecat: string, tabsector: string, newval: any) { + console.log('setCategBySector', tablecat, tabsector, newval) + + const recSector = searchList.value.find((rec) => rec.table === tabsector) + if (recSector) + tools.setCookie(tools.COOK_SEARCH + tabsector, newval) + + for (const item of searchList.value) { + if (item.table === tablecat) { + const valsaved = tools.getCookie(tools.COOK_SEARCH + tablecat + '_' + newval, costanti.FILTER_TUTTI) + const rec = searchList.value.find((myrec) => myrec.table === tablecat) // check if exist + let trovato = false + let arrvalues = [] + if (rec) { + arrvalues = valoriopt.value(rec.value, false, false) + if (arrvalues) + trovato = arrvalues.find((myrec: any) => myrec[myrec.key] === valsaved) + } + console.log(' ...item', item) + if (valsaved && trovato) + item.value = valsaved + else { + if (arrvalues) { + console.log(' ...filter tutti') + item.value = costanti.FILTER_TUTTI + } + } + } + } + + } + + function setProvinceByRegion(tableprov: string, tabregion: string, newval: any) { + + const recRegion = searchList.value.find((rec) => rec.table === tabregion) + if (recRegion) + tools.setCookie(tools.COOK_SEARCH + tabregion, newval) + + for (const item of searchList.value) { + if (item.table === tableprov) { + const valsaved = tools.getCookie(tools.COOK_SEARCH + tableprov + '_' + newval, costanti.FILTER_TUTTI) + const rec = searchList.value.find((myrec) => myrec.table === tableprov) // check if exist + let trovato = false + let arrvalues = [] + if (rec) { + arrvalues = valoriopt.value(rec.value, false, false) + if (arrvalues) + trovato = arrvalues.find((myrec: any) => myrec[myrec.key] === valsaved) + } + if (valsaved && trovato) { + item.value = valsaved + globalStore.myselector.data = item.value + } else { + if (arrvalues) { + item.value = costanti.FILTER_TUTTI + } + } + } else if (item.table === toolsext.TABCITIES) { + const valsaved = tools.getCookie(tools.COOK_SEARCH + toolsext.TABCITIES + '_' + newval, costanti.FILTER_TUTTI) + const rec = searchList.value.find((myrec) => myrec.table === toolsext.TABCITIES) // check if exist + let trovato = false + let arrvalues = [] + if (rec) { + arrvalues = valoriopt.value(rec.value, false, false) + if (arrvalues) + trovato = arrvalues.find((myrec: any) => myrec[myrec.key] === valsaved) + } + if (valsaved && trovato) + item.value = valsaved + else { + if (arrvalues) { + item.value = costanti.FILTER_TUTTI + } + } + if (item.value === costanti.FILTER_TUTTI) { + globalStore.myselector.data = { _id: 0, comune: '' } + } else { + globalStore.myselector.data = item.value + } + } + } + + } + + function searchval(newval: any, table: any) { + console.log('REFRR searchval', newval, table) + const myrecfilt = searchList.value.find((rec) => rec.table === table) + let keycookie = tools.COOK_SEARCH + table + if (myrecfilt && myrecfilt.keycookie) + keycookie += myrecfilt.keycookie + tools.setCookie(keycookie, newval) + + if (table === toolsext.TABSKILLS) { + const recSector = searchList.value.find((rec) => rec.table === 'sectors') + if (recSector) { + tools.setCookie(tools.COOK_SEARCH + table + '_' + recSector.value, newval) + } + } else if (table === toolsext.TABSECTORS) { + setCategBySector(toolsext.TABSKILLS, table, newval) + } else if (table === toolsext.TABSECTORGOODS) { + setCategBySector(toolsext.TABGOODS, table, newval) + } else if (table === toolsext.TABREGIONS) { + setProvinceByRegion(toolsext.TABPROVINCE, table, newval) + } else if (table === toolsext.TABGOODS) { + const recSector = searchList.value.find((rec) => rec.table === toolsext.TABSECTORGOODS) + if (recSector) { + tools.setCookie(tools.COOK_SEARCH + table + '_' + recSector.value, newval) + } + // setCategBySector('sectorgoods', table, newval) + } else if (table === toolsext.TABCITIES) { + const rec = searchList.value.find((myrec) => myrec.table === toolsext.TABCITIES) // check if exist + if (rec) { + if (rec.value === costanti.FILTER_TUTTI) { + globalStore.myselector.data = { _id: 0, comune: '' } + } else { + globalStore.myselector.data = rec.value + } + } + + } else if (table === toolsext.TABPROVINCE) { + const rec = searchList.value.find((myrec) => myrec.table === toolsext.TABPROVINCE) // check if exist + if (rec) { + globalStore.myselector.data = { _id: 0, comune: '' } + } + + } + + + refresh() + } + + + // emulate 'SELECT count(*) FROM ...WHERE...' + function getRowsNumberCount() { + + // if (!myfilter) { + // return original.length + // } + // let count = 0 + // original.forEach((treat) => { + // if (treat['name'].includes(myfilter)) { + // ++count + // } + // }) + // return count + + return returnedCount + } + + function getOrderByField(field: string, precorder: number): number { + if ((field === 'date_reg') || (field === 'numMembers')) { + return -1; + } + if (field === 'namecomplete') { + return 1; + } + + return precorder ? precorder : 1; + } + + function getObjSort(sortBy: any, descending: any) { + let myobj: any = {} + if (tools.isObject(sortBy)) { + // console.log('sortBy', sortBy) + return sortBy + } else if (sortBy) { + sortBy = sortBy + '' + // descending = descending + '' + let arrsort = (sortBy && sortBy.indexOf(',') > 0) ? sortBy.split(',') : []; + let arrdescending = (descending && descending.lenght > 1 && descending.indexOf(',') > 0) ? descending.split(',') : []; + if (arrsort.length > 0) { + for (let i = 0; i < arrsort.length; i++) { + let field = arrsort[i].trim() + let risdesc = (tools.isArray(arrdescending) && (arrdescending.length > i)) ? parseInt(arrdescending[i].trim()) : 1; + myobj[field] = getOrderByField(field, risdesc) + } + } else { + myobj[sortBy] = getOrderByField(sortBy, descending ? -1 : 1) + } + } + + console.log('myobj', myobj) + return myobj + } + + function getNumFilterSelected(): number { + let numfilter = 0 + + + for (const item of searchList.value) { + if (!item.notinsearch) { + if (item.value && item.value !== -100) { + // console.log(item.label, item.value) + numfilter++ + } + } + } + + return numfilter + } + + // emulate ajax call + // SELECT * FROM ... WHERE...LIMIT... + async function fetchFromServer(startRow: any, endRow: any, param_myfilter: any, param_myfilterand: any, sortBy: any, descending: any) { + // console.log('fetchFromServer') + + // console.log('sortBy', sortBy) + let myobj: any = {} + if (tools.isObject(sortBy)) { + myobj = sortBy + } else if (tools.isArray(sortBy)) { + myobj = getObjSort(sortBy, descending) + } else if (sortBy) { + myobj = {} + if (descending) { + myobj[sortBy] = -1 + } else { + myobj[sortBy] = 1 + } + } + + const filtersearch: any[] = [] + const filtersearch2: any[] = [] + const filtersearch3or: any[] = [] + const filtersearch3and: any[] = [] + const filtercustom: any[] = [...props.filtercustom] + const filter_gte: any[] = [] + + let recSector = null + let recSectorGood = null + let recCities = null + let recRegion = null + let recProvince = null + let recSkill = null + let idSector = 0 + let idSectorGood = 0 + let idProvince = 0 + let idRegion = 0 + let idSkill = 0 + if (searchList.value) { + recSector = searchList.value.find((item: ISearchList) => item.table === toolsext.TABSECTORS) + idSector = recSector ? recSector.value : 0 + } + if (searchList.value) { + recSectorGood = searchList.value.find((item: ISearchList) => item.table === 'sectorgoods') + idSectorGood = recSectorGood ? recSectorGood.value : 0 + } + if (searchList.value) { + recProvince = searchList.value.find((item: ISearchList) => item.table === 'provinces') + idProvince = recProvince ? recProvince.value : 0 + } + if (searchList.value) { + recRegion = searchList.value.find((item: ISearchList) => item.table === 'regions') + idRegion = recRegion ? recRegion.value : 0 + } + if (searchList.value) { + recCities = searchList.value.find((item: ISearchList) => item.table === 'cities') + } + + if (searchList.value) { + recSkill = searchList.value.find((item: ISearchList) => item.table === toolsext.TABSKILLS) + idSkill = recSkill ? recSkill.value : 0 + // console.log('recSkill', idSkill) + } + + + const arrfilter_cities: any = [] + const arrfilter_provices: any = [] + + // console.table(searchList.value) + + if (searchList.value) { + for (const item of searchList.value) { + + // searchList.value.forEach((item: ISearchList) => { + if (!item.notinsearch) { + const objitem: any = {} + // console.log(' item ', item) + const obj: any = {} + + if (item.table === 'regions') { + + const myfield = tools.getFieldSearchByTable(mytable.value, item.table, 'mycities.reg') + obj[myfield] = item.value + if (myfield) { + obj['mycities.reg'] = item.value + if (item.value !== '' && item.value !== costanti.FILTER_TUTTI) { + filtersearch3and.push(obj) + } + } + + if (item.value && recProvince && idRegion !== costanti.FILTER_TUTTI) { + arrfilter_provices.push({ key: 'reg', value: idRegion }) + } + + } else if (item.table === 'provinces') { + + const myfield = tools.getFieldSearchByTable(mytable.value, item.table, 'mycities.prov') + obj[myfield] = item.value + if (myfield) { + if (item.value !== '' && item.value !== costanti.FILTER_TUTTI) { + filtersearch3and.push(obj) + } + } + + if (item.value && recCities && idProvince !== costanti.FILTER_TUTTI) { + arrfilter_cities.push({ key: 'prov', value: idProvince }) + } + + } else if (item.table === 'cities') { + + if (item.value && item.value.hasOwnProperty('_id')) { + const myfield = tools.getFieldSearchByTable(mytable.value, item.table, 'idCity') + if (myfield) { + obj[myfield] = item.value._id + if (item.value && item.value !== '' && item.value._id !== costanti.FILTER_TUTTI) { + filtersearch3and.push(obj) + } + } + } + } else if (shared_consts.TABLES_WITH_FILTER_FIELD.includes(item.table)) { + + if (item.value) { + if (item.value && item.value !== '' && item.value._id !== costanti.FILTER_TUTTI) { + const myr: any = globalStore.getRecordByTableSingle(item.table, item.value) + + if (myr) { + filtercustom.push(myr.filter) + } + + } + } + } else if (shared_consts.TABLES_WITH_SPECIAL_FILTER.includes(item.table)) { + + objitem[item.key] = item.value + filtercustom.push(objitem) + + } else if (shared_consts.COL_WITH_FILTER_GTE.includes(item.key)) { + objitem[item.key] = item.value + filter_gte.push(objitem) + + } else if (item.value > 0) { + objitem[item.key] = item.value + filtersearch.push(objitem) + + } else if (item.arrvalue.length > 0) { + + + const myarr = item.arrvalue.filter((value: any) => { + if (typeof value === 'number') { + return value > 0 + } + return true + }) + + const arr2: any = [] + + if (item.table !== 'provinces') { + myarr.forEach((myval: any) => { + const objitem2: any = {} + objitem2[item.key] = myval + arr2.push(objitem2) + }) + + const obj2: any = { + $or: arr2 + } + if (arr2.length > 0) { + filtersearch.push(obj2) + } + } + + } else { + if ((item.table === toolsext.TABSKILLS) && item.value === costanti.FILTER_TUTTI) { + const obj2: any = {} + + if (idSector > 0) { + // idSector + // obj2['sector._id'] = idSector + obj2.idSector = idSector + filtersearch2.push(obj2) + } + if (idSkill > 0) { + // idSector + obj2.idSkill = idSkill + filtersearch2.push(obj2) + } + } else if ((item.table === 'goods') && item.value === costanti.FILTER_TUTTI) { + const obj2: any = {} + if (idSectorGood > 0) { + // idSectorGood + obj2['sectorGood._id'] = idSectorGood + filtersearch2.push(obj2) + } + } else if ((item.table === 'subskills') && item.value === costanti.FILTER_TUTTI) { + const obj2: any = {} + // idSector + if (idSkill > 0) { + obj2['myskill._id'] = idSkill + filtersearch2.push(obj2) + } + } + } + + } + } + } + + if (arrfilter_cities.length > 0 && recCities) { + const myobjfilt: any = {} + for (const myrec of arrfilter_cities) { + myobjfilt[myrec.key] = myrec.value + } + recCities.filter_extra = myobjfilt + } + + if (arrfilter_provices.length > 0 && recProvince) { + const myobjfilt: any = {} + for (const myrec of arrfilter_provices) { + myobjfilt[myrec.key] = myrec.value + } + recProvince.filter_extra = myobjfilt + } + + + // console.log('filtersearch', filtersearch) + + if (props.prop_search) { + let nosearch = false + if (filtersearch.length <= 0 && !param_myfilter) { + nosearch = true + returnedData.value = [] + returnedCount = 0 + } else { + /*if (props.keyMain) { + nosearch = true + filtersearch.forEach((rec: any) => { + if (!!rec[props.keyMain]) { + nosearch = false + } + }) + }*/ + } + // if ((false && nosearch && props.finder) || (props.finder_noNull && nosearch)) { + if ((props.finder_noNull || (props.finder_noNullFilters && getNumFilterSelected() === 0)) && nosearch) { + returnedData.value = [] + returnedCount = 0 + return true + } + } + + // console.log('filtercustom', props.filtercustom) + + + let params: IParamsQuery = { + table: mytable.value, + newvers: true, + startRow, + endRow, + filter: param_myfilter, + filterand: param_myfilterand, + // @ts-ignore + filtersearch, + // @ts-ignore + filtersearch2, + filtersearch3or, + filtersearch3and, + // @ts-ignore + filtercustom, + // @ts-ignore + filterextra: props.filterextra, + // @ts-ignore + filterextra2: props.filterextra2, + // @ts-ignore + filter_gte, + sortBy: myobj, + userId: userStore.my._id, + codeId: '', + options: props.options, + noaut: props.noaut, + } + + params.codeId = mycodeid.value + + // console.log('params', params) + // console.log('props.extraparams', props.extraparams) + + params = { ...params, ...props.extraparams } + + const data = await globalStore.loadTable(params) + + if (data) { + returnedData.value = data.rows + returnedCount = data.count + } else { + returnedData.value = [] + returnedCount = 0 + } + + return true + + } + + function savefilter() { + // console.log('Close') + emit('savefilter', myfilterand) + } + + function onRequest(myprops: any) { + const { page, rowsPerPage, rowsNumber, sortBy, descending } = myprops.pagination + const myfilternow = myfilter.value + const myfilterandnow = myfilterand.value + + savefilter() + + if (!mytable.value) { + startsearch.value = false + return + } + + + // console.log('myfilterandnow', myfilterandnow, 'myfilterandnow', myfilterandnow) + + // console.log('onRequest', 'myfilter = ', myfilter.value) + + loading.value = true + + spinner_visible.value = true + + // update rowsCount with appropriate value + + // function all rows if "All" (0) is rowsel + const fetchCount = rowsPerPage === 0 ? rowsNumber : rowsPerPage + + // calculate starting row of data + const startRow = (page - 1) * rowsPerPage + const endRow = startRow + fetchCount + + console.log('onRequest: startRow', startRow, 'endRow', endRow) + + serverData.value = [] + + // fetch data from "server" + return fetchFromServer(startRow, endRow, myfilternow, myfilterandnow, sortBy, descending).then((ris: any) => { + + pagination.value.rowsNumber = getRowsNumberCount() + + // clear out existing data and add new + if (!returnedData.value || returnedData.value.length === 0) { + serverData.value = [] + } else { + // if (serverData.length > 0) + // serverData.splice(0, serverData.length, ...returnedData) + // else + try { + serverData.value = [...returnedData.value] + } catch (e) { + serverData.value = [] + } + } + + // console.log('serverData', serverData) + + // don't forfunction to update local pagination object + pagination.value.page = page + pagination.value.rowsPerPage = rowsPerPage + //pagination.value.sortBy = getObjSort(sortBy, descending) + pagination.value.sortBy = sortBy + // ordinam.value = sortBy + ordinam_desc.value = descending + pagination.value.descending = descending + + // console.log('pagination', pagination) + + // ...and turn of loading indicator + loading.value = false + spinner_visible.value = false + changetable.value = false + startsearch.value = false + }) + } + + function onUpdateData(index: number, myprops: any, done: any) { + let { page, rowsPerPage, rowsNumber, sortBy, descending } = myprops.pagination + const myfilternow = myfilter.value + const myfilterandnow = myfilterand.value + + if (ordinam.value) { + sortBy = ordinam.value + descending = ordinam_desc.value + } + + sortBy = getObjSort(sortBy, descending) + + savefilter() + + if (!mytable.value) { + startsearch.value = false + if (myinfscroll.value) { + // @ts-ignore + myinfscroll.value.resume() + } + done() + return + } + + // function all rows if "All" (0) is rowsel + const fetchCount = rowsPerPage === 0 ? rowsNumber : rowsPerPage + + // calculate starting row of data + const startRow = numRecLoaded.value + const endRow = startRow + fetchCount + // console.log('startRow', startRow, 'endRow', endRow, 'rowsNumber', pagination.value.rowsNumber) + + + if ((startRow < pagination.value.rowsNumber) || clickbuttsearch.value) { + + // fetch data from "server" + return fetchFromServer(startRow, endRow, myfilternow, myfilterandnow, sortBy, descending).then((ris: any) => { + + pagination.value.rowsNumber = getRowsNumberCount() + // console.log(' ...rowsNumber', pagination.value.rowsNumber) + + if (!returnedData.value || returnedData.value.length === 0) { + // no more data + } else { + try { + numRecLoaded.value = numRecLoaded.value + (returnedData.value ? returnedData.value.length : 0) + // console.log(' ...numRecLoaded.value', numRecLoaded.value) + const toadd = [] + for (const elem of returnedData.value) { + if (serverData.value.findIndex((rec: any) => rec._id === elem._id) < 0) { + toadd.push(elem) + } + } + serverData.value = [...serverData.value, ...toadd] + } catch (e) { + serverData.value = [] + } + } + + // don't forfunction to update local pagination object + pagination.value.page = page + pagination.value.rowsPerPage = rowsPerPage + pagination.value.sortBy = getObjSort(sortBy, descending) + // ordinam.value = sortBy + ordinam_desc.value = descending + pagination.value.descending = descending + + // console.log('pagination', pagination) + + // ...and turn of loading indicator + changetable.value = false + startsearch.value = false + + if (myinfscroll.value) { + // @ts-ignore + myinfscroll.value.resume() + } + + // console.log(' ...DONE ') + done(pagination.value.rowsNumber === 0 ? true : false) + }) + } else { + startsearch.value = false + if (myinfscroll.value) { + // @ts-ignore + myinfscroll.value.resume() + } + done() + } + } + + + function refresh_arr() { + const myarr = [...serverData.value] + serverData.value = [] + serverData.value = [...myarr] + } + + function refresh_table() { + + onRequest({ + pagination: pagination.value + }) + rowclicksel.value = null + } + + function refresh_infscroll(done: any) { + // console.log('refresh_infscroll', 'pag', pagination.value.rowsNumber) + rowclicksel.value = null + + onUpdateData(0, + { + pagination: pagination.value + }, done) + } + + + + function refresh() { + // console.log('refresh', 'startsearch', startsearch.value) + + clickbuttsearch.value = true + // console.log('refresh') + if (startsearch.value) + return false + + // console.log('REFRESH!') + + startsearch.value = true + + serverData.value = [] + numRecLoaded.value = 0 + pagination.value.page = 0 + search.value = search.value.trim() + + // console.log('refresh') + // console.log('search', search) + if (!!search.value && search.value !== '') + myfilter.value = search.value + else + myfilter.value = '' + + // console.log('myfilter', myfilter.value) + + if (shared_consts.VERTIC_SHOW_GRID.includes(myvertical.value)) { + if (myinfscroll.value) { + // @ts-ignore + myinfscroll.value.stop() + } + + refresh_infscroll(() => true) + } else { + refresh_table() + } + + clickbuttsearch.value = false + } + + watch(() => mycodeid.value, (newval, oldval) => { + console.log('REFRR - mycodeid.value', newval) + refresh() + }) + + watch(() => userStore.updateTables, (newval, oldval) => { + if (newval && (myvertical.value === costanti.VISUTABLE_USER_TABGROUP || + myvertical.value === costanti.VISUTABLE_USER_TABCIRCUIT || + myvertical.value === costanti.VISUTABLE_SCHEDA_GROUP || + myvertical.value === costanti.VISUTABLE_SCHEDA_USER || + (props.showType === costanti.SHOW_USERINFO))) { + + console.log('REFRR - updateTables.value', newval) + refresh() + + userStore.updateTables = false + } + }) + + /*watch(() => myfilterand.value, (newval, oldval) => { + refresh() + })*/ + + function isFacilitatore() { + return userStore.isFacilitatore + } + + function isAdmin() { + return userStore.isAdmin + } + + function disabilita() { + if ((mytable.value === 'users') && (isFacilitatore() && !userStore.isAdmin && !userStore.isManager)) { + return true + } + + return false + } + + function tableClass() { + return ($q.dark.isActive ? 'bg-black' : 'bg-white') + } + + function selItem(item: any, col: IColGridTable, inmodif?: boolean) { + // console.log('selItem', item, col) + if (col.jointable === toolsext.TABSECTORS) { + // Sbianca la select della Categoria + + if (item && item.hasOwnProperty('idSkill')) { + item.idSkill = costanti.FILTER_NESSUNO + newRecord.value.idSkill = item.idSkill + } + } else if (col.jointable === toolsext.TABSECTORGOODS) { + // Sbianca la select della Categoria Beni + + if (item && item.hasOwnProperty('idGood')) { + item.idGood = costanti.FILTER_NESSUNO + newRecord.value.idGood = item.idGood + console.log('newRecord', newRecord) + } + } + rowsel.value = item + idsel = item._id + colsel.value = col + } + + function undoVal() { + // console.log('undoVal', 'colsel', colsel.value, 'valprec', valPrec, 'colkey', colkey, 'selected', rowsel.value) + // console.table(serverData) + if (colsel.value) { + if (colsel.value.subfield !== '') { + if (rowsel.value[colsel.value.field!] === undefined) + rowsel.value[colsel.value.field!] = {} + rowsel.value[colsel.value.field!][colsel.value.subfield!] = valPrec + } else { + rowsel.value[colsel.value.field!] = valPrec + } + } + + // serverData[colsel] = valPrec + + } + + function SaveValdb(newVal: any, valinitial: any) { + // console.log('SaveValdb', newVal) + // console.log('SaveValue', newVal, 'rowsel', rowsel) + + colsel.value = colclicksel.value + // console.log('colsel', colsel) + SaveValue(newVal, valinitial) + colsel.value = { name: '', field: '', sortable: false } + } + + + function showandsel(row: any, col: any, newval: any, valinitial: any) { + console.log('showandsel CGridTable', row, col, newval) + rowsel.value = row + colsel.value = col + idsel = row._id + SaveValue(newval, valinitial) + + // rowclicksel = null + } + + function annulla(val: any) { + // console.log('GridTable annulla') + /* + if (newRecord.value) { + globalStore.DeleteRec({ table: mytable.value, id: newRecord.value._id }) + .then((ris) => { + // console.log('deleted', ris) + serverData.value.pop(ris) + newRecord.value = null + return true + }) + } + + */ + newRecord.value = null + } + + function SaveValue(newVal: any, valinitial: any) { + console.log('SaveValue', newVal) + // console.log('rowsel', rowsel, 'colsel', colsel.value) + let myfield = '' + let subf = '' + if (colsel.value) { + myfield = colsel.value.field! + subf = colsel.value.subfield! + } + + let myrec = rowsel.value + if (newRecordBool.value) + myrec = newRecord.value + + if (myfield) { + if (colsel.value) { + // Update value in table memory + if (subf !== '') { + if (myrec[myfield] === undefined) + myrec[myfield] = {} + myrec[myfield][subf] = newVal + } else { + myrec[myfield] = newVal + } + } + + const mydata = { + id: idsel, + table: mytable.value, + fieldsvalue: {} + } as any + + + if (colsel.value) { + if (subf !== '') { + if (mydata.fieldsvalue[myfield] === undefined) { + mydata.fieldsvalue[myfield + '.' + subf] = newVal + } + // mydata.fieldsvalue[colsel.value.field][colsel.subfield] = newVal + } else { + mydata.fieldsvalue[myfield] = newVal + } + } + + valPrec = valinitial + + saveFieldValue(mydata) + } + } + + function updatedcol() { + // console.log('updatedcol') + if (mycolumns.value) { + colVisib.value = [] + colNotVisib.value = [] + colExtra.value = [] + mycolumns.value.forEach((elem: IColGridTable) => { + + const mysub = elem.subfield ? elem.subfield : '' + if (elem) { + if (elem.field !== costanti.NOFIELD) { + if (checkIfColShow(elem.field)) { + colVisib.value.push(elem.field + mysub) + } else { + colNotVisib.value.push(elem.field + mysub) + } + } + + if (elem.visible && elem.field === costanti.NOFIELD) { + colExtra.value.push(elem.name) + } + } + }) + } + } + + function getrows() { + return pagination.value.rowsNumber + } + + function createNewRecordDialog() { + + const mydata: any = { + table: mytable.value, + data: {} + } + + // if (props.defaultnewrec) + // mydata.data = props.defaultnewrec() + + // console.log('DATA=', mydata.data) + + + // @ts-ignore + if (props.defaultnewrec) { + // @ts-ignore + newRecord.value = props.defaultnewrec + } else { + newRecord.value = tools.getdefaultnewrec(mytable.value, { groupname: props.groupname }) + } + 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)) + newRecordBool.value = true + + } + + + function createNewRecord() { + + createNewRecordDialog() + + // console.log('newRecord.value', newRecord.value) + + // serverData.value.push(newRecord.value) + pagination.value.rowsNumber++ + + loading.value = false + } + + function saveFieldValue(mydata: any) { + // console.log('saveFieldValue', mydata) + + if (newRecordBool.value) { + return false + } + + // Save on Server + globalStore.saveFieldValue(mydata).then((esito) => { + if (esito) { + tools.showPositiveNotif($q, t('db.recupdated')) + } else { + tools.showNegativeNotif($q, t('db.recfailed')) + undoVal() + } + }) + } + + function created() { + mytable.value = props.prop_mytable + mytitle.value = props.prop_mytitle + mycolumns.value = props.prop_mycolumns + colkey.value = props.prop_colkey + pagination.value = props.prop_pagination + + myvertical.value = props.vertical + // myvertical.value = tools.getCookie('myv_' + props.prop_mytable, props.vertical) + + showfilter.value = tools.getCookie('s_adv', '0') !== '0' + } + + function mounted() { + searchList.value = props.prop_searchList + + // console.log('GridTable mounted', tablesel.value) + + // console.log('props.filtercustom', props.filtercustom) + + + if (!!props.tablesList) { + canEdit.value = tools.getCookie(tools.CAN_EDIT, canEdit) === 'true' + tablesel.value = tools.getCookie('tablesel', tablesel.value) + } + + myfilterand.value = props.filterdef + // myfiltercustom.value = props.filtercustom + // console.log('tablesel', tablesel) + + if (tablesel.value === '') { + if (!!props.tablesList) + tablesel.value = props.tablesList[0].value + else + tablesel.value = mytable.value + } + + if (!shared_consts.TABLES_ORDER_DATE_UPDATED.includes(tablesel.value) && + !shared_consts.TABLES_ORDER_DESCR.includes(tablesel.value)) { + console.log('get cookie)') + let v1 = tools.getCookie('s_ordinamnew_' + tablesel.value, null) + if (v1) + ordinam.value = v1 + let v2 = tools.getCookie('s_ordinamnew_des_' + tablesel.value, null) + if (v2) + ordinam_desc.value = v2 + } + + // console.log('2) tablesel', tablesel.value) + + changeTable(tablesel.value) + + } + + function exec_func_table(table: string, func: number, par: IParamDialog) { + + + if (func === lists.MenuAction.DELETE_RECTABLE) { + globalStore.DeleteRec({ table, id: par.param1 }).then((ris) => { + if (ris) { + ActionAfterYes(func, par.param2, null) + tools.showPositiveNotif($q, t('db.deletedrecord')) + } else { + tools.showNegativeNotif($q, t('db.recdelfailed')) + } + }) + } else if (func === lists.MenuAction.DUPLICATE_RECTABLE) { + globalStore.DuplicateRec({ table, id: par.param1 }).then((ris) => { + if (ris) { + ActionAfterYes(func, par.param2, ris.data) + tools.showPositiveNotif($q, t('db.duplicatedrecord')) + } else + tools.showNegativeNotif($q, t('db.recdupfailed')) + }) + } + } + + + function clickFunz(item: any, col: IColGridTable) { + if (!!col && col.action) { + + const table = mytable.value + const ok = translate('dialog.yes') + const cancel = translate('dialog.no') + const funccancel = 0 + const par = { + param1: item._id, + param2: { ...item }, + } + + if (col.action === lists.MenuAction.CAN_EDIT_TABLE) { + console.log('Edit', item) + selItem(item, col) + recModif.value = { ...item } + recSaved.value = { ...item } + editRecordBool.value = true + } else { + + return $q.dialog({ + message: translate(col.askaction) + '?', + html: true, + ok: { + label: ok, + push: true, + }, + title: translate(col.label_trans), + cancel: true, + persistent: false, + }).onOk(() => { + // console.log('OK') + exec_func_table(table, col.action, par) + return true + }).onCancel(() => { + // console.log('CANCEL') + exec_func_table(table, funccancel, par) + return false + }) + } + + } + } + + function ActionAfterYes(action: number, item: any, data?: any) { + + if (action === lists.MenuAction.DELETE_RECTABLE) { + if ((serverData.value.length > 0) && item) { + console.log('item', item) + const indelim = serverData.value.findIndex((rec: any) => rec._id === item._id) + console.log('indexof', indelim) + if (indelim >= 0) + serverData.value.splice(indelim, 1) + refresh_arr() + } + } else if (action === lists.MenuAction.DUPLICATE_RECTABLE) { + // Add record duplicated + // serverData.push(data) + refresh() + } + } + + function visCol(col: IColGridTable) { + if ((!tools.isBitActive(col.showWhen, costanti.showWhen.NewRec)) && !tools.isBitActive(col.showWhen, costanti.showWhen.InView) + && !tools.isBitActive(col.showWhen, costanti.showWhen.InView_OnlyifExist) && tools.isBitActive(col.showWhen, costanti.showWhen.InEdit)) { + return (canEdit.value) + } else { + return true + } + } + + function clByCol(col: IColGridTable) { + if (!visuIntestazCol(col)) { + return 'row justify-center vertical-middle' + } else { + return '' + } + } + + function visuIntestazCol(col: IColGridTable) { + if (col.fieldtype === costanti.FieldType.html || col.fieldtype === costanti.FieldType.listimages || col.fieldtype === costanti.FieldType.listobj || col.noshowlabel) { + return false + } else { + return true + } + } + + function checkIfColShow(field: string | undefined) { + const vis = true + /*if (shared_consts.TABLES_NOT_SHOW_IF_USERNAME.includes(props.prop_mytable) && !props.prop_search) { + if (field === 'username') { + vis = false + } + }*/ + return vis + } + + function changeCol(newval: any) { + // console.log('changecol', mytable.value) + if (!!mytable.value) { + const arrcol = [] + let col: IColGridTable = { name: '', sortable: false } + for (col of mycolumns.value) { + if (col.field !== costanti.NOFIELD) { + const obj = { + n: col.field + (col.subfield ? col.subfield : ''), + v: 0 + } + obj.v = colVisib.value.includes(obj.n) ? 1 : 0 + if (obj.v === 0) { + // scrive solo quelli da nascondere ! + arrcol.push(obj.n + ',' + obj.v) + } + } + } + + tools.setCookie(mytable.value + '_', arrcol.join('|')) + } + } + + function changeTable(mysel: any) { + // console.log('changeTable', tablesel.value) + changetable.value = true + if (tablesel.value === undefined || tablesel.value === '') + return + + // console.log('changeTable mysel=', mysel, 'tablesel', tablesel.value) + // console.log('tablesList=') + // console.table(tablesList) + + let mytab = null + if (props.tablesList) { + mytab = props.tablesList.find((rec: any) => rec.value === mysel) + } + + if (mytab === undefined) { + tablesel.value = props.tablesList[0].value + if (props.tablesList) { + mytab = props.tablesList.find((rec: any) => rec.value === tablesel.value) + } + } + + // console.log('tablesel', tablesel.value, 'mytab', mytab) + + if (mytab) { + mytitle.value = mytab.label + colkey.value = mytab.colkey + if (mytab.columns) { + // @ts-ignore + mycolumns.value = [...mytab.columns] + } + } + + // console.log('mycolumns') + // console.log(mycolumns) + // console.log('tablesList:') + // console.table(tablesList) + + if (!!mycolumns.value) { + mycolumns.value.forEach((rec: IColGridTable) => { + if (rec.label_trans) + rec.label = t(rec.label_trans) + }) + } + + if (mytab) { + mytable.value = mytab.value + } + + if (!!props.tablesList) { + tools.setCookie('tablesel', tablesel.value) + } + + updatedcol() + + if (!!mytable.value) { + // Leggi la lista delle colonne visibili: + const myselcol = tools.getCookie(mytable.value + '_', '') + + colVisib.value = [] + + let elem: IColGridTable + if (tools.isArray(mycolumns.value)) { + for (elem of mycolumns.value) { + if (elem.field !== costanti.NOFIELD) { + if (checkIfColShow(elem.field)) { + colVisib.value.push(elem.field! + elem.subfield!) + } + } + } + + + if (!!myselcol && myselcol.length > 0) { + const arrselcol = myselcol.split('|') + + for (const col of arrselcol) { + const arrv = col.split(',') + if (arrv.length > 1) { + const field = arrv[0] + const visib = arrv[1] + const rec = mycolumns.value.find((myrec: any) => (myrec.field + myrec.subfield) === field) + + + if (rec) { + if (field) { + if (visib === '1') { + if (!colVisib.value.includes(field)) + colVisib.value.push(field) // se non incluso allora lo aggiungi + } else if (visib === '0') { + // Se da togliere, lo togli + if (colVisib.value.includes(field)) + colVisib.value = colVisib.value.filter((myrec: any) => myrec !== field) + } + } + } + } + } + } + } + } + + // console.log('REFRR - changetable') + refresh() + } + + function doSearch() { + // console.log('REFRR - doSearch') + refresh() + } + function doSort() { + + refresh() + } + + function changefuncAct(newval: any) { + if (!disabilita()) { + tools.setCookie(tools.CAN_EDIT, newval) + } + } + + function clickrowcol(row: any, col: any) { + if (!canEdit.value) { + if (!selected.value[0]) { + const uguali = rowclicksel.value!._id === row._id + console.log('id', rowclicksel.value!._id, 'id2', row._id) + rowclicksel.value = null + colclicksel.value = null + } else { + rowclicksel.value = row + colclicksel.value = col + } + } + } + + function getclrow(myrow: any) { + if (rowclicksel.value === myrow) + return 'colsel' + else + return '' + } + + function getSelectedString() { + return selected.value.length === 0 ? '' : `${selected.value.length} record${selected.value.length > 1 ? 's' : ''} selected of ${serverData.value.length}` + } + + function selectionclick(details: any) { + // console.log('selectionclick selected', selected, 'details', details) + if (details.added) { + rowclicksel.value = details.rows[0] + colclicksel.value = details.keys[0] + } else { + rowclicksel.value = null + colclicksel.value = null + } + + // console.log('rowclicksel', rowclicksel) + } + + function getusernamesel() { + try { + if (rowclicksel.value) { + return rowclicksel.value.username + } + } catch (e) { + return '' + } + } + + function enableSaveNewRec(newrec: boolean) { + + const ok = true + + const showmsg = true + + let myrec = null + if (newrec) { + myrec = { ...newRecord.value } + } else { + myrec = { ...recModif.value } + } + + // mycolumns.value.forEach((col: IColGridTable) => { + let col: IColGridTable + + let msg = '' + + for (col of mycolumns.value) { + if (!msg) { + if (col.required) { + // console.log('newRecord.value', newRecord.value, newRecord.value[col.name]) + if (tools.isArray(myrec[col.name])) { + if (myrec[col.name].length <= 0) { + msg = 'Si prega di compilare il campo \'' + getColMissing(myrec) + '\'' + } + } else { + if (!myrec[col.name]) { + msg = 'Si prega di compilare il campo \'' + getColMissing(myrec) + '\'' + } + } + } + if (!msg && col.maxlength! > 0) { + if (myrec[col.name].length > col.maxlength!) { + msg = t('annunci.maxlength', { name: translate(col.label_trans), maxlength: col.maxlength }) + } + } + if (!msg && col.minlength! > 0) { + if (myrec[col.name].length < col.minlength!) { + msg = t('annunci.minlength', { name: translate(col.label_trans), minlength: col.minlength }) + } + } + } + } + + if (showmsg && msg) { + tools.showNegativeNotif($q, msg, 5000) + return false + } + + return ok + } + + function getColMissing(myrec: any) { + + let col: IColGridTable + + for (col of mycolumns.value) { + if (col.required) { + // console.log('newRecord.value', newRecord.value, newRecord.value[col.name]) + if (tools.isArray(myrec[col.name])) { + if (myrec[col.name].length <= 0) { + return translate(col.label_trans) + } + } else { + if (!myrec[col.name]) { + // console.log('col.name', col.name) + return translate(col.label_trans) + } + } + } + } + + return '' + } + + async function saveNewRecord() { + // check if the field are setted + + if (!enableSaveNewRec(true)) { + return false + } + + console.log('saveNewRecord') + const mydata = { + table: mytable.value, + data: {} + } + + const myobj = newRecord.value + + + // ++ Eliminare eventuali campi ? + mycolumns.value.forEach((col: IColGridTable) => { + if (col.notsave) { + delete myobj[col.name] + } + // Add the column + if (col.field_toduplicate_nospace) { + // + let trovato = tools.removespecial_chars(myobj[col.name]) + myobj[col.field_toduplicate_nospace] = trovato + // console.log('trovato', trovato, 'name', myobj[col.name], 'duplicate:', myobj[col.field_toduplicate_nospace], 'orig', myobj[col.name]) + } + }) + + mydata.data = myobj + + const data = await globalStore.saveTable(mydata) + .then((ris) => { + if (ris.hasOwnProperty('code')) { + tools.checkErrors($q, ris.code, '') + } else { + if (ris) { + // console.log('ris', ris) + newRecordBool.value = false + const indrec = serverData.value.findIndex((rec: any) => rec._id === ris._id) + console.log('indrec', indrec, serverData.value[indrec]) + + if (fieldsTable.tableWithUsername.includes(props.prop_mytable)) { + ris.username = userStore.my.username + } + + if (userStore.my.profile) { + if (fieldsTable.tableforEnableCircuits.includes(props.prop_mytable)) { + if (!userStore.my.profile.calc.numGoodsAndServices) + userStore.my.profile.calc.numGoodsAndServices = 1 + else + userStore.my.profile.calc.numGoodsAndServices += 1 + } + } + + // console.table(serverData.value) + if (indrec >= 0) + serverData.value[indrec] = ris + else + serverData.value = [ris, ...serverData.value] + + newRecord.value = null + + tools.showPositiveNotif($q, t('db.recupdated')) + // refresh() + } else { + tools.showNegativeNotif($q, t('db.recfailed')) + } + } + }).catch((e) => { + tools.showNegativeNotif($q, t('db.recfailed')) + }) + } + + function cancelrecModif() { + recModif.value = { ...recSaved.value } + + editRecordBool.value = false + /*if (recModif.value._id) { + const indrec = serverData.value.findIndex((rec: any) => rec._id === recModif.value._id) + if (indrec >= 0) + serverData.value[indrec] = recModif.value + editRecordBool.value = false + } + + */ + } + + async function saverecModif() { + console.log('saverecModif') + const mydata = { + table: mytable.value, + data: {} + } + + if (!enableSaveNewRec(false)) { + return false + } + + + mydata.data = recModif.value + + const oldrec = serverData.value.find((rec: IMySkill) => rec._id === recModif.value._id) + + const data = await globalStore.saveTable(mydata) + .then((ris) => { + // console.log('ris', ris) + if (ris) { + editRecordBool.value = false + const indrec = serverData.value.findIndex((rec: any) => rec._id === ris._id) + console.log('indrec', indrec, serverData.value[indrec]) + mycolumns.value.forEach((col: IColGridTable) => { + if (!col.foredit) { + ris[col.name] = oldrec[col.name] + } + }) + if (indrec >= 0) + serverData.value[indrec] = ris + } + }) + } + + function hidewindow() { + annulla(0) + } + + function getlabelAddRow() { + return props.labelBtnAddRow + } + + function visButtRow() { + return (props.labelBtnAddRow !== addRow.value) && props.labelBtnAddRow !== 'NONE' + } + + function checkIfShowRec(rec: any) { + return ((rec._id > 0 && typeof rec._id === 'number') || rec._id !== 'number') && rec !== -100 + } + + function showColCheck(col: IColGridTable, tipovis: number, visulabel: boolean, value: any = '', record: any = null) { + + // if (col.isadvanced_field && !showfilteradv.value) + // return false + + const check = tools.checkIfShowField(col, tipovis, visulabel, value) + + let valuePresent = (colVisib.value.includes(col.field! + col.subfield) || colVisib.value.includes(col.field + '.' + col.subfield)) + + if (valuePresent && col.visibleif! > 0 && record) { + if (col.visib_field) { + if (col.visibleif === costanti.BINARY_CHECK) { + if (!tools.isBitActive(record[col.visib_field], col.visib_value)) + valuePresent = false + } + + } + + } + + return check && valuePresent + } + + function getValueExtra(col: IColGridTable, record: any) { + if (record) { + if (col.filter_field! in record) { + return col.filter_field ? record[col.filter_field] || '' : '' + } + } + return '' + } + + + function cmdExt(cmd: any, id: any, val2: any) { + console.log('cmd', cmd) + + if (cmd === costanti.CMD_CLONE) { + const myarr = serverData.value.find((rec: any) => rec._id === id) + newRecord.value = myarr + newRecord.value._id = 0 + newRecordBool.value = true + return true; + } + + if (cmd === costanti.CMD_SHOW_PAGE) { + visupagedialog.value = true + myrecdialog.value = id + return true + } else if (cmd === costanti.CMD_OPEN_PAGE) { + $router.push(tools.getPathByTableAndRec(mytable.value, id)) + return true + } + + let action = 0 + if (cmd === costanti.CMD_DELETE) { + action = lists.MenuAction.DELETE_RECTABLE + } else if (cmd === costanti.CMD_MODIFY) { + action = lists.MenuAction.CAN_EDIT_TABLE + } else if (cmd === costanti.CMD_DUPLICATE) { + action = lists.MenuAction.DUPLICATE_RECTABLE + } + + + if (action > 0) { + + const col = props.prop_mycolumns.find((rec: any) => rec.action === action) + if (col) { + console.log('col action', col) + const myarr = serverData.value.find((rec: any) => rec._id === id) + if (myarr) + clickFunz(myarr, col) + } + } + } + + function showDate(mydate: any) { + console.log('showDate', mydate) + const datestr = tools.getstrVeryShortDate(mydate) + if (actualDate.value !== datestr) { + return true + } + return false + } + + function getActualDate(mydate: any) { + return actualDate.value + } + + function onLoadScroll(index: number, done: any) { + + if (index > 1) { + // console.log('onLoadScroll', index, 'RECLOAD', numRecLoaded.value, 'ROWS: ', pagination.value.rowsNumber, 'PAGE: ', pagination.value.page) + if (numRecLoaded.value < pagination.value.rowsNumber || (pagination.value.rowsNumber <= 0 && clickbuttsearch.value)) { + if (pagination.value.rowsNumber === 0) { + pagination.value.page = 0 + } + + pagination.value.page = pagination.value.page + 1 + refresh_infscroll(done) + } else { + done(true) + } + } else { + // console.log('DONE .....................') + done() + } + } + + function wrapCsvValue(val: any, formatFn?: any, row?: any, col?: IColGridTable) { + let formatted = formatFn !== void 0 + ? formatFn(val, row) + : val + + formatted = formatted === void 0 || formatted === null + ? '' + : String(formatted) + + formatted = formatted.split('"').join('""') + /** + * Excel accepts \n and \r in strings, but some other CSV parsers do not + * Uncomment the next two lines to escape new lines + */ + // .split('\n').join('\\n') + // .split('\r').join('\\r') + + if (col) { + if (col.label_trans === t('movement.accountFromId')) { + // .. + } + } + + if (col) + console.log(' valu', formatted, ' (col=', col.name) + + return `"${formatted}"` + } + + // onMounted(mounted) + function exportTable() { + // console.log('row', serverData.value) + // console.log('mycolumns.value', mycolumns.value) + // naive encoding to csv format + const content = [mycolumns.value.map((col: any) => wrapCsvValue(col.label))].concat( + serverData.value.map((row: any) => mycolumns.value.map((col: any) => wrapCsvValue( + typeof col.field === 'function' + ? col.field(row) + : tools.getValue(row, col.field, col.subfield), + col.format, + row, + col + )).join(',')) + ).join('\r\n') + + const status = exportFile( + 'export-' + mytable.value + '_' + tools.getstrYYMMDDHHMMDateTime(tools.getDateNow()) + '.csv', + content, + 'text/csv' + ) + + if (status !== true) { + $q.notify({ + message: 'Il Browser ha negato il download del file.', + color: 'negative', + icon: 'warning' + }) + } + } + + function update_col(col: string, value: string) { + // console.log('update_col', col, value) + + if (col) { + if (newRecordBool.value) { + newRecord.value[col] = value + } else { + recModif.value[col] = value + } + + } + } + + /*function showNotification() { + $router.push('/notifs') + } */ + + created() + mounted() + + return { + selItem, + SaveValdb, + showandsel, + annulla, + SaveValue, + updatedcol, + getrows, + createNewRecordDialog, + createNewRecord, + saveFieldValue, + clickFunz, + visCol, + visuIntestazCol, + clByCol, + changeCol, + changeTable, + doSearch, + changefuncAct, + clickrowcol, + getclrow, + getSelectedString, + selectionclick, + getusernamesel, + saveNewRecord, + saverecModif, + cancelrecModif, + hidewindow, + isfinishLoading, + getlabelAddRow, + visButtRow, + mytable, + mytitle, + mycolumns, + colkey, + search, + canEdit, + rowclicksel, + colVisib, + colExtra, + colclicksel, + selected, + pagination, + loading, + onRequest, + serverData, + myfilter, + disabilita, + newRecordBool, + editRecordBool, + newRecord, + recModif, + recSaved, + lists, + refresh, + spinner_visible, + tablesel, + myfilterand, + tools, + costanti, + toolsext, + fieldsTable, + globalStore, + searchList, + searchval, + checkIfShowRec, + valoriopt, + labelcombo, + filter, + filtergrp, + myvertical, + showColCheck, + getValueExtra, + shared_consts, + showfilter, + cmdExt, + visupagedialog, + myrecdialog, + showDate, + getActualDate, + actualDate, + actual, + isAdmin, + onLoadScroll, + numRecLoaded, + myinfscroll, + t, + exportTable, + showNotification, + editOn, + newRecordBoolOld, + showSpin, + userStore, + doSort, + ordinam, + ordinam_desc, + getNumFilterSelected, + rowsel, + showInnerDialog, + lengthopt, + update_col, + } + } +}) diff --git a/src/components/CGridTableUser/CGridTableUser.vue b/src/components/CGridTableUser/CGridTableUser.vue new file mode 100755 index 00000000..0f2f8e00 --- /dev/null +++ b/src/components/CGridTableUser/CGridTableUser.vue @@ -0,0 +1,1411 @@ + + + + + diff --git a/src/components/CGridTableUser/index.ts b/src/components/CGridTableUser/index.ts new file mode 100755 index 00000000..f96b1431 --- /dev/null +++ b/src/components/CGridTableUser/index.ts @@ -0,0 +1 @@ +export {default as CGridTableUser} from './CGridTableUser.vue' diff --git a/src/components/CMyActivities/CMyActivities.ts b/src/components/CMyActivities/CMyActivities.ts index c305bfa2..7fa7ec62 100755 --- a/src/components/CMyActivities/CMyActivities.ts +++ b/src/components/CMyActivities/CMyActivities.ts @@ -24,7 +24,7 @@ import { useI18n } from '@/boot/i18n' import { toolsext } from '@store/Modules/toolsext' import { useQuasar } from 'quasar' import { costanti } from '@costanti' -import { IBookmark, ICircuit, IFavorite, IMyCircuit, IMyGroup, IUserFields } from 'model' +import { IBookmark, IReaction, ICircuit, IFavorite, IMyCircuit, IMyGroup, IUserFields } from 'model' import { shared_consts } from '@/common/shared_vuejs' import { static_data } from '@/db/static_data' import { fieldsTable } from '@store/Modules/fieldsTable' @@ -183,19 +183,19 @@ export default defineComponent({ function filtrofavorite(table: string) { const tab = tools.getNumTabByTable(table) - if (myuser.value && myuser.value.profile.favorite) { - let arrfav = myuser.value.profile.favorite.filter((rec: IBookmark) => rec.tab === tab) + if (myuser.value && myuser.value.profile.reaction) { + let arrfav = myuser.value.profile.reaction.filter((rec: IReaction) => rec.tab === tab && (rec.fav! === true)) if (arrfav) - return myuser.value.profile.favorite ? [{ _id: { $in: arrfav.map((rec: any) => rec.id) } }] : [] + return myuser.value.profile.reaction ? [{ _id: { $in: arrfav.map((rec: any) => rec.id) } }] : [] } return [] } function filtrobookmark(table: string) { const tab = tools.getNumTabByTable(table) - if (myuser.value && myuser.value.profile.bookmark) { - let arrfav = myuser.value.profile.bookmark.filter((rec: IBookmark) => rec.tab === tab) + if (myuser.value && myuser.value.profile.reaction) { + let arrfav = myuser.value.profile.reaction.filter((rec: IReaction) => rec.tab === tab && rec.book === true); if (arrfav) - return myuser.value.profile.bookmark ? [{ _id: { $in: arrfav.map((rec: any) => rec.id) } }] : [] + return myuser.value.profile.reaction ? [{ _id: { $in: arrfav.map((rec: any) => rec.id) } }] : [] } return [] } diff --git a/src/components/CMyCardService/CMyCardService.ts b/src/components/CMyCardService/CMyCardService.ts index bdf47afc..e81a013b 100644 --- a/src/components/CMyCardService/CMyCardService.ts +++ b/src/components/CMyCardService/CMyCardService.ts @@ -7,6 +7,7 @@ import { CDateTime } from '@/components/CDateTime' import { CMyPage } from '@/components/CMyPage' import { CMyGroup } from '@/components/CMyGroup' import { CMyChipList } from '@/components/CMyChipList' +import { CGridTableUser } from '@/components/CGridTableUser' import { CMyFieldRec } from '@/components/CMyFieldRec' import { CMyUser } from '@/components/CMyUser' import { CLabel } from '@/components/CLabel' @@ -20,7 +21,7 @@ import { useI18n } from '@/boot/i18n' import { toolsext } from '@store/Modules/toolsext' import { useQuasar } from 'quasar' import { costanti } from '@costanti' -import { EState, IBookedEventPage, IColGridTable, IBookedEvent, IEvents, IMessage, IMessagePage, IParamDialog } from '@model' +import { EState, IReaction, IBookedEventPage, IColGridTable, IBookedEvent, IEvents, IMessage, IMessagePage, IParamDialog, ISearchList } from '@model' import { shared_consts } from '@/common/shared_vuejs' import { colCitys, fieldsTable } from '@store/Modules/fieldsTable' import { useRoute, useRouter } from 'vue-router' @@ -35,7 +36,7 @@ export default defineComponent({ components: { CProfile, CTitleBanner, CMyFieldDb, CDateTime, CMyPage, CMyFieldRec, CAccomodation, - CMyUser, CGalleryImages, CMyChipList, CLabel, CMyGroup + CMyUser, CGalleryImages, CMyChipList, CLabel, CMyGroup, CGridTableUser, }, props: { table: { @@ -69,6 +70,10 @@ export default defineComponent({ const $route = useRoute() const { t } = useI18n() + const arrfilterand: any = ref([]) + const searchList = ref([]) + + const filter = ref(costanti.FIND_PEOPLE) const showPic = ref(false) const loading = ref(false) @@ -77,8 +82,8 @@ export default defineComponent({ const contextDay = ref(null) - const usersList = ref({ show: false, title: '', list: [] }) - const bookedList = ref({ show: false, title: '', list: [] }) + const usersList = ref({ show: false, title: '', list: [], loadfromDb: false, tipofavbook: 0 }) + const bookedList = ref({ show: false, title: '', list: [], loadfromDb: false, tipofavbook: 0 }) const formbookEventDefault = ref({ userId: '', @@ -138,12 +143,35 @@ export default defineComponent({ const idnotif = computed(() => $route.query.idnotif ? $route.query.idnotif.toString() : '') const arrbookings = computed(() => calendarStore.findAllBookedByIdEvent(myrec.value._id)) + const filtercustom: any = computed(() => { + + let queryreact = {} + + if (usersList.value.tipofavbook === costanti.TIPOFAVBOOK.SEEN) { + queryreact = {seen: true} + } else if (usersList.value.tipofavbook === costanti.TIPOFAVBOOK.FAVORITE) { + queryreact = {fav: true} + } else if (usersList.value.tipofavbook === costanti.TIPOFAVBOOK.BOOKMARK) { + queryreact = {book: true} + } else if (usersList.value.tipofavbook === costanti.TIPOFAVBOOK.ATTEND) { + queryreact = {attend: true} + } + + return [{ + idapp: process.env.APP_ID, + tab: tools.getNumTabByTable(props.table), + idrec: myrec.value._id, + ...queryreact, + }] + }) + function profile() { return userStore.my.profile } function load() { - // Carica il profilo di quest'utente + + // Carica il record if (props.idRec) { userStore.loadGeneric(props.table, props.idRec, idnotif.value).then((ris) => { myrec.value = ris @@ -210,29 +238,32 @@ export default defineComponent({ if (myset) { await userStore.setFavorite($q, t, myrec.value._id, props.table, myrec.value); } - mylist = myrec.value.myfav + mylist = myrec.value.myreaction ? myrec.value.myreaction.filter((rec: IReaction) => rec.fav) : [] } else if (tipo === costanti.TIPOFAVBOOK.BOOKMARK) { if (myset) { await userStore.setBookmark($q, t, myrec.value._id, props.table, myrec.value); } - mylist = myrec.value.mybook + mylist = myrec.value.myreaction ? myrec.value.myreaction.filter((rec: IReaction) => rec.book) : [] } else if (tipo === costanti.TIPOFAVBOOK.SEEN) { if (myset) { - loading.value = true - const risrecord = await userStore.setSeen($q, t, myrec.value._id, props.table, myrec.value) - if (risrecord) { - myrec.value = risrecord - calendarStore.updatearrBookingEvent(myrec.value._id, risrecord.mybookings) + if (!userStore.isSeen(myrec.value._id, props.table)) { + loading.value = true + const risrecord = await userStore.setSeen($q, t, myrec.value._id, props.table, myrec.value) + if (risrecord && risrecord.mybookings) { + myrec.value = risrecord - bookEventpage.value.state = EState.None + calendarStore.updatearrBookingEvent(myrec.value._id, risrecord.mybookings) - const findev = calendarStore.findEventBooked(myrec.value._id, false) - EditBookEvent(false) + bookEventpage.value.state = EState.None + + const findev = calendarStore.findEventBooked(myrec.value._id, false) + EditBookEvent(false) + } + loading.value = false } - loading.value = false } - mylist = myrec.value.myseen + mylist = myrec.value.myreaction ? myrec.value.myreaction.filter((rec: IReaction) => rec.seen) : [] } else if (tipo === costanti.TIPOFAVBOOK.ATTEND) { if (myset) { // userStore.setAttend($q, t, myrec.value._id, props.table, bookEventpage.value.bookedevent.numpeople, myrec.value); @@ -240,17 +271,19 @@ export default defineComponent({ mylist = arrbookings.value if (!myset && mylist && mylist.length > 0) { - bookedList.value.show = true; - bookedList.value.title = title; - bookedList.value.list = mylist; + bookedList.value.show = true + bookedList.value.title = title + bookedList.value.list = mylist } return true; } - if (!myset && mylist && mylist.length > 0) { - usersList.value.show = true; - usersList.value.title = title; - usersList.value.list = mylist; + if (!myset && mylist) { + usersList.value.show = true + usersList.value.title = title + usersList.value.tipofavbook = tipo + usersList.value.loadfromDb = true + usersList.value.list = mylist } } @@ -442,6 +475,101 @@ export default defineComponent({ arrbookings.value.find((recbook: IBookedEvent) => recbook.userId === userStore.my._id && recbook.booked) } + function extraparams() { + + return { + lookupPipeline1: { + lk_tab: 'users', + lk_LF: 'userId', + lk_FF: '_id', + lk_as: 'user', + lk_proj: { + name: 1, + surname: 1, + username: 1, + 'profile.handshake': 1, + 'profile.img': 1, + 'profile.mygroups': 1, + 'profile.qualifica': 1, + 'profile.resid_province': 1, + 'mycities.reg': 1, + }, + }, + /* + { + $lookup: { + from: "users", + let: { searchId: { $toObjectId: "$userId" } }, + pipeline: [ + { + $match: { + $expr: { + $and: [ + { $eq: ["$_id", "$$searchId"] }, + ], + }, + }, + }, + { + $project: { + name: 1, + surname: 1, + username: 1, + "profile.handshake": 1, + "profile.img": 1, + "profile.mygroups": 1, + "profile.qualifica": 1, + "profile.resid_province": 1, + "mycities.reg": 1, + }, + } + ], + as: "user", + }, + }, + { + $replaceRoot: { + newRoot: { + $mergeObjects: [ + { + $arrayElemAt: [ + "$mycities", + 0, + ], + }, + { + $arrayElemAt: [ + "$user", + 0, + ], + }, + "$$ROOT", + ], + }, + }, + }, + + lookup1: { + lk_tab: 'provinces', + lk_LF: 'profile.resid_province', + lk_FF: 'prov', + lk_as: 'mycities', + lk_proj: { + username: 1, + name: 1, + surname: 1, + 'profile.handshake': 1, + 'profile.img': 1, + 'profile.mygroups': 1, + 'profile.qualifica': 1, + 'profile.resid_province': 1, + 'mycities.reg': 1, + } + }, + */ + + } + } onMounted(mounted) @@ -485,6 +613,11 @@ export default defineComponent({ isAlreadyBooked, bookEventForm, loading, + arrfilterand, + filtercustom, + searchList, + filter, + extraparams, } } }) diff --git a/src/components/CMyCardService/CMyCardService.vue b/src/components/CMyCardService/CMyCardService.vue index 228163b5..6b87ee4c 100644 --- a/src/components/CMyCardService/CMyCardService.vue +++ b/src/components/CMyCardService/CMyCardService.vue @@ -2,6 +2,7 @@ - + @@ -761,13 +772,43 @@ -
- + - + +
+
+
+ + +
@@ -903,7 +944,8 @@
-
{{ $t('cal.infoprenota') }}

+
{{ $t('cal.infoprenota') }}
+
- {{ myrec.myseen ? myrec.myseen.length : 0 }} + {{ myrec.myreact.numseen ? myrec.myreact.numseen : 0 }}   - {{ myrec.myfav ? myrec.myfav.length : 0 }} + {{ myrec.myreact.numfav ? myrec.myreact.numfav : 0 }} { if (res && res.data.state === 1) { - if (!myrec.myfav) - myrec.myfav = [] - this.my.profile.favorite.push({ id, tab }) - if (myrec) - myrec.myfav.push({ username: this.my.username }) + if (myrec) { + if (!recreaction) + this.my.profile.reaction.push({ id: objectId(), idrec: id, tab, username: this.my.username, fav: true }) + else + recreaction.fav = true; + + myrec.myreact.numfav++ + } tools.showPositiveNotif($q, t('cmd.favorite_set')) } else if (res && res.data.state === -1) { - this.my.profile.favorite = tools.removeIObjectOnce(this.my.profile.favorite, { id, tab }) - if (myrec && myrec.myfav) - myrec.myfav = myrec.myfav.filter((rec: IFavBook) => rec.username !== this.my.username) + // this.my.profile.favorite = tools.removeIObjectOnce(this.my.profile.favorite, { id, tab }) + if (myrec && myrec.myreact.numfav) { + myrec.myreact.numfav-- + //this.my.profile.reaction = this.my.profile.reaction.filter((rec: IReaction) => !((rec.idrec === id) && (rec.tab === tab) && (rec.username === this.my.username) && (rec.fav === true))) + if (recreaction) + recreaction.fav = false + } tools.showNegativeNotif($q, t('cmd.favorite_unset')) } }).catch((error) => { @@ -1731,21 +1733,27 @@ export const useUserStore = defineStore('UserStore', { console.log('table', table) const tab = tools.getNumTabByTable(table) + const recreaction = this.getRecReaction(id, table) value = this.isAttend(id, table) ? false : true - return await Api.SendReq('/users/cmd', 'POST', { cmd: CMD_USER.SET_ATTEND, id, tab, value }) + return await Api.SendReq('/reactions/cmd', 'POST', { cmd: CMD_REACTION.SET_ATTEND, id, tab, value }) .then((res) => { if (res && res.data.state === 1) { - if (!myrec.myattend) - myrec.myattend = [] - this.my.profile.attend.push({ id, tab, num }) - if (myrec) - myrec.myattend.push({ username: this.my.username }) + if (!myrec.myreact.attend) + myrec.myreact.attend = false + // create a record + //++ this.my.profile.reaction.push({ id, tab, attend: true }) + if (myrec) { + if (!recreaction) + this.my.profile.reaction.push({ id: objectId(), idrec: id, tab, username: this.my.username, attend: true }) + else + recreaction.attend = true + } tools.showPositiveNotif($q, t('cmd.attend_set')) } else if (res && res.data.state === -1) { - this.my.profile.attend = tools.removeIObjectOnce(this.my.profile.attend, { id, tab }) - if (myrec && myrec.myattend) - myrec.myattend = myrec.myattend.filter((rec: IFavBook) => rec.username !== this.my.username) + //++ this.my.profile.attend = tools.removeIObjectOnce(this.my.profile.attend, { id, tab }) + if (myrec && myrec.myattend && recreaction) + recreaction.attend = false tools.showNegativeNotif($q, t('cmd.attend_unset')) } }).catch((error) => { @@ -1755,28 +1763,30 @@ export const useUserStore = defineStore('UserStore', { }, - isSeen(id: string, table: string) { + getRecReaction(id: string, table: string) { const tab = tools.getNumTabByTable(table) - const myseen = this.my.profile.seen.find((rec: ISeen) => ((rec.id === id) && (rec.tab === tab))) - return myseen + const myrec = this.my.profile.reaction.find((rec: IReaction) => ((rec.idrec === id) && (rec.tab === tab))) + return myrec + }, + + isSeen(id: string, table: string) { + const myrec = this.getRecReaction(id, table) + return myrec ? myrec.seen : false }, isBookmarked(id: string, table: string) { - const tab = tools.getNumTabByTable(table) - const mybookmark = this.my.profile.bookmark.find((rec: IBookmark) => ((rec.id === id) && (rec.tab === tab))) - return mybookmark + const myrec = this.getRecReaction(id, table) + return myrec ? myrec.book : false }, isFavorite(id: string, table: string) { - const tab = tools.getNumTabByTable(table) - const myfavorite = this.my.profile.favorite.find((rec: IFavorite) => ((rec.id === id) && (rec.tab === tab))) - return myfavorite + const myrec = this.getRecReaction(id, table) + return myrec ? myrec.fav : false }, isAttend(id: string, table: string) { - const tab = tools.getNumTabByTable(table) - const myattend = this.my.profile.attend.find((rec: IAttend) => ((rec.id === id) && (rec.tab === tab))) - return myattend + const myrec = this.getRecReaction(id, table) + return myrec ? myrec.attend : false }, async setBookmark($q: any, t: any, id: any, table: string, myrec: any) { @@ -1784,21 +1794,27 @@ export const useUserStore = defineStore('UserStore', { const tab = tools.getNumTabByTable(table) + const recreaction = this.getRecReaction(id, table) value = this.isBookmarked(id, table) ? false : true - return await Api.SendReq('/users/cmd', 'POST', { cmd: CMD_USER.SET_BOOKMARK, id, tab, value }) + return await Api.SendReq('/reactions/cmd', 'POST', { cmd: CMD_REACTION.SET_BOOKMARK, id, tab, value }) .then((res) => { if (res && res.data.state === 1) { if (!myrec.mybook) myrec.mybook = [] - this.my.profile.bookmark.push({ id, tab }) - if (myrec) - myrec.mybook.push({ username: this.my.username }) + if (!recreaction) + this.my.profile.reaction.push({ id: objectId(), idrec: id, tab, username: this.my.username, book: true }) + else + recreaction.book = true + + myrec.myreact.numbook++ tools.showPositiveNotif($q, t('cmd.bookmark_set')) } else if (res && res.data.state === -1) { - this.my.profile.bookmark = tools.removeIObjectOnce(this.my.profile.bookmark, { id, tab }) - if (myrec && myrec.mybook) - myrec.mybook = myrec.mybook.filter((rec: IFavBook) => rec.username !== this.my.username) + //++ this.my.profile.reaction = tools.removeIObjectOnce(this.my.profile.reaction, { id, tab, }) + if ((myrec && myrec.mybook) && recreaction) + recreaction.book = false + myrec.myreact.numbook-- + //myrec.mybook = myrec.mybook.filter((rec: IFavBook) => rec.username !== this.my.username) tools.showNegativeNotif($q, t('cmd.bookmark_unset')) } }).catch((error) => { @@ -1833,17 +1849,19 @@ export const useUserStore = defineStore('UserStore', { const tab = tools.getNumTabByTable(table) + const recreaction = this.getRecReaction(id, table) value = this.isSeen(id, table) ? false : true - return await Api.SendReq('/users/cmd', 'POST', { cmd: CMD_USER.SET_SEEN, id, tab, value }) + return await Api.SendReq('/reactions/cmd', 'POST', { cmd: CMD_REACTION.SET_SEEN, id, tab, value }) .then((res) => { if (res && res.data.state === 1) { - if (!myrec.myseen) - myrec.myseen = [] - this.my.profile.seen.push({ id, tab }) - if (myrec) - myrec.myseen.push({ username: this.my.username }) - + if (value) { + myrec.myreact.numseen++ + if (!recreaction) + this.my.profile.reaction.push({ id: objectId(), idrec: id, tab, username: this.my.username, seen: true }) + else + recreaction.seen = true + } } if (res && res.data) { if (res.data.record) { diff --git a/src/views/admin/dbop/dbop.vue b/src/views/admin/dbop/dbop.vue index b6f6cb45..06e90346 100755 --- a/src/views/admin/dbop/dbop.vue +++ b/src/views/admin/dbop/dbop.vue @@ -530,6 +530,14 @@ @click="EseguiFunz('setstrProvByIdCityCircuits')" >
+
+ +
+