123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- /***
- Wrapper/Helper Class for datagrid based on jQuery Datatable Plugin
- ***/
- var Datatable = function() {
- var tableOptions; // main options
- var dataTable; // datatable object
- var table; // actual table jquery object
- var tableContainer; // actual table container object
- var tableWrapper; // actual table wrapper jquery object
- var tableInitialized = false;
- var ajaxParams = {}; // set filter mode
- var the;
- var countSelectedRecords = function() {
- var selected = $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).size();
- var text = tableOptions.dataTable.language.metronicGroupActions;
- if (selected > 0) {
- $('.table-group-actions > span', tableWrapper).text(text.replace("_TOTAL_", selected));
- } else {
- $('.table-group-actions > span', tableWrapper).text("");
- }
- };
- return {
- //main function to initiate the module
- init: function(options) {
- if (!$().dataTable) {
- return;
- }
- the = this;
- // default settings
- options = $.extend(true, {
- src: "", // actual table
- filterApplyAction: "filter",
- filterCancelAction: "filter_cancel",
- resetGroupActionInputOnSuccess: true,
- loadingMessage: 'Loading...',
- dataTable: {
- "dom": "<'row'<'col-md-8 col-sm-12'pli><'col-md-4 col-sm-12'<'table-group-actions pull-right'>>r><'table-scrollable't><'row'<'col-md-8 col-sm-12'pli><'col-md-4 col-sm-12'>>", // datatable layout
- "pageLength": 10, // default records per page
- "language": { // language settings
- // metronic spesific
- "metronicGroupActions": "_TOTAL_ records selected: ",
- "metronicAjaxRequestGeneralError": "Could not complete request. Please check your internet connection",
- // data tables spesific
- "lengthMenu": "<span class='seperator'>|</span>View _MENU_ records",
- "info": "<span class='seperator'>|</span>Found total _TOTAL_ records",
- "infoEmpty": "No records found to show",
- "emptyTable": "No data available in table",
- "zeroRecords": "No matching records found",
- "paginate": {
- "previous": "Prev",
- "next": "Next",
- "last": "Last",
- "first": "First",
- "page": "Page",
- "pageOf": "of"
- }
- },
- "orderCellsTop": true,
- "columnDefs": [{ // define columns sorting options(by default all columns are sortable extept the first checkbox column)
- 'orderable': false,
- 'targets': [0]
- }],
- "pagingType": "bootstrap_extended", // pagination type(bootstrap, bootstrap_full_number or bootstrap_extended)
- "autoWidth": false, // disable fixed width and enable fluid table
- "processing": false, // enable/disable display message box on record load
- "serverSide": true, // enable/disable server side ajax loading
- "ajax": { // define ajax settings
- "url": "", // ajax URL
- "type": "POST", // request type
- "timeout": 20000,
- "data": function(data) { // add request parameters before submit
- $.each(ajaxParams, function(key, value) {
- data[key] = value;
- });
- Metronic.blockUI({
- message: tableOptions.loadingMessage,
- target: tableContainer,
- overlayColor: 'none',
- cenrerY: true,
- boxed: true
- });
- },
- "dataSrc": function(res) { // Manipulate the data returned from the server
- if (res.customActionMessage) {
- Metronic.alert({
- type: (res.customActionStatus == 'OK' ? 'success' : 'danger'),
- icon: (res.customActionStatus == 'OK' ? 'check' : 'warning'),
- message: res.customActionMessage,
- container: tableWrapper,
- place: 'prepend'
- });
- }
- if (res.customActionStatus) {
- if (tableOptions.resetGroupActionInputOnSuccess) {
- $('.table-group-action-input', tableWrapper).val("");
- }
- }
- if ($('.group-checkable', table).size() === 1) {
- $('.group-checkable', table).attr("checked", false);
- $.uniform.update($('.group-checkable', table));
- }
- if (tableOptions.onSuccess) {
- tableOptions.onSuccess.call(undefined, the);
- }
- Metronic.unblockUI(tableContainer);
- return res.data;
- },
- "error": function() { // handle general connection errors
- if (tableOptions.onError) {
- tableOptions.onError.call(undefined, the);
- }
- Metronic.alert({
- type: 'danger',
- icon: 'warning',
- message: tableOptions.dataTable.language.metronicAjaxRequestGeneralError,
- container: tableWrapper,
- place: 'prepend'
- });
- Metronic.unblockUI(tableContainer);
- }
- },
- "drawCallback": function(oSettings) { // run some code on table redraw
- if (tableInitialized === false) { // check if table has been initialized
- tableInitialized = true; // set table initialized
- table.show(); // display table
- }
- Metronic.initUniform($('input[type="checkbox"]', table)); // reinitialize uniform checkboxes on each table reload
- countSelectedRecords(); // reset selected records indicator
- // callback for ajax data load
- if (tableOptions.onDataLoad) {
- tableOptions.onDataLoad.call(undefined, the);
- }
- }
- }
- }, options);
- tableOptions = options;
- // create table's jquery object
- table = $(options.src);
- tableContainer = table.parents(".table-container");
- // apply the special class that used to restyle the default datatable
- var tmp = $.fn.dataTableExt.oStdClasses;
- $.fn.dataTableExt.oStdClasses.sWrapper = $.fn.dataTableExt.oStdClasses.sWrapper + " dataTables_extended_wrapper";
- $.fn.dataTableExt.oStdClasses.sFilterInput = "form-control input-small input-sm input-inline";
- $.fn.dataTableExt.oStdClasses.sLengthSelect = "form-control input-xsmall input-sm input-inline";
- // initialize a datatable
- dataTable = table.DataTable(options.dataTable);
- // revert back to default
- $.fn.dataTableExt.oStdClasses.sWrapper = tmp.sWrapper;
- $.fn.dataTableExt.oStdClasses.sFilterInput = tmp.sFilterInput;
- $.fn.dataTableExt.oStdClasses.sLengthSelect = tmp.sLengthSelect;
- // get table wrapper
- tableWrapper = table.parents('.dataTables_wrapper');
- // build table group actions panel
- if ($('.table-actions-wrapper', tableContainer).size() === 1) {
- $('.table-group-actions', tableWrapper).html($('.table-actions-wrapper', tableContainer).html()); // place the panel inside the wrapper
- $('.table-actions-wrapper', tableContainer).remove(); // remove the template container
- }
- // handle group checkboxes check/uncheck
- $('.group-checkable', table).change(function() {
- var set = $('tbody > tr > td:nth-child(1) input[type="checkbox"]', table);
- var checked = $(this).is(":checked");
- $(set).each(function() {
- $(this).attr("checked", checked);
- });
- $.uniform.update(set);
- countSelectedRecords();
- });
- // handle row's checkbox click
- table.on('change', 'tbody > tr > td:nth-child(1) input[type="checkbox"]', function() {
- countSelectedRecords();
- });
- // handle filter submit button click
- table.on('click', '.filter-submit', function(e) {
- e.preventDefault();
- the.submitFilter();
- });
- // handle filter cancel button click
- table.on('click', '.filter-cancel', function(e) {
- e.preventDefault();
- the.resetFilter();
- });
- },
- submitFilter: function() {
- the.setAjaxParam("action", tableOptions.filterApplyAction);
- // get all typeable inputs
- $('textarea.form-filter, select.form-filter, input.form-filter:not([type="radio"],[type="checkbox"])', table).each(function() {
- the.setAjaxParam($(this).attr("name"), $(this).val());
- });
- // get all checkboxes
- $('input.form-filter[type="checkbox"]:checked', table).each(function() {
- the.addAjaxParam($(this).attr("name"), $(this).val());
- });
- // get all radio buttons
- $('input.form-filter[type="radio"]:checked', table).each(function() {
- the.setAjaxParam($(this).attr("name"), $(this).val());
- });
- dataTable.ajax.reload();
- },
- resetFilter: function() {
- $('textarea.form-filter, select.form-filter, input.form-filter', table).each(function() {
- $(this).val("");
- });
- $('input.form-filter[type="checkbox"]', table).each(function() {
- $(this).attr("checked", false);
- });
- the.clearAjaxParams();
- the.addAjaxParam("action", tableOptions.filterCancelAction);
- dataTable.ajax.reload();
- },
- getSelectedRowsCount: function() {
- return $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).size();
- },
- getSelectedRows: function() {
- var rows = [];
- $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).each(function() {
- rows.push($(this).val());
- });
- return rows;
- },
- setAjaxParam: function(name, value) {
- ajaxParams[name] = value;
- },
- addAjaxParam: function(name, value) {
- if (!ajaxParams[name]) {
- ajaxParams[name] = [];
- }
- skip = false;
- for (var i = 0; i < (ajaxParams[name]).length; i++) { // check for duplicates
- if (ajaxParams[name][i] === value) {
- skip = true;
- }
- }
- if (skip === false) {
- ajaxParams[name].push(value);
- }
- },
- clearAjaxParams: function(name, value) {
- ajaxParams = {};
- },
- getDataTable: function() {
- return dataTable;
- },
- getTableWrapper: function() {
- return tableWrapper;
- },
- gettableContainer: function() {
- return tableContainer;
- },
- getTable: function() {
- return table;
- }
- };
- };
|