effective_committees 0.10.0 → 0.10.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b64f9b12ecd4b0b3b70dd361f5fbe9c25b37009f167c68c92b7d0a0501bdbb7d
4
- data.tar.gz: b3e5bbcadbd792f9f98d0bc5cb65aad229ae24fea3bae2aa7a0063f8e1535295
3
+ metadata.gz: b2fd31ce754295f7529be717b124429515ed649a8543d32451691af6422c398f
4
+ data.tar.gz: cc662c3f297b8a38cc932e37ba8a674d6aea33f89c12a92b366e309941c73696
5
5
  SHA512:
6
- metadata.gz: 340c2c724dfab35ab4b3b901cd5035805496b4a7e6029abfaf3f490fbe957c1fdc99312c0fb72712577c2983083182baaf0c7a075baa08a5d9aae8c82b38a7fe
7
- data.tar.gz: af0d65a2e6b320347dfd169ce5710712cda0eab4c33d80da5e386b8a2262e03b431d32ec922f8fa9a7579ab370a901811192bee4254c98e719856341b518e8b5
6
+ metadata.gz: a09155f4f86ac05b6ec64bb73dca7e90f7c3c52854e4fe9374b80aa5aa0535500a989261be6a331a0b2b4c89c070e7826a8c29dd17c5e3014ac4a2b6cd12f8fa
7
+ data.tar.gz: b59ee585600a9114a60bebef17a532dafdcb0304d7924312c0846d33c278cbbd7b73fc14ad5d2f30e06b0b3882d5b0c9f0d3a8cc6404dbcef2932020ebc89135
@@ -16,7 +16,7 @@ module EffectiveCommitteesUser
16
16
  end
17
17
 
18
18
  included do
19
- has_many :committee_members, -> { Effective::CommitteeMember.sorted },
19
+ has_many :committee_members, -> { Effective::CommitteeMember.sorted.includes(:committee) },
20
20
  class_name: 'Effective::CommitteeMember', inverse_of: :user, dependent: :delete_all
21
21
 
22
22
  accepts_nested_attributes_for :committee_members, allow_destroy: true
@@ -32,17 +32,20 @@ module EffectiveCommitteesUser
32
32
 
33
33
  # Instance Methods
34
34
 
35
+ # Returns the user's currently-active term on this committee, or nil.
36
+ # A user may hold multiple terms on the same committee (history of past roles).
35
37
  def committee_member(committee:)
36
- committee_members.find { |rep| rep.committee_id == committee.id }
38
+ committee_members.select(&:active?).find { |cm| cm.committee_id == committee.id }
37
39
  end
38
40
 
39
- # Find or build
41
+ # Find-active-or-build-new. If the user has no active term, build a fresh row
42
+ # (expired terms are history and are not edited in place through this helper).
40
43
  def build_committee_member(committee:)
41
44
  committee_member(committee: committee) || committee_members.build(committee: committee)
42
45
  end
43
46
 
44
47
  def committees
45
- committee_members.includes(:committee).select { |cm| cm.active? && !cm.marked_for_destruction? }.map { |cm| cm.committee }
48
+ committee_members.select(&:active?).map { |cm| cm.committee }.uniq
46
49
  end
47
50
 
48
51
  # When activity is for sequential uploaded files, group them together like: "12 files were added to Board of Directors - April 2025 Meeting"
@@ -61,8 +64,8 @@ module EffectiveCommitteesUser
61
64
  # Returns an Array of Arrays where some are 1 length groups
62
65
  # Others are multiple length groups of file changes to one folder
63
66
  logs = logs.slice_when do |a, b|
64
- (a.changes_to_id != b.changes_to_id) ||
65
- (a.associated_type != b.associated_type) ||
67
+ (a.changes_to_id != b.changes_to_id) ||
68
+ (a.associated_type != b.associated_type) ||
66
69
  (b.associated_type == "Effective::CommitteeFolder") ||
67
70
  (a.associated.try(:committee_folder_id) != b.associated.try(:committee_folder_id))
68
71
  end
@@ -55,12 +55,13 @@ module Effective
55
55
  # Returns the user's currently-active term on this committee, or nil.
56
56
  # For the full history including expired terms, use committee_members_for(user:).
57
57
  def committee_member(user:)
