spontaneous 0.2.0.alpha2 → 0.2.0.alpha3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (404) hide show
  1. data/Gemfile +3 -40
  2. data/Rakefile +29 -41
  3. data/Readme.markdown +21 -8
  4. data/application/css/add_alias_dialogue.css.scss +79 -0
  5. data/application/css/{v2.scss → core.css.scss} +537 -550
  6. data/application/css/{definitions.scss → definitions.css.scss} +121 -33
  7. data/application/css/dialogue.css.scss +409 -0
  8. data/application/css/{editing.scss → editing.css.scss} +25 -262
  9. data/application/css/font.css.scss +8 -0
  10. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  11. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  12. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_flat_10_000000_40x100.png +0 -0
  13. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  14. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  15. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  16. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  17. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  18. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  19. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_222222_256x240.png +0 -0
  20. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_228ef1_256x240.png +0 -0
  21. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ef8c08_256x240.png +0 -0
  22. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffd27a_256x240.png +0 -0
  23. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffffff_256x240.png +0 -0
  24. data/application/css/jquery-ui-1.8.21.custom/ui-lightness.css.scss +565 -0
  25. data/application/css/{login.scss → login.css.scss} +4 -4
  26. data/application/css/meta.css.scss +331 -0
  27. data/application/css/{popover.scss → popover.css.scss} +9 -8
  28. data/application/css/{schema_error.scss → schema_error.css.scss} +4 -4
  29. data/application/css/spontaneous.css +5 -0
  30. data/application/css/unsupported.css.scss +42 -0
  31. data/application/js/add_alias_dialogue.js +72 -10
  32. data/application/js/ajax.js +50 -16
  33. data/application/js/compatibility.js +19 -15
  34. data/application/js/content.js +39 -36
  35. data/application/js/content_area.js +53 -5
  36. data/application/js/dialogue.js +17 -0
  37. data/application/js/dom.js +1 -1
  38. data/application/js/edit_panel.js +23 -8
  39. data/application/js/extensions.js +7 -2
  40. data/application/js/field_preview.js +2 -1
  41. data/application/js/field_types/date_field.js +11 -8
  42. data/application/js/field_types/file_field.js +188 -9
  43. data/application/js/field_types/image_field.js +46 -29
  44. data/application/js/field_types/markdown_field.js +57 -14
  45. data/application/js/field_types/select_field.js +72 -0
  46. data/application/js/field_types/string_field.js +8 -0
  47. data/application/js/field_types/webvideo_field.js +8 -0
  48. data/application/js/init.js +1 -7
  49. data/application/js/location.js +41 -13
  50. data/application/js/login.js +3 -0
  51. data/application/js/meta_view/user_admin.js +543 -0
  52. data/application/js/meta_view.js +1 -0
  53. data/application/js/metadata.js +20 -0
  54. data/application/js/page.js +17 -3
  55. data/application/js/page_browser.js +40 -30
  56. data/application/js/page_entry.js +4 -0
  57. data/application/js/panel/root_menu.js +66 -0
  58. data/application/js/popover.js +2 -2
  59. data/application/js/preview.js +1 -1
  60. data/application/js/publish.js +138 -30
  61. data/application/js/services.js +43 -0
  62. data/application/js/sharded_upload.js +2 -2
  63. data/application/js/spontaneous.js +64 -5
  64. data/application/js/state.js +20 -9
  65. data/application/js/top_bar.js +273 -150
  66. data/application/js/types.js +20 -15
  67. data/application/js/upload.js +1 -2
  68. data/application/js/user.js +18 -4
  69. data/application/js/vendor/date.js +104 -0
  70. data/application/js/vendor/jquery-ui-1.8.18.custom.min.js +356 -0
  71. data/application/js/views/box_view.js +15 -8
  72. data/application/js/views/page_piece_view.js +11 -8
  73. data/application/js/views/page_view.js +21 -3
  74. data/application/js/views/piece_view.js +19 -10
  75. data/application/js/views.js +3 -0
  76. data/application/static/chromelogo-200x52-45c7cbc93be080bea342df5fcda2ef8b.png +0 -0
  77. data/application/static/dot-texture-9eea29e4ac7ad9a772285252078ec127.png +0 -0
  78. data/application/static/editing-textarea-resize-s-b5af62365eb7e19ea4beccf7242d508e.png +0 -0
  79. data/application/static/editing-texture-1-42b06a3439752490988f30f2a06d5e7c.png +0 -0
  80. data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
  81. data/application/static/loop_alt1-white-7894b458528e92216196cae26b4c2c96.svg +12 -0
  82. data/application/static/spontaneous-states-e91ec89db525c62da0105b97cdd781ce.png +0 -0
  83. data/application/views/index.erb +2 -2
  84. data/application/views/login.erb +4 -8
  85. data/application/views/schema_modification_error.html.erb +1 -4
  86. data/application/views/unsupported.erb +9 -7
  87. data/bin/spot +1 -1
  88. data/db/migrations/20110209152710_users_and_groups.rb +10 -10
  89. data/db/migrations/20120305112647_site_modification_time.rb +11 -0
  90. data/db/migrations/20120418153903_add_ownership_of_content.rb +14 -0
  91. data/db/migrations/20120423175416_add_pending_modifications.rb +21 -0
  92. data/db/migrations/20120525164947_add_field_versions.rb +27 -0
  93. data/lib/sequel/plugins/scoped_table_name.rb +10 -1
  94. data/lib/spontaneous/asset/file.rb +25 -0
  95. data/lib/spontaneous/asset/source.rb +28 -0
  96. data/lib/spontaneous/asset.rb +75 -0
  97. data/lib/spontaneous/box.rb +6 -4
  98. data/lib/spontaneous/capistrano/deploy.rb +47 -0
  99. data/lib/spontaneous/capistrano/sync.rb +81 -0
  100. data/lib/spontaneous/capistrano.rb +13 -0
  101. data/lib/spontaneous/change.rb +60 -68
  102. data/lib/spontaneous/cli/assets.rb +29 -0
  103. data/lib/spontaneous/cli/base.rb +0 -48
  104. data/lib/spontaneous/cli/console.rb +1 -1
  105. data/lib/spontaneous/cli/server.rb +6 -4
  106. data/lib/spontaneous/cli/site.rb +28 -17
  107. data/lib/spontaneous/cli/user.rb +107 -0
  108. data/lib/spontaneous/cli.rb +100 -4
  109. data/lib/spontaneous/collections/entry_set.rb +2 -2
  110. data/lib/spontaneous/collections/field_set.rb +48 -22
  111. data/lib/spontaneous/collections/prototype_set.rb +20 -13
  112. data/lib/spontaneous/constants.rb +3 -0
  113. data/lib/spontaneous/content.rb +22 -5
  114. data/lib/spontaneous/errors.rb +3 -3
  115. data/lib/spontaneous/extensions/array.rb +12 -0
  116. data/lib/spontaneous/extensions/enumerable.rb +30 -0
  117. data/lib/spontaneous/extensions/nil.rb +3 -1
  118. data/lib/spontaneous/extensions/string.rb +16 -0
  119. data/lib/spontaneous/field_types/date_field.rb +45 -2
  120. data/lib/spontaneous/field_types/field.rb +42 -9
  121. data/lib/spontaneous/field_types/file_field.rb +68 -0
  122. data/lib/spontaneous/field_types/image_field.rb +63 -0
  123. data/lib/spontaneous/field_types/select_field.rb +109 -0
  124. data/lib/spontaneous/field_types/string_field.rb +6 -1
  125. data/lib/spontaneous/field_types/webvideo_field.rb +85 -27
  126. data/lib/spontaneous/field_types.rb +1 -1
  127. data/lib/spontaneous/field_version.rb +8 -0
  128. data/lib/spontaneous/generators/page.rb +1 -1
  129. data/lib/spontaneous/generators/site/Capfile.tt +1 -4
  130. data/lib/spontaneous/generators/site/Gemfile.tt +13 -6
  131. data/lib/spontaneous/generators/site/config/deploy.rb.tt +28 -0
  132. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +7 -2
  133. data/lib/spontaneous/generators/site.rb +1 -0
  134. data/lib/spontaneous/json.rb +34 -11
  135. data/lib/spontaneous/layout.rb +22 -0
  136. data/lib/spontaneous/media/file.rb +4 -0
  137. data/lib/spontaneous/output/assets/compression.rb +58 -0
  138. data/lib/spontaneous/output/assets.rb +32 -0
  139. data/lib/spontaneous/output/context.rb +179 -0
  140. data/lib/spontaneous/output/format/html.rb +5 -0
  141. data/lib/spontaneous/output/format/plain.rb +5 -0
  142. data/lib/spontaneous/output/format.rb +180 -0
  143. data/lib/spontaneous/output/helpers/classes_helper.rb +18 -0
  144. data/lib/spontaneous/{render/helpers/html_helper.rb → output/helpers/conditional_comment_helper.rb} +3 -12
  145. data/lib/spontaneous/output/helpers/script_helper.rb +73 -0
  146. data/lib/spontaneous/output/helpers/stylesheet_helper.rb +61 -0
  147. data/lib/spontaneous/output/helpers.rb +28 -0
  148. data/lib/spontaneous/output/template/engine.rb +59 -0
  149. data/lib/spontaneous/output/template/renderer.rb +153 -0
  150. data/lib/spontaneous/output/template.rb +21 -0
  151. data/lib/spontaneous/output.rb +163 -0
  152. data/lib/spontaneous/page.rb +2 -1
  153. data/lib/spontaneous/paths.rb +6 -1
  154. data/lib/spontaneous/permissions/access_key.rb +5 -5
  155. data/lib/spontaneous/permissions/user.rb +81 -35
  156. data/lib/spontaneous/permissions/user_level.rb +26 -22
  157. data/lib/spontaneous/plugins/aliases.rb +76 -12
  158. data/lib/spontaneous/plugins/allowed_types.rb +60 -18
  159. data/lib/spontaneous/plugins/application/paths.rb +0 -28
  160. data/lib/spontaneous/plugins/application/system.rb +35 -0
  161. data/lib/spontaneous/plugins/boxes.rb +4 -0
  162. data/lib/spontaneous/plugins/content_groups.rb +16 -0
  163. data/lib/spontaneous/plugins/entries.rb +50 -30
  164. data/lib/spontaneous/plugins/fields.rb +15 -0
  165. data/lib/spontaneous/plugins/layouts.rb +8 -2
  166. data/lib/spontaneous/plugins/modifications.rb +228 -0
  167. data/lib/spontaneous/plugins/page/formats.rb +67 -42
  168. data/lib/spontaneous/plugins/page/request.rb +10 -0
  169. data/lib/spontaneous/plugins/page/site_timestamps.rb +28 -0
  170. data/lib/spontaneous/plugins/paths.rb +15 -3
  171. data/lib/spontaneous/plugins/publishing.rb +124 -45
  172. data/lib/spontaneous/plugins/render.rb +13 -8
  173. data/lib/spontaneous/plugins/schema_hierarchy.rb +18 -6
  174. data/lib/spontaneous/plugins/site/helpers.rb +53 -0
  175. data/lib/spontaneous/plugins/site/hooks.rb +50 -0
  176. data/lib/spontaneous/plugins/site/map.rb +1 -1
  177. data/lib/spontaneous/plugins/site/paths.rb +13 -0
  178. data/lib/spontaneous/plugins/site/publishing.rb +6 -2
  179. data/lib/spontaneous/plugins/site/{revisions.rb → state.rb} +5 -1
  180. data/lib/spontaneous/plugins/site/storage.rb +4 -0
  181. data/lib/spontaneous/plugins/site/url.rb +15 -0
  182. data/lib/spontaneous/plugins/site_map.rb +13 -3
  183. data/lib/spontaneous/plugins/styles.rb +5 -1
  184. data/lib/spontaneous/plugins/visibility.rb +39 -12
  185. data/lib/spontaneous/prototypes/box_prototype.rb +4 -0
  186. data/lib/spontaneous/prototypes/field_prototype.rb +15 -10
  187. data/lib/spontaneous/publishing/event_client.rb +46 -0
  188. data/lib/spontaneous/publishing/immediate.rb +81 -44
  189. data/lib/spontaneous/publishing/simultaneous.rb +23 -6
  190. data/lib/spontaneous/publishing.rb +4 -3
  191. data/lib/spontaneous/rack/around_back.rb +1 -5
  192. data/lib/spontaneous/rack/around_front.rb +4 -4
  193. data/lib/spontaneous/rack/around_preview.rb +4 -3
  194. data/lib/spontaneous/rack/assets.rb +81 -54
  195. data/lib/spontaneous/rack/authentication.rb +0 -1
  196. data/lib/spontaneous/rack/back.rb +160 -72
  197. data/lib/spontaneous/rack/cookie_authentication.rb +2 -2
  198. data/lib/spontaneous/rack/css.rb +18 -15
  199. data/lib/spontaneous/rack/event_source.rb +9 -21
  200. data/lib/spontaneous/rack/fiber_pool.rb +26 -0
  201. data/lib/spontaneous/rack/front.rb +12 -4
  202. data/lib/spontaneous/rack/helpers.rb +35 -13
  203. data/lib/spontaneous/rack/js.rb +41 -0
  204. data/lib/spontaneous/rack/public.rb +34 -44
  205. data/lib/spontaneous/rack/sse.rb +18 -0
  206. data/lib/spontaneous/rack/static.rb +3 -0
  207. data/lib/spontaneous/rack/user_admin.rb +100 -0
  208. data/lib/spontaneous/rack/user_helpers.rb +1 -1
  209. data/lib/spontaneous/rack.rb +6 -2
  210. data/lib/spontaneous/schema.rb +31 -4
  211. data/lib/spontaneous/search/index.rb +19 -3
  212. data/lib/spontaneous/search/results.rb +1 -1
  213. data/lib/spontaneous/sequel.rb +17 -0
  214. data/lib/spontaneous/site.rb +11 -4
  215. data/lib/spontaneous/state.rb +11 -0
  216. data/lib/spontaneous/storage/cloud.rb +4 -0
  217. data/lib/spontaneous/storage/local.rb +11 -0
  218. data/lib/spontaneous/style.rb +2 -2
  219. data/lib/spontaneous/tasks/database.rake +21 -22
  220. data/lib/spontaneous/utils/database/mysql_dumper.rb +4 -0
  221. data/lib/spontaneous/utils/database/postgres_dumper.rb +78 -0
  222. data/lib/spontaneous/utils/database.rb +6 -3
  223. data/lib/spontaneous/utils/smart_quotes.rb +499 -0
  224. data/lib/spontaneous/utils/smush_it.rb +66 -0
  225. data/lib/spontaneous/utils.rb +3 -1
  226. data/lib/spontaneous/version.rb +2 -2
  227. data/lib/spontaneous.rb +25 -29
  228. data/spontaneous.gemspec +186 -106
  229. data/test/experimental/test_features.rb +1 -1
  230. data/test/fixtures/asset_pipeline/application/css/basic.css.scss +4 -0
  231. data/test/fixtures/asset_pipeline/application/css/complex.css.scss.erb +6 -0
  232. data/test/fixtures/asset_pipeline/application/css/simple.css +3 -0
  233. data/test/fixtures/asset_pipeline/application/css/spontaneous.css +7 -0
  234. data/test/fixtures/asset_pipeline/application/css/subdir/complex.css.scss.erb +6 -0
  235. data/test/fixtures/asset_pipeline/application/css/subdir/library.css.scss +1 -0
  236. data/test/fixtures/asset_pipeline/application/css/subdir/simple.css +3 -0
  237. data/test/fixtures/asset_pipeline/application/js/basic.js.coffee +1 -0
  238. data/test/fixtures/asset_pipeline/application/js/complex.js.coffee.erb +1 -0
  239. data/test/fixtures/asset_pipeline/application/js/login.js +1 -0
  240. data/test/fixtures/asset_pipeline/application/js/require.js +1 -0
  241. data/test/fixtures/asset_pipeline/application/js/simple.js +1 -0
  242. data/test/fixtures/asset_pipeline/application/js/spontaneous.js +5 -0
  243. data/test/fixtures/asset_pipeline/application/js/subdir/complex.js.coffee.erb +1 -0
  244. data/test/fixtures/asset_pipeline/application/js/subdir/library.js.coffee +1 -0
  245. data/test/fixtures/asset_pipeline/application/js/subdir/simple.js +1 -0
  246. data/test/fixtures/asset_pipeline/application/js/vendor/jquery.js +1 -0
  247. data/test/fixtures/asset_pipeline/application/static/dot-texture.png +0 -0
  248. data/test/fixtures/asset_pipeline/application/static/subdir/px.gif +0 -0
  249. data/test/fixtures/assets/public1/css/a.scss +1 -0
  250. data/test/fixtures/assets/public1/js/a.js +1 -0
  251. data/test/fixtures/assets/public1/js/m.coffee +1 -0
  252. data/test/fixtures/assets/public2/css/b.scss +1 -0
  253. data/test/fixtures/assets/public2/css/c.css +1 -0
  254. data/test/fixtures/assets/public2/js/b.js +1 -0
  255. data/test/fixtures/assets/public2/js/c.js +1 -0
  256. data/test/fixtures/assets/public2/js/n.coffee +1 -0
  257. data/test/fixtures/back/config/user_levels.yml +3 -0
  258. data/test/fixtures/back/public/js/coffeescript.coffee +1 -0
  259. data/test/fixtures/back/templates/layouts/standard.css.cut +1 -0
  260. data/test/fixtures/back/templates/layouts/standard.js.cut +1 -0
  261. data/test/fixtures/example_application/config/database.yml +4 -4
  262. data/test/fixtures/helpers/templates/layouts/standard.html.cut +1 -0
  263. data/test/fixtures/helpers/templates/layouts/standard.mobile.cut +1 -0
  264. data/test/fixtures/images/vimlogo.pdf +0 -0
  265. data/test/fixtures/outputs/templates/layouts/standard.atom.cut +1 -0
  266. data/test/fixtures/permissions/config/user_levels.yml +6 -3
  267. data/test/fixtures/serialisation/class_hash.yaml.erb +1 -0
  268. data/test/fixtures/serialisation/root_hash.yaml.erb +2 -2
  269. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  270. data/test/fixtures/templates/extended/main.html.cut +5 -5
  271. data/test/fixtures/templates/extended/parent.html.cut +8 -8
  272. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -1
  273. data/test/fixtures/templates/extended/with_includes.html.cut +6 -6
  274. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +6 -7
  275. data/test/fixtures/templates/layouts/entries.html.cut +4 -4
  276. data/test/fixtures/templates/layouts/standard.html.cut +1 -0
  277. data/test/fixtures/templates/layouts/variables.html.cut +1 -1
  278. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -1
  279. data/test/fixtures/templates/publishing/templates/layouts/static.rtf.cut +1 -0
  280. data/test/fixtures/templates/template_class/complex_template.html.cut +2 -2
  281. data/test/fixtures/templates/template_class/complex_template.pdf.cut +2 -2
  282. data/test/fixtures/templates/template_class/default_template_style.html.cut +1 -1
  283. data/test/fixtures/templates/template_class/images_with_template.html.cut +2 -2
  284. data/test/fixtures/templates/template_class/slots_template.html.cut +2 -2
  285. data/test/fixtures/templates/template_class/slots_template.pdf.cut +2 -2
  286. data/test/fixtures/user_manager/config/user_levels.yml +9 -0
  287. data/test/functional/test_application.rb +7 -7
  288. data/test/functional/test_back.rb +352 -97
  289. data/test/functional/test_front.rb +71 -20
  290. data/test/functional/test_user_manager.rb +284 -0
  291. data/test/javascript/env.js +13505 -0
  292. data/test/javascript/test_markdown.rb +43 -3
  293. data/test/support/custom_matchers.rb +3 -2
  294. data/test/test_helper.rb +50 -9
  295. data/test/test_javascript.rb +13 -13
  296. data/test/ui_helper.rb +1 -1
  297. data/test/unit/test_alias.rb +79 -8
  298. data/test/unit/test_asset_bundler.rb +220 -0
  299. data/test/unit/test_assets.rb +213 -0
  300. data/test/unit/test_async.rb +55 -0
  301. data/test/unit/test_authentication.rb +52 -39
  302. data/test/unit/test_boxes.rb +20 -15
  303. data/test/unit/test_changesets.rb +261 -0
  304. data/test/unit/test_content.rb +73 -33
  305. data/test/unit/test_content_inheritance.rb +18 -18
  306. data/test/unit/test_extensions.rb +26 -0
  307. data/test/unit/test_fields.rb +303 -16
  308. data/test/unit/test_formats.rb +267 -34
  309. data/test/unit/test_helpers.rb +79 -2
  310. data/test/unit/test_images.rb +10 -0
  311. data/test/unit/test_layouts.rb +21 -13
  312. data/test/unit/test_modifications.rb +648 -0
  313. data/test/unit/test_page.rb +6 -2
  314. data/test/unit/test_permissions.rb +101 -27
  315. data/test/unit/test_piece.rb +4 -4
  316. data/test/unit/test_plugins.rb +3 -2
  317. data/test/unit/test_publishing.rb +332 -0
  318. data/test/unit/test_render.rb +118 -67
  319. data/test/unit/test_revisions.rb +546 -0
  320. data/test/unit/test_schema.rb +83 -1
  321. data/test/unit/test_search.rb +59 -0
  322. data/test/unit/test_serialisation.rb +2 -47
  323. data/test/unit/test_site.rb +217 -108
  324. data/test/unit/test_storage.rb +26 -0
  325. data/test/unit/test_structure.rb +2 -2
  326. data/test/unit/test_styles.rb +90 -75
  327. data/test/unit/test_table_scoping.rb +21 -17
  328. data/test/unit/test_templates.rb +75 -69
  329. data/test/{slow → unit}/test_visibility.rb +78 -22
  330. metadata +528 -221
  331. data/application/css/add_alias_dialogue.scss +0 -27
  332. data/application/css/min/14c2a35812c443001b15d8b12a4780f88c678035.css +0 -1
  333. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +0 -1
  334. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +0 -1
  335. data/application/css/spontaneous.scss +0 -111
  336. data/application/css/unsupported.scss +0 -16
  337. data/application/css/variables.scss +0 -80
  338. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +0 -3
  339. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +0 -2
  340. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +0 -3
  341. data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +0 -2
  342. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +0 -90
  343. data/application/static/diagonal-texture.png +0 -0
  344. data/application/static/editing-0-noise.png +0 -0
  345. data/application/static/editing-1-noise.png +0 -0
  346. data/application/static/editing-texture-1.png +0 -0
  347. data/application/static/editing-texture.png +0 -0
  348. data/application/static/editing-toolbar-shadow-bottom.png +0 -0
  349. data/application/static/editing-toolbar-shadow-top.png +0 -0
  350. data/application/static/inner-glow.png +0 -0
  351. data/application/static/item-buttons-highlight.png +0 -0
  352. data/application/static/item-buttons.png +0 -0
  353. data/application/static/paper-texture-dark.png +0 -0
  354. data/application/static/plus_alt.svg +0 -8
  355. data/application/static/select-arrow-root.png +0 -0
  356. data/application/static/slot-up-arrow.png +0 -0
  357. data/application/static/spontaneous.png +0 -0
  358. data/lib/cutaneous/context_helper.rb +0 -187
  359. data/lib/cutaneous/preview_context.rb +0 -32
  360. data/lib/cutaneous/preview_renderer.rb +0 -10
  361. data/lib/cutaneous/publish_context.rb +0 -10
  362. data/lib/cutaneous/publish_renderer.rb +0 -14
  363. data/lib/cutaneous/publish_template.rb +0 -62
  364. data/lib/cutaneous/publish_token_parser.rb +0 -8
  365. data/lib/cutaneous/renderer.rb +0 -124
  366. data/lib/cutaneous/request_context.rb +0 -9
  367. data/lib/cutaneous/request_renderer.rb +0 -15
  368. data/lib/cutaneous/request_template.rb +0 -11
  369. data/lib/cutaneous/request_token_parser.rb +0 -9
  370. data/lib/cutaneous/token_parser.rb +0 -125
  371. data/lib/cutaneous.rb +0 -48
  372. data/lib/spontaneous/render/context_base.rb +0 -143
  373. data/lib/spontaneous/render/development_renderer.rb +0 -14
  374. data/lib/spontaneous/render/engine.rb +0 -19
  375. data/lib/spontaneous/render/format/html.rb +0 -5
  376. data/lib/spontaneous/render/format.rb +0 -75
  377. data/lib/spontaneous/render/helpers/script_helper.rb +0 -17
  378. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +0 -16
  379. data/lib/spontaneous/render/helpers.rb +0 -14
  380. data/lib/spontaneous/render/preview_context.rb +0 -8
  381. data/lib/spontaneous/render/preview_renderer.rb +0 -24
  382. data/lib/spontaneous/render/publish_context.rb +0 -22
  383. data/lib/spontaneous/render/published_renderer.rb +0 -53
  384. data/lib/spontaneous/render/publishing_renderer.rb +0 -16
  385. data/lib/spontaneous/render/render_cache.rb +0 -26
  386. data/lib/spontaneous/render/renderer.rb +0 -50
  387. data/lib/spontaneous/render/request_context.rb +0 -8
  388. data/lib/spontaneous/render.rb +0 -214
  389. data/test/experimental/test_cutaneous.rb +0 -309
  390. data/test/fixtures/application/css/test.less +0 -5
  391. data/test/slow/test_publishing.rb +0 -1006
  392. /data/application/css/{developer.scss → developer.css.scss} +0 -0
  393. /data/application/js/vendor/{jquery-1.7.1.min.js → jquery.js} +0 -0
  394. /data/application/static/{location-arrow.png → location-arrow-c1c1d3ca472481c61a0a5f8cb289d743.png} +0 -0
  395. /data/application/static/{missing.png → missing-911ce6dbd9f4602e0f3fbcd7e78846a2.png} +0 -0
  396. /data/application/static/{orange-down-arrow.png → orange-down-arrow-395ae1929e8662b2ff0977daf12c35bb.png} +0 -0
  397. /data/application/static/{page-browser-next.png → page-browser-next-ce781a242c23b980b99b9db7abc20b05.png} +0 -0
  398. /data/application/static/{plus-box.png → plus-box-dcde74a1e496f68298c9b443caa1c5d5.png} +0 -0
  399. /data/application/static/{select-arrow.png → select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png} +0 -0
  400. /data/application/static/{slot-down-arrow.png → slot-down-arrow-59ad5f5ee5b52a7ebd00bca4b3104194.png} +0 -0
  401. /data/application/static/{splash.png → splash-65b493a714df9b8b3ab170103401b53d.png} +0 -0
  402. /data/application/static/{spot.png → spot-71fab1d2f065034f5fc15e7bea2ad36c.png} +0 -0
  403. /data/application/static/{spot.svg → spot-8505041082d8d3bbe8d34c29dddb3b7d.svg} +0 -0
  404. /data/application/static/{texture.png → texture-03f7627e8264b1d607113ab32c593a58.png} +0 -0
