wco_models 3.1.0.116 → 3.1.0.118

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/fonts/summernote.eot +0 -0
  3. data/app/assets/fonts/summernote.ttf +0 -0
  4. data/app/assets/fonts/summernote.woff +0 -0
  5. data/app/assets/fonts/summernote.woff2 +0 -0
  6. data/app/assets/images/sort_asc.png +0 -0
  7. data/app/assets/images/sort_both.png +0 -0
  8. data/app/assets/images/sort_desc.png +0 -0
  9. data/app/assets/javascripts/vendor/jquery.dataTables-1.10.16.js +15243 -0
  10. data/app/assets/javascripts/vendor/jquery.dataTables-1.10.16.min.js +164 -0
  11. data/app/assets/javascripts/vendor/select2-4.0.0.js +5403 -0
  12. data/app/assets/javascripts/vendor/select2-4.0.0.min.js +2 -0
  13. data/app/assets/javascripts/vendor/summernote-0.8.18.js +10228 -0
  14. data/app/assets/javascripts/vendor/summernote-0.8.18.min.js +3 -0
  15. data/app/assets/javascripts/wco/application.js +14 -9
  16. data/app/assets/stylesheets/vendor/jquery.dataTables-1.10.16.css +448 -0
  17. data/app/assets/stylesheets/vendor/jquery.dataTables-1.10.16.min.css +1 -0
  18. data/app/assets/stylesheets/vendor/select2-4.0.0.css +431 -0
  19. data/app/assets/stylesheets/vendor/select2-4.0.0.min.css +1 -0
  20. data/app/assets/stylesheets/vendor/summernote-0.8.18.css +13 -0
  21. data/app/assets/stylesheets/vendor/summernote-0.8.18.min.css +1 -0
  22. data/app/assets/stylesheets/wco/application.scss +19 -3
  23. data/app/controllers/wco/application_controller.rb +23 -0
  24. data/app/controllers/wco/leads_controller.rb +4 -6
  25. data/app/mailers/wco_email/application_mailer.rb +1 -1
  26. data/app/models/wco/lead.rb +2 -2
  27. data/app/models/wco/tag.rb +2 -2
  28. data/app/models/wco_email/conversation.rb +5 -2
  29. data/app/models/wco_email/email_template.rb +2 -4
  30. data/app/models/wco_email/message.rb +3 -0
  31. data/app/views/layouts/wco/application.haml +10 -10
  32. data/app/views/wco/application/tinymce.html.erb +3 -3
  33. data/app/views/wco/leads/index.haml +2 -2
  34. data/app/views/wco/leads/show.haml +3 -3
  35. data/app/views/wco_email/contexts/_form_reply_mini.haml +25 -0
  36. data/app/views/wco_email/conversations/_table.haml +11 -2
  37. metadata +22 -2
@@ -67,12 +67,8 @@ class Wco::LeadsController < Wco::ApplicationController
67
67
  redirect_to request.referrer
68
68
  return
69
69
  end
70
- # @schs = Sch.where( lead_id: @lead.id )
71
- # @ctxs = Ctx.where( lead_id: @lead.id )
72
- # @convs = Conv.find( Office::EmailConversationLead.where( lead_id: @lead.id ).map( &:email_conversation_id ) )
73
- # @msgs = Msg.where( from: @lead.email )
74
- # @galleries = @lead.galleries.page( params[:galleries_page] ).per( current_profile.per_page )
75
- # @videos = @lead.videos.page( params[:videos_page] ).per( current_profile.per_page )
70
+ @ctxs = @lead.ctxs
71
+ @convs = @lead.conversations.includes(:messages)
76
72
  end
77
73
 
78
74
  def update
@@ -97,6 +93,8 @@ class Wco::LeadsController < Wco::ApplicationController
97
93
 
98
94
  def set_lists
99
95
  @email_campaigns_list = [[nil,nil]] + WcoEmail::Campaign.all.map { |c| [ c.slug, c.id ] }
