/Sample Apps/Crib/Crib/Scripts/app/dashboard.coffee

https://github.com/lefthandedgoat/Oak · CoffeeScript · 282 lines · 205 code · 77 blank · 0 comment · 9 complexity · 6e76a4efc33f4eeff20d396c5e2b69ac MD5 · raw file

  1. app = this
  2. this.dashboard =
  3. init: ->
  4. @rollOffs = new RollOffsView()
  5. @bench = new BenchView()
  6. ExtendConsultantModal.render()
  7. EditConsultantModal.render()
  8. NewConsultantModal.render()
  9. $("#newConsultant").click( ->
  10. NewConsultantModal.create(new Consultant())
  11. )
  12. BenchView = Backbone.View.extend
  13. el: "#bench"
  14. initialize: ->
  15. @bench = new Bench()
  16. @bench.bind 'reset', @render, @
  17. @refresh()
  18. refresh: -> @bench.fetch()
  19. render: ->
  20. $(@el).empty()
  21. consultantContainer = $("<ul></ul>").addClass("thumbnails").css({ 'margin-top': '10px' })
  22. $(@el).append consultantContainer
  23. @bench.each (consultant) =>
  24. view = new ConsultantView
  25. model: consultant
  26. editor: EditConsultantModal
  27. consultantContainer.append $("<li></li>").append(view.render().el)
  28. RollOffsView = Backbone.View.extend
  29. el: "#roll_offs"
  30. initialize: ->
  31. @rollOffs = new RollOffs()
  32. @rollOffs.bind 'reset', @render, @
  33. @rollOffs.bind 'change', @render, @
  34. @refresh()
  35. refresh: -> @rollOffs.fetch()
  36. render: ->
  37. $(@el).empty()
  38. monthSeperator = -1
  39. yearSeperator = -1
  40. consultantContainer = null
  41. @rollOffs.each (consultant) =>
  42. view = new ConsultantView
  43. model: consultant,
  44. editor: EditConsultantModal
  45. extendEditor: ExtendConsultantModal
  46. currentMonth = consultant.rollOffMonth()
  47. currentYear = consultant.rollOffYear()
  48. if(monthSeperator != currentMonth || yearSeperator != currentYear)
  49. monthSeperator = currentMonth
  50. yearSeperator = currentYear
  51. @createSeperator consultant.rollOffMonthName(), consultant.rollOffYear()
  52. consultantContainer = $("<ul></ul>").addClass("thumbnails").css({ 'margin-top': '10px' })
  53. $(@el).append consultantContainer
  54. consultantContainer.append $("<li></li>").append(view.render().el)
  55. createSeperator: (monthName, year) ->
  56. $(@el).append("<hr/>")
  57. $(@el).append("<h3>" + monthName + " " + (1900 + year) + "</h3>")
  58. ConsultantView = Backbone.View.extend
  59. events:
  60. "click .edit": "edit",
  61. "click .extend": "extendConsultant"
  62. render: ->
  63. imageUrl = "http://placehold.it/130x90"
  64. imageUrl = @model.picture() if @model.picture()
  65. $(@el).append $.tmpl(@engageConsultant, { name: @model.name(), imageUrl: imageUrl }) if !@model.onBench()
  66. $(@el).append $.tmpl(@benchConsultant, { name: @model.name(), imageUrl: imageUrl }) if @model.onBench()
  67. return @
  68. edit: -> @options.editor.edit(@model)
  69. extendConsultant: -> @options.extendEditor.edit(@model)
  70. engageConsultant:
  71. '
  72. <a class="thumbnail">
  73. <img src="${imageUrl}" alt="" width="130px" height="90px">
  74. </a>
  75. <div class="well" style="margin: 3px; padding: 3px; width: 130px">
  76. <div class="btn-group">
  77. <a class="btn dropdown-toggle" style="width: 110px" data-toggle="dropdown" href="javascript:;">
  78. Options
  79. <span class="caret"></span>
  80. </a>
  81. <ul class="dropdown-menu">
  82. <li><a href="javascript:;" class="extend">consultant has been extended</li>
  83. <li><a href="javascript:;" class="edit">edit</a></li>
  84. </ul>
  85. </div>
  86. <h4 style="margin: 5px">${name}</h4>
  87. </div>
  88. '
  89. benchConsultant:
  90. '
  91. <a class="thumbnail">
  92. <img src="${imageUrl}" alt="" width="130px" height="90px">
  93. </a>
  94. <div class="well" style="margin: 3px; padding: 3px; width: 130px">
  95. <div class="btn-group">
  96. <a class="btn dropdown-toggle" style="width: 110px" data-toggle="dropdown" href="javascript:;">
  97. Options
  98. <span class="caret"></span>
  99. </a>
  100. <ul class="dropdown-menu">
  101. <li><a href="javascript:;" class="edit">edit</a></li>
  102. </ul>
  103. </div>
  104. <h4 style="margin: 5px">${name}</h4>
  105. </div>
  106. '
  107. Consultant = Backbone.Model.extend
  108. monthName: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
  109. name: -> @get("Name")
  110. setName: (name) -> @set("Name", name)
  111. picture: -> @get("Picture")
  112. setPicture: (url) -> @set("Picture", url)
  113. rollOffDate: ->
  114. if @get("RollOffDate")
  115. return new Date(@get("RollOffDate"))
  116. else
  117. return null
  118. setRollOffDate: (date) ->
  119. @set("RollOffDate", date)
  120. rollOffMonth: -> @rollOffDate().getMonth()
  121. rollOffMonthName: -> @monthName[@rollOffMonth()]
  122. rollOffYear: -> @rollOffDate().getYear()
  123. onBench: -> @get("OnBench")
  124. update: ->
  125. $.post("/consultants/update", { id: @get("Id"), name: @get("Name"), rollOffDate: @get("RollOffDate"), picture: @get("Picture") }, =>
  126. app.dashboard.rollOffs.refresh() #bad form, consider events
  127. app.dashboard.bench.refresh() #bad form, consider events
  128. )
  129. create: ->
  130. $.post("/consultants/create", { name: @get("Name"), rollOffDate: @get("RollOffDate") }, =>
  131. app.dashboard.rollOffs.refresh() #bad form, consider events
  132. app.dashboard.bench.refresh() #bad form, consider events
  133. )
  134. extendTil: (date) ->
  135. $.post("/rolloffs/extensions", { consultantId: @get("Id"), til: date }, =>
  136. app.dashboard.rollOffs.refresh() #bad form, consider events
  137. app.dashboard.bench.refresh() #bad form, consider events
  138. )
  139. RollOffs = Backbone.Collection.extend
  140. model: Consultant
  141. url: "rolloffs/list"
  142. Bench = Backbone.Collection.extend
  143. model: Consultant
  144. url: "rolloffs/bench"
  145. EditConsultantModal = new (Backbone.View.extend
  146. render: ->
  147. @el = "#editConsultantModal"
  148. $(@el).find("#rollOffDate").datepicker()
  149. $(@el).find("#updateConsultant").click( =>
  150. @model.setName($(@el).find("#consultantName").val())
  151. @model.setRollOffDate($(@el).find("#rollOffDate").val())
  152. @model.setPicture($(@el).find("#picture").val())
  153. @model.update()
  154. $(@el).modal('hide')
  155. )
  156. $(@el).modal
  157. show: false
  158. edit: (consultant) ->
  159. @model = consultant
  160. $("#consultantName").val(consultant.name())
  161. $(@el).find("#picture").val(consultant.picture())
  162. if consultant.rollOffDate()
  163. d = consultant.rollOffDate()
  164. date = d.getDate()
  165. month = d.getMonth() + 1
  166. year = d.getFullYear()
  167. formatted = month + "/" + date + "/" + year
  168. $("#rollOffDate").val(formatted)
  169. else
  170. $("#rollOffDate").val("")
  171. $("#rollOffDate").datepicker("update")
  172. $(@el).modal('show')
  173. )
  174. NewConsultantModal = new (Backbone.View.extend
  175. render: ->
  176. @el = "#newConsultantModal"
  177. $(@el).find("#createConsultant").click( =>
  178. @model.setName($(@el).find("#newConsultantName").val())
  179. @model.create()
  180. $(@el).modal('hide')
  181. )
  182. $(@el).modal
  183. show: false
  184. create: (consultant) ->
  185. @model = consultant
  186. $(@el).find("#newConsultantName").val('')
  187. $(@el).modal('show')
  188. )
  189. ExtendConsultantModal = new (Backbone.View.extend
  190. save: ->
  191. @model.extendTil $("#extensionDate").val()
  192. render: ->
  193. @el = "#extendConsultantModal"
  194. $(@el).modal
  195. show: false
  196. view = $(@el)
  197. $(@el).find("#extendConsultant").click =>
  198. @save()
  199. view.modal("hide")
  200. $(@el).find("#extensionDate").datepicker()
  201. edit: (consultant) ->
  202. @model = consultant
  203. $(@el).find(".consultantName").html(@model.name())
  204. $(@el).modal('show')
  205. )