effective_reports 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/datatables/admin/effective_reports_datatable.rb +4 -0
- data/app/datatables/effective_report_datatable.rb +4 -0
- data/app/models/concerns/acts_as_reportable.rb +5 -0
- data/app/models/effective/report.rb +29 -1
- data/app/models/effective/report_column.rb +7 -1
- data/app/models/effective/report_scope.rb +6 -0
- data/app/views/admin/reports/_form.html.haml +5 -0
- data/app/views/admin/reports/_report.html.haml +6 -0
- data/lib/effective_reports/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 114ad37c7da77453343c93c770d85db4d7dc03a75a151e7fead6f94110ecd6e3
|
4
|
+
data.tar.gz: 6b0a1b43d71bef9780bffeaccb546146316dc3ce5f918fed73bfac0be0ce860c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ab9954ca02cdd90510cfbc8c28c8554d9c17acc5014d2b8cdc502d5318cec92d325c2396e8f952df70dbbaf07d0355f3757e56b9c88582da82c5b4a266fb705
|
7
|
+
data.tar.gz: 25d4851233da531115e1d480a765f50a5b26c6d6f54782e631a3c26a64af45cb70d20002f3cc8b2604c574ff48f9e85cacc4124d011c3cb9ace5faf68dac0b8b
|
@@ -16,6 +16,10 @@ module Admin
|
|
16
16
|
col :report_columns, label: 'Columns', visible: false
|
17
17
|
col :report_scopes, label: 'Scopes', visible: false
|
18
18
|
|
19
|
+
if defined?(EffectiveMessaging)
|
20
|
+
col :notifications, label: 'Notifications'
|
21
|
+
end
|
22
|
+
|
19
23
|
col(:current_rows_count) do |report|
|
20
24
|
report.collection().count
|
21
25
|
end
|
@@ -8,6 +8,10 @@ class EffectiveReportDatatable < Effective::Datatable
|
|
8
8
|
|
9
9
|
col :id, visible: false
|
10
10
|
|
11
|
+
if report.reportable.column_names.include?('token')
|
12
|
+
col :token, visible: false
|
13
|
+
end
|
14
|
+
|
11
15
|
report.report_columns.each do |column|
|
12
16
|
col(column.name, as: column.as.to_sym)
|
13
17
|
end
|
@@ -29,6 +29,11 @@ module ActsAsReportable
|
|
29
29
|
{}
|
30
30
|
end
|
31
31
|
|
32
|
+
# Something that returns an email
|
33
|
+
def reportable_email
|
34
|
+
try(:email) || try(:user).try(:email) || try(:owner).try(:email) || raise("No reportable_email found")
|
35
|
+
end
|
36
|
+
|
32
37
|
private
|
33
38
|
|
34
39
|
def all_reportable_attributes
|
@@ -10,6 +10,11 @@ module Effective
|
|
10
10
|
has_many :report_scopes, -> { ReportScope.sorted }, inverse_of: :report, dependent: :delete_all
|
11
11
|
accepts_nested_attributes_for :report_scopes, allow_destroy: true, reject_if: proc { |atts| atts['name'].blank? }
|
12
12
|
|
13
|
+
if defined?(EffectiveMessaging)
|
14
|
+
has_many :notifications, inverse_of: :report, dependent: :delete_all
|
15
|
+
accepts_nested_attributes_for :notifications, allow_destroy: true
|
16
|
+
end
|
17
|
+
|
13
18
|
log_changes if respond_to?(:log_changes)
|
14
19
|
|
15
20
|
DATATYPES = [:boolean, :date, :decimal, :integer, :price, :string, :belongs_to, :belongs_to_polymorphic, :has_many, :has_one]
|
@@ -26,7 +31,7 @@ module Effective
|
|
26
31
|
|
27
32
|
scope :deep, -> { includes(:report_columns, :report_scopes) }
|
28
33
|
scope :sorted, -> { order(:title) }
|
29
|
-
scope :
|
34
|
+
scope :notifiable, -> { where(id: ReportColumn.notifiable.select(:report_id)) }
|
30
35
|
|
31
36
|
validates :title, presence: true, uniqueness: true
|
32
37
|
validates :reportable_class_name, presence: true
|
@@ -39,6 +44,23 @@ module Effective
|
|
39
44
|
reportable_class_name.constantize if reportable_class_name.present?
|
40
45
|
end
|
41
46
|
|
47
|
+
# Find or build
|
48
|
+
def col(name, atts = {})
|
49
|
+
atts[:name] ||= name.to_sym
|
50
|
+
atts[:as] ||= reportable_attributes[name]
|
51
|
+
|
52
|
+
report_columns.find { |col| atts.all? { |k, v| col.send(k).to_s == v.to_s } } || report_columns.build(atts)
|
53
|
+
end
|
54
|
+
|
55
|
+
def scope(name, atts = {})
|
56
|
+
atts[:name] ||= name.to_sym
|
57
|
+
report_scopes.find { |scope| scope.name == name.to_s } || report_scopes.build(atts)
|
58
|
+
end
|
59
|
+
|
60
|
+
def notification(atts = {})
|
61
|
+
notifications.find { |col| atts.all? { |k, v| col.send(k).to_s == v.to_s } } || notifications.build(atts)
|
62
|
+
end
|
63
|
+
|
42
64
|
def filtered_report_columns
|
43
65
|
report_columns.select(&:filter?)
|
44
66
|
end
|
@@ -47,6 +69,12 @@ module Effective
|
|
47
69
|
report_columns.find { |column| column.name == 'email' } || report_columns.find { |column| column.name.include?('email') }
|
48
70
|
end
|
49
71
|
|
72
|
+
def user_report_column
|
73
|
+
report_columns.find { |column| column.name == 'user' } ||
|
74
|
+
report_columns.find { |column| column.name == 'owner' } ||
|
75
|
+
report_columns.find { |column| column.name.include?('user') }
|
76
|
+
end
|
77
|
+
|
50
78
|
# Used to build the Reports form
|
51
79
|
# { id: :integer, archived: :boolean }
|
52
80
|
def reportable_attributes
|
@@ -27,7 +27,7 @@ module Effective
|
|
27
27
|
|
28
28
|
scope :deep, -> { includes(:report) }
|
29
29
|
scope :sorted, -> { order(:position) }
|
30
|
-
scope :
|
30
|
+
scope :notifiable, -> { where('name ILIKE ?', "%email%").or(where(name: 'user')).or(where(name: 'owner')) }
|
31
31
|
|
32
32
|
before_validation(if: -> { report.present? }) do
|
33
33
|
self.position ||= (report.report_columns.map(&:position).compact.max || -1) + 1
|
@@ -54,6 +54,12 @@ module Effective
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
validate(if: -> { report&.reportable }) do
|
58
|
+
unless report.reportable.new.reportable_attributes.key?(name.to_sym)
|
59
|
+
errors.add(:name, "acts_as_reportable #{report.reportable} reportable_attributes() missing :#{name} attribute")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
57
63
|
def to_s
|
58
64
|
[name, operation_label, value, days_label].compact.join(' ').presence || 'report column'
|
59
65
|
end
|
@@ -36,6 +36,12 @@ module Effective
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
validate(if: -> {report&.reportable }) do
|
40
|
+
unless report.reportable.new.reportable_scopes.key?(name.to_sym)
|
41
|
+
errors.add(:name, "acts_as_reportable #{report.reportable} reportable_scopes() missing :#{name} scope")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
39
45
|
def to_s
|
40
46
|
[name, operation_label, value].compact.join(' ').presence || 'report scope'
|
41
47
|
end
|
@@ -3,6 +3,11 @@
|
|
3
3
|
= render 'admin/reports/form_report', report: report
|
4
4
|
|
5
5
|
- if report.persisted?
|
6
|
+
- if report.respond_to?(:notifications)
|
7
|
+
= tab 'Notifications' do
|
8
|
+
- datatable = Admin::EffectiveNotificationsDatatable.new(report: report)
|
9
|
+
= render_inline_datatable(datatable)
|
10
|
+
|
6
11
|
- if report.respond_to?(:log_changes_datatable)
|
7
12
|
= tab 'Logs' do
|
8
13
|
= render_inline_datatable(report.log_changes_datatable)
|
@@ -13,5 +13,11 @@
|
|
13
13
|
= collapse('Show SQL') do
|
14
14
|
%p= report.collection.to_sql
|
15
15
|
|
16
|
+
- if (notifications = report.try(:notifications)).present?
|
17
|
+
%p.mt-3
|
18
|
+
The following notifications are sent based on this report:
|
19
|
+
- notifications.each do |notification|
|
20
|
+
= link_to(notification, effective_messaging.edit_admin_notification_path(notification), target: '_blank')
|
21
|
+
|
16
22
|
- datatable = EffectiveReportDatatable.new(report: report)
|
17
23
|
= render_datatable(datatable)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_reports
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|