effective_reports 0.2.2 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3fdd496c78cd961c97fd7fdcac5a24fe50dd30d9b924df9dd3373a9dd9968ca0
4
- data.tar.gz: be36d71a6214183561fc381c9e74c28ce8875ff394ac91571bac8e2c5ebd9bfb
3
+ metadata.gz: 53ea0d7fe4f751e038952802d79ac6df299468d4a2bc23de1f80e2c6877ed381
4
+ data.tar.gz: 53acffd7f4d1cf599b94565494307088a062b4e91c04555e9ef50da36e3c8010
5
5
  SHA512:
6
- metadata.gz: a7b6ce19b19f82a91518b9b9de083935eb213c15a1cfc09ea4b25c07cddbd8282f68622cf15749550df48170dabc42ed565fea368b0f096d00911e772abbbcb2
7
- data.tar.gz: 0bb82f6cb3fb21984886cfdb7faa36d221b3dd800364d3bfe1176a93ad8fe159f19ea4d012bac985893b68b5b2badd841918e7878e21466b1c06fe1b2f326192
6
+ metadata.gz: 2ccc75d73cc7e7be22b8aa935c9781d90c974a842ecd21ec7240b4db97e83caa1e2e1419485645f936740b9a068e846321fb5f1e231c71cab264e9681da0ad75
7
+ data.tar.gz: 728c067c863fb3c30b88716e5b3c6bbe46f3d9a29366b6e3f506e1089200d20e295de8dc61521ec10fd526515d1b5f6cc68e47e7c438773b4137423e8fe6e627
@@ -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,16 @@ 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
+
37
+ # Used for the notifications mailer
38
+ def reportable_view_assigns(view)
39
+ {}
40
+ end
41
+
32
42
  private
33
43
 
34
44
  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 :emails, -> { where(id: ReportColumn.emails.select(:report_id)) }
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 :emails, -> { where('name ILIKE ?', "%email%") }
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)
@@ -1,3 +1,3 @@
1
1
  module EffectiveReports
2
- VERSION = '0.2.2'.freeze
2
+ VERSION = '0.2.4'.freeze
3
3
  end
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.2
4
+ version: 0.2.4
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 00:00:00.000000000 Z
11
+ date: 2023-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: haml-rails
98
+ name: haml
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -221,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  requirements: []
224
- rubygems_version: 3.1.2
224
+ rubygems_version: 3.3.7
225
225
  signing_key:
226
226
  specification_version: 4
227
227
  summary: A dynamic ActiveRecord report builder