luca 0.8.06 → 0.8.59

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/CHANGELOG +32 -1
  2. data/Guardfile +14 -9
  3. data/app.rb +1 -0
  4. data/assets/javascripts/sandbox/config.coffee +1 -1
  5. data/assets/javascripts/sandbox/views/pages/pages_controller.coffee +6 -0
  6. data/lib/luca/rails/version.rb +1 -1
  7. data/spec/framework_spec.coffee +33 -1
  8. data/src/components/application.coffee +1 -3
  9. data/src/components/base_toolbar.coffee +5 -6
  10. data/src/components/collection_inspector.coffee +2 -0
  11. data/src/components/collection_loader_view.coffee +7 -6
  12. data/src/components/controller.coffee +3 -1
  13. data/src/components/development_console.coffee +7 -4
  14. data/src/components/fields/button_field.coffee +2 -5
  15. data/src/components/fields/checkbox_array.coffee +64 -0
  16. data/src/components/fields/checkbox_field.coffee +7 -10
  17. data/src/components/fields/file_upload_field.coffee +3 -6
  18. data/src/components/fields/hidden_field.coffee +4 -10
  19. data/src/components/fields/select_field.coffee +15 -18
  20. data/src/components/fields/text_area_field.coffee +5 -8
  21. data/src/components/fields/text_field.coffee +7 -14
  22. data/src/components/fields/type_ahead_field.coffee +4 -6
  23. data/src/components/form_button_toolbar.coffee +4 -4
  24. data/src/components/form_view.coffee +24 -10
  25. data/src/components/grid_view.coffee +80 -42
  26. data/src/components/record_manager.coffee +21 -22
  27. data/src/components/template.coffee +6 -8
  28. data/src/containers/card_view.coffee +2 -4
  29. data/src/containers/column_view.coffee +10 -12
  30. data/src/containers/modal_view.coffee +7 -9
  31. data/src/containers/panel_view.coffee +4 -4
  32. data/src/containers/split_view.coffee +3 -5
  33. data/src/containers/tab_view.coffee +3 -2
  34. data/src/containers/viewport.coffee +2 -3
  35. data/src/core/container.coffee +4 -4
  36. data/src/core/field.coffee +14 -13
  37. data/src/core/model.coffee +1 -1
  38. data/src/core/view.coffee +12 -3
  39. data/src/framework.coffee +134 -17
  40. data/src/managers/collection_manager.coffee +1 -1
  41. data/src/stylesheets/components/development_console.scss +5 -0
  42. data/src/templates/fields/checkbox_array.luca +5 -0
  43. data/src/templates/fields/checkbox_array_item.luca +4 -0
  44. data/vendor/assets/javascripts/luca-ui-base.js +155 -43
  45. data/vendor/assets/javascripts/luca-ui-spec.js +385 -133
  46. data/vendor/assets/javascripts/luca-ui.js +344 -132
  47. data/vendor/assets/javascripts/luca-ui.min.js +3 -3
  48. data/vendor/assets/stylesheets/luca-ui-bootstrap.css +4 -1
  49. data/vendor/assets/stylesheets/luca-ui-spec.css +4 -1
  50. data/vendor/assets/stylesheets/luca-ui.css +4 -1
  51. metadata +6 -2
