decidim-budgets 0.30.2 → 0.31.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/budgets/budget_list_item/show.erb +19 -9
  3. data/app/cells/decidim/budgets/budget_list_item/vote_action.erb +2 -2
  4. data/app/cells/decidim/budgets/budget_list_item_cell.rb +44 -10
  5. data/app/cells/decidim/budgets/budgets_list/card_list.erb +0 -2
  6. data/app/cells/decidim/budgets/budgets_list/main_list.erb +2 -2
  7. data/app/cells/decidim/budgets/budgets_list/show.erb +3 -3
  8. data/app/cells/decidim/budgets/budgets_list/voted.erb +12 -10
  9. data/app/cells/decidim/budgets/budgets_list_cell.rb +22 -0
  10. data/app/cells/decidim/budgets/project_budget_amount_cell.rb +14 -0
  11. data/app/cells/decidim/budgets/project_l/extra_data.erb +8 -2
  12. data/app/cells/decidim/budgets/project_l/metadata.erb +1 -1
  13. data/app/cells/decidim/budgets/project_l_cell.rb +2 -4
  14. data/app/cells/decidim/budgets/project_metadata_cell.rb +11 -19
  15. data/app/cells/decidim/budgets/project_selected_status_cell.rb +1 -11
  16. data/app/cells/decidim/budgets/project_vote_button/show.erb +5 -5
  17. data/app/cells/decidim/budgets/project_vote_button_cell.rb +14 -9
  18. data/app/cells/decidim/budgets/project_votes_count_cell.rb +8 -14
  19. data/app/commands/decidim/budgets/cancel_order.rb +5 -0
  20. data/app/controllers/decidim/budgets/admin/budgets_controller.rb +2 -2
  21. data/app/controllers/decidim/budgets/admin/projects_controller.rb +2 -2
  22. data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +1 -1
  23. data/app/controllers/decidim/budgets/application_controller.rb +13 -1
  24. data/app/controllers/decidim/budgets/budgets_controller.rb +1 -3
  25. data/app/controllers/decidim/budgets/line_items_controller.rb +19 -0
  26. data/app/controllers/decidim/budgets/orders_controller.rb +20 -0
  27. data/app/controllers/decidim/budgets/projects_controller.rb +3 -1
  28. data/app/forms/decidim/budgets/admin/component_form.rb +4 -30
  29. data/app/helpers/decidim/budgets/application_helper.rb +1 -0
  30. data/app/helpers/decidim/budgets/projects_helper.rb +11 -7
  31. data/app/models/decidim/budgets/order.rb +2 -2
  32. data/app/packs/entrypoints/decidim_budgets.js +1 -0
  33. data/app/packs/src/decidim/budgets/admin/projects.js +2 -2
  34. data/app/packs/src/decidim/budgets/budgetSummaryBackdrop.js +41 -0
  35. data/app/packs/src/decidim/budgets/exit_handler.js +7 -2
  36. data/app/packs/src/decidim/budgets/progressFixed.js +1 -1
  37. data/app/packs/src/decidim/budgets/projects.js +1 -1
  38. data/app/packs/stylesheets/budgets.scss +57 -37
  39. data/app/permissions/decidim/budgets/permissions.rb +17 -13
  40. data/app/presenters/decidim/budgets/project_presenter.rb +2 -4
  41. data/app/views/decidim/budgets/admin/budgets/_actions.html.erb +65 -18
  42. data/app/views/decidim/budgets/admin/budgets/_budget-tr.html.erb +4 -4
  43. data/app/views/decidim/budgets/admin/budgets/_form.html.erb +1 -1
  44. data/app/views/decidim/budgets/admin/budgets/index.html.erb +14 -11
  45. data/app/views/decidim/budgets/admin/budgets/manage_trash.html.erb +2 -1
  46. data/app/views/decidim/budgets/admin/projects/_actions.html.erb +66 -22
  47. data/app/views/decidim/budgets/admin/projects/_bulk-actions.html.erb +15 -17
  48. data/app/views/decidim/budgets/admin/projects/_form.html.erb +1 -1
  49. data/app/views/decidim/budgets/admin/projects/_project-tr.html.erb +7 -7
  50. data/app/views/decidim/budgets/admin/projects/bulk_actions/_dropdown.html.erb +23 -30
  51. data/app/views/decidim/budgets/admin/projects/index.html.erb +2 -2
  52. data/app/views/decidim/budgets/admin/projects/manage_trash.html.erb +2 -1
  53. data/app/views/decidim/budgets/line_items/update_budget.js.erb +6 -5
  54. data/app/views/decidim/budgets/orders/status.html.erb +30 -30
  55. data/app/views/decidim/budgets/projects/_addition_selector.html.erb +1 -1
  56. data/app/views/decidim/budgets/projects/_budget_summary.html.erb +5 -1
  57. data/app/views/decidim/budgets/projects/_exit_modal.html.erb +1 -1
  58. data/app/views/decidim/budgets/projects/_project.html.erb +5 -1
  59. data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +1 -9
  60. data/app/views/decidim/budgets/projects/_projects.html.erb +3 -1
  61. data/app/views/decidim/budgets/projects/index.html.erb +28 -6
  62. data/app/views/decidim/budgets/projects/order_progress_summary/_content.html.erb +30 -0
  63. data/app/views/decidim/budgets/projects/order_progress_summary/_content_responsive.html.erb +56 -0
  64. data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box.html.erb +43 -0
  65. data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box_buttons.html.erb +12 -0
  66. data/app/views/decidim/budgets/projects/order_progress_summary/_progress_box_sticky.html.erb +25 -0
  67. data/app/views/decidim/budgets/projects/show.html.erb +30 -17
  68. data/config/assets.rb +2 -2
  69. data/config/locales/ar.yml +0 -8
  70. data/config/locales/bg.yml +2 -18
  71. data/config/locales/ca-IT.yml +26 -14
  72. data/config/locales/ca.yml +26 -14
  73. data/config/locales/cs.yml +10 -18
  74. data/config/locales/de.yml +26 -14
  75. data/config/locales/el.yml +0 -7
  76. data/config/locales/en.yml +26 -14
  77. data/config/locales/es-MX.yml +26 -14
  78. data/config/locales/es-PY.yml +26 -14
  79. data/config/locales/es.yml +25 -13
  80. data/config/locales/eu.yml +26 -14
  81. data/config/locales/fi-plain.yml +26 -14
  82. data/config/locales/fi.yml +26 -14
  83. data/config/locales/fr-CA.yml +26 -14
  84. data/config/locales/fr.yml +26 -14
  85. data/config/locales/ga-IE.yml +0 -5
  86. data/config/locales/gl.yml +0 -7
  87. data/config/locales/hu.yml +2 -18
  88. data/config/locales/id-ID.yml +0 -7
  89. data/config/locales/is-IS.yml +0 -6
  90. data/config/locales/it.yml +0 -7
  91. data/config/locales/ja.yml +26 -14
  92. data/config/locales/kaa.yml +0 -1
  93. data/config/locales/ko.yml +0 -5
  94. data/config/locales/lb.yml +0 -7
  95. data/config/locales/lt.yml +2 -18
  96. data/config/locales/lv.yml +0 -7
  97. data/config/locales/nl.yml +0 -7
  98. data/config/locales/no.yml +0 -7
  99. data/config/locales/pl.yml +2 -18
  100. data/config/locales/pt-BR.yml +2 -18
  101. data/config/locales/pt.yml +0 -7
  102. data/config/locales/ro-RO.yml +7 -7
  103. data/config/locales/ru.yml +0 -7
  104. data/config/locales/sk.yml +0 -7
  105. data/config/locales/sq-AL.yml +0 -3
  106. data/config/locales/sv.yml +25 -13
  107. data/config/locales/tr-TR.yml +0 -8
  108. data/config/locales/uk.yml +0 -7
  109. data/config/locales/zh-CN.yml +0 -8
  110. data/config/locales/zh-TW.yml +0 -7
  111. data/db/migrate/20250912110212_move_voting_rules_to_radio_buttons.rb +22 -0
  112. data/lib/decidim/api/budget_type.rb +7 -0
  113. data/lib/decidim/api/project_type.rb +29 -1
  114. data/lib/decidim/budgets/budget_order_pdf.rb +73 -0
  115. data/lib/decidim/budgets/component.rb +26 -13
  116. data/lib/decidim/budgets/engine.rb +3 -11
  117. data/lib/decidim/budgets/seeds.rb +16 -5
  118. data/lib/decidim/budgets/test/factories.rb +3 -18
  119. data/lib/decidim/budgets/version.rb +1 -1
  120. data/lib/decidim/budgets/workflows/base.rb +0 -14
  121. data/lib/decidim/budgets.rb +1 -5
  122. metadata +22 -16
  123. data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +0 -32
  124. data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +0 -27
  125. data/app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb +0 -122
  126. /data/app/views/decidim/budgets/projects/{_order_progress_progressbar_marks_right.html.erb → order_progress_summary/_progressbar_marks_right.html.erb} +0 -0
