diff --git a/app/assets/stylesheets/application.css.sass b/app/assets/stylesheets/application.css.sass index 1a77d30..b4e05b9 100644 --- a/app/assets/stylesheets/application.css.sass +++ b/app/assets/stylesheets/application.css.sass @@ -1,3 +1,4 @@ //= require_self @import partials/base +@import partials/discussions diff --git a/app/assets/stylesheets/partials/_discussions.sass b/app/assets/stylesheets/partials/_discussions.sass new file mode 100644 index 0000000..643e0cc --- /dev/null +++ b/app/assets/stylesheets/partials/_discussions.sass @@ -0,0 +1,18 @@ +img.discussions + float: left + padding-right: 10px + +h3.discussions + padding-top: 5px + margin-bottom: 10px + +p.discussions.date + float: right + padding-top: 10px + margin-bottom: 10px + +a.discussions.new + float: right + +a.discussions.show + text-decoration: none \ No newline at end of file diff --git a/app/controllers/discussions_controller.rb b/app/controllers/discussions_controller.rb index e79aaa5..229f276 100644 --- a/app/controllers/discussions_controller.rb +++ b/app/controllers/discussions_controller.rb @@ -1,14 +1,51 @@ class DiscussionsController < ApplicationController before_filter :find_course + before_filter :find_discussion, :except => [:new, :create, :index] def index - matches = Discussion.search(params) + matches = @course.discussions.search(params) @discussions = DiscussionListDecorator.new(matches) end + def new + @discussion = Discussion.new + # TODO: unify this with decorator logic + @category = params[:category] || "conversations" + end + + def update + @discussion.update_attributes(params[:discussion]) + redirect_to course_discussion_path(@course.id, @discussion) + end + + def show + @discussion = DiscussionDecorator.decorate(@discussion) + end + + def create + discussion_params = params[:discussion]. + merge(:author => current_person.github_nickname, + :course_id => @course.id) + + discussion = Discussion.create(discussion_params) + redirect_to course_discussion_path(@course.id, discussion) + end + + # TODO: Seperate this into an admin feature which really destroys, + # and an archive route. Also, provide a way to re-open the discussions. + def destroy + @discussion.update_attribute(:archived, true) + + redirect_to course_discussions_path + end + private def find_course @course = Course.find(params[:course_id]) end + + def find_discussion + @discussion = Discussion.find(params[:id]) + end end diff --git a/app/decorators/discussion_decorator.rb b/app/decorators/discussion_decorator.rb new file mode 100644 index 0000000..347a08e --- /dev/null +++ b/app/decorators/discussion_decorator.rb @@ -0,0 +1,51 @@ +class DiscussionDecorator < ApplicationDecorator + decorates :discussion + allows :subject, :body + + def author + PersonDecorator.from_github_name(discussion.author) + end + + def start_date + discussion.created_at.strftime("%Y-%m-%d") + end + + def header + h.content_tag(:p, start_date, :class => ["discussions","date"]) + + h.image_tag(author.gravatar_url(30), :class => "discussions") + + h.content_tag(:h2, discussion.subject) + end + + def body + discussion.body.to_s.html_safe + end + + def state + discussion.archived ? "closed" : "open" + end + + # TODO: Support unarchive + def footer + [ edit_link, archive_link, discussion_list_link ].join(" | ").html_safe + end + + private + + def edit_link + path = h.edit_course_discussion_path(discussion.course.id, discussion.id) + + h.link_to("Edit", path) + end + + def archive_link + h.link_to_if(!discussion.archived, "Archive", + h.course_discussion_path(discussion.course.id, discussion.id), + :method => :delete, :confirm => "Are you sure?") { "Unarchive" } + end + + def discussion_list_link + h.link_to("Back to #{discussion.category}", + h.course_discussions_path(:category => discussion.category, + :state => state)) + end +end diff --git a/app/decorators/discussion_list_decorator.rb b/app/decorators/discussion_list_decorator.rb index 04de5bb..843a3e6 100644 --- a/app/decorators/discussion_list_decorator.rb +++ b/app/decorators/discussion_list_decorator.rb @@ -1,5 +1,5 @@ class DiscussionListDecorator < ApplicationDecorator - decorates :discussion + decorates :discussions, :class => Discussion def category_filters [conversations_link, reviews_link, evaluations_link].join(" | ").html_safe @@ -23,15 +23,33 @@ def state_filters end def matched_discussions - all.map do |discussion| - h.content_tag(:h3, discussion.subject) + discussions.all.map do |discussion| + course = discussion.course + discussion = DiscussionDecorator.new(discussion) + h.image_tag(discussion.author.gravatar_url(30), :class => "discussions") + + h.content_tag(:p, discussion.start_date, :class => ["discussions","date"]) + + h.link_to( + h.content_tag(:h3, discussion.subject, :class => "discussions"), + h.course_discussion_path(course, discussion), + :class => ["discussions","show"]) + + h.content_tag(:hr) end.join.html_safe end + + def new_discussion_link + h.link_to("New Discussion", + h.new_course_discussion_path(:category => category), + :class => ["discussions","new"]) + end + + def category + h.params[:category] || "conversations" + end private def discussions_link(category_name) - if h.params[:category] == category_name + if category == category_name category_name.capitalize else link_params = h.params.merge(:category => category_name) @@ -40,8 +58,6 @@ def discussions_link(category_name) end def conversations_link - return "Conversations" if h.params[:category].blank? - discussions_link("conversations") end diff --git a/app/models/discussion.rb b/app/models/discussion.rb index 6e38b67..cf3e6a8 100644 --- a/app/models/discussion.rb +++ b/app/models/discussion.rb @@ -1,6 +1,7 @@ class Discussion < ActiveRecord::Base VALID_CATEGORIES = ["conversations", "reviews", "evaluations"] + validates_presence_of :category belongs_to :course def self.search(params) diff --git a/app/views/discussions/_form.html.haml b/app/views/discussions/_form.html.haml new file mode 100644 index 0000000..81bfee9 --- /dev/null +++ b/app/views/discussions/_form.html.haml @@ -0,0 +1,14 @@ += form_for(@discussion, :url => url) do |f| + %p + - if @discussion.new_record? + = f.hidden_field :category, :value => @category + + = f.label :subject + %br + = f.text_field :subject, :value => @discussion.subject + %p + = f.label :body + %br + = f.text_area :body, :value => @discussion.body + + = f.submit \ No newline at end of file diff --git a/app/views/discussions/edit.html.haml b/app/views/discussions/edit.html.haml new file mode 100644 index 0000000..54add82 --- /dev/null +++ b/app/views/discussions/edit.html.haml @@ -0,0 +1,4 @@ +%h2 Edit your discussion + += render :partial => "form", + :locals => { :url => course_discussion_path(@course.id, @discussion) } \ No newline at end of file diff --git a/app/views/discussions/index.html.haml b/app/views/discussions/index.html.haml index 93d76e6..0bb6def 100644 --- a/app/views/discussions/index.html.haml +++ b/app/views/discussions/index.html.haml @@ -3,6 +3,7 @@ %br %br += @discussions.new_discussion_link = @discussions.state_filters %br diff --git a/app/views/discussions/new.html.haml b/app/views/discussions/new.html.haml new file mode 100644 index 0000000..e4574d5 --- /dev/null +++ b/app/views/discussions/new.html.haml @@ -0,0 +1,3 @@ +%h2 Create a new discussion + += render :partial => "form", :locals => { :url => course_discussions_path } \ No newline at end of file diff --git a/app/views/discussions/show.html.haml b/app/views/discussions/show.html.haml new file mode 100644 index 0000000..ac3b0cd --- /dev/null +++ b/app/views/discussions/show.html.haml @@ -0,0 +1,4 @@ += @discussion.header += @discussion.body +%hr += @discussion.footer \ No newline at end of file diff --git a/db/migrate/20120325235236_add_author_field_to_discussion.rb b/db/migrate/20120325235236_add_author_field_to_discussion.rb new file mode 100644 index 0000000..3d69845 --- /dev/null +++ b/db/migrate/20120325235236_add_author_field_to_discussion.rb @@ -0,0 +1,5 @@ +class AddAuthorFieldToDiscussion < ActiveRecord::Migration + def change + add_column :discussions, :author, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 2dfd254..b7e5419 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120317200349) do +ActiveRecord::Schema.define(:version => 20120325235236) do create_table "course_memberships", :force => true do |t| t.integer "course_id" @@ -36,6 +36,7 @@ t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.boolean "archived", :default => false + t.string "author" end create_table "tasks", :force => true do |t| diff --git a/db/seeds.rb b/db/seeds.rb index d655699..f44d115 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -11,33 +11,3 @@ people.each do |person| person.create(course_id: course.id, role: "Student") if person.empty? end - -conversations = [ "How awesome is Jordan Byron?", - "How many unicorns does it take to make a rainbow?", - "Can someone ask a serious question please?" ] - -conversations.each do |e| - course.discussions.find_or_create_by_subject( - :subject => e, :category => "conversations" - ) -end - -evaluations = [ "My s10-e2 is ready for evaluation", - "Revisions have been made to my s10-e1", - "Come on, evaluate it, you know you want to!" ] - -evaluations.each do |e| - course.discussions.find_or_create_by_subject( - :subject => e, :category => "evaluations" - ) -end - -reviews = ["Messy first spike on my individual project", - "Proof of concept patch to add archives to Newman", - "If you don't review this soon, I might go crazy!"] - -reviews.each do |e| - course.discussions.find_or_create_by_subject( - :subject => e, :category => "reviews" - ) -end \ No newline at end of file