sproutcore 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +269 -0
  4. data/README.txt +67 -0
  5. data/Rakefile +4 -0
  6. data/app_generators/sproutcore/USAGE +5 -0
  7. data/app_generators/sproutcore/sproutcore_generator.rb +66 -0
  8. data/app_generators/sproutcore/templates/README +77 -0
  9. data/app_generators/sproutcore/templates/environment.yml +4 -0
  10. data/bin/sc-build +145 -0
  11. data/bin/sc-gen +24 -0
  12. data/bin/sc-server +63 -0
  13. data/bin/sproutcore +21 -0
  14. data/clients/sc_docs/controllers/docs.js +118 -0
  15. data/clients/sc_docs/core.js +19 -0
  16. data/clients/sc_docs/english.lproj/body.css +159 -0
  17. data/clients/sc_docs/english.lproj/body.rhtml +33 -0
  18. data/clients/sc_docs/english.lproj/controls.css +0 -0
  19. data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
  20. data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
  21. data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
  22. data/clients/sc_docs/english.lproj/images/indicator.gif +0 -0
  23. data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
  24. data/clients/sc_docs/english.lproj/no_docs.rhtml +7 -0
  25. data/clients/sc_docs/english.lproj/strings.js +14 -0
  26. data/clients/sc_docs/english.lproj/warning.rhtml +6 -0
  27. data/clients/sc_docs/fixtures/doc.js +11 -0
  28. data/clients/sc_docs/main.js +21 -0
  29. data/clients/sc_docs/models/doc.js +9 -0
  30. data/clients/sc_docs/tests/controllers/docs.rhtml +21 -0
  31. data/clients/sc_docs/tests/models/doc.rhtml +21 -0
  32. data/clients/sc_docs/tests/views/doc_frame.rhtml +21 -0
  33. data/clients/sc_docs/tests/views/doc_label_view.rhtml +21 -0
  34. data/clients/sc_docs/views/doc_frame.js +33 -0
  35. data/clients/sc_docs/views/doc_label.js +20 -0
  36. data/clients/sc_test_runner/controllers/runner.js +175 -0
  37. data/clients/sc_test_runner/core.js +19 -0
  38. data/clients/sc_test_runner/english.lproj/body.css +151 -0
  39. data/clients/sc_test_runner/english.lproj/body.rhtml +35 -0
  40. data/clients/sc_test_runner/english.lproj/controls.css +0 -0
  41. data/clients/sc_test_runner/english.lproj/icons/small/next.png +0 -0
  42. data/clients/sc_test_runner/english.lproj/icons/small/reset.png +0 -0
  43. data/clients/sc_test_runner/english.lproj/images/gradients.png +0 -0
  44. data/clients/sc_test_runner/english.lproj/images/indicator.gif +0 -0
  45. data/clients/sc_test_runner/english.lproj/images/toolbar.png +0 -0
  46. data/clients/sc_test_runner/english.lproj/no_tests.rhtml +6 -0
  47. data/clients/sc_test_runner/english.lproj/strings.js +14 -0
  48. data/clients/sc_test_runner/english.lproj/warning.rhtml +6 -0
  49. data/clients/sc_test_runner/fixtures/test.js +12 -0
  50. data/clients/sc_test_runner/main.js +26 -0
  51. data/clients/sc_test_runner/models/test.js +11 -0
  52. data/clients/sc_test_runner/views/runner_frame.js +72 -0
  53. data/clients/sc_test_runner/views/test_label.js +20 -0
  54. data/config/hoe.rb +70 -0
  55. data/config/requirements.rb +17 -0
  56. data/environment.yml +9 -0
  57. data/frameworks/prototype/prototype.js +4186 -0
  58. data/frameworks/sproutcore/Core.js +378 -0
  59. data/frameworks/sproutcore/README +3 -0
  60. data/frameworks/sproutcore/controllers/array.js +236 -0
  61. data/frameworks/sproutcore/controllers/collection.js +305 -0
  62. data/frameworks/sproutcore/controllers/controller.js +323 -0
  63. data/frameworks/sproutcore/controllers/object.js +372 -0
  64. data/frameworks/sproutcore/drag/drag.js +549 -0
  65. data/frameworks/sproutcore/drag/drag_data_source.js +32 -0
  66. data/frameworks/sproutcore/drag/drag_source.js +64 -0
  67. data/frameworks/sproutcore/drag/drop_target.js +153 -0
  68. data/frameworks/sproutcore/english.lproj/blank.gif +0 -0
  69. data/frameworks/sproutcore/english.lproj/buttons.css +589 -0
  70. data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
  71. data/frameworks/sproutcore/english.lproj/inline_text_editor.css +21 -0
  72. data/frameworks/sproutcore/english.lproj/menu.css +121 -0
  73. data/frameworks/sproutcore/english.lproj/panels/background-fat.jpg +0 -0
  74. data/frameworks/sproutcore/english.lproj/panels/background-thin.jpg +0 -0
  75. data/frameworks/sproutcore/english.lproj/panels/bottom-edge.png +0 -0
  76. data/frameworks/sproutcore/english.lproj/panels/bottom-left-corner.png +0 -0
  77. data/frameworks/sproutcore/english.lproj/panels/bottom-right-corner.png +0 -0
  78. data/frameworks/sproutcore/english.lproj/panels/left-edge.png +0 -0
  79. data/frameworks/sproutcore/english.lproj/panels/overlay.png +0 -0
  80. data/frameworks/sproutcore/english.lproj/panels/right-edge.png +0 -0
  81. data/frameworks/sproutcore/english.lproj/panels/top-edge.png +0 -0
  82. data/frameworks/sproutcore/english.lproj/panels/top-left-corner.png +0 -0
  83. data/frameworks/sproutcore/english.lproj/panels/top-right-corner.png +0 -0
  84. data/frameworks/sproutcore/english.lproj/panes.css +155 -0
  85. data/frameworks/sproutcore/english.lproj/picker.css +22 -0
  86. data/frameworks/sproutcore/english.lproj/strings.js +15 -0
  87. data/frameworks/sproutcore/english.lproj/tab.css +23 -0
  88. data/frameworks/sproutcore/english.lproj/tests.css +67 -0
  89. data/frameworks/sproutcore/english.lproj/theme.css +77 -0
  90. data/frameworks/sproutcore/foundation/animator.js +670 -0
  91. data/frameworks/sproutcore/foundation/application.js +199 -0
  92. data/frameworks/sproutcore/foundation/array.js +348 -0
  93. data/frameworks/sproutcore/foundation/benchmark.js +211 -0
  94. data/frameworks/sproutcore/foundation/binding.js +384 -0
  95. data/frameworks/sproutcore/foundation/date.js +357 -0
  96. data/frameworks/sproutcore/foundation/error.js +39 -0
  97. data/frameworks/sproutcore/foundation/input_manager.js +153 -0
  98. data/frameworks/sproutcore/foundation/json.js +296 -0
  99. data/frameworks/sproutcore/foundation/mock.js +42 -0
  100. data/frameworks/sproutcore/foundation/node_descriptor.js +56 -0
  101. data/frameworks/sproutcore/foundation/object.js +777 -0
  102. data/frameworks/sproutcore/foundation/observable.js +451 -0
  103. data/frameworks/sproutcore/foundation/page.js +63 -0
  104. data/frameworks/sproutcore/foundation/path_module.js +413 -0
  105. data/frameworks/sproutcore/foundation/responder.js +310 -0
  106. data/frameworks/sproutcore/foundation/routes.js +371 -0
  107. data/frameworks/sproutcore/foundation/run_loop.js +21 -0
  108. data/frameworks/sproutcore/foundation/server.js +491 -0
  109. data/frameworks/sproutcore/foundation/set.js +96 -0
  110. data/frameworks/sproutcore/foundation/string.js +149 -0
  111. data/frameworks/sproutcore/foundation/undo_manager.js +186 -0
  112. data/frameworks/sproutcore/foundation/unittest.js +622 -0
  113. data/frameworks/sproutcore/foundation/utils.js +61 -0
  114. data/frameworks/sproutcore/globals/panels.js +182 -0
  115. data/frameworks/sproutcore/globals/popups.js +60 -0
  116. data/frameworks/sproutcore/globals/window.js +381 -0
  117. data/frameworks/sproutcore/lib/index.rhtml +66 -0
  118. data/frameworks/sproutcore/models/collection.js +395 -0
  119. data/frameworks/sproutcore/models/record.js +622 -0
  120. data/frameworks/sproutcore/models/store.js +295 -0
  121. data/frameworks/sproutcore/panes/dialog.js +16 -0
  122. data/frameworks/sproutcore/panes/manager.js +164 -0
  123. data/frameworks/sproutcore/panes/menu.js +45 -0
  124. data/frameworks/sproutcore/panes/overlay.js +231 -0
  125. data/frameworks/sproutcore/panes/pane.js +90 -0
  126. data/frameworks/sproutcore/panes/panel.js +19 -0
  127. data/frameworks/sproutcore/panes/picker.js +45 -0
  128. data/frameworks/sproutcore/tests/controllers/array.rhtml +86 -0
  129. data/frameworks/sproutcore/tests/controllers/controller.rhtml +273 -0
  130. data/frameworks/sproutcore/tests/controllers/object.rhtml +327 -0
  131. data/frameworks/sproutcore/tests/foundation/application.rhtml +125 -0
  132. data/frameworks/sproutcore/tests/foundation/array.rhtml +221 -0
  133. data/frameworks/sproutcore/tests/foundation/object.rhtml +69 -0
  134. data/frameworks/sproutcore/tests/globals/window.rhtml +45 -0
  135. data/frameworks/sproutcore/tests/panes/pane.rhtml +88 -0
  136. data/frameworks/sproutcore/tests/views/collection.rhtml +137 -0
  137. data/frameworks/sproutcore/tests/views/popup_button.rhtml +115 -0
  138. data/frameworks/sproutcore/tests/views/text_field.rhtml +37 -0
  139. data/frameworks/sproutcore/validators/credit_card.js +92 -0
  140. data/frameworks/sproutcore/validators/date.js +36 -0
  141. data/frameworks/sproutcore/validators/email.js +29 -0
  142. data/frameworks/sproutcore/validators/not_empty.js +24 -0
  143. data/frameworks/sproutcore/validators/number.js +55 -0
  144. data/frameworks/sproutcore/validators/password.js +78 -0
  145. data/frameworks/sproutcore/validators/validator.js +304 -0
  146. data/frameworks/sproutcore/views/button.js +425 -0
  147. data/frameworks/sproutcore/views/checkbox_field.js +30 -0
  148. data/frameworks/sproutcore/views/collection.js +1521 -0
  149. data/frameworks/sproutcore/views/container.js +62 -0
  150. data/frameworks/sproutcore/views/error_explanation.js +45 -0
  151. data/frameworks/sproutcore/views/field.js +214 -0
  152. data/frameworks/sproutcore/views/filter_button.js +29 -0
  153. data/frameworks/sproutcore/views/form.js +591 -0
  154. data/frameworks/sproutcore/views/image.js +141 -0
  155. data/frameworks/sproutcore/views/inline_text_editor.js +96 -0
  156. data/frameworks/sproutcore/views/label.js +176 -0
  157. data/frameworks/sproutcore/views/menu_item.js +90 -0
  158. data/frameworks/sproutcore/views/pagination.js +54 -0
  159. data/frameworks/sproutcore/views/popup_button.js +86 -0
  160. data/frameworks/sproutcore/views/popup_menu.js +137 -0
  161. data/frameworks/sproutcore/views/progress.js +100 -0
  162. data/frameworks/sproutcore/views/radio_field.js +107 -0
  163. data/frameworks/sproutcore/views/radio_group.js +48 -0
  164. data/frameworks/sproutcore/views/segmented.js +80 -0
  165. data/frameworks/sproutcore/views/select_field.js +272 -0
  166. data/frameworks/sproutcore/views/spinner.js +11 -0
  167. data/frameworks/sproutcore/views/tab.js +126 -0
  168. data/frameworks/sproutcore/views/text_field.js +179 -0
  169. data/frameworks/sproutcore/views/textarea_field.js +14 -0
  170. data/frameworks/sproutcore/views/toolbar.js +29 -0
  171. data/frameworks/sproutcore/views/view.js +1389 -0
  172. data/frameworks/sproutcore/views/workspace.js +170 -0
  173. data/generators/client/README +3 -0
  174. data/generators/client/USAGE +12 -0
  175. data/generators/client/client_generator.rb +53 -0
  176. data/generators/client/templates/core.js +19 -0
  177. data/generators/client/templates/english.lproj/body.css +0 -0
  178. data/generators/client/templates/english.lproj/body.rhtml +3 -0
  179. data/generators/client/templates/english.lproj/controls.css +0 -0
  180. data/generators/client/templates/english.lproj/strings.js +14 -0
  181. data/generators/client/templates/main.js +37 -0
  182. data/generators/controller/USAGE +16 -0
  183. data/generators/controller/controller_generator.rb +51 -0
  184. data/generators/controller/templates/controller.js +21 -0
  185. data/generators/controller/templates/test.rhtml +21 -0
  186. data/generators/framework/README +7 -0
  187. data/generators/framework/USAGE +12 -0
  188. data/generators/framework/framework_generator.rb +53 -0
  189. data/generators/framework/templates/core.js +20 -0
  190. data/generators/framework/templates/english.lproj/body.css +0 -0
  191. data/generators/framework/templates/english.lproj/body.rhtml +3 -0
  192. data/generators/framework/templates/english.lproj/controls.css +0 -0
  193. data/generators/framework/templates/english.lproj/strings.js +14 -0
  194. data/generators/language/USAGE +16 -0
  195. data/generators/language/language_generator.rb +47 -0
  196. data/generators/language/templates/strings.js +10 -0
  197. data/generators/model/USAGE +24 -0
  198. data/generators/model/model_generator.rb +55 -0
  199. data/generators/model/templates/fixture.js +11 -0
  200. data/generators/model/templates/model.js +20 -0
  201. data/generators/model/templates/test.rhtml +21 -0
  202. data/generators/test/USAGE +16 -0
  203. data/generators/test/templates/test.rhtml +21 -0
  204. data/generators/test/test_generator.rb +47 -0
  205. data/generators/view/USAGE +16 -0
  206. data/generators/view/templates/test.rhtml +21 -0
  207. data/generators/view/templates/view.js +20 -0
  208. data/generators/view/view_generator.rb +51 -0
  209. data/jsdoc/README.txt +119 -0
  210. data/jsdoc/app/DocFile.js +137 -0
  211. data/jsdoc/app/DocTag.js +110 -0
  212. data/jsdoc/app/Doclet.js +63 -0
  213. data/jsdoc/app/Dumper.js +143 -0
  214. data/jsdoc/app/JsDoc.js +103 -0
  215. data/jsdoc/app/JsHilite.js +45 -0
  216. data/jsdoc/app/JsIO.js +163 -0
  217. data/jsdoc/app/JsParse.js +385 -0
  218. data/jsdoc/app/JsPlate.js +130 -0
  219. data/jsdoc/app/JsTestrun.js +129 -0
  220. data/jsdoc/app/JsToke.js +564 -0
  221. data/jsdoc/app/Symbol.js +298 -0
  222. data/jsdoc/app/Transformer.js +14 -0
  223. data/jsdoc/app/Util.js +97 -0
  224. data/jsdoc/app/js.jar +0 -0
  225. data/jsdoc/app/run.js +144 -0
  226. data/jsdoc/plugins/min.js +316 -0
  227. data/jsdoc/plugins/strip.js +20 -0
  228. data/jsdoc/templates/sproutcore/class.tmpl +438 -0
  229. data/jsdoc/templates/sproutcore/default.css +241 -0
  230. data/jsdoc/templates/sproutcore/index.html +13 -0
  231. data/jsdoc/templates/sproutcore/index.tmpl +21 -0
  232. data/jsdoc/templates/sproutcore/prototype.js +4186 -0
  233. data/jsdoc/templates/sproutcore/publish.js +236 -0
  234. data/jsdoc/templates/sproutcore/splash.html +7 -0
  235. data/lib/sproutcore/build_tools/html_builder.rb +88 -0
  236. data/lib/sproutcore/build_tools/resource_builder.rb +194 -0
  237. data/lib/sproutcore/build_tools.rb +44 -0
  238. data/lib/sproutcore/bundle.rb +517 -0
  239. data/lib/sproutcore/bundle_manifest.rb +397 -0
  240. data/lib/sproutcore/generator_helper.rb +170 -0
  241. data/lib/sproutcore/helpers/capture_helper.rb +42 -0
  242. data/lib/sproutcore/helpers/static_helper.rb +80 -0
  243. data/lib/sproutcore/helpers/tag_helper.rb +110 -0
  244. data/lib/sproutcore/helpers/text_helper.rb +336 -0
  245. data/lib/sproutcore/helpers.rb +3 -0
  246. data/lib/sproutcore/jsdoc.rb +40 -0
  247. data/lib/sproutcore/jsmin.rb +247 -0
  248. data/lib/sproutcore/library.rb +258 -0
  249. data/lib/sproutcore/merb/bundle_controller.rb +179 -0
  250. data/lib/sproutcore/merb/router.rb +43 -0
  251. data/lib/sproutcore/merb.rb +27 -0
  252. data/lib/sproutcore/version.rb +9 -0
  253. data/lib/sproutcore/view_helpers/button_views.rb +302 -0
  254. data/lib/sproutcore/view_helpers/core_views.rb +284 -0
  255. data/lib/sproutcore/view_helpers/form_views.rb +258 -0
  256. data/lib/sproutcore/view_helpers/menu_views.rb +94 -0
  257. data/lib/sproutcore/view_helpers.rb +628 -0
  258. data/lib/sproutcore.rb +30 -0
  259. data/script/destroy +14 -0
  260. data/script/generate +14 -0
  261. data/script/txt2html +74 -0
  262. data/setup.rb +1585 -0
  263. data/spec/spec.opts +1 -0
  264. data/spec/spec_helper.rb +7 -0
  265. data/spec/sproutcore_spec.rb +11 -0
  266. data/tasks/deployment.rake +34 -0
  267. data/tasks/environment.rake +7 -0
  268. data/tasks/rspec.rake +21 -0
  269. data/tasks/website.rake +17 -0
  270. metadata +365 -0
