@print-one/grapesjs
Version:
Free and Open Source Web Builder Framework
136 lines (116 loc) • 2.99 kB
text/typescript
import { includes } from 'underscore';
import { ObjectAny, View } from '../../common';
export default class DomainViews extends View {
config?: any;
items: any[];
ns?: string;
itemView?: any;
// Defines the View per type
itemsView = '';
itemType = 'type';
reuseView = false;
constructor(opts: any = {}, config?: any, autoAdd = false) {
super(opts);
this.config = config || opts.config || {};
autoAdd && this.listenTo(this.collection, 'add', this.addTo);
this.items = [];
}
/**
* Add new model to the collection
* @param {Model} model
* @private
* */
addTo(model: any) {
this.add(model);
}
itemViewNotFound(type: string) {
const { config, ns } = this;
const { em } = config;
const warn = `${ns ? `[${ns}]: ` : ''}'${type}' type not found`;
em && em.logWarning(warn);
}
/**
* Render new model inside the view
* @param {Model} model
* @param {Object} fragment Fragment collection
* @private
* */
add(model: any, fragment?: DocumentFragment) {
const { config, reuseView, items } = this;
const itemsView = (this.itemsView || {}) as ObjectAny;
const inputTypes = [
'button',
'checkbox',
'color',
'date',
'datetime-local',
'email',
'file',
'hidden',
'image',
'month',
'number',
'password',
'radio',
'range',
'reset',
'search',
'submit',
'tel',
'text',
'time',
'url',
'week',
];
var frag = fragment || null;
var itemView = this.itemView;
var typeField = model.get(this.itemType);
let view;
if (itemsView[typeField]) {
itemView = itemsView[typeField];
} else if (typeField && !itemsView[typeField] && !includes(inputTypes, typeField)) {
this.itemViewNotFound(typeField);
}
if (model.view && reuseView) {
view = model.view;
} else {
view = new itemView({ model, config }, config);
}
items && items.push(view);
const rendered = view.render().el;
if (frag) frag.appendChild(rendered);
else this.$el.append(rendered);
}
render() {
var frag = document.createDocumentFragment();
this.clearItems();
this.$el.empty();
if (this.collection.length)
this.collection.each(function (model) {
// @ts-ignore
this.add(model, frag);
}, this);
this.$el.append(frag);
this.onRender();
return this;
}
onRender() {}
onRemoveBefore(items?: any, opts?: any) {}
onRemove(items?: any, opts?: any) {}
remove(opts = {}) {
const { items } = this;
this.onRemoveBefore(items, opts);
this.clearItems();
super.remove();
this.onRemove(items, opts);
return this;
}
clearItems() {
const items = this.items || [];
// TODO Traits do not update the target anymore
// items.forEach(item => item.remove());
// this.items = [];
}
}
// Default view
DomainViews.prototype.itemView = '';