Browse Source

Merge dev

pull/1625/head
Artur Arseniev 8 years ago
parent
commit
47134b4f81
  1. 9
      src/canvas/config/config.js
  2. 10
      src/canvas/index.js
  3. 2
      src/commands/view/ComponentDelete.js
  4. 7
      src/commands/view/ComponentEnter.js
  5. 7
      src/commands/view/ComponentExit.js
  6. 7
      src/commands/view/ComponentNext.js
  7. 7
      src/commands/view/ComponentPrev.js
  8. 2
      src/commands/view/CopyComponent.js
  9. 2
      src/commands/view/PasteComponent.js
  10. 9
      src/panels/view/PanelView.js
  11. 13
      test/specs/panels/view/PanelView.js

9
src/canvas/config/config.js

@ -24,5 +24,12 @@ module.exports = {
* return component.getName(); * return component.getName();
* } * }
*/ */
customBadgeLabel: '' customBadgeLabel: '',
/**
* When some textable component is selected and focused (eg. input or text component) the editor
* stops some commands (eg. disables the copy/paste of components with CTRL+C/V to allow the copy/paste of the text).
* This option allows to customize, by a selector, which element should not be considered textable
*/
notTextable: ['button', 'input[type=checkbox]', 'input[type=radio]']
}; };

10
src/canvas/index.js

@ -409,11 +409,11 @@ module.exports = () => {
* @private * @private
*/ */
isInputFocused() { isInputFocused() {
let contentDocument = this.getFrameEl().contentDocument; const doc = this.getDocument();
return ( const toIgnore = ['body', ...this.getConfig().notTextable];
contentDocument.activeElement && const focused = doc && doc.activeElement;
contentDocument.activeElement.tagName !== 'BODY'
); return focused && !toIgnore.some(item => focused.matches(item));
}, },
/** /**

2
src/commands/view/ComponentDelete.js

@ -2,7 +2,7 @@ import { isArray } from 'underscore';
module.exports = { module.exports = {
run(ed, sender, opts = {}) { run(ed, sender, opts = {}) {
if (ed.getModel().isEditing()) return; if (ed.getModel().isEditing() || ed.Canvas.isInputFocused()) return;
let components = opts.component || ed.getSelectedAll(); let components = opts.component || ed.getSelectedAll();
components = isArray(components) ? [...components] : [components]; components = isArray(components) ? [...components] : [components];

7
src/commands/view/ComponentEnter.js

@ -1,6 +1,11 @@
module.exports = { module.exports = {
run(ed) { run(ed) {
if (!ed.Canvas.hasFocus() || ed.getModel().isEditing()) return; if (
!ed.Canvas.hasFocus() ||
ed.getModel().isEditing() ||
ed.Canvas.isInputFocused()
)
return;
const toSelect = []; const toSelect = [];
ed.getSelectedAll().forEach(component => { ed.getSelectedAll().forEach(component => {

7
src/commands/view/ComponentExit.js

@ -1,6 +1,11 @@
module.exports = { module.exports = {
run(ed) { run(ed) {
if (!ed.Canvas.hasFocus() || ed.getModel().isEditing()) return; if (
!ed.Canvas.hasFocus() ||
ed.getModel().isEditing() ||
ed.Canvas.isInputFocused()
)
return;
const toSelect = []; const toSelect = [];
ed.getSelectedAll().forEach(component => { ed.getSelectedAll().forEach(component => {

7
src/commands/view/ComponentNext.js

@ -1,6 +1,11 @@
module.exports = { module.exports = {
run(ed) { run(ed) {
if (!ed.Canvas.hasFocus() || ed.getModel().isEditing()) return; if (
!ed.Canvas.hasFocus() ||
ed.getModel().isEditing() ||
ed.Canvas.isInputFocused()
)
return;
const toSelect = []; const toSelect = [];
ed.getSelectedAll().forEach(component => { ed.getSelectedAll().forEach(component => {

7
src/commands/view/ComponentPrev.js

@ -1,6 +1,11 @@
module.exports = { module.exports = {
run(ed) { run(ed) {
if (!ed.Canvas.hasFocus() || ed.getModel().isEditing()) return; if (
!ed.Canvas.hasFocus() ||
ed.getModel().isEditing() ||
ed.Canvas.isInputFocused()
)
return;
const toSelect = []; const toSelect = [];
ed.getSelectedAll().forEach(component => { ed.getSelectedAll().forEach(component => {

2
src/commands/view/CopyComponent.js

@ -3,7 +3,7 @@ module.exports = {
const em = ed.getModel(); const em = ed.getModel();
const models = [...ed.getSelectedAll()]; const models = [...ed.getSelectedAll()];
if (models.length && !em.isEditing()) { if (models.length && !em.isEditing() && !ed.Canvas.isInputFocused()) {
em.set('clipboard', models); em.set('clipboard', models);
} }
} }

2
src/commands/view/PasteComponent.js

@ -6,7 +6,7 @@ module.exports = {
const clp = em.get('clipboard'); const clp = em.get('clipboard');
const selected = ed.getSelected(); const selected = ed.getSelected();
if (clp && selected && !em.isEditing()) { if (clp && selected && !em.isEditing() && !ed.Canvas.isInputFocused()) {
ed.getSelectedAll().forEach(comp => { ed.getSelectedAll().forEach(comp => {
if (!comp) return; if (!comp) return;
const coll = comp.collection; const coll = comp.collection;

9
src/panels/view/PanelView.js

@ -13,6 +13,7 @@ module.exports = Backbone.View.extend({
this.id = this.pfx + model.get('id'); this.id = this.pfx + model.get('id');
this.listenTo(model, 'change:appendContent', this.appendContent); this.listenTo(model, 'change:appendContent', this.appendContent);
this.listenTo(model, 'change:content', this.updateContent); this.listenTo(model, 'change:content', this.updateContent);
this.listenTo(model, 'change:visible', this.toggleVisible);
model.view = this; model.view = this;
}, },
@ -30,6 +31,14 @@ module.exports = Backbone.View.extend({
this.$el.html(this.model.get('content')); this.$el.html(this.model.get('content'));
}, },
toggleVisible() {
if (!this.model.get('visible')) {
this.$el.addClass(`${this.ppfx}hidden`);
return;
}
this.$el.removeClass(`${this.ppfx}hidden`);
},
attributes() { attributes() {
return this.model.get('attributes'); return this.model.get('attributes');
}, },

13
test/specs/panels/view/PanelView.js

@ -39,6 +39,19 @@ module.exports = {
expect(view.$el.html()).toEqual('test2'); expect(view.$el.html()).toEqual('test2');
}); });
test('Hide panel', () => {
expect(view.$el.hasClass('hidden')).toBeFalsy();
model.set('visible', false);
expect(view.$el.hasClass('hidden')).toBeTruthy();
});
test('Show panel', () => {
model.set('visible', false);
expect(view.$el.hasClass('hidden')).toBeTruthy();
model.set('visible', true);
expect(view.$el.hasClass('hidden')).toBeFalsy();
});
describe('Init with options', () => { describe('Init with options', () => {
beforeEach(() => { beforeEach(() => {
model = new Panel({ model = new Panel({

Loading…
Cancel
Save