pages_core 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +29 -0
  3. data/Rakefile +10 -0
  4. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  5. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  6. data/app/assets/images/pages/admin/drag-icon.png +0 -0
  7. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  8. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  9. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  10. data/app/assets/images/pages/admin/icon.png +0 -0
  11. data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
  12. data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
  13. data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
  14. data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
  15. data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
  16. data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
  17. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  18. data/app/assets/images/pages/admin/loading-modal.gif +0 -0
  19. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  20. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  21. data/app/assets/images/pages/admin/warning-icon.gif +0 -0
  22. data/app/assets/images/pages/favicon.gif +0 -0
  23. data/app/assets/images/pages/feed-icon-14x14.png +0 -0
  24. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +4 -0
  25. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +139 -0
  26. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +9 -0
  27. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +47 -0
  28. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +122 -0
  29. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +66 -0
  30. data/app/assets/javascripts/pages/admin/features/page_images.js +329 -0
  31. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +40 -0
  32. data/app/assets/javascripts/pages/admin/features/tag_editor.js +159 -0
  33. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +17 -0
  34. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +21 -0
  35. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +57 -0
  36. data/app/assets/javascripts/pages/admin.js.coffee +54 -0
  37. data/app/assets/javascripts/pages/login_form.js.coffee +17 -0
  38. data/app/assets/stylesheets/pages/admin/buttons.css.erb +5 -0
  39. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +94 -0
  40. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +58 -0
  41. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +178 -0
  42. data/app/assets/stylesheets/pages/admin/controllers/users.css.erb +3 -0
  43. data/app/assets/stylesheets/pages/admin/editable_image.css.erb +19 -0
  44. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +73 -0
  45. data/app/assets/stylesheets/pages/admin/header.css.erb +129 -0
  46. data/app/assets/stylesheets/pages/admin/images.css.scss.erb +160 -0
  47. data/app/assets/stylesheets/pages/admin/links.css.erb +34 -0
  48. data/app/assets/stylesheets/pages/admin/list_table.css.erb +56 -0
  49. data/app/assets/stylesheets/pages/admin/login.css.scss.erb +32 -0
  50. data/app/assets/stylesheets/pages/admin/modal.css.erb +14 -0
  51. data/app/assets/stylesheets/pages/admin/pagination.css.scss +22 -0
  52. data/app/assets/stylesheets/pages/admin/print.css.erb +17 -0
  53. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +39 -0
  54. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +18 -0
  55. data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +48 -0
  56. data/app/assets/stylesheets/pages/admin/textarea.css.erb +55 -0
  57. data/app/assets/stylesheets/pages/admin.css.erb +404 -0
  58. data/app/assets/stylesheets/pages/errors.css +126 -0
  59. data/app/controller_dummies/admin/admin_controller.rb +6 -0
  60. data/app/controller_dummies/application_controller.rb +6 -0
  61. data/app/controller_dummies/frontend_controller.rb +4 -0
  62. data/app/controller_dummies/images_controller.rb +4 -0
  63. data/app/controller_dummies/page_files_controller.rb +4 -0
  64. data/app/controller_dummies/pages_controller.rb +4 -0
  65. data/app/controller_dummies/sitemaps_controller.rb +4 -0
  66. data/app/controllers/admin/categories_controller.rb +57 -0
  67. data/app/controllers/admin/images_controller.rb +48 -0
  68. data/app/controllers/admin/invites_controller.rb +79 -0
  69. data/app/controllers/admin/page_comments_controller.rb +61 -0
  70. data/app/controllers/admin/page_files_controller.rb +81 -0
  71. data/app/controllers/admin/page_images_controller.rb +116 -0
  72. data/app/controllers/admin/pages_controller.rb +179 -0
  73. data/app/controllers/admin/password_resets_controller.rb +83 -0
  74. data/app/controllers/admin/users_controller.rb +102 -0
  75. data/app/controllers/concerns/pages_core/authentication.rb +48 -0
  76. data/app/controllers/concerns/pages_core/domain_based_cache.rb +28 -0
  77. data/app/controllers/concerns/pages_core/exception_handler.rb +114 -0
  78. data/app/controllers/concerns/pages_core/policies_helper.rb +40 -0
  79. data/app/controllers/concerns/pages_core/process_titler.rb +44 -0
  80. data/app/controllers/errors_controller.rb +45 -0
  81. data/app/controllers/pages_core/admin_controller.rb +109 -0
  82. data/app/controllers/pages_core/application_controller.rb +31 -0
  83. data/app/controllers/pages_core/frontend/page_files_controller.rb +42 -0
  84. data/app/controllers/pages_core/frontend/pages_controller.rb +308 -0
  85. data/app/controllers/pages_core/frontend_controller.rb +34 -0
  86. data/app/controllers/pages_core/images_controller.rb +15 -0
  87. data/app/controllers/pages_core/sitemaps_controller.rb +73 -0
  88. data/app/controllers/sessions_controller.rb +38 -0
  89. data/app/formatters/pages_core/html_formatter.rb +86 -0
  90. data/app/helpers/admin/admin_helper.rb +7 -0
  91. data/app/helpers/admin/menu_helper.rb +65 -0
  92. data/app/helpers/admin/pages_helper.rb +74 -0
  93. data/app/helpers/application_helper.rb +5 -0
  94. data/app/helpers/frontend_helper.rb +5 -0
  95. data/app/helpers/pages_core/admin/admin_helper.rb +108 -0
  96. data/app/helpers/pages_core/admin/labelled_field_helper.rb +73 -0
  97. data/app/helpers/pages_core/admin/tag_editor_helper.rb +46 -0
  98. data/app/helpers/pages_core/application_helper.rb +65 -0
  99. data/app/helpers/pages_core/form_builder.rb +187 -0
  100. data/app/helpers/pages_core/frontend_helper.rb +21 -0
  101. data/app/helpers/pages_core/head_tags_helper.rb +270 -0
  102. data/app/helpers/pages_core/images_helper.rb +36 -0
  103. data/app/helpers/pages_core/login_helper.rb +14 -0
  104. data/app/indices/page_file_index.rb +9 -0
  105. data/app/indices/page_index.rb +29 -0
  106. data/app/indices/user_index.rb +11 -0
  107. data/app/jobs/pages_core/autopublish_job.rb +11 -0
  108. data/app/jobs/pages_core/sweep_cache_job.rb +11 -0
  109. data/app/mailers/admin_mailer.rb +46 -0
  110. data/app/models/autopublisher.rb +33 -0
  111. data/app/models/category.rb +23 -0
  112. data/app/models/concerns/pages_core/has_roles.rb +25 -0
  113. data/app/models/concerns/pages_core/humanizable_param.rb +17 -0
  114. data/app/models/concerns/pages_core/page_tree.rb +85 -0
  115. data/app/models/concerns/pages_core/searchable_page.rb +33 -0
  116. data/app/models/concerns/pages_core/sweepable.rb +23 -0
  117. data/app/models/concerns/pages_core/taggable.rb +46 -0
  118. data/app/models/concerns/pages_core/templateable.rb +85 -0
  119. data/app/models/image.rb +23 -0
  120. data/app/models/invite.rb +33 -0
  121. data/app/models/invite_role.rb +11 -0
  122. data/app/models/localization.rb +27 -0
  123. data/app/models/page.rb +281 -0
  124. data/app/models/page_builder.rb +61 -0
  125. data/app/models/page_comment.rb +18 -0
  126. data/app/models/page_file.rb +74 -0
  127. data/app/models/page_image.rb +62 -0
  128. data/app/models/password_reset_token.rb +38 -0
  129. data/app/models/role.rb +51 -0
  130. data/app/models/tag.rb +64 -0
  131. data/app/models/tagging.rb +22 -0
  132. data/app/models/user.rb +131 -0
  133. data/app/policies/invite_policy.rb +29 -0
  134. data/app/policies/page_file_policy.rb +25 -0
  135. data/app/policies/page_image_policy.rb +25 -0
  136. data/app/policies/page_policy.rb +33 -0
  137. data/app/policies/policy.rb +64 -0
  138. data/app/policies/user_policy.rb +49 -0
  139. data/app/serializers/admin/image_serializer.rb +10 -0
  140. data/app/serializers/admin/page_image_serializer.rb +6 -0
  141. data/app/serializers/page_image_serializer.rb +38 -0
  142. data/app/serializers/page_serializer.rb +21 -0
  143. data/app/views/admin/invites/new.html.erb +16 -0
  144. data/app/views/admin/invites/show.html.erb +25 -0
  145. data/app/views/admin/pages/_edit_comments.html.erb +21 -0
  146. data/app/views/admin/pages/_edit_content.html.erb +10 -0
  147. data/app/views/admin/pages/_edit_images.html.erb +84 -0
  148. data/app/views/admin/pages/_edit_metadata.html.erb +24 -0
  149. data/app/views/admin/pages/_edit_options.html.erb +72 -0
  150. data/app/views/admin/pages/_pagelisting.html.erb +63 -0
  151. data/app/views/admin/pages/edit.html.erb +161 -0
  152. data/app/views/admin/pages/index.html.erb +67 -0
  153. data/app/views/admin/pages/new.html.erb +48 -0
  154. data/app/views/admin/pages/news.html.erb +69 -0
  155. data/app/views/admin/password_resets/show.html.erb +24 -0
  156. data/app/views/admin/users/_access_control.html.erb +14 -0
  157. data/app/views/admin/users/_list.html.erb +62 -0
  158. data/app/views/admin/users/_login_form.html.erb +47 -0
  159. data/app/views/admin/users/deactivated.html.erb +12 -0
  160. data/app/views/admin/users/edit.html.erb +54 -0
  161. data/app/views/admin/users/index.html.erb +27 -0
  162. data/app/views/admin/users/login.html.erb +15 -0
  163. data/app/views/admin/users/new.html.erb +23 -0
  164. data/app/views/admin/users/new_password.html.erb +19 -0
  165. data/app/views/admin/users/show.html.erb +64 -0
  166. data/app/views/admin_mailer/comment_notification.text.erb +7 -0
  167. data/app/views/admin_mailer/error_report.html.erb +70 -0
  168. data/app/views/admin_mailer/invite.text.erb +9 -0
  169. data/app/views/admin_mailer/password_reset.text.erb +13 -0
  170. data/app/views/errors/403.html.erb +6 -0
  171. data/app/views/errors/404.html.erb +11 -0
  172. data/app/views/errors/405.html.erb +4 -0
  173. data/app/views/errors/500.html.erb +19 -0
  174. data/app/views/errors/500_critical.html.erb +7 -0
  175. data/app/views/errors/_generic_help.html.erb +21 -0
  176. data/app/views/errors/report.html.erb +4 -0
  177. data/app/views/feeds/pages.rss.builder +39 -0
  178. data/app/views/layouts/admin/_analytics.html.erb +18 -0
  179. data/app/views/layouts/admin/_header.html.erb +37 -0
  180. data/app/views/layouts/admin.html.erb +79 -0
  181. data/app/views/layouts/errors.html.erb +23 -0
  182. data/app/views/sitemaps/show.xml.builder +9 -0
  183. data/config/locales/en.yml +6 -0
  184. data/config/removed_migrations.yml +60 -0
  185. data/config/routes.rb +127 -0
  186. data/db/migrate/20111219033112_create_pages_tables.rb +281 -0
  187. data/db/migrate/20120627033112_rename_textbits.rb +19 -0
  188. data/db/migrate/20121010055412_drop_removed_tables.rb +83 -0
  189. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +11 -0
  190. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +11 -0
  191. data/db/migrate/20130303160632_remove_imagesets.rb +24 -0
  192. data/db/migrate/20130303161732_remove_sms_subscribers.rb +16 -0
  193. data/db/migrate/20130823133208_update_page_redirect_to.rb +25 -0
  194. data/db/migrate/20140203183900_create_roles.rb +63 -0
  195. data/db/migrate/20140414150500_change_locale_names.rb +13 -0
  196. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +15 -0
  197. data/db/migrate/20140604142100_remove_openid_url.rb +9 -0
  198. data/db/migrate/20140920231700_convert_images_to_dis.rb +79 -0
  199. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +50 -0
  200. data/db/migrate/20141004003100_create_password_reset_tokens.rb +10 -0
  201. data/db/migrate/20141006181300_remove_user_cruft.rb +11 -0
  202. data/db/migrate/20141007173000_create_invites.rb +16 -0
  203. data/db/migrate/20150204130800_update_delayed_job_table.rb +9 -0
  204. data/db/migrate/20150401131300_localize_images.rb +39 -0
  205. data/db/migrate/20150520174300_add_meta_image_to_page.rb +5 -0
  206. data/db/migrate/20150904164200_add_pinned_to_tags.rb +5 -0
  207. data/lib/pages_core/admin_menu_item.rb +22 -0
  208. data/lib/pages_core/archive_finder.rb +75 -0
  209. data/lib/pages_core/cache_sweeper.rb +112 -0
  210. data/lib/pages_core/configuration/base.rb +85 -0
  211. data/lib/pages_core/configuration/pages.rb +23 -0
  212. data/lib/pages_core/configuration.rb +9 -0
  213. data/lib/pages_core/engine.rb +27 -0
  214. data/lib/pages_core/extensions/hash_extensions.rb +23 -0
  215. data/lib/pages_core/extensions/string_extensions.rb +17 -0
  216. data/lib/pages_core/extensions.rb +4 -0
  217. data/lib/pages_core/localizable/active_record_extension.rb +41 -0
  218. data/lib/pages_core/localizable/class_methods.rb +51 -0
  219. data/lib/pages_core/localizable/configuration.rb +50 -0
  220. data/lib/pages_core/localizable/instance_methods.rb +130 -0
  221. data/lib/pages_core/localizable/localizer.rb +72 -0
  222. data/lib/pages_core/localizable/scope_extension.rb +22 -0
  223. data/lib/pages_core/localizable.rb +49 -0
  224. data/lib/pages_core/pages_plugin.rb +14 -0
  225. data/lib/pages_core/paginates.rb +102 -0
  226. data/lib/pages_core/plugin.rb +118 -0
  227. data/lib/pages_core/templates/block_configuration.rb +17 -0
  228. data/lib/pages_core/templates/configuration.rb +81 -0
  229. data/lib/pages_core/templates/configuration_handler.rb +62 -0
  230. data/lib/pages_core/templates/configuration_proxy.rb +28 -0
  231. data/lib/pages_core/templates/controller_actions.rb +32 -0
  232. data/lib/pages_core/templates/template_configuration.rb +198 -0
  233. data/lib/pages_core/templates.rb +53 -0
  234. data/lib/pages_core/version.rb +5 -0
  235. data/lib/pages_core.rb +89 -0
  236. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +68 -0
  237. data/lib/rails/generators/pages_core/frontend/templates/application.css.scss.erb +3 -0
  238. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +16 -0
  239. data/lib/rails/generators/pages_core/frontend/templates/base.css.scss.erb +3 -0
  240. data/lib/rails/generators/pages_core/frontend/templates/breakpoints.css.scss.erb +24 -0
  241. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +8 -0
  242. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +15 -0
  243. data/lib/rails/generators/pages_core/frontend/templates/normalize.css.erb +425 -0
  244. data/lib/rails/generators/pages_core/install/install_generator.rb +135 -0
  245. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +1 -0
  246. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +11 -0
  247. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +5 -0
  248. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +11 -0
  249. data/lib/rails/generators/pages_core/install/templates/default_page_template.html.erb +5 -0
  250. data/lib/rails/generators/pages_core/install/templates/delayed_job +7 -0
  251. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +3 -0
  252. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +6 -0
  253. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +5 -0
  254. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +25 -0
  255. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +67 -0
  256. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +4 -0
  257. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +45 -0
  258. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +12 -0
  259. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +34 -0
  260. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +9 -0
  261. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +9 -0
  262. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +51 -0
  263. data/lib/tasks/db.rake +96 -0
  264. data/lib/tasks/pages/assets.rake +65 -0
  265. data/lib/tasks/pages/cache.rake +16 -0
  266. data/lib/tasks/pages/update.rake +19 -0
  267. data/lib/tasks/pages.rake +76 -0
  268. data/template.rb +19 -0
  269. data/vendor/assets/javascripts/jquery.dimscreen.js +77 -0
  270. data/vendor/assets/javascripts/jquery.fieldselection.js +59 -0
  271. metadata +690 -0
