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;
}
}