@@ -31,7 +31,6 @@ Decidim.register_component(:budgets) do |component|
31
31
  resource.model_class_name = "Decidim::Budgets::Project"
32
32
  resource.template = "decidim/budgets/projects/linked_projects"
33
33
  resource.card = "decidim/budgets/project"
34
- resource.actions = %w(vote comment)
35
34
  resource.searchable = true
36
35
  end
37
36
 
@@ -39,24 +38,36 @@ Decidim.register_component(:budgets) do |component|
39
38
  Decidim::Budgets::Budget.where(component: components).count
40
39
  end
41
40
 
42
- component.register_stat :projects_count, priority: Decidim::StatsRegistry::LOW_PRIORITY do |components, start_at, end_at|
43
- Decidim::Budgets::FilteredProjects.for(components, start_at, end_at).count
44
- end
45
-
46
- component.register_stat :orders_count do |components, start_at, end_at|
41
+ component.register_stat :projects_count,
42
+ priority: Decidim::StatsRegistry::MEDIUM_PRIORITY,
43
+ sub_title: "votes",
44
+ icon_name: "git-pull-request-line",
45
+ tooltip_key: "projects_count_tooltip" do |components, start_at, end_at|
47
46
  budgets = Decidim::Budgets::Budget.where(component: components)
47
+ projects = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at)
48
48
  orders = Decidim::Budgets::Order.where(budget: budgets)
