grapesjs-clot
Version:
Free and Open Source Web Builder Framework
135 lines (114 loc) • 2.91 kB
JavaScript
import { includes } from 'underscore';
import Backbone from 'backbone';
export default Backbone.View.extend({
// Default view
itemView: '',
// Defines the View per type
itemsView: '',
itemType: 'type',
autoAdd: 0,
initialize(opts = {}, config) {
this.config = config || opts.config || {};
this.autoAdd && this.listenTo(this.collection, 'add', this.addTo);
this.items = [];
this.init();
},
init() {},
/**
* Add new model to the collection
* @param {Model} model
* @private
* */
addTo(model) {
this.add(model);
},
itemViewNotFound(type) {
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, fragment) {
const { config, reuseView, items, itemsView = {} } = this;
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) {
this.add(model, frag);
}, this);
this.$el.append(frag);
this.onRender();
return this;
},
onRender() {},
onRemoveBefore() {},
onRemove() {},
remove(opts = {}) {
const { items } = this;
this.onRemoveBefore(items, opts);
this.clearItems();
Backbone.View.prototype.remove.apply(this, arguments);
this.onRemove(items, opts);
},
clearItems() {
const items = this.items || [];
// TODO Traits do not update the target anymore
// items.forEach(item => item.remove());
// this.items = [];
}
});