import type { PropType } from 'vue'; import { defineComponent, onMounted, computed, ref, toRef, watch, nextTick, } from 'vue' import type { IOptCatalogo, IColGridTable, IElemText, IElementiScheda, IMyCard, IMyElem, IMyScheda, ISchedaSingola, IText } from '@src/model'; import { IImgGallery, ILabelValue, IMyPage, IOperators } from '@src/model' import { useGlobalStore } from '@store/globalStore' import { CImgTitle } from '@src/components/CImgTitle' import { CImgPoster } from '@src/components/CImgPoster' import { CTitle } from '@src/components/CTitle/index' import { tools } from '@tools' import { shared_consts } from '@src/common/shared_vuejs' import { LandingFooter } from '@src/components/LandingFooter' import { COpenStreetMap } from '@src/components/COpenStreetMap' import { CCardCarousel } from '@src/components/CCardCarousel' import { CMyPage } from '@src/components/CMyPage' import { CMyPageIntro } from '@src/components/CMyPageIntro' import { CEventsCalendar } from '@src/components/CEventsCalendar' import { CMyEditor } from '@src/components/CMyEditor' import { CMySlider } from '@src/components/CMySlider' import { CMyFieldRec } from '@src/components/CMyFieldRec' import { CSelectImage } from '@src/components/CSelectImage' import { CSelectAnimation } from '@src/components/CSelectAnimation' import { CSelectColor } from '@src/components/CSelectColor' import { CSelectFontSize } from '@src/components/CSelectFontSize' import { CMySize } from '@src/components/CMySize' import { CBorders } from '@src/components/CBorders' import { CMyDimensioni } from '@src/components/CMyDimensioni' import { CMyText } from '@src/components/CMyText' import MixinMetaTags from '@src/mixins/mixin-metatags' import MixinBase from '@src/mixins/mixin-base' import { useQuasar } from 'quasar' import { useI18n } from 'vue-i18n' import { emitKeypressEvents } from 'readline' import { costanti } from '@costanti' import objectId from '@src/js/objectId' import { useProducts } from '@src/store/Products' export default defineComponent({ name: 'CMyEditElem', components: { CImgTitle, CTitle, LandingFooter, CEventsCalendar, CCardCarousel, COpenStreetMap, CMyPage, CMyPageIntro, CMyEditor, CMyFieldRec, CSelectColor, CSelectFontSize, CSelectImage, CImgPoster, CSelectAnimation, CMySlider, CMySize, CBorders, CMyDimensioni, CMyText, }, emits: ['saveElem', 'selElemClick', 'toggleSize', 'deleteElem', 'dupPage', 'expPage', 'impPage'], props: { myelem: { type: Object as PropType, required: true, }, path: { type: String, required: false, default: '', }, idPage: { type: String, required: false, default: '', }, editOn: { type: Boolean, required: false, default: false, }, addOn: { type: Boolean, required: false, default: false, }, }, setup(props, { emit }) { const globalStore = useGlobalStore() const { setmeta, getsrcbyimg } = MixinMetaTags() const { setValDb, getValDb } = MixinBase() const $q = useQuasar() const { t } = useI18n() const animare = ref(0) const slide = ref(0) const slide2 = ref(0) const tabCard = ref(0) const tabScheda = ref(0) const tabElemsText = ref('elem0') const arrPages = ref([] as any[]) const disableSave = ref(true) const enableEdit = ref(true) const elemChanged = ref(false) const enableAdd = ref(true) const tabadd = ref('tools') const Products = useProducts() const neworder = ref(0) const idSchedaDaCopiare = ref('') const myel = toRef(props, 'myelem') const newtype = ref('') const visuadd = ref(false) const direzadd = ref(1) const selectedClasses = ref([]) watch(() => myel.value.order, (value, oldval) => { mounted() }) function getArrDisciplines() { return globalStore.disciplines.filter((rec: any) => rec.showinhome) } function saveElem(exit?: boolean) { // Save Elem record const myelem = props.myelem myelem.order = neworder.value globalStore.saveMyElem($q, t, myelem).then((ris) => { if (ris) { // OK disableSave.value = true emit('saveElem', myelem) if (exit) elemChanged.value = false } }) } function getNewOrderByThisElem() { const myelem = props.myelem let neword = 0 if (myelem) { neword = myelem.order! const recfound = globalStore.getMyElemNextThisElemId(props.idPage, myelem._id) if (recfound) { neword = Math.round((recfound.order! + myelem.order!) / 2) } } return neword } async function addNewElem(elemsel: any, direz: number) { visuadd.value = false let neword = 0 let recfound = null if (direz === -1) { // Sopra // ottieni l'elemento precedente, mantenendo l'ordinamento recfound = globalStore.getMyElemPrecThisElemId(props.idPage, elemsel._id) } else if (direz === 1) { // Sotto // ottieni l'elemento precedente, mantenendo l'ordinamento recfound = globalStore.getMyElemNextThisElemId(props.idPage, elemsel._id) } if (recfound) { // get the middle of the order number between thie 2 elements neword = Math.round((recfound.order + elemsel.order) / 2) } const newrec = await globalStore.prepareAddNewElem(neword, $q, t, props.myelem, newtype.value) emit('selElemClick', newrec) // emit('updateAll', newrec) } async function dupPage() { emit('dupPage', null) } async function exportPage() { emit('expPage', null) } async function importPage() { emit('impPage', null) } async function dupElem(order?: number) { const newrec: IMyElem = tools.jsonCopy(props.myelem) newrec._id = undefined newrec.order = getNewOrderByThisElem() if (newrec.type === shared_consts.ELEMTYPE.HTML) { newrec.containerHtml = 'Copia di ' + newrec.containerHtml } const mynewelem = await globalStore.addNewElem($q, t, newrec) emit('selElemClick', mynewelem) } function delElem() { $q.dialog({ message: 'Eliminare ' + props.myelem.container + ' ?', html: true, ok: { label: 'Elimina', push: true, }, title: '', cancel: true, persistent: false, }).onOk(async () => { // Save Elem record await globalStore.delMyElem($q, t, props.myelem).then((ris) => { if (ris) { // OK disableSave.value = true emit('deleteElem', props.myelem) } }) }) } function modifElem() { disableSave.value = false elemChanged.value = true } function modifElemAndSchede() { modifElem() myel.value.catalogo!.aggiorna++ } function mounted() { try { neworder.value = props.myelem.order arrPages.value = [] arrPages.value.push({ label: '[Vuoto]', path: '' }) for (const page of globalStore.mypage) { const rec = { // @ts-ignore label: page.title, // @ts-ignore value: page.idPage } arrPages.value.push(rec) } if (props.myelem) newtype.value = props.myelem.type if (myel.value.class4) { selectedClasses.value = myel.value.class4.split(' ').filter(Boolean) } if (myel.value.catalogo && myel.value.catalogo?.arrSchede) { for (const recscheda of myel.value.catalogo!.arrSchede) { if (recscheda.scheda) { recscheda.scheda.testo_right_attaccato = tools.resetIText(recscheda.scheda?.testo_right_attaccato) recscheda.scheda.testo_right = tools.resetIText(recscheda.scheda?.testo_right) recscheda.scheda.testo_bottom = tools.resetIText(recscheda.scheda?.testo_bottom) if ((!recscheda.scheda?.dimensioni.pagina.dimensioni)) { recscheda.scheda.dimensioni.pagina = tools.resetRecIPagina(recscheda.scheda?.dimensioni.pagina) } if (!recscheda.scheda?.dimensioni?.pagina?.testo_up) { recscheda.scheda!.dimensioni.pagina.testo_up = tools.resetIText(null) } if (!recscheda.scheda?.dimensioni?.pagina?.testo_title) { recscheda.scheda!.dimensioni.pagina.testo_title = tools.resetIText(null) } if (!recscheda.scheda?.dimensioni?.pagina?.testo_down) { recscheda.scheda!.dimensioni.pagina.testo_down = tools.resetIText(null) } if (!recscheda.scheda?.etichette?.novita?.show) { recscheda.scheda.etichette!.novita = { show: false, months: 6, } recscheda.scheda.etichette!.bestseller = { show: false, quantiFattRaggiunti: 0, } } if ((!recscheda.scheda?.barcode || !recscheda.scheda?.barcode.font)) { recscheda.scheda.barcode = { show: false, format: '', size: { width: '2', height: '33', }, font: { name: '', size: '11', } } } } } } if (myel.value.catalogo) { if (!myel.value.catalogo.first_page) { myel.value.catalogo.first_page = tools.resetRecIDimensioni(null) } myel.value.catalogo.first_page = tools.resetRecIDimensioni(myel.value.catalogo.first_page) } if (myel.value.catalogo) { if (!myel.value.catalogo.last_page) myel.value.catalogo.last_page = tools.resetRecIDimensioni(null) myel.value.catalogo.last_page = tools.resetRecIDimensioni(myel.value.catalogo.last_page) } if (myel.value.catalogo) { if (!myel.value.catalogo.areadistampa) { myel.value.catalogo.areadistampa = tools.resetRecIAreaDiStampa(null) myel.value.catalogo.areadistampa.margini = { left: '0.59', top: '0.59', right: '0.59', bottom: '0.28' } } myel.value.catalogo.areadistampa = tools.resetRecIAreaDiStampa(myel.value.catalogo.areadistampa) } if (myel.value.catalogo && !myel.value.catalogo.dimensioni_def) { myel.value.catalogo.dimensioni_def = { pagina: {} } } if (myel.value.catalogo && myel.value.catalogo.dimensioni_def) { myel.value.catalogo.dimensioni_def.pagina = tools.resetRecIDimensioni(myel.value.catalogo.dimensioni_def.pagina) } } catch (error) { console.log(error) } } function clickOnElem() { if (props.editOn) { } } function addNewCard() { if (!myel.value.listcards) myel.value.listcards = [] myel.value.listcards.push({ _id: objectId(), imagefile: '', alt: '', description: '', vers_img: 0 }) modifElem() } function addNewScheda() { Products.addNewScheda(myel.value.catalogo) modifElem() } function copyfromTemplate(indscheda: number) { // Estrai l'id da copiare e sostituisci tutto con questo if (!idSchedaDaCopiare.value) { return false } const arrschede: ISchedaSingola[] = globalStore.getMySchede() if (arrschede.length <= 0) { return false } const myschedatocopy = arrschede.find((recscheda: ISchedaSingola) => recscheda.scheda!._id === idSchedaDaCopiare.value) const schedadest = myel.value.catalogo!.arrSchede![indscheda] if (myschedatocopy) { const newscheda = myschedatocopy.scheda!.name const msg = 'Sostituisci questa scheda (' + schedadest.scheda?.name + ') con "' + newscheda + '" ?' $q.dialog({ message: msg, html: true, ok: { label: 'Sostituisci', push: true, }, title: '', cancel: true, persistent: false, }).onOk(async () => { const myschedadest: ISchedaSingola = myel.value.catalogo!.arrSchede![indscheda] myschedadest.scheda = tools.jsonCopy(myschedatocopy.scheda) myschedadest.scheda!._id = objectId() myschedadest.order = 20 myschedadest.scheda!.name = myschedadest.scheda!.name + '_copia' myschedadest.scheda!.isTemplate = false }) } } function dupNewScheda(id: string) { if (!myel.value.catalogo!.arrSchede) return const myfindscheda = myel.value.catalogo!.arrSchede.find((scheda: ISchedaSingola) => scheda._id === id) if (myfindscheda) { const myscheda = tools.jsonCopy(myfindscheda) delete myscheda._id delete myscheda.scheda!._id myscheda.numPagineMax = 0 myscheda.order = myscheda.order + 10 myscheda._id = objectId() myscheda.scheda!._id = objectId() myscheda.scheda!.name = myscheda.scheda!.name + '_copia' myscheda.scheda!.isTemplate = false const bakscheda = [...myel.value.catalogo!.arrSchede] myel.value.catalogo!.arrSchede.push(myscheda) modifElem() } } function dupNewCard() { if (!myel.value.listcards) return const myfindcard = myel.value.listcards[tabCard.value] if (myfindcard) { const mycard = tools.jsonCopy(myfindcard) delete mycard._id mycard._id = objectId() const bakcard = [...myel.value.listcards] myel.value.listcards = [] myel.value.listcards = [...bakcard, mycard] modifElem() } } function addNewElemText() { if (!myel.value.elemsText) myel.value.elemsText = [] myel.value.elemsText.push({ _id: objectId(), text: '', color: '#ffffff', class: '', size: '', anim: { name: 'FadeIn', clduration: '', cldelay: '', timingtype: 'ease-in-out' } }) modifElem() } function getClass() { let mycl = '' if (props.myelem.align === shared_consts.ALIGNTYPE.CEHTER) { mycl += ' align_center' } else if (props.myelem.align === shared_consts.ALIGNTYPE.RIGHT) { mycl += ' align_right' } else if (props.myelem.align === shared_consts.ALIGNTYPE.LEFT) { mycl += ' align_left' } return mycl } function showFit() { if (props.myelem.type) return [shared_consts.ELEMTYPE.TEXT].includes(props.myelem.type) else return false } function delRecCard(id: string, myel: IMyElem) { // if (props.myelem.type === shared_consts.ELEMTYPE.CARD) { if (myel.listcards) myel.listcards = myel.listcards.filter((card: IMyCard) => card._id !== id) } else if (props.myelem.type === shared_consts.ELEMTYPE.IMGPOSTER) { if (myel.elemsText) myel.elemsText = myel.elemsText.filter((rec: IElemText) => rec._id !== id) } } function delRecScheda(id: string, myel: IMyElem) { const myscheda = myel.catalogo!.arrSchede!.find((scheda: ISchedaSingola) => scheda._id === id) if (myscheda) { $q.dialog({ message: 'Eliminare la scheda "' + myscheda?.scheda?.name + '" ?', html: true, ok: { label: 'Elimina', push: true, }, title: '', cancel: true, persistent: false, }).onOk(async () => { // myel.catalogo!.arrSchede = myel.catalogo!.arrSchede!.filter((scheda: ISchedaSingola) => scheda._id !== id) modifElem() }) } } function saveFieldElem(rec: any, newval: any, col: IColGridTable) { //console.log('saveFieldElem', rec, 'newval', newval, 'col', col) const iscatalogo = costanti.CATALOGO_FIELDS.includes(col.name) const isscheda = costanti.SCHEDA_FIELDS.includes(col.name) const isIImg = costanti.IMG_FIELDS.includes(col.name) && (col.fieldtype === costanti.FieldType.image) if (col.fieldtype === costanti.FieldType.image) { if (iscatalogo) { myel.value.catalogo[col.name] = newval.imagefile //console.log('SALVATO IN', col.name, newval.imagefile, 'RIS', myel.value.catalogo[col.name]) } else if (isscheda) { rec[col.name] = newval.imagefile } else if (isIImg) { if (!rec[col.name]) { rec[col.name] = {} } rec[col.name].imagefile = newval.imagefile } else { myel.value[col.name] = newval.imagefile } } else { if (iscatalogo) { myel.value.catalogo[col.name] = newval console.log('SALVATO IN', col.name, newval, 'RIS', myel.value.catalogo[col.name]) } else if (isscheda) { rec[col.name] = newval } else { myel.value[col.name] = newval } } } function saveCard(recpass: IMyCard, myval: any) { if (props.myelem.type === shared_consts.ELEMTYPE.CARD) { if (props.myelem.listcards) { props.myelem.listcards.forEach((rec: IMyCard) => { if (recpass._id === rec._id) { if (myval.imagefile) { rec.imagefile = myval.imagefile rec.vers_img = tools.getGenerateVersionImage() } else { rec.imagefile = myval } } }) } } else if (props.myelem.type === shared_consts.ELEMTYPE.IMGPOSTER) { if (props.myelem.elemsText) { props.myelem.elemsText.forEach((rec: IElemText) => { if (recpass._id === rec._id) { if (myval.imagefile) { rec.text = myval.imagefile } else { rec.text = myval } } }) } } else if ((props.myelem.type === shared_consts.ELEMTYPE.IMGTITLE) || (props.myelem.type === shared_consts.ELEMTYPE.IMAGE)) { myel.value.image = myval myel.value.vers_img = tools.getGenerateVersionImage() } modifElem() } function showAnimation() { return (myel.value.type === shared_consts.ELEMTYPE.IMAGE) || (myel.value.type === shared_consts.ELEMTYPE.IMGTITLE) || (myel.value.type === shared_consts.ELEMTYPE.TEXT) || (myel.value.type === shared_consts.ELEMTYPE.CARD) || (myel.value.type === shared_consts.ELEMTYPE.HTML) || (myel.value.type === shared_consts.ELEMTYPE.CAROUSEL_IMGS) } /*function updateElem(myvalue: any) { console.log('updateElem', myvalue) if (myel.value.type === shared_consts.ELEMTYPE.IMGTITLE) { myel.value.container = myvalue } modifElem() }*/ function generateSizeOptions(widthpx: boolean = true) { const options = []; let add = ''; if (widthpx) add = 'px' for (let i = 0; i <= 700; i += 50) { options.push({ label: `${i}${add}`, value: `${i}${add}` }); } return options; } function updateSizeWidth(value: any) { // Gestisce l'input dell'utente per un nuovo valore myel.value.widthimg = value; // Aggiorna widthimg con il nuovo valore modifElem() } function updateSizeHeight(value: any) { if (value) myel.value.heightimg = value; // Aggiorna widthimg con il nuovo valore else myel.value.heightimg = '' modifElem() } function toggleSize() { emit('toggleSize', null) } const orderOptions = computed(() => { const options = [] for (let i = 0; i <= 100; i += 1) { options.push({ label: i.toString(), value: i }); } for (let i = 100; i <= 1000; i += 10) { options.push({ label: i.toString(), value: i }); } return options; }); function addOrder(rec: any) { neworder.value = rec } function addProdSpeciale(rec: any) { neworder.value = rec } async function moveElem(direz: any) { const myelem = props.myelem const elemprec = globalStore.getMyElemPrecThisElemId(props.idPage, myelem._id) const elemnext = globalStore.getMyElemNextThisElemId(props.idPage, myelem._id) if (!elemprec || !elemnext) return false let neworder = 0 const oldorder = myelem.order! if (direz === -1) { // UP neworder = elemprec.order! elemprec.order = oldorder if (oldorder === elemprec.order!) { const elemprec2 = globalStore.getMyElemPrecThisElemId(props.idPage, elemprec._id) neworder = (elemprec2.order! + elemprec.order) / 2 elemprec.order = Math.round((oldorder + neworder) / 2) } await globalStore.saveMyElem($q, t, elemprec) emit('saveElem', elemprec) } else if (direz === 1) { // DOWN neworder = elemnext.order! elemnext.order = oldorder if (oldorder === elemnext.order!) { const elemnext2 = globalStore.getMyElemNextThisElemId(props.idPage, elemnext._id) neworder = (elemnext2.order! + elemnext.order) / 2 elemnext.order = Math.round((oldorder + neworder) / 2) } await globalStore.saveMyElem($q, t, elemnext) emit('saveElem', elemnext) } myelem.order = neworder await globalStore.saveMyElem($q, t, myelem) emit('saveElem', myelem) } function classiImmagineOptions() { // Ritorna l'array delle classi, ad esempio: return [ { label: 'Tonda', value: 'image-circle' }, { label: 'Sbordata', value: 'image-round-bordered' }, { label: 'Ombrata', value: 'image-ombra' }, // Aggiungi altre classi se necessario ]; } function updateClass4(selectedOptions: any) { // Aggiorna selectedClasses selectedClasses.value = selectedOptions; if (myel.value) { // Imposta myel.class2 come stringa myel.value.class4 = selectedOptions.join(' '); // Converte l'array in una stringa separata da spazi saveElem() } } onMounted(mounted) return { tools, shared_consts, getArrDisciplines, slide, slide2, animare, setmeta, getsrcbyimg, saveElem, myel, disableSave, modifElem, delElem, addNewElem, newtype, neworder, elemChanged, enableAdd, clickOnElem, getClass, showFit, getValDb, dupElem, enableEdit, addNewCard, addNewElemText, arrPages, costanti, delRecCard, saveCard, // updateElem, showAnimation, tabCard, tabElemsText, visuadd, tabadd, Products, generateSizeOptions, updateSizeWidth, direzadd, toggleSize, orderOptions, addOrder, moveElem, updateSizeHeight, dupNewCard, updateClass4, selectedClasses, classiImmagineOptions, saveFieldElem, dupPage, tabScheda, addNewScheda, dupNewScheda, delRecScheda, addProdSpeciale, idSchedaDaCopiare, copyfromTemplate, modifElemAndSchede, exportPage, importPage, globalStore, } }, })