decidim-lausanne-budgets 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +141 -0
  3. data/Rakefile +93 -0
  4. data/app/cells/decidim/lausanne/budgets/base_cell.rb +24 -0
  5. data/app/cells/decidim/lausanne/budgets/budget_cell.rb +23 -0
  6. data/app/cells/decidim/lausanne/budgets/budget_information_modal/show.erb +21 -0
  7. data/app/cells/decidim/lausanne/budgets/budget_information_modal_cell.rb +24 -0
  8. data/app/cells/decidim/lausanne/budgets/budget_list_item/show.erb +21 -0
  9. data/app/cells/decidim/lausanne/budgets/budget_list_item_cell.rb +43 -0
  10. data/app/cells/decidim/lausanne/budgets/budget_m/data.erb +12 -0
  11. data/app/cells/decidim/lausanne/budgets/budget_m/footer.erb +5 -0
  12. data/app/cells/decidim/lausanne/budgets/budget_m_cell.rb +18 -0
  13. data/app/cells/decidim/lausanne/budgets/budgets_header/show.erb +7 -0
  14. data/app/cells/decidim/lausanne/budgets/budgets_header_cell.rb +16 -0
  15. data/app/cells/decidim/lausanne/budgets/budgets_list/card_list.erb +7 -0
  16. data/app/cells/decidim/lausanne/budgets/budgets_list/highlighted.erb +11 -0
  17. data/app/cells/decidim/lausanne/budgets/budgets_list/show.erb +20 -0
  18. data/app/cells/decidim/lausanne/budgets/budgets_list/voted.erb +43 -0
  19. data/app/cells/decidim/lausanne/budgets/budgets_list_cell.rb +40 -0
  20. data/app/cells/decidim/lausanne/budgets/limit_announcement_cell.rb +47 -0
  21. data/app/cells/decidim/lausanne/budgets/project_cell.rb +23 -0
  22. data/app/cells/decidim/lausanne/budgets/project_list_item/project_data.erb +19 -0
  23. data/app/cells/decidim/lausanne/budgets/project_list_item/project_data_vote_button.erb +22 -0
  24. data/app/cells/decidim/lausanne/budgets/project_list_item/project_image.erb +5 -0
  25. data/app/cells/decidim/lausanne/budgets/project_list_item/project_text.erb +23 -0
  26. data/app/cells/decidim/lausanne/budgets/project_list_item/show.erb +5 -0
  27. data/app/cells/decidim/lausanne/budgets/project_list_item_cell.rb +75 -0
  28. data/app/cells/decidim/lausanne/budgets/project_m/data.erb +12 -0
  29. data/app/cells/decidim/lausanne/budgets/project_m/footer.erb +5 -0
  30. data/app/cells/decidim/lausanne/budgets/project_m_cell.rb +24 -0
  31. data/app/cells/decidim/lausanne/budgets/project_selected_status_cell.rb +30 -0
  32. data/app/cells/decidim/lausanne/budgets/project_tags/show.erb +4 -0
  33. data/app/cells/decidim/lausanne/budgets/project_tags_cell.rb +20 -0
  34. data/app/cells/decidim/lausanne/budgets/project_voted_hint_cell.rb +35 -0
  35. data/app/cells/decidim/lausanne/budgets/project_votes_count_cell.rb +46 -0
  36. data/app/commands/decidim/lausanne/budgets/add_line_item.rb +54 -0
  37. data/app/commands/decidim/lausanne/budgets/admin/create_budget.rb +50 -0
  38. data/app/commands/decidim/lausanne/budgets/admin/create_project.rb +71 -0
  39. data/app/commands/decidim/lausanne/budgets/admin/destroy_budget.rb +44 -0
  40. data/app/commands/decidim/lausanne/budgets/admin/destroy_project.rb +44 -0
  41. data/app/commands/decidim/lausanne/budgets/admin/import_proposals_to_budgets.rb +87 -0
  42. data/app/commands/decidim/lausanne/budgets/admin/update_budget.rb +50 -0
  43. data/app/commands/decidim/lausanne/budgets/admin/update_project.rb +79 -0
  44. data/app/commands/decidim/lausanne/budgets/cancel_order.rb +46 -0
  45. data/app/commands/decidim/lausanne/budgets/checkout.rb +43 -0
  46. data/app/commands/decidim/lausanne/budgets/command.rb +16 -0
  47. data/app/commands/decidim/lausanne/budgets/create_user_record.rb +39 -0
  48. data/app/commands/decidim/lausanne/budgets/remove_line_item.rb +40 -0
  49. data/app/commands/decidim/lausanne/budgets/update_user_record.rb +40 -0
  50. data/app/controllers/concerns/decidim/lausanne/budgets/needs_current_order.rb +52 -0
  51. data/app/controllers/concerns/decidim/lausanne/budgets/orderable.rb +54 -0
  52. data/app/controllers/decidim/lausanne/budgets/admin/application_controller.rb +34 -0
  53. data/app/controllers/decidim/lausanne/budgets/admin/attachment_collections_controller.rb +27 -0
  54. data/app/controllers/decidim/lausanne/budgets/admin/attachments_controller.rb +28 -0
  55. data/app/controllers/decidim/lausanne/budgets/admin/lausanne_budgets_controller.rb +105 -0
  56. data/app/controllers/decidim/lausanne/budgets/admin/projects_controller.rb +98 -0
  57. data/app/controllers/decidim/lausanne/budgets/admin/proposals_imports_controller.rb +43 -0
  58. data/app/controllers/decidim/lausanne/budgets/application_controller.rb +77 -0
  59. data/app/controllers/decidim/lausanne/budgets/lausanne_budgets_controller.rb +29 -0
  60. data/app/controllers/decidim/lausanne/budgets/line_items_controller.rb +63 -0
  61. data/app/controllers/decidim/lausanne/budgets/orders_controller.rb +59 -0
  62. data/app/controllers/decidim/lausanne/budgets/projects_controller.rb +103 -0
  63. data/app/controllers/decidim/lausanne/budgets/user_records_controller.rb +121 -0
  64. data/app/forms/decidim/lausanne/budgets/admin/component_form.rb +93 -0
  65. data/app/forms/decidim/lausanne/budgets/admin/lausanne_budget_form.rb +41 -0
  66. data/app/forms/decidim/lausanne/budgets/admin/project_form.rb +96 -0
  67. data/app/forms/decidim/lausanne/budgets/admin/project_import_proposals_form.rb +52 -0
  68. data/app/forms/decidim/lausanne/budgets/user_record_form.rb +61 -0
  69. data/app/helpers/decidim/lausanne/budgets/admin/application_helper.rb +15 -0
  70. data/app/helpers/decidim/lausanne/budgets/application_helper.rb +26 -0
  71. data/app/helpers/decidim/lausanne/budgets/projects_helper.rb +103 -0
  72. data/app/jobs/decidim/lausanne/budgets/send_order_summary_job.rb +17 -0
  73. data/app/mailers/decidim/lausanne/budgets/order_summary_mailer.rb +38 -0
  74. data/app/models/decidim/lausanne/budgets/application_record.rb +12 -0
  75. data/app/models/decidim/lausanne/budgets/lausanne_budget.rb +37 -0
  76. data/app/models/decidim/lausanne/budgets/line_item.rb +23 -0
  77. data/app/models/decidim/lausanne/budgets/order.rb +204 -0
  78. data/app/models/decidim/lausanne/budgets/project.rb +129 -0
  79. data/app/models/decidim/lausanne/budgets/user_record.rb +28 -0
  80. data/app/packs/entrypoints/decidim_lausanne_budgets.js +2 -0
  81. data/app/packs/images/decidim/lausanne/budgets/icon.svg +1 -0
  82. data/app/packs/images/decidim/lausanne/budgets/lausanneparticipe.gif +0 -0
  83. data/app/packs/src/decidim/lausanne/budgets/index.js +1 -0
  84. data/app/packs/src/decidim/lausanne/budgets/progressFixed.js.es6 +23 -0
  85. data/app/packs/src/decidim/lausanne/budgets/projects.js.es6 +66 -0
  86. data/app/packs/stylesheets/decidim/lausanne/budgets/_budgets.scss +13 -0
  87. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_budget-list.scss +195 -0
  88. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_budget-meter.scss +85 -0
  89. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_print.scss +73 -0
  90. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_progress.scss +25 -0
  91. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_proposal_link.scss +38 -0
  92. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_share_buttons.scss +15 -0
  93. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_user_record_form.scss +8 -0
  94. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_votation-progress.scss +100 -0
  95. data/app/packs/stylesheets/decidim/lausanne/budgets/budget/_voting-rules.scss +20 -0
  96. data/app/permissions/decidim/lausanne/budgets/admin/permissions.rb +49 -0
  97. data/app/permissions/decidim/lausanne/budgets/permissions.rb +63 -0
  98. data/app/presenters/decidim/lausanne/budgets/admin_log/budget_presenter.rb +44 -0
  99. data/app/presenters/decidim/lausanne/budgets/admin_log/project_presenter.rb +44 -0
  100. data/app/queries/decidim/lausanne/budgets/filtered_projects.rb +47 -0
  101. data/app/queries/decidim/lausanne/budgets/metrics/budget_followers_metric_measure.rb +34 -0
  102. data/app/queries/decidim/lausanne/budgets/metrics/budget_participants_metric_measure.rb +29 -0
  103. data/app/queries/decidim/lausanne/budgets/query.rb +16 -0
  104. data/app/serializers/decidim/lausanne/budgets/data_portability_budgets_order_serializer.rb +46 -0
  105. data/app/services/decidim/lausanne/budgets/project_search.rb +65 -0
  106. data/app/services/decidim/lausanne/budgets/project_search_rs.rb +13 -0
  107. data/app/views/decidim/lausanne/budgets/admin/lausanne_budgets/_form.html.erb +23 -0
  108. data/app/views/decidim/lausanne/budgets/admin/lausanne_budgets/edit.html.erb +7 -0
  109. data/app/views/decidim/lausanne/budgets/admin/lausanne_budgets/index.html.erb +75 -0
  110. data/app/views/decidim/lausanne/budgets/admin/lausanne_budgets/new.html.erb +7 -0
  111. data/app/views/decidim/lausanne/budgets/admin/projects/_form.html.erb +47 -0
  112. data/app/views/decidim/lausanne/budgets/admin/projects/edit.html.erb +7 -0
  113. data/app/views/decidim/lausanne/budgets/admin/projects/index.html.erb +82 -0
  114. data/app/views/decidim/lausanne/budgets/admin/projects/new.html.erb +7 -0
  115. data/app/views/decidim/lausanne/budgets/admin/projects/proposals_picker.html.erb +1 -0
  116. data/app/views/decidim/lausanne/budgets/admin/proposals_imports/new.html.erb +32 -0
  117. data/app/views/decidim/lausanne/budgets/lausanne_budgets/index.html.erb +5 -0
  118. data/app/views/decidim/lausanne/budgets/line_items/update_budget.js.erb +41 -0
  119. data/app/views/decidim/lausanne/budgets/order_summary_mailer/order_summary.html.erb +22 -0
  120. data/app/views/decidim/lausanne/budgets/orders/show.html.erb +71 -0
  121. data/app/views/decidim/lausanne/budgets/projects/_budget_confirm.html.erb +37 -0
  122. data/app/views/decidim/lausanne/budgets/projects/_budget_excess.html.erb +14 -0
  123. data/app/views/decidim/lausanne/budgets/projects/_budget_summary.html.erb +95 -0
  124. data/app/views/decidim/lausanne/budgets/projects/_count.html.erb +1 -0
  125. data/app/views/decidim/lausanne/budgets/projects/_filters.html.erb +34 -0
  126. data/app/views/decidim/lausanne/budgets/projects/_filters_small_view.html.erb +18 -0
  127. data/app/views/decidim/lausanne/budgets/projects/_linked_projects.html.erb +12 -0
  128. data/app/views/decidim/lausanne/budgets/projects/_order_progress.html.erb +32 -0
  129. data/app/views/decidim/lausanne/budgets/projects/_order_selected_projects.html.erb +27 -0
  130. data/app/views/decidim/lausanne/budgets/projects/_order_total_budget.html.erb +7 -0
  131. data/app/views/decidim/lausanne/budgets/projects/_project.html.erb +1 -0
  132. data/app/views/decidim/lausanne/budgets/projects/_project_budget_button.html.erb +46 -0
  133. data/app/views/decidim/lausanne/budgets/projects/_projects.html.erb +13 -0
  134. data/app/views/decidim/lausanne/budgets/projects/_user_record_form.html.erb +40 -0
  135. data/app/views/decidim/lausanne/budgets/projects/_votation_banner.html.erb +71 -0
  136. data/app/views/decidim/lausanne/budgets/projects/index.html.erb +36 -0
  137. data/app/views/decidim/lausanne/budgets/projects/index.js.erb +10 -0
  138. data/app/views/decidim/lausanne/budgets/projects/show.html.erb +81 -0
  139. data/app/views/decidim/lausanne/budgets/user_records/edit.html.erb +6 -0
  140. data/app/views/decidim/proposals/proposals/show.html.erb +172 -0
  141. data/app/views/layouts/lausanne_budgets/print.erb +12 -0
  142. data/config/assets.rb +11 -0
  143. data/config/initializers/social_share.rb +3 -0
  144. data/config/locales/fr.yml +381 -0
  145. data/config/routes.rb +7 -0
  146. data/db/migrate/20170127114122_create_lausanne_projects.rb +15 -0
  147. data/db/migrate/20170127114123_create_lausanne_user_records.rb +14 -0
  148. data/db/migrate/20170130095615_create_lausanne_orders.rb +16 -0
  149. data/db/migrate/20170130101825_create_lausanne_line_items.rb +12 -0
  150. data/db/migrate/20170215132708_add_lausanne_reference_to_projects.rb +13 -0
  151. data/db/migrate/20200617105120_create_decidim_lausanne_budgets.rb +15 -0
  152. data/db/migrate/20200629134013_add_lausanne_budget_reference_to_project.rb +7 -0
  153. data/db/migrate/20200706142609_add_lausanne_budget_reference_to_order.rb +7 -0
  154. data/db/migrate/20200714103519_move_lausanne_budgets_to_own_model.rb +109 -0
  155. data/db/migrate/20200717140012_add_lausanne_scope_to_budgets.rb +7 -0
  156. data/db/migrate/20200728075039_add_lausanne_selected_at_to_project.rb +7 -0
  157. data/db/migrate/20200804175222_lausanne_votes_enabled_to_votes_choices.rb +35 -0
  158. data/db/migrate/20200827154129_add_lausanne_commentable_counter_cache_to_projects.rb +9 -0
  159. data/db/migrate/20210310120613_add_lausanne_followable_counter_cache_to_budgets.rb +16 -0
  160. data/db/migrate/20210508180613_add_checkboxes_to_user_record.rb +9 -0
  161. data/db/migrate/20221001151237_add_excerpt_to_decidim_lausanne_budgets_project.rb +7 -0
  162. data/lib/decidim/lausanne/budgets/admin.rb +12 -0
  163. data/lib/decidim/lausanne/budgets/admin_engine.rb +40 -0
  164. data/lib/decidim/lausanne/budgets/component.rb +107 -0
  165. data/lib/decidim/lausanne/budgets/current_user_record_middleware.rb +17 -0
  166. data/lib/decidim/lausanne/budgets/engine.rb +57 -0
  167. data/lib/decidim/lausanne/budgets/project_serializer.rb +83 -0
  168. data/lib/decidim/lausanne/budgets/seeds/Exampledocument.pdf +0 -0
  169. data/lib/decidim/lausanne/budgets/seeds/city.jpeg +0 -0
  170. data/lib/decidim/lausanne/budgets/test/factories.rb +169 -0
  171. data/lib/decidim/lausanne/budgets/version.rb +15 -0
  172. data/lib/decidim/lausanne/budgets/workflows/all.rb +22 -0
  173. data/lib/decidim/lausanne/budgets/workflows/base.rb +140 -0
  174. data/lib/decidim/lausanne/budgets/workflows/one.rb +35 -0
  175. data/lib/decidim/lausanne/budgets/workflows.rb +19 -0
  176. data/lib/decidim/lausanne/budgets.rb +17 -0
  177. metadata +372 -0
