PageRenderTime 42ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/js/app.js

https://bitbucket.org/chiefwhitecloud/runningman-ui
JavaScript | 331 lines | 247 code | 78 blank | 6 comment | 7 complexity | d85504da2f344587ac7fb95020dd0d9f MD5 | raw file
  1. window.Runner = Backbone.Model.extend();
  2. window.Race = Backbone.Model.extend();
  3. window.RunnerResult = Backbone.Model.extend();
  4. window.RaceResult = Backbone.Model.extend();
  5. window.RunnerCollection = Backbone.Collection.extend({
  6. model: Runner,
  7. url:"../api/runners"
  8. });
  9. window.RaceCollection = Backbone.Collection.extend({
  10. initialize: function(models, options) {
  11. if (options)
  12. this.id = options.id;
  13. },
  14. model: Race,
  15. url: function() {
  16. return this.id ? "../api/event/" + this.id + "/races" : "../api/races";
  17. },
  18. comparator: function(race){
  19. var date = new Date(race.get("year"), (race.get("month") - 1), race.get("day"));
  20. return -date.getTime();
  21. }
  22. });
  23. window.RunnerResultsCollection = Backbone.Collection.extend({
  24. initialize: function(models, options) {
  25. this.id = options.id;
  26. },
  27. model: RunnerResult,
  28. url: function() {
  29. return '../api/runner/' + this.id + '/results';
  30. },
  31. comparator: function(result){
  32. var date = new Date(result.get("race").year, (result.get("race").month - 1), result.get("race").day);
  33. return -date.getTime();
  34. }
  35. });
  36. window.RaceResultsCollection = Backbone.Collection.extend({
  37. initialize: function(models, options) {
  38. this.id = options.id;
  39. },
  40. model: RaceResult,
  41. url: function() {
  42. return '../api/race/' + this.id + '/results';
  43. }
  44. });
  45. // Views
  46. window.RunnerListView = Backbone.View.extend({
  47. tagName:'ul',
  48. initialize:function () {
  49. this.model.bind("reset", this.render, this);
  50. },
  51. render:function (eventName) {
  52. _.each(this.model.models, function (runner) {
  53. $(this.el).append(new RunnerListItemView({model:runner}).render().el);
  54. }, this);
  55. return this;
  56. }
  57. });
  58. window.RunnerListItemView = Backbone.View.extend({
  59. tagName:"li",
  60. template:_.template($('#tpl-runner-list-item').html()),
  61. render:function (eventName) {
  62. $(this.el).html(this.template(this.model.toJSON()));
  63. return this;
  64. }
  65. });
  66. // Views
  67. window.RaceListView = Backbone.View.extend({
  68. tagName:'div',
  69. initialize:function () {
  70. this.model.bind("reset", this.render, this);
  71. },
  72. render:function (eventName) {
  73. var year = null;
  74. _.each(this.model.models, function (race) {
  75. if (race.get("year") != year){
  76. year = race.get("year");
  77. $(this.el).append($('<div class="race-list-year">' + year +' </div>'));
  78. }
  79. race.set({ date: moment(new Date(race.get("year"), (race.get("month") - 1), race.get("day"))).format("MMM Do")});
  80. $(this.el).append(new RaceListItemView({model:race}).render().el);
  81. }, this);
  82. return this;
  83. }
  84. });
  85. window.RaceListItemView = Backbone.View.extend({
  86. tagName:"div",
  87. template:_.template($('#tpl-race-list-item').html()),
  88. render:function (eventName) {
  89. $(this.el).addClass("race-list-item");
  90. $(this.el).html(this.template(this.model.toJSON()));
  91. return this;
  92. }
  93. });
  94. window.RunnerResultsView = Backbone.View.extend({
  95. tagName:"table",
  96. template:_.template($('#tpl-runner-results-list').html()),
  97. initialize:function () {
  98. this.model.bind("reset", this.render, this);
  99. },
  100. render:function (eventName) {
  101. $(this.el).html(this.template());
  102. _.each(this.model.models, function (result) {
  103. //this is used in the sort
  104. result.set({ date: new Date(result.get("race").year, (result.get("race").month - 1), result.get("race").day)});
  105. result.set({ "raceTime": Helper.formatRaceTime(result.get("hours"), result.get("minutes"), result.get("seconds"))});
  106. result.set({ "paceTime": Helper.formatRaceTime(0, result.get("paceminutes"), result.get("paceseconds"))});
  107. $(this.el).append(new RunnerResultsItemView({model:result}).render().el);
  108. }, this);
  109. return this;
  110. }
  111. });
  112. window.RunnerResultsItemView = Backbone.View.extend({
  113. tagName:"tr",
  114. template:_.template($('#tpl-runner-results-list-item').html()),
  115. render:function (eventName) {
  116. $(this.el).html(this.template(this.model.toJSON()));
  117. return this;
  118. }
  119. });
  120. window.RaceMainView = Backbone.View.extend({
  121. initialize: function (eventInfoView, raceResultsView) {
  122. $('#race-results').html(raceResultsView.render().el);
  123. $('#event-info').html(eventInfoView.render().el);
  124. eventInfoView.on('yearChanged', raceResultsView.fetchRace, raceResultsView);
  125. }
  126. });
  127. window.EventInfoView = Backbone.View.extend({
  128. template:_.template($('#tpl-event-info').html()),
  129. initialize:function () {
  130. this.model.bind("reset", this.render, this);
  131. },
  132. events: {
  133. "change select": "onYearChanged"
  134. },
  135. setRaceDate : function(race){
  136. var date = moment(new Date(race.get("year"), (race.get("month") - 1), race.get("day"))).format("dddd, MMMM Do YYYY")
  137. $($(this.el).find("div#race-date")[0]).html(date);
  138. },
  139. onYearChanged: function(e){
  140. this.trigger('yearChanged', e.currentTarget.value);
  141. var selRace = this.model.where({race_id: parseInt(e.currentTarget.value)});
  142. this.setRaceDate(selRace[0]);
  143. },
  144. render:function (eventName) {
  145. if (this.model.models.length > 0){
  146. $(this.el).html(this.template(this.model.models[0].toJSON()));
  147. var sel = $(this.el).find("select")[0];
  148. _.each(this.model.models, function (race) {
  149. if (this.options.raceId == race.get("race_id")){
  150. this.setRaceDate(race);
  151. $(sel).append("<option value='" + race.get("race_id") + "' selected>" + race.get("year") + "</option>");
  152. }
  153. else{
  154. $(sel).append("<option value='" + race.get("race_id") + "'>" + race.get("year") + "</option>");
  155. }
  156. }, this);
  157. }
  158. return this;
  159. }
  160. });
  161. window.RaceResultsView = Backbone.View.extend({
  162. tagName: "div",
  163. template:_.template($('#tpl-race-results-list').html()),
  164. loadingtemplate: _.template($('#tpl-loading').html()),
  165. initialize:function () {
  166. this.model.bind("reset", this.render, this);
  167. },
  168. fetchRace: function (raceId) {
  169. this.showLoader();
  170. this.model.id = raceId;
  171. this.model.fetch();
  172. },
  173. render:function (eventName) {
  174. if (this.model.models.length === 0){
  175. this.showLoader();
  176. }
  177. else{
  178. $(this.el).html(this.template());
  179. _.each(this.model.models, function (result) {
  180. result.set({ "raceTime": Helper.formatRaceTime(result.get("hours"), result.get("minutes"), result.get("seconds"))});
  181. result.set({ "paceTime": Helper.formatRaceTime(0, result.get("paceminutes"), result.get("paceseconds"))});
  182. $($(this.el).children()[0]).append(new RaceResultsItemView({model:result}).render().el);
  183. }, this);
  184. }
  185. return this;
  186. },
  187. showLoader : function(){
  188. $(this.el).html(this.loadingtemplate());
  189. }
  190. });
  191. window.RaceResultsItemView = Backbone.View.extend({
  192. tagName:"tr",
  193. template:_.template($('#tpl-race-results-list-item').html()),
  194. render:function (eventName) {
  195. $(this.el).html(this.template(this.model.toJSON()));
  196. return this;
  197. }
  198. });
  199. // Router
  200. var AppRouter = Backbone.Router.extend({
  201. routes:{
  202. //"runners" : "runnerList",
  203. "" : "home",
  204. "races" : "raceList",
  205. "results/:id" : "runnerResults",
  206. "race/:eventid/:raceid" : "raceResults"
  207. },
  208. home: function(){
  209. displayView("home");
  210. },
  211. runnerList:function () {
  212. this.runnerList = new RunnerCollection();
  213. this.runnerListView = new RunnerListView({model:this.runnerList});
  214. this.runnerList.fetch();
  215. $('#runners').html(this.runnerListView.render().el);
  216. },
  217. raceList:function () {
  218. displayView("races");
  219. this.raceList = new RaceCollection();
  220. this.raceListView = new RaceListView({model:this.raceList});
  221. this.raceList.fetch();
  222. $('#race-list').html(this.raceListView.render().el);
  223. },
  224. runnerResults: function(id) {
  225. this.runnerResults = new RunnerResultsCollection([], {"id" : id});
  226. this.runnerResultsView = new RunnerResultsView({model:this.runnerResults});
  227. this.runnerResults.fetch();
  228. $('#runners').html(this.runnerResultsView.render().el);
  229. },
  230. raceResults: function(eventid, raceid) {
  231. //list all the races for this event
  232. displayView("event");
  233. this.raceList = new RaceCollection([], {"id": eventid});
  234. this.eventInfoView = new EventInfoView({model:this.raceList, raceId: raceid});
  235. this.raceList.fetch();
  236. this.raceResults = new RaceResultsCollection([], {"id" : raceid});
  237. this.raceResultsView = new RaceResultsView({model:this.raceResults});
  238. this.raceResultsView.fetchRace(raceid);
  239. this.raceMainView = new RaceMainView(this.eventInfoView, this.raceResultsView)
  240. }
  241. });
  242. window.displayView = function(view){
  243. var views = ["event", "races", "home"];
  244. var getViewName = function(v){
  245. return "#v-" + v;
  246. }
  247. _.each(views, function(v){
  248. $(getViewName(v)).hide();
  249. });
  250. $(getViewName(view)).show();
  251. };
  252. var app = new AppRouter();
  253. Backbone.history.start();