From 8662913bdd4e8e0296b2e659e255e4f9e6c69bb5 Mon Sep 17 00:00:00 2001 From: zachsnoek Date: Fri, 10 Dec 2021 10:08:55 -0800 Subject: [PATCH 1/2] Add guard to prevent TypeError during paste --- src/commands/view/PasteComponent.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/commands/view/PasteComponent.js b/src/commands/view/PasteComponent.js index 039be8784..1f451f299 100644 --- a/src/commands/view/PasteComponent.js +++ b/src/commands/view/PasteComponent.js @@ -9,7 +9,10 @@ export default { if (clp && selected) { ed.getSelectedAll().forEach(comp => { if (!comp) return; + const coll = comp.collection; + if (!coll) return; + const at = coll.indexOf(comp) + 1; const copyable = clp.filter(cop => cop.get('copyable')); let added; @@ -17,7 +20,10 @@ export default { if (contains(clp, comp) && comp.get('copyable')) { added = coll.add(comp.clone(), { at }); } else { - added = coll.add(copyable.map(cop => cop.clone()), { at }); + added = coll.add( + copyable.map(cop => cop.clone()), + { at } + ); } added = isArray(added) ? added : [added]; From 54f302072b4ab7505839a63e308e10b92a23f9ab Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Tue, 21 Dec 2021 18:41:30 +0100 Subject: [PATCH 2/2] Improve check for layer visibility. Fixes #4010 --- src/navigator/view/ItemView.js | 45 +++++++++++++++------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/src/navigator/view/ItemView.js b/src/navigator/view/ItemView.js index 167c2ae0b..aef9c3368 100644 --- a/src/navigator/view/ItemView.js +++ b/src/navigator/view/ItemView.js @@ -7,6 +7,9 @@ import { eventDrag } from 'dom_components/model/Component'; const inputProp = 'contentEditable'; const styleOpts = { mediaText: '' }; const $ = Backbone.$; +const isStyleHidden = (style = {}) => { + return (style.display || '').trim().indexOf('none') === 0; +}; let ItemsView; export default Backbone.View.extend({ @@ -20,7 +23,7 @@ export default Backbone.View.extend({ 'mouseout [data-toggle-select]': 'handleHoverOut', 'dblclick [data-name]': 'handleEdit', 'keydown [data-name]': 'handleEditKey', - 'focusout [data-name]': 'handleEditEnd' + 'focusout [data-name]': 'handleEditEnd', }, template(model) { @@ -86,8 +89,8 @@ export default Backbone.View.extend({ ['change:open', this.updateOpening], ['change:layerable', this.updateLayerable], ['change:style:display', this.updateVisibility], - ['rerender:layer', this.render] - ].forEach(item => this.listenTo(model, item[0], item[1])); + ['rerender:layer', this.render], + ].forEach((item) => this.listenTo(model, item[0], item[1])); this.className = `${pfx}layer ${pfx}layer__t-${type} no-select ${ppfx}two-color`; this.inputNameCls = `${ppfx}layer-name`; this.clsTitleC = `${pfx}layer-title-c`; @@ -105,7 +108,7 @@ export default Backbone.View.extend({ onInit.bind(this)({ component: model, render: this.__render, - listenTo: this.listenTo + listenTo: this.listenTo, }); }, @@ -122,7 +125,7 @@ export default Backbone.View.extend({ const model = this.model; const hClass = `${pfx}layer-hidden`; const hideIcon = 'fa-eye-slash'; - const hidden = model.getStyle(styleOpts).display === 'none'; + const hidden = isStyleHidden(model.getStyle(styleOpts)); const method = hidden ? 'addClass' : 'removeClass'; this.$el[method](hClass); this.getVisibilityEl()[method](hideIcon); @@ -141,7 +144,7 @@ export default Backbone.View.extend({ const prevDisplay = model.get(prevDspKey); const style = model.getStyle(styleOpts); const { display } = style; - const hidden = display == 'none'; + const hidden = isStyleHidden(style); if (hidden) { delete style.display; @@ -170,10 +173,7 @@ export default Backbone.View.extend({ inputEl.focus(); document.execCommand('selectAll', false, null); em && em.setEditing(1); - $el - .find(`.${this.inputNameCls}`) - .removeClass(clsNoEdit) - .addClass(clsEdit); + $el.find(`.${this.inputNameCls}`).removeClass(clsNoEdit).addClass(clsEdit); }, handleEditKey(ev) { @@ -193,10 +193,7 @@ export default Backbone.View.extend({ inputEl[inputProp] = false; this.setName(name, { component: this.model, propName: 'custom-name' }); em && em.setEditing(0); - $el - .find(`.${this.inputNameCls}`) - .addClass(clsNoEdit) - .removeClass(clsEdit); + $el.find(`.${this.inputNameCls}`).addClass(clsNoEdit).removeClass(clsEdit); }, setName(name, { propName }) { @@ -260,7 +257,7 @@ export default Backbone.View.extend({ if (em) { em.setSelected(model, { fromLayers: 1, event: e }); const scroll = config.scrollCanvas; - scroll && model.views.forEach(view => view.scrollIntoView(scroll)); + scroll && model.views.forEach((view) => view.scrollIntoView(scroll)); } }, @@ -290,8 +287,8 @@ export default Backbone.View.extend({ if (e.button && e.button !== 0) return; if (sorter) { - sorter.onStart = data => em.trigger(`${eventDrag}:start`, data); - sorter.onMoveClb = data => em.trigger(eventDrag, data); + sorter.onStart = (data) => em.trigger(`${eventDrag}:start`, data); + sorter.onMoveClb = (data) => em.trigger(eventDrag, data); sorter.startSort(e.target); } }, @@ -321,8 +318,8 @@ export default Backbone.View.extend({ ComponentView.prototype.updateStatus.apply(this, [ { avoidHover: !this.config.highlightHover, - noExtHl: 1 - } + noExtHl: 1, + }, ]); }, @@ -332,9 +329,7 @@ export default Backbone.View.extend({ * @return boolean * */ isVisible() { - const { display } = this.model.getStyle(); - - return !(display && display === 'none'); + return !isStyleHidden(this.model.getStyle()); }, /** @@ -368,7 +363,7 @@ export default Backbone.View.extend({ */ countChildren(model) { var count = 0; - model.get('components').each(function(m) { + model.get('components').each(function (m) { var isCountable = this.opt.isCountable; var hide = this.config.hideTextnode; if (isCountable && !isCountable(m, hide)) return; @@ -436,7 +431,7 @@ export default Backbone.View.extend({ opened: this.opt.opened, parentView: this, parent: model, - level + level, }); const children = this.items.render().$el; @@ -468,5 +463,5 @@ export default Backbone.View.extend({ const opt = { component: model, el }; onRender.bind(this)(opt); this.em.trigger('layer:render', opt); - } + }, });