Improved twitter length calculation. If streaming api is used, fetch parent tweet via REST api. Added initials support as article feature.
This commit is contained in:
parent
62e5be1ed2
commit
691b63d011
4 changed files with 161 additions and 57 deletions
|
@ -85,7 +85,7 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
icon: 'twitter'
|
icon: 'twitter'
|
||||||
attributes: []
|
attributes: []
|
||||||
internal: false,
|
internal: false,
|
||||||
features: ['body:limit']
|
features: ['body:limit', 'body:initials']
|
||||||
maxTextLength: 140
|
maxTextLength: 140
|
||||||
warningTextLength: 30
|
warningTextLength: 30
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
icon: 'twitter'
|
icon: 'twitter'
|
||||||
attributes: ['to']
|
attributes: ['to']
|
||||||
internal: false,
|
internal: false,
|
||||||
features: ['body:limit']
|
features: ['body:limit', 'body:initials']
|
||||||
maxTextLength: 10000
|
maxTextLength: 10000
|
||||||
warningTextLength: 500
|
warningTextLength: 500
|
||||||
}
|
}
|
||||||
|
@ -229,7 +229,7 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
)
|
)
|
||||||
|
|
||||||
configure_attributes = [
|
configure_attributes = [
|
||||||
{ name: 'customer_id', display: 'Recipients', tag: 'user_autocompletion', null: false, placeholder: 'Enter Person or Organization/Company', minLengt: 2, disableCreateUser: false },
|
{ name: 'customer_id', display: 'Recipients', tag: 'user_autocompletion', null: false, placeholder: 'Enter Person or Organization/Company', minLengt: 2, disableCreateObject: false },
|
||||||
]
|
]
|
||||||
|
|
||||||
controller = new App.ControllerForm(
|
controller = new App.ControllerForm(
|
||||||
|
@ -335,12 +335,12 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
if params.type is 'twitter status'
|
if params.type is 'twitter status'
|
||||||
App.Utils.htmlRemoveRichtext(@$('[data-name=body]'), false)
|
App.Utils.htmlRemoveRichtext(@$('[data-name=body]'), false)
|
||||||
params.content_type = 'text/plain'
|
params.content_type = 'text/plain'
|
||||||
params.body = "#{App.Utils.html2text(params.body, true)}\n#{@signature.text()}"
|
params.body = App.Utils.html2text(params.body, true)
|
||||||
|
|
||||||
if params.type is 'twitter direct-message'
|
if params.type is 'twitter direct-message'
|
||||||
App.Utils.htmlRemoveRichtext(@$('[data-name=body]'), false)
|
App.Utils.htmlRemoveRichtext(@$('[data-name=body]'), false)
|
||||||
params.content_type = 'text/plain'
|
params.content_type = 'text/plain'
|
||||||
params.body = "#{App.Utils.html2text(params.body, true)}\n#{@signature.text()}"
|
params.body = App.Utils.html2text(params.body, true)
|
||||||
|
|
||||||
if params.type is 'facebook feed comment'
|
if params.type is 'facebook feed comment'
|
||||||
App.Utils.htmlRemoveRichtext(@$('[data-name=body]'), false)
|
App.Utils.htmlRemoveRichtext(@$('[data-name=body]'), false)
|
||||||
|
@ -352,6 +352,16 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
params.content_type = 'text/plain'
|
params.content_type = 'text/plain'
|
||||||
params.body = App.Utils.html2text(params.body, true)
|
params.body = App.Utils.html2text(params.body, true)
|
||||||
|
|
||||||
|
# add initals?
|
||||||
|
for articleType in @articleTypes
|
||||||
|
if articleType.name is @type
|
||||||
|
if _.contains(articleType.features, 'body:initials')
|
||||||
|
if params.content_type is 'text/html'
|
||||||
|
params.body = "#{params.body}</br>#{@signature.text()}"
|
||||||
|
else
|
||||||
|
params.body = "#{params.body}\n#{@signature.text()}"
|
||||||
|
break
|
||||||
|
|
||||||
params
|
params
|
||||||
|
|
||||||
validate: =>
|
validate: =>
|
||||||
|
@ -411,11 +421,11 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
return false
|
return false
|
||||||
|
|
||||||
if params.type is 'twitter status'
|
if params.type is 'twitter status'
|
||||||
textLength = @maxTextLength - params.body.length
|
textLength = @maxTextLength - App.Utils.textLengthWithUrl(params.body)
|
||||||
return false if textLength < 0
|
return false if textLength < 0
|
||||||
|
|
||||||
if params.type is 'twitter direct-message'
|
if params.type is 'twitter direct-message'
|
||||||
textLength = @maxTextLength - params.body.length
|
textLength = @maxTextLength - App.Utils.textLengthWithUrl(params.body)
|
||||||
return false if textLength < 0
|
return false if textLength < 0
|
||||||
|
|
||||||
true
|
true
|
||||||
|
@ -534,11 +544,12 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
for name in articleType.features
|
for name in articleType.features
|
||||||
if name is 'attachment'
|
if name is 'attachment'
|
||||||
@$('.article-attachment, .attachments').removeClass('hide')
|
@$('.article-attachment, .attachments').removeClass('hide')
|
||||||
|
if name is 'body:initials'
|
||||||
|
@updateInitials()
|
||||||
if name is 'body:limit'
|
if name is 'body:limit'
|
||||||
@maxTextLength = articleType.maxTextLength
|
@maxTextLength = articleType.maxTextLength
|
||||||
@warningTextLength = articleType.warningTextLength
|
@warningTextLength = articleType.warningTextLength
|
||||||
@delay(@updateLetterCount, 600)
|
@delay(@updateLetterCount, 600)
|
||||||
@updateInitials()
|
|
||||||
@$('.js-textSizeLimit').removeClass('hide')
|
@$('.js-textSizeLimit').removeClass('hide')
|
||||||
|
|
||||||
@scrollToBottom() if wasScrolledToBottom
|
@scrollToBottom() if wasScrolledToBottom
|
||||||
|
@ -557,7 +568,8 @@ class App.TicketZoomArticleNew extends App.Controller
|
||||||
return if !@maxTextLength
|
return if !@maxTextLength
|
||||||
return if !@warningTextLength
|
return if !@warningTextLength
|
||||||
params = @params()
|
params = @params()
|
||||||
textLength = @maxTextLength - params.body.length
|
textLength = App.Utils.textLengthWithUrl(params.body)
|
||||||
|
textLength = @maxTextLength - textLength
|
||||||
className = switch
|
className = switch
|
||||||
when textLength < 0 then 'label-danger'
|
when textLength < 0 then 'label-danger'
|
||||||
when textLength < @warningTextLength then 'label-warning'
|
when textLength < @warningTextLength then 'label-warning'
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# coffeelint: disable=no_unnecessary_double_quotes
|
# coffeelint: disable=no_unnecessary_double_quotes
|
||||||
class App.Utils
|
class App.Utils
|
||||||
@mapAttributes:
|
@mapTagAttributes:
|
||||||
'TABLE': ['align', 'bgcolor', 'border', 'cellpadding', 'cellspacing', 'frame', 'rules', 'sortable', 'summary', 'width', 'style']
|
'TABLE': ['align', 'bgcolor', 'border', 'cellpadding', 'cellspacing', 'frame', 'rules', 'sortable', 'summary', 'width', 'style']
|
||||||
'TD': ['abbr', 'align', 'axis', 'colspan', 'headers', 'rowspan', 'valign', 'width', 'style']
|
'TD': ['abbr', 'align', 'axis', 'colspan', 'headers', 'rowspan', 'valign', 'width', 'style']
|
||||||
'TH': ['abbr', 'align', 'axis', 'colspan', 'headers', 'rowspan', 'scope', 'sorted', 'valign', 'width', 'style']
|
'TH': ['abbr', 'align', 'axis', 'colspan', 'headers', 'rowspan', 'scope', 'sorted', 'valign', 'width', 'style']
|
||||||
|
@ -232,12 +232,12 @@ class App.Utils
|
||||||
@_removeWordMarkup(html)
|
@_removeWordMarkup(html)
|
||||||
|
|
||||||
# remove tags, keep content
|
# remove tags, keep content
|
||||||
html.find('div, span, p, li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, address, table, thead, tbody, tr, td, h1, h2, h3, h4, h5, h6').replaceWith( ->
|
html.find('div, span, p, li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, address, table, thead, tbody, tr, th, td, h1, h2, h3, h4, h5, h6').replaceWith( ->
|
||||||
$(@).contents()
|
$(@).contents()
|
||||||
)
|
)
|
||||||
|
|
||||||
# remove tags & content
|
# remove tags & content
|
||||||
html.find('div, span, p, li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, table, thead, tbody, tr, td, h1, h2, h3, h4, h5, h6, br, hr, img, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head').remove()
|
html.find('div, span, p, li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, table, thead, tbody, tr, th, td, h1, h2, h3, h4, h5, h6, br, hr, img, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head').remove()
|
||||||
|
|
||||||
html
|
html
|
||||||
|
|
||||||
|
@ -249,20 +249,19 @@ class App.Utils
|
||||||
# remove comments
|
# remove comments
|
||||||
@_removeComments(html)
|
@_removeComments(html)
|
||||||
|
|
||||||
# remove style and class
|
|
||||||
if parent
|
|
||||||
@_removeAttributes(html)
|
|
||||||
|
|
||||||
# remove work markup
|
# remove work markup
|
||||||
@_removeWordMarkup(html)
|
@_removeWordMarkup(html)
|
||||||
|
|
||||||
# remove tags, keep content
|
# remove tags, keep content
|
||||||
html.find('li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, address, table, thead, tbody, tr, td, h1, h2, h3, h4, h5, h6').replaceWith( ->
|
html.find('li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, address, table, thead, tbody, tr, th, td, h1, h2, h3, h4, h5, h6').replaceWith( ->
|
||||||
$(@).contents()
|
$(@).contents()
|
||||||
)
|
)
|
||||||
|
|
||||||
# remove tags & content
|
# remove tags & content
|
||||||
html.find('li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, address, table, thead, tbody, tr, td, h1, h2, h3, h4, h5, h6, hr, img, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head').remove()
|
html.find('li, ul, ol, a, b, u, i, label, small, strong, strike, pre, code, center, blockquote, form, fieldset, textarea, font, address, table, thead, tbody, tr, th, td, h1, h2, h3, h4, h5, h6, hr, img, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head').remove()
|
||||||
|
|
||||||
|
# remove style and class
|
||||||
|
@_removeAttributes(html, parent)
|
||||||
|
|
||||||
html
|
html
|
||||||
|
|
||||||
|
@ -274,9 +273,6 @@ class App.Utils
|
||||||
# remove comments
|
# remove comments
|
||||||
@_removeComments(html)
|
@_removeComments(html)
|
||||||
|
|
||||||
# remove style and class
|
|
||||||
@_removeAttributes(html)
|
|
||||||
|
|
||||||
# remove work markup
|
# remove work markup
|
||||||
@_removeWordMarkup(html)
|
@_removeWordMarkup(html)
|
||||||
|
|
||||||
|
@ -307,6 +303,9 @@ class App.Utils
|
||||||
# remove tags & content
|
# remove tags & content
|
||||||
html.find('font, img, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head, fieldset').remove()
|
html.find('font, img, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head, fieldset').remove()
|
||||||
|
|
||||||
|
# remove style and class
|
||||||
|
@_cleanAttributes(html)
|
||||||
|
|
||||||
html
|
html
|
||||||
|
|
||||||
@_checkTypeOf: (item) ->
|
@_checkTypeOf: (item) ->
|
||||||
|
@ -327,40 +326,59 @@ class App.Utils
|
||||||
catch err
|
catch err
|
||||||
return $("<div>#{item}</div>")
|
return $("<div>#{item}</div>")
|
||||||
|
|
||||||
@_removeAttribute: (element) ->
|
@_cleanAttribute: (element) ->
|
||||||
return if !element
|
return if !element
|
||||||
|
|
||||||
if @mapAttributes[element.nodeName]
|
if @mapTagAttributes[element.nodeName]
|
||||||
atts = element.attributes
|
atts = element.attributes
|
||||||
for att in atts
|
for att in atts
|
||||||
if att && att.name && !_.contains(@mapAttributes[element.nodeName], att.name)
|
if att && att.name && !_.contains(@mapTagAttributes[element.nodeName], att.name)
|
||||||
element.removeAttributeNode(att)
|
element.removeAttribute(att.name)
|
||||||
else
|
else
|
||||||
$element = $(element)
|
@_removeAttribute(element)
|
||||||
$element.removeAttr('style')
|
|
||||||
$element.removeAttr('class')
|
|
||||||
$element.removeAttr('title')
|
|
||||||
$element.removeAttr('lang')
|
|
||||||
$element.removeAttr('type')
|
|
||||||
$element.removeAttr('id')
|
|
||||||
$element.removeAttr('wrap')
|
|
||||||
$element.removeAttrs(/data-/)
|
|
||||||
|
|
||||||
if @mapCss[element.nodeName]
|
if @mapCss[element.nodeName]
|
||||||
style = element.getAttributeNode('style')
|
elementStyle = element.style
|
||||||
if style && style.nodeValue && style.nodeValue.split
|
styleOld = ''
|
||||||
|
for prop in elementStyle
|
||||||
|
styleOld += "#{prop}:#{elementStyle[prop]};"
|
||||||
|
|
||||||
|
if styleOld && styleOld.split
|
||||||
styleNew = ''
|
styleNew = ''
|
||||||
for local_pear in style.nodeValue.split(';')
|
for local_pear in styleOld.split(';')
|
||||||
prop = local_pear.split(':')
|
prop = local_pear.split(':')
|
||||||
if prop[0] && prop[0].trim
|
if prop[0] && prop[0].trim
|
||||||
key = prop[0].trim()
|
key = prop[0].trim()
|
||||||
if _.contains(@mapCss[element.nodeName], key)
|
if _.contains(@mapCss[element.nodeName], key)
|
||||||
styleNew += "#{local_pear};"
|
styleNew += "#{local_pear};"
|
||||||
if styleNew isnt ''
|
if styleNew isnt ''
|
||||||
style.nodeValue = styleNew
|
element.setAttribute('style', styleNew)
|
||||||
element.setAttributeNode(style)
|
|
||||||
else
|
else
|
||||||
element.removeAttributeNode(style)
|
element.removeAttribute('style')
|
||||||
|
|
||||||
|
@_cleanAttributes: (html, parent = true) ->
|
||||||
|
if parent
|
||||||
|
html.each((index, element) => @_cleanAttribute(element) )
|
||||||
|
html.find('*').each((index, element) => @_cleanAttribute(element) )
|
||||||
|
html
|
||||||
|
|
||||||
|
@_removeAttribute: (element) ->
|
||||||
|
return if !element
|
||||||
|
$element = $(element)
|
||||||
|
for att in element.attributes
|
||||||
|
if att && att.name
|
||||||
|
element.removeAttribute(att.name)
|
||||||
|
#$element.removeAttr(att.name)
|
||||||
|
|
||||||
|
$element.removeAttr('style')
|
||||||
|
.removeAttr('class')
|
||||||
|
.removeAttr('lang')
|
||||||
|
.removeAttr('type')
|
||||||
|
.removeAttr('align')
|
||||||
|
.removeAttr('id')
|
||||||
|
.removeAttr('wrap')
|
||||||
|
.removeAttr('title')
|
||||||
|
.removeAttrs(/data-/)
|
||||||
|
|
||||||
@_removeAttributes: (html, parent = true) ->
|
@_removeAttributes: (html, parent = true) ->
|
||||||
if parent
|
if parent
|
||||||
|
@ -877,3 +895,10 @@ class App.Utils
|
||||||
result = newOrderMethod(a, b, applyOrder)
|
result = newOrderMethod(a, b, applyOrder)
|
||||||
return false if !result
|
return false if !result
|
||||||
applyOrder
|
applyOrder
|
||||||
|
|
||||||
|
@textLengthWithUrl: (text, url_max_length = 23) ->
|
||||||
|
length = 0
|
||||||
|
return length if !text
|
||||||
|
placeholder = Array(url_max_length + 1).join('X')
|
||||||
|
text = text.replace(/http(s|):\/\/[-A-Za-z0-9+&@#\/%?=~_\|!:,.;]+[-A-Za-z0-9+&@#\/%=~_|]/img, placeholder)
|
||||||
|
text.length
|
||||||
|
|
|
@ -257,11 +257,13 @@ class TweetBase
|
||||||
begin
|
begin
|
||||||
|
|
||||||
# in case of streaming mode, get parent tweet via REST client
|
# in case of streaming mode, get parent tweet via REST client
|
||||||
if !@client && @auth
|
if @connection_type == 'stream'
|
||||||
@client = TweetRest.new(@auth)
|
client = TweetRest.new(@auth)
|
||||||
|
parent_tweet = client.status(tweet.in_reply_to_status_id)
|
||||||
|
else
|
||||||
|
parent_tweet = @client.status(tweet.in_reply_to_status_id)
|
||||||
end
|
end
|
||||||
parent_tweet = @client.status(tweet.in_reply_to_status_id)
|
ticket = to_group(parent_tweet, group_id, channel)
|
||||||
ticket = to_group(parent_tweet, group_id, channel)
|
|
||||||
rescue Twitter::Error::NotFound, Twitter::Error::Forbidden => e
|
rescue Twitter::Error::NotFound, Twitter::Error::Forbidden => e
|
||||||
# just ignore if tweet has already gone
|
# just ignore if tweet has already gone
|
||||||
Rails.logger.info "Can't import tweet (#{tweet.in_reply_to_status_id}), #{e.message}"
|
Rails.logger.info "Can't import tweet (#{tweet.in_reply_to_status_id}), #{e.message}"
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue