tb_core 0.9.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +60 -0
- data/Rakefile +28 -0
- data/app/assets/images/back_disabled.jpg +0 -0
- data/app/assets/images/back_enabled.jpg +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/forward_disabled.jpg +0 -0
- data/app/assets/images/forward_enabled.jpg +0 -0
- data/app/assets/images/sort_asc.png +0 -0
- data/app/assets/images/sort_asc_disabled.png +0 -0
- data/app/assets/images/sort_both.png +0 -0
- data/app/assets/images/sort_desc.png +0 -0
- data/app/assets/images/sort_desc_disabled.png +0 -0
- data/app/assets/images/spud/admin/down_arrow.gif +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_55_ffffff_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_0073ea_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_666666_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_ff0084_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_ffffff_256x240.png +0 -0
- data/app/assets/images/spud/admin/spud_logo.png +0 -0
- data/app/assets/images/spud/admin/spud_logo@2x.png +0 -0
- data/app/assets/images/spud/admin/up_arrow.gif +0 -0
- data/app/assets/images/spud/admin/users_thumb.png +0 -0
- data/app/assets/javascripts/spud/admin/application.js +133 -0
- data/app/assets/javascripts/spud/admin/dashboard.js +80 -0
- data/app/assets/javascripts/spud/admin/date_picker.js +56 -0
- data/app/assets/javascripts/spud/admin/editor.js +167 -0
- data/app/assets/javascripts/spud/admin/jquery.dataTables.min.js +151 -0
- data/app/assets/javascripts/spud/admin/preinit.js +1 -0
- data/app/assets/javascripts/spud/password_resets.js +2 -0
- data/app/assets/libs/bootstrap/css/bootstrap-responsive.css +1088 -0
- data/app/assets/libs/bootstrap/css/bootstrap.css +5893 -0
- data/app/assets/libs/bootstrap/img/glyphicons-halflings-white.png +0 -0
- data/app/assets/libs/bootstrap/img/glyphicons-halflings.png +0 -0
- data/app/assets/libs/bootstrap/js/bootstrap.js +2025 -0
- data/app/assets/libs/datepicker/css/datepicker.css +223 -0
- data/app/assets/libs/datepicker/js/bootstrap-datepicker.js +779 -0
- data/app/assets/libs/datepicker/less/datepicker.less +122 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_55_ffffff_40x100.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_0073ea_256x240.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_666666_256x240.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ff0084_256x240.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ffffff_256x240.png +0 -0
- data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.css +297 -0
- data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.min.css +5 -0
- data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.js +4870 -0
- data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.min.js +6 -0
- data/app/assets/libs/tiny_mce/jquery.tinymce.js +1 -0
- data/app/assets/libs/tiny_mce/langs/en.js +1 -0
- data/app/assets/libs/tiny_mce/license.txt +504 -0
- data/app/assets/libs/tiny_mce/plugins/advhr/css/advhr.css +5 -0
- data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin_src.js +57 -0
- data/app/assets/libs/tiny_mce/plugins/advhr/js/rule.js +43 -0
- data/app/assets/libs/tiny_mce/plugins/advhr/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/advhr/rule.htm +58 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/css/advimage.css +13 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin_src.js +50 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/image.htm +235 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/img/sample.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/js/image.js +462 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/advlink/css/advlink.css +8 -0
- data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin_src.js +61 -0
- data/app/assets/libs/tiny_mce/plugins/advlink/js/advlink.js +539 -0
- data/app/assets/libs/tiny_mce/plugins/advlink/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/advlink/link.htm +338 -0
- data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin_src.js +176 -0
- data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin_src.js +174 -0
- data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin_src.js +119 -0
- data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin_src.js +161 -0
- data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin_src.js +82 -0
- data/app/assets/libs/tiny_mce/plugins/example/dialog.htm +22 -0
- data/app/assets/libs/tiny_mce/plugins/example/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/example/editor_plugin_src.js +84 -0
- data/app/assets/libs/tiny_mce/plugins/example/img/example.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/example/js/dialog.js +19 -0
- data/app/assets/libs/tiny_mce/plugins/example/langs/en.js +3 -0
- data/app/assets/libs/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
- data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin_src.js +50 -0
- data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin_src.js +54 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +699 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/template.htm +387 -0
- data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin_src.js +262 -0
- data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin_src.js +951 -0
- data/app/assets/libs/tiny_mce/plugins/media/css/media.css +17 -0
- data/app/assets/libs/tiny_mce/plugins/media/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/media/editor_plugin_src.js +890 -0
- data/app/assets/libs/tiny_mce/plugins/media/js/embed.js +73 -0
- data/app/assets/libs/tiny_mce/plugins/media/js/media.js +470 -0
- data/app/assets/libs/tiny_mce/plugins/media/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/media/media.htm +922 -0
- data/app/assets/libs/tiny_mce/plugins/media/moxieplayer.swf +0 -0
- data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin_src.js +871 -0
- data/app/assets/libs/tiny_mce/plugins/paste/js/pastetext.js +36 -0
- data/app/assets/libs/tiny_mce/plugins/paste/js/pasteword.js +51 -0
- data/app/assets/libs/tiny_mce/plugins/paste/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/paste/pastetext.htm +27 -0
- data/app/assets/libs/tiny_mce/plugins/paste/pasteword.htm +21 -0
- data/app/assets/libs/tiny_mce/plugins/spellchecker/css/content.css +1 -0
- data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin_src.js +436 -0
- data/app/assets/libs/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/style/css/props.css +14 -0
- data/app/assets/libs/tiny_mce/plugins/style/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/style/editor_plugin_src.js +71 -0
- data/app/assets/libs/tiny_mce/plugins/style/js/props.js +709 -0
- data/app/assets/libs/tiny_mce/plugins/style/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/style/props.htm +845 -0
- data/app/assets/libs/tiny_mce/plugins/style/readme.txt +19 -0
- data/app/assets/libs/tiny_mce/plugins/table/cell.htm +180 -0
- data/app/assets/libs/tiny_mce/plugins/table/css/cell.css +17 -0
- data/app/assets/libs/tiny_mce/plugins/table/css/row.css +25 -0
- data/app/assets/libs/tiny_mce/plugins/table/css/table.css +13 -0
- data/app/assets/libs/tiny_mce/plugins/table/editor_plugin.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/table/editor_plugin_src.js +1428 -0
- data/app/assets/libs/tiny_mce/plugins/table/js/cell.js +319 -0
- data/app/assets/libs/tiny_mce/plugins/table/js/merge_cells.js +27 -0
- data/app/assets/libs/tiny_mce/plugins/table/js/row.js +237 -0
- data/app/assets/libs/tiny_mce/plugins/table/js/table.js +489 -0
- data/app/assets/libs/tiny_mce/plugins/table/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/plugins/table/merge_cells.htm +32 -0
- data/app/assets/libs/tiny_mce/plugins/table/row.htm +158 -0
- data/app/assets/libs/tiny_mce/plugins/table/table.htm +188 -0
- data/app/assets/libs/tiny_mce/plugins/tableDropdown/editor_plugin.js +140 -0
- data/app/assets/libs/tiny_mce/themes/advanced/about.htm +52 -0
- data/app/assets/libs/tiny_mce/themes/advanced/anchor.htm +26 -0
- data/app/assets/libs/tiny_mce/themes/advanced/charmap.htm +55 -0
- data/app/assets/libs/tiny_mce/themes/advanced/color_picker.htm +70 -0
- data/app/assets/libs/tiny_mce/themes/advanced/editor_template.js +1 -0
- data/app/assets/libs/tiny_mce/themes/advanced/editor_template_src.js +1467 -0
- data/app/assets/libs/tiny_mce/themes/advanced/image.htm +80 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/flash.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/iframe.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/trans.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/video.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/about.js +73 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/anchor.js +44 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/charmap.js +363 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/color_picker.js +345 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/image.js +251 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/link.js +153 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/source_editor.js +78 -0
- data/app/assets/libs/tiny_mce/themes/advanced/langs/en.js +1 -0
- data/app/assets/libs/tiny_mce/themes/advanced/langs/en_dlg.js +1 -0
- data/app/assets/libs/tiny_mce/themes/advanced/link.htm +57 -0
- data/app/assets/libs/tiny_mce/themes/advanced/shortcuts.htm +47 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/content.css +51 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/dialog.css +118 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/ui.css +215 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/content.css +25 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +106 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/content.css +49 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/dialog.css +118 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui.css +218 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
- data/app/assets/libs/tiny_mce/themes/advanced/source_editor.htm +25 -0
- data/app/assets/libs/tiny_mce/themes/simple/editor_template.js +1 -0
- data/app/assets/libs/tiny_mce/themes/simple/editor_template_src.js +84 -0
- data/app/assets/libs/tiny_mce/themes/simple/img/icons.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/simple/langs/en.js +1 -0
- data/app/assets/libs/tiny_mce/themes/simple/skins/default/content.css +25 -0
- data/app/assets/libs/tiny_mce/themes/simple/skins/default/ui.css +32 -0
- data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
- data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
- data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
- data/app/assets/libs/tiny_mce/tiny_mce.js +1 -0
- data/app/assets/libs/tiny_mce/tiny_mce_popup.js +5 -0
- data/app/assets/libs/tiny_mce/tiny_mce_src.js +16753 -0
- data/app/assets/libs/tiny_mce/utils/editable_selects.js +70 -0
- data/app/assets/libs/tiny_mce/utils/form_utils.js +210 -0
- data/app/assets/libs/tiny_mce/utils/mctabs.js +162 -0
- data/app/assets/libs/tiny_mce/utils/validate.js +252 -0
- data/app/assets/stylesheets/spud/admin/application.css +480 -0
- data/app/assets/stylesheets/spud/admin/jquery-ui.css +568 -0
- data/app/assets/stylesheets/spud/admin/settings.css +4 -0
- data/app/assets/stylesheets/spud/admin/users.css +4 -0
- data/app/assets/stylesheets/spud/forms.css +108 -0
- data/app/assets/stylesheets/spud/login/application.css +302 -0
- data/app/assets/stylesheets/spud/login.css +58 -0
- data/app/assets/stylesheets/spud/password_resets.css +4 -0
- data/app/assets/stylesheets/spud/setup.css +4 -0
- data/app/assets/stylesheets/spud/sitemaps.css +4 -0
- data/app/assets/stylesheets/spud/user_sessions.css +4 -0
- data/app/assets/stylesheets/spud/users.css +4 -0
- data/app/controllers/spud/admin/application_controller.rb +61 -0
- data/app/controllers/spud/admin/dashboard_controller.rb +34 -0
- data/app/controllers/spud/admin/users_controller.rb +109 -0
- data/app/controllers/spud/application_controller.rb +89 -0
- data/app/controllers/spud/password_resets_controller.rb +50 -0
- data/app/controllers/spud/setup_controller.rb +21 -0
- data/app/controllers/spud/sitemaps_controller.rb +8 -0
- data/app/controllers/spud/user_sessions_controller.rb +33 -0
- data/app/controllers/spud/users_controller.rb +45 -0
- data/app/helpers/spud/admin/application_helper.rb +54 -0
- data/app/helpers/spud/application_helper.rb +22 -0
- data/app/helpers/spud/password_resets_helper.rb +2 -0
- data/app/mailers/spud/core_mailer.rb +12 -0
- data/app/models/concerns/spud_authentication.rb +10 -0
- data/app/models/spud_admin_permission.rb +5 -0
- data/app/models/spud_user.rb +26 -0
- data/app/models/spud_user_session.rb +3 -0
- data/app/models/spud_user_setting.rb +6 -0
- data/app/views/layouts/spud/admin/application.html.erb +72 -0
- data/app/views/layouts/spud/admin/detail.html.erb +31 -0
- data/app/views/layouts/spud/login/application.html.erb +17 -0
- data/app/views/layouts/spud/setup.html.erb +47 -0
- data/app/views/spud/admin/dashboard/index.html.erb +18 -0
- data/app/views/spud/admin/users/_edit.html.erb +14 -0
- data/app/views/spud/admin/users/_form.html.erb +90 -0
- data/app/views/spud/admin/users/_new.html.erb +15 -0
- data/app/views/spud/admin/users/edit.html.erb +3 -0
- data/app/views/spud/admin/users/index.html.erb +42 -0
- data/app/views/spud/admin/users/new.html.erb +3 -0
- data/app/views/spud/admin/users/show.html.erb +12 -0
- data/app/views/spud/core_mailer/forgot_password_notification.html.erb +14 -0
- data/app/views/spud/core_mailer/forgot_password_notification.text.erb +10 -0
- data/app/views/spud/password_resets/edit.html.erb +25 -0
- data/app/views/spud/password_resets/new.html.erb +14 -0
- data/app/views/spud/setup/index.html.erb +43 -0
- data/app/views/spud/sitemaps/show.xml.builder +12 -0
- data/app/views/spud/user_sessions/new.html.erb +27 -0
- data/app/views/spud/users/_form.html.erb +60 -0
- data/app/views/spud/users/settings.html.erb +12 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20111214161011_create_spud_admin_permissions.rb +11 -0
- data/db/migrate/20111214161146_create_spud_users.rb +29 -0
- data/db/migrate/20120327124229_add_time_zone_to_spud_user.rb +6 -0
- data/db/migrate/20120328235431_add_scope_to_spud_admin_permissions.rb +6 -0
- data/db/migrate/20120329174000_create_spud_user_settings.rb +11 -0
- data/lib/spud_core/belongs_to_app.rb +59 -0
- data/lib/spud_core/configuration.rb +58 -0
- data/lib/spud_core/engine.rb +55 -0
- data/lib/spud_core/searchable.rb +11 -0
- data/lib/spud_core/test_files.rb +25 -0
- data/lib/spud_core/version.rb +5 -0
- data/lib/tasks/spud_core_tasks.rake +4 -0
- data/lib/tb_core.rb +6 -0
- data/spec/controllers/spud/admin/application_controller_spec.rb +49 -0
- data/spec/controllers/spud/admin/dashboard_controller_spec.rb +129 -0
- data/spec/controllers/spud/admin/users_controller_spec.rb +194 -0
- data/spec/controllers/spud/application_controller_spec.rb +6 -0
- data/spec/controllers/spud/password_reset_controller_spec.rb +93 -0
- data/spec/controllers/spud/setup_controller_spec.rb +56 -0
- data/spec/controllers/spud/sitemap_controllers_spec.rb +20 -0
- data/spec/controllers/spud/user_sessions_controller_spec.rb +51 -0
- data/spec/controllers/spud/users_controller_spec.rb +69 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +58 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +15 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/schema.rb +59 -0
- data/spec/dummy/log/development.log +39 -0
- data/spec/dummy/log/test.log +37811 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/helpers/spud/admin/application_helper_spec.rb +150 -0
- data/spec/helpers/spud/application_helper_spec.rb +66 -0
- data/spec/lib/spud_core/configuration_spec.rb +34 -0
- data/spec/models/spud_user_spec.rb +27 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/authlogic_helper.rb +2 -0
- metadata +652 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZDk5YWI4NGEwYjAzMTgwZTAzNzExYjIwZTVlNDdlNmQ0NGU4NTNiZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MmIyMTZmZGMxMDY3N2JmMjUxYmUyOTFmZDJlNDE1YWViNTVjZGFiYQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZThjOGNmYzdiOTBiNWM3OWY4MTJiNzgzY2Y1Y2U1NzRjNjZkMzQyYmRmYzZk
|
10
|
+
MGJjYzM3NWRmZDg2Yzg1NDQyZTgwNGM5MDVhZjQyZGE0ZDA1OGVkODQ0YzQz
|
11
|
+
YjgwN2YwZDUzOWMyNTUzMmYwODE3OTlkZTEwNjMxMjcyNzQ5N2Q=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YWYzMTQzZDZiZTY4NzY0OGQzYjAwZGM2YTJkYmEyNzY1ZmJiODg4NjVjZDg4
|
14
|
+
NjU0MTIyMTczOTIyYzY5ZGMyMjhlZDU1MjZhY2QyZWE4MzBkYWM0NGJhYzQ3
|
15
|
+
ZWNkMDQyNjg0OTRjNzU0NTQ0MTgwZTE4YTA0N2Q1MjZjZTgwYzU=
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2012 YOURNAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
Spud Core Admin
|
2
|
+
===============
|
3
|
+
|
4
|
+
Spud Admin is a dependency package that adds a nice looking administrative panel to any project you add it to with built in authlogic authentication ready to go out of the box. It supports easy engine integration and there are several planned future engines that we plan on designing for the spud suite. The first of which is Spud CMS which can be found at http://github.com/davydotcom/spud_cms
|
5
|
+
|
6
|
+
Installation/Usage
|
7
|
+
------------------
|
8
|
+
|
9
|
+
1. In your Gemfile add the following
|
10
|
+
|
11
|
+
gem 'tb_core'
|
12
|
+
|
13
|
+
2. Run bundle install
|
14
|
+
3. Copy in database migrations to your new rails project
|
15
|
+
|
16
|
+
bundle exec rake tb_core:install:migrations
|
17
|
+
rake db:migrate
|
18
|
+
|
19
|
+
4. run a rails server instance and point your browser to /spud/admin
|
20
|
+
|
21
|
+
|
22
|
+
Adding Your Own Engines
|
23
|
+
-----------------------
|
24
|
+
|
25
|
+
Creating a rails engine that ties into spud admin is fairly straight forward
|
26
|
+
In your new engine add spud_admin as a dependency and create an initializer inside your engine class as such:
|
27
|
+
|
28
|
+
initializer :admin do
|
29
|
+
Spud::Core.configure do |config|
|
30
|
+
config.admin_applications += [{:name => "Pages",:thumbnail => "spud/admin/pages_thumb.png",:url => "/spud/admin/pages",:order => 0}]
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
You can use the layouts provided with spud admin by using 'spud/admin/application' or 'spud/admin/detail' layouts
|
36
|
+
|
37
|
+
When creating controllers for the admin panel create them in the Spud::Admin Namespace and have them extend Spud::Admin::ApplicationController for automatic user authentication restrictions.
|
38
|
+
|
39
|
+
Testing
|
40
|
+
-----------------
|
41
|
+
|
42
|
+
Spud uses RSpec for testing. Get the tests running with a few short commands:
|
43
|
+
|
44
|
+
1. Create and migrate the databases:
|
45
|
+
|
46
|
+
rake db:create
|
47
|
+
rake db:migrate
|
48
|
+
|
49
|
+
2. Load the schema in to the test database:
|
50
|
+
|
51
|
+
rake app:db:test:prepare
|
52
|
+
|
53
|
+
3. Run the tests with RSpec
|
54
|
+
|
55
|
+
rspec spec
|
56
|
+
|
57
|
+
After the tests have completed the current code coverage stats is available by opening ```/coverage/index.html``` in a browser.
|
58
|
+
|
59
|
+
|
60
|
+
NOTE: Spud Core is Retina Resolution Compatible Now
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'TbCore'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
24
|
+
load 'rails/tasks/engine.rake'
|
25
|
+
|
26
|
+
Bundler::GemHelper.install_tasks
|
27
|
+
|
28
|
+
require 'rake'
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,133 @@
|
|
1
|
+
//= require jquery
|
2
|
+
//= require jquery_ujs
|
3
|
+
//= require spud/admin/preinit
|
4
|
+
//= require tiny_mce/jquery.tinymce.js
|
5
|
+
//= require tiny_mce/tiny_mce_src.js
|
6
|
+
//= require spud/admin/jquery.dataTables.min
|
7
|
+
//= require bootstrap/js/bootstrap
|
8
|
+
//= require datepicker/js/bootstrap-datepicker
|
9
|
+
//= require jquery-ui/js/jquery-ui-1.9.1.custom
|
10
|
+
//= require_self
|
11
|
+
//= require_tree .
|
12
|
+
//= require retina_tag
|
13
|
+
|
14
|
+
spud = {admin:{}};
|
15
|
+
|
16
|
+
$(document).ready(function() {
|
17
|
+
|
18
|
+
if(typeof(window.console) == 'undefined'){
|
19
|
+
window.console = {
|
20
|
+
log:function(){},
|
21
|
+
warn:function(){},
|
22
|
+
error:function(){}
|
23
|
+
};
|
24
|
+
}
|
25
|
+
|
26
|
+
spud.admin.editor.init();
|
27
|
+
|
28
|
+
// $('#user_table').dataTable({
|
29
|
+
// "bJQueryUI": true,
|
30
|
+
// "sPaginationType": "full_numbers"
|
31
|
+
// });
|
32
|
+
|
33
|
+
$("#modal_window .modal-footer .form-submit").bind('click', function() {
|
34
|
+
$("#modal_window .modal-body form").submit();
|
35
|
+
});
|
36
|
+
|
37
|
+
$("#modal_window ").on('hidden', function(){
|
38
|
+
$(this).find('.modal-footer-additional').remove();
|
39
|
+
$(this).find('.modal-footer-default').show();
|
40
|
+
$(this).removeData('modal');
|
41
|
+
});
|
42
|
+
|
43
|
+
$('body').on('click', 'a.ajax', function() {
|
44
|
+
var url = this.href;
|
45
|
+
var title = this.title;
|
46
|
+
var dialog = $("#modal_window");
|
47
|
+
|
48
|
+
$("#modal_window .modal-title").text(title);
|
49
|
+
dialog.modal({
|
50
|
+
remote: url +".js",
|
51
|
+
show:true
|
52
|
+
});
|
53
|
+
|
54
|
+
// dialog.load(url + ".js",
|
55
|
+
// function(responseText, textStatus, XMLHttpRequest) {
|
56
|
+
// dialog.dialog({width:500,modal:true,height:500,title:title});
|
57
|
+
// });
|
58
|
+
return false;
|
59
|
+
});
|
60
|
+
|
61
|
+
|
62
|
+
$('body').on('ajax:success', 'a[data-method="delete"]',
|
63
|
+
function(data, textStatus, jqXHR){
|
64
|
+
$(this).closest('tr').fadeOut();
|
65
|
+
});
|
66
|
+
|
67
|
+
|
68
|
+
$('a.button').button();
|
69
|
+
|
70
|
+
|
71
|
+
$('input[type=submit].btn').click(function() {$(this).button('loading');});
|
72
|
+
|
73
|
+
$('#multisite_switcher select').change(function() {
|
74
|
+
$(this).parent().submit();
|
75
|
+
});
|
76
|
+
|
77
|
+
} );
|
78
|
+
|
79
|
+
|
80
|
+
function remove_fields(link) {
|
81
|
+
$(link).prev("input[type=hidden]").val("1");
|
82
|
+
$(link).closest(".fields").hide();
|
83
|
+
}
|
84
|
+
|
85
|
+
function add_fields(link, association, content) {
|
86
|
+
var new_id = new Date().getTime();
|
87
|
+
var regexp = new RegExp("new_" + association, "g")
|
88
|
+
$(link).parent().before(content.replace(regexp, new_id));
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
function initTinyMCE(selector) {
|
95
|
+
console.warn('Deprecation Notice: `initTinyMCE()` is deprecated, please use `spud.admin.editor.init()` instead.');
|
96
|
+
spud.admin.editor.init();
|
97
|
+
}
|
98
|
+
|
99
|
+
function initDatePicker(selector){
|
100
|
+
console.warn('Deprecation Notice: `initDatePicker()` is deprecated, please use `spud.admin.date_picker.init()` instead.');
|
101
|
+
spud.admin.date_picker.init();
|
102
|
+
|
103
|
+
}
|
104
|
+
|
105
|
+
function displayModalDialogWithOptions(options){
|
106
|
+
var modal = $('#modal_window');
|
107
|
+
if(options.title){
|
108
|
+
modal.find('.modal-title').text(options.title);
|
109
|
+
}
|
110
|
+
if(options.html){
|
111
|
+
modal.find('.modal-body').html(options.html);
|
112
|
+
}
|
113
|
+
var defaultFooter = modal.find('.modal-footer-default');
|
114
|
+
if(options.buttons){
|
115
|
+
var newFooter = defaultFooter.clone();
|
116
|
+
newFooter.addClass('modal-footer-additional');
|
117
|
+
newFooter.find('.form-submit').remove();
|
118
|
+
for(var key in options.buttons){
|
119
|
+
newFooter.append('<button class="btn '+key+'">'+options.buttons[key]+'</button>');
|
120
|
+
}
|
121
|
+
defaultFooter.hide();
|
122
|
+
modal.append(newFooter);
|
123
|
+
}
|
124
|
+
else{
|
125
|
+
defaultFooter.show();
|
126
|
+
}
|
127
|
+
modal.modal('show');
|
128
|
+
}
|
129
|
+
|
130
|
+
function hideModalDialog(){
|
131
|
+
var modal = $('#modal_window');
|
132
|
+
modal.modal('hide');
|
133
|
+
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
Spud = (typeof(Spud) == 'undefined') ? {} : Spud;
|
2
|
+
Spud.Admin = (typeof(Spud.Admin) == 'undefined') ? {} : Spud.Admin;
|
3
|
+
|
4
|
+
Spud.Admin.Dashboard = new function() {
|
5
|
+
var self=this;
|
6
|
+
|
7
|
+
self.editMode = false;
|
8
|
+
self.mouseIsDown = false;
|
9
|
+
self.init = function() {
|
10
|
+
// $('.admin_application').effect('shake',{},100,self.shakeLoop)
|
11
|
+
$('.admin_application').bind('mousedown',self.mouseDown);
|
12
|
+
$('.admin_application').bind('mouseup',self.mouseUp);
|
13
|
+
|
14
|
+
$('.admin_application').bind('click',self.mouseClick);
|
15
|
+
$('#dashboard-editsave').click(self.saveDashboard);
|
16
|
+
$('#dashboard-editcancel').click(self.cancelDashboard);
|
17
|
+
$('.sortable').sortable({disabled:true});
|
18
|
+
// $('.admin_application').addClass('jiggly')
|
19
|
+
// $('.admin_application').draggable();
|
20
|
+
}
|
21
|
+
self.mouseDown = function() {
|
22
|
+
self.mouseIsDown = true;
|
23
|
+
if(self.editMode == false)
|
24
|
+
{
|
25
|
+
setTimeout(function() {
|
26
|
+
if(self.mouseIsDown)
|
27
|
+
{
|
28
|
+
self.enableEditMode();
|
29
|
+
}
|
30
|
+
},1000);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
self.mouseClick = function(evt) {
|
35
|
+
if(self.editMode)
|
36
|
+
{
|
37
|
+
evt.stopPropagation();
|
38
|
+
return false;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
self.mouseUp = function() {
|
42
|
+
self.mouseIsDown = false;
|
43
|
+
}
|
44
|
+
self.enableEditMode = function() {
|
45
|
+
self.editMode = true;
|
46
|
+
$('.admin_application').addClass('jiggly');
|
47
|
+
|
48
|
+
$('.sortable').sortable("enable");
|
49
|
+
$('#dashboard-editmode').show();
|
50
|
+
}
|
51
|
+
self.saveDashboard = function() {
|
52
|
+
self.saveOrder();
|
53
|
+
self.disableEditMode();
|
54
|
+
}
|
55
|
+
self.cancelDashboard = function() {
|
56
|
+
$('.sortable').sortable("cancel");
|
57
|
+
self.disableEditMode();
|
58
|
+
}
|
59
|
+
self.disableEditMode = function() {
|
60
|
+
self.editMode = false;
|
61
|
+
$('#dashboard-editmode').hide();
|
62
|
+
$('.admin_application').removeClass('jiggly');
|
63
|
+
$('.sortable').sortable("disable");
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
self.saveOrder = function() {
|
68
|
+
var appOrder = $('.sortable').sortable("toArray");
|
69
|
+
for(var appCounter=0;appCounter < appOrder.length;appCounter++)
|
70
|
+
{
|
71
|
+
appOrder[appCounter] = appOrder[appCounter].replace('application_name_',"");
|
72
|
+
|
73
|
+
}
|
74
|
+
var keyvalue = appOrder.join(",")
|
75
|
+
console.log(keyvalue);
|
76
|
+
jQuery.ajax('/spud/save_key?key=app_order&value=' + keyvalue);
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
spud.admin.date_picker = {};
|
2
|
+
|
3
|
+
(function() {
|
4
|
+
var picker = spud.admin.date_picker;
|
5
|
+
|
6
|
+
parsePickerDate = function(value) {
|
7
|
+
var date = new Date();
|
8
|
+
|
9
|
+
var currentDateTimeComponents = value.split(" ");
|
10
|
+
var dateComponents = currentDateTimeComponents[0].split("-");
|
11
|
+
if(dateComponents.length >= 3) {
|
12
|
+
date = new Date(parseInt(dateComponents[0],10),parseInt(dateComponents[1],10) - 1,parseInt(dateComponents[2],10));
|
13
|
+
}
|
14
|
+
return date;
|
15
|
+
}
|
16
|
+
|
17
|
+
picker.init = function(selector) {
|
18
|
+
selector = (typeof(selector) == 'undefined') ? '.spud_form_date_picker' : selector;
|
19
|
+
$(selector).each(function() {
|
20
|
+
var $this = $(this);
|
21
|
+
var baseName = $this.attr('name');
|
22
|
+
$this.attr('name',baseName.replace("[","_").replace("]",""));
|
23
|
+
$this.datepicker({
|
24
|
+
'format': 'yyyy-mm-dd',
|
25
|
+
'autoclose': true
|
26
|
+
});
|
27
|
+
$this.val($this.val().split(" ")[0]);
|
28
|
+
var date = parsePickerDate($this.val());
|
29
|
+
|
30
|
+
var yearField = $("<input type='hidden'/>");
|
31
|
+
yearField.attr('name',baseName.replace(']',"(1i)]"));
|
32
|
+
yearField.val(date.getFullYear());
|
33
|
+
var monthField = $("<input type='hidden'/>");
|
34
|
+
monthField.attr('name',baseName.replace(']',"(2i)]"));
|
35
|
+
monthField.val(date.getMonth() + 1);
|
36
|
+
var dayField = $("<input type='hidden'/>");
|
37
|
+
dayField.attr('name',baseName.replace(']',"(3i)]"));
|
38
|
+
dayField.val(date.getUTCDate());
|
39
|
+
yearField.insertAfter($this);
|
40
|
+
monthField.insertAfter($this);
|
41
|
+
dayField.insertAfter($this);
|
42
|
+
|
43
|
+
|
44
|
+
$this.bind('change', function(evt) {
|
45
|
+
var date = parsePickerDate($(this).val());
|
46
|
+
yearField.val(date.getFullYear());
|
47
|
+
monthField.val(date.getMonth() + 1);
|
48
|
+
dayField.val(date.getUTCDate());
|
49
|
+
|
50
|
+
});
|
51
|
+
|
52
|
+
|
53
|
+
});
|
54
|
+
|
55
|
+
};
|
56
|
+
})();
|
@@ -0,0 +1,167 @@
|
|
1
|
+
//= require codemirror
|
2
|
+
//= require codemirror/modes/markdown
|
3
|
+
|
4
|
+
spud.admin.editor = {};
|
5
|
+
|
6
|
+
(function(){
|
7
|
+
|
8
|
+
var editor = spud.admin.editor;
|
9
|
+
|
10
|
+
var registeredPlugins = [
|
11
|
+
'autolink','lists','layer','table','tableDropdown','advhr','advimage','advlink','iespell','inlinepopups','media','paste'
|
12
|
+
];
|
13
|
+
|
14
|
+
var registeredButtons = [
|
15
|
+
['bold','italic','underline','strikethrough','|','justifyleft','justifycenter','justifyright','justifyfull','|','formatselect','cut','copy','paste','pastetext','|','bullist','numlist','outdent','indent','|','tableDropdown','|','link','unlink','anchor','image','code'],
|
16
|
+
[],
|
17
|
+
[],
|
18
|
+
[]
|
19
|
+
];
|
20
|
+
|
21
|
+
var validElements = "@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|" +
|
22
|
+
"onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|" +
|
23
|
+
"onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|" +
|
24
|
+
"name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u," +
|
25
|
+
"#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|" +
|
26
|
+
"src|border|alt=|title|hspace|vspace|width|height|align|hidpi_src],-sub,-sup," +
|
27
|
+
"-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|" +
|
28
|
+
"height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|" +
|
29
|
+
"height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot," +
|
30
|
+
"#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor" +
|
31
|
+
"|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div," +
|
32
|
+
"-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face" +
|
33
|
+
"|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite]," +
|
34
|
+
"object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width" +
|
35
|
+
"|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo," +
|
36
|
+
"button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|" +
|
37
|
+
"valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method]," +
|
38
|
+
"input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value]," +
|
39
|
+
"kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value]," +
|
40
|
+
"q[cite],samp,select[disabled|multiple|name|size],small," +
|
41
|
+
"textarea[cols|rows|disabled|name|readonly],tt,var,big";
|
42
|
+
|
43
|
+
var extendedValidElements = [];
|
44
|
+
|
45
|
+
var validFormats = "p,h1,h2,h3,h4,h5,h6";
|
46
|
+
|
47
|
+
|
48
|
+
editor.init = function(options) {
|
49
|
+
editor.monitorFormatters();
|
50
|
+
options = options || {};
|
51
|
+
var selector = options.selector || 'textarea.tinymce';
|
52
|
+
$(selector).each(function() {
|
53
|
+
var $this = $(this);
|
54
|
+
var dataFormat = $this.attr('data-format');
|
55
|
+
switch(dataFormat) {
|
56
|
+
case 'Markdown':
|
57
|
+
editor.initCodeMirrorWithOptions(this,'markdown', options || {});
|
58
|
+
break;
|
59
|
+
case 'HTML':
|
60
|
+
default:
|
61
|
+
editor.initMCEWithOptions(this, options || {});
|
62
|
+
};
|
63
|
+
|
64
|
+
|
65
|
+
});
|
66
|
+
|
67
|
+
};
|
68
|
+
|
69
|
+
editor.monitorFormatters = function() {
|
70
|
+
$('select[data-formatter]').off('onchange');
|
71
|
+
$('select[data-formatter]').change(editor.formatterChanged);
|
72
|
+
};
|
73
|
+
|
74
|
+
editor.formatterChanged = function() {
|
75
|
+
var formatId = $(this).attr('data-formatter');
|
76
|
+
editor.unload('#' + formatId);
|
77
|
+
$('#' + formatId).attr('data-format',$(this).val());
|
78
|
+
editor.init({selector: '#' + formatId});
|
79
|
+
};
|
80
|
+
|
81
|
+
editor.initMCEWithOptions = function(element, options){
|
82
|
+
|
83
|
+
var theme = options.theme || 'advanced';
|
84
|
+
var height = options.height || 400;
|
85
|
+
|
86
|
+
$(element).tinymce({
|
87
|
+
theme: theme,
|
88
|
+
plugins: registeredPlugins.join(','),
|
89
|
+
theme_advanced_toolbar_location: "top",
|
90
|
+
theme_advanced_buttons1: registeredButtons[0].join(','),
|
91
|
+
theme_advanced_buttons2: registeredButtons[1].join(','),
|
92
|
+
theme_advanced_buttons3: registeredButtons[2].join(','),
|
93
|
+
theme_advanced_buttons4: registeredButtons[3].join(','),
|
94
|
+
theme_advanced_toolbar_align: 'left',
|
95
|
+
theme_advanced_blockformats: validFormats,
|
96
|
+
convert_urls: false,
|
97
|
+
valid_elements: validElements,
|
98
|
+
media_strict: false,
|
99
|
+
extended_valid_elements: extendedValidElements.join(","),
|
100
|
+
width: $(element).width(),
|
101
|
+
height: height
|
102
|
+
});
|
103
|
+
|
104
|
+
|
105
|
+
};
|
106
|
+
|
107
|
+
var codeMirrors = [];
|
108
|
+
editor.initCodeMirrorWithOptions = function(element, format, options) {
|
109
|
+
var editor = CodeMirror.fromTextArea(element, {
|
110
|
+
mode: 'markdown',
|
111
|
+
lineNumbers: true,
|
112
|
+
lineWrapping: true,
|
113
|
+
theme: "default",
|
114
|
+
extraKeys: {"Enter": "newlineAndIndentContinueMarkdownList"}
|
115
|
+
});
|
116
|
+
codeMirrors.push(editor);
|
117
|
+
|
118
|
+
$(element).attr('code-mirror-id',codeMirrors.length-1);
|
119
|
+
};
|
120
|
+
|
121
|
+
editor.unload = function(selectorOptional) {
|
122
|
+
var selector = selectorOptional || 'textarea.tinymce';
|
123
|
+
$(selector).each(function() {
|
124
|
+
var $this = $(this);
|
125
|
+
if($this.attr('code-mirror-id')) {
|
126
|
+
codeMirrors[parseInt($this.attr('code-mirror-id'),10)].toTextArea();
|
127
|
+
codeMirrors[parseInt($this.attr('code-mirror-id'),10)] = null;
|
128
|
+
$this.removeAttr('code-mirror-id');
|
129
|
+
}
|
130
|
+
tinyMCE.execCommand('mceRemoveControl',false,this.id);
|
131
|
+
});
|
132
|
+
|
133
|
+
};
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
editor.registerPlugin = function(pluginName){
|
138
|
+
if($.inArray(registeredPlugins, pluginName) < 0){
|
139
|
+
registeredPlugins.push(pluginName);
|
140
|
+
}
|
141
|
+
};
|
142
|
+
|
143
|
+
editor.deregisterPlugin = function(pluginName){
|
144
|
+
var i=0;
|
145
|
+
while(i < registeredPlugins.length){
|
146
|
+
if(registeredPlugins[i] == pluginName){
|
147
|
+
registeredPlugins.splice(1, i);
|
148
|
+
break;
|
149
|
+
}
|
150
|
+
i++;
|
151
|
+
}
|
152
|
+
};
|
153
|
+
|
154
|
+
editor.appendValidElement = function(element) {
|
155
|
+
extendedValidElements.push(element);
|
156
|
+
};
|
157
|
+
|
158
|
+
editor.registerButton = function(buttonNameOrArray, rowNum){
|
159
|
+
rowNum = rowNum || 0;
|
160
|
+
if(typeof(buttonNameOrArray) == 'object'){
|
161
|
+
registeredButtons[rowNum].concat(buttonNameOrArray);
|
162
|
+
}
|
163
|
+
else{
|
164
|
+
registeredButtons[rowNum].push(buttonNameOrArray);
|
165
|
+
}
|
166
|
+
};
|
167
|
+
})();
|