Repository: pontikis/bs_grid Branch: master Commit: d5125e5f0a24 Files: 16 Total size: 86.8 KB Directory structure: gitextract_kduqh04n/ ├── .gitignore ├── CHANGELOG.md ├── MIT_LICENSE ├── README.md ├── bs_grid.jquery.json ├── jquery.bs_grid.bs2.css ├── jquery.bs_grid.css ├── jquery.bs_grid.js ├── localization/ │ ├── el.bs2.js │ ├── el.js │ ├── en.bs2.js │ ├── en.js │ ├── ru.bs2.js │ └── ru.js └── server_side/ └── php/ ├── ajax_page_data.dist.php └── bs_grid.php ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # JetBrains phpStorm IDE files ------------------------------------------------- /.idea/* # ------------------------------------------------------------------------------ ================================================ FILE: CHANGELOG.md ================================================ bs_grid ======= bs_grid is a jQuery Datagrid plugin, based on Twitter Bootstrap. Project page: [https://www.pontikis.net/labs/bs_grid][HOME] [HOME]: http://www.pontikis.net/labs/bs_grid Copyright Christos Pontikis [http://www.pontikis.net][copyright] [copyright]: http://www.pontikis.net License [MIT][mit] [mit]: https://raw.github.com/pontikis/bs_grid/master/MIT_LICENSE Release 0.9.2 (28 May 2014) --------------------------- * Set rules (predefined filters) * Take and Restore snapshots (`takeSnapshot` and `restoreSnapshot` methods) Release 0.9.1 (09 May 2014) --------------------------- * Created for Bootstrap 3 (Bootstrap 2 supported) * Responsive web design * Fully configurable * Get data in JSON format using AJAX (any server-side technology) * A php class is provided for server side operations * Change columns order * Show/hide columns * Style columns * Simple column sorting with a click * Flexible data sorting (multi-column) * Single or multiple row selection * Powerful pagination * Powerful filters (Query builder) * Multiple instances in same page * Localization ================================================ FILE: MIT_LICENSE ================================================ Copyright (c) 2014 Christos Pontikis, http://www.pontikis.net Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ bs_grid ======= bs_grid is a jQuery Datagrid plugin, based on Twitter Bootstrap. Copyright Christos Pontikis [http://www.pontikis.net][copyright] [copyright]: http://www.pontikis.net License [MIT][mit] [mit]: https://raw.github.com/pontikis/bs_grid/master/MIT_LICENSE Release: 0.9.2 (28 May 2014) - View CHANGELOG [here][CHANGELOG] [CHANGELOG]: https://raw.github.com/pontikis/bs_grid/master/CHANGELOG.md Project page ----------- [http://www.pontikis.net/labs/bs_grid][HOME] [HOME]: http://www.pontikis.net/labs/bs_grid Demo ---- [http://www.pontikis.net/labs/bs_grid/demo][DEMO] [DEMO]: http://www.pontikis.net/labs/bs_grid/demo Documentation ------------- [http://www.pontikis.net/labs/bs_grid/docs][DOCS] [DOCS]: http://www.pontikis.net/labs/bs_grid/docs Support Forum ------------- [http://www.pontikis.net/bbs][FORUM] [FORUM]: http://www.pontikis.net/bbs Download -------- Download [here][DOWNLOAD] [DOWNLOAD]: https://github.com/pontikis/bs_grid/archive/master.zip Screenshots ----------- ![bs_grid sample1][sample1] [sample1]: https://raw.github.com/pontikis/bs_grid/master/screenshots/sample1.png ================================================ FILE: bs_grid.jquery.json ================================================ { "name": "bs_grid", "version": "0.9.2", "title": "Bootstrap Datagrid", "author": { "name": "Christos Pontikis", "email": "christos@pontikis.net", "url": "http://www.pontikis.net" }, "licenses": [ { "type": "MIT", "url": "https://raw.github.com/pontikis/bs_grid/master/MIT_LICENSE" } ], "dependencies": { "jquery": ">=1.8", "bs_pagination": ">=1.0.2", "jui_filter_rules": ">=1.0.5", "momentjs": ">=2.2.1" }, "description": "bs_grid is a jQuery Datagrid plugin, based on Twitter Bootstrap. Advanced row selection, sorting, pagination and filtering. Fully customizable, responsive web design, localization.", "homepage": "http://www.pontikis.net/labs/bs_grid", "docs": "http://www.pontikis.net/labs/bs_grid/docs", "demo": "http://www.pontikis.net/labs/bs_grid/demo", "download": "https://github.com/pontikis/bs_grid/archive/master.zip", "keywords": [ "grid", "datagrid", "table", "database", "paging", "sorting", "searching", "responsive", "bootstrap", "ui" ], "bugs": "https://github.com/pontikis/bs_grid/issues" } ================================================ FILE: jquery.bs_grid.bs2.css ================================================ /* * bs_grid v0.9.2 CSS (for Bootstrap 2) **************************************** */ /* DO NOT CHANGE this file, as it will be overwritten in next update. Write your own classes in other css file. */ .tools { height: 32px; } .col-checkbox { margin-top: 0 !important; } .columns-label { margin-top: 3px; margin-bottom: 3px; font-weight: normal; } .columns-li-padding { padding: 3px 20px; } .sorting-name { display: inline-block; padding-left: 20px; margin-top: 3px; margin-bottom: 3px; vertical-align: middle; padding-top: 5px; } .selected-rows { margin-left: 5px; margin-right: 2px; text-align: right; } .th-common { cursor: pointer; } .no-records-found { text-align: center; } .pagination-container { padding: 7px 7px 5px 7px !important; } .filters-container { padding: 0 7px 10px 7px !important; } .filters-button { margin: 0 3px; } /* Large desktop */ @media (min-width: 1200px) { } /* Portrait tablet to landscape and desktop */ @media (min-width: 768px) and (max-width: 979px) { } /* Landscape phone to portrait tablet */ @media (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-x: scroll; overflow-y: hidden; -webkit-overflow-scrolling: touch; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } /* Landscape phones and down */ @media (max-width: 480px) { } ================================================ FILE: jquery.bs_grid.css ================================================ /* * bs_grid v0.9.2 CSS ********************************************************** */ /* DO NOT CHANGE this file, as it will be overwritten in next update. Write your own classes in other css file. */ /* bootstrap "xs": Extra small devices (phones, less than 768px) */ /* No media query since this is the default in Bootstrap */ .tools { height: 38px; } .col-checkbox { margin-top: 0 !important; } .columns-label { margin-top: 3px; margin-bottom: 3px; font-weight: normal; } .columns-li-padding { padding: 3px 20px; } .sorting-name { display: inline-block; padding-left: 20px; margin-top: 3px; margin-bottom: 3px; vertical-align: middle; } .selected-rows { margin-left: 5px; margin-right: 2px; text-align: right; } .th-common { cursor: pointer; } .no-records-found { text-align: center; } .pagination-container { padding: 7px 7px 5px 7px !important; } .filters-container { padding: 0 7px 10px 7px !important; } .filters-button { margin: 0 3px; } /* bootstrap "sm": Small devices (tablets, 768px and up) */ @media (min-width: 768px) { } /* bootstrap "md": Medium devices (desktops, 992px and up) */ @media (min-width: 992px) { } /* bootstrap "lg": Large devices (large desktops, 1200px and up) */ @media (min-width: 1200px) { } ================================================ FILE: jquery.bs_grid.js ================================================ /** * @fileOverview bs_grid is a jQuery datagrid plugin based on Twitter Bootstrap. *

