spree_cms 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/Gemfile +4 -0
  2. data/README.markdown +108 -0
  3. data/Rakefile +2 -0
  4. data/app/controllers/admin/cms_settings_controller.rb +11 -0
  5. data/app/controllers/admin/pages_controller.rb +54 -0
  6. data/app/controllers/admin/posts_controller.rb +55 -0
  7. data/app/controllers/pages_controller.rb +4 -0
  8. data/app/controllers/posts_controller.rb +26 -0
  9. data/app/helpers/cms_helper.rb +21 -0
  10. data/app/models/page.rb +38 -0
  11. data/app/models/post.rb +73 -0
  12. data/app/views/admin/cms_settings/edit.html.erb +40 -0
  13. data/app/views/admin/cms_settings/show.html.erb +42 -0
  14. data/app/views/admin/pages/_form.html.erb +51 -0
  15. data/app/views/admin/pages/edit.html.erb +7 -0
  16. data/app/views/admin/pages/index.html.erb +90 -0
  17. data/app/views/admin/pages/new.html.erb +28 -0
  18. data/app/views/admin/posts/_form.html.erb +66 -0
  19. data/app/views/admin/posts/_sub_menu.html.erb +7 -0
  20. data/app/views/admin/posts/edit.html.erb +9 -0
  21. data/app/views/admin/posts/index.html.erb +101 -0
  22. data/app/views/admin/posts/new.html.erb +45 -0
  23. data/app/views/admin/users/_display_name.html.erb +4 -0
  24. data/app/views/pages/show.html.erb +5 -0
  25. data/app/views/posts/_post.html.erb +13 -0
  26. data/app/views/posts/index.html.erb +14 -0
  27. data/app/views/posts/index.rss.builder +19 -0
  28. data/app/views/posts/show.html.erb +10 -0
  29. data/app/views/posts/tags.html.erb +18 -0
  30. data/app/views/shared/_cms_content_for.html.erb +7 -0
  31. data/app/views/shared/_recent_articles.html.erb +7 -0
  32. data/app/views/shared/_store_menu.html.erb +5 -0
  33. data/config/locales/en.yml +48 -0
  34. data/lib/extensions/string.rb +20 -0
  35. data/lib/generators/spree_cms/USAGE +8 -0
  36. data/lib/generators/spree_cms/install/install_generator.rb +40 -0
  37. data/lib/generators/spree_cms/install/templates/db/migrate/add_display_name_to_user.rb +9 -0
  38. data/lib/generators/spree_cms/install/templates/db/migrate/create_pages.rb +23 -0
  39. data/lib/generators/spree_cms/install/templates/db/migrate/create_posts.rb +26 -0
  40. data/lib/generators/spree_cms/install/templates/db/migrate/is_taggable_migration.rb +24 -0
  41. data/lib/generators/spree_cms/install/templates/public/images/icons/feed.gif +0 -0
  42. data/lib/generators/spree_cms/install/templates/public/stylesheets/sass/cms.sass +60 -0
  43. data/lib/spree_cms/version.rb +3 -0
  44. data/lib/spree_cms.rb +66 -0
  45. data/lib/spree_cms_hooks.rb +11 -0
  46. data/spree_cms.gemspec +25 -0
  47. metadata +154 -0
