e9_crm 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,21 +1,75 @@
1
1
  module E9Crm::ContactsHelper
2
2
 
3
+ def contact_tags
4
+ @_contact_tags ||= begin
5
+ relation = Tagging.joins(:tag).select('distinct tags.name')
6
+ .where(:context => E9Tags.escape_context('users*'))
7
+
8
+ Tagging.connection.send(:select_values, relation.to_sql, 'Contact Tags Select')
9
+ end
10
+ end
11
+
12
+ def link_to_google(query, opts = {})
13
+ return unless query.present?
14
+
15
+ opts.symbolize_keys!
16
+ opts.reverse_merge!({
17
+ :base_url => 'http://google.com/search?q=%s',
18
+ :exact => true,
19
+ :text => :search
20
+ })
21
+
22
+ opts[:text] = I18n.t(opts[:text]) if opts[:text].is_a?(Symbol)
23
+
24
+ query = query.to_s
25
+ query = "\"#{query}\"" if query =~ /\s/ && opts[:exact]
26
+ query = CGI.escape(query)
27
+ link_to opts[:text], opts[:base_url] % query, :rel => 'nofollow external'
28
+ end
29
+
30
+ def google_search_link(query, opts = {})
31
+ link_to_google query, opts
32
+ end
33
+
34
+ def google_news_link(query, opts = {})
35
+ link_to_google query, opts.merge(:text => :news, :base_url => "http://news.google.com/news/search?q=%s")
36
+ end
37
+
38
+ def google_maps_link(query, opts = {})
39
+ link_to_google query, opts.merge(:text => :map, :exact => false, :base_url => "http://maps.google.com/maps?q=%s")
40
+ end
41
+
42
+ def contact_simple_format(text)
43
+ auto_link(
44
+ simple_format(text),
45
+ :html => { :rel => 'external nofollow' },
46
+ :link => :urls
47
+ )
48
+ end
49
+
3
50
  def link_to_contact_search(attribute, query, text = nil)
4
51
  link_to(text || query, contacts_path(attribute => query), :class => "contact-search contact-#{attribute.to_s.dasherize}-search")
5
52
  end
6
53
 
7
- def contact_email_template_select_options
8
- options_for_select( EmailTemplate.order('name').map {|e| [e.name, e.id] })
54
+ def contact_tag_list(tags)
55
+ tags.map {|tag| link_to_contact_search(:tagged, [tag], tag) }.join(', ').html_safe
56
+ end
57
+
58
+ def contact_newsletter_select_tag
59
+ options = UserEmail.pending.order('name').map {|e| [e.name, e.id] }
60
+ #select_tag 'eid', options_for_select( options.presence || [['n/a', nil]] )
61
+ select_tag 'eid', options_for_select(options) if options.present?
9
62
  end
10
63
 
11
- def contact_newsletter_select_options
12
- options_for_select( UserEmail.pending.order('name').map {|e| [e.name, e.id] })
64
+ def contact_email_template_select_tag
65
+ options = EmailTemplate.order('name').map {|e| [e.name, e.id] }
66
+ #select_tag 'etid', options_for_select( options.presence || [['n/a', nil]] )
67
+ select_tag 'etid', options_for_select(options) if options.present?
13
68
  end
14
69
 
15
70
  def contact_user_subscribed_to_newsletter?(user)
16
71
  @_newsletter ||= MailingList.newsletter
17
-
18
- user.subscription_ids.include? @_newsletter.id
72
+ @_newsletter && user.subscription_ids.include?(@_newsletter.id)
19
73
  end
20
74
 
21
75
  def records_table_field_map_for_contact
@@ -1,4 +1,7 @@
1
1
  # Attribute for address info
2
2
  #
3
3
  class AddressAttribute < RecordAttribute
4
+ def to_html
5
+ to_s.gsub(/\n/, '<br />').html_safe
6
+ end
4
7
  end
@@ -1,4 +1,5 @@
1
1
  # A company record, mainly an organizational tool for Contacts
2
2
  #
3
3
  class Company < ActiveRecord::Base
4
+ include E9Rails::ActiveRecord::AttributeSearchable
4
5
  end
@@ -129,11 +129,14 @@ class Contact < ActiveRecord::Base
129
129
  AND record_attributes.record_type = 'Contact'
130
130
  LEFT OUTER JOIN users AS contacts_users
