sproutcore 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }) ;