Replacement for textarea and expanding.
This commit is contained in:
parent
cb893c1b5b
commit
004fc87655
1 changed files with 204 additions and 0 deletions
204
app/assets/javascripts/app/lib/base/jquery.contenteditable.js
Normal file
204
app/assets/javascripts/app/lib/base/jquery.contenteditable.js
Normal file
|
@ -0,0 +1,204 @@
|
|||
(function ($) {
|
||||
|
||||
/*
|
||||
# mode: textonly/richtext / disable b/i/u/enter + strip on paste
|
||||
# pasteOnlyText: true
|
||||
# maxlength: 123
|
||||
# multiline: true / disable enter + strip on paste
|
||||
# placeholder: 'some placeholder'
|
||||
#
|
||||
*/
|
||||
|
||||
var DEFAULTS = {
|
||||
mode: 'richtext',
|
||||
multiline: true
|
||||
}
|
||||
var OPTIONS = {}
|
||||
|
||||
// add/remove placeholder
|
||||
var updatePlaceholder = function(target, type) {
|
||||
var text = target.text().trim()
|
||||
var placeholder = '<span class="placeholder">' + OPTIONS.placeholder + '</span>'
|
||||
|
||||
// add placholder if no text exists
|
||||
if ( type === 'add') {
|
||||
if ( !text ) {
|
||||
target.html( placeholder )
|
||||
}
|
||||
}
|
||||
|
||||
// empty placeholder text
|
||||
else {
|
||||
if ( text === OPTIONS.placeholder ) {
|
||||
setTimeout(function(){
|
||||
document.execCommand('selectAll', false, '');
|
||||
document.execCommand('delete', false, '');
|
||||
document.execCommand('selectAll', false, '');
|
||||
document.execCommand('removeFormat', false, '');
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// get correct val if textbox
|
||||
$.fn.ceg = function(option) {
|
||||
var options = $.extend({}, DEFAULTS, option)
|
||||
updatePlaceholder( this, 'remove' )
|
||||
|
||||
// get text
|
||||
if ( options.mode === 'textonly' ) {
|
||||
|
||||
// strip html signes if multi line exists
|
||||
if ( options.multiline ) {
|
||||
text = this.html()
|
||||
text = text.replace(/<br>/g, "\n") // new line as br
|
||||
text = text.replace(/<div>/g, "\n") // in some caes, new line als div
|
||||
text = $("<div>" + text + "</div>").text().trim()
|
||||
return text
|
||||
}
|
||||
return this.text().trim()
|
||||
}
|
||||
return this.html().trim()
|
||||
}
|
||||
|
||||
$.fn.ce = function(option) {
|
||||
var options = $.extend({}, DEFAULTS, option)
|
||||
options.placeholder = options.placeholder || this.data('placeholder')
|
||||
OPTIONS = options
|
||||
|
||||
// process placeholder
|
||||
if ( options.placeholder ) {
|
||||
updatePlaceholder( this, 'add' )
|
||||
this.bind('focus', function (e) {
|
||||
updatePlaceholder( $(e.target), 'remove' )
|
||||
})
|
||||
this.bind('blur', function (e) {
|
||||
updatePlaceholder( $(e.target), 'add' )
|
||||
})
|
||||
}
|
||||
|
||||
// maxlength check
|
||||
if ( options.maxlength ) {
|
||||
this.bind('keydown', function (e) {
|
||||
|
||||
// check maxlength
|
||||
length = $(e.target).text().length
|
||||
if ( length >= options.maxlength ) {
|
||||
switch ( e.keyCode ) {
|
||||
case 8: // backspace
|
||||
// just go ahead
|
||||
break;
|
||||
case 37: // up
|
||||
// just go ahead
|
||||
break;
|
||||
case 38: // right
|
||||
// just go ahead
|
||||
break;
|
||||
case 39: // down
|
||||
// just go ahead
|
||||
break;
|
||||
case 40: // left
|
||||
// just go ahead
|
||||
break;
|
||||
case 65: // a + ctrl - select all
|
||||
// just go ahead
|
||||
if ( e.ctrlKey || e.metaKey ) {
|
||||
break;
|
||||
}
|
||||
case 65: // x + ctrl - cut
|
||||
// just go ahead
|
||||
if ( e.ctrlKey || e.metaKey ) {
|
||||
break;
|
||||
}
|
||||
default:
|
||||
$(e.target).addClass('invalid')
|
||||
e.preventDefault()
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( $(e.target).hasClass('invalid') ) {
|
||||
$(e.target).removeClass('invalid')
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// just paste text
|
||||
if ( options.mode === 'textonly' ) {
|
||||
this.bind('paste', function (e) {
|
||||
var text = (e.originalEvent || e).clipboardData.getData('text/plain');
|
||||
if (text) {
|
||||
|
||||
// replace new lines
|
||||
if ( !options.multiline ) {
|
||||
text = text.replace(/\n/g, '')
|
||||
text = text.replace(/\r/g, '')
|
||||
text = text.replace(/\t/g, '')
|
||||
}
|
||||
|
||||
// limit length
|
||||
if ( options.maxlength ) {
|
||||
var pasteLength = text.length
|
||||
var currentLength = $(e.target).text().length
|
||||
var overSize = ( currentLength + pasteLength ) - options.maxlength
|
||||
if ( overSize > 0 ) {
|
||||
text = text.substr( 0, pasteLength - overSize )
|
||||
}
|
||||
}
|
||||
|
||||
// insert new text
|
||||
e.preventDefault()
|
||||
document.execCommand('inserttext', false, text);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
// disable rich text b/u/i
|
||||
if ( options.mode === 'textonly' ) {
|
||||
this.bind('keydown', function (e) {
|
||||
if ( e.ctrlKey || e.metaKey ) {
|
||||
switch ( e.keyCode ) {
|
||||
case 66: // b
|
||||
e.preventDefault()
|
||||
break;
|
||||
case 73: // i
|
||||
e.preventDefault()
|
||||
break;
|
||||
case 85: // u
|
||||
e.preventDefault()
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// disable multi line
|
||||
if ( !options.multiline ) {
|
||||
this.bind('keydown', function (e) {
|
||||
switch ( e.keyCode ) {
|
||||
case 13: // enter
|
||||
e.preventDefault()
|
||||
break;
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}(jQuery));
|
||||
|
||||
/* TODO: paste
|
||||
@$('.ticket-title-update').bind(
|
||||
'drop'
|
||||
(e) =>
|
||||
e.preventDefault()
|
||||
|
||||
t2 = e.originalEvent.dataTransfer.getData("text/plain")# : window.event.dataTransfer.getData("Text");
|
||||
|
||||
@log('drop', t2, e.keyCode, e.clipboardData, e, $(e.target).text().length)
|
||||
|
||||
document.execCommand('inserttext', false, '123123');
|
||||
#document.execCommand('inserttext', false, prompt('Paste something.'));
|
||||
)
|
||||
*/
|
Loading…
Reference in a new issue