@@ -0,0 +1,62 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('views/view') ;
7
+
8
+ /**
9
+ @class
10
+
11
+ A container view will place the view of its content property inside
12
+ of itself as its only child. You can override this with a custom
13
+ replaceContent() method if you want to do something different when the
14
+ content changes.
15
+
16
+ @extends SC.View
17
+
18
+ */
19
+ SC.ContainerView = SC.View.extend(
20
+ /** @scope SC.ContainerView.prototype */
21
+ {
22
+
23
+ /** change this property value to replace the content of the container.
24
+ @type SC.View
25
+ */
26
+ content: null,
27
+
28
+ /** @private */
29
+ contentBindingDefault: SC.Binding.Single,
30
+
31
+ /**
32
+ define an outlet named rootView to use that view as the container.
33
+
34
+ Normally container view will set its own child views to the content you
35
+ set. Instead, you can set the rootView property to point to a child view
36
+ of the container and the child views in that view will be changed instead.
37
+
38
+ @type SC.View
39
+ */
40
+ rootView: null,
41
+
42
+ /**
43
+ Replaces any child views with the passed new content.
44
+
45
+ This method is automatically called whenever your content property
46
+ changes. You can override it if you want to provide some behavior other
47
+ than the default.
48
+
49
+ @param {SC.View} newContent the new content view or null.
50
+ */
51
+ replaceContent: function(newContent) {
52
+ var containerView = this.get('rootView') || this ;
53
+ containerView.clear() ;
54
+ var newView = newContent ;
55
+ if (newView) containerView.appendChild(newView) ;
56
+ },
57
+
58
+ _contentObserver: function() {
59
+ this.replaceContent(this.get('content'));
60
+ }.observes('content')
61
+
62
+ }) ;
@@ -0,0 +1,45 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('views/label');
7
+
8
+ // The ErrorExplanation view is a special type of label view that can display
9
+ // one or more errors related to a form or field. This view will set itself
10
+ // to visible only if it has errors.
11
+ SC.ErrorExplanationView = SC.LabelView.extend({
12
+
13
+ emptyElement: '<ul class="errors"></ul>',
14
+ explanationTemplate: '<li>%@</li>',
15
+
16
+ _errorsFor: function(errors) {
17
+ if (!errors || errors.length == 0) return [] ;
18
+ return errors.map(function(er) {
19
+ return ($type(er) == T_ERROR) ? er : null ;
20
+ }).compact() ;
21
+ },
22
+
23
+ contentBindingDefault: SC.Binding.Multiple,
24
+ formatter: function(errors, view) {
25
+ errors = view._errorsFor(errors) ;
26
+ if (!errors || errors.length == 0) return '' ;
27
+ return errors.map(function(er) {
28
+ er = er.get('description') ;
29
+ if (er.escapeHTML) er = er.escapeHTML() ;
30
+ return view.explanationTemplate.fmt(er);
31
+ }).join("") ;
32
+ },
33
+ escapeHTML: false,
34
+
35
+ _contentVisibleObserver: function() {
36
+ var errors = this._errorsFor(this.get('content')) ;
37
+ var isVisible = errors && errors.length > 0 ;
38
+ if (this.get('isVisible') != isVisible) this.set('isVisible',isVisible);
39
+ }.observes('content'),
40
+
41
+ init: function() {
42
+ arguments.callee.base.apply(this,arguments) ;
43
+ this._contentVisibleObserver() ;
44
+ }
45
+ });
@@ -0,0 +1,214 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('views/view') ;
7
+
8
+ // This is the generic base class for input-type views such as text fields,
9
+ // checkboxes, etc. You can extend this for your own purposes as well.
10
+ SC.FieldView = SC.View.extend({
11
+
12
+ // PUBLIC PROPERTIES
13
+ // You generally do not need to override these properties though you might
14
+ // change them....
15
+
16
+ // this is the value of the field. The form view will pick up whatever
17
+ // value is published here. Generally you do not need to override this
18
+ // method. Instead you should override setFieldValue(), getFieldValue()
19
+ // and the error property.
20
+ value: null,
21
+
22
+ // set to true to enable editing on the field.
23
+ isEnabled: true,
24
+
25
+ // points to the validator for this field. Set to a validator class or
26
+ // instance. If this points to a class, it will be instantiated when the
27
+ // validator is first used.
28
+ validator: null,
29
+
30
+ // this should be set to the name of the key you want to be published for
31
+ // the owner form.
32
+ fieldKey: null,
33
+
34
+ // this should be set to the human readable label you want shown for errors.
35
+ // defaults to the value of fieldKey.
36
+ fieldLabel: null,
37
+
38
+ // computed property returns the human readable label for this field for
39
+ // use in error strings. This is either the fieldLabel or a humanized
40
+ // form of the fieldKey.
41
+ errorLabel: function() {
42
+ var ret = this.get('fieldLabel') ;
43
+ if (ret) return ret ;
44
+
45
+ // if field label is not provided, compute something...
46
+ var fk = this.get('fieldKey') ;
47
+ var def = (fk || '').humanize().capitalize() ;
48
+ return "FieldKey.%@".fmt(fk).locWithDefault(def) ; // localize if poss.
49
+ }.property('fieldLabel','fieldKey'),
50
+
51
+ // computed property, true when error is null.
52
+ isValid: function() {
53
+ return $type(this.get('value')) != T_ERROR;
54
+ }.property('value'),
55
+
56
+ // this is the raw value of the field, ignoring validation. You generally
57
+ // should not override this. Instead override setFieldValue and
58
+ // getFieldValue.
59
+ fieldValue: function(key,value) {
60
+ if (value !== undefined) this._setFieldValue(value) ;
61
+ return this._getFieldValue() ;
62
+ }.property('value'),
63
+
64
+ // ACTIONS
65
+ // You generally do not need to override these but they may be used.
66
+
67
+ // This is called to perform validation on the field just before the form
68
+ // is submitted. If you have a validator attached, this will get the
69
+ // validators.
70
+ validateSubmit: function() {
71
+ var ret = true ;
72
+ var value ;
73
+
74
+ if (this._validator) {
75
+ ret = this._validator.validateSubmit(this.get('ownerForm'),this) ;
76
+ value = ($type(ret) == T_ERROR) ? ret : this._getFieldValue() ;
77
+ } else value = this._getFieldValue() ;
78
+
79
+ if (value != this.get('value')) this.set('value',value) ;
80
+ return ret ;
81
+ },
82
+
83
+ // OVERRIDE IN YOUR SUBCLASS
84
+ // Override these primitives in your subclass as required.
85
+
86
+ // the two primitives below can be overridden by subclasses to translate
87
+ // the FieldView value to an element value and visa-versa.
88
+ setFieldValue: function(newValue) {
89
+ if (this.rootElement.value != newValue) this.rootElement.value = newValue;
90
+ },
91
+
92
+ getFieldValue: function() {
93
+ return this.rootElement.value;
94
+ },
95
+
96
+ // This method should be called by you subclass anytime you want the view to
97
+ // pick up the current value from the form and post it out.
98
+ //
99
+ // partial (opt): default false. If true, this will be validated as a
100
+ // partial. Otherwise validated as a change.
101
+ //
102
+ fieldValueDidChange: function(partialChange) {
103
+ var ret = true ;
104
+
105
+ if (this._validator) {
106
+ var form = this.get('ownerForm') ;
107
+ if (partialChange == true) {
108
+ ret = this._validator.validatePartial(form,this) ;
109
+
110
+ // if the partial returned NO_CHANGE, then check to see if the
111
+ // field is valid anyway. If it is not valid, then don't update the
112
+ // value. This way the user can have partially constructed values
113
+ // without the validator trying to convert it to an object.
114
+ if (ret == SC.Validator.NO_CHANGE) {
115
+ if (this._validator.validateChange(form, this) != SC.Validator.OK) {
116
+ return ret ; // EXIT POINT
117
+ }
118
+ }
119
+ } else {
120
+ ret = this._validator.validateChange(form, this) ;
121
+
122
+ }
123
+ }
124
+
125
+ // get the field value and set it.
126
+ // if ret is an error, use that instead of the field value.
127
+ var value = ($type(ret) == T_ERROR) ? ret : this._getFieldValue() ;
128
+ if (value != this.get('value')) this.set('value',value) ;
129
+
130
+ // if the validator says everything is OK, then in addition to posting
131
+ // out the value, go ahead and pass the value back through itself.
132
+ // This way if you have a formatter applied, it will reformat.
133
+ if (!partialChange && ($type(ret) != T_ERROR)) {
134
+ this._setFieldValue(value) ;
135
+ }
136
+
137
+ return ret ;
138
+ },
139
+
140
+ // override to enable editing of this field.
141
+ enableField: function() {
142
+ Form.Element.enable(this.rootElement) ;
143
+ },
144
+
145
+ // override to disable editing of this field.
146
+ disableField: function() {
147
+ Form.Element.disable(this.rootElement) ;
148
+ },
149
+
150
+
151
+ // PRIVATE SUPPORT METHODS
152
+ //
153
+
154
+ init: function() {
155
+ arguments.callee.base.call(this) ;
156
+ this._validatorObserver() ;
157
+ this._enabledObserver() ;
158
+ if (this.rootElement) this._setFieldValue(this.get('value')) ;
159
+ },
160
+
161
+
162
+ // add a class name when the valid state changes.
163
+ _validObserver: function() {
164
+ this.setClassName('invalid',!this.get('isValid')) ;
165
+ }.observes('isValid'),
166
+
167
+ // called whenever isEnabled changes.
168
+ _enabledObserver: function(target, key, isEnabled) {
169
+ isEnabled = this.get('isEnabled') ;
170
+ this.setClassName('disabled', !isEnabled) ;
171
+ (isEnabled) ? this.enableField() : this.disableField();
172
+ }.observes('isEnabled'),
173
+
174
+ // called whenever the value is set on the object. Will set the value
175
+ // on the field if the value is changed.
176
+ _valueObserver: function() {
177
+ var value = this.get('value') ;
178
+ var isError = $type(value) == T_ERROR ;
179
+ if (!isError && (value != this._getFieldValue())) {
180
+ this._setFieldValue(value) ;
181
+ }
182
+ }.observes('value'),
183
+
184
+ // invoked whenever the attached validator changes.
185
+ _validatorObserver: function() {
186
+ var form = this.get('ownerForm') ;
187
+ var val = SC.Validator.findFor(form, this, this.get('validator')) ;
188
+ if (val != this._validator) {
189
+ if (this._validator) this._validator.detachFrom(form, this) ;
190
+ this._validator = val;
191
+ if (this._validator) this._validator.attachTo(form, this) ;
192
+ }
193
+ }.observes('validator', 'ownerForm'),
194
+
195
+ // these methods use the validator to conver the raw field value returned
196
+ // by your subclass into an object and visa versa.
197
+ _setFieldValue: function(newValue) {
198
+ if (this._validator) {
199
+ newValue = this._validator.fieldValueForObject(newValue, this.get('ownerForm'), this) ;
200
+ }
201
+ return this.setFieldValue(newValue) ;
202
+ },
203
+
204
+ _getFieldValue: function() {
205
+ var val = this.getFieldValue() ;
206
+ if (this._validator) {
207
+ val = this._validator.objectForFieldValue(val, this.get('ownerForm'), this) ;
208
+ }
209
+ return val ;
210
+ }
211
+
212
+ }) ;
213
+
214
+
@@ -0,0 +1,29 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('views/button') ;
7
+
8
+ // A filter button sets a filter property to whatever you specifiy. It
9
+ // also binds to the same property and updates its isSelected state based
10
+ // on that.
11
+ SC.FilterButtonView = SC.ButtonView.extend({
12
+
13
+ filterValue: null, // relay to this property.
14
+
15
+ filterOn: null, // when this filter toggle on, it will go to this.
16
+ filterOff: null, // when this filter toggles off, it goes to this.
17
+
18
+ action: function() {
19
+ var val = this.get('filterValue') ;
20
+ val = (val == this.get('filterOn')) ? this.get('filterOff') : this.get('filterOn') ;
21
+ this.set('filterValue',val) ;
22
+ },
23
+
24
+ filterValueObserver: function() {
25
+ var sel = this.get('filterValue') == this.get('filterOn') ;
26
+ if (sel != this.get('isSelected')) this.set('isSelected',sel) ;
27
+ }.observes('filterValue')
28
+
29
+ });