EntityView.coffee 4.3 KB

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