UNPKG

grapesjs_codeapps

Version:

Free and Open Source Web Builder Framework/SC Modification

169 lines (150 loc) 4.42 kB
import _ from 'underscore'; import Backbone from 'backbone'; 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); }, /** * Init sorter from models * @param {Object} model * @private */ initSorterFromModels(models) { // TODO: if one only check for `draggable` // Avoid badge showing on move this.cacheEl = null; const lastModel = models[models.length - 1]; const doc = this.frameEl.contentDocument; this.startSelectPosition(lastModel.view.el, doc); this.sorter.draggable = lastModel.get('draggable'); this.sorter.toMove = models; this.sorter.onEndMove = this.onEndMoveFromModel.bind(this); 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); } });