grandstand 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/.gitignore +2 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +7 -0
  4. data/Rakefile +44 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/admin/galleries_controller.rb +52 -0
  7. data/app/controllers/admin/images_controller.rb +68 -0
  8. data/app/controllers/admin/main_controller.rb +36 -0
  9. data/app/controllers/admin/pages_controller.rb +51 -0
  10. data/app/controllers/admin/posts_controller.rb +48 -0
  11. data/app/controllers/admin/sessions_controller.rb +41 -0
  12. data/app/controllers/admin/templates_controller.rb +6 -0
  13. data/app/controllers/admin/users_controller.rb +48 -0
  14. data/app/controllers/galleries_controller.rb +5 -0
  15. data/app/controllers/pages_controller.rb +5 -0
  16. data/app/controllers/posts_controller.rb +5 -0
  17. data/app/helpers/admin/main_helper.rb +31 -0
  18. data/app/helpers/admin/pages_helper.rb +2 -0
  19. data/app/helpers/admin/posts_helper.rb +2 -0
  20. data/app/helpers/admin/sessions_helper.rb +2 -0
  21. data/app/helpers/admin/templates_helper.rb +2 -0
  22. data/app/helpers/admin/users_helper.rb +2 -0
  23. data/app/helpers/pages_helper.rb +2 -0
  24. data/app/helpers/posts_helper.rb +2 -0
  25. data/app/helpers/site_helper.rb +2 -0
  26. data/app/models/gallery.rb +22 -0
  27. data/app/models/image.rb +61 -0
  28. data/app/models/page.rb +45 -0
  29. data/app/models/page_section.rb +6 -0
  30. data/app/models/post.rb +27 -0
  31. data/app/models/template.rb +33 -0
  32. data/app/models/user.rb +68 -0
  33. data/app/stylesheets/_buttons.less +76 -0
  34. data/app/stylesheets/_dialogs.less +85 -0
  35. data/app/stylesheets/application.less +238 -0
  36. data/app/stylesheets/global.less +435 -0
  37. data/app/stylesheets/login.less +30 -0
  38. data/app/stylesheets/wysiwyg.less +96 -0
  39. data/app/views/admin/galleries/_form.html.erb +11 -0
  40. data/app/views/admin/galleries/_gallery.html.erb +16 -0
  41. data/app/views/admin/galleries/_list.html.erb +17 -0
  42. data/app/views/admin/galleries/delete.html.erb +8 -0
  43. data/app/views/admin/galleries/edit.html.erb +8 -0
  44. data/app/views/admin/galleries/editor.html.erb +13 -0
  45. data/app/views/admin/galleries/editor_with_images.html.erb +19 -0
  46. data/app/views/admin/galleries/index.html.erb +13 -0
  47. data/app/views/admin/galleries/new.html.erb +8 -0
  48. data/app/views/admin/galleries/show.html.erb +15 -0
  49. data/app/views/admin/images/_form.html.erb +11 -0
  50. data/app/views/admin/images/delete.html.erb +8 -0
  51. data/app/views/admin/images/edit.html.erb +8 -0
  52. data/app/views/admin/images/new.html.erb +8 -0
  53. data/app/views/admin/images/upload.html.erb +11 -0
  54. data/app/views/admin/main/index.html.erb +10 -0
  55. data/app/views/admin/pages/_form.html.erb +33 -0
  56. data/app/views/admin/pages/_left.html.erb +3 -0
  57. data/app/views/admin/pages/_row.html.erb +9 -0
  58. data/app/views/admin/pages/delete.html.erb +8 -0
  59. data/app/views/admin/pages/edit.html.erb +8 -0
  60. data/app/views/admin/pages/index.html.erb +20 -0
  61. data/app/views/admin/pages/new.html.erb +8 -0
  62. data/app/views/admin/pages/show.html.erb +3 -0
  63. data/app/views/admin/posts/_form.html.erb +29 -0
  64. data/app/views/admin/posts/_left.html.erb +3 -0
  65. data/app/views/admin/posts/_list.html.erb +22 -0
  66. data/app/views/admin/posts/delete.html.erb +9 -0
  67. data/app/views/admin/posts/edit.html.erb +10 -0
  68. data/app/views/admin/posts/index.html.erb +10 -0
  69. data/app/views/admin/posts/new.html.erb +10 -0
  70. data/app/views/admin/posts/show.html.erb +4 -0
  71. data/app/views/admin/sessions/forgot.html.erb +8 -0
  72. data/app/views/admin/sessions/show.html.erb +12 -0
  73. data/app/views/admin/shared/_flash.html.erb +3 -0
  74. data/app/views/admin/users/_form.html.erb +16 -0
  75. data/app/views/admin/users/_left.html.erb +3 -0
  76. data/app/views/admin/users/delete.html.erb +10 -0
  77. data/app/views/admin/users/edit.html.erb +8 -0
  78. data/app/views/admin/users/index.html.erb +22 -0
  79. data/app/views/admin/users/new.html.erb +8 -0
  80. data/app/views/admin/users/show.html.erb +12 -0
  81. data/app/views/galleries/index.html.erb +0 -0
  82. data/app/views/galleries/show.html.erb +12 -0
  83. data/app/views/layouts/admin.html.erb +80 -0
  84. data/app/views/layouts/admin_login.html.erb +17 -0
  85. data/app/views/layouts/admin_xhr.html.erb +3 -0
  86. data/app/views/pages/show.html.erb +8 -0
  87. data/app/views/posts/show.html.erb +3 -0
  88. data/app/views/shared/404.html.erb +5 -0
  89. data/app/views/shared/gallery.html +14 -0
  90. data/app/views/shared/image.html +1 -0
  91. data/app/views/shared/page.html +0 -0
  92. data/app/views/shared/post.html +3 -0
  93. data/grandstand.gemspec +189 -0
  94. data/lib/grandstand/application.rb +50 -0
  95. data/lib/grandstand/controller/development.rb +15 -0
  96. data/lib/grandstand/controller.rb +104 -0
  97. data/lib/grandstand/helper.rb +117 -0
  98. data/lib/grandstand/routes.rb +59 -0
  99. data/lib/grandstand/session.rb +25 -0
  100. data/lib/grandstand.rb +27 -0
  101. data/public/.DS_Store +0 -0
  102. data/public/admin/.DS_Store +0 -0
  103. data/public/admin/images/.DS_Store +0 -0
  104. data/public/admin/images/background-input.gif +0 -0
  105. data/public/admin/images/background-progress-bar.png +0 -0
  106. data/public/admin/images/background-progress-complete.gif +0 -0
  107. data/public/admin/images/background-progress.gif +0 -0
  108. data/public/admin/images/icons/.DS_Store +0 -0
  109. data/public/admin/images/icons/add.png +0 -0
  110. data/public/admin/images/icons/collapse.png +0 -0
  111. data/public/admin/images/icons/delete.png +0 -0
  112. data/public/admin/images/icons/edit.png +0 -0
  113. data/public/admin/images/icons/editor/bold.png +0 -0
  114. data/public/admin/images/icons/editor/gallery.png +0 -0
  115. data/public/admin/images/icons/editor/image-center.png +0 -0
  116. data/public/admin/images/icons/editor/image-left.png +0 -0
  117. data/public/admin/images/icons/editor/image-right.png +0 -0
  118. data/public/admin/images/icons/editor/image.png +0 -0
  119. data/public/admin/images/icons/editor/italic.png +0 -0
  120. data/public/admin/images/icons/editor/ordered-list.png +0 -0
  121. data/public/admin/images/icons/editor/quote.png +0 -0
  122. data/public/admin/images/icons/editor/source.png +0 -0
  123. data/public/admin/images/icons/editor/strikethrough.png +0 -0
  124. data/public/admin/images/icons/editor/underline.png +0 -0
  125. data/public/admin/images/icons/editor/unordered-list.png +0 -0
  126. data/public/admin/images/icons/error.png +0 -0
  127. data/public/admin/images/icons/expand.png +0 -0
  128. data/public/admin/images/icons/galleries.png +0 -0
  129. data/public/admin/images/icons/gallery.png +0 -0
  130. data/public/admin/images/icons/image.png +0 -0
  131. data/public/admin/images/icons/okay.png +0 -0
  132. data/public/admin/images/icons/pages.png +0 -0
  133. data/public/admin/images/icons/posts.png +0 -0
  134. data/public/admin/images/icons/upload.png +0 -0
  135. data/public/admin/images/icons/users.png +0 -0
  136. data/public/admin/images/logo.png +0 -0
  137. data/public/admin/images/spinner-dark.gif +0 -0
  138. data/public/admin/images/uploader.swf +0 -0
  139. data/public/admin/javascripts/application.js +231 -0
  140. data/public/admin/javascripts/jquery.js +404 -0
  141. data/public/admin/javascripts/mustache.js +324 -0
  142. data/public/admin/javascripts/selection.js +280 -0
  143. data/public/admin/javascripts/string.js +264 -0
  144. data/public/admin/javascripts/wysiwyg.js +335 -0
  145. data/public/admin/stylesheets/application.css +1 -0
  146. data/public/admin/stylesheets/global.css +1 -0
  147. data/public/admin/stylesheets/login.css +1 -0
  148. data/public/admin/stylesheets/wysiwyg-content.css +20 -0
  149. data/public/admin/stylesheets/wysiwyg.css +1 -0
  150. data/vendor/cache/more-0.1.1.gem +0 -0
  151. metadata +216 -0