49
49
  orders = orders.where(created_at: start_at..) if start_at.present?
50
50
  orders = orders.where(created_at: ..end_at) if end_at.present?
51
- orders.count
51
+ [
52
+ projects.count,
53
+ orders.count
54
+ ]
52
55
  end
53
56
 
54
- component.register_stat :comments_count, tag: :comments do |components, start_at, end_at|
57
+ component.register_stat :comments_count,
58
+ priority: Decidim::StatsRegistry::HIGH_PRIORITY,
59
+ icon_name: "chat-1-line",
60
+ tooltip_key: "comments_count",
61
+ tag: :comments do |components, start_at, end_at|
55
62
  projects = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at)
56
63
  projects.sum(:comments_count)
57
64
  end
58
65
 
59
- component.register_stat :followers_count, tag: :followers, priority: Decidim::StatsRegistry::LOW_PRIORITY do |components, start_at, end_at|
66
+ component.register_stat :followers_count,
67
+ tag: :followers,
68
+ icon_name: "user-follow-line",
69
+ tooltip_key: "followers_count_tooltip",
70
+ priority: Decidim::StatsRegistry::MEDIUM_PRIORITY do |components, start_at, end_at|
60
71
  projects_ids = Decidim::Budgets::FilteredProjects.for(components, start_at, end_at).pluck(:id)
61
72
  Decidim::Follow.where(decidim_followable_type: "Decidim::Budgets::Project", decidim_followable_id: projects_ids).count
62
73
  end
@@ -76,16 +87,18 @@ Decidim.register_component(:budgets) do |component|
76
87
 
77
88
  component.settings(:global) do |settings|
78
89
  settings.attribute :taxonomy_filters, type: :taxonomy_filters
79
- settings.attribute :workflow, type: :enum, default: "one", choices: -> { Decidim::Budgets.workflows.keys.map(&:to_s) }
90
+ settings.attribute :workflow, type: :enum, default: "one", choices: ->(_context) { Decidim::Budgets.workflows.keys.map(&:to_s) }
80
91
  settings.attribute :projects_per_page, type: :integer, default: 12
81
- settings.attribute :vote_rule_threshold_percent_enabled, type: :boolean, default: true
92
+ settings.attribute :voting_rule, type: :enum, default: "threshold_percent", choices: %w(threshold_percent minimum_projects selected_projects)
93
+
82
94
  settings.attribute :vote_threshold_percent, type: :integer, default: 70
83
95
  settings.attribute :vote_threshold_percent, type: :integer, default: 70
84
- settings.attribute :vote_rule_minimum_budget_projects_enabled, type: :boolean, default: false
96
+
85
97
  settings.attribute :vote_minimum_budget_projects_number, type: :integer, default: 1
86
- settings.attribute :vote_rule_selected_projects_enabled, type: :boolean, default: false
98
+
87
99
  settings.attribute :vote_selected_projects_minimum, type: :integer, default: 0
88
100
  settings.attribute :vote_selected_projects_maximum, type: :integer, default: 1
101
+
89
102
  settings.attribute :comments_enabled, type: :boolean, default: true
90
103
  settings.attribute :comments_max_length, type: :integer, required: true
91
104
  settings.attribute :geocoding_enabled, type: :boolean, default: false
@@ -17,6 +17,7 @@ module Decidim
17
17
  member do
18
18
  post :checkout
19
19
  get :status
20
+ get :export_pdf
20
21
  end
21
22
  resource :line_item, only: [:create, :destroy]
22
23
  end
@@ -33,6 +34,7 @@ module Decidim
33
34
  Decidim.icons.register(name: "Decidim::Budgets::Order", icon: "check-double-fill", description: "Budget voting", category: "activity", engine: :budgets)