96
+ @email_templates_list = WcoEmail::EmailTemplate.list
97
+ @leads_list = Wco::Lead.list
100
98
  @leadsets_list = Wco::Leadset.list
101
99
  @tags_list = Wco::Tag.list
102
100
  end
@@ -56,7 +56,7 @@ class WcoEmail::ApplicationMailer < ActionMailer::Base
56
56
  mail( from: @ctx.from_email,
57
57
  to: @ctx.to_email,
58
58
  cc: @ctx.cc,
59
- bcc: "poxlovi@gmail.com",
59
+ bcc: "poxlovi+sent@gmail.com",
60
60
  subject: ERB.new( @ctx.subject ).result( @ctx.get_binding ),
61
61
  body: rendered_str,
62
62
  content_type: "text/html" )
@@ -52,14 +52,14 @@ class Wco::Lead
52
52
 
53
53
  has_many :email_messages, class_name: '::WcoEmail::Message', inverse_of: :lead
54
54
 
55
- has_and_belongs_to_many :conversations, class_name: '::WcoEmail::Conversation'
55
+ has_and_belongs_to_many :conversations, class_name: '::WcoEmail::Conversation', index: true
56
56
  def convs; conversations; end
57
57
  has_many :email_contexts, class_name: '::WcoEmail::Context'
58
58
  def ctxs; email_contexts; end
59
59
  has_many :email_actions, class_name: '::WcoEmail::EmailAction'
60
60
  def schs; email_actions; end
61
61
  has_and_belongs_to_many :email_campaigns, class_name: '::WcoEmail::Campaign'
62
- has_and_belongs_to_many :tags, class_name: '::Wco::Tag'
62
+ has_and_belongs_to_many :tags, class_name: '::Wco::Tag', index: true
63
63
 
64
64
  # has_many :galleries, class_name: 'Wco::Gallery'
65
65
  # has_many :videos, class_name: 'Wco::Video'
@@ -13,10 +13,10 @@ class Wco::Tag
13
13
 
14
14
  has_many :email_filters, class_name: 'WcoEmail::EmailFilter', inverse_of: :tag
15
15
 
16
- has_and_belongs_to_many :conversations, class_name: 'WcoEmail::Conversation'
16
+ has_and_belongs_to_many :conversations, class_name: 'WcoEmail::Conversation', index: true
17
17
  has_and_belongs_to_many :message_stubs, class_name: 'WcoEmail::MessageStub'
18
18
  has_and_belongs_to_many :headlines # , class_name: 'Headline'
19
- has_and_belongs_to_many :leads # , class_name: 'Lead'
19
+ has_and_belongs_to_many :leads, index: true # , class_name: 'Lead'
20
20
  has_and_belongs_to_many :leadsets # , class_name: 'Leadset'
21
21
  has_and_belongs_to_many :reports
22
22
  has_and_belongs_to_many :logs
@@ -26,12 +26,15 @@ class WcoEmail::Conversation
26
26
  field :preview, default: ''
27
27
 
28
28
  has_many :messages, class_name: '::WcoEmail::Message'
29
+ default_scope ->{ includes(:messages) }
29
30
 
30
- has_and_belongs_to_many :tags, class_name: 'Wco::Tag'
31
- has_and_belongs_to_many :leads, class_name: 'Wco::Lead'
31
+ has_and_belongs_to_many :tags, class_name: 'Wco::Tag', index: true
32
+ has_and_belongs_to_many :leads, class_name: 'Wco::Lead', index: true
32
33
 
33
34
  belongs_to :filter, class_name: 'WcoEmail::EmailFilter', inverse_of: :conversations, optional: true
34
35
 
36
+
37
+
35
38
  def to_s
36
39
  "#{subject} (#{messages.length})"
37
40
  end
@@ -1,5 +1,5 @@
1
1
 
2
- DEFAULT_FROM_EMAIL = 'victor@wasya.co'
2
+ DEFAULT_FROM_EMAIL = 'no-reply@wasya.co'
3
3
 
4
4
  class WcoEmail::EmailTemplate
5
5
  include Mongoid::Document
