grapesjs
Version:
Free and Open Source Web Builder Framework
151 lines (132 loc) • 3.74 kB
JavaScript
import {on, off} from 'utils/mixins'
const SelectComponent = require('./SelectComponent');
const SelectPosition = require('./SelectPosition');
const $ = Backbone.$;
module.exports = _.extend({}, SelectPosition, SelectComponent, {
init(o) {
SelectComponent.init.apply(this, arguments);
_.bindAll(this, 'initSorter','rollback', 'onEndMove');
this.opt = o;
this.hoverClass = this.ppfx + 'highlighter-warning';
this.badgeClass = this.ppfx + 'badge-warning';
this.noSelClass = this.ppfx + 'no-select';
},
enable(...args) {
SelectComponent.enable.apply(this, args);
this.getBadgeEl().addClass(this.badgeClass);
this.getHighlighterEl().addClass(this.hoverClass);
var wp = this.$wrapper;
wp.css('cursor','move');
wp.on('mousedown', this.initSorter);
// Avoid strange moving behavior
wp.addClass(this.noSelClass);
},
/**
* Overwrite for doing nothing
* @private
*/
toggleClipboard() {},
/**
* Delegate sorting
* @param {Event} e
* @private
* */
initSorter(e) {
var el = $(e.target).data('model');
var drag = el.get('draggable');
if(!drag)
return;
// Avoid badge showing on move
this.cacheEl = null;
this.startSelectPosition(e.target, this.frameEl.contentDocument);
this.sorter.draggable = drag;
this.sorter.onEndMove = this.onEndMove.bind(this);
this.stopSelectComponent();
this.$wrapper.off('mousedown', this.initSorter);
on(this.getContentWindow(), 'keydown', this.rollback);
},
/**
* Init sorter from model
* @param {Object} model
* @private
*/
initSorterFromModel(model) {
var drag = model.get('draggable');
if(!drag)
return;
// Avoid badge showing on move
this.cacheEl = null;
var el = model.view.el;
this.startSelectPosition(el, this.frameEl.contentDocument);
this.sorter.draggable = drag;
this.sorter.onEndMove = this.onEndMoveFromModel.bind(this);
/*
this.sorter.setDragHelper(el);
var dragHelper = this.sorter.dragHelper;
dragHelper.className = this.ppfx + 'drag-helper';
dragHelper.innerHTML = '';
dragHelper.backgroundColor = 'white';
*/
this.stopSelectComponent();
on(this.getContentWindow(), 'keydown', this.rollback);
},
onEndMoveFromModel() {
off(this.getContentWindow(), 'keydown', this.rollback);
},
/**
* Callback after sorting
* @private
*/
onEndMove() {
this.enable();
off(this.getContentWindow(), 'keydown', this.rollback);
},
/**
* Say what to do after the component was selected (selectComponent)
* @param {Event} e
* @param {Object} Selected element
* @private
* */
onSelect(e, el) {},
/**
* Used to bring the previous situation before start moving the component
* @param {Event} e
* @param {Boolean} Indicates if rollback in anycase
* @private
* */
rollback(e, force) {
var key = e.which || e.keyCode;
if(key == this.opt.ESCAPE_KEY || force){
this.sorter.moved = false;
this.sorter.endMove();
}
return;
},
/**
* Returns badge element
* @return {HTMLElement}
* @private
*/
getBadgeEl() {
if(!this.$badge)
this.$badge = $(this.getBadge());
return this.$badge;
},
/**
* Returns highlighter element
* @return {HTMLElement}
* @private
*/
getHighlighterEl() {
if(!this.$hl)
this.$hl = $(this.canvas.getHighlighter());
return this.$hl;
},
stop(...args) {
SelectComponent.stop.apply(this, args);
this.getBadgeEl().removeClass(this.badgeClass);
this.getHighlighterEl().removeClass(this.hoverClass);
var wp = this.$wrapper;
wp.css('cursor', '').unbind().removeClass(this.noSelClass);
}
});