decidim-admin 0.27.2 → 0.27.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/commands/decidim/admin/block_user.rb +7 -2
- data/app/commands/decidim/admin/publish_component.rb +1 -1
- data/app/controllers/concerns/decidim/admin/needs_admin_tos_accepted.rb +42 -0
- data/app/controllers/decidim/admin/admin_terms_controller.rb +1 -1
- data/app/controllers/decidim/admin/application_controller.rb +1 -0
- data/app/controllers/decidim/admin/space_publications_controller.rb +63 -0
- data/app/controllers/decidim/admin/static_page_topics_controller.rb +1 -3
- data/app/packs/src/decidim/admin/draggable-list.js +1 -1
- data/app/permissions/decidim/admin/permissions.rb +14 -1
- data/app/views/decidim/admin/area_types/edit.html.erb +1 -0
- data/app/views/decidim/admin/area_types/index.html.erb +1 -0
- data/app/views/decidim/admin/area_types/new.html.erb +1 -0
- data/app/views/decidim/admin/areas/edit.html.erb +1 -0
- data/app/views/decidim/admin/areas/index.html.erb +1 -0
- data/app/views/decidim/admin/areas/new.html.erb +1 -0
- data/app/views/decidim/admin/attachment_collections/edit.html.erb +1 -0
- data/app/views/decidim/admin/attachment_collections/index.html.erb +1 -0
- data/app/views/decidim/admin/attachment_collections/new.html.erb +1 -0
- data/app/views/decidim/admin/attachments/_form.html.erb +1 -1
- data/app/views/decidim/admin/attachments/edit.html.erb +1 -0
- data/app/views/decidim/admin/attachments/index.html.erb +1 -0
- data/app/views/decidim/admin/attachments/new.html.erb +1 -0
- data/app/views/decidim/admin/authorization_workflows/index.html.erb +1 -0
- data/app/views/decidim/admin/categories/edit.html.erb +1 -0
- data/app/views/decidim/admin/categories/index.html.erb +1 -0
- data/app/views/decidim/admin/categories/new.html.erb +1 -0
- data/app/views/decidim/admin/components/edit.html.erb +1 -0
- data/app/views/decidim/admin/components/index.html.erb +1 -0
- data/app/views/decidim/admin/components/new.html.erb +1 -1
- data/app/views/decidim/admin/conflicts/index.html.erb +1 -0
- data/app/views/decidim/admin/help_sections/show.erb +1 -0
- data/app/views/decidim/admin/impersonatable_users/index.html.erb +1 -0
- data/app/views/decidim/admin/impersonations/new.html.erb +1 -0
- data/app/views/decidim/admin/imports/new.html.erb +1 -1
- data/app/views/decidim/admin/logs/index.html.erb +1 -0
- data/app/views/decidim/admin/moderated_users/index.html.erb +1 -0
- data/app/views/decidim/admin/moderations/index.html.erb +1 -0
- data/app/views/decidim/admin/newsletter_templates/index.html.erb +1 -0
- data/app/views/decidim/admin/newsletter_templates/show.html.erb +1 -0
- data/app/views/decidim/admin/newsletters/index.html.erb +1 -0
- data/app/views/decidim/admin/newsletters/new.html.erb +1 -0
- data/app/views/decidim/admin/newsletters/show.html.erb +1 -0
- data/app/views/decidim/admin/officializations/index.html.erb +15 -10
- data/app/views/decidim/admin/officializations/new.html.erb +1 -0
- data/app/views/decidim/admin/organization/edit.html.erb +1 -0
- data/app/views/decidim/admin/organization_appearance/edit.html.erb +1 -0
- data/app/views/decidim/admin/organization_external_domain_whitelist/edit.html.erb +1 -0
- data/app/views/decidim/admin/participatory_space_private_users_csv_imports/new.html.erb +1 -1
- data/app/views/decidim/admin/scope_types/edit.html.erb +1 -0
- data/app/views/decidim/admin/scope_types/index.html.erb +1 -0
- data/app/views/decidim/admin/scope_types/new.html.erb +1 -0
- data/app/views/decidim/admin/scopes/edit.html.erb +1 -0
- data/app/views/decidim/admin/scopes/index.html.erb +1 -0
- data/app/views/decidim/admin/scopes/new.html.erb +1 -0
- data/app/views/decidim/admin/shared/landing_page_content_blocks/edit.html.erb +1 -0
- data/app/views/decidim/admin/static_page_topics/edit.html.erb +1 -0
- data/app/views/decidim/admin/static_page_topics/new.html.erb +1 -0
- data/app/views/decidim/admin/static_pages/_form.html.erb +1 -1
- data/app/views/decidim/admin/static_pages/edit.html.erb +1 -0
- data/app/views/decidim/admin/static_pages/index.html.erb +1 -0
- data/app/views/decidim/admin/static_pages/new.html.erb +1 -0
- data/app/views/decidim/admin/user_groups/index.html.erb +1 -0
- data/app/views/decidim/admin/user_groups_csv_verifications/new.html.erb +2 -1
- data/app/views/decidim/admin/users/index.html.erb +1 -0
- data/app/views/decidim/admin/users/new.html.erb +1 -0
- data/app/views/layouts/decidim/admin/global_moderations.html.erb +1 -0
- data/config/environment.rb +1 -0
- data/config/locales/ar.yml +10 -5
- data/config/locales/ca.yml +9 -6
- data/config/locales/cs.yml +5 -2
- data/config/locales/de.yml +18 -5
- data/config/locales/el.yml +78 -2
- data/config/locales/en.yml +6 -3
- data/config/locales/es-MX.yml +7 -4
- data/config/locales/es-PY.yml +7 -4
- data/config/locales/es.yml +8 -5
- data/config/locales/eu.yml +11 -13
- data/config/locales/fa-IR.yml +1 -0
- data/config/locales/fi-plain.yml +5 -2
- data/config/locales/fi.yml +8 -5
- data/config/locales/fr-CA.yml +6 -3
- data/config/locales/fr.yml +7 -4
- data/config/locales/gl.yml +0 -5
- data/config/locales/hu.yml +45 -22
- data/config/locales/id-ID.yml +0 -2
- data/config/locales/is-IS.yml +0 -2
- data/config/locales/it.yml +0 -5
- data/config/locales/ja.yml +13 -10
- data/config/locales/kaa.yml +203 -0
- data/config/locales/lb.yml +0 -5
- data/config/locales/lt.yml +0 -5
- data/config/locales/lv.yml +0 -4
- data/config/locales/nl.yml +0 -5
- data/config/locales/no.yml +0 -5
- data/config/locales/pl.yml +0 -5
- data/config/locales/pt-BR.yml +90 -3
- data/config/locales/pt.yml +0 -5
- data/config/locales/ro-RO.yml +11 -11
- data/config/locales/ru.yml +0 -2
- data/config/locales/sk.yml +0 -4
- data/config/locales/sr-CS.yml +0 -4
- data/config/locales/sv.yml +0 -6
- data/config/locales/tr-TR.yml +3 -5
- data/config/locales/uk.yml +0 -2
- data/config/locales/zh-CN.yml +0 -4
- data/config/locales/zh-TW.yml +1100 -0
- data/lib/decidim/admin/form_builder.rb +1 -2
- data/lib/decidim/admin/test/needs_admin_tos_accepted_examples.rb +9 -0
- data/lib/decidim/admin/test.rb +1 -0
- data/lib/decidim/admin/version.rb +1 -1
- metadata +18 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2b6d361bf34645d19fff1ed2b9d2dfc9bd21d9d5f59205009c6a98aa768aa104
|
|
4
|
+
data.tar.gz: d6afb23b3c6d259f9c1ec1380746a90ab72c16451598e3bdba0d6e4f014d5c05
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 13c4b9f5db82ec0b5575c185f2b18b1b3bf9b11066612167c03d5f91edf47a9c824e99b60bbe3fd19289401d668526befcd6b394893a8b8932c1d1cf012dbf61
|
|
7
|
+
data.tar.gz: 1a12690709937d82651c02a0cab87db70a8b8c62fa8b4cd8779261ff9729961517131007ff8300d131d375ff755195fa207b4a999d621c87722b4ef322c4beb5
|
|
@@ -20,8 +20,9 @@ module Decidim
|
|
|
20
20
|
return broadcast(:invalid) unless form.valid?
|
|
21
21
|
|
|
22
22
|
transaction do
|
|
23
|
-
|
|
23
|
+
find_or_create_moderation!
|
|
24
24
|
register_justification!
|
|
25
|
+
block!
|
|
25
26
|
notify_user!
|
|
26
27
|
end
|
|
27
28
|
|
|
@@ -32,6 +33,10 @@ module Decidim
|
|
|
32
33
|
|
|
33
34
|
attr_reader :form
|
|
34
35
|
|
|
36
|
+
def find_or_create_moderation!
|
|
37
|
+
Decidim::UserModeration.create_or_find_by!(user: form.user)
|
|
38
|
+
end
|
|
39
|
+
|
|
35
40
|
def register_justification!
|
|
36
41
|
@current_blocking = UserBlock.create!(
|
|
37
42
|
justification: form.justification,
|
|
@@ -65,7 +70,7 @@ module Decidim
|
|
|
65
70
|
) do
|
|
66
71
|
form.user.blocked = true
|
|
67
72
|
form.user.blocked_at = Time.current
|
|
68
|
-
form.user.
|
|
73
|
+
form.user.block_id = @current_blocking.id
|
|
69
74
|
form.user.extended_data["user_name"] = form.user.name
|
|
70
75
|
form.user.name = "Blocked user"
|
|
71
76
|
form.user.save!
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Admin
|
|
5
|
+
# Shared behaviour for signed_in admins that require the latest TOS accepted
|
|
6
|
+
module NeedsAdminTosAccepted
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
included do
|
|
10
|
+
before_action :tos_accepted_by_admin
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def tos_accepted_by_admin
|
|
16
|
+
return unless request.format.html?
|
|
17
|
+
return unless current_user
|
|
18
|
+
return if current_user.admin_terms_accepted?
|
|
19
|
+
return if permitted_paths?
|
|
20
|
+
|
|
21
|
+
store_location_for(
|
|
22
|
+
current_user,
|
|
23
|
+
request.path
|
|
24
|
+
)
|
|
25
|
+
redirect_to admin_tos_path
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def permitted_paths?
|
|
29
|
+
# ensure that path with or without query string pass
|
|
30
|
+
permitted_paths.find { |el| el.split("?").first == request.path }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def permitted_paths
|
|
34
|
+
[admin_tos_path, decidim_admin.admin_terms_accept_path]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def admin_tos_path
|
|
38
|
+
decidim_admin.admin_terms_show_path
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -9,7 +9,7 @@ module Decidim
|
|
|
9
9
|
current_user.admin_terms_accepted_at = Time.current
|
|
10
10
|
if current_user.save!
|
|
11
11
|
flash[:notice] = t("accept.success", scope: "decidim.admin.admin_terms_of_use")
|
|
12
|
-
redirect_to decidim_admin.root_path
|
|
12
|
+
redirect_to stored_location_for(current_user) || decidim_admin.root_path
|
|
13
13
|
else
|
|
14
14
|
flash[:alert] = t("accept.error", scope: "decidim.admin.admin_terms_of_use")
|
|
15
15
|
redirect_to decidim_admin.admin_terms_show_path
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module Admin
|
|
5
|
+
# Base controller that can be inherited by other spaces to publish and unpublish the Space
|
|
6
|
+
#
|
|
7
|
+
class SpacePublicationsController < Decidim::Assemblies::Admin::ApplicationController
|
|
8
|
+
def create
|
|
9
|
+
enforce_permission_to_publish
|
|
10
|
+
|
|
11
|
+
publish_command.call(current_assembly, current_user) do
|
|
12
|
+
on(:ok) do
|
|
13
|
+
flash[:notice] = I18n.t("create.success", scope: i18n_scope)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
on(:invalid) do
|
|
17
|
+
flash.now[:alert] = I18n.t("create.error", scope: i18n_scope)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
redirect_back(fallback_location: assemblies_path)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def destroy
|
|
25
|
+
enforce_permission_to_publish
|
|
26
|
+
|
|
27
|
+
unpublish_command.call(current_assembly, current_user) do
|
|
28
|
+
on(:ok) do
|
|
29
|
+
flash[:notice] = I18n.t("destroy.success", scope: i18n_scope)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
on(:invalid) do
|
|
33
|
+
flash.now[:alert] = I18n.t("destroy.error", scope: i18n_scope)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
redirect_back(fallback_location: assemblies_path)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def current_participatory_space
|
|
43
|
+
raise "Not implemented"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def enforce_permission_to_publish
|
|
47
|
+
raise "Not implemented"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def publish_command
|
|
51
|
+
raise "Not implemented"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def unpublish_command
|
|
55
|
+
raise "Not implemented"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def i18n_scope
|
|
59
|
+
raise "Not implemented"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -39,10 +39,10 @@ module Decidim
|
|
|
39
39
|
allow! if templates_action?
|
|
40
40
|
allow! if organization_action?
|
|
41
41
|
allow! if user_action?
|
|
42
|
+
allow! if admin_user_action?
|
|
42
43
|
|
|
43
44
|
allow! if permission_action.subject == :category
|
|
44
45
|
allow! if permission_action.subject == :component
|
|
45
|
-
allow! if permission_action.subject == :admin_user
|
|
46
46
|
allow! if permission_action.subject == :attachment
|
|
47
47
|
allow! if permission_action.subject == :editor_image
|
|
48
48
|
allow! if permission_action.subject == :attachment_collection
|
|
@@ -201,6 +201,19 @@ module Decidim
|
|
|
201
201
|
end
|
|
202
202
|
end
|
|
203
203
|
|
|
204
|
+
def admin_user_action?
|
|
205
|
+
return unless permission_action.subject == :admin_user
|
|
206
|
+
|
|
207
|
+
target_user = context.fetch(:user, nil)
|
|
208
|
+
|
|
209
|
+
case permission_action.action
|
|
210
|
+
when :destroy, :block
|
|
211
|
+
target_user != user
|
|
212
|
+
else
|
|
213
|
+
true
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
204
217
|
def organization
|
|
205
218
|
@organization ||= context.fetch(:organization, nil) || context.fetch(:current_organization, nil)
|
|
206
219
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t("attachment_collections.edit.title", scope: "decidim.admin")) %>
|
|
1
2
|
<%= decidim_form_for(@form, url: url_for([@attachment_collection.collection_for, @attachment_collection]), html: { class: "form edit_attachment_collection" }) do |f| %>
|
|
2
3
|
<%= render partial: "decidim/admin/attachment_collections/form", object: f, locals: { title: t("attachment_collections.edit.title", scope: "decidim.admin") } %>
|
|
3
4
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t("attachment_collections.new.title", scope: "decidim.admin")) %>
|
|
1
2
|
<%= decidim_form_for(@form, url: url_for([collection_for, @form]), html: { class: "form new_attachment_collection" }) do |f| %>
|
|
2
3
|
<%= render partial: "decidim/admin/attachment_collections/form", object: f, locals: { title: t("attachment_collections.new.title", scope: "decidim.admin") } %>
|
|
3
4
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
|
1
2
|
<%= decidim_form_for(@form, url: url_for([@attachment.attached_to, @attachment]), html: { class: "form edit_attachment" }) do |f| %>
|
|
2
3
|
<%= render partial: "decidim/admin/attachments/form", object: f, locals: { title: t(".title") } %>
|
|
3
4
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t("categories.new.title", scope: "decidim.admin")) %>
|
|
1
2
|
<%= decidim_form_for(@form, url: categories_path(current_participatory_space), html: { class: "form new_category" }) do |f| %>
|
|
2
3
|
<%= render partial: "form", object: f, locals: { title: t("categories.new.title", scope: "decidim.admin") } %>
|
|
3
4
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t(".title", name: t("#{@component.manifest.name}.name", scope: "decidim.components"))) %>
|
|
1
2
|
<%= decidim_form_for([current_participatory_space, @form], url: component_path(current_participatory_space, @component), method: "put", html: { class: "form edit_component" }) do |form| %>
|
|
2
3
|
<%= render partial: "form", object: form, locals: { component: @component, title: t(".title", name: t("#{@component.manifest.name}.name", scope: "decidim.components")) } %>
|
|
3
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
<% add_decidim_page_title(t(".title", name: t("#{manifest.name}.name", scope: "decidim.components"))) %>
|
|
2
2
|
<%= decidim_form_for([current_participatory_space, @form], url: components_path(type: params[:type]), method: "post", html: { class: "form new_component" }) do |form| %>
|
|
3
3
|
<%= render partial: "form", object: form, locals: { component: @component, title: t(".title", name: t("#{manifest.name}.name", scope: "decidim.components")) } %>
|
|
4
4
|
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
</div>
|
|
39
39
|
</legend>
|
|
40
40
|
<div class="row column">
|
|
41
|
-
<%= form.upload :file,
|
|
41
|
+
<%= form.upload :file, required: true, help_i18n_scope: "decidim.admin.forms.file_help.import" %>
|
|
42
42
|
</div>
|
|
43
43
|
</fieldset>
|
|
44
44
|
</div>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t("decidim.admin.titles.participants")) %>
|
|
1
2
|
<div class="card with-overflow" id='user-groups'>
|
|
2
3
|
<div class="card-divider">
|
|
3
4
|
<h2 class="card-title"><%= t "decidim.admin.titles.participants" %></h2>
|
|
@@ -33,7 +34,7 @@
|
|
|
33
34
|
<td><%= user.report_count %></td>
|
|
34
35
|
|
|
35
36
|
<td class="table-list__actions">
|
|
36
|
-
<% if allowed_to?(:block, :admin_user) %>
|
|
37
|
+
<% if allowed_to?(:block, :admin_user, user: user) %>
|
|
37
38
|
<% if user.blocked? %>
|
|
38
39
|
<%= icon_link_to "ban", user_block_path(user_id: user.id), t(".unblock"), class: "action-icon action-icon--disabled", method: :delete %>
|
|
39
40
|
<% else %>
|
|
@@ -43,15 +44,19 @@
|
|
|
43
44
|
<% if allowed_to? :show_email, :user, user: user %>
|
|
44
45
|
<%= icon_link_to "envelope-open", show_email_officialization_path(user_id: user.id), t(".show_email"), class: "action-icon action-icon--show-email", data: { full_name: user.name, toggle: "show-email-modal" } %>
|
|
45
46
|
<% end %>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
<% unless user.blocked? %>
|
|
48
|
+
<% unless current_user == user %>
|
|
49
|
+
<%= icon_link_to "envelope-closed", current_or_new_conversation_path_with(user), t("decidim.contact"), class:"action-icon--new" %>
|
|
50
|
+
<% end %>
|
|
51
|
+
<% if user.officialized? %>
|
|
52
|
+
<%= icon "circle-check", class: "action-icon action-icon--disabled", role: "img", aria_label: t(".officialize") %>
|
|
53
|
+
<%= icon_link_to "pencil", new_officialization_path(user_id: user.id), t(".reofficialize"), class: "action-icon--new" %>
|
|
54
|
+
<%= icon_link_to "circle-x", officialization_path(user.id), t(".unofficialize"), method: :delete, class: "action-icon--reject" %>
|
|
55
|
+
<% else %>
|
|
56
|
+
<%= icon_link_to "circle-check", new_officialization_path(user_id: user.id), t(".officialize"), class: "action-icon--verify" %>
|
|
57
|
+
<%= icon "pencil", class: "action-icon action-icon--disabled", role: "img", aria_label: t(".reofficialize") %>
|
|
58
|
+
<%= icon "circle-x", class: "action-icon action-icon--disabled", role: "img", aria_label: t(".unofficialize") %>
|
|
59
|
+
<% end %>
|
|
55
60
|
<% end %>
|
|
56
61
|
</td>
|
|
57
62
|
</tr>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t("edit_organization_appearance", scope: "decidim.admin.titles")) %>
|
|
1
2
|
<%= decidim_form_for(@form, html: { class: "form edit_organization_appearance" }, url: organization_appearance_path, method: :put) do |f| %>
|
|
2
3
|
<%= render partial: "form", object: f %>
|
|
3
4
|
<div class="button--double form-general-submit">
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% add_decidim_page_title(t("edit_external_domains", scope: "decidim.admin.titles")) %>
|
|
1
2
|
<%= decidim_form_for(@form, html: { class: "form edit_organization_external_domain_whitelist" }, url: organization_external_domain_whitelist_path, method: :patch) do |f| %>
|
|
2
3
|
<%= render partial: "form", object: f %>
|
|
3
4
|
<div class="button--double form-general-submit">
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
<%= decidim_form_for(@form, url: participatory_space_private_users_csv_imports_path, html: { class: "form" }) do |form| %>
|
|
28
28
|
<p><%= t(".explanation") %></p>
|
|
29
29
|
<div class="row column">
|
|
30
|
-
<%= form.upload :file,
|
|
30
|
+
<%= form.upload :file, required: true %>
|
|
31
31
|
</div>
|
|
32
32
|
|
|
33
33
|
<div class="button--double form-general-submit">
|