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.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +269 -0
- data/README.txt +67 -0
- data/Rakefile +4 -0
- data/app_generators/sproutcore/USAGE +5 -0
- data/app_generators/sproutcore/sproutcore_generator.rb +66 -0
- data/app_generators/sproutcore/templates/README +77 -0
- data/app_generators/sproutcore/templates/environment.yml +4 -0
- data/bin/sc-build +145 -0
- data/bin/sc-gen +24 -0
- data/bin/sc-server +63 -0
- data/bin/sproutcore +21 -0
- data/clients/sc_docs/controllers/docs.js +118 -0
- data/clients/sc_docs/core.js +19 -0
- data/clients/sc_docs/english.lproj/body.css +159 -0
- data/clients/sc_docs/english.lproj/body.rhtml +33 -0
- data/clients/sc_docs/english.lproj/controls.css +0 -0
- data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
- data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
- data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
- data/clients/sc_docs/english.lproj/images/indicator.gif +0 -0
- data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
- data/clients/sc_docs/english.lproj/no_docs.rhtml +7 -0
- data/clients/sc_docs/english.lproj/strings.js +14 -0
- data/clients/sc_docs/english.lproj/warning.rhtml +6 -0
- data/clients/sc_docs/fixtures/doc.js +11 -0
- data/clients/sc_docs/main.js +21 -0
- data/clients/sc_docs/models/doc.js +9 -0
- data/clients/sc_docs/tests/controllers/docs.rhtml +21 -0
- data/clients/sc_docs/tests/models/doc.rhtml +21 -0
- data/clients/sc_docs/tests/views/doc_frame.rhtml +21 -0
- data/clients/sc_docs/tests/views/doc_label_view.rhtml +21 -0
- data/clients/sc_docs/views/doc_frame.js +33 -0
- data/clients/sc_docs/views/doc_label.js +20 -0
- data/clients/sc_test_runner/controllers/runner.js +175 -0
- data/clients/sc_test_runner/core.js +19 -0
- data/clients/sc_test_runner/english.lproj/body.css +151 -0
- data/clients/sc_test_runner/english.lproj/body.rhtml +35 -0
- data/clients/sc_test_runner/english.lproj/controls.css +0 -0
- data/clients/sc_test_runner/english.lproj/icons/small/next.png +0 -0
- data/clients/sc_test_runner/english.lproj/icons/small/reset.png +0 -0
- data/clients/sc_test_runner/english.lproj/images/gradients.png +0 -0
- data/clients/sc_test_runner/english.lproj/images/indicator.gif +0 -0
- data/clients/sc_test_runner/english.lproj/images/toolbar.png +0 -0
- data/clients/sc_test_runner/english.lproj/no_tests.rhtml +6 -0
- data/clients/sc_test_runner/english.lproj/strings.js +14 -0
- data/clients/sc_test_runner/english.lproj/warning.rhtml +6 -0
- data/clients/sc_test_runner/fixtures/test.js +12 -0
- data/clients/sc_test_runner/main.js +26 -0
- data/clients/sc_test_runner/models/test.js +11 -0
- data/clients/sc_test_runner/views/runner_frame.js +72 -0
- data/clients/sc_test_runner/views/test_label.js +20 -0
- data/config/hoe.rb +70 -0
- data/config/requirements.rb +17 -0
- data/environment.yml +9 -0
- data/frameworks/prototype/prototype.js +4186 -0
- data/frameworks/sproutcore/Core.js +378 -0
- data/frameworks/sproutcore/README +3 -0
- data/frameworks/sproutcore/controllers/array.js +236 -0
- data/frameworks/sproutcore/controllers/collection.js +305 -0
- data/frameworks/sproutcore/controllers/controller.js +323 -0
- data/frameworks/sproutcore/controllers/object.js +372 -0
- data/frameworks/sproutcore/drag/drag.js +549 -0
- data/frameworks/sproutcore/drag/drag_data_source.js +32 -0
- data/frameworks/sproutcore/drag/drag_source.js +64 -0
- data/frameworks/sproutcore/drag/drop_target.js +153 -0
- data/frameworks/sproutcore/english.lproj/blank.gif +0 -0
- data/frameworks/sproutcore/english.lproj/buttons.css +589 -0
- data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
- data/frameworks/sproutcore/english.lproj/inline_text_editor.css +21 -0
- data/frameworks/sproutcore/english.lproj/menu.css +121 -0
- data/frameworks/sproutcore/english.lproj/panels/background-fat.jpg +0 -0
- data/frameworks/sproutcore/english.lproj/panels/background-thin.jpg +0 -0
- data/frameworks/sproutcore/english.lproj/panels/bottom-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/bottom-left-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/bottom-right-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/left-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/overlay.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/right-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/top-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/top-left-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/top-right-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panes.css +155 -0
- data/frameworks/sproutcore/english.lproj/picker.css +22 -0
- data/frameworks/sproutcore/english.lproj/strings.js +15 -0
- data/frameworks/sproutcore/english.lproj/tab.css +23 -0
- data/frameworks/sproutcore/english.lproj/tests.css +67 -0
- data/frameworks/sproutcore/english.lproj/theme.css +77 -0
- data/frameworks/sproutcore/foundation/animator.js +670 -0
- data/frameworks/sproutcore/foundation/application.js +199 -0
- data/frameworks/sproutcore/foundation/array.js +348 -0
- data/frameworks/sproutcore/foundation/benchmark.js +211 -0
- data/frameworks/sproutcore/foundation/binding.js +384 -0
- data/frameworks/sproutcore/foundation/date.js +357 -0
- data/frameworks/sproutcore/foundation/error.js +39 -0
- data/frameworks/sproutcore/foundation/input_manager.js +153 -0
- data/frameworks/sproutcore/foundation/json.js +296 -0
- data/frameworks/sproutcore/foundation/mock.js +42 -0
- data/frameworks/sproutcore/foundation/node_descriptor.js +56 -0
- data/frameworks/sproutcore/foundation/object.js +777 -0
- data/frameworks/sproutcore/foundation/observable.js +451 -0
- data/frameworks/sproutcore/foundation/page.js +63 -0
- data/frameworks/sproutcore/foundation/path_module.js +413 -0
- data/frameworks/sproutcore/foundation/responder.js +310 -0
- data/frameworks/sproutcore/foundation/routes.js +371 -0
- data/frameworks/sproutcore/foundation/run_loop.js +21 -0
- data/frameworks/sproutcore/foundation/server.js +491 -0
- data/frameworks/sproutcore/foundation/set.js +96 -0
- data/frameworks/sproutcore/foundation/string.js +149 -0
- data/frameworks/sproutcore/foundation/undo_manager.js +186 -0
- data/frameworks/sproutcore/foundation/unittest.js +622 -0
- data/frameworks/sproutcore/foundation/utils.js +61 -0
- data/frameworks/sproutcore/globals/panels.js +182 -0
- data/frameworks/sproutcore/globals/popups.js +60 -0
- data/frameworks/sproutcore/globals/window.js +381 -0
- data/frameworks/sproutcore/lib/index.rhtml +66 -0
- data/frameworks/sproutcore/models/collection.js +395 -0
- data/frameworks/sproutcore/models/record.js +622 -0
- data/frameworks/sproutcore/models/store.js +295 -0
- data/frameworks/sproutcore/panes/dialog.js +16 -0
- data/frameworks/sproutcore/panes/manager.js +164 -0
- data/frameworks/sproutcore/panes/menu.js +45 -0
- data/frameworks/sproutcore/panes/overlay.js +231 -0
- data/frameworks/sproutcore/panes/pane.js +90 -0
- data/frameworks/sproutcore/panes/panel.js +19 -0
- data/frameworks/sproutcore/panes/picker.js +45 -0
- data/frameworks/sproutcore/tests/controllers/array.rhtml +86 -0
- data/frameworks/sproutcore/tests/controllers/controller.rhtml +273 -0
- data/frameworks/sproutcore/tests/controllers/object.rhtml +327 -0
- data/frameworks/sproutcore/tests/foundation/application.rhtml +125 -0
- data/frameworks/sproutcore/tests/foundation/array.rhtml +221 -0
- data/frameworks/sproutcore/tests/foundation/object.rhtml +69 -0
- data/frameworks/sproutcore/tests/globals/window.rhtml +45 -0
- data/frameworks/sproutcore/tests/panes/pane.rhtml +88 -0
- data/frameworks/sproutcore/tests/views/collection.rhtml +137 -0
- data/frameworks/sproutcore/tests/views/popup_button.rhtml +115 -0
- data/frameworks/sproutcore/tests/views/text_field.rhtml +37 -0
- data/frameworks/sproutcore/validators/credit_card.js +92 -0
- data/frameworks/sproutcore/validators/date.js +36 -0
- data/frameworks/sproutcore/validators/email.js +29 -0
- data/frameworks/sproutcore/validators/not_empty.js +24 -0
- data/frameworks/sproutcore/validators/number.js +55 -0
- data/frameworks/sproutcore/validators/password.js +78 -0
- data/frameworks/sproutcore/validators/validator.js +304 -0
- data/frameworks/sproutcore/views/button.js +425 -0
- data/frameworks/sproutcore/views/checkbox_field.js +30 -0
- data/frameworks/sproutcore/views/collection.js +1521 -0
- data/frameworks/sproutcore/views/container.js +62 -0
- data/frameworks/sproutcore/views/error_explanation.js +45 -0
- data/frameworks/sproutcore/views/field.js +214 -0
- data/frameworks/sproutcore/views/filter_button.js +29 -0
- data/frameworks/sproutcore/views/form.js +591 -0
- data/frameworks/sproutcore/views/image.js +141 -0
- data/frameworks/sproutcore/views/inline_text_editor.js +96 -0
- data/frameworks/sproutcore/views/label.js +176 -0
- data/frameworks/sproutcore/views/menu_item.js +90 -0
- data/frameworks/sproutcore/views/pagination.js +54 -0
- data/frameworks/sproutcore/views/popup_button.js +86 -0
- data/frameworks/sproutcore/views/popup_menu.js +137 -0
- data/frameworks/sproutcore/views/progress.js +100 -0
- data/frameworks/sproutcore/views/radio_field.js +107 -0
- data/frameworks/sproutcore/views/radio_group.js +48 -0
- data/frameworks/sproutcore/views/segmented.js +80 -0
- data/frameworks/sproutcore/views/select_field.js +272 -0
- data/frameworks/sproutcore/views/spinner.js +11 -0
- data/frameworks/sproutcore/views/tab.js +126 -0
- data/frameworks/sproutcore/views/text_field.js +179 -0
- data/frameworks/sproutcore/views/textarea_field.js +14 -0
- data/frameworks/sproutcore/views/toolbar.js +29 -0
- data/frameworks/sproutcore/views/view.js +1389 -0
- data/frameworks/sproutcore/views/workspace.js +170 -0
- data/generators/client/README +3 -0
- data/generators/client/USAGE +12 -0
- data/generators/client/client_generator.rb +53 -0
- data/generators/client/templates/core.js +19 -0
- data/generators/client/templates/english.lproj/body.css +0 -0
- data/generators/client/templates/english.lproj/body.rhtml +3 -0
- data/generators/client/templates/english.lproj/controls.css +0 -0
- data/generators/client/templates/english.lproj/strings.js +14 -0
- data/generators/client/templates/main.js +37 -0
- data/generators/controller/USAGE +16 -0
- data/generators/controller/controller_generator.rb +51 -0
- data/generators/controller/templates/controller.js +21 -0
- data/generators/controller/templates/test.rhtml +21 -0
- data/generators/framework/README +7 -0
- data/generators/framework/USAGE +12 -0
- data/generators/framework/framework_generator.rb +53 -0
- data/generators/framework/templates/core.js +20 -0
- data/generators/framework/templates/english.lproj/body.css +0 -0
- data/generators/framework/templates/english.lproj/body.rhtml +3 -0
- data/generators/framework/templates/english.lproj/controls.css +0 -0
- data/generators/framework/templates/english.lproj/strings.js +14 -0
- data/generators/language/USAGE +16 -0
- data/generators/language/language_generator.rb +47 -0
- data/generators/language/templates/strings.js +10 -0
- data/generators/model/USAGE +24 -0
- data/generators/model/model_generator.rb +55 -0
- data/generators/model/templates/fixture.js +11 -0
- data/generators/model/templates/model.js +20 -0
- data/generators/model/templates/test.rhtml +21 -0
- data/generators/test/USAGE +16 -0
- data/generators/test/templates/test.rhtml +21 -0
- data/generators/test/test_generator.rb +47 -0
- data/generators/view/USAGE +16 -0
- data/generators/view/templates/test.rhtml +21 -0
- data/generators/view/templates/view.js +20 -0
- data/generators/view/view_generator.rb +51 -0
- data/jsdoc/README.txt +119 -0
- data/jsdoc/app/DocFile.js +137 -0
- data/jsdoc/app/DocTag.js +110 -0
- data/jsdoc/app/Doclet.js +63 -0
- data/jsdoc/app/Dumper.js +143 -0
- data/jsdoc/app/JsDoc.js +103 -0
- data/jsdoc/app/JsHilite.js +45 -0
- data/jsdoc/app/JsIO.js +163 -0
- data/jsdoc/app/JsParse.js +385 -0
- data/jsdoc/app/JsPlate.js +130 -0
- data/jsdoc/app/JsTestrun.js +129 -0
- data/jsdoc/app/JsToke.js +564 -0
- data/jsdoc/app/Symbol.js +298 -0
- data/jsdoc/app/Transformer.js +14 -0
- data/jsdoc/app/Util.js +97 -0
- data/jsdoc/app/js.jar +0 -0
- data/jsdoc/app/run.js +144 -0
- data/jsdoc/plugins/min.js +316 -0
- data/jsdoc/plugins/strip.js +20 -0
- data/jsdoc/templates/sproutcore/class.tmpl +438 -0
- data/jsdoc/templates/sproutcore/default.css +241 -0
- data/jsdoc/templates/sproutcore/index.html +13 -0
- data/jsdoc/templates/sproutcore/index.tmpl +21 -0
- data/jsdoc/templates/sproutcore/prototype.js +4186 -0
- data/jsdoc/templates/sproutcore/publish.js +236 -0
- data/jsdoc/templates/sproutcore/splash.html +7 -0
- data/lib/sproutcore/build_tools/html_builder.rb +88 -0
- data/lib/sproutcore/build_tools/resource_builder.rb +194 -0
- data/lib/sproutcore/build_tools.rb +44 -0
- data/lib/sproutcore/bundle.rb +517 -0
- data/lib/sproutcore/bundle_manifest.rb +397 -0
- data/lib/sproutcore/generator_helper.rb +170 -0
- data/lib/sproutcore/helpers/capture_helper.rb +42 -0
- data/lib/sproutcore/helpers/static_helper.rb +80 -0
- data/lib/sproutcore/helpers/tag_helper.rb +110 -0
- data/lib/sproutcore/helpers/text_helper.rb +336 -0
- data/lib/sproutcore/helpers.rb +3 -0
- data/lib/sproutcore/jsdoc.rb +40 -0
- data/lib/sproutcore/jsmin.rb +247 -0
- data/lib/sproutcore/library.rb +258 -0
- data/lib/sproutcore/merb/bundle_controller.rb +179 -0
- data/lib/sproutcore/merb/router.rb +43 -0
- data/lib/sproutcore/merb.rb +27 -0
- data/lib/sproutcore/version.rb +9 -0
- data/lib/sproutcore/view_helpers/button_views.rb +302 -0
- data/lib/sproutcore/view_helpers/core_views.rb +284 -0
- data/lib/sproutcore/view_helpers/form_views.rb +258 -0
- data/lib/sproutcore/view_helpers/menu_views.rb +94 -0
- data/lib/sproutcore/view_helpers.rb +628 -0
- data/lib/sproutcore.rb +30 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/sproutcore_spec.rb +11 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/website.rake +17 -0
- 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
|
+
});
|