fonteva-design-guide
Version:
## Dev, Build and Test
135 lines (109 loc) • 3.82 kB
JavaScript
import { LightningElement, api, track } from 'lwc';
import { Selector } from 'c/utils';
export default class Modal extends Selector(LightningElement) {
title;
tagline;
backend;
bare;
center;
closeLabel = 'Close';
customFooter; // deprecated
saveLabel = 'Save';
hideSave = false;
size; // small, medium, large
additionalCloseClasses;
additionalSaveClasses;
classes;
bdClasses;
contentClasses;
hasTagline;
closeVariant;
closeButtonVariant;
headerWeight;
hasFooter = true;
_open = false;
get open() {
return this._open;
}
set open(value) {
this._open = value;
this.doShowHide();
}
show() {
this._open = true;
this.doShowHide();
}
hide() {
this._open = false;
this.doShowHide();
}
doShowHide() {
if (this._open) {
this.classes = (this.classes || '') + ' slds-fade-in-open';
this.bdClasses = (this.bdClasses || '') + ' slds-backdrop_open';
document.body.setAttribute('style', 'overflow-y: hidden');
} else {
this.classes = this.classes ? this.classes.replace(' slds-fade-in-open', '') : '';
this.bdClasses = this.bdClasses ? this.bdClasses.replace(' slds-backdrop_open', '') : '';
document.body.removeAttribute('style');
this.querySelector('##closeButtonModal', l => l.endLoader());
this.querySelector('##saveButtonModal', l => l.endLoader());
}
}
connectedCallback() {
if (this.customFooter)
console.log('CustomFooter is deprecated. Condition is automatically fulfilled if footer is present');
this.modalBody();
this.modalContent();
this.backdrop();
this.headerWeight = this.backend ? 'light' : 'bold';
}
renderedCallback() {
const footer = this.querySelectorAll('span[slot="footer"]');
this.hasFooter = footer.length !== 0;
}
modalBody() {
const classBase = 'pfm-modal slds-modal';
let valBackend = this.backend,
valSize = this.size;
let backend, size;
backend = valBackend ? '' : ' pfm-modal_portal';
size = valSize ? ' slds-modal_' + valSize : '';
this.classes = classBase + size + backend;
this.hasTagline = this.tagline;
this.closeVariant = valBackend ? 'inverse' : false;
this.closeButtonVariant = valBackend
? ' slds-button slds-button_icon slds-modal__close slds-button_icon-inverse'
: ' slds-button slds-button_icon slds-modal__close';
}
backdrop() {
const classBase = 'slds-backdrop';
this.bdClasses = classBase;
}
modalContent() {
const classBase = 'slds-modal__content';
let valCenter = this.center;
let center,
bare = this.bare ? '' : ' slds-p-around_large';
center = valCenter ? ' slds-text-align_center' : '';
this.contentClasses = classBase + center + bare;
}
closeHandler() {
this.dispatchEvent(new CustomEvent('close'));
this.endLoader('closeButtonModal');
this.hide();
}
saveHandler() {
this.dispatchEvent(new CustomEvent('save'));
}
endLoader(buttonType) {
let buttonTarget = this.template.querySelector("c-pfm-button[data-name='" + buttonType + "']");
if (buttonTarget != null) {
buttonTarget.endLoader();
}
}
}