decidim-accountability 0.29.2 → 0.30.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/accountability/project/show.erb +6 -0
  3. data/app/cells/decidim/accountability/project_cell.rb +23 -42
  4. data/app/cells/decidim/accountability/result_history_cell.rb +57 -0
  5. data/app/cells/decidim/accountability/result_metadata_cell.rb +17 -17
  6. data/app/cells/decidim/accountability/status_cell.rb +9 -13
  7. data/app/commands/decidim/accountability/admin/create_imported_result.rb +1 -1
  8. data/app/commands/decidim/accountability/admin/create_result.rb +3 -2
  9. data/app/commands/decidim/accountability/admin/import_component_to_accountability.rb +47 -0
  10. data/app/commands/decidim/accountability/admin/update_imported_result.rb +1 -1
  11. data/app/commands/decidim/accountability/admin/update_result.rb +3 -2
  12. data/app/commands/decidim/accountability/admin/update_result_dates.rb +56 -0
  13. data/app/commands/decidim/accountability/admin/update_result_status.rb +61 -0
  14. data/app/commands/decidim/accountability/admin/update_result_taxonomies.rb +18 -0
  15. data/app/controllers/concerns/decidim/accountability/admin/filterable.rb +8 -6
  16. data/app/controllers/decidim/accountability/admin/import_components_controller.rb +36 -0
  17. data/app/controllers/decidim/accountability/admin/results_bulk_actions_controller.rb +102 -0
  18. data/app/controllers/decidim/accountability/admin/results_controller.rb +21 -11
  19. data/app/controllers/decidim/accountability/results_controller.rb +10 -7
  20. data/app/forms/decidim/accountability/admin/import_component_form.rb +98 -0
  21. data/app/forms/decidim/accountability/admin/result_bulk_actions_form.rb +18 -0
  22. data/app/forms/decidim/accountability/admin/result_form.rb +17 -23
  23. data/app/helpers/decidim/accountability/admin/application_helper.rb +0 -1
  24. data/app/helpers/decidim/accountability/application_helper.rb +1 -32
  25. data/app/helpers/decidim/accountability/breadcrumb_helper.rb +10 -14
  26. data/app/jobs/decidim/accountability/admin/import_projects_job.rb +5 -3
  27. data/app/jobs/decidim/accountability/admin/import_proposals_job.rb +70 -0
  28. data/app/mailers/decidim/accountability/import_proposals_mailer.rb +28 -0
  29. data/app/models/decidim/accountability/result.rb +23 -1
  30. data/app/models/decidim/accountability/status.rb +4 -0
  31. data/app/packs/entrypoints/decidim_accountability_admin_form.js +1 -0
  32. data/app/packs/src/decidim/accountability/admin/imports.js +37 -14
  33. data/app/packs/src/decidim/accountability/admin/index/action_button.js +42 -0
  34. data/app/packs/src/decidim/accountability/admin/index/action_form.js +46 -0
  35. data/app/packs/src/decidim/accountability/admin/index/action_selector.js +37 -0
  36. data/app/packs/src/decidim/accountability/admin/index/counter.js +40 -0
  37. data/app/packs/src/decidim/accountability/admin/index/select_all.js +29 -0
  38. data/app/packs/src/decidim/accountability/admin/index.js +17 -7
  39. data/app/packs/src/decidim/accountability/admin/result_form.js +21 -0
  40. data/app/packs/stylesheets/accountability.scss +5 -0
  41. data/app/permissions/decidim/accountability/admin/permissions.rb +3 -2
  42. data/app/presenters/decidim/accountability/admin_log/result_presenter.rb +1 -1
  43. data/app/presenters/decidim/accountability/result_presenter.rb +30 -0
  44. data/app/queries/decidim/accountability/metrics/results_metric_manage.rb +6 -6
  45. data/app/services/decidim/accountability/results_calculator.rb +4 -6
  46. data/app/services/decidim/accountability/results_csv_importer.rb +1 -1
  47. data/app/views/decidim/accountability/admin/import_components/_filters.html.erb +26 -0
  48. data/app/views/decidim/accountability/admin/import_components/_form.html.erb +26 -0
  49. data/app/views/decidim/accountability/admin/import_components/new.html.erb +14 -0
  50. data/app/views/decidim/accountability/admin/results/_actions.html.erb +29 -0
  51. data/app/views/decidim/accountability/admin/results/_form.html.erb +15 -8
  52. data/app/views/decidim/accountability/admin/results/_result-tr.html.erb +32 -0
  53. data/app/views/decidim/accountability/admin/results/_results-thead.html.erb +26 -0
  54. data/app/views/decidim/accountability/admin/results/bulk_actions/_dates_form.html.erb +19 -0
  55. data/app/views/decidim/accountability/admin/results/bulk_actions/_dropdown.html.erb +40 -0
  56. data/app/views/decidim/accountability/admin/results/bulk_actions/_status_form.html.erb +16 -0
  57. data/app/views/decidim/accountability/admin/results/bulk_actions/_submit_buttons.html.erb +4 -0
  58. data/app/views/decidim/accountability/admin/results/bulk_actions/_taxonomies_form.html.erb +18 -0
  59. data/app/views/decidim/accountability/admin/results/edit.html.erb +2 -2
  60. data/app/views/decidim/accountability/admin/results/index.html.erb +50 -111
  61. data/app/views/decidim/accountability/admin/results/manage_trash.html.erb +26 -0
  62. data/app/views/decidim/accountability/admin/results/new.html.erb +2 -2
  63. data/app/views/decidim/accountability/import_proposals_mailer/import.html.erb +2 -0
  64. data/app/views/decidim/accountability/results/{_home_categories.html.erb → _home_taxonomies.html.erb} +6 -8
  65. data/app/views/decidim/accountability/results/_project.html.erb +1 -3
  66. data/app/views/decidim/accountability/results/_projects_aside.html.erb +9 -7
  67. data/app/views/decidim/accountability/results/home.html.erb +18 -6
  68. data/app/views/decidim/accountability/results/index.html.erb +8 -2
  69. data/app/views/decidim/accountability/results/show.html.erb +5 -5
  70. data/config/assets.rb +3 -2
  71. data/config/locales/ar.yml +97 -55
  72. data/config/locales/bg.yml +0 -50
  73. data/config/locales/bs-BA.yml +0 -16
  74. data/config/locales/ca.yml +128 -40
  75. data/config/locales/cs.yml +147 -56
  76. data/config/locales/da.yml +0 -20
  77. data/config/locales/de.yml +126 -39
  78. data/config/locales/el.yml +0 -48
  79. data/config/locales/en.yml +128 -40
  80. data/config/locales/es-MX.yml +129 -41
  81. data/config/locales/es-PY.yml +129 -41
  82. data/config/locales/es.yml +129 -41
  83. data/config/locales/eu.yml +140 -53
  84. data/config/locales/fi-plain.yml +136 -49
  85. data/config/locales/fi.yml +136 -49
  86. data/config/locales/fr-CA.yml +111 -54
  87. data/config/locales/fr.yml +111 -54
  88. data/config/locales/ga-IE.yml +0 -13
  89. data/config/locales/gl.yml +0 -17
  90. data/config/locales/gn-PY.yml +0 -11
  91. data/config/locales/he-IL.yml +45 -54
  92. data/config/locales/hu.yml +0 -50
  93. data/config/locales/id-ID.yml +0 -16
  94. data/config/locales/is-IS.yml +0 -17
  95. data/config/locales/it.yml +0 -18
  96. data/config/locales/ja.yml +132 -47
  97. data/config/locales/kaa.yml +0 -8
  98. data/config/locales/ko.yml +0 -47
  99. data/config/locales/lb.yml +0 -17
  100. data/config/locales/lt.yml +0 -50
  101. data/config/locales/lv.yml +0 -19
  102. data/config/locales/nl.yml +0 -17
  103. data/config/locales/no.yml +0 -17
  104. data/config/locales/pl.yml +0 -47
  105. data/config/locales/pt-BR.yml +6 -50
  106. data/config/locales/pt.yml +35 -23
  107. data/config/locales/ro-RO.yml +0 -29
  108. data/config/locales/ru.yml +0 -16
  109. data/config/locales/si-LK.yml +0 -11
  110. data/config/locales/sk.yml +0 -19
  111. data/config/locales/sl.yml +0 -17
  112. data/config/locales/sq-AL.yml +0 -50
  113. data/config/locales/sr-CS.yml +0 -16
  114. data/config/locales/sv.yml +124 -36
  115. data/config/locales/th-TH.yml +0 -50
  116. data/config/locales/tr-TR.yml +0 -47
  117. data/config/locales/uk.yml +0 -16
  118. data/config/locales/zh-CN.yml +0 -20
  119. data/config/locales/zh-TW.yml +0 -47
  120. data/db/migrate/20200827154103_add_commentable_counter_cache_to_results.rb +1 -1
  121. data/db/migrate/20240828103202_add_deleted_at_to_decidim_accountability_results.rb +8 -0
  122. data/db/migrate/20240916112128_add_geolocation_fields_to_results.rb +9 -0
  123. data/decidim-accountability.gemspec +1 -1
  124. data/lib/decidim/accountability/admin_engine.rb +16 -2
  125. data/lib/decidim/accountability/component.rb +3 -3
  126. data/lib/decidim/accountability/result_serializer.rb +9 -13
  127. data/lib/decidim/accountability/seeds.rb +28 -21
  128. data/lib/decidim/accountability/test/factories.rb +6 -4
  129. data/lib/decidim/accountability/version.rb +1 -1
  130. data/lib/decidim/api/accountability_type.rb +4 -5
  131. data/lib/decidim/api/result_type.rb +10 -13
  132. data/lib/decidim/api/status_type.rb +3 -4
  133. data/lib/decidim/api/timeline_entry_type.rb +5 -6
  134. metadata +58 -30
  135. data/app/commands/decidim/accountability/admin/import_projects_to_accountability.rb +0 -37
  136. data/app/controllers/decidim/accountability/admin/projects_import_controller.rb +0 -31
  137. data/app/forms/decidim/accountability/admin/result_import_projects_form.rb +0 -51
  138. data/app/views/decidim/accountability/admin/projects_import/new.html.erb +0 -45
  139. data/app/views/decidim/accountability/results/_nav_breadcrumb.html.erb +0 -37
  140. data/app/views/decidim/accountability/results/_scope_filters.html.erb +0 -31
  141. /data/app/packs/entrypoints/{decidim_accountability_admin.js → decidim_accountability_admin_index.js} +0 -0
