sproutcore 0.9.1 → 0.9.2

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 (208) hide show
  1. data/History.txt +233 -0
  2. data/Manifest.txt +67 -34
  3. data/bin/sc-build +12 -1
  4. data/bin/sc-gen +1 -1
  5. data/bin/sproutcore +14 -0
  6. data/clients/sc_docs/controllers/docs.js +38 -8
  7. data/clients/sc_docs/english.lproj/body.css +80 -127
  8. data/clients/sc_docs/english.lproj/body.rhtml +43 -23
  9. data/clients/sc_docs/english.lproj/no_docs.rhtml +2 -1
  10. data/clients/sc_docs/english.lproj/tabs.rhtml +16 -0
  11. data/clients/sc_docs/main.js +14 -9
  12. data/clients/sc_docs/models/doc.js +1 -1
  13. data/clients/sc_docs/tests/controllers/docs.rhtml +1 -2
  14. data/clients/sc_docs/tests/models/doc.rhtml +1 -2
  15. data/clients/sc_docs/tests/views/doc_frame.rhtml +1 -2
  16. data/clients/sc_docs/tests/views/doc_label_view.rhtml +1 -2
  17. data/clients/sc_docs/views/doc_frame.js +1 -1
  18. data/clients/sc_test_runner/controllers/runner.js +31 -8
  19. data/clients/sc_test_runner/english.lproj/body.css +62 -122
  20. data/clients/sc_test_runner/english.lproj/body.rhtml +62 -26
  21. data/clients/sc_test_runner/main.js +1 -6
  22. data/clients/sc_test_runner/models/test.js +14 -1
  23. data/clients/sc_test_runner/views/runner_frame.js +4 -2
  24. data/clients/view_builder/builders/builder.js +339 -0
  25. data/clients/view_builder/builders/button.js +81 -0
  26. data/clients/view_builder/controllers/document.js +21 -0
  27. data/clients/view_builder/core.js +19 -0
  28. data/clients/view_builder/english.lproj/body.css +77 -0
  29. data/clients/view_builder/english.lproj/body.rhtml +41 -0
  30. data/clients/{sc_docs → view_builder}/english.lproj/controls.css +0 -0
  31. data/clients/view_builder/english.lproj/strings.js +14 -0
  32. data/clients/view_builder/main.js +38 -0
  33. data/clients/view_builder/tests/controllers/document.rhtml +20 -0
  34. data/clients/view_builder/tests/views/builder.rhtml +20 -0
  35. data/clients/view_builder/views/builder.js +23 -0
  36. data/frameworks/prototype/prototype.js +1 -1
  37. data/frameworks/sproutcore/Core.js +32 -7
  38. data/frameworks/sproutcore/README +1 -1
  39. data/frameworks/sproutcore/animation/animation.js +411 -0
  40. data/frameworks/sproutcore/controllers/array.js +17 -9
  41. data/frameworks/sproutcore/controllers/collection.js +9 -110
  42. data/frameworks/sproutcore/controllers/controller.js +1 -1
  43. data/frameworks/sproutcore/controllers/object.js +2 -1
  44. data/frameworks/sproutcore/drag/drag.js +267 -56
  45. data/frameworks/sproutcore/drag/drag_data_source.js +24 -16
  46. data/frameworks/sproutcore/drag/drag_source.js +53 -42
  47. data/frameworks/sproutcore/drag/drop_target.js +2 -2
  48. data/frameworks/sproutcore/english.lproj/buttons.css +337 -236
  49. data/frameworks/sproutcore/english.lproj/core.css +115 -0
  50. data/frameworks/sproutcore/english.lproj/icons.css +227 -0
  51. data/{clients/sc_docs → frameworks/sproutcore}/english.lproj/images/indicator.gif +0 -0
  52. data/frameworks/sproutcore/english.lproj/images/sc-theme-sprite.png +0 -0
  53. data/frameworks/sproutcore/english.lproj/images/sc-theme-ysprite.png +0 -0
  54. data/frameworks/sproutcore/english.lproj/images/shared-icons.png +0 -0
  55. data/frameworks/sproutcore/english.lproj/menu.css +1 -1
  56. data/frameworks/sproutcore/english.lproj/strings.js +1 -1
  57. data/frameworks/sproutcore/english.lproj/theme.css +405 -31
  58. data/frameworks/sproutcore/foundation/application.js +15 -11
  59. data/frameworks/sproutcore/foundation/benchmark.js +1 -1
  60. data/frameworks/sproutcore/foundation/binding.js +2 -2
  61. data/frameworks/sproutcore/foundation/date.js +1 -1
  62. data/frameworks/sproutcore/foundation/error.js +1 -1
  63. data/frameworks/sproutcore/foundation/input_manager.js +32 -21
  64. data/frameworks/sproutcore/foundation/mock.js +1 -1
  65. data/frameworks/sproutcore/foundation/node_descriptor.js +9 -6
  66. data/frameworks/sproutcore/foundation/object.js +249 -177
  67. data/frameworks/sproutcore/foundation/page.js +5 -2
  68. data/frameworks/sproutcore/foundation/path_module.js +11 -10
  69. data/frameworks/sproutcore/foundation/responder.js +5 -2
  70. data/frameworks/sproutcore/foundation/routes.js +17 -13
  71. data/frameworks/sproutcore/foundation/run_loop.js +249 -11
  72. data/frameworks/sproutcore/foundation/server.js +1 -1
  73. data/frameworks/sproutcore/foundation/set.js +3 -3
  74. data/frameworks/sproutcore/foundation/string.js +5 -3
  75. data/frameworks/sproutcore/foundation/timer.js +371 -0
  76. data/frameworks/sproutcore/foundation/undo_manager.js +1 -1
  77. data/frameworks/sproutcore/foundation/unittest.js +3 -3
  78. data/frameworks/sproutcore/foundation/utils.js +161 -2
  79. data/frameworks/sproutcore/globals/panels.js +1 -1
  80. data/frameworks/sproutcore/globals/popups.js +4 -3
  81. data/frameworks/sproutcore/globals/window.js +44 -4
  82. data/frameworks/sproutcore/lib/button_views.rb +328 -0
  83. data/frameworks/sproutcore/lib/collection_view.rb +80 -0
  84. data/frameworks/sproutcore/lib/core_views.rb +281 -0
  85. data/frameworks/sproutcore/lib/form_views.rb +253 -0
  86. data/frameworks/sproutcore/lib/index.rhtml +2 -0
  87. data/frameworks/sproutcore/lib/menu_views.rb +88 -0
  88. data/frameworks/sproutcore/{foundation → mixins}/array.js +60 -29
  89. data/frameworks/sproutcore/mixins/control.js +265 -0
  90. data/frameworks/sproutcore/mixins/delegate_support.js +66 -0
  91. data/frameworks/sproutcore/{foundation → mixins}/observable.js +176 -6
  92. data/frameworks/sproutcore/mixins/scrollable.js +245 -0
  93. data/frameworks/sproutcore/mixins/selection_support.js +148 -0
  94. data/frameworks/sproutcore/mixins/validatable.js +152 -0
  95. data/frameworks/sproutcore/models/collection.js +5 -5
  96. data/frameworks/sproutcore/models/record.js +1 -1
  97. data/frameworks/sproutcore/models/store.js +1 -1
  98. data/frameworks/sproutcore/panes/dialog.js +1 -1
  99. data/frameworks/sproutcore/panes/manager.js +1 -1
  100. data/frameworks/sproutcore/panes/menu.js +1 -1
  101. data/frameworks/sproutcore/panes/overlay.js +2 -2
  102. data/frameworks/sproutcore/panes/panel.js +1 -1
  103. data/frameworks/sproutcore/panes/picker.js +1 -1
  104. data/frameworks/sproutcore/tests/controllers/array.rhtml +44 -4
  105. data/frameworks/sproutcore/tests/foundation/timer/invalidate.rhtml +33 -0
  106. data/frameworks/sproutcore/tests/foundation/timer/invokeLater.rhtml +145 -0
  107. data/frameworks/sproutcore/tests/foundation/timer/isPaused.rhtml +70 -0
  108. data/frameworks/sproutcore/tests/foundation/timer/schedule.rhtml +145 -0
  109. data/frameworks/sproutcore/tests/views/{scroll.rhtml → checkbox.rhtml} +3 -3
  110. data/frameworks/sproutcore/tests/views/{collection.rhtml → collection/base.rhtml} +33 -32
  111. data/frameworks/sproutcore/tests/views/collection/incremental_rendering.rhtml +260 -0
  112. data/frameworks/sproutcore/tests/views/image_cell.rhtml +19 -0
  113. data/frameworks/sproutcore/tests/views/label_item.rhtml +2 -4
  114. data/frameworks/sproutcore/tests/views/list.rhtml +2 -3
  115. data/frameworks/sproutcore/tests/views/list_item.rhtml +20 -0
  116. data/frameworks/sproutcore/tests/views/slider.rhtml +20 -0
  117. data/frameworks/sproutcore/tests/views/text_cell.rhtml +19 -0
  118. data/frameworks/sproutcore/tests/views/view/clippingFrame.rhtml +395 -0
  119. data/frameworks/sproutcore/tests/views/view/frame.rhtml +353 -0
  120. data/frameworks/sproutcore/tests/views/view/innerFrame.rhtml +347 -0
  121. data/frameworks/sproutcore/tests/views/view/isVisibleInWindow.rhtml +148 -0
  122. data/frameworks/sproutcore/tests/views/view/scrollFrame.rhtml +468 -0
  123. data/frameworks/sproutcore/validators/credit_card.js +33 -13
  124. data/frameworks/sproutcore/validators/date.js +26 -6
  125. data/frameworks/sproutcore/validators/email.js +21 -3
  126. data/frameworks/sproutcore/validators/not_empty.js +11 -1
  127. data/frameworks/sproutcore/validators/number.js +18 -4
  128. data/frameworks/sproutcore/validators/password.js +12 -1
  129. data/frameworks/sproutcore/validators/validator.js +204 -194
  130. data/frameworks/sproutcore/views/{button.js → button/button.js} +96 -94
  131. data/frameworks/sproutcore/views/button/checkbox.js +29 -0
  132. data/frameworks/sproutcore/views/button/disclosure.js +42 -0
  133. data/frameworks/sproutcore/views/button/radio.js +29 -0
  134. data/frameworks/sproutcore/views/{collection.js → collection/collection.js} +1373 -1024
  135. data/frameworks/sproutcore/views/collection/grid.js +124 -46
  136. data/frameworks/sproutcore/views/collection/image_cell.js +17 -46
  137. data/frameworks/sproutcore/views/collection/list.js +45 -35
  138. data/frameworks/sproutcore/views/collection/source_list.js +386 -0
  139. data/frameworks/sproutcore/views/collection/table.js +118 -0
  140. data/frameworks/sproutcore/views/container.js +7 -2
  141. data/frameworks/sproutcore/views/error_explanation.js +23 -10
  142. data/frameworks/sproutcore/views/{checkbox_field.js → field/checkbox_field.js} +16 -6
  143. data/frameworks/sproutcore/views/field/field.js +219 -0
  144. data/frameworks/sproutcore/views/{radio_field.js → field/radio_field.js} +27 -12
  145. data/frameworks/sproutcore/views/{select_field.js → field/select_field.js} +116 -90
  146. data/frameworks/sproutcore/views/{text_field.js → field/text_field.js} +57 -8
  147. data/frameworks/sproutcore/views/{textarea_field.js → field/textarea_field.js} +13 -3
  148. data/frameworks/sproutcore/views/filter_button.js +2 -2
  149. data/frameworks/sproutcore/views/form.js +3 -3
  150. data/frameworks/sproutcore/views/image.js +128 -21
  151. data/frameworks/sproutcore/views/inline_text_editor.js +1 -1
  152. data/frameworks/sproutcore/views/label.js +149 -92
  153. data/frameworks/sproutcore/views/list_item.js +225 -0
  154. data/frameworks/sproutcore/views/menu_item.js +10 -4
  155. data/frameworks/sproutcore/views/pagination.js +11 -4
  156. data/frameworks/sproutcore/views/popup_button.js +25 -21
  157. data/frameworks/sproutcore/views/popup_menu.js +10 -4
  158. data/frameworks/sproutcore/views/progress.js +29 -16
  159. data/frameworks/sproutcore/views/radio_group.js +1 -1
  160. data/frameworks/sproutcore/views/scroll.js +60 -20
  161. data/frameworks/sproutcore/views/segmented.js +1 -1
  162. data/frameworks/sproutcore/views/slider.js +132 -0
  163. data/frameworks/sproutcore/views/source_list_group.js +130 -0
  164. data/frameworks/sproutcore/views/spinner.js +1 -1
  165. data/frameworks/sproutcore/views/split.js +292 -0
  166. data/frameworks/sproutcore/views/split_divider.js +109 -0
  167. data/frameworks/sproutcore/views/tab.js +1 -1
  168. data/frameworks/sproutcore/views/toolbar.js +1 -1
  169. data/frameworks/sproutcore/views/view.js +1272 -591
  170. data/generators/client/templates/english.lproj/body.css +1 -1
  171. data/generators/controller/controller_generator.rb +1 -1
  172. data/generators/controller/templates/test.rhtml +2 -1
  173. data/generators/model/templates/test.rhtml +1 -1
  174. data/generators/test/templates/test.rhtml +1 -1
  175. data/generators/view/templates/test.rhtml +1 -1
  176. data/jsdoc/templates/sproutcore/class.tmpl +241 -338
  177. data/jsdoc/templates/sproutcore/default.css +105 -155
  178. data/jsdoc/templates/sproutcore/index.tmpl +43 -8
  179. data/jsdoc/templates/sproutcore/publish.js +9 -4
  180. data/lib/sproutcore/build_tools/html_builder.rb +29 -13
  181. data/lib/sproutcore/build_tools/resource_builder.rb +1 -1
  182. data/lib/sproutcore/bundle.rb +86 -25
  183. data/lib/sproutcore/jsdoc.rb +2 -0
  184. data/lib/sproutcore/version.rb +1 -1
  185. data/lib/sproutcore/view_helpers.rb +36 -3
  186. data/tasks/deployment.rake +1 -1
  187. metadata +69 -36
  188. data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
  189. data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
  190. data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
  191. data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
  192. data/clients/sc_docs/english.lproj/warning.rhtml +0 -6
  193. data/clients/sc_test_runner/english.lproj/warning.rhtml +0 -6
  194. data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
  195. data/frameworks/sproutcore/english.lproj/collections.css +0 -82
  196. data/frameworks/sproutcore/english.lproj/images/buttons-sprite.png +0 -0
  197. data/frameworks/sproutcore/views/collection/collection_item.js +0 -36
  198. data/frameworks/sproutcore/views/collection/text_cell.js +0 -128
  199. data/frameworks/sproutcore/views/field.js +0 -214
  200. data/frameworks/sproutcore/views/workspace.js +0 -170
  201. data/generators/client/templates/english.lproj/controls.css +0 -0
  202. data/generators/framework/templates/english.lproj/body.css +0 -0
  203. data/generators/framework/templates/english.lproj/body.rhtml +0 -3
  204. data/generators/framework/templates/english.lproj/controls.css +0 -0
  205. data/lib/sproutcore/view_helpers/button_views.rb +0 -302
  206. data/lib/sproutcore/view_helpers/core_views.rb +0 -292
  207. data/lib/sproutcore/view_helpers/form_views.rb +0 -258
  208. data/lib/sproutcore/view_helpers/menu_views.rb +0 -94
