decidim-reporting_proposals 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/lint.yml +3 -3
  3. data/.github/workflows/test_integration.yml +19 -5
  4. data/.github/workflows/test_unit.yml +19 -5
  5. data/.gitignore +2 -0
  6. data/.rubocop.yml +1 -3
  7. data/.rubocop_ruby.yml +1 -2
  8. data/.ruby-version +1 -1
  9. data/.simplecov +14 -9
  10. data/Gemfile +6 -5
  11. data/Gemfile.lock +382 -400
  12. data/README.md +14 -9
  13. data/Rakefile +0 -2
  14. data/app/cells/concerns/decidim/reporting_proposals/linked_resources_for_cell_override.rb +23 -0
  15. data/app/cells/decidim/reporting_proposals/edit_note_modal/show.erb +22 -19
  16. data/app/commands/concerns/decidim/{proposals → reporting_proposals}/admin/answer_proposal_override.rb +2 -2
  17. data/app/commands/concerns/decidim/{proposals → reporting_proposals}/admin/assign_proposals_to_valuator_override.rb +1 -1
  18. data/app/commands/concerns/decidim/reporting_proposals/admin/update_category_override.rb +1 -1
  19. data/app/commands/concerns/decidim/reporting_proposals/admin/update_proposal_answer_template_override.rb +26 -0
  20. data/app/commands/concerns/decidim/{proposals → reporting_proposals}/publish_proposal_override.rb +2 -2
  21. data/app/commands/decidim/reporting_proposals/create_reporting_proposal.rb +1 -1
  22. data/app/commands/decidim/reporting_proposals/update_reporting_proposal.rb +38 -0
  23. data/app/controllers/concerns/decidim/reporting_proposals/admin/proposal_answer_templates_controller_override.rb +31 -0
  24. data/app/controllers/concerns/decidim/reporting_proposals/admin/proposal_answers_controller_override.rb +1 -1
  25. data/app/controllers/concerns/decidim/reporting_proposals/admin/proposals_controller_override.rb +3 -1
  26. data/app/controllers/concerns/decidim/reporting_proposals/admin/valuation_assignments_controller_override.rb +57 -0
  27. data/app/controllers/concerns/decidim/reporting_proposals/needs_proposal_extra_validations_snippets.rb +0 -1
  28. data/app/controllers/concerns/decidim/reporting_proposals/proposals_controller_override.rb +39 -0
  29. data/app/controllers/decidim/reporting_proposals/admin/proposals_controller.rb +4 -4
  30. data/app/controllers/decidim/reporting_proposals/geolocation_controller.rb +1 -1
  31. data/app/events/concerns/decidim/{proposals → reporting_proposals}/publish_proposal_event_override.rb +1 -1
  32. data/app/forms/concerns/decidim/reporting_proposals/form_builder_override.rb +9 -16
  33. data/app/forms/concerns/decidim/reporting_proposals/map_builder_override.rb +6 -5
  34. data/app/forms/decidim/reporting_proposals/admin/proposal_photo_form.rb +1 -5
  35. data/app/forms/decidim/reporting_proposals/proposal_form.rb +2 -0
  36. data/app/helpers/concerns/decidim/reporting_proposals/proposal_wizard_helper_override.rb +7 -30
  37. data/app/helpers/concerns/decidim/reporting_proposals/resource_helper_override.rb +1 -1
  38. data/app/mailers/concerns/decidim/reporting_proposals/admin/hidden_resource_mailer.rb +30 -0
  39. data/app/mailers/concerns/decidim/{proposals → reporting_proposals}/admin/notification_answer_proposal_mailer.rb +1 -1
  40. data/app/mailers/concerns/decidim/{proposals → reporting_proposals}/admin/proposals_valuator_mailer.rb +2 -2
  41. data/app/mailers/concerns/decidim/{proposals → reporting_proposals}/notification_publish_proposal_mailer.rb +1 -1
  42. data/app/mailers/concerns/decidim/reporting_proposals/reported_mailer_override.rb +18 -0
  43. data/app/overrides/decidim/proposals/admin/proposals/show/add_address.html.erb.deface +1 -1
  44. data/app/overrides/decidim/proposals/admin/proposals/show/add_photo_management.html.erb.deface +1 -1
  45. data/app/overrides/decidim/proposals/admin/proposals/show/add_send_email_btn.html.erb.deface +1 -1
  46. data/app/overrides/decidim/proposals/admin/proposals/show/add_valuators_form.html.erb.deface +16 -10
  47. data/app/overrides/decidim/proposals/proposals/_wizard_header/add_description.html.erb.deface +5 -0
  48. data/app/overrides/decidim/proposals/proposals/_wizard_header/replace_title.html.erb.deface +5 -6
  49. data/app/overrides/decidim/proposals/proposals/compare/add_css.html.erb.deface +5 -0
  50. data/app/overrides/decidim/proposals/proposals/compare/add_distance_badge.html.erb.deface +10 -0
  51. data/app/overrides/decidim/proposals/proposals/edit/add_css.html.erb.deface +1 -1
  52. data/app/overrides/decidim/proposals/proposals/edit/replace_javascript.html.erb.deface +2 -2
  53. data/app/overrides/decidim/proposals/proposals/edit_draft/replace_javascript.html.erb.deface +3 -3
  54. data/app/overrides/decidim/proposals/proposals/edit_draft/replace_partial_edit_form_fields.html.erb.deface +6 -1
  55. data/app/overrides/decidim/proposals/proposals/new/add_css.html.erb.deface +2 -2
  56. data/app/overrides/decidim/proposals/proposals/new/remove_body.html.erb.deface +1 -0
  57. data/app/overrides/decidim/proposals/proposals/new/remove_title.html.erb.deface +1 -1
  58. data/app/overrides/decidim/proposals/proposals/new/replace_javascript.html.erb.deface +2 -2
  59. data/app/overrides/decidim/proposals/proposals/preview/add_css.html.erb.deface +5 -0
  60. data/app/overrides/decidim/proposals/proposals/show/add_additional_button.html.erb.deface +1 -1
  61. data/app/packs/entrypoints/decidim_reporting_proposals.js +1 -0
  62. data/app/packs/src/decidim/reporting_proposals/proposal_extra_validations.js +12 -13
  63. data/app/packs/src/decidim/reporting_proposals/proposals/add_proposal.js +45 -41
  64. data/app/packs/src/decidim/reporting_proposals/reverse_geocoding.js +0 -2
  65. data/app/packs/src/decidim/reporting_proposals/user_camera_inputs.js +7 -7
  66. data/app/packs/stylesheets/decidim/reporting_proposals/geocoding_addons.scss +9 -26
  67. data/app/packs/stylesheets/decidim/reporting_proposals/list_component_admin.scss +6 -6
  68. data/app/packs/stylesheets/decidim/reporting_proposals/manage_component_admin.scss +44 -30
  69. data/app/packs/stylesheets/decidim/reporting_proposals/proposals/add_proposal.scss +9 -4
  70. data/app/packs/stylesheets/decidim/reporting_proposals/user_camera_inputs.scss +21 -13
  71. data/app/permissions/concerns/decidim/reporting_proposals/admin/permissions_override.rb +73 -0
  72. data/app/permissions/decidim/templates/admin/permissions.rb +51 -0
  73. data/app/presenters/concerns/decidim/reporting_proposals/resource_locator_presenter_override.rb +40 -0
  74. data/app/resources/concerns/decidim/reporting_proposals/resource_manifest_override.rb +16 -0
  75. data/app/serializers/decidim/reporting_proposals/proposal_serializer_override.rb +4 -4
  76. data/app/views/decidim/proposals/admin/proposal_notes/_editing_note.html.erb +3 -3
  77. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes_body.html.erb +1 -1
  78. data/app/views/decidim/proposals/admin/proposals/_address.html.erb +11 -10
  79. data/app/views/decidim/proposals/admin/proposals/_send_email_button.html.erb +6 -4
  80. data/app/views/decidim/proposals/proposals/_additional_button.html.erb +1 -1
  81. data/app/views/decidim/proposals/proposals/index.js.erb +0 -2
  82. data/app/views/decidim/reporting_proposals/admin/proposals/_photo_form.html.erb +2 -3
  83. data/app/views/decidim/reporting_proposals/admin/proposals/_photo_gallery.html.erb +3 -4
  84. data/app/views/decidim/reporting_proposals/admin/proposals/_photos.html.erb +15 -11
  85. data/app/views/decidim/reporting_proposals/admin/proposals/_proposal_td_hide.html.erb +7 -11
  86. data/app/views/decidim/reporting_proposals/admin/proposals/_proposal_td_title.html.erb +2 -2
  87. data/app/views/decidim/reporting_proposals/admin/proposals_valuator_mailer/notify_proposals_valuator.html.erb +17 -0
  88. data/app/views/decidim/reporting_proposals/proposals/_additional_button_for_show.html.erb +5 -2
  89. data/app/views/decidim/reporting_proposals/proposals/_camera_button.html.erb +26 -0
  90. data/app/views/decidim/reporting_proposals/proposals/_new_proposal_fields.html.erb +7 -5
  91. data/app/views/decidim/reporting_proposals/proposals/_reporting_proposal_fields.html.erb +61 -86
  92. data/app/views/decidim/reporting_proposals/proposals/_user_group.html.erb +1 -1
  93. data/bin/dev +5 -0
  94. data/bin/{webpack-dev-server → shakapacker} +1 -1
  95. data/bin/shakapacker-dev-server +6 -0
  96. data/config/assets.rb +1 -3
  97. data/config/locales/ca.yml +0 -2
  98. data/config/locales/en.yml +22 -48
  99. data/decidim-reporting_proposals.gemspec +1 -2
  100. data/lib/decidim/reporting_proposals/admin_engine.rb +4 -0
  101. data/lib/decidim/reporting_proposals/component.rb +26 -26
  102. data/lib/decidim/reporting_proposals/engine.rb +18 -12
  103. data/lib/decidim/reporting_proposals/test/factories.rb +2 -12
  104. data/lib/decidim/reporting_proposals/version.rb +3 -4
  105. data/lib/tasks/reporting_proposals_upgrade.rake +5 -0
  106. data/package-lock.json +4072 -5101
  107. data/package.json +12 -7
  108. metadata +73 -105
  109. data/app/commands/concerns/decidim/admin/hide_resource_override.rb +0 -34
  110. data/app/commands/concerns/decidim/templates/admin/copy_questionnaire_template_override.rb +0 -32
  111. data/app/commands/concerns/decidim/templates/admin/create_questionnaire_template_override.rb +0 -32
  112. data/app/commands/decidim/templates/admin/copy_proposal_answer_template.rb +0 -35
  113. data/app/commands/decidim/templates/admin/create_proposal_answer_template.rb +0 -48
  114. data/app/commands/decidim/templates/admin/update_proposal_answer_template.rb +0 -52
  115. data/app/controllers/concerns/decidim/proposals/admin/valuation_assignments_controller_override.rb +0 -35
  116. data/app/controllers/concerns/decidim/templates/admin/application_controller_override.rb +0 -20
  117. data/app/controllers/decidim/templates/admin/proposal_answer_templates_controller.rb +0 -183
  118. data/app/forms/decidim/templates/admin/proposal_answer_template_form.rb +0 -21
  119. data/app/mailers/concerns/decidim/admin/hidden_resource_mailer.rb +0 -28
  120. data/app/mailers/concerns/decidim/reported_mailer_override.rb +0 -16
  121. data/app/overrides/decidim/proposals/admin/proposal_answers/_form/add_template_chooser.html.erb.deface +0 -5
  122. data/app/overrides/decidim/proposals/proposals/_edit_form_fields/replace_add_photos.html.erb.deface +0 -37
  123. data/app/overrides/decidim/proposals/proposals/_proposal_similar/add_distance_badge.html.erb.deface +0 -5
  124. data/app/overrides/decidim/proposals/proposals/edit_draft/add_css.html.erb.deface +0 -5
  125. data/app/overrides/decidim/proposals/proposals/edit_draft/add_user_group.html.erb.deface +0 -3
  126. data/app/packs/entrypoints/decidim_reporting_proposals_js_validations.js +0 -1
  127. data/app/packs/entrypoints/decidim_templates_admin.js +0 -1
  128. data/app/packs/src/decidim/templates/admin/proposal_answer_template_chooser.js +0 -27
  129. data/app/permissions/decidim/templates/admin/extra_permissions.rb +0 -37
  130. data/app/presenters/concerns/decidim/resource_locator_presenter_override.rb +0 -38
  131. data/app/resources/concerns/decidim/resource_manifest_override.rb +0 -14
  132. data/app/views/decidim/proposals/admin/proposals_valuator_mailer/notify_proposals_valuator.html.erb +0 -17
  133. data/app/views/decidim/templates/admin/proposal_answer_templates/_form.html.erb +0 -34
  134. data/app/views/decidim/templates/admin/proposal_answer_templates/_template_chooser.html.erb +0 -16
  135. data/app/views/decidim/templates/admin/proposal_answer_templates/edit.html.erb +0 -3
  136. data/app/views/decidim/templates/admin/proposal_answer_templates/index.html.erb +0 -52
  137. data/app/views/decidim/templates/admin/proposal_answer_templates/new.html.erb +0 -6
  138. data/db/migrate/20230404103706_add_target_and_field_values_to_decidim_templates_templates.rb +0 -8
  139. data/db/migrate/20230404104741_migrate_templatable.rb +0 -13
  140. /data/app/views/decidim/{admin → reporting_proposals/admin}/hidden_resource_mailer/notify_mail.html.erb +0 -0
  141. /data/app/views/decidim/{proposals → reporting_proposals}/admin/notification_answer_proposal_mailer/notify_proposal_author.html.erb +0 -0
  142. /data/app/views/decidim/{proposals → reporting_proposals}/notification_publish_proposal_mailer/notify_proposal_author.html.erb +0 -0
