PageRenderTime 79ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/crm/symfony/src/MDR/IntranetBundle/Resources/public/js/ComentariosIntranet.js

https://gitlab.com/Alberto.SS/crm_verquet
JavaScript | 280 lines | 250 code | 15 blank | 15 comment | 32 complexity | b46f9616b2077ceb546348cd21761e15 MD5 | raw file
  1. //Modelos
  2. var ComentarioIntranet = Backbone.Model.extend({
  3. initialize: function(){
  4. var fecha = new Date(getDateFromFormat(this.get('fecha').date, "yyyy-MM-dd HH:mm:ss"));
  5. this.set('fecha', fecha);
  6. if(this.get('usuario').uNumero == idUsuario)
  7. {
  8. var diff = new Date() - fecha;
  9. this.set('editable', (diff / 1000 / 60) <= 5);
  10. }
  11. },
  12. defaults: {
  13. idComentario: contArchivosIntranet++,
  14. texto: '',
  15. fecha: '',
  16. calificacion: 0,
  17. usuario: '',
  18. editable: false,
  19. estatusVista: ''
  20. }
  21. });
  22. //Colecciones
  23. var ComentariosIntranetCollection = Backbone.Collection.extend({
  24. model: ComentarioIntranet,
  25. getTotales: function(){
  26. return this.countBy(function(item) {
  27. return item.get('calificacion') == 1 ? 'likes': 'disLikes';
  28. });
  29. }
  30. });
  31. //Instancias
  32. var comentariosIntranet = new ComentariosIntranetCollection();
  33. //Vistas Lógicas
  34. var ComentarioIntranetView = Backbone.View.extend({
  35. tagName: "div",
  36. className: "item comentarioIntranet",
  37. template: comentarioTemplate,
  38. initialize: function(){
  39. var that = this;
  40. this.render();
  41. //Eventos modelo
  42. this.listenTo(this.model, 'change', this.render);
  43. this.listenTo(this.model, 'destroy', this.destroy);
  44. if(this.model.get('editable') == true)
  45. {
  46. var diff = new Date() - this.model.get('fecha');
  47. setTimeout(function(){
  48. that.model.set('editable', false);
  49. }, 5*60*1000 - diff);
  50. }
  51. },
  52. render: function(){
  53. this.$el.html(this.template(this.model.toJSON()));
  54. return this;
  55. },
  56. //Eventos vista
  57. events: {
  58. 'click .editarComentario' : 'editarComentario',
  59. 'click .borrarComentario' : 'borrarComentario'
  60. },
  61. editarComentario: function() {
  62. this.model.set('estatusVista', 'edit');
  63. },
  64. borrarComentario: function() {
  65. var that = this;
  66. if(confirm('¿Estas seguro de borrar tu comentario?'))
  67. {
  68. var dataSend = {idComentario: this.model.get('idComentario')};
  69. $.post(urls.intranet.comentarios.borrar, dataSend, function(data, textStatus, xhr) {
  70. if(data.estado == 1)
  71. {
  72. that.model.destroy();
  73. } else {
  74. alert(data.mensaje);
  75. }
  76. });
  77. }
  78. },
  79. //Eventos modelo
  80. destroy: function() {
  81. this.remove();
  82. }
  83. });
  84. //Vista Principal
  85. var ComentariosIntranetView = Backbone.View.extend({
  86. events: {
  87. 'keypress #textoComentario': 'onEnterComentario',
  88. 'click #btnNuevoComentario': 'creaComentario',
  89. 'click #btnGuardaComentario': 'guardarComentario',
  90. 'click #btnCancelarComentario': 'limpiarCampos',
  91. 'click .btnLike': 'like',
  92. 'click .btnDisLike': 'disLike'
  93. },
  94. //Variables
  95. calificacion: 0,
  96. comentarioActual: null,
  97. //Funciones
  98. initialize: function() {
  99. this.setElement($("#ComentariosIntranet"));
  100. //Elementos vista
  101. this.$comentariosContainer = $("#comentariosContainer");
  102. this.$textoComentario = $("#textoComentario");
  103. this.$btnNuevoComentario = $("#btnNuevoComentario");
  104. this.$btnGuardaComentario = $("#btnGuardaComentario");
  105. this.$cancelarComentario = $("#btnCancelarComentario");
  106. this.$like = $(".btnLike");
  107. this.$disLike = $(".btnDisLike");
  108. this.$contLikes = $(".contLikes");
  109. this.$contDisLikeS = $(".contDisLikes");
  110. //Listeners modelo
  111. this.listenTo(comentariosIntranet, 'add', this.addComentario);
  112. this.listenTo(comentariosIntranet, 'change', this.refreshComentario);
  113. this.listenTo(comentariosIntranet, 'remove', this.showContLikes);
  114. this.render();
  115. },
  116. render: function() {
  117. this.addAllComentarios(comentariosIntranet);
  118. var alto = $(window).height() - this.$comentariosContainer.position().top - 250;
  119. this.$comentariosContainer.css('max-height', alto + 'px');
  120. return this;
  121. },
  122. obtenerDatosComentario() {
  123. var texto = this.$textoComentario.val().trim();
  124. //Validar
  125. if(texto.length == 0)
  126. {
  127. alert('Debes escribir algo.');
  128. return false;
  129. }
  130. if(this.calificacion == 0)
  131. {
  132. alert('Debes indicar una calificación.');
  133. return false;
  134. }
  135. return { idMenu: menuBD.idMenu, texto: texto, calificacion: this.calificacion };
  136. },
  137. creaComentario: function() {
  138. var that = this;
  139. var data = this.obtenerDatosComentario();
  140. if(data === false)
  141. {
  142. return;
  143. }
  144. this.showLoading(true);
  145. $.post(urls.intranet.comentarios.crear, data, function(data, textStatus, xhr) {
  146. if(data.estado == 1)
  147. {
  148. comentariosIntranet.add(data.comentario);
  149. that.limpiarCampos();
  150. that.showContLikes();
  151. } else {
  152. alert(data.mensaje);
  153. }
  154. }).always(function(){
  155. that.showLoading(false);
  156. });
  157. },
  158. limpiarCampos: function() {
  159. this.$textoComentario.val('');
  160. this.calificacion = 0;
  161. this.$like.removeClass('active');
  162. this.$disLike.removeClass('active');
  163. this.$btnNuevoComentario.show();
  164. this.$btnGuardaComentario.hide();
  165. this.$cancelarComentario.hide();
  166. },
  167. showContLikes: function() {
  168. var cont = comentariosIntranet.getTotales();
  169. this.$contLikes.html(cont.likes !== undefined ? cont.likes : 0);
  170. this.$contDisLikeS.html(cont.disLikes !== undefined ? cont.disLikes : 0);
  171. },
  172. showLoading: function(val) {
  173. var overlay = this.$el.find('.overlay');
  174. if(val)
  175. {
  176. overlay.show();
  177. } else {
  178. overlay.hide();
  179. }
  180. },
  181. editarComentario: function() {
  182. this.$textoComentario.val(this.comentarioActual.get('texto'));
  183. this.calificacion = this.comentarioActual.get('calificacion');
  184. this.setIconLike();
  185. this.$btnNuevoComentario.hide();
  186. this.$btnGuardaComentario.show();
  187. this.$cancelarComentario.show();
  188. },
  189. guardarComentario: function() {
  190. var that = this;
  191. var dataSend = this.obtenerDatosComentario();
  192. if(dataSend === false)
  193. {
  194. return;
  195. }
  196. dataSend.idComentario = this.comentarioActual.get('idComentario');
  197. this.showLoading(true);
  198. $.post(urls.intranet.comentarios.update, dataSend, function(data, textStatus, xhr) {
  199. if(data.estado == 1)
  200. {
  201. that.comentarioActual.set('estatusVista', '');
  202. that.comentarioActual.set('texto', dataSend.texto);
  203. that.comentarioActual.set('calificacion', dataSend.calificacion);
  204. that.limpiarCampos();
  205. that.showContLikes();
  206. } else {
  207. alert(data.mensaje);
  208. }
  209. }).always(function(){
  210. that.showLoading(false);
  211. });
  212. },
  213. //Eventos vista
  214. onEnterComentario: function(e) {
  215. if (e.keyCode == 13) this.creaComentario();
  216. },
  217. like: function() {
  218. this.calificacion = 1;
  219. this.setIconLike();
  220. },
  221. disLike: function() {
  222. this.calificacion = -1;
  223. this.setIconLike();
  224. },
  225. setIconLike: function() {
  226. this.$disLike.removeClass('active');
  227. this.$like.removeClass('active');
  228. if(this.calificacion == 1)
  229. {
  230. this.$like.addClass('active');
  231. }
  232. if(this.calificacion == -1)
  233. {
  234. this.$disLike.addClass('active');
  235. }
  236. },
  237. //Eventos modelo
  238. addComentario: function(item)
  239. {
  240. var view = new ComentarioIntranetView({model: item});
  241. this.$comentariosContainer.prepend(view.render().el);
  242. },
  243. addAllComentarios: function(items)
  244. {
  245. items.each(this.addComentario, this);
  246. this.showContLikes();
  247. },
  248. refreshComentario: function(item) {
  249. var attrs = item.changedAttributes();
  250. console.log(attrs);
  251. if(_.keys(attrs).indexOf('estatusVista') >= 0)
  252. {
  253. if(attrs.estatusVista == 'edit')
  254. {
  255. this.comentarioActual = item;
  256. this.editarComentario();
  257. }
  258. }
  259. },
  260. reset: function()
  261. {
  262. this.render();
  263. },
  264. });
  265. var appComentariosIntranet;