chat.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. (function () {
  2. 'use strict';
  3. app.directive('clipChat', ClipChat);
  4. function ClipChat() {//<span am-time-ago="message.date | amDateFormat:\'YYYY.MM.DD HH:mm:ss\'"></span>
  5. var chatTemplate = '<div>' + '<ol class="discussion">' + '<li class="messages-date" ng-repeat-start="message in newChatArray()" ng-if="displayDate($index) || $index == 0">{{message.date | amDateFormat:"YYYY.MM.DD HH:mm:ss"}}</li>' + '<li ng-class="{\'self\' : message.idUser == idSelf, \'other\' : message.idUser !== idSelf, \'nextSame\': newChatArray()[$index+1].idUser == message.idUser && !nextDate($index)}" ng-repeat-end>' + '<div class="message">' + '<div class="message-name" ng-if="newChatArray()[$index-1].idUser !== message.idUser || displayDate($index)">{{ message.user }}</div>' + '<div class="message-text" style="word-wrap: break-word;">{{ message.content }}</div>' + '<div class="message-avatar"><img ng-src="{{ message.avatar }}" alt=""></div>' + '</div>' + '</li>' + '</ol>';
  6. var directive = {
  7. restrict: 'EA',
  8. template: chatTemplate,
  9. replace: true,
  10. scope: {
  11. messages: "=",
  12. idSelf: "=",
  13. idOther: "="
  14. },
  15. link: function ($scope, $element, $attrs) {
  16. $scope.newChatArray = function () {
  17. var filtered = [];
  18. for (var i = 0; i < $scope.messages.length; i++) {
  19. var item = $scope.messages[i];
  20. if ((item.idUser == $scope.idSelf || item.idOther == $scope.idSelf) && (item.idUser == $scope.idOther || item.idOther == $scope.idOther)) {
  21. filtered.push(item);
  22. }
  23. }
  24. return filtered;
  25. };
  26. $scope.displayDate = function (i) {
  27. var prevDate, nextDate, diffMs, diffMins;
  28. var messages = $scope.newChatArray();
  29. if (i === 0) {
  30. if (messages.length > 1) {
  31. prevDate = new Date(messages[i].date);
  32. nextDate = new Date(messages[i + 1].date);
  33. diffMs = (nextDate - prevDate);
  34. diffMins = Math.round(((diffMs % 86400000) % 3600000) / 60000);
  35. } else {
  36. return true
  37. }
  38. } else {
  39. prevDate = new Date(messages[i - 1].date);
  40. nextDate = new Date(messages[i].date);
  41. diffMs = (nextDate - prevDate);
  42. diffMins = Math.round(((diffMs % 86400000) % 3600000) / 60000);
  43. }
  44. if (diffMins > 1) {
  45. return true;
  46. } else {
  47. return false;
  48. }
  49. };
  50. $scope.nextDate = function (i) {
  51. var prevDate, nextDate, diffMs, diffMins;
  52. var messages = $scope.newChatArray();
  53. if (i < messages.length - 1) {
  54. prevDate = new Date(messages[i].date);
  55. nextDate = new Date(messages[i + 1].date);
  56. diffMs = (nextDate - prevDate);
  57. diffMins = Math.round(((diffMs % 86400000) % 3600000) / 60000);
  58. }
  59. if (diffMins > 1) {
  60. return true;
  61. } else {
  62. return false;
  63. }
  64. };
  65. }
  66. };
  67. return directive;
  68. }
  69. app.directive('chatSubmit', SubmitChat);
  70. function SubmitChat() {
  71. var submitTemplate = '<form ng-submit="submitChat()">' + '<div class="message-bar">' + '<div class="message-inner">' + '<!--a href="#" class="link icon-only"><i class="fa fa-camera"></i></a-->' + '<div class="message-area"><input placeholder="消息" ng-model="ngModel" /></div>' + '<a translate="offsidebar.chat.SEND" href="#" class="link ng-scope" ng-click="submitChat()">Send</a>' + '</div>' + '</div>' + '</form>' + '</div>';
  72. var directive = {
  73. restrict: 'EA',
  74. template: submitTemplate,
  75. replace: true,
  76. scope: {
  77. submitFunction: "=",
  78. ngModel: "="
  79. },
  80. link: function ($scope, $element, $attrs) {
  81. $scope.submitChat = function () {
  82. $scope.submitFunction();
  83. if (typeof $attrs.scrollElement !== "undefined") {
  84. var scrlEl = angular.element($attrs.scrollElement);
  85. var lastElement = scrlEl.find('.discussion > li:last');
  86. if (lastElement.length)
  87. scrlEl.scrollToElementAnimated(lastElement);
  88. }
  89. };
  90. }
  91. };
  92. return directive;
  93. }
  94. })();