/app/reviews.js

https://github.com/harthur/bzhome · JavaScript · 162 lines · 132 code · 28 blank · 2 comment · 5 complexity · 62436f197af7777aaffc8785d2532d34 MD5 · raw file

  1. $(function() {
  2. window.Review = Backbone.Model.extend({
  3. attachment: null,
  4. bug: null,
  5. time: ''
  6. });
  7. window.Reviews = Backbone.Collection.extend({
  8. model: Review,
  9. localStorage: new Store("bzhome-reviews"),
  10. initialize: function() {
  11. this.bind("reset", this.resetStore, this);
  12. },
  13. resetStore: function() {
  14. Backbone.sync("clear", this);
  15. Backbone.sync("create", this);
  16. }
  17. });
  18. window.Feedbacks = Reviews.extend({
  19. localStorage: new Store("bzhome-feedbacks")
  20. });
  21. window.SuperReviews = Reviews.extend({
  22. localStorage: new Store("bzhome-superreviews")
  23. });
  24. window.NeedInfos = Reviews.extend({
  25. localStorage: new Store("bzhome-needinfo")
  26. });
  27. window.reviews = new Reviews;
  28. window.feedbacks = new Feedbacks;
  29. window.superReviews = new SuperReviews;
  30. window.needInfos = new NeedInfos;
  31. window.ReviewRow = Backbone.View.extend({
  32. tagName: "div",
  33. className: "review-item",
  34. template: Handlebars.compile($("#review-item").html()),
  35. render: function() {
  36. $(this.el).html(this.template(this.model.toJSON()));
  37. return this;
  38. }
  39. });
  40. window.NeedInfoRow = Backbone.View.extend({
  41. tagName: "div",
  42. className: "needinfo-item",
  43. template: Handlebars.compile($("#needinfo-item").html()),
  44. render: function() {
  45. $(this.el).html(this.template(this.model.toJSON()));
  46. return this;
  47. }
  48. });
  49. window.ReviewList = Backbone.View.extend({
  50. el: $("#reviews"),
  51. list: $("#reviews-list"),
  52. type: "reviews",
  53. initialize: function() {
  54. var collection;
  55. switch (this.type) {
  56. case "feedback":
  57. collection = this.collection = feedbacks;
  58. break;
  59. case "reviews":
  60. collection = this.collection = reviews;
  61. break;
  62. case "superreview":
  63. collection = this.collection = superReviews;
  64. break;
  65. case "needinfo":
  66. collection = this.collection = needInfos;
  67. break;
  68. default:
  69. console.error("unknown type '" + this.type + "'!");
  70. }
  71. collection.bind("add", this.addReview, this);
  72. collection.bind("reset", this.render, this);
  73. // get cached list from localStorage
  74. collection.fetch();
  75. // but fetch from the server and update
  76. var type = this.type;
  77. bzhome.user.requests(function(err, requests) {
  78. var items;
  79. switch (type) {
  80. case "feedback":
  81. items = requests.feedbacks;
  82. break;
  83. case "reviews":
  84. items = requests.reviews;
  85. break;
  86. case "superreview":
  87. items = requests.superReviews;
  88. break;
  89. case "needinfo":
  90. items = requests.needInfos;
  91. console.log(requests);
  92. break;
  93. default:
  94. console.error("unknown type '" + type + "'!");
  95. }
  96. collection.reset(items);
  97. });
  98. },
  99. render: function(reviews) {
  100. this.list.empty();
  101. this.collection.each(_(this.addReview).bind(this));
  102. this.el.find(".count").html(this.collection.length);
  103. $(".timeago").timeago();
  104. },
  105. addReview: function(review) {
  106. var view;
  107. if (this.type == 'needinfo') {
  108. view = new NeedInfoRow({
  109. model: review
  110. });
  111. } else {
  112. view = new ReviewRow({
  113. model: review
  114. });
  115. }
  116. this.list.append(view.render().el);
  117. }
  118. });
  119. window.FeedbackList = ReviewList.extend({
  120. el: $("#feedbacks"),
  121. list: $("#feedbacks-list"),
  122. type: "feedback"
  123. });
  124. window.SuperReviewList = ReviewList.extend({
  125. el: $("#superreviews"),
  126. list: $("#superreviews-list"),
  127. type: "superreview"
  128. });
  129. window.NeedInfoList = ReviewList.extend({
  130. el: $("#needinfo"),
  131. list: $("#needinfo-list"),
  132. type: "needinfo"
  133. });
  134. });