decidim-proposals 0.29.3 → 0.30.0.rc1

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.
Files changed (206) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +13 -1
  3. data/app/cells/decidim/proposals/highlighted_proposals_for_component_cell.rb +1 -1
  4. data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +1 -1
  5. data/app/cells/decidim/proposals/proposal_g/show.erb +13 -0
  6. data/app/cells/decidim/proposals/proposal_g_cell.rb +13 -0
  7. data/app/cells/decidim/proposals/proposal_history_cell.rb +107 -0
  8. data/app/cells/decidim/proposals/proposal_l/show.erb +37 -0
  9. data/app/cells/decidim/proposals/proposal_l_cell.rb +9 -0
  10. data/app/cells/decidim/proposals/proposal_metadata_cell.rb +2 -2
  11. data/app/cells/decidim/proposals/proposal_vote/show.erb +75 -0
  12. data/app/cells/decidim/proposals/proposal_vote_cell.rb +43 -0
  13. data/app/commands/decidim/proposals/accept_coauthorship.rb +62 -0
  14. data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +14 -0
  15. data/app/commands/decidim/proposals/admin/create_proposal.rb +6 -14
  16. data/app/commands/decidim/proposals/admin/create_proposal_note.rb +20 -11
  17. data/app/commands/decidim/proposals/admin/import_proposals.rb +60 -7
  18. data/app/commands/decidim/proposals/admin/merge_proposals.rb +2 -2
  19. data/app/commands/decidim/proposals/admin/proposal_notes_methods.rb +48 -0
  20. data/app/commands/decidim/proposals/admin/reply_proposal_note.rb +92 -0
  21. data/app/commands/decidim/proposals/admin/split_proposals.rb +2 -2
  22. data/app/commands/decidim/proposals/admin/update_proposal.rb +10 -16
  23. data/app/commands/decidim/proposals/admin/update_proposal_taxonomies.rb +34 -0
  24. data/app/commands/decidim/proposals/cancel_coauthorship.rb +32 -0
  25. data/app/commands/decidim/proposals/create_collaborative_draft.rb +1 -2
  26. data/app/commands/decidim/proposals/create_proposal.rb +1 -2
  27. data/app/commands/decidim/proposals/invite_coauthor.rb +45 -0
  28. data/app/commands/decidim/proposals/publish_collaborative_draft.rb +1 -2
  29. data/app/commands/decidim/proposals/reject_coauthorship.rb +54 -0
  30. data/app/commands/decidim/proposals/update_collaborative_draft.rb +1 -2
  31. data/app/commands/decidim/proposals/update_proposal.rb +1 -2
  32. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +5 -1
  33. data/app/controllers/concerns/decidim/proposals/admin/needs_interpolations.rb +40 -0
  34. data/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +46 -5
  35. data/app/controllers/decidim/proposals/admin/proposal_notes_controller.rb +18 -0
  36. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +41 -85
  37. data/app/controllers/decidim/proposals/admin/proposals_imports_controller.rb +2 -2
  38. data/app/controllers/decidim/proposals/collaborative_drafts_controller.rb +2 -4
  39. data/app/controllers/decidim/proposals/invite_coauthors_controller.rb +87 -0
  40. data/app/controllers/decidim/proposals/proposals_controller.rb +7 -32
  41. data/app/controllers/decidim/proposals/versions_controller.rb +1 -1
  42. data/app/events/decidim/proposals/accepted_coauthorship_event.rb +8 -0
  43. data/app/events/decidim/proposals/admin/proposal_assigned_to_valuator_event.rb +27 -0
  44. data/app/events/decidim/proposals/admin/proposal_note_created_event.rb +5 -0
  45. data/app/events/decidim/proposals/coauthor_accepted_invite_event.rb +49 -0
  46. data/app/events/decidim/proposals/coauthor_invited_event.rb +45 -0
  47. data/app/events/decidim/proposals/coauthor_rejected_invite_event.rb +8 -0
  48. data/app/events/decidim/proposals/rejected_coauthorship_event.rb +8 -0
  49. data/app/events/decidim/proposals/update_proposal_taxonomies_event.rb +9 -0
  50. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +16 -0
  51. data/app/forms/decidim/proposals/admin/proposal_base_form.rb +3 -31
  52. data/app/forms/decidim/proposals/admin/proposal_form.rb +11 -6
  53. data/app/forms/decidim/proposals/admin/proposals_import_form.rb +0 -5
  54. data/app/forms/decidim/proposals/collaborative_draft_form.rb +0 -8
  55. data/app/forms/decidim/proposals/proposal_form.rb +5 -32
  56. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +25 -0
  57. data/app/helpers/decidim/proposals/admin/proposals_helper.rb +0 -1
  58. data/app/helpers/decidim/proposals/application_helper.rb +23 -15
  59. data/app/helpers/decidim/proposals/collaborative_draft_helper.rb +7 -7
  60. data/app/helpers/decidim/proposals/map_helper.rb +0 -18
  61. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +15 -2
  62. data/app/helpers/decidim/proposals/proposals_helper.rb +3 -1
  63. data/app/jobs/decidim/proposals/admin/proposal_answer_job.rb +20 -0
  64. data/app/models/decidim/proposals/collaborative_draft.rb +13 -3
  65. data/app/models/decidim/proposals/proposal.rb +71 -5
  66. data/app/models/decidim/proposals/proposal_note.rb +11 -0
  67. data/app/models/decidim/proposals/proposal_state.rb +1 -1
  68. data/app/packs/entrypoints/decidim_proposals.js +1 -0
  69. data/app/packs/entrypoints/decidim_proposals_geocoding.js +2 -0
  70. data/app/packs/src/decidim/proposals/admin/proposals.js +16 -1
  71. data/app/packs/src/decidim/proposals/exit_handler.js +73 -0
  72. data/app/packs/stylesheets/decidim/proposals/proposals.scss +248 -3
  73. data/app/permissions/decidim/proposals/admin/permissions.rb +2 -5
  74. data/app/permissions/decidim/proposals/permissions.rb +42 -0
  75. data/app/presenters/decidim/proposals/admin_log/proposal_presenter.rb +1 -1
  76. data/app/presenters/decidim/proposals/proposal_presenter.rb +1 -1
  77. data/app/queries/decidim/proposals/filtered_proposals.rb +2 -2
  78. data/app/queries/decidim/proposals/metrics/accepted_proposals_metric_manage.rb +2 -2
  79. data/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb +10 -10
  80. data/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb +4 -4
  81. data/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb +6 -6
  82. data/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb +6 -6
  83. data/app/queries/decidim/proposals/metrics/votes_metric_manage.rb +6 -6
  84. data/app/services/decidim/proposals/proposal_builder.rb +1 -2
  85. data/app/views/decidim/proposals/admin/proposal_notes/_form.html.erb +3 -3
  86. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_note.html.erb +28 -0
  87. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_note_reply.html.erb +9 -0
  88. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +4 -28
  89. data/app/views/decidim/proposals/admin/proposal_states/_form.html.erb +1 -1
  90. data/app/views/decidim/proposals/admin/proposals/_actions.html.erb +21 -0
  91. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +3 -2
  92. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +17 -24
  93. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +12 -28
  94. data/app/views/decidim/proposals/admin/proposals/_proposals-thead.html.erb +45 -0
  95. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_apply_answer_template.html.erb +22 -0
  96. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +15 -11
  97. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_taxonomy_change.html.erb +23 -0
  98. data/app/views/decidim/proposals/admin/proposals/index.html.erb +17 -48
  99. data/app/views/decidim/proposals/admin/proposals/manage_trash.html.erb +18 -0
  100. data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +1 -1
  101. data/app/views/decidim/proposals/admin/proposals/show.html.erb +14 -26
  102. data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +1 -1
  103. data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +0 -3
  104. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_actions.html.erb +9 -0
  105. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_draft_aside.html.erb +0 -15
  106. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +4 -6
  107. data/app/views/decidim/proposals/collaborative_drafts/index.html.erb +6 -2
  108. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +27 -11
  109. data/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +29 -9
  110. data/app/views/decidim/proposals/proposals/_actions.html.erb +4 -7
  111. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +17 -22
  112. data/app/views/decidim/proposals/proposals/_exit_modal.html.erb +17 -0
  113. data/app/views/decidim/proposals/proposals/_notification_alert_box.html.erb +1 -0
  114. data/app/views/decidim/proposals/proposals/_proposal_actions.html.erb +19 -0
  115. data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +9 -32
  116. data/app/views/decidim/proposals/proposals/_proposal_voting_rules.html.erb +33 -0
  117. data/app/views/decidim/proposals/proposals/_proposals.html.erb +1 -1
  118. data/app/views/decidim/proposals/proposals/_remaining_votes_count.html.erb +2 -2
  119. data/app/views/decidim/proposals/proposals/_remaining_votes_notification.html.erb +12 -0
  120. data/app/views/decidim/proposals/proposals/_update_proposal_voting_rules.html.erb +6 -0
  121. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +12 -8
  122. data/app/views/decidim/proposals/proposals/_votes_count.html.erb +2 -1
  123. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +1 -7
  124. data/app/views/decidim/proposals/proposals/index.html.erb +3 -18
  125. data/app/views/decidim/proposals/proposals/index.js.erb +1 -1
  126. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +3 -1
  127. data/app/views/decidim/proposals/proposals/show.html.erb +35 -15
  128. data/config/locales/ar.yml +15 -73
  129. data/config/locales/bg.yml +12 -89
  130. data/config/locales/bs-BA.yml +2 -13
  131. data/config/locales/ca.yml +209 -84
  132. data/config/locales/cs.yml +210 -81
  133. data/config/locales/de.yml +213 -89
  134. data/config/locales/el.yml +12 -84
  135. data/config/locales/en.yml +206 -81
  136. data/config/locales/es-MX.yml +213 -88
  137. data/config/locales/es-PY.yml +213 -88
  138. data/config/locales/es.yml +214 -89
  139. data/config/locales/eu.yml +288 -164
  140. data/config/locales/fi-plain.yml +213 -87
  141. data/config/locales/fi.yml +213 -87
  142. data/config/locales/fr-CA.yml +116 -97
  143. data/config/locales/fr.yml +116 -97
  144. data/config/locales/ga-IE.yml +1 -21
  145. data/config/locales/gl.yml +8 -45
  146. data/config/locales/hu.yml +12 -68
  147. data/config/locales/id-ID.yml +9 -43
  148. data/config/locales/is-IS.yml +0 -19
  149. data/config/locales/it.yml +11 -77
  150. data/config/locales/ja.yml +165 -106
  151. data/config/locales/lt.yml +13 -85
  152. data/config/locales/lv.yml +10 -52
  153. data/config/locales/nl.yml +10 -59
  154. data/config/locales/no.yml +10 -44
  155. data/config/locales/pl.yml +11 -88
  156. data/config/locales/pt-BR.yml +9 -74
  157. data/config/locales/pt.yml +10 -56
  158. data/config/locales/ro-RO.yml +12 -72
  159. data/config/locales/ru.yml +0 -23
  160. data/config/locales/sk.yml +10 -52
  161. data/config/locales/sr-CS.yml +2 -14
  162. data/config/locales/sv.yml +127 -86
  163. data/config/locales/tr-TR.yml +10 -53
  164. data/config/locales/uk.yml +0 -23
  165. data/config/locales/zh-CN.yml +10 -53
  166. data/config/locales/zh-TW.yml +12 -86
  167. data/db/migrate/20171220084719_add_published_at_to_proposals.rb +1 -1
  168. data/db/migrate/20181016132225_add_organization_as_author.rb +1 -1
  169. data/db/migrate/20200120215928_move_proposal_endorsements_to_core_endorsements.rb +1 -1
  170. data/db/migrate/20200827154156_add_commentable_counter_cache_to_proposals.rb +3 -3
  171. data/db/migrate/20210310102839_add_followable_counter_cache_to_proposals.rb +1 -1
  172. data/db/migrate/20240110203504_create_default_proposal_states.rb +1 -1
  173. data/db/migrate/20240404202756_add_valuation_assignments_count_to_decidim_proposals_proposals.rb +1 -1
  174. data/db/migrate/20240617091140_add_email_on_assigned_proposals_to_users.rb +7 -0
  175. data/db/migrate/20240617170052_add_parent_relation_to_decidim_proposal_notes.rb +7 -0
  176. data/db/migrate/20240828103755_add_deleted_at_to_decidim_proposals_proposals.rb +8 -0
  177. data/decidim-proposals.gemspec +1 -1
  178. data/lib/decidim/api/functions/proposal_finder_helper.rb +12 -0
  179. data/lib/decidim/api/functions/proposal_list_helper.rb +12 -0
  180. data/lib/decidim/api/proposal_type.rb +17 -25
  181. data/lib/decidim/api/proposals_type.rb +4 -19
  182. data/lib/decidim/proposals/admin_engine.rb +12 -3
  183. data/lib/decidim/proposals/admin_filter.rb +3 -6
  184. data/lib/decidim/proposals/component.rb +4 -5
  185. data/lib/decidim/proposals/download_your_data_proposal_serializer.rb +15 -0
  186. data/lib/decidim/proposals/engine.rb +5 -0
  187. data/lib/decidim/proposals/import/proposal_creator.rb +4 -4
  188. data/lib/decidim/proposals/proposal_serializer.rb +12 -29
  189. data/lib/decidim/proposals/seeds.rb +21 -17
  190. data/lib/decidim/proposals/test/factories.rb +2 -1
  191. data/lib/decidim/proposals/version.rb +1 -1
  192. data/lib/decidim/proposals.rb +4 -0
  193. data/lib/tasks/proposals/upgrade/decidim_proposals_upgrade_tasks.rake +0 -22
  194. metadata +65 -34
  195. data/app/commands/decidim/proposals/admin/update_proposal_category.rb +0 -70
  196. data/app/commands/decidim/proposals/admin/update_proposal_scope.rb +0 -75
  197. data/app/events/decidim/proposals/admin/update_proposal_category_event.rb +0 -11
  198. data/app/events/decidim/proposals/admin/update_proposal_scope_event.rb +0 -11
  199. data/app/jobs/decidim/proposals/admin/import_proposals_job.rb +0 -91
  200. data/app/mailers/decidim/proposals/admin/import_proposals_mailer.rb +0 -30
  201. data/app/views/decidim/proposals/admin/import_proposals_mailer/notify_failure.html.erb +0 -1
  202. data/app/views/decidim/proposals/admin/import_proposals_mailer/notify_success.html.erb +0 -2
  203. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +0 -15
  204. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +0 -21
  205. data/app/views/decidim/proposals/collaborative_drafts/_actions.html.erb +0 -7
  206. data/config/locales/ca-IT.yml +0 -945
