@print-one/grapesjs
Version:
Free and Open Source Web Builder Framework
74 lines (66 loc) • 1.89 kB
text/typescript
import { ModuleView } from '../../abstract';
import Panel from '../model/Panel';
import Panels from '../model/Panels';
import PanelView from './PanelView';
export default class PanelsView extends ModuleView<Panels> {
constructor(target: Panels) {
super({ collection: target });
this.listenTo(target, 'add', this.addTo);
this.listenTo(target, 'reset', this.render);
this.listenTo(target, 'remove', this.onRemove);
this.className = this.pfx + 'panels';
}
private onRemove(model: Panel) {
const view = model.view;
view && view.remove();
}
/**
* Add to collection
* @param Object Model
*
* @return Object
* @private
* */
private addTo(model: Panel) {
this.addToCollection(model);
}
/**
* Add new object to collection
* @param Object Model
* @param Object Fragment collection
* @param integer Index of append
*
* @return Object Object created
* @private
* */
private addToCollection(model: Panel, fragmentEl?: DocumentFragment) {
const fragment = fragmentEl || null;
const el = model.get('el');
const view = new PanelView(model);
const rendered = view.render().el;
const appendTo = model.get('appendTo');
// Do nothing if the panel was requested to be another element
if (el) {
} else if (appendTo) {
const appendEl = document.querySelector(appendTo);
appendEl?.appendChild(rendered);
} else {
if (fragment) {
fragment.appendChild(rendered);
} else {
this.$el.append(rendered);
}
}
view.initResize();
return rendered;
}
public render() {
const $el = this.$el;
const frag = document.createDocumentFragment();
$el.empty();
this.collection.each(model => this.addToCollection(model, frag));
$el.append(frag);
$el.attr('class', this.className);
return this;
}
}