34
35
 
35
36
  Decidim.icons.register(name: "git-pull-request-line", icon: "git-pull-request-line", category: "system", description: "", engine: :budgets)
37
+ Decidim.icons.register(name: "progress-2-line", icon: "progress-2-line", category: "system", description: "", engine: :budgets)
36
38
  end
37
39
 
38
40
  initializer "decidim_budgets.add_cells_view_paths" do
@@ -40,17 +42,7 @@ module Decidim
40
42
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Budgets::Engine.root}/app/views") # for partials
41
43
  end
42
44
 
43
- initializer "decidim_budgets.register_metrics" do
44
- Decidim.metrics_operation.register(:participants, :budgets) do |metric_operation|
45
- metric_operation.manager_class = "Decidim::Budgets::Metrics::BudgetParticipantsMetricMeasure"
46
- end
47
-
48
- Decidim.metrics_operation.register(:followers, :budgets) do |metric_operation|
49
- metric_operation.manager_class = "Decidim::Budgets::Metrics::BudgetFollowersMetricMeasure"
50
- end
51
- end
52
-
53
- initializer "decidim_budgets.webpacker.assets_path" do
45
+ initializer "decidim_budgets.shakapacker.assets_path" do
54
46
  Decidim.register_assets_path File.expand_path("app/packs", root)
55
47
  end
56
48
 
@@ -15,12 +15,12 @@ module Decidim
15
15
  def call
16
16
  component = create_component!
17
17
 
18
- rand(1...3).times do
18
+ number_of_records.times do
19
19
  create_budget!(component:)
20
20
  end
21
21
 
22
22
  Decidim::Budgets::Budget.where(component:).each do |budget|
23
- rand(2...4).times do
23
+ number_of_records.times do
24
24
  project = create_project!(budget:)
25
25
 
26
26
  create_attachments!(attached_to: project)
@@ -37,6 +37,14 @@ module Decidim
37
37
  "<p>#{::Faker::Lorem.paragraph}</p>"
38
38
  end
39
39
 
40
+ step_settings = if participatory_space.allows_steps?
41
+ { participatory_space.active_step.id => {
42
+ votes: %w(enabled disabled finished).sample
43
+ } }
44
+ else
45
+ {}
46
+ end
47
+
40
48
  params = {
41
49
  name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :budgets).i18n_name,
42
50
  manifest_name: :budgets,
@@ -47,7 +55,8 @@ module Decidim
47
55
  landing_page_content:,
48
56
  more_information_modal: Decidim::Faker::Localized.paragraph(sentence_count: 4),
49
57
  workflow: Decidim::Budgets.workflows.keys.sample
50
- }
58
+ },
59
+ step_settings:
51
60
  }
52
61
 
53
62
  Decidim.traceability.perform_action!(
@@ -72,19 +81,21 @@ module Decidim
72
81
  description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
73
82
  Decidim::Faker::Localized.paragraph(sentence_count: 3)
74
83
  end,
75
- total_budget: ::Faker::Number.number(digits: 8)
84
+ total_budget: ::Faker::Number.number(digits: 7)
76
85
  )
77
86
  end
78
87
  end
79
88
 
80
89
  def create_project!(budget:)
90
+ minimum_amount = Integer(budget.total_budget * 0.1)
91
+ maximum_amount = Integer(budget.total_budget * 0.5)
81
92
  params = {
82
93
  budget:,
83
94
  title: Decidim::Faker::Localized.sentence(word_count: 2),
84
95
  description: Decidim::Faker::Localized.wrapped("<p>", "</p>") do
85
96
  Decidim::Faker::Localized.paragraph(sentence_count: 3)
86
97
  end,
87
- budget_amount: ::Faker::Number.between(from: Integer(budget.total_budget * 0.7), to: budget.total_budget)
98
+ budget_amount: ::Faker::Number.between(from: minimum_amount, to: maximum_amount)
88
99
  }
89
100
 
90
101
  if budget.component.settings.geocoding_enabled?
@@ -26,17 +26,12 @@ FactoryBot.define do
26
26
 
27
27
  trait :with_vote_threshold_percent do
28
28
  transient do
29
- vote_rule_threshold_percent_enabled { true }
30
- vote_rule_minimum_budget_projects_enabled { false }
31
- vote_rule_projects_enabled { false }
32
29
  vote_threshold_percent { 70 }
33
30
  end
34
31
 
35
32
  settings do
36
33
  {
37
- vote_rule_threshold_percent_enabled:,
38
- vote_rule_minimum_budget_projects_enabled:,
39
- vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
34
+ voting_rule: "threshold_percent",
40
35
  vote_threshold_percent:
41
36
  }
42
37
  end