@@ -0,0 +1,189 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{grandstand}
8
+ s.version = "0.2.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Flip Sasser"]
12
+ s.date = %q{2010-07-29}
13
+ s.description = %q{
14
+ Grandstand is a simple blog and photo gallery application. It takes a minimal amount of configuration and can
15
+ be built installed as a gem and used like any other thingymagig. It's totally cool.
16
+ }
17
+ s.email = %q{flip@x451.com}
18
+ s.extra_rdoc_files = [
19
+ "README"
20
+ ]
21
+ s.files = [
22
+ ".gitignore",
23
+ "MIT-LICENSE",
24
+ "README",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "app/controllers/admin/galleries_controller.rb",
28
+ "app/controllers/admin/images_controller.rb",
29
+ "app/controllers/admin/main_controller.rb",
30
+ "app/controllers/admin/pages_controller.rb",
31
+ "app/controllers/admin/posts_controller.rb",
32
+ "app/controllers/admin/sessions_controller.rb",
33
+ "app/controllers/admin/templates_controller.rb",
34
+ "app/controllers/admin/users_controller.rb",
35
+ "app/controllers/galleries_controller.rb",
36
+ "app/controllers/pages_controller.rb",
37
+ "app/controllers/posts_controller.rb",
38
+ "app/helpers/admin/main_helper.rb",
39
+ "app/helpers/admin/pages_helper.rb",
40
+ "app/helpers/admin/posts_helper.rb",
41
+ "app/helpers/admin/sessions_helper.rb",
42
+ "app/helpers/admin/templates_helper.rb",
43
+ "app/helpers/admin/users_helper.rb",
44
+ "app/helpers/pages_helper.rb",
45
+ "app/helpers/posts_helper.rb",
46
+ "app/helpers/site_helper.rb",
47
+ "app/models/gallery.rb",
48
+ "app/models/image.rb",
49
+ "app/models/page.rb",
50
+ "app/models/page_section.rb",
51
+ "app/models/post.rb",
52
+ "app/models/template.rb",
53
+ "app/models/user.rb",
54
+ "app/stylesheets/_buttons.less",
55
+ "app/stylesheets/_dialogs.less",
56
+ "app/stylesheets/application.less",
57
+ "app/stylesheets/global.less",
58
+ "app/stylesheets/login.less",
59
+ "app/stylesheets/wysiwyg.less",
60
+ "app/views/admin/galleries/_form.html.erb",
61
+ "app/views/admin/galleries/_gallery.html.erb",
62
+ "app/views/admin/galleries/_list.html.erb",
63
+ "app/views/admin/galleries/delete.html.erb",
64
+ "app/views/admin/galleries/edit.html.erb",
65
+ "app/views/admin/galleries/editor.html.erb",
66
+ "app/views/admin/galleries/editor_with_images.html.erb",
67
+ "app/views/admin/galleries/index.html.erb",
68
+ "app/views/admin/galleries/new.html.erb",
69
+ "app/views/admin/galleries/show.html.erb",
70
+ "app/views/admin/images/_form.html.erb",
71
+ "app/views/admin/images/delete.html.erb",
72
+ "app/views/admin/images/edit.html.erb",
73
+ "app/views/admin/images/new.html.erb",
74
+ "app/views/admin/images/upload.html.erb",
75
+ "app/views/admin/main/index.html.erb",
76
+ "app/views/admin/pages/_form.html.erb",
77
+ "app/views/admin/pages/_left.html.erb",
78
+ "app/views/admin/pages/_row.html.erb",
79
+ "app/views/admin/pages/delete.html.erb",
80
+ "app/views/admin/pages/edit.html.erb",
81
+ "app/views/admin/pages/index.html.erb",
82
+ "app/views/admin/pages/new.html.erb",
83
+ "app/views/admin/pages/show.html.erb",
84
+ "app/views/admin/posts/_form.html.erb",
85
+ "app/views/admin/posts/_left.html.erb",
86
+ "app/views/admin/posts/_list.html.erb",
87
+ "app/views/admin/posts/delete.html.erb",
88
+ "app/views/admin/posts/edit.html.erb",
89
+ "app/views/admin/posts/index.html.erb",
90
+ "app/views/admin/posts/new.html.erb",
91
+ "app/views/admin/posts/show.html.erb",
92
+ "app/views/admin/sessions/forgot.html.erb",
93
+ "app/views/admin/sessions/show.html.erb",
94
+ "app/views/admin/shared/_flash.html.erb",
95
+ "app/views/admin/users/_form.html.erb",
96
+ "app/views/admin/users/_left.html.erb",
97
+ "app/views/admin/users/delete.html.erb",
98
+ "app/views/admin/users/edit.html.erb",
99
+ "app/views/admin/users/index.html.erb",
100
+ "app/views/admin/users/new.html.erb",
101
+ "app/views/admin/users/show.html.erb",
102
+ "app/views/galleries/index.html.erb",
103
+ "app/views/galleries/show.html.erb",
104
+ "app/views/layouts/admin.html.erb",
105
+ "app/views/layouts/admin_login.html.erb",
106
+ "app/views/layouts/admin_xhr.html.erb",
107
+ "app/views/pages/show.html.erb",
108
+ "app/views/posts/show.html.erb",
109
+ "app/views/shared/404.html.erb",
110
+ "app/views/shared/gallery.html",
111
+ "app/views/shared/image.html",
112
+ "app/views/shared/page.html",
113
+ "app/views/shared/post.html",
114
+ "grandstand.gemspec",
115
+ "lib/grandstand.rb",
116
+ "lib/grandstand/application.rb",
117
+ "lib/grandstand/controller.rb",
118
+ "lib/grandstand/controller/development.rb",
119
+ "lib/grandstand/helper.rb",
120
+ "lib/grandstand/routes.rb",
121
+ "lib/grandstand/session.rb",
122
+ "public/.DS_Store",
123
+ "public/admin/.DS_Store",
124
+ "public/admin/images/.DS_Store",
125
+ "public/admin/images/background-input.gif",
126
+ "public/admin/images/background-progress-bar.png",
127
+ "public/admin/images/background-progress-complete.gif",
128
+ "public/admin/images/background-progress.gif",
129
+ "public/admin/images/icons/.DS_Store",
130
+ "public/admin/images/icons/add.png",
131
+ "public/admin/images/icons/collapse.png",
132
+ "public/admin/images/icons/delete.png",
133
+ "public/admin/images/icons/edit.png",
134
+ "public/admin/images/icons/editor/bold.png",
135
+ "public/admin/images/icons/editor/gallery.png",
136
+ "public/admin/images/icons/editor/image-center.png",
137
+ "public/admin/images/icons/editor/image-left.png",
138
+ "public/admin/images/icons/editor/image-right.png",
139
+ "public/admin/images/icons/editor/image.png",
140
+ "public/admin/images/icons/editor/italic.png",
141
+ "public/admin/images/icons/editor/ordered-list.png",
142
+ "public/admin/images/icons/editor/quote.png",
143
+ "public/admin/images/icons/editor/source.png",
144
+ "public/admin/images/icons/editor/strikethrough.png",
145
+ "public/admin/images/icons/editor/underline.png",
146
+ "public/admin/images/icons/editor/unordered-list.png",
147
+ "public/admin/images/icons/error.png",
148
+ "public/admin/images/icons/expand.png",
149
+ "public/admin/images/icons/galleries.png",
150
+ "public/admin/images/icons/gallery.png",
151
+ "public/admin/images/icons/image.png",
152
+ "public/admin/images/icons/okay.png",
153
+ "public/admin/images/icons/pages.png",
154
+ "public/admin/images/icons/posts.png",
155
+ "public/admin/images/icons/upload.png",
156
+ "public/admin/images/icons/users.png",
157
+ "public/admin/images/logo.png",
158
+ "public/admin/images/spinner-dark.gif",
159
+ "public/admin/images/uploader.swf",
160
+ "public/admin/javascripts/application.js",
161
+ "public/admin/javascripts/jquery.js",
162
+ "public/admin/javascripts/mustache.js",
163
+ "public/admin/javascripts/selection.js",
164
+ "public/admin/javascripts/string.js",
165
+ "public/admin/javascripts/wysiwyg.js",
166
+ "public/admin/stylesheets/application.css",
167
+ "public/admin/stylesheets/global.css",
168
+ "public/admin/stylesheets/login.css",
169
+ "public/admin/stylesheets/wysiwyg-content.css",
170
+ "public/admin/stylesheets/wysiwyg.css",
171
+ "vendor/cache/more-0.1.1.gem"
172
+ ]
173
+ s.homepage = %q{http://github.com/flipsasser/grandstand}
174
+ s.rdoc_options = ["--charset=UTF-8"]
175
+ s.require_paths = ["lib"]
176
+ s.rubygems_version = %q{1.3.7}
177
+ s.summary = %q{A blog / gallery gem for Rails 3 that's dead-simple to configure, override, and rebuild}
178
+
179
+ if s.respond_to? :specification_version then
180
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
181
+ s.specification_version = 3
182
+
183
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
184
+ else
185
+ end
186
+ else
187
+ end
188
+ end
189
+
@@ -0,0 +1,50 @@
1
+ require 'rails'
2
+ require 'grandstand'
3
+
4
+ module Grandstand
5
+ class Application < Rails::Engine
6
+ paths.config.routes = 'lib/routes.rb'
7
+
8
+ initializer 'grandstand.add_session_extension', :after => :load_application_initializers do |app|
9
+ puts "Adding middleware (#{app.config.session_options.inspect})"
10
+ app.middleware.insert_before(ActionDispatch::ShowExceptions, Grandstand::Session, app.config.session_options[:key] || app.config.session_options['key'])
11
+ Grandstand.initialize!
12
+ end
13
+
14
+ initializer 'grandstand.symlink_public_files' do |app|
15
+ Dir[File.join(File.dirname(__FILE__), '..', 'public', '*')].each do |gem_path|
16
+ user_path = File.join(app.root, 'public', File.basename(gem_path))
17
+ puts "Copying #{gem_path} to #{user_path}"
18
+ if File.file?(gem_path) && !File.file?(user_path)
19
+ FileUtils.cp_r(gem_path, user_path)
20
+ elsif File.directory?(gem_path) && !File.directory?(user_path)
21
+ FileUtils.cp_r(gem_path, user_path)
22
+ end
23
+ end
24
+ end
25
+
26
+ class << self
27
+ def app_name
28
+ @app_name ||= 'Portfoliawesome'
29
+ end
30
+
31
+ def image_sizes
32
+ {
33
+ :icon => '75x75#',
34
+ :page => '541x'
35
+ }
36
+ end
37
+
38
+ def page_sections
39
+ %w(left main)
40
+ end
41
+
42
+ def s3
43
+ @s3 ||= {
44
+ :bucket => nil,
45
+ :credentials => File.join(Rails.root, 'config', 's3.yml')
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,15 @@
1
+ module Grandstand
2
+ module Controller
3
+ module Development
4
+ def self.included(base)
5
+ base.before_filter :generate_css_from_less
6
+ end
7
+
8
+ protected
9
+ def generate_css_from_less
10
+ Less::More.generate_all
11
+ end
12
+ protected :generate_css_from_less
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,104 @@
1
+ module Grandstand
2
+ module Controller
3
+ autoload(:Development, 'grandstand/controller/development')
4
+
5
+ def self.included(base)
6
+ base.helper_method :current_page, :current_user, :return_path
7
+ end
8
+
9
+ protected
10
+ # current_page returns a Page instance for any page that exists for the
11
+ # the current requests' URL. Very frequently nil!
12
+ def current_page
13
+ return @_current_page if defined? @_current_page
14
+ @_current_page = Page.where(:url => request.path.reverse.chomp('/').reverse).first
15
+ end
16
+ protected :current_page
17
+
18
+ # Predictably, `current_user` will return the currently logged-in user.
19
+ def current_user
20
+ # Ask Rack for a model first - this makes it easy to add SSO middleware
21
+ @_user ||= request.env['user'] || User.first(:conditions => {:id => session[:user_id]}) if session[:user_id]
22
+ end
23
+ protected :current_user
24
+
25
+ # not_found is a quick and easy way to render a 404 error page without much overhead.
26
+ # You can pass it options which are just render options that get merged on top of the
27
+ # defaults, which are to render the application layout, with a 404 status, and the
28
+ # shared/404 template. That's it!
29
+ #
30
+ # Also of note, it returns false so you can very easily integrate it into before_filter
31
+ # and do stuff like:
32
+ #
33
+ # class PostsController < ApplicationController
34
+ # before_filter :find_post, :except => :index
35
+ #
36
+ # ...
37
+ #
38
+ # protected
39
+ # def find_post
40
+ # not_found unless @post = Post.first(:conditions => {:id => params[:id]})
41
+ # end
42
+ # end
43
+ #
44
+ def not_found(options = {})
45
+ options = {:layout => 'application', :status => 404, :template => 'shared/404'}.merge(options)
46
+ render options
47
+ false
48
+ end
49
+
50
+ # Require a user for this action - use as a before filter, as in:
51
+ # before_filter :require_user, :only => [:show]
52
+ def require_user
53
+ # Require a logged in model
54
+ unless current_user
55
+ # Remember where we started
56
+ set_return_path
57
+ # Remember any post variables the user may have sent between logout and now.
58
+ # session[:post_params] = params.except(:controller, :action, :id).merge({:_method => request.method}) unless request.get?
59
+ # Send them off to the correct login path
60
+ redirect_to(admin_session_path) and return false
61
+ end
62
+ end
63
+
64
+ # return_path gives you the current return_path as set by set_return_path. Use them
65
+ # together to ensure users are returned to a contextually correct location whenever
66
+ # possible. Also used as a helper method so you can point cancel buttons to the
67
+ # contextually correct resource, e.g.:
68
+ #
69
+ # <% form_for(@post) do |form| %>
70
+ # ...
71
+ # <%= form.submit "Save Post" %> or <%= link_to 'cancel', return_path || posts_path %>
72
+ # <% end %>
73
+ #
74
+ # See set_return_path for more information.
75
+ def return_path
76
+ session[:return_path]
77
+ end
78
+
79
+ # Sets a return path for redirecting users to later on. For example, on a basic CRUD controller,
80
+ # if your user goes straight to "edit" from the index action, chances are they want to return
81
+ # to index when they're done, and likewise for the show action. So:
82
+ #
83
+ # class PostsController < ApplicationController
84
+ # before_filter :set_return_path, :only => [:index, :show]
85
+ #
86
+ # ...
87
+ #
88
+ # def update
89
+ # if @post.update_attributes(params[:post])
90
+ # redirect_to return_path || post_path(@post)
91
+ # else
92
+ # ...
93
+ # end
94
+ # end
95
+ # end
96
+ #
97
+ # It's also a quick way to return a user to previous action post-login - see
98
+ # Admin::SessionController#create for more details and an example
99
+ def set_return_path(path = nil)
100
+ session[:return_path] = path || request.fullpath
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,117 @@
1
+ module Grandstand
2
+ module Helper
3
+ # Renders a <button> tag. Helpful for forms and the like.
4
+ #
5
+ # <%= button("Save Changes", :class => "blue") %>
6
+ #
7
+ # ... produces
8
+ #
9
+ # <button class="button blue"><span class="inner"><span>Save Changes</span></span></button>
10
+ def button(*args)
11
+ options, icon = button_options(args.extract_options! || {})
12
+ content_tag(:button, options) { content_tag(:span, :class => icon ? "#{icon} icon" : nil) { args.shift } }
13
+ end
14
+
15
+ # Similar to button, but generates a link instead of a button element. Useful for providing
16
+ # buttons to GET actions:
17
+ #
18
+ # <%= button_link_to("Get Help", support_path, :icon => "help") %>
19
+ #
20
+ # ... produces
21
+ #
22
+ # <a class="button blue" href="/support"><span class="inner"><span class="help icon">Get Help</span></span></button>
23
+ #
24
+ # The extra spans are for any sliding door styling you may be interested in adding. Adding :icon to the options will
25
+ # give the inner-most span a class of "#{options[:icon]} icon", allowing you to add extra images inside of your button.
26
+ def button_link_to(*args)
27
+ options, icon = button_options(args.extract_options! || {})
28
+ link_to(content_tag(:span, :class => icon ? "#{icon} icon" : nil) { args.shift }, *args.push(options))
29
+ end
30
+
31
+ def button_options(options)
32
+ classes = %w(button)
33
+ if icon = options.delete(:icon)
34
+ classes.push('has-icon')
35
+ end
36
+ classes.push(options[:class].to_s.split(' ')) if options[:class]
37
+ options[:class] = classes.uniq.join(' ')
38
+ [options, icon]
39
+ end
40
+
41
+ # Returns error_message_on ONLY IF the instance has errors on that field. Just a helpful way of conditionally rendering
42
+ # errors.
43
+ def errors_on(instance, method)
44
+ if (instance = instance_variable_get("@#{instance}")) && !instance.errors[method].empty?
45
+ error_message_on(instance, method, :css_class => 'error icon')
46
+ end
47
+ end
48
+
49
+ # Adds section-oriented class names if a current_page exists. Useful for styling your site to account for the presence
50
+ # of various content sections; e.g. if a CMS user adds a page with content in the "left" column but not a page with
51
+ # content in the "right" column, you can add:
52
+ #
53
+ # <body<%= page_class_name %>>
54
+ #
55
+ # and end up with:
56
+ #
57
+ # <body class="has-left">
58
+ #
59
+ # Likewise, you can add your own classes to the page_class_name method if you want to add other classes to the BODY tag, like so:
60
+ #
61
+ # <body<%= page_class_name :simple, 'another-class-name' %>>
62
+ #
63
+ # Which might produce something like:
64
+ #
65
+ # <body class="simple another-class-name has-left has-right">
66
+ #
67
+ # Using this, you can really dig deep into your stylesheets to hide empty columns and more
68
+ def page_class_name(*extras)
69
+ class_names = (extras.map(&:to_s) + Array(current_page.try(:class_names))).reject(&:blank?)
70
+ unless class_names.empty?
71
+ %( class="#{class_names.join(' ')}")
72
+ end
73
+ end
74
+
75
+ # Displays formatted content for a page section based on its 'filter' attribute. Useful for rendering individual
76
+ # page sections (if you're feeling so bold). It's probably easier to user page_section instead.
77
+ def page_content(page_section)
78
+ case page_section.filter
79
+ when 'markdown'
80
+ markdown(page_section.content)
81
+ when 'textfile'
82
+ textile(page_section.content)
83
+ else
84
+ simple_format(page_section.content)
85
+ end
86
+ end
87
+
88
+ # page_section can be used to check for content in a certain area of your layout, and to render it as well. It will
89
+ # return nil if there is no content for that section - so use it to quickly scope out sections and add them to your
90
+ # layout when present, e.g.:
91
+ #
92
+ # <% if page_section(:left) -%>
93
+ # <div id="left">
94
+ # <%= page_section(:left) %>
95
+ # <!-- Add other content that might go here -->
96
+ # </div>
97
+ # <% end -%>
98
+ #
99
+ def page_section(section_name)
100
+ return nil unless current_page
101
+ section_name = section_name.to_sym
102
+ @_page_sections ||= {}
103
+ return @_page_sections[section_name] if @_page_sections.has_key?(section_name)
104
+ if current_page.page_sections.respond_to?(section_name) && !current_page.page_sections.send(section_name).empty?
105
+ @_page_sections[section_name] = current_page.page_sections.send(section_name).map {|page_section| page_content(page_section) }.join("\n\n")
106
+ else
107
+ @_page_sections[section_name] = nil
108
+ end
109
+ end
110
+
111
+ def page_title(separator = '|')
112
+ if object = @post || @_page
113
+ "#{object.name} #{separator}"
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,59 @@
1
+ Grandstand::Application.routes.draw do |map|
2
+ resources :galleries, :only => [:index, :show]
3
+ match ':year/:month/:id', :to => 'posts#show', :as => 'post', :constraints => {:year => /\d\d\d\d/, :month => /\d{1,2}/}
4
+
5
+ namespace :admin do
6
+ resource :session do
7
+ member do
8
+ get :forgot
9
+ post :reset
10
+ end
11
+ end
12
+
13
+ root :to => 'main#index'
14
+ get 'expand', :to => 'main#expand'
15
+
16
+ resources :galleries do
17
+ collection do
18
+ post :reorder
19
+ end
20
+
21
+ member do
22
+ get :delete
23
+ end
24
+
25
+ resources :images, :except => [:show] do
26
+ collection do
27
+ post :reorder
28
+ get :upload
29
+ end
30
+
31
+ member do
32
+ get :delete
33
+ end
34
+ end
35
+ end
36
+
37
+ resources :pages do
38
+ member do
39
+ get :delete
40
+ end
41
+ end
42
+
43
+ resources :posts do
44
+ member do
45
+ get :delete
46
+ end
47
+ end
48
+
49
+ resources :templates
50
+
51
+ resources :users do
52
+ member do
53
+ get :delete
54
+ end
55
+ end
56
+ end
57
+
58
+ match '*url', :to => 'pages#show', :as => 'page'
59
+ end
@@ -0,0 +1,25 @@
1
+ require 'rack/utils'
2
+
3
+ module Grandstand
4
+ class Session
5
+ def initialize(app, session_key = '_session_id')
6
+ @app = app
7
+ @session_key = session_key
8
+ end
9
+
10
+ def call(env)
11
+ if env['HTTP_USER_AGENT'] =~ /^(Adobe|Shockwave) Flash/ && env['PATH_INFO'] =~ /^\/admin\/galleries\/\d+\/images$/
12
+ params = Rack::Request.new(env).POST
13
+ unless params['session_key'].nil?
14
+ # This will strip out the session_key from the POST params - not entirely necessary,
15
+ # but still cleaner than the alternative
16
+ env['HTTP_COOKIE'] = [ @session_key, params.delete('session_key') ].join('=').freeze
17
+ env['rack.input'] = StringIO.new(Rack::Utils::Multipart.build_multipart(params))
18
+ env['rack.input'].rewind
19
+ end
20
+ puts "\n\n#{env['HTTP_COOKIE'].inspect}\n\n"
21
+ end
22
+ @app.call(env)
23
+ end
24
+ end
25
+ end
data/lib/grandstand.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'grandstand/application'
2
+
3
+ module Grandstand
4
+ autoload(:Controller, 'grandstand/controller')
5
+ autoload(:Helper, 'grandstand/helper')
6
+
7
+ def self.initialize!(config = nil)
8
+ if defined?(ActionController)
9
+ ActionController::Base.send :include, Grandstand::Controller
10
+ if Rails.env.development?
11
+ ActionController::Base.send :include, Grandstand::Controller::Development
12
+ # Tell Less to produce the smallest stylesheets it's capable of
13
+ Less::More.compression = true
14
+ Less::More.header = false
15
+ # Point More to our plugins' source_path and our custom admin stylesheets folder
16
+ Less::More.source_path = File.join('vendor', 'plugins', 'grandstand', 'app', 'stylesheets')
17
+ Less::More.destination_path = File.join('admin', 'stylesheets')
18
+ end
19
+ end
20
+ if defined?(ActionView)
21
+ ActionView::Base.send :include, Grandstand::Helper
22
+ end
23
+ Paperclip.interpolates :padded_id do |attachment, style|
24
+ attachment.instance.id.to_s.rjust(6, '0')
25
+ end
26
+ end
27
+ end
data/public/.DS_Store ADDED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file