Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixes #2713 - Knowledge Base does't support animated GIFs and embedde…
…d Video (Youtube/Vimeo) content.
- Loading branch information
1 parent
695d056
commit 0a70711
Showing
24 changed files
with
474 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
46 changes: 46 additions & 0 deletions
46
...scripts/app/controllers/_ui_element/richtext_additions/_rich_text_tool_button_link.coffee
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
class App.UiElement.richtext.additions.RichTextToolButtonLink extends App.UiElement.richtext.additions.RichTextToolButton | ||
@pickLinkInSingleContainer: (elem, containerToLookUpTo) -> | ||
if elem.nodeName == 'A' | ||
elem | ||
else if innerLink = $(elem).find('a')[0] | ||
innerLink | ||
else if containerToLookUpTo and closestLink = $(elem).closest('a', containerToLookUpTo)[0] | ||
closestLink | ||
else | ||
null | ||
|
||
@pickLinkAt: (elem, container, direction, boundary = null) -> | ||
for parent in App.UiElement.richtext.buildParentsListWithSelf(elem, container) | ||
if parent.nodeName is 'A' | ||
return parent | ||
|
||
for elem in App.UiElement.richtext.allDirectionalSiblings(parent, direction, boundary) | ||
if link = @pickLinkInSingleContainer(elem) | ||
return link | ||
|
||
null | ||
|
||
@pickExisting: (sel, textEditor) -> | ||
if sel.isCollapsed and link = $(sel.anchorNode).closest('a')[0] | ||
return link | ||
|
||
if sel.isCollapsed | ||
return null | ||
|
||
range = sel.getRangeAt(0) | ||
|
||
if range.startContainer == range.endContainer | ||
return @pickLinkInSingleContainer(range.startContainer, textEditor) | ||
|
||
if link = @pickLinkAt(range.startContainer, range.commonAncestorContainer, 1, range.endContainer) | ||
return link | ||
|
||
if startParent = App.UiElement.richtext.buildParentsList(range.startContainer, range.commonAncestorContainer).pop() | ||
for elem in App.UiElement.richtext.allDirectionalSiblings(startParent, 1, range.endContainer) | ||
if link = @pickLinkInSingleContainer(elem) | ||
return link | ||
|
||
if link = @pickLinkAt(range.endContainer, range.commonAncestorContainer, -1) | ||
return link | ||
|
||
return null |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
63 changes: 63 additions & 0 deletions
63
...sets/javascripts/app/controllers/_ui_element/richtext_additions/embed_video_button.coffee
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
# coffeelint: disable=camel_case_classes | ||
class App.UiElement.richtext.toolButtons.embed_video extends App.UiElement.richtext.additions.RichTextToolButton | ||
@icon: 'cloud' | ||
@text: 'Video' | ||
@klass: -> App.UiElement.richtext.additions.RichTextToolPopupVideo | ||
@initializeAttributes: | ||
model: | ||
configure_attributes: [ | ||
{ | ||
name: 'link' | ||
display: 'Link' | ||
tag: 'input' | ||
placeholder: 'Youtube or Vimeo address' | ||
} | ||
] | ||
|
||
@pickExisting: (sel, textEditor) -> | ||
startNode = null | ||
startOffset = null | ||
|
||
endNode = null | ||
endOffset = null | ||
|
||
return if !textEditor[0].contains(sel.anchorNode) | ||
|
||
walker = document.createTreeWalker(textEditor[0]) | ||
|
||
walker.currentNode = sel.anchorNode | ||
|
||
while !startNode and (walker.currentNode.nodeName == '#text' || walker.currentNode.nodeName == 'SPAN') and walker.currentNode | ||
if walker.currentNode instanceof Text | ||
offset = walker.currentNode.textContent.indexOf '(' | ||
if offset? and offset > -1 | ||
startNode = walker.currentNode | ||
startOffset = offset | ||
|
||
walker.previousNode() | ||
|
||
walker.currentNode = sel.anchorNode # back to start | ||
|
||
while !endNode and (walker.currentNode.nodeName == '#text' || walker.currentNode.nodeName == 'SPAN') and walker.currentNode | ||
if walker.currentNode instanceof Text | ||
offset = walker.currentNode.textContent.indexOf ')' | ||
if offset? and offset > -1 and (walker.currentNode != sel.anchorNode || offset > startOffset) | ||
endNode = walker.currentNode | ||
endOffset = offset + 1 | ||
|
||
walker.nextNode() | ||
|
||
if startNode and endNode | ||
range = document.createRange() | ||
range.setStart(startNode, startOffset) | ||
range.setEnd(endNode, endOffset) | ||
|
||
copy = range.cloneContents() | ||
|
||
wrapper = document.createElement('span') | ||
wrapper.append(copy) | ||
|
||
range.deleteContents() | ||
range.insertNode(wrapper) | ||
|
||
wrapper |
18 changes: 18 additions & 0 deletions
18
...ets/javascripts/app/controllers/_ui_element/richtext_additions/insert_image_button.coffee
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# coffeelint: disable=camel_case_classes | ||
class App.UiElement.richtext.toolButtons.insert_image extends App.UiElement.richtext.additions.RichTextToolButton | ||
@icon: 'web' | ||
@text: 'Image' | ||
@klass: -> App.UiElement.richtext.additions.RichTextToolPopupImage | ||
@initializeAttributes: | ||
model: | ||
configure_attributes: [ | ||
{ | ||
name: 'link' | ||
display: 'Image' | ||
tag: 'input' | ||
type: 'file' | ||
} | ||
] | ||
|
||
@pickExisting: (sel, textEditor) -> | ||
selectedImage = textEditor.find('img.objectResizingEditorActive')[0] |
2 changes: 1 addition & 1 deletion
2
...sets/javascripts/app/controllers/_ui_element/richtext_additions/link_answer_button.coffee
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
app/assets/javascripts/app/controllers/_ui_element/richtext_additions/link_button.coffee
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
58 changes: 58 additions & 0 deletions
58
app/assets/javascripts/app/controllers/_ui_element/richtext_additions/popup_image.coffee
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
class App.UiElement.richtext.additions.RichTextToolPopupImage extends App.UiElement.richtext.additions.RichTextToolPopup | ||
labelNew: 'Insert' | ||
labelExisting: 'Replace' | ||
|
||
apply: (callback) -> | ||
@el.find('btn--create').attr('disabled', true) | ||
|
||
file = @el.find('input')[0].files[0] | ||
|
||
reader = new FileReader() | ||
|
||
reader.addEventListener('load', => | ||
@insertImage(reader.result) | ||
callback() | ||
, false) | ||
|
||
reader.readAsDataURL(file) | ||
|
||
applyOnto: (dom, base64) -> | ||
dom.attr('src', base64) | ||
|
||
insertImage: (base64) -> | ||
textEditor = $(@event.currentTarget).closest('.richtext.form-control').find('[contenteditable]') | ||
|
||
switch @selection.type | ||
when 'existing' | ||
@applyOnto(@selection.dom, base64) | ||
when 'append' | ||
newElem = $('<img>')[0] | ||
newElem.src = base64 | ||
newElem.style = 'width: 1000px; max-width: 100%;' | ||
@selection.dom.append(newElem) | ||
when 'caret' | ||
newElem = $('<img>') | ||
newElem.attr('src', base64) | ||
newElem.attr('style', 'width: 1000px; max-width: 100%;') | ||
|
||
surroundingDom = @selection.dom[0] | ||
|
||
if surroundingDom instanceof Text | ||
@selection.dom[0].splitText(@selection.offset) | ||
|
||
newElem.insertAfter(@selection.dom) | ||
when 'range' | ||
newElem = $('<img>') | ||
newElem.attr('src', base64) | ||
newElem.attr('style', 'width: 1000px; max-width: 100%;') | ||
|
||
placeholder = textEditor.find('span.highlight-emulator') | ||
|
||
placeholder.empty() | ||
placeholder.append(newElem) | ||
|
||
clear: -> | ||
switch @selection.type | ||
when 'existing' | ||
@selection.dom.closest('.enableObjectResizingShim').remove() | ||
@selection.dom.remove() # just in case shim was lost while the dialog was open |
Oops, something went wrong.