diff --git a/app/components/proposals/form_component.html.erb b/app/components/proposals/form_component.html.erb
new file mode 100644
index 000000000..f386d106d
--- /dev/null
+++ b/app/components/proposals/form_component.html.erb
@@ -0,0 +1,109 @@
+<%= render "shared/globalize_locales", resource: proposal %>
+
+<%= translatable_form_for(proposal, url: url) do |f| %>
+
+ <%= render "shared/errors", resource: proposal %>
+
+
+ <%= f.translatable_fields do |translations_form| %>
+
+ <%= translations_form.text_field :title,
+ maxlength: Proposal.title_max_length,
+ data: suggest_data(proposal) %>
+
+
+
+
+ <%= translations_form.text_area :summary,
+ rows: 4, maxlength: 200,
+ hint: t("proposals.form.proposal_summary_note") %>
+
+
+
+ <%= translations_form.text_area :description,
+ maxlength: Proposal.description_max_length,
+ class: "html-area" %>
+
+ <% end %>
+
+ <%= f.invisible_captcha :subtitle %>
+
+
+ <%= f.text_field :video_url, hint: t("proposals.form.proposal_video_url_note") %>
+
+
+ <% if feature?(:allow_images) %>
+
+ <%= render "images/nested_image", imageable: proposal, f: f %>
+
+ <% end %>
+
+ <% if feature?(:allow_attached_documents) %>
+
+ <%= render "documents/nested_documents", documentable: proposal, f: f %>
+
+ <% end %>
+
+
+ <%= f.select :geozone_id, geozone_select_options,
+ include_blank: t("geozones.none") %>
+
+
+ <% if feature?(:map) %>
+
+ <%= render "map_locations/form_fields",
+ form: f,
+ map_location: proposal.map_location || MapLocation.new,
+ label: t("proposals.form.map_location"),
+ help: t("proposals.form.map_location_instructions"),
+ remove_marker_label: t("proposals.form.map_remove_marker"),
+ parent_class: "proposal",
+ i18n_namespace: "proposals" %>
+
+ <% end %>
+
+
+ <%= f.label :tag_list, t("proposals.form.tags_label") %>
+
<%= t("proposals.form.tags_instructions") %>
+
+
+
+
+ <%= f.text_field :tag_list, value: proposal.tag_list.to_s,
+ label: false,
+ placeholder: t("proposals.form.tags_placeholder"),
+ class: "js-tag-list tag-autocomplete",
+ aria: { describedby: "tag-list-help-text" },
+ data: { js_url: suggest_tags_path } %>
+
+
+ <% if current_user.unverified? %>
+
+ <%= f.text_field :responsible_name,
+ hint: t("proposals.form.proposal_responsible_name_note") %>
+
+ <% end %>
+
+ <%= render SDG::RelatedListSelectorComponent.new(f) %>
+
+
+ <% if proposal.new_record? %>
+ <%= f.check_box :terms_of_service,
+ title: t("form.accept_terms_title"),
+ label: t("form.accept_terms",
+ policy: link_to(t("form.policy"), "/privacy", target: "blank"),
+ conditions: link_to(t("form.conditions"), "/conditions", target: "blank")
+ ) %>
+ <% end %>
+
+
+
+ <%= f.submit(class: "button", value: t("proposals.#{action_name}.form.submit_button")) %>
+
+
+<% end %>
diff --git a/app/components/proposals/form_component.rb b/app/components/proposals/form_component.rb
new file mode 100644
index 000000000..4ec266d05
--- /dev/null
+++ b/app/components/proposals/form_component.rb
@@ -0,0 +1,17 @@
+class Proposals::FormComponent < ApplicationComponent
+ include TranslatableFormHelper
+ include GlobalizeHelper
+ attr_reader :proposal, :url
+ delegate :current_user, :suggest_data, :geozone_select_options, to: :helpers
+
+ def initialize(proposal, url:)
+ @proposal = proposal
+ @url = url
+ end
+
+ private
+
+ def categories
+ Tag.category.order(:name)
+ end
+end
diff --git a/app/controllers/concerns/commentable_actions.rb b/app/controllers/concerns/commentable_actions.rb
index 31ced92e1..1d1b647f9 100644
--- a/app/controllers/concerns/commentable_actions.rb
+++ b/app/controllers/concerns/commentable_actions.rb
@@ -52,7 +52,6 @@ module CommentableActions
redirect_path = url_for(controller: controller_name, action: :show, id: @resource.id)
redirect_to redirect_path, notice: t("flash.actions.create.#{resource_name.underscore}")
else
- load_categories
load_geozones
set_resource_instance
render :new
@@ -66,7 +65,6 @@ module CommentableActions
if resource.update(strong_params)
redirect_to resource, notice: t("flash.actions.update.#{resource_name.underscore}")
else
- load_categories
load_geozones
set_resource_instance
render :edit
diff --git a/app/controllers/management/proposals_controller.rb b/app/controllers/management/proposals_controller.rb
index a384bb541..740a4b81c 100644
--- a/app/controllers/management/proposals_controller.rb
+++ b/app/controllers/management/proposals_controller.rb
@@ -7,7 +7,6 @@ class Management::ProposalsController < Management::BaseController
before_action :only_verified_users, except: :print
before_action :set_proposal, only: [:vote, :show]
before_action :parse_search_terms, only: :index
- before_action :load_categories, only: [:new, :edit]
before_action :load_geozones, only: [:edit]
has_orders %w[confidence_score hot_score created_at most_commented random], only: [:index, :print]
@@ -22,7 +21,6 @@ class Management::ProposalsController < Management::BaseController
redirect_path = url_for(controller: controller_name, action: :show, id: @resource.id)
redirect_to redirect_path, notice: t("flash.actions.create.#{resource_name.underscore}")
else
- load_categories
load_geozones
set_resource_instance
render :new
diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb
index fc0b977df..dd4932ed1 100644
--- a/app/controllers/proposals_controller.rb
+++ b/app/controllers/proposals_controller.rb
@@ -7,7 +7,7 @@ class ProposalsController < ApplicationController
include MapLocationAttributes
include Translatable
- before_action :load_categories, only: [:index, :new, :create, :edit, :map, :summary]
+ before_action :load_categories, only: [:index, :map, :summary]
before_action :load_geozones, only: [:edit, :map, :summary]
before_action :authenticate_user!, except: [:index, :show, :map, :summary]
before_action :destroy_map_location_association, only: :update
diff --git a/app/views/proposals/_form.html.erb b/app/views/proposals/_form.html.erb
index 44b14fc59..aa749b961 100644
--- a/app/views/proposals/_form.html.erb
+++ b/app/views/proposals/_form.html.erb
@@ -1,111 +1 @@
-<%= render "shared/globalize_locales", resource: @proposal %>
-
-<%= translatable_form_for(@proposal, url: form_url) do |f| %>
-
- <%= render "shared/errors", resource: @proposal %>
-
-
- <%= f.translatable_fields do |translations_form| %>
-
- <%= translations_form.text_field :title,
- maxlength: Proposal.title_max_length,
- data: suggest_data(@proposal) %>
-
-
-
-
- <%= translations_form.text_area :summary,
- rows: 4, maxlength: 200,
- hint: t("proposals.form.proposal_summary_note") %>
-
-
-
- <%= translations_form.text_area :description,
- maxlength: Proposal.description_max_length,
- class: "html-area" %>
-
- <% end %>
-
- <%= f.invisible_captcha :subtitle %>
-
-
- <%= f.text_field :video_url, hint: t("proposals.form.proposal_video_url_note") %>
-
-
- <% if feature?(:allow_images) %>
-
- <%= render "images/nested_image", imageable: @proposal, f: f %>
-
- <% end %>
-
- <% if feature?(:allow_attached_documents) %>
-
- <%= render "documents/nested_documents", documentable: @proposal, f: f %>
-
- <% end %>
-
-
- <%= f.select :geozone_id, geozone_select_options,
- include_blank: t("geozones.none") %>
-
-
- <% if feature?(:map) %>
-
-
- <%= render "map_locations/form_fields",
- form: f,
- map_location: @proposal.map_location || MapLocation.new,
- label: t("proposals.form.map_location"),
- help: t("proposals.form.map_location_instructions"),
- remove_marker_label: t("proposals.form.map_remove_marker"),
- parent_class: "proposal",
- i18n_namespace: "proposals" %>
-
-
- <% end %>
-
-
- <%= f.label :tag_list, t("proposals.form.tags_label") %>
-
<%= t("proposals.form.tags_instructions") %>
-
-
-
-
- <%= f.text_field :tag_list, value: @proposal.tag_list.to_s,
- label: false,
- placeholder: t("proposals.form.tags_placeholder"),
- class: "js-tag-list tag-autocomplete",
- aria: { describedby: "tag-list-help-text" },
- data: { js_url: suggest_tags_path } %>
-
-
- <% if current_user.unverified? %>
-
- <%= f.text_field :responsible_name,
- hint: t("proposals.form.proposal_responsible_name_note") %>
-
- <% end %>
-
- <%= render SDG::RelatedListSelectorComponent.new(f) %>
-
-
- <% if @proposal.new_record? %>
- <%= f.check_box :terms_of_service,
- title: t("form.accept_terms_title"),
- label: t("form.accept_terms",
- policy: link_to(t("form.policy"), "/privacy", target: "blank"),
- conditions: link_to(t("form.conditions"), "/conditions", target: "blank")
- ) %>
- <% end %>
-
-
-
- <%= f.submit(class: "button", value: t("proposals.#{action_name}.form.submit_button")) %>
-
-
-<% end %>
+<%= render Proposals::FormComponent.new(@proposal, url: form_url) %>