@@ -0,0 +1,6 @@
1
+ <% if show_voting_rules? %>
2
+ <div class="item_voting_rules">
3
+ <%= render partial: "remaining_votes_notification" %>
4
+ <%= render partial: "proposal_voting_rules" %>
5
+ </div>
6
+ <% end %>
@@ -4,12 +4,14 @@
4
4
  <% if component_settings.participatory_texts_enabled? && from_proposals_list %>
5
5
  <%= render partial: "decidim/proposals/proposals/participatory_texts/proposal_vote_button", locals: { proposal:, from_proposals_list: true } %>
6
6
  <% else %>
7
- <div id="proposal-<%= proposal.id %>-vote-button">
7
+ <div id="proposal-<%= proposal.id %>-vote-button" class="card__proposals-votes-container">
8
8
  <% if !current_user %>
9
9
  <% if current_settings.votes_blocked? %>
10
- <%= action_authorized_button_to :vote, t("decidim.proposals.proposals.vote_button.votes_blocked"), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, class: button_classes, disabled: true %>
10
+ <%= action_authorized_button_to :vote, proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, class: button_classes, data: { "proposal-vote-button": true }, disabled: true do %>
11
+ <%= t("decidim.proposals.proposals.vote_button.votes_blocked") %>
12
+ <% end %>
11
13
  <% else %>
