-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Editable table with the use of editable-table. Patched so we can choo…
…se an editable column instead of whole table
- Loading branch information
Showing
3 changed files
with
150 additions
and
3 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
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,139 @@ | ||
// A tiny jQuery/Bootstrap widget that makes a HTML table editable | ||
// See https://github.com/mindmup/editable-table | ||
// Patched by FO: added a editable column option | ||
|
||
/*global $, window*/ | ||
$.fn.editableTableWidget = function (options) { | ||
'use strict'; | ||
return $(this).each(function () { | ||
var buildDefaultOptions = function () { | ||
var opts = $.extend({}, $.fn.editableTableWidget.defaultOptions); | ||
opts.editor = opts.editor.clone(); | ||
return opts; | ||
}, | ||
activeOptions = $.extend(buildDefaultOptions(), options), | ||
ARROW_LEFT = 37, ARROW_UP = 38, ARROW_RIGHT = 39, ARROW_DOWN = 40, ENTER = 13, ESC = 27, TAB = 9, | ||
element = $(this), | ||
editor = activeOptions.editor.css('position', 'absolute').hide().appendTo(element.parent()), | ||
column = activeOptions.column, | ||
active, | ||
showEditor = function (select) { | ||
active = element.find(':focus'); | ||
if (active.length) { | ||
editor.val(active.text()) | ||
.removeClass('error') | ||
.show() | ||
.offset(active.offset()) | ||
.css(active.css(activeOptions.cloneProperties)) | ||
.width(active.width()) | ||
.height(active.height()) | ||
.focus(); | ||
if (select) { | ||
editor.select(); | ||
} | ||
} | ||
}, | ||
setActiveText = function () { | ||
var text = editor.val(), | ||
evt = $.Event('change'), | ||
originalContent; | ||
if (active.text() === text || editor.hasClass('error')) { | ||
return true; | ||
} | ||
originalContent = active.html(); | ||
active.text(text).trigger(evt, text); | ||
if (evt.result === false) { | ||
active.html(originalContent); | ||
} | ||
}, | ||
movement = function (element, keycode) { | ||
if (keycode === ARROW_RIGHT) { | ||
return element.next('td'); | ||
} else if (keycode === ARROW_LEFT) { | ||
return element.prev('td'); | ||
} else if (keycode === ARROW_UP) { | ||
return element.parent().prev().children().eq(element.index()); | ||
} else if (keycode === ARROW_DOWN) { | ||
return element.parent().next().children().eq(element.index()); | ||
} | ||
return []; | ||
}; | ||
editor.blur(function () { | ||
setActiveText(); | ||
editor.hide(); | ||
}).keydown(function (e) { | ||
if (e.which === ENTER) { | ||
setActiveText(); | ||
editor.hide(); | ||
active.focus(); | ||
e.preventDefault(); | ||
e.stopPropagation(); | ||
} else if (e.which === ESC) { | ||
editor.val(active.text()); | ||
e.preventDefault(); | ||
e.stopPropagation(); | ||
editor.hide(); | ||
active.focus(); | ||
} else if (e.which === TAB) { | ||
active.focus(); | ||
} else if (this.selectionEnd - this.selectionStart === this.value.length) { | ||
var possibleMove = movement(active, e.which); | ||
if (possibleMove.length > 0) { | ||
possibleMove.focus(); | ||
e.preventDefault(); | ||
e.stopPropagation(); | ||
} | ||
} | ||
}) | ||
.on('input paste', function () { | ||
var evt = $.Event('validate'); | ||
active.trigger(evt, editor.val()); | ||
if (evt.result === false) { | ||
editor.addClass('error'); | ||
} else { | ||
editor.removeClass('error'); | ||
} | ||
}); | ||
element.find(column).on('click keypress dblclick', showEditor) | ||
.css('cursor', 'pointer') | ||
.keydown(function (e) { | ||
var prevent = true, | ||
possibleMove = movement($(e.target), e.which); | ||
if (possibleMove.length > 0) { | ||
possibleMove.focus(); | ||
} else if (e.which === ENTER) { | ||
showEditor(false); | ||
} else if (e.which === 17 || e.which === 91 || e.which === 93) { | ||
showEditor(true); | ||
prevent = false; | ||
} else { | ||
prevent = false; | ||
} | ||
if (prevent) { | ||
e.stopPropagation(); | ||
e.preventDefault(); | ||
} | ||
}); | ||
|
||
element.find(column).prop('tabindex', 1); | ||
|
||
$(window).on('resize', function () { | ||
if (editor.is(':visible')) { | ||
editor.offset(active.offset()) | ||
.width(active.width()) | ||
.height(active.height()); | ||
} | ||
}); | ||
}); | ||
|
||
}; | ||
$.fn.editableTableWidget.defaultOptions = { | ||
cloneProperties: ['padding', 'padding-top', 'padding-bottom', 'padding-left', 'padding-right', | ||
'text-align', 'font', 'font-size', 'font-family', 'font-weight', | ||
'border', 'border-top', 'border-bottom', 'border-left', 'border-right'], | ||
editor: $('<input>'), | ||
|
||
//FO: Added so we can target editable elements with the use of a class | ||
//For example 'td.editable' | ||
column: 'td' | ||
}; |
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