@@ -22,6 +22,10 @@ module Decidim
22
22
  # Allow ransacker to search for a key in a hstore column (`name`.`en`)
23
23
  ransacker_i18n :name
24
24
 
25
+ def self.ransackable_attributes(_auth_object = nil)
26
+ %w(id name)
27
+ end
28
+
25
29
  def self.log_presenter_class_for(_log)
26
30
  Decidim::Accountability::AdminLog::StatusPresenter
27
31
  end
@@ -0,0 +1 @@
1
+ import "src/decidim/accountability/admin/result_form"
@@ -1,15 +1,38 @@
1
- const toggleInfo = (val) => {
2
- document.querySelectorAll(".help-text").forEach((toBeHidden) => {
3
- if (val === toBeHidden.id && toBeHidden.classList.value.includes("hide")) {
4
- toBeHidden.classList.remove("hide")
5
- } else {
6
- toBeHidden.classList.add("hide")
1
+ class AdminAccountabilityImportsComponent {
2
+ run() {
3
+ this.bindEvents();
4
+ }
5
+
6
+ bindEvents() {
7
+ const form = this.getForm();
8
+ const selects = form.querySelectorAll("select");
9
+
10
+ selects.forEach((select) => {
11
+ select.addEventListener("change", this.onSelectChange.bind(this));
12
+ });
13
+ }
14
+
15
+ onSelectChange() {
16
+ const form = this.getForm();
17
+ const formUrl = form.dataset.formUrl;
18
+
19
+ // Remove authenticity token input if it exists
20
+ const tokenInput = form.querySelector("input[name='authenticity_token']");
21
+ if (tokenInput) {
22
+ tokenInput.remove();
7
23
  }
8
- });
9
- };
10
- export default () => {
11
- const item = document.querySelector("#result_import_projects_origin_component_id");
12
- item.addEventListener(("change"), (event) => {
13
- toggleInfo(`component_${event.target.value}`);
14
- });
15
- };
24
+
25
+ form.setAttribute("action", formUrl);
26
+ form.setAttribute("method", "get");
27
+ form.submit();
28
+ }
29
+
30
+ getForm() {
31
+ return document.getElementById("new_import_component");
32
+ }
33
+ }
34
+
35
+ window.Decidim.AdminAccountabilityImportsComponent = AdminAccountabilityImportsComponent;
36
+ const component = new AdminAccountabilityImportsComponent();
37
+
38
+ component.run();
@@ -0,0 +1,42 @@
1
+ class ActionButton {
2
+ constructor(counter) {
3
+ this.counter = counter;
4
+ this.actionButton = document.querySelector("[data-action-button]");
5
+ this.actionForms = document.querySelectorAll("[data-action-form]");
6
+ }
7
+
8
+ init() {
9
+ this.counter.checkboxes.forEach((checkbox) => {
10
+ checkbox.addEventListener("change", () => this.onCheckboxChange());
11
+ });
12
+
13
+ this.toggleActionButton();
14
+ }
15
+
16
+ onCheckboxChange() {
17
+ this.toggleActionButton();
18
+ this.toggleActionForms();
19
+ }
20
+
21
+ toggleActionButton() {
22
+ const selectedIds = this.counter.getSelectedItems();
23
+
24
+ if (selectedIds.length > 0) {
25
+ this.actionButton.classList.remove("hide");
26
+ } else {
27
+ this.actionButton.classList.add("hide");
28
+ }
29
+ }
30
+
31
+ toggleActionForms() {
32
+ const selectedIds = this.counter.getSelectedItems();
33
+
34
+ if (selectedIds.length === 0) {
35
+ this.actionForms.forEach((form) => {
36
+ form.classList.add("hide");
37
+ });
38
+ }
39
+ }
40
+ }
41
+
42
+ export default ActionButton;
@@ -0,0 +1,46 @@
1
+ class ActionForm {
2
+ constructor(counter) {
3
+ this.counter = counter;
4
+ this.checkboxes = document.querySelectorAll("[data-result-checkbox]");
5
+ this.idFields = document.querySelectorAll("[data-result-ids-field]");
6
+ this.cancelButtons = document.querySelectorAll("[data-cancel-button]");
7
+ }
8
+
9
+ init() {
10
+ this.checkboxes.forEach((checkbox) => {
11
+ checkbox.addEventListener("change", () => this.onCheckboxChange());
12
+ });
13
+
14
+ this.cancelButtons.forEach((button) => {
15
+ button.addEventListener("click", () => this.onCancelButtonClick());
16
+ });
17
+
18
+ this.updateResultIdsHiddenField();
19
+ }
20
+
21
+ onCheckboxChange() {
22
+ this.updateResultIdsHiddenField();
23
+ }
24
+
25
+ onCancelButtonClick() {
26
+ this.hideAllForms();
27
+ }
28
+
29
+ hideAllForms() {
30
+ const forms = document.querySelectorAll("[data-action-form]");
31
+ forms.forEach((form) => {
32
+ form.classList.add("hide");
33
+ });
34
+ }
35
+
36
+ updateResultIdsHiddenField() {
37
+ const selectedIds = this.counter.getSelectedItems().
38
+ map((checkbox) => checkbox.dataset.resultId);
39
+
40
+ this.idFields.forEach((field) => {
41
+ field.value = selectedIds.join(",");
42
+ });
43
+ }
44
+ }
45
+
46
+ export default ActionForm;
@@ -0,0 +1,37 @@
1
+ class ActionSelector {
2
+ init() {
3
+ this.dropdownElement = document.querySelector("#js-bulk-actions-dropdown");
4
+ const buttons = this.dropdownElement.querySelectorAll("button");
5
+
6
+ buttons.forEach((button) => {
7
+ button.addEventListener("click", this.onActionClick.bind(this));
8
+ });
9
+ }
10
+
11
+ onActionClick(event) {
12
+ const action = event.target.dataset.action;
13
+
14
+ this.closeDropdown();
15
+ this.hideAllForms();
16
+ this.showForm(action);
17
+ }
18
+
19
+ closeDropdown() {
20
+ this.dropdownElement.classList.remove("is-open");
21
+ }
22
+
23
+ showForm(action) {
24
+ const form = document.querySelector(`[data-action-form="${action}"]`);
25
+
26
+ form.classList.remove("hide");
27
+ }
28
+
29
+ hideAllForms() {
30
+ const forms = document.querySelectorAll("[data-action-form]");
31
+ forms.forEach((form) => {
32
+ form.classList.add("hide");
33
+ });
34
+ }
35
+ }
36
+
37
+ export default ActionSelector;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Counter class handles the selection of results and updates the counter
3
+ */
4
+ class Counter {
5
+ constructor() {
6
+ this.checkboxes = document.querySelectorAll("[data-result-checkbox]");
7
+ this.counterElement = document.querySelector("[data-selected-count]");
8
+ }
9
+
10
+ init() {
11
+ if (!this.checkboxes.length) {
12
+ return;
13
+ }
14
+
15
+ this.checkboxes.forEach((checkbox) => {
16
+ checkbox.addEventListener("change", () => this.updateCounter());
17
+ });
18
+
19
+ this.updateCounter();
20
+ }
21
+
22
+ updateCounter() {
23
+ if (this.counterElement) {
24
+ const count = this.getSelectedItems().length;
25
+ this.counterElement.textContent = count;
26
+
27
+ if (count === 0) {
28
+ this.counterElement.classList.add("hide");
29
+ } else {
30
+ this.counterElement.classList.remove("hide");
31
+ }
32
+ }
33
+ }
34
+
35
+ getSelectedItems() {
36
+ return Array.from(this.checkboxes).filter((checkbox) => checkbox.checked);
37
+ }
38
+ }
39
+
40
+ export default Counter;
@@ -0,0 +1,29 @@
1
+ class SelectAll {
2
+ constructor(counter) {
3
+ this.counter = counter;
4
+ this.checkboxes = this.counter.checkboxes;
5
+ this.selectAllButton = document.querySelector("[data-select-all]");
6
+ }
7
+
8
+ init() {
9
+ if (this.selectAllButton) {
10
+ this.selectAllButton.addEventListener("click", (event) => this.onSelectAllClick(event));
11
+ }
12
+ }
13
+
14
+ onSelectAllClick(event) {
15
+ event.preventDefault();
16
+
17
+ const someUnchecked = Array.from(this.checkboxes).some((checkbox) => !checkbox.checked);
18
+
19
+ // If some checkboxes are unchecked, check all of them
20
+ // Otherwise, uncheck all checkboxes
21
+ this.checkboxes.forEach((checkbox) => {
22
+ checkbox.checked = someUnchecked;
23
+ // Trigger change event to update other components
24
+ checkbox.dispatchEvent(new Event("change"));
25
+ });
26
+ }
27
+ }
28
+
29
+ export default SelectAll;
@@ -1,9 +1,19 @@
1
+ import Counter from "src/decidim/accountability/admin/index/counter";
2
+ import ActionButton from "src/decidim/accountability/admin/index/action_button";
3
+ import ActionForm from "src/decidim/accountability/admin/index/action_form";
4
+ import ActionSelector from "src/decidim/accountability/admin/index/action_selector";
5
+ import SelectAll from "src/decidim/accountability/admin/index/select_all";
6
+
1
7
  $(() => {
2
- $("#result_decidim_accountability_status_id").change(function () {
3
- /* eslint-disable no-invalid-this */
4
- const progress = $(this).find(":selected").data("progress")
5
- if (progress || progress === 0) {
6
- $("#result_progress").val(progress);
7
- }
8
- });
8
+ const counter = new Counter();
9
+ const actionButton = new ActionButton(counter);
10
+ const actionForm = new ActionForm(counter);
11
+ const actionSelector = new ActionSelector();
12
+ const selectAll = new SelectAll(counter);
13
+
14
+ counter.init();
15
+ actionButton.init();
16
+ actionForm.init();
17
+ actionSelector.init();
18
+ selectAll.init();
9
19
  })
@@ -0,0 +1,21 @@
1
+ import attachGeocoding from "src/decidim/geocoding/attach_input"
2
+
3
+ $(() => {
4
+ const $form = $(".result_form_admin");
5
+
6
+ if ($form.length > 0) {
7
+ const $resultAddress = $form.find("#result_address");
8
+
9
+ if ($resultAddress.length !== 0) {
10
+ attachGeocoding($resultAddress);
11
+ }
12
+ }
13
+
14
+ $("#result_decidim_accountability_status_id").change(function () {
15
+ /* eslint-disable no-invalid-this */
16
+ const progress = $(this).find(":selected").data("progress")
17
+ if (progress || progress === 0) {
18
+ $("#result_progress").val(progress);
19
+ }
20
+ });
21
+ });
@@ -1,4 +1,9 @@
1
1
  .accountability {
2
+ &__map {
3
+ /* negative main padding values */
4
+ @apply md:-ml-16 -mt-6 md:-mt-12 aspect-square md:aspect-[21/9] [&>*]:h-full [&+*]:mt-6 md:[&+*]:mt-12;
5
+ }
6
+
2
7
  &__status {
3
8
  @apply flex flex-col gap-3 w-full;
4
9
 
@@ -10,7 +10,8 @@ module Decidim
10
10
  permission_action.allow! if can_perform_actions_on?(:result, result)
11
11
  permission_action.allow! if can_perform_actions_on?(:status, status)
12
12
  permission_action.allow! if can_perform_actions_on?(:timeline_entry, timeline_entry)
13
- permission_action.allow! if can_perform_actions_on?(:import_projects, nil)
13
+ permission_action.allow! if can_perform_actions_on?(:bulk_update, nil)
14
+ permission_action.allow! if can_perform_actions_on?(:import_component, nil)
14
15
 
15
16
  permission_action
16
17
  end
@@ -34,7 +35,7 @@ module Decidim
34
35
  return false if can_create_grandchildren_results?
35
36
 
36
37
  case permission_action.subject
37
- when :import_projects
38
+ when :import_component
38
39
  case permission_action.action
39
40
  when :create, :new
40
41
  true if defined?(Decidim::Budgets::Project)
@@ -17,7 +17,7 @@ module Decidim
17
17
 
18
18
  def action_string
19
19
  case action
20
- when "create", "delete", "update"
20
+ when "create", "delete", "update", "soft_delete", "restore"
21
21
  "decidim.accountability.admin_log.result.#{action}"
22
22
  else
23
23
  super
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Accountability
5
+ #
6
+ # Decorator for results
7
+ #
8
+ class ResultPresenter < Decidim::ResourcePresenter
9
+ include Rails.application.routes.mounted_helpers
10
+ include ActionView::Helpers::UrlHelper
11
+ include Decidim::SanitizeHelper
12
+
13
+ def result
14
+ __getobj__
15
+ end
16
+
17
+ # Render the result title
18
+ #
19
+ # links - should render hashtags as links?
20
+ # extras - should include extra hashtags?
21
+ #
22
+ # Returns a String.
23
+ def title(links: false, extras: true, html_escape: false, all_locales: false)
24
+ return unless result
25
+
26
+ super(result.title, links, html_escape, all_locales, extras:)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -13,11 +13,11 @@ module Decidim
13
13
  next if cumulative_value.zero?
14
14
 
15
15
  quantity_value = quantity[key] || 0
16
- category_id, space_type, space_id, related_object_id = key
16
+ taxonomy_id, space_type, space_id, related_object_id = key
17
17
  record = Decidim::Metric.find_or_initialize_by(day: @day.to_s,
18
18
  metric_type: @metric_name,
19
19
  organization: @organization,
20
- decidim_category_id: category_id,
20
+ decidim_taxonomy_id: taxonomy_id,
21
21
  participatory_space_type: space_type,
22
22
  participatory_space_id: space_id,
23
23
  related_object_type: "Decidim::Component",
@@ -38,9 +38,9 @@ module Decidim
38
38
  @query = Decidim::Accountability::Result.select(:decidim_component_id)
39
39
  .where(component: visible_components_from_spaces(spaces))
40
40
  .joins(:component)
41
- .left_outer_joins(:category)
42
- @query = @query.where("decidim_accountability_results.created_at <= ?", end_time)
43
- @query = @query.group("decidim_categorizations.decidim_category_id",
41
+ .left_outer_joins(:taxonomizations)
42
+ @query = @query.where(decidim_accountability_results: { created_at: ..end_time })
43
+ @query = @query.group("decidim_taxonomizations.taxonomy_id",
44
44
  :participatory_space_type,
45
45
  :participatory_space_id,
46
46
  :decidim_component_id)
@@ -48,7 +48,7 @@ module Decidim
48
48
  end
49
49
 
50
50
  def quantity
51
- @quantity ||= query.where("decidim_accountability_results.created_at >= ?", start_time).count
51
+ @quantity ||= query.where(decidim_accountability_results: { created_at: start_time.. }).count
52
52
  end
53
53
  end
54
54
  end
@@ -5,10 +5,9 @@ module Decidim
5
5
  # This class handles the calculation of progress for a set of results
6
6
  class ResultsCalculator
7
7
  # Public: Initializes the service.
8
- def initialize(component, scope_id, category_id)
8
+ def initialize(component, taxonomy_id)
9
9
  @component = component
10
- @scope_id = scope_id
11
- @category_id = category_id
10
+ @taxonomy_id = taxonomy_id
12
11
  end
13
12
 
14
13
  delegate :count, to: :results
@@ -19,7 +18,7 @@ module Decidim
19
18
 
20
19
  private
21
20
 
22
- attr_reader :component, :scope_id, :category_id
21
+ attr_reader :component, :taxonomy_id
23
22
 
24
23
  def results
25
24
  @results ||= begin
@@ -27,8 +26,7 @@ module Decidim
27
26
  parent_id: nil,
28
27
  component:
29
28
  )
30
- query = query.with_any_scope(scope_id) if scope_id
31
- query = query.with_any_category(category_id) if category_id
29
+ query = query.with_taxonomies(taxonomy_id) if taxonomy_id
32
30
 
33
31
  query
34
32
  end
@@ -80,7 +80,7 @@ module Decidim
80
80
  available_locales = component.participatory_space.organization.available_locales
81
81
  params["result"].merge!(get_locale_attributes(default_locale, available_locales, :title, row))
82
82
  params["result"].merge!(get_locale_attributes(default_locale, available_locales, :description, row))
83
- params["result"]["decidim_category_id"] = row["category/id"] if row["category/id"].present?
83
+ params["result"]["taxonomies"] = row["taxonomies/ids"].split(",") if row["taxonomies/ids"].present?
84
84
  params["result"]["decidim_accountability_status_id"] = row["status/id"] if row["status/id"].present?
85
85
  params["result"].merge!(get_proposal_ids(row["proposal_urls"]))
86
86
  params
@@ -0,0 +1,26 @@
1
+ <% if component.manifest_name == "proposals" %>
2
+ <div class="row column">
3
+ <%= f.select :proposal_state_id,
4
+ form.proposal_states_collection,
5
+ include_blank: t(".select_state"),
6
+ label: t(".proposal_state") %>
7
+ </div>
8
+ <% end %>
9
+
10
+ <% if component.has_taxonomy_settings? %>
11
+ <% component.available_taxonomy_filters.each do |filter| %>
12
+ <div class="row column">
13
+ <%= filter_taxonomy_items_select_field f, :taxonomies, filter %>
14
+ </div>
15
+ <% end %>
16
+ <% end %>
17
+
18
+ <div class="row column">
19
+ <small class="help-text">
20
+ <% if component.manifest_name == "proposals" %>
21
+ <%= t(".new_items_proposals", count: form.filtered_items_count) %>
22
+ <% elsif component.manifest_name == "budgets" %>
23
+ <%= t(".new_items_projects", count: form.filtered_items_count) %>
24
+ <% end %>
25
+ </small>
26
+ </div>
@@ -0,0 +1,26 @@
1
+ <%= form_for(@form, url: import_components_path(@accountability),
2
+ html: { class: "form form-defaults", id: "new_import_component", data: { form_url: new_import_component_path(@accountability) } },
3
+ method: :post) do |f| %>
4
+ <% if @form.origin_components.any? %>
5
+ <div class="form__wrapper">
6
+ <div class="card pt-4">
7
+ <div class="card-section">
8
+ <div class="row column">
9
+ <%= f.select :origin_component_id, @form.origin_components_collection, prompt: t(".select_component"), label: t(".origin_component_id") %>
10
+ </div>
11
+
12
+ <% if @form.origin_component %>
13
+ <%= render partial: "filters", locals: { f:, form: @form, component: @form.origin_component } %>
14
+ <% end %>
15
+ </div>
16
+ </div>
17
+ </div>
18
+ <div class="item__edit-sticky">
19
+ <div class="item__edit-sticky-container">
20
+ <%= f.submit t(".create"), class: "button button__sm button__secondary" %>
21
+ </div>
22
+ </div>
23
+ <% else %>
24
+ <p><%= t(".no_components") %></p>
25
+ <% end %>
26
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <% add_decidim_page_title(t(".title")) %>
2
+ <div class="item_show__header">
3
+ <h1 class="item_show__header-title">
4
+ <%= t(".title") %>
5
+ </h1>
6
+ </div>
7
+
8
+ <div class="item__edit item__edit-1col">
9
+ <div class="item__edit-form">
10
+ <%= render "form" %>
11
+ </div>
12
+ </div>
13
+
14
+ <%= append_javascript_pack_tag "decidim_accountability_admin_imports" %>
@@ -0,0 +1,29 @@
1
+ <% if view == :deleted %>
2
+ <% if allowed_to? :restore, :result, trashable_deleted_resource: result %>
3
+ <%= icon_link_to "refresh-line", url_for(action: :restore, id: result, controller: "results"), t("decidim.admin.actions.restore"), method: :patch, class: "action-icon--restore" %>
4
+ <% end %>
5
+ <% else %>
6
+ <% if allowed_to? :update, :result, result: result %>
7
+ <%= icon_link_to "pencil-line", edit_result_path(result), t("actions.edit", scope: "decidim.accountability"), class: "action-icon--edit" %>
8
+ <% end %>
9
+
10
+ <% if allowed_to? :create_children, :result, result: result %>
11
+ <%= icon_link_to "add-line", results_path(parent_id: result.id), t("actions.new_result", scope: "decidim.accountability"), class: "action-icon--plus" %>
12
+ <% end %>
13
+
14
+ <% if allowed_to? :update, :result, result: result %>
15
+ <%= icon_link_to "time-line", result_timeline_entries_path(result), t("actions.timeline_entries", scope: "decidim.accountability"), class: "action-icon--clock" %>
16
+ <%= icon_link_to "folder-line", result_attachment_collections_path(result), t("actions.attachment_collections", scope: "decidim.accountability"), class: "action-icon--attachment_collections" %>
17
+ <%= icon_link_to "attachment-line", result_attachments_path(result), t("actions.attachments", scope: "decidim.accountability"), class: "action-icon--attachments" %>
18
+ <% end %>
19
+
20
+ <%= icon_link_to "eye-line", resource_locator(result).path, t("actions.preview", scope: "decidim.accountability"), class: "action-icon--preview", target: :blank, data: { "external-link": false } %>
21
+
22
+ <%= resource_permissions_link(result) %>
23
+
24
+ <% if allowed_to? :soft_delete, :result, trashable_deleted_resource: result %>
25
+ <%= icon_link_to "delete-bin-line", soft_delete_result_path(result), t("actions.soft_delete", scope: "decidim.admin"), method: :patch, class: "action-icon--delete", data: { confirm: t("actions.confirm_delete_result", scope: "decidim.accountability") } %>
26
+ <% else %>
27
+ <%= icon "delete-bin-line", class: "action-icon action-icon--disabled", role: "img", aria_label: t("actions.soft_delete", scope: "decidim.admin") %>
28
+ <% end %>
29
+ <% end %>
@@ -18,15 +18,14 @@
18
18
 
19
19
  <% else %>
20
20
 
21
- <% if current_component.has_subscopes? %>
22
- <div class="row column">
23
- <%= scopes_select_field form, :decidim_scope_id, root: current_component.scope %>
24
- </div>
25
- <% end %>
26
-
27
- <div class="row column">
28
- <%= form.categories_select :decidim_category_id, current_participatory_space.categories, include_blank: true, disable_parents: false %>
21
+ <% if @form.taxonomy_filters&.any? %>
22
+ <% @form.taxonomy_filters.each do |filter| %>
23
+ <div class="row column">
24
+ <%= filter_taxonomy_items_select_field form, :taxonomies, filter %>
25
+ </div>
26
+ <% end %>
29
27
  </div>
28
+ <% end %>
30
29
 
31
30
  <% end %>
32
31
 
@@ -40,6 +39,14 @@
40
39
  </div>
41
40
  </div>
42
41
 
42
+ <% if @form.geocoding_enabled? %>
43
+ <div class="row">
44
+ <div class="columns">
45
+ <%= form.geocoding_field(:address) %>
46
+ </div>
47
+ </div>
48
+ <% end %>
49
+
43
50
  <div class="row">
44
51
  <div class="columns">
45
52
  <%= form.select :decidim_accountability_status_id, statuses.map { |status| [translated_attribute(status.name), status.id, { "data-progress" => status.progress }] }, include_blank: true %>
@@ -0,0 +1,32 @@
1
+ <tr data-id="<%= result.id %>">
2
+ <td>
3
+ <%= check_box_tag "result_ids_s[]", result.id, false, data: { result_id: result.id, result_checkbox: true } %><br>
4
+ </td>
5
+ <td>
6
+ <%= result.id %><br>
7
+ </td>
8
+ <td class="!text-left">
9
+ <% if result.parent_id.nil? %>
10
+ <%= link_to translated_attribute(result.title), results_path(parent_id: result.id) %><br>
11
+ <% else %>
12
+ <%= translated_attribute(result.title) %>
13
+ <% end %>
14
+ </td>
15
+ <td>
16
+ <%= result.taxonomies.map { |taxonomy| decidim_sanitize_translated(taxonomy.name) }.join(", ") %>
17
+ </td>
18
+ <td>
19
+ <% if result.status %>
20
+ <%= translated_attribute result.status.name %>
21
+ <% end %>
22
+ </td>
23
+ <td>
24
+ <%= result.progress&.to_i %>
25
+ </td>
26
+ <td>
27
+ <%= l result.created_at, format: :decidim_short %>
28
+ </td>
29
+ <td class="table-list__actions">
30
+ <%= render partial: "decidim/accountability/admin/results/actions", locals: { result:, view: } %>
31
+ </td>
32
+ </tr>