tb_core 0.9.17

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 (341) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.markdown +60 -0
  4. data/Rakefile +28 -0
  5. data/app/assets/images/back_disabled.jpg +0 -0
  6. data/app/assets/images/back_enabled.jpg +0 -0
  7. data/app/assets/images/favicon.ico +0 -0
  8. data/app/assets/images/forward_disabled.jpg +0 -0
  9. data/app/assets/images/forward_enabled.jpg +0 -0
  10. data/app/assets/images/sort_asc.png +0 -0
  11. data/app/assets/images/sort_asc_disabled.png +0 -0
  12. data/app/assets/images/sort_both.png +0 -0
  13. data/app/assets/images/sort_desc.png +0 -0
  14. data/app/assets/images/sort_desc_disabled.png +0 -0
  15. data/app/assets/images/spud/admin/down_arrow.gif +0 -0
  16. data/app/assets/images/spud/admin/flick/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  17. data/app/assets/images/spud/admin/flick/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  18. data/app/assets/images/spud/admin/flick/ui-bg_flat_55_ffffff_40x100.png +0 -0
  19. data/app/assets/images/spud/admin/flick/ui-bg_flat_75_ffffff_40x100.png +0 -0
  20. data/app/assets/images/spud/admin/flick/ui-bg_glass_65_ffffff_1x400.png +0 -0
  21. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
  22. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
  23. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  24. data/app/assets/images/spud/admin/flick/ui-icons_0073ea_256x240.png +0 -0
  25. data/app/assets/images/spud/admin/flick/ui-icons_454545_256x240.png +0 -0
  26. data/app/assets/images/spud/admin/flick/ui-icons_666666_256x240.png +0 -0
  27. data/app/assets/images/spud/admin/flick/ui-icons_ff0084_256x240.png +0 -0
  28. data/app/assets/images/spud/admin/flick/ui-icons_ffffff_256x240.png +0 -0
  29. data/app/assets/images/spud/admin/spud_logo.png +0 -0
  30. data/app/assets/images/spud/admin/spud_logo@2x.png +0 -0
  31. data/app/assets/images/spud/admin/up_arrow.gif +0 -0
  32. data/app/assets/images/spud/admin/users_thumb.png +0 -0
  33. data/app/assets/javascripts/spud/admin/application.js +133 -0
  34. data/app/assets/javascripts/spud/admin/dashboard.js +80 -0
  35. data/app/assets/javascripts/spud/admin/date_picker.js +56 -0
  36. data/app/assets/javascripts/spud/admin/editor.js +167 -0
  37. data/app/assets/javascripts/spud/admin/jquery.dataTables.min.js +151 -0
  38. data/app/assets/javascripts/spud/admin/preinit.js +1 -0
  39. data/app/assets/javascripts/spud/password_resets.js +2 -0
  40. data/app/assets/libs/bootstrap/css/bootstrap-responsive.css +1088 -0
  41. data/app/assets/libs/bootstrap/css/bootstrap.css +5893 -0
  42. data/app/assets/libs/bootstrap/img/glyphicons-halflings-white.png +0 -0
  43. data/app/assets/libs/bootstrap/img/glyphicons-halflings.png +0 -0
  44. data/app/assets/libs/bootstrap/js/bootstrap.js +2025 -0
  45. data/app/assets/libs/datepicker/css/datepicker.css +223 -0
  46. data/app/assets/libs/datepicker/js/bootstrap-datepicker.js +779 -0
  47. data/app/assets/libs/datepicker/less/datepicker.less +122 -0
  48. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  49. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  50. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_55_ffffff_40x100.png +0 -0
  51. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  52. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  53. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
  54. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
  55. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  56. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_0073ea_256x240.png +0 -0
  57. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_454545_256x240.png +0 -0
  58. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_666666_256x240.png +0 -0
  59. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ff0084_256x240.png +0 -0
  60. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ffffff_256x240.png +0 -0
  61. data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.css +297 -0
  62. data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.min.css +5 -0
  63. data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.js +4870 -0
  64. data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.min.js +6 -0
  65. data/app/assets/libs/tiny_mce/jquery.tinymce.js +1 -0
  66. data/app/assets/libs/tiny_mce/langs/en.js +1 -0
  67. data/app/assets/libs/tiny_mce/license.txt +504 -0
  68. data/app/assets/libs/tiny_mce/plugins/advhr/css/advhr.css +5 -0
  69. data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
  70. data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin_src.js +57 -0
  71. data/app/assets/libs/tiny_mce/plugins/advhr/js/rule.js +43 -0
  72. data/app/assets/libs/tiny_mce/plugins/advhr/langs/en_dlg.js +1 -0
  73. data/app/assets/libs/tiny_mce/plugins/advhr/rule.htm +58 -0
  74. data/app/assets/libs/tiny_mce/plugins/advimage/css/advimage.css +13 -0
  75. data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
  76. data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin_src.js +50 -0
  77. data/app/assets/libs/tiny_mce/plugins/advimage/image.htm +235 -0
  78. data/app/assets/libs/tiny_mce/plugins/advimage/img/sample.gif +0 -0
  79. data/app/assets/libs/tiny_mce/plugins/advimage/js/image.js +462 -0
  80. data/app/assets/libs/tiny_mce/plugins/advimage/langs/en_dlg.js +1 -0
  81. data/app/assets/libs/tiny_mce/plugins/advlink/css/advlink.css +8 -0
  82. data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
  83. data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin_src.js +61 -0
  84. data/app/assets/libs/tiny_mce/plugins/advlink/js/advlink.js +539 -0
  85. data/app/assets/libs/tiny_mce/plugins/advlink/langs/en_dlg.js +1 -0
  86. data/app/assets/libs/tiny_mce/plugins/advlink/link.htm +338 -0
  87. data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
  88. data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin_src.js +176 -0
  89. data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin.js +1 -0
  90. data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin_src.js +174 -0
  91. data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin.js +1 -0
  92. data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin_src.js +119 -0
  93. data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
  94. data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin_src.js +161 -0
  95. data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
  96. data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin_src.js +82 -0
  97. data/app/assets/libs/tiny_mce/plugins/example/dialog.htm +22 -0
  98. data/app/assets/libs/tiny_mce/plugins/example/editor_plugin.js +1 -0
  99. data/app/assets/libs/tiny_mce/plugins/example/editor_plugin_src.js +84 -0
  100. data/app/assets/libs/tiny_mce/plugins/example/img/example.gif +0 -0
  101. data/app/assets/libs/tiny_mce/plugins/example/js/dialog.js +19 -0
  102. data/app/assets/libs/tiny_mce/plugins/example/langs/en.js +3 -0
  103. data/app/assets/libs/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
  104. data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin.js +1 -0
  105. data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin_src.js +50 -0
  106. data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
  107. data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin_src.js +54 -0
  108. data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  109. data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +699 -0
  110. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  111. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  112. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  113. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  114. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  115. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  116. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  117. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  118. data/app/assets/libs/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  119. data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin.js +1 -0
  120. data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin_src.js +262 -0
  121. data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  122. data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin_src.js +951 -0
  123. data/app/assets/libs/tiny_mce/plugins/media/css/media.css +17 -0
  124. data/app/assets/libs/tiny_mce/plugins/media/editor_plugin.js +1 -0
  125. data/app/assets/libs/tiny_mce/plugins/media/editor_plugin_src.js +890 -0
  126. data/app/assets/libs/tiny_mce/plugins/media/js/embed.js +73 -0
  127. data/app/assets/libs/tiny_mce/plugins/media/js/media.js +470 -0
  128. data/app/assets/libs/tiny_mce/plugins/media/langs/en_dlg.js +1 -0
  129. data/app/assets/libs/tiny_mce/plugins/media/media.htm +922 -0
  130. data/app/assets/libs/tiny_mce/plugins/media/moxieplayer.swf +0 -0
  131. data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  132. data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin_src.js +871 -0
  133. data/app/assets/libs/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  134. data/app/assets/libs/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  135. data/app/assets/libs/tiny_mce/plugins/paste/langs/en_dlg.js +1 -0
  136. data/app/assets/libs/tiny_mce/plugins/paste/pastetext.htm +27 -0
  137. data/app/assets/libs/tiny_mce/plugins/paste/pasteword.htm +21 -0
  138. data/app/assets/libs/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  139. data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  140. data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin_src.js +436 -0
  141. data/app/assets/libs/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  142. data/app/assets/libs/tiny_mce/plugins/style/css/props.css +14 -0
  143. data/app/assets/libs/tiny_mce/plugins/style/editor_plugin.js +1 -0
  144. data/app/assets/libs/tiny_mce/plugins/style/editor_plugin_src.js +71 -0
  145. data/app/assets/libs/tiny_mce/plugins/style/js/props.js +709 -0
  146. data/app/assets/libs/tiny_mce/plugins/style/langs/en_dlg.js +1 -0
  147. data/app/assets/libs/tiny_mce/plugins/style/props.htm +845 -0
  148. data/app/assets/libs/tiny_mce/plugins/style/readme.txt +19 -0
  149. data/app/assets/libs/tiny_mce/plugins/table/cell.htm +180 -0
  150. data/app/assets/libs/tiny_mce/plugins/table/css/cell.css +17 -0
  151. data/app/assets/libs/tiny_mce/plugins/table/css/row.css +25 -0
  152. data/app/assets/libs/tiny_mce/plugins/table/css/table.css +13 -0
  153. data/app/assets/libs/tiny_mce/plugins/table/editor_plugin.js +1 -0
  154. data/app/assets/libs/tiny_mce/plugins/table/editor_plugin_src.js +1428 -0
  155. data/app/assets/libs/tiny_mce/plugins/table/js/cell.js +319 -0
  156. data/app/assets/libs/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  157. data/app/assets/libs/tiny_mce/plugins/table/js/row.js +237 -0
  158. data/app/assets/libs/tiny_mce/plugins/table/js/table.js +489 -0
  159. data/app/assets/libs/tiny_mce/plugins/table/langs/en_dlg.js +1 -0
  160. data/app/assets/libs/tiny_mce/plugins/table/merge_cells.htm +32 -0
  161. data/app/assets/libs/tiny_mce/plugins/table/row.htm +158 -0
  162. data/app/assets/libs/tiny_mce/plugins/table/table.htm +188 -0
  163. data/app/assets/libs/tiny_mce/plugins/tableDropdown/editor_plugin.js +140 -0
  164. data/app/assets/libs/tiny_mce/themes/advanced/about.htm +52 -0
  165. data/app/assets/libs/tiny_mce/themes/advanced/anchor.htm +26 -0
  166. data/app/assets/libs/tiny_mce/themes/advanced/charmap.htm +55 -0
  167. data/app/assets/libs/tiny_mce/themes/advanced/color_picker.htm +70 -0
  168. data/app/assets/libs/tiny_mce/themes/advanced/editor_template.js +1 -0
  169. data/app/assets/libs/tiny_mce/themes/advanced/editor_template_src.js +1467 -0
  170. data/app/assets/libs/tiny_mce/themes/advanced/image.htm +80 -0
  171. data/app/assets/libs/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  172. data/app/assets/libs/tiny_mce/themes/advanced/img/flash.gif +0 -0
  173. data/app/assets/libs/tiny_mce/themes/advanced/img/icons.gif +0 -0
  174. data/app/assets/libs/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  175. data/app/assets/libs/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  176. data/app/assets/libs/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  177. data/app/assets/libs/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  178. data/app/assets/libs/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  179. data/app/assets/libs/tiny_mce/themes/advanced/img/trans.gif +0 -0
  180. data/app/assets/libs/tiny_mce/themes/advanced/img/video.gif +0 -0
  181. data/app/assets/libs/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  182. data/app/assets/libs/tiny_mce/themes/advanced/js/about.js +73 -0
  183. data/app/assets/libs/tiny_mce/themes/advanced/js/anchor.js +44 -0
  184. data/app/assets/libs/tiny_mce/themes/advanced/js/charmap.js +363 -0
  185. data/app/assets/libs/tiny_mce/themes/advanced/js/color_picker.js +345 -0
  186. data/app/assets/libs/tiny_mce/themes/advanced/js/image.js +251 -0
  187. data/app/assets/libs/tiny_mce/themes/advanced/js/link.js +153 -0
  188. data/app/assets/libs/tiny_mce/themes/advanced/js/source_editor.js +78 -0
  189. data/app/assets/libs/tiny_mce/themes/advanced/langs/en.js +1 -0
  190. data/app/assets/libs/tiny_mce/themes/advanced/langs/en_dlg.js +1 -0
  191. data/app/assets/libs/tiny_mce/themes/advanced/link.htm +57 -0
  192. data/app/assets/libs/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  193. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/content.css +51 -0
  194. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/dialog.css +118 -0
  195. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  196. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  197. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  198. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  199. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  200. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  201. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/ui.css +215 -0
  202. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/content.css +25 -0
  203. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +106 -0
  204. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  205. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/content.css +49 -0
  206. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/dialog.css +118 -0
  207. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  208. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  209. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  210. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui.css +218 -0
  211. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  212. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  213. data/app/assets/libs/tiny_mce/themes/advanced/source_editor.htm +25 -0
  214. data/app/assets/libs/tiny_mce/themes/simple/editor_template.js +1 -0
  215. data/app/assets/libs/tiny_mce/themes/simple/editor_template_src.js +84 -0
  216. data/app/assets/libs/tiny_mce/themes/simple/img/icons.gif +0 -0
  217. data/app/assets/libs/tiny_mce/themes/simple/langs/en.js +1 -0
  218. data/app/assets/libs/tiny_mce/themes/simple/skins/default/content.css +25 -0
  219. data/app/assets/libs/tiny_mce/themes/simple/skins/default/ui.css +32 -0
  220. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
  221. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  222. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
  223. data/app/assets/libs/tiny_mce/tiny_mce.js +1 -0
  224. data/app/assets/libs/tiny_mce/tiny_mce_popup.js +5 -0
  225. data/app/assets/libs/tiny_mce/tiny_mce_src.js +16753 -0
  226. data/app/assets/libs/tiny_mce/utils/editable_selects.js +70 -0
  227. data/app/assets/libs/tiny_mce/utils/form_utils.js +210 -0
  228. data/app/assets/libs/tiny_mce/utils/mctabs.js +162 -0
  229. data/app/assets/libs/tiny_mce/utils/validate.js +252 -0
  230. data/app/assets/stylesheets/spud/admin/application.css +480 -0
  231. data/app/assets/stylesheets/spud/admin/jquery-ui.css +568 -0
  232. data/app/assets/stylesheets/spud/admin/settings.css +4 -0
  233. data/app/assets/stylesheets/spud/admin/users.css +4 -0
  234. data/app/assets/stylesheets/spud/forms.css +108 -0
  235. data/app/assets/stylesheets/spud/login/application.css +302 -0
  236. data/app/assets/stylesheets/spud/login.css +58 -0
  237. data/app/assets/stylesheets/spud/password_resets.css +4 -0
  238. data/app/assets/stylesheets/spud/setup.css +4 -0
  239. data/app/assets/stylesheets/spud/sitemaps.css +4 -0
  240. data/app/assets/stylesheets/spud/user_sessions.css +4 -0
  241. data/app/assets/stylesheets/spud/users.css +4 -0
  242. data/app/controllers/spud/admin/application_controller.rb +61 -0
  243. data/app/controllers/spud/admin/dashboard_controller.rb +34 -0
  244. data/app/controllers/spud/admin/users_controller.rb +109 -0
  245. data/app/controllers/spud/application_controller.rb +89 -0
  246. data/app/controllers/spud/password_resets_controller.rb +50 -0
  247. data/app/controllers/spud/setup_controller.rb +21 -0
  248. data/app/controllers/spud/sitemaps_controller.rb +8 -0
  249. data/app/controllers/spud/user_sessions_controller.rb +33 -0
  250. data/app/controllers/spud/users_controller.rb +45 -0
  251. data/app/helpers/spud/admin/application_helper.rb +54 -0
  252. data/app/helpers/spud/application_helper.rb +22 -0
  253. data/app/helpers/spud/password_resets_helper.rb +2 -0
  254. data/app/mailers/spud/core_mailer.rb +12 -0
  255. data/app/models/concerns/spud_authentication.rb +10 -0
  256. data/app/models/spud_admin_permission.rb +5 -0
  257. data/app/models/spud_user.rb +26 -0
  258. data/app/models/spud_user_session.rb +3 -0
  259. data/app/models/spud_user_setting.rb +6 -0
  260. data/app/views/layouts/spud/admin/application.html.erb +72 -0
  261. data/app/views/layouts/spud/admin/detail.html.erb +31 -0
  262. data/app/views/layouts/spud/login/application.html.erb +17 -0
  263. data/app/views/layouts/spud/setup.html.erb +47 -0
  264. data/app/views/spud/admin/dashboard/index.html.erb +18 -0
  265. data/app/views/spud/admin/users/_edit.html.erb +14 -0
  266. data/app/views/spud/admin/users/_form.html.erb +90 -0
  267. data/app/views/spud/admin/users/_new.html.erb +15 -0
  268. data/app/views/spud/admin/users/edit.html.erb +3 -0
  269. data/app/views/spud/admin/users/index.html.erb +42 -0
  270. data/app/views/spud/admin/users/new.html.erb +3 -0
  271. data/app/views/spud/admin/users/show.html.erb +12 -0
  272. data/app/views/spud/core_mailer/forgot_password_notification.html.erb +14 -0
  273. data/app/views/spud/core_mailer/forgot_password_notification.text.erb +10 -0
  274. data/app/views/spud/password_resets/edit.html.erb +25 -0
  275. data/app/views/spud/password_resets/new.html.erb +14 -0
  276. data/app/views/spud/setup/index.html.erb +43 -0
  277. data/app/views/spud/sitemaps/show.xml.builder +12 -0
  278. data/app/views/spud/user_sessions/new.html.erb +27 -0
  279. data/app/views/spud/users/_form.html.erb +60 -0
  280. data/app/views/spud/users/settings.html.erb +12 -0
  281. data/config/routes.rb +18 -0
  282. data/db/migrate/20111214161011_create_spud_admin_permissions.rb +11 -0
  283. data/db/migrate/20111214161146_create_spud_users.rb +29 -0
  284. data/db/migrate/20120327124229_add_time_zone_to_spud_user.rb +6 -0
  285. data/db/migrate/20120328235431_add_scope_to_spud_admin_permissions.rb +6 -0
  286. data/db/migrate/20120329174000_create_spud_user_settings.rb +11 -0
  287. data/lib/spud_core/belongs_to_app.rb +59 -0
  288. data/lib/spud_core/configuration.rb +58 -0
  289. data/lib/spud_core/engine.rb +55 -0
  290. data/lib/spud_core/searchable.rb +11 -0
  291. data/lib/spud_core/test_files.rb +25 -0
  292. data/lib/spud_core/version.rb +5 -0
  293. data/lib/tasks/spud_core_tasks.rake +4 -0
  294. data/lib/tb_core.rb +6 -0
  295. data/spec/controllers/spud/admin/application_controller_spec.rb +49 -0
  296. data/spec/controllers/spud/admin/dashboard_controller_spec.rb +129 -0
  297. data/spec/controllers/spud/admin/users_controller_spec.rb +194 -0
  298. data/spec/controllers/spud/application_controller_spec.rb +6 -0
  299. data/spec/controllers/spud/password_reset_controller_spec.rb +93 -0
  300. data/spec/controllers/spud/setup_controller_spec.rb +56 -0
  301. data/spec/controllers/spud/sitemap_controllers_spec.rb +20 -0
  302. data/spec/controllers/spud/user_sessions_controller_spec.rb +51 -0
  303. data/spec/controllers/spud/users_controller_spec.rb +69 -0
  304. data/spec/dummy/README.rdoc +261 -0
  305. data/spec/dummy/Rakefile +7 -0
  306. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  307. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  308. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  309. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  310. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  311. data/spec/dummy/config/application.rb +58 -0
  312. data/spec/dummy/config/boot.rb +10 -0
  313. data/spec/dummy/config/database.yml +15 -0
  314. data/spec/dummy/config/environment.rb +5 -0
  315. data/spec/dummy/config/environments/development.rb +37 -0
  316. data/spec/dummy/config/environments/production.rb +67 -0
  317. data/spec/dummy/config/environments/test.rb +37 -0
  318. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  319. data/spec/dummy/config/initializers/inflections.rb +15 -0
  320. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  321. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  322. data/spec/dummy/config/initializers/session_store.rb +8 -0
  323. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  324. data/spec/dummy/config/locales/en.yml +5 -0
  325. data/spec/dummy/config/routes.rb +5 -0
  326. data/spec/dummy/config.ru +4 -0
  327. data/spec/dummy/db/schema.rb +59 -0
  328. data/spec/dummy/log/development.log +39 -0
  329. data/spec/dummy/log/test.log +37811 -0
  330. data/spec/dummy/public/404.html +26 -0
  331. data/spec/dummy/public/422.html +26 -0
  332. data/spec/dummy/public/500.html +25 -0
  333. data/spec/dummy/public/favicon.ico +0 -0
  334. data/spec/dummy/script/rails +6 -0
  335. data/spec/helpers/spud/admin/application_helper_spec.rb +150 -0
  336. data/spec/helpers/spud/application_helper_spec.rb +66 -0
  337. data/spec/lib/spud_core/configuration_spec.rb +34 -0
  338. data/spec/models/spud_user_spec.rb +27 -0
  339. data/spec/spec_helper.rb +40 -0
  340. data/spec/support/authlogic_helper.rb +2 -0
  341. metadata +652 -0