@@ -0,0 +1,172 @@
1
+ <% add_decidim_meta_tags({
2
+ description: present(@proposal).body,
3
+ title: present(@proposal).title,
4
+ url: proposal_url(@proposal.id)
5
+ }) %>
6
+
7
+ <%
8
+ edit_link(
9
+ resource_locator(@proposal).edit,
10
+ :edit,
11
+ :proposal,
12
+ proposal: @proposal
13
+ )
14
+ %>
15
+
16
+ <%
17
+ extra_admin_link(
18
+ resource_locator(@proposal).show(anchor: "proposal-answer"),
19
+ :create,
20
+ :proposal_answer,
21
+ { proposal: @proposal },
22
+ { name: t(".answer"), icon: "comment-square" }
23
+ )
24
+ %>
25
+
26
+ <%= render partial: "voting_rules" %>
27
+ <% if component_settings.participatory_texts_enabled? %>
28
+ <div class="row column">
29
+ <div class="section text-medium">
30
+ <%= t(".back_to") %> <u><%= link_to translated_attribute(@participatory_text.title), main_component_path(current_component) %></u>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ <%= emendation_announcement_for @proposal %>
35
+ <div class="row column view-header">
36
+
37
+ <div class="m-bottom">
38
+ <%= link_to proposals_path, class: "small hollow" do %>
39
+ <%= icon "chevron-left", class: "icon--small", role: "img", "aria-hidden": true %>
40
+ <%= t(".back_to_list") %>
41
+ <% end %>
42
+ </div>
43
+
44
+ <% if @proposal.emendation? %>
45
+ <h3 class="heading3"><%= t(".changes_at_title", title: present(@proposal.amendable).title(links: true, html_escape: true)) %></h3>
46
+ <% else %>
47
+ <h3 class="heading3"><%= present(@proposal).title(links: true, html_escape: true) %></h3>
48
+ <% end %>
49
+ <% unless component_settings.participatory_texts_enabled? %>
50
+ <%= cell("decidim/coauthorships", @proposal, has_actions: true, size: 3, context: { current_user: current_user }) %>
51
+ <% end %>
52
+ </div>
53
+ <div class="row">
54
+ <div class="columns mediumlarge-8 large-9">
55
+ <div class="section">
56
+ <% if @proposal.emendation? %>
57
+ <%= cell("decidim/diff", proposal_presenter.versions.last) %>
58
+ <% elsif not ["section","subsection"].include? @proposal.participatory_text_level %>
59
+ <%== cell("decidim/proposals/proposal_m", @proposal, full_badge: true).badge %>
60
+ <%= render_proposal_body(@proposal) %>
61
+ <% end %>
62
+ <% if component_settings.geocoding_enabled? %>
63
+ <%= render partial: "decidim/shared/static_map", locals: { icon_name: "proposals", geolocalizable: @proposal } %>
64
+ <% end %>
65
+ <% if proposal_has_costs? && current_settings.answers_with_costs? %>
66
+ <%= cell("decidim/proposals/cost_report", @proposal) %>
67
+ <% end %>
68
+ <%= cell "decidim/proposals/proposal_tags", @proposal %>
69
+ </div>
70
+
71
+ <%= cell("decidim/announcement", proposal_reason_callout_announcement, callout_class: proposal_reason_callout_class) if @proposal.answered? && @proposal.published_state? %>
72
+ <% lausanne_project = Decidim::Lausanne::Budgets::Project.joins(:resource_links_from).where(
73
+ decidim_resource_links: {to_id: @proposal.id, to_type: "Decidim::Proposals::Proposal"}
74
+ ).first %>
75
+ <% if lausanne_project %>
76
+ <div class="vote_link">
77
+ <div class="vote_link__text">
78
+ <h3><%= t("decidim.lausanne.budgets.linked_project.cta.title") %></h3>
79
+ <p>
80
+ <%= raw t(
81
+ "decidim.lausanne.budgets.linked_project.cta.description",
82
+ link: resource_locator([lausanne_project.budget, lausanne_project]).url
83
+ ) %>
84
+ </p>
85
+ </div>
86
+ <div style="display:flex;">
87
+ <%= link_to resource_locator([lausanne_project.budget, lausanne_project]).url, class: "vote_link__action button " do %>
88
+ <%= t("decidim.lausanne.budgets.linked_project.cta.action") %>
89
+ <% end %>
90
+ </div>
91
+ </div>
92
+ <% end %>
93
+ <%= linked_resources_for @proposal, :results, "included_proposals" %>
94
+ <%= linked_resources_for @proposal, :meetings, "proposals_from_meeting" %>
95
+ <%= linked_resources_for @proposal, :proposals, "copied_from_component" %>
96
+
97
+
98
+ <%= cell "decidim/endorsers_list", @proposal %>
99
+ <%= amendments_for @proposal %>
100
+ </div>
101
+ <div class="columns section view-side mediumlarge-4 large-3">
102
+ <% if @proposal.amendable? && allowed_to?(:edit, :proposal, proposal: @proposal) %>
103
+ <%= link_to t(".edit_proposal"), edit_proposal_path(@proposal), class: "button hollow expanded button--sc" %>
104
+ <% else %>
105
+ <%= amend_button_for @proposal %>
106
+ <% end %>
107
+
108
+ <%= emendation_actions_for @proposal %>
109
+
110
+ <% if current_settings.votes_enabled? || show_endorsements_card? || current_user %>
111
+ <% if @proposal.withdrawn? %>
112
+ <div class="card">
113
+ <div class="card__content">
114
+ <% if lausanne_project %>
115
+ <%= link_to resource_locator([lausanne_project.budget, lausanne_project]).url, class: "primary button expanded" do %>
116
+ <%= t("decidim.lausanne.budgets.linked_project.button") %>
117
+ <% end %>
118
+ <% end %>
119
+ <% if current_settings.votes_enabled? %>
120
+ <%= render partial: "votes_count", locals: { proposal: @proposal, from_proposals_list: false } %>
121
+ <% end %>
122
+ </div>
123
+ </div>
124
+ <% else %>
125
+ <div class="card">
126
+ <div class="card__content">
127
+ <% if lausanne_project %>
128
+ <%= link_to resource_locator([lausanne_project.budget, lausanne_project]).url, class: "primary button expanded" do %>
129
+ <%= t("decidim.lausanne.budgets.linked_project.button") %>
130
+ <% end %>
131
+ <% end %>
132
+ <% if current_settings.votes_enabled? %>
133
+ <%= render partial: "votes_count", locals: { proposal: @proposal, from_proposals_list: false } %>
134
+ <%= render partial: "vote_button", locals: { proposal: @proposal, from_proposals_list: false } %>
135
+ <% end %>
136
+ <div class="row collapse buttons__row">
137
+
138
+ <% if endorsements_enabled? %>
139
+ <div class="column small-9 collapse">
140
+ <%= endorsement_buttons_cell(@proposal) %>
141
+ </div>
142
+ <% end %>
143
+ <div class="column collapse <%= endorsements_enabled? ? "small-3" : "" %>">
144
+ <%= link_to "#comments", class: "button small compact hollow secondary button--nomargin expanded" do %>
145
+ <span class="show-for-sr"><%= present(@proposal).title(html_escape: true) %></span>
146
+ <%= icon "comment-square", class: "icon--small", aria_label: t(".comments"), role: "img" %> <%= @proposal.comments_count %>
147
+ <% end %>
148
+ </div>
149
+ </div>
150
+ <br>
151
+ <%= follow_button_for(@proposal) %>
152
+ </div>
153
+ </div>
154
+ <% end %>
155
+ <% end %>
156
+
157
+ <%= amenders_list_for(@proposal) %>
158
+
159
+ <%= resource_reference(@proposal) %>
160
+ <%= resource_version(proposal_presenter, versions_path: proposal_versions_path(@proposal)) %>
161
+ <%= cell("decidim/fingerprint", @proposal) %>
162
+ <%= render partial: "decidim/shared/share_modal", locals: { resource: @proposal } %>
163
+ <%= embed_modal_for proposal_widget_url(@proposal, format: :js) %>
164
+ <%= cell "decidim/proposals/proposal_link_to_collaborative_draft", @proposal %>
165
+ <%= cell "decidim/proposals/proposal_link_to_rejected_emendation", @proposal %>
166
+ </div>
167
+ </div>
168
+ <%= attachments_for @proposal %>
169
+
170
+ <%= comments_for @proposal %>
171
+
172
+ <%= cell("decidim/flag_modal", @proposal) %>
@@ -0,0 +1,12 @@
1
+ <html>
2
+ <head>
3
+
4
+ <%= javascript_pack_tag "decidim_core.js" %>
5
+ <%= stylesheet_pack_tag "decidim_core.css", media: 'all', 'data-turbolinks-track': 'reload' %>
6
+
7
+ </head>
8
+ <body class="lausanne_budget_print">
9
+
10
+ <%= yield %>
11
+ </body>
12
+ </html>
data/config/assets.rb ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ base_path = File.expand_path("..", __dir__)
4
+
5
+ Decidim::Webpacker.register_path("#{base_path}/app/packs")
6
+
7
+ Decidim::Webpacker.register_entrypoints(
8
+ decidim_lausanne_budgets: "#{base_path}/app/packs/entrypoints/decidim_lausanne_budgets.js"
9
+ )
10
+
11
+ Decidim::Webpacker.register_stylesheet_import("stylesheets/decidim/lausanne/budgets/budgets")
@@ -0,0 +1,3 @@
1
+ SocialShareButton.configure do |config|
2
+ config.allow_sites = %w(whatsapp_app linkedin facebook twitter)
3
+ end
@@ -0,0 +1,381 @@
1
+ fr:
2
+ social_share_button:
3
+ whatsapp_app: Whatsapp
4
+ whatsapp_web: Whatsapp
5
+ activemodel:
6
+ attributes:
7
+ budget:
8
+ decidim_scope_id: Secteur
9
+ description: Description
10
+ title: Titre
11
+ total_budget: Budget total
12
+ weight: Rang d'affichage
13
+ user_record:
14
+ first_name: "Prénom"
15
+ last_name: "Nom de famille"
16
+ birthdate: "Date de naissance"
17
+ allow_process_data: "J'autorise que mes données personnelles soient comparées au registre des habitants dans le but de dépouiller les votes."
18
+ its_me: "Ces informations sont vérifidiques et m'appartiennent"
19
+ iam_lausanne: "Je suis résident.e à Lausanne"
20
+ project:
21
+ budget_amount: Montant du budget
22
+ decidim_category_id: Catégorie
23
+ decidim_scope_id: Périmètre d'application
24
+ description: Description
25
+ excerpt: Résumer
26
+ proposal_ids: Propositions liées
27
+ selected: Sélectionné pour l'implémentation
28
+ title: Titre
29
+ activerecord:
30
+ models:
31
+ decidim/lausanne/budgets/project:
32
+ one: Projet
33
+ other: Projets
34
+ decidim:
35
+ user_record:
36
+ create:
37
+ success: "Données personnelles enregistrées. Vous pouvez commencer à voter."
38
+ lausanne_budgets:
39
+ admin:
40
+ exports:
41
+ projects: Projets
42
+ models:
43
+ budget:
44
+ name: Budget
45
+ project:
46
+ name: Projet
47
+ lausanne_budgets:
48
+ create:
49
+ success: "Budget créé"
50
+ update:
51
+ success: "Budget mis à jour"
52
+ proposals_imports:
53
+ create:
54
+ success: Propositions importées
55
+ actions:
56
+ attachment_collections: Dossiers
57
+ attachments: Documents liés
58
+ confirm_destroy: Êtes-vous certain de vouloir supprimer ce projet?
59
+ destroy: Supprimer
60
+ edit: Modifier
61
+ edit_projects: Gérer les projets
62
+ import: Importer des propositions dans des projets
63
+ new: Nouveau %{name}
64
+ preview: Aperçu
65
+ title: Actions
66
+ models:
67
+ budget:
68
+ fields:
69
+ name: Nom
70
+ projects_count: Nombre de projets
71
+ total_budget: Budget total
72
+ project:
73
+ fields:
74
+ title: Titre
75
+
76
+ lausanne:
77
+ budgets:
78
+ admin:
79
+ lausanne_budgets:
80
+ create:
81
+ invalid: Un problème est survenu lors de la création de ce budget
82
+ success: Budget créé avec succès
83
+ destroy:
84
+ invalid: Un problème est survenu lors de la suppression de ce budget
85
+ success: Budget supprimé avec succès
86
+ edit:
87
+ title: Modifier le budget
88
+ update: Mettre à jour le budget
89
+ index:
90
+ finished_orders: Votes terminés
91
+ pending_orders: Votes en cours
92
+ title: Budgets
93
+ users_with_finished_orders: Utilisateurs ayant fini leur vote
94
+ users_with_pending_orders: Utilisateurs ayant des votes en attente
95
+ new:
96
+ create: Créer un budget
97
+ title: Nouveau budget
98
+ update:
99
+ invalid: Un problème est survenu lors de la mise à jour de ce budget
100
+ success: Budget mis à jour avec succès
101
+
102
+ projects:
103
+ create:
104
+ invalid: Il y a eu un problème lors de la création de ce projet
105
+ success: Projet créé avec succès
106
+ destroy:
107
+ success: Projet supprimé avec succès
108
+ edit:
109
+ title: Éditer un projet
110
+ update: Mettre à jour
111
+ index:
112
+ finished_orders: Votes terminés
113
+ pending_orders: Votes en cours
114
+ selected: Sélectionné
115
+ title: Projets
116
+ new:
117
+ create: Créer
118
+ title: Nouveau projet
119
+ update:
120
+ invalid: Il y a eu un problème lors de la mise à jour de ce projet
121
+ success: Projet mis à jour avec succès
122
+ proposals_imports:
123
+ create:
124
+ invalid: Un problème est survenu lors de l'importation des propositions dans des projets
125
+ success: "%{number} propositions importées avec succès dans des projets"
126
+ new:
127
+ create: Importer des propositions dans des projets
128
+ no_components: Il n'y a pas d'autres modules de proposition dans cet espace participatif pour importer les propositions dans des projets.
129
+ select_component: Veuillez sélectionner un module
130
+ title: Importer des propositions
131
+ admin_log:
132
+ budget:
133
+ create: "%{user_name} a créé le budget %{resource_name} dans l'espace %{space_name}"
134
+ delete: "%{user_name} a supprimé le budget %{resource_name} dans l'espace %{space_name}"
135
+ update: "%{user_name} a mis à jour le budget %{resource_name} dans l'espace %{space_name}"
136
+ project:
137
+ create: "%{user_name} a créé le projet %{resource_name} dans l'espace %{space_name}"
138
+ delete: "%{user_name} a supprimé le projet %{resource_name} dans l'espace %{space_name}"
139
+ update: "%{user_name} a mis à jour le projet %{resource_name} dans l'espace %{space_name}"
140
+ budget:
141
+ view: Retour aux projets
142
+ budget_information_modal:
143
+ back_to: Retour à %{component_name}
144
+ close_modal: Fermer la fenêtre de dialogue
145
+ continue: Continuer
146
+ more_information: Plus d'information
147
+ budgets_list:
148
+ cancel_order:
149
+ more_than_one: supprimer votre vote sur %{name} et recommencer
150
+ only_one: supprimer votre vote et recommencez.
151
+ finished_message: Vous avez terminé le processus de vote. Merci de votre participation !
152
+ highlighted_cta: Voter pour %{name}
153
+ if_change_opinion: Si vous avez changé d'avis, vous pouvez
154
+ my_budgets: Mes Budgets
155
+ voted_on: Vous avez voté sur %{links}
156
+ limit_announcement:
157
+ cant_vote: Vous ne pouvez pas voter sur ce budget. <a href="%{landing_path}">Essayez sur un autre budget</a>.
158
+ limit_reached: Vous avez des votes actifs dans %{links}. Pour voter sur ce budget, vous devez <a href="%{landing_path}">supprimer votre vote et recommencer</a>.
159
+ order_summary_mailer:
160
+ order_summary:
161
+ selected_projects: "Les projets que vous avez sélectionnés sont :"
162
+ subject: Vous avez voté sur l'espace participatif %{space_name}
163
+ voted_on_space: Vous avez voté sur le budget %{budget_name} pour l'espace participatif %{space_name}.
164
+ voted_on_space_with_scope: Vous avez voté sur le budget %{budget_name} pour l'espace participatif %{space_name} sur %{scope_name} (%{scope_type}).
165
+ linked_project:
166
+ cta:
167
+ title: "Participe au vote"
168
+ description: |
169
+ Ce projet te tiens à coeur?<br />Tu peux voter <a href="%{link}">ici</a>
170
+ action: "Voter"
171
+ button: "Voter"
172
+ projects:
173
+ user_record_form:
174
+ title: "Récolte de données personnelles"
175
+ close: "Fermer"
176
+ explanations: |
177
+ Pour pouvoir récolter les votes, nous devons récolter vos données personnelles
178
+ afin de les comparer au registre des habitants.<br />
179
+ Ces données seront utilisées pour le dépouillement des votes.
180
+ budget_confirm:
181
+ are_you_sure: Si vous changez d'avis, vous pourrez modifier votre vote plus tard.
182
+ cancel: Annuler
183
+ confirm: Confirmer
184
+ description: Voici les projets que vous avez choisis pour le budget.
185
+ title: Confirmez votre vote
186
+ budget_excess:
187
+ budget_excess:
188
+ description: Ce projet dépasse le budget maximum et ne peut pas être ajouté. Si vous le souhaitez, vous pouvez supprimer un projet que vous avez déjà sélectionné puis voter de nouveau selon vos préférences.
189
+ title: Budget maximum dépassé
190
+ close: Fermer
191
+ description: Ce projet dépasse le budget maximum et ne peut pas être ajouté. Si vous le souhaitez, vous pouvez supprimer un projet que vous avez déjà sélectionné puis voter de nouveau selon vos préférences.
192
+ ok: D'accord
193
+ projects_excess:
194
+ description: Vous avez dépassé le nombre maximum de projets à sélectionner, ce projet ne peut donc être ajouté. Si vous le souhaitez, vous pouvez supprimer un projet que vous avez déjà sélectionné puis voter de nouveau selon vos préférences.
195
+ title: Nombre maximum de projets dépassé
196
+ banner:
197
+ terminate_session: |
198
+ J'ai terminé, fermer ma session
199
+ checked_out: Vote terminé
200
+ pending_order: "Vote en cours: "
201
+ finalize: Finaliser le vote
202
+ user_data_help: |
203
+ Saisissez vos informations personnelles pour pouvoir voter — même sans compte
204
+ user_data_action: Commencer à voter
205
+ cancel_order:
206
+ one: Retirer mon vote
207
+ other: Retirer mes votes
208
+ confirmation: "Confirmation"
209
+ checked_out:
210
+ description: Vous avez déjà voté pour le budget. Si vous avez changé d'avis, vous pouvez %{cancel_link}.
211
+ title: Vote du budget terminé
212
+ minimum_projects_rule:
213
+ description: A quels projets pensez-vous que nous devrions allouer un budget ? Sélectionnez au moins %{minimum_number} projets que vous soutenez et votez selon vos préférences pour définir le budget.
214
+ instruction:
215
+ zero: "Vous pouvez finaliser votre vote"
216
+ one: "1 projet restant"
217
+ other: "%{count} projets restants"
218
+ projects_rule:
219
+ description: A quels projets pensez-vous que nous devrions allouer un budget ? Sélectionnez entre %{minimum_number} et %{maximum_number} projets que vous soutenez et votez selon vos préférences pour définir le budget.
220
+ instruction: "<li>Sélectionnez entre %{minimum_number} et %{maximum_number} projets que vous souhaitez et votez selon vos préférences pour définir le budget.</li>"
221
+ projects_rule_maximum_only:
222
+ description: A quels projets pensez-vous que nous devrions allouer un budget ? Sélectionnez au maximum %{maximum_number} projets que vous soutenez et votez selon vos préférences pour définir le budget.
223
+ instruction: "<li>Sélectionnez au maximum %{maximum_number} projets que vous souhaitez et votez selon vos préférences pour définir le budget.</li>"
224
+ rules:
225
+ title: Règles du vote
226
+ title: Vous décidez du budget
227
+ total_budget: Budget total
228
+ total_projects: Nombre total de votes
229
+ vote_threshold_percent_rule:
230
+ description: À quels projets pensez-vous que nous devrions allouer un budget ? Assignez au moins %{minimum_budget} aux projets que vous soutenez et votez selon vos préférences pour définir le budget.
231
+ instruction: "Assignez au moins %{minimum_budget} aux projets que vous soutenez et votez selon vos préférences pour définir le budget"
232
+ budget_summary:
233
+ checked_out_sucess: "Vous avez voté"
234
+ start_voting: J'ai compris, commencer à voter
235
+ update_user_record: "Mettre à jour ses informations"
236
+ are_you_sure: Êtes-vous certain de vouloir annuler votre vote ?
237
+ assigned: "Affecté à :"
238
+ cancel_order: supprimer votre vote et recommencer
239
+ checked_out:
240
+ description: Vous avez déjà voté pour le budget. Si vous avez changé d'avis, vous pouvez %{cancel_link}.
241
+ title: Vote du budget terminé
242
+ minimum_projects_rule:
243
+ description: A quels projets pensez-vous que nous devrions allouer un budget ? Sélectionnez au moins %{minimum_number} projets que vous soutenez et votez selon vos préférences pour définir le budget.
244
+ instruction: "<li>Sélectionnez au moins %{minimum_number} projets que vous souhaitez voir se réaliser et votez selon vos préférences pour définir le budget.</li>"
245
+ projects_rule:
246
+ description: A quels projets pensez-vous que nous devrions allouer un budget ? Sélectionnez entre %{minimum_number} et %{maximum_number} projets que vous soutenez et votez selon vos préférences pour définir le budget.
247
+ instruction: "<li>Sélectionnez entre %{minimum_number} et %{maximum_number} projets que vous souhaitez et votez selon vos préférences pour définir le budget.</li>"
248
+ projects_rule_maximum_only:
249
+ description: A quels projets pensez-vous que nous devrions allouer un budget ? Sélectionnez au maximum %{maximum_number} projets que vous soutenez et votez selon vos préférences pour définir le budget.
250
+ instruction: "<li>Sélectionnez au maximum %{maximum_number} projets que vous souhaitez et votez selon vos préférences pour définir le budget.</li>"
251
+ user_record: Vos données personnelles
252
+ rules:
253
+ title: Règles du vote
254
+ extra_rule: "<li>Seul les lausannois.es enregistré.es au registre des habitants peuvent voter</li>"
255
+ title: Vous décidez du budget
256
+ total_budget: Budget total
257
+ total_projects: Nombre total de votes
258
+ vote_threshold_percent_rule:
259
+ description: À quels projets pensez-vous que nous devrions allouer un budget ? Assignez au moins %{minimum_budget} aux projets que vous soutenez et votez selon vos préférences pour définir le budget.
260
+ instruction: "<li>Assignez au moins %{minimum_budget} aux projets que vous soutenez et votez selon vos préférences pour définir le budget.</li>"
261
+ count:
262
+ projects_count:
263
+ one: 1 projet
264
+ other: "%{count} projets"
265
+ filters:
266
+ category: Catégorie
267
+ scope: Périmètre d'application
268
+ search: Rechercher
269
+ status: Statut
270
+ status_values:
271
+ all: Tous
272
+ not_selected: Non sélectionné
273
+ selected: Sélectionné
274
+ filters_small_view:
275
+ close_modal: Fermez la fenêtre
276
+ filter: Filtrer
277
+ filter_by: Filtrer par
278
+ unfold: Voir la suite
279
+ order_progress:
280
+ vote: Voter
281
+ order_selected_projects:
282
+ remove: Supprimer
283
+ selected_projects:
284
+ one: projet sélectionné
285
+ other: projets sélectionnés
286
+ view: Voir
287
+ orders:
288
+ highest_cost: Prix décroissant
289
+ label: Trier les projets par
290
+ lowest_cost: Prix croissant
291
+ most_voted: Les plus votés
292
+ asc: Nom de projet
293
+ random: Ordre aléatoire
294
+ selected: Sélectionné
295
+ project:
296
+ add: Ajouter le projet %{resource_name} à votre vote
297
+ remove: Retirer le projet %{resource_name} de votre vote
298
+ selected: Sélectionné
299
+ view: Voir
300
+ votes:
301
+ one: vote
302
+ other: votes
303
+ you_voted: Vous avez voté pour
304
+ vote:
305
+ add: "Nous avons enregistrer votre vote"
306
+ remove: "Nous avons retirer votre vote"
307
+ project_budget_button:
308
+ add: Ajouter à votre vote
309
+ add_descriptive: Ajouter le projet %{resource_name} à votre vote
310
+ added: Ajouté à votre vote
311
+ added_descriptive: Projet %{resource_name} ajouté à votre vote
312
+ projects_for: Projets pour %{name}
313
+ show:
314
+ budget: Budget
315
+ view_all_projects: Voir tous les projets
316
+ components:
317
+ lausanne_budgets:
318
+ actions:
319
+ vote: Voter
320
+ name: Budgets Publiques
321
+ settings:
322
+ global:
323
+ announcement: Annonce
324
+ comments_enabled: Activer le module de commentaire
325
+ comments_max_length: Longueur max des commentaires (laisser 0 pour la valeur par défaut)
326
+ form:
327
+ errors:
328
+ budget_voting_rule_only_one: Une seule règle de vote doit être activée
329
+ budget_voting_rule_required: Une règle de vote est requise
330
+ landing_page_content: Page d'accueil des budgets
331
+ more_information_modal: Plus d’informations
332
+ projects_per_page: Projets par page
333
+ resources_permissions_enabled: Les autorisations d'actions peuvent être définies pour chaque projet
334
+ scope_id: Secteur
335
+ scopes_enabled: Secteurs activés
336
+ title: Titre
337
+ total_budget: Budget total
338
+ vote_minimum_budget_projects_number: Nombre minimum de projets à voter
339
+ vote_rule_minimum_budget_projects_enabled: "Activer la règle : Nombre minimum de projets à voter"
340
+ vote_rule_selected_projects_enabled: "Activer la règle : Nombre minimum et maximum de projets à voter"
341
+ vote_rule_threshold_percent_enabled: "Activer la règle : Pourcentage de budget minimum"
342
+ vote_selected_projects_maximum: Nombre maximum de projets à sélectionner
343
+ vote_selected_projects_minimum: Nombre minimum de projets à sélectionner
344
+ vote_threshold_percent: Pourcentage du budget à atteindre pour voter
345
+ workflow: Processus
346
+ workflow_choices:
347
+ all: "Voter sur tous les budgets : autorise les participants à voter sur tous les budgets."
348
+ one: "Voter sur un seul budget : autorise les participants à voter sur un seul budget parmi les budgets proposés."
349
+ step:
350
+ announcement: Annonce
351
+ comments_blocked: Commentaires bloqués
352
+ highlighted_heading: En-tête en surbrillance
353
+ landing_page_content: Page d'accueil des budgets
354
+ list_heading: En-tête de la liste des budgets
355
+ more_information_modal: Plus d’informations
356
+ show_votes: Afficher les votes
357
+ title: Titre
358
+ votes: Vote
359
+ votes_choices:
360
+ disabled: Vote désactivé
361
+ enabled: Votes activés
362
+ finished: Vote terminé
363
+ events:
364
+ budgets:
365
+ budget_published:
366
+ email_intro: "Le budget %{resource_title} est maintenant actif pour %{participatory_space_title}. Vous pouvez le voir sur cette page :"
367
+ email_outro: Vous recevez cette notification car vous suivez « %{participatory_space_title} ». Vous pouvez cesser de le suivre en allant sur le lien précédent.
368
+ email_subject: Le budget %{resource_title} est maintenant actif pour %{participatory_space_title}.
369
+ notification_title: Le budget <a href="%{resource_path}">%{resource_title}</a> est maintenant actif pour %{participatory_space_title}.
370
+ orders:
371
+ checkout:
372
+ error: Une erreur s'est produite lors du traitement de votre vote
373
+ success: Votre vote a été enregistré avec succès
374
+ destroy:
375
+ error: Une erreur s'est produite lors de l'annulation de votre vote
376
+ success: Votre vote a été annulé avec succès
377
+ resource_links:
378
+ included_proposals:
379
+ project_proposal: "Propositions incluses dans ce projet:"
380
+ index:
381
+ confirmed_orders_count: Nombre de votes
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ Decidim.register_global_engine(
4
+ :lausanne_budgets,
5
+ ::Decidim::Lausanne::Budgets::Engine,
6
+ at: "/public_budgets"
7
+ )
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateLausanneProjects < ActiveRecord::Migration[5.0]
4
+ def change
5
+ create_table :loz_budgets_projects do |t|
6
+ t.jsonb :title
7
+ t.jsonb :description
8
+ t.bigint :budget_amount, null: false
9
+ t.references :decidim_component, index: true
10
+ t.references :decidim_scope, index: true
11
+
12
+ t.timestamps
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+
2
+ # frozen_string_literal: true
3
+
4
+ class CreateLausanneUserRecords < ActiveRecord::Migration[5.0]
5
+ def change
6
+ create_table :decidim_lausanne_user_records do |t|
7
+ t.string :last_name, null: false
8
+ t.string :first_name, null: false
9
+ t.string :birthdate, null: false
10
+ t.references :decidim_user, index: false, null: true
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateLausanneOrders < ActiveRecord::Migration[5.0]
4
+ def change
5
+ create_table :decidim_lausanne_budgets_orders do |t|
6
+ t.references :decidim_user, index: true
7
+ t.references :loz_user_record, index: true
8
+ t.references :decidim_component, index: true
9
+ t.datetime :checked_out_at
10
+
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :decidim_lausanne_budgets_orders, [:loz_user_record_id, :decidim_component_id], unique: true, name: "decidim_lausanne_budgets_order_user_record_component_unique"
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateLausanneLineItems < ActiveRecord::Migration[5.0]
4
+ def change
5
+ create_table :decidim_lausanne_budgets_line_items do |t|
6
+ t.references :decidim_order, index: true
7
+ t.references :decidim_project, index: true
8
+ end
9
+
10
+ add_index :decidim_lausanne_budgets_line_items, [:decidim_order_id, :decidim_project_id], unique: true, name: "decidim_lausanne_budgets_line_items_order_project_unique"
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddLausanneReferenceToProjects < ActiveRecord::Migration[5.0]
4
+ class Project < ApplicationRecord
5
+ self.table_name = :loz_budgets_projects
6
+ end
7
+
8
+ def change
9
+ add_column :loz_budgets_projects, :reference, :string
10
+ Project.find_each(&:save)
11
+ change_column_null :loz_budgets_projects, :reference, true
12
+ end
13
+ end