@@ -1,6 +0,0 @@
1
- <% view :warning_panel, :panel => true, :width => 400 do %>
2
- <h1>Client Name Required</h1>
3
- <p style="font-size: 15px;">To access documents for a client, add the client name at the end of the URL preceded by a hash (#). For example, to access the docs for the "contacts" client enter:</p>
4
- <p style="font-size: 15px; text-align: center;"><%= label_view :outlet => true, :tag => 'span', :bind => { :content => 'Docs.docsController.windowLocation' } %><b>#contacts</b></p>
5
- </div>
6
- <% end %>
@@ -1,6 +0,0 @@
1
- <% view :warning_panel, :panel => true, :width => 400 do %>
2
- <h1>Client Name Required</h1>
3
- <p style="font-size: 15px;">To test a client, add the client name at the end of the URL preceded by a hash (#). For example, to run unit tests for the "contacts" client enter:</p>
4
- <p style="font-size: 15px; text-align: center;"><%= label_view :outlet => true, :tag => 'span', :bind => { :content => 'TestRunner.runnerController.windowLocation' } %><b>#contacts</b></p>
5
- </div>
6
- <% end %>
@@ -1,82 +0,0 @@
1
- /* @override http://localhost:4020/static/sproutcore/en/_cache/collections-1205614097.css */
2
-
3
- /* @group Common */
4
-
5
- body {
6
- overflow: hidden;
7
- }
8
-
9
- .collection-item {
10
- cursor: pointer ;
11
- }
12
-
13
- /* @end */
14
-
15
- /* @group List View */
16
-
17
- .sc-theme .sc-collection-view {
18
- background-color: white ;
19
- }
20
-
21
- .sc-theme .list-insertion-point {
22
- border: 1px #4e4977 solid;
23
- position: absolute ;
24
- }
25
-
26
- .sc-theme .list-insertion-point .anchor {
27
- position: absolute ;
28
- width: 7px;
29
- height: 7px;
30
- left: -6px;
31
- top: -4px;
32
- background: static_url('images/buttons-sprite.png') no-repeat 0px -931px;
33
- }
34
-
35
- /* @end */
36
-
37
- /* @group Grid View */
38
-
39
- .sc-theme .grid-insertion-point {
40
- border: 1px #4e4977 solid;
41
- position: absolute ;
42
- }
43
-
44
- .sc-theme .grid-insertion-point .anchor {
45
- position: absolute ;
46
- width: 7px;
47
- height: 7px;
48
- left: -4px;
49
- top: -6px;
50
- background: static_url('images/buttons-sprite.png') no-repeat 0px -931px;
51
- }
52
-
53
- /* @end */
54
-
55
- /* @group Text Cell */
56
-
57
- .sc-theme .collection-item {
58
- text-decoration: none ;
59
- color: #000;
60
- border-top: 1px white solid;
61
- background-color: white ;
62
- }
63
-
64
- .sc-theme .collection-item.text-cell {
65
- display: block ;
66
- padding: 0 6px;
67
- line-height: 22px;
68
- }
69
- .sc-theme .collection-item.sel {
70
- background-color: #ddd;
71
- border-top: 1px solid #eee;
72
- }
73
-
74
- .sc-theme .sc-collection-view.focus .collection-item.sel {
75
- background-color: #40007e;
76
- color: white ;
77
- border-top: 1px solid #84788f;
78
- }
79
-
80
- /* @end */
81
-
82
-
@@ -1,36 +0,0 @@
1
- // ========================================================================
2
- // SproutCore
3
- // copyright 2006-2007 Sprout Systems, Inc.
4
- // ========================================================================
5
-
6
- /**
7
- Apply this mixin to any view class to automatically inherit most of the
8
- basic properties you need to support to act as an item view in a collection.
9
-
10
- In addition to this module, make sure that your view class knows how to
11
- render the object set on the 'content' property.
12
-
13
- This module provides both the properties and reasonable default observers.
14
- You can override them in your own class as well.
15
-
16
- @namespace
17
- */
18
- SC.CollectionItem = {
19
-
20
- /** Set to true when the item is selected. */
21
- isSelected: false,
22
-
23
- /** By default, adds the 'sel' CSS class if selected. */
24
- isSelectedObserver: function() {
25
- this.setClassName('sel', this.get('isSelected')) ;
26
- }.observes('isSelected'),
27
-
28
- /** Set to true when the item is enabled. */
29
- isEnabled: true,
30
-
31
- /** By default, adds the disabled CSS class if disabled. */
32
- isEnabledObserver: function() {
33
- this.setClassName('disabled', !this.get('isEnabled'));
34
- }.observes('isEnabled')
35
-
36
- };
@@ -1,128 +0,0 @@
1
- // ==========================================================================
2
- // SC.TextCellView
3
- // ==========================================================================
4
-
5
- require('views/collection/collection_item') ;
6
-
7
- /** @class
8
-
9
- A Text Cell can display some textual or HTML content based on a content
10
- object. Unlike a label view, a text cell relies on an owner view (usually
11
- a collection view) to handle all of its event management and many of its
12
- drawing properties and functions.
13
-
14
- @extends SC.View
15
- @author AuthorName
16
- @version 0.1
17
- */
18
- SC.TextCellView = SC.View.extend(SC.CollectionItem,
19
- /** @scope SC.TextCellView.prototype */ {
20
-
21
- emptyElement: '<div class="text-cell collection-item"></div>',
22
-
23
- /**
24
- The content object this text item view will display.
25
- */
26
- content: null,
27
-
28
- /**
29
- The owner view of this cell. The TextCell relies on this
30
- view to provide many of its behavioral defaults and for
31
- event handling.
32
- */
33
- owner: null,
34
-
35
- /**
36
- If true, value will be escaped to avoid scripting attacks.
37
-
38
- This is a default value that can be overridden by the
39
- settings on the owner view.
40
- */
41
- escapeHtml: true,
42
-
43
- /**
44
- If true, then the value will be localized.
45
-
46
- This is a default default that can be overidden by the
47
- settings in the owner view.
48
- */
49
- localize: false,
50
-
51
- /**
52
- Set this to a validator or to a function and the value
53
- will be passed through it before being set.
54
-
55
- This is a default default that can be overidden by the
56
- settings in the owner view.
57
- */
58
- formatter: null,
59
-
60
- displayProperty: null,
61
-
62
- // invoked whenever the content object changes.
63
- _contentObserver: function() {
64
- var content = this.get('content') ;
65
- if (this._content == content) return ;
66
- var f = this._boundValueDidChange() ;
67
-
68
- // stop observing the old display property, if there is one.
69
- if (this._content && this._displayProperty) {
70
- this._content.removeObserver(this._displayProperty, f) ;
71
- }
72
-
73
- // start observing the new display property, if there is one
74
- this._displayProperty = this._getDefault('displayProperty') ;
75
- this._content = content ;
76
- if (this._content && this._displayProperty) {
77
- this._content.addObserver(this._displayProperty, f) ;
78
- }
79
-
80
- // notify value did change
81
- this._valueDidChange() ;
82
- }.observes('content'),
83
-
84
- /**
85
- @private
86
-
87
- Invoked whenever the monitored value on the content object
88
- changes.
89
-
90
- The value processed is either the displayProperty, if set, or
91
- it is the content object itself.
92
- */
93
- _valueDidChange: function() {
94
- var content = this.get('content') ;
95
- var value = (content && this._displayProperty) ? content.get(this._displayProperty) : content;
96
- var owner = this.get('owner') ;
97
-
98
- // prepare the value...
99
-
100
- // 1. apply the formatter
101
- var formatter = this._getDefault('formatter') ;
102
- if (formatter) {
103
- var formattedValue = ($type(formatter) == T_FUNCTION) ? formatter(value, this) : formatter.fieldValueForObject(value, this) ;
104
- if (formattedValue != null) value = formattedValue ;
105
- }
106
-
107
- // 2. If the returned value is not a string, convert it.
108
- if (($type(value) != T_NULL) && value.toString) value = value.toString() ;
109
-
110
- // 3. Localize
111
- if (value && this._getDefault('localize')) value = value.loc() ;
112
-
113
- // 4. Escape HTML
114
- if (value && this._getDefault('escapeHtml')) value = value.escapeHTML() ;
115
-
116
- this.set('asHTML', value || '') ;
117
- },
118
-
119
- _boundValueDidChange: function() {
120
- return this._boundValueDidChange = this._boundValueDidChange || this._valueDidChange.bind(this);
121
- },
122
-
123
- // Retrieves the default value from the owner or locally.
124
- _getDefault: function(keyName) {
125
- var ret = (this.owner) ? this.owner.get(keyName) : null ;
126
- return (ret != null) ? ret : this.get(keyName) ;
127
- }
128
- }) ;
@@ -1,214 +0,0 @@
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
-