diff --git a/app/assets/stylesheets/_stalls.scss b/app/assets/stylesheets/_stalls.scss index 30b33a408..567321c7d 100644 --- a/app/assets/stylesheets/_stalls.scss +++ b/app/assets/stylesheets/_stalls.scss @@ -10,6 +10,42 @@ $stall-label: #fff8e1; margin: 0 auto; } +.stall-owner { + display: flex; + align-items: center; + gap: 1rem; + margin-bottom: 1.5rem; +} + +.stall-owner-avatar img { + display: block; + border-radius: 50%; +} + +.stall-owner-name { + margin: 0; + font-size: 1.4rem; +} + +// On the shutter: the avatar over a label, like the "Closed for now" tag. +.stall-shutter .stall-owner { + flex-direction: column; + gap: 0.5rem; + margin: 0; + + img { + border: 3px solid $stall-outline; + } + + .stall-owner-name { + padding: 2px 14px; + border: 3px solid $stall-outline; + border-radius: 4px 12px 12px 4px; + background: $stall-label; + font-size: 1.1rem; + } +} + .stall { position: relative; overflow: clip; @@ -119,6 +155,8 @@ $stall-label: #fff8e1; position: absolute; inset: 0; z-index: 5; + flex-direction: column; + gap: 1rem; align-items: center; justify-content: center; border: 3px solid $stall-outline; @@ -142,18 +180,12 @@ $stall-label: #fff8e1; } .stall-closed { - .stall-awning { - transform: scaleY(0); - } + min-height: 300px; - .stall-sign, - .stall-table { - opacity: 0; - } - - // Keeps the shutter from collapsing to nothing with the contents hidden. + // Nothing shows behind the shutter, and it must not hold the box open. + .stall-awning, .stall-body { - min-height: 300px; + display: none; } } diff --git a/app/views/gardens/show.html.haml b/app/views/gardens/show.html.haml index d1b35900b..99078d501 100644 --- a/app/views/gardens/show.html.haml +++ b/app/views/gardens/show.html.haml @@ -23,7 +23,7 @@ .mb-3 = render 'jobs/ideas_banner', href: suggestions_path, open: false, text: t('.suggested_plantings', count: @suggestion_count), go: t('.suggested_plantings_go') - = render 'stalls/card', garden: @garden + = render 'stalls/card', member: @garden.owner if @garden.nursery? = render 'gardens/facts', garden: @garden, growing_now: @current_plantings.size = render 'gardens/description', garden: @garden = render 'gardens/join_prompt', garden: @garden unless member_signed_in? diff --git a/app/views/members/show.html.haml b/app/views/members/show.html.haml index 0bc9de4d1..5e0b34bfd 100644 --- a/app/views/members/show.html.haml +++ b/app/views/members/show.html.haml @@ -88,6 +88,7 @@ = render "contact", member: @member, flickr_auth: @flickr_auth .col-md-10#content + = render 'stalls/card', member: @member .row %section.order-3.order-md-1.col-12= render "map", member: @member - if @harvesting.size.positive? diff --git a/app/views/stalls/_card.html.haml b/app/views/stalls/_card.html.haml index 5fd12c489..cec2b4047 100644 --- a/app/views/stalls/_card.html.haml +++ b/app/views/stalls/_card.html.haml @@ -1,11 +1,10 @@ --# On the nursery garden: where the owner opens their garden stall, or goes to it. -- if garden.nursery? && can?(:edit, garden) && Feature.enabled?(:garden_stall) - - stall = garden.owner.stall +-# Where a member opens their garden stall, or goes to it. Only they see it. +- if member == current_member && Feature.enabled?(:garden_stall) .stall-card.mb-3 %h2.h5= t('.heading') - - if stall&.open? + - if member.stall&.open? %p= t('.open_text') - = link_to t('.go'), member_stall_path(garden.owner), class: 'btn btn-outline-success' + = link_to t('.go'), member_stall_path(member), class: 'btn btn-outline-success' - else %p= t('.text') - = link_to t('.open'), member_stall_path(garden.owner), class: 'btn btn-success' + = link_to t('.open'), member_stall_path(member), class: 'btn btn-success' diff --git a/app/views/stalls/_owner.html.haml b/app/views/stalls/_owner.html.haml new file mode 100644 index 000000000..7d996b493 --- /dev/null +++ b/app/views/stalls/_owner.html.haml @@ -0,0 +1,7 @@ +-# Whose stall this is: their avatar (always a circle) and name. +.stall-owner + = link_to member, class: 'stall-owner-avatar', title: member.to_s do + = image_tag avatar_uri(member, 128), alt: member.to_s, width: 64, height: 64 + %p.stall-owner-name + = t('stalls.owner.garden_of') + %strong= link_to member, member diff --git a/app/views/stalls/_stall.html.haml b/app/views/stalls/_stall.html.haml index bd0cdcc51..6f702c347 100644 --- a/app/views/stalls/_stall.html.haml +++ b/app/views/stalls/_stall.html.haml @@ -14,5 +14,6 @@ - %i(seedlings seeds more).each do |spot| .stall-spot= t(".spots.#{spot}") .stall-tabletop - .stall-shutter{ 'aria-hidden': 'true' } + .stall-shutter + = render 'stalls/owner', member: member %span.stall-shutter-sign= t('.closed') diff --git a/app/views/stalls/show.html.haml b/app/views/stalls/show.html.haml index 27157b16b..38ea504bd 100644 --- a/app/views/stalls/show.html.haml +++ b/app/views/stalls/show.html.haml @@ -5,12 +5,8 @@ %li.breadcrumb-item.active= t('.breadcrumb') .stall-page - .record-identity.mb-4 - = render 'shared/record_owner', owner: @member - .record-identity-text - %p.garden-grower - = t('.garden_of') - %strong.record-grower-name= link_to @member, @member + -# Closed, the owner is on the shutter instead. + = render 'stalls/owner', member: @member if @stall.open? = render 'stalls/stall', member: @member, open: @stall.open?, opening: @opening diff --git a/spec/requests/gardens_stall_card_spec.rb b/spec/requests/gardens_stall_card_spec.rb index ed959093f..41ff0e0ea 100644 --- a/spec/requests/gardens_stall_card_spec.rb +++ b/spec/requests/gardens_stall_card_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe GardensController, 'garden stall card', flipper: :garden_stall do +describe GardensController, '#show', flipper: :garden_stall do let(:owner) { create(:member) } let(:nursery) { create(:garden, owner:, nursery: true) } diff --git a/spec/requests/members_stall_card_spec.rb b/spec/requests/members_stall_card_spec.rb new file mode 100644 index 000000000..c156f0d17 --- /dev/null +++ b/spec/requests/members_stall_card_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe MembersController, '#show', flipper: :garden_stall do + let(:owner) { create(:member) } + + context 'when members look at their own profile' do + before do + sign_in owner + get member_path(owner) + end + + it 'offers to open a stall' do + expect(Capybara.string(response.body)).to have_link('Open a garden stall', href: member_stall_path(owner)) + end + end + + context 'when someone else looks at the profile' do + before do + sign_in create(:member) + get member_path(owner) + end + + it 'has no stall card' do + expect(Capybara.string(response.body)).to have_no_css('.stall-card') + end + end +end