License MIT *
Copyright Christos Pontikis http://www.pontikis.net *
Project page http://www.pontikis.net/labs/bs_grid/ * @version 0.9.2 (28 May 2014) * @author Christos Pontikis http://www.pontikis.net * @requires jquery >= 1.8, twitter bootstrap >= 2, bs_pagination plugin, jQuery UI sortable (optional), jui_filter_rules plugin >= 1.0.4 (optional) */ /** * See http://jquery.com. * @name $ * @class * See the jQuery Library (http://jquery.com) for full details. This just * documents the function and classes that are added to jQuery by this plug-in. */ /** * See http://jquery.com * @name fn * @class * See the jQuery Library (http://jquery.com) for full details. This just * documents the function and classes that are added to jQuery by this plug-in. * @memberOf $ */ /** * Pseudo-Namespace containing bs_grid private methods (for documentation purposes) * @name _private_methods * @namespace */ "use strict"; (function($) { var pluginName = "bs_grid", pluginGivenOptions = "bs_grid_given_options", pluginStatus = "bs_grid_status"; // public methods var methods = { /** * @lends $.fn.bs_grid */ init: function(options) { var elem = this; return this.each(function() { /** * store given options on first launch (in new object - no reference) */ if(typeof elem.data(pluginGivenOptions) === "undefined") { elem.data(pluginGivenOptions, $.extend(true, {}, options)); } /** * settings and defaults * settings modification will affect elem.data(pluginName) and vice versa */ var settings = elem.data(pluginName); if(typeof settings === "undefined") { var bootstrap_version = "3"; if(options.hasOwnProperty("bootstrap_version") && options["bootstrap_version"] == "2") { bootstrap_version = "2"; } var defaults = methods.getDefaults.call(elem, bootstrap_version); // deep merge ('true' arg) is required, as there are object attibutes (paginationOptions, filterOptions) settings = $.extend(true, {}, defaults, options); } else { settings = $.extend(true, {}, settings, options); } elem.data(pluginName, settings); // initialize plugin status if(typeof elem.data(pluginStatus) === "undefined") { elem.data(pluginStatus, {}); } if(!settings.row_primary_key) { settings.selected_ids = []; } else { switch(settings.rowSelectionMode) { case "single": if(settings.selected_ids.length > 1) { settings.selected_ids = []; } break; case false: settings.selected_ids = []; break; } } var container_id = elem.attr("id"); // apply container style elem.removeClass().addClass(settings.containerClass); // bind events elem.unbind("onCellClick").bind("onCellClick", settings.onCellClick); elem.unbind("onRowClick").bind("onRowClick", settings.onRowClick); elem.unbind("onDatagridError").bind("onDatagridError", settings.onDatagridError); elem.unbind("onDebug").bind("onDebug", settings.onDebug); elem.unbind("onDisplay").bind("onDisplay", settings.onDisplay); // initialize plugin html var tools_id = create_id(settings.tools_id_prefix, container_id), columns_list_id = create_id(settings.columns_list_id_prefix, container_id), default_columns_list = "", sorting_list_id = create_id(settings.sorting_list_id_prefix, container_id), default_sorting_list = "", sorting_radio_name = create_id(settings.sorting_radio_name_prefix, container_id) + "_", startPos, newPos, selected_rows_id = create_id(settings.selected_rows_id_prefix, container_id), selection_list_id = create_id(settings.selection_list_id_prefix, container_id), table_container_id = create_id(settings.table_container_id_prefix, container_id), table_id = create_id(settings.table_id_prefix, container_id), no_results_id = create_id(settings.no_results_id_prefix, container_id), filter_toggle_id = create_id(settings.filter_toggle_id_prefix, container_id), custom_html1_id = create_id(settings.custom_html1_id_prefix, container_id), custom_html2_id = create_id(settings.custom_html2_id_prefix, container_id), pagination_id = create_id(settings.pagination_id_prefix, container_id), filter_container_id = create_id(settings.filter_container_id_prefix, container_id), filter_rules_id = create_id(settings.filter_rules_id_prefix, container_id), filter_tools_id = create_id(settings.filter_tools_id_prefix, container_id), elem_html = "", tools_html = ""; // create basic html structure --------------------------------- elem_html += '

