decidim-budgets 0.27.7 → 0.28.0.rc4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/stylesheets/decidim/budgets/budget/_budget-vote-button.scss +5 -5
- data/app/cells/decidim/budgets/base_cell.rb +1 -1
- data/app/cells/decidim/budgets/budget_cell.rb +6 -1
- data/app/cells/decidim/budgets/budget_information_modal/show.erb +14 -26
- data/app/cells/decidim/budgets/budget_list_item/projects_count.erb +6 -0
- data/app/cells/decidim/budgets/budget_list_item/show.erb +35 -30
- data/app/cells/decidim/budgets/budget_list_item/vote_action.erb +13 -0
- data/app/cells/decidim/budgets/budget_list_item_cell.rb +24 -1
- data/app/cells/decidim/budgets/budget_metadata_cell.rb +29 -0
- data/app/cells/decidim/budgets/budget_s_cell.rb +15 -0
- data/app/cells/decidim/budgets/budgets_header/show.erb +2 -6
- data/app/cells/decidim/budgets/budgets_list/card_list.erb +8 -13
- data/app/cells/decidim/budgets/budgets_list/main_list.erb +5 -0
- data/app/cells/decidim/budgets/budgets_list/show.erb +12 -16
- data/app/cells/decidim/budgets/budgets_list/voted.erb +8 -44
- data/app/cells/decidim/budgets/budgets_list_cell.rb +34 -0
- data/app/cells/decidim/budgets/limit_announcement/show.erb +3 -0
- data/app/cells/decidim/budgets/limit_announcement_cell.rb +2 -2
- data/app/cells/decidim/budgets/order_activity_cell.rb +1 -4
- data/app/cells/decidim/budgets/project_cell.rb +6 -1
- data/app/cells/decidim/budgets/project_l/extra_data.erb +6 -0
- data/app/cells/decidim/budgets/project_l/metadata.erb +4 -0
- data/app/cells/decidim/budgets/project_l_cell.rb +38 -0
- data/app/cells/decidim/budgets/project_metadata_cell.rb +78 -0
- data/app/cells/decidim/budgets/project_s_cell.rb +21 -0
- data/app/cells/decidim/budgets/project_tags/show.erb +1 -0
- data/app/cells/decidim/budgets/project_vote_button/show.erb +21 -15
- data/app/cells/decidim/budgets/project_vote_button_cell.rb +69 -1
- data/app/cells/decidim/budgets/project_voted_hint_cell.rb +1 -1
- data/app/cells/decidim/budgets/project_votes_count_cell.rb +9 -8
- data/app/commands/decidim/budgets/admin/create_project.rb +0 -1
- data/app/commands/decidim/budgets/admin/import_proposals_to_budgets.rb +1 -1
- data/app/commands/decidim/budgets/admin/update_project.rb +1 -2
- data/app/commands/decidim/budgets/admin/update_project_scope.rb +1 -1
- data/app/commands/decidim/budgets/admin/update_project_selection.rb +1 -1
- data/app/commands/decidim/budgets/admin/update_projects_budget.rb +57 -0
- data/app/controllers/concerns/decidim/budgets/admin/filterable.rb +1 -1
- data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +2 -2
- data/app/controllers/decidim/budgets/admin/budgets_controller.rb +5 -5
- data/app/controllers/decidim/budgets/admin/projects_controller.rb +52 -10
- data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +1 -1
- data/app/controllers/decidim/budgets/application_controller.rb +0 -4
- data/app/controllers/decidim/budgets/budgets_controller.rb +9 -0
- data/app/controllers/decidim/budgets/line_items_controller.rb +10 -16
- data/app/controllers/decidim/budgets/orders_controller.rb +7 -2
- data/app/controllers/decidim/budgets/projects_controller.rb +51 -4
- data/app/forms/decidim/budgets/admin/project_form.rb +1 -1
- data/app/helpers/decidim/budgets/application_helper.rb +4 -0
- data/app/helpers/decidim/budgets/projects_helper.rb +89 -33
- data/app/jobs/decidim/budgets/send_vote_reminder_job.rb +1 -1
- data/app/mailers/decidim/budgets/order_summary_mailer.rb +1 -1
- data/app/mailers/decidim/budgets/vote_reminder_mailer.rb +1 -1
- data/app/models/decidim/budgets/budget.rb +1 -0
- data/app/models/decidim/budgets/project.rb +17 -7
- data/app/packs/entrypoints/decidim_budgets.js +2 -0
- data/app/packs/src/decidim/budgets/exit_handler.js +11 -8
- data/app/packs/src/decidim/budgets/progressFixed.js +25 -11
- data/app/packs/src/decidim/budgets/projects.js +15 -10
- data/app/packs/stylesheets/budgets.scss +273 -0
- data/app/presenters/decidim/budgets/admin_log/budget_presenter.rb +2 -2
- data/app/presenters/decidim/budgets/admin_log/project_presenter.rb +2 -2
- data/app/services/decidim/budgets/order_reminder_generator.rb +4 -4
- data/app/views/decidim/budgets/admin/budgets/_form.html.erb +17 -12
- data/app/views/decidim/budgets/admin/budgets/edit.html.erb +16 -6
- data/app/views/decidim/budgets/admin/budgets/index.html.erb +58 -64
- data/app/views/decidim/budgets/admin/budgets/new.html.erb +16 -6
- data/app/views/decidim/budgets/admin/projects/_bulk-actions.html.erb +19 -10
- data/app/views/decidim/budgets/admin/projects/_form.html.erb +31 -35
- data/app/views/decidim/budgets/admin/projects/_project-tr.html.erb +15 -13
- data/app/views/decidim/budgets/admin/projects/bulk_actions/_budget-change.html.erb +22 -0
- data/app/views/decidim/budgets/admin/projects/bulk_actions/_change-selected.html.erb +3 -3
- data/app/views/decidim/budgets/admin/projects/bulk_actions/_dropdown.html.erb +8 -2
- data/app/views/decidim/budgets/admin/projects/bulk_actions/_recategorize.html.erb +3 -3
- data/app/views/decidim/budgets/admin/projects/bulk_actions/_scope-change.html.erb +5 -8
- data/app/views/decidim/budgets/admin/projects/edit.html.erb +16 -6
- data/app/views/decidim/budgets/admin/projects/index.html.erb +26 -31
- data/app/views/decidim/budgets/admin/projects/new.html.erb +16 -6
- data/app/views/decidim/budgets/admin/projects/update_attribute.js.erb +8 -4
- data/app/views/decidim/budgets/admin/proposals_imports/new.html.erb +40 -28
- data/app/views/decidim/budgets/budgets/index.html.erb +21 -3
- data/app/views/decidim/budgets/budgets/index.js.erb +6 -0
- data/app/views/decidim/budgets/line_items/update_budget.js.erb +21 -11
- data/app/views/decidim/budgets/projects/_addition_selector.html.erb +16 -0
- data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +42 -31
- data/app/views/decidim/budgets/projects/_budget_excess.html.erb +12 -12
- data/app/views/decidim/budgets/projects/_budget_summary.html.erb +2 -75
- data/app/views/decidim/budgets/projects/_exit_modal.html.erb +15 -18
- data/app/views/decidim/budgets/projects/_linked_projects.html.erb +3 -12
- data/app/views/decidim/budgets/projects/_order.html.erb +1 -0
- data/app/views/decidim/budgets/projects/_order_progress_progressbar_marks_right.html.erb +10 -0
- data/app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb +113 -0
- data/app/views/decidim/budgets/projects/_order_total_budget.html.erb +6 -7
- data/app/views/decidim/budgets/projects/_project.html.erb +2 -1
- data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +11 -19
- data/app/views/decidim/budgets/projects/_projects.html.erb +8 -6
- data/app/views/decidim/budgets/projects/_projects_count.html.erb +5 -0
- data/app/views/decidim/budgets/projects/_projects_list.html.erb +3 -0
- data/app/views/decidim/budgets/projects/index.html.erb +58 -55
- data/app/views/decidim/budgets/projects/index.js.erb +5 -4
- data/app/views/decidim/budgets/projects/show.html.erb +78 -51
- data/config/assets.rb +0 -1
- data/config/locales/ar.yml +0 -50
- data/config/locales/bg.yml +0 -381
- data/config/locales/ca.yml +75 -84
- data/config/locales/cs.yml +73 -82
- data/config/locales/de.yml +76 -85
- data/config/locales/el.yml +34 -72
- data/config/locales/en.yml +79 -88
- data/config/locales/es-MX.yml +73 -82
- data/config/locales/es-PY.yml +73 -82
- data/config/locales/es.yml +75 -84
- data/config/locales/eu.yml +74 -86
- data/config/locales/fi-plain.yml +75 -84
- data/config/locales/fi.yml +78 -87
- data/config/locales/fr-CA.yml +74 -86
- data/config/locales/fr.yml +78 -90
- data/config/locales/ga-IE.yml +0 -12
- data/config/locales/gl.yml +0 -58
- data/config/locales/hu.yml +58 -81
- data/config/locales/id-ID.yml +0 -38
- data/config/locales/is-IS.yml +0 -22
- data/config/locales/it.yml +0 -84
- data/config/locales/ja.yml +69 -81
- data/config/locales/ko.yml +0 -54
- data/config/locales/lb.yml +0 -85
- data/config/locales/lt.yml +59 -82
- data/config/locales/lv.yml +0 -44
- data/config/locales/nl.yml +0 -96
- data/config/locales/no.yml +0 -84
- data/config/locales/pl.yml +0 -162
- data/config/locales/pt-BR.yml +9 -141
- data/config/locales/pt.yml +0 -85
- data/config/locales/ro-RO.yml +0 -95
- data/config/locales/ru.yml +0 -41
- data/config/locales/sk.yml +0 -44
- data/config/locales/sq-AL.yml +0 -52
- data/config/locales/sr-CS.yml +0 -4
- data/config/locales/sv.yml +9 -89
- data/config/locales/tr-TR.yml +2 -82
- data/config/locales/uk.yml +0 -41
- data/config/locales/zh-CN.yml +0 -65
- data/config/locales/zh-TW.yml +13 -59
- data/lib/decidim/budgets/admin_engine.rb +3 -2
- data/lib/decidim/budgets/component.rb +4 -90
- data/lib/decidim/budgets/engine.rb +30 -10
- data/lib/decidim/budgets/project_serializer.rb +3 -3
- data/lib/decidim/budgets/seeds.rb +69 -0
- data/lib/decidim/budgets/test/factories.rb +23 -37
- data/lib/decidim/budgets/version.rb +1 -1
- data/lib/decidim/budgets/workflows/base.rb +1 -1
- metadata +46 -42
- data/app/cells/decidim/budgets/budget_m/data.erb +0 -12
- data/app/cells/decidim/budgets/budget_m/footer.erb +0 -5
- data/app/cells/decidim/budgets/budget_m_cell.rb +0 -16
- data/app/cells/decidim/budgets/project_list_item/project_data.erb +0 -19
- data/app/cells/decidim/budgets/project_list_item/project_image.erb +0 -5
- data/app/cells/decidim/budgets/project_list_item/project_text.erb +0 -23
- data/app/cells/decidim/budgets/project_list_item/show.erb +0 -5
- data/app/cells/decidim/budgets/project_list_item_cell.rb +0 -70
- data/app/cells/decidim/budgets/project_m/data.erb +0 -12
- data/app/cells/decidim/budgets/project_m/footer.erb +0 -5
- data/app/cells/decidim/budgets/project_m_cell.rb +0 -22
- data/app/packs/stylesheets/decidim/budgets/_budgets.scss +0 -3
- data/app/packs/stylesheets/decidim/budgets/budget/_budget-list.scss +0 -198
- data/app/packs/stylesheets/decidim/budgets/budget/_budget-meter.scss +0 -83
- data/app/packs/stylesheets/decidim/budgets/budget/_progress.scss +0 -19
- data/app/views/decidim/budgets/admin/projects/proposals_picker.html.erb +0 -1
- data/app/views/decidim/budgets/projects/_filters.html.erb +0 -30
- data/app/views/decidim/budgets/projects/_filters_small_view.html.erb +0 -18
- data/app/views/decidim/budgets/projects/_order_progress.html.erb +0 -32
- data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +0 -27
- data/config/locales/he-IL.yml +0 -1
- data/decidim-budgets.gemspec +0 -34
- data/lib/decidim/budgets/seeds/city.jpeg +0 -0
data/config/locales/zh-TW.yml
CHANGED
@@ -45,14 +45,13 @@ zh-TW:
|
|
45
45
|
edit: 編輯
|
46
46
|
edit_projects: 管理專案
|
47
47
|
import: 將提案匯入專案
|
48
|
-
new: 新增 %{name}
|
49
48
|
preview: 預覽
|
50
49
|
send_voting_reminders: 發送投票提醒
|
51
50
|
title: 操作
|
52
51
|
admin:
|
53
52
|
budgets:
|
54
53
|
create:
|
55
|
-
invalid:
|
54
|
+
invalid: 建立預算時發生問題。
|
56
55
|
success: 預算已成功建立
|
57
56
|
destroy:
|
58
57
|
invalid: 刪除此預算時出現問題
|
@@ -107,10 +106,10 @@ zh-TW:
|
|
107
106
|
title: 新專案
|
108
107
|
update:
|
109
108
|
invalid: 更新此專案時出現問題
|
110
|
-
success:
|
109
|
+
success: 專案更新成功。
|
111
110
|
update_category:
|
112
111
|
invalid: '這些專案已經擁有了 %{subject_name} 類別: %{projects}'
|
113
|
-
select_a_category:
|
112
|
+
select_a_category: 請選擇一個類別。
|
114
113
|
select_a_project: 請選擇一個專案
|
115
114
|
success: '已成功將以下專案更新至 %{subject_name} 類別: %{projects}。'
|
116
115
|
update_scope:
|
@@ -129,8 +128,8 @@ zh-TW:
|
|
129
128
|
unselected: '這些專案已經成功從實施中取消選擇: %{projects}。'
|
130
129
|
proposals_imports:
|
131
130
|
create:
|
132
|
-
invalid:
|
133
|
-
success: "%{number}
|
131
|
+
invalid: 將提案匯入專案時出現問題。
|
132
|
+
success: "%{number} 個提案已成功匯入專案。"
|
134
133
|
new:
|
135
134
|
create: 將提案匯入專案
|
136
135
|
default_budget: 預設預算
|
@@ -138,7 +137,6 @@ zh-TW:
|
|
138
137
|
no_components: 在此參與空間中沒有其他提案元件可以將提案匯入到專案中。
|
139
138
|
origin_component_id: 原始元件
|
140
139
|
select_component: 請選擇一個組件
|
141
|
-
title: 導入提案
|
142
140
|
reminders:
|
143
141
|
orders:
|
144
142
|
description: 使用者將會收到一封電子郵件,內含連結至他們有待處理訂單的預算。
|
@@ -153,16 +151,11 @@ zh-TW:
|
|
153
151
|
create: "%{user_name} 在 %{space_name} 空間中創建了 %{resource_name} 專案"
|
154
152
|
delete: "%{user_name} 刪除了 %{space_name} 空間中的 %{resource_name} 專案。"
|
155
153
|
update: "%{user_name} 更新了 %{space_name} 空間中的 %{resource_name} 專案。"
|
156
|
-
budget:
|
157
|
-
view: 查看所有預算專案
|
158
154
|
budget_information_modal:
|
159
155
|
back_to: 返回 %{component_name}
|
160
156
|
close_modal: 關閉視窗
|
161
157
|
continue: 繼續
|
162
158
|
more_information: 更多資訊
|
163
|
-
budget_list_item:
|
164
|
-
voting_finished: 您已在此預算中投票
|
165
|
-
voting_started: 你已經開始在這個預算中投票了
|
166
159
|
budgets_list:
|
167
160
|
cancel_order:
|
168
161
|
more_than_one: 刪除您對於 %{name} 的投票並重新開始
|
@@ -170,13 +163,12 @@ zh-TW:
|
|
170
163
|
finished_message: 您已完成投票流程。感謝您的參與!
|
171
164
|
highlighted_cta: 在 %{name} 上投票
|
172
165
|
if_change_opinion: 如果您改變了主意,您可以
|
173
|
-
my_budgets: 我的預算
|
174
166
|
progress: 完成投票
|
175
167
|
show: 檢視專案
|
176
168
|
vote: 投票
|
177
|
-
voted_on: 你已經對 %{links}
|
169
|
+
voted_on: 你已經對 %{links} 投票。
|
178
170
|
last_activity:
|
179
|
-
|
171
|
+
new_vote_at: 新預算投票於
|
180
172
|
limit_announcement:
|
181
173
|
cant_vote: 你無法在這個預算中進行投票。<a href="%{landing_path}">嘗試在其他預算中投票</a>。
|
182
174
|
limit_reached: 您在 %{links} 上有進行中的投票。若要對此預算進行投票,您必須<a href="%{landing_path}">刪除您目前的投票並重新開始</a>。
|
@@ -190,7 +182,6 @@ zh-TW:
|
|
190
182
|
fields:
|
191
183
|
category: 類別
|
192
184
|
id: ID
|
193
|
-
scope: 範圍
|
194
185
|
title: 標題
|
195
186
|
order_summary_mailer:
|
196
187
|
order_summary:
|
@@ -209,7 +200,6 @@ zh-TW:
|
|
209
200
|
budget_excess:
|
210
201
|
description: 這個專案超出了預算上限,無法被加入。如果您願意,您可以刪除您已經選擇的一個專案,以便能夠根據您的偏好再次進行投票。
|
211
202
|
title: 已超過最高預算
|
212
|
-
close: 關閉
|
213
203
|
description: 這個專案超出了預算上限,無法被加入。如果您願意,您可以刪除您已經選擇的一個專案,以便能夠根據您的偏好再次進行投票。
|
214
204
|
ok: 好的
|
215
205
|
projects_excess:
|
@@ -217,34 +207,15 @@ zh-TW:
|
|
217
207
|
title: 超過最大專案數量
|
218
208
|
budget_summary:
|
219
209
|
are_you_sure: 您確定要取消您的投票嗎?
|
220
|
-
assigned: '已指派:'
|
221
210
|
cancel_order: 刪除你的投票並重新開始
|
222
211
|
checked_out:
|
223
212
|
description: 你已經對預算表決投票了。如果你改變了主意,你可以%{cancel_link}。
|
224
213
|
title: 預算投票完成
|
225
|
-
minimum_projects_rule:
|
226
|
-
description: 您認為我們應該撥款給哪些專案?請選擇至少 %{minimum_number} 個您想要的專案,並根據您的偏好進行投票,以定義預算。
|
227
|
-
instruction: "<li>請選擇至少 %{minimum_number} 個您認為應該分配預算的項目,並根據您的喜好進行投票以定義預算。</li>"
|
228
|
-
projects_rule:
|
229
|
-
description: 你認為我們應該為哪些專案分配預算?請至少選擇 %{minimum_number} 個專案,最多可選擇 %{maximum_number} 個項目,並根據你的喜好投票以定義預算。
|
230
|
-
instruction: "<li>請至少選擇 %{minimum_number} 個至多 %{maximum_number} 個您想要的項專案,並根據您的喜好進行投票以定義預算。</li>"
|
231
|
-
projects_rule_maximum_only:
|
232
|
-
description: 你認為我們應該為哪些專案分配預算?請選擇最多 %{maximum_number} 個專案,根據你的喜好進行投票,來定義預算。
|
233
|
-
instruction: "\"<li>選擇最多 %{maximum_number} 個您想為其分配預算的專案,並根據您的喜好進行投票,以定義預算。</li>"
|
234
|
-
rules:
|
235
|
-
title: 預算規則
|
236
|
-
title: 你決定預算
|
237
|
-
total_budget: 總預算
|
238
|
-
total_projects: 總票數
|
239
|
-
vote_threshold_percent_rule:
|
240
|
-
description: 您覺得我們應該為哪些專案分配預算?為您想要的專案分配至少 %{minimum_budget} 的預算,並按照您的喜好進行投票以定義預算。
|
241
|
-
instruction: "\"<li>指派至少 %{minimum_budget} 的預算給您想支持的專案,然後根據您的喜好進行投票以制定預算。</li>"
|
242
214
|
count:
|
243
215
|
projects_count:
|
244
216
|
other: "%{count} 專案"
|
245
217
|
exit_modal:
|
246
218
|
cancel: 返回投票
|
247
|
-
close_modal: 關閉視窗
|
248
219
|
exit: 退出投票
|
249
220
|
message: 您的投票尚未被註冊,因為您尚未完成投票程序。您確定要退出投票嗎?
|
250
221
|
title: 您尚未投票
|
@@ -257,20 +228,6 @@ zh-TW:
|
|
257
228
|
all: 全部
|
258
229
|
not_selected: 未選擇
|
259
230
|
selected: 已選取
|
260
|
-
filters_small_view:
|
261
|
-
close_modal: 關閉視窗
|
262
|
-
filter: 篩選
|
263
|
-
filter_by: 篩選條件
|
264
|
-
unfold: 展開
|
265
|
-
index:
|
266
|
-
view_project: 檢視專案
|
267
|
-
order_progress:
|
268
|
-
vote: 投票
|
269
|
-
order_selected_projects:
|
270
|
-
remove: 移除
|
271
|
-
selected_projects:
|
272
|
-
other: 已選擇的專案
|
273
|
-
view: 檢視
|
274
231
|
orders:
|
275
232
|
highest_cost: 最高成本
|
276
233
|
label: 專案排序方式
|
@@ -279,22 +236,20 @@ zh-TW:
|
|
279
236
|
random: 隨機順序
|
280
237
|
selected: 已選取
|
281
238
|
project:
|
282
|
-
add: 將專案 %{resource_name}
|
283
|
-
remove: 從您的投票中移除專案 %{resource_name}
|
239
|
+
add: 將專案 %{resource_name} 添加到您的投票中。
|
240
|
+
remove: 從您的投票中移除專案 %{resource_name}。
|
284
241
|
selected: 已選取
|
285
|
-
view: 檢視
|
286
242
|
votes:
|
287
243
|
other: 投票
|
288
244
|
you_voted: 你已投票支持此
|
289
245
|
project_budget_button:
|
290
246
|
add: 加入您的投票
|
291
|
-
add_descriptive: 將專案 %{resource_name}
|
247
|
+
add_descriptive: 將專案 %{resource_name} 加入您的投票。
|
292
248
|
added: 加入您的投票
|
293
|
-
added_descriptive: 將專案 %{resource_name}
|
249
|
+
added_descriptive: 將專案 %{resource_name} 加入您的投票。
|
294
250
|
projects_for: 專案 %{name}
|
295
251
|
show:
|
296
252
|
budget: 預算
|
297
|
-
view_all_projects: 檢視所有專案
|
298
253
|
vote_reminder_mailer:
|
299
254
|
vote_reminder:
|
300
255
|
email_budgets: '您有尚未完成投票的領域:'
|
@@ -316,7 +271,7 @@ zh-TW:
|
|
316
271
|
comments_max_length: 評論字數最大長度(若要使用預設值請輸入0)
|
317
272
|
form:
|
318
273
|
errors:
|
319
|
-
budget_voting_rule_only_one:
|
274
|
+
budget_voting_rule_only_one: 僅能啟用一個投票規則。
|
320
275
|
budget_voting_rule_required: 必須啟用一種投票規則
|
321
276
|
geocoding_enabled: 地理編碼已啟用
|
322
277
|
landing_page_content: 預算網頁首頁
|
@@ -362,10 +317,9 @@ zh-TW:
|
|
362
317
|
orders:
|
363
318
|
checkout:
|
364
319
|
error: 處理您的投票時出現問題。
|
365
|
-
success: 您的投票已成功接受
|
366
320
|
destroy:
|
367
321
|
error: 取消您的投票時出現問題
|
368
|
-
success:
|
322
|
+
success: 您的投票已成功取消。
|
369
323
|
resource_links:
|
370
324
|
included_proposals:
|
371
325
|
project_proposal: 此專案中包括的提案
|
@@ -18,6 +18,7 @@ module Decidim
|
|
18
18
|
post :update_category
|
19
19
|
post :update_scope
|
20
20
|
post :update_selected
|
21
|
+
post :update_budget
|
21
22
|
resource :proposals_import, only: [:new, :create]
|
22
23
|
end
|
23
24
|
end
|
@@ -26,8 +27,8 @@ module Decidim
|
|
26
27
|
resources :projects, exclude: [:index, :new, :create, :edit, :update, :destroy] do
|
27
28
|
get :proposals_picker, on: :collection
|
28
29
|
|
29
|
-
resources :attachment_collections
|
30
|
-
resources :attachments
|
30
|
+
resources :attachment_collections, except: [:show]
|
31
|
+
resources :attachments, except: [:show]
|
31
32
|
end
|
32
33
|
|
33
34
|
root to: "budgets#index"
|
@@ -1,11 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "decidim/components/namer"
|
4
|
-
|
5
3
|
Decidim.register_component(:budgets) do |component|
|
6
4
|
component.engine = Decidim::Budgets::Engine
|
7
5
|
component.admin_engine = Decidim::Budgets::AdminEngine
|
8
6
|
component.icon = "media/images/decidim_budgets.svg"
|
7
|
+
component.icon_key = "coin-line"
|
9
8
|
component.stylesheet = "decidim/budgets/budgets"
|
10
9
|
component.permissions_class_name = "Decidim::Budgets::Permissions"
|
11
10
|
component.component_form_class_name = "Decidim::Budgets::Admin::ComponentForm"
|
@@ -19,7 +18,7 @@ Decidim.register_component(:budgets) do |component|
|
|
19
18
|
component.actions = %w(vote comment)
|
20
19
|
|
21
20
|
component.on(:before_destroy) do |instance|
|
22
|
-
raise StandardError, "
|
21
|
+
raise StandardError, "Cannot remove this component" if Decidim::Budgets::Budget.where(component: instance).any?
|
23
22
|
end
|
24
23
|
|
25
24
|
component.register_resource(:budget) do |resource|
|
@@ -110,93 +109,8 @@ Decidim.register_component(:budgets) do |component|
|
|
110
109
|
end
|
111
110
|
|
112
111
|
component.seeds do |participatory_space|
|
113
|
-
|
114
|
-
"<h2>#{::Faker::Lorem.sentence}</h2>" \
|
115
|
-
"<p>#{::Faker::Lorem.paragraph}</p>" \
|
116
|
-
"<p>#{::Faker::Lorem.paragraph}</p>"
|
117
|
-
end
|
112
|
+
require "decidim/budgets/seeds"
|
118
113
|
|
119
|
-
|
120
|
-
name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name,
|
121
|
-
manifest_name: :budgets,
|
122
|
-
published_at: Time.current,
|
123
|
-
participatory_space: participatory_space,
|
124
|
-
settings: {
|
125
|
-
landing_page_content: landing_page_content,
|
126
|
-
more_information_modal: Decidim::Faker::Localized.paragraph(sentence_count: 4),
|
127
|
-
workflow: Decidim::Budgets.workflows.keys.sample
|
128
|
-
}
|
129
|
-
)
|
130
|
-
|
131
|
-
rand(1...3).times do
|
132
|
-
Decidim::Budgets::Budget.create!(
|
133
|
-
component: component,
|
134
|
-
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
135
|
-
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
136
|
-
Decidim::Faker::Localized.paragraph(sentence_count: 3)
|
137
|
-
end,
|
138
|
-
total_budget: Faker::Number.number(digits: 8)
|
139
|
-
)
|
140
|
-
end
|
141
|
-
|
142
|
-
Decidim::Budgets::Budget.where(component: component).each do |budget|
|
143
|
-
rand(2...4).times do
|
144
|
-
project = Decidim::Budgets::Project.create!(
|
145
|
-
budget: budget,
|
146
|
-
scope: participatory_space.organization.scopes.sample,
|
147
|
-
category: participatory_space.categories.sample,
|
148
|
-
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
149
|
-
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
150
|
-
Decidim::Faker::Localized.paragraph(sentence_count: 3)
|
151
|
-
end,
|
152
|
-
budget_amount: Faker::Number.between(from: Integer(budget.total_budget * 0.7), to: budget.total_budget)
|
153
|
-
)
|
154
|
-
|
155
|
-
attachment_collection = Decidim::AttachmentCollection.create!(
|
156
|
-
name: Decidim::Faker::Localized.word,
|
157
|
-
description: Decidim::Faker::Localized.sentence(word_count: 5),
|
158
|
-
collection_for: project
|
159
|
-
)
|
160
|
-
|
161
|
-
Decidim::Attachment.create!(
|
162
|
-
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
163
|
-
description: Decidim::Faker::Localized.sentence(word_count: 5),
|
164
|
-
attachment_collection: attachment_collection,
|
165
|
-
attached_to: project,
|
166
|
-
content_type: "application/pdf",
|
167
|
-
file: ActiveStorage::Blob.create_and_upload!(
|
168
|
-
io: File.open(File.join(__dir__, "seeds", "Exampledocument.pdf")),
|
169
|
-
filename: "Exampledocument.pdf",
|
170
|
-
content_type: "application/pdf",
|
171
|
-
metadata: nil
|
172
|
-
)
|
173
|
-
)
|
174
|
-
Decidim::Attachment.create!(
|
175
|
-
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
176
|
-
description: Decidim::Faker::Localized.sentence(word_count: 5),
|
177
|
-
attached_to: project,
|
178
|
-
content_type: "image/jpeg",
|
179
|
-
file: ActiveStorage::Blob.create_and_upload!(
|
180
|
-
io: File.open(File.join(__dir__, "seeds", "city.jpeg")),
|
181
|
-
filename: "city.jpeg",
|
182
|
-
content_type: "image/jpeg",
|
183
|
-
metadata: nil
|
184
|
-
)
|
185
|
-
)
|
186
|
-
Decidim::Attachment.create!(
|
187
|
-
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
188
|
-
description: Decidim::Faker::Localized.sentence(word_count: 5),
|
189
|
-
attached_to: project,
|
190
|
-
content_type: "application/pdf",
|
191
|
-
file: ActiveStorage::Blob.create_and_upload!(
|
192
|
-
io: File.open(File.join(__dir__, "seeds", "Exampledocument.pdf")),
|
193
|
-
filename: "Exampledocument.pdf",
|
194
|
-
content_type: "application/pdf",
|
195
|
-
metadata: nil
|
196
|
-
)
|
197
|
-
)
|
198
|
-
Decidim::Comments::Seed.comments_for(project)
|
199
|
-
end
|
200
|
-
end
|
114
|
+
Decidim::Budgets::Seeds.new(participatory_space:).call
|
201
115
|
end
|
202
116
|
end
|
@@ -20,8 +20,18 @@ module Decidim
|
|
20
20
|
resource :line_item, only: [:create, :destroy]
|
21
21
|
end
|
22
22
|
end
|
23
|
+
scope "/budgets" do
|
24
|
+
root to: "budgets#index"
|
25
|
+
end
|
26
|
+
get "/", to: redirect("budgets", status: 301)
|
27
|
+
end
|
23
28
|
|
24
|
-
|
29
|
+
initializer "decidim_budgets.register_icons" do
|
30
|
+
Decidim.icons.register(name: "Decidim::Budgets::Budget", icon: "coin-line", description: "Budget", category: "activity", engine: :budgets)
|
31
|
+
Decidim.icons.register(name: "Decidim::Budgets::Project", icon: "coin-line", description: "Project (Budgets)", category: "activity", engine: :budgets)
|
32
|
+
Decidim.icons.register(name: "Decidim::Budgets::Order", icon: "check-double-fill", description: "Budget voting", category: "activity", engine: :budgets)
|
33
|
+
|
34
|
+
Decidim.icons.register(name: "git-pull-request-line", icon: "git-pull-request-line", category: "system", description: "", engine: :budgets)
|
25
35
|
end
|
26
36
|
|
27
37
|
initializer "decidim_budgets.add_cells_view_paths" do
|
@@ -44,18 +54,28 @@ module Decidim
|
|
44
54
|
end
|
45
55
|
|
46
56
|
initializer "decidim_budgets.register_reminders" do
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
57
|
+
config.after_initialize do
|
58
|
+
Decidim.reminders_registry.register(:orders) do |reminder_registry|
|
59
|
+
reminder_registry.generator_class_name = "Decidim::Budgets::OrderReminderGenerator"
|
60
|
+
reminder_registry.form_class_name = "Decidim::Budgets::Admin::OrderReminderForm"
|
61
|
+
reminder_registry.command_class_name = "Decidim::Budgets::Admin::CreateOrderReminders"
|
62
|
+
|
63
|
+
reminder_registry.settings do |settings|
|
64
|
+
settings.attribute :reminder_times, type: :array, default: [2.hours, 1.week, 2.weeks]
|
65
|
+
end
|
51
66
|
|
52
|
-
|
53
|
-
|
67
|
+
reminder_registry.messages do |msg|
|
68
|
+
msg.set(:title) { |count: 0| I18n.t("decidim.budgets.admin.reminders.orders.title", count:) }
|
69
|
+
msg.set(:description) { I18n.t("decidim.budgets.admin.reminders.orders.description") }
|
70
|
+
end
|
54
71
|
end
|
72
|
+
end
|
73
|
+
end
|
55
74
|
|
56
|
-
|
57
|
-
|
58
|
-
|
75
|
+
initializer "decidim_budgets.authorization_transfer" do
|
76
|
+
config.to_prepare do
|
77
|
+
Decidim::AuthorizationTransfer.register(:budgets) do |transfer|
|
78
|
+
transfer.move_records(Decidim::Budgets::Order, :decidim_user_id)
|
59
79
|
end
|
60
80
|
end
|
61
81
|
end
|
@@ -37,9 +37,9 @@ module Decidim
|
|
37
37
|
comments: project.comments_count,
|
38
38
|
created_at: project.created_at,
|
39
39
|
url: project.polymorphic_resource_url({}),
|
40
|
-
related_proposals
|
41
|
-
related_proposal_titles
|
42
|
-
related_proposal_urls:
|
40
|
+
related_proposals:,
|
41
|
+
related_proposal_titles:,
|
42
|
+
related_proposal_urls:
|
43
43
|
}
|
44
44
|
end
|
45
45
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "decidim/components/namer"
|
4
|
+
require "decidim/seeds"
|
5
|
+
|
6
|
+
module Decidim
|
7
|
+
module Budgets
|
8
|
+
class Seeds < Decidim::Seeds
|
9
|
+
attr_reader :participatory_space
|
10
|
+
|
11
|
+
def initialize(participatory_space:)
|
12
|
+
@participatory_space = participatory_space
|
13
|
+
end
|
14
|
+
|
15
|
+
def call
|
16
|
+
landing_page_content = Decidim::Faker::Localized.localized do
|
17
|
+
"<h2>#{::Faker::Lorem.sentence}</h2>" \
|
18
|
+
"<p>#{::Faker::Lorem.paragraph}</p>" \
|
19
|
+
"<p>#{::Faker::Lorem.paragraph}</p>"
|
20
|
+
end
|
21
|
+
|
22
|
+
component = Decidim::Component.create!(
|
23
|
+
name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name,
|
24
|
+
manifest_name: :budgets,
|
25
|
+
published_at: Time.current,
|
26
|
+
participatory_space:,
|
27
|
+
settings: {
|
28
|
+
landing_page_content:,
|
29
|
+
more_information_modal: Decidim::Faker::Localized.paragraph(sentence_count: 4),
|
30
|
+
workflow: Decidim::Budgets.workflows.keys.sample
|
31
|
+
}
|
32
|
+
)
|
33
|
+
|
34
|
+
rand(1...3).times do
|
35
|
+
Decidim::Budgets::Budget.create!(
|
36
|
+
component:,
|
37
|
+
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
38
|
+
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
39
|
+
Decidim::Faker::Localized.paragraph(sentence_count: 3)
|
40
|
+
end,
|
41
|
+
total_budget: ::Faker::Number.number(digits: 8)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
Decidim::Budgets::Budget.where(component:).each do |budget|
|
46
|
+
rand(2...4).times do
|
47
|
+
project = Decidim::Budgets::Project.create!(
|
48
|
+
budget:,
|
49
|
+
scope: participatory_space.organization.scopes.sample,
|
50
|
+
category: participatory_space.categories.sample,
|
51
|
+
title: Decidim::Faker::Localized.sentence(word_count: 2),
|
52
|
+
description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
|
53
|
+
Decidim::Faker::Localized.paragraph(sentence_count: 3)
|
54
|
+
end,
|
55
|
+
budget_amount: ::Faker::Number.between(from: Integer(budget.total_budget * 0.7), to: budget.total_budget)
|
56
|
+
)
|
57
|
+
|
58
|
+
attachment_collection = create_attachment_collection(collection_for: project)
|
59
|
+
create_attachment(attached_to: project, filename: "Exampledocument.pdf", attachment_collection:)
|
60
|
+
create_attachment(attached_to: project, filename: "city.jpeg")
|
61
|
+
create_attachment(attached_to: project, filename: "Exampledocument.pdf")
|
62
|
+
|
63
|
+
Decidim::Comments::Seed.comments_for(project)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "decidim/components/namer"
|
3
4
|
require "decidim/faker/localized"
|
4
5
|
require "decidim/dev"
|
5
6
|
|
@@ -8,12 +9,9 @@ require "decidim/participatory_processes/test/factories"
|
|
8
9
|
|
9
10
|
FactoryBot.define do
|
10
11
|
factory :budgets_component, parent: :component do
|
11
|
-
|
12
|
-
skip_injection { false }
|
13
|
-
end
|
14
|
-
name { generate_component_name(participatory_space.organization.available_locales, :budgets, skip_injection: skip_injection) }
|
12
|
+
name { Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name }
|
15
13
|
manifest_name { :budgets }
|
16
|
-
participatory_space { create(:participatory_process, :with_steps,
|
14
|
+
participatory_space { create(:participatory_process, :with_steps, organization:) }
|
17
15
|
|
18
16
|
trait :with_geocoding_enabled do
|
19
17
|
settings do
|
@@ -33,10 +31,10 @@ FactoryBot.define do
|
|
33
31
|
|
34
32
|
settings do
|
35
33
|
{
|
36
|
-
vote_rule_threshold_percent_enabled
|
37
|
-
vote_rule_minimum_budget_projects_enabled
|
34
|
+
vote_rule_threshold_percent_enabled:,
|
35
|
+
vote_rule_minimum_budget_projects_enabled:,
|
38
36
|
vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
|
39
|
-
vote_threshold_percent:
|
37
|
+
vote_threshold_percent:
|
40
38
|
}
|
41
39
|
end
|
42
40
|
end
|
@@ -51,10 +49,10 @@ FactoryBot.define do
|
|
51
49
|
|
52
50
|
settings do
|
53
51
|
{
|
54
|
-
vote_rule_threshold_percent_enabled
|
55
|
-
vote_rule_minimum_budget_projects_enabled
|
52
|
+
vote_rule_threshold_percent_enabled:,
|
53
|
+
vote_rule_minimum_budget_projects_enabled:,
|
56
54
|
vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
|
57
|
-
vote_minimum_budget_projects_number:
|
55
|
+
vote_minimum_budget_projects_number:
|
58
56
|
}
|
59
57
|
end
|
60
58
|
end
|
@@ -70,8 +68,8 @@ FactoryBot.define do
|
|
70
68
|
|
71
69
|
settings do
|
72
70
|
{
|
73
|
-
vote_rule_threshold_percent_enabled
|
74
|
-
vote_rule_minimum_budget_projects_enabled
|
71
|
+
vote_rule_threshold_percent_enabled:,
|
72
|
+
vote_rule_minimum_budget_projects_enabled:,
|
75
73
|
vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
|
76
74
|
vote_selected_projects_minimum: vote_minimum_budget_projects_number,
|
77
75
|
vote_selected_projects_maximum: vote_maximum_budget_projects_number
|
@@ -112,13 +110,10 @@ FactoryBot.define do
|
|
112
110
|
end
|
113
111
|
|
114
112
|
factory :budget, class: "Decidim::Budgets::Budget" do
|
115
|
-
|
116
|
-
|
117
|
-
end
|
118
|
-
title { generate_localized_title(:budget_title, skip_injection: skip_injection) }
|
119
|
-
description { generate_localized_description(:budget_description, skip_injection: skip_injection) }
|
113
|
+
title { generate_localized_title }
|
114
|
+
description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } }
|
120
115
|
total_budget { 100_000_000 }
|
121
|
-
component { create(:budgets_component
|
116
|
+
component { create(:budgets_component) }
|
122
117
|
|
123
118
|
trait :with_projects do
|
124
119
|
transient do
|
@@ -126,22 +121,19 @@ FactoryBot.define do
|
|
126
121
|
end
|
127
122
|
|
128
123
|
after(:create) do |budget, evaluator|
|
129
|
-
create_list(:project, evaluator.projects_number,
|
124
|
+
create_list(:project, evaluator.projects_number, budget:)
|
130
125
|
end
|
131
126
|
end
|
132
127
|
end
|
133
128
|
|
134
129
|
factory :project, class: "Decidim::Budgets::Project" do
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
title { generate_localized_title(:project_title, skip_injection: skip_injection) }
|
139
|
-
description { generate_localized_description(:project_description, skip_injection: skip_injection) }
|
130
|
+
title { generate_localized_title }
|
131
|
+
description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } }
|
140
132
|
address { "#{Faker::Address.street_name}, #{Faker::Address.city}" }
|
141
133
|
latitude { Faker::Address.latitude }
|
142
134
|
longitude { Faker::Address.longitude }
|
143
135
|
budget_amount { Faker::Number.number(digits: 8) }
|
144
|
-
budget { create(:budget
|
136
|
+
budget { create(:budget) }
|
145
137
|
|
146
138
|
trait :selected do
|
147
139
|
selected_at { Time.current }
|
@@ -153,17 +145,14 @@ FactoryBot.define do
|
|
153
145
|
end
|
154
146
|
|
155
147
|
after :create do |project, evaluator|
|
156
|
-
project.attachments = create_list(:attachment, evaluator.photos_number, :with_image, attached_to: project
|
148
|
+
project.attachments = create_list(:attachment, evaluator.photos_number, :with_image, attached_to: project)
|
157
149
|
end
|
158
150
|
end
|
159
151
|
end
|
160
152
|
|
161
153
|
factory :order, class: "Decidim::Budgets::Order" do
|
162
|
-
|
163
|
-
|
164
|
-
end
|
165
|
-
budget { create(:budget, skip_injection: skip_injection) }
|
166
|
-
user { create(:user, organization: component.organization, skip_injection: skip_injection) }
|
154
|
+
budget { create(:budget) }
|
155
|
+
user { create(:user, organization: component.organization) }
|
167
156
|
|
168
157
|
trait :with_projects do
|
169
158
|
transient do
|
@@ -172,17 +161,14 @@ FactoryBot.define do
|
|
172
161
|
|
173
162
|
after(:create) do |order, evaluator|
|
174
163
|
project_budget = (order.maximum_budget / evaluator.projects_number).to_i
|
175
|
-
order.projects << create_list(:project, evaluator.projects_number, budget_amount: project_budget, budget: order.budget
|
164
|
+
order.projects << create_list(:project, evaluator.projects_number, budget_amount: project_budget, budget: order.budget)
|
176
165
|
order.save!
|
177
166
|
end
|
178
167
|
end
|
179
168
|
end
|
180
169
|
|
181
170
|
factory :line_item, class: "Decidim::Budgets::LineItem" do
|
182
|
-
transient do
|
183
|
-
skip_injection { false }
|
184
|
-
end
|
185
171
|
order
|
186
|
-
project { create(:project, budget: order.budget
|
172
|
+
project { create(:project, budget: order.budget) }
|
187
173
|
end
|
188
174
|
end
|
@@ -123,7 +123,7 @@ module Decidim
|
|
123
123
|
|
124
124
|
def orders
|
125
125
|
@orders ||= Decidim::Budgets::Order.includes(:projects).where(decidim_user_id: user, decidim_budgets_budget_id: budgets).map do |order|
|
126
|
-
[order.decidim_budgets_budget_id, { order
|
126
|
+
[order.decidim_budgets_budget_id, { order:, status: order.checked_out? ? :voted : :progress }] if order.projects.any?
|
127
127
|
end.compact.to_h
|
128
128
|
end
|
129
129
|
end
|