Skip to content

Commit

Permalink
Copy services when duplicating a meeting
Browse files Browse the repository at this point in the history
  • Loading branch information
rbngzlv committed Apr 18, 2018
1 parent 97ba296 commit 46f16c5
Show file tree
Hide file tree
Showing 9 changed files with 104 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def copy_meeting!
longitude: @form.longitude,
location: @form.location,
location_hints: @form.location_hints,
services: @form.services_to_persist.map { |service| { "title" => service.title, "description" => service.description } },
component: @meeting.component,
registrations_enabled: @meeting.registrations_enabled,
available_slots: @meeting.available_slots,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Admin
# Controller that allows managing meetings.
#
class MeetingCopiesController < Admin::ApplicationController
helper_method :meeting
helper_method :meeting, :blank_service

def new
@form = form(MeetingCopyForm).from_model(meeting)
Expand All @@ -30,6 +30,10 @@ def create

private

def blank_service
@blank_service ||= Admin::MeetingServiceForm.new
end

def meeting
@meeting ||= Meeting.where(component: current_component).find(params[:meeting_id])
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class MeetingCopyForm < Form
attribute :longitude, Float
attribute :start_time, Decidim::Attributes::TimeWithZone
attribute :end_time, Decidim::Attributes::TimeWithZone
attribute :services, Array[MeetingServiceForm]

mimic :meeting

Expand All @@ -32,6 +33,20 @@ class MeetingCopyForm < Form
validates :start_time, presence: true, date: { before: :end_time }
validates :end_time, presence: true, date: { after: :start_time }

def map_model(model)
self.services = model.services.map do |service|
MeetingServiceForm.new(service)
end
end

def services_to_persist
services.reject(&:deleted)
end

def number_of_services
services.size
end

alias component current_component
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,7 @@
</div>

</div>

<%= render "decidim/meetings/admin/meetings/services", form: form %>
<%= javascript_include_tag "decidim/meetings/admin/meetings_form" %>
Original file line number Diff line number Diff line change
Expand Up @@ -47,30 +47,6 @@
</div>
</div>

<div class="card">
<div class="card-divider">
<h2 class="card-title"><%= t(".services") %></h2>
</div>

<div class="card-section">
<div class="meeting-services">
<template>
<%= fields_for "meeting[services][#{blank_service.to_param}]", blank_service do |service_form| %>
<%= render "service", form: service_form, id: tabs_id_for_service(blank_service) %>
<% end %>
</template>

<div class="meeting-services-list">
<% form.object.services.each do |service| %>
<%= fields_for "meeting[services][]", service do |service_form| %>
<%= render "service", form: service_form, id: tabs_id_for_service(service) %>
<% end %>
<% end %>
</div>

<button class="button add-service"><%= t(".add_service") %></button>
</div>
</div>
</div>
<%= render "services", form: form, id: tabs_id_for_service(blank_service) %>
<%= javascript_include_tag "decidim/meetings/admin/meetings_form" %>
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<div class="card">
<div class="card-divider">
<h2 class="card-title"><%= t(".services") %></h2>
</div>

<div class="card-section">
<div class="meeting-services">
<template>
<%= fields_for "meeting[services][#{blank_service.to_param}]", blank_service do |service_form| %>
<%= render "decidim/meetings/admin/meetings/service", form: service_form, id: tabs_id_for_service(blank_service) %>
<% end %>
</template>

<div class="meeting-services-list">
<% form.object.services.each do |service| %>
<%= fields_for "meeting[services][]", service do |service_form| %>
<%= render "decidim/meetings/admin/meetings/service", form: service_form, id: tabs_id_for_service(service) %>
<% end %>
<% end %>
</div>

<button class="button add-service"><%= t(".add_service") %></button>
</div>
</div>
</div>
6 changes: 3 additions & 3 deletions decidim-meetings/config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,6 @@ en:
success: Meeting successfully deleted
edit:
update: Update
form:
add_service: Add service
services: Services
index:
title: Meetings
new:
Expand All @@ -133,6 +130,9 @@ en:
service: Service
title: Title
up: Up
services:
add_service: Add service
services: Services
update:
invalid: There's been a problem updating this meeting
success: Meeting successfully updated
Expand Down
11 changes: 11 additions & 0 deletions decidim-meetings/spec/commands/admin/copy_meeting_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ module Decidim::Meetings
let(:latitude) { 40.1234 }
let(:longitude) { 2.1234 }
let(:start_time) { 1.day.from_now }
let(:services) do
[
{ "title" => { "en" => "First service" }, "description" => { "en" => "First description" } },
{ "title" => { "en" => "Second service" }, "description" => { "en" => "Second description" } }
]
end
let(:services_to_persist) do
services.map { |service| Admin::MeetingServiceForm.from_params(service) }
end

let(:form) do
double(
Expand All @@ -29,6 +38,7 @@ module Decidim::Meetings
longitude: longitude,
scope: meeting.scope,
category: meeting.category,
services_to_persist: services_to_persist,
current_user: current_user,
current_component: meeting.component
)
Expand All @@ -54,6 +64,7 @@ module Decidim::Meetings
expect(new_meeting.scope).to eq(old_meeting.scope)
expect(new_meeting.category).to eq(old_meeting.category)
expect(new_meeting.component).to eq(old_meeting.component)
expect(new_meeting.services).to eq(services)
end

it "broadcasts ok" do
Expand Down
40 changes: 39 additions & 1 deletion decidim-meetings/spec/forms/admin/meeting_copy_form_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ module Decidim::Meetings
let(:location_hints) do
Decidim::Faker::Localized.sentence(3)
end
let(:services) do
[
{ title: { en: "First service" }, description: { en: "First description" } },
{ title: { en: "Third service" }, description: { en: "Third description" } }
]
end
let(:address) { "Carrer Pic de Peguera 15, 17003 Girona" }
let(:latitude) { 40.1234 }
let(:longitude) { 2.1234 }
Expand All @@ -41,7 +47,8 @@ module Decidim::Meetings
location_hints_en: location_hints[:en],
address: address,
start_time: start_time,
end_time: end_time
end_time: end_time,
services: services
}
end

Expand Down Expand Up @@ -113,5 +120,36 @@ module Decidim::Meetings
expect(subject.latitude).to eq(latitude)
expect(subject.longitude).to eq(longitude)
end

it "properly maps services from model" do
meeting = create(:meeting, services: services)

services = described_class.from_model(meeting).services
expect(services).to all be_an(Admin::MeetingServiceForm)
expect(services.map(&:title_en)).to eq(services.map(&:title_en))
end

describe "services_to_persist" do
subject { form.services_to_persist }

let(:services) do
[
{ title: { en: "First service" }, description: { en: "First description" } },
{ title: { en: "Second service" }, description: { en: "Second description" }, deleted: true },
{ title: { en: "Third service" }, description: { en: "Third description" } }
]
end

it "only returns non deleted services" do
expect(subject.size).to eq(2)
expect(subject.map(&:title_en)).to eq(["First service", "Third service"])
end
end

describe "number_of_services" do
subject { form.number_of_services }

it { is_expected.to eq(services.size) }
end
end
end

0 comments on commit 46f16c5

Please sign in to comment.