'; elem_html += '
'; elem_html += '
'; elem_html += '
'; elem_html += '
' + rsc_bs_dg.no_records_found + '
'; if(settings.customHTMLelementID1) { elem_html += '
'; } elem_html += '
'; if(settings.customHTMLelementID2) { elem_html += '
'; } if(settings.useFilters) { elem_html += '
'; elem_html += '
'; elem_html += '
'; elem_html += ''; elem_html += ''; elem_html += '
'; } elem_html += '
'; elem.html(elem_html); $("#" + no_results_id).hide(); var elem_tools = $("#" + tools_id), elem_table = $("#" + table_id), elem_pagination = $("#" + pagination_id); // create toolbar ---------------------------------------------- // columns list tools_html += '
'; tools_html += ''; tools_html += ''; tools_html += '
'; // sorting list ------------------------------------------------ tools_html += '
'; tools_html += ''; tools_html += ''; tools_html += '
'; // selection list ---------------------------------------------- if(settings.row_primary_key && (settings.rowSelectionMode == "single" || settings.rowSelectionMode == "multiple")) { tools_html += '
'; tools_html += ''; tools_html += ''; tools_html += '
'; } // filter toggle button ---------------------------------------- if(settings.useFilters) { tools_html += ''; } elem_tools.html(tools_html); // initialize grid --------------------------------------------- var grid_init = methods.displayGrid.call(elem, false); /** * EVENTS ****************************************************** */ //TOOLS - columns list ----------------------------------------- var elem_columns_list = $("#" + columns_list_id); // Prevent closing on click elem_columns_list.click(function(e) { e.stopPropagation(); }); // show - hide column elem_columns_list.off("click", "input[type=checkbox]").on("click", "input[type=checkbox]", function() { var col_index = $($("#" + columns_list_id + " li input[type=checkbox]")).index(this); if(col_index < col_list_len) { var checked_columns = $("#" + columns_list_id + " li").not(".not-sortable").find("input[type=checkbox]:checked").length; if(checked_columns == 1) { $("#" + columns_list_id + " li input[type=checkbox]:checked:first").slice(0, col_list_len).attr("disabled", true); } else { $("#" + columns_list_id + " li input[type=checkbox]").slice(0, col_list_len).removeAttr("disabled"); } set_column_visible(settings.columns[col_index], $(this).is(":checked")); } else { // show - hide row index settings.showRowNumbers = $(this).is(":checked"); } methods.displayGrid.call(elem, false); }); // change column index if(settings.useSortableLists) { if(col_list_len > 2) { elem_columns_list.sortable({ items: "li:not(.not-sortable)", start: function(event, ui) { startPos = ui.item.index(); }, stop: function(event, ui) { newPos = ui.item.index(); if(newPos !== startPos) { array_move(settings.columns, startPos, newPos); methods.displayGrid.call(elem, false); } } }); } } // display default columns elem_columns_list.off("click", "li:last button").on("click", "li:last button", function() { for(var i in elem.data(pluginGivenOptions)["columns"]) { settings.columns[i] = $.extend(true, {}, elem.data(pluginGivenOptions)["columns"][i]); } var checked = elem.data(pluginGivenOptions)["showRowNumbers"]; if(typeof checked === "undefined") { checked = methods.getDefaults.call(elem, settings.bootstrap_version)["showRowNumbers"]; } settings.showRowNumbers = checked; elem_columns_list.html(elem.data(pluginStatus)["default_columns_list"]); methods.displayGrid.call(elem, false); }); // TOOLS - sorting list ---------------------------------------- var elem_sorting_list = $("#" + sorting_list_id), sort_len = settings.sorting.length; // Prevent closing on click elem_sorting_list.click(function(e) { e.stopPropagation(); }); // change sorting type elem_sorting_list.off("click", "input[type=radio]").on("click", "input[type=radio]", function() { var radio_index = $($("#" + sorting_list_id + " li input[type=radio]")).index(this), sorting_index = Math.floor(radio_index / 3), sorting_type = ""; switch(radio_index % 3) { case 0: sorting_type = "ascending"; break; case 1: sorting_type = "descending"; break; case 2: sorting_type = "none"; break; } if(settings.sorting[sorting_index]["order"] != sorting_type) { settings.sorting[sorting_index]["order"] = sorting_type; methods.displayGrid.call(elem, false); } }); // change sorting index if(settings.useSortableLists) { if(sort_len > 2) { elem_sorting_list.sortable({ items: "li:not(.not-sortable)", start: function(event, ui) { startPos = ui.item.index(); }, stop: function(event, ui) { newPos = ui.item.index(); if(newPos !== startPos) { array_move(settings.sorting, startPos, newPos); methods.displayGrid.call(elem, false); } } }); } } // display default sorting elem_sorting_list.off("click", "li:last button").on("click", "li:last button", function() { for(var i in elem.data(pluginGivenOptions)["sorting"]) { settings.sorting[i] = $.extend(true, {}, elem.data(pluginGivenOptions)["sorting"][i]); } elem_sorting_list.html(elem.data(pluginStatus)["default_sorting_list"]); methods.displayGrid.call(elem, false); }); // row selection ----------------------------------------------- if(settings.row_primary_key && (settings.rowSelectionMode == "single" || settings.rowSelectionMode == "multiple")) { var row_prefix_len = (table_id + "_tr_").length; // click on row elem_table.off("click", "tbody tr").on("click", "tbody tr", function() { var row_id = parseInt($(this).attr("id").substr(row_prefix_len)), row_status, idx = methods.selectedRows.call(elem, "selected_index", row_id); if(idx > -1) { methods.selectedRows.call(elem, "remove_id", idx); methods.selectedRows.call(elem, "mark_deselected", row_id); row_status = "deselected"; } else { if(settings.rowSelectionMode == "single") { methods.selectedRows.call(elem, "clear_all_ids"); methods.selectedRows.call(elem, "mark_page_deselected"); } methods.selectedRows.call(elem, "add_id", row_id); methods.selectedRows.call(elem, "mark_selected", row_id); row_status = "selected"; } // update selected rows counter methods.selectedRows.call(elem, "update_counter"); elem.triggerHandler("onRowClick", {row_id: row_id, row_status: row_status}); }); // selection list var elem_selection_list = $("#" + selection_list_id); elem_selection_list.off("click", "li").on("click", "li", function() { var sel_index = $(this).index(); if(settings.rowSelectionMode == "single") { methods.selectedRows.call(elem, "clear_all_ids"); methods.selectedRows.call(elem, "mark_page_deselected"); } else if(settings.rowSelectionMode == "multiple") { var selector_table_tr = "#" + table_id + " tbody tr", row_prefix_len = (table_id + "_tr_").length, row_id, idx; switch(sel_index) { case 0: $(selector_table_tr).each(function() { row_id = parseInt($(this).attr("id").substr(row_prefix_len)); idx = methods.selectedRows.call(elem, "selected_index", row_id); if(idx == -1) { methods.selectedRows.call(elem, "add_id", row_id); } }); methods.selectedRows.call(elem, "mark_page_selected"); break; case 1: $(selector_table_tr).each(function() { row_id = parseInt($(this).attr("id").substr(row_prefix_len)); idx = methods.selectedRows.call(elem, "selected_index", row_id); if(idx > -1) { methods.selectedRows.call(elem, "remove_id", idx); } }); methods.selectedRows.call(elem, "mark_page_deselected"); break; case 2: $(selector_table_tr).each(function() { row_id = parseInt($(this).attr("id").substr(row_prefix_len)); idx = methods.selectedRows.call(elem, "selected_index", row_id); if(idx > -1) { methods.selectedRows.call(elem, "remove_id", idx); } else { methods.selectedRows.call(elem, "add_id", row_id); } }); methods.selectedRows.call(elem, "mark_page_inversed"); break; case 4: methods.selectedRows.call(elem, "clear_all_ids"); methods.selectedRows.call(elem, "mark_page_deselected"); break; } } // update selected rows counter methods.selectedRows.call(elem, "update_counter"); }); } // click on cell ----------------------------------------------- elem_table.off("click", "tbody tr td").on("click", "tbody tr td", function() { var col_index = $(this).index(); var row_index = $(this).parent("tr").index(); elem.triggerHandler("onCellClick", {col: col_index, row: row_index}); }); // simple columns sorting -------------------------------------- elem_table.off("click", "thead th").on("click", "thead th", function() { var th_index = $(this).index(), th_text = $(this).text(); if(settings.showRowNumbers) { if(th_index == 0) { return false; } else { th_index--; } } // get column field var visible_index = -1, th_field = "", th_sortable = false; for(var i in settings.columns) { if(column_is_visible(settings.columns[i])) { visible_index++; if(visible_index == th_index) { th_field = settings.columns[i].field; th_sortable = column_is_sortable(settings.columns[i]); break; } } } if(!th_sortable) { return false; } if(th_field) { // get sorting order for this field (if any) var current_order = "", new_order; for(var i in settings.sorting) { if(settings.sorting[i].field == th_field) { current_order = settings.sorting[i].order; break; } } switch(current_order) { case "ascending": new_order = "descending"; break; case "descending": new_order = "none"; break; case "none": new_order = "ascending"; break; default: new_order = "ascending"; } settings.sorting = [ { sortingName: th_text, field: th_field, order: new_order } ]; // update sorting list var checked_asc = new_order == "ascending" ? " checked" : "", checked_desc = new_order == "descending" ? " checked" : "", checked_none = new_order == "none" ? " checked" : ""; var sorting_list_html = '
  • ' + '' + '' + '' + '' + th_text + '' + '
  • '; sorting_list_html += '
  • '; sorting_list_html += '
  • '; elem_sorting_list.html(sorting_list_html); // display grid methods.displayGrid.call(elem, false); } }); // PAGINATION -------------------------------------------------- $.when(grid_init).then(function(data, textStatus, jqXHR) { var total_rows = data["total_rows"]; var pagination_options = settings.paginationOptions, bs_grid_pagination_options = { // defined by bs_grid currentPage: settings.pageNum, rowsPerPage: settings.rowsPerPage, maxRowsPerPage: settings.maxRowsPerPage, totalPages: Math.ceil(total_rows / settings.rowsPerPage), totalRows: total_rows, bootstrap_version: settings.bootstrap_version, onChangePage: function(event, params) { settings.pageNum = params.currentPage; settings.rowsPerPage = params.rowsPerPage; methods.displayGrid.call(elem, false); } }; $.extend(pagination_options, bs_grid_pagination_options); elem_pagination.bs_pagination(pagination_options); // custom html --------------------------------------------- // (not an event, but page renders better displaying custom html after grid rendering) if(settings.customHTMLelementID1) { $("#" + custom_html1_id).html($("#" + settings.customHTMLelementID1).html()); } if(settings.customHTMLelementID2) { $("#" + custom_html2_id).html($("#" + settings.customHTMLelementID2).html()); } }); // FILTERS ----------------------------------------------------- if(settings.useFilters) { var elem_filter_toggle = $("#" + filter_toggle_id), elem_filter_container = $("#" + filter_container_id), elem_filter_rules = $("#" + filter_rules_id), elem_filter_tools = $("#" + filter_tools_id); // initialize jui_filter_rules plugin ---------------------- var filter_options = settings.filterOptions, bs_grid_internal_filter_options = { bootstrap_version: settings.bootstrap_version, onValidationError: function(event, data) { elem.triggerHandler("onDatagridError", data); }, onSetRules: function() { } }; filter_options = $.extend({}, filter_options, bs_grid_internal_filter_options); elem_filter_rules.jui_filter_rules(filter_options); if(filter_options.filter_rules.length > 0) { elem_filter_container.show(); } else { elem_filter_container.hide(); } /* filter toogle */ elem_tools.off("click", "#" + filter_toggle_id).on("click", "#" + filter_toggle_id, function() { if(elem_filter_container.is(":visible")) { elem_filter_container.slideUp(); if(settings.filterOptions.filter_rules.length > 0) { // mark filter toggle as active elem_filter_toggle.addClass(settings.filterToggleActiveClass); } } else { elem_filter_container.slideDown(); // mark filter toggle as inactive elem_filter_toggle.removeClass(settings.filterToggleActiveClass); } }); /* filter tools */ elem_filter_tools.off("click", "button").on("click", "button", function() { var btn_index = $(this).index(), a_rules = elem_filter_rules.jui_filter_rules("getRules", 0, []); if(a_rules == false) { return false; } switch(btn_index) { case 0: //elem_filter_rules.jui_filter_rules("markAllRulesAsApplied"); settings.filterOptions.filter_rules = a_rules; // Reset selected rows settings.selected_ids = []; break; case 1: elem_filter_rules.jui_filter_rules("clearAllRules"); settings.filterOptions.filter_rules = []; break; } settings.pageNum = 1; methods.displayGrid.call(elem, true); }); } }); }, /** * Get plugin version * @returns {string} */ getVersion: function() { return "0.9.2"; }, /** * Get default values * @example $(element).bs_grid("getDefaults", "3"); * @return {Object} */ getDefaults: function(bootstrap_version) { var default_settings = { pageNum: 1, rowsPerPage: 10, maxRowsPerPage: 100, row_primary_key: "", rowSelectionMode: "single", // "multiple", "single", false selected_ids: [], /** * MANDATORY PROPERTIES: field * UNIQUE PROPERTIES: field * {field: "customer_id", header: "Code", visible: "no", is_function: "no", "headerClass": "th_code hidden-xs", "dataClass": "td_code hidden-xs"}, */ columns: [], /** * MANDATORY PROPERTIES: field, order * UNIQUE PROPERTIES: field * order is one of "ascending", "descending", "none" * {sortingName: "Code", field: "customer_id", order: "none"}, */ sorting: [], /** * See bs_pagination plugin documentation */ paginationOptions: { containerClass: "well pagination-container", visiblePageLinks: 5, showGoToPage: true, showRowsPerPage: true, showRowsInfo: true, showRowsDefaultInfo: true, disableTextSelectionInNavPane: true }, // "currentPage", "rowsPerPage", "maxRowsPerPage", "totalPages", "totalRows", "bootstrap_version", "onChangePage" will be ignored /** * See jui_filter_rules plugin documentation */ filterOptions: { filters: [], filter_rules: [] }, // "bootstrap_version", "onSetRules", "onValidationError" will be ignored useFilters: true, showRowNumbers: false, showSortingIndicator: true, useSortableLists: true, customHTMLelementID1: "", customHTMLelementID2: "", /* STYLES ----------------------------------------------------*/ bootstrap_version: "3", // bs 3 containerClass: "grid_container", noResultsClass: "alert alert-warning no-records-found", toolsClass: "tools", columnsListLaunchButtonClass: "btn btn-default dropdown-toggle", columnsListLaunchButtonIconClass: "glyphicon glyphicon-th", columnsListClass: "dropdown-menu dropdown-menu-right", columnsListLabelClass: "columns-label", columnsListCheckClass: "col-checkbox", columnsListDividerClass: "divider", columnsListDefaultButtonClass: "btn btn-primary btn-xs btn-block", sortingListLaunchButtonIconClass: "glyphicon glyphicon-sort", sortingLabelCheckboxClass: "radio-inline", sortingNameClass: "sorting-name", selectButtonIconClass: "glyphicon glyphicon-check", selectedRowsClass: "selected-rows", filterToggleButtonIconClass: "glyphicon glyphicon-filter", filterToggleActiveClass: "btn-info", sortingIndicatorAscClass: "glyphicon glyphicon-chevron-up text-muted", sortingIndicatorDescClass: "glyphicon glyphicon-chevron-down text-muted", dataTableContainerClass: "table-responsive", dataTableClass: "table table-bordered table-hover", commonThClass: "th-common", selectedTrClass: "warning", filterContainerClass: "well filters-container", filterToolsClass: "", filterApplyBtnClass: "btn btn-primary btn-sm filters-button", filterResetBtnClass: "btn btn-default btn-sm filters-button", // prefixes tools_id_prefix: "tools_", columns_list_id_prefix: "columns_list_", sorting_list_id_prefix: "sorting_list_", sorting_radio_name_prefix: "sort_radio_", selected_rows_id_prefix: "selected_rows_", selection_list_id_prefix: "selection_list_", filter_toggle_id_prefix: "filter_toggle_", table_container_id_prefix: "tbl_container_", table_id_prefix: "tbl_", no_results_id_prefix: "no_res_", custom_html1_id_prefix: "custom1_", custom_html2_id_prefix: "custom2_", pagination_id_prefix: "pag_", filter_container_id_prefix: "flt_container_", filter_rules_id_prefix: "flt_rules_", filter_tools_id_prefix: "flt_tools_", // misc debug_mode: "no", // events onCellClick: function() { }, onRowClick: function() { }, onDatagridError: function() { }, onDebug: function() { }, onDisplay: function() { } }; if(bootstrap_version == "2") { default_settings.bootstrap_version = "2"; // bs 2 default_settings.columnsListLaunchButtonIconClass = "icon-th"; default_settings.sortingListLaunchButtonIconClass = "icon-resize-vertical"; default_settings.sortingLabelCheckboxClass = "radio inline"; default_settings.selectButtonIconClass = "icon-check"; default_settings.filterToggleButtonIconClass = "icon-filter"; default_settings.filterToggleActiveClass = "btn-info"; default_settings.sortingIndicatorAscClass = "icon-chevron-up muted"; default_settings.sortingIndicatorDescClass = "icon-chevron-down muted"; default_settings.dataTableContainerClass = "table-responsive"; default_settings.dataTableClass = "table table-bordered table-hover"; default_settings.filterApplyBtnClass = "btn btn-primary filters-button "; default_settings.filterResetBtnClass = "btn btn-default filters-button"; } return default_settings; }, /** * Get any option set to plugin using its name (as string) * * @example $(element).bs_grid("getOption", some_option); * @param {String} opt * @return {*} */ getOption: function(opt) { var elem = this; return elem.data(pluginName)[opt]; }, /** * Get all options * @example $(element).bs_grid("getAllOptions"); * @return {*} */ getAllOptions: function() { var elem = this; return elem.data(pluginName); }, /** * Destroy plugin * @example $(element).bs_grid("destroy"); */ destroy: function() { var elem = this, container_id = elem.attr("id"), pagination_container_id = create_id(methods.getOption.call(elem, "pagination_id_prefix"), container_id), filter_rules_id = create_id(methods.getOption.call(elem, "filter_rules_id_prefix"), container_id); $("#" + pagination_container_id).removeData(); $("#" + filter_rules_id).removeData(); elem.removeData(); }, /** * * @param {string} action * @param {int} id the id or its (zero based) index in selected IDs * @returns {*} */ selectedRows: function(action, id) { var elem = this, container_id = elem.attr("id"), s = methods.getAllOptions.call(elem), table_id = create_id(methods.getOption.call(elem, "table_id_prefix"), container_id), selectedTrClass = methods.getOption.call(elem, "selectedTrClass"), selector_table_tr = "#" + table_id + " tbody tr", table_tr_prefix = "#" + table_id + "_tr_"; switch(action) { case "get_ids": return s.selected_ids; break; case "clear_all_ids": s.selected_ids = []; break; case "update_counter": var selected_rows_id = create_id(methods.getOption.call(elem, "selected_rows_id_prefix"), container_id); $("#" + selected_rows_id).text(s.selected_ids.length); break; case "selected_index": return $.inArray(id, s.selected_ids); break; case "add_id": s.selected_ids.push(id); break; case "remove_id": s.selected_ids.splice(id, 1); break; case "mark_selected": $(table_tr_prefix + id).addClass(selectedTrClass); break; case "mark_deselected": $(table_tr_prefix + id).removeClass(selectedTrClass); break; case "mark_page_selected": $(selector_table_tr).addClass(selectedTrClass); break; case "mark_page_deselected": $(selector_table_tr).removeClass(selectedTrClass); break; case "mark_page_inversed": $(selector_table_tr).toggleClass(selectedTrClass); break; } }, /** * Set a class to page column * @example $(element).bs_grid("setPageColClass", 1, "headerClass", "dataClass"); * @param {Number} col_index * @param {String} headerClass * @param {String} dataClass */ setPageColClass: function(col_index, headerClass, dataClass) { var elem = this, container_id = elem.attr("id"), data_table_selector = "#" + create_id(methods.getOption.call(elem, "table_id_prefix"), container_id); if(headerClass !== "") { $(data_table_selector + " th").eq(col_index).addClass(headerClass); } if(dataClass !== "") { $(data_table_selector + " tr").each(function() { $(this).find("td").eq(col_index).addClass(dataClass); }); } }, /** * Set a class to page column * @example $(element).bs_grid("removePageColClass", 1, "headerClass", "dataClass"); * @param {Number} col_index * @param {String} headerClass * @param {String} dataClass */ removePageColClass: function(col_index, headerClass, dataClass) { var elem = this, container_id = elem.attr("id"), data_table_selector = "#" + create_id(methods.getOption.call(elem, "table_id_prefix"), container_id); $(data_table_selector + " th").eq(col_index).removeClass(headerClass); $(data_table_selector + " tr").each(function() { $(this).find("td").eq(col_index).removeClass(dataClass); }); }, displayGrid: function(refresh_pag) { var elem = this, container_id = elem.attr("id"), s = methods.getAllOptions.call(elem), table_id = create_id(s.table_id_prefix, container_id), elem_table = $("#" + table_id), no_results_id = create_id(s.no_results_id_prefix, container_id), elem_no_results = $("#" + no_results_id), filter_rules_id = create_id(s.filter_rules_id_prefix, container_id), pagination_id = create_id(s.pagination_id_prefix, container_id), elem_pagination = $("#" + pagination_id), err_msg; // fetch page data and display datagrid var res = $.ajax({ type: "POST", url: s.ajaxFetchDataURL, data: { page_num: s.pageNum, rows_per_page: s.rowsPerPage, columns: s.columns, sorting: s.sorting, filter_rules: s.filterOptions.filter_rules, debug_mode: s.debug_mode }, dataType: "json", success: function(data) { var server_error, filter_error, row_primary_key, total_rows, page_data, page_data_len, v, columns = s.columns, col_len = columns.length, column, c; server_error = data["error"]; if(server_error != null) { err_msg = "ERROR: " + server_error; elem.html('' + err_msg + ''); elem.triggerHandler("onDatagridError", {err_code: "server_error", err_description: server_error}); $.error(err_msg); } if(s.useFilters) { var elem_filter_rules = $("#" + filter_rules_id); filter_error = data["filter_error"]; if(filter_error["error_message"] != null) { elem_filter_rules.jui_filter_rules("markRuleAsError", filter_error["element_rule_id"], true); elem_filter_rules.triggerHandler("onValidationError", {err_code: "filter_validation_server_error", err_description: filter_error["error_message"]}); $.error(filter_error["error_message"]); } } total_rows = data["total_rows"]; page_data = data["page_data"]; page_data_len = page_data.length; elem.data(pluginStatus)["total_rows"] = total_rows; row_primary_key = s.row_primary_key; if(s.debug_mode == "yes") { elem.triggerHandler("onDebug", {debug_message: data["debug_message"]}); } // replace null with empty string if(page_data_len > 0) { for(v = 0; v < page_data_len; v++) { for(c = 0; c < col_len; c++) { column = columns[c]; if(column_is_visible(column)) { if(page_data[v][column["field"]] == null) { page_data[v][column["field"]] = ''; } } } } } // create data table var pageNum = parseInt(s.pageNum), rowsPerPage = parseInt(s.rowsPerPage), sortingIndicator, row_id_html, i, row, tbl_html, row_index, offset = ((pageNum - 1) * rowsPerPage); tbl_html = ''; row_id_html = (row_primary_key ? ' id="' + table_id + '_tr_0"' : ''); tbl_html += ''; if(s.showRowNumbers) { tbl_html += '' + rsc_bs_dg.row_index_header + ''; } for(i in s.columns) { if(column_is_visible(s.columns[i])) { sortingIndicator = ""; if(s.showSortingIndicator) { var sorting_type = "none"; for(var e in s.sorting) { if(s.sorting[e].field == s.columns[i].field) { sorting_type = s.sorting[e].order; break; } } switch(sorting_type) { case "ascending": sortingIndicator = ' '; break; case "descending": sortingIndicator = ' '; break; default: sortingIndicator = ''; } } tbl_html += '' + s.columns[i].header + sortingIndicator + ''; } } tbl_html += ''; tbl_html += ''; tbl_html += ''; for(row in page_data) { row_id_html = (row_primary_key ? ' id="' + table_id + '_tr_' + page_data[row][row_primary_key] + '"' : ''); tbl_html += ''; if(s.showRowNumbers) { row_index = offset + parseInt(row) + 1; tbl_html += '' + row_index + ''; } for(i in s.columns) { if(column_is_visible(s.columns[i])) { tbl_html += '' + page_data[row][s.columns[i].field] + ''; } } tbl_html += ''; } tbl_html += ''; elem_table.html(tbl_html); // refresh pagination (if needed) if(refresh_pag) { elem_pagination.bs_pagination({ currentPage: s.pageNum, totalPages: Math.ceil(total_rows / s.rowsPerPage), totalRows: total_rows }); } // no results if(total_rows == 0) { elem_pagination.hide(); elem_no_results.show(); } else { elem_pagination.show(); elem_no_results.hide(); } // apply given styles ------------------------------------------ var col_index = s.showRowNumbers ? 1 : 0, headerClass = "", dataClass = ""; for(i in s.columns) { if(column_is_visible(s.columns[i])) { headerClass = "", dataClass = ""; if(columns[i].hasOwnProperty("headerClass")) { headerClass = columns[i]["headerClass"]; } if(columns[i].hasOwnProperty("dataClass")) { dataClass = columns[i]["dataClass"]; } methods.setPageColClass.call(elem, col_index, headerClass, dataClass); col_index++; } } // apply row selections ---------------------------------------- if(s.row_primary_key && s.selected_ids.length > 0) { if(s.rowSelectionMode == "single" || s.rowSelectionMode == "multiple") { var row_prefix_len = (table_id + "_tr_").length, row_id, idx; $("#" + table_id + " tbody tr").each(function() { row_id = parseInt($(this).attr("id").substr(row_prefix_len)); idx = methods.selectedRows.call(elem, "selected_index", row_id); if(idx > -1) { methods.selectedRows.call(elem, "mark_selected", row_id); } }); } } // update selected rows counter methods.selectedRows.call(elem, "update_counter"); // trigger event onDisplay elem.triggerHandler("onDisplay"); } }); return res; }, /** * Get datagrid snapshot (current status: row selections, pagination, filters) * @returns {*} */ takeSnapshot: function() { var elem = this; return $.extend(true, {}, methods.getAllOptions.call(elem)); }, /** * Restore taken snaphot * @param {obj} params */ restoreSnapshot: function(params) { var elem = this; elem.removeData(pluginName); methods.init.call(elem, params); } }; /* private methods ------------------------------------------------------ */ /** * @lends _private_methods */ /** * Create element id * @function * @param prefix * @param plugin_container_id * @return {*} */ var create_id = function(prefix, plugin_container_id) { return prefix + plugin_container_id; }; /** * Check if column is visible (utility function) * * @param {object} column * @returns {boolean} */ var column_is_visible = function(column) { var visible = "visible"; return !column.hasOwnProperty(visible) || (column.hasOwnProperty(visible) && column[visible] == "yes"); }; /** * Set column visible property (utility function) * * @param {object} column * @param {boolean} status */ var set_column_visible = function(column, status) { var visible = "visible"; if(status) { if(column.hasOwnProperty(visible)) { delete column[visible]; } } else { column[visible] = "no"; } }; /** * Get column header (utility function) * * @param {object} column * @returns {string} */ var get_column_header = function(column) { return column.hasOwnProperty("header") ? column["header"] : column["field"]; }; /** * Get sorting name (utility function) * * @param {object} sorting * @returns {string} */ var get_sorting_name = function(sorting) { return sorting.hasOwnProperty("sortingName") ? sorting["sortingName"] : sorting["field"]; }; /** * Check if column is sortable (utility function) * * @param {object} column * @returns {boolean} */ var column_is_sortable = function(column) { return !column.hasOwnProperty("sortable") || (column.hasOwnProperty("sortable") && column["sortable"] == "yes"); }; /** * Check if column is function (utility function) * * @param {object} column * @returns {boolean} */ var column_is_function = function(column) { var is_function = "is_function"; return column.hasOwnProperty(is_function) && column[is_function] == "yes"; }; /** * Move array element from fromIndex to toIndex * @param arr * @param fromIndex * @param toIndex */ var array_move = function(arr, fromIndex, toIndex) { var element = arr[fromIndex]; arr.splice(fromIndex, 1); arr.splice(toIndex, 0, element); }; /** * bs_grid - datagrid jQuery plugin. * * @class bs_grid * @memberOf $.fn */ $.fn.bs_grid = function(method) { if(this.size() != 1) { var err_msg = "You must use this plugin (" + pluginName + ") with a unique element (at once)"; this.html('' + 'ERROR: ' + err_msg + ''); $.error(err_msg); } // Method calling logic if(methods[method]) { return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1)); } else if(typeof method === "object" || !method) { return methods.init.apply(this, arguments); } else { $.error("Method " + method + " does not exist on jQuery." + pluginName); } }; })(jQuery); ================================================ FILE: localization/el.bs2.js ================================================ /** * bs_grid v0.9.2 localization - GREEK (bootstrap 2 version) ******************* * * DO NOT CHANGE this file, as it will be overwritten in next update. * To use different values, write and use a similar structure js file. * */ var rsc_bs_dg = { columns: "Πεδία", columns_show_row_numbers: "Αρίθμηση σειρών", columns_default: "Προεπιλεγμένα", sorting: "Ταξινόμηση", sort_ascending: "  ", sort_descending: "  ", sort_none: "  ", sorting_default: "Προεπιλεγμένη", filters: "Φίλτρα", filters_apply: "Εφαρμογή", filters_reset: "Απαλοιφή", select: "Επιλογή", select_all_in_page: "Όλα στη σελίδα", deselect_all_in_page: "Κανένα στη σελίδα", select_inverse_in_page: "Αναστροφή", deselect_all: "Κανένα επιλεγμένο", row_index_header: "#", no_records_found: "Δεν βρέθηκαν εγγραφές" }; ================================================ FILE: localization/el.js ================================================ /** * bs_grid v0.9.2 localization - GREEK ***************************************** * * DO NOT CHANGE this file, as it will be overwritten in next update. * To use different values, write and use a similar structure js file. * */ var rsc_bs_dg = { columns: "Πεδία", columns_show_row_numbers: "Αρίθμηση σειρών", columns_default: "Προεπιλεγμένα", sorting: "Ταξινόμηση", sort_ascending: "  ", sort_descending: "  ", sort_none: "  ", sorting_default: "Προεπιλεγμένη", filters: "Φίλτρα", filters_apply: "Εφαρμογή", filters_reset: "Απαλοιφή", select: "Επιλογή", select_all_in_page: "Όλα στη σελίδα", deselect_all_in_page: "Κανένα στη σελίδα", select_inverse_in_page: "Αναστροφή", deselect_all: "Κανένα επιλεγμένο", row_index_header: "#", no_records_found: "Δεν βρέθηκαν εγγραφές" }; ================================================ FILE: localization/en.bs2.js ================================================ /** * bs_grid v0.9.2 localization - ENGLISH (bootstrap 2 version) ***************** * * DO NOT CHANGE this file, as it will be overwritten in next update. * To use different values, write and use a similar structure js file. * */ var rsc_bs_dg = { columns: "Columns", columns_show_row_numbers: "Row numbers", columns_default: "Default", sorting: "Sorting", sort_ascending: "  ", sort_descending: "  ", sort_none: "  ", sorting_default: "Default", filters: "Filters", filters_apply: "Apply", filters_reset: "Reset", select: "Select", select_all_in_page: "All in page", deselect_all_in_page: "None in page", select_inverse_in_page: "Inverse", deselect_all: "Deselect all", row_index_header: "#", no_records_found: "No records found" }; ================================================ FILE: localization/en.js ================================================ /** * bs_grid v0.9.2 localization - ENGLISH *************************************** * * DO NOT CHANGE this file, as it will be overwritten in next update. * To use different values, write and use a similar structure js file. * */ var rsc_bs_dg = { columns: "Columns", columns_show_row_numbers: "Row numbers", columns_default: "Default", sorting: "Sorting", sort_ascending: "  ", sort_descending: "  ", sort_none: "  ", sorting_default: "Default", filters: "Filters", filters_apply: "Apply", filters_reset: "Reset", select: "Select", select_all_in_page: "All in page", deselect_all_in_page: "None in page", select_inverse_in_page: "Inverse", deselect_all: "Deselect all", row_index_header: "#", no_records_found: "No records found" }; ================================================ FILE: localization/ru.bs2.js ================================================ /** * bs_grid v0.9.2 localization - ENGLISH (bootstrap 2 version) ***************** * * DO NOT CHANGE this file, as it will be overwritten in next update. * To use different values, write and use a similar structure js file. * */ var rsc_bs_dg = { columns: "Столбцы", columns_show_row_numbers: "Номера строк", columns_default: "По умолчанию", sorting: "Сортировка", sort_ascending: "  ", sort_descending: "  ", sort_none: "  ", sorting_default: "По умолчанию", filters: "Фильтры", filters_apply: "Применить", filters_reset: "Сброс", select: "Выбор", select_all_in_page: "Всё на странице", deselect_all_in_page: "Ничего на странице", select_inverse_in_page: "Обратить", deselect_all: "Снять выделение", row_index_header: "№", no_records_found: "Ничего не найдено" }; ================================================ FILE: localization/ru.js ================================================ /** * bs_grid v0.9.2 localization - ENGLISH *************************************** * * DO NOT CHANGE this file, as it will be overwritten in next update. * To use different values, write and use a similar structure js file. * */ var rsc_bs_dg = { columns: "Столбцы", columns_show_row_numbers: "Номера строк", columns_default: "По умолчанию", sorting: "Сортировка", sort_ascending: "  ", sort_descending: "  ", sort_none: "  ", sorting_default: "По умолчанию", filters: "Фильтры", filters_apply: "Применить", filters_reset: "Сброс", select: "Выбор", select_all_in_page: "Всё на странице", deselect_all_in_page: "Ничего на странице", select_inverse_in_page: "Обратить", deselect_all: "Снять выделение", row_index_header: "№", no_records_found: "Ничего не найдено" }; ================================================ FILE: server_side/php/ajax_page_data.dist.php ================================================ 'MYSQLi', 'db_server' => 'localhost', 'db_user' => 'DB_USER_HERE', 'db_passwd' => 'DB_PASS_HERE', 'db_name' => 'DB_NAME', 'db_port' => '3306', 'charset' => 'utf8', 'use_pst' => true, 'pst_placeholder' => 'question_mark' ); $ds = new dacapo($db_settings, null); $page_settings = array( "selectCountSQL" => "SQL_HERE", // CONFIGURE "selectSQL" => "SQL_HERE", // CONFIGURE "page_num" => $_POST['page_num'], "rows_per_page" => $_POST['rows_per_page'], "columns" => $_POST['columns'], "sorting" => isset($_POST['sorting']) ? $_POST['sorting'] : array(), "filter_rules" => isset($_POST['filter_rules']) ? $_POST['filter_rules'] : array() ); $jfr = new jui_filter_rules($ds); $jdg = new bs_grid($ds, $jfr, $page_settings, $_POST['debug_mode'] == "yes" ? true : false); $data = $jdg->get_page_data(); // data conversions (if necessary) foreach($data['page_data'] as $key => $row) { // your code here } echo json_encode($data); ================================================ FILE: server_side/php/bs_grid.php ================================================ ds = $ds; $this->jfr = $jfr; $this->page_settings = $page_settings; $this->debug_mode = $debug_mode; $this->last_error = null; $this->last_filter_error = array(); $this->debug_message = array(); } /** * Get last error * * @return null|string */ public function get_last_error() { return $this->last_error; } /** * Get last filter error * * @return array|string */ public function get_last_filter_error() { return $this->last_filter_error; } /** * Get debug message * * @return array|string */ public function get_debug_message() { return $this->debug_message; } /** * Gets whereSQL and bind_params array using jui_filter_rules class * * @param $filter_rules * @return array */ public function get_whereSQL($filter_rules) { $ds = $this->ds; $jfr = $this->jfr; $last_jfr_error = array( 'element_rule_id' => null, 'error_message' => null ); if(count($filter_rules) == 0) { $result = array('sql' => '', 'bind_params' => array()); } else { $result = $jfr->parse_rules($filter_rules); $last_jfr_error = $jfr->get_last_error(); if(!is_null($last_jfr_error['error_message'])) { $result = $last_jfr_error; } } if($this->debug_mode) { array_push($this->debug_message, 'WHERE SQL: ' . $result['sql']); array_push($this->debug_message, 'BIND PARAMS: ' . print_r($result['bind_params'], true)); if($ds->use_pst) { $bind_params_type = ''; foreach($result["bind_params"] as $bind_param) { $bind_params_type .= gettype($bind_param) . ' '; } array_push($this->debug_message, 'BIND PARAMS TYPE: ' . $bind_params_type); } array_push($this->debug_message, 'PREPARED STATEMENTS: ' . ($ds->use_pst ? "yes" : "no")); if(count($filter_rules) > 0) { if(!is_null($last_jfr_error['error_message'])) { array_push($this->debug_message, 'FILTER ERROR: ' . print_r($last_jfr_error['error_message'], true)); } } } return $result; } /** * Get sorting SQL (ORDER BY clause) * * @param array $sorting * @return string */ private function get_sortingSQL($sorting) { $sortingSQL = ''; foreach($sorting as $sort) { if($sort['order'] == 'ascending') { $sortingSQL .= $sort['field'] . ' ASC, '; } else if($sort['order'] == 'descending') { $sortingSQL .= ' ' . $sort['field'] . ' DESC, '; } } $len = mb_strlen($sortingSQL); if($len > 0) { $sortingSQL = ' ORDER BY ' . substr($sortingSQL, 0, $len - 2) . ' '; } if($this->debug_mode) { array_push($this->debug_message, 'sortingSQL: ' . $sortingSQL); } return $sortingSQL; } /** * Gets total rows count * * @param string $selectCountSQL * @param string $whereSQL * @param array $a_bind_params * @return int|bool Total rows or false */ public function get_total_rows($selectCountSQL, $whereSQL, $a_bind_params) { $ds = $this->ds; $sql = $selectCountSQL . ' ' . $whereSQL; $query_options = array( 'get_row' => true ); $res = $ds->select($sql, $a_bind_params, $query_options); if(!$res) { $this->last_error = $ds->last_error; $total_rows = false; } else { $rs = $ds->data; $total_rows = $rs['totalrows']; } if($this->debug_mode) { array_push($this->debug_message, 'RDBMS: ' . $ds->rdbms); array_push($this->debug_message, 'selectCountSQL: ' . $selectCountSQL); array_push($this->debug_message, 'total_rows: ' . $total_rows); } return $total_rows; } /** * @param $selectSQL * @param $whereSQL * @param $a_bind_params * @param $sortingSQL * @param $page_num * @param $rows_per_page * @return bool|null */ public function fetch_page_data($selectSQL, $whereSQL, $a_bind_params, $sortingSQL, $page_num, $rows_per_page) { $ds = $this->ds; $limitSQL = $ds->limit($rows_per_page, ($page_num - 1) * $rows_per_page); $sql = $selectSQL . ' ' . $whereSQL . ' ' . $sortingSQL . ' ' . $limitSQL; $res = $ds->select($sql, $a_bind_params); if(!$res) { $this->last_error = $ds->last_error; $a_data = false; } else { $a_data = $ds->data; } if($this->debug_mode) { array_push($this->debug_message, 'selectSQL: ' . $selectSQL); } return $a_data; } /** * Get page data * * @return array */ public function get_page_data() { $fixed_where = null; if(array_key_exists('fixed_where', $this->page_settings)) { $fixed_where = $this->page_settings['fixed_where']; } $fixed_bind_params = null; if(array_key_exists('fixed_where', $this->page_settings)) { $fixed_bind_params = $this->page_settings['fixed_bind_params']; } $total_rows = null; $a_data = null; // initialize $result = array( 'total_rows' => null, 'page_data' => null, 'error' => null, 'filter_error' => array(), 'debug_message' => array() ); $where = $this->get_whereSQL($this->page_settings['filter_rules']); if(array_key_exists('error_message', $where)) { $this->last_filter_error = $where; } else { if($fixed_where) { $tmp_where = $fixed_where; if($where['sql']) { $tmp_where .= ' AND (' . mb_substr($where['sql'], 6) . ')'; } $where['sql'] = $tmp_where; } if($fixed_bind_params) { $reversed = array_reverse($fixed_bind_params); foreach($reversed as $param) { array_unshift($where['bind_params'], $param); } } $total_rows = $this->get_total_rows($this->page_settings['selectCountSQL'], $where['sql'], $where['bind_params']); if($total_rows !== false) { // calculate sortingSQL $sortingSQL = $this->get_sortingSQL($this->page_settings['sorting']); $a_data = $this->fetch_page_data( $this->page_settings['selectSQL'], $where['sql'], $where['bind_params'], $sortingSQL, $this->page_settings['page_num'], $this->page_settings['rows_per_page']); } } $result['total_rows'] = $total_rows; $result['page_data'] = $a_data; $result['error'] = $this->get_last_error(); $result['filter_error'] = $this->get_last_filter_error(); $result['debug_message'] = $this->get_debug_message(); return $result; } /** * Get all data * * @return array */ public function get_all_data() { $fixed_where = null; if(array_key_exists('fixed_where', $this->page_settings)) { $fixed_where = $this->page_settings['fixed_where']; } $fixed_bind_params = null; if(array_key_exists('fixed_where', $this->page_settings)) { $fixed_bind_params = $this->page_settings['fixed_bind_params']; } $total_rows = null; $a_data = null; // initialize $result = array( 'total_rows' => null, 'all_data' => null, 'error' => null, 'filter_error' => array(), 'debug_message' => array() ); $where = $this->get_whereSQL($this->page_settings['filter_rules']); if(array_key_exists('error_message', $where)) { $this->last_filter_error = $where; } else { if($fixed_where) { $tmp_where = $fixed_where; if($where['sql']) { $tmp_where .= ' AND (' . mb_substr($where['sql'], 6) . ')'; } $where['sql'] = $tmp_where; } if($fixed_bind_params) { $reversed = array_reverse($fixed_bind_params); foreach($reversed as $param) { array_unshift($where['bind_params'], $param); } } $total_rows = $this->get_total_rows($this->page_settings['selectCountSQL'], $where['sql'], $where['bind_params']); if($total_rows !== false) { // calculate sortingSQL $sortingSQL = $this->get_sortingSQL($this->page_settings['sorting']); $ds = $this->ds; $sql = $this->page_settings['selectSQL'] . ' ' . $where['sql']. ' ' . $sortingSQL; $res = $ds->select($sql, $where['bind_params']); if(!$res) { $this->last_error = $ds->last_error; $a_data = false; } else { $a_data = $ds->data; } if($this->debug_mode) { array_push($this->debug_message, 'selectSQL: ' . $this->page_settings['selectSQL']); } } } $result['total_rows'] = $total_rows; $result['all_data'] = $a_data; $result['error'] = $this->get_last_error(); $result['filter_error'] = $this->get_last_filter_error(); $result['debug_message'] = $this->get_debug_message(); return $result; } }