PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/data/coffee/ch.coffee

https://github.com/diegodorado/fundacion-sancor
CoffeeScript | 531 lines | 356 code | 158 blank | 17 comment | 12 complexity | bea0d303b7d532a033d2518da3c6b986 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause, LGPL-3.0, Apache-2.0, ISC, AGPL-3.0
  1. # Para compilar:
  2. #
  3. # coffee -wc --output "web/js" data/coffee/ch.coffee
  4. root = exports ? this
  5. month_to_es= (month)->
  6. months = ['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Set','Oct','Nov','Dic']
  7. months[month-1]
  8. match= (what,where)->
  9. return true unless what?
  10. (where.toLowerCase().indexOf(what.toLowerCase()) isnt -1)
  11. class Cooperativa extends Backbone.Model
  12. class CooperativasCollection extends Backbone.Paginator.clientPager #Backbone.Collection
  13. model: Cooperativa
  14. paginator_ui:
  15. firstPage: 1
  16. currentPage: 1
  17. perPage: 6
  18. totalPages: 10
  19. pagesInRange: 4
  20. search: (attrs)->
  21. @setFieldFilter [ { field: 'school_name', type: 'function', value: (val) -> match(attrs.colegio, val)},
  22. { field: 'name', type: 'function', value: (val) -> match(attrs.cooperativa, val)},
  23. { field: 'activity_id', type: 'function', value: (val) -> (not attrs.actividad or val is attrs.actividad)},
  24. { field: 'address', type: 'function', value: (val) -> match(attrs.address, val)},
  25. { field: 'level_id', type: 'function', value: (val) -> (not attrs.nivel or val is attrs.nivel)}
  26. ]
  27. class CooperativaView extends Backbone.Marionette.ItemView
  28. template: "#cooperativa-list-item-template"
  29. templateHelpers:
  30. klass: ->
  31. #"open" if @clicked
  32. "sponsored-#{@sponsored}"
  33. uri: ->
  34. root.location.pathname + '/' + @slug + '/home'
  35. class NoCooperativasView extends Backbone.Marionette.ItemView
  36. template: "#no-cooperativas-template"
  37. class CooperativaListView extends Backbone.Marionette.CollectionView
  38. itemView: CooperativaView
  39. emptyView: NoCooperativasView
  40. class FilterFormView extends Marionette.ItemView
  41. template: "#filter-form-template"
  42. events:
  43. 'keyup input.colegio': 'filters_changed'
  44. 'keyup input.cooperativa': 'filters_changed'
  45. 'change select.nivel': 'filters_changed'
  46. 'change select.actividad': 'filters_changed'
  47. 'keyup input.address': 'filters_changed'
  48. 'click button.reset': 'reset'
  49. filters_changed: (ev)->
  50. ev.preventDefault()
  51. @collection.search
  52. colegio: @$('input.colegio').val()
  53. cooperativa: @$('input.cooperativa').val()
  54. nivel: @$('select.nivel').val()
  55. actividad: @$('select.actividad').val()
  56. address: @$('input.address').val()
  57. reset: (ev)->
  58. ev.preventDefault()
  59. @$('input.colegio').val('')
  60. @$('input.cooperativa').val('')
  61. @$('select.nivel').val('')
  62. @$('select.actividad').val('')
  63. @$('input.address').val('')
  64. @collection.search {}
  65. onRender: () =>
  66. @$("input").placeholder()
  67. class CooperativasPagerView extends Marionette.ItemView
  68. template: "#pager-template"
  69. events:
  70. 'click a': 'clicked'
  71. initialize: ->
  72. @listenTo @collection, "reset", @render, @
  73. clicked: (ev)->
  74. ev.preventDefault()
  75. @collection.goTo $(ev.target).text()
  76. serializeData: () ->
  77. @collection.info()
  78. class MapView extends Marionette.ItemView
  79. template: "#map-template"
  80. map: null
  81. markers: []
  82. initialize: ->
  83. @listenTo @collection, "reset", @render, @
  84. _.each @collection.origModels, (item, index) =>
  85. lat = item.get('latitude')
  86. lng = item.get('longitude')
  87. latlng = new google.maps.LatLng(lat,lng)
  88. marker = new google.maps.Marker
  89. id: item.get('id')
  90. position: latlng
  91. google.maps.event.addListener marker, "click", =>
  92. @markerClicked marker
  93. @markers.push marker
  94. markerClicked: (marker) ->
  95. @collection.each (item, index) =>
  96. item.set 'clicked', marker.id is item.get('id')
  97. drawMap: ->
  98. options =
  99. mapTypeId: google.maps.MapTypeId.SATELLITE
  100. zoom: 16
  101. panControl: false
  102. mapTypeControl: false
  103. scaleControl: false
  104. rotateControl: false
  105. zoomControl: false
  106. streetViewControl: false
  107. #center: @markers[0].getPosition()
  108. @$el.height 640
  109. @map = new google.maps.Map(@el, options)
  110. render: ->
  111. @drawMap() unless @map
  112. bounds = new google.maps.LatLngBounds()
  113. ids = _.pluck(@collection.sortedAndFilteredModels, 'id')
  114. for m in @markers
  115. if m.id in ids
  116. bounds.extend m.getPosition()
  117. m.setMap @map
  118. else
  119. m.setMap null
  120. if ids.length > 0
  121. @map.setCenter(bounds.getCenter())
  122. @map.fitBounds(bounds)
  123. class Application extends Backbone.Marionette.Application
  124. class Post extends Backbone.Model
  125. class PostsCollection extends Backbone.Paginator.clientPager #Backbone.Collection
  126. model: Post
  127. paginator_ui:
  128. firstPage: 1
  129. currentPage: 1
  130. perPage: 6
  131. totalPages: 10
  132. pagesInRange: 4
  133. filter_per_year: (year)->
  134. field_filter =
  135. field: 'published_at'
  136. type: 'function'
  137. value: (published_at) -> published_at[0...4] is year
  138. @setFieldFilter [field_filter]
  139. class PostView extends Backbone.Marionette.ItemView
  140. template: "#post-list-item-template"
  141. className: "post-item"
  142. templateHelpers:
  143. uri: ->
  144. root.location.pathname + '/' + @slug
  145. year: ->
  146. @published_at[0...4]
  147. month: ->
  148. month_to_es(@published_at[5...7])
  149. day: ->
  150. @published_at[8...10]
  151. class NoPostsView extends Backbone.Marionette.ItemView
  152. template: "#no-posts-template"
  153. class PostsListView extends Backbone.Marionette.CollectionView
  154. itemView: PostView
  155. emptyView: NoPostsView
  156. className: "row"
  157. class PostsFilterView extends Marionette.ItemView
  158. template: "#filter-template"
  159. events:
  160. 'change select': 'filter'
  161. initialize: ->
  162. @years= _.uniq(@collection.map( (model) -> model.get('published_at')[0...4] )).sort().reverse()
  163. @collection.filter_per_year @years[0]
  164. filter: (ev)->
  165. @collection.filter_per_year $(ev.target).val()
  166. serializeData: () ->
  167. years: @years
  168. class PostsPagerView extends Marionette.ItemView
  169. template: "#pager-template"
  170. events:
  171. 'click a': 'clicked'
  172. initialize: ->
  173. @listenTo @collection, "reset", @render, @
  174. clicked: (ev)->
  175. ev.preventDefault()
  176. @collection.goTo $(ev.target).text()
  177. serializeData: () ->
  178. @collection.info()
  179. class PostsLayout extends Backbone.Marionette.Layout
  180. template: "#layout-template"
  181. className: "container contenedor-post post-anteriores"
  182. regions:
  183. filter: ".filter"
  184. list: ".list"
  185. pager: ".pager"
  186. fsConstructor = ->
  187. @startCooperativas = (options) ->
  188. cooperativas = new CooperativasCollection options["cooperativas"]
  189. cooperativas.bootstrap()
  190. list = new CooperativaListView
  191. collection: cooperativas
  192. el: '#container .list'
  193. list.render()
  194. filters = new FilterFormView
  195. collection: cooperativas
  196. el: '#container .filter-form'
  197. filters.render()
  198. pager = new CooperativasPagerView
  199. collection: cooperativas
  200. el: '#container .pager'
  201. pager.render()
  202. map = new MapView
  203. collection: cooperativas
  204. el: '#container .map'
  205. map.render()
  206. @initializeEditor = (options) ->
  207. window.CKEDITOR_BASEPATH = options.ckeditorPath
  208. init = ->
  209. delete window.CKEDITOR.instances[options.name] if window.CKEDITOR.instances[options.name]
  210. CKEDITOR.replace options.name, options.config
  211. if CKEDITOR?
  212. init()
  213. else
  214. $.getScript options.webPath, ->
  215. init()
  216. @startPosts = (options) ->
  217. app = new Application
  218. app.addRegions
  219. mainRegion: "#container"
  220. layout = new PostsLayout
  221. app.mainRegion.show layout
  222. posts = new PostsCollection options["posts"]
  223. posts.bootstrap()
  224. layout.list.show new PostsListView
  225. collection: posts
  226. layout.pager.show new PostsPagerView
  227. collection: posts
  228. app.start options
  229. @startEvents = (options) ->
  230. app = new Application
  231. app.addRegions
  232. mainRegion: "#container"
  233. layout = new PostsLayout
  234. app.mainRegion.show layout
  235. posts = new PostsCollection options["posts"]
  236. posts.bootstrap()
  237. layout.filter.show new PostsFilterView
  238. collection: posts
  239. layout.list.show new PostsListView
  240. collection: posts
  241. layout.pager.show new PostsPagerView
  242. collection: posts
  243. app.start options
  244. @startUplodify = (options) ->
  245. $("#file_upload").uploadify
  246. swf: "/swf/uploadify.swf"
  247. uploader: options["uploader"]
  248. buttonText: "Seleccionar Video"
  249. multi: false
  250. fileTypeDesc: "Archivos de Video"
  251. fileTypeExts: "*.avi;*.mp4;*.wmv;*.mov"
  252. fileSizeLimit: "100MB"
  253. debug: false
  254. onSelectError: (file, errorCode, errorMsg) =>
  255. console.log @, file, errorCode, errorMsg
  256. switch errorCode
  257. when SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED
  258. errorMsg += "\nThe number of files selected exceeds the remaining upload limit (" + errorMsg + ")."
  259. when SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT
  260. errorMsg += "\nThe file \"" + file.name + "\" exceeds the size limit (" + @fileSizeLimit + ")."
  261. when SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE
  262. errorMsg += "\nThe file \"" + file.name + "\" is empty."
  263. when SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT
  264. errorMsg += "\nThe file \"" + file.name + "\" is not an accepted file type (" + fileTypeDesc + ")."
  265. alert errorMsg
  266. onUploadError: (file, errorCode, errorMsg, errorString) ->
  267. alert "The file " + file.name + " could not be uploaded: " + errorString
  268. onUploadSuccess: (file, data, response) ->
  269. r = JSON.parse(data)
  270. console.log(file, data, response);
  271. window.location = r.redirect
  272. @enhancePostForm = (options) ->
  273. dirty = false
  274. content = ''
  275. content_loaded = false
  276. #my own implementation of ckeditor onChange callback
  277. checkContent = setInterval () ->
  278. if CKEDITOR?
  279. instance = CKEDITOR.instances["#{options['prefix']}[content]"]
  280. if content_loaded
  281. if content isnt instance.getData()
  282. dirty = true
  283. clearInterval checkContent
  284. else
  285. CKEDITOR.on 'instanceReady', ()->
  286. content = instance.getData() # load content first time only
  287. content_loaded = true
  288. ,500
  289. $("#a-admin-form").find("input, select, textarea").change (ev) ->
  290. dirty = true
  291. $(".a-media.a-js-choose-button").click (ev) ->
  292. if dirty
  293. window.onbeforeunload = () ->
  294. 'No guardč´¸ los cambios hechos en el formulario. Si abandona la pagina ahora se perderč°Šn.'
  295. setTimeout ()->
  296. window.onbeforeunload = null
  297. , 50
  298. @enhanceAlerts = (options) ->
  299. $(".a-admin-container").removeClass "a-ui"
  300. $(".a-admin-content").removeClass "a-admin-content"
  301. $(".alert .close").on "click", (ev) ->
  302. ev.preventDefault()
  303. href = $(this).attr("href")
  304. that = this
  305. $.ajax(url: href).done(->
  306. $(that).closest(".alert").alert "close"
  307. ).fail ->
  308. alert "error"
  309. @setupMap = (options) ->
  310. reverse_geocode = (latLng)->
  311. geocoder.geocode
  312. latLng: latLng
  313. , (results, status) ->
  314. if status is google.maps.GeocoderStatus.OK
  315. if results[0]
  316. $("#cooperativa_address").val results[0].formatted_address
  317. getPosition = ->
  318. lat = $("#cooperativa_latitude").val()
  319. lng = $("#cooperativa_longitude").val()
  320. new google.maps.LatLng(lat, lng)
  321. setPosition = ->
  322. $("#cooperativa_latitude").val marker.getPosition().lat()
  323. $("#cooperativa_longitude").val marker.getPosition().lng()
  324. options =
  325. zoom: 16
  326. center: getPosition()
  327. mapTypeId: google.maps.MapTypeId.SATELLITE
  328. map = new google.maps.Map(document.getElementById("map_canvas"), options)
  329. geocoder = new google.maps.Geocoder()
  330. marker = new google.maps.Marker(
  331. map: map
  332. draggable: true
  333. )
  334. marker.setPosition getPosition()
  335. reverse_geocode getPosition()
  336. $("#cooperativa_address").autocomplete
  337. #This bit uses the geocoder to fetch address values
  338. source: (request, response) ->
  339. geocoder.geocode
  340. address: request.term
  341. , (results, status) ->
  342. response $.map(results, (item) ->
  343. label: item.formatted_address
  344. value: item.formatted_address
  345. latitude: item.geometry.location.lat()
  346. longitude: item.geometry.location.lng()
  347. )
  348. #This bit is executed upon selection of an address
  349. select: (event, ui) ->
  350. location = new google.maps.LatLng(ui.item.latitude, ui.item.longitude)
  351. marker.setPosition location
  352. setPosition()
  353. map.setCenter location
  354. #Add listener to marker for reverse geocoding
  355. google.maps.event.addListener marker, "drag", ->
  356. setPosition()
  357. reverse_geocode marker.getPosition()
  358. google.maps.event.addListener map, "click", (event)->
  359. marker.setPosition event.latLng
  360. setPosition()
  361. reverse_geocode marker.getPosition()
  362. #map.setCenter event.latLng
  363. @enhanceSponsorFields = (options) ->
  364. #disabled. use hidden inputs
  365. #$("#cooperativa_sponsored").on("change", (ev) ->
  366. # if $(this).val() is 'apos'
  367. # $(".a-admin-form-field-sponsor").show()
  368. # else
  369. # $(".a-admin-form-field-sponsor").hide()
  370. #).trigger "change"
  371. @
  372. root.fs = new fsConstructor()
  373. apostrophe.debug = false