decidim-reporting_proposals 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.codeclimate.yml +32 -0
- data/.erb-lint.yml +30 -0
- data/.eslintignore +3 -0
- data/.eslintrc.json +239 -0
- data/.github/workflows/codeql-analysis.yml +74 -0
- data/.github/workflows/lint.yml +45 -0
- data/.github/workflows/test_integration.yml +125 -0
- data/.github/workflows/test_unit.yml +51 -0
- data/.gitignore +27 -0
- data/.rspec +3 -0
- data/.rubocop.yml +3 -0
- data/.rubocop_rails.yml +87 -0
- data/.rubocop_ruby.yml +1754 -0
- data/.ruby-version +1 -0
- data/.simplecov +13 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +40 -0
- data/Gemfile.lock +815 -0
- data/LICENSE-AGPLv3.txt +661 -0
- data/README.md +166 -0
- data/Rakefile +40 -0
- data/app/cells/decidim/reporting_proposals/edit_note_modal/show.erb +20 -0
- data/app/cells/decidim/reporting_proposals/edit_note_modal_cell.rb +37 -0
- data/app/commands/concerns/decidim/reporting_proposals/admin/create_category_override.rb +32 -0
- data/app/commands/concerns/decidim/reporting_proposals/admin/update_category_override.rb +32 -0
- data/app/commands/concerns/decidim/reporting_proposals/create_report_override.rb +19 -0
- data/app/commands/decidim/reporting_proposals/admin/update_proposal.rb +46 -0
- data/app/commands/decidim/reporting_proposals/admin/update_proposal_note.rb +36 -0
- data/app/commands/decidim/reporting_proposals/create_reporting_proposal.rb +68 -0
- data/app/controllers/concerns/decidim/reporting_proposals/admin/categories_controller_override.rb +16 -0
- data/app/controllers/concerns/decidim/reporting_proposals/admin/needs_header_snippets.rb +50 -0
- data/app/controllers/concerns/decidim/reporting_proposals/admin/proposal_answer_templates_controller_override.rb +18 -0
- data/app/controllers/concerns/decidim/reporting_proposals/admin/proposal_answers_controller_override.rb +35 -0
- data/app/controllers/concerns/decidim/reporting_proposals/admin/proposals_controller_override.rb +28 -0
- data/app/controllers/concerns/decidim/reporting_proposals/needs_proposal_extra_validations_snippets.rb +51 -0
- data/app/controllers/concerns/decidim/reporting_proposals/proposals_controller_override.rb +113 -0
- data/app/controllers/decidim/reporting_proposals/admin/application_controller.rb +18 -0
- data/app/controllers/decidim/reporting_proposals/admin/proposal_notes_controller.rb +38 -0
- data/app/controllers/decidim/reporting_proposals/admin/proposals_controller.rb +61 -0
- data/app/controllers/decidim/reporting_proposals/application_controller.rb +11 -0
- data/app/controllers/decidim/reporting_proposals/geolocation_controller.rb +32 -0
- data/app/forms/concerns/decidim/reporting_proposals/admin/category_form_override.rb +19 -0
- data/app/forms/concerns/decidim/reporting_proposals/form_builder_override.rb +48 -0
- data/app/forms/concerns/decidim/reporting_proposals/map_builder_override.rb +60 -0
- data/app/forms/decidim/reporting_proposals/admin/proposal_photo_form.rb +23 -0
- data/app/forms/decidim/reporting_proposals/proposal_form.rb +33 -0
- data/app/helpers/concerns/decidim/reporting_proposals/admin/proposals_helper_override.rb +63 -0
- data/app/helpers/concerns/decidim/reporting_proposals/proposal_wizard_helper_override.rb +61 -0
- data/app/jobs/decidim/reporting_proposals/assign_proposal_valuators_job.rb +51 -0
- data/app/models/concerns/decidim/reporting_proposals/category_override.rb +28 -0
- data/app/models/concerns/decidim/reporting_proposals/participatory_space_role_config/valuator_override.rb +17 -0
- data/app/models/concerns/decidim/reporting_proposals/participatory_space_user_role_override.rb +25 -0
- data/app/models/decidim/reporting_proposals/category_valuator.rb +28 -0
- data/app/overrides/decidim/admin/categories/_form/add_valuators_field.html.erb.deface +3 -0
- data/app/overrides/decidim/admin/categories/index/add_table_column_name.html.erb.deface +3 -0
- data/app/overrides/decidim/admin/categories/index/add_valuators.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposal_notes/_proposal_notes/add_edit_link.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposal_notes/_proposal_notes/add_links_to_note.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposals/_proposal-tr/add_td_hide_action.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposals/_proposal-tr/add_valuators_name.html.erb.deface +9 -0
- data/app/overrides/decidim/proposals/admin/proposals/_proposal-tr/replace_td_title.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposals/show/add_photo_management.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposals/show/add_send_email_btn.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposals/show/remove_photos.html.erb.deface +4 -0
- data/app/overrides/decidim/proposals/admin/proposals/show/replace_valuators.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/proposals/_proposal_similar/add_distance_badge.html.erb.deface +5 -0
- data/app/overrides/decidim/proposals/proposals/_wizard_header/replace_title.html.erb.deface +14 -0
- data/app/overrides/decidim/proposals/proposals/edit/add_user_group.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/proposals/edit/replace_javascript.html.erb.deface +8 -0
- data/app/overrides/decidim/proposals/proposals/edit/replace_partial_edit_form_fields.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/proposals/edit_draft/add_user_group.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/proposals/edit_draft/replace_javascript.html.erb.deface +8 -0
- data/app/overrides/decidim/proposals/proposals/edit_draft/replace_partial_edit_form_fields.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/proposals/index/add_additional_button.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/proposals/new/remove_title.html.erb.deface +1 -0
- data/app/overrides/decidim/proposals/proposals/new/replace_body.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/proposals/new/replace_javascript.html.erb.deface +8 -0
- data/app/overrides/decidim/proposals/proposals/show/add_additional_button.html.erb.deface +3 -0
- data/app/overrides/layouts/decidim/_process_header_steps/always_show_new_proposals.html.erb.deface +3 -0
- data/app/packs/entrypoints/decidim_reporting_proposals.js +6 -0
- data/app/packs/entrypoints/decidim_reporting_proposals_camera.js +2 -0
- data/app/packs/entrypoints/decidim_reporting_proposals_geocoding.js +2 -0
- data/app/packs/entrypoints/decidim_reporting_proposals_js_validations.js +1 -0
- data/app/packs/entrypoints/decidim_reporting_proposals_list_component_admin.js +1 -0
- data/app/packs/entrypoints/decidim_reporting_proposals_manage_component_admin.js +1 -0
- data/app/packs/images/.keep +0 -0
- data/app/packs/src/decidim/reporting_proposals/proposal_extra_validations.js +89 -0
- data/app/packs/src/decidim/reporting_proposals/proposals/add_proposal.js +66 -0
- data/app/packs/src/decidim/reporting_proposals/reverse_geocoding.js +54 -0
- data/app/packs/src/decidim/reporting_proposals/user_camera_inputs.js +49 -0
- data/app/packs/stylesheets/decidim/reporting_proposals/geocoding_addons.scss +34 -0
- data/app/packs/stylesheets/decidim/reporting_proposals/list_component_admin.scss +27 -0
- data/app/packs/stylesheets/decidim/reporting_proposals/manage_component_admin.scss +31 -0
- data/app/packs/stylesheets/decidim/reporting_proposals/proposals/add_proposal.scss +12 -0
- data/app/packs/stylesheets/decidim/reporting_proposals/user_camera_inputs.scss +19 -0
- data/app/permissions/concerns/decidim/reporting_proposals/admin/permissions_override.rb +27 -0
- data/app/permissions/decidim/reporting_proposals/admin/permissions.rb +79 -0
- data/app/permissions/decidim/reporting_proposals/permissions.rb +17 -0
- data/app/queries/decidim/reporting_proposals/nearby_proposals.rb +57 -0
- data/app/serializers/decidim/reporting_proposals/proposal_serializer_override.rb +77 -0
- data/app/validators/concerns/decidim/reporting_proposals/component_validator_override.rb +25 -0
- data/app/views/decidim/proposals/admin/proposal_notes/_editing_note.html.erb +18 -0
- data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes_body.html.erb +6 -0
- data/app/views/decidim/proposals/admin/proposals/_send_email_button.html.erb +4 -0
- data/app/views/decidim/proposals/proposals/_additional_button.html.erb +6 -0
- data/app/views/decidim/reporting_proposals/admin/categories/_column_valuators.html.erb +1 -0
- data/app/views/decidim/reporting_proposals/admin/categories/_valuators.html.erb +1 -0
- data/app/views/decidim/reporting_proposals/admin/categories/_valuators_field.html.erb +7 -0
- data/app/views/decidim/reporting_proposals/admin/proposals/_photo_form.html.erb +24 -0
- data/app/views/decidim/reporting_proposals/admin/proposals/_photo_gallery.html.erb +21 -0
- data/app/views/decidim/reporting_proposals/admin/proposals/_photos.html.erb +14 -0
- data/app/views/decidim/reporting_proposals/admin/proposals/_proposal_td_hide.html.erb +20 -0
- data/app/views/decidim/reporting_proposals/admin/proposals/_proposal_td_title.html.erb +41 -0
- data/app/views/decidim/reporting_proposals/proposals/_additional_button_for_show.html.erb +6 -0
- data/app/views/decidim/reporting_proposals/proposals/_new_proposal_fields.html.erb +7 -0
- data/app/views/decidim/reporting_proposals/proposals/_reporting_proposal_fields.html.erb +113 -0
- data/app/views/decidim/reporting_proposals/proposals/_user_group.html.erb +5 -0
- data/bin/rails +6 -0
- data/bin/webpack-dev-server +6 -0
- data/codecov.yml +11 -0
- data/config/assets.rb +13 -0
- data/config/i18n-tasks.yml +13 -0
- data/config/locales/ca.yml +366 -0
- data/config/locales/de.yml +366 -0
- data/config/locales/en.yml +426 -0
- data/config/locales/es.yml +366 -0
- data/crowdin.yml +45 -0
- data/db/migrate/20221219151846_create_decidim_categories_valuators.rb +17 -0
- data/decidim-reporting_proposals.gemspec +34 -0
- data/lib/decidim/api/reporting_proposals_type.rb +10 -0
- data/lib/decidim/reporting_proposals/admin.rb +8 -0
- data/lib/decidim/reporting_proposals/admin_engine.rb +31 -0
- data/lib/decidim/reporting_proposals/component.rb +490 -0
- data/lib/decidim/reporting_proposals/config.rb +53 -0
- data/lib/decidim/reporting_proposals/engine.rb +96 -0
- data/lib/decidim/reporting_proposals/test/factories.rb +13 -0
- data/lib/decidim/reporting_proposals/version.rb +15 -0
- data/lib/decidim/reporting_proposals.rb +13 -0
- data/package-lock.json +7844 -0
- data/package.json +195 -0
- metadata +319 -0
data/README.md
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
# Reporting proposals component for Decidim
|
2
|
+
|
3
|
+
[![[CI] Lint](https://github.com/openpoke/decidim-module-reporting-proposals/actions/workflows/lint.yml/badge.svg)](https://github.com/openpoke/decidim-module-reporting-proposals/actions/workflows/lint.yml)
|
4
|
+
[![[CI] Test (unit)](https://github.com/openpoke/decidim-module-reporting-proposals/actions/workflows/test_unit.yml/badge.svg)](https://github.com/openpoke/decidim-module-reporting-proposals/actions/workflows/test_unit.yml)
|
5
|
+
[![[CI] Test (integration)](https://github.com/openpoke/decidim-module-reporting-proposals/actions/workflows/test_integration.yml/badge.svg)](https://github.com/openpoke/decidim-module-reporting-proposals/actions/workflows/test_integration.yml)
|
6
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/1b469dba958dedd29046/maintainability)](https://codeclimate.com/github/openpoke/decidim-module-reporting-proposals/maintainability)
|
7
|
+
[![codecov](https://codecov.io/gh/openpoke/decidim-module-reporting-proposals/branch/main/graph/badge.svg?token=X11YWWSMO4)](https://codecov.io/gh/openpoke/decidim-module-reporting-proposals)
|
8
|
+
[![Gem Version](https://badge.fury.io/rb/decidim-reporting_proposals.svg)](https://badge.fury.io/rb/decidim-reporting_proposals)
|
9
|
+
|
10
|
+
This module creates a new component to be used in participatory spaces that allows to create proposals orientated to manage geolocated issues in a city. For instance Damages or new ideas of improving a particular street or public good.
|
11
|
+
|
12
|
+
> NOTE: in development, not ready for production.
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
Add this line to your application's Gemfile:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
gem 'decidim-reporting_proposals', git: "https://github.com/openpoke/decidim-module-reporting_proposals"
|
20
|
+
```
|
21
|
+
|
22
|
+
And then execute:
|
23
|
+
|
24
|
+
```
|
25
|
+
bundle
|
26
|
+
And then execute:
|
27
|
+
bundle exec rails decidim_reporting_proposals:install:migrations
|
28
|
+
```
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
TODO...
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
# config/initializers/reporting_proposals.rb
|
36
|
+
|
37
|
+
Decidim::ReportingProposals.configure do |config|
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
## Contributing
|
42
|
+
|
43
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/openpoke/decidim-module-reporting_proposals.
|
44
|
+
|
45
|
+
### Developing
|
46
|
+
|
47
|
+
To start contributing to this project, first:
|
48
|
+
|
49
|
+
- Install the basic dependencies (such as Ruby and PostgreSQL)
|
50
|
+
- Clone this repository
|
51
|
+
|
52
|
+
Decidim's main repository also provides a Docker configuration file if you
|
53
|
+
prefer to use Docker instead of installing the dependencies locally on your
|
54
|
+
machine.
|
55
|
+
|
56
|
+
You can create the development app by running the following commands after
|
57
|
+
cloning this project:
|
58
|
+
|
59
|
+
```bash
|
60
|
+
$ bundle
|
61
|
+
$ DATABASE_USERNAME=<username> DATABASE_PASSWORD=<password> bundle exec rake development_app
|
62
|
+
```
|
63
|
+
|
64
|
+
Note that the database user has to have rights to create and drop a database in
|
65
|
+
order to create the dummy test app database.
|
66
|
+
|
67
|
+
Then to test how the module works in Decidim, start the development server:
|
68
|
+
|
69
|
+
```bash
|
70
|
+
$ DATABASE_USERNAME=<username> DATABASE_PASSWORD=<password> bin/rails s
|
71
|
+
```
|
72
|
+
|
73
|
+
Note that `bin/rails` is a convinient wrapper around the command `cd development_app; bundle exec rails`.
|
74
|
+
|
75
|
+
In case you are using [rbenv](https://github.com/rbenv/rbenv) and have the
|
76
|
+
[rbenv-vars](https://github.com/rbenv/rbenv-vars) plugin installed for it, you
|
77
|
+
can add the environment variables to the root directory of the project in a file
|
78
|
+
named `.rbenv-vars`. If these are defined for the environment, you can omit
|
79
|
+
defining these in the commands shown above.
|
80
|
+
|
81
|
+
#### Webpacker notes
|
82
|
+
|
83
|
+
As latests versions of Decidim, this repository uses Webpacker for Rails. This means that compilation
|
84
|
+
of assets is required everytime a Javascript or CSS file is modified. Usually, this happens
|
85
|
+
automatically, but in some cases (specially when actively changes that type of files) you want to
|
86
|
+
speed up the process.
|
87
|
+
|
88
|
+
To do that, start in a separate terminal than the one with `bin/rails s`, and BEFORE it, the following command:
|
89
|
+
|
90
|
+
```
|
91
|
+
bin/webpack-dev-server
|
92
|
+
```
|
93
|
+
|
94
|
+
#### Code Styling
|
95
|
+
|
96
|
+
Please follow the code styling defined by the different linters that ensure we
|
97
|
+
are all talking with the same language collaborating on the same project. This
|
98
|
+
project is set to follow the same rules that Decidim itself follows.
|
99
|
+
|
100
|
+
[Rubocop](https://rubocop.readthedocs.io/) linter is used for the Ruby language.
|
101
|
+
|
102
|
+
You can run the code styling checks by running the following commands from the
|
103
|
+
console:
|
104
|
+
|
105
|
+
```
|
106
|
+
$ bundle exec rubocop
|
107
|
+
```
|
108
|
+
|
109
|
+
To ease up following the style guide, you should install the plugin to your
|
110
|
+
favorite editor, such as:
|
111
|
+
|
112
|
+
- Atom - [linter-rubocop](https://atom.io/packages/linter-rubocop)
|
113
|
+
- Sublime Text - [Sublime RuboCop](https://github.com/pderichs/sublime_rubocop)
|
114
|
+
- Visual Studio Code - [Rubocop for Visual Studio Code](https://github.com/misogi/vscode-ruby-rubocop)
|
115
|
+
|
116
|
+
#### Non-Ruby Code Styling
|
117
|
+
|
118
|
+
There are other linters for Javascript and CSS. These run using NPM packages. You can
|
119
|
+
run the following commands:
|
120
|
+
|
121
|
+
1. `npm run lint`: Runs the linter for Javascript files.
|
122
|
+
2. `npm run lint-fix`: Automatically fix issues for Javascript files (if possible).
|
123
|
+
3. `npm run stylelint`: Runs the linter for SCSS files.
|
124
|
+
4. `npm run stylelint-fix`: Automatically fix issues for SCSS files (if possible).
|
125
|
+
|
126
|
+
### Testing
|
127
|
+
|
128
|
+
To run the tests run the following in the gem development path:
|
129
|
+
|
130
|
+
```bash
|
131
|
+
$ bundle
|
132
|
+
$ DATABASE_USERNAME=<username> DATABASE_PASSWORD=<password> bundle exec rake test_app
|
133
|
+
$ DATABASE_USERNAME=<username> DATABASE_PASSWORD=<password> bundle exec rspec
|
134
|
+
```
|
135
|
+
|
136
|
+
Note that the database user has to have rights to create and drop a database in
|
137
|
+
order to create the dummy test app database.
|
138
|
+
|
139
|
+
In case you are using [rbenv](https://github.com/rbenv/rbenv) and have the
|
140
|
+
[rbenv-vars](https://github.com/rbenv/rbenv-vars) plugin installed for it, you
|
141
|
+
can add these environment variables to the root directory of the project in a
|
142
|
+
file named `.rbenv-vars`. In this case, you can omit defining these in the
|
143
|
+
commands shown above.
|
144
|
+
|
145
|
+
### Test code coverage
|
146
|
+
|
147
|
+
If you want to generate the code coverage report for the tests, you can use
|
148
|
+
the `SIMPLECOV=1` environment variable in the rspec command as follows:
|
149
|
+
|
150
|
+
```bash
|
151
|
+
$ SIMPLECOV=1 bundle exec rspec
|
152
|
+
```
|
153
|
+
|
154
|
+
This will generate a folder named `coverage` in the project root which contains
|
155
|
+
the code coverage report.
|
156
|
+
|
157
|
+
### Localization
|
158
|
+
|
159
|
+
If you would like to see this module in your own language, you can help with its
|
160
|
+
translation at Crowdin:
|
161
|
+
|
162
|
+
https://crowdin.com/project/decidim-reporting_proposals
|
163
|
+
|
164
|
+
## License
|
165
|
+
|
166
|
+
See [LICENSE-AGPLv3.txt](LICENSE-AGPLv3.txt).
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "decidim/dev/common_rake"
|
4
|
+
|
5
|
+
def install_module(path)
|
6
|
+
Dir.chdir(path) do
|
7
|
+
system("bundle exec rake decidim_reporting_proposals:install:migrations")
|
8
|
+
system("bundle exec rake db:migrate")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def seed_db(path)
|
13
|
+
Dir.chdir(path) do
|
14
|
+
system("bundle exec rake db:seed")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Generates a dummy app for testing"
|
19
|
+
task test_app: "decidim:generate_external_test_app" do
|
20
|
+
ENV["RAILS_ENV"] = "test"
|
21
|
+
install_module("spec/decidim_dummy_app")
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Generates a development app."
|
25
|
+
task :development_app do
|
26
|
+
Bundler.with_original_env do
|
27
|
+
generate_decidim_app(
|
28
|
+
"development_app",
|
29
|
+
"--app_name",
|
30
|
+
"#{base_app_name}_development_app",
|
31
|
+
"--path",
|
32
|
+
"..",
|
33
|
+
"--recreate_db",
|
34
|
+
"--demo"
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
install_module("development_app")
|
39
|
+
seed_db("development_app")
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<div class="reveal edit-note-modal" id="<%= modal_id %>" data-reveal role="dialog" aria-modal="true"
|
2
|
+
aria-labelledby="<%= modal_id %>-label">
|
3
|
+
<div class="reveal__header">
|
4
|
+
<h3 id="<%= modal_id %>-label" class="reveal__title"><%= t("modal.title", scope: "decidim.reporting_proposals.admin.proposal_notes") %></h3>
|
5
|
+
<button class="close-button" data-close aria-label="Close" type="button">
|
6
|
+
<span aria-hidden="true">×</span>
|
7
|
+
</button>
|
8
|
+
</div>
|
9
|
+
<%= decidim_form_for(notes_form,
|
10
|
+
url: note_path,
|
11
|
+
method: :patch,
|
12
|
+
html: { class: "form edit_proposal_note" }) do |f| %>
|
13
|
+
<div class="row column">
|
14
|
+
<%= f.text_area :body, rows: 10, label: t("modal.body", scope: "decidim.reporting_proposals.admin.proposal_notes"), value: note_body %>
|
15
|
+
</div>
|
16
|
+
<div class="button--double">
|
17
|
+
<%= f.submit t("modal.update", scope: "decidim.reporting_proposals.admin.proposal_notes") %>
|
18
|
+
</div>
|
19
|
+
<% end %>
|
20
|
+
</div>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
class EditNoteModalCell < Decidim::ViewModel
|
6
|
+
include ActionView::Helpers::FormOptionsHelper
|
7
|
+
|
8
|
+
def show
|
9
|
+
render if note
|
10
|
+
end
|
11
|
+
|
12
|
+
def note
|
13
|
+
model
|
14
|
+
end
|
15
|
+
|
16
|
+
def proposal
|
17
|
+
Decidim::Proposals::Proposal.find(model.decidim_proposal_id)
|
18
|
+
end
|
19
|
+
|
20
|
+
def note_body
|
21
|
+
model.body
|
22
|
+
end
|
23
|
+
|
24
|
+
def modal_id
|
25
|
+
options[:modal_id] || "editNoteModal"
|
26
|
+
end
|
27
|
+
|
28
|
+
def notes_form
|
29
|
+
@notes_form = Decidim::Proposals::Admin::ProposalNoteForm.from_model(note)
|
30
|
+
end
|
31
|
+
|
32
|
+
def note_path
|
33
|
+
Decidim::ReportingProposals::AdminEngine.routes.url_helpers.proposal_note_path(proposal_id: proposal.id, id: note)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
module CreateCategoryOverride
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
def call
|
11
|
+
return broadcast(:invalid) if form.invalid?
|
12
|
+
|
13
|
+
transaction do
|
14
|
+
@category = create_category
|
15
|
+
update_valuators
|
16
|
+
end
|
17
|
+
|
18
|
+
broadcast(:ok)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def update_valuators
|
24
|
+
@category.participatory_space.user_roles.where(id: form.valuator_ids).each do |valuator|
|
25
|
+
Decidim::ReportingProposals::CategoryValuator.create!(category: @category, valuator_role: valuator)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
module UpdateCategoryOverride
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
def call
|
11
|
+
return broadcast(:invalid) if form.invalid?
|
12
|
+
|
13
|
+
transaction do
|
14
|
+
update_category
|
15
|
+
update_valuators
|
16
|
+
end
|
17
|
+
broadcast(:ok)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def update_valuators
|
23
|
+
category.category_valuators.destroy_all
|
24
|
+
category.participatory_space.user_roles.where(id: form.valuator_ids).each do |valuator|
|
25
|
+
Decidim::ReportingProposals::CategoryValuator.create!(category: category, valuator_role: valuator)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module CreateReportOverride
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
def send_hide_notification_to_moderators
|
10
|
+
participatory_space_moderators.each do |moderator|
|
11
|
+
next unless moderator.email_on_moderations
|
12
|
+
|
13
|
+
ReportedMailer.hide(moderator, @report).deliver_later unless @current_user == moderator
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
# A command with all the business logic when a user updates a proposal.
|
7
|
+
class UpdateProposal < Decidim::Proposals::Admin::UpdateProposal
|
8
|
+
# Public: Initializes the command.
|
9
|
+
#
|
10
|
+
# form - A form object with the params.
|
11
|
+
# proposal - the proposal to update.
|
12
|
+
def initialize(form, proposal)
|
13
|
+
@form = form
|
14
|
+
@proposal = proposal
|
15
|
+
@attached_to = proposal
|
16
|
+
end
|
17
|
+
|
18
|
+
# Executes the command. Broadcasts these events:
|
19
|
+
#
|
20
|
+
# - :ok when everything is valid, together with the proposal.
|
21
|
+
# - :invalid if the form wasn't valid and we couldn't proceed.
|
22
|
+
#
|
23
|
+
# Returns nothing.
|
24
|
+
def call
|
25
|
+
return broadcast(:invalid) if form.invalid?
|
26
|
+
|
27
|
+
if process_gallery?
|
28
|
+
build_gallery
|
29
|
+
return broadcast(:invalid) if gallery_invalid?
|
30
|
+
end
|
31
|
+
|
32
|
+
transaction do
|
33
|
+
create_gallery if process_gallery?
|
34
|
+
photo_cleanup!
|
35
|
+
end
|
36
|
+
|
37
|
+
broadcast(:ok, proposal)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
attr_reader :form, :proposal, :gallery
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
# A command with all the business logic when a user updates a proposal note.
|
7
|
+
class UpdateProposalNote < Rectify::Command
|
8
|
+
# Public: Initializes the command.
|
9
|
+
#
|
10
|
+
# form - A form object with the params.
|
11
|
+
# note - the proposal_note to update.
|
12
|
+
def initialize(notes_form, note)
|
13
|
+
@notes_form = notes_form
|
14
|
+
@note = note
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
return broadcast(:invalid) if notes_form.invalid?
|
19
|
+
|
20
|
+
update_proposal_note
|
21
|
+
|
22
|
+
broadcast(:ok, note)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :notes_form, :note, :proposal
|
28
|
+
|
29
|
+
def update_proposal_note
|
30
|
+
note.body = notes_form.body
|
31
|
+
note.save!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
class CreateReportingProposal < Decidim::Proposals::CreateProposal
|
6
|
+
include ::Decidim::MultipleAttachmentsMethods
|
7
|
+
include ::Decidim::Proposals::GalleryMethods
|
8
|
+
|
9
|
+
def call
|
10
|
+
return broadcast(:invalid) if form.invalid?
|
11
|
+
|
12
|
+
if process_attachments?
|
13
|
+
build_attachments
|
14
|
+
return broadcast(:invalid) if attachments_invalid?
|
15
|
+
end
|
16
|
+
|
17
|
+
if process_gallery?
|
18
|
+
build_gallery
|
19
|
+
return broadcast(:invalid) if gallery_invalid?
|
20
|
+
end
|
21
|
+
|
22
|
+
if proposal_limit_reached?
|
23
|
+
form.errors.add(:base, I18n.t("decidim.proposals.new.limit_reached"))
|
24
|
+
return broadcast(:invalid)
|
25
|
+
end
|
26
|
+
|
27
|
+
transaction do
|
28
|
+
create_reporting_proposal
|
29
|
+
|
30
|
+
@attached_to = @proposal
|
31
|
+
create_gallery if process_gallery?
|
32
|
+
create_attachments if process_attachments?
|
33
|
+
end
|
34
|
+
|
35
|
+
broadcast(:ok, proposal)
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_reporting_proposal
|
39
|
+
PaperTrail.request(enabled: false) do
|
40
|
+
@proposal = Decidim.traceability.perform_action!(
|
41
|
+
:create,
|
42
|
+
Decidim::Proposals::Proposal,
|
43
|
+
@current_user,
|
44
|
+
visibility: "public-only"
|
45
|
+
) do
|
46
|
+
proposal = Decidim::Proposals::Proposal.new(
|
47
|
+
title: {
|
48
|
+
I18n.locale => title_with_hashtags
|
49
|
+
},
|
50
|
+
body: {
|
51
|
+
I18n.locale => body_with_hashtags
|
52
|
+
},
|
53
|
+
category: form.category,
|
54
|
+
scope: form.scope,
|
55
|
+
address: form.address,
|
56
|
+
latitude: form.latitude,
|
57
|
+
longitude: form.longitude,
|
58
|
+
component: form.component
|
59
|
+
)
|
60
|
+
proposal.add_coauthor(@current_user, user_group: user_group)
|
61
|
+
proposal.save!
|
62
|
+
proposal
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/app/controllers/concerns/decidim/reporting_proposals/admin/categories_controller_override.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
# Exposes the proposal resource so users can view and create them.
|
7
|
+
module CategoriesControllerOverride
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
helper Decidim::Proposals::Admin::ProposalBulkActionsHelper
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
# Exposes the proposal resource so users can view and create them.
|
7
|
+
module NeedsHeaderSnippets
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
helper_method :snippets
|
12
|
+
end
|
13
|
+
|
14
|
+
def snippets
|
15
|
+
@snippets ||= Decidim::Snippets.new
|
16
|
+
|
17
|
+
unless @snippets.any?(:reporting_proposals_manage_component) && reporting_proposals_component?
|
18
|
+
@snippets.add(:reporting_proposals_manage_component, ActionController::Base.helpers.stylesheet_pack_tag("decidim_reporting_proposals_manage_component_admin"))
|
19
|
+
@snippets.add(:head, @snippets.for(:reporting_proposals_manage_component))
|
20
|
+
end
|
21
|
+
|
22
|
+
unless @snippets.any?(:reporting_proposals_list_component) && any_proposals_component?
|
23
|
+
@snippets.add(:reporting_proposals_list_component, ActionController::Base.helpers.stylesheet_pack_tag("decidim_reporting_proposals_list_component_admin"))
|
24
|
+
@snippets.add(:head, @snippets.for(:reporting_proposals_list_component))
|
25
|
+
end
|
26
|
+
|
27
|
+
@snippets
|
28
|
+
end
|
29
|
+
|
30
|
+
def reporting_proposals_component?
|
31
|
+
current_component&.manifest_name == "reporting_proposals"
|
32
|
+
end
|
33
|
+
|
34
|
+
def any_proposals_component?
|
35
|
+
current_component&.manifest_name.in? %w(proposals reporting_proposals)
|
36
|
+
end
|
37
|
+
|
38
|
+
def current_component
|
39
|
+
@current_component ||= begin
|
40
|
+
if defined?(query_scope) && query_scope.respond_to?(:find)
|
41
|
+
query_scope.find_by(id: params[:id])
|
42
|
+
elsif params.has_key?(:component_id)
|
43
|
+
Decidim::Component.find_by(id: params[:component_id])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
# Exposes the proposal resource so users can view and create them.
|
7
|
+
module ProposalAnswerTemplatesControllerOverride
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
def accepted_components
|
12
|
+
[:proposals, :reporting_proposals]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
# Exposes the proposal resource so users can view and create them.
|
7
|
+
module ProposalAnswersControllerOverride
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
helper Decidim::Proposals::Admin::ProposalBulkActionsHelper
|
12
|
+
def update
|
13
|
+
enforce_permission_to :create, :proposal_answer, proposal: proposal
|
14
|
+
|
15
|
+
@notes_form = form(Decidim::Proposals::Admin::ProposalNoteForm).instance
|
16
|
+
@answer_form = form(Decidim::Proposals::Admin::ProposalAnswerForm).from_params(params)
|
17
|
+
@photo_form = form(Decidim::ReportingProposals::Admin::ProposalPhotoForm).instance
|
18
|
+
|
19
|
+
Decidim::Proposals::Admin::AnswerProposal.call(@answer_form, proposal) do
|
20
|
+
on(:ok) do
|
21
|
+
flash[:notice] = I18n.t("proposals.answer.success", scope: "decidim.proposals.admin")
|
22
|
+
redirect_to proposals_path
|
23
|
+
end
|
24
|
+
|
25
|
+
on(:invalid) do
|
26
|
+
flash.keep[:alert] = I18n.t("proposals.answer.invalid", scope: "decidim.proposals.admin")
|
27
|
+
render template: "decidim/proposals/admin/proposals/show"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/app/controllers/concerns/decidim/reporting_proposals/admin/proposals_controller_override.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module ReportingProposals
|
5
|
+
module Admin
|
6
|
+
# Exposes the proposal resource so users can view and create them.
|
7
|
+
module ProposalsControllerOverride
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
helper_method :reporting_proposal?, :proposals, :query, :form_presenter, :proposal, :proposal_ids
|
12
|
+
def show
|
13
|
+
@notes_form = form(Decidim::Proposals::Admin::ProposalNoteForm).instance
|
14
|
+
@answer_form = form(Decidim::Proposals::Admin::ProposalAnswerForm).from_model(proposal)
|
15
|
+
@photo_form = form(Decidim::ReportingProposals::Admin::ProposalPhotoForm).instance
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def reporting_proposal?
|
21
|
+
component = current_component || @photo_form.current_component
|
22
|
+
component.manifest_name == "reporting_proposals"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|