effective_committees 0.0.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +186 -0
- data/Rakefile +18 -0
- data/app/assets/config/effective_committees_manifest.js +3 -0
- data/app/assets/javascripts/effective_committees/base.js +0 -0
- data/app/assets/javascripts/effective_committeesjs +1 -0
- data/app/assets/stylesheets/effective_committees/base.scss +0 -0
- data/app/assets/stylesheets/effective_committees.scss +1 -0
- data/app/controllers/admin/committee_files_controller.rb +16 -0
- data/app/controllers/admin/committee_folders_controller.rb +16 -0
- data/app/controllers/admin/committee_members_controller.rb +16 -0
- data/app/controllers/admin/committees_controller.rb +22 -0
- data/app/controllers/effective/committee_folders_controller.rb +7 -0
- data/app/controllers/effective/committee_members_controller.rb +19 -0
- data/app/controllers/effective/committees_controller.rb +17 -0
- data/app/datatables/admin/effective_committee_files_datatable.rb +24 -0
- data/app/datatables/admin/effective_committee_folders_datatable.rb +28 -0
- data/app/datatables/admin/effective_committee_members_datatable.rb +32 -0
- data/app/datatables/admin/effective_committees_datatable.rb +34 -0
- data/app/datatables/effective_committee_members_datatable.rb +42 -0
- data/app/datatables/effective_committees_datatable.rb +31 -0
- data/app/helpers/effective_committees_helper.rb +3 -0
- data/app/models/concerns/effective_committees_user.rb +40 -0
- data/app/models/effective/committee.rb +55 -0
- data/app/models/effective/committee_file.rb +40 -0
- data/app/models/effective/committee_folder.rb +42 -0
- data/app/models/effective/committee_member.rb +76 -0
- data/app/views/admin/committee_files/_form.html.haml +14 -0
- data/app/views/admin/committee_folders/_form.html.haml +21 -0
- data/app/views/admin/committee_members/_form.html.haml +31 -0
- data/app/views/admin/committee_members/_user_fields.html.haml +7 -0
- data/app/views/admin/committees/_fields.html.haml +7 -0
- data/app/views/admin/committees/_form.html.haml +20 -0
- data/app/views/admin/committees/_form_committee.html.haml +6 -0
- data/app/views/effective/committee_folders/_committee_folder.html.haml +24 -0
- data/app/views/effective/committee_members/_form.html.haml +35 -0
- data/app/views/effective/committee_members/_user_fields.html.haml +7 -0
- data/app/views/effective/committees/_committee.html.haml +23 -0
- data/app/views/effective/committees/_dashboard.html.haml +10 -0
- data/app/views/effective/committees/_fields.html.haml +2 -0
- data/app/views/effective/committees/_form.html.haml +8 -0
- data/app/views/effective/committees/_form_committee.html.haml +11 -0
- data/app/views/effective/committees/index.html.haml +21 -0
- data/config/effective_committees.rb +13 -0
- data/config/routes.rb +24 -0
- data/db/migrate/01_create_effective_committees.rb.erb +14 -0
- data/db/seeds.rb +1 -0
- data/lib/effective_committees/engine.rb +18 -0
- data/lib/effective_committees/version.rb +3 -0
- data/lib/effective_committees.rb +18 -0
- data/lib/generators/effective_committees/install_generator.rb +31 -0
- data/lib/generators/templates/effective_committees_mailer_preview.rb +4 -0
- data/lib/tasks/effective_committees_tasks.rake +8 -0
- metadata +250 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Effective
|
|
4
|
+
class CommitteeFile < ActiveRecord::Base
|
|
5
|
+
self.table_name = EffectiveCommittees.committee_files_table_name.to_s
|
|
6
|
+
|
|
7
|
+
log_changes(to: :committee) if respond_to?(:log_changes)
|
|
8
|
+
|
|
9
|
+
belongs_to :committee, polymorphic: true, counter_cache: true
|
|
10
|
+
belongs_to :committee_folder, counter_cache: true
|
|
11
|
+
|
|
12
|
+
has_one_attached :file
|
|
13
|
+
|
|
14
|
+
effective_resource do
|
|
15
|
+
title :string
|
|
16
|
+
notes :text
|
|
17
|
+
|
|
18
|
+
timestamps
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
before_validation do
|
|
22
|
+
self.committee ||= committee_folder&.committee
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
before_validation(if: -> { file.attached? }) do
|
|
26
|
+
self.title ||= file.filename.to_s
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
scope :deep, -> { with_attached_file }
|
|
30
|
+
scope :sorted, -> { order(:title) }
|
|
31
|
+
|
|
32
|
+
validates :title, presence: true
|
|
33
|
+
validates :file, presence: true
|
|
34
|
+
|
|
35
|
+
def to_s
|
|
36
|
+
title.presence || 'file'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Effective
|
|
4
|
+
class CommitteeFolder < ActiveRecord::Base
|
|
5
|
+
self.table_name = EffectiveCommittees.committee_folders_table_name.to_s
|
|
6
|
+
|
|
7
|
+
acts_as_slugged
|
|
8
|
+
log_changes(to: :committee) if respond_to?(:log_changes)
|
|
9
|
+
|
|
10
|
+
belongs_to :committee, polymorphic: true, counter_cache: true
|
|
11
|
+
|
|
12
|
+
has_rich_text :body
|
|
13
|
+
has_many :committee_files, -> { Effective::CommitteeFile.sorted }, dependent: :destroy, inverse_of: :committee
|
|
14
|
+
|
|
15
|
+
effective_resource do
|
|
16
|
+
title :string
|
|
17
|
+
slug :string
|
|
18
|
+
|
|
19
|
+
position :integer
|
|
20
|
+
committee_files_count :integer # Counter Cache
|
|
21
|
+
|
|
22
|
+
timestamps
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
before_validation(if: -> { committee.present? }) do
|
|
26
|
+
self.position ||= (committee.committee_folders.map { |obj| obj.position }.compact.max || -1) + 1
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
scope :deep, -> { includes(:committee, :committee_files) }
|
|
30
|
+
scope :sorted, -> { order(:position) }
|
|
31
|
+
|
|
32
|
+
validates :title, presence: true, length: { maximum: 250 },
|
|
33
|
+
uniqueness: { scope: [:committee_id], message: 'already exists for this committee'}
|
|
34
|
+
|
|
35
|
+
validates :position, presence: true
|
|
36
|
+
|
|
37
|
+
def to_s
|
|
38
|
+
title.presence || 'folder'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Effective
|
|
4
|
+
class CommitteeMember < ActiveRecord::Base
|
|
5
|
+
self.table_name = EffectiveCommittees.committee_members_table_name.to_s
|
|
6
|
+
|
|
7
|
+
attr_accessor :user_ids, :committee_ids
|
|
8
|
+
|
|
9
|
+
acts_as_role_restricted
|
|
10
|
+
log_changes(to: :committee) if respond_to?(:log_changes)
|
|
11
|
+
|
|
12
|
+
belongs_to :committee, polymorphic: true, counter_cache: true
|
|
13
|
+
belongs_to :user, polymorphic: true
|
|
14
|
+
|
|
15
|
+
accepts_nested_attributes_for :committee
|
|
16
|
+
accepts_nested_attributes_for :user
|
|
17
|
+
|
|
18
|
+
effective_resource do
|
|
19
|
+
roles_mask :integer
|
|
20
|
+
|
|
21
|
+
timestamps
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
scope :sorted, -> { order(:id) }
|
|
25
|
+
scope :deep, -> { includes(:user, :committee) }
|
|
26
|
+
|
|
27
|
+
before_validation(if: -> { user_ids.present? }) do
|
|
28
|
+
assign_attributes(user_id: user_ids.first, user_ids: user_ids[1..-1])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
before_validation(if: -> { committee_ids.present? }) do
|
|
32
|
+
assign_attributes(committee_id: committee_ids.first, committee_ids: committee_ids[1..-1])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
after_commit(if: -> { user_ids.present? }) do
|
|
36
|
+
additional = (user_ids - CommitteeMember.where(committee_id: committee_id, user_id: user_ids).pluck(:user_id))
|
|
37
|
+
additional = additional.map { |user_id| {committee_id: committee_id, committee_type: committee_type, user_id: user_id, user_type: user_type, roles_mask: roles_mask} }
|
|
38
|
+
CommitteeMember.insert_all(additional)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
after_commit(if: -> { committee_ids.present? }) do
|
|
42
|
+
additional = (committee_ids - CommitteeMember.where(user_id: user_id, committee_id: committee_ids).pluck(:committee_id))
|
|
43
|
+
additional = additional.map { |committee_id| {committee_id: committee_id, committee_type: committee_type, user_id: user_id, user_type: user_type, roles_mask: roles_mask} }
|
|
44
|
+
CommitteeMember.insert_all(additional)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
validates :committee, presence: true
|
|
48
|
+
validates :user, presence: true
|
|
49
|
+
|
|
50
|
+
validates :user_id, if: -> { user_id && user_type && committee_id && committee_type },
|
|
51
|
+
uniqueness: { scope: [:committee_id, :committee_type], message: 'already belongs to this committee' }
|
|
52
|
+
|
|
53
|
+
def to_s
|
|
54
|
+
user.to_s
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def user_ids
|
|
58
|
+
Array(@user_ids) - [nil, '']
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def committee_ids
|
|
62
|
+
Array(@committee_ids) - [nil, '']
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def build_user(attributes = {})
|
|
66
|
+
raise('please assign user_type first') if user_type.blank?
|
|
67
|
+
self.user = user_type.constantize.new(attributes)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def build_committee(attributes = {})
|
|
71
|
+
raise('please assign committee_type first') if committee_type.blank?
|
|
72
|
+
self.committee = committee_type.constantize.new(attributes)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
= effective_form_with(model: [:admin, committee_file], engine: true) do |f|
|
|
2
|
+
|
|
3
|
+
- if inline_datatable? && inline_datatable.attributes[:committee_folder_id].present?
|
|
4
|
+
= f.hidden_field :committee_folder_id
|
|
5
|
+
- elsif inline_datatable?
|
|
6
|
+
= f.select :committee_folder_id, Effective::CommitteeFolder.sorted.all.where(committee: committee_file.committee)
|
|
7
|
+
- else
|
|
8
|
+
= f.select :committee_id, Effective::Committee.sorted.all
|
|
9
|
+
= f.select :committee_folder_id, Effective::CommitteeFolder.sorted.all
|
|
10
|
+
|
|
11
|
+
= f.file_field :file
|
|
12
|
+
= f.text_area :notes
|
|
13
|
+
|
|
14
|
+
= f.submit
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
= effective_form_with(model: [:admin, committee_folder], engine: true) do |f|
|
|
2
|
+
- if inline_datatable?
|
|
3
|
+
= f.hidden_field :committee_id
|
|
4
|
+
= f.hidden_field :committee_type
|
|
5
|
+
- else
|
|
6
|
+
= f.select :committee, { 'Committees' => Effective::Committee.sorted }, polymorphic: true
|
|
7
|
+
|
|
8
|
+
= f.text_field :title
|
|
9
|
+
|
|
10
|
+
- if f.object.persisted? || f.object.errors.include?(:slug)
|
|
11
|
+
- current_url = (effective_events.event_url(f.object) rescue nil)
|
|
12
|
+
= f.text_field :slug, hint: "The slug controls this event's internet address. Be careful, changing the slug will break links that other websites may have to the old address.<br>#{('This folder is currently reachable via ' + link_to(current_url.gsub(f.object.slug, '<strong>' + f.object.slug + '</strong>').html_safe, current_url)) if current_url }".html_safe
|
|
13
|
+
|
|
14
|
+
= f.rich_text_area :body, hint: 'Displayed on the folder page'
|
|
15
|
+
|
|
16
|
+
= f.submit
|
|
17
|
+
|
|
18
|
+
- if committee_folder.persisted?
|
|
19
|
+
%h2 #{committee_folder} Files
|
|
20
|
+
- datatable = Admin::EffectiveCommitteeFilesDatatable.new(committee_folder: committee_folder, committee: committee_folder.committee)
|
|
21
|
+
= render_inline_datatable(datatable)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
= effective_form_with(model: [:admin, committee_member], engine: true) do |f|
|
|
2
|
+
- f.object.user_type ||= current_user.class.name
|
|
3
|
+
- f.object.committee_type ||= Effective::Committee.name
|
|
4
|
+
|
|
5
|
+
- committees = Effective::Committee.sorted.all
|
|
6
|
+
|
|
7
|
+
= f.hidden_field :user_type
|
|
8
|
+
= f.hidden_field :user_id
|
|
9
|
+
|
|
10
|
+
= f.hidden_field :committee_type
|
|
11
|
+
= f.hidden_field :committee_id
|
|
12
|
+
|
|
13
|
+
- if f.object.new_record?
|
|
14
|
+
- if inline_datatable? && inline_datatable.attributes[:committee_id].present?
|
|
15
|
+
= f.select :user_ids, current_user.class.sorted, label: 'Add user(s)', hint: 'Add one or more users'
|
|
16
|
+
|
|
17
|
+
- if inline_datatable? && inline_datatable.attributes[:user_id].present?
|
|
18
|
+
= f.select :committee_ids, committees, label: 'Add committee(s)', hint: 'Add one or more committees'
|
|
19
|
+
|
|
20
|
+
- unless inline_datatable?
|
|
21
|
+
= f.select :committee_id, committees, label: 'Committee'
|
|
22
|
+
= f.select :user_ids, current_user.class.sorted, label: 'User(s)', hint: 'Add one or more user at a time'
|
|
23
|
+
|
|
24
|
+
- if f.object.persisted?
|
|
25
|
+
= f.static_field :committee
|
|
26
|
+
= f.static_field :user, label: 'Committee Member'
|
|
27
|
+
|
|
28
|
+
- if EffectiveCommittees.use_effective_roles
|
|
29
|
+
= f.checks :roles, EffectiveRoles.roles_collection(f.object, skip_disabled: true)
|
|
30
|
+
|
|
31
|
+
= f.submit
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
= f.text_field :title
|
|
2
|
+
|
|
3
|
+
- if f.object.persisted? || f.object.errors.include?(:slug)
|
|
4
|
+
- current_url = (effective_events.event_url(f.object) rescue nil)
|
|
5
|
+
= f.text_field :slug, hint: "The slug controls this event's internet address. Be careful, changing the slug will break links that other websites may have to the old address.<br>#{('This committee is currently reachable via ' + link_to(current_url.gsub(f.object.slug, '<strong>' + f.object.slug + '</strong>').html_safe, current_url)) if current_url }".html_safe
|
|
6
|
+
|
|
7
|
+
= f.rich_text_area :body, hint: 'Displayed on the committee page'
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
= tabs do
|
|
2
|
+
= tab 'Committee' do
|
|
3
|
+
= render 'admin/committees/form_committee', committee: committee
|
|
4
|
+
|
|
5
|
+
- if committee.persisted?
|
|
6
|
+
= tab 'Members' do
|
|
7
|
+
- datatable = Admin::EffectiveCommitteeMembersDatatable.new(committee: committee)
|
|
8
|
+
= render_inline_datatable(datatable)
|
|
9
|
+
|
|
10
|
+
= tab 'Folders' do
|
|
11
|
+
- datatable = Admin::EffectiveCommitteeFoldersDatatable.new(committee: committee)
|
|
12
|
+
= render_inline_datatable(datatable)
|
|
13
|
+
|
|
14
|
+
= tab 'Files' do
|
|
15
|
+
- datatable = Admin::EffectiveCommitteeFilesDatatable.new(committee: committee)
|
|
16
|
+
= render_inline_datatable(datatable)
|
|
17
|
+
|
|
18
|
+
- if committee.respond_to?(:log_changes_datatable)
|
|
19
|
+
= tab 'Logs' do
|
|
20
|
+
= render_inline_datatable(committee.log_changes_datatable)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
%nav{'aria-label': 'breadcrumb'}
|
|
2
|
+
%ol.breadcrumb
|
|
3
|
+
%li.breadcrumb-item= link_to('All Committees', effective_committees.committees_path)
|
|
4
|
+
%li.breadcrumb-item= link_to(committee_folder.committee, effective_committees.committee_path(committee_folder.committee))
|
|
5
|
+
%li.breadcrumb-item.active{'aria-current': 'page'}= committee_folder
|
|
6
|
+
|
|
7
|
+
.effective-committee-folder
|
|
8
|
+
- if committee_folder.rich_text_body.present?
|
|
9
|
+
.mb-4= committee_folder.rich_text_body
|
|
10
|
+
|
|
11
|
+
%table.table.table-striped
|
|
12
|
+
%thead
|
|
13
|
+
%tr
|
|
14
|
+
%th File
|
|
15
|
+
%th Date Added
|
|
16
|
+
%th Description
|
|
17
|
+
|
|
18
|
+
- committee_folder.committee_files.each do |file|
|
|
19
|
+
%tr
|
|
20
|
+
%td= link_to(icon('download') + file, url_for(file.file), target: '_blank')
|
|
21
|
+
%td= file.created_at.strftime('%F')
|
|
22
|
+
%td= file.notes
|
|
23
|
+
|
|
24
|
+
%p Displaying #{pluralize(committee_folder.committee_files.length, 'file')}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
= effective_form_with(model: committee_member, engine: true) do |f|
|
|
2
|
+
- f.object.user_type ||= current_user.class.name
|
|
3
|
+
|
|
4
|
+
= f.hidden_field :user_id
|
|
5
|
+
= f.hidden_field :user_type
|
|
6
|
+
= f.hidden_field :committee_id
|
|
7
|
+
= f.hidden_field :committee_type
|
|
8
|
+
|
|
9
|
+
- if f.object.new_record?
|
|
10
|
+
- unless inline_datatable? && inline_datatable.attributes[:committee_id].present?
|
|
11
|
+
= f.select :committee, { 'Committees' => Effective::Committee.sorted }, polymorphic: true
|
|
12
|
+
|
|
13
|
+
- if EffectiveCommittees.use_effective_roles
|
|
14
|
+
= f.checks :roles, EffectiveRoles.roles_collection(f.object, skip_disabled: true)
|
|
15
|
+
|
|
16
|
+
- unless inline_datatable? && inline_datatable.attributes[:user_id].present?
|
|
17
|
+
= f.hidden_field :new_committee_member_user_action, value: 'Invite new user'
|
|
18
|
+
|
|
19
|
+
= f.fields_for :user, (f.object.user || f.object.build_user) do |fu|
|
|
20
|
+
= render 'effective/committee_members/user_fields', f: fu
|
|
21
|
+
|
|
22
|
+
- if f.object.persisted?
|
|
23
|
+
- unless inline_datatable? && inline_datatable.attributes[:committee_id].present?
|
|
24
|
+
= f.static_field :committee
|
|
25
|
+
|
|
26
|
+
- unless inline_datatable? && inline_datatable.attributes[:user_id].present?
|
|
27
|
+
= f.static_field :user
|
|
28
|
+
|
|
29
|
+
- if EffectiveCommittees.use_effective_roles
|
|
30
|
+
= f.checks :roles, EffectiveRoles.roles_collection(f.object, skip_disabled: true)
|
|
31
|
+
|
|
32
|
+
= f.fields_for :user, f.object.user do |fu|
|
|
33
|
+
= render 'effective/committee_members/user_fields', f: fu
|
|
34
|
+
|
|
35
|
+
= f.submit
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
%nav{'aria-label': 'breadcrumb'}
|
|
2
|
+
%ol.breadcrumb
|
|
3
|
+
%li.breadcrumb-item= link_to('All Committees', effective_committees.committees_path)
|
|
4
|
+
%li.breadcrumb-item.active{'aria-current': 'page'}= committee
|
|
5
|
+
|
|
6
|
+
.effective-committee
|
|
7
|
+
- if committee.rich_text_body.present?
|
|
8
|
+
.mb-4= committee.rich_text_body
|
|
9
|
+
|
|
10
|
+
%table.table.table-striped
|
|
11
|
+
%thead
|
|
12
|
+
%tr
|
|
13
|
+
%th Folder
|
|
14
|
+
%th Files
|
|
15
|
+
%th Description
|
|
16
|
+
|
|
17
|
+
- committee.committee_folders.each do |folder|
|
|
18
|
+
%tr
|
|
19
|
+
%td= link_to(icon('folder') + folder, effective_committees.committee_committee_folder_path(committee, folder))
|
|
20
|
+
%td= pluralize(folder.committee_files.length, 'file')
|
|
21
|
+
%td= folder.body
|
|
22
|
+
|
|
23
|
+
%p Displaying #{pluralize(committee.committee_folders.length, 'folder')}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
%h2 Committees
|
|
2
|
+
|
|
3
|
+
- if current_user.committees.present?
|
|
4
|
+
%p You are a member of #{pluralize(current_user.committees.length, 'committee')}.
|
|
5
|
+
|
|
6
|
+
- datatable = EffectiveResources.best('EffectiveCommitteesDatatable').new(self, namespace: :effective)
|
|
7
|
+
= render_datatable(datatable, simple: true)
|
|
8
|
+
|
|
9
|
+
- else
|
|
10
|
+
%p You are not a committee member. When you join a committee, we'll show it here.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
- url = (committee.persisted? ? effective_committees.committee_path(committee) : effective_committees.committees_path)
|
|
2
|
+
|
|
3
|
+
= effective_form_with(model: committee, url: url) do |f|
|
|
4
|
+
= render 'effective/committees/fields', f: f
|
|
5
|
+
|
|
6
|
+
= f.submit
|
|
7
|
+
|
|
8
|
+
- if committee.persisted?
|
|
9
|
+
%h2 Committee Members
|
|
10
|
+
- datatable = EffectiveCommitteeMembersDatatable.new(committee: committee)
|
|
11
|
+
= render_inline_datatable(datatable)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
- committees = @committees.where(id: current_user.committees)
|
|
2
|
+
|
|
3
|
+
%p
|
|
4
|
+
You have access to files for #{pluralize(committees.length, 'committee')}:
|
|
5
|
+
= committees.to_sentence
|
|
6
|
+
|
|
7
|
+
%nav{'aria-label': 'breadcrumb'}
|
|
8
|
+
%ol.breadcrumb
|
|
9
|
+
%li.breadcrumb-item.active{'aria-current': 'page'} All Committees
|
|
10
|
+
|
|
11
|
+
.effective-committees
|
|
12
|
+
- committees.each do |committee|
|
|
13
|
+
= card do
|
|
14
|
+
= link_to(icon('folder') + committee, effective_committees.committee_path(committee))
|
|
15
|
+
|
|
16
|
+
%table.table.table-striped.mt-3.ml-4
|
|
17
|
+
- committee.committee_folders.each do |folder|
|
|
18
|
+
%tr
|
|
19
|
+
%td= link_to(icon('folder') + folder, effective_committees.committee_committee_folder_path(committee, folder))
|
|
20
|
+
%td= pluralize(folder.committee_files.length, 'file')
|
|
21
|
+
%td= folder.body
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
EffectiveCommittees.setup do |config|
|
|
2
|
+
config.committees_table_name = :committees
|
|
3
|
+
config.committee_members_table_name = :committee_members
|
|
4
|
+
config.committee_folders_table_name = :committee_folders
|
|
5
|
+
config.committee_files_table_name = :committee_files
|
|
6
|
+
|
|
7
|
+
# Layout Settings
|
|
8
|
+
# Configure the Layout per controller, or all at once
|
|
9
|
+
# config.layout = { application: 'application', admin: 'admin' }
|
|
10
|
+
|
|
11
|
+
# Committee Members can belong to a committee with a role
|
|
12
|
+
config.use_effective_roles = true
|
|
13
|
+
end
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Rails.application.routes.draw do
|
|
4
|
+
mount EffectiveCommittees::Engine => '/', as: 'effective_committees'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
EffectiveCommittees::Engine.routes.draw do
|
|
8
|
+
# Public routes
|
|
9
|
+
scope module: 'effective' do
|
|
10
|
+
resources :committees, only: [:index, :show] do
|
|
11
|
+
resources :committee_folders, only: [:show]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
resources :committee_members, except: [:show]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
namespace :admin do
|
|
18
|
+
resources :committees, except: [:show]
|
|
19
|
+
resources :committee_members, except: [:show]
|
|
20
|
+
resources :committee_folders, except: [:show]
|
|
21
|
+
resources :committee_files, except: [:show]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
data/db/seeds.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
puts "Running effective_committees seeds"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module EffectiveCommittees
|
|
2
|
+
class Engine < ::Rails::Engine
|
|
3
|
+
engine_name 'effective_committees'
|
|
4
|
+
|
|
5
|
+
# Set up our default configuration options.
|
|
6
|
+
initializer 'effective_committees.defaults', before: :load_config_initializers do |app|
|
|
7
|
+
eval File.read("#{config.root}/config/effective_committees.rb")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Include acts_as_addressable concern and allow any ActiveRecord object to call it
|
|
11
|
+
initializer 'effective_committees.active_record' do |app|
|
|
12
|
+
ActiveSupport.on_load :active_record do
|
|
13
|
+
ActiveRecord::Base.extend(EffectiveCommitteesUser::Base)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'effective_resources'
|
|
2
|
+
require 'effective_datatables'
|
|
3
|
+
require 'effective_roles'
|
|
4
|
+
require 'effective_committees/engine'
|
|
5
|
+
require 'effective_committees/version'
|
|
6
|
+
|
|
7
|
+
module EffectiveCommittees
|
|
8
|
+
|
|
9
|
+
def self.config_keys
|
|
10
|
+
[
|
|
11
|
+
:committees_table_name, :committee_members_table_name, :committee_folders_table_name, :committee_files_table_name,
|
|
12
|
+
:layout, :use_effective_roles
|
|
13
|
+
]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
include EffectiveGem
|
|
17
|
+
|
|
18
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module EffectiveMemberships
|
|
2
|
+
module Generators
|
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
|
4
|
+
include Rails::Generators::Migration
|
|
5
|
+
|
|
6
|
+
desc 'Creates an EffectiveCommittees initializer in your application.'
|
|
7
|
+
|
|
8
|
+
source_root File.expand_path('../../templates', __FILE__)
|
|
9
|
+
|
|
10
|
+
def self.next_migration_number(dirname)
|
|
11
|
+
if not ActiveRecord::Base.timestamped_migrations
|
|
12
|
+
Time.new.utc.strftime("%Y%m%d%H%M%S")
|
|
13
|
+
else
|
|
14
|
+
'%.3d' % (current_migration_number(dirname) + 1)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def copy_initializer
|
|
19
|
+
template ('../' * 3) + 'config/effective_committees.rb', 'config/initializers/effective_committees.rb'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def create_migration_file
|
|
23
|
+
@committees_table_name = ':' + EffectiveCommittees.committees_table_name.to_s
|
|
24
|
+
@committee_members_table_name = ':' + EffectiveCommittees.committee_members_table_name.to_s
|
|
25
|
+
|
|
26
|
+
migration_template ('../' * 3) + 'db/migrate/01_create_effective_committees.rb.erb', 'db/migrate/create_effective_committees.rb'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|