12
- <%= action_authorized_button_to :vote, proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, class: button_classes, data: { disable: true, "redirect-url": proposal_path(proposal) } do %>
14
+ <%= action_authorized_button_to :vote, proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, class: button_classes, data: { "proposal-vote-button": true, disable: true, "redirect-url": proposal_path(proposal) } do %>
13
15
  <%= t("decidim.proposals.proposals.vote_button.vote") %>
14
16
  <span class="sr-only"><%= decidim_html_escape(present(proposal).title) %></span>
15
17
  <% end %>
@@ -26,24 +28,26 @@
26
28
  disable: true,
27
29
  original: t("decidim.proposals.proposals.vote_button.already_voted"),
28
30
  replace: t("decidim.proposals.proposals.vote_button.already_voted_hover"),
31
+ "proposal-vote-button": true,
29
32
  "redirect-url": proposal_path(proposal)
30
33
  },
31
- class: "#{button_classes} is-hover",
34
+ class: "#{button_classes}",
32
35
  id: "vote_button-#{proposal.id}"
33
36
  ) do %>
34
37
  <%= t("decidim.proposals.proposals.vote_button.already_voted") %>
38
+ <%= icon "check-line", class: "already-voted-icon" %>
35
39
  <span class="sr-only"><%= decidim_html_escape(present(proposal).title) %></span>
36
40
  <% end %>
37
41
  <% else %>
38
42
  <% if proposal.maximum_votes_reached? && !proposal.can_accumulate_votes_beyond_threshold && current_component.participatory_space.can_participate?(current_user) %>
