EntityView.coffee 4.2 KB

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