@@ -44,17 +39,12 @@ FactoryBot.define do
44
39
 
45
40
  trait :with_minimum_budget_projects do
46
41
  transient do
47
- vote_rule_threshold_percent_enabled { false }
48
- vote_rule_minimum_budget_projects_enabled { true }
49
- vote_rule_projects_enabled { false }
50
42
  vote_minimum_budget_projects_number { 3 }
51
43
  end
52
44
 
53
45
  settings do
54
46
  {
55
- vote_rule_threshold_percent_enabled:,
56
- vote_rule_minimum_budget_projects_enabled:,
57
- vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
47
+ voting_rule: "minimum_projects",
58
48
  vote_minimum_budget_projects_number:
59
49
  }
60
50
  end
@@ -62,18 +52,13 @@ FactoryBot.define do
62
52
 
63
53
  trait :with_budget_projects_range do
64
54
  transient do
65
- vote_rule_threshold_percent_enabled { false }
66
- vote_rule_minimum_budget_projects_enabled { false }
67
- vote_rule_projects_enabled { true }
68
55
  vote_minimum_budget_projects_number { 3 }
69
56
  vote_maximum_budget_projects_number { 6 }
70
57
  end
71
58
 
72
59
  settings do
73
60
  {
74
- vote_rule_threshold_percent_enabled:,
75
- vote_rule_minimum_budget_projects_enabled:,
76
- vote_rule_selected_projects_enabled: vote_rule_projects_enabled,
61
+ voting_rule: "selected_projects",
77
62
  vote_selected_projects_minimum: vote_minimum_budget_projects_number,
78
63
  vote_selected_projects_maximum: vote_maximum_budget_projects_number
79
64
  }
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-budgets version.
5
5
  module Budgets
6
6
  def self.version
7
- "0.30.2"
7
+ "0.31.0.rc1"
8
8
  end
9
9
  end
10
10
  end
@@ -10,20 +10,6 @@ module Decidim
10
10
  @user = user
11
11
  end
12
12
 
13
- # Public: Checks if the component has only one budget resource.
14
- #
15
- # Returns Boolean.
16
- def single?
17
- budgets.one?
18
- end
19
-
20
- # Public: Return the single budget resource of the component
21
- #
22
- # Returns an ActiveRecord.
23
- def single
24
- budgets.first if single?
25
- end
26
-
27
13
  # Public: Decides if the given resource should be highlighted.
28
14
  # This method must be overwritten for each Workflow class.
29
15
  # - resource: the budget resource to consider
@@ -11,12 +11,8 @@ module Decidim
11
11
  # Base module for this engine.
12
12
  module Budgets
13
13
  autoload :ProjectSerializer, "decidim/budgets/project_serializer"
14
+ autoload :OrderPDF, "decidim/budgets/budget_order_pdf"
14
15
 
15
16
  include ActiveSupport::Configurable
16
-
17
- # Public Setting that defines whether proposals can be linked to meetings
18
- config_accessor :enable_proposal_linking do
19
- Decidim.const_defined?("Proposals")
20
- end
21
17
  end
22
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-budgets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.30.2
4
+ version: 0.31.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josep Jaume Rey Peroy
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-09-23 00:00:00.000000000 Z
13
+ date: 2025-09-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: decidim-comments
@@ -18,70 +18,70 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.30.2
21
+ version: 0.31.0.rc1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 0.30.2
28
+ version: 0.31.0.rc1
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: decidim-core
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - '='
34
34
  - !ruby/object:Gem::Version
35
- version: 0.30.2
35
+ version: 0.31.0.rc1
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - '='
41
41
  - !ruby/object:Gem::Version
42
- version: 0.30.2
42
+ version: 0.31.0.rc1
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: decidim-admin
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - '='
48
48
  - !ruby/object:Gem::Version
49
- version: 0.30.2
49
+ version: 0.31.0.rc1
50
50
  type: :development
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - '='
55
55
  - !ruby/object:Gem::Version
56
- version: 0.30.2
56
+ version: 0.31.0.rc1
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: decidim-dev
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - '='
62
62
  - !ruby/object:Gem::Version
63
- version: 0.30.2
63
+ version: 0.31.0.rc1
64
64
  type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - '='
69
69
  - !ruby/object:Gem::Version
70
- version: 0.30.2
70
+ version: 0.31.0.rc1
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: decidim-proposals
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - '='
76
76
  - !ruby/object:Gem::Version
77
- version: 0.30.2
77
+ version: 0.31.0.rc1
78
78
  type: :development
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - '='
83
83
  - !ruby/object:Gem::Version
84
- version: 0.30.2
84
+ version: 0.31.0.rc1
85
85
  description: A budgets component for decidim's participatory spaces.
86
86
  email:
