Skip to content

hurryhuang1007/undo-redo-manager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Undo-redo manager

A simple manager for undo and redo. High customization, can cover update or diff update both.

Installation

npm install --save undo-redo-manager

Reference

constructor

  • @param {Function} rollbackFn
    • will execute when call undo or redo method. pass the stepDetail and isLastRollback for the function(require return a stepDetail to push on undo/redo stack)
  • @param {Number} maxStep
    • max stored undoList and redoList

methods

push

  • pushes a stepDetail on the undo stack, and clears the redo stack
  • @param {*} stepDetail
    • the stepDetail to push on last of the undo stack

undo

  • call once or more rollbackFn function, and push rollbackFn returns to redo stack
  • @param {Number} stepNum
    • number of undo times

redo

  • call once or more rollbackFn function, and push rollbackFn returns to undo stack
  • @param {Number} stepNum
    • number of redo times

clear

  • clear undo stack and redo stack

properties

canUndo

  • return {Boolean} True if have undo stack

canRedo

  • return {Boolean} True if have redo stack

undoStack

  • return undo stack

redoStack

  • return redo stack

Examples

- cover update

let data = 1
let manager = new Manager((detail, isLast) => {
  console.log(isLast)
  let tmp = data
  data = detail
  return tmp
})

data = 2
manager.push(1)
data = 3
manager.push(2)

console.log(manager.undoStack) //[1,2]
manager.undo(1) //true
console.log(data) //2
console.log(manager.redoStack) //[3]

console.log(manager.undoStack) //[1]
manager.undo(2) //false true
console.log(data) //1
console.log(manager.redoStack) //[3,2]

manager.redo(1) // true
console.log(data) //2
console.log(manager.redoStack) //[3]

manager.push(data)
data = 99
console.log(manager.undoStack) //[1,2]
console.log(manager.redoStack) //[]

- diff update

let data = [{id:1, value:1}]
const typeReverse = {
  add:'del',
  del:'add',
  update:'update'
}
let manager = new Manager(detail => {
  let index = data.findIndex(i => i.id === detail.id)
  let oldValue

  switch(detail.type){
    case 'add':
      oldValue = data.splice(index,1).value
      break

    case 'update':
      oldValue = data[index].value
      data[index].value = detail.oldValue
      break

    case 'del':
      data.push({id:detail.id,value:detail.oldValue})
  }

  return {id:detail.id, type: typeReverse[detail.type], oldValue}
})

let obj = {id:2,value:2}
data.push(obj)
manager.push({type:'add',id:2})
obj.value = 'WTF'
manager.push({type:'update', id:2, oldValue:2})
console.log(manager.undoStack) //[{type:'add',id:2}, {type:'update', id:2, oldValue:2}]
manager.undo()
console.log(data) //[{id:1, value:1}, {id:2, value:2}]
console.log(manager.redoStack) //[{type:'update', id:2, oldValue:'WTF'}]
manager.redo()
console.log(data) //[{id:1, value:1}, {id:2, value:'WTF'}]

Tips

storage of non-basic type variables can use JSON.stringify and JSON.parse method

About

A simple manager for undo and redo. High customization, can cover update or diff update both

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy