mirror of
https://github.com/redmine/redmine.git
synced 2025-11-16 18:26:02 +01:00
Generate markup for uploaded image dropped into wiki-edit textarea (#26071).
Patch by Felix Gliesche. git-svn-id: http://svn.redmine.org/redmine/trunk@16643 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -53,6 +53,11 @@ module Redmine
|
|||||||
map
|
map
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# returns all full mime types for a given (top level) type
|
||||||
|
def self.by_type(type)
|
||||||
|
MIME_TYPES.keys.select{|m| m.start_with? "#{type}/"}
|
||||||
|
end
|
||||||
|
|
||||||
# returns mime type for name or nil if unknown
|
# returns mime type for name or nil if unknown
|
||||||
def self.of(name)
|
def self.of(name)
|
||||||
return nil unless name.present?
|
return nil unless name.present?
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ module Redmine
|
|||||||
javascript_include_tag('jstoolbar/jstoolbar') +
|
javascript_include_tag('jstoolbar/jstoolbar') +
|
||||||
javascript_include_tag('jstoolbar/markdown') +
|
javascript_include_tag('jstoolbar/markdown') +
|
||||||
javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") +
|
javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") +
|
||||||
|
javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};") +
|
||||||
stylesheet_link_tag('jstoolbar')
|
stylesheet_link_tag('jstoolbar')
|
||||||
end
|
end
|
||||||
@heads_for_wiki_formatter_included = true
|
@heads_for_wiki_formatter_included = true
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ module Redmine
|
|||||||
content_for :header_tags do
|
content_for :header_tags do
|
||||||
javascript_include_tag('jstoolbar/jstoolbar-textile.min') +
|
javascript_include_tag('jstoolbar/jstoolbar-textile.min') +
|
||||||
javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") +
|
javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") +
|
||||||
|
javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};") +
|
||||||
stylesheet_link_tag('jstoolbar')
|
stylesheet_link_tag('jstoolbar')
|
||||||
end
|
end
|
||||||
@heads_for_wiki_formatter_included = true
|
@heads_for_wiki_formatter_included = true
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ function ajaxUpload(file, attachmentId, fileSpan, inputEl) {
|
|||||||
progressEventHandler: onProgress.bind(progressSpan)
|
progressEventHandler: onProgress.bind(progressSpan)
|
||||||
})
|
})
|
||||||
.done(function(result) {
|
.done(function(result) {
|
||||||
|
addInlineAttachmentMarkup(file);
|
||||||
progressSpan.progressbar( 'value', 100 ).remove();
|
progressSpan.progressbar( 'value', 100 ).remove();
|
||||||
fileSpan.find('input.description, a').css('display', 'inline-block');
|
fileSpan.find('input.description, a').css('display', 'inline-block');
|
||||||
})
|
})
|
||||||
@@ -175,9 +176,11 @@ function handleFileDropEvent(e) {
|
|||||||
blockEventPropagation(e);
|
blockEventPropagation(e);
|
||||||
|
|
||||||
if ($.inArray('Files', e.dataTransfer.types) > -1) {
|
if ($.inArray('Files', e.dataTransfer.types) > -1) {
|
||||||
|
handleFileDropEvent.target = e.target;
|
||||||
uploadAndAttachFiles(e.dataTransfer.files, $('input:file.filedrop').first());
|
uploadAndAttachFiles(e.dataTransfer.files, $('input:file.filedrop').first());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
handleFileDropEvent.target = '';
|
||||||
|
|
||||||
function dragOverHandler(e) {
|
function dragOverHandler(e) {
|
||||||
$(this).addClass('fileover');
|
$(this).addClass('fileover');
|
||||||
@@ -204,6 +207,49 @@ function setupFileDrop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addInlineAttachmentMarkup(file) {
|
||||||
|
// insert uploaded image inline if dropped area is currently focused textarea
|
||||||
|
if($(handleFileDropEvent.target).hasClass('wiki-edit') && $.inArray(file.type, window.wikiImageMimeTypes) > -1) {
|
||||||
|
var $textarea = $(handleFileDropEvent.target);
|
||||||
|
var cursorPosition = $textarea.prop('selectionStart');
|
||||||
|
var description = $textarea.val();
|
||||||
|
var sanitizedFilename = file.name.replace(/[\/\?\%\*\:\|\"\'<>\n\r]+/, '_');
|
||||||
|
var inlineFilename = encodeURIComponent(sanitizedFilename);
|
||||||
|
var newLineBefore = true;
|
||||||
|
var newLineAfter = true;
|
||||||
|
if(cursorPosition === 0 || description.substr(cursorPosition-1,1).match(/\r|\n/)) {
|
||||||
|
newLineBefore = false;
|
||||||
|
}
|
||||||
|
if(description.substr(cursorPosition,1).match(/\r|\n/)) {
|
||||||
|
newLineAfter = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$textarea.val(
|
||||||
|
description.substring(0, cursorPosition)
|
||||||
|
+ (newLineBefore ? '\n' : '')
|
||||||
|
+ inlineFilename
|
||||||
|
+ (newLineAfter ? '\n' : '')
|
||||||
|
+ description.substring(cursorPosition, description.length)
|
||||||
|
);
|
||||||
|
|
||||||
|
$textarea.prop({
|
||||||
|
'selectionStart': cursorPosition + newLineBefore,
|
||||||
|
'selectionEnd': cursorPosition + inlineFilename.length + newLineBefore
|
||||||
|
});
|
||||||
|
$textarea.closest('.jstEditor')
|
||||||
|
.siblings('.jstElements')
|
||||||
|
.find('.jstb_img').click();
|
||||||
|
|
||||||
|
// move cursor into next line
|
||||||
|
cursorPosition = $textarea.prop('selectionStart');
|
||||||
|
$textarea.prop({
|
||||||
|
'selectionStart': cursorPosition + 1,
|
||||||
|
'selectionEnd': cursorPosition + 1
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$(document).ready(setupFileDrop);
|
$(document).ready(setupFileDrop);
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
$("input.deleted_attachment").change(function(){
|
$("input.deleted_attachment").change(function(){
|
||||||
|
|||||||
Reference in New Issue
Block a user