mirror of https://github.com/artf/grapesjs.git
nocodeframeworkdrag-and-dropsite-buildersite-generatortemplate-builderui-builderweb-builderweb-builder-frameworkwebsite-builderno-codepage-builder
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.1 KiB
143 lines
3.1 KiB
import { View } from '../../common';
|
|
|
|
export default class ModalView extends View {
|
|
template({ pfx, ppfx, content, title }) {
|
|
return `<div class="${pfx}dialog ${ppfx}one-bg ${ppfx}two-color">
|
|
<div class="${pfx}header">
|
|
<div class="${pfx}title">${title}</div>
|
|
<div class="${pfx}btn-close" data-close-modal>⨯</div>
|
|
</div>
|
|
<div class="${pfx}content">
|
|
<div id="${pfx}c">${content}</div>
|
|
<div style="clear:both"></div>
|
|
</div>
|
|
</div>
|
|
<div class="${pfx}collector" style="display: none"></div>`;
|
|
}
|
|
|
|
events() {
|
|
return {
|
|
click: 'onClick',
|
|
'click [data-close-modal]': 'hide',
|
|
};
|
|
}
|
|
|
|
initialize(o) {
|
|
const model = this.model;
|
|
const config = o.config || {};
|
|
const pfx = config.stylePrefix || '';
|
|
this.config = config;
|
|
this.pfx = pfx;
|
|
this.ppfx = config.pStylePrefix || '';
|
|
this.listenTo(model, 'change:open', this.updateOpen);
|
|
this.listenTo(model, 'change:title', this.updateTitle);
|
|
this.listenTo(model, 'change:content', this.updateContent);
|
|
}
|
|
|
|
onClick(e) {
|
|
const bkd = this.config.backdrop;
|
|
bkd && e.target === this.el && this.hide();
|
|
}
|
|
|
|
/**
|
|
* Returns collector element
|
|
* @return {HTMLElement}
|
|
* @private
|
|
*/
|
|
getCollector() {
|
|
if (!this.$collector) this.$collector = this.$el.find('.' + this.pfx + 'collector');
|
|
return this.$collector;
|
|
}
|
|
|
|
/**
|
|
* Returns content element
|
|
* @return {HTMLElement}
|
|
* @private
|
|
*/
|
|
getContent() {
|
|
const pfx = this.pfx;
|
|
|
|
if (!this.$content) {
|
|
this.$content = this.$el.find(`.${pfx}content #${pfx}c`);
|
|
}
|
|
|
|
return this.$content;
|
|
}
|
|
|
|
/**
|
|
* Returns title element
|
|
* @return {HTMLElement}
|
|
* @private
|
|
*/
|
|
getTitle(opts = {}) {
|
|
if (!this.$title) this.$title = this.$el.find('.' + this.pfx + 'title');
|
|
return opts.$ ? this.$title : this.$title.get(0);
|
|
}
|
|
|
|
/**
|
|
* Update content
|
|
* @private
|
|
* */
|
|
updateContent() {
|
|
var content = this.getContent();
|
|
const children = content.children();
|
|
const coll = this.getCollector();
|
|
const body = this.model.get('content');
|
|
children.length && coll.append(children);
|
|
content.empty().append(body);
|
|
}
|
|
|
|
/**
|
|
* Update title
|
|
* @private
|
|
* */
|
|
updateTitle() {
|
|
const title = this.getTitle({ $: true });
|
|
title && title.empty().append(this.model.get('title'));
|
|
}
|
|
|
|
/**
|
|
* Update open
|
|
* @private
|
|
* */
|
|
updateOpen() {
|
|
this.el.style.display = this.model.get('open') ? '' : 'none';
|
|
}
|
|
|
|
/**
|
|
* Hide modal
|
|
* @private
|
|
* */
|
|
hide() {
|
|
this.model.close();
|
|
}
|
|
|
|
/**
|
|
* Show modal
|
|
* @private
|
|
* */
|
|
show() {
|
|
this.model.open();
|
|
}
|
|
|
|
updateAttr(attr) {
|
|
const { pfx, $el, el } = this;
|
|
const currAttr = [].slice.call(el.attributes).map(i => i.name);
|
|
$el.removeAttr(currAttr.join(' '));
|
|
$el.attr({
|
|
...(attr || {}),
|
|
class: `${pfx}container ${(attr && attr.class) || ''}`.trim(),
|
|
});
|
|
}
|
|
|
|
render() {
|
|
const el = this.$el;
|
|
const obj = this.model.toJSON();
|
|
obj.pfx = this.pfx;
|
|
obj.ppfx = this.ppfx;
|
|
el.html(this.template(obj));
|
|
this.updateAttr();
|
|
this.updateOpen();
|
|
return this;
|
|
}
|
|
}
|
|
|