@@ -3,9 +3,83 @@ Spontaneous.FieldTypes.FileField = (function($, S) {
3
3
  var dom = S.Dom;
4
4
  var FileField = new JS.Class(Spontaneous.FieldTypes.StringField, {
5
5
  selected_files: false,
6
+
6
7
  preview: function() {
7
8
  Spontaneous.UploadManager.register(this);
8
- return this.callSuper();
9
+ var self = this
10
+ , value = this.get('value')
11
+ , filename = this.filename(value);
12
+ var wrap = dom.div('.file-field');
13
+ var dropper = dom.div('.file-drop');
14
+
15
+ var stopEvent = function(event) {
16
+ event.stopPropagation();
17
+ event.preventDefault();
18
+ };
19
+
20
+ var drop = function(event) {
21
+ stopEvent(event);
22
+ dropper.removeClass('drop-active');
23
+ var files = event.dataTransfer.files;
24
+
25
+ if (files && files.length > 0) {
26
+ this.selected_files = files;
27
+ S.Ajax.test_field_versions(this.content, [this], this.upload_values.bind(this), this.upload_conflict.bind(this));
28
+ }
29
+
30
+ return false;
31
+ }.bind(this);
32
+
33
+ var drag_enter = function(event) {
34
+ stopEvent(event);
35
+ $(this).addClass('drop-active');
36
+ return false;
37
+ }.bind(dropper);
38
+
39
+ var drag_over = function(event) {
40
+ stopEvent(event);
41
+ return false;
42
+ }.bind(dropper);
43
+
44
+ var drag_leave = function(event) {
45
+ stopEvent(event);
46
+ $(this).removeClass('drop-active');
47
+ return false;
48
+ }.bind(dropper);
49
+
50
+ dropper.get(0).addEventListener('drop', drop, true);
51
+ dropper.bind('dragenter', drag_enter).bind('dragover', drag_over).bind('dragleave', drag_leave);
52
+
53
+
54
+ var filename_info = dom.div('.filename');
55
+ var filesize_info = dom.div('.filesize');
56
+
57
+ var set_info = function(href, filename, filesize) {
58
+ filename_info.text(filename);
59
+ if (filesize) {
60
+ filesize_info.text(parseFloat(filesize, 10).to_filesize());
61
+ }
62
+ };
63
+ if (value) {
64
+ set_info(value.html, this.filename(value), value.filesize);
65
+ }
66
+
67
+ dropper.append(this.progress_bar().parent());
68
+
69
+ wrap.append(dropper, filename_info, filesize_info);
70
+
71
+ this.drop_target = dropper;
72
+ this.value_wrap = wrap;
73
+
74
+ return wrap;
75
+ },
76
+ upload_values: function() {
77
+ var file = this.selected_files[0];
78
+ S.UploadManager.replace(this, file);
79
+ },
80
+ upload_conflict: function(conflict_data) {
81
+ var dialogue = new S.ConflictedFieldDialogue(this, conflict_data);
82
+ dialogue.open();
9
83
  },
10
84
  unload: function() {
11
85
  this.callSuper();
@@ -14,33 +88,138 @@ Spontaneous.FieldTypes.FileField = (function($, S) {
14
88
  Spontaneous.UploadManager.unregister(this);
15
89
  },
16
90
  upload_complete: function(values) {
17
- console.log('FileField#upload_complete', values)
18
91
  this.set('value', values.processed_value);
19
92
  this.set_version(values.version);
20
93
  this.selected_files = null;
21
94
  this.disable_progress();
22
95
  },
96
+ progress_bar: function() {
97
+ if (!this._progress_bar) {
98
+ var progress_outer = dom.div('.drop-upload-outer').hide();
99
+ var progress_inner = dom.div('.drop-upload-inner').css('width', 0);
100
+ progress_outer.append(progress_inner);
101
+ this._progress_bar = progress_inner;
102
+ }
103
+ return this._progress_bar;
104
+ },
23
105
  disable_progress: function() {
24
106
  this.progress_bar().parent().hide();
25
- this.drop_target.removeClass('uploading')
107
+ this.drop_target.add(this.value_wrap).removeClass('uploading')
26
108
  },
27
109
  upload_progress: function(position, total) {
28
- if (!this.drop_target.hasClass('uploading')) { this.drop_target.addClass('uploading'); }
110
+ if (!this.drop_target.hasClass('uploading')) {
111
+ this.drop_target.add(this.value_wrap).addClass('uploading');
112
+ }
29
113
  this.progress_bar().parent().show();
30
114
  this.progress_bar().css('width', ((position/total)*100) + '%');
31
115
  },
32
116
  is_file: function() {
33
117
  return true;
34
118
  },
35
- get_input: function() {
36
- this.input = dom.input({'type':'file', 'name':this.form_name(), 'accept':'image/*'});
37
- return this.input;
119
+
120
+ edit: function() {
121
+ var self = this;
122
+ var wrap = dom.div(".file-field", {'style':'position:relative;'});
123
+ var value = this.value();
124
+ var input = this.input();
125
+ var filename_info = dom.div('.filename');
126
+ var filesize_info = dom.div('.filesize');
127
+ var choose_files = dom.a('.choose').text("Choose file...");
128
+
129
+ var set_info = function(filename, filesize) {
130
+ filename_info.text(filename);
131
+ if (filesize) {
132
+ filesize_info.text(parseFloat(filesize, 10).to_filesize());
133
+ }
134
+ };
135
+
136
+ var files_selected = function(files) {
137
+ if (files.length > 0) {
138
+ var file = files[0], url = window.URL.createObjectURL(file);
139
+ this.selected_files = files;
140
+ this._edited_value = url;
141
+ window.URL.revokeObjectURL(url);
142
+ set_info(File.filename(file), file.fileSize)
143
+ }
144
+ }.bind(this);
145
+
146
+ var onchange = function() {
147
+ var files = input[0].files;
148
+ files_selected(files);
149
+ }.bind(this);
150
+
151
+ var onclick = function() {
152
+ self.focus();
153
+ input.trigger('click');
154
+ return false;
155
+ };
156
+
157
+ input.change(onchange);
158
+
159
+ var dropper = dom.div('.file-drop');
160
+
161
+ dropper.add(choose_files).click(onclick);
162
+
163
+ // dropper.append(filename_info, filesize_info)
164
+ wrap.append(dropper);
165
+
166
+ var stopEvent = function(event) {
167
+ event.stopPropagation();
168
+ event.preventDefault();
169
+ };
170
+
171
+ var drop = function(event) {
172
+ stopEvent(event);
173
+ dropper.removeClass('drop-active');
174
+ var files = event.dataTransfer.files;
175
+ files_selected(files);
176
+ return false;
177
+ }.bind(this);
178
+
179
+ var drag_enter = function(event) {
180
+ stopEvent(event);
181
+ $(this).addClass('drop-active');
182
+ return false;
183
+ }.bind(dropper);
184
+
185
+ var drag_over = function(event) {
186
+ stopEvent(event);
187
+ return false;
188
+ }.bind(dropper);
189
+
190
+ var drag_leave = function(event) {
191
+ stopEvent(event);
192
+ $(this).removeClass('drop-active');
193
+ return false;
194
+ }.bind(dropper);
195
+
196
+ dropper.get(0).addEventListener('drop', drop, true);
197
+ dropper.bind('dragenter', drag_enter).bind('dragover', drag_over).bind('dragleave', drag_leave);
198
+
199
+ if (value) {
200
+ var s = value.html.split('/'), filename = s[s.length - 1];
201
+ set_info(filename, value.filesize);
202
+ }
203
+ wrap.append(input, choose_files, filename_info, filesize_info);
204
+
205
+
206
+ return wrap;
207
+ },
208
+
209
+ filename: function(value) {
210
+ var s = value.html.split('/'), filename = s[s.length - 1];
211
+ return filename;
212
+ },
213
+
214
+ accept_mimetype: "*/*",
215
+ generate_input: function() {
216
+ return dom.input({'type':'file', 'name':this.form_name(), 'accept':this.accept_mimetype});
38
217
  },
39
218
  accepts_focus: false,
40
219
  // called by edit dialogue in order to begin the async upload of files
41
220
  save: function() {
42
221
  if (!this.selected_files) { return; }
43
- var files = this.selected_files; //this.input[0].files;
222
+ var files = this.selected_files;
44
223
  if (files && files.length > 0) {
45
224
  this.drop_target.addClass('uploading');
46
225
  this.progress_bar().parent().show();
@@ -51,7 +230,7 @@ Spontaneous.FieldTypes.FileField = (function($, S) {
51
230
  this.selected_files = false;
52
231
  },
53
232
  is_modified: function() {
54
- var files = this.selected_files; //this.input[0].files;
233
+ var files = this.selected_files;
55
234
  return (files && files.length > 0);
56
235
  },
57
236
  original_value: function() {
@@ -40,15 +40,15 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
40
40
  this._progress_bar = null;
41
41
  },
42
42
 
43
- progress_bar: function() {
44
- if (!this._progress_bar) {
45
- var progress_outer = dom.div('.drop-upload-outer').hide();
46
- var progress_inner = dom.div('.drop-upload-inner').css('width', 0);
47
- progress_outer.append(progress_inner);
48
- this._progress_bar = progress_inner;
49
- }
50
- return this._progress_bar;
51
- },
43
+ // progress_bar: function() {
44
+ // if (!this._progress_bar) {
45
+ // var progress_outer = dom.div('.drop-upload-outer').hide();
46
+ // var progress_inner = dom.div('.drop-upload-inner').css('width', 0);
47
+ // progress_outer.append(progress_inner);
48
+ // this._progress_bar = progress_inner;
49
+ // }
50
+ // return this._progress_bar;
51
+ // },
52
52
 
53
53
 
54
54
  upload_progress: function(position, total) {
@@ -57,9 +57,14 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
57
57
  this.callSuper();
58
58
  },
59
59
 
60
- preview: function() {
60
+ preview: function(container) {
61
61
  Spontaneous.UploadManager.register(this);
62
- var value = this.get('value').original, src = value.src, img = null, dim = 45;
62
+ var self = this
63
+ , value = this.get('value').original
64
+ , src = value.src
65
+ , img = null
66
+ , dim = 45
67
+ , container = container.parent('li');
63
68
 
64
69
  if (src === "") {
65
70
  img = dom.img('.missing-image', {'src':'/@spontaneous/static/px.gif'});
@@ -67,8 +72,12 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
67
72
  img = dom.img();
68
73
  img.load(function() {
69
74
  var r = this.width/this.height, $this = $(this), h = $this.height(), dh = 0;
70
- if (r >= 1 && h <= dim) { // landscape -- fit image vertically
71
- var dh = (dim - h)/2;
75
+ if (r >= 1) { // landscape -- fit image vertically
76
+ // tag for extra css styles applicable to landscape images
77
+ container.addClass('landscape');
78
+ if (h <= dim) {
79
+ dh = (dim - h)/2;
80
+ }
72
81
  }
73
82
  $this.css('top', dom.px(dh));
74
83
  });
@@ -102,16 +111,23 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
102
111
  if (files.length > 0) {
103
112
  this.selected_files = files;
104
113
  var file = files[0],
105
- url = window.URL.createObjectURL(file);
114
+ url = window.URL.createObjectURL(file)
115
+ , image = this.image;
106
116
  this._edited_value = url;
107
- this.image.__start_upload = true;
108
- this.image.bind('load', function() {
117
+ image.__start_upload = true;
118
+ image.bind('load', function() {
109
119
  if (this.image.__start_upload) {
110
- this.image.__start_upload = false;
120
+ image.__start_upload = false;
111
121
  S.Ajax.test_field_versions(this.content, [this], this.upload_values.bind(this), this.upload_conflict.bind(this));
112
122
  }
123
+ var img = image[0], w = img.width, h = img.height, r = w/h;
124
+ if (r > 1) {
125
+ container.addClass('landscape');
126
+ } else {
127
+ container.removeClass('landscape');
128
+ }
113
129
  }.bind(this))
114
- this.image.attr('src', url)
130
+ image.attr('src', url)
115
131
  // see http://www.htmlfivewow.com/slide25
116
132
  window.URL.revokeObjectURL(url);
117
133
  }
@@ -140,18 +156,11 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
140
156
 
141
157
  dropper.get(0).addEventListener('drop', drop, true);
142
158
  dropper.bind('dragenter', drag_enter).bind('dragover', drag_over).bind('dragleave', drag_leave);
159
+ this.value_wrap = outer;
143
160
  this.drop_target = dropper;
144
161
  this.preview_img = img;
145
162
  return outer;
146
163
  },
147
- upload_values: function() {
148
- var file = this.selected_files[0];
149
- S.UploadManager.replace(this, file);
150
- },
151
- upload_conflict: function(conflict_data) {
152
- var dialogue = new S.ConflictedFieldDialogue(this, conflict_data);
153
- dialogue.open();
154
- },
155
164
  conflicts_resolved: function(resolution_list) {
156
165
  console.log('conflicts_resolved', resolution_list)
157
166
  var resolution = resolution_list[0];
@@ -251,7 +260,8 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
251
260
  this._edited_value = url;
252
261
  this.image.attr('src', url)
253
262
  window.URL.revokeObjectURL(url);
254
- set_info(file.fileName, file.fileSize, null, null)
263
+ console.log(file)
264
+ set_info(File.filename(file), file.fileSize, null, null)
255
265
  }
256
266
  }.bind(this);
257
267
 
@@ -318,8 +328,14 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
318
328
  return wrap;
319
329
  },
320
330
 
331
+ get_input: function() {
332
+ console.log("FileField", "#get_input")
333
+ this.input = this.generate_input();
334
+ return this.input;
335
+ },
336
+
321
337
  edited_value: function() {
322
- return this.input().val();
338
+ return this.input.val();
323
339
  },
324
340
  cancel_edit: function() {
325
341
  this.image.attr('src', this.original_value().src);
@@ -336,7 +352,8 @@ Spontaneous.FieldTypes.ImageField = (function($, S) {
336
352
  set_edited_value: function(value) {
337
353
  this.preview_img.attr('src', value);
338
354
  this.callSuper(value);
339
- }
355
+ },
356
+ accept_mimetype: "image/*",
340
357
  });
341
358
 
342
359
  ImageField.ConflictView = ImageFieldConflictView;
@@ -486,29 +486,55 @@ Spontaneous.FieldTypes.MarkdownField = (function($, S) {
486
486
  text = m[1];
487
487
  url = m[2];
488
488
  }
489
+ this.open_dialogue(event, text, url);
490
+ this.input.focus();
491
+ return false;
492
+ },
493
+ open_dialogue: function(event, text, url) {
489
494
  if (!this._dialogue) {
490
495
  this._dialogue = Spontaneous.Popover.open(event, new LinkView(this, text, this.preprocess_url(text, url)));
491
496
  } else {
492
497
  this._dialogue.close();
493
498
  this._dialogue = null;
494
499
  }
495
- this.input.focus();
496
- return false;
497
500
  },
498
501
  expand_selection: function(state) {
499
502
  state = this.fix_selection_whitespace(state)
500
- var selected = state.selection, m, start = state.start, end = state.end;
503
+ var selected = state.selection, m, n, start = state.start, end = state.end;
501
504
 
502
- m = /(\[[^\)]*?)$/.exec(state.before);
505
+ // cursor is either in the [] or in the ()
506
+ // first test for being in []
507
+ m = /(\[[^\]]*)$/.exec(state.before);
503
508
  if (m) {
504
- start -= m[1].length;
505
- selected = m[1] + selected;
509
+ n = /^(.*\]\(.+?\))/.exec(state.after);
510
+ if (n) {
511
+ start -= m[1].length;
512
+ selected += m[1];
513
+ end += n[1].length;
514
+ selected += n[1];
515
+ }
506
516
  }
507
- // TODO: this breaks if ')' in URL...
508
- m = /^([^\)\[]*?\))/.exec(state.after);
517
+ // now test for being in the ()
518
+ m = /(\[.+?\]\([^\)]*)$/.exec(state.before);
509
519
  if (m) {
510
- end += m[1].length;
511
- selected += m[1];
520
+ n = /^(.*?\))/.exec(state.after);
521
+ if (n) {
522
+ start -= m[1].length;
523
+ selected += m[1];
524
+ end += n[1].length;
525
+ selected += n[1];
526
+ }
527
+ }
528
+ // finally check for being exactly between the two
529
+ m = /(\[.+?\])$/.exec(state.before);
530
+ if (m) {
531
+ n = /^(\(.+?\))/.exec(state.after);
532
+ if (n) {
533
+ start -= m[1].length;
534
+ selected += m[1];
535
+ end += n[1].length;
536
+ selected += n[1];
537
+ }
512
538
  }
513
539
  return {selection:selected, start:start, end:end};
514
540
  },
@@ -526,6 +552,8 @@ Spontaneous.FieldTypes.MarkdownField = (function($, S) {
526
552
  url = 'http://' + url;
527
553
  } else if (/^[^ @]+@([a-z-]+\.)+[a-z]{2,}$/i.exec(url)) { // email addresses
528
554
  url = 'mailto:' + url;
555
+ } else if (/^@([a-z0-9_]{1,15})$/i.exec(url)) { // twitter handles
556
+ url = 'https://twitter.com/' + url.substring(1);
529
557
  } else {
530
558
  // need a flag saying that the string doesn't look like URL because
531
559
  // this function is used in two places and each one needs to respond
@@ -569,7 +597,22 @@ Spontaneous.FieldTypes.MarkdownField = (function($, S) {
569
597
  var MarkdownField = new JS.Class(Spontaneous.FieldTypes.StringField, {
570
598
  actions: [Bold, Italic, H1, H2, UL, OL, Link],
571
599
  generate_input: function() {
572
- return dom.textarea(dom.id(this.css_id()), {'name':this.form_name(), 'rows':10, 'cols':90}).val(this.unprocessed_value());
600
+ var input = dom.textarea(dom.id(this.css_id()), {'name':this.form_name(), 'rows':10, 'cols':90}).val(this.unprocessed_value()), height = this.content.getFieldMetadata(this, 'height');
601
+ if (height) {
602
+ input.css('height', dom.px(height));
603
+ }
604
+
605
+ return input;
606
+ },
607
+ on_show: function() {
608
+ var self = this, input = self.input();
609
+ input.resizable({
610
+ handles: 's',
611
+ minHeight: 100,
612
+ stop: function(event, ui) {
613
+ self.content.setFieldMetadata(self, 'height', ui.size.height);
614
+ }
615
+ });
573
616
  },
574
617
  on_focus: function() {
575
618
  if (!this.expanded) {
@@ -579,7 +622,7 @@ Spontaneous.FieldTypes.MarkdownField = (function($, S) {
579
622
  var text_height = input[0].scrollHeight, max_height = 500, resize_height = Math.min(text_height, max_height);
580
623
  // console.log(resize_height, h)
581
624
  if (Math.abs(resize_height - h) > 20) {
582
- input.animate({'height':resize_height});
625
+ // input.animate({'height':resize_height});
583
626
  this.expanded = true;
584
627
  }
585
628
  }
@@ -588,7 +631,7 @@ Spontaneous.FieldTypes.MarkdownField = (function($, S) {
588
631
  on_blur: function() {
589
632
  if (this.expanded) {
590
633
  var input = this.input();
591
- input.animate({ 'height':input.data('original-height') });
634
+ // input.animate({ 'height':input.data('original-height') });
592
635
  this.expanded = false;
593
636
  }
594
637
  this.callSuper();
@@ -606,7 +649,7 @@ Spontaneous.FieldTypes.MarkdownField = (function($, S) {
606
649
  this._toolbar.append(cmd.button());
607
650
  }
608
651
  this._wrapper.append(this._toolbar);
609
- input.css('height', '');
652
+ // input.css('height', '');
610
653
  }
611
654
  return this._wrapper;
612
655
  },
@@ -0,0 +1,72 @@
1
+
2
+ Spontaneous.FieldTypes.SelectField = (function($, S) {
3
+ "use strict";
4
+
5
+ var dom = S.Dom
6
+ , ajax = S.Ajax;
7
+
8
+ var SelectField = new JS.Class(Spontaneous.FieldTypes.StringField, {
9
+ edit: function() {
10
+ var self = this
11
+ , type = this.type
12
+ , option_list = type.option_list
13
+ , wrapper = dom.div(".select-field-type")
14
+ , callback;
15
+ if (!option_list) {
16
+ // dynamic, make ajax call
17
+ callback = function(data) {
18
+ self.append_select(wrapper, data);
19
+ };
20
+ ajax.get(this.optionsURL(), callback);
21
+ } else {
22
+ self.append_select(wrapper, option_list);
23
+ }
24
+ return wrapper;
25
+ },
26
+
27
+ optionsURL: function() {
28
+ return ["/options", this.type.schema_id, this.content.id()].join("/");
29
+ },
30
+
31
+ append_select: function(wrapper, option_list) {
32
+ var select = dom.select()
33
+ , options = {}
34
+ , selected = this.selectedValue();
35
+ option_list.forEach(function(val) {
36
+ var value = val[0]
37
+ , label = val[1]
38
+ , option = dom.option({"value": value}).text(label);
39
+ options[value] = label;
40
+ if (value == selected) { // only == so that strings successfully match ints
41
+ option.attr("selected", "selected");
42
+ }
43
+ select.append(option);
44
+ });
45
+ this._select = select;
46
+ this._options = options;
47
+ wrapper.append(select);
48
+ },
49
+
50
+ preview: function() {
51
+ return this.parsedValue()[1];
52
+ },
53
+
54
+ parsedValue: function() {
55
+ var value = this.get("value")
56
+ if (!value) { return []; }
57
+ return JSON.parse(this.get('value'));
58
+ },
59
+
60
+ selectedValue: function() {
61
+ return this.parsedValue()[0];
62
+ },
63
+
64
+ edited_value: function() {
65
+ var value = this._select.val()
66
+ , label = this._options[value];
67
+ return JSON.stringify([value, label]);
68
+ }
69
+ });
70
+
71
+ return SelectField;
72
+ })(jQuery, Spontaneous);
@@ -166,6 +166,8 @@ Spontaneous.FieldTypes.StringField = (function($, S) {
166
166
  footer: function() {
167
167
  return false;
168
168
  },
169
+ on_show: function() {
170
+ },
169
171
  focus: function() {
170
172
  this.input().focus().select();
171
173
  },
@@ -179,6 +181,12 @@ Spontaneous.FieldTypes.StringField = (function($, S) {
179
181
  },
180
182
  conflict_view: function(dialogue, conflict) {
181
183
  return new StringFieldConflictView(dialogue, conflict);
184
+ },
185
+ serializedValue: function() {
186
+ return {
187
+ name: this.form_name(),
188
+ value: this.edited_value()
189
+ };
182
190
  }
183
191
  });
184
192
 
@@ -9,6 +9,14 @@ Spontaneous.FieldTypes.WebVideoField = (function($, S) {
9
9
  // edit: function() {
10
10
  // return this.get_input();
11
11
  // }
12
+ preview: function() {
13
+ var value = this.get('value')
14
+ , iframe = dom.iframe({src:value, frameborder: 0, border: 0}).css({position: "absolute", top:0, left:0, height: "100%", width: "100%"});
15
+ if (!value) { // don't fill up the page with empty iframes...
16
+ return dom.div();
17
+ }
18
+ return dom.div().css({width: "100%", position: "relative", "padding-bottom":"56.25%", height: 0}).append(iframe)
19
+ }
12
20
  });
13
21
 
14
22
  return WebVideoField;
@@ -20,16 +20,10 @@ Spontaneous.Init = (function($, S) {
20
20
  b.append(content_area.init());
21
21
  b.append(S.StatusBar.init());
22
22
 
23
- S.User.load();
24
-
25
- S.Types.init(function() {
23
+ S.Metadata.load(function() {
26
24
  location.init(function() {
27
25
  top_bar.init();
28
26
  });
29
27
  });
30
-
31
-
32
-
33
-
34
28
  };
35
29
  }(jQuery, Spontaneous));