@@ -1,25 +1,26 @@
1
1
  (function() {
2
-
3
- _.mixin(_.string);
2
+ var DefineProxy;
4
3
 
5
4
  window.Luca = {
6
- VERSION: "0.8.06",
5
+ VERSION: "0.8.59",
7
6
  core: {},
8
7
  containers: {},
9
8
  components: {},
10
9
  modules: {},
11
- fields: {},
12
10
  util: {},
13
- registry: {
14
- classes: {},
15
- namespaces: ["Luca.containers", "Luca.components"]
16
- },
11
+ fields: {},
17
12
  component_cache: {
18
13
  cid_index: {},
19
14
  name_index: {}
15
+ },
16
+ registry: {
17
+ classes: {},
18
+ namespaces: ["Luca.containers", "Luca.components"]
20
19
  }
21
20
  };
22
21
 
22
+ Luca.enableGlobalObserver = false;
23
+
23
24
  Luca.enableBootstrap = true;
24
25
 
25
26
  Luca.isBackboneModel = function(obj) {
@@ -53,28 +54,35 @@
53
54
  return Luca.component_cache.cid_index[lookup_id];
54
55
  };
55
56
 
56
- Luca.util.nestedValue = function(accessor, source_object) {
57
+ Luca.util.resolve = function(accessor, source_object) {
57
58
  return _(accessor.split(/\./)).inject(function(obj, key) {
58
59
  return obj = obj != null ? obj[key] : void 0;
59
60
  }, source_object);
60
61
  };
61
62
 
63
+ Luca.util.nestedValue = Luca.util.resolve;
64
+
65
+ Luca.util.classify = function(string) {
66
+ if (string == null) string = "";
67
+ return _.string.camelize(_.string.capitalize(string));
68
+ };
69
+
62
70
  Luca.registry.lookup = function(ctype) {
63
- var c, className, parents;
71
+ var c, className, parents, _ref;
64
72
  c = Luca.registry.classes[ctype];
65
73
  if (c != null) return c;
66
- className = _.camelize(_.capitalize(ctype));
74
+ className = Luca.util.classify(ctype);
67
75
  parents = _(Luca.registry.namespaces).map(function(namespace) {
68
76
  return Luca.util.nestedValue(namespace, window || global);
69
77
  });
70
- return _.first(_.compact(_(parents).map(function(parent) {
78
+ return (_ref = _(parents).chain().map(function(parent) {
71
79
  return parent[className];
72
- })));
80
+ }).compact().value()) != null ? _ref[0] : void 0;
73
81
  };
74
82
 
75
83
  Luca.util.lazyComponent = function(config) {
76
84
  var componentClass, constructor, ctype;
77
- ctype = config.ctype;
85
+ ctype = config.ctype || config.type;
78
86
  componentClass = Luca.registry.lookup(ctype);
79
87
  if (!componentClass) {
80
88
  throw "Invalid Component Type: " + ctype + ". Did you forget to register it?";
@@ -86,8 +94,8 @@
86
94
  Luca.register = function(component, constructor_class) {
87
95
  var exists;
88
96
  exists = Luca.registry.classes[component];
89
- if (exists != null) {
90
- throw "Can not register component with the signature " + component + ". Already exists";
97
+ if ((exists != null) && !(window.TestRun != null)) {
98
+ return console.log("Attempting to register component with the signature " + component + ". Already exists");
91
99
  } else {
92
100
  return Luca.registry.classes[component] = constructor_class;
93
101
  }
@@ -115,6 +123,102 @@
115
123
  }
116
124
  };
117
125
 
126
+ Luca.template = function(template_name, variables) {
127
+ var jst, luca, needle, template, _ref;
128
+ window.JST || (window.JST = {});
129
+ luca = (_ref = Luca.templates) != null ? _ref[template_name] : void 0;
130
+ jst = typeof JST !== "undefined" && JST !== null ? JST[template_name] : void 0;
131
+ if (!((luca != null) || (jst != null))) {
132
+ needle = new RegExp("" + template_name + "$");
133
+ luca = _(Luca.templates).detect(function(fn, template_id) {
134
+ return needle.exec(template_id);
135
+ });
136
+ jst = _(JST).detect(function(fn, template_id) {
137
+ return needle.exec(template_id);
138
+ });
139
+ }
140
+ if (!(luca || jst)) throw "Could not find template with " + template_name;
141
+ template = luca || jst;
142
+ if (variables != null) return template(variables);
143
+ return template;
144
+ };
145
+
146
+ DefineProxy = (function() {
147
+
148
+ function DefineProxy(componentName) {
149
+ var parts;
150
+ this.namespace = window || global;
151
+ this.componentId = this.componentName = componentName;
152
+ if (componentName.match(/\./)) {
153
+ this.namespaced = true;
154
+ parts = componentName.split('.');
155
+ this.componentId = parts.pop();
156
+ this.namespace = parts.join('.');
157
+ Luca.registry.addNamespace(parts.join('.'));
158
+ }
159
+ }
160
+
161
+ DefineProxy.prototype["in"] = function(namespace) {
162
+ this.namespace = namespace;
163
+ return this;
164
+ };
165
+
166
+ DefineProxy.prototype.from = function(superClassName) {
167
+ this.superClassName = superClassName;
168
+ return this;
169
+ };
170
+
171
+ DefineProxy.prototype["extends"] = function(superClassName) {
172
+ this.superClassName = superClassName;
173
+ return this;
174
+ };
175
+
176
+ DefineProxy.prototype.extend = function(superClassName) {
177
+ this.superClassName = superClassName;
178
+ return this;
179
+ };
180
+
181
+ DefineProxy.prototype["with"] = function(properties) {
182
+ var at;
183
+ at = this.namespaced ? Luca.util.resolve(this.namespace, window || global) : window || global;
184
+ if (this.namespaced && _.isUndefined(at)) {
185
+ eval("window." + this.namespace + " = {}");
186
+ at = Luca.util.resolve(this.namespace, window || global);
187
+ }
188
+ at[this.componentId] = Luca.extend(this.superClassName, this.componentName, properties);
189
+ Luca.register(_.string.underscored(this.componentId), this.componentName);
190
+ return at[this.componentId];
191
+ };
192
+
193
+ return DefineProxy;
194
+
195
+ })();
196
+
197
+ Luca.define = function(componentName) {
198
+ return new DefineProxy(componentName);
199
+ };
200
+
201
+ Luca.component = Luca.define;
202
+
203
+ Luca.extend = function(superClassName, childName, properties) {
204
+ var superClass;
205
+ if (properties == null) properties = {};
206
+ superClass = Luca.util.resolve(superClassName, window || global);
207
+ if (!_.isFunction(superClass != null ? superClass.extend : void 0)) {
208
+ throw "" + superClassName + " is not a valid component to extend from";
209
+ }
210
+ properties._className = childName;
211
+ properties._superClass = function() {
212
+ superClass._className || (superClass._className = superClassName);
213
+ return superClass;
214
+ };
215
+ return superClass.extend(properties);
216
+ };
217
+
218
+ _.mixin({
219
+ component: Luca.define
220
+ });
221
+
118
222
  $((function() {
119
223
  return $('body').addClass('luca-ui-enabled');
120
224
  })());
@@ -266,6 +370,14 @@
266
370
  Luca.templates || (Luca.templates = {});
267
371
  Luca.templates["fields/button_field_link"] = function(obj){var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('<a class=\'btn ', input_class ,'\'>\n '); if(icon_class.length) { __p.push('\n <i class=\'', icon_class ,'\'></i>\n '); } __p.push('\n ', input_value ,'\n</a>\n');}return __p.join('');};
268
372
  }).call(this);
373
+ (function() {
374
+ Luca.templates || (Luca.templates = {});
375
+ Luca.templates["fields/checkbox_array"] = function(obj){var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('<div class=\'form-horizontal\'>\n <div class=\'control-group\'>\n <label for=\'', input_id ,'\'>\n ', label ,'\n </label>\n <div class=\'controls\'></div>\n </div>\n</div>\n');}return __p.join('');};
376
+ }).call(this);
377
+ (function() {
378
+ Luca.templates || (Luca.templates = {});
379
+ Luca.templates["fields/checkbox_array_item"] = function(obj){var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('<label for=\'', input_id ,'\'>\n <input id=\'', input_id ,'\' name=\'', input_name ,'\' type=\'checkbox\' value=\'', value ,'\' />\n ', label ,'\n</label>\n');}return __p.join('');};
380
+ }).call(this);
269
381
  (function() {
270
382
  Luca.templates || (Luca.templates = {});
271
383
  Luca.templates["fields/checkbox_field"] = function(obj){var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('<label for=\'', input_id ,'\'>\n ', label ,'\n <input name=\'', input_name ,'\' style=\'', inputStyles ,'\' type=\'checkbox\' value=\'', input_value ,'\' />\n</label>\n'); if(helperText) { __p.push('\n<p class=\'helper-text help-block\'>\n ', helperText ,'\n</p>\n'); } __p.push('\n');}return __p.join('');};
@@ -360,6 +472,7 @@
360
472
  });
