EntityView.coffee 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. define [
  2. "utils/ContextMenu"
  3. "libs/backbone"
  4. "libs/mustache"
  5. ], (ContextMenu) ->
  6. EntityView = Backbone.View.extend
  7. entityTemplate: $("#entityTemplate").html()
  8. initialize: () ->
  9. @ide = @options.manager.ide
  10. @manager = @options.manager
  11. @manager.registerView(@model.id, @)
  12. @bindToModel()
  13. events: () ->
  14. events = {}
  15. events["click ##{@model.id} > .js-clickable"] = "parentOnClick"
  16. events["click .dropdown-caret"] = "showContextMenuFromCaret"
  17. events["contextmenu"] = "showContextMenuFromRightClick"
  18. return events
  19. render: () ->
  20. @$el.append(Mustache.to_html @entityTemplate, @model.attributes)
  21. @_bindToDomElements()
  22. @_makeEditable()
  23. return @
  24. _bindToDomElements: () ->
  25. @$nameEl = @$(".name")
  26. @$inputEl = @$("input.js-rename")
  27. @$entityListItemEl = @$el.children(".entity-list-item")
  28. _makeEditable: () ->
  29. if @ide.isAllowedToDoIt "readAndWrite"
  30. @_initializeRenameBox()
  31. @_initializeDrag()
  32. @hideRenameBox()
  33. bindToModel: () ->
  34. @model.on "change:name", (model) =>
  35. @$nameEl.text(model.get("name"))
  36. hideRenameBox: () ->
  37. @$nameEl.show()
  38. @$inputEl.hide()
  39. showRenameBox: () ->
  40. @$nameEl.hide()
  41. @$inputEl.show()
  42. select: () ->
  43. @selected = true
  44. @$entityListItemEl.addClass("selected")
  45. deselect: () ->
  46. @selected = false
  47. @$entityListItemEl.removeClass("selected")
  48. isSelected: () ->
  49. @selected
  50. parentOnClick: (e) ->
  51. doubleClickInterval = 600
  52. e.preventDefault()
  53. if @lastClick and new Date() - @lastClick < doubleClickInterval
  54. @onDoubleClick(e)
  55. else
  56. @lastClick = new Date()
  57. @onClick(e)
  58. onDoubleClick: (e) ->
  59. e.preventDefault()
  60. e.stopPropagation()
  61. if @ide.isAllowedToDoIt "readAndWrite"
  62. @startRename()
  63. showContextMenuFromCaret: (e) ->
  64. e.stopPropagation()
  65. caret = @$(".dropdown-caret")
  66. offset = caret.offset()
  67. position =
  68. top: offset.top + caret.outerHeight()
  69. right: $(document.body).width() - (offset.left + caret.outerWidth())
  70. @toggleContextMenu(position)
  71. showContextMenuFromRightClick: (e) ->
  72. e.preventDefault()
  73. e.stopPropagation()
  74. position =
  75. left: e.pageX
  76. top: e.pageY
  77. @showContextMenu(position)
  78. toggleContextMenu: (position) ->
  79. if @contextMenu?
  80. @contextMenu.destroy()
  81. else
  82. @showContextMenu(position)
  83. showContextMenu: (position) ->
  84. entries = @getContextMenuEntries()
  85. @manager.trigger "contextmenu:beforeshow", @model, entries
  86. @contextMenu = new ContextMenu(position, entries)
  87. @contextMenu.on "destroy", () =>
  88. delete @contextMenu
  89. getContextMenuEntries: () ->
  90. return [{
  91. text: "Rename"
  92. onClick: () =>
  93. @startRename()
  94. ga('send', 'event', 'editor-interaction', 'renameEntity', "entityView")
  95. }, {
  96. text: "Delete"
  97. onClick: () =>
  98. @manager.confirmDelete(@model)
  99. ga('send', 'event', 'editor-interaction', 'deleteEntity', "entityView")
  100. }]
  101. _initializeDrag: () ->
  102. @$entityListItemEl.draggable
  103. delay: 250
  104. opacity: 0.7
  105. helper: "clone"
  106. scroll: true
  107. _initializeRenameBox: () ->
  108. @$inputEl.click (e) -> e.stopPropagation() # Don't stop rename on click in input
  109. @$inputEl.keydown (event) =>
  110. code = event.keyCode || event.which
  111. if code == 13
  112. @_finishRename()
  113. @hideRenameBox()
  114. startRename: () ->
  115. if !@renaming
  116. @renaming = true
  117. @showRenameBox()
  118. name = @model.get("name")
  119. @$inputEl.val(name).focus()
  120. if @$inputEl[0].setSelectionRange?
  121. selectionEnd = name.indexOf(".")
  122. if selectionEnd == -1
  123. selectionEnd = name.length
  124. @$inputEl[0].setSelectionRange(0, selectionEnd)
  125. setTimeout =>
  126. $(document.body).on "click.entity-rename", () =>
  127. @_finishRename()
  128. , 0
  129. _finishRename: () ->
  130. $(document.body).off "click.entity-rename"
  131. @renaming = false
  132. name = @$inputEl.val()
  133. @manager.renameEntity(@model, name)
  134. @hideRenameBox()