@@ -41,7 +41,7 @@ class WcoEmail::EmailTemplate
41
41
  field :config_json, type: Object, default: '{}'
42
42
  field :layout, default: 'plain'
43
43
 
44
- DEFAULT_FROM_EMAIL = 'Victor Pudeyev <victor@wasya.co>'
44
+ DEFAULT_FROM_EMAIL = 'Victor Pudeyev <no-reply@wasya.co>'
45
45
  FROM_EMAILS = [
46
46
  'Annesque Studio <hello@annesque.studio>',
47
47
  'Annesque Studio <no-reply@annesque.studio>',
@@ -134,6 +134,4 @@ class WcoEmail::EmailTemplate
134
134
  def self.list
135
135
  [[nil,nil]] + all.map { |p| [ p.slug, p.id ] }
136
136
  end
137
-
138
137
  end
139
- ET = WcoEmail::EmailTemplate
@@ -26,6 +26,8 @@ class WcoEmail::Message
26
26
  field :subject
27
27
 
28
28
  field :part_html
29
+ field :read_at, type: DateTime
30
+ index({ read_at: -1 })
29
31
 
30
32
  def part_html_sanitized
31
33
  doc = Nokogiri::HTML part_html
@@ -233,6 +235,7 @@ class WcoEmail::Message
233
235
  end
234
236
  end
235
237
 
238
+ scope :unread, ->{ where( read_at: nil ) }
236
239
 
237
240
  end
238
241
  ::Msg = WcoEmail::Message
@@ -4,23 +4,23 @@
4
4
  %meta{content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}
5
5
  %title Wco Models
6
6
 
7
- = javascript_include_tag "//code.jquery.com/jquery-3.3.1.min.js"
7
+ -# = javascript_include_tag "//code.jquery.com/jquery-3.3.1.min.js"
8
8
 
9
- %script{ :src => "//cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js" }
10
- = stylesheet_link_tag "//cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css"
9
+ -# %script{ :src => "//cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js" }
10
+ -# = stylesheet_link_tag "//cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css"
11
11
 
12
12
  = stylesheet_link_tag "//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css", :media => 'all'
13
13
  = stylesheet_link_tag "//fonts.googleapis.com/icon?family=Material+Icons"
14
14
 
15
- = stylesheet_link_tag "//cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css"
16
- = javascript_include_tag "//cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js"
17
- = javascript_include_tag "//cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js"
15
+ -# = stylesheet_link_tag "//cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css"
16
+ -# = javascript_include_tag "//cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js"
17
+ -# = javascript_include_tag "//cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js"
18
18
 
19
- = stylesheet_link_tag "//cdn.jsdelivr.net/npm/select2@4.0.0/dist/css/select2.min.css"
20
- = javascript_include_tag "//cdn.jsdelivr.net/npm/select2@4.0.0/dist/js/select2.min.js"
19
+ -# = stylesheet_link_tag "//cdn.jsdelivr.net/npm/select2@4.0.0/dist/css/select2.min.css"
20
+ -# = javascript_include_tag "//cdn.jsdelivr.net/npm/select2@4.0.0/dist/js/select2.min.js"
21
21
 
22
- = stylesheet_link_tag "//cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css"
23
- = javascript_include_tag "//cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js"
22
+ -# = stylesheet_link_tag "//cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css"
23
+ -# = javascript_include_tag "//cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js"
24
24
 
25
25
  = javascript_include_tag "wco/application"
26
26
  = stylesheet_link_tag "wco/application", media: "all"
@@ -2,9 +2,9 @@
2
2
  <html>
3
3
  <head>
4
4
  <!-- include libraries(jQuery, bootstrap) -->
5
- <link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
6
- <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
7
- <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
5
+ <link href="//stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
6
+ <script src="//code.jquery.com/jquery-3.5.1.min.js"></script>
7
+ <script src="//stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
8
8
 
9
9
  <!-- include codemirror (codemirror.css, codemirror.js, xml.js, formatting.js) -->
10
10
  <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/3.20.0/codemirror.css">
@@ -9,9 +9,9 @@
9
9
  %h2.title
10
10
  Leads
11
11
  - if !defined?( skip_pagination ) || !skip_pagination
12
- (#{leads.total_count})
12
+ (#{@leads.total_count})
13
13
  - else
14
- (#{leads.length})
14
+ (#{@leads.length})
15
15
  = link_to raw("<i class='fa fa-plus-square'></i>"), new_lead_path
16
16
 
17
17
  = render 'index', leads: @leads, search_path: leads_path
@@ -39,7 +39,7 @@
39
39
  Email Contexts (#{@lead.ctxs.length})
40
40
  = link_to '[+]', '#'
41
41
  %ul
42
- - @lead.ctxs.each do |ctx|
42
+ - @ctxs.each do |ctx|
43
43
  %li
44
44
  = pp_date( ctx.sent_at ) || 'not sent'
45
45
  = link_to ctx.subject.presence||"No Subj?!", wco_email.context_path(ctx)
@@ -69,6 +69,6 @@
69
69
 
70
70
  .row
71
71
  .col-md-12.conversations
72
- %h5 Email Conversations (#{@lead.convs.length})
73
- = render 'wco_email/conversations/table', convs: @lead.convs
72
+ %h5 Email Conversations (#{@convs.length})
73
+ = render 'wco_email/conversations/table', convs: @convs
74
74
 
@@ -0,0 +1,25 @@
1
+
2
+ - url = ctx.new_record? ? wco_email.contexts_path : wco_email.context_path(ctx)
3
+
4
+ .collapse-expand [reply]
5
+ .email-contexts--form-reply-mini.form-mini.descr{ style: 'display: none' }
6
+ = form_for ctx, url: url, html: { target: :_blank } do |f|
7
+
8
+ .flex-row
9
+ .flex-row
10
+ -# %label from
11
+ = f.select :from_email, options_for_select( WcoEmail::EmailTemplate.from_emails_list, selected: ctx.from_email ), {}, class: 'select2'
12
+ -# %label to (lead)
13
+ = f.select :lead, options_for_select( @leads_list, selected: lead_id ), {}, class: 'select2', required: true
14
+ .flex-row
15
+ = f.label :template
16
+ = f.select :email_template_id, options_for_select( @email_templates_list, selected: ctx.email_template_id ), {}, class: 'select2', required: true
17
+ -# = link_to '[+]', new_email_template_path, target: :_blank
18
+ .flex-row
19
+ .flex-row
20
+ %label Respond inline?
21
+ = check_box_tag :respond_inline, message.id, checked: true
22
+ .flex-row
23
+ = f.label :send_at
24
+ = f.text_field :send_at, placeholder: 'YYYY-MM-DD', value: Time.now, size: 30, class: 'input-date'
25
+ = f.submit 'Send/Schedule'
@@ -26,8 +26,17 @@
26
26
  <b>#{link_to conv.subject, wco_email.conversation_path(conv)}</b>
27
27
  - else
28
28
  = link_to conv.subject, wco_email.conversation_path(conv)
29
- <b>(#{conv.messages.length})</b>
30
- %span.gray= conv.preview
29
+ <b>#{conv.messages.unread.length}</b> (#{conv.messages.length})
30
+ - conv.messages.unread.each do |msg|
31
+ .border-bottom
32
+ .gray= msg.preview_str
33
+ = render '/wco_email/contexts/form_reply_mini', lead_id: msg.lead_id, message: msg, ctx: WcoEmail::Context.new({ from_email: msg.to&.downcase, subject: msg.subject, email_template_id: ET.find_by( slug: 'blank').id })
34
+ - if conv.messages.unread.blank?
35
+ - msg = conv.messages.last
36
+ .border-bottom
37
+ .gray= msg.preview_str
38
+ = render '/wco_email/contexts/form_reply_mini', lead_id: msg.lead_id, message: msg, ctx: WcoEmail::Context.new({ from_email: msg.to&.downcase, subject: msg.subject, email_template_id: ET.find_by( slug: 'blank').id })
39
+
31
40
  %td.tags.mini
32
41
  - conv.tags.each do |tag|
33
42
  .mb-1
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wco_models
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0.116
4
+ version: 3.1.0.118
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Pudeyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-20 00:00:00.000000000 Z
11
+ date: 2024-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -355,6 +355,13 @@ extra_rdoc_files: []
355
355
  files:
356
356
  - README.txt
357
357
  - Rakefile
358
+ - app/assets/fonts/summernote.eot
359
+ - app/assets/fonts/summernote.ttf
360
+ - app/assets/fonts/summernote.woff
361
+ - app/assets/fonts/summernote.woff2
362
+ - app/assets/images/sort_asc.png
363
+ - app/assets/images/sort_both.png
364
+ - app/assets/images/sort_desc.png
358
365
  - app/assets/javascripts/vendor/bootstrap-4.6.2.min.js
359
366
  - app/assets/javascripts/vendor/fontawesome-5.0.13.js
360
367
  - app/assets/javascripts/vendor/fontawesome-5.15.4.min.js
@@ -364,10 +371,16 @@ files:
364
371
  - app/assets/javascripts/vendor/jquery-3.3.1.slim.min.js
365
372
  - app/assets/javascripts/vendor/jquery-3.4.1.min.js
366
373
  - app/assets/javascripts/vendor/jquery-ui.min.js
374
+ - app/assets/javascripts/vendor/jquery.dataTables-1.10.16.js
375
+ - app/assets/javascripts/vendor/jquery.dataTables-1.10.16.min.js
367
376
  - app/assets/javascripts/vendor/jquery.fileupload.js
368
377
  - app/assets/javascripts/vendor/jquery.iframe-transport.js
369
378
  - app/assets/javascripts/vendor/jquery.ui.widget.js
370
379
  - app/assets/javascripts/vendor/popper-1.14.0.min.js
380
+ - app/assets/javascripts/vendor/select2-4.0.0.js
381
+ - app/assets/javascripts/vendor/select2-4.0.0.min.js
382
+ - app/assets/javascripts/vendor/summernote-0.8.18.js
383
+ - app/assets/javascripts/vendor/summernote-0.8.18.min.js
371
384
  - app/assets/javascripts/vendor/summernote-bs4.min.js
372
385
  - app/assets/javascripts/wco/alerts-notices.js
373
386
  - app/assets/javascripts/wco/application.js
@@ -379,6 +392,12 @@ files:
379
392
  - app/assets/stylesheets/dark_theme.scss
380
393
  - app/assets/stylesheets/production_theme.scss
381
394
  - app/assets/stylesheets/vendor/bootstrap-4.6.2.min.css
395
+ - app/assets/stylesheets/vendor/jquery.dataTables-1.10.16.css
396
+ - app/assets/stylesheets/vendor/jquery.dataTables-1.10.16.min.css
397
+ - app/assets/stylesheets/vendor/select2-4.0.0.css
398
+ - app/assets/stylesheets/vendor/select2-4.0.0.min.css
399
+ - app/assets/stylesheets/vendor/summernote-0.8.18.css
400
+ - app/assets/stylesheets/vendor/summernote-0.8.18.min.css
382
401
  - app/assets/stylesheets/wco/alerts_notices.scss
383
402
  - app/assets/stylesheets/wco/application.scss
384
403
  - app/assets/stylesheets/wco/chip.scss
@@ -583,6 +602,7 @@ files:
583
602
  - app/views/wco_email/application_mailer/_footer_unsubscribe.html.erb
584
603
  - app/views/wco_email/application_mailer/_header_logo.html.erb
585
604
  - app/views/wco_email/application_mailer/forwarder_notify.html.erb
605
+ - app/views/wco_email/contexts/_form_reply_mini.haml
586
606
  - app/views/wco_email/conversations/_table.haml
587
607
  - app/views/wco_email/email_layouts/_m20221201react.html.erb
588
608
  - app/views/wco_email/email_layouts/_m20221222merryxmas.html.erb