Skip to content

Commit

Permalink
Merge element content in text components before toHTML. Closes Grapes…
Browse files Browse the repository at this point in the history
  • Loading branch information
artf authored and debba committed Mar 12, 2019
1 parent 3a77911 commit c212bfa
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 36 deletions.
5 changes: 5 additions & 0 deletions src/dom_components/model/ComponentText.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,10 @@ module.exports = Component.extend({
type: 'text',
droppable: false,
editable: true
},

toHTML() {
this.trigger('sync:content', { silent: 1 });
return Component.prototype.toHTML.apply(this, arguments);
}
});
82 changes: 46 additions & 36 deletions src/dom_components/view/ComponentTextView.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ module.exports = ComponentView.extend({
const em = this.em;
this.listenTo(model, 'focus', this.onActive);
this.listenTo(model, 'change:content', this.updateContentText);
this.listenTo(model, 'sync:content', this.syncContent);
this.rte = em && em.get('RichTextEditor');
},

Expand Down Expand Up @@ -52,57 +53,66 @@ module.exports = ComponentView.extend({
* @private
* */
disableEditing() {
const model = this.model;
const { model, rte, activeRte } = this;
const editable = model.get('editable');
const rte = this.rte;
const contentOpt = { fromDisable: 1 };

if (rte && editable) {
try {
rte.disable(this, this.activeRte);
rte.disable(this, activeRte);
} catch (err) {
console.error(err);
}

const content = this.getChildrenContainer().innerHTML;
const comps = model.get('components');
comps.length && comps.reset();
model.set('content', '', contentOpt);

// If there is a custom RTE the content is just baked staticly
// inside 'content'
if (rte.customRte) {
// Avoid double content by removing its children components
// and force to trigger change
model.set('content', content, contentOpt);
} else {
const clean = model => {
const selectable = !['text', 'default', ''].some(type =>
model.is(type)
);
model.set({
this.syncContent();
}

this.rteEnabled = 0;
this.toggleEvents();
},

/**
* Merge content from the DOM to the model
*/
syncContent(opts = {}) {
const { model, rte, rteEnabled } = this;
if (!rteEnabled && !opts.force) return;
const content = this.getChildrenContainer().innerHTML;
const comps = model.components();
const contentOpt = { fromDisable: 1, ...opts };
comps.length && comps.reset(null, opts);
model.set('content', '', contentOpt);

// If there is a custom RTE the content is just baked staticly
// inside 'content'
if (rte.customRte) {
model.set('content', content, contentOpt);
} else {
const clean = model => {
const selectable = !['text', 'default', ''].some(type =>
model.is(type)
);
model.set(
{
editable: selectable && model.get('editable'),
selectable: selectable,
hoverable: selectable,
highlightable: 0,
removable: 0,
draggable: 0,
copyable: 0,
selectable: selectable,
hoverable: selectable,
toolbar: ''
});
model.get('components').each(model => clean(model));
};

// Avoid re-render on reset with silent option
model.trigger('change:content', model, '', contentOpt);
comps.add(content);
comps.each(model => clean(model));
comps.trigger('resetNavigator');
}
},
opts
);
model.get('components').each(model => clean(model));
};

// Avoid re-render on reset with silent option
!opts.silent && model.trigger('change:content', model, '', contentOpt);
comps.add(content, opts);
comps.each(model => clean(model));
comps.trigger('resetNavigator');
}

this.rteEnabled = 0;
this.toggleEvents();
},

/**
Expand Down

0 comments on commit c212bfa

Please sign in to comment.