87
87
  - josepjaume@gmail.com
@@ -114,6 +114,7 @@ files:
114
114
  - app/cells/decidim/budgets/limit_announcement/show.erb
115
115
  - app/cells/decidim/budgets/limit_announcement_cell.rb
116
116
  - app/cells/decidim/budgets/order_activity_cell.rb
117
+ - app/cells/decidim/budgets/project_budget_amount_cell.rb
117
118
  - app/cells/decidim/budgets/project_cell.rb
118
119
  - app/cells/decidim/budgets/project_history_cell.rb
119
120
  - app/cells/decidim/budgets/project_l/extra_data.erb
@@ -174,6 +175,7 @@ files:
174
175
  - app/packs/entrypoints/decidim_budgets_admin.js
175
176
  - app/packs/images/decidim/budgets/decidim_budgets.svg
176
177
  - app/packs/src/decidim/budgets/admin/projects.js
178
+ - app/packs/src/decidim/budgets/budgetSummaryBackdrop.js
177
179
  - app/packs/src/decidim/budgets/exit_handler.js
178
180
  - app/packs/src/decidim/budgets/progressFixed.js
179
181
  - app/packs/src/decidim/budgets/projects.js
@@ -184,8 +186,6 @@ files:
184
186
  - app/presenters/decidim/budgets/admin_log/project_presenter.rb
185
187
  - app/presenters/decidim/budgets/project_presenter.rb
186
188
  - app/queries/decidim/budgets/filtered_projects.rb
187
- - app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb
188
- - app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb
189
189
  - app/serializers/decidim/budgets/download_your_data_budgets_order_serializer.rb
190
190
  - app/services/decidim/budgets/order_reminder_generator.rb
191
191
  - app/views/decidim/budgets/admin/budgets/_actions.html.erb
@@ -224,8 +224,6 @@ files:
224
224
  - app/views/decidim/budgets/projects/_exit_modal.html.erb
225
225
  - app/views/decidim/budgets/projects/_linked_projects.html.erb
226
226
  - app/views/decidim/budgets/projects/_order.html.erb
227
- - app/views/decidim/budgets/projects/_order_progress_progressbar_marks_right.html.erb
228
- - app/views/decidim/budgets/projects/_order_progress_summary_content.html.erb
229
227
  - app/views/decidim/budgets/projects/_order_total_budget.html.erb
230
228
  - app/views/decidim/budgets/projects/_project.html.erb
231
229
  - app/views/decidim/budgets/projects/_project_budget_button.html.erb
@@ -234,6 +232,12 @@ files:
234
232
  - app/views/decidim/budgets/projects/_projects_list.html.erb
235
233
  - app/views/decidim/budgets/projects/index.html.erb
236
234
  - app/views/decidim/budgets/projects/index.js.erb
235
+ - app/views/decidim/budgets/projects/order_progress_summary/_content.html.erb
236
+ - app/views/decidim/budgets/projects/order_progress_summary/_content_responsive.html.erb
237
+ - app/views/decidim/budgets/projects/order_progress_summary/_progress_box.html.erb
238
+ - app/views/decidim/budgets/projects/order_progress_summary/_progress_box_buttons.html.erb
239
+ - app/views/decidim/budgets/projects/order_progress_summary/_progress_box_sticky.html.erb
240
+ - app/views/decidim/budgets/projects/order_progress_summary/_progressbar_marks_right.html.erb
237
241
  - app/views/decidim/budgets/projects/show.html.erb
238
242
  - app/views/decidim/budgets/vote_reminder_mailer/vote_reminder.html.erb
239
243
  - config/assets.rb
@@ -342,6 +346,7 @@ files:
342
346
  - db/migrate/20220428072638_add_geolocalization_fields_to_projects.rb
343
347
  - db/migrate/20240828103724_add_deleted_at_to_decidim_budgets_budgets.rb
344
348
  - db/migrate/20240916135141_add_deleted_at_to_decidim_budgets_projects.rb
349
+ - db/migrate/20250912110212_move_voting_rules_to_radio_buttons.rb
345
350
  - decidim-budgets.gemspec
346
351
  - lib/decidim/api/budget_type.rb
347
352
  - lib/decidim/api/budgets_type.rb
@@ -350,6 +355,7 @@ files:
350
355
  - lib/decidim/budgets/admin.rb
351
356
  - lib/decidim/budgets/admin_engine.rb
352
357
  - lib/decidim/budgets/api.rb
358
+ - lib/decidim/budgets/budget_order_pdf.rb
353
359
  - lib/decidim/budgets/component.rb
354
360
  - lib/decidim/budgets/engine.rb
