effective_messaging 0.1.2 → 0.1.4

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: 84f3cb325386b6c35c631c57ab15eaa3775e892ace9128e082e57a258203008b
4
- data.tar.gz: 3ccdcaf09dc41afd32fcd46a365ee4582fe8d06dac3efecbbd91b0e1f921982d
3
+ metadata.gz: 562e0f1c733ddda4bc2100b12ba84500090e89136a0318d00915d3518b775b52
4
+ data.tar.gz: 5f3d887a18529c663ff520a0b992bd96c0bbd545e47db08e6031c5fa56837c3e
5
5
  SHA512:
6
- metadata.gz: 5cb621f111776ff55f8eb354b8d86006b77bc5bed042571b66b0f51e93df0bf10ccb47c35a6da8cd5af916128d69c943f0162e62c0e926eb63689fa316eda247
7
- data.tar.gz: daae9d060cedaeb9895d808c281069ffcb565d9268c8c64ed346a6b68f30b24b45cd5524b76015a7cb25923708ae2b55205bf03293377e271253b7b5a28f58dd
6
+ metadata.gz: 5b438f053eff518e167b3ccd39b90472a35879c07f2b650257cc3fbe21b160dd96cfba455c2bcaf80ce857da92e05e78920a159b6cc8a7f66f2b193d609f1033
7
+ data.tar.gz: a76f710b600e910220e3406d9e055e6a2f77f69478ccf58fcd8c7953eb053374d1569804995152d73b3ead14a74e254157a41039de4bb8aa12147c78e2b1efef
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Centralize all communications between one or more users.
4
4
 
5
+ Works with effective_reports to schedule notifications to report results containing emails.
6
+
5
7
  ## Getting Started
6
8
 
7
9
  This requires Rails 6+ and Twitter Bootstrap 4 and just works with Devise.
@@ -69,6 +71,9 @@ Add a link to the admin menu:
69
71
 
70
72
  - if can?(:admin, :effective_messaging) && can?(:index, Effective::ChatMessage)
71
73
  = nav_link_to 'Chat Messages', effective_messaging.admin_chat_messages_path
74
+
75
+ - if can?(:admin, :effective_messaging) && can?(:index, Effective::Notification)
76
+ = nav_link_to 'Chat Messages', effective_messaging.admin_notifications_path
72
77
  ```
73
78
 
74
79
  ## Authorization
@@ -89,6 +94,8 @@ if user.admin?
89
94
  can(crud, Effective::Chat)
90
95
  can(crud, Effective::ChatUser)
91
96
  can(crud - [:new, :create], Effective::ChatMessage)
97
+
98
+ can(crud + [:create_notification_job], Effective::Notification)
92
99
  end
93
100
  ```
94
101
 
@@ -109,6 +116,12 @@ and you can just render it *outside of a form*:
109
116
  = render('effective/chats/chat', chat: chat)
