import type { PropType } from 'vue'; import { defineComponent, onMounted, ref, watch, computed, onBeforeUnmount, nextTick } from 'vue' import { tools } from '@tools' import { useUserStore } from '@store/UserStore' import { useRouter } from 'vue-router' import { useGlobalStore } from '@store/globalStore' import { useProducts } from '@store/Products' import { useI18n } from 'vue-i18n' import { toolsext } from '@store/Modules/toolsext' import { useQuasar } from 'quasar' import { costanti } from '@costanti' import { shared_consts } from '@src/common/shared_vuejs' import { CProductCard } from '@src/components/CProductCard' import { CMySelect } from '@src/components/CMySelect' import { CContainerCatalogoCard } from '@src/components/CContainerCatalogoCard' import { CSelectUserActive } from '@src/components/CSelectUserActive' import type { IOptCatalogo, IDimensioni, IFilterCatalogo, IMyScheda, IProdView, IProduct, ISchedaSingola, ISearchList, ICatalog, IImg } from 'model'; import { IMyPage, } from 'model' import { fieldsTable } from '@store/Modules/fieldsTable' import { useCatalogStore } from '@src/store/CatalogStore' export default defineComponent({ name: 'Catalogo', components: { CContainerCatalogoCard, CProductCard, CSelectUserActive, CMySelect }, emits: ['update:modelValue', 'updateCatalogo'], props: { modelValue: { type: Object as PropType, required: true, }, idPage: { type: String, required: false, default: '', }, }, setup(props, { emit }) { const userStore = useUserStore() const globalStore = useGlobalStore() const productStore = useProducts() const router = useRouter() const $q = useQuasar() const { t } = useI18n() const search = ref('') const optauthors = ref([]) const pdfContent = ref(null); const optcatalogo = ref({ ...props.modelValue }); function updateCatalogoPadre() { console.log('catalogo.ts PADRE') emit('update:modelValue', optcatalogo.value); //emit('updateCatalogo', optcatalogo.value); } // Metodo per aggiornare optcatalogo const updateOptCatalogo = (key: K, value: IOptCatalogo[K]) => { optcatalogo.value[key] = value; updateCatalogoPadre() } // Utile anche per sincronizzare con le modifiche ricevute da props watch(() => props.modelValue, (newVal) => { optcatalogo.value = { ...newVal }; }, { deep: false }); /*watch(optcatalogo, (newValue) => { emit('update:modelValue', newValue); }, { deep: true });*/ const filter = ref({ author: '', publisher: '', type: '', ageGroup: '' }) const cosa = ref(0) const cat = ref('') const idGasSel = ref('') const loadpage = ref(false) const refreshpage = ref(false) const show_hide = ref(false) const mycolumns = ref([]) const catalogStore = useCatalogStore() const tabvisu = ref('categorie') const tabcatalogo = ref('visu') const searchList = ref([] as ISearchList[]) const arrProducts = ref([]) const arrProdToView = ref([]) const numRecLoaded = ref(0) // Create a ref for the component to fix const componentToFixRef = ref(null); const isFixed = ref(false); const labelcombo = computed(() => (item: any) => { let lab = item.label if (item.showcount) lab += ' (' + valoriopt.value(item, false, false).length + ')' return lab }) const arrLoaded = computed(() => { if (arrProducts.value && numRecLoaded.value) return arrProducts.value.slice(0, numRecLoaded.value) else { return [] } }) const getTestoIntroduttivo = computed(() => (recscheda: ISchedaSingola) => { let testo = recscheda.scheda!.dimensioni.pagina?.testo_up?.contenuto if (recscheda.scheda!.isPagIntro) { const catalogStore = useCatalogStore() const catalog = getCatalogoByMyPage.value if (catalog && catalog.descr_introduttiva) { // Cerca se la descrizione introduttiva è stata impostata testo = catalog.descr_introduttiva let clcol = '' if (catalog.pagina_introduttiva_sfondo_nero) { clcol = `text-white` } testo = `` + testo + `` } } return testo }) const getCatalogoByMyPage = computed(() => { return catalogStore.catalogs?.find((catalog: ICatalog) => catalog.idPageAssigned === props.idPage) }) const ispageCatalogata = computed(() => { return !!getCatalogoByMyPage.value }) // Register the scroll event on component mount const handleScroll = () => { const scrollTop = window.scrollY || document.documentElement.scrollTop; // Set a threshold value based on how much scroll is needed to fix the components const threshold = 300; // Update the isFixed ref based on the scroll position isFixed.value = scrollTop > threshold; }; watch(() => cat.value, (newval, oldval) => { if (loadpage.value) tools.setCookie(tools.COOK_CATEGORIA, cat.value.toString()) filter.value.author = '' // disattivo il filtro autore resetSearch() calcArrProducts() }) watch(() => idGasSel.value, (newval, oldval) => { calcArrProducts() }) watch(() => getSearchText(), (newval, oldval) => { calcArrProducts() if (tools.scrollTop() > 300) { tools.scrollToTopValue(300) } }) watch(() => filter.value.author, (newval, oldval) => { // Se filtroAuthor attivato, allora evito il filtro per Categoria if (filter.value.author) { cat.value = '' // disattivo il filtro categoria if (loadpage.value) tools.setCookie(tools.COOK_CATEGORIA, '') resetSearch() } calcArrProducts() if (tools.scrollTop() > 300) { tools.scrollToTopValue(300) } }) watch(() => filter.value.sort_field, (newval, oldval) => { calcArrProducts() if (tools.scrollTop() > 300) { tools.scrollToTopValue(300) } }) watch(() => filter.value.sort_dir, (newval, oldval) => { calcArrProducts() if (tools.scrollTop() > 300) { tools.scrollToTopValue(300) } }) watch(() => cosa.value, (newval, oldval) => { if (oldval !== 0) { tools.setCookie(tools.COOK_COSA_PRODOTTI, cosa.value.toString()) if (cosa.value !== shared_consts.PROD.TUTTI) { cat.value = '' if (loadpage.value) tools.setCookie(tools.COOK_CATEGORIA, '') } calcArrProducts() } }) watch(() => optcatalogo.value.aggiorna, (newval, oldval) => { console.log('Aggiorna array...') generatearrProdToViewSorted() }) function resetSearch() { const mialista = getSearchList() if (mialista && mialista.value && tools.existProp(mialista.value, 'name')) { mialista.value = null } search.value = '' } function getSearchList() { const mylist = searchList.value.find((rec: any) => rec.table === 'products' && rec.key === 'titolo') return mylist } function getSearchText(): string { const lista = getSearchList() return lista && lista.value && tools.existProp(lista.value, 'name') ? lista.value.name : '' } function getTitoloCatalogo(): string { const trovatocatalogo = getCatalogoByMyPage.value return trovatocatalogo ? trovatocatalogo.title : 'Catalogo' } function getImgIntroCatalogo(scheda: IMyScheda): IImg { const trovatocatalogo = getCatalogoByMyPage.value let imagefile = '' let fit = '' if (trovatocatalogo && scheda.isPagIntro) { const recimg = trovatocatalogo.img_intro if (recimg) { imagefile = recimg.imagefile! fit = recimg.fit! || 'contain' imagefile = imagefile ? `url(${tools.getDirUpload() + shared_consts.getDirectoryByTable(shared_consts.TABLES_CATALOG) + '/' + trovatocatalogo._id + '/' + imagefile})` : '' } } return { imagefile, fit } } function getSfondoImgCatalogo(scheda?: IMyScheda | null, mypage?: IDimensioni): IImg { const trovatocatalogo = getCatalogoByMyPage.value let imagefile = '' let fit = '' if (trovatocatalogo) { // Cerca prima se c'è un Immagine Introduttiva const recimgintro = getImgIntroCatalogo(scheda) if (recimgintro.imagefile) { imagefile = recimgintro.imagefile! fit = recimgintro.fit! || 'contain' } // Poi cerca se c'è l'immagine di sfondo const recimg = trovatocatalogo.img_bordata! if (!imagefile && recimg) { imagefile = recimg.imagefile! fit = recimg.fit! || 'contain' imagefile = imagefile ? `url(${tools.getDirUpload() + shared_consts.getDirectoryByTable(shared_consts.TABLES_CATALOG) + '/' + trovatocatalogo._id + '/' + imagefile})` : '' } } if (!imagefile && scheda) { imagefile = scheda.dimensioni?.pagina?.dimensioni?.imgsfondo!.imagefile imagefile = imagefile ? `url(${tools.getDirUpload() + costanti.DIR_SCHEDA + imagefile})` : '' fit = scheda.dimensioni?.pagina?.dimensioni?.imgsfondo!.fit } if (!imagefile && mypage) { imagefile = mypage.imgsfondo!.imagefile! imagefile = imagefile ? `url(${tools.getDirUpload() + costanti.DIR_CATALOGO + imagefile})` : '' fit = mypage.imgsfondo!.fit! } return { imagefile, fit } } function getIdCollaneDaFiltrare(def_idCollane?: number[]) { let idCollane: number[] = [] // Cerca se nella lista cataloghi c'è la Collana di questa Pagina ! const trovatocatalogo = getCatalogoByMyPage.value if (trovatocatalogo) { idCollane = trovatocatalogo.idCollane! || [] } else { idCollane = def_idCollane || [] } return idCollane } function getArgomentiDaFiltrare(def_argomenti?: string[]) { let argomenti: string[] = [] // Cerca se nella lista cataloghi c'è la Collana di questa Pagina ! const trovatocatalogo = getCatalogoByMyPage.value if (trovatocatalogo) { argomenti = trovatocatalogo.argomenti! || [] } else { if (def_argomenti && def_argomenti.length > 0) { argomenti = def_argomenti } else { argomenti = [] } } return argomenti } function getEditoreDaFiltrare(def_editori?: string[]) { let editore: string[] = [] // Cerca se nella lista cataloghi c'è la Collana di questa Pagina ! const trovatocatalogo = getCatalogoByMyPage.value if (trovatocatalogo) { editore = trovatocatalogo.editore! || [] } else { editore = def_editori || [] } return editore } function calcArrProducts() { // console.log('calcArrProducts') let arrargomstr: any = [] // eventuali titoli specifici estratti dall'array di Prodotti Selezionati //const searchtext = getSearchText() const searchtext = getSearchText() let arrprod = productStore.getProducts(cosa.value) || []; const filtroAuthor = filter.value.author || ''; //++AddCATALOGO_FIELDS const filtroProductTypes = optcatalogo.value.productTypes || [0] const filtroExcludeProductTypes = optcatalogo.value.excludeproductTypes || [0] const boolfiltroVuotoProductTypes = (filtroProductTypes.length === 0 || (filtroProductTypes.length === 1 && (filtroProductTypes[0] === 0))) const boolfiltroVuotoExcludeProductTypes = filtroExcludeProductTypes.length === 0 const editore = getEditoreDaFiltrare(optcatalogo.value.editore) const filtroPublishers = editore || [] const idCollane = getIdCollaneDaFiltrare(optcatalogo.value.idCollane) const filtroCollane = idCollane || [] const boolfiltroVuotoEditore = (filtroPublishers.length === 0) const boolfiltroVuotoCollane = (filtroCollane.length === 0) //console.log('filtroVersione', filtroProductTypes) const catstr = '' if (optcatalogo.value.argomenti && optcatalogo.value.argomenti.length > 0) { // ha la priorità questo scelto sul catalogo arrargomstr = getArgomentiDaFiltrare(optcatalogo.value.argomenti) } else { arrargomstr = getArgomentiDaFiltrare(cat.value ? [cat.value] : []) // catstr = cat.value || '' } const filtroArgomenti = arrargomstr || [] const boolfiltroVuotoArgomenti = (filtroArgomenti.length === 0) let gasselstr = '' if (cosa.value === shared_consts.PROD.GAS) { gasselstr = idGasSel.value || ''; } let lowerSearchText = (searchtext || '').toLowerCase().trim(); lowerSearchText = lowerSearchText.replace(/[-@:=]/g, ''); if ((!lowerSearchText || (lowerSearchText && lowerSearchText.length < 2)) && !catstr && boolfiltroVuotoArgomenti && boolfiltroVuotoProductTypes && boolfiltroVuotoExcludeProductTypes && boolfiltroVuotoCollane && boolfiltroVuotoEditore && !filtroAuthor && (!gasselstr && (cosa.value !== shared_consts.PROD.GAS))) { } else { arrprod = arrprod.filter((product: IProduct) => { if (product && product.productInfo) { const lowerName = (product.productInfo.name || '').toLowerCase(); let hasCategoria = false let hasArgomentiCat = true if (arrargomstr && arrargomstr.length > 0) { hasArgomentiCat = (product.productInfo.idCatProds || []).some(idCat => arrargomstr.includes(idCat)) hasCategoria = true } else { hasCategoria = (!catstr || (catstr && (product.productInfo.idCatProds || []).includes(catstr))) ? true : false } const hasAuthor = !filtroAuthor || (filtroAuthor && (product.productInfo.idAuthors || []).includes(filtroAuthor)); let hasProductTypes = true let hasPublished = true let hasCollana = true let hasExcludeProductTypes = false //++AddCATALOGO_FIELDS if (optcatalogo.value && !boolfiltroVuotoProductTypes) { // check if productInfo.productTypes array includes some item in optcatalogo.value.ProductTypes array hasProductTypes = !optcatalogo.value.productTypes || (optcatalogo.value.productTypes && (product.productInfo.productTypes || []).some((item: any) => optcatalogo.value.productTypes!.includes(item))) } if (optcatalogo.value && !boolfiltroVuotoEditore) { hasPublished = !editore || (editore && editore.includes(product.productInfo.idPublisher)) } if (optcatalogo.value && !boolfiltroVuotoCollane) { hasCollana = !idCollane || (idCollane && idCollane.includes(product.productInfo.idCollana)) } if (optcatalogo.value && !boolfiltroVuotoExcludeProductTypes) { // check if productInfo.productTypes array exclude some item in optcatalogo.value.ProductTypes array hasExcludeProductTypes = !optcatalogo.value.excludeproductTypes || (optcatalogo.value.excludeproductTypes && (product.productInfo.productTypes || []).every((item: any) => optcatalogo.value.excludeproductTypes!.includes(item))) } let productgassel = true if (gasselstr || (cosa.value === shared_consts.PROD.GAS)) { productgassel = (product.idGasordine === gasselstr) } // Use a regular expression to match whole words const codeMatch = new RegExp(`\\b${lowerSearchText}\\b`, 'i'); // let nameMatch = new RegExp(`\\b(?=.*\\b${lowerSearchText.split(/\s+/).map(word => `(${word})\\b`).join('.*\\b')}\\b)`, 'i'); // Check if all words in lowerSearchText are present in lowerName const allWordsPresent = lowerSearchText.split(/\s+/).every(word => new RegExp(`\\b${word}\\b`, 'i').test(lowerName)); return (codeMatch.test(product.productInfo.code || '') || allWordsPresent) && hasCategoria && hasCollana && hasArgomentiCat && hasAuthor && productgassel && hasProductTypes && hasPublished && !hasExcludeProductTypes; } else { console.error('product or product.productInfo is null'); return false; } }); } arrprod = getProductsSorted(arrprod, filter.value.sort_field, filter.value.sort_dir); arrProducts.value = arrprod populateDataWithlinkIdTemplate() generatearrProdToViewSorted() loaddata() refreshpage.value = false } function sovrascriviSchedaFromTemplate(idTemplate: string, origScheda: ISchedaSingola) { if (!optcatalogo.value) return const arrschede: ISchedaSingola[] = globalStore.getMySchede() const myfindscheda = arrschede.find((recscheda: ISchedaSingola) => recscheda.scheda?._id === idTemplate) const mynewscheda = tools.jsonCopy(origScheda) const linkIdTemplate = origScheda.scheda?.linkIdTemplate const precname = origScheda.scheda?.name if (myfindscheda) { const myschedatocopy = tools.jsonCopy(myfindscheda) if (myschedatocopy) { myschedatocopy.scheda._id = origScheda.scheda?._id myschedatocopy.scheda.isTemplate = false myschedatocopy.scheda.name = precname myschedatocopy.scheda.linkIdTemplate = linkIdTemplate return myschedatocopy.scheda } } return null } function populateDataWithlinkIdTemplate() { // console.log('populateDataWithlinkIdTemplate') if (optcatalogo.value) { for (const recscheda of optcatalogo.value.arrSchede!) { if (recscheda.scheda?.linkIdTemplate) { // ricopia da Template: const myscheda = sovrascriviSchedaFromTemplate(recscheda.scheda?.linkIdTemplate, recscheda) if (myscheda) { recscheda.scheda = myscheda } } } } // console.log(' FINE - populateDataWithlinkIdTemplate') } function getProductsFilteredByScheda(scheda: IMyScheda): IProduct[] { const searchtext = scheda.arrProdottiSpeciali let arrargomstr: any = [] let arrprod = productStore.getProducts(cosa.value) || []; const filtroAuthor = filter.value.author || ''; const filtroProductTypes = scheda.productTypes || [0] const filtroExcludeProductTypes = scheda.excludeproductTypes || [0] const boolfiltroVuotoProductTypes = (filtroProductTypes.length === 0 || (filtroProductTypes.length === 1 && (filtroProductTypes[0] === 0))) const boolfiltroVuotoExcludeProductTypes = filtroExcludeProductTypes.length === 0 const editore = getEditoreDaFiltrare(scheda.editore) const filtroPublishers = editore || [] const idCollane = getIdCollaneDaFiltrare(scheda.idCollane) const filtroCollane = idCollane || [] const boolfiltroVuotoEditore = (filtroPublishers.length === 0) const boolfiltroVuotoCollane = (filtroCollane.length === 0) //console.log('filtroVersione', filtroProductTypes) let catstr = '' if (optcatalogo.value.argomenti && optcatalogo.value.argomenti.length > 0) { // ha la priorità questo scelto sul catalogo arrargomstr = getArgomentiDaFiltrare(optcatalogo.value.argomenti) } else { catstr = cat.value || '' } let gasselstr = '' if (cosa.value === shared_consts.PROD.GAS) { gasselstr = idGasSel.value || ''; } const lowerSearchTexts = (searchtext || []).map((text: string) => text.toLowerCase().trim().replace(/[-@:=]/g, '') ) // Remove the condition that skips filtering if search text is too short // Now it will work with multiple search terms arrprod = arrprod.filter((product: IProduct) => { if (product && product.productInfo) { const lowerName = (product.productInfo.name || '').toLowerCase(); const lowerCode = (product.productInfo.code || '').toLowerCase(); let hasCategoria = false let hasArgomentiCat = true if (arrargomstr && arrargomstr.length > 0) { hasArgomentiCat = (product.productInfo.idCatProds || []).some(idCat => arrargomstr.includes(idCat)) hasCategoria = true } else { hasCategoria = (!catstr || (catstr && (product.productInfo.idCatProds || []).includes(catstr))) ? true : false } const hasAuthor = !filtroAuthor || (filtroAuthor && (product.productInfo.idAuthors || []).includes(filtroAuthor)); // Check if ANY search term matches the product name or code const searchMatch = lowerSearchTexts.length === 0 || lowerSearchTexts.some((searchTerm: any) => { // Check if the entire search term is a whole word in name or code const codeMatch = new RegExp(`\\b${searchTerm}\\b`, 'i').test(lowerCode); // Check if all words in the search term are present in the name const allWordsPresent = searchTerm.split(/\s+/).every((word: string) => new RegExp(`\\b${word}\\b`, 'i').test(lowerName) ); return codeMatch || allWordsPresent; }); let hasProductTypes = true let hasPublished = true let hasCollane = true let hasExcludeProductTypes = false if (!boolfiltroVuotoProductTypes) { // check if productInfo.productTypes array includes some item in scheda.ProductTypes array hasProductTypes = !scheda.productTypes || (scheda.productTypes && (product.productInfo.productTypes || []).some((item: any) => scheda.productTypes!.includes(item))) } if (!boolfiltroVuotoEditore) { hasPublished = !editore || (editore && editore.includes(product.productInfo.idPublisher)) } if (optcatalogo.value && !boolfiltroVuotoCollane) { hasCollane = !idCollane || (idCollane && idCollane.includes(product.productInfo.idCollana)) } if (!boolfiltroVuotoExcludeProductTypes) { // check if productInfo.productTypes array exclude some item in scheda.ProductTypes array hasExcludeProductTypes = !scheda.excludeproductTypes || (scheda.excludeproductTypes && (product.productInfo.productTypes || []).every((item: any) => scheda.excludeproductTypes!.includes(item))) } return searchMatch && hasCategoria && hasArgomentiCat && hasAuthor && hasProductTypes && hasPublished && hasCollane && !hasExcludeProductTypes; } else { console.error('product or product.productInfo is null'); return false; } }) arrprod = getProductsSorted(arrprod, scheda?.sort_field, scheda?.sort_dir); return arrprod } function getProductsSorted(arrprod: IProduct[], sort_field: string, sort_dir: number): IProduct[] { if (sort_field) { // Crea una copia dell'array per non modificare l'originale const sortedArr = [...arrprod].sort((a: IProduct, b: IProduct) => { const valA = a.productInfo?.[sort_field]; const valB = b.productInfo?.[sort_field]; if (valA === undefined || valB === undefined) { return 0; // Gestisce il caso in cui il campo non esiste } if (typeof valA === 'number' && typeof valB === 'number') { return sort_dir === 1 ? valA - valB : valB - valA; } else { // Per stringhe o altri tipi const compA = valA.toString().toLowerCase(); const compB = valB.toString().toLowerCase(); return sort_dir === 1 ? compA.localeCompare(compB) : compB.localeCompare(compA); } }); return sortedArr.map((product, index) => ({ ...product, indiceRanking: index + 1 })); } return arrprod; } function addNextProductToTheView(arrproductfiltrati: IProduct[], indprod: number) { try { let rectrovato = null; while (true) { if (indprod >= arrproductfiltrati.length) { return { end: true } } rectrovato = arrProdToView.value.find( (prodview: IProdView) => prodview.id === arrproductfiltrati[indprod]._id ); if (rectrovato) { indprod++ continue; // Era stato già aggiunto, quindi prova col prossimo } else { // Non è stato ancora aggiunto, quindi prendo questo e lo aggiungo alla lista ! const myrec = arrproductfiltrati[indprod] arrProdToView.value.push({ id: myrec._id, showed: false }); return { myrec, added: true, indprod } } } } catch (e) { console.error(e); return { rec: null, indprod }; // Assicurati di gestire correttamente l'errore } } function getProdBySchedaRigaCol(recscheda: ISchedaSingola, pagina: number, riga: number, col: number) { try { return recscheda.arrProdToShow![pagina][riga][col] } catch (e) { return null } } function generatearrProdToViewSorted() { // console.log('generatearrProdToViewSorted...') try { // Svuota arrProdToView.value = [] // gia filtrati const arrGeneraleProdotti = arrProducts.value; let indprod = 0 const indprodGenerale = 0 let indtotale = 0 for (const recscheda of optcatalogo.value.arrSchede!) { if (recscheda && recscheda.scheda) { const schedePerRiga = recscheda.scheda.numschede_perRiga || 1 const schedePerCol = recscheda.scheda.numschede_perCol || 1 const schedePerPagina = schedePerRiga * schedePerCol let arrProdFiltrati: IProduct[] = [] if (recscheda.scheda.productTypes!.length > 0) { // Filtra i prodotti in base ai filtri impostati ! arrProdFiltrati = getProductsFilteredByScheda(recscheda.scheda) indprod = 0 } else { if (recscheda.scheda.sort_field!) { arrProdFiltrati = getProductsSorted(arrGeneraleProdotti, recscheda.scheda.sort_field, recscheda.scheda.sort_dir); indprod = 0 } else { indprod = indprodGenerale arrProdFiltrati = arrGeneraleProdotti } } let indadded = 0 recscheda.arrProdToShow = [] for (let pagina = 0; pagina < 60; pagina++) { indadded = 0 if (!recscheda.arrProdToShow[pagina]) { recscheda.arrProdToShow[pagina] = []; } for (let giro = 0; giro < schedePerPagina; giro++) { // Aggiunge il prossimo prodotto che non è stato ancora inserito const result = addNextProductToTheView(arrProdFiltrati, indprod); if (result.end) { break; // Esci dal ciclo se non ci sono più prodotti disponibili } else { if (result.indprod) indprod = result.indprod // Aggiorna indprod per il prossimo giro if (result.myrec) { const riga = Math.floor(indadded / schedePerCol) const col = indadded % schedePerCol if (!recscheda.arrProdToShow[pagina][riga]) { recscheda.arrProdToShow[pagina][riga] = []; } // console.log('RANKING: ', result.myrec.indiceRanking!) recscheda.arrProdToShow[pagina][riga][col] = result.myrec indadded++ indtotale++ // console.log('indadded', indadded) if (optcatalogo.value.maxnumlibri! > 0) { if (indtotale > optcatalogo.value.maxnumlibri!) return } else { if (indtotale > 200) return } } } } if (recscheda.numPagineMax! > 0) { if (pagina + 1 >= recscheda.numPagineMax!) break; // fine pagine } } // console.log('*** arrProdToShow', recscheda.arrProdToShow) } // console.log('Fine Generazione') } // console.log(' FINE - generatearrProdToViewSorted !') } catch (e) { console.error('Err', e) } // console.log('Fine...') } function getNextProd() { const nextRecord = arrProdToView.value.find((rec: any) => !rec.showed) // Se un tale record esiste, impostalo su mostrato if (nextRecord) { nextRecord.showed = true return arrProducts.value.find((recprod: IProduct) => recprod._id === nextRecord.id) } return null } /*function getProducts() { let arrprod = productStore.getProducts(cosa.value) if (!search.value) { return arrprod } let lowerSearchText = search.value.toLowerCase(); let catstr = cat.value; return arrprod.filter((product: IProduct) => { let lowerName = product.productInfo.name!.toLowerCase(); const hasCategoria = !catstr || (catstr && product.productInfo.idCatProds?.includes(catstr)); return (product.productInfo.code!.includes(search.value) || lowerName.includes(lowerSearchText)) && hasCategoria }); }*/ async function mounted() { // console.log('mounted Catalogo') loadpage.value = false await productStore.loadProducts() mycolumns.value = fieldsTable.getArrColsByTable('products') searchList.value = [ { visible: true, label: 'Ricerca', table: 'products', key: 'titolo', type: costanti.FieldType.select_by_server, value: '', // addall: true, arrvalue: [], useinput: true, filter: null, tablesel: 'products', }, ] optauthors.value = productStore.getAuthors() //++Todo: Per ora visualizzo solo il "Negozio" e non i GAS... cosa.value = shared_consts.PROD.BOTTEGA cat.value = tools.getCookie(tools.COOK_CATEGORIA, '') //cosa.value = tools.getCookie(tools.COOK_COSA_PRODOTTI, shared_consts.PROD.GAS, true) //if (cosa.value === shared_consts.PROD.TUTTI) // Inizializza loadpage.value = true window.addEventListener('scroll', handleScroll); calcArrProducts() loaddata() } function loaddata() { numRecLoaded.value = 20 } // Remove the event listener on component destroy onBeforeUnmount(() => { window.removeEventListener('scroll', handleScroll); }); function getCatProds() { const arrcat = productStore.getCatProds(cosa.value) const riscat: any = [{ label: 'Tutti', value: '', icon: undefined, color: undefined }] for (const rec of arrcat) { riscat.push({ label: rec.name, value: rec._id, icon: rec.icon, color: rec.color }) } return riscat } function onLoadScroll(index: number, done: any) { if (index >= 1) { if (numRecLoaded.value < arrProducts.value.length) { const step = 10 let mynrec = numRecLoaded.value + step if (mynrec > arrProducts.value.length) mynrec = arrProducts.value.length numRecLoaded.value = mynrec } done() } else { done(true) } } function filterFn(val: any, update: any, abort: any) { update(() => { const needle = val.toLowerCase(); optauthors.value = productStore.getAuthors().filter(v => { const authorName = v.label.toLowerCase(); const wordsToSearch = needle.split(' '); return wordsToSearch.every((word: any) => { if (word.length > 1) { return authorName.includes(word); } else { return authorName.split(' ').some((namePart: any) => namePart.startsWith(word)); } }); }); }); } function selauthor(id: string, value: string) { filter.value.author = id } /*function searchval(newval: any, table: any, tablesel: any) { console.log('REFRR searchval', newval, table, 'tablesel', tablesel) if (newval) { if (newval.hasOwnProperty('name')) { search.value = newval.name } } else { resetSearch() } }*/ const valoriopt = computed(() => (item: any, addall: boolean, addnone?: boolean = false) => { // console.log('valoriopt', item.table) return globalStore.getTableJoinByName(item.table, addall, addnone, item.filter) }) const loadImage = (src: any) => { return new Promise((resolve, reject) => { const img = new Image() img.onload = () => resolve(img) img.onerror = reject img.src = src }) } function groupedPages(recscheda: ISchedaSingola) { return recscheda.arrProdToShow } function generateStyleCatalogo(optcatalogo: IOptCatalogo) { return { } } function generateStylePageScheda(optcatalogo: IOptCatalogo, scheda: IMyScheda) { const marginTop = scheda.dimensioni?.pagina?.dimensioni?.margini?.top ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.margini?.top) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.top) || '') const marginBottom = scheda.dimensioni?.pagina?.dimensioni?.margini?.bottom ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.margini?.bottom) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.bottom) || '') const marginLeft = scheda.dimensioni?.pagina?.dimensioni?.margini?.left ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.margini?.left) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.left) || '') const marginRight = scheda.dimensioni?.pagina?.dimensioni?.margini?.right ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.margini?.right) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.right) || '') const paddingTop = scheda.dimensioni?.pagina?.dimensioni?.padding?.top ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.padding?.top) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.top) || '') const paddingBottom = scheda.dimensioni?.pagina?.dimensioni?.padding?.bottom ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.padding?.bottom) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.bottom) || '') const paddingLeft = scheda.dimensioni?.pagina?.dimensioni?.padding?.left ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.padding?.left) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.left) || '') const paddingRight = scheda.dimensioni?.pagina?.dimensioni?.padding?.right ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.padding?.right) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.right) || '') // Esiste un immagine di sfondo specifica della singola pagina ? const recimg = getSfondoImgCatalogo(scheda) const backgroundImage = recimg.imagefile! ?? '' const backgroundSize = recimg.fit const width = scheda.dimensioni?.pagina?.dimensioni?.size?.width ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.size?.width) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.size?.width) ?? '') const height = scheda.dimensioni?.pagina?.dimensioni?.size?.height ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.size?.height) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.size?.height) ?? '') return { marginBottom, marginTop, marginLeft, marginRight, paddingBottom, paddingTop, paddingLeft, paddingRight, backgroundImage, backgroundSize, '--width': width, '--height': height, ...((width && width !== '0px') ? { width: `${width} !important` } : {}), ...((height && height !== '0px') ? { height: `${height} !important` } : {}) // Aggiungi l'altezza solo se è valorizzata }; } function generateStyleByPageDim(optcatalogo: IOptCatalogo, mypage: IDimensioni) { const marginTop = mypage.margini?.top ? tools.adjustSize(optcatalogo, mypage.margini?.top) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.top) || '') const marginBottom = mypage.margini?.bottom ? tools.adjustSize(optcatalogo, mypage.margini?.bottom) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.bottom) || '') const marginLeft = mypage.margini?.left ? tools.adjustSize(optcatalogo, mypage.margini?.left) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.left) || '') const marginRight = mypage.margini?.right ? tools.adjustSize(optcatalogo, mypage.margini?.right) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.margini?.right) || '') const paddingTop = mypage.padding?.top ? tools.adjustSize(optcatalogo, mypage.padding?.top) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.top) || '') const paddingBottom = mypage.padding?.bottom ? tools.adjustSize(optcatalogo, mypage.padding?.bottom) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.bottom) ?? '') const paddingLeft = mypage.padding?.left ? tools.adjustSize(optcatalogo, mypage.padding?.left) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.left) ?? '') const paddingRight = mypage.padding?.right ? tools.adjustSize(optcatalogo, mypage.padding?.right) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.padding?.right) ?? '') // Esiste un immagine di sfondo specifica della singola pagina ? const recimg = getSfondoImgCatalogo(null, mypage) let fileimg = recimg.imagefile! ?? '' let backgroundSize = recimg.fit if (!fileimg) { // Esiste un immagine di sfondo uguali per tutte le pagine ? fileimg = optcatalogo.dimensioni_def?.pagina.imgsfondo?.imagefile backgroundSize = optcatalogo.dimensioni_def?.pagina.imgsfondo?.fit fileimg = fileimg ? `url(${tools.getDirUpload() + costanti.DIR_CATALOGO + fileimg})` : '' } const backgroundImage = fileimg ?? '' const width = mypage.size?.width ? tools.adjustSize(optcatalogo, mypage.size?.width) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.size?.width) ?? '') const height = mypage.size?.height ? tools.adjustSize(optcatalogo, mypage.size?.height) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.size?.height) ?? '') return { marginBottom, marginTop, marginLeft, marginRight, paddingBottom, paddingTop, paddingLeft, paddingRight, backgroundImage, backgroundSize, '--width': width, '--height': height, ...((width && width !== '0px') ? { width: `${width} !important` } : {}), ...((height && height !== '0px') ? { height: `${height} !important` } : {}) // Aggiungi l'altezza solo se è valorizzata }; } function getWidthPagina(optcatalogo: IOptCatalogo, scheda: IMyScheda) { return scheda.dimensioni?.pagina?.dimensioni?.size?.width ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.size?.width) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.size?.width) ?? '') } function getHeightPagina(optcatalogo: IOptCatalogo, scheda: IMyScheda) { return scheda.dimensioni?.pagina?.dimensioni?.size?.height ? tools.adjustSize(optcatalogo, scheda.dimensioni?.pagina?.dimensioni?.size?.height) : (tools.adjustSize(optcatalogo, optcatalogo.dimensioni_def?.pagina?.size?.height) ?? '') } function getStyleRowSeparator(recscheda: ISchedaSingola) { const paddingLeft = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.padding?.left) ?? '0px'; const paddingRight = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.padding?.right) ?? '0px'; return { paddingLeft: `${paddingLeft}`, paddingRight: `${paddingRight}`, }; } function getStyleRow(recscheda: ISchedaSingola) { const placeContent = 'center'; const width = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.size?.width) ?? ''; const height = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.size?.height) ?? ''; const marginTop = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.margini?.top) || '0'; const marginBottom = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.margini?.bottom) || '0'; const marginLeft = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.margini?.left) || '0'; const marginRight = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.margini?.right) || '0'; const paddingTop = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.padding?.top) || '0'; const paddingBottom = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.padding?.bottom) || '0'; const paddingLeft = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.padding?.left) || '0'; const paddingRight = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.riga?.padding?.right) || '0'; const out: any = { placeContent, flex: `0 1 ${width} !important`, margin: `${marginTop} ${marginRight} ${marginBottom} ${marginLeft}`, padding: `${paddingTop} ${paddingRight} ${paddingBottom} ${paddingLeft}`, ...((width && width !== '0px') ? { width: `${width} !important` } : {}), ...((height && height !== '0px') ? { height: `${height} !important` } : {}) } /*if (width) { out.width = `${width} !important` } if (height) { out.height = `${height} !important` }*/ return out } function getStyleSchedaProdotto(recscheda: ISchedaSingola) { const placeContent = 'center'; const width = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.size?.width) ?? '100px'; const height = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.size?.height); const marginTop = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.margini?.top) || '0px'; const marginBottom = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.margini?.bottom) || '0px'; const marginLeft = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.margini?.left) || '0px'; const marginRight = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.margini?.right) || '0px'; const paddingTop = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.padding?.top) || '0px'; const paddingBottom = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.padding?.bottom) || '0px'; const paddingLeft = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.padding?.left) || '0px'; const paddingRight = tools.adjustSize(optcatalogo.value, recscheda.scheda?.dimensioni?.scheda_prodotto?.padding?.right) || '0px'; return { placeContent, alignSelf: 'flex-start', flex: `0 1 ${width} !important`, margin: `${marginTop} ${marginRight} ${marginBottom} ${marginLeft}`, padding: `${paddingTop} ${paddingRight} ${paddingBottom} ${paddingLeft}`, ...((height && height !== '0px') ? { height: `${height} !important` } : {}) // Aggiungi l'altezza solo se è valorizzata }; } function containsProducts(page: IProduct[][]) { return page && page.length > 0 && page[0] && page[0].length > 0 } function naviga(path: string) { router.push(path) } onMounted(mounted) return { userStore, costanti, tools, toolsext, search, cosa, shared_consts, getCatProds, cat, idGasSel, productStore, t, loadpage, refreshpage, componentToFixRef, isFixed, arrProducts, show_hide, onLoadScroll, numRecLoaded, arrLoaded, filter, optauthors, filterFn, selauthor, searchList, fieldsTable, valoriopt, labelcombo, mycolumns, tabvisu, getSearchText, pdfContent, tabcatalogo, groupedPages, getNextProd, getProdBySchedaRigaCol, generateStylePageScheda, generateStyleCatalogo, getStyleRow, getStyleSchedaProdotto, getWidthPagina, getHeightPagina, getStyleRowSeparator, generateStyleByPageDim, containsProducts, updateOptCatalogo, optcatalogo, getTestoIntroduttivo, ispageCatalogata, naviga, getTitoloCatalogo, } } })