iVis-at-Bilkent / cytoscape.js-undo-redo

A Cytoscape.js extension to provide an undo-redo framework
MIT License
46 stars 9 forks source link

Is it possible to undo changes in data() of an element? #20

Closed Hoogkamer closed 4 years ago

Hoogkamer commented 4 years ago

In my application I have to possibilities to change colors, labels etc. So basically to change the data of an element. Is it possible to use the undo function for this?

cy.edges(':selected').data('line_color', val.hex)
cy.$id(val.id).data({
        name: val.name,
        description: val.description,
        additional_info: val.additional_info
})
hasanbalci commented 4 years ago

Yes, it is possible. I will point you to a sample usage in chise.js library developed under our organization.

I hope that is helpful.

Hoogkamer commented 4 years ago

Thank you very much for your elaborate answer. I will try this out. Will there be support for changing data with a function in the future? Like: .do("data", obj)

Hoogkamer commented 4 years ago

For others my solution based an the code of hasanbalci: Create a file: extraUndo.js

var cy
function cyChangeData(eles, name, valueMap) {
  if (typeof valueMap === 'object') {
    cy.startBatch()
    for (var i = 0; i < eles.length; i++) {
      var ele = cy.getElementById(eles[i].id())
      ele.data(name, valueMap[ele.id()]) 
    }
    cy.endBatch()
  } else {
    eles.data(name, valueMap)
  }
}

function urChangeData(param) {
  var result = {}
  var eles = param.eles
  result.name = param.name
  result.valueMap = {}
  result.eles = eles

  for (var i = 0; i < eles.length; i++) {
    var ele = eles[i]
    result.valueMap[ele.id()] = ele.data(param.name)
  }
  cyChangeData(param.eles, param.name, param.valueMap)
  return result
}

function registerExtraUndo(ur, cy1) {
  cy = cy1
  ur.action('changeData', urChangeData, urChangeData)
}

export { registerExtraUndo }

Then include and use

import { registerAddUndo } from './extraUndo'
var undo = cy.undoRedo({
        isDebug: true
      })
registerExtraUndo(undo, cy)

 var param = {
    eles: cy.nodes(':selected'),
    valueMap: 'new name for all selected nodes',
    name: 'name'
  }

  cy.undoRedo().do('changeData', param)