131
131
  ON contacts_users.contact_id = contacts.id
132
+ LEFT OUTER JOIN companies
133
+ ON companies.id = contacts.company_id
132
134
  }
133
135
 
134
136
  where_sql = any_attrs_like_scope_conditions(:first_name, :last_name, :title, query)
135
137
  .or(RecordAttribute.attr_like_scope_condition(:value, query))
136
- .to_sql
138
+ .or(Company.attr_like_scope_condition(:name, query))
139
+ .to_sql.gsub(/\s+/, ' ')
137
140
 
138
141
  ucond = sanitize_sql_array(['contacts_users.email like ?', "%#{query}%"])
139
142
  where_sql << " OR (#{ucond})"
@@ -186,7 +189,7 @@ class Contact < ActiveRecord::Base
186
189
  # Helper to concatenate a Contact's full name
187
190
  #
188
191
  def name
189
- [first_name, last_name].join(' ')
192
+ [first_name, last_name].join(' ').to_s.strip
190
193
  end
191
194
 
192
195
  def merge_and_destroy!(other_contact)
@@ -1 +1,18 @@
1
- = resource.name
1
+ -#.contact-deals
2
+ -#%h2
3
+ -#= Deal.model_name.human.pluralize
4
+ -#= link_to_new_resource(Deal, :deal => {:contact_id => resource.id })
5
+ -#- resource.deals.each do |deal|
6
+ -#.contact-deal
7
+ -#.contact-deal-status
8
+ -#= deal.status
9
+ -#.contact-deal-type
10
+ -#= deal.type.titleize
11
+ -#.contact-deal-value
12
+ -#= deal.value
13
+ -#.contact-leads
14
+ -#%h2
15
+ -#= Lead.model_name.human.pluralize
16
+ -#- resource.leads.each do |lead|
17
+ -#.contact-lead
18
+ -#.contact-lead-type
@@ -1,26 +1,15 @@
1
1
  = render 'who', :record => record
2
2
 
3
- - if record.users.any?
3
+ - if record.phone_number_attributes.any?
4
4
  .contact-phone-numbers
5
+ - record.phone_number_attributes.each do |phone_number_attribute|
6
+ .contact-phone-number= phone_number_attribute
7
+
8
+ - if record.users.any?
9
+ .contact-emails
5
10
  - record.users.each do |user|
6
11
  .contact-email
7
12
  = '* ' if contact_user_subscribed_to_newsletter?(user)
8
13
  = link_to(user.email, "mailto:#{user.email}")
9
14
  = "(#{user.options.type})" if user.options.type
10
15
  = "(primary)" if user.primary?
11
-
12
- - if record.phone_number_attributes.any?
13
- .contact-phone-numbers
14
- - record.phone_number_attributes.each do |phone_number_attribute|
15
- .contact-phone-number= phone_number_attribute
16
-
17
- - if record.instant_messaging_handle_attributes.any?
18
- .contact-im-handles
19
- - record.instant_messaging_handle_attributes.each do |instant_messaging_handle_attribute|
20
- .contact-im-handle= instant_messaging_handle_attribute
21
-
22
- - if record.website_attributes.any?
23
- .contact-websites
24
- - record.website_attributes.each do |website_attribute|
25
- .contact-website
26
- = auto_link(website_attribute.to_s, :rel => "external nofollow")
@@ -7,14 +7,16 @@
7
7
  = submit_tag t(:go), :name => nil
8
8
  = submit_tag t(:clear), :name => nil, :id => 'contact_search_clear'
9
9
  .toolbar-middle
