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.
110 lines
2.6 KiB
110 lines
2.6 KiB
var Backbone = require('backbone');
|
|
|
|
module.exports = Backbone.View.extend({
|
|
|
|
initialize(o) {
|
|
this.opts = o || {};
|
|
this.config = o.config || {};
|
|
this.listenTo( this.collection, 'add', this.addTo );
|
|
this.listenTo( this.collection, 'reset', this.render );
|
|
},
|
|
|
|
/**
|
|
* Add to collection
|
|
* @param {Object} Model
|
|
*
|
|
* @return void
|
|
* @private
|
|
* */
|
|
addTo(model) {
|
|
var i = this.collection.indexOf(model);
|
|
this.addToCollection(model, null, i);
|
|
|
|
var em = this.config.em;
|
|
if(em) {
|
|
// OLD
|
|
em.trigger('add:component', model);
|
|
em.trigger('component:add', model);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Add new object to collection
|
|
* @param {Object} Model
|
|
* @param {Object} Fragment collection
|
|
* @param {Integer} Index of append
|
|
*
|
|
* @return {Object} Object rendered
|
|
* @private
|
|
* */
|
|
addToCollection(model, fragmentEl, index) {
|
|
if(!this.compView)
|
|
this.compView = require('./ComponentView');
|
|
var fragment = fragmentEl || null,
|
|
viewObject = this.compView;
|
|
//console.log('Add to collection', model, 'Index',i);
|
|
|
|
var dt = this.opts.componentTypes;
|
|
|
|
var type = model.get('type');
|
|
|
|
for (var it = 0; it < dt.length; it++) {
|
|
var dtId = dt[it].id;
|
|
if(dtId == type) {
|
|
viewObject = dt[it].view;
|
|
break;
|
|
}
|
|
}
|
|
//viewObject = dt[type] ? dt[type].view : dt.default.view;
|
|
|
|
var view = new viewObject({
|
|
model,
|
|
config: this.config,
|
|
componentTypes: dt,
|
|
});
|
|
var rendered = view.render().el;
|
|
if(view.model.get('type') == 'textnode')
|
|
rendered = document.createTextNode(view.model.get('content'));
|
|
|
|
if(fragment){
|
|
fragment.appendChild(rendered);
|
|
}else{
|
|
var p = this.$parent;
|
|
var pc = p.children;
|
|
if(typeof index != 'undefined'){
|
|
var method = 'before';
|
|
// If the added model is the last of collection
|
|
// need to change the logic of append
|
|
if(pc && p.children().length == index){
|
|
index--;
|
|
method = 'after';
|
|
}
|
|
// In case the added is new in the collection index will be -1
|
|
if(index < 0) {
|
|
p.append(rendered);
|
|
}else {
|
|
if(pc) {
|
|
p.children().eq(index)[method](rendered);
|
|
}
|
|
}
|
|
}else{
|
|
p.append(rendered);
|
|
}
|
|
}
|
|
|
|
return rendered;
|
|
},
|
|
|
|
render($p) {
|
|
var fragment = document.createDocumentFragment();
|
|
this.$parent = $p || this.$el;
|
|
this.$el.empty();
|
|
this.collection.each(function(model){
|
|
this.addToCollection(model, fragment);
|
|
},this);
|
|
this.$el.append(fragment);
|
|
|
|
return this;
|
|
}
|
|
|
|
});
|
|
|