@@ -0,0 +1,329 @@
1
+ (function ($) {
2
+ $(function () {
3
+ $('.page_images').each(function () {
4
+ var container = this;
5
+ var $editor = $(container).find('.editor');
6
+
7
+ $editor.hide();
8
+
9
+ var baseURL = $editor.closest('form').attr('action');
10
+
11
+ var selectedImage = false;
12
+ var selectedImageId = false;
13
+ var images = [];
14
+ var imagesData = false;
15
+
16
+ function loadImagesData () {
17
+ $.getJSON(baseURL + '/images.json', function (json) {
18
+ imagesData = json["page_images"];
19
+ });
20
+ }
21
+ loadImagesData();
22
+
23
+ function updateImageData(data) {
24
+ for (var a = 0; a < imagesData.length; a++) {
25
+ if (imagesData[a].id == data.id) {
26
+ imagesData[a] = data;
27
+ } else if (data.primary) {
28
+ imagesData[a].primary = false;
29
+ }
30
+ }
31
+ }
32
+
33
+ function getImageData (imageId) {
34
+ var data = false;
35
+ for (var a = 0; a < imagesData.length; a++) {
36
+ if (imagesData[a].id == parseInt(imageId, 10)) {
37
+ data = imagesData[a];
38
+ }
39
+ }
40
+ return data;
41
+ }
42
+
43
+ function getImageSize (imageId) {
44
+ var imageData = getImageData(imageId).image;
45
+ return [imageData.real_width, imageData.real_height];
46
+ }
47
+
48
+ function getImageURL (imageId, maxWidth, maxHeight) {
49
+ return imageData;
50
+ }
51
+
52
+ function showImage (image) {
53
+
54
+ // Delay execution if imageData is unavailable
55
+ if (imagesData === false) {
56
+ setTimeout(function () {
57
+ showImage(image);
58
+ }, 100);
59
+ return false;
60
+ }
61
+
62
+ if (image) {
63
+ var imageId = parseInt($(image).data('page-image-id'), 10);
64
+ var imageURL = $(image).data('uncropped-url');
65
+ var imageData = getImageData(imageId);
66
+
67
+ // Show the editor
68
+ $('.page_images .uploadButton').hide();
69
+ $editor.find('.caption').val(imageData.image.caption);
70
+ $editor.find('.alternative').val(imageData.image.alternative);
71
+ $editor.find('.embed').val("[image:" + imageData.image.id + "]");
72
+ $editor.find('.image_id').val(imageData.image.id);
73
+
74
+ if (imageData.primary) {
75
+ $editor.find('#page_image_primary').attr('checked', 'checked');
76
+ } else {
77
+ $editor.find('#page_image_primary').attr('checked', false);
78
+ }
79
+ $(container).find('.image').removeClass('selected');
80
+ $(image).addClass('selected');
81
+ selectedImage = image;
82
+ selectedImageId = imageId;
83
+ $editor.slideDown(400);
84
+
85
+ // Determine resized size
86
+ var maxSize = [($editor.width() - 40), ($(window).height() - 200)];
87
+ var imageSize = getImageSize(imageId);
88
+ var scaleFactor = maxSize[1] / imageSize[1];
89
+ if ((imageSize[0] * scaleFactor) > maxSize[0]) {
90
+ scaleFactor = maxSize[0] / imageSize[0];
91
+ }
92
+ if (scaleFactor > 1.0) {
93
+ scaleFactor = 1.0;
94
+ }
95
+ var resizedSize = [
96
+ Math.floor(imageSize[0] * scaleFactor),
97
+ Math.floor(imageSize[1] * scaleFactor)
98
+ ];
99
+
100
+ // Load the image
101
+ $editor.find('.edit-image').html(
102
+ '<img src="' +
103
+ imageURL + '" width="' + resizedSize[0] +
104
+ '" height="' + resizedSize[1] + '" />'
105
+ );
106
+
107
+ // Handle cropping
108
+ var cropStart = [
109
+ imageData.image.crop_start_x,
110
+ imageData.image.crop_start_y
111
+ ];
112
+
113
+ var cropSize = [
114
+ (imageSize[0] - cropStart[0]),
115
+ (imageSize[1] - cropStart[1])
116
+ ]
117
+
118
+ if (imageData.image.crop_width && imageData.image.crop_height) {
119
+ cropSize = [
120
+ imageData.image.crop_width,
121
+ imageData.image.crop_height
122
+ ];
123
+ }
124
+
125
+ var updateCrop = function (crop) {
126
+ var start = [0, 0];
127
+ var size = imageSize;
128
+ if (crop.w > 0 && crop.h > 0) {
129
+ start = [
130
+ Math.floor(crop.x / scaleFactor),
131
+ Math.floor(crop.y / scaleFactor)
132
+ ];
133
+ size = [
134
+ Math.floor(crop.w / scaleFactor),
135
+ Math.floor(crop.h / scaleFactor)
136
+ ];
137
+ }
138
+ $editor.find('.crop_start_x').val(start[0]);
139
+ $editor.find('.crop_start_y').val(start[1]);
140
+ $editor.find('.crop_width').val(size[0]);
141
+ $editor.find('.crop_height').val(size[1]);
142
+ };
143
+
144
+ $editor.find('.edit-image img').Jcrop({
145
+ setSelect: [
146
+ Math.floor(cropStart[0] * scaleFactor),
147
+ Math.floor(cropStart[1] * scaleFactor),
148
+ Math.floor(cropStart[0] * scaleFactor) + Math.floor(cropSize[0] * scaleFactor),
149
+ Math.floor(cropStart[1] * scaleFactor) + Math.floor(cropSize[1] * scaleFactor)
150
+ ],
151
+ onSelect: updateCrop,
152
+ onChange: updateCrop
153
+ });
154
+
155
+ }
156
+ }
157
+
158
+ function closeEditor () {
159
+ $(container).find('.image').removeClass('selected');
160
+ selectedImage = false;
161
+ selectedImageId = false;
162
+ $editor.slideUp(400);
163
+ $('.page_images .uploadButton').slideDown(400);
164
+ return false;
165
+ }
166
+
167
+ function showNextImage () {
168
+ var nextIndex = false;
169
+ if (selectedImage) {
170
+ nextIndex = $.inArray(selectedImage, images) + 1;
171
+ }
172
+ if (nextIndex !== false) {
173
+ if (images[nextIndex]) {
174
+ showImage(images[nextIndex]);
175
+ } else {
176
+ showImage(images[0]);
177
+ }
178
+ }
179
+ return false;
180
+ }
181
+
182
+ function showPreviousImage () {
183
+ var nextIndex = false;
184
+ if (selectedImage) {
185
+ nextIndex = $.inArray(selectedImage, images) - 1;
186
+ }
187
+ if (nextIndex !== false) {
188
+ if (nextIndex < 0) {
189
+ nextIndex = images.length - 1;
190
+ }
191
+ if (images[nextIndex]) {
192
+ showImage(images[nextIndex]);
193
+ } else {
194
+ showImage(images[0]);
195
+ }
196
+ }
197
+ return false;
198
+ }
199
+
200
+ // Sorting images
201
+ var saveImageOrder = function () {
202
+ var ids = [];
203
+ images = [];
204
+ $('.page_images .images .image').each(function () {
205
+ images.push(this);
206
+ ids.push(parseInt($(this).data('page-image-id'), 10));
207
+ });
208
+ $('.page_images .images').animate({opacity: 0.8}, 300);
209
+ var url = baseURL + '/images/reorder.json';
210
+ var data = {
211
+ ids: ids,
212
+ authenticity_token: $("input[name=authenticity_token]").val()
213
+ };
214
+ $.put(url, data, function (json) {
215
+ $('.page_images .images').animate({opacity: 1.0}, 300);
216
+ });
217
+ };
218
+
219
+ function setPrimaryImage (newPrimary) {
220
+ var $previousPrimary = $(container).find('.primary');
221
+ if ($previousPrimary.length > 0) {
222
+ var thumbURL = $previousPrimary.find('img').attr('src').replace('220x220', '100x100');
223
+ $previousPrimary.find('img').attr('src', thumbURL);
224
+ $previousPrimary
225
+ .removeClass('primary')
226
+ .remove()
227
+ .appendTo($(container).find('.images'));
228
+ $previousPrimary.hide().fadeIn(400);
229
+ }
230
+
231
+ if (newPrimary) {
232
+ $(newPrimary)
233
+ .addClass('primary')
234
+ .remove()
235
+ .appendTo($(container).find('.primary_container'));
236
+ var bigURL = $(newPrimary).find('img').attr('src').replace('100x100', '220x220');
237
+ $(newPrimary).find('img').attr('src', bigURL);
238
+ $(newPrimary).hide().fadeIn(400);
239
+ }
240
+ saveImageOrder();
241
+ }
242
+
243
+ function saveImage () {
244
+ var savedId = selectedImageId;
245
+ var savedImage = selectedImage;
246
+ $editor.animate({opacity: 0.8}, 300);
247
+ var data = {
248
+ 'page_image[primary]': $editor.find('#page_image_primary').is(':checked'),
249
+ 'page_image[image_attributes][id]': $editor.find('.image_id').val(),
250
+ 'page_image[image_attributes][caption]': $editor.find('.caption').val(),
251
+ 'page_image[image_attributes][alternative]': $editor.find('.alternative').val(),
252
+ 'page_image[image_attributes][crop_start_x]': $editor.find('.crop_start_x').val(),
253
+ 'page_image[image_attributes][crop_start_y]': $editor.find('.crop_start_y').val(),
254
+ 'page_image[image_attributes][crop_width]': $editor.find('.crop_width').val(),
255
+ 'page_image[image_attributes][crop_height]': $editor.find('.crop_height').val(),
256
+ authenticity_token: $("input[name=authenticity_token]").val()
257
+ };
258
+ var url = baseURL + '/images/' + savedId + '.json';
259
+ $.put(url, data, function (json) {
260
+ updateImageData(json);
261
+
262
+ // Shuffle primary image around
263
+ if (json.primary && !$(savedImage).hasClass('primary')) {
264
+ setPrimaryImage(savedImage);
265
+ } else if (!json.primary && $(savedImage).hasClass('primary')) {
266
+ setPrimaryImage(false);
267
+ }
268
+
269
+ $editor.animate({opacity: 1.0}, 300);
270
+ });
271
+ return false;
272
+ }
273
+
274
+ function deleteImage () {
275
+ if (selectedImage && selectedImageId) {
276
+ if (confirm('Are you sure you want to delete this image?')) {
277
+ var url = baseURL + '/images/' + selectedImageId + '.json';
278
+ $.ajax(url, {
279
+ type: 'DELETE',
280
+ authenticity_token: $("input[name=authenticity_token]").val(),
281
+ success: function () {
282
+ var deletedImage = selectedImage;
283
+ if (images.length > 1) {
284
+ showNextImage();
285
+ } else {
286
+ $(container).find('.no_images').slideDown();
287
+ closeEditor();
288
+ }
289
+ images = _.reject(images, function (i) {
290
+ return i == deletedImage;
291
+ });
292
+ $(deletedImage).remove();
293
+ }
294
+ });
295
+ }
296
+ }
297
+ return false;
298
+ }
299
+
300
+ $editor.find('a.next').click(showNextImage);
301
+ $editor.find('a.previous').click(showPreviousImage);
302
+ $editor.find('a.close').click(closeEditor);
303
+ $editor.find('button.save').click(saveImage);
304
+ $editor.find('a.delete').click(deleteImage);
305
+
306
+ // Find images
307
+ $(container).find('.image').each(function () {
308
+ images.push(this);
309
+ $(this).find('img').removeAttr('width').removeAttr('height');
310
+ });
311
+ if (images.length > 0) {
312
+ $(container).find('.no_images').hide();
313
+ }
314
+
315
+ $(container).on('click', '.image', function () {
316
+ showImage(this);
317
+ return false;
318
+ });
319
+
320
+ $('.page_images .images').sortable({
321
+ forcePlaceholderSize: true,
322
+ update: saveImageOrder,
323
+ distance: 5
324
+ });
325
+ $('.page_images .image').disableSelection();
326
+
327
+ });
328
+ });
329
+ })(jQuery);
@@ -0,0 +1,40 @@
1
+ $ ->
2
+ $("textarea.rich").each ->
3
+ ta = new jRichTextArea(this)
4
+
5
+ ta.toolbar.addButton("Bold", ->
6
+ @textArea.wrapSelection "<b>", "</b>"
7
+
8
+ ).addButton("Italics", ->
9
+ @textArea.wrapSelection "<i>", "</i>"
10
+
11
+ ).addButton("Heading 2", ->
12
+ @textArea.wrapSelection "h2. ", ""
13
+
14
+ ).addButton("Heading 3", ->
15
+ @textArea.wrapSelection "h3. ", ""
16
+
17
+ ).addButton("Heading 4", ->
18
+ @textArea.wrapSelection "h4. ", ""
19
+
20
+ ).addButton("Link", ->
21
+ selection = @textArea.selectedText()
22
+ selection = prompt("Link text", "") if selection is ""
23
+ response = prompt("Enter link URL", "http://")
24
+ if response
25
+ @textArea.replaceSelection "\"" + ((if selection is "" then "Link text" else selection)) + "\":" + ((if response is "" then "http://link_url/" else response)).replace(/^(?!(f|ht)tps?:\/\/)/, "http://")
26
+
27
+ ).addButton("Email", ->
28
+ selection = @textArea.selectedText()
29
+ response = prompt("Enter mail address", "")
30
+ if response
31
+ @textArea.replaceSelection "\"" + ((if selection is "" then response else selection)) + "\":mailto:" + ((if response is "" then "" else response))
32
+
33
+ ).addButton "Image", ->
34
+ selection = @textArea.selectedText()
35
+ if selection is ""
36
+ response = prompt("Enter image URL", "")
37
+ return unless response?
38
+ @textArea.replaceSelection "!" + response + "!"
39
+ else
40
+ @textArea.replaceSelection "!" + selection + "!"
@@ -0,0 +1,159 @@
1
+ (function($){
2
+
3
+ var TagEditor = function(container){
4
+ this.initialize(container);
5
+ }
6
+
7
+ $.extend(TagEditor.prototype, {
8
+ initialize: function(container){
9
+ var tagEditor = this;
10
+ tagEditor.container = container;
11
+ tagEditor.tags = Array();
12
+ tagEditor.serializeField = $(tagEditor.container).find('.serialized_tags').get(0);
13
+ tagEditor.findTags(true);
14
+
15
+ tagEditor.inputField = $(tagEditor.container).find('.add-tag').get(0);
16
+ $(tagEditor.container).find('.add-tag-button').click(function(){
17
+ tagEditor.addTag();
18
+ $(tagEditor.container).find('.add-tag').blur();
19
+ return false;
20
+ });
21
+ $(tagEditor.container).find('.add-tag').keydown(function(event){
22
+ if(event.which == 13){
23
+ tagEditor.addTag();
24
+ return false;
25
+ }
26
+ });
27
+
28
+ $(tagEditor.container).find('.add-tag').each(function(){
29
+ var field = this;
30
+ field.exampleText = $(field).val();
31
+ $(field).addClass('example');
32
+ $(field).focus(function(event){
33
+ $(tagEditor.container).find('.add-tag-button').fadeIn('fast');
34
+ $(field).removeClass('example');
35
+ if($(field).val() == field.exampleText){
36
+ $(field).val('');
37
+ }
38
+ });
39
+ $(field).blur(function(event){
40
+ $(tagEditor.container).find('.add-tag-button').fadeOut('fast');
41
+ if(!$(field).val() || $(field).val() == field.exampleText){
42
+ $(field).addClass('example').val(field.exampleText);
43
+ }
44
+ });
45
+ });
46
+ $(tagEditor.container).find('.add-tag-button').hide();
47
+ },
48
+
49
+ addTag: function(){
50
+ var tagEditor = this;
51
+ var tagName = $(tagEditor.inputField).val().replace(/^\s\s*/, '').replace(/\s\s*$/, '');
52
+ if(tagName){
53
+ if(this.hasTag(tagName)){
54
+ this.enable(this.getTagByName(tagName));
55
+ } else {
56
+ $(tagEditor.container).find('.tags').append('<span class="tag"><input type="checkbox" name="tag-'+tagName+'" value="1" checked="checked"><span class="name">'+tagName+'</span></span>');
57
+ tagEditor.findTags();
58
+ }
59
+ }
60
+ $(tagEditor.inputField).val('');
61
+ },
62
+
63
+ findTags: function(permanentize){
64
+ var tagEditor = this;
65
+ $(this.container).find('.tag').each(function(){
66
+ var tag = this;
67
+ if(!tag.tagEditorApplied){
68
+ tag.checkBox = $(tag).find('input[type=checkbox]').get(0);
69
+ tag.name = $(tag).find('.name').text();
70
+ if(tagEditor.isChecked(tag)){
71
+ tag.enabled = true;
72
+ $(tag).addClass('enabled');
73
+ } else {
74
+ tag.enabled = false;
75
+ }
76
+ $(tag).click(function(){
77
+ tagEditor.toggle(tag);
78
+ });
79
+ tagEditor.tags[tagEditor.tags.length] = tag;
80
+ tag.tagEditorApplied = true;
81
+ }
82
+ });
83
+ tagEditor.serializeTags();
84
+ },
85
+
86
+ hasTag: function(tagName){
87
+ var hasTag = false;
88
+ $(this.tags).each(function(){
89
+ if(tagName.toLowerCase() == this.name.toLowerCase()){
90
+ hasTag = true;
91
+ }
92
+ });
93
+ return hasTag;
94
+ },
95
+
96
+ toggle: function(tag){
97
+ if(tag.enabled){
98
+ this.disable(tag);
99
+ } else {
100
+ this.enable(tag);
101
+ }
102
+ },
103
+
104
+ enable: function(tag){
105
+ tag.enabled = true;
106
+ $(tag).addClass('enabled');
107
+ $(tag.checkBox).attr('checked', tag.enabled);
108
+ this.serializeTags();
109
+ },
110
+
111
+ disable: function(tag){
112
+ tag.enabled = false;
113
+ $(tag).removeClass('enabled');
114
+ $(tag.checkBox).attr('checked', tag.enabled);
115
+ this.serializeTags();
116
+ },
117
+
118
+ getTagByName: function(tagName){
119
+ var tag = null;
120
+ $(this.tags).each(function(){
121
+ if(this.name.toLowerCase() == tagName.toLowerCase()){
122
+ tag = this;
123
+ }
124
+ });
125
+ return tag;
126
+ },
127
+
128
+ isChecked: function(tag){
129
+ return $(tag.checkBox).attr('checked');
130
+ },
131
+
132
+ enabledTags: function(){
133
+ var enabledTags = Array();
134
+ $(this.tags).each(function(){
135
+ if(this.enabled){
136
+ enabledTags[enabledTags.length] = this;
137
+ }
138
+ });
139
+ return enabledTags;
140
+ },
141
+
142
+ serializeTags: function(){
143
+ var tagNames = Array();
144
+ $(this.enabledTags()).each(function(){
145
+ tagNames[tagNames.length] = '"' + this.name.replace('"', '\\"') + '"';
146
+ })
147
+ $(this.serializeField).val('['+tagNames.join(', ')+']');
148
+ $(this.container).find('.add-tag').attr('disabled', false);
149
+ }
150
+ });
151
+
152
+ // Apply the tag editor to each instance
153
+ $(function(){
154
+ $('.tag-editor').each(function(){
155
+ this.tagEditor = new TagEditor(this);
156
+ });
157
+ });
158
+
159
+ })(jQuery);
@@ -0,0 +1,17 @@
1
+ _ajax_request = (url, data, callback, type, method) ->
2
+ if $.isFunction(data)
3
+ callback = data
4
+ data = {}
5
+ $.ajax
6
+ type: method
7
+ url: url
8
+ data: data
9
+ success: callback
10
+ dataType: type
11
+
12
+ jQuery.extend
13
+ put: (url, data, callback, type) ->
14
+ _ajax_request url, data, callback, type, "PUT"
15
+
16
+ #delete_: (url, data, callback, type) ->
17
+ # _ajax_request url, data, callback, type, "DELETE"
@@ -0,0 +1,21 @@
1
+ jQuery.fn.centerOnScreen = ->
2
+ win_width = $(window).width()
3
+ scrollToLeft = $(window).scrollLeft()
4
+ win_height = $(window).height()
5
+ scrollToBottom = $(window).scrollTop()
6
+ box_width = 200
7
+ box_height = 200
8
+
9
+ @css "position", "absolute"
10
+ @css "z-index", (1000 + (Math.round(Math.random() * 5000)))
11
+
12
+ x = (($(window).width() / 2) - (@width() / 2)) + $(window).scrollLeft()
13
+ y = (($(window).height() / 2) - (@height() / 2)) + $(window).scrollTop()
14
+ x = 0 if x < 0
15
+ y = 0 if y < 0
16
+
17
+ @css
18
+ left: x + "px"
19
+ top: y + "px"
20
+
21
+ this
@@ -0,0 +1,57 @@
1
+ window.jRichTextArea = function(textArea, options){
2
+ this.textArea = textArea;
3
+
4
+ // Default options
5
+ settings = $.extend({
6
+ className: "richTextToolbar"
7
+ }, options);
8
+
9
+ this.toolbar = {
10
+ settings : settings,
11
+ textArea : textArea,
12
+ listElement : false,
13
+ buttons : new Array(),
14
+ addButton : function(name, callback, options) {
15
+ // Default options
16
+ settings = $.extend({
17
+ className: name.replace(/[\s]+/, '')+"Button"
18
+ }, options);
19
+ var li = document.createElement("li");
20
+ var a = document.createElement("a");
21
+ a.title = name;
22
+ a.textArea = this.textArea;
23
+ //callback.this = this;
24
+ $(a).mousedown(callback);
25
+ $(a).addClass(settings.className);
26
+ $(li).append(a).appendTo(this.listElement);
27
+ this.buttons.push(li);
28
+ return this;
29
+ },
30
+ create : function() {
31
+ if(!this.listElement) {
32
+ this.listElement = document.createElement("ul");
33
+ $(this.listElement).addClass(this.settings.className);
34
+ $(this.listElement).insertBefore(this.textArea);
35
+ }
36
+ }
37
+ }
38
+
39
+ this.textArea.selectedText = function() {
40
+ return $(this).getSelection().text;
41
+ }
42
+ this.textArea.replaceSelection = function(replacement) {
43
+ return $(this).replaceSelection(replacement);
44
+ }
45
+ this.textArea.wrapSelection = function() {
46
+ var prepend = arguments[0];
47
+ var append = (arguments.length > 1) ? arguments[1] : prepend
48
+ var selectedText = this.selectedText();
49
+ var trailingSpace = selectedText.match(/(\s)*$/)[0];
50
+ selectedText = selectedText.replace(/(\s)*$/, '');
51
+ return this.replaceSelection(prepend + selectedText + append + trailingSpace);
52
+ }
53
+
54
+ // Delegates
55
+ this.textArea.toolbar = this.toolbar;
56
+ this.toolbar.create();
57
+ }
@@ -0,0 +1,54 @@
1
+ # Gem assets
2
+ #= require jquery
3
+ #= require jquery_ujs
4
+ #= require jquery.ui.all
5
+ #= require jquery.cookie
6
+ #= require jquery.Jcrop
7
+ #= require underscore
8
+
9
+ # Vendored assets
10
+ #= require jquery.dimscreen
11
+ #= require jquery.fieldselection
12
+
13
+ #= require_self
14
+ #= require pages/login_form
15
+ #= require pages/admin/controllers/base
16
+ #= require pages/admin/controllers/pages_controller
17
+ #= require pages/admin/controllers/users_controller
18
+ #= require pages/admin/features/content_tabs
19
+ #= require pages/admin/features/editable_image
20
+ #= require pages/admin/features/modal
21
+ #= require pages/admin/features/page_images
22
+ #= require pages/admin/features/rich_text
23
+ #= require pages/admin/features/tag_editor
24
+ #= require pages/admin/lib/ajax_extensions
25
+ #= require pages/admin/lib/center_on_screen
26
+ #= require pages/admin/lib/jrichtextarea
27
+
28
+ window.Admin =
29
+ Controllers: {}
30
+
31
+ locale: ->
32
+ $('body').data('locale')
33
+
34
+ controllerName: ->
35
+ $('body').data('controller').replace(/^Admin::/, '')
36
+
37
+ actionName: ->
38
+ $('body').data('action')
39
+
40
+ getController: ->
41
+ if @Controllers.hasOwnProperty(@controllerName())
42
+ new @Controllers[@controllerName()]()
43
+
44
+ init: ->
45
+ if controller = @getController()
46
+ controller.dispatch @actionName()
47
+
48
+
49
+ $ ->
50
+ # Detect the sidebar and add the appropriate class to the document element.
51
+ if $("#sidebar").length > 0
52
+ $(document.body).addClass "with_sidebar"
53
+
54
+ Admin.init()
@@ -0,0 +1,17 @@
1
+ $ ->
2
+ $('.login-form').each ->
3
+ container = this
4
+
5
+ showTab = (tabName) ->
6
+ $(container).find('.login-tab').hide()
7
+ $(container).find(".login-tab.#{tabName}").show()
8
+ false
9
+
10
+ $(container).find('.show-password').click ->
11
+ $.cookie "login-mode", "password", expires: 1095
12
+ showTab('password')
13
+
14
+ $(container).find('.show-password-reset').click ->
15
+ showTab('password-reset')
16
+
17
+ showTab('password')