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.
- checksums.yaml +4 -4
- data/app/assets/fonts/summernote.eot +0 -0
- data/app/assets/fonts/summernote.ttf +0 -0
- data/app/assets/fonts/summernote.woff +0 -0
- data/app/assets/fonts/summernote.woff2 +0 -0
- data/app/assets/images/sort_asc.png +0 -0
- data/app/assets/images/sort_both.png +0 -0
- data/app/assets/images/sort_desc.png +0 -0
- data/app/assets/javascripts/vendor/jquery.dataTables-1.10.16.js +15243 -0
- data/app/assets/javascripts/vendor/jquery.dataTables-1.10.16.min.js +164 -0
- data/app/assets/javascripts/vendor/select2-4.0.0.js +5403 -0
- data/app/assets/javascripts/vendor/select2-4.0.0.min.js +2 -0
- data/app/assets/javascripts/vendor/summernote-0.8.18.js +10228 -0
- data/app/assets/javascripts/vendor/summernote-0.8.18.min.js +3 -0
- data/app/assets/javascripts/wco/application.js +14 -9
- data/app/assets/stylesheets/vendor/jquery.dataTables-1.10.16.css +448 -0
- data/app/assets/stylesheets/vendor/jquery.dataTables-1.10.16.min.css +1 -0
- data/app/assets/stylesheets/vendor/select2-4.0.0.css +431 -0
- data/app/assets/stylesheets/vendor/select2-4.0.0.min.css +1 -0
- data/app/assets/stylesheets/vendor/summernote-0.8.18.css +13 -0
- data/app/assets/stylesheets/vendor/summernote-0.8.18.min.css +1 -0
- data/app/assets/stylesheets/wco/application.scss +19 -3
- data/app/controllers/wco/application_controller.rb +23 -0
- data/app/controllers/wco/leads_controller.rb +4 -6
- data/app/mailers/wco_email/application_mailer.rb +1 -1
- data/app/models/wco/lead.rb +2 -2
- data/app/models/wco/tag.rb +2 -2
- data/app/models/wco_email/conversation.rb +5 -2
- data/app/models/wco_email/email_template.rb +2 -4
- data/app/models/wco_email/message.rb +3 -0
- data/app/views/layouts/wco/application.haml +10 -10
- data/app/views/wco/application/tinymce.html.erb +3 -3
- data/app/views/wco/leads/index.haml +2 -2
- data/app/views/wco/leads/show.haml +3 -3
- data/app/views/wco_email/contexts/_form_reply_mini.haml +25 -0
- data/app/views/wco_email/conversations/_table.haml +11 -2
- 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
|
-
|
71
|
-
|
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" )
|
data/app/models/wco/lead.rb
CHANGED
@@ -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'
|
data/app/models/wco/tag.rb
CHANGED
@@ -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 = '
|
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 <
|
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="
|
6
|
-
<script src="
|
7
|
-
<script src="
|
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
|
-
- @
|
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 (#{@
|
73
|
-
= render 'wco_email/conversations/table', 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})
|
30
|
-
|
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.
|
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-
|
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
|