@@ -0,0 +1,89 @@
1
+ class Spud::ApplicationController < ActionController::Base
2
+ unloadable
3
+ protect_from_forgery
4
+ helper_method :current_user_session, :current_user
5
+ around_filter :set_time_zone
6
+
7
+ if Spud::Core.multisite_mode_enabled
8
+ before_filter :multisite_caching
9
+ end
10
+ include Spud::ApplicationHelper
11
+ before_filter :to
12
+
13
+
14
+ private
15
+
16
+ def to
17
+ ActionMailer::Base.default_url_options = {:host => request.host_with_port}
18
+ end
19
+
20
+ def current_user_session
21
+ return @current_user_session if defined?(@current_user_session)
22
+ @current_user_session = SpudUserSession.find
23
+ end
24
+
25
+ def current_user
26
+ return @current_user if defined?(@current_user)
27
+ @current_user = current_user_session && current_user_session.spud_user
28
+ end
29
+
30
+ def current_user_permissions
31
+ return @current_user_permissions if defined?(@current_user_permissions)
32
+ @current_user_permissions = current_user.spud_admin_permissions.where(:access => true).all
33
+ end
34
+
35
+ def require_user
36
+ unless current_user
37
+ store_location
38
+ flash[:notice] = "You must be logged in to access this page"
39
+ redirect_to new_spud_user_session_url
40
+ return false
41
+ end
42
+ return true
43
+ end
44
+
45
+ def require_no_user
46
+ if current_user
47
+ store_location
48
+ flash[:notice] = "You must be logged out to access this page"
49
+ redirect_to root_url
50
+ return false
51
+ end
52
+ end
53
+
54
+ def store_location
55
+ session[:return_to] = request.url
56
+ end
57
+
58
+ def redirect_back_or_default(default)
59
+ redirect_to(back_or_default(default))
60
+ end
61
+
62
+ def back_or_default(default)
63
+ result = !session[:return_to].blank? ? session[:return_to] : default
64
+ session[:return_to] = nil
65
+ return result
66
+ end
67
+
68
+ def set_time_zone
69
+ old_time_zone = Time.zone
70
+ Time.zone = current_user.time_zone if current_user and current_user.time_zone.blank? == false
71
+ yield
72
+ ensure
73
+ Time.zone = old_time_zone
74
+ end
75
+
76
+ def multisite_caching
77
+ if Spud::Core.multisite_mode_enabled
78
+ @old_cache_directory = Rails.application.config.action_controller.page_cache_directory
79
+ if(@old_cache_directory.blank?)
80
+ @old_cache_directory = Rails.application.config.action_controller.page_cache_directory = File.join(Rails.root,'public')
81
+ end
82
+ site_config = Spud::Core.site_config_for_host request.host_with_port
83
+
84
+ self.class.page_cache_directory = File.join(@old_cache_directory.to_s,site_config[:short_name].to_s.downcase)
85
+ logger.debug "Cache directory set to: #{Rails.application.config.action_controller.page_cache_directory}"
86
+ end
87
+ end
88
+
89
+ end
@@ -0,0 +1,50 @@
1
+ class Spud::PasswordResetsController < Spud::ApplicationController
2
+ before_filter :require_no_user, :only => [:new, :create]
3
+ before_filter :load_user_using_perishable_token, :only => [:edit, :update]
4
+
5
+ layout 'spud/login/application'
6
+
7
+ def new
8
+ render
9
+ end
10
+
11
+ def create
12
+ @user = SpudUser.find_by_email(params[:email])
13
+ if @user
14
+ Spud::CoreMailer.forgot_password_notification(@user).deliver
15
+ flash[:notice] = "Instructions to reset your password have been emailed to you. " +
16
+ "Please check your email."
17
+ redirect_to new_spud_user_session_url
18
+ else
19
+ flash[:notice] = "No user was found with that email address"
20
+ render :action => :new
21
+ end
22
+ end
23
+
24
+ def edit
25
+ render
26
+ end
27
+
28
+ def update
29
+ @user.password = params[:spud_user][:password]
30
+ @user.password_confirmation = params[:spud_user][:password_confirmation]
31
+ if @user.save
32
+ flash[:notice] = "Password successfully updated"
33
+ redirect_to new_spud_user_session_url
34
+ else
35
+ render :action => :edit
36
+ end
37
+ end
38
+
39
+ private
40
+ def load_user_using_perishable_token
41
+ @user = SpudUser.find_using_perishable_token(params[:id])
42
+ unless @user
43
+ flash[:notice] = "We're sorry, but we could not locate your account. " +
44
+ "If you are having issues try copying and pasting the URL " +
45
+ "from your email into your browser or restarting the " +
46
+ "reset password process."
47
+ redirect_to new_spud_user_session_url
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ class Spud::SetupController < Spud::ApplicationController
2
+ layout 'spud/setup'
3
+ def index
4
+ @page_thumbnail = "spud/admin/users_thumb.png"
5
+ @page_name = "First Time Setup"
6
+ if SpudUser.count != 0
7
+ flash[:error] = "Access Denied! This wizard may only be executed when the database is empty."
8
+ redirect_to new_spud_user_session_url and return
9
+ end
10
+
11
+ if request.post?
12
+ @user = SpudUser.new(:login => params[:login],:email => params[:email],:password => params[:password],:password_confirmation => params[:password_confirmation])
13
+ @user.super_admin = true
14
+ if @user.save
15
+ redirect_back_or_default(new_spud_user_session_url) and return
16
+ end
17
+
18
+ flash[:error] = "Error creating administrative account!"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ class Spud::SitemapsController < Spud::ApplicationController
2
+ respond_to :xml
3
+ caches_page :show,:expires_in => 1.day
4
+ def show
5
+ @sitemap_urls = Spud::Core.sitemap_urls
6
+ respond_with @sitemap_urls
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ class Spud::UserSessionsController < Spud::ApplicationController
2
+ before_filter :require_no_user, :only => [:new, :create]
3
+ before_filter :require_user, :only => :destroy
4
+ layout 'spud/login/application'
5
+ def new
6
+ if SpudUser.all.count == 0
7
+ logger.debug "NO USERS!"
8
+ redirect_to spud_setup_url() and return
9
+ end
10
+
11
+ @user_session = SpudUserSession.new
12
+ end
13
+
14
+ def create
15
+ @user_session = SpudUserSession.new(params[:spud_user_session])
16
+ if @user_session.save
17
+ flash[:notice] = "Login successful!"
18
+ redirect_back_or_default spud_admin_root_path
19
+ else
20
+ render :action => :new
21
+ end
22
+ end
23
+
24
+ def destroy
25
+ current_user_session.destroy
26
+ flash[:notice] = "Logout successful!"
27
+ if !request.referer.blank?
28
+ session[:return_to] = request.referer
29
+ end
30
+ redirect_back_or_default new_spud_user_session_url
31
+
32
+ end
33
+ end
@@ -0,0 +1,45 @@
1
+ class Spud::UsersController < Spud::ApplicationController
2
+ before_filter :require_user
3
+ layout 'spud/admin/detail'
4
+
5
+ def settings
6
+ if current_user.has_admin_rights?
7
+ add_breadcrumb "Dashboard", :spud_admin_root_path
8
+ end
9
+ add_breadcrumb "Settings", :spud_settings_path
10
+ @page_thumbnail = "spud/admin/users_thumb.png"
11
+ @page_name = "Settings"
12
+ end
13
+
14
+ def update
15
+
16
+ add_breadcrumb "Settings", :spud_settings_path
17
+ @page_thumbnail = "spud/admin/users_thumb.png"
18
+ @page_name = "Settings"
19
+ if @current_user.update_attributes(params[:spud_user].slice :login,:first_name,:last_name,:email,:password,:password_confirmation,:time_zone)
20
+ flash[:notice] = "User settings saved successfully."
21
+ redirect_to spud_admin_root_url()
22
+ else
23
+ flash[:error] = "There was an error while saving the user."
24
+ render :action => "settings"
25
+ end
26
+ end
27
+
28
+
29
+ def save_setting
30
+ if params[:key].blank?
31
+ render :status => 500,:text => nil and return
32
+ end
33
+
34
+ setting = @current_user.spud_user_settings.where(:key => params[:key]).first
35
+ if setting.blank?
36
+ setting = @current_user.spud_user_settings.new(:key => params[:key])
37
+ end
38
+ setting.value = params[:value]
39
+ if setting.save
40
+ render :status => 200,:text => nil and return
41
+ else
42
+ render :status => 500,:text => nil and return
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,54 @@
1
+ module Spud::Admin::ApplicationHelper
2
+
3
+ def timestamp(timedate=nil)
4
+ return "Never" if timedate.blank?
5
+ return Time.now() - timedate > 604800 ? timedate.strftime("%B %d") + ' at ' + timedate.strftime("%I:%M %p") : time_ago_in_words(timedate) + ' ago'
6
+ end
7
+
8
+ def current_admin_site_name
9
+ site_name = Spud::Core.site_name
10
+ if Spud::Core.multisite_mode_enabled && !session[:admin_site].blank?
11
+ config = Spud::Core.multisite_config.select{|p| p[:site_id].to_i == session[:admin_site].to_i}
12
+ site_name = config[0][:site_name] if !config.blank?
13
+ end
14
+ return site_name
15
+ end
16
+
17
+ def header_style
18
+ style_str = ''
19
+ if Spud::Core.multisite_mode_enabled
20
+ config = Spud::Core.multisite_config.select{|p| p[:site_id].to_i == session[:admin_site].to_i}
21
+ style_str = config[0][:header_style] if !config.blank? && config[0].has_key?(:header_style)
22
+ end
23
+ return style_str
24
+ end
25
+
26
+ def link_to_remove_fields(name, f)
27
+ f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)",:class => "btn btn-danger")
28
+ end
29
+
30
+ def link_to_add_fields(name, f, association)
31
+ new_object = f.object.class.reflect_on_association(association).klass.new
32
+ fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
33
+ render(association.to_s.singularize + "_fields", :f => builder)
34
+ end
35
+ link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")",:class =>"btn")
36
+ end
37
+
38
+ def error_messages_for(object)
39
+ content = ""
40
+ if object.errors.any?
41
+ content += "<div class='spud_admin_form_error_list'>"
42
+ content += "<h4>#{pluralize(object.errors.count, "error")} prohibited you from saving:</h4>"
43
+ content +="<ul>"
44
+ object.errors.full_messages.each do |msg|
45
+ content+="<li>#{msg}</li>"
46
+ end
47
+ content +="</ul></div>"
48
+ end
49
+ return content.html_safe
50
+
51
+ end
52
+
53
+
54
+ end
@@ -0,0 +1,22 @@
1
+ module Spud::ApplicationHelper
2
+ def current_site_name
3
+ return Spud::Core.site_name if !Spud::Core.multisite_mode_enabled
4
+ config = Spud::Core.site_config_for_host(request.host_with_port)
5
+ return Spud::Core.site_name if config.blank?
6
+
7
+ return config[:site_name]
8
+ end
9
+
10
+ def current_site_id
11
+ config = Spud::Core.site_config_for_host(request.host_with_port)
12
+ return config[:site_id] unless config.blank?
13
+ end
14
+
15
+ def sortable(column, title = nil)
16
+ title ||= column.titleize
17
+ css_class = column == sort_column ? "current #{sort_direction}" : nil
18
+ direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
19
+ link_to title, {:sort => column, :direction => direction}, {:class => css_class}
20
+ end
21
+
22
+ end
@@ -0,0 +1,2 @@
1
+ module Spud::PasswordResetsHelper
2
+ end
@@ -0,0 +1,12 @@
1
+ class Spud::CoreMailer < ActionMailer::Base
2
+ # default_url_options[:host] = request.host_with_port
3
+
4
+ def forgot_password_notification(user)
5
+ @user = user
6
+ @url = edit_spud_password_reset_url(:id => user.perishable_token)
7
+ # @url = "/spud/password_resets/#{user.perishable_token}/edit"
8
+ mail(:from =>Spud::Core.from_address,:to => user.email, :subject => "Forgot Password Request from #{Spud::Core.config.site_name}")
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,10 @@
1
+ module Concerns
2
+ module SpudAuthentication
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ acts_as_authentic do |c|
6
+ # c.my_config_option = my_value # for available options see documentation in: Authlogic::ActsAsAuthentic
7
+ end # block optional
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class SpudAdminPermission < ActiveRecord::Base
2
+ belongs_to :spud_user,:foreign_key => :user_id
3
+ attr_accessible :name,:access, :as => [:default, :admin]
4
+
5
+ end
@@ -0,0 +1,26 @@
1
+ class SpudUser < ActiveRecord::Base
2
+ include Concerns::SpudAuthentication
3
+
4
+ has_many :spud_admin_permissions,:foreign_key => :user_id
5
+ has_many :spud_user_settings
6
+ accepts_nested_attributes_for :spud_admin_permissions, :allow_destroy => true
7
+
8
+ attr_accessible :login,:email,:first_name,:last_name,:password,:password_confirmation,:password_salt,:last_login_at,:last_request_at,:last_login_ip,:failed_login_count,:current_login_at,:login_count,:persistence_token,:perishable_token,:single_access_token,:crypted_password, :current_login_ip, :created_at, :updated_at,:spud_admin_permissions_attributes,:time_zone, :as => [:default, :admin]
9
+ attr_accessible :super_admin, :id, :as => :admin
10
+
11
+ def has_admin_rights?
12
+ return self.super_admin || self.spud_admin_permissions.count > 0
13
+ end
14
+
15
+ def full_name
16
+ if first_name.blank? && last_name.blank?
17
+ return self.login
18
+ end
19
+ if self.first_name.blank?
20
+ return self.last_name
21
+ elsif self.last_name.blank?
22
+ return self.first_name
23
+ end
24
+ return "#{self.first_name} #{self.last_name}"
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ class SpudUserSession < Authlogic::Session::Base
2
+ generalize_credentials_error_messages true
3
+ end
@@ -0,0 +1,6 @@
1
+ class SpudUserSetting < ActiveRecord::Base
2
+ belongs_to :spud_user
3
+
4
+ validates :key,:presence=>true
5
+ validates_uniqueness_of :key,:scope => :spud_user_id
6
+ end
@@ -0,0 +1,72 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Spud Admin</title>
5
+ <%= stylesheet_link_tag *Spud::Core.config.admin_stylesheets %>
6
+ <%= javascript_include_tag *Spud::Core.config.admin_javascripts %>
7
+ <%= csrf_meta_tags %>
8
+ <%=yield :head%>
9
+ </head>
10
+ <body>
11
+ <div id="header" style="<%=header_style%>">
12
+ <%=link_to spud_admin_root_url do%>
13
+ <h1>Spud Admin</h1>
14
+ <%end%>
15
+
16
+ <div id="user_meta">
17
+ <span class="greeting">Hello <%=@current_user.full_name%></span>&nbsp;|&nbsp;<%=link_to "Settings", spud_settings_path%>&nbsp;|&nbsp;<%=link_to "Logout",spud_user_session_url,:method => :delete%></a>
18
+ </div>
19
+ <%if Spud::Core.multisite_mode_enabled == true%>
20
+ <div id="multisite_switcher" class="right_floated">
21
+ <%=form_tag spud_admin_switch_url do%>
22
+ <%=select_tag :multisite_select,options_for_select([[Spud::Core.site_name,nil]] + Spud::Core.multisite_config.collect{|c| [c[:site_name],c[:site_id]]},session[:admin_site])%>
23
+ <%end%>
24
+ </div>
25
+ <%end%>
26
+ </div>
27
+ <div id="breadcrumbs">
28
+ <%= render_breadcrumbs :separator => ' / ' %>
29
+ </div>
30
+ <div id="content">
31
+ <% if flash[:notice] %>
32
+ <div class="alert alert-success">
33
+ <a class="close" data-dismiss="alert">×</a>
34
+ <%= flash[:notice] %>
35
+ </div>
36
+ <% end %>
37
+ <% if flash[:warning] %>
38
+
39
+ <div class="alert alert-warning">
40
+ <a class="close" data-dismiss="alert">×</a>
41
+ <%= flash[:warning] %>
42
+ </div>
43
+ <% end %>
44
+ <% if flash[:error]%>
45
+
46
+ <div class="alert alert-error">
47
+ <a class="close" data-dismiss="alert">×</a>
48
+ <%= flash[:error] %>
49
+ </div>
50
+ <%-end%>
51
+ <%= content_for?(:content) ? yield(:content) : yield %>
52
+ </div>
53
+
54
+
55
+
56
+
57
+ <div id="modal_window" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
58
+ <div class="modal-header">
59
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
60
+ <h3 class="modal-title"></h3>
61
+ </div>
62
+ <div class="modal-body">
63
+
64
+ </div>
65
+ <div class="modal-footer modal-footer-default">
66
+ <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
67
+ <button class="btn btn-primary form-submit">Save changes</button>
68
+ </div>
69
+ </div>
70
+
71
+ </body>
72
+ </html>
@@ -0,0 +1,31 @@
1
+ <%=content_for :content do %>
2
+ <div id="detail_wrapper">
3
+ <span class="data_controls">
4
+ <%=yield :data_controls%>
5
+ </span>
6
+ <h2>
7
+ <%if @page_thumbnail%>
8
+ <span class="thumb_wrapper"><%=image_tag(@page_thumbnail)%></span>
9
+ <%end%>
10
+ <%=@page_name%>
11
+ </h2>
12
+
13
+ <div id="details">
14
+ <%if content_for?(:detail_nav)%>
15
+ <div id="detail_nav_wrapper">
16
+ <div id="detail_nav">
17
+ <%= yield(:detail_nav)%>
18
+ </div>
19
+ </div>
20
+ <div id="detail_main_wrapper">
21
+ <div id="detail_main">
22
+ <%= content_for?(:detail) ? yield(:detail) : yield %></div>
23
+ </div>
24
+ <br style="clear:both;"/>
25
+ <%else%>
26
+ <%= content_for?(:detail) ? yield(:detail) : yield %>
27
+ <%end%>
28
+ </div>
29
+ </div>
30
+ <%end%>
31
+ <%= render :template => 'layouts/spud/admin/application' %>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Spud Admin</title>
5
+ <%= stylesheet_link_tag("spud/login/application") %>
6
+
7
+ <%= csrf_meta_tags %>
8
+ <%=content_for :head%>
9
+ </head>
10
+ <body>
11
+
12
+ <div id="content_wrapper">
13
+ <div id="content"><%=yield%></div>
14
+ </div>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1,47 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Spud Admin</title>
5
+ <%= stylesheet_link_tag "spud/admin/application" %>
6
+ <%= javascript_include_tag "spud/admin/application" %>
7
+ <%= csrf_meta_tags %>
8
+ <%=content_for :head%>
9
+ </head>
10
+ <body>
11
+ <div id="header">
12
+ <h1>Spud First Time Setup</h1>
13
+
14
+ </div>
15
+ <div id="breadcrumbs">
16
+ <%= render_breadcrumbs :separator => ' / ' %>
17
+ </div>
18
+ <div id="content">
19
+ <div id="detail_wrapper">
20
+ <h2>
21
+ <%if @page_thumbnail%>
22
+ <span class="thumb_wrapper"><%=image_tag(@page_thumbnail)%></span>
23
+ <%end%>
24
+ <%=@page_name%>
25
+ </h2>
26
+
27
+ <div id="details">
28
+ <%if content_for?(:detail_nav)%>
29
+ <div id="detail_nav_wrapper">
30
+ <div id="detail_nav">
31
+ <%= yield(:detail_nav)%></div>
32
+
33
+ </div>
34
+ <div id="detail_main_wrapper">
35
+ <div id="detail_main">
36
+ <%= content_for?(:detail) ? yield(:detail) : yield %></div>
37
+ </div>
38
+ <br style="clear:both;"/>
39
+ <%else%>
40
+ <%= content_for?(:detail) ? yield(:detail) : yield %>
41
+ <%end%>
42
+ </div>
43
+ </div>
44
+ </div>
45
+
46
+ </body>
47
+ </html>
@@ -0,0 +1,18 @@
1
+
2
+ <div class="sortable">
3
+ <%@admin_applications.each do |admin_application|%>
4
+
5
+ <div class="admin_application" id="application_name_<%=admin_application[:name]%>"><a href="<%=admin_application[:url]%>">
6
+ <div class="image_wrapper"><%=image_tag(admin_application[:thumbnail])%></div>
7
+ <span class="application_name"><%=admin_application[:name]%></span>
8
+ </a>
9
+ </div>
10
+
11
+ <%end%>
12
+ </div>
13
+ <div id="dashboard-editmode">
14
+ <a href="#" class="btn btn-primary" id="dashboard-editsave">Done Editing</a>&nbsp;<a id="dashboard-editcancel" href="#" class="btn">Cancel</a>
15
+ </div>
16
+ <script type="text/javascript">
17
+ $(document).ready(Spud.Admin.Dashboard.init);
18
+ </script>
@@ -0,0 +1,14 @@
1
+
2
+
3
+ <p> Fill in all information pertaining to the current user you wish to modify. Fields marked with * are required and must be filled out.</p>
4
+
5
+ <%=form_for @user,:url => spud_admin_user_path(:id => @user.id),:html=>{:class=>"form-horizontal"} do |f|%>
6
+ <%=render :partial => "form",:locals => {:f => f}%>
7
+
8
+ <div class="form-actions form-actions-no-modal">
9
+ <%=f.submit "Save User", :class=>"btn btn-primary"%> or <%=link_to "cancel",request.referer,:class => "btn"%>
10
+ </div>
11
+
12
+ <%end%>
13
+
14
+