@@ -1,27 +1,27 @@
1
- .table__title-block{
1
+ .table__title-block {
2
2
  display: flex;
3
3
  align-items: flex-start;
4
4
  }
5
5
 
6
- .table__title-icon{
6
+ .table__title-icon {
7
7
  width: 20px;
8
8
  padding: 3px;
9
9
  margin-right: 5px;
10
10
  float: left;
11
11
  }
12
12
 
13
- .table__list-title{
13
+ .table__list-title {
14
14
  display: flex;
15
15
  flex-direction: column;
16
16
  align-items: start;
17
17
  }
18
18
 
19
- .table__list-title a{
19
+ .table__list-title a {
20
20
  text-align: start;
21
21
  }
22
22
 
23
- .help-text-overdue{
23
+ .help-text-overdue {
24
24
  font-style: italic;
25
- font-size: .8125rem;
25
+ font-size: 0.8125rem;
26
26
  text-align: start;
27
27
  }
@@ -1,62 +1,76 @@
1
1
  .global-settings,
2
- .step-settings{
3
- .readonly_container{
2
+ .step-settings {
3
+ .readonly_container {
4
4
  display: none;
5
5
  }
6
6
  }
7
7
 
8
- .proposal-photo.gallery__item{
8
+ .proposal-photo.gallery__item {
9
9
  position: relative;
10
10
  margin: 0 0 1rem;
11
- border: 1px solid rgba(0, 0, 0, .2);
11
+ border: 1px solid rgba(0, 0, 0, 0.2);
12
12
  border-radius: 0;
13
13
  background-color: white;
14
14
  color: #202734;
15
15
  }
16
16
 
17
- .proposal-photo .thumbnail{
17
+ .proposal-photo .thumbnail {
18
18
  margin-bottom: 0;
19
19
  }
20
20
 
21
- .delete-proposal__button{
21
+ .delete-proposal__button {
22
22
  position: absolute;
23
- right: 0;
23
+ right: 7px;
24
24
  top: 7px;
25
- width: 2rem;
26
- height: 2rem;
27
- background: rgba(var(--primary-rgb), .8);
28
- color: #fff;
25
+ width: 1.3rem;
26
+ height: 1.3rem;
27
+ background-color: rgba(var(--tertiary-rgb) / 0.8);
29
28
  border-radius: 50%;
30
29
  text-align: center;
30
+ display: flex;
31
+ justify-content: center;
32
+ align-items: center;
33
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
34
+ cursor: pointer;
35
+ transition: background-color 0.3s ease;
36
+
37
+ svg {
38
+ fill: #fff;
39
+ stroke: #fff;
40
+ stroke-width: 2px;
41
+ }
31
42
  }
32
43
 
33
- //Variables
44
+ .delete-proposal__button:hover {
45
+ background: rgba(var(--tertiary-rgb) / 1);
46
+ }
34
47
 
35
- /* Card address */
36
- .address{
37
- display: flex;
38
- padding: 1rem;
48
+ .delete-proposal__button:active {
49
+ transform: scale(0.95);
39
50
  }
40
51
 
41
- .address--alone{
42
- flex-grow: 1;
52
+ #proposal_photo_add_photos {
53
+ display: block;
54
+ margin-top: 1rem;
43
55
  }
44
56
 
45
- .address__info{
57
+ .admin-address {
46
58
  display: flex;
47
- flex-grow: 1;
59
+ gap: 1rem;
60
+ margin-top: 1rem;
61
+
62
+ .component__show-address {
63
+ max-height: 3rem;
64
+ }
48
65
  }
49
66
 
50
- .address__icon{
51
- float: left;
52
- display: flex;
53
- align-self: center;
54
- fill: var(--primary);
67
+ .component__show_notes-grid {
68
+ a {
69
+ text-decoration: underline;
70
+ }
55
71
  }
56
72
 
57
- .address__details{
58
- float: left;
59
- max-width: 100%; //IE10 bug fix
60
- padding-left: .5em;
61
- align-self: center;
73
+ //Variables
74
+ .layout-content table svg.hide-button {
75
+ fill: var(--secondary);
62
76
  }
@@ -1,12 +1,17 @@
1
- .has_no_address{
1
+ .has_no_address {
2
2
  text-align: right;
3
3
  }
4
4
 
5
- .editor{
6
- .form-error{
5
+ .editor {
6
+ .form-error {
7
7
  margin: -1rem 0 1rem;
8
- font-size: .75rem;
8
+ font-size: 0.75rem;
9
9
  font-weight: 600;
10
10
  color: var(--alert);
11
11
  }
12
12
  }
13
+
14
+ /* reporting proposals have only 3 steps */
15
+ .wizard-steps > * {
16
+ width: 33%;
17
+ }
@@ -1,19 +1,27 @@
1
- button.user-device-camera{
2
- border-radius: 4px !important;
3
- max-height: 3rem;
4
- }
1
+ .camera-container {
2
+ @apply md:flex md:justify-between md:items-center;
5
3
 
6
- .has_no_image{
7
- margin-top: -1rem;
8
- text-align: right;
9
- }
4
+ button.user-device-camera {
5
+ @apply md:flex-none whitespace-nowrap w-full md:w-auto p-2 mt-2 text-lg;
6
+
7
+ svg {
8
+ margin-right: 0.2rem;
9
+ }
10
+ }
10
11
 
11
- @media only screen and (max-width: 596px){
12
- .gallery__container .input-group .input-group-button{
13
- display: block;
12
+ .input-group-button {
13
+ @apply w-full md:w-auto;
14
14
  }
15
15
 
16
- .has_no_image{
17
- margin-top: -.5rem;
16
+ label {
17
+ @apply truncate mr-2;
18
18
  }
19
+
20
+ #proposal_add_photos {
21
+ @apply mt-2 block;
22
+ }
23
+ }
24
+
25
+ .has_no_image {
26
+ @apply md:text-right -mt-1;
19
27
  }
@@ -7,8 +7,81 @@ module Decidim
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
11
+ def permissions
12
+ # The public part needs to be implemented yet
13
+ return permission_action if permission_action.scope != :admin
14
+
15
+ # Valuators can only perform these actions
16
+ if user_is_valuator?
17
+ if valuator_assigned_to_proposal?
18
+ can_create_proposal_note?
19
+ can_create_proposal_answer?
20
+ allow! if action_is_show_on_proposal?
21
+ elsif action_is_show_on_proposal?
22
+ disallow!
23
+ end
24
+ can_export_proposals?
25
+ valuator_can_unassign_valuator_from_proposals?
26
+
27
+ return permission_action
28
+ end
29
+
30
+ if create_permission_action?
31
+ can_create_proposal_note?
32
+ can_create_proposal_from_admin?
33
+ can_create_proposal_answer?
34
+ end
35
+
36
+ # Allow any admin user to view a proposal.
37
+ allow! if action_is_show_on_proposal?
38
+
39
+ # Admins can only edit official proposals if they are within the
40
+ # time limit.
41
+ allow! if permission_action.subject == :proposal && permission_action.action == :edit && admin_edition_is_available?
42
+
43
+ # Every user allowed by the space can update the category of the proposal
44
+ allow! if permission_action.subject == :proposal_category && permission_action.action == :update
45
+
46
+ # Every user allowed by the space can update the scope of the proposal
47
+ allow! if permission_action.subject == :proposal_scope && permission_action.action == :update
48
+
49
+ # Every user allowed by the space can import proposals from another_component
50
+ allow! if permission_action.subject == :proposals && permission_action.action == :import
51
+
52
+ # Every user allowed by the space can export proposals
53
+ can_export_proposals?
54
+
55
+ # Every user allowed by the space can merge proposals to another component
56
+ allow! if permission_action.subject == :proposals && permission_action.action == :merge
57
+
58
+ # Every user allowed by the space can split proposals to another component
59
+ allow! if permission_action.subject == :proposals && permission_action.action == :split
60
+
61
+ # Every user allowed by the space can assign proposals to a valuator
62
+ allow! if permission_action.subject == :proposals && permission_action.action == :assign_to_valuator
63
+
64
+ # Every user allowed by the space can unassign a valuator from proposals
65
+ can_unassign_valuator_from_proposals?
66
+
67
+ # Only admin users can publish many answers at once
68
+ toggle_allow(user.admin?) if permission_action.subject == :proposals && permission_action.action == :publish_answers
69
+
70
+ if permission_action.subject == :participatory_texts && participatory_texts_are_enabled? && permission_action.action == :manage
71
+ # Every user allowed by the space can manage (import, update and publish) participatory texts to proposals
72
+ allow!
73
+ end
74
+
75
+ permission_action
76
+ end
77
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
78
+
10
79
  private
11
80
 
81
+ def action_is_show_on_proposal?
82
+ permission_action.subject == :proposal && permission_action.action == :show
83
+ end
84
+
12
85
  def valuator_can_unassign_valuator_from_proposals?
13
86
  can_unassign_valuator_from_proposals? if user == context.fetch(:valuator, nil)
14
87
 
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Templates
5
+ module Admin
6
+ # this is here due a bug in Decidim 0.28 when they introduced proposal answer templates
7
+ # they didn't take into account that valuators can answer proposals
8
+ # This can be removed after https://github.com/decidim/decidim/pull/12765 is merge & backported
9
+ class Permissions < Decidim::DefaultPermissions
10
+ def permissions
11
+ return permission_action if permission_action.scope != :admin
12
+ return permission_action unless user
13
+ return permission_action if context[:current_organization] != user.organization
14
+
15
+ if user_has_a_role? && (permission_action.subject == :template && permission_action.action == :read)
16
+ allow!
17
+ else
18
+ return permission_action unless user.admin?
19
+
20
+ case permission_action.subject
21
+ when :template
22
+ allow! if [:read, :create, :update, :destroy, :copy].include? permission_action.action
23
+ when :templates
24
+ allow! if permission_action.action == :index
25
+ when :questionnaire
26
+ allow!
27
+ end
28
+ end
29
+
30
+ permission_action
31
+ end
32
+
33
+ private
34
+
35
+ def participatory_space
36
+ @participatory_space ||= context[:proposal].try(:participatory_space)
37
+ end
38
+
39
+ def user_roles
40
+ @user_roles ||= participatory_space.try(:user_roles)
41
+ end
42
+
43
+ def user_has_a_role?
44
+ return unless user_roles
45
+
46
+ user_roles.exists?(user:)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ReportingProposals
5
+ module ResourceLocatorPresenterOverride
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ # Generates and admin url only if the manifest has the property :admin_route_name defined
10
+ # this allows to distinct from resources that can be administrated from those that are not
11
+ def admin_url(options = {})
12
+ admin_member_route("url", options.merge(host: root_resource.organization.host))
13
+ end
14
+
15
+ private
16
+
17
+ def admin_member_route(route_type, options)
18
+ return if manifest_for(target).admin_route_name.blank?
19
+
20
+ options.merge!(options_for_polymorphic)
21
+ admin_route_proxy.send("#{admin_member_route_name}_#{route_type}", target, options)
22
+ end
23
+
24
+ def admin_member_route_name
25
+ if polymorphic?
26
+ admin_polymorphic_member_route_name
27
+ else
28
+ manifest_for(target).admin_route_name
29
+ end
30
+ end
31
+
32
+ def admin_polymorphic_member_route_name
33
+ return unless polymorphic?
34
+
35
+ resource.map { |record| manifest_for(record).admin_route_name }.join("_")
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ReportingProposals
5
+ module ResourceManifestOverride
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ # The name of the named Rails route to create the url to admin the resource
10
+ # If it is not defined, the resource will be considered non-administrable
11
+ # and no link will be generated in some places
12
+ attribute :admin_route_name, String
13
+ end
14
+ end
15
+ end
16
+ end
@@ -33,19 +33,19 @@ module Decidim
33
33
  state: proposal.state.to_s,
34
34
  reference: proposal.reference,
35
35
  answer: ensure_translatable(proposal.answer),
36
- answer_time: answer_time,
36
+ answer_time:,
37
37
  supports: proposal.proposal_votes_count,
38
38
  endorsements: {
39
39
  total_count: proposal.endorsements.size,
40
- user_endorsements: user_endorsements
40
+ user_endorsements:
41
41
  },
42
42
  comments: proposal.comments_count,
43
43
  attachments: proposal.attachments.size,
44
44
  followers: proposal.follows.size,
45
45
  published_at: proposal.published_at,
46
- url: url,
46
+ url:,
47
47
  meeting_urls: meetings,
48
- related_proposals: related_proposals,
48
+ related_proposals:,
49
49
  is_amend: proposal.emendation?,
50
50
  original_proposal: {
51
51
  title: proposal&.amendable&.title,
@@ -1,13 +1,13 @@
1
1
  <% if note.author == current_user %>
2
2
  <%= cell("decidim/reporting_proposals/edit_note_modal", note, modal_id: "editNoteModal#{note.id}", note: note, proposal: proposal) %>
3
3
  <button type="button" class="link-alt m-xs"
4
- data-open="<%= current_user.present? ? "editNoteModal#{note.id}" : "loginModal" %>"
4
+ data-dialog-open="editNoteModal<%= note.id %>"
5
5
  title="<%= t("modal.title", scope: "decidim.reporting_proposals.admin.proposal_notes") %>"
6
- aria-controls="<%= current_user.present? ? "editNoteModal#{note.id}" : "loginModal" %>"
6
+ aria-controls="editNoteModal<%= note.id %>"
7
7
  aria-haspopup="true"
8
8
  tabindex="0"
9
9
  style="color:#97a2b2; cursor: pointer">
10
- <%= icon "pencil", aria_hidden: true, class: "action-icon--preview", role: "img", "aria-hidden": true %>
10
+ <%= icon "pencil-line", aria_hidden: true, class: "action-icon--preview", role: "img", "aria-hidden": true %>
11
11
  </button>
12
12
  <% end %>
13
13
  <% if note.created_at != note.updated_at %>
@@ -1,5 +1,5 @@
1
1
  <% note.body.split("\n").each_with_index do |paragraph, index| %>
2
- <%= Decidim::ContentRenderers::LinkRenderer.new(paragraph.gsub(URI.regexp, '<a href="\0" target="_blank">\0</a>')).render.html_safe %>
2
+ <%= Decidim::ContentRenderers::LinkRenderer.new(paragraph).render("data-external-link"=> false).html_safe %>
3
3
  <% unless index == note.body.split("\n").size - 1 %>
4
4
  <br>
5
5
  <% end %>
@@ -1,13 +1,14 @@
1
1
  <% if component_settings.geocoding_enabled? %>
2
- <div class="row column">
3
- <strong><%= t ".geolocated_at" %>:</strong>
4
- <div class="address__info">
5
- <div class="address__icon">
6
- <%= icon "proposals", role: "img", "aria-hidden": true, width: 40, height: 70 %>
7
- </div>
8
- <div class="address__details">
9
- <%= render partial: "decidim/shared/address_details", locals: { geolocalizable: proposal } %>
10
- </div>
2
+ </div><!-- close previous .row.column -->
3
+ <div class="row column admin-address">
4
+ <div class="left">
5
+ <span class="component__show-title"><%= t ".geolocated_at" %>:</span>
6
+ <%= cell("decidim/address", proposal) %>
11
7
  </div>
12
- </div>
8
+ <div class="component__show-address">
9
+ <% if Decidim::Map.available?(:static) || Decidim::Map.available?(:dynamic) %>
10
+ <%= static_map_link(proposal) %>
11
+ <% end %>
12
+ </div>
13
+ <%# Skip close here as is in the overriden view %>
13
14
  <% end %>
@@ -1,4 +1,6 @@
1
- <p>
2
- <%= link_to t(".send_mail"), "mailto:#{presented_author.email}?subject=#{translated_attribute(proposal.title)}&body=#{resource_locator(proposal).url}",
3
- class: "button tiny", target: "_blank" %>
4
- </p>
1
+ <% if presented_author.respond_to?(:email) %>
2
+ <p>
3
+ <%= link_to t(".send_mail"), "mailto:#{presented_author.email}?subject=#{translated_attribute(proposal.title)}&body=#{resource_locator(proposal).url}",
4
+ class: "help-text", target: "_blank" %>
5
+ </p>
6
+ <% end %>
@@ -2,5 +2,5 @@
2
2
  current_component.settings.additional_button_text.present? &&
3
3
  current_component.settings.additional_button_link.present? %>
4
4
  <%= link_to translated_attribute(component_settings.additional_button_text),
5
- component_settings.additional_button_link, class: "title-action__action button small ml-s" %>
5
+ component_settings.additional_button_link, class: "button button__sm button__transparent-secondary" %>
6
6
  <% end %>
@@ -1,8 +1,6 @@
1
1
  var $proposals = $('#proposals');
2
- var $proposalsCount = $('#proposals-count');
3
2
  var $orderFilterInput = $('.order_filter');
4
3
  $proposals.html('<%= j(render partial: "proposals").strip.html_safe %>');
5
- $proposalsCount.html('<%= j(render partial: "count").strip.html_safe %>');
6
4
  $orderFilterInput.val('<%= order %>');
7
5
 
8
6
  var $dropdownMenu = $('.dropdown.menu', $proposals);
@@ -3,11 +3,10 @@
3
3
  html: { multipart: true, class: "form edit_proposal proposal_form_admin" }) do |f| %>
4
4
  <div class="row column gallery__container">
5
5
  <fieldset>
6
- <legend><%= t(".gallery_legend") %></legend>
7
6
  <% if proposal.photos.any? %>
8
7
  <div class="gallery row">
9
8
  <% proposal.photos.each do |photo| %>
10
- <div class="callout gallery__item">
9
+ <div class="gallery__item">
11
10
  <%= f.hidden_field :photos, multiple: true, value: photo.id, id: "photo-#{photo.id}" %>
12
11
  </div>
13
12
  <% end %>
@@ -17,7 +16,7 @@
17
16
  <%= f.file_field :add_photos, multiple: true %>
18
17
  </div>
19
18
  <div class="actions">
20
- <%= f.submit t(".action") %>
19
+ <%= f.submit t(".action"), class: "button button__sm button__secondary" %>
21
20
  </div>
22
21
  </fieldset>
23
22
  </div>
@@ -1,17 +1,16 @@
1
1
  <% if proposal.photos.any? %>
2
2
  <div class="row column">
3
- <strong><%= t(".photos") %>:</strong>
4
- <div id="photos" class="gallery row flex--fsc proposal-<%= proposal.id %>">
3
+ <div id="photos" class="gallery grid grid-cols-1 md:grid-cols-4 gap-6 proposal-<%= proposal.id %>">
5
4
  <% proposal.photos.each do |photo| %>
6
5
  <div class="proposal-photo gallery__item" id="photo-<%= photo.id %>">
7
6
  <%= link_to photo.big_url, target: "_blank", rel: "noopener" do %>
8
7
  <%= image_tag photo.thumbnail_url, class: "thumbnail", alt: strip_tags(translated_attribute(photo.title)) %>
9
8
  <% if admin_allowed_to? :edit_photos, :proposals, extra_context = { proposal: proposal }, chain = [::Decidim::ReportingProposals::Admin::Permissions] %>
10
- <%= icon_link_to "x",
9
+ <%= icon_link_to "close-line",
11
10
  decidim_admin_reporting_proposals.remove_photo_path(id: proposal.id, photo_id: photo.id),
12
11
  t(".delete_image"),
13
12
  method: :delete,
14
- class: "delete-proposal__button", style: "color:white;" %>
13
+ class: "delete-proposal__button" %>
15
14
  <% end %>
16
15
  <% end %>
17
16
  </div>
@@ -1,14 +1,18 @@
1
- <% if proposal.photos.any? || component_settings.attachments_allowed? %>
2
- <div class="card">
3
- <div class="card-divider">
4
- <h2 class="card-title"><%= t(".title") %></h2>
5
- </div>
6
- <div class="card-section">
7
- <%= render partial: "decidim/reporting_proposals/admin/proposals/photo_gallery" %>
8
-
9
- <% if admin_allowed_to? :edit_photos, :proposals, extra_context = { proposal: proposal }, chain = [::Decidim::ReportingProposals::Admin::Permissions] %>
10
- <%= render partial: "decidim/reporting_proposals/admin/proposals/photo_form" %>
11
- <% end %>
1
+ <% if component_settings.attachments_allowed? %>
2
+ <div class="card-section">
3
+ <div class="component__show_photos" data-component="accordion" id="accordion-photos">
4
+ <button class="card-divider-button" data-controls="panel-photos" type="button">
5
+ <%= icon "arrow-right-s-line" %>
6
+ <h2 class="card-title">
7
+ <%= t(".title") %>
8
+ </h2>
9
+ </button>
10
+ <div id="panel-photos">
11
+ <%= render partial: "decidim/reporting_proposals/admin/proposals/photo_gallery" %>
12
+ <% if admin_allowed_to? :edit_photos, :proposals, extra_context = { proposal: proposal }, chain = [::Decidim::ReportingProposals::Admin::Permissions] %>
13
+ <%= render partial: "decidim/reporting_proposals/admin/proposals/photo_form" %>
14
+ <% end %>
15
+ </div>
12
16
  </div>
13
17
  </div>
14
18
  <% end %>
@@ -1,20 +1,16 @@
1
1
  <% if admin_allowed_to?(:hide_proposal, :proposals, extra_context = { proposal: proposal }, chain = [::Decidim::ReportingProposals::Admin::Permissions]) %>
2
2
  <% if proposal.reported? %>
3
- <%= icon_link_to "trash", decidim_admin_reporting_proposals.hide_proposal_path(id: proposal),
3
+ <%= icon_link_to "delete-bin-line", decidim_admin_reporting_proposals.hide_proposal_path(id: proposal),
4
4
  t("actions.hide", scope: "decidim.moderations"), method: :put, class: "action-icon" %>
5
5
  <% else %>
6
6
  <%= cell("decidim/flag_modal", proposal, modal_id: "flagModal#{proposal.id}") %>
7
- <button type="button" class="link-alt"
8
- data-open="<%= current_user.present? ? "flagModal#{proposal.id}" : "loginModal" %>"
9
- title="<%= t("report", scope: "decidim.proposals.proposals.show") %>"
10
- aria-controls="<%= current_user.present? ? "flagModal#{proposal.id}" : "loginModal" %>"
7
+ <button type="button" class="action-icon icon--small action-icon--show-proposal"
8
+ data-dialog-open="flagModal<%= proposal.id %>"
9
+ title="<%= t("report", scope: "decidim.proposals.admin.proposals.show") %>"
10
+ aria-controls="flagModal<%= proposal.id %>"
11
11
  aria-haspopup="true"
12
- tabindex="0"
13
- style="color:#97a2b2; cursor: pointer">
14
- <%= icon "flag", aria_hidden: true, class: "action-icon--preview", role: "img", "aria-hidden": true %>
15
- <span class="show-for-sr">
16
- <%= t("report", scope: "decidim.proposals.proposals.show") %>
17
- </span>
12
+ tabindex="0">
13
+ <%= icon "flag-line", aria_hidden: true, class: "hide-button icon--small action-icon--show-proposal", role: "img", "aria-hidden": true %>
18
14
  </button>
19
15
  <% end %>
20
16
  <% end %>
@@ -1,9 +1,9 @@
1
1
  <div class="table__title-block">
2
2
  <span class="table__title-icon">
3
3
  <% if unanswered_proposals_overdue?(proposal) || evaluating_proposals_overdue?(proposal) %>
4
- <%= icon "datetime", class: "text-alert" %>
4
+ <%= icon "timer-line", class: "text-alert" %>
5
5
  <% elsif grace_period_unanswered?(proposal) || grace_period_evaluating?(proposal) %>
6
- <%= icon "timer", class: "text-warning" %>
6
+ <%= icon "timer-line", class: "text-warning" %>
7
7
  <% end %>
8
8
  </span>
9
9
  <div class="table__list-title">
@@ -0,0 +1,17 @@
1
+ <p class="email-greeting"><%= t("greeting", scope: "decidim.reporting_proposals.admin.proposals_valuator_mailer.notify_proposals_valuator", name: @valuator_user.name) %></p>
2
+
3
+ <p class="email-instructions"><%= t("email_body", scope: "decidim.reporting_proposals.admin.proposals_valuator_mailer.notify_proposals_valuator") %></p>
4
+
5
+ <p class="email-instructions">
6
+ <ul>
7
+ <% @proposals.each do |proposal| %>
8
+ <li class="mb-sm">
9
+ <span><%= translated_attribute(proposal.title) %></span>:
10
+ <%= sanitize link_to(t("public_side", scope: "decidim.reporting_proposals.admin.proposals_valuator_mailer.notify_proposals_valuator"), Decidim::ResourceLocatorPresenter.new(proposal).url), tags: ["a"], attributes: ["href"] %>,
11
+ <%= sanitize link_to(t("admin_panel", scope: "decidim.reporting_proposals.admin.proposals_valuator_mailer.notify_proposals_valuator"), Decidim::ResourceLocatorPresenter.new(proposal).admin_url), tags: ["a"], attributes: ["href"] %>
12
+ </li>
13
+ <% end %>
14
+ </ul>
15
+ </p>
16
+
17
+ <p class="email-closing"><%= t("gratitude", scope: "decidim.reporting_proposals.admin.proposals_valuator_mailer.notify_proposals_valuator") %></p>