58
- committee_members.find { |member| member.user_id == user.id && member.active? }
58
+ committee_members.find { |cm| cm.user_id == user.id && cm.active? }
59
59
  end
60
60
 
61
61
  # All terms (active and expired) a user has served on this committee.
62
+ # Do not add uniq here
62
63
  def committee_members_for(user:)
63
- committee_members.select { |member| member.user_id == user.id }
64
+ committee_members.select { |cm| cm.user_id == user.id }
64
65
  end
65
66
 
66
67
  # Find-active-or-build-new. If the user has no active term, build a fresh row
@@ -70,11 +71,11 @@ module Effective
70
71
  end
71
72
 
72
73
  def users
73
- committee_members.reject(&:marked_for_destruction?).map(&:user)
74
+ committee_members.map(&:user).uniq
74
75
  end
75
76
 
76
77
  def emails
77
- committee_members.reject(&:marked_for_destruction?).select(&:active?).map(&:email).compact.join(', ')
78
+ committee_members.select(&:active?).map(&:email).compact.uniq.join(', ')
78
79
  end
79
80
 
80
81
  def children
@@ -28,7 +28,7 @@ module Effective
28
28
  end
29
29
 
30
30
  scope :sorted, -> { order(:position) }
31
- scope :deep, -> { includes(:rich_text_body) }
31
+ scope :deep, -> { includes(:committee, :committee_folder, :rich_text_body) }
32
32
 
33
33
  validates :title, presence: true, length: { maximum: 250 }
34
34
  validates :position, presence: true
@@ -61,11 +61,8 @@ module Effective
61
61
  validates :user, presence: true
62
62
  validates :position, presence: true
63
63
 
64
- validates :user_id, if: -> { user_id && user_type && committee_id && committee_type },
65
- uniqueness: { scope: [:committee_id, :committee_type], message: 'already belongs to this committee' }
66
-
67
64
  validate(if: -> { start_on && end_on }) do
68
- self.errors.add(:end_on, 'must be after start date') unless end_on > start_on
65
+ errors.add(:end_on, 'must be after start date') unless end_on > start_on
69
66
  end
70
67
 
71
68
  def to_s
@@ -1,7 +1,7 @@
1
1
  - agenda_committees = current_user.committees.select(&:agenda_mode?)
2
2
  - upcoming = agenda_committees.flat_map { |c| Effective::CommitteeFolder.where(committee: c).upcoming_meetings.limit(5) }.sort_by(&:meeting_date).first(5)
3
3
 
4
- - if upcoming.any? || recent.any?
4
+ - if upcoming.present?
5
5
  %h3 Upcoming Meetings
6
6
 
7
7
  - if upcoming.any?
@@ -1,9 +1,9 @@
1
1
  = render('layout') do
2
2
  - @committees.each do |committee|
3
3
  %h3= committee
4
- = committee.body.to_s
4
+ = committee.body
5
5
 
6
- - members = committee.committee_members.select(&:active?).sort_by(&:to_s)
6
+ - members = committee.committee_members.select(&:active?).uniq(&:user_id)
7
7
  %ul
8
8
  - members.each do |member|
9
9
  %li
@@ -1,3 +1,3 @@
1
1
  module EffectiveCommittees
2
- VERSION = '0.10.0'.freeze
2
+ VERSION = '0.10.2'.freeze
3
3
  end
@@ -17,7 +17,7 @@ module EffectiveCommittees
17
17
  include EffectiveGem
18
18
 
19
19
  def self.log_page_views?
20
- !!log_page_views
20
+ log_page_views == true
21
21
  end
22
22
 
23
23
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_committees
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2026-05-06 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rails
@@ -283,7 +282,6 @@ homepage: https://github.com/code-and-effect/effective_committees
283
282
  licenses:
284
283
  - MIT
285
284
  metadata: {}
286
- post_install_message:
287
285
  rdoc_options: []
288
286
  require_paths:
289
287
  - lib
@@ -298,8 +296,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
298
296
  - !ruby/object:Gem::Version
299
297
  version: '0'
300
298
  requirements: []
301
- rubygems_version: 3.5.9
302
- signing_key:
299
+ rubygems_version: 4.0.17
303
300
  specification_version: 4
304
301
  summary: Committees are groups of users that can all share files.
305
302
  test_files: []