diff --git a/decidim-core/app/cells/decidim/address/show.erb b/decidim-core/app/cells/decidim/address/show.erb index 3b753f846ee75..17cf8020b4f83 100644 --- a/decidim-core/app/cells/decidim/address/show.erb +++ b/decidim-core/app/cells/decidim/address/show.erb @@ -24,6 +24,7 @@ <%= start_and_end_time %> + <% end %> diff --git a/decidim-core/app/cells/decidim/address_cell.rb b/decidim-core/app/cells/decidim/address_cell.rb index 718f134de1f47..efc3465fe625a 100644 --- a/decidim-core/app/cells/decidim/address_cell.rb +++ b/decidim-core/app/cells/decidim/address_cell.rb @@ -24,11 +24,13 @@ def location_hints end def location + return pending_address_text if pending_address? + decidim_sanitize_translated(model.location) end def address - decidim_sanitize_translated(model.address) + decidim_sanitize_translated(model.address) if model.respond_to?(:address) && model.address.present? end def display_start_and_end_time? @@ -63,5 +65,13 @@ def start_time def end_time l model.end_time, format: "%H:%M %p %Z" end + + def pending_address? + address.blank? && model.location.is_a?(Hash) ? model.location.values.none?(&:present?) : model.location.blank? + end + + def pending_address_text + t("show.pending_address", scope: "decidim.meetings.meetings") + end end end diff --git a/decidim-core/spec/cells/decidim/address_cell_spec.rb b/decidim-core/spec/cells/decidim/address_cell_spec.rb index 9cae2bdc83838..eafe1dc972fc4 100644 --- a/decidim-core/spec/cells/decidim/address_cell_spec.rb +++ b/decidim-core/spec/cells/decidim/address_cell_spec.rb @@ -37,6 +37,19 @@ end end + context "when address is pending" do + let(:location) { {} } + let(:address) { "" } + + before do + allow(model).to receive(:location).and_return(location) + end + + it "renders pending address text" do + expect(subject.find(".address__location")).to have_content(I18n.t("show.pending_address", scope: "decidim.meetings.meetings")) + end + end + context "with an online meeting url" do let(:my_cell) { cell("decidim/address", model, online: true) } let(:model) { create(:dummy_resource) } diff --git a/decidim-meetings/app/cells/decidim/meetings/dates_and_map_cell.rb b/decidim-meetings/app/cells/decidim/meetings/dates_and_map_cell.rb index 65e96c342aa80..ea48a3038d187 100644 --- a/decidim-meetings/app/cells/decidim/meetings/dates_and_map_cell.rb +++ b/decidim-meetings/app/cells/decidim/meetings/dates_and_map_cell.rb @@ -32,7 +32,7 @@ def same_day? end def display_map? - maps_enabled? && !online? + maps_enabled? && !online? && model.address.present? end end end diff --git a/decidim-meetings/app/commands/decidim/meetings/admin/copy_meeting.rb b/decidim-meetings/app/commands/decidim/meetings/admin/copy_meeting.rb index c4d9e687bed7f..e6a660fd17b38 100644 --- a/decidim-meetings/app/commands/decidim/meetings/admin/copy_meeting.rb +++ b/decidim-meetings/app/commands/decidim/meetings/admin/copy_meeting.rb @@ -49,10 +49,10 @@ def copy_meeting! description: parsed_description, end_time: form.end_time, start_time: form.start_time, - address: form.address, + address: form.location_pending ? "" : form.address, latitude: form.latitude, longitude: form.longitude, - location: form.location, + location: form.location_pending ? {} : form.location, location_hints: form.location_hints, component: meeting.component, private_meeting: form.private_meeting, diff --git a/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb b/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb index 9e715ed897731..c9b276f39eb56 100644 --- a/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb +++ b/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb @@ -26,6 +26,8 @@ def attributes title: parsed_title, description: parsed_description, type_of_meeting: form.clean_type_of_meeting, + address: form.location_pending ? "" : form.address, + location: form.location_pending ? {} : form.location, author: form.current_organization, registration_terms: form.current_component.settings.default_registration_terms, questionnaire: Decidim::Forms::Questionnaire.new diff --git a/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb b/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb index b77ae4d23434a..d5e287e6445e5 100644 --- a/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb +++ b/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb @@ -27,7 +27,9 @@ def attributes super.merge({ title: parsed_title, description: parsed_description, - type_of_meeting: form.clean_type_of_meeting + type_of_meeting: form.clean_type_of_meeting, + address: form.location_pending ? "" : form.address, + location: form.location_pending ? nil : form.location }) end diff --git a/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb b/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb index 868ec17f20791..f699c752a4a56 100644 --- a/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb +++ b/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb @@ -7,6 +7,7 @@ module Admin class MeetingForm < ::Decidim::Meetings::BaseMeetingForm include TranslatableAttributes + attribute :location_pending, Boolean, default: false attribute :services, Array[MeetingServiceForm] attribute :component_ids, Array[Integer] attribute :private_meeting, Boolean @@ -32,7 +33,9 @@ class MeetingForm < ::Decidim::Meetings::BaseMeetingForm validates :registration_type, presence: true validates :registration_url, presence: true, url: true, if: ->(form) { form.on_different_platform? } validates :type_of_meeting, presence: true - validates :location, translatable_presence: true, if: ->(form) { form.in_person_meeting? || form.hybrid_meeting? } + validates :location, translatable_presence: true, if: ->(form) { !form.location_pending && (form.in_person_meeting? || form.hybrid_meeting?) } + validates :address, presence: true, if: ->(form) { !form.location_pending && (form.in_person_meeting? || form.hybrid_meeting?) } + validates :address, geocoding: true, if: ->(form) { !form.location_pending && form.has_address? && !form.geocoded? } validates :online_meeting_url, url: true, if: ->(form) { form.online_meeting? || form.hybrid_meeting? } validates :comments_start_time, date: { before: :comments_end_time, allow_blank: true, if: proc { |obj| obj.comments_end_time.present? } } validates :comments_end_time, date: { after: :comments_start_time, allow_blank: true, if: proc { |obj| obj.comments_start_time.present? } } @@ -54,6 +57,7 @@ def map_model(model) presenter = MeetingEditionPresenter.new(model) self.title = presenter.title(all_locales: true) self.description = presenter.editor_description(all_locales: true) + self.location_pending = model.address.blank? && model.location.to_h.values.none?(&:present?) end def services_to_persist diff --git a/decidim-meetings/app/forms/decidim/meetings/base_meeting_form.rb b/decidim-meetings/app/forms/decidim/meetings/base_meeting_form.rb index c9b31783892a3..e638f4760d429 100644 --- a/decidim-meetings/app/forms/decidim/meetings/base_meeting_form.rb +++ b/decidim-meetings/app/forms/decidim/meetings/base_meeting_form.rb @@ -14,9 +14,6 @@ class BaseMeetingForm < Decidim::Form attribute :end_time, Decidim::Attributes::TimeWithZone validates :current_component, presence: true - - validates :address, presence: true, if: ->(form) { form.needs_address? } - validates :address, geocoding: true, if: ->(form) { form.has_address? && !form.geocoded? && form.needs_address? } validates :start_time, presence: true, date: { before: :end_time } validates :end_time, presence: true, date: { after: :start_time } diff --git a/decidim-meetings/app/forms/decidim/meetings/meeting_form.rb b/decidim-meetings/app/forms/decidim/meetings/meeting_form.rb index fb7da80a9aa6a..27b02f829abc4 100644 --- a/decidim-meetings/app/forms/decidim/meetings/meeting_form.rb +++ b/decidim-meetings/app/forms/decidim/meetings/meeting_form.rb @@ -22,6 +22,8 @@ class MeetingForm < ::Decidim::Meetings::BaseMeetingForm validates :title, presence: true, etiquette: true validates :description, presence: true, etiquette: true validates :type_of_meeting, presence: true + validates :address, presence: true, if: ->(form) { form.needs_address? } + validates :address, geocoding: true, if: ->(form) { form.has_address? && !form.geocoded? && form.needs_address? } validates :location, presence: true, if: ->(form) { form.in_person_meeting? || form.hybrid_meeting? } validates :online_meeting_url, presence: true, url: true, if: ->(form) { form.online_meeting? || form.hybrid_meeting? } validates :registration_type, presence: true diff --git a/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb b/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb index b6538cedb4ab4..dee38bdfb71b7 100644 --- a/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb +++ b/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb @@ -17,11 +17,20 @@
<%= t(".location_pending_help") %>
<%= t(".address_help") %>
+<%= t(".location_help") %>
+