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
data/bin/sc-gen ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # GENERATE SPROUTCORE COMPONENTS
4
+ # Generates components for you in a sproutcore app.
5
+ # Usages
6
+ # sc-gen generator [path] [class]
7
+ #
8
+
9
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
10
+ SC_ROOT = APP_ROOT
11
+
12
+ $:.unshift File.join(SC_ROOT,'lib') ;
13
+
14
+ # Require SproutCore
15
+ require 'rubygems'
16
+ require 'rubigen'
17
+ require 'rubigen/scripts/generate'
18
+ require 'sproutcore'
19
+
20
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
21
+
22
+ RubiGen::Base.use_component_sources! [:sproutcore]
23
+ RubiGen::Scripts::Generate.new.run(ARGV, :destination => File.expand_path(Dir.pwd))
24
+
data/bin/sc-server ADDED
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
4
+ $:.unshift File.join(APP_ROOT,'lib') ;
5
+
6
+ # Require Merb, SproutCore & SproutCore/Merb support
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ require 'merb-core'
10
+ require 'sproutcore'
11
+ require 'sproutcore/merb'
12
+
13
+ # Load BlueRibbon
14
+ #Dir.glob(File.join(APP_ROOT,'blueribbon','**','*.rb')).each { |x| require(x) }
15
+
16
+ ############################################################
17
+ ## Setup Default Options
18
+ ##
19
+
20
+ begin
21
+ require 'thin'
22
+ server_kind = 'thin'
23
+ rescue LoadError
24
+ server_kind = 'mongrel'
25
+ end
26
+
27
+ unless ARGV.index('-a') || ARGV.index('-i')
28
+ ARGV.push *['-a', server_kind]
29
+ end
30
+
31
+ # Make BlueRibbon run on a different port by default
32
+ unless ARGV.index('-p')
33
+ ARGV.push *%w[-p 4020]
34
+ end
35
+
36
+ ############################################################
37
+ ## Configure Merb
38
+ ##
39
+
40
+ Merb::Router.prepare { |r| r.connect_clients('/') }
41
+ Merb::Config.use { |c|
42
+ c[:framework] = {},
43
+ c[:session_store] = 'none',
44
+ c[:exception_details] = true
45
+ }
46
+
47
+ ############################################################
48
+ ## Register Exception Handler
49
+ ##
50
+
51
+ class Exceptions < Merb::Controller
52
+ def base
53
+ params[:exception].to_s
54
+ end
55
+ end
56
+
57
+ ############################################################
58
+ ## Start Merb
59
+ ##
60
+
61
+ puts "Running SproutCore Build Tools v#{SproutCore::VERSION::STRING}"
62
+ puts "Welcome to SproutCore"
63
+ Merb.start
data/bin/sproutcore ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'rubigen'
5
+
6
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
7
+ $:.unshift File.join(APP_ROOT,'lib') ;
8
+ require 'sproutcore'
9
+
10
+ if %w(-v --version).include? ARGV.first
11
+ require 'sproutcore/version'
12
+ puts "#{File.basename($0)} #{SproutCore::VERSION::STRING}"
13
+ exit(0)
14
+ end
15
+
16
+ require 'rubigen/scripts/generate'
17
+ source = RubiGen::PathSource.new(:application,
18
+ File.join(File.dirname(__FILE__), "../app_generators"))
19
+ RubiGen::Base.reset_sources
20
+ RubiGen::Base.append_sources source
21
+ RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'sproutcore')
@@ -0,0 +1,118 @@
1
+ // ==========================================================================
2
+ // Docs.DocsController
3
+ // ==========================================================================
4
+
5
+ require('core');
6
+
7
+ Docs.docsController = SC.Object.create({
8
+
9
+ // This is used in the client warning dialog.
10
+ windowLocation: window.location.href,
11
+
12
+ // This is the current client name.
13
+ clientName: '',
14
+
15
+ clientRoot: '',
16
+
17
+ isRebuilding: false,
18
+
19
+ nowShowingContainer: function() {
20
+ return (this.get('isRebuilding')) ? 'rebuilding' : 'runner';
21
+ }.property('isRebuilding'),
22
+
23
+ // This is displayed as the main UI label.
24
+ displayClientName: function() {
25
+ return "%@ Docs".fmt((this.get('clientName') || '').humanize().capitalize()) ;
26
+ }.property('clientName'),
27
+
28
+ arrangedObjects: [],
29
+ selection: [],
30
+
31
+ selectedDoc: function() {
32
+ var sel = this.get('selection') ;
33
+ return (sel && sel.length > 0) ? sel[0] : null ;
34
+ }.property('selection'),
35
+
36
+ reloadDocs: function() {
37
+
38
+ // Use Ajax to ask the server for the latest set of tests for the
39
+ // current client.
40
+ var clientName = this.get('clientName') ;
41
+ var clientRoot = this.get('clientRoot') ;
42
+ console.log('clientName: '+ clientRoot) ;
43
+ Docs.server.request(clientRoot, ['data','classes.js'].join('/'), null, {
44
+ onSuccess: this._reloadSuccess.bind(this),
45
+ onFailure: this._reloadFailure.bind(this)
46
+ }) ;
47
+ },
48
+
49
+ _reloadSuccess: function(status, transport) {
50
+ var json = transport.responseText ;
51
+ var records = eval(json) ;
52
+ if ($type(records) != T_ARRAY) {
53
+ return this._reloadFailure(status, transport) ;
54
+ }
55
+
56
+ // update the list of tests from the server. The return value will be
57
+ // the records included in the list. This is what will become our new
58
+ // list.
59
+ var recs = SC.Store.updateRecords(records, this, Docs.Doc, true);
60
+ console.log('recs: %@'.fmt(recs)) ;
61
+
62
+ // show warning panel if the records are empty. Also reload tests
63
+ // periodically so that when the user resolves the problem, we can start
64
+ // working away immediately.
65
+ if (recs.length == 0) {
66
+ SC.page.get('noDocsPanel').set('isVisible',true) ;
67
+ setTimeout(this.reloadDocs.bind(this),2000) ;
68
+ } else {
69
+ SC.page.get('noDocsPanel').set('isVisible',false) ;
70
+ }
71
+
72
+ // sort the records by name and set as the new arrangedObjects.
73
+ recs = recs.sort(function(a,b) {
74
+
75
+ var g_a = a.get('group') || '';
76
+ var g_b = b.get('group') || '';
77
+ var groupCompare = g_a.localeCompare(g_b) ;
78
+
79
+ if (groupCompare == 0) {
80
+ a = a.get('guid') || '' ;
81
+ b = b.get('guid') || '' ;
82
+ return a.localeCompare(b) ;
83
+ } else return groupCompare ;
84
+ }) ;
85
+
86
+ var hadArrangedObjects = this.get('arrangedObjects').length > 0 ;
87
+ this.set('arrangedObjects', recs) ;
88
+
89
+ // if the current selection is not in the list, clear the selection.
90
+ var doc = this.get('selectedDoc') ;
91
+ if (doc && !(recs.include(test))) this.set('selection', []) ;
92
+
93
+ },
94
+
95
+ _reloadFailure: function(status, transport) {
96
+ console.log('TEST RELOAD FAILED!') ;
97
+ },
98
+
99
+ rebuildDocs: function() {
100
+ var clientName = this.get('clientName') ;
101
+ var clientRoot = this.get('clientRoot') ;
102
+ Docs.server.request(clientRoot, null, null, {
103
+ onSuccess: this._rebuildSuccess.bind(this),
104
+ onFailure: this._rebuildFailure.bind(this)
105
+ }, 'post') ;
106
+ this.set('isRebuilding', true) ;
107
+ },
108
+
109
+ _rebuildSuccess: function() {
110
+ this.reloadDocs() ;
111
+ this.set('isRebuilding', false) ;
112
+ },
113
+
114
+ _rebuildFailure: function() {
115
+ this.set('isRebuilding', false) ;
116
+ }
117
+
118
+ }) ;
@@ -0,0 +1,19 @@
1
+ // ==========================================================================
2
+ // Docs
3
+ // ==========================================================================
4
+
5
+ Docs = SC.Object.create({
6
+
7
+ // This will create the server for your application. Add any namespaces
8
+ // your model objects are defined in to the prefix array.
9
+ server: SC.Server.create({ prefix: ['Docs'] }),
10
+
11
+ // When you are in development mode, this array will be populated with
12
+ // any fixtures you create for testing and loaded automatically in your
13
+ // main method. When in production, this will be an empty array.
14
+ FIXTURES: [],
15
+
16
+ // Any keys in this array will be instantiated automatically from main.
17
+ controllers: [],
18
+
19
+ }) ;
@@ -0,0 +1,159 @@
1
+
2
+ /* @group Workspace */
3
+
4
+ #workspace {
5
+ background-color: #8db69a;
6
+ position: absolute ;
7
+ top: 0;
8
+ left: 0;
9
+ right: 0;
10
+ bottom: 0;
11
+ }
12
+
13
+ #workspace .container {
14
+ position: absolute ;
15
+ top: 49px;
16
+ left: 171px;
17
+ right: 0px;
18
+ bottom: 0px;
19
+ background-color: white ;
20
+ overflow: auto;
21
+ }
22
+
23
+ #workspace .container iframe {
24
+ border: none ;
25
+ width: 100%;
26
+ height: 100%;
27
+ outline: hidden ;
28
+ }
29
+
30
+ /* @end */
31
+
32
+ /* @group Toolbar */
33
+
34
+ #workspace .toolbar {
35
+ position: absolute ;
36
+ top: 0;
37
+ left: 0px;
38
+ right: 0px;
39
+ height: 48px;
40
+ border-bottom: 1px solid #62806d;
41
+ background: static_url('images/gradients') repeat-x center top;
42
+ }
43
+
44
+ #workspace .toolbar .buttons {
45
+ text-align: right ;
46
+ position: absolute ;
47
+ top: 13px ;
48
+ right: 10px ;
49
+ }
50
+
51
+ #workspace .toolbar h1 {
52
+ border: none ;
53
+ padding: 0;
54
+ margin : 0;
55
+ position: absolute ;
56
+ left: 8px;
57
+ top: 4px;
58
+ font-size: 28px;
59
+ font-weight: normal ;
60
+ }
61
+
62
+ /* @end */
63
+
64
+ /* @group Sidebar */
65
+
66
+ #workspace .sidebar {
67
+ position: absolute ;
68
+ top: 49px;
69
+ left: 0px;
70
+ width: 170px;
71
+ bottom: 0px;
72
+ background-color: #e0efed;
73
+ border-right: 1px #62806d solid;
74
+ overflow: auto ;
75
+ }
76
+
77
+ .sidebar {
78
+ list-style-type: none ;
79
+ padding: 0;
80
+ margin: 0;
81
+ }
82
+
83
+ .sidebar h1 {
84
+ border: none ;
85
+ text-align: left ;
86
+ font-size: 11px;
87
+ margin: 0;
88
+ padding: 0;
89
+ margin-top: 8px;
90
+ padding-top: 2px;
91
+ padding-left: 4px;
92
+ padding-bottom: 2px;
93
+ margin-left: 2px;
94
+ margin-right: 2px ;
95
+ margin-bottom: 2px;
96
+ text-transform: uppercase ;
97
+ color: #454b4a;
98
+ border-bottom: 1px solid #b5c6c4;
99
+ }
100
+
101
+ .sidebar div:first-child h1 {
102
+ display: none ;
103
+ }
104
+
105
+ .sidebar div:first-child a {
106
+ font-weight: bold ;
107
+ }
108
+
109
+ .sidebar a {
110
+ display: block ;
111
+ text-decoration: none ;
112
+ color: black ;
113
+ border: 1px solid #e0efed;
114
+ padding-bottom: 4px;
115
+ padding-top: 7px ;
116
+ padding-left: 8px ;
117
+ border-left-style: none;
118
+ border-right-style: none;
119
+ -moz-user-select: none;
120
+ -khtml-user-select: none;
121
+ user-select: none;
122
+ }
123
+
124
+ .sidebar a.sel {
125
+ border: 1px solid #1e504a;
126
+ color: white ;
127
+ font-weight: bold;
128
+ padding-top: 6px;
129
+ background: static_url('images/gradients') repeat-x center -144px;
130
+ border-top-color: #188b7d;
131
+ border-right-style: none;
132
+ border-left-style: none;
133
+ }
134
+
135
+ .sidebar a.sel:active {
136
+ border: 1px solid #1e504a;
137
+ color: white ;
138
+ font-weight: bold;
139
+ padding-top: 6px;
140
+ background: static_url('images/gradients') repeat-x center -144px;
141
+ border-top-color: #188b7d;
142
+ border-right-style: none;
143
+ border-left-style: none;
144
+ }
145
+
146
+ .sidebar a:active {
147
+ background-color: #cedfdf;
148
+ border: 1px solid #cedfdf;
149
+ border-right-style: none;
150
+ border-left-style: none;
151
+ }
152
+
153
+ .sidebar hr {
154
+ border: none ;
155
+ border-top: #ccc solid 1px;
156
+ margin: 4px 8px;
157
+ }
158
+
159
+ /* @end */
@@ -0,0 +1,33 @@
1
+ <% content_for('body') do %>
2
+
3
+ <% view :workspace do %>
4
+
5
+ <% # PRIMARY TOOLBAR -%>
6
+ <div class="toolbar">
7
+ <%= label_view :outlet => true, :tag => 'h1', :bind => {
8
+ :content => 'Docs.docsController.displayClientName'
9
+ } %>
10
+ <div class="buttons">
11
+ <%= button_view :outlet => true, :label => "Rebuild Docs", :image => static_url('icons/small/reset'), :action => 'Docs.docsController.rebuildDocs' %>
12
+ </div>
13
+ </div>
14
+
15
+ <%= collection_view :outlet => :sidebar, :class => :sidebar, :bind => {
16
+ :content => 'Docs.docsController.arrangedObjects',
17
+ :selection => 'Docs.docsController.selection',
18
+ }, :example_view => 'Docs.DocLabelView', :properties => {
19
+ :group_by => '"group"' } %>
20
+
21
+ <% tab_view :outlet => 'container', :class => "container", :bind => { :now_showing => 'Docs.docsController.nowShowingContainer' } do %>
22
+
23
+ <%= view :outlet => :runner_tab, :tag => :iframe, :view => 'Docs.DocFrameView', :bind => {
24
+ :doc => 'Docs.docsController.selectedDoc' } %>
25
+
26
+ <% view :outlet => :rebuilding_tab do %>
27
+ <h1><img src="<%= static_url('spinner') %>" /> Rebuilding Documentation...</h1>
28
+ <% end %>
29
+
30
+ <% end %>
31
+ <% end %>
32
+
33
+ <% end %>
File without changes
@@ -0,0 +1,7 @@
1
+ <% view :no_docs_panel, :panel => true, :width => 400 do %>
2
+ <div>
3
+ <h1>Client Has No Documents</h1>
4
+ <p style="font-size: 15px;">This client does not currently have any unit tests. To add a unit test, open a terminal to the root directly and type:</p>
5
+ <p style="font-size: 15px; text-align:center;"><code>./script/generate sc_test <%= label_view :outlet => true, :tag => 'span', :bind => { :content => 'Docs.docsController.clientName' } %>/<b>test_name</b></code></p>
6
+ </div>
7
+ <% end %>
@@ -0,0 +1,14 @@
1
+ // ==========================================================================
2
+ // Docs English Strings
3
+ // ==========================================================================
4
+
5
+ // Place strings you want to localize here. In your app, use the key and
6
+ // localize it using "key string".loc(). HINT: For your key names, use the
7
+ // english string with an underscore in front. This way you can still see
8
+ // how your UI will look and you'll notice right away when something needs a
9
+ // localized string added to this file!
10
+ //
11
+ Object.extend(String.English,{
12
+ // "_String Key": "Localized String"
13
+ }) ;
14
+
@@ -0,0 +1,6 @@
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 %>
@@ -0,0 +1,11 @@
1
+ // ==========================================================================
2
+ // Docs.Doc Fixtures
3
+ // ==========================================================================
4
+
5
+ require('core') ;
6
+
7
+ Docs.FIXTURES = Docs.FIXTURES.concat([
8
+
9
+ // TODO: Add your data fixtures here.
10
+
11
+ ]);
@@ -0,0 +1,21 @@
1
+ // ==========================================================================
2
+ // Docs
3
+ // ==========================================================================
4
+
5
+ function main() {
6
+ SC.page.awake() ;
7
+
8
+ console.log('main') ;
9
+ var clientRoot = window.location.pathname.toString().replace(/-docs\/.*/,'-docs').substr(1,window.location.pathname.length);
10
+ var clientName = clientRoot.match(/([^\/]+)\/-docs/)[1];
11
+ Docs.hidePanels() ;
12
+ Docs.docsController.set('selection',[]) ;
13
+ Docs.docsController.set('clientRoot', clientRoot) ;
14
+ Docs.docsController.set('clientName', clientName) ;
15
+ Docs.docsController.reloadDocs() ;
16
+ } ;
17
+
18
+ Docs.hidePanels = function() {
19
+ SC.page.get('warningPanel').set('isVisible', false) ;
20
+ SC.page.get('noDocsPanel').set('isVisible',false) ;
21
+ } ;
@@ -0,0 +1,9 @@
1
+ // ==========================================================================
2
+ // Docs.Doc
3
+ // ==========================================================================
4
+
5
+ require('core');
6
+
7
+ Docs.Doc = SC.Record.extend({
8
+
9
+ }) ;
@@ -0,0 +1,21 @@
1
+ <% # ========================================================================
2
+ # Docs.DocsController Unit Test
3
+ # ========================================================================
4
+ %>
5
+ <% content_for('final') do %>
6
+
7
+ <script>
8
+
9
+ Test.context("Docs.DocsController",{
10
+
11
+ "TODO: Add your own tests here": function() {
12
+ true.shouldEqual(true) ;
13
+ }
14
+
15
+ }) ;
16
+
17
+ appMain = main; main = null ; // Cancel main() so app does not start
18
+
19
+ </script>
20
+
21
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <% # ========================================================================
2
+ # Docs.Doc Unit Test
3
+ # ========================================================================
4
+ %>
5
+ <% content_for('final') do %>
6
+
7
+ <script>
8
+
9
+ Test.context("Docs.Doc",{
10
+
11
+ "TODO: Add your own tests here": function() {
12
+ true.shouldEqual(true) ;
13
+ }
14
+
15
+ }) ;
16
+
17
+ appMain = main; main = null ; // Cancel main() so app does not start
18
+
19
+ </script>
20
+
21
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <% # ========================================================================
2
+ # Docs.DocFrameView Unit Test
3
+ # ========================================================================
4
+ %>
5
+ <% content_for('final') do %>
6
+
7
+ <script>
8
+
9
+ Test.context("Docs.DocFrameView",{
10
+
11
+ "TODO: Add your own tests here": function() {
12
+ true.shouldEqual(true) ;
13
+ }
14
+
15
+ }) ;
16
+
17
+ appMain = main; main = null ; // Cancel main() so app does not start
18
+
19
+ </script>
20
+
21
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <% # ========================================================================
2
+ # Docs.DocLabelView Unit Test
3
+ # ========================================================================
4
+ %>
5
+ <% content_for('final') do %>
6
+
7
+ <script>
8
+
9
+ Test.context("Docs.DocLabelView",{
10
+
11
+ "TODO: Add your own tests here": function() {
12
+ true.shouldEqual(true) ;
13
+ }
14
+
15
+ }) ;
16
+
17
+ appMain = main; main = null ; // Cancel main() so app does not start
18
+
19
+ </script>
20
+
21
+ <% end %>
@@ -0,0 +1,33 @@
1
+ // ==========================================================================
2
+ // Docs.DocFrameView
3
+ // ==========================================================================
4
+
5
+ require('core');
6
+
7
+ Docs.DocFrameView = SC.View.extend({
8
+
9
+ // This is set to the test you want to run.
10
+ doc: null,
11
+
12
+ docObserver: function() {
13
+ var doc = this.get('doc') ;
14
+ var url = (doc) ? doc.get('url') : '' ;
15
+ if (url.length > 0) {
16
+ url = "/%@/%@/%@".fmt('sc_docs', Docs.docsController.get('clientName'), url) ;
17
+ }
18
+
19
+ // make sure we clear out the old document settings if needed.
20
+ var fdoc = (this.rootElement.contentWindow) ? this.rootElement.contentWindow.document : this.rootElement.document ;
21
+
22
+ // if the document URL is already loaded, then reload it...
23
+ if (url == this.rootElement.src) {
24
+ if (fdoc && fdoc.location) fdoc.location.reload() ;
25
+
26
+ // otherwise set to the new URL.
27
+ } else {
28
+ this.rootElement.src = url ;
29
+ }
30
+
31
+ }.observes('doc')
32
+
33
+ }) ;
@@ -0,0 +1,20 @@
1
+ // ==========================================================================
2
+ // Docs.DocLabelView
3
+ // ==========================================================================
4
+
5
+ require('core');
6
+
7
+ Docs.DocLabelView = SC.ButtonView.extend({
8
+
9
+ emptyElement: '<a href="javascript:;"><span></span></a>',
10
+
11
+ contentObserver: function() {
12
+ var c = this.get('content') ;
13
+ this.set('labelText', (c) ? c.get('title') : '(NONE)') ;
14
+ }.observes('content'),
15
+
16
+ labelSelector: 'span',
17
+
18
+ mouseDown: function() { return false; }
19
+
20
+ }) ;