39
- <%= content_tag :button, t("decidim.proposals.proposals.vote_button.maximum_votes_reached"), class: button_classes, disabled: true %>
43
+ <%= content_tag :button, t("decidim.proposals.proposals.vote_button.maximum_votes_reached"), class: button_classes, data: { "proposal-vote-button": true }, disabled: true %>
40
44
  <% else %>
41
45
  <% if vote_limit_enabled? && remaining_votes_count_for(current_user) == 0 %>
42
- <%= content_tag :button, t("decidim.proposals.proposals.vote_button.no_votes_remaining"), class: button_classes, disabled: true %>
46
+ <%= content_tag :button, t("decidim.proposals.proposals.vote_button.no_votes_remaining"), class: button_classes, data: { "proposal-vote-button": true }, disabled: true %>
43
47
  <% elsif current_settings.votes_blocked? || !current_component.participatory_space.can_participate?(current_user) %>
44
- <%= content_tag :button, t("decidim.proposals.proposals.vote_button.votes_blocked"), class: button_classes, disabled: true %>
48
+ <%= content_tag :button, t("decidim.proposals.proposals.vote_button.votes_blocked"), class: button_classes, data: { "proposal-vote-button": true }, disabled: true %>
45
49
  <% else %>
46
- <%= action_authorized_button_to :vote, proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, remote: true, data: { disable: true, "redirect-url": proposal_path(proposal) }, class: button_classes do %>
50
+ <%= action_authorized_button_to :vote, proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, remote: true, data: { "proposal-vote-button": true, disable: true, "redirect-url": proposal_path(proposal) }, class: button_classes do %>
47
51
  <%= t("decidim.proposals.proposals.vote_button.vote") %>
48
52
  <span class="sr-only"><%= decidim_html_escape(present(proposal).title) %></span>
49
53
  <% end %>
@@ -9,7 +9,8 @@
9
9
  progress,
10
10
  total:,
11
11
  units_name: "decidim.proposals.proposals.votes_count.count",
12
- element_id: "proposal-#{proposal.id}-votes-count"
12
+ element_id: "proposal-#{proposal.id}-votes-count",
13
+ class: total.positive? ? "card__proposals-votes-limited" : "card__proposals-votes-unlimited"
13
14
  ) %>
14
15
  <% end %>
15
16
  <% end %>
@@ -1,7 +1,7 @@
1
1
  <% if show_voting_rules? %>
2
2
  <% announcement_body = capture do %>
3
3
  <div class="editor-content">
4
- <ul>
4
+ <ul class="mt-0 mb-2">
5
5
  <% if vote_limit_enabled? %>
6
6
  <li><%= t(".vote_limit.description", limit: component_settings.vote_limit) %></li>
7
7
  <% end %>
@@ -21,15 +21,9 @@
21
21
  <% if minimum_votes_per_user_enabled? %>
22
22
  <li>
23
23
  <%= t(".minimum_votes_per_user.description", votes: minimum_votes_per_user) %>
24
- <% if votes_given >= minimum_votes_per_user %>
25
- <%= t(".minimum_votes_per_user.given_enough_votes") %>
26
- <% else %>
27
- <%= t(".minimum_votes_per_user.votes_remaining", remaining_votes: minimum_votes_per_user - votes_given) %>
28
- <% end %>
29
24
  </li>
30
25
  <% end %>
31
26
  </ul>
32
- <%= render partial: "decidim/proposals/proposals/remaining_votes_count" if current_user_can_vote? %>
33
27
  </div>
34
28
  <% end %>
35
29
 
