PageRenderTime 57ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/Demo/NakedObjects.Rest.App.Demo/scripts/TestBackbone.js

http://nakedobjects.codeplex.com
JavaScript | 298 lines | 226 code | 64 blank | 8 comment | 8 complexity | eb883fc25eda0b7b70b6fae70e3704fd MD5 | raw file
  1. $(function () {
  2. var Result = Backbone.Model.extend({
  3. });
  4. var actions = "Actions";
  5. var ResultView = Backbone.View.extend({
  6. tagName: "div",
  7. className: "nof-objectview",
  8. template: $.templates("<div class='nof-object'><img/> {{:result.title}}</div>" +
  9. "<div id='{{shortName:result.domainType}}-Actions' class='nof-menu'>" +
  10. "<div class='nof-menuname'>" + actions + "</div>" +
  11. "<div class='nof-menuitems'>" +
  12. "{{for ~getActions(result.members)}}" +
  13. "<form id='{{shortName#data.result.domainType}}-{{:key}}' class='nof-action'>" +
  14. "<div><button>{{:value.extensions.friendlyName}}</button></div>" +
  15. "</form>" +
  16. "{{/for}}" +
  17. "</div>" +
  18. "<div id='{{shortName:result.domainType}}-PropertyList' class='nof-propertylist'>" +
  19. "{{for ~getProperties(result.members)}}" +
  20. "<div class = 'nof-property'>" +
  21. "<label>{{:value.extensions.friendlyName}}</label>" +
  22. "<div class='nof-value'>{{:value.value}}</div>" +
  23. "</div>" +
  24. "{{/for}}" +
  25. "</div>"),
  26. render: function () {
  27. $.views.converters({
  28. toArray: function (value) {
  29. return _.toArray(value);
  30. }
  31. });
  32. $.views.converters({
  33. shortName: function (value) {
  34. return value.substring(value.lastIndexOf(".") + 1, value.length);
  35. }
  36. });
  37. $.views.helpers({
  38. getFields: function (object) {
  39. var key, value,
  40. fieldsArray = [];
  41. for (key in object) {
  42. if (object.hasOwnProperty(key)) {
  43. value = object[key];
  44. // For each property/field add an object to the array, with key and value
  45. fieldsArray.push({
  46. key: key,
  47. value: value
  48. });
  49. }
  50. }
  51. // Return the array, to be rendered using {{for ~fields(object)}}
  52. return fieldsArray;
  53. }
  54. });
  55. $.views.helpers({
  56. getProperties: function (object) {
  57. var key, value,
  58. fieldsArray = [];
  59. for (key in object) {
  60. if (object.hasOwnProperty(key)) {
  61. value = object[key];
  62. if (value.memberType === "property") {
  63. // For each property/field add an object to the array, with key and value
  64. fieldsArray.push({
  65. key: key,
  66. value: value
  67. });
  68. }
  69. }
  70. }
  71. // Return the array, to be rendered using {{for ~fields(object)}}
  72. return fieldsArray;
  73. }
  74. });
  75. $.views.helpers({
  76. getActions: function (object) {
  77. var key, value,
  78. fieldsArray = [];
  79. for (key in object) {
  80. if (object.hasOwnProperty(key)) {
  81. value = object[key];
  82. if (value.memberType === "action") {
  83. // For each property/field add an object to the array, with key and value
  84. fieldsArray.push({
  85. key: key,
  86. value: value
  87. });
  88. }
  89. }
  90. }
  91. // Return the array, to be rendered using {{for ~fields(object)}}
  92. return fieldsArray;
  93. }
  94. });
  95. this.$el.html(this.template.render(this.model.toJSON()));
  96. return this;
  97. }
  98. });
  99. var ActionDetails = Backbone.Model.extend({
  100. invoke: function () {
  101. var invokeUrl = this.get("links")[2].href;
  102. var result = new Result();
  103. result.url = invokeUrl;
  104. result.fetch({
  105. success: function () {
  106. var view = new ResultView({ model: result });
  107. $("#main").html(view.render().el);
  108. }
  109. });
  110. },
  111. parse: function (response) {
  112. return response;
  113. }
  114. });
  115. var Action = Backbone.Model.extend({
  116. parse: function (response) {
  117. this.details = new ActionDetails();
  118. this.details.url = response.links[0].href; // todo make dependent on type not position
  119. // test hard code
  120. return response;
  121. }
  122. });
  123. var ActionList = Backbone.Collection.extend({
  124. model: Action,
  125. parse: function (response) {
  126. var membersAsArray = _.sortBy(_.toArray(response.members), function (i) { return i.extensions.memberOrder; });
  127. return membersAsArray;
  128. }
  129. });
  130. var Service = Backbone.Model.extend({
  131. parse: function (response) {
  132. var id = response.href.substring(response.href.lastIndexOf("/") + 1, response.href.length);
  133. response.id = id;
  134. this.actions = new ActionList();
  135. this.actions.url = "/services/" + id; // eg /services/AdventureworksModel.CustomerRepository
  136. return response;
  137. }
  138. });
  139. var ServiceList = Backbone.Collection.extend({
  140. model: Service,
  141. url: "/services",
  142. parse: function (response) {
  143. return response.value;
  144. }
  145. });
  146. var ActionView = Backbone.View.extend({
  147. tagName: "form",
  148. className: "nof-action",
  149. template: $.templates("<div><button>{{:extensions.friendlyName}}</button></div>"),
  150. render: function () {
  151. this.$el.html(this.template.render(this.model.toJSON()));
  152. return this;
  153. },
  154. events: {
  155. "click :button": "select",
  156. "mouseover": "showTooltip"
  157. },
  158. select: function () {
  159. var details = this.model.details;
  160. details.fetch({
  161. success: function () {
  162. details.invoke();
  163. }
  164. });
  165. return false;
  166. },
  167. showTooltip: function () {
  168. }
  169. });
  170. var ActionListView = Backbone.View.extend({
  171. tagName: "div",
  172. className: "nof-menuitems",
  173. render: function (eventName) {
  174. _.each(this.model.models, function (action) {
  175. $(this.el).append(new ActionView({ model: action }).render().el);
  176. }, this);
  177. return this;
  178. }
  179. });
  180. var ServiceView = Backbone.View.extend({
  181. tagName: "div",
  182. className: "nof-menu",
  183. template: $.templates("<div class='nof-menuname'>{{:title}}</div>"),
  184. render: function () {
  185. this.$el.html(this.template.render(this.model.toJSON()));
  186. this.$el.attr("id", this.model.get("id"));
  187. var serviceElement = this.$el;
  188. var actionsModel = this.model.actions;
  189. this.model.actions.fetch({
  190. success: function () {
  191. var actionView = new ActionListView({ model: actionsModel });
  192. serviceElement.append(actionView.render().el);
  193. }
  194. });
  195. return this;
  196. }
  197. });
  198. var ServiceListView = Backbone.View.extend({
  199. tagName: "div",
  200. className: "nof-servicelist",
  201. render: function (eventName) {
  202. _.each(this.model.models, function (service) {
  203. $(this.el).append(new ServiceView({ model: service }).render().el);
  204. }, this);
  205. return this;
  206. }
  207. });
  208. var AppRouter = Backbone.Router.extend({
  209. routes: {
  210. "": "home"
  211. },
  212. home: function () {
  213. var doc = document.location;
  214. var services = new ServiceList();
  215. services.fetch({
  216. success: function () {
  217. $(".nof-servicelist").replaceWith(new ServiceListView({ model: services }).render().el);
  218. }
  219. });
  220. }
  221. });
  222. var app = new AppRouter();
  223. Backbone.history.start();
  224. });
  225. window.onerror = function(msg, url, linenumber) {
  226. alert('Error message: ' + msg + '\nURL: ' + url + '\nLine Number: ' + linenumber);
  227. return true;
  228. };
  229. bindAjaxError = function() {
  230. $("div#main").ajaxError(function(e, xhr, settings) {
  231. // errorDialog('Ajax Error', "Error in: " + settings.url + " \n" + "error:\n" + xhr.responseText);
  232. alert('ajax error');
  233. });
  234. };