mirror of https://github.com/artf/grapesjs.git
2 changed files with 213 additions and 10 deletions
@ -0,0 +1,207 @@ |
|||||
|
/** |
||||
|
* This module allows to create shortcuts for functions and commands (via command id) |
||||
|
* |
||||
|
* You can access the module in this way |
||||
|
* ```js
|
||||
|
* const undoManager = editor.UndoManager; |
||||
|
* ``` |
||||
|
* |
||||
|
*/ |
||||
|
import UndoManager from 'backbone-undo'; |
||||
|
|
||||
|
module.exports = () => { |
||||
|
let config; |
||||
|
let um; |
||||
|
const configDef = {}; |
||||
|
const keymaps = {}; |
||||
|
|
||||
|
/* |
||||
|
const canvas = this.get('Canvas'); |
||||
|
|
||||
|
if (this.um) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var cmp = this.get('DomComponents'); |
||||
|
if(cmp && this.config.undoManager) { |
||||
|
var that = this; |
||||
|
this.um = new UndoManager({ |
||||
|
register: [cmp.getComponents(), this.get('CssComposer').getAll()], |
||||
|
track: true |
||||
|
}); |
||||
|
this.UndoManager = this.um; |
||||
|
this.set('UndoManager', this.um); |
||||
|
|
||||
|
key('⌘+z, ctrl+z', () => { |
||||
|
if (canvas.isInputFocused()) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
that.um.undo(true); |
||||
|
that.trigger('component:update'); |
||||
|
}); |
||||
|
|
||||
|
key('⌘+shift+z, ctrl+shift+z', () => { |
||||
|
if (canvas.isInputFocused()) { |
||||
|
return; |
||||
|
} |
||||
|
that.um.redo(true); |
||||
|
that.trigger('component:update'); |
||||
|
}); |
||||
|
|
||||
|
var beforeCache; |
||||
|
const customUndoType = { |
||||
|
on: function (model, value, opts) { |
||||
|
var opt = opts || {}; |
||||
|
if(!beforeCache){ |
||||
|
beforeCache = model.previousAttributes(); |
||||
|
} |
||||
|
if (opt && opt.avoidStore) { |
||||
|
return; |
||||
|
} else { |
||||
|
var obj = { |
||||
|
object: model, |
||||
|
before: beforeCache, |
||||
|
after: model.toJSON() |
||||
|
}; |
||||
|
beforeCache = null; |
||||
|
return obj; |
||||
|
} |
||||
|
}, |
||||
|
undo: function (model, bf, af, opt) { |
||||
|
model.set(bf); |
||||
|
// Update also inputs inside Style Manager
|
||||
|
that.trigger('change:selectedComponent'); |
||||
|
}, |
||||
|
redo: function (model, bf, af, opt) { |
||||
|
model.set(af); |
||||
|
// Update also inputs inside Style Manager
|
||||
|
that.trigger('change:selectedComponent'); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
UndoManager.removeUndoType("change"); |
||||
|
UndoManager.addUndoType("change:style", customUndoType); |
||||
|
UndoManager.addUndoType("change:attributes", customUndoType); |
||||
|
UndoManager.addUndoType("change:content", customUndoType); |
||||
|
UndoManager.addUndoType("change:src", customUndoType); |
||||
|
} |
||||
|
*/ |
||||
|
|
||||
|
return { |
||||
|
|
||||
|
name: 'UndoManager', |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Initialize module |
||||
|
* @param {Object} config Configurations |
||||
|
* @private |
||||
|
*/ |
||||
|
init(opts = {}) { |
||||
|
config = { ...opts, ...configDef }; |
||||
|
this.em = config.em; |
||||
|
um = new UndoManager({ track: true, register: [] }); |
||||
|
return this; |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Get module configurations |
||||
|
* @return {Object} Configuration object |
||||
|
*/ |
||||
|
getConfig() { |
||||
|
return config; |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Add an entity (Model/Collection) to track changes |
||||
|
* @param {Model|Collection} entity Entity to track |
||||
|
*/ |
||||
|
add(entity) { |
||||
|
um.register(entity); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Remove and stop tracking the entity (Model/Collection) |
||||
|
* @param {Model|Collection} entity Entity to remove |
||||
|
*/ |
||||
|
remove(entity) { |
||||
|
um.unregister(entity); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Remove all entities |
||||
|
*/ |
||||
|
removeAll() { |
||||
|
um.unregisterAll() |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Start/resume tracking changes |
||||
|
*/ |
||||
|
start() { |
||||
|
em.startTracking(); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Stop tracking changes |
||||
|
*/ |
||||
|
stop() { |
||||
|
em.stopTracking(); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Undo last change |
||||
|
*/ |
||||
|
undo() { |
||||
|
em.undo(1); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Undo all changes |
||||
|
*/ |
||||
|
undoAll() { |
||||
|
em.undoAll(); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Redo last change |
||||
|
*/ |
||||
|
redo() { |
||||
|
em.redo(1); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Redo all changes |
||||
|
*/ |
||||
|
redoAll() { |
||||
|
em.redoAll(); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Get stack of changes |
||||
|
* @return {Array} |
||||
|
*/ |
||||
|
getStack() { |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* Clear the stack |
||||
|
*/ |
||||
|
clear() { |
||||
|
|
||||
|
} |
||||
|
}; |
||||
|
}; |
||||
Loading…
Reference in new issue