@@ -1,7 +1,7 @@
1
1
  <% add_decidim_meta_tags(
2
2
  description: translated_attribute(current_participatory_space.short_description),
3
3
  title: t("decidim.components.pagination.page_title",
4
- component_name:,
4
+ component_name: component_name,
5
5
  current_page: @proposals.current_page,
6
6
  total_pages: @proposals.total_pages ),
7
7
  url: proposals_url,
@@ -15,7 +15,7 @@
15
15
 
16
16
  <div class="proposal-list__aside__button-container">
17
17
  <% if current_settings.creation_enabled && current_component.participatory_space.can_participate?(current_user) %>
18
- <%= action_authorized_link_to :create, new_proposal_path, class: "button button__xl button__secondary w-full", data: { "redirect_url" => new_proposal_path } do %>
18
+ <%= action_authorized_link_to :create, new_proposal_path, permissions_holder: current_component, class: "button button__xl button__secondary w-full", data: { "redirect_url" => new_proposal_path } do %>
19
19
  <span><%= t("new_proposal", scope: "decidim.proposals.proposals.index") %></span>
20
20
  <%= icon "add-line" %>
21
21
  <% end %>
@@ -38,22 +38,7 @@
38
38
 
39
39
  <% if Decidim::Map.available?(:geocoding, :dynamic) && component_settings.geocoding_enabled? %>
40
40
  <div class="proposal-list__map">
41
- <%= dynamic_map_for proposals_data_for_map(@proposals) do %>
42
- <template id="marker-popup">
43
- <div class="space-y-6">
44
- <a href="${link}" class="card__list">
45
- <div class="card__list-content">
46
- <h3 class="h4 card__list-title">${title}</h3>
47
- <div class="card__list-metadata">
48
- {{each JSON.parse(items)}}
49
- <span>{{html icon}}{{html text}}</span>
50
- {{/each}}
51
- </div>
52
- </div>
53
- </a>
54
- </div>
55
- </template>
56
- <% end %>
41
+ <%= cell "decidim/map", @proposals, metadata_card: "decidim/proposals/proposal_metadata" %>
57
42
  </div>
58
43
  <% end %>
59
44
 
@@ -8,7 +8,7 @@ $orderFilterInput.val('<%= order %>');
8
8
  var $map = $("#map");
9
9
  var controller = $map.data("map-controller");
10
10
  if (controller) {
11
- var markerData = JSON.parse('<%= escape_javascript proposals_data_for_map(@proposals).to_json.html_safe %>');
11
+ var markerData = JSON.parse('<%= escape_javascript cell("decidim/map", @proposals, metadata_card: "decidim/proposals/proposal_metadata").geocoded_data.to_json.html_safe %>');
12
12
  controller.clearMarkers();
13
13
  if (markerData.length > 0 ) {
14
14
  controller.addMarkers(markerData);
@@ -4,7 +4,9 @@
4
4
  <div id="proposal-<%= proposal.id %>-vote-button">
5
5
  <% if !current_user %>
6
6
  <% if current_settings.votes_blocked? %>
7
- <%= action_authorized_button_to :vote, t("decidim.proposals.proposals.vote_button.votes_blocked"), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, class: "column button light button--sc disabled", disabled: true %>
7
+ <%= action_authorized_button_to :vote, proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, class: "column button light button--sc disabled", disabled: true do %>
8
+ <%= t("decidim.proposals.proposals.vote_button.votes_blocked") %>
9
+ <% end %>
8
10
  <% else %>
9
11
  <%= action_authorized_button_to :vote, proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list:), resource: proposal, class: "column button light button--sc", data: { disable: true, "redirect-url": proposal_path(proposal) } do %>
10
12
  <%= t("decidim.proposals.proposals.vote_button.vote") %>
@@ -1,8 +1,8 @@
1
- <% add_decidim_meta_tags({
2
- description: present(@proposal).body,
3
- title: present(@proposal).title,
4
- url: proposal_url(@proposal.id)
5
- }) %>
1
+ <% add_decidim_meta_tags(
2
+ description: present(@proposal).body,
3
+ title: present(@proposal).title,
4
+ url: proposal_url(@proposal.id),
5
+ resource: @proposal) %>
6
6
 
7
7
  <%
8
8
  edit_link(
@@ -26,6 +26,14 @@ extra_admin_link(
26
26
  <% append_stylesheet_pack_tag "decidim_proposals", media: "all" %>
27
27
  <% append_javascript_pack_tag "decidim_proposals" %>
28
28
 
29
+ <% content_for :item_header do %>
30
+ <% if show_voting_rules? %>
31
+ <div class="layout-item-complementary">
32
+ <%= render partial: "update_proposal_voting_rules" %>
33
+ </div>
34
+ <% end %>
35
+ <% end %>
36
+
29
37
  <% content_for :aside do %>
30
38
  <%= render partial: "proposal_aside" %>
31
39
  <% end %>
@@ -33,7 +41,9 @@ extra_admin_link(
33
41
  <%= render layout: "layouts/decidim/shared/layout_item", locals: { back_path: component_settings.participatory_texts_enabled? ? main_component_path(current_component) : proposals_path } do %>
34
42
 
35
43
  <section class="layout-main__section layout-main__heading">
36
- <%= render partial: "voting_rules" %>
44
+ <% if show_voting_rules? && remaining_minimum_votes_count_for(current_user).positive? && current_component.participatory_space.can_participate?(current_user) %>
45
+ <%= render partial: "exit_modal" %>
46
+ <% end %>
37
47
 
38
48
  <%= cell("decidim/announcement", proposal_reason_callout_announcement, callout_styles: @proposal.proposal_state&.css_style) if @proposal.answered? && @proposal.published_state? %>
39
49
 
@@ -46,12 +56,20 @@ extra_admin_link(
46
56
  <% end %>
47
57
 
48
58
  <% unless component_settings.participatory_texts_enabled? %>
49
- <div class="layout-author">
50
- <%= cell "decidim/coauthorships", @proposal, context_actions: [:date] %>
51
-
52
- <% if not ["section","subsection"].include? @proposal.participatory_text_level %>
59
+ <% unless ["section","subsection"].include?(@proposal.participatory_text_level) %>
60
+ <div class="layout-author has_status">
53
61
  <%= cell("decidim/proposals/proposal_metadata", @proposal).state_item&.dig(:text) %>
54
- <% end %>
62
+ </div>
63
+ <% end %>
64
+ <div class="layout-author <%= "has_status" unless %w(section subsection).include?(@proposal.participatory_text_level) %>">
65
+ <div class="relative flex items-center justify-center w-full">
66
+ <div class="w-10/12 flex items-center gap-4">
67
+ <%= cell "decidim/coauthorships", @proposal, context_actions: [:date] %>
68
+ </div>
69
+ <%= render "decidim/shared/resource_actions", resource: @proposal do %>
70
+ <%= render "decidim/proposals/proposals/proposal_actions" %>
71
+ <% end %>
72
+ </div>
55
73
  </div>
56
74
  <% end %>
57
75
  </section>
@@ -88,6 +106,8 @@ extra_admin_link(
88
106
  <%= cell "decidim/amendable/amendments", @proposal %>
89
107
  </section>
90
108
 
109
+ <%= cell "decidim/tags", @proposal %>
110
+
91
111
  <%= render partial: "actions" %>
92
112
 
93
113
  <% content_for :item_footer do %>
@@ -97,10 +117,10 @@ extra_admin_link(
97
117
  <%= content_tag :li, resource_reference(@proposal), class: "metadata__item" %>
98
118
  <%= content_tag :li, resource_version(proposal_presenter, versions_path: proposal_version_path(@proposal, proposal_presenter.versions.count)), class: "metadata__item" %>
99
119
 
100
- <% fingerprint_id = dom_id(@proposal, :fingerprint_dialog) %>
101
- <%= content_tag :li, class: "metadata__item" do %>
102
- <%= content_tag :button, t("decidim.fingerprint.check"), data: { dialog_open: fingerprint_id } %>
103
- <% end %>
120
+ <% fingerprint_id = dom_id(@proposal, :fingerprint_dialog) %>
121
+ <%= content_tag :li, class: "metadata__item" do %>
122
+ <%= content_tag :button, t("decidim.fingerprint.check"), data: { dialog_open: fingerprint_id } %>
123
+ <% end %>
104
124
  </ul>
105
125
  <%= decidim_modal id: fingerprint_id, class: "fingerprint-modal" do %>
106
126
  <div data-dialog-container>
@@ -5,7 +5,6 @@ ar:
5
5
  collaborative_draft:
6
6
  address: عنوان
7
7
  body: الجسم
8
- category_id: الفئة
9
8
  decidim_scope_id: نطاق
10
9
  has_address: لديه عنوان
11
10
  scope_id: نطاق
@@ -20,7 +19,6 @@ ar:
20
19
  answered_at: أجاب في
21
20
  automatic_hashtags: علامات التصنيف المضافة تلقائيًا
22
21
  body: الجسم
23
- category_id: الفئة
24
22
  decidim_scope_id: النطاق
25
23
  has_address: لديه عنوان
26
24
  latitude: خط العرض
@@ -72,8 +70,6 @@ ar:
72
70
  base:
73
71
  not_official: غير رسمية
74
72
  models:
75
- decidim/proposals/admin/update_proposal_category_event: تم تغيير فئة الاقتراح
76
- decidim/proposals/admin/update_proposal_scope_event: تم تغيير نطاق الاقتراح
77
73
  decidim/proposals/creation_enabled_event: تمكين إنشاء الاقتراح
78
74
  decidim/proposals/endorsing_enabled_event: تمكين اقتراح الاقتراح
79
75
  decidim/proposals/proposal_mentioned_event: الاقتراح المذكور
@@ -106,15 +102,11 @@ ar:
106
102
  admin:
107
103
  filters:
108
104
  proposals:
109
- category_id_eq:
110
- label: الفئة
111
105
  is_emendation_true:
112
106
  label: النوع
113
107
  values:
114
108
  'false': اقتراحات
115
109
  'true': تعديلات
116
- scope_id_eq:
117
- label: نطاق
118
110
  state_eq:
119
111
  label: الحالة
120
112
  values:
@@ -133,7 +125,6 @@ ar:
133
125
  actions:
134
126
  amend: تعديل
135
127
  comment: تعليق
136
- create: إنشاء
137
128
  endorse: تأييد
138
129
  vote: تصويت
139
130
  vote_comment: التصويت على التعليق
@@ -157,7 +148,6 @@ ar:
157
148
  random: عشوائي
158
149
  recent: الأخيرة
159
150
  with_more_authors: مع المزيد من المؤلفين
160
- geocoding_enabled: تم تمكين الترميز الجغرافي
161
151
  new_proposal_body_template: نموذج جديد لمحتوى المُقتَرَح
162
152
  new_proposal_body_template_help: يمكنكم تعريف النص المعبأ مسبقاً الذي سيدرج في المقترحات الجديدة
163
153
  new_proposal_help_text: نص مساعدة اقتراح جديد
@@ -165,7 +155,6 @@ ar:
165
155
  participatory_texts_enabled: تم تمكين النصوص التشاركية
166
156
  participatory_texts_enabled_readonly: لا يمكن التفاعل مع هذا الإعداد إذا كانت هناك اقتراحات موجودة. الرجاء إنشاء "مكون مقترحات" جديد إذا كنت ترغب في تمكين هذه الميزة أو تجاهل كافة المقترحات المستوردة في قائمة "النصوص التشاركية" إذا كنت ترغب في تعطيلها.
167
157
  proposal_answering_enabled: تم تمكين الرد على الاقتراح
168
- proposal_edit_before_minutes: يمكن تحرير المقترحات من قبل المؤلفين قبل مرور عدة دقائق
169
158
  proposal_edit_time: تحرير المقترح
170
159
  proposal_edit_time_choices:
171
160
  infinite: السماح بتعديل المقترحات لفترة زمنية غير محدودة
@@ -174,8 +163,6 @@ ar:
174
163
  proposal_limit: حد الاقتراح لكل مشارك
175
164
  proposal_wizard_step_1_help_text: اقتراح الاقتراح "إنشاء" نص مساعدة الخطوة
176
165
  resources_permissions_enabled: يمكن تعيين أذونات الإجراءات لكل اقتراح
177
- scope_id: نطاق
178
- scopes_enabled: النطاقات مفعلة
179
166
  threshold_per_proposal: عتبة لكل اقتراح
180
167
  step:
181
168
  amendment_creation_enabled: إنشاء التعديلات مُفعّلة
@@ -266,22 +253,14 @@ ar:
266
253
  email_intro: تمت إضافة الاقتراح "%{resource_title}" إلى "%{participatory_space_title}" الذي تتابعه.
267
254
  email_outro: لقد تلقيت هذا الإشعار لأنك تتابع "%{participatory_space_title}". يمكنك إيقاف تلقي الإخطارات باتباع الرابط السابق.
268
255
  email_subject: تمت إضافة اقتراح جديد "%{resource_title}" إلى %{participatory_space_title}
269
- proposal_update_category:
270
- email_intro: 'قام المشرف بتحديث فئة اقتراحك "%{resource_title}" ، تحقق من ذلك في هذه الصفحة:'
271
- email_subject: تم تحديث فئة %{resource_title} اقتراح
272
- notification_title: تم تحديث فئة اقتراح <a href="%{resource_path}">%{resource_title}</a> بواسطة مسؤول.
273
- proposal_update_scope:
274
- email_intro: 'قام مدير بتحديث نطاق اقتراحك "%{resource_title}" ، يرجى التحقق منه على هذه الصفحة:'
275
- email_subject: تم تحديث نطاق الاقتراح %{resource_title}
276
- notification_title: نطاق الاقتراح <a href="%{resource_path}">%{resource_title}</a> تم تحديثه من قبل مدير.
277
256
  voting_enabled:
278
257
  email_outro: لقد تلقيت هذا الإشعار لأنك تتابع %{participatory_space_title}. يمكنك إيقاف تلقي الإخطارات باتباع الرابط السابق.
279
258
  gamification:
280
259
  badges:
281
260
  accepted_proposals:
282
261
  conditions:
283
- - اختر مساحة المشاركة التي تهمك مع تمكين تقديم المقترحات
284
- - حاول تقديم مقترحات يمكن تنفيذها. بهذه الطريقة هم أكثر عرضة للقبول.
262
+ - اختر مساحة المشاركة التي تهمك مع تمكين تقديم المقترحات
263
+ - حاول تقديم مقترحات يمكن تنفيذها. بهذه الطريقة هم أكثر عرضة للقبول.
285
264
  description: تُمنح هذه الشارة عندما تشارك بفعالية في المقترحات الجديدة ويتم قبولها.
286
265
  description_another: هذا المشارك لديه %{score} مقترحات مقبولة.
287
266
  description_own: حصلت على %{score} مقترحات مقبولة.
@@ -291,12 +270,12 @@ ar:
291
270
  unearned_own: لم تحصل على اقتراحات مقبولة حتى الآن.
292
271
  proposal_votes:
293
272
  conditions:
294
- - تصفح وقضاء بعض الوقت في قراءة اقتراحات الآخرين
295
- -
273
+ - تصفح وقضاء بعض الوقت في قراءة اقتراحات الآخرين
274
+ -
296
275
  proposals:
297
276
  conditions:
298
- - اختر مساحة المشاركة التي تهمك مع تمكين تقديم المقترحات
299
- - إنشاء اقتراح جديد
277
+ - اختر مساحة المشاركة التي تهمك مع تمكين تقديم المقترحات
278
+ - إنشاء اقتراح جديد
300
279
  description: تُمنح هذه الشارة عندما تشارك بنشاط في مقترحات جديدة.
301
280
  description_another: قام هذا المشارك بإنشاء %{score} مقترحات.
302
281
  description_own: لقد قمت بإنشاء %{score} مقترحات.
@@ -318,7 +297,6 @@ ar:
318
297
  title: اقتراحات
319
298
  votes:
320
299
  object: أصوات
321
- title: الأصوات
322
300
  participatory_spaces:
323
301
  highlighted_proposals:
324
302
  see_all: شاهد الكل
@@ -338,22 +316,6 @@ ar:
338
316
  proposal_comments: التعليقات
339
317
  proposals: اقتراحات
340
318
  imports:
341
- help:
342
- answers: |
343
- ينبغي أن تحتوي وثيقة الاستيراد على أسماء الأعمدة التالية لدى وجود ملفات CSV أو Excel، أو الأسماء الرئيسية في حالة ملفات JSON:
344
- <ul>
345
- <li><b>معرف:</b> معرف الاقتراح من أجل الإجابة</li>
346
- <li><b>حالة:</b> اما "مقبول"، أو "قيد التقييم"، أو "مرفوض"</li>
347
- <li><b>إجابة/en:</b> الإجابة على اللغة الإنجليزية. سيعتمد هذا على إعداد لغة المنصة الخاصة بك.</li>
348
- </ul>
349
- proposals: |
350
- يجب أن يحتوي الملف على أسماء الأعمدة التالية في حالة ملفات CSV أو Excel، أو الأسماء الرئيسية في حالة ملفات JSON:
351
- <ul>
352
- <li><b>عنوان/en:</b> عنوان اللغة الإنجليزية. سيعتمد هذا على إعداد لغة المنصة الخاصة بك.</li>
353
- <li><b>نص/en:</b> نص اللغة الإنجليزية. سيعتمد هذا على إعداد لغة المنصة الخاصة بك.</li>
354
- <li><b>النطاق/المعرف:</b> معرف النطاق</li>
355
- <li><b>الفئة/المعرفة:</b> معرف الفئة</li>
356
- </ul>
357
319
  label:
358
320
  answers: استيراد إجابات من ملف
359
321
  proposals: استيراد اقتراحات من ملف
@@ -412,24 +374,19 @@ ar:
412
374
  form:
413
375
  note: ملحوظة
414
376
  submit: خضع
415
- leave_your_note: اترك ملاحظتك
416
377
  title: ملاحظات خاصة
417
378
  proposals:
418
379
  edit:
419
380
  title: تحديث الاقتراح
420
381
  update: تحديث
421
382
  form:
422
- attachment_legend: "(اختياري) إضافة مرفق"
423
383
  created_in_meeting: هذا الاقتراح يأتي من اجتماع
424
- delete_attachment: حذف المرفق
425
- select_a_category: اختر تصنيف
426
384
  select_a_meeting: اختيار اجتماع
427
385
  index:
428
386
  actions: أفعال
429
387
  assign_to_valuator: أسنِده إلى مُقيِّم
388
+ assign_to_valuator_button: تعيين
430
389
  cancel: إلغاء
431
- change_category: تغيير الفئة
432
- change_scope: تغيير النطاق
433
390
  merge: دمج في واحدة جديدة
434
391
  merge_button: دمج
435
392
  publish: نشر
@@ -440,8 +397,8 @@ ar:
440
397
  split_button: انشق، مزق
441
398
  title: اقتراحات
442
399
  unassign_from_valuator: إلغاء الإسناد مِن المُقيِّم
400
+ unassign_from_valuator_button: إلغاء الإسناد
443
401
  update: تحديث
444
- update_scope_button: تحديث النطاق
445
402
  new:
446
403
  create: إنشاء
447
404
  title: إنشاء اقتراح
@@ -466,12 +423,6 @@ ar:
466
423
  remove_assignment: إزالة التعيين
467
424
  remove_assignment_confirmation: هل أنت متأكد من أنك تريد إزالة المُقيِّم من هذا الاقتراح؟
468
425
  valuators: المُقيِّمون
469
- update_category:
470
- invalid: 'هذه الاقتراحات تحتوي بالفعل على فئة %{subject_name}: %{proposals}.'
471
- success: 'تم تحديث الاقتراحات بنجاح إلى فئة %{subject_name}: %{proposals}.'
472
- update_scope:
473
- invalid: 'تحتوي الاقتراحات مسبقاً على نطاق %{subject_name}: %{proposals}.'
474
- success: 'تم تحديث الاقتراحات بنجاح إلى نطاق %{subject_name}: %{proposals}.'
475
426
  proposals_imports:
476
427
  new:
477
428
  create: مقترحات الاستيراد
@@ -480,11 +431,9 @@ ar:
480
431
  select_states: تحقق من حالة مقترحات الاستيراد
481
432
  proposals_merges:
482
433
  create:
483
- invalid: 'طرأت مشكلة في دمج الاقتراحات المحددة لأن بعضها:'
484
434
  success: دمج المقترحات بنجاح في واحدة جديدة.
485
435
  proposals_splits:
486
436
  create:
487
- invalid: 'طرأت مشكلة في فصل الاقتراحات المحددة لأن بعضها:'
488
437
  success: تم تقسيم المقترحات بنجاح إلى مقترحات جديدة.
489
438
  admin_log:
490
439
  proposal:
@@ -537,19 +486,16 @@ ar:
537
486
  error: طرأت مشكلة خلال إنشاء هذه المسودة التعاونية.
538
487
  success: تم إنشاء مشروع تعاوني بنجاح.
539
488
  edit:
540
- attachment_legend: "(اختياري) إضافة مرفق"
489
+ attachment_legend: إضافة مستند أو صورة
541
490
  back: الى الخلف
542
- select_a_category: الرجاء تحديد الفئة
543
491
  send: إرسال
544
492
  title: تحرير المسودة التعاونية
545
493
  filters:
546
494
  all: الكل
547
495
  amendment: تعديلات
548
- category: الفئة
549
496
  open: افتح
550
497
  published: نشرت
551
498
  related_to: متعلق ب
552
- scope: نطاق
553
499
  search: بحث
554
500
  state: الحالة
555
501
  withdrawn: سحب
@@ -589,7 +535,6 @@ ar:
589
535
  rejected_request:
590
536
  error: لا يمكن الرفض كمتعاون ، يرجى المحاولة مرة أخرى لاحقًا.
591
537
  show:
592
- edit: تحرير المسودة التعاونية
593
538
  final_proposal: الاقتراح النهائي
594
539
  final_proposal_help_text: انتهى هذا المشروع. تحقق من الاقتراح النهائي
595
540
  hidden_authors_count:
@@ -628,14 +573,12 @@ ar:
628
573
  models:
629
574
  proposal:
630
575
  fields:
631
- category: الفئة
632
576
  comments: تعليقات
633
577
  id: هوية شخصية
634
578
  notes: ملاحظات
635
579
  official_proposal: الاقتراح الرسمي
636
580
  published_answer: الإجابة المنشورة
637
581
  published_at: نشرت في
638
- scope: نطاق
639
582
  state: الحالة
640
583
  title: عنوان
641
584
  valuator: مُقيِّم
@@ -651,11 +594,10 @@ ar:
651
594
  description: سيتم تحديث الإحداثيات لدى النقر على زر "السابق". غير أن العنوان لن يتغير.
652
595
  instructions: يمكنك تحريك النقطة على الخريطة.
653
596
  edit:
654
- add_documents: إضافة وثائق
655
- attachment_legend: "(اختياري) إضافة مرفق"
597
+ add_attachments: إضافة مرفقات
598
+ attachment_legend: إضافة مستند أو صورة
656
599
  back: الى الخلف
657
- edit_documents: تحرير الوثائق
658
- select_a_category: الرجاء تحديد الفئة
600
+ edit_attachments: تعديل المرفقات
659
601
  send: إرسال
660
602
  title: تعديل الاقتراح
661
603
  edit_draft:
@@ -666,7 +608,6 @@ ar:
666
608
  activity: نشاطي
667
609
  all: الكل
668
610
  amendment_type: نوع
669
- category: الفئة
670
611
  my_proposals: اقتراحاتي
671
612
  origin: الأصل
672
613
  related_to: متعلق ب
@@ -690,6 +631,7 @@ ar:
690
631
  text_banner: أنت تتطلع على قائمة الاقتراحات المسحوبة من قبل مؤلفيها. %{go_back_link}.
691
632
  new:
692
633
  send: استمر
634
+ title: إنشاء اقتراحك
693
635
  orders:
694
636
  label: 'ترتيب المقترحات حسب:'
695
637
  most_commented: الأكثر تعليقًا عليها
@@ -716,7 +658,6 @@ ar:
716
658
  show:
717
659
  answer: إجابة
718
660
  changes_at_title: تعديل على "%{title}"
719
- edit_proposal: تعديل الاقتراح
720
661
  estimated_cost: التكلفة التقديرية
721
662
  hidden_endorsers_count:
722
663
  zero: و %{count} المزيد من الناس
@@ -735,7 +676,6 @@ ar:
735
676
  proposal_in_evaluation_reason: هذا الاقتراح قيد التقييم
736
677
  proposal_rejected_reason: 'تم رفض هذا الاقتراح بسبب:'
737
678
  withdraw_confirmation_html: هل أنت متأكد من أنك تريد سحب هذا الاقتراح؟<br><br><strong>لا يمكن إلغاء هذا الإجراء!</strong>
738
- withdraw_proposal: سحب الاقتراح
739
679
  update:
740
680
  title: تحديث الإقتراح
741
681
  vote_button:
@@ -743,6 +683,8 @@ ar:
743
683
  voting_rules:
744
684
  proposal_limit:
745
685
  description: يمكنك إنشاء ما يصل إلى %{limit} مقترحات.
686
+ vote_limit:
687
+ description: يمكنك دعم ما يصل إلى %{limit} مقترحات.
746
688
  wizard_aside:
747
689
  back: الى الخلف
748
690
  back_from_step_1: العودة إلى الاقتراحات