/modules.js

https://github.com/dariocravero/PAd · JavaScript · 98 lines · 88 code · 4 blank · 6 comment · 5 complexity · c2b97d8289641b659d12525105df32ee MD5 · raw file

  1. function sample_modules() {
  2. var list = [
  3. {name: {model: 'User', collection: 'Users'}, properties: [{name: 'id', editable: false}, {name: 'name', editable: true},
  4. {name: 'surname', editable: true}, {name: 'email', editable: true}, {name: 'created_at', editable: false},
  5. {name: 'updated_at', editable: false}]},
  6. {name: {model: 'Image', collection: 'Images'}, properties: [{name: 'id', editable: false}, {name: 'name', editable: true},
  7. {name: 'file_type', editable: true}, {name: 'path', editable: true},
  8. {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  9. {name: {model: 'Category', collection: 'Categories'}, properties: [{name: 'id', editable: false},
  10. {name: 'name', editable: true}, {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  11. {name: {model: 'News', collection: 'News'}, properties: [{name: 'id', editable: false}, {name: 'title', editable: true},
  12. {name: 'content', editable: true}, {name: 'user_id', editable: true}, {name: 'created_at', editable: false},
  13. {name: 'updated_at', editable: false}]},
  14. {name: {model: 'Podcast', collection: 'Podcasts'}, properties: [{name: 'id', editable: false}, {name: 'title', editable: true},
  15. {name: 'description', editable: true}, {name: 'url', editable: true}, {name: 'user_id', editable: true},
  16. {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  17. {name: {model: 'Event', collection: 'Events'}, properties: [{name: 'id', editable: false}, {name: 'title', editable: true},
  18. {name: 'starts', editable: true}, {name: 'ends', editable: true}, {name: 'venue', editable: true},
  19. {name: 'description', editable: true}, {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  20. {name: {model: 'Sport', collection: 'Sports'}, properties: [{name: 'id', editable: false}, {name: 'name', editable: true},
  21. {name: 'description', editable: true}, {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  22. {name: {model: 'House', collection: 'Houses'}, properties: [{name: 'id', editable: false}, {name: 'rooms', editable: true},
  23. {name: 'floors', editable: true}, {name: 'doors', editable: true}, {name: 'tables', editable: true}, {name: 'bathrooms', editable: true},
  24. {name: 'people_living_in', editable: true}, {name: 'address', editable: true}, {name: 'neighborhood_id', editable: true},
  25. {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  26. {name: {model: 'Neighborhood', collection: 'Neighborhoods'}, properties: [{name: 'id', editable: false}, {name: 'name', editable: true},
  27. {name: 'description', editable: true}, {name: 'city_id', editable: true}, {name: 'created_at', editable: false},
  28. {name: 'updated_at', editable: false}]},
  29. {name: {model: 'City', collection: 'Cities'}, properties: [{name: 'id', editable: false}, {name: 'name', editable: true},
  30. {name: 'province_id', editable: true}, {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  31. {name: {model: 'Province', collection: 'Provincies'}, properties: [{name: 'id', editable: false}, {name: 'name', editable: true},
  32. {name: 'country_id', editable: true}, {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]},
  33. {name: {model: 'Country', collection: 'Countries'}, properties: [{name: 'id', editable: false}, {name: 'name', editable: true},
  34. {name: 'created_at', editable: false}, {name: 'updated_at', editable: false}]}
  35. ];
  36. _.each(list, function(module) {
  37. PAd.Models[module.name.model] = Backbone.Model.extend({
  38. data: function() {
  39. return _.map(this.collection.model.properties, $.proxy(function(property) {
  40. return {name: property.name, value: this.get(property.name), editable: property.editable};
  41. }, this));
  42. },
  43. validate: function(attrs) {
  44. var errors = {};
  45. _.each(attrs, function(k, v) {
  46. if (k == '') {
  47. errors[v] = v + " can't be blank";
  48. }
  49. });
  50. if (!_.isEmpty(errors)) {
  51. return errors;
  52. }
  53. }
  54. }, {properties: module.properties});
  55. PAd.Collections[module.name.collection] = Backbone.Collection.extend({
  56. model: PAd.Models[module.name.model],
  57. //url: '/' + module.name.collection.toLowerCase(),
  58. localStorage: new Store(module.name.collection),
  59. dummy: function(n) {
  60. var add = [], properties = _.pluck(this.model.properties, 'name');
  61. _.each(_.range(1, n), function(i) {
  62. var o = {};
  63. _.each(properties, function(p) { o[p] = p + ' ' + i; });
  64. add.push(o);
  65. });
  66. this.add(add);
  67. this.last().save();
  68. },
  69. next_page: function(callback) {
  70. // TODO Implement lazy loading here.
  71. // Do we have enough records?
  72. var from_index = this.page*this.records_per_page,
  73. to_index = (this.page+1)*this.records_per_page;
  74. if (to_index <= this.length) {
  75. _.each(this.models.slice(from_index, to_index), callback);
  76. this.page++;
  77. // TODO Perhaps we can get more if we're near the limit?
  78. } else {
  79. // TODO Fetch & if we get some records increase page count.
  80. }
  81. },
  82. page: 0,
  83. records_per_page: 30
  84. });
  85. PAd.Views[module.name.collection] = {Index: PAd.Views.Records.Index.extend({
  86. el: '#PAd .modules .module[data-module="' + module.name.collection.toLowerCase() + '"]'
  87. })};
  88. // Render the module
  89. $('#PAd .modules').append(_.jst('module',
  90. { module: module.name.collection.toLowerCase(),
  91. properties: _.pluck(module.properties, 'name')}));
  92. });
  93. return _.map(list, function(e) { return e.name.collection; });
  94. }