355
361
  - lib/decidim/budgets/project_serializer.rb
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module Budgets
5
- module Metrics
6
- # Searches for unique Users following the next objects
7
- # - Budgets
8
- class BudgetFollowersMetricMeasure < Decidim::MetricMeasure
9
- def valid?
10
- super && @resource.is_a?(Decidim::Component)
11
- end
12
-
13
- def calculate
14
- budgets = Decidim::Budgets::Budget.where(component: @resource)
15
- projects = Decidim::Budgets::Project.where(budget: budgets)
16
-
17
- budgets_followers = Decidim::Follow.where(followable: projects).joins(:user)
18
- .where(decidim_follows: { created_at: ..end_time })
19
- cumulative_users = budgets_followers.pluck(:decidim_user_id)
20
-
21
- budgets_followers = budgets_followers.where(decidim_follows: { created_at: start_time.. })
22
- quantity_users = budgets_followers.pluck(:decidim_user_id)
23
-
24
- {
25
- cumulative_users: cumulative_users.uniq,
26
- quantity_users: quantity_users.uniq
27
- }
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module Budgets
5
- module Metrics
6
- # Searches for Participants in the following actions
7
- # - Vote a participatory budgeting project (Budgets)
8
- class BudgetParticipantsMetricMeasure < Decidim::MetricMeasure
9
- def valid?
10
- super && @resource.is_a?(Decidim::Component)
11
- end
12
-
13
- def calculate
14
- budgets = Decidim::Budgets::Budget.where(component: @resource)
15
- orders = Decidim::Budgets::Order.where(budget: budgets)
16
- .finished
17
- .where(decidim_budgets_orders: { checked_out_at: ..end_time })
18
-
19
- {
20
- cumulative_users: orders.pluck(:decidim_user_id),
21
- quantity_users: orders.where(decidim_budgets_orders: { checked_out_at: start_time.. }).pluck(:decidim_user_id)
22
- }
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,122 +0,0 @@
1
- <div data-order-progress-responsive="<%= responsive.inspect %>" class="budget-summary__content">
2
- <div class="budget-summary__progressbox" data-current-allocation="<%= current_order ? current_order.total : 0 %>">
3
- <% if include_heading %>
4
- <% if current_order_checked_out? %>
5
- <%= t("title", scope: "decidim.budgets.projects.budget_summary.checked_out") %>
6
- <div class="budget-summary__content__header">
7
- <span class="budget-summary__content__header--title">
8
- <%= t("name", scope: "decidim.components.budgets") %>
9
- </span>
10
- /
11
- <%= translated_attribute(budget.title) %>
12
- <p class="budget-summary__content__header--description">
13
- <%= t("description", scope: "decidim.budgets.projects.budget_summary.checked_out") %>
14
- </p>
15
- </div>
16
- <% else %>
17
- <p class="budget-summary__progressbox--checked_out">
18
- <%= current_rule_description %>
19
- </p>
20
- <% end %>
21
- <% end %>
22
- <div class="budget-summary__progressbar">
23
- <div class="budget-progress" role="progressbar" aria-label="<%= t("budget", scope: "decidim.budgets.projects.order_progress") %>" aria-valuenow="<%= current_order_budget_percent %>" aria-valuetext="<%= current_order_budget_percent %> %" aria-valuemin="0" aria-valuemax="100">
24
- <div class="budget-summary__progressbar--minimum" style="width: <%= current_order_budget_percent_minimum %>%">
25
- </div>
26
- <div class="budget-summary__progressbar--meter bg-success" style="width: <%= current_order_budget_percent %>%"> </div>
27
- </div>
28
- <div class="budget-summary__progressbar-marks">
29
- <span class="budget-summary__progressbar-legend">
30
- <strong id="order-total-budget<%= "-responsive" if responsive %>" class="budget-summary__progressbar-legend-strong">
31
- <%= render partial: "decidim/budgets/projects/order_total_budget" %>
32
- </strong>
33
- <%= t("assigned", scope: "decidim.budgets.projects.order_progress") %>
34
- </span>
35
- <% if current_order.minimum_budget > 0 %>
36
- <span class="budget-summary__progressbar-legend budget-summary__progressbar-marks_center">
37
- <strong class="budget-summary__progressbar-legend-strong">
38
- <%= budget_to_currency(current_order.minimum_budget) %>
39
- </strong>
40
- <%= t("minimum", scope: "decidim.budgets.projects.order_progress") %>
41
- </span>
42
- <% end %>
43
- <%= render partial: "decidim/budgets/projects/order_progress_progressbar_marks_right" %>
44
- </div>
45
- </div>
46
- </div>
47
- <div class="budget-summary__progressbox-buttons layout-aside__ctas-buttons" data-sticky-buttons>
48
- <% if !current_order_checked_out? && voting_open? %>
49
- <button class="button button__secondary button__lg w-full" data-dialog-open="budget-confirm" <%= budget_confirm_disabled_attr %>>
50
- <%= t("vote", scope: "decidim.budgets.projects.budget_summary") %>
51
- <%= icon "check-line" %>
52
- </button>
53
- <% end %>
54
- <% if include_heading && current_order_checked_out? %>
55
- <%= link_to budget_order_path(return_to: "budget"), method: :delete, class: "button button__lg button__secondary cancel-order w-full", data: { confirm: t("are_you_sure", scope: "decidim.budgets.projects.budget_confirm") } do %>
56
- <span><%= t("cancel_order", scope: "decidim.budgets.projects.budget_summary") %></span>
57
- <%= icon "delete-bin-line" %>
58
- <% end %>
59
- <% end %>
60
- </div>
61
- <div class="budget-summary__button-modal">
62
- <button type="button" data-dialog-open="budget-modal-info" aria-haspopup="dialog" tabindex="0" class="button button__text button__xs underline font-bold">
63
- <%= t("more_information", scope: "decidim.budgets.budget_information_modal") %>
64
- </button>
65
- </div>
66
- <div class="w-screen max-w-screen progressbox-fixed-wrapper" data-progressbox-fixed>
67
- <div class="gap-0 layout-item py-4 items-center budget-summary__progressbar">
68
- <div class="budget-summary__progressbox layout-item__main">
69
- <div class="budget-progress relative" role="progressbar" aria-valuenow="<%= current_order_budget_percent %>" aria-valuetext="<%= current_order_budget_percent %>%" aria-valuemin="0" aria-valuemax="100">
70
- <div class="budget-summary__progressbar--minimum" style="width: <%= current_order_budget_percent_minimum %>%">
71
- </div>
72
- <div class="budget-summary__progressbar--meter bg-success" style="width: <%= current_order_budget_percent %>%">
73
- </div>
74
- </div>
75
- <div class="budget-summary__progressbar-marks">
76
- <span class="budget-summary__progressbar-legend" style="width: <%= current_order_budget_percent_minimum %>%;">
77
- <%= t("assigned", scope: "decidim.budgets.projects.order_progress") %>
78
- <strong id="order-total-budget-sticky<%= "-responsive" if responsive %>" class="budget-summary__progressbar-legend-strong">
79
- <%= render partial: "decidim/budgets/projects/order_total_budget" %>
80
- </strong>
81
- </span>
82
- <% if current_order.minimum_budget > 0 %>
83
- <span class="budget-summary__progressbar-legend budget-summary__progressbar-marks_center">
84
- <%= t("minimum", scope: "decidim.budgets.projects.order_progress") %>
85
- <strong class="budget-summary__progressbar-legend-strong">
86
- <%= budget_to_currency(current_order.minimum_budget) %>
87
- </strong>
88
- </span>
89
- <% end %>
90
- <%= render partial: "decidim/budgets/projects/order_progress_progressbar_marks_right" %>
91
- </div>
92
- </div>
93
- <div class="layout-item__aside budget-summary__progressbox-buttons hidden lg:block">
94
- <% if !current_order_checked_out? && voting_open? %>
95
- <button class="button button__secondary button__lg mt-2 md:mt-0 w-full" data-dialog-open="budget-confirm" <%= budget_confirm_disabled_attr %>>
96
- <span>
97
- <%= t("vote", scope: "decidim.budgets.projects.budget_summary") %>
98
- </span>
99
- <%= icon "check-line" %>
100
- </button>
101
- <% end %>
102
- <% if include_heading && current_order_checked_out? %>
103
- <%= link_to budget_order_path(return_to: "budget"), method: :delete, class: "button button__lg button__secondary cancel-order w-full mt-2 md:mt-0", data: { confirm: t("are_you_sure", scope: "decidim.budgets.projects.budget_confirm") } do %>
104
- <span><%= t("cancel_order", scope: "decidim.budgets.projects.budget_summary") %></span>
105
- <%= icon "delete-bin-line" %>
106
- <% end %>
107
- <% end %>
108
- </div>
109
- </div>
110
- </div>
111
- </div>
112
-
113
- <div class="budget-summary__button-dropdown">
114
- <button id="dropdown-trigger-button-dropdown" data-component="dropdown" data-target="dropdown-menu-button-dropdown" class="budget-summary__button-dropdown_text">
115
- <%= t("more_information", scope: "decidim.budgets.budget_information_modal") %>
116
- <%= icon "arrow-down-s-line" %>
117
- <%= icon "arrow-up-s-line" %>
118
- </button>
119
- <p id="dropdown-menu-button-dropdown">
120
- <%= cell("decidim/budgets/budget_information_modal", @budget).call(:more_information) %>
121
- </p>
122
- </div>