10
- = form_tag new_contact_email_path, :method => :get, :id => 'contact_email_form', 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @contact_ids.length do
11
- = select_tag 'etid', contact_email_template_select_options
12
- = hidden_field_tag 'uids', @contact_ids.join(','), :id => 'contact_email_uids'
13
- = submit_tag e9_t(:send_email_template), :name => nil
14
- = form_tag send_email_admin_user_email_path('__ID__'), :method => :put, :id => 'contact_newsletter_form', 'data-confirm' => e9_t(:contact_newsletter_confirmation, :count => collection.length), 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @contact_ids.length do
15
- = select_tag 'eid', contact_newsletter_select_options
16
- = hidden_field_tag 'uids', @contact_ids.join(','), :id => 'contact_newsletter_uids'
17
- = submit_tag e9_t(:send_email_newsletter), :name => nil
10
+ - if (tag = contact_email_template_select_tag).present?
11
+ = form_tag new_contact_email_path, :method => :get, :id => 'contact_email_form', 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @contact_ids.length do
12
+ = tag
13
+ = hidden_field_tag 'uids', @contact_ids.join(','), :id => 'contact_email_uids'
14
+ = submit_tag e9_t(:send_email_template), :name => nil
15
+ - if (tag = contact_email_template_select_tag).present?
16
+ = form_tag send_email_admin_user_email_path('__ID__'), :method => :put, :id => 'contact_newsletter_form', 'data-confirm' => e9_t(:contact_newsletter_confirmation, :count => collection.length), 'data-empty' => e9_t(:no_contacts_notification), 'data-count' => @contact_ids.length do
17
+ = tag
18
+ = hidden_field_tag 'uids', @contact_ids.join(','), :id => 'contact_newsletter_uids'
19
+ = submit_tag e9_t(:send_email_newsletter), :name => nil
18
20
  .toolbar-right
19
21
  = link_to_new_resource(Contact)
20
22
  = link_to_new_resource(Company)
@@ -0,0 +1,38 @@
1
+ - if resource.phone_number_attributes.any?
2
+ .contact-phone-numbers
3
+ %label= Contact.human_attribute_name(:phone_number_attributes)
4
+ - resource.phone_number_attributes.each do |phone_number_attribute|
5
+ .contact-phone-number= phone_number_attribute
6
+
7
+ - if resource.users.any?
8
+ .contact-emails
9
+ %label= Contact.human_attribute_name(:users)
10
+ - resource.users.each do |user|
11
+ .contact-email
12
+ = '* ' if contact_user_subscribed_to_newsletter?(user)
13
+ = link_to(user.email, "mailto:#{user.email}")
14
+ = "(#{user.options.type})" if user.options.type
15
+ = "(primary)" if user.primary?
16
+
17
+ - if resource.instant_messaging_handle_attributes.any?
18
+ .contact-im-handles
19
+ %label= Contact.human_attribute_name(:instant_messaging_handle_attributes)
20
+ - resource.instant_messaging_handle_attributes.each do |instant_messaging_handle_attribute|
21
+ .contact-im-handle= instant_messaging_handle_attribute
22
+
23
+ - if resource.website_attributes.any?
24
+ .contact-websites
25
+ %label= Contact.human_attribute_name(:website_attributes)
26
+ - resource.website_attributes.each do |website_attribute|
27
+ .contact-website
28
+ = auto_link(website_attribute.to_s, :rel => "external nofollow")
29
+
30
+ - if resource.address_attributes.any?
31
+ .contact-addresses
32
+ %label= Contact.human_attribute_name(:address_attributes)
33
+ - resource.address_attributes.each do |address_attribute|
34
+ .contact-address
35
+ .address= address_attribute.to_html
36
+ .actions
37
+ = google_maps_link(address_attribute)
38
+
@@ -4,12 +4,12 @@
4
4
  %th{:colspan => 2}
5
5
  = t(:tags_name, :scope => :e9_tags)
6
6
  %tbody
7
- - Tagging.where(:context => E9Tags.escape_context('users*')).joins(:tag).all.group_by {|t| t.name[0].upcase }.sort.each do |letter, tags|
7
+ - contact_tags.sort.group_by {|tag| tag[0].upcase }.each do |letter, tags|
8
8
  %tr
9
9
  %td.tag-starts-with= letter
10
10
  %td.tags
11
11
  %ul.tags
12
- - tags.sort_by(&:name).each do |tag|; tag_id = "tagged-#{tag.name.dasherize}"
12
+ - tags.each do |tag|; tag_id = "tagged-#{tag.downcase.dasherize}"
13
13
  %li.tag
14
- = label_tag(tag_id, tag.name)
15
- = check_box_tag('tagged[]', tag.name, tagged_params.member?(tag.name), :id => tag_id)
14
+ = label_tag(tag_id, tag)
15
+ = check_box_tag('tagged[]', tag, tagged_params.member?(tag), :id => tag_id)
@@ -1,14 +1,15 @@
1
1
  .contact-who
2
- %span.contact-who-name= record.name
2
+ - unless local_assigns[:hide_name]
3
+ %span.contact-who-name= record.name
3
4
 