361
473
  definition.render = function() {
362
474
  var _this = this;
475
+ if (this.layoutTemplate != null) this.$el.html();
363
476
  if (this.deferrable) {
364
477
  this.trigger("before:render", this);
365
478
  this.deferrable.bind(this.deferrable_event, _.once(function() {
@@ -382,10 +495,19 @@
382
495
  return this;
383
496
  }
384
497
  };
385
- return Luca.View.originalExtend.apply(this, [definition]);
498
+ return Luca.View.originalExtend.call(this, definition);
386
499
  };
387
500
 
388
501
  _.extend(Luca.View.prototype, {
502
+ applyStyles: function(styles) {
503
+ var setting, value;
504
+ if (styles == null) styles = {};
505
+ for (setting in styles) {
506
+ value = styles[setting];
507
+ this.$el.css(setting, value);
508
+ }
509
+ return this;
510
+ },
389
511
  debug: function() {
390
512
  var message, _i, _len, _results;
391
513
  if (!(this.debugMode || (window.LucaDebugMode != null))) return;
@@ -397,7 +519,7 @@
397
519
  return _results;
398
520
  },
399
521
  trigger: function() {
400
- if (Luca.enableGlobalObserver) {
522
+ if (Luca.enableGlobalObserver && this.observeEvents === true) {
401
523
  Luca.ViewObserver || (Luca.ViewObserver = new Luca.Observer({
402
524
  type: "view"
403
525
  }));
@@ -436,7 +558,7 @@
436
558
  parts = eventId.split(':');
437
559
  prefix = parts.shift();
438
560
  parts = _(parts).map(function(p) {
439
- return _.capitalize(p);
561
+ return _.string.capitalize(p);
440
562
  });
441
563
  fn = prefix + parts.join('');
442
564
  return _this.bind(eventId, function() {
@@ -477,7 +599,7 @@
477
599
  }).call(this);
478
600
  (function() {
479
601
 
480
- Luca.Model = Backbone.Model.extend({
602
+ _.component('Luca.Model')["extends"]('Backbone.Model')["with"]({
481
603
  initialize: function() {
482
604
  var attr, dependencies, _ref, _results,
483
605
  _this = this;
@@ -743,7 +865,7 @@
743
865
  }).call(this);
744
866
  (function() {
745
867
 
746
- Luca.core.Field = Luca.View.extend({
868
+ _.component('Luca.core.Field')["extends"]('Luca.View')["with"]({
747
869
  className: 'luca-ui-text-field luca-ui-field',
748
870
  isField: true,
749
871
  template: 'fields/text_field',
@@ -802,7 +924,7 @@
802
924
  }).call(this);
803
925
  (function() {
804
926
 
805
- Luca.core.Container = Luca.View.extend({
927
+ _.component('Luca.core.Container')["extends"]('Luca.View')["with"]({
806
928
  className: 'luca-ui-container',
807
929
  componentClass: 'luca-ui-panel',
808
930
  isContainer: true,
@@ -913,7 +1035,8 @@
913
1035
  } catch (e) {
914
1036
  console.log("Error Rendering Component " + (component.name || component.cid), component);
915
1037
  console.log(e.message);
916
- return console.log(e.stack);
1038
+ console.log(e.stack);
1039
+ if ((Luca.silenceRenderErrors != null) !== true) throw e;
917
1040
  }
918
1041
  });
919
1042
  },
@@ -1008,8 +1131,6 @@
1008
1131
  }
1009
1132
  });
1010
1133
 
1011
- Luca.register("container", "Luca.core.Container");
1012
-
1013
1134
  }).call(this);
1014
1135
  (function() {
1015
1136
  var instances;
@@ -1095,7 +1216,7 @@
1095
1216
 
1096
1217
  CollectionManager.prototype.guessCollectionClass = function(key) {
1097
1218
  var classified, guess;
1098
- classified = _(key).chain().capitalize().camelize().value();
1219
+ classified = Luca.util.classify(key);
1099
1220
  guess = (this.collectionNamespace || (window || global))[classified];
1100
1221
  guess || (guess = (this.collectionNamespace || (window || global))["" + classified + "Collection"]);
1101
1222
  return guess;
@@ -1209,7 +1330,7 @@
1209
1330
  }).call(this);
1210
1331
  (function() {
1211
1332
 
1212
- Luca.containers.SplitView = Luca.core.Container.extend({
1333
+ _.component('Luca.containers.SplitView')["extends"]('Luca.core.Container')["with"]({
1213
1334
  layout: '100',
1214
1335
  componentType: 'split_view',
1215
1336
  containerTemplate: 'containers/basic',
@@ -1217,12 +1338,10 @@
1217
1338
  componentClass: 'luca-ui-panel'
1218
1339
  });
1219
1340
 
1220
- Luca.register('split_view', "Luca.containers.SplitView");
1221
-
1222
1341
  }).call(this);
1223
1342
  (function() {
1224
1343
 
1225
- Luca.containers.ColumnView = Luca.core.Container.extend({
1344
+ _.component('Luca.containers.ColumnView')["extends"]('Luca.core.Container')["with"]({
1226
1345
  componentType: 'column_view',
1227
1346
  className: 'luca-ui-column-view',
1228
1347
  components: [],
@@ -1269,12 +1388,10 @@
1269
1388
  }
1270
1389
  });
1271
1390
 
1272
- Luca.register('column_view', "Luca.containers.ColumnView");
1273
-
1274
1391
  }).call(this);
1275
1392
  (function() {
1276
1393
 
1277
- Luca.containers.CardView = Luca.core.Container.extend({
1394
+ _.component("Luca.containers.CardView")["extends"]("Luca.core.Container")["with"]({
1278
1395
  componentType: 'card_view',
1279
1396
  className: 'luca-ui-card-view-wrapper',
1280
1397
  activeCard: 0,
@@ -1378,12 +1495,10 @@
1378
1495
  }
1379
1496
  });
1380
1497
 
1381
- Luca.register('card_view', "Luca.containers.CardView");
1382
-
1383
1498
  }).call(this);
1384
1499
  (function() {
1385
1500
 
1386
- Luca.containers.ModalView = Luca.core.Container.extend({
1501
+ _.component('Luca.containers.ModalView')["extends"]('Luca.core.Container')["with"]({
1387
1502
  componentType: 'modal_view',
1388
1503
  className: 'luca-ui-modal-view',
1389
1504
  components: [],
@@ -1465,12 +1580,10 @@
1465
1580
  }
1466
1581
  });
1467
1582
 
1468
- Luca.register("modal_view", "Luca.containers.ModalView");
1469
-
1470
1583
  }).call(this);
1471
1584
  (function() {
1472
1585
 
1473
- Luca.containers.PanelView = Luca.core.Container.extend({
1586
+ _.component('Luca.containers.PanelView')["extends"]('Luca.core.Container')["with"]({
1474
1587
  className: 'luca-ui-panel',
1475
1588
  initialize: function(options) {
1476
1589
  this.options = options != null ? options : {};
@@ -1503,7 +1616,7 @@
1503
1616
  }).call(this);
1504
1617
  (function() {
1505
1618
 
1506
- Luca.containers.TabView = Luca.containers.CardView.extend({
1619
+ _.component('Luca.containers.TabView')["extends"]('Luca.containers.CardView')["with"]({
1507
1620
  events: {
1508
1621
  "click ul.nav-tabs li": "select"
1509
1622
  },
@@ -1520,7 +1633,7 @@
1520
1633
  return this.bind("after:card:switch", this.highlightSelectedTab);
1521
1634
  },
1522
1635
  activeTabSelector: function() {
1523
- return this.tabSelectors().eq(this.activeCard);
1636
+ return this.tabSelectors().eq(this.activeCard || this.activeTab || this.activeItem);
1524
1637
  },
1525
1638
  prepareLayout: function() {
1526
1639
  var _this = this;
@@ -1583,7 +1696,7 @@
1583
1696
  }).call(this);
1584
1697
  (function() {
1585
1698
 
1586
- Luca.containers.Viewport = Luca.containers.CardView.extend({
1699
+ _.component('Luca.containers.Viewport').extend('Luca.containers.CardView')["with"]({
1587
1700
  activeItem: 0,
1588
1701
  className: 'luca-ui-viewport',
1589
1702
  fullscreen: true,
@@ -1593,7 +1706,6 @@
1593
1706
  if (this.fullscreen) return $('html,body').addClass('luca-ui-fullscreen');
1594
1707
  },
1595
1708
  render: function() {
1596
- console.log("Rendering Viewport");
1597
1709
  return this.$el.addClass('luca-ui-viewport');
1598
1710
  }
1599
1711
  });
@@ -1606,7 +1718,8 @@
1606
1718
  }).call(this);
1607
1719
  (function() {
1608
1720
 
1609
- Luca.components.Template = Luca.View.extend({
1721
+ _.component('Luca.components.Template')["extends"]('Luca.View')["with"]({
1722
+ templateContainer: "Luca.templates",
1610
1723
  initialize: function(options) {
1611
1724
  this.options = options != null ? options : {};
1612
1725
  Luca.View.prototype.initialize.apply(this, arguments);
@@ -1617,7 +1730,6 @@
1617
1730
  return this.templateContainer = eval("(window || global)." + this.templateContainer);
1618
1731
  }
1619
1732
  },
1620
- templateContainer: "Luca.templates",
1621
1733
  beforeRender: function() {
1622
1734
  if (_.isUndefined(this.templateContainer)) this.templateContainer = JST;
1623
1735
  return this.$el.html(this.markup || this.templateContainer[this.template](this.options));
@@ -1627,12 +1739,10 @@
1627
1739
  }
1628
1740
  });
1629
1741
 
1630
- Luca.register("template", "Luca.components.Template");
1631
-
1632
1742
  }).call(this);
1633
1743
  (function() {
1634
1744
 
1635
- Luca.Application = Luca.containers.Viewport.extend({
1745
+ _.component('Luca.Application')["extends"]('Luca.containers.Viewport')["with"]({
1636
1746
  components: [
1637
1747
  {
1638
1748
  ctype: 'controller',
@@ -1701,7 +1811,6 @@
1701
1811
  return (_ref = Luca.containers.Viewport.prototype.beforeRender) != null ? _ref.apply(this, arguments) : void 0;
1702
1812
  },
1703
1813
  boot: function() {
1704
- console.log("Sup?");
1705
1814
  return this.trigger("ready");
1706
1815
  },
1707
1816
  collection: function() {
@@ -1724,7 +1833,7 @@
1724
1833
  }).call(this);
1725
1834
  (function() {
1726
1835
 
1727
- Luca.components.Toolbar = Luca.core.Container.extend({
1836
+ _.component('Luca.components.Toolbar')["extends"]('Luca.core.Container')["with"]({
1728
1837
  className: 'luca-ui-toolbar',
1729
1838
  position: 'bottom',
1730
1839
  initialize: function(options) {
@@ -1742,12 +1851,17 @@
1742
1851
  }
1743
1852
  });
1744
1853
 
1745
- Luca.register("toolbar", "Luca.components.Toolbar");
1854
+ }).call(this);
1855
+ (function() {
1856
+
1857
+ _.component('Luca.components.CollectionInspector')["extends"]('Luca.View')["with"]({
1858
+ name: "collection_inspector"
1859
+ });
1746
1860
 
1747
1861
  }).call(this);
1748
1862
  (function() {
1749
1863
 
1750
- Luca.components.CollectionLoaderView = Luca.components.Template.extend({
1864
+ _.component('Luca.components.CollectionLoaderView')["extends"]('Luca.components.Template')["with"]({
1751
1865
  className: 'luca-ui-collection-loader-view',
1752
1866
  template: "components/collection_loader_view",
1753
1867
  initialize: function(options) {
@@ -1763,12 +1877,13 @@
1763
1877
  setupBindings: function() {
1764
1878
  var _this = this;
1765
1879
  this.manager.bind("collection_loaded", function(name) {
1766
- var loaded, progress, total;
1880
+ var collectionName, loaded, progress, total;
1767
1881
  loaded = _this.manager.loadedCollectionsCount();
1768
1882
  total = _this.manager.totalCollectionsCount();
1769
1883
  progress = parseInt((loaded / total) * 100);
1884
+ collectionName = _.string.titleize(_.string.humanize(name));
1770
1885
  _this.modalContainer().find('.progress .bar').attr("style", "width: " + progress + "%;");
1771
- return _this.modalContainer().find('.message').html("Loaded " + (_(name).chain().humanize().titleize().value()) + "...");
1886
+ return _this.modalContainer().find('.message').html("Loaded " + collectionName + "...");
1772
1887
  });
1773
1888
  return this.manager.bind("all_collections_loaded", function() {
1774
1889
  _this.modalContainer().find('.message').html("All done!");
@@ -1779,12 +1894,10 @@
1779
1894
  }
1780
1895
  });
1781
1896
 
1782
- Luca.register("collection_loader_view", "Luca.components.CollectionLoaderView");
1783
-
1784
1897
  }).call(this);
1785
1898
  (function() {
1786
1899
 
1787
- Luca.components.Controller = Luca.containers.CardView.extend({
1900
+ _.component('Luca.components.Controller')["extends"]('Luca.containers.CardView')["with"]({
1788
1901
  initialize: function(options) {
1789
1902
  var _ref;
1790
1903
  this.options = options;
@@ -1822,7 +1935,7 @@
1822
1935
  }).call(this);
1823
1936
  (function() {
1824
1937
 
1825
- Luca.components.DevelopmentConsole = Luca.View.extend({
1938
+ _.component('Luca.components.DevelopmentConsole')["extends"]('Luca.View')["with"]({
1826
1939
  name: "development_console",
1827
1940
  className: 'luca-ui-development-console',
1828
1941
  initialize: function(options) {
@@ -1857,10 +1970,10 @@
1857
1970
  },
1858
1971
  returnValue: function(val) {
1859
1972
  if (val == null) return "undefined";
1860
- return val != null ? val.toString() : void 0;
1973
+ return (val != null ? val.toString() : void 0) || "";
1861
1974
  },
1862
1975
  parseLine: function(line) {
1863
- _(line).strip();
1976
+ line = _.string.strip(line);
1864
1977
  line = line.replace(/^return/, ' ');
1865
1978
  return "return " + line;
1866
1979
  },
@@ -1885,8 +1998,7 @@
1885
1998
  }).call(this);
1886
1999
  (function() {
1887
2000
 
1888
- Luca.fields.ButtonField = Luca.core.Field.extend({
1889
- form_field: true,
2001
+ _.component('Luca.fields.ButtonField')["extends"]('Luca.core.Field')["with"]({
1890
2002
  readOnly: true,
1891
2003
  events: {
1892
2004
  "click input": "click_handler"
@@ -1926,13 +2038,93 @@
1926
2038
  }
1927
2039
  });
1928
2040
 
1929
- Luca.register("button_field", "Luca.fields.ButtonField");
2041
+ }).call(this);
2042
+ (function() {
2043
+
2044
+ _.component('Luca.fields.CheckboxArray')["extends"]('Luca.core.Field')["with"]({
2045
+ template: "fields/checkbox_array",
2046
+ events: {
2047
+ "click input": "clickHandler"
2048
+ },
2049
+ initialize: function(options) {
2050
+ this.options = options != null ? options : {};
2051
+ _.extend(this, this.options);
2052
+ _.extend(this, Luca.modules.Deferrable);
2053
+ _.bindAll(this, "populateCheckboxes", "clickHandler", "_updateModel");
2054
+ Luca.core.Field.prototype.initialize.apply(this, arguments);
2055
+ this.input_id || (this.input_id = _.uniqueId('field'));
2056
+ this.input_name || (this.input_name = this.name);
2057
+ this.label || (this.label = this.name);
2058
+ this.valueField || (this.valueField = "id");
2059
+ this.displayField || (this.displayField = "name");
2060
+ return this.selectedItems = [];
2061
+ },
2062
+ afterInitialize: function(options) {
2063
+ this.options = options != null ? options : {};
2064
+ try {
2065
+ this.configure_collection();
2066
+ } catch (e) {
2067
+ console.log("Error Configuring Collection", this, e.message);
2068
+ }
2069
+ return this.collection.bind("reset", this.populateCheckboxes);
2070
+ },
2071
+ afterRender: function() {
2072
+ var _ref, _ref2;
2073
+ if (((_ref = this.collection) != null ? (_ref2 = _ref.models) != null ? _ref2.length : void 0 : void 0) > 0) {
2074
+ return this.populateCheckboxes();
2075
+ } else {
2076
+ return this.collection.trigger("reset");
2077
+ }
2078
+ },
2079
+ clickHandler: function(event) {
2080
+ var checkbox;
2081
+ checkbox = event.target;
2082
+ if (checkbox.checked) {
2083
+ this.selectedItems.push(checkbox.value);
2084
+ } else {
2085
+ if (this.selectedItems.indexOf(checkbox.value) !== -1) {
2086
+ this.selectedItems = _.without(this.selectedItems, [checkbox.value]);
2087
+ }
2088
+ }
2089
+ return this._updateModel();
2090
+ },
2091
+ populateCheckboxes: function() {
2092
+ var controls,
2093
+ _this = this;
2094
+ controls = $(this.el).find('.controls');
2095
+ controls.empty();
2096
+ if (!_.isUndefined(this.getModel())) {
2097
+ this.selectedItems = this.getModel().get(this.name);
2098
+ }
2099
+ this.collection.each(function(model) {
2100
+ var input_id, label, value;
2101
+ value = model.get(_this.valueField);
2102
+ label = model.get(_this.displayField);
2103
+ input_id = _.uniqueId('field');
2104
+ controls.append(Luca.templates["fields/checkbox_array_item"]({
2105
+ label: label,
2106
+ value: value,
2107
+ input_id: input_id,
2108
+ input_name: _this.input_name
2109
+ }));
2110
+ if (_this.selectedItems.indexOf(value) !== -1) {
2111
+ return _this.$("#" + input_id).attr("checked", "checked");
2112
+ }
2113
+ });
2114
+ return $(this.container).append(this.$el);
2115
+ },
2116
+ _updateModel: function() {
2117
+ var attributes;
2118
+ attributes = {};
2119
+ attributes[this.name] = this.selectedItems;
2120
+ return this.getModel().set(attributes);
2121
+ }
2122
+ });
1930
2123
 
1931
2124
  }).call(this);
1932
2125
  (function() {
1933
2126
 
1934
- Luca.fields.CheckboxField = Luca.core.Field.extend({
1935
- form_field: true,
2127
+ _.component('Luca.fields.CheckboxField')["extends"]('Luca.core.Field')["with"]({
1936
2128
  events: {
1937
2129
  "change input": "change_handler"
1938
2130
  },
@@ -1969,13 +2161,10 @@
1969
2161
  }
1970
2162
  });
1971
2163
 
1972
- Luca.register("checkbox_field", "Luca.fields.CheckboxField");
1973
-
1974
2164
  }).call(this);
1975
2165
  (function() {
1976
2166
 
1977
- Luca.fields.FileUploadField = Luca.core.Field.extend({
1978
- form_field: true,
2167
+ _.component('Luca.fields.FileUploadField')["extends"]('Luca.core.Field')["with"]({
1979
2168
  template: 'fields/file_upload_field',
1980
2169
  initialize: function(options) {
1981
2170
  this.options = options != null ? options : {};
@@ -1989,13 +2178,10 @@
1989
2178
  }
1990
2179
  });
1991
2180
 
1992
- Luca.register("file_upload_field", "Luca.fields.FileUploadField");
1993
-
1994
2181
  }).call(this);
1995
2182
  (function() {
1996
2183
 
1997
- Luca.fields.HiddenField = Luca.core.Field.extend({
1998
- form_field: true,
2184
+ _.component('Luca.fields.HiddenField')["extends"]('Luca.core.Field')["with"]({
1999
2185
  template: 'fields/hidden_field',
2000
2186
  initialize: function(options) {
2001
2187
  this.options = options != null ? options : {};
@@ -2009,13 +2195,10 @@
2009
2195
  }
2010
2196
  });
2011
2197
 
2012
- Luca.register("hidden_field", "Luca.fields.HiddenField");
2013
-
2014
2198
  }).call(this);
2015
2199
  (function() {
2016
2200
 
2017
- Luca.fields.SelectField = Luca.core.Field.extend({
2018
- form_field: true,
2201
+ _.component('Luca.fields.SelectField')["extends"]('Luca.core.Field')["with"]({
2019
2202
  events: {
2020
2203
  "change select": "change_handler"
2021
2204
  },
@@ -2106,13 +2289,10 @@
2106
2289
  }
2107
2290
  });
2108
2291
 
2109
- Luca.register("select_field", "Luca.fields.SelectField");
2110
-
2111
2292
  }).call(this);
2112
2293
  (function() {
2113
2294
 
2114
- Luca.fields.TextAreaField = Luca.core.Field.extend({
2115
- form_field: true,
2295
+ _.component('Luca.fields.TextAreaField')["extends"]('Luca.core.Field')["with"]({
2116
2296
  events: {
2117
2297
  "keydown input": "keydown_handler",
2118
2298
  "blur input": "blur_handler",
@@ -2154,13 +2334,10 @@
2154
2334
  }
2155
2335
  });
2156
2336
 
2157
- Luca.register("text_area_field", "Luca.fields.TextAreaField");
2158
-
2159
2337
  }).call(this);
2160
2338
  (function() {
2161
2339
 
2162
- Luca.fields.TextField = Luca.core.Field.extend({
2163
- form_field: true,
2340
+ _.component('Luca.fields.TextField')["extends"]('Luca.core.Field')["with"]({
2164
2341
  events: {
2165
2342
  "keydown input": "keydown_handler",
2166
2343
  "blur input": "blur_handler",
@@ -2201,13 +2378,10 @@
2201
2378
  }
2202
2379
  });
2203
2380
 
2204
- Luca.register("text_field", "Luca.fields.TextField");
2205
-
2206
2381
  }).call(this);
2207
2382
  (function() {
2208
2383
 
2209
- Luca.fields.TypeAheadField = Luca.fields.TextField.extend({
2210
- form_field: true,
2384
+ _.component('Luca.fields.TypeAheadField')["extends"]('Luca.fields.TextField')["with"]({
2211
2385
  className: 'luca-ui-field',
2212
2386
  afterInitialize: function() {
2213
2387
  this.input_id || (this.input_id = _.uniqueId('field'));
@@ -2219,7 +2393,7 @@
2219
2393
  }).call(this);
2220
2394
  (function() {
2221
2395
 
2222
- Luca.components.FormButtonToolbar = Luca.components.Toolbar.extend({
2396
+ _.component('Luca.components.FormButtonToolbar')["extends"]('Luca.components.Toolbar')["with"]({
2223
2397
  className: 'luca-ui-form-toolbar form-actions',
2224
2398
  position: 'bottom',
2225
2399
  includeReset: false,
@@ -2246,12 +2420,10 @@
2246
2420
  }
2247
2421
  });
2248
2422
 
2249
- Luca.register("form_button_toolbar", "Luca.components.FormButtonToolbar");
2250
-
2251
2423
  }).call(this);
2252
2424
  (function() {
2253
2425
 
2254
- Luca.components.FormView = Luca.core.Container.extend({
2426
+ _.component("Luca.components.FormView")["extends"]('Luca.core.Container')["with"]({
2255
2427
  tagName: 'form',
2256
2428
  className: 'luca-ui-form-view',
2257
2429
  hooks: ["before:submit", "before:reset", "before:load", "before:load:new", "before:load:existing", "after:submit", "after:reset", "after:load", "after:load:new", "after:load:existing", "after:submit:success", "after:submit:fatal_error", "after:submit:error"],
@@ -2335,8 +2507,24 @@
2335
2507
  return component.container = container;
2336
2508
  });
2337
2509
  },
2510
+ afterComponents: function() {
2511
+ var _ref,
2512
+ _this = this;
2513
+ if ((_ref = Luca.core.Container.prototype.afterComponents) != null) {
2514
+ _ref.apply(this, arguments);
2515
+ }
2516
+ return this.eachField(function(field) {
2517
+ field.getForm = function() {
2518
+ return _this;
2519
+ };
2520
+ return field.getModel = function() {
2521
+ return _this.currentModel();
2522
+ };
2523
+ });
2524
+ },
2338
2525
  render: function() {
2339
- return $(this.container).append(this.$el);
2526
+ $(this.container).append(this.$el);
2527
+ return this;
2340
2528
  },
2341
2529
  wrapper: function() {
2342
2530
  return this.$el.parents('.luca-ui-form-view-wrapper');
@@ -2353,6 +2541,9 @@
2353
2541
  return toolbar.render();
2354
2542
  });
2355
2543
  },
2544
+ eachField: function(iterator) {
2545
+ return _(this.getFields()).map(iterator);
2546
+ },
2356
2547
  getField: function(name) {
2357
2548
  return _(this.getFields('name', name)).first();
2358
2549
  },
@@ -2390,7 +2581,7 @@
2390
2581
  }
2391
2582
  },
2392
2583
  reset: function() {
2393
- return this.loadModel(this.current_model);
2584
+ if (this.current_model != null) return this.loadModel(this.current_model);
2394
2585
  },
2395
2586
  clear: function() {
2396
2587
  var _this = this;
@@ -2423,7 +2614,7 @@
2423
2614
  if ((options.silent != null) !== true) return this.syncFormWithModel();
2424
2615
  },
2425
2616
  getValues: function(options) {
2426
- options || (options = {});
2617
+ if (options == null) options = {};
2427
2618
  if (options.reject_blank == null) options.reject_blank = true;
2428
2619
  if (options.skip_buttons == null) options.skip_buttons = true;
2429
2620
  return _(this.getFields()).inject(function(memo, field) {
@@ -2432,8 +2623,10 @@
2432
2623
  key = field.input_name || field.name;
2433
2624
  skip = false;
2434
2625
  if (options.skip_buttons && field.ctype === "button_field") skip = true;
2435
- if (options.reject_blank === true && _.isBlank(value)) skip = true;
2436
- if (field.input_name === "id" && _.isBlank(value)) skip = true;
2626
+ if (_.string.isBlank(value)) {
2627
+ if (options.reject_blank && !field.send_blanks) skip = true;
2628
+ if (field.input_name === "id") skip = true;
2629
+ }
2437
2630
  if (skip !== true) memo[key] = value;
2438
2631
  return memo;
2439
2632
  }, {});
@@ -2477,56 +2670,75 @@
2477
2670
  }
2478
2671
  });
2479
2672
 
2480
- Luca.register('form_view', 'Luca.components.FormView');
2481
-
2482
2673
  }).call(this);
2483
2674
  (function() {
2484
2675
 
2485
- Luca.components.GridView = Luca.View.extend({
2676
+ _.component('Luca.components.GridView').extend('Luca.View')["with"]({
2486
2677
  autoBindEventHandlers: true,
2487
2678
  events: {
2488
- "dblclick .luca-ui-g-row": "double_click_handler",
2489
- "click .luca-ui-g-row": "click_handler"
2679
+ "dblclick table tbody tr": "double_click_handler",
2680
+ "click table tbody tr": "click_handler"
2490
2681
  },
2491
2682
  className: 'luca-ui-g-view',
2683
+ rowClass: "luca-ui-g-row",
2684
+ wrapperClass: "luca-ui-g-view-wrapper",
2685
+ additionalWrapperClasses: [],
2686
+ wrapperStyles: {},
2492
2687
  scrollable: true,
2493
2688
  emptyText: 'No Results To display.',
2494
2689
  tableStyle: 'striped',
2690
+ defaultHeight: 285,
2691
+ defaultWidth: 756,
2692
+ maxWidth: void 0,
2495
2693
  hooks: ["before:grid:render", "before:render:header", "before:render:row", "after:grid:render", "row:double:click", "row:click", "after:collection:load"],
2496
- rowClass: "luca-ui-g-row",
2497
2694
  initialize: function(options) {
2498
2695
  var _this = this;
2499
2696
  this.options = options != null ? options : {};
2500
2697
  _.extend(this, this.options);
2501
2698
  _.extend(this, Luca.modules.Deferrable);
2502
2699
  Luca.View.prototype.initialize.apply(this, arguments);
2503
- _.bindAll(this, "double_click_handler", "click_handler");
2504
2700
  this.configure_collection();
2505
- return this.collection.bind("reset", function(collection) {
2701
+ this.collection.bind("reset", function(collection) {
2506
2702
  _this.refresh();
2507
2703
  return _this.trigger("after:collection:load", collection);
2508
2704
  });
2705
+ return this.collection.bind("change", function(model) {
2706
+ var cells, rowEl;
2707
+ rowEl = _this.getRowEl(model.id || model.get('id') || model.cid);
2708
+ cells = _this.render_row(model, _this.indexOf(model), {
2709
+ cellsOnly: true
2710
+ });
2711
+ return $(rowEl).html(cells);
2712
+ });
2509
2713
  },
2510
2714
  beforeRender: function() {
2511
- var _ref,
2512
- _this = this;
2513
2715
  this.trigger("before:grid:render", this);
2514
- if (this.scrollable) this.$el.addClass('scrollable-g-view');
2515
2716
  this.$el.html(Luca.templates["components/grid_view"]());
2516
- this.table = $('table.luca-ui-g-view', this.el);
2517
- this.header = $("thead", this.table);
2518
- this.body = $("tbody", this.table);
2519
- this.footer = $("tfoot", this.table);
2520
- if (Luca.enableBootstrap) this.table.addClass('table');
2521
- _((_ref = this.tableStyle) != null ? _ref.split(" ") : void 0).each(function(style) {
2522
- return _this.table.addClass("table-" + style);
2523
- });
2717
+ this.table = this.$('table.luca-ui-g-view');
2718
+ this.header = this.$("thead");
2719
+ this.body = this.$("tbody");
2720
+ this.footer = this.$("tfoot");
2721
+ this.wrapper = this.$("." + this.wrapperClass);
2722
+ this.applyCssClasses();
2524
2723
  if (this.scrollable) this.setDimensions();
2525
2724
  this.renderHeader();
2526
2725
  this.emptyMessage();
2527
2726
  this.renderToolbars();
2528
2727
  return $(this.container).append(this.$el);
2529
2728
  },
2729
+ applyCssClasses: function() {
2730
+ var _ref,
2731
+ _this = this;
2732
+ if (this.scrollable) this.$el.addClass('scrollable-g-view');
2733
+ _(this.additionalWrapperClasses).each(function(containerClass) {
2734
+ var _ref;
2735
+ return (_ref = _this.wrapper) != null ? _ref.addClass(containerClass) : void 0;
2736
+ });
2737
+ if (Luca.enableBootstrap) this.table.addClass('table');
2738
+ return _((_ref = this.tableStyle) != null ? _ref.split(" ") : void 0).each(function(style) {
2739
+ return _this.table.addClass("table-" + style);
2740
+ });
2741
+ },
2530
2742
  toolbarContainers: function(position) {
2531
2743
  if (position == null) position = "bottom";
2532
2744
  return $(".toolbar-container." + position, this.el);
@@ -2539,20 +2751,18 @@
2539
2751
  return toolbar.render();
2540
2752
  });
2541
2753
  },
2542
- defaultWidth: 756,
2543
- defaultHeight: 285,
2544
2754
  setDimensions: function(offset) {
2545
2755
  var _this = this;
2546
2756
  this.height || (this.height = this.defaultHeight);
2547
- $('.luca-ui-g-view-body', this.el).height(this.height);
2548
- $('tbody.scrollable', this.el).height(this.height - 23);
2757
+ this.$('.luca-ui-g-view-body').height(this.height);
2758
+ this.$('tbody.scrollable').height(this.height - 23);
2549
2759
  this.container_width = (function() {
2550
2760
  return $(_this.container).width();
2551
2761
  })();
2552
- this.width = this.container_width > 0 ? this.container_width : this.defaultWidth;
2762
+ this.width || (this.width = this.container_width > 0 ? this.container_width : this.defaultWidth);
2553
2763
  this.width = _([this.width, this.maxWidth || this.width]).max();
2554
- $('.luca-ui-g-view-body', this.el).width(this.width);
2555
- $('.luca-ui-g-view-body table', this.el).width(this.width);
2764
+ this.$('.luca-ui-g-view-body').width(this.width);
2765
+ this.$('.luca-ui-g-view-body table').width(this.width);
2556
2766
  return this.setDefaultColumnWidths();
2557
2767
  },
2558
2768
  resize: function(newWidth) {
@@ -2560,8 +2770,8 @@
2560
2770
  _this = this;
2561
2771
  difference = newWidth - this.width;
2562
2772
  this.width = newWidth;
2563
- $('.luca-ui-g-view-body', this.el).width(this.width);
2564
- $('.luca-ui-g-view-body table', this.el).width(this.width);
2773
+ this.$('.luca-ui-g-view-body').width(this.width);
2774
+ this.$('.luca-ui-g-view-body table').width(this.width);
2565
2775
  if (this.columns.length > 0) {
2566
2776
  distribution = difference / this.columns.length;
2567
2777
  return _(this.columns).each(function(col, index) {
@@ -2641,9 +2851,10 @@
2641
2851
  getRowEl: function(id) {
2642
2852
  return this.$("[data-record-id=" + id + "]", 'table');
2643
2853
  },
2644
- render_row: function(row, row_index) {
2645
- var altClass, cells, model_id, rowClass, _ref,
2854
+ render_row: function(row, row_index, options) {
2855
+ var altClass, cells, content, model_id, rowClass, _ref,
2646
2856
  _this = this;
2857
+ if (options == null) options = {};
2647
2858
  rowClass = this.rowClass;
2648
2859
  model_id = (row != null ? row.get : void 0) && (row != null ? row.attributes : void 0) ? row.get('id') : '';
2649
2860
  this.trigger("before:render:row", row, row_index);
@@ -2654,11 +2865,14 @@
2654
2865
  display = _.isUndefined(value) ? "" : value;
2655
2866
  return "<td style='" + style + "' class='column-" + col_index + "'>" + display + "</td>";
2656
2867
  });
2868
+ if (options.cellsOnly) return cells;
2657
2869
  altClass = '';
2658
2870
  if (this.alternateRowClasses) {
2659
2871
  altClass = row_index % 2 === 0 ? "even" : "odd";
2660
2872
  }
2661
- return (_ref = this.body) != null ? _ref.append("<tr data-record-id='" + model_id + "' data-row-index='" + row_index + "' class='" + rowClass + " " + altClass + "' id='row-" + row_index + "'>" + cells + "</tr>") : void 0;
2873
+ content = "<tr data-record-id='" + model_id + "' data-row-index='" + row_index + "' class='" + rowClass + " " + altClass + "' id='row-" + row_index + "'>" + cells + "</tr>";
2874
+ if (options.contentOnly === true) return content;
2875
+ return (_ref = this.body) != null ? _ref.append(content) : void 0;
2662
2876
  },
2663
2877
  cell_renderer: function(row, column, columnIndex) {
2664
2878
  var source;
@@ -2689,12 +2903,10 @@
2689
2903
  }
2690
2904
  });
2691
2905
 
2692
- Luca.register("grid_view", "Luca.components.GridView");
2693
-
2694
2906
  }).call(this);
2695
2907
  (function() {
2696
2908
 
2697
- Luca.components.RecordManager = Luca.containers.CardView.extend({
2909
+ _.component('Luca.components.RecordManager').extend('Luca.containers.CardView')["with"]({
2698
2910
  events: {
2699
2911
  "click .record-manager-grid .edit-link": "edit_handler",
2700
2912
  "click .record-manager-filter .filter-button": "filter_handler",