diff --git a/internal_packages/message-list/lib/message-participants.cjsx b/internal_packages/message-list/lib/message-participants.cjsx
index cb3b21a55..4837de7a3 100644
--- a/internal_packages/message-list/lib/message-participants.cjsx
+++ b/internal_packages/message-list/lib/message-participants.cjsx
@@ -58,7 +58,7 @@ class MessageParticipants extends React.Component
if c.name?.length > 0 and c.name isnt c.email
- {c.name}
+ {c.fullName()}
{"<"}{c.email}{">#{comma}"}
diff --git a/spec/models/contact-spec.coffee b/spec/models/contact-spec.coffee
index c8e341cc5..c6a383def 100644
--- a/spec/models/contact-spec.coffee
+++ b/spec/models/contact-spec.coffee
@@ -116,6 +116,22 @@ describe "Contact", ->
expect(c8.firstName()).toBe "Mike"
expect(c8.lastName()).toBe "K@ylor"
+ it "properly parses names with last, first (description)", ->
+ c1 = new Contact {name: "Smith, Bob"}
+ expect(c1.firstName()).toBe "Bob"
+ expect(c1.lastName()).toBe "Smith"
+ expect(c1.fullName()).toBe "Bob Smith"
+
+ c2 = new Contact {name: "von Smith, Ricky Bobby"}
+ expect(c2.firstName()).toBe "Ricky Bobby"
+ expect(c2.lastName()).toBe "von Smith"
+ expect(c2.fullName()).toBe "Ricky Bobby von Smith"
+
+ c3 = new Contact {name: "von Smith, Ricky Bobby (Awesome Employee)"}
+ expect(c3.firstName()).toBe "Ricky Bobby"
+ expect(c3.lastName()).toBe "von Smith (Awesome Employee)"
+ expect(c3.fullName()).toBe "Ricky Bobby von Smith (Awesome Employee)"
+
it "should properly return `You` as the display name for the current user", ->
c1 = new Contact {name: " Test Monkey", email: @account.emailAddress}
expect(c1.displayName()).toBe "You"
diff --git a/src/flux/models/contact.coffee b/src/flux/models/contact.coffee
index acdd7f3c7..78fbda038 100644
--- a/src/flux/models/contact.coffee
+++ b/src/flux/models/contact.coffee
@@ -165,12 +165,16 @@ class Contact extends Model
# Take care of whitespace
name = name.trim()
+ # Handle last name, first name
+ parts = @_parseReverseNames(name)
+
# Split the name into words and remove parts that are prefixes and suffixes
- parts = []
- parts = name.split(/\s+/)
- parts = _.reject parts, (part) ->
- part = part.toLowerCase().replace(/\./,'')
- (part of name_prefixes) or (part of name_suffixes)
+ if parts.join('').length == 0
+ parts = []
+ parts = name.split(/\s+/)
+ parts = _.reject parts, (part) ->
+ part = part.toLowerCase().replace(/\./,'')
+ (part of name_prefixes) or (part of name_suffixes)
# If we've removed all the parts, just return the whole name
parts = [name] if parts.join('').length == 0
@@ -180,6 +184,18 @@ class Contact extends Model
parts
+ _parseReverseNames: (name) ->
+ parts = []
+ [lastName, firstName] = name.split(',')
+ if firstName
+ [firstName, description] = firstName.split('(')
+
+ parts.push(firstName.trim())
+ parts.push(lastName.trim())
+ parts.push("(" + description.trim()) if description
+
+ parts
+
module.exports = Contact
_.each ['2dlt','2lt','2nd lieutenant','adm','administrative','admiral','amb','ambassador','attorney','atty','baron','baroness','bishop','br','brig gen or bg','brigadier general','brnss','brother','capt','captain','chancellor','chaplain','chapln','chief petty officer','cmdr','cntss','coach','col','colonel','commander','corporal','count','countess','cpl','cpo','cpt','doctor','dr','dr and mrs','drs','duke','ens','ensign','estate of','father','father','fr','frau','friar','gen','general','gov','governor','hon','honorable','judge','justice','lieutenant','lieutenant colonel','lieutenant commander','lieutenant general','lieutenant junior grade','lord','lt','ltc','lt cmdr','lt col','lt gen','ltg','lt jg','m','madame','mademoiselle','maj','maj','master sergeant','master sgt','miss','miss','mlle','mme','monsieur','monsignor','monsignor','mr','mr','mr & dr','mr and dr','mr & mrs','mr and mrs','mrs & mr','mrs and mr','ms','ms','msgr','msgr','ofc','officer','president','princess','private','prof','prof & mrs','professor','pvt','rabbi','radm','rear admiral','rep','representative','rev','reverend','reverends','revs','right reverend','rtrev','s sgt','sargent','sec','secretary','sen','senator','senor','senora','senorita','sergeant','sgt','sgt','sheikh','sir','sister','sister','sr','sra','srta','staff sergeant','superintendent','supt','the hon','the honorable','the venerable','treas','treasurer','trust','trustees of','vadm','vice admiral'], (prefix) -> name_prefixes[prefix] = true