4
- = " - " if record.company_id? || record.title?
5
+ = " - " if record.company_id? || record.title?
5
6
 
6
7
  - if record.title?
7
8
  %span.contact-who-title
8
- = link_to_contact_search(:by_title, record.title)
9
+ = link_to_contact_search(:search, record.title)
9
10
 
10
11
  = " at " if record.company_id? && record.title?
11
12
 
12
13
  - if record.company_id?
13
14
  %span.contact-who-company
14
- = link_to_contact_search(:by_company, record.company_id, record.company_name)
15
+ = link_to_contact_search(:search, record.company_name)
@@ -0,0 +1,24 @@
1
+ .contact-body
2
+ = title resource.name
3
+ = render 'who', :record => resource
4
+ .contact-links.actions
5
+ = link_to_edit_resource(resource)
6
+ = google_search_link(resource.name)
7
+ = google_news_link(resource.name)
8
+ - if (tags = resource.tags(:show_all => true)).present?
9
+ .contact-tags
10
+ %label #{Tag.model_name.human.pluralize}:
11
+ = contact_tag_list(tags)
12
+ .contact-info
13
+ %label #{Contact.human_attribute_name(:info)}:
14
+ = contact_simple_format(resource.info.presence || t(:none))
15
+ - if company = resource.company
16
+ .contact-company
17
+ %label= company.name
18
+ .contact-company-links.actions
19
+ = google_search_link(company.name)
20
+ = google_news_link(company.name)
21
+ - if company.info.present?
22
+ = contact_simple_format(text)
23
+ .contact-sidebar
24
+ = render 'sidebar'
@@ -7,6 +7,8 @@ en:
7
7
  totals: Totals
8
8
  inline_help_link: '[?]'
9
9
  edit_dated_costs: Edit Costs
10
+ news: News
11
+ map: Map
10
12
 
11
13
  e9_crm:
12
14
  add_record_attribute: Add
@@ -64,7 +66,10 @@ en:
64
66
  deal: Deal
65
67
  page_view: Page View
66
68
  tracking_cookie: Tracking Cookie
67
-
69
+ address_attribute: Address
70
+ instant_messaging_handle_attribute: IM Handle
71
+ phone_number_attrubute: Phone
72
+ website_attribute: Website
68
73
  attributes:
69
74
  campaign:
70
75
  name: Name
@@ -73,7 +78,7 @@ en:
73
78
  avatar: Photo
74
79
  users: Email Addresses
75
80
  address_attributes: Addresses
76
- instant_messaging_handle_attributes: Instant Messaging Handles
81
+ instant_messaging_handle_attributes: IM Handles
77
82
  phone_number_attrubutes: Phone Numbers
78
83
  website_attributes: Websites
79
84
  info: Background Information
data/lib/e9_crm/model.rb CHANGED
@@ -31,7 +31,7 @@ module E9Crm
31
31
  # Is this the Contact's primary model?
32
32
  #
33
33
  def primary?
34
- !!options.primary
34
+ ["true", true].member? options.primary
35
35
  end
36
36
 
37
37
  protected
@@ -1,3 +1,3 @@
1
1
  module E9Crm
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.6'
3
3
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: e9_crm
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.5
5
+ version: 0.1.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Travis Cox
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-18 00:00:00 -04:00
13
+ date: 2011-05-19 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -214,11 +214,12 @@ files:
214
214
  - app/views/e9_crm/contacts/_details.html.haml
215
215
  - app/views/e9_crm/contacts/_form_inner.html.haml
216
216
  - app/views/e9_crm/contacts/_header.html.haml
217
+ - app/views/e9_crm/contacts/_sidebar.html.haml
217
218
  - app/views/e9_crm/contacts/_tag_table.html.haml
218
219
  - app/views/e9_crm/contacts/_who.html.haml
219
220
  - app/views/e9_crm/contacts/index.html.haml
220
221
  - app/views/e9_crm/contacts/index.js.erb
221
- - app/views/e9_crm/contacts/merge.html.haml
222
+ - app/views/e9_crm/contacts/show.html.haml
222
223
  - app/views/e9_crm/contacts/templates.js.erb
223
224
  - app/views/e9_crm/dated_costs/_dated_cost.html.haml
224
225
  - app/views/e9_crm/dated_costs/_form.html.haml