diff --git a/features/slidingChild/js/sliding-child.js b/features/slidingChild/js/sliding-child.js new file mode 100644 index 0000000..237815a --- /dev/null +++ b/features/slidingChild/js/sliding-child.js @@ -0,0 +1,128 @@ +/** + * @summary SlidingChild + * @description Plug-in to show/hide row child data + * @version 1.0.0 + * @file slidingchild.js + * @author datahandler (www.datahandler.uk) + * @copyright Copyright datahandler (www.datahandler.uk) + * + * License MIT - http://datatables.net/license/mit + */ + +/** + * Example usage + * @example + * var table = $('#table_id').DataTable(); + * slidingChild = + * new $.fn.dataTable.SlidingChild(table, { + * ajax: { + * requestType: 'POST', + * requestUrl: '/Home/GetChildData', + * dataType: 'HTML', + * requestDataCallback: myRequestDataCallback + * } + * }); + */ +(function ($) { + var SlidingChild = function (dt, options) { + var opts = $.extend({}, SlidingChild.defaults, options); + + // bind to selector click + $(opts.selector).on('click', function () { + var $this = $(this); + var dtRow = $this.is('tr') ? $this : $this.closest('tr'); + + if (!dtRow.is('tr')) { return; } // throw error? + // check row belongs to this table? + + dtRow = dt.row(dtRow); + toggleChild(dtRow); + }); + + var toggleChild = function (dtRow) { + // if child already showing, close it. + if (dtRow.child.isShown()) { + closeChild(dtRow); + } + else { + // closes existing showing child, if any + if (opts.toggleChild) closeChild(dt.row('.shown')); + + showChildData(dtRow); + } + }; + // code borrowed from the resource at: https://datatables.net/blog/2014-10-02 + var closeChild = function (dtRow) { + if (dtRow) { + var showingRow = $(dtRow.node()); + $(opts.sliderSelector, dtRow.child()).slideUp(function () { + dtRow.child.remove(); + showingRow.removeClass('shown'); + $(dt.table().node()).trigger('childClosed', [dtRow]); + }); + } + }; + + var showChildData = function (dtRow) { + if (opts.useRowData) { + showChildDataFromRow(dtRow); + } + else { + $.ajax({ + type: opts.ajax.requestType, + url: opts.ajax.requestUrl, + beforeSend: function(xhr, settings) { + if (opts.ajax.requestDataCallback) { + this.data = opts.ajax.requestDataCallback(dtRow); + } + }, + contentType: opts.ajax.contentType, + dataType: opts.ajax.dataType, + success: function (response) { + var data = response; + if (opts.dataFormatCallback) { + data = opts.dataFormatCallback(response); + } + showChild(dtRow, data); + }, + error: function (response) { showChild(dtRow, response); } + }); + } + }; + + var showChildDataFromRow = function(dtRow) { + if (!opts.dataFormatCallback) { return; } // throw error? + var data = opts.dataFormatCallback(dtRow.data()); + showChild(dtRow, data); + } + + var showChild = function(dtRow, data) { + var selectedRow = $(dtRow.node()); + dtRow.child(data).show(); + + $(opts.sliderSelector, dtRow.child()).slideDown(function () { + selectedRow.addClass('shown'); + + $(dt.table().node()).trigger('childShown', [dtRow]); + }); + }; + }; + + SlidingChild.defaults = { + selector: "tr", + toggleChild: false, + useRowData: false, + ajax: { + requestType: "GET", + requestDataCallback: null, + requestUrl: null, + contentType: "application/json; charset=utf-8", + dataType: "json" + }, + dataFormatCallback: null, + sliderSelector: 'div.slider' + }; + + $.fn.dataTable.SlidingChild = SlidingChild; + $.fn.DataTable.SlidingChild = SlidingChild; +}(jQuery)); diff --git a/i18n/Kazakh.lang b/i18n/Kazakh.lang new file mode 100644 index 0000000..e78b3de --- /dev/null +++ b/i18n/Kazakh.lang @@ -0,0 +1,28 @@ +/** + * Kazakh translation + * @name Kazakh + * @anchor Kazakh + * @author Talgat Uspanov + */ + { + "processing": "Күте тұрыңыз...", + "search": "Іздеу:", + "lengthMenu": "Жазбалар _MENU_ көрсету", + "info": "_TOTAL_ жазбалары бойынша _START_ бастап _END_ дейінгі жазбалар", + "infoEmpty": "0 жазбалары бойынша 0 бастап 0 дейінгі жазбалар", + "infoFiltered": "(_MAX_ жазбасынан сұрыпталды)", + "infoPostFix": "", + "loadingRecords": "Жазбалар жүктемесі...", + "zeroRecords": "Жазбалар жоқ", + "emptyTable": "Кестеде деректер жоқ", + "paginate": { + "first": "Бірінші", + "previous": "Алдыңғысы", + "next": "Келесі", + "last": "Соңғы" + }, + "aria": { + "sortAscending": ": өсімі бойынша бағанды сұрыптау үшін активациялау", + "sortDescending": ": кемуі бойынша бағанды сұрыптау үшін активациялау" + } +} diff --git a/sorting/date-euro.js b/sorting/date-euro.js index 758fd5c..83aa8d2 100644 --- a/sorting/date-euro.js +++ b/sorting/date-euro.js @@ -1,5 +1,5 @@ /** - * This plug-in will provide date sorting for the "dd/mm/YYY hh:ii:ss" + * This plug-in will provide date sorting for the "dd/mm/YYYY hh:ii:ss" * formatting, which is common in France and other European countries. It can * also be quickly adapted for other formatting as required. Furthermore, this * date sorting plug-in allows for empty values in the column. @@ -8,8 +8,8 @@ * [datetime](//datatables.net/blog/2014-12-18) plug-in provides enhanced * functionality and flexibility. * - * @name Date (dd/mm/YYY hh:ii:ss) - * @summary Sort date / time in the format `dd/mm/YYY hh:ii:ss` + * @name Date (dd/mm/YYYY hh:ii:ss) + * @summary Sort date / time in the format `dd/mm/YYYY hh:ii:ss` * @author [Ronan Guilloux](http://coolforest.net/) * @deprecated * @@ -29,7 +29,7 @@ var frDatea = $.trim(a).split(' '); var frTimea = (undefined != frDatea[1]) ? frDatea[1].split(':') : [00,00,00]; var frDatea2 = frDatea[0].split('/'); - x = (frDatea2[2] + frDatea2[1] + frDatea2[0] + frTimea[0] + frTimea[1] + frTimea[2]) * 1; + x = (frDatea2[2] + frDatea2[1] + frDatea2[0] + frTimea[0] + frTimea[1] + ((undefined != frTimea[2]) ? frTimea[2] : 0)) * 1; } else { x = Infinity;