diff --git a/app/controllers/plantings_controller.rb b/app/controllers/plantings_controller.rb index bba983b6c..543981170 100644 --- a/app/controllers/plantings_controller.rb +++ b/app/controllers/plantings_controller.rb @@ -20,7 +20,7 @@ class PlantingsController < ApplicationController format.json { render json: @plantings } format.rss { render :layout => false } #index.rss.builder format.csv do - specifics = (@owner ? "#{@owner.name}-" : @crop ? "#{@crop.name}-" : nil) + specifics = (@owner ? "#{@owner.login_name}-" : @crop ? "#{@crop.name}-" : nil) @filename = "Growstuff-#{specifics}Plantings-#{Time.zone.now.to_s(:number)}.csv" render :csv => @plantings end diff --git a/app/views/gardens/show.html.haml b/app/views/gardens/show.html.haml index 526074e4a..0900eac40 100644 --- a/app/views/gardens/show.html.haml +++ b/app/views/gardens/show.html.haml @@ -2,7 +2,6 @@ .row .col-md-9 - - if can? :edit, @garden or can? :delete, @garden %p.btn-group - if can? :edit, @garden @@ -28,36 +27,46 @@ %div :growstuff_markdown #{strip_tags @garden.description} + - unless @garden.description + .row-fluid + %p No description available yet. + + - if can? :edit, @garden + %p + Why not + = link_to 'tell us more.', edit_garden_path(@garden) - if @garden.photos.size > 0 or (can? :edit, @garden and can? :create, Photo) - .row - %h2 Photos - - %ul.thumbnails - - @garden.photos.each do |p| - .col-md-2.six-across - = render :partial => 'photos/thumbnail', :locals => { :photo => p } + .row-fluid + %h3 Photos + %p= pluralize(@garden.photos.length, "photo") + .row-fluid + %ul.thumbnails + - @garden.photos.each do |p| + .col-md-2.six-across + = render :partial => 'photos/thumbnail', :locals => { :photo => p } + .row-fluid - if can? :create, Photo and can? :edit, @garden - .col-md-2 - .thumbnail(style='height: 220px') - %p{:style => 'text-align: center; padding-top: 50px'} - = link_to "Add photo", new_photo_path(:type => "garden", :id => @garden.id), :class => 'btn btn-primary' + %p + = link_to "Add photo", new_photo_path(:type => "garden", :id => @garden.id), :class => 'btn btn-primary' - %h3 What's planted here? - - if @garden.plantings.current.size > 0 - .row + .row-fluid + %h3 What's planted here? + - if @garden.plantings.current.size > 0 - @garden.plantings.current.each.with_index do |planting_current, index_current| = render partial: "plantings/thumbnail", locals: {:planting => planting_current} - - else - %p - Nothing is currently planted here. + - else + %p + Nothing is currently planted here. - %h3 Previously planted in this garden - - if @garden.plantings.finished.size > 0 - .row + .row-fluid + %h3 Previously planted in this garden + - if @garden.plantings.finished.size > 0 - @garden.plantings.finished.each.with_index do |planting_finished| = render partial: "plantings/thumbnail", locals: {:planting => planting_finished} - + - else + %p + Nothing has been planted here. .col-md-3 %h4 About this garden %p diff --git a/app/views/members/_gardens.html.haml b/app/views/members/_gardens.html.haml index ddee17d3a..7733e298d 100644 --- a/app/views/members/_gardens.html.haml +++ b/app/views/members/_gardens.html.haml @@ -7,31 +7,42 @@ - first_garden = false = link_to g.name, "#garden#{g.id}", 'data-toggle' => 'tab' - if current_member == member - %li= link_to 'New Garden', new_garden_path - .tab-content + %li.navbar-right + = link_to new_garden_path, class: 'btn' do + Add New Garden + .tab-content{style: "padding-top: 1em"} - first_garden = true - member.gardens.each do |g| %div{:class => ['tab-pane', first_garden ? 'active' : ''], :id => "garden#{g.id}"} - first_garden = false - %div + .container :growstuff_markdown #{ strip_tags g.description } + - unless g.description + .row + %p No description available yet. + + - if can? :edit, g + %p + Why not + = link_to 'tell us more.', edit_garden_path(g) + - if g.photos.size > 0 or (can? :edit, g and can? :create, Photo) .row - %h2 Photos - - %ul.thumbnails - - g.photos.each do |p| - .col-md-2.six-across - = render :partial => 'photos/thumbnail', :locals => { :photo => p } - - if can? :create, Photo and can? :edit, g - .col-md-2 - .thumbnail(style='height: 220px') - %p{:style => 'text-align: center; padding-top: 50px'} - = link_to "Add photo", new_photo_path(:type => "garden", :id => g.id), :class => 'btn btn-primary' + %h3 Photos + %p= pluralize(g.photos.length, "photo") + .row + %ul.thumbnails + - g.photos.each do |p| + .col-md-2.six-across + = render :partial => 'photos/thumbnail', :locals => { :photo => p } + .row + - if can? :create, Photo and can? :edit, g + %p + = link_to "Add photo", new_photo_path(:type => "garden", :id => g.id), :class => 'btn btn-primary' %h3 What's planted here? .row diff --git a/app/views/members/_image_with_popover.html.haml b/app/views/members/_image_with_popover.html.haml deleted file mode 100644 index 965ac4f47..000000000 --- a/app/views/members/_image_with_popover.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -= link_to | - image_tag( | - avatar_uri(member, 150), | - :alt => member.login_name, | - :class => 'img-responsive member-image' | - ), | - member, | - :rel => "popover", | - 'data-trigger' => 'hover', | - 'data-title' => member.login_name, | - 'data-content' => "#{ render :partial => 'members/popover', :locals => { :member => member } }", | - 'data-html' => true diff --git a/app/views/members/_popover.html.haml b/app/views/members/_popover.html.haml deleted file mode 100644 index 24122c560..000000000 --- a/app/views/members/_popover.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -%small - %p - - if member.location - %i - = member.location - %p - Joined - = distance_of_time_in_words(member.created_at, Time.zone.now) - ago. - %p - = pluralize(member.gardens.size, "garden") - %br/ - = pluralize(member.plantings.size, "planting") - %br/ - = pluralize(member.seeds.size, "seed") diff --git a/app/views/members/_thumbnail.html.haml b/app/views/members/_thumbnail.html.haml index 5f0f9c58d..a55c34e50 100644 --- a/app/views/members/_thumbnail.html.haml +++ b/app/views/members/_thumbnail.html.haml @@ -1,16 +1,24 @@ - cache member do .member-thumbnail.panel %div - = render :partial => "members/image_with_popover", :locals => { :member => member } + = render :partial => "members/avatar", :locals => { :member => member } %div - %p + %p.login-name = link_to member.login_name, member - - if ! member.location.blank? + - if !member.location.blank? %small %br/ %i= member.location - - if ! member.plantings.empty? + - if !member.plantings.empty? %small %br/ Recently planted: != member.plantings.first(3).map{|p| link_to p.crop_name, p }.join(", ") + %p + %small + Joined + = distance_of_time_in_words(member.created_at, Time.zone.now) + ago. + %p + %small + = [pluralize(member.gardens.size, "garden"), pluralize(member.plantings.size, "planting"), pluralize(member.seeds.size, "seed")].join(", ") diff --git a/app/views/shared/_markdown_help.html.haml b/app/views/shared/_markdown_help.html.haml index 41aaa1a31..28505a083 100644 --- a/app/views/shared/_markdown_help.html.haml +++ b/app/views/shared/_markdown_help.html.haml @@ -5,3 +5,5 @@ to format your text. For instance, *italic*, **bold**, or a link [like this](http://to.some.site.com/). %br/ Quick crop links: [sweet potato](crop). +%br/ +Quick member links: @Username or [Username](member). diff --git a/lib/haml/filters/growstuff_markdown.rb b/lib/haml/filters/growstuff_markdown.rb index dba081e44..6711461e0 100644 --- a/lib/haml/filters/growstuff_markdown.rb +++ b/lib/haml/filters/growstuff_markdown.rb @@ -2,7 +2,10 @@ require 'bluecloth' module Haml::Filters module GrowstuffMarkdown - CROP_REGEX = /\[([^\[\]]+?)\]\(crop\)/ + CROP_REGEX = /(? true) + "[#{member_str}](#{url})" + else + member_str + end + end + + # turn @jane into [@jane](http://growstuff.org/members/jane) + expanded = expanded.gsub(MEMBER_AT_REGEX) do |m| + member_str = $1 + # find member case-insensitively + member = Member.where('lower(login_name) = ?', member_str[1..-1].downcase).first + if member + url = Rails.application.routes.url_helpers.member_url(member, :only_path => true) + "[#{member_str}](#{url})" + else + member_str + end + end + + expanded = expanded.gsub(MEMBER_ESCAPE_AT_REGEX, "") + return BlueCloth.new(expanded).to_html end diff --git a/spec/features/members_list_spec.rb b/spec/features/members_list_spec.rb index 073572795..a7857bafd 100644 --- a/spec/features/members_list_spec.rb +++ b/spec/features/members_list_spec.rb @@ -11,7 +11,7 @@ feature "members list" do expect(page).to have_css "#sort" expect(page).to have_selector "form" click_button('Show') - all_links = page.all("#maincontainer p") + all_links = page.all("#maincontainer p.login-name") expect(all_links.first).to have_text member1.login_name expect(all_links.last).to have_text member2.login_name end @@ -22,7 +22,7 @@ feature "members list" do expect(page).to have_selector "form" select("recently", :from => 'sort') click_button('Show') - all_links = page.all("#maincontainer p") + all_links = page.all("#maincontainer p.login-name") expect(all_links.first).to have_text member3.login_name expect(all_links.last).to have_text member1.login_name end diff --git a/spec/lib/haml/filters/growstuff_markdown_spec.rb b/spec/lib/haml/filters/growstuff_markdown_spec.rb index 8abe8aee4..979b3f305 100644 --- a/spec/lib/haml/filters/growstuff_markdown_spec.rb +++ b/spec/lib/haml/filters/growstuff_markdown_spec.rb @@ -15,6 +15,20 @@ def output_link(crop, name=nil) end end +def input_member_link(name) + return "[#{name}](member)" +end + +def output_member_link(member, name=nil) + url = Rails.application.routes.url_helpers.member_url(member, :only_path => true) + if name + return "#{name}" + else + return "#{member.login_name}" + end +end + + describe 'Haml::Filters::Growstuff_Markdown' do it 'is registered as the handler for :growstuff_markdown' do Haml::Filters::defined['growstuff_markdown'].should == @@ -32,6 +46,12 @@ describe 'Haml::Filters::Growstuff_Markdown' do rendered.should match /not a crop/ end + it "doesn't convert escaped crop links" do + @crop = FactoryGirl.create(:crop) + rendered = Haml::Filters::GrowstuffMarkdown.render( "\\" << input_link(@crop.name)) + rendered.should match /\[#{@crop.name}\]\(crop\)/ + end + it "handles multiple crop links" do tomato = FactoryGirl.create(:tomato) maize = FactoryGirl.create(:maize) @@ -60,4 +80,47 @@ describe 'Haml::Filters::Growstuff_Markdown' do rendered.should match "test" end + it 'converts quick member links' do + @member = FactoryGirl.create(:member) + rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link(@member.login_name)) + rendered.should match /#{output_member_link(@member)}/ + end + + it "doesn't convert nonexistent members" do + rendered = Haml::Filters::GrowstuffMarkdown.render(input_member_link("not a member")) + rendered.should match /not a member/ + end + + it "doesn't convert escaped members" do + @member = FactoryGirl.create(:member) + rendered = Haml::Filters::GrowstuffMarkdown.render("\\" << input_member_link(@member.login_name)) + rendered.should match /\[#{@member.login_name}\]\(member\)/ + end + + + it 'converts @ member links' do + @member = FactoryGirl.create(:member) + rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member.login_name}! What's up") + rendered.should match /#{output_member_link(@member, "@#{@member.login_name}")}/ + end + + it "doesn't convert invalid @ members" do + rendered = Haml::Filters::GrowstuffMarkdown.render("@not-a-member") + rendered.should match /@not-a-member/ + end + + it "doesn't convert nonexistent @ members" do + @member = FactoryGirl.create(:member) + @member_name = @member.login_name + @member.destroy + rendered = Haml::Filters::GrowstuffMarkdown.render("Hey @#{@member_name}") + rendered.should match /Hey @#{@member_name}/ + end + + it "doesn't convert escaped @ members" do + @member = FactoryGirl.create(:member) + rendered = Haml::Filters::GrowstuffMarkdown.render("Hey \\@#{@member.login_name}! What's up") + rendered.should match /Hey @#{@member.login_name}!/ + end + end