@@ -0,0 +1,66 @@
1
+ <div class="yui-gc">
2
+ <div class="yui-u first">
3
+ <%- locals = {:f => f} -%>
4
+ <% hook :admin_post_form_left, locals do %>
5
+ <% f.field_container :title do %>
6
+ <%= f.label :title, t("cms.title") %> <span class="required">*</span><br />
7
+ <%= f.text_field :title, :class => 'fullwidth title' %>
8
+ <%= f.error_message_on :title %>
9
+ <% end %>
10
+
11
+ <% f.field_container :permalink do %>
12
+ <%= f.label :permalink, t("cms.permalink") %> <span class="required">*</span><br />
13
+ <%= f.text_field :permalink, :class => 'fullwidth title' %>
14
+ <%= f.error_message_on :permalink %>
15
+ <% end %>
16
+
17
+ <% f.field_container :excerpt do %>
18
+ <%= f.label :excerpt, t("cms.excerpt")%><br />
19
+ <%= f.text_area :excerpt, {:cols => 120, :rows => 3, :class => 'fullwidth'} %>
20
+ <%= f.error_message_on :excerpt %>
21
+ <% end %>
22
+
23
+ <% f.field_container :body_raw do %>
24
+ <%= f.label :body_raw, t("cms.body")%> <span class="required">*</span><br />
25
+ <%= f.text_area :body_raw, {:cols => 120, :rows => 4, :class => 'fullwidth'} %>
26
+ <%= f.error_message_on :body_raw %>
27
+ <% end %>
28
+ <% end %>
29
+ </div>
30
+ <div class="yui-u">
31
+ <% hook :admin_post_form_right, locals do %>
32
+
33
+ <p>
34
+ <%= f.label :user_id, t("cms.author")%><br />
35
+ <%= f.collection_select :user_id, User.roles_name_equals("cms.admin"), :id, :display_name, {:prompt => t("cms.select_author")} %>
36
+ <%= f.error_message_on :user_id %>
37
+ </p>
38
+
39
+ <p>
40
+ <%= f.label :is_active, t("cms.status")%><br />
41
+ <%= f.radio_button :is_active, 1 %><%= t("cms.publish") %>
42
+ <%= f.radio_button :is_active, 0 %><%= t("cms.draft") %>
43
+ <%= f.error_message_on :is_active %>
44
+ </p>
45
+
46
+ <p>
47
+ <%= f.label :commentable, t("cms.comment_status") %>: <%= f.radio_button :commentable, 1 %><%= t("cms.open") %> <%= f.radio_button :commentable, 0 %><%= t("cms.closed") %>
48
+ </p>
49
+ <p>
50
+ <%= f.label :tag_list, "#{t('cms.tags')} (#{t('cms.tags_hint')}):" %> <br/> <%= f.text_field :tag_list %>
51
+ </p>
52
+
53
+ <h2><%= t("cms.metadata") %></h2>
54
+ <% hook :admin_page_form_meta, locals do %>
55
+ <p>
56
+ <%= f.label :meta_keywords, t("cms.meta_keywords")%><br />
57
+ <%= f.text_field :meta_keywords, :class => 'fullwidth' %>
58
+ </p>
59
+ <p>
60
+ <%= f.label :meta_description, t("cms.meta_description")%><br />
61
+ <%= f.text_field :meta_description, :class => 'fullwidth' %>
62
+ </p>
63
+ <% end %>
64
+ <% end %>
65
+ </div>
66
+ </div>
@@ -0,0 +1,7 @@
1
+ <% content_for :sub_menu do %>
2
+ <ul id="sub_nav">
3
+ <%= tab :cms_settings, :label => 'cms.settings' %>
4
+ <%= tab :posts %>
5
+ <%# tab :view_blog, :route => :posts, :css_class => 'last' %>
6
+ </ul>
7
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <%= render :partial => 'sub_menu' %>
2
+
3
+ <h1><%= t("cms.editing_post") + " &ldquo;#{@post.title}&rdquo;" %></h1>
4
+
5
+ <% form_for(@post, :url => object_url, :html => { :method => :put, :multipart => true }) do |f| %>
6
+ <%= render :partial => 'form', :locals => {:f => f} %>
7
+ <%= render :partial => 'admin/shared/edit_resource_links' %>
8
+ <% end %>
9
+
@@ -0,0 +1,101 @@
1
+ <%= render :partial => 'sub_menu' %>
2
+
3
+ <div class='toolbar'>
4
+ <ul class='actions'>
5
+ <li id="new_ot_link">
6
+ <%= button_link_to_remote t("cms.new_post"),
7
+ {:url => new_object_url,
8
+ :method => :get,
9
+ :update => "new-post"}, :icon => 'add' %>
10
+ </li>
11
+ </ul>
12
+ <br class='clear' />
13
+ </div>
14
+
15
+
16
+ <h1><%= "#{t('actions.listing')} #{t('posts')}" %></h1>
17
+
18
+ <%= image_tag "spinner.gif", :plugin=>"spree", :style => "display:none", :id => 'busy_indicator' %>
19
+ <div id="new-post"></div>
20
+
21
+ <table class="index">
22
+ <tr>
23
+ <% hook :admin_posts_index_headers do %>
24
+ <th><%= order @search, :by => :title, :as => t("cms.title") %></th>
25
+ <th><%= order @search, :by => :author, :as => t("cms.author") %></th>
26
+ <th><%= t("cms.tags") %></th>
27
+ <th><%= order @search, :by => :date, :as => t("cms.date") %></th>
28
+ <% end %>
29
+ <th>
30
+ <%= hook :admin_posts_index_header_actions %>
31
+ </th>
32
+ </tr>
33
+
34
+ <% @collection.each do |post| %>
35
+ <%- locals = {:post => post} -%>
36
+ <tr>
37
+ <% hook :admin_posts_index_rows, locals do %>
38
+ <td><%= link_to h(post.title), [:edit,:admin,post] %> (<%= post.is_active == 1 ? t("cms.published") : t("cms.draft") %>) </td>
39
+ <td><%= link_to post.user.display_name, [:admin, post.user] %></td>
40
+ <td><%= post.tag_list %></td>
41
+ <td><%= (post.published_at.blank? ? post.updated_at : post.published_at).strftime("%B %d, %Y at %I:%M%p") %></td>
42
+ <td class="actions">
43
+ <% hook :admin_pages_index_row_actions, locals do %>
44
+ <%= link_to_edit post %>
45
+ &nbsp;
46
+ <%= link_to_delete post %>
47
+ <% end %>
48
+ </td>
49
+ <% end %>
50
+ </tr>
51
+ <% end %>
52
+ </table>
53
+
54
+ <%= will_paginate(:previous_label => "&#171; #{t('previous')}", :next_label => "#{t('next')} &#187;") %>
55
+
56
+ <% content_for :sidebar do %>
57
+
58
+ <% form_for @search do |f| %>
59
+ <div class="box">
60
+ <h3><%= t(:search) %></h3>
61
+
62
+ <%- locals = {:f => f} -%>
63
+ <% hook :admin_posts_index_search, locals do %>
64
+ <p>
65
+ <label><%= t("cms.title") %></label><br />
66
+ <%= f.text_field :title_contains, :size => 15 %>
67
+ </p>
68
+
69
+ <label><%= t("cms.published_date_range") %></label><br />
70
+ <div class="yui-g date-range-filter">
71
+ <div class="yui-u sub-field first">
72
+ <%= f.unobtrusive_date_text_picker :published_at_after %><br />
73
+ <label class="sub"><%= t("start") %></label>
74
+ </div>
75
+ <div class="yui-u sub-field">
76
+ <%= f.unobtrusive_date_text_picker :published_at_before %><br />
77
+ <label><%= t("stop") %></label>
78
+ </div>
79
+ </div>
80
+
81
+ <p>
82
+ <label><%= t("cms.author") %></label><br />
83
+ <%= f.select :user_id_equals, User.all.collect {|r| [ r.display_name, r.id]} %></p>
84
+ </p>
85
+ <p>
86
+ <%= f.check_box :is_active, {:style => "vertical-align:middle;"}, "1", "" %>
87
+ <label>
88
+ <%= t("cms.show_only_published_posts") %>
89
+ </label>
90
+ </p>
91
+ <% end %>
92
+
93
+ <% hook :admin_posts_index_search_buttons, locals do %>
94
+ <p class="form-buttons">
95
+ <%= button t("search") %>
96
+ </p>
97
+ <% end %>
98
+ </div>
99
+ <% end %>
100
+
101
+ <% end %>
@@ -0,0 +1,45 @@
1
+ <%= render :partial => 'sub_menu' %>
2
+
3
+ <%= error_messages_for :post %>
4
+
5
+ <% form_for(:post, :url => collection_url, :html => { :multipart => true }) do |f| %>
6
+ <fieldset>
7
+
8
+ <% f.field_container :title do %>
9
+ <%= f.label :title, t("cms.title") %> <span class="required">*</span><br />
10
+ <%= f.text_field :title, :class => 'fullwidth title' %>
11
+ <%= f.error_message_on :title %>
12
+ <% end %>
13
+
14
+ <div class="yui-gb">
15
+ <div class="yui-u first">
16
+
17
+ <% f.field_container :body_raw do %>
18
+ <%= f.label :body_raw, t("cms.body")%> <span class="required">*</span><br />
19
+ <%= f.text_area :body_raw, {:cols => 120, :rows => 4, :class => 'fullwidth'} %>
20
+ <%= f.error_message_on :body_raw %>
21
+ <% end %>
22
+
23
+ </div>
24
+
25
+ <div class="yui-u">
26
+
27
+ <p>
28
+ <%= f.label :user_id, t("cms.author") %>
29
+ <%= f.collection_select :user_id, User.all, :id, :display_name, {:include_blank => false} %>
30
+ </p>
31
+
32
+ <% f.field_container :permalink do %>
33
+ <%= f.label :permalink, t("cms.permalink") %><br />
34
+ <%= f.text_field :permalink, :class => 'fullwidth title' %>
35
+ <%= f.error_message_on :permalink %>
36
+ <% end %>
37
+
38
+ </div>
39
+
40
+ </div>
41
+
42
+ <%= render :partial => 'admin/shared/new_resource_links' %>
43
+
44
+ </fieldset>
45
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <p>
2
+ <%= f.label :display_name %> <br/>
3
+ <%= f.text_field :display_name %>
4
+ </p>
@@ -0,0 +1,5 @@
1
+ <h2><%=@page.title%></h2>
2
+
3
+ <div class="content">
4
+ <%= @page.body %>
5
+ </div>
@@ -0,0 +1,13 @@
1
+
2
+ <div id="post-<%= post.id %>" class="post">
3
+ <div class="post-date"><%= post.published_at.strftime("%A, %B %d, %Y") %></div>
4
+ <h2 class="post-title"><%= link_to_unless_current (post.title == '' ? '[Untitled]' : h(post.title)), post, {:title => post.title, :alt => "Link to #{post.title}"} %></h2>
5
+ <div class="post-meta">
6
+ <% unless post.user.display_name.blank? %>By <%= post.user.display_name %> <% end %> - <%= link_to "comments", post_path(post, :anchor => "disqus_thread") %>
7
+ </div>
8
+ <div class="post-content"><%= post.body %></div>
9
+ <div class="post-meta"><% unless post.tags.empty? %><%= t("cms.tags") %>: <%= linked_tag_list(post.tags) %><% end %></div>
10
+ </div>
11
+
12
+
13
+ <%= disqus_comment_counts %>
@@ -0,0 +1,14 @@
1
+ <% content_for :head do %>
2
+ <link rel="alternate" type="application/rss+xml" title="<%= t("posts") %> RSS" href="<%= posts_url(:format => 'rss') %>" />
3
+ <% end %>
4
+
5
+ <%= render :partial => 'shared/cms_content_for'%>
6
+
7
+
8
+ <div class="posts">
9
+ <% for post in @posts %>
10
+ <%= render :partial => post %>
11
+ <% end %>
12
+
13
+ <%= will_paginate(:prev => "&#171; #{t('previous')}", :next => "#{t('next')} &#187;") %>
14
+ </div>
@@ -0,0 +1,19 @@
1
+ xml.instruct! :xml, :version => "1.0"
2
+ xml.rss :version => "2.0" do
3
+ xml.channel do
4
+ xml.title "#{Spree::Config[:site_name]}"
5
+ xml.description "#{Spree::Config[:cms_rss_description]}"
6
+ xml.link posts_url(:format => 'rss')
7
+
8
+ @posts.each do |post|
9
+ xml.item do
10
+ xml.title post.title
11
+ xml.description post.body
12
+ xml.author post.user.display_name
13
+ xml.pubDate post.published_at.to_s(:rfc822)
14
+ xml.link post_url(:id => post)
15
+ xml.guid({:isPermaLink => "false"}, post_url(post))
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+
2
+ <%= render :partial => 'shared/cms_content_for'%>
3
+
4
+ <%= render :partial => @post %>
5
+
6
+ <% if @post.commentable == 1 %>
7
+ <div id="comments">
8
+ <%= disqus_thread %>
9
+ </div>
10
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <%= render :partial => 'shared/cms_content_for'%>
2
+
3
+ <h1><%= "'#{params[:tag_name]}' #{t("cms.posts")}" %></h1>
4
+
5
+ <div class="posts">
6
+ <% unless @posts.empty? %>
7
+ <%= render @posts %>
8
+ <% else %>
9
+ <p><%= t("cms.no_posts_found") %>.</p>
10
+ <% end %>
11
+ </div>
12
+
13
+ <% #TODO - Localize this section %>
14
+ <p class="pagination">
15
+ <%= link_to h('< Previous Page'), :overwrite_params => { :page => @posts.previous_page } if @posts.previous_page %>
16
+ <%= "|" if @posts.previous_page && @posts.next_page %>
17
+ <%= link_to h('Next Page >'), :overwrite_params => { :page => @posts.next_page } if @posts.next_page %>
18
+ </p>
@@ -0,0 +1,7 @@
1
+ <% content_for :head do %>
2
+ <%= stylesheet_tags 'compiled/cms' %>
3
+ <% end %>
4
+
5
+ <% content_for :sidebar do %>
6
+ <%= render :partial => 'shared/recent_articles'%>
7
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <h3><%= t("recent_posts") %></h3>
2
+ <ul>
3
+ <% post_link_list().each do |link| -%>
4
+ <li><%= link_to link.name, link.url %></li>
5
+ <% end -%>
6
+ <li><%- link_to posts_path(:format => 'rss') do -%><%= image_tag('icons/feed.gif', :alt => "#{t("posts")} RSS", :size => '16x16') %> RSS Feed <%- end -%></li>
7
+ </ul>
@@ -0,0 +1,5 @@
1
+ <li><%= link_to t("home") , root_path %></li>
2
+ <% Page.all.each do |page| %>
3
+ <li><%= link_to page.title, page %></li>
4
+ <% end %>
5
+ <li class="cart-indicator"><%= link_to_cart %></li>
@@ -0,0 +1,48 @@
1
+ ---
2
+ en:
3
+ post: Post
4
+ posts: Posts
5
+ page: Page
6
+ pages: Pages
7
+ cms:
8
+ date: Date
9
+ published_date_range: Published Date Range
10
+ show_only_published_pages: Show Only Published Pages
11
+ show_only_published_posts: Show Only Published Posts
12
+ editing_post: Editing Post
13
+ editing_page: Editing Page
14
+ comma_separated: Comma Separated
15
+ select_author: Select Author
16
+ comment: Comment
17
+ comments: Comments
18
+ comments_closed: Comments are closed
19
+ recent_posts: Recent Posts
20
+ new_post: New Post
21
+ view: View
22
+ title: Title
23
+ permalink: Permalink
24
+ body: Body
25
+ excerpt: Excerpt
26
+ author: Author
27
+ publish_post: Publish Post
28
+ comment_status: Comment Status
29
+ tags: Tags
30
+ tags_hint: Enter tags separated by a comma
31
+ settings: Blog Settings
32
+ permalink: Slug used in url to blog home
33
+ posts_per_page: Posts displayed on blog home
34
+ posts_recent: Posts listed in recent post lists
35
+ post_status_default: Status default for new posts
36
+ page_status_default: Status default for new pages
37
+ post_comment_default: Comment status default for new posts
38
+ publish: Publish
39
+ published: Published
40
+ draft: Draft
41
+ open: Open
42
+ closed: Closed
43
+ view_blog: View Blog
44
+ blog: Blog
45
+ comments_for: comments for
46
+ recent: Recent
47
+ no_posts_found: No posts found
48
+ new_page: New Page
@@ -0,0 +1,20 @@
1
+ module Extensions::String
2
+ def linkify
3
+ result = self.downcase
4
+ result.gsub!(/&(\d)+;/, '') # Ditch Entities
5
+ result.gsub!('&', 'and') # Replace & with 'and'
6
+ result.gsub!(/['"]/, '') # replace quotes by nothing
7
+ result.gsub!(/\W/, ' ') # strip all non word chars
8
+ result.gsub!(/\ +/, '-') # replace all white space sections with a dash
9
+ result.gsub!(/(-)$/, '') # trim dashes
10
+ result.gsub!(/^(-)/, '') # trim dashes
11
+ result.gsub!(/[^a-zA-Z0-9\-]/, '-') # Get rid of anything we don't like
12
+ result
13
+ end
14
+
15
+ def linkify!
16
+ self.replace(self.linkify)
17
+ end
18
+ end
19
+
20
+ String.send(:include, Extensions::String)
@@ -0,0 +1,8 @@
1
+ Description:
2
+ This will set up a Gunner Technology Rails Project
3
+
4
+ Example:
5
+ rails generate project Thing
6
+
7
+ This will create:
8
+ a/lot/of/stuff
@@ -0,0 +1,40 @@
1
+ module SpreeCms
2
+ module Generators
3
+ class InstallGenerator < ::Rails::Generators::Base
4
+ include ::Rails::Generators::Migration
5
+
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def self.next_migration_number(dirname)
9
+ if ActiveRecord::Base.timestamped_migrations
10
+ Time.now.utc.strftime("%Y%m%d%H%M%S%L")
11
+ else
12
+ "%.3d" % (current_migration_number(dirname) + 1)
13
+ end
14
+ end
15
+
16
+ def copy_assets
17
+ directory "public", "public"
18
+ end
19
+
20
+ def generate_migrations
21
+ migration_template "db/migrate/create_pages.rb", "db/migrate/create_pages.rb"
22
+ migration_template "db/migrate/create_posts.rb", "db/migrate/create_posts.rb"
23
+ migration_template "db/migrate/add_display_name_to_user.rb", "db/migrate/add_display_name_to_user.rb"
24
+ migration_template "db/migrate/is_taggable_migration.rb", "db/migrate/is_taggable_migration.rb"
25
+ end
26
+
27
+ def generate_routes
28
+ route('resources :posts')
29
+ route('match "'+Spree::Config[:cms_permalink]+'/tags/:tag_name" => "posts#tags", :as => "tag_posts"')
30
+ route('resources :pages')
31
+ route('namespace :admin do
32
+ resource :cms_settings
33
+ resources :posts
34
+ resources :pagess
35
+ end')
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,9 @@
1
+ class AddDisplayNameToUser < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :users, :display_name, :string, :limit => 200
4
+ end
5
+
6
+ def self.down
7
+ remove_column :users, :display_name
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ class CreatePages < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :pages do |t|
4
+ t.string :title, :null => false, :limit => 128
5
+ t.text :body
6
+ t.text :body_raw
7
+ t.integer :is_active, :default => 0
8
+ t.string :permalink, :null => false, :limit => 128
9
+ t.datetime :published_at
10
+ t.string :meta_keywords
11
+ t.string :meta_description
12
+
13
+ t.timestamps
14
+ end
15
+ add_index :pages, :published_at, :name => 'pages_published_at_ix'
16
+ add_index :pages, :permalink, :name => 'pages_permalink_ix'
17
+ add_index :pages, [:is_active,:published_at], :name => 'pages_is_active_published_at_ix'
18
+ end
19
+
20
+ def self.down
21
+ drop_table :pages
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ class CreatePosts < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :posts do |t|
4
+ t.integer :user_id
5
+ t.string :title, :null => false, :limit => 128
6
+ t.text :body
7
+ t.text :body_raw
8
+ t.text :excerpt
9
+ t.integer :is_active, :default => 0
10
+ t.string :permalink, :null => false, :limit => 128
11
+ t.datetime :published_at
12
+ t.integer :commentable, :default => 0
13
+ t.string :meta_keywords
14
+ t.string :meta_description
15
+
16
+ t.timestamps
17
+ end
18
+ add_index :posts, :published_at, :name => 'posts_published_at_ix'
19
+ add_index :posts, :permalink, :name => 'posts_permalink_ix'
20
+ add_index :posts, [:is_active,:published_at], :name => 'posts_is_active_published_at_ix'
21
+ end
22
+
23
+ def self.down
24
+ drop_table :posts
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ class IsTaggableMigration < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :tags do |t|
4
+ t.string :name, :default => ''
5
+ t.string :kind, :default => ''
6
+ end
7
+
8
+ create_table :taggings do |t|
9
+ t.integer :tag_id
10
+
11
+ t.string :taggable_type, :default => ''
12
+ t.integer :taggable_id
13
+ end
14
+
15
+ add_index :tags, [:name, :kind]
16
+ add_index :taggings, :tag_id
17
+ add_index :taggings, [:taggable_id, :taggable_type]
18
+ end
19
+
20
+ def self.down
21
+ drop_table :taggings
22
+ drop_table :tags
23
+ end
24
+ end
@@ -0,0 +1,60 @@
1
+
2
+ .posts
3
+ .post
4
+ border-bottom: solid 1px #ccc
5
+
6
+ .post
7
+ padding-bottom: 10px
8
+ margin-bottom: 20px
9
+ font-size: 14px
10
+ .post-content
11
+ p
12
+ padding: 0 0 .5em 0
13
+ margin: .5em 0 0
14
+ h2
15
+ &.post-title
16
+ margin: 0
17
+ padding
18
+ bottom: 10px
19
+ line-height: 1em
20
+ text-transform: none
21
+ a,
22
+ a:visited
23
+ color: #333
24
+ text-decoration: none
25
+ font-weight: normal
26
+ a:hover
27
+ color: #333
28
+ text-decoration: underline
29
+ .post-date
30
+ margin: 0 0 .5em 0
31
+ font-size: 11px
32
+ padding: 0
33
+ color: #a5a5a5
34
+ a
35
+ text-decoration: none
36
+
37
+ .post
38
+ .post-meta
39
+ margin: 3px 0 1.5em 0
40
+ font-size: 12px
41
+ a
42
+ color: #999999
43
+ font-weight: normal
44
+
45
+
46
+ #comments
47
+ border-top: solid 5px #999
48
+ padding-top: 10px
49
+
50
+ .comment
51
+ padding-top: 5px
52
+ margin-bottom: 20px
53
+ border-top: solid 1px #ccc
54
+ p
55
+ padding: 5px 0
56
+ .meta
57
+ span
58
+ padding-left: 5px
59
+ font-size: 11px
60
+ color: #999
@@ -0,0 +1,3 @@
1
+ module SpreeCms
2
+ VERSION = "0.0.3"
3
+ end