crowdblog 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/.gitignore +12 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/.simplecov +13 -0
  5. data/Gemfile +35 -0
  6. data/Gemfile.lock +291 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.rdoc +3 -0
  9. data/Rakefile +32 -0
  10. data/app/assets/images/crowdblog/.gitkeep +0 -0
  11. data/app/assets/images/crowdblog/logo.png +0 -0
  12. data/app/assets/javascripts/crowdblog/models/post.js.coffee +11 -0
  13. data/app/assets/javascripts/crowdblog/posts_main.js.coffee +42 -0
  14. data/app/assets/javascripts/crowdblog/templates/posts/attachment.jst.eco +1 -0
  15. data/app/assets/javascripts/crowdblog/templates/posts/edit.jst.eco +38 -0
  16. data/app/assets/javascripts/crowdblog/templates/posts/index.jst.eco +17 -0
  17. data/app/assets/javascripts/crowdblog/templates/posts/post.jst.eco +27 -0
  18. data/app/assets/javascripts/crowdblog/views/posts/attachment_view.js.coffee +8 -0
  19. data/app/assets/javascripts/crowdblog/views/posts/edit_post_view.js.coffee +41 -0
  20. data/app/assets/javascripts/crowdblog/views/posts/index.js.coffee +28 -0
  21. data/app/assets/javascripts/crowdblog/views/posts/post_view.js.coffee +40 -0
  22. data/app/assets/javascripts/crowdblog/xhr_fix.js.coffee +4 -0
  23. data/app/assets/javascripts/crowdblog.js +16 -0
  24. data/app/assets/stylesheets/crowdblog/posts.css.scss +3 -0
  25. data/app/assets/stylesheets/crowdblog.css +7 -0
  26. data/app/controllers/crowdblog/application_controller.rb +16 -0
  27. data/app/controllers/crowdblog/assets_controller.rb +14 -0
  28. data/app/controllers/crowdblog/authors_controller.rb +9 -0
  29. data/app/controllers/crowdblog/posts_controller.rb +48 -0
  30. data/app/controllers/crowdblog/sessions_controller.rb +25 -0
  31. data/app/controllers/crowdblog/users/omniauth_callbacks_controller.rb +21 -0
  32. data/app/helpers/crowdblog/application_helper.rb +4 -0
  33. data/app/models/crowdblog/asset.rb +8 -0
  34. data/app/models/crowdblog/post.rb +121 -0
  35. data/app/models/crowdblog/user.rb +32 -0
  36. data/app/sweepers/post_sweeper.rb +5 -0
  37. data/app/uploaders/attachment_uploader.rb +48 -0
  38. data/app/views/crowdblog/authors/index.html.slim +18 -0
  39. data/app/views/crowdblog/posts/index.html.slim +13 -0
  40. data/app/views/layouts/crowdblog/application.html.slim +25 -0
  41. data/config/cucumber.yml +8 -0
  42. data/config/routes.rb +14 -0
  43. data/crowdblog.gemspec +46 -0
  44. data/db/migrate/20120215232711_create_users.rb +10 -0
  45. data/db/migrate/20120216154516_add_devise_to_users.rb +56 -0
  46. data/db/migrate/20120217213920_create_posts.rb +13 -0
  47. data/db/migrate/20120219014520_add_author_to_posts.rb +6 -0
  48. data/db/migrate/20120219040607_add_state_to_post.rb +7 -0
  49. data/db/migrate/20120219071614_create_assets.rb +10 -0
  50. data/db/migrate/20120219234253_add_alias_to_users.rb +6 -0
  51. data/db/migrate/20120220033923_create_vestal_versions.rb +28 -0
  52. data/features/posts/manage_posts.feature +46 -0
  53. data/features/step_definitions/index_steps.rb +16 -0
  54. data/features/step_definitions/interaction_steps.rb +26 -0
  55. data/features/step_definitions/posts_steps.rb +35 -0
  56. data/features/step_definitions/session_steps.rb +15 -0
  57. data/features/support/env.rb +69 -0
  58. data/lib/crowdblog/engine.rb +5 -0
  59. data/lib/crowdblog/version.rb +3 -0
  60. data/lib/crowdblog.rb +4 -0
  61. data/lib/tasks/crowdblog_tasks.rake +4 -0
  62. data/script/build +29 -0
  63. data/script/cucumber +10 -0
  64. data/script/rails +8 -0
  65. data/spec/dummy/.rvmrc +1 -0
  66. data/spec/dummy/README.rdoc +261 -0
  67. data/spec/dummy/Rakefile +7 -0
  68. data/spec/dummy/app/assets/javascripts/application.js +16 -0
  69. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  70. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  71. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  72. data/spec/dummy/app/mailers/.gitkeep +0 -0
  73. data/spec/dummy/app/models/.gitkeep +0 -0
  74. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  75. data/spec/dummy/config/application.rb +62 -0
  76. data/spec/dummy/config/boot.rb +10 -0
  77. data/spec/dummy/config/database.yml +25 -0
  78. data/spec/dummy/config/environment.rb +5 -0
  79. data/spec/dummy/config/environments/development.rb +37 -0
  80. data/spec/dummy/config/environments/production.rb +67 -0
  81. data/spec/dummy/config/environments/test.rb +37 -0
  82. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  83. data/spec/dummy/config/initializers/carrierwave.rb +18 -0
  84. data/spec/dummy/config/initializers/devise.rb +230 -0
  85. data/spec/dummy/config/initializers/inflections.rb +15 -0
  86. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  87. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  88. data/spec/dummy/config/initializers/session_store.rb +8 -0
  89. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  90. data/spec/dummy/config/locales/en.yml +5 -0
  91. data/spec/dummy/config/routes.rb +6 -0
  92. data/spec/dummy/config.ru +4 -0
  93. data/spec/dummy/db/schema.rb +76 -0
  94. data/spec/dummy/lib/assets/.gitkeep +0 -0
  95. data/spec/dummy/lib/tasks/cucumber.rake +65 -0
  96. data/spec/dummy/log/.gitkeep +0 -0
  97. data/spec/dummy/public/404.html +26 -0
  98. data/spec/dummy/public/422.html +26 -0
  99. data/spec/dummy/public/500.html +25 -0
  100. data/spec/dummy/public/favicon.ico +0 -0
  101. data/spec/dummy/script/rails +6 -0
  102. data/spec/helpers/application_helper_spec.rb +4 -0
  103. data/spec/models/post_spec.rb +94 -0
  104. data/spec/spec_helper.rb +39 -0
  105. data/vendor/assets/javascripts/jquery.uploadify.js +296 -0
  106. data/vendor/assets/javascripts/swfobject.js +4 -0
  107. metadata +428 -0
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ .bundle/
2
+ log/*.log
3
+ pkg/
4
+
5
+ coverage/
6
+
7
+ spec/dummy/db/*.sqlite3
8
+ spec/dummy/log/*.log
9
+ spec/dummy/tmp/
10
+ spec/dummy/.sass-cache
11
+
12
+ .sass-cache
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format Fuubar
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@crowdblog --create --install
data/.simplecov ADDED
@@ -0,0 +1,13 @@
1
+ # use RCov formatter for metric_fu: http://bit.ly/wQbrxB
2
+ require 'simplecov-rcov-text'
3
+
4
+ class SimpleCov::Formatter::MergedFormatter
5
+ def format(result)
6
+ SimpleCov::Formatter::HTMLFormatter.new.format(result)
7
+ SimpleCov::Formatter::RcovTextFormatter.new.format(result)
8
+ end
9
+ end
10
+ SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
11
+
12
+ SimpleCov.start 'rails' do
13
+ end
data/Gemfile ADDED
@@ -0,0 +1,35 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Declare your gem's dependencies in crowdblog.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # Gems used by the dummy application (needs to be here instead of the gemspec)
9
+ gem "jquery-rails"
10
+ gem 'backbone-rails'
11
+ gem 'carrierwave'
12
+ gem 'devise'
13
+ gem 'gravtastic'
14
+ gem 'less-rails-bootstrap'
15
+ gem 'omniauth-google-apps'
16
+ gem 'omniauth-google-oauth2'
17
+ gem 'state_machine'
18
+ gem 'slim_assets'
19
+ gem 'slim-rails'
20
+ gem 'eco'
21
+
22
+ group :assets do
23
+ gem 'coffee-rails'
24
+ gem 'sass-rails'
25
+ gem 'uglifier'
26
+ end
27
+
28
+ # Declare any dependencies that are still in development here instead of in
29
+ # your gemspec. These might include edge Rails or gems from your path or
30
+ # Git. Remember to move these dependencies to your gemspec before releasing
31
+ # your gem to rubygems.org.
32
+ gem 'vestal_versions', :git => 'https://github.com/jodosha/vestal_versions.git'
33
+
34
+ # To use debugger
35
+ # gem 'ruby-debug19', :require => 'ruby-debug'
data/Gemfile.lock ADDED
@@ -0,0 +1,291 @@
1
+ GIT
2
+ remote: https://github.com/jodosha/vestal_versions.git
3
+ revision: ef4334ccadf1077f4fa0e72ae515ddf7d00a8ad7
4
+ specs:
5
+ vestal_versions (1.2.2)
6
+ activerecord (>= 3.1.0)
7
+ activesupport (>= 3.1.0)
8
+
9
+ PATH
10
+ remote: .
11
+ specs:
12
+ crowdblog (0.0.1)
13
+ backbone-rails
14
+ carrierwave
15
+ devise
16
+ eco
17
+ gravtastic
18
+ jquery-rails
19
+ less-rails-bootstrap
20
+ omniauth-google-apps
21
+ omniauth-google-oauth2
22
+ rails (~> 3.2)
23
+ slim-rails
24
+ slim_assets
25
+ state_machine
26
+
27
+ GEM
28
+ remote: http://rubygems.org/
29
+ specs:
30
+ actionmailer (3.2.1)
31
+ actionpack (= 3.2.1)
32
+ mail (~> 2.4.0)
33
+ actionpack (3.2.1)
34
+ activemodel (= 3.2.1)
35
+ activesupport (= 3.2.1)
36
+ builder (~> 3.0.0)
37
+ erubis (~> 2.7.0)
38
+ journey (~> 1.0.1)
39
+ rack (~> 1.4.0)
40
+ rack-cache (~> 1.1)
41
+ rack-test (~> 0.6.1)
42
+ sprockets (~> 2.1.2)
43
+ activemodel (3.2.1)
44
+ activesupport (= 3.2.1)
45
+ builder (~> 3.0.0)
46
+ activerecord (3.2.1)
47
+ activemodel (= 3.2.1)
48
+ activesupport (= 3.2.1)
49
+ arel (~> 3.0.0)
50
+ tzinfo (~> 0.3.29)
51
+ activeresource (3.2.1)
52
+ activemodel (= 3.2.1)
53
+ activesupport (= 3.2.1)
54
+ activesupport (3.2.1)
55
+ i18n (~> 0.6)
56
+ multi_json (~> 1.0)
57
+ addressable (2.2.7)
58
+ arel (3.0.2)
59
+ backbone-rails (0.9.0)
60
+ rails (>= 3.0.0)
61
+ bcrypt-ruby (3.0.1)
62
+ builder (3.0.0)
63
+ capybara (1.1.2)
64
+ mime-types (>= 1.16)
65
+ nokogiri (>= 1.3.3)
66
+ rack (>= 1.0.0)
67
+ rack-test (>= 0.5.4)
68
+ selenium-webdriver (~> 2.0)
69
+ xpath (~> 0.1.4)
70
+ carrierwave (0.5.8)
71
+ activesupport (~> 3.0)
72
+ childprocess (0.3.1)
73
+ ffi (~> 1.0.6)
74
+ coffee-rails (3.2.2)
75
+ coffee-script (>= 2.2.0)
76
+ railties (~> 3.2.0)
77
+ coffee-script (2.2.0)
78
+ coffee-script-source
79
+ execjs
80
+ coffee-script-source (1.2.0)
81
+ commonjs (0.2.0)
82
+ therubyracer (~> 0.9.9)
83
+ cucumber (1.1.9)
84
+ builder (>= 2.1.2)
85
+ diff-lcs (>= 1.1.2)
86
+ gherkin (~> 2.9.0)
87
+ json (>= 1.4.6)
88
+ term-ansicolor (>= 1.0.6)
89
+ cucumber-rails (1.3.0)
90
+ capybara (>= 1.1.2)
91
+ cucumber (>= 1.1.8)
92
+ nokogiri (>= 1.5.0)
93
+ database_cleaner (0.7.1)
94
+ devise (2.0.4)
95
+ bcrypt-ruby (~> 3.0)
96
+ orm_adapter (~> 0.0.3)
97
+ railties (~> 3.1)
98
+ warden (~> 1.1.1)
99
+ diff-lcs (1.1.3)
100
+ eco (1.0.0)
101
+ coffee-script
102
+ eco-source
103
+ execjs
104
+ eco-source (1.1.0.rc.1)
105
+ erubis (2.7.0)
106
+ execjs (1.3.0)
107
+ multi_json (~> 1.0)
108
+ faraday (0.7.6)
109
+ addressable (~> 2.2)
110
+ multipart-post (~> 1.1)
111
+ rack (~> 1.1)
112
+ ffi (1.0.11)
113
+ fuubar (1.0.0)
114
+ rspec (~> 2.0)
115
+ rspec-instafail (~> 0.2.0)
116
+ ruby-progressbar (~> 0.0.10)
117
+ gherkin (2.9.0)
118
+ json (>= 1.4.6)
119
+ gravtastic (3.2.6)
120
+ hashie (1.2.0)
121
+ hike (1.2.1)
122
+ i18n (0.6.0)
123
+ journey (1.0.2)
124
+ jquery-rails (2.0.0)
125
+ railties (>= 3.2.0.beta, < 5.0)
126
+ thor (~> 0.14)
127
+ json (1.6.5)
128
+ json_pure (1.6.5)
129
+ less (2.0.9)
130
+ commonjs (~> 0.2.0)
131
+ therubyracer (~> 0.9.9)
132
+ less-rails (2.1.6)
133
+ actionpack (>= 3.1)
134
+ less (~> 2.0.7)
135
+ less-rails-bootstrap (2.0.6)
136
+ less-rails (~> 2.1.0)
137
+ libv8 (3.3.10.4)
138
+ mail (2.4.1)
139
+ i18n (>= 0.4.0)
140
+ mime-types (~> 1.16)
141
+ treetop (~> 1.4.8)
142
+ mime-types (1.17.2)
143
+ multi_json (1.1.0)
144
+ multipart-post (1.1.5)
145
+ nokogiri (1.5.0)
146
+ oauth2 (0.5.2)
147
+ faraday (~> 0.7)
148
+ multi_json (~> 1.0)
149
+ omniauth (1.0.2)
150
+ hashie (~> 1.2)
151
+ rack
152
+ omniauth-google-apps (0.0.1)
153
+ omniauth (~> 1.0)
154
+ omniauth-openid (~> 1.0)
155
+ ruby-openid-apps-discovery (~> 1.2.0)
156
+ omniauth-google-oauth2 (0.1.9)
157
+ omniauth (~> 1.0)
158
+ omniauth-oauth2
159
+ omniauth-oauth2 (1.0.0)
160
+ oauth2 (~> 0.5.0)
161
+ omniauth (~> 1.0)
162
+ omniauth-openid (1.0.1)
163
+ omniauth (~> 1.0)
164
+ rack-openid (~> 1.3.1)
165
+ orm_adapter (0.0.6)
166
+ polyglot (0.3.3)
167
+ rack (1.4.1)
168
+ rack-cache (1.1)
169
+ rack (>= 0.4)
170
+ rack-openid (1.3.1)
171
+ rack (>= 1.1.0)
172
+ ruby-openid (>= 2.1.8)
173
+ rack-ssl (1.3.2)
174
+ rack
175
+ rack-test (0.6.1)
176
+ rack (>= 1.0)
177
+ rails (3.2.1)
178
+ actionmailer (= 3.2.1)
179
+ actionpack (= 3.2.1)
180
+ activerecord (= 3.2.1)
181
+ activeresource (= 3.2.1)
182
+ activesupport (= 3.2.1)
183
+ bundler (~> 1.0)
184
+ railties (= 3.2.1)
185
+ railties (3.2.1)
186
+ actionpack (= 3.2.1)
187
+ activesupport (= 3.2.1)
188
+ rack-ssl (~> 1.3.2)
189
+ rake (>= 0.8.7)
190
+ rdoc (~> 3.4)
191
+ thor (~> 0.14.6)
192
+ rake (0.9.2.2)
193
+ rdoc (3.12)
194
+ json (~> 1.4)
195
+ rspec (2.8.0)
196
+ rspec-core (~> 2.8.0)
197
+ rspec-expectations (~> 2.8.0)
198
+ rspec-mocks (~> 2.8.0)
199
+ rspec-core (2.8.0)
200
+ rspec-expectations (2.8.0)
201
+ diff-lcs (~> 1.1.2)
202
+ rspec-instafail (0.2.2)
203
+ rspec-mocks (2.8.0)
204
+ rspec-rails (2.8.1)
205
+ actionpack (>= 3.0)
206
+ activesupport (>= 3.0)
207
+ railties (>= 3.0)
208
+ rspec (~> 2.8.0)
209
+ ruby-openid (2.1.8)
210
+ ruby-openid-apps-discovery (1.2.0)
211
+ ruby-openid (>= 2.1.7)
212
+ ruby-progressbar (0.0.10)
213
+ rubyzip (0.9.6.1)
214
+ sass (3.1.15)
215
+ sass-rails (3.2.4)
216
+ railties (~> 3.2.0)
217
+ sass (>= 3.1.10)
218
+ tilt (~> 1.3)
219
+ selenium-webdriver (2.13.0)
220
+ childprocess (>= 0.2.1)
221
+ ffi (~> 1.0.9)
222
+ json_pure
223
+ rubyzip
224
+ simplecov (0.6.0)
225
+ multi_json (~> 1.0)
226
+ simplecov-html (~> 0.5.3)
227
+ simplecov-html (0.5.3)
228
+ simplecov-rcov-text (0.0.2)
229
+ slim (1.1.0)
230
+ temple (~> 0.3.5)
231
+ tilt (~> 1.3.2)
232
+ slim-rails (1.0.3)
233
+ actionpack (~> 3.0)
234
+ activesupport (~> 3.0)
235
+ railties (~> 3.0)
236
+ slim (~> 1.0)
237
+ slim_assets (0.0.2)
238
+ slim
239
+ tilt
240
+ sprockets (2.1.2)
241
+ hike (~> 1.2)
242
+ rack (~> 1.0)
243
+ tilt (~> 1.1, != 1.3.0)
244
+ sqlite3 (1.3.5)
245
+ state_machine (1.1.2)
246
+ temple (0.3.5)
247
+ term-ansicolor (1.0.7)
248
+ therubyracer (0.9.10)
249
+ libv8 (~> 3.3.10)
250
+ thor (0.14.6)
251
+ tilt (1.3.3)
252
+ treetop (1.4.10)
253
+ polyglot
254
+ polyglot (>= 0.3.1)
255
+ tzinfo (0.3.31)
256
+ uglifier (1.2.3)
257
+ execjs (>= 0.3.0)
258
+ multi_json (>= 1.0.2)
259
+ warden (1.1.1)
260
+ rack (>= 1.0)
261
+ xpath (0.1.4)
262
+ nokogiri (~> 1.3)
263
+
264
+ PLATFORMS
265
+ ruby
266
+
267
+ DEPENDENCIES
268
+ backbone-rails
269
+ carrierwave
270
+ coffee-rails
271
+ crowdblog!
272
+ cucumber-rails
273
+ database_cleaner
274
+ devise
275
+ eco
276
+ fuubar
277
+ gravtastic
278
+ jquery-rails
279
+ less-rails-bootstrap
280
+ omniauth-google-apps
281
+ omniauth-google-oauth2
282
+ rspec-rails
283
+ sass-rails
284
+ simplecov
285
+ simplecov-rcov-text
286
+ slim-rails
287
+ slim_assets
288
+ sqlite3
289
+ state_machine
290
+ uglifier
291
+ vestal_versions!
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.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = CrowdBlog
2
+
3
+ This project rocks!
data/Rakefile ADDED
@@ -0,0 +1,32 @@
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 = 'Crowdblog'
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 'rspec/core/rake_task'
29
+ RSpec::Core::RakeTask.new(:spec)
30
+
31
+ # RSpec as default
32
+ task :default => :spec
File without changes
@@ -0,0 +1,11 @@
1
+ PostsApp.Post = Backbone.Model.extend
2
+ url: ->
3
+ if this.id
4
+ '/admin/posts/' + this.id
5
+ else
6
+ '/admin/posts'
7
+
8
+ PostsApp.PostCollection = Backbone.Collection.extend
9
+ model: PostsApp.Post
10
+
11
+ url: '/admin/posts'
@@ -0,0 +1,42 @@
1
+ $ ->
2
+ PostsApp.Router = Backbone.Router.extend
3
+ routes:
4
+ "": "index"
5
+ "new" : "newPost"
6
+ "edit/:id" : "editPost"
7
+
8
+ newPost: ->
9
+ new_posts = new PostsApp.EditPostView({model: new PostsApp.Post() })
10
+ $('#posts').html(new_posts.render().el)
11
+
12
+ index: ->
13
+ index_view = new PostsApp.PostsIndexView({posts: PostsApp.Posts.toJSON()})
14
+ $('#posts').html(index_view.render().el)
15
+ PostsApp.Posts.fetch()
16
+
17
+ editPost: (e) ->
18
+ post = PostsApp.Posts.get(e) || new PostsApp.Post({id: e, title: 'The title'})
19
+ post.fetch
20
+ success: (model) =>
21
+ edit_post_view = new PostsApp.EditPostView({model: post})
22
+ $('#posts').html(edit_post_view.render().el)
23
+ $('#uploader').uploadify
24
+ 'uploader' : '/uploadify.swf'
25
+ 'cancelImg' : '/assets/cancel.png'
26
+ 'auto' : true
27
+ 'script' : '/admin/posts/' + post.id + '/assets'
28
+ 'onComplete' : this.uploadComplete
29
+
30
+ uploadComplete: (e, id, file, response, data) ->
31
+ attachment = new PostsApp.AttachmentView
32
+ url: $.parseJSON(response).attachment.url
33
+
34
+ $('.attachment-list').append(attachment.render().el)
35
+
36
+ true
37
+
38
+ PostsApp.Posts = new PostsApp.PostCollection()
39
+
40
+ PostsApp.PostsView = Backbone.View.extend
41
+ el: $('#posts')
42
+
@@ -0,0 +1 @@
1
+ <div class="attachment"><%= @url %></div>
@@ -0,0 +1,38 @@
1
+ <h2><%= @isNew ? 'New' : 'Edit' %> Post</h2>
2
+
3
+ <form accept-charset="UTF-8" action="/" class="form-horizontal" method="post">
4
+ <fieldset>
5
+ <div class="control-group title">
6
+ <label class="control-label" for="post_title">Title</label>
7
+ <div class="controls">
8
+ <input class="input-xlarge span7" id="post_title" name="post_title" type="text" value="<%= @post.title %>">
9
+ <span class="help-inline title"></span>
10
+ </div>
11
+ </div>
12
+
13
+ <div class="control-group body">
14
+ <label class="control-label" for="post_body">Body</label>
15
+ <div class="controls">
16
+ <textarea class="span9" id="post_body" name="post_body" rows="30"><%= @post.body %></textarea>
17
+ <span class="help-inline">
18
+ <a href="http://daringfireball.net/projects/markdown/syntax" target="_blank">Markdown syntax</a>
19
+ </span>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="form-actions">
24
+ <div class="row">
25
+ <div class="span1">
26
+ <button class="btn btn-primary update">Save</button>
27
+ </div>
28
+ <div class="span1">
29
+ <button class="btn btn-danger cancel">Cancel</button>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </fieldset>
34
+
35
+ <div style="margin:0;padding:0;display:inline">
36
+ <input name="utf8" type="hidden" value="✓">
37
+ </div>
38
+ </form>
@@ -0,0 +1,17 @@
1
+ <a href="#new" class="btn btn-primary new-post">New Post</a>
2
+
3
+ <div class="posts">
4
+ <table class="table table-striped">
5
+ <thead>
6
+ <tr>
7
+ <th>Title</th>
8
+ <th>Author</th>
9
+ <th>Published at</th>
10
+ <th></th>
11
+ <th></th>
12
+ <th></th>
13
+ </tr>
14
+ </thead>
15
+ <tbody></tbody>
16
+ </table>
17
+ </div>
@@ -0,0 +1,27 @@
1
+ <td>
2
+ <a href="/preview/<%= @post.id %>" target="_blank">
3
+ <%= @post.title %>
4
+ </a>
5
+ </td>
6
+
7
+ <td>
8
+ <%= @post.author_email %>
9
+ </td>
10
+
11
+ <td class="span2">
12
+ <%= @post.published_at %>
13
+ </td>
14
+
15
+ <td class="span1">
16
+ <% if @publisher: %>
17
+ <a href="#" class="publish btn span1">Publish</a>
18
+ <% end %>
19
+ </td>
20
+
21
+ <td class="span1">
22
+ <a href="#edit/<%= @post.id %>" class="edit btn span1">Edit</a>
23
+ </td>
24
+
25
+ <td class="span1">
26
+ <a href="#" class="delete btn span1">Delete</a>
27
+ </td>
@@ -0,0 +1,8 @@
1
+ $ ->
2
+ PostsApp.AttachmentView = Backbone.View.extend
3
+ template:
4
+ JST["crowdblog/templates/posts/attachment"]
5
+
6
+ render: ->
7
+ this.$el.html(this.template(this.options))
8
+ this
@@ -0,0 +1,41 @@
1
+ $ ->
2
+ PostsApp.EditPostView = Backbone.View.extend
3
+ events:
4
+ 'click .cancel' : 'cancelPost'
5
+ 'click .update' : 'updatePost'
6
+
7
+ template:
8
+ JST["crowdblog/templates/posts/edit"]
9
+
10
+ render: ->
11
+ this.model.fetch()
12
+ this.$el.html(this.template({post: this.model.toJSON(), isNew: this.model.isNew()}))
13
+ this
14
+
15
+ cancelPost: (e) ->
16
+ e.preventDefault()
17
+ this.goHome()
18
+
19
+ updatePost: (e) ->
20
+ e.preventDefault()
21
+ this.model.save this.extractData(),
22
+ success: =>
23
+ this.goHome()
24
+
25
+ error: (e) =>
26
+ errors = $.parseJSON(e.responseText).errors
27
+ console.log errors[0]
28
+
29
+ $.each errors, (key, value) =>
30
+ this.$('.control-group.' + key).addClass('error')
31
+ this.$('.' + key + '.help-inline').html(value.join(','))
32
+
33
+ extractData: ->
34
+ {
35
+ 'body' : this.$('#post_body').val(),
36
+ 'title' : this.$('#post_title').val()
37
+ }
38
+
39
+ goHome: ->
40
+ PostsApp.router.navigate '/'
41
+ trigger: true
@@ -0,0 +1,28 @@
1
+ $ ->
2
+ PostsApp.PostsIndexView = Backbone.View.extend
3
+ initialize: ->
4
+ _.bindAll(this, 'addPost', 'addAllPosts', 'removePost')
5
+ PostsApp.Posts.on('add', this.addPost, this)
6
+ PostsApp.Posts.on('remove', this.removePost, this)
7
+ PostsApp.Posts.on('reset', this.addAllPosts, this)
8
+
9
+ template:
10
+ JST["crowdblog/templates/posts/index"]
11
+
12
+ render: ->
13
+ this.$el.html(this.template())
14
+ this
15
+
16
+ addPost: (post) ->
17
+ elementId = 'post-' + post.id
18
+ post_view = new PostsApp.PostView
19
+ model: post
20
+ id: elementId
21
+
22
+ this.$el.find('tbody').append(post_view.render().el)
23
+
24
+ addAllPosts: ->
25
+ PostsApp.Posts.each(this.addPost)
26
+
27
+ removePost: (post) ->
28
+ this.$('#post-' + post.id).remove()
@@ -0,0 +1,40 @@
1
+ $ ->
2
+ PostsApp.PostView = Backbone.View.extend
3
+ tagName: 'tr'
4
+
5
+ events:
6
+ 'click .delete' : 'deletePost'
7
+ 'click .publish' : 'togglePublish'
8
+
9
+ template:
10
+ JST["crowdblog/templates/posts/post"]
11
+
12
+ render: ->
13
+ this.$el.html(this.template({post: this.model.toJSON(), publisher: PostsApp.publisher}))
14
+ this.paintButtons()
15
+ this
16
+
17
+ deletePost: (e) ->
18
+ e.preventDefault()
19
+ if confirm('Are you sure?')
20
+ this.model.destroy()
21
+
22
+ togglePublish: (e) ->
23
+ e.preventDefault()
24
+
25
+ if this.model.get('published?')
26
+ this.model.save
27
+ transition: 'draft'
28
+ this.model.set('published?', false)
29
+ else
30
+ this.model.save
31
+ transition: 'publish'
32
+ this.model.set('published?', true)
33
+
34
+ this.paintButtons()
35
+
36
+ paintButtons: ->
37
+ this.$el.find('.publish').removeClass('btn-success btn-danger')
38
+ this.$el.find('.publish').addClass('btn-success') if this.model.get('published?')
39
+ this.$el.find('.publish').addClass('btn-danger') unless this.model.get('published?')
40
+