fm-lp-factory
Version:
package created to build web ui components for FidelizarMais LP services
340 lines (292 loc) • 10.8 kB
JavaScript
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:
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
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;
}
`
)
}