EntityView.coffee 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. define [
  2. "libs/backbone"
  3. "libs/mustache"
  4. ], () ->
  5. EntityView = Backbone.View.extend
  6. entityTemplate: $("#entityTemplate").html()
  7. initialize: () ->
  8. @ide = @options.manager.ide
  9. @manager = @options.manager
  10. @manager.registerView(@model.id, @)
  11. @bindToModel()
  12. events: () ->
  13. events = {}
  14. events["click ##{@model.id} > .js-clickable"] = "parentOnClick"
  15. return events
  16. render: () ->
  17. @$el.append(Mustache.to_html @entityTemplate, @model.attributes)
  18. @_bindToDomElements()
  19. @_makeEditable()
  20. return @
  21. _bindToDomElements: () ->
  22. @$nameEl = @$(".name")
  23. @$inputEl = @$("input.js-rename")
  24. @$entityListItemEl = @$el.children(".entity-list-item")
  25. _makeEditable: () ->
  26. if @ide.isAllowedToDoIt "readAndWrite"
  27. @_initializeRenameBox()
  28. @_initializeDrag()
  29. @hideRenameBox()
  30. bindToModel: () ->
  31. @model.on "change:name", (model) =>
  32. @$nameEl.text(model.get("name"))
  33. hideRenameBox: () ->
  34. @$nameEl.show()
  35. @$inputEl.hide()
  36. showRenameBox: () ->
  37. @$nameEl.hide()
  38. @$inputEl.show()
  39. select: () ->
  40. @selected = true
  41. @$entityListItemEl.addClass("selected")
  42. deselect: () ->
  43. @selected = false
  44. @$entityListItemEl.removeClass("selected")
  45. isSelected: () ->
  46. @selected
  47. parentOnClick: (e) ->
  48. doubleClickInterval = 600
  49. e.preventDefault()
  50. if @lastClick and new Date() - @lastClick < doubleClickInterval
  51. @onDoubleClick(e)
  52. else
  53. @lastClick = new Date()
  54. @onClick(e)
  55. onDoubleClick: (e) ->
  56. e.preventDefault()
  57. e.stopPropagation()
  58. if @ide.isAllowedToDoIt "readAndWrite"
  59. @startRename()
  60. _initializeDrag: () ->
  61. @$entityListItemEl.draggable
  62. delay: 250
  63. opacity: 0.7
  64. helper: "clone"
  65. scroll: true
  66. _initializeRenameBox: () ->
  67. @$inputEl.click (e) -> e.stopPropagation() # Don't stop rename on click in input
  68. @$inputEl.keydown (event) =>
  69. code = event.keyCode || event.which
  70. if code == 13
  71. @_finishRename()
  72. @hideRenameBox()
  73. startRename: () ->
  74. if !@renaming
  75. @renaming = true
  76. @showRenameBox()
  77. name = @model.get("name")
  78. @$inputEl.val(name).focus()
  79. if @$inputEl[0].setSelectionRange?
  80. selectionEnd = name.indexOf(".")
  81. if selectionEnd == -1
  82. selectionEnd = name.length
  83. @$inputEl[0].setSelectionRange(0, selectionEnd)
  84. setTimeout =>
  85. $(document.body).on "click.entity-rename", () =>
  86. @_finishRename()
  87. , 0
  88. _finishRename: () ->
  89. $(document.body).off "click.entity-rename"
  90. @renaming = false
  91. name = @$inputEl.val()
  92. @manager.renameEntity(@model, name)
  93. @hideRenameBox()