commandz 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -2
- data/commandz.min.js +3 -3
- data/lib/assets/javascripts/commandz.coffee +39 -6
- data/lib/commandz/version.rb +1 -1
- data/spec/commandz_spec.coffee +18 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 331dea85970246369b095cc99b8660c3f9a93c04
|
4
|
+
data.tar.gz: f00a9e210a47a18b3458a6f88ea0d96ba58a331c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f30b30d62d585f39e024587ca28bf156493862829757104e3e23700f5ee02e55d3a2719db6449a5c5cc638f547e8654f8578da4ef3fa8962a050688a14e4d3ef
|
7
|
+
data.tar.gz: 410ba025d6b17e60f62f9db2a31bda7071e43401a710efa0880ace7f738b16be296bc093b7fa8cf6a9c3beb9c63e1b5a3b5d81e47a8b1f07b8c44473549fce31
|
data/README.md
CHANGED
@@ -13,6 +13,21 @@
|
|
13
13
|
<a href="http://badge.fury.io/rb/commandz"><img src="https://badge.fury.io/rb/commandz@2x.png" alt="Gem Version" height="18"></a>
|
14
14
|
</p>
|
15
15
|
|
16
|
+
## Table of contents
|
17
|
+
- [API](#api)
|
18
|
+
- [CommandZ.execute](#execute)
|
19
|
+
- [CommandZ.undo](#undo)
|
20
|
+
- [CommandZ.redo](#redo)
|
21
|
+
- [CommandZ.status](#status)
|
22
|
+
- [CommandZ.onChange](#onchange)
|
23
|
+
- [CommandZ.clear](#clear)
|
24
|
+
- [CommandZ.keyboardShortcuts](#keyboardshortcuts)
|
25
|
+
- [DOM Example](#dom-example)
|
26
|
+
- [Setup](#setup)
|
27
|
+
- [Rails](#rails)
|
28
|
+
- [Other](#other)
|
29
|
+
- [Tests](#tests)
|
30
|
+
|
16
31
|
## API
|
17
32
|
#### Glossary
|
18
33
|
```js
|
@@ -110,7 +125,7 @@ console.log(CommandZ.index) // => 0
|
|
110
125
|
```
|
111
126
|
|
112
127
|
### status
|
113
|
-
Return the current
|
128
|
+
Return the current status.
|
114
129
|
|
115
130
|
```js
|
116
131
|
CommandZ.execute({
|
@@ -123,11 +138,33 @@ CommandZ.execute({
|
|
123
138
|
down: function() { console.log('down 2') }
|
124
139
|
}) // => up 2
|
125
140
|
|
126
|
-
console.log(CommandZ.status()) // => {
|
141
|
+
console.log(CommandZ.status()) // => { canUndo: true, canRedo: false }
|
127
142
|
console.log(CommandZ.commands.length) // => 2
|
128
143
|
console.log(CommandZ.index) // => 1
|
129
144
|
```
|
130
145
|
|
146
|
+
### onChange
|
147
|
+
Register a callback that will be called with the `status` every time there’s a change to the history.
|
148
|
+
|
149
|
+
```js
|
150
|
+
CommandZ.onChange(function(status) {
|
151
|
+
console.log(status)
|
152
|
+
})
|
153
|
+
|
154
|
+
CommandZ.execute({
|
155
|
+
up: function() { 'up 1' },
|
156
|
+
down: function() { 'down 1' }
|
157
|
+
}) // => { canUndo: true, canRedo: false }
|
158
|
+
|
159
|
+
CommandZ.execute({
|
160
|
+
up: function() { 'up 2' },
|
161
|
+
down: function() { 'down 2' }
|
162
|
+
}) // => { canUndo: true, canRedo: false }
|
163
|
+
|
164
|
+
CommandZ.undo() // => { canUndo: true, canRedo: true }
|
165
|
+
CommandZ.undo() // => { canUndo: false, canRedo: true }
|
166
|
+
```
|
167
|
+
|
131
168
|
### clear
|
132
169
|
Clear history.
|
133
170
|
|
@@ -149,6 +186,15 @@ console.log(CommandZ.commands.length) // => 0
|
|
149
186
|
console.log(CommandZ.index) // => -1
|
150
187
|
```
|
151
188
|
|
189
|
+
### keyboardShortcuts
|
190
|
+
Enable or disable `CMD+Z` & `CMD+SHIFT+Z` keyboard shortcuts. These shortcuts are enabled by default.<br>
|
191
|
+
Will only `undo()` & `redo()` if the current selected element is not an input so that it doesn’t prevent your OS default behavior.
|
192
|
+
|
193
|
+
```js
|
194
|
+
CommandZ.keyboardShortcuts(true) // default
|
195
|
+
CommandZ.keyboardShortcuts(false)
|
196
|
+
```
|
197
|
+
|
152
198
|
## DOM Example
|
153
199
|
```js
|
154
200
|
// This example requires jQuery or Zepto
|
data/commandz.min.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
/*
|
2
|
-
* CommandZ v0.0.
|
2
|
+
* CommandZ v0.0.2
|
3
3
|
* https://github.com/EtienneLem/commandz
|
4
4
|
*
|
5
5
|
* Copyright 2013, Etienne Lemay http://heliom.ca
|
6
6
|
* Released under the MIT license
|
7
7
|
*
|
8
|
-
* Date: 2013-08-
|
8
|
+
* Date: 2013-08-29 03:07:13 -0400
|
9
9
|
*/
|
10
|
-
(function(){var t;t=function(){function t(){this.VERSION="0.0.
|
10
|
+
(function(){var t,n=function(t,n){return function(){return t.apply(n,arguments)}};t=function(){function t(){this.handleKeyboard=n(this.handleKeyboard,this),this.VERSION="0.0.2",this.changeCallback=null,this.clear(),this.keyboardShortcuts(!0)}return t.prototype.clear=function(){return this.commands=[],this.index=-1},t.prototype.keyboardShortcuts=function(t){var n;return null==t&&(t=!0),n=t?"addEventListener":"removeEventListener",document[n]("keypress",this.handleKeyboard)},t.prototype.handleKeyboard=function(t){return"INPUT"!==document.activeElement.nodeName&&122===t.keyCode&&t.metaKey===!0?(t.preventDefault(),t.shiftKey?this.redo():this.undo()):void 0},t.prototype.execute=function(t){var n;return this.up(t),this.index<this.commands.length-1&&(n=this.commands.length-this.index-1,this.commands.splice(-n)),this.commands.push(t),this.index=this.commands.length-1},t.prototype.undo=function(t){var n,e;if(null==t&&(t=1),this.status().canUndo)for(n=e=1;t>=1?t>=e:e>=t;n=t>=1?++e:--e){if(!this.commands[this.index])return;this.down(this.commands[this.index]),this.index--,this.handleChange()}},t.prototype.redo=function(t){var n,e;if(null==t&&(t=1),this.status().canRedo)for(n=e=1;t>=1?t>=e:e>=t;n=t>=1?++e:--e){if(!this.commands[this.index+1])return;this.index++,this.up(this.commands[this.index]),this.handleChange()}},t.prototype.exec=function(t,n){var e,i,o,s;if(!(n instanceof Array))return n[t]();for(s=[],i=0,o=n.length;o>i;i++)e=n[i],s.push(e[t]());return s},t.prototype.up=function(t){return this.exec("up",t)},t.prototype.down=function(t){return this.exec("down",t)},t.prototype.onChange=function(t){return this.changeCallback=t,this.handleChange()},t.prototype.handleChange=function(){return this.changeCallback?this.changeCallback(this.status()):void 0},t.prototype.status=function(){return{canUndo:this.index>-1,canRedo:this.index<this.commands.length-1}},t}(),this.CommandZ=new t}).call(this);
|
@@ -1,13 +1,27 @@
|
|
1
1
|
class CommandZ
|
2
2
|
|
3
3
|
constructor: ->
|
4
|
-
@VERSION = '0.0.
|
4
|
+
@VERSION = '0.0.2'
|
5
|
+
@changeCallback = null
|
6
|
+
|
5
7
|
this.clear()
|
6
|
-
|
8
|
+
this.keyboardShortcuts(true)
|
9
|
+
|
7
10
|
clear: ->
|
8
11
|
@commands = []
|
9
12
|
@index = -1
|
10
13
|
|
14
|
+
keyboardShortcuts: (enable=true) ->
|
15
|
+
addOrRemove = if enable then 'addEventListener' else 'removeEventListener'
|
16
|
+
document[addOrRemove]('keypress', this.handleKeyboard)
|
17
|
+
|
18
|
+
handleKeyboard: (e) =>
|
19
|
+
return if document.activeElement.nodeName is 'INPUT'
|
20
|
+
return unless e.keyCode is 122 and e.metaKey is true
|
21
|
+
|
22
|
+
e.preventDefault()
|
23
|
+
if e.shiftKey then this.redo() else this.undo()
|
24
|
+
|
11
25
|
execute: (command) ->
|
12
26
|
this.up(command)
|
13
27
|
|
@@ -21,19 +35,27 @@ class CommandZ
|
|
21
35
|
@index = @commands.length - 1
|
22
36
|
|
23
37
|
undo: (times=1) ->
|
24
|
-
return
|
38
|
+
return unless this.status().canUndo
|
39
|
+
|
25
40
|
for i in [1..times]
|
26
41
|
return unless @commands[@index]
|
42
|
+
|
27
43
|
this.down(@commands[@index])
|
28
44
|
@index--
|
29
45
|
|
46
|
+
this.handleChange()
|
47
|
+
|
30
48
|
redo: (times=1) ->
|
31
|
-
return
|
49
|
+
return unless this.status().canRedo
|
50
|
+
|
32
51
|
for i in [1..times]
|
33
52
|
return unless @commands[@index + 1]
|
53
|
+
|
34
54
|
@index++
|
35
55
|
this.up(@commands[@index])
|
36
56
|
|
57
|
+
this.handleChange()
|
58
|
+
|
37
59
|
# Execute up/down on a command
|
38
60
|
# command can be a group of commands or a single command
|
39
61
|
exec: (action, command) ->
|
@@ -43,8 +65,19 @@ class CommandZ
|
|
43
65
|
up: (command) -> this.exec('up', command)
|
44
66
|
down: (command) -> this.exec('down', command)
|
45
67
|
|
46
|
-
#
|
47
|
-
|
68
|
+
# Register onChange callback
|
69
|
+
onChange: (callback) ->
|
70
|
+
@changeCallback = callback
|
71
|
+
this.handleChange()
|
72
|
+
|
73
|
+
handleChange: ->
|
74
|
+
return unless @changeCallback
|
75
|
+
@changeCallback(this.status())
|
76
|
+
|
77
|
+
# Return current status
|
78
|
+
status: ->
|
79
|
+
canUndo: @index > -1
|
80
|
+
canRedo: @index < @commands.length - 1
|
48
81
|
|
49
82
|
# Singleton
|
50
83
|
@CommandZ = new CommandZ
|
data/lib/commandz/version.rb
CHANGED
data/spec/commandz_spec.coffee
CHANGED
@@ -36,9 +36,11 @@ describe 'CommandZ', ->
|
|
36
36
|
expect(CommandZ.commands.length).toBe(10)
|
37
37
|
expect(CommandZ.index).toBe(9)
|
38
38
|
|
39
|
-
it 'returns current
|
40
|
-
|
41
|
-
|
39
|
+
it 'returns current status', ->
|
40
|
+
status = CommandZ.status()
|
41
|
+
|
42
|
+
expect(status.canUndo).toBe(true)
|
43
|
+
expect(status.canRedo).toBe(false)
|
42
44
|
|
43
45
|
it 'overwrites upcoming commands', ->
|
44
46
|
CommandZ.undo(3)
|
@@ -63,6 +65,19 @@ describe 'CommandZ', ->
|
|
63
65
|
|
64
66
|
expect(CommandZ.index).toBe(0)
|
65
67
|
|
68
|
+
it 'registers onChange callback', ->
|
69
|
+
CommandZ.clear()
|
70
|
+
[0..2].forEach (i) -> CommandZ.execute({up: (-> i), down: (-> i)})
|
71
|
+
|
72
|
+
onChangeCallback = jasmine.createSpy('onChangeCallback')
|
73
|
+
CommandZ.onChange (status) -> onChangeCallback('test')
|
74
|
+
|
75
|
+
CommandZ.undo(3)
|
76
|
+
CommandZ.redo(2)
|
77
|
+
|
78
|
+
expect(onChangeCallback.calls.length).toBe(6)
|
79
|
+
CommandZ.onChange(null)
|
80
|
+
|
66
81
|
describe 'integration', ->
|
67
82
|
$container = null
|
68
83
|
|