UNPKG

fm-lp-factory

Version:

package created to build web ui components for FidelizarMais LP services

340 lines (292 loc) 10.8 kB
import { updateFmTemplateCss } from "../index.js"; import { basicArrowSpinningLoading } from "../../../assets/components/loaders.js"; import flat from "../../../assets/components/icons/flat.js"; let offset = 0; let sectionElement = null; export default (component) => { const section = document.createElement("section"); section.classList.add("fm-nps-card-list-basic", "fm-section-container", "is-hidden"); css(); section.innerHTML = template .replace("%title%", component.data.title) .replace("%subtitle%", component.data.subtitle); LoyalJS.public.services().gamificationServices.getListOfTestimoniesService( { limit: 5, offset, xApplication: "lp-nps-testimonies", }) .then(async (response) => { if (response.body.success && response.body.data.length > 0) { offset += 5; section.classList.remove("is-hidden"); const cards = await Promise.all(response.body.data.map(async (item) => await buildCard(item))); initNpsList(cards); } else throw new Error("No data for carrousel found"); }) .catch((error) => { console.log(error); }); document.querySelector("#fm-landing-page-content").appendChild(section); sectionElement = section; } const initNpsList = (promises) => { const cardsContainer = sectionElement.querySelector(".fm-nps-card-list-basic-cards"); cardsContainer.innerHTML = ""; appendCards(promises); sectionElement.querySelector(".fm-nps-card-list-basic-container-inner").insertAdjacentHTML("beforeend", btnGetMoreNps); const loadMoreBtn = sectionElement.querySelector("[fm-action='loadMoreNps']"); loadMoreBtn.addEventListener("click", loadMoreNps); loadMoreBtn.querySelector("img").classList.remove("rotate-img-slow"); } const appendCards = (cards) => { const cardsContainer = sectionElement.querySelector(".fm-nps-card-list-basic-cards"); cards.forEach(card => { cardsContainer.appendChild(card); }); } const loadMoreNps = () => { const loadMoreBtn = sectionElement.querySelector("[fm-action='loadMoreNps']"); loadMoreBtn.setAttribute("disabled", "true"); loadMoreBtn.querySelector("img").classList.add("rotate-img-slow"); LoyalJS.public.services().gamificationServices.getListOfTestimoniesService( { limit: 5, offset }) .then(async (response) => { if (response.body.success && response.body.data.length > 0) { offset += 5; const cards = await Promise.all(response.body.data.map(async (item) => await buildCard(item))); appendCards(cards); loadMoreBtn.querySelector("img").classList.remove("rotate-img-slow"); loadMoreBtn.removeAttribute("disabled"); } else throw new Error("No data for carrousel found"); }) .catch((error) => { loadMoreBtn.setAttribute("disabled", "true"); loadMoreBtn.style.display = "none"; loadMoreBtn.querySelector("img").classList.remove("rotate-img-slow"); }); } const buildCard = async (data) => { const avatar = data.image || "https://cdn.fidelizarmais.com/packages/img/avatar-black.svg"; // const star = await flat.starImgFlat(); // const ratingElement = document.createElement("strong"); // ratingElement.classList.add("fm-strong-text","fm-rating"); // ratingElement.innerHTML = `${star}<span> ${data.rate} </span>`; const card = document.createElement("div"); card.classList.add("fm-card-light", "fm-nps-card"); let date = new Date(data.dateRegister); let day = date.getUTCDate(); let month = date.getUTCMonth() + 1; let year = date.getUTCFullYear(); card.innerHTML = cardTemplate .replaceAll("%image%", avatar) .replace("%username%", data.customerName) .replace("%description%", data.testimonial) // .replace("%rating%", ratingElement.outerHTML) .replace("%date%", `${day.toString().padStart(2, '0')}/${month.toString().padStart(2, '0')}/${year}`); return card; } const loaderContainer = /*html*/ ` <div class="fm-loader-container"> ${basicArrowSpinningLoading} </div> `; const template = /*html*/ ` <div class="fm-nps-card-list-basic-container"> <div class="fm-nps-card-list-basic-container-inner"> <div class="fm-nps-card-list-basic-container-inner-header"> <span class="fm-nps-card-list-basic-container-inner-subtitle">%title%</span> <span class=" fm-nps-card-list-basic-container-inner-title">%subtitle%</span> </div> <div class="fm-nps-card-list-basic-cards"> <div class="fm-flex-center fm-nps-card-list-basic-cards-table"> ${loaderContainer} </div> </div> </div> </div> `; const cardTemplate = /*html*/ ` <div class="fm-nps-card-card-left"> <div class="fm-nps-card-card-left-avatar"> <img src="%image%" alt="%image%"> </div> </div> <div class="fm-nps-card-card-right"> <div class="fm-nps-card-card-right-top"> <strong class="fm-strong-text">%username%</strong> <p>%description%</p> </div> <div class="fm-nps-card-card-right-bottom" > <!-- %rating% --> <strong ></strong> <strong class="fm-strong-text">%date%</strong> </div> `; const btnGetMoreNps = /*html*/ ` <div class="fm-button-container" fm-action="loadMoreNps"> <span> Carregar mais</span> ${basicArrowSpinningLoading} </div> `; const css = () => { updateFmTemplateCss(/*css*/ ` .fm-nps-card-list-basic{ width: 90%; } .fm-nps-card-list-basic.is-hidden{ display: none; } .fm-nps-card-list-basic .fm-nps-card-list-basic-container{ display: flex; align-items: center; flex-direction: column; width: 100%; background: var(--fm-primary-light-color); border-radius: var(--fm-base-border-radius); } .fm-nps-card-list-basic .fm-nps-card-list-basic-cards { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; max-height: 400px; overflow: auto; scrollbar-color: var(--fm-secondary-button-color) var(--fm-primary-light-color); } .fm-nps-card-list-basic .fm-nps-card-list-basic-container .fm-nps-card-list-basic-container-inner{ padding: 20px; margin: 40px; width: 80%; background: var(--fm-secondary-light-color); border-radius: var(--fm-base-border-radius); display: flex; flex-direction: column; align-items: center; justify-content: center; } .fm-nps-card-list-basic .fm-nps-card-list-basic-container-inner-header { display: flex; flex-direction: column; align-items: center; margin-bottom: 15px; } .fm-nps-card-list-basic .fm-nps-card-card-left { margin: 5px 15px; } .fm-nps-card-card-right .fm-nps-card-card-right-top { display: flex; flex-direction: column; align-items: flex-start; text-align: left; } .fm-nps-card-card-right .fm-nps-card-card-right-bottom { display: flex; align-items: center; justify-content: space-between; } .fm-nps-card-list-basic .fm-loader-container{ margin: 30px 0; } .fm-nps-card-list-basic .fm-loader-container img{ width: 100px; } .fm-nps-card-card-right { flex-basis: 80%; display: flex; flex-direction: column; justify-content: space-between; } .fm-nps-card-list-basic .fm-nps-card-list-basic-container .fm-nps-card-list-basic-container-inner .fm-nps-card-list-basic-container-inner-subtitle{ font-size: 1.1rem; color: var(--fm-secondary-color); } .fm-nps-card-list-basic .fm-nps-card-list-basic-container .fm-nps-card-list-basic-container-inner .fm-nps-card-list-basic-container-inner-title{ font-size: 32px; margin: 0; font-weight: bold; } .fm-nps-card-list-basic-cards .fm-nps-card-card-left-avatar { padding: 5px 7px; background: #dadada; border-radius: 50%; display: flex; justify-content: center; align-items: center; } .fm-nps-card-list-basic .fm-button-container[disabled] { cursor: not-allowed; pointer-events: none; opacity: 0.4; } .fm-nps-card-list-basic .fm-nps-card-list-basic-cards .fm-card-light{ display: flex; flex-direction: row; gap: 5px; text-align: center; border: 1px solid #ccc; flex-basis: 45%; padding: 10px 5px; justify-content: flex-start; box-shadow: 2px 5px 2px 0px rgba(0, 0, 0, 0.1); background: var(--fm-card-primary-background); min-height: 120px; } .fm-nps-card .fm-rating{ display: flex; align-items: center; justify-content: center; gap: 5px; } .fm-nps-card .fm-rating .fm-flat-icon{ padding: 10px 5px; } .fm-nps-card-list-basic .fm-nps-card-list-basic-cards .fm-card-light img{ max-width: 100px; } .fm-nps-card-list-basic .fm-card-light p, .fm-nps-card-list-basic .fm-card-light strong { margin: 0; } .fm-nps-card-list-basic .fm-card-light p{ font-weight: normal; } @media (max-width: 768px){ .fm-nps-card-list-basic .fm-nps-card-list-basic-container{ border-radius: 0; } .fm-nps-card-list-basic .fm-nps-card-list-basic-cards .fm-nps-card { flex-basis: 100%; } .fm-nps-card-list-basic{ width: 100%; } .fm-nps-card-list-basic-container .fm-nps-card-list-basic-cards{ flex-direction: row; } } .fm-nps-card-list-basic .fm-button-container { display: flex; justify-content: center; align-items: center; cursor: pointer; background: var(--fm-primary-button-color); color: var(--fm-primary-button-text-color); border-radius: var(--fm-base-border-radius); padding: 10px; gap: 10px; margin-top: 15px; } ` ) }