110
117
  ```
111
118
 
119
+ ## Creating a notification
120
+
121
+ First create an effective report with an email column in the results.
122
+
123
+ Then visit /admin/notifications to schedule a notification with a From, Subject and Body
124
+
112
125
  ## License
113
126
 
114
127
  MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
@@ -0,0 +1,17 @@
1
+ module Admin
2
+ class NotificationsController < ApplicationController
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+ before_action { EffectiveResources.authorize!(self, :admin, :effective_messaging) }
5
+
6
+ include Effective::CrudController
7
+
8
+ submit :create_notification_job, 'Send Now'
9
+
10
+ private
11
+
12
+ def permitted_params
13
+ params.require(:effective_notification).permit!
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ module Admin
2
+ class EffectiveNotificationsDatatable < Effective::Datatable
3
+ filters do
4
+ scope :all
5
+ scope :notifiable, label: 'Upcoming'
6
+ scope :completed, label: 'Past'
7
+ end
8
+
9
+ datatable do
10
+ order :updated_at
11
+
12
+ col :updated_at, visible: false
13
+ col :created_at, visible: false
14
+ col :id, visible: false
15
+
16
+ col :send_at
17
+ col :report, search: Effective::Report.emails.sorted
18
+
19
+ col :subject
20
+ col :body, visible: false
21
+
22
+ col :from, visible: false, search: Array(EffectiveMessaging.froms).presence
23
+ col :cc, visible: false
24
+ col :bcc, visible: false
25
+
26
+ col :started_at, visible: false
27
+ col :completed_at
28
+ col :notifications_sent, visible: false
29
+
30
+ actions_col
31
+ end
32
+
33
+ collection do
34
+ Effective::Notification.deep.all
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,10 @@
1
+ module Effective
2
+ class NotificationJob < ApplicationJob
3
+
4
+ def perform(id, force)
5
+ notification = Notification.find(id)
6
+ notification.notify!(force: force)
7
+ end
8
+
9
+ end
10
+ end
@@ -1,8 +1,7 @@
1
1
  module Effective
2
2
  class MessagingMailer < EffectiveMessaging.parent_mailer_class
3
-
4
3
  include EffectiveMailer
5
- include EffectiveEmailTemplatesMailer if EffectiveMessaging.use_effective_email_templates
4
+ include EffectiveEmailTemplatesMailer
6
5
 
7
6
  def chat_new_message(chat, chat_user, opts = {})
8
7
  raise('expected a chat') unless chat.kind_of?(Chat)
@@ -11,7 +10,7 @@ module Effective
11
10
  user = chat_user.user
12
11
  raise('expected user to have an email') unless user.try(:email).present?
13
12
 
14
- @assigns = assigns_for(chat).merge(assigns_for(chat_user))
13
+ @assigns = chat_assigns(chat, user: user).merge(assigns_for(chat_user))
15
14
 
16
15
  subject = subject_for(__method__, "New Message - #{chat}", chat, opts)
17
16
  headers = headers_for(chat, opts)
@@ -33,13 +32,17 @@ module Effective
33
32
  raise('unexpected resource')
34
33
  end
35
34
 
36
- def chat_assigns(chat)
35
+ def chat_assigns(chat, user:)
37
36
  raise('expected a chat') unless chat.kind_of?(Chat)
37
+ raise('expected a user') unless user.present?
38
+
39
+ url = chat.parent&.chat_url(chat: chat, user: user, root_url: root_url)
40
+ url ||= effective_messaging.chat_url(chat)
38
41
 
39
42
  values = {
40
43
  date: chat.created_at.strftime('%F'),
41
44
  title: chat.title,
42
- url: effective_messaging.chat_url(chat)
45
+ url: url
43
46
  }.compact
44
47
 
45
48
  { chat: values }
@@ -0,0 +1,37 @@
1
+ module Effective
2
+ class NotificationsMailer < EffectiveReports.parent_mailer_class
3
+ include EffectiveMailer
4
+
5
+ # Does not use effective_email_templates mailer
6
+
7
+ def notification(notification, resource, opts = {})
8
+ raise('expected an Effective::Notification') unless notification.kind_of?(Effective::Notification)
9
+ raise('expected a resource') unless resource.present?
10
+
11
+ # Returns a Hash of params to pass to mail()
12
+ # Includes a :to, :from, etc
13
+ rendered = notification.render_email(resource)
14
+
15
+ # Works with effective_logging to associate this email with the notification
16
+ headers = headers_for(notification, opts)
17
+
18
+ # Use postmark broadcast-stream
19
+ if defined?(Postmark)
20
+ headers.merge!(message_stream: 'broadcast-stream')
21
+ end
22
+
23
+ # Calls effective_resources subject proc, so we can prepend [LETTERS]
24
+ subject = subject_for(__method__, rendered.fetch(:subject), resource, opts)
25
+
26
+ # Pass everything to mail
27
+ mail(rendered.merge(headers).merge(subject: subject))
28
+ end
29
+
30
+ private
31
+
32
+ def mailer_settings
33
+ EffectiveMessaging
34
+ end
35
+
36
+ end
37
+ end
@@ -35,4 +35,9 @@ module EffectiveMessagingParent
35
35
  build_chat.tap { |chat| chat.save! }
36
36
  end
37
37
 
38
+ # Hook so the parent can specify the correct url for this user to visit to see the new chat message
39
+ def chat_url(chat:, user:, root_url:)
40
+ nil
41
+ end
42
+
38
43
  end
@@ -0,0 +1,173 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Effective
4
+ class Notification < ActiveRecord::Base
5
+ self.table_name = EffectiveMessaging.notifications_table_name.to_s
6
+
7
+ attr_accessor :current_user
8
+ attr_accessor :current_resource
9
+
10
+ log_changes if respond_to?(:log_changes)
11
+
12
+ # Unused. If we want to use notifications in a has_many way
13
+ belongs_to :parent, polymorphic: true, optional: true
14
+
15
+ # Unused. When the notification belongs to one user
16
+ belongs_to :user, polymorphic: true, optional: true
17
+
18
+ # Effective namespace
19
+ belongs_to :report, class_name: 'Effective::Report'
20
+
21
+ CONTENT_TYPES = ['text/plain', 'text/html']
22
+
23
+ effective_resource do
24
+ send_at :datetime
25
+
26
+ subject :string
27
+ body :text
28
+
29
+ from :string
30
+ cc :string
31
+ bcc :string
32
+
33
+ # Tracking background jobs email send out
34
+ started_at :datetime
35
+ completed_at :datetime
36
+ notifications_sent :integer
37
+
38
+ timestamps
39
+ end
40
+
41
+ scope :sorted, -> { order(:id) }
42
+ scope :deep, -> { includes(report: :report_columns) }
43
+
44
+ scope :upcoming, -> { where('send_at > ?', Time.zone.now) }
45
+ scope :started, -> { where.not(started_at: nil) }
46
+ scope :completed, -> { where.not(completed_at: nil) }
47
+
48
+ # Called by the notifier rake task
49
+ scope :notifiable, -> { where(started_at: nil) }
50
+
51
+ before_validation(if: -> { send_at_changed? }) do
52
+ assign_attributes(started_at: nil, completed_at: nil, notifications_sent: nil)
53
+ end
54
+
55
+ validates :send_at, presence: true
56
+ validates :from, presence: true, email: true
57
+ validates :subject, presence: true, liquid: true
58
+ validates :body, presence: true, liquid: true
59
+
60
+ validate(if: -> { report.present? }) do
61
+ self.errors.add(:report, 'must include an email column') unless report.email_report_column.present?
62
+ end
63
+
64
+ validate(if: -> { report.present? && subject.present? }) do
65
+ if(invalid = template_variables(body: false) - report_variables).present?
66
+ self.errors.add(:subject, "Invalid variable: #{invalid.to_sentence}")
67
+ end
68
+ end
69
+
70
+ validate(if: -> { report.present? && body.present? }) do
71
+ if(invalid = template_variables(subject: false) - report_variables).present?
72
+ self.errors.add(:body, "Invalid variable: #{invalid.to_sentence}")
73
+ end
74
+ end
75
+
76
+ def to_s
77
+ subject.presence || 'notification'
78
+ end
79
+
80
+ def template_subject
81
+ Liquid::Template.parse(subject)
82
+ end
83
+
84
+ def template_body
85
+ Liquid::Template.parse(body)
86
+ end
87
+
88
+ def report_variables
89
+ Array(report&.report_columns).map(&:name)
90
+ end
91
+
92
+ def rows_count
93
+ @rows_count ||= report.collection().count if report
94
+ end
95
+
96
+ def in_progress?
97
+ started_at.present? && completed_at.blank?
98
+ end
99
+
100
+ def notifiable?
101
+ started_at.blank? && completed_at.blank?
102
+ end
103
+
104
+ def notify_now?
105
+ notifiable? && Time.zone.now >= send_at
106
+ end
107
+
108
+ def notify!(force: false, limit: nil)
109
+ return false unless (notify_now? || force)
110
+
111
+ update!(started_at: Time.zone.now, completed_at: nil, notifications_sent: nil)
112
+
113
+ index = 0
114
+
115
+ report.collection().find_each do |resource|
116
+ print('.')
117
+
118
+ assign_attributes(current_resource: resource)
119
+ Effective::NotificationsMailer.notification(self, resource).deliver_now
120
+
121
+ index += 1
122
+ break if limit && index >= limit
123
+
124
+ GC.start if (index % 250) == 0
125
+ end
126
+
127
+ update!(current_resource: nil, completed_at: Time.zone.now, notifications_sent: index)
128
+ end
129
+
130
+ # The 'Send Now' action on admin. Enqueues a job that calls notify!(force: true)
131
+ def create_notification_job!
132
+ update!(started_at: Time.zone.now, completed_at: nil, notifications_sent: nil)
133
+
134
+ NotificationJob.perform_later(id, true) # force = true
135
+ true
136
+ end
137
+
138
+ def render_email(resource)
139
+ raise('expected a resource') unless resource.present?
140
+
141
+ assigns = assigns_for(resource)
142
+ to = assigns.fetch(report.email_report_column.name) || raise('expected an email assigns')
143
+
144
+ {
145
+ to: to,
146
+ from: from,
147
+ cc: cc.presence,
148
+ bcc: bcc.presence,
149
+ content_type: CONTENT_TYPES.first,
150
+ subject: template_subject.render(assigns),
151
+ body: template_body.render(assigns)
152
+ }.compact
153
+ end
154
+
155
+ def assigns_for(resource)
156
+ Array(report&.report_columns).inject({}) do |h, column|
157
+ value = resource.send(column.name)
158
+ h[column.name] = column.format(value); h
159
+ end
160
+ end
161
+
162
+ private
163
+
164
+ def template_variables(body: true, subject: true)
165
+ [(template_body.presence if body), (template_subject.presence if subject)].compact.map do |template|
166
+ Liquid::ParseTreeVisitor.for(template.root).add_callback_for(Liquid::VariableLookup) do |node|
167
+ [node.name, *node.lookups].join('.')
168
+ end.visit
169
+ end.flatten.uniq.compact
170
+ end
171
+
172
+ end
173
+ end
@@ -3,6 +3,6 @@
3
3
  = render 'admin/chats/form_chat', chat: chat
4
4
 
5
5
  - if chat.persisted?
6
- - if chat.respond_to?(:log_changes_datatable)
6
+ - if chat.respond_to?(:logs_datatable)
7
7
  = tab "Logs" do
8
- = render_inline_datatable(chat.log_changes_datatable)
8
+ = render_inline_datatable(chat.logs_datatable)
@@ -0,0 +1,7 @@
1
+ = tabs do
2
+ = tab 'Notification' do
3
+ = render 'admin/notifications/form_notification', notification: notification
4
+
5
+ - if notification.persisted? && notification.respond_to?(:logs_datatable)
6
+ = tab 'Logs' do
7
+ = render_datatable(notification.logs_datatable)
@@ -0,0 +1,60 @@
1
+ = effective_form_with(model: [:admin, notification], engine: true) do |f|
2
+ %h2 Data Source
3
+ %p
4
+ Please select a
5
+ = link_to 'report', effective_reports.admin_reports_path, target: '_blank'
6
+ with an email report column to use as the data source.
7
+
8
+ %p Each result from the report will be sent a notification.
9
+
10
+ .row
11
+ .col-md-6
12
+ = f.select :report_id, Effective::Report.sorted.emails.all, label: 'Report with email column',
13
+ 'data-load-ajax-url': effective_messaging.new_admin_notification_path,
14
+ 'data-load-ajax-div': '#effective-messaging-ajax'
15
+
16
+ %h2 Schedule
17
+ %p Please select a date when the notifications should be sent
18
+
19
+ .row
20
+ .col-md-6
21
+ - minDate = [f.object.created_at, Time.zone.now].compact.min
22
+
23
+ = f.datetime_field :send_at, label: 'Send the notification at', input_js: { minDate: minDate.strftime('%F %H:%M:%S') },
24
+ hint: 'A future date. Changing this value will reset the started_at and completed_at dates so this notification can be sent again.'
25
+ .col-md-6
26
+ - if f.object.completed_at.present?
27
+ = f.static_field :completed_at
28
+ - elsif f.object.started_at.present?
29
+ = f.static_field :started_at
30
+
31
+ %h2 Notification
32
+ %p The following notification will be sent to each row in the data source
33
+
34
+ - froms = Array(EffectiveMessaging.froms)
35
+
36
+ - if froms.present?
37
+ - f.object.from ||= froms.first
38
+ = f.select :from, Array(froms)
39
+ - else
40
+ = f.email_field :from
41
+
42
+ = f.text_field :subject
43
+ = f.text_area :body
44
+
45
+ #effective-messaging-ajax
46
+ - if f.object.report.present?
47
+ %p You can use the following variables in the subject and body:
48
+
49
+ %ul
50
+ - f.object.report_variables.each do |name|
51
+ %li {{ #{name} }}
52
+
53
+ = f.submit do
54
+ = f.save 'Save'
55
+
56
+ - if f.object.persisted? && !f.object.in_progress?
57
+ = f.save 'Send Now', class: 'btn btn-warning', 'data-confirm': "Really send #{pluralize(notification.rows_count, 'notification')} now?"
58
+
59
+ = f.save 'Add New', class: 'btn btn-secondary'
60
+ = f.save 'Continue', class: 'btn btn-secondary'
@@ -0,0 +1,67 @@
1
+ %p
2
+ This notification will be sent to all rows from the
3
+ = link_to(notification.report, effective_reports.admin_report_path(notification.report), target: '_blank')
4
+ report at the time of sending.
5
+
6
+ %p Currently there are #{pluralize(notification.rows_count, 'rows')} that would be notified.
7
+
8
+ = card(notification) do
9
+ %table.table
10
+ %tbody
11
+ %tr
12
+ %th Send At
13
+ %td= notification.send_at.strftime('%F %H:%M')
14
+
15
+ %tr
16
+ %th Report
17
+ %td= link_to(notification.report, effective_reports.admin_report_path(notification.report), target: '_blank')
18
+
19
+ %tr
20
+ %th Current rows count
21
+ %td= notification.rows_count
22
+
23
+ %tr
24
+ %th Started At
25
+ %td= notification.started_at&.strftime('%F %H:%M') || 'Never'
26
+
27
+ %tr
28
+ %th Completed At
29
+ %td= notification.completed_at&.strftime('%F %H:%M') || 'Never'
30
+
31
+ %tr
32
+ %th Notifications Sent
33
+ %td= notification.notifications_sent.presence || 'None'
34
+
35
+ - if notification.rows_count > 0
36
+ %p Using a random row from the data source, a preview of the notification follows:
37
+
38
+ = card('Preview of Notification') do
39
+ - resource = notification.report.collection.order('RANDOM()').first
40
+ - rendered = notification.render_email(resource)
41
+
42
+ %table.table
43
+ %tbody
44
+ %tr
45
+ %th To
46
+ %td= rendered.fetch(:to)
47
+ %tr
48
+ %th From
49
+ %td= rendered.fetch(:from)
50
+
51
+ - if (cc = rendered[:cc]).present?
52
+ %tr
53
+ %th CC
54
+ %td= cc
55
+
56
+ - if (bcc = rendered[:bcc]).present?
57
+ %tr
58
+ %th BCC
59
+ %td= bcc
60
+
61
+ %tr
62
+ %th Subject
63
+ %td= rendered.fetch(:subject)
64
+
65
+ %tr
66
+ %td{colspan: 2}
67
+ = simple_format(rendered.fetch(:body).to_s)
@@ -2,11 +2,16 @@ EffectiveMessaging.setup do |config|
2
2
  config.chats_table_name = :chats
3
3
  config.chat_users_table_name = :chat_users
4
4
  config.chat_messages_table_name = :chat_messages
5
+ config.notifications_table_name = :notifications
5
6
 
6
7
  # Layout Settings
7
8
  # Configure the Layout per controller, or all at once
8
9
  # config.layout = { application: 'application', admin: 'admin' }
9
10
 
11
+ # From Settings
12
+ # For the Admin new notification form. Set to an array to use a select, or nil to use a freeform text entry
13
+ config.froms = ['noreply@example.com']
14
+
10
15
  # Mailer Settings
11
16
  # Please see config/initializers/effective_messaging.rb for default effective_* gem mailer settings
12
17
  #
@@ -22,6 +27,4 @@ EffectiveMessaging.setup do |config|
22
27
  # config.mailer_admin = nil # Default To value for Admin correspondence
23
28
  # config.mailer_subject = nil # Proc.new method used to customize Subject
24
29
 
25
- # Will work with effective_email_templates gem
26
- config.use_effective_email_templates = true
27
30
  end
data/config/routes.rb CHANGED
@@ -13,6 +13,7 @@ EffectiveMessaging::Engine.routes.draw do
13
13
  namespace :admin do
14
14
  resources :chats
15
15
  resources :chat_messages, only: [:index, :show, :destroy]
16
+ resources :notifications
16
17
  end
17
18
 
18
19
  end
@@ -40,5 +40,30 @@ class CreateEffectiveMessaging < ActiveRecord::Migration[6.0]
40
40
  t.timestamps
41
41
  end
42
42
 
43
+ create_table <%= @notifications_table_name %> do |t|
44
+ t.integer :parent_id
45
+ t.string :parent_type
46
+
47
+ t.integer :user_id
48
+ t.string :user_type
49
+
50
+ t.integer :report_id
51
+
52
+ t.datetime :send_at
53
+
54
+ t.string :subject
55
+ t.text :body
56
+
57
+ t.string :from
58
+ t.string :cc
59
+ t.string :bcc
60
+
61
+ t.datetime :started_at
62
+ t.datetime :completed_at
63
+ t.integer :notifications_sent
64
+
65
+ t.timestamps
66
+ end
67
+
43
68
  end
44
69
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveMessaging
2
- VERSION = '0.1.2'.freeze
2
+ VERSION = '0.1.4'.freeze
3
3
  end
@@ -7,9 +7,10 @@ module EffectiveMessaging
7
7
 
8
8
  def self.config_keys
9
9
  [
10
- :chats_table_name, :chat_users_table_name, :chat_messages_table_name,
10
+ :chats_table_name, :chat_users_table_name, :chat_messages_table_name, :notifications_table_name,
11
11
  :layout,
12
- :mailer, :parent_mailer, :deliver_method, :mailer_layout, :mailer_sender, :mailer_admin, :mailer_subject, :use_effective_email_templates
12
+ :froms,
13
+ :mailer, :parent_mailer, :deliver_method, :mailer_layout, :mailer_sender, :mailer_admin, :mailer_subject
13
14
  ]
14
15
  end
15
16
 
@@ -23,6 +23,7 @@ module EffectiveMessaging
23
23
  @chats_table_name = ':' + EffectiveMessaging.chats_table_name.to_s
24
24
  @chat_users_table_name = ':' + EffectiveMessaging.chat_users_table_name.to_s
25
25
  @chat_messages_table_name = ':' + EffectiveMessaging.chat_messages_table_name.to_s
26
+ @notifications_table_name = ':' + EffectiveMessaging.notifications_table_name.to_s
26
27
 
27
28
  migration_template ('../' * 3) + 'db/migrate/01_create_effective_messaging.rb.erb', 'db/migrate/create_effective_messaging.rb'
28
29
  end
@@ -1,8 +1,25 @@
1
+ # rake effective_messaging:notify
1
2
  namespace :effective_messaging do
3
+ desc 'Sends scheduled notifications for effective messaging'
4
+ task notify: :environment do
5
+ puts 'Sending notifications'
2
6
 
3
- # bundle exec rake effective_messaging:seed
4
- task seed: :environment do
5
- load "#{__dir__}/../../db/seeds.rb"
6
- end
7
+ notifications = Effective::Notification.all.deep.notifiable
8
+
9
+ notifications.find_each do |notification|
10
+ begin
11
+ notified = notification.notify!
12
+ Rails.logger.info "Sent notifications for #{notification.report}" if notified
13
+ rescue => e
14
+ if defined?(ExceptionNotifier)
15
+ data = { notification_id: notification.id, report_id: notification.report_id, resource_id: notification.current_resource&.id }
16
+ ExceptionNotifier.notify_exception(e, data: data)
17
+ end
7
18
 
19
+ puts "Error with effective_messaging #{notification.id} resource #{notification.current_resource&.id}: #{e.errors.inspect}"
20
+ end
21
+ end
22
+
23
+ puts 'All done'
24
+ end
8
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_messaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.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-01-20 00:00:00.000000000 Z
11
+ date: 2023-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 4.0.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: effective_orders
56
+ name: effective_email_templates
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -81,21 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: effective_roles
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: wicked
84
+ name: effective_reports
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
@@ -192,20 +178,6 @@ dependencies:
192
178
  - - ">="
193
179
  - !ruby/object:Gem::Version
194
180
  version: '0'
195
- - !ruby/object:Gem::Dependency
196
- name: effective_email_templates
197
- requirement: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - ">="
200
- - !ruby/object:Gem::Version
201
- version: '0'
202
- type: :development
203
- prerelease: false
204
- version_requirements: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - ">="
207
- - !ruby/object:Gem::Version
208
- version: '0'
209
181
  description: Centralize the communication between one or more users.
210
182
  email:
211
183
  - info@codeandeffect.com
@@ -223,22 +195,30 @@ files:
223
195
  - app/assets/stylesheets/effective_messaging/base.scss
224
196
  - app/controllers/admin/chat_messages_controller.rb
225
197
  - app/controllers/admin/chats_controller.rb
198
+ - app/controllers/admin/notifications_controller.rb
226
199
  - app/controllers/effective/chats_controller.rb
227
200
  - app/datatables/admin/effective_chat_messages_datatable.rb
228
201
  - app/datatables/admin/effective_chats_datatable.rb
202
+ - app/datatables/admin/effective_notifications_datatable.rb
229
203
  - app/datatables/effective_chats_datatable.rb
230
204
  - app/helpers/effective_messaging_helper.rb
205
+ - app/jobs/effective/notification_job.rb
231
206
  - app/mailers/effective/messaging_mailer.rb
207
+ - app/mailers/effective/notifications_mailer.rb
232
208
  - app/models/concerns/effective_messaging_parent.rb
233
209
  - app/models/concerns/effective_messaging_user.rb
234
210
  - app/models/effective/chat.rb
235
211
  - app/models/effective/chat_message.rb
236
212
  - app/models/effective/chat_user.rb
213
+ - app/models/effective/notification.rb
237
214
  - app/views/admin/chat_messages/_chat_message.html.haml
238
215
  - app/views/admin/chats/_chat.html.haml
239
216
  - app/views/admin/chats/_form.html.haml
240
217
  - app/views/admin/chats/_form_chat.html.haml
241
218
  - app/views/admin/chats/_layout.html.haml
219
+ - app/views/admin/notifications/_form.html.haml
220
+ - app/views/admin/notifications/_form_notification.html.haml
221
+ - app/views/admin/notifications/_notification.html.haml
242
222
  - app/views/effective/chats/_chat.html.haml
243
223
  - app/views/effective/chats/_chat_message.html.haml
244
224
  - app/views/effective/chats/_form.html.haml