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.
* <p>License MIT
* <br />Copyright Christos Pontikis <a href="http://www.pontikis.net">http://www.pontikis.net</a>
* <br />Project page <a href="http://www.pontikis.net/labs/bs_grid/">http://www.pontikis.net/labs/bs_grid/</a>
* @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 <a href="http://jquery.com">http://jquery.com</a>.
* @name $
* @class
* See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) for full details. This just
* documents the function and classes that are added to jQuery by this plug-in.
*/
/**
* See <a href="http://jquery.com">http://jquery.com</a>
* @name fn
* @class
* See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) 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 += '<div id="' + tools_id + '" class="' + settings.toolsClass + '"></div>';
elem_html += '<div id="' + table_container_id + '" class="' + settings.dataTableContainerClass + '">';
elem_html += '<table id="' + table_id + '" class="' + settings.dataTableClass + '"></table>';
elem_html += '</div>';
elem_html += '<div id="' + no_results_id + '" class="' + settings.noResultsClass + '">' + rsc_bs_dg.no_records_found + '</div>';
if(settings.customHTMLelementID1) {
elem_html += '<div id="' + custom_html1_id + '"></div>';
}
elem_html += '<div id="' + pagination_id + '"></div>';
if(settings.customHTMLelementID2) {
elem_html += '<div id="' + custom_html2_id + '"></div>';
}
if(settings.useFilters) {
elem_html += '<div id="' + filter_container_id + '" class="' + settings.filterContainerClass + '">';
elem_html += '<div id="' + filter_rules_id + '"></div>';
elem_html += '<div id="' + filter_tools_id + '" class="' + settings.filterToolsClass + '">';
elem_html += '<button class="' + settings.filterApplyBtnClass + '">' + rsc_bs_dg.filters_apply + '</button>';
elem_html += '<button class="' + settings.filterResetBtnClass + '">' + rsc_bs_dg.filters_reset + '</button>';
elem_html += '</div>';
}
elem_html += '</div>';
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 += '<div class="btn-group pull-right">';
tools_html += '<button type="button" class="' + settings.columnsListLaunchButtonClass + '" data-toggle="dropdown" title="' + rsc_bs_dg.columns + '">';
tools_html += '<span class="' + settings.columnsListLaunchButtonIconClass + '"></span>';
tools_html += '<span class="caret"></span>';
tools_html += '</button>';
tools_html += '<ul id="' + columns_list_id + '" class="' + settings.columnsListClass + '">';
var col_name, col_checked,
col_list_len = 0;
for(var i in settings.columns) {
if(column_is_function(settings.columns[i])) {
continue;
}
col_list_len++;
col_name = get_column_header(settings.columns[i]);
col_checked = column_is_visible(settings.columns[i]) ? " checked" : "";
default_columns_list += '<li><a href="javascript:void(0);">' +
'<label class="' + settings.columnsListLabelClass + '">' +
'<input type="checkbox" class="' + settings.columnsListCheckClass + '"' + col_checked + '> ' + col_name +
'</label>' +
'</a></li>';
}
default_columns_list += '<li class="not-sortable ' + settings.columnsListDividerClass + '"></li>';
var row_index_checked = settings.showRowNumbers ? " checked" : "";
default_columns_list += '<li class="not-sortable columns-li-padding"><label class="' + settings.columnsListLabelClass + '"><input type="checkbox" class="' + settings.columnsListCheckClass + '"' + row_index_checked + '> ' + rsc_bs_dg.columns_show_row_numbers + '</label></li>';
default_columns_list += '<li class="not-sortable ' + settings.columnsListDividerClass + '"></li>';
default_columns_list += '<li class="not-sortable columns-li-padding"><button class="' + settings.columnsListDefaultButtonClass + '">' + rsc_bs_dg.columns_default + '</button></li>';
//save default columns list
if(typeof elem.data(pluginStatus)["default_columns_list"] === "undefined") {
elem.data(pluginStatus)["default_columns_list"] = default_columns_list;
}
tools_html += default_columns_list;
tools_html += '</ul>';
tools_html += '</div>';
// sorting list ------------------------------------------------
tools_html += '<div class="btn-group pull-right">';
tools_html += '<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" title="' + rsc_bs_dg.sorting + '">';
tools_html += '<span class="' + settings.sortingListLaunchButtonIconClass + '"></span>';
tools_html += '<span class="caret"></span>';
tools_html += '</button>';
tools_html += '<ul id="' + sorting_list_id + '" class="dropdown-menu dropdown-menu-right">';
for(var i in settings.sorting) {
var sort_name = get_sorting_name(settings.sorting[i]),
checked_asc = settings.sorting[i]["order"] == "ascending" ? " checked" : "",
checked_desc = settings.sorting[i]["order"] == "descending" ? " checked" : "",
checked_none = settings.sorting[i]["order"] == "none" ? " checked" : "";
default_sorting_list += '<li><a href="javascript:void(0);">' +
'<label class="' + settings.sortingLabelCheckboxClass + '"><input type="radio" name="' + sorting_radio_name + i + '"' + checked_asc + '>' + rsc_bs_dg.sort_ascending + '</label>' +
'<label class="' + settings.sortingLabelCheckboxClass + '"><input type="radio" name="' + sorting_radio_name + i + '"' + checked_desc + '>' + rsc_bs_dg.sort_descending + '</label>' +
'<label class="' + settings.sortingLabelCheckboxClass + '"><input type="radio" name="' + sorting_radio_name + i + '"' + checked_none + '>' + rsc_bs_dg.sort_none + '</label>' +
'<span class="' + settings.sortingNameClass + '">' + sort_name + '</span>' +
'</a></li>';
}
default_sorting_list += '<li class="not-sortable ' + settings.columnsListDividerClass + '"></li>';
default_sorting_list += '<li class="not-sortable columns-li-padding"><button class="' + settings.columnsListDefaultButtonClass + '">' + rsc_bs_dg.sorting_default + '</button></li>';
//save default columns list
if(typeof elem.data(pluginStatus)["default_sorting_list"] === "undefined") {
elem.data(pluginStatus)["default_sorting_list"] = default_sorting_list;
}
tools_html += default_sorting_list;
tools_html += '</ul>';
tools_html += '</div>';
// selection list ----------------------------------------------
if(settings.row_primary_key &&
(settings.rowSelectionMode == "single" || settings.rowSelectionMode == "multiple")) {
tools_html += '<div class="btn-group pull-right">';
tools_html += '<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" title="' + rsc_bs_dg.select + '">';
tools_html += '<span class="' + settings.selectButtonIconClass + '"></span>';
tools_html += '<span id="' + selected_rows_id + '" class="' + settings.selectedRowsClass + '">' + settings.selected_ids.length + '</span>';
tools_html += '<span class="caret"></span>';
tools_html += '</button>';
tools_html += '<ul id="' + selection_list_id + '" class="dropdown-menu dropdown-menu-right">';
if(settings.rowSelectionMode == "multiple") {
tools_html += '<li><a href="javascript:void(0);">' + rsc_bs_dg.select_all_in_page + '</a></li>';
tools_html += '<li><a href="javascript:void(0);">' + rsc_bs_dg.deselect_all_in_page + '</a></li>';
tools_html += '<li><a href="javascript:void(0);">' + rsc_bs_dg.select_inverse_in_page + '</a></li>';
tools_html += '<li class="not-sortable ' + settings.columnsListDividerClass + '"></li>';
}
tools_html += '<li><a href="javascript:void(0);">' + rsc_bs_dg.deselect_all + '</a></li>';
tools_html += '</ul>';
tools_html += '</div>';
}
// filter toggle button ----------------------------------------
if(settings.useFilters) {
tools_html += '<button id="' + filter_toggle_id + '" class="btn btn-default pull-right" title="' + rsc_bs_dg.filters + '"><span class="' + settings.filterToggleButtonIconClass + '"></span></button>';
}
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 = '<li><a href="javascript:void(0);">' +
'<label class="' + settings.sortingLabelCheckboxClass + '"><input type="radio" name="' + sorting_radio_name + '0' + '"' + checked_asc + '>' + rsc_bs_dg.sort_ascending + '</label>' +
'<label class="' + settings.sortingLabelCheckboxClass + '"><input type="radio" name="' + sorting_radio_name + '0' + '"' + checked_desc + '>' + rsc_bs_dg.sort_descending + '</label>' +
'<label class="' + settings.sortingLabelCheckboxClass + '"><input type="radio" name="' + sorting_radio_name + '0' + '"' + checked_none + '>' + rsc_bs_dg.sort_none + '</label>' +
'<span class="' + settings.sortingNameClass + '">' + th_text + '</span>' +
'</a></li>';
sorting_list_html += '<li class="not-sortable ' + settings.columnsListDividerClass + '"></li>';
sorting_list_html += '<li class="not-sortable columns-li-padding"><button class="' + settings.columnsListDefaultButtonClass + '">' + rsc_bs_dg.sorting_default + '</button></li>';
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('<span style="color: red;">' + err_msg + '</span>');
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 = '<thead>';
row_id_html = (row_primary_key ? ' id="' + table_id + '_tr_0"' : '');
tbl_html += '<tr' + row_id_html + '>';
if(s.showRowNumbers) {
tbl_html += '<th class="' + s.commonThClass + '">' + rsc_bs_dg.row_index_header + '</th>';
}
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 = ' <span class="' + s.sortingIndicatorAscClass + '"></span>';
break;
case "descending":
sortingIndicator = ' <span class="' + s.sortingIndicatorDescClass + '"></span>';
break;
default:
sortingIndicator = '';
}
}
tbl_html += '<th class="' + s.commonThClass + '">' + s.columns[i].header + sortingIndicator + '</th>';
}
}
tbl_html += '</tr>';
tbl_html += '</thead>';
tbl_html += '<tbody>';
for(row in page_data) {
row_id_html = (row_primary_key ? ' id="' + table_id + '_tr_' + page_data[row][row_primary_key] + '"' : '');
tbl_html += '<tr' + row_id_html + '>';
if(s.showRowNumbers) {
row_index = offset + parseInt(row) + 1;
tbl_html += '<td>' + row_index + '</td>';
}
for(i in s.columns) {
if(column_is_visible(s.columns[i])) {
tbl_html += '<td>' + page_data[row][s.columns[i].field] + '</td>';
}
}
tbl_html += '</tr>';
}
tbl_html += '<tbody>';
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('<span style="color: red;">' + 'ERROR: ' + err_msg + '</span>');
$.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: "<i class='icon-chevron-up'></i> ",
sort_descending: "<i class='icon-chevron-down'></i> ",
sort_none: "<i class='icon-minus'></i> ",
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: "<i class='glyphicon glyphicon-chevron-up'></i> ",
sort_descending: "<i class='glyphicon glyphicon-chevron-down'></i> ",
sort_none: "<i class='glyphicon glyphicon-minus'></i> ",
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: "<i class='icon-chevron-up'></i> ",
sort_descending: "<i class='icon-chevron-down'></i> ",
sort_none: "<i class='icon-minus'></i> ",
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: "<i class='glyphicon glyphicon-chevron-up'></i> ",
sort_descending: "<i class='glyphicon glyphicon-chevron-down'></i> ",
sort_none: "<i class='glyphicon glyphicon-minus'></i> ",
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: "<i class='icon-chevron-up'></i> ",
sort_descending: "<i class='icon-chevron-down'></i> ",
sort_none: "<i class='icon-minus'></i> ",
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: "<i class='glyphicon glyphicon-chevron-up'></i> ",
sort_descending: "<i class='glyphicon glyphicon-chevron-down'></i> ",
sort_none: "<i class='glyphicon glyphicon-minus'></i> ",
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
================================================
<?php
/**
* ajax_page_data.dist.php, bs_grid ajax fetch page data template script
*
* Sample php file getting totalrows and page data
*
* Da Capo database wrapper is required https://github.com/pontikis/dacapo
*
* @version 0.9.2 (28 May 2014)
* @author Christos Pontikis http://pontikis.net
* @license http://opensource.org/licenses/MIT MIT license
**/
// PREVENT DIRECT ACCESS (OPTIONAL) --------------------------------------------
$isAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
if(!$isAjax) {
print 'Access denied - not an AJAX request...' . ' (' . __FILE__ . ')';
exit;
}
// REQUIRED --------------------------------------------------------------------
require_once '/path/to/dacapo.php'; // CONFIGURE
require_once '/path/to/jui_filter_rules.php'; // CONFIGURE
require_once '/path/to/bs_grid.php'; // CONFIGURE
// create new datasource // CONFIGURE
$db_settings = array(
'rdbms' => '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
================================================
<?php
/**
* bs_grid, helper class for jquery.bs_grid plugin, handles server operations (mainly through AJAX requests).
*
* see ajax_page_data.dist.php for usage instructions
*
* Da Capo database wrapper is required https://github.com/pontikis/dacapo
* jui_filter_rules is required https://github.com/pontikis/jui_filter_rules
*
* @version 0.9.2 (28 May 2014)
* @author Christos Pontikis http://www.pontikis.net
* @license http://opensource.org/licenses/MIT MIT license
**/
class bs_grid {
/** @var string Last error occured */
private $last_error;
/** @var string Last filter error occured */
private $last_filter_error;
/** @var string Debug message */
private $debug_message;
/**
* Constructor
*
* @param dacapo $ds
* @param jui_filter_rules $jfr
* @param $page_settings
* @param bool $debug_mode
*/
public function __construct(dacapo $ds, jui_filter_rules $jfr, $page_settings, $debug_mode = false) {
// initialize
$this->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;
}
}
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
SYMBOL INDEX (11 symbols across 1 files)
FILE: server_side/php/bs_grid.php
class bs_grid (line 15) | class bs_grid {
method __construct (line 32) | public function __construct(dacapo $ds, jui_filter_rules $jfr, $page_s...
method get_last_error (line 49) | public function get_last_error() {
method get_last_filter_error (line 58) | public function get_last_filter_error() {
method get_debug_message (line 67) | public function get_debug_message() {
method get_whereSQL (line 77) | public function get_whereSQL($filter_rules) {
method get_sortingSQL (line 124) | private function get_sortingSQL($sorting) {
method get_total_rows (line 152) | public function get_total_rows($selectCountSQL, $whereSQL, $a_bind_par...
method fetch_page_data (line 188) | public function fetch_page_data($selectSQL, $whereSQL, $a_bind_params,...
method get_page_data (line 216) | public function get_page_data() {
method get_all_data (line 294) | public function get_all_data() {
Condensed preview — 16 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (95K chars).
[
{
"path": ".gitignore",
"chars": 170,
"preview": "# JetBrains phpStorm IDE files -------------------------------------------------\n/.idea/*\n# ----------------------------"
},
{
"path": "CHANGELOG.md",
"chars": 1089,
"preview": "bs_grid\n=======\n\nbs_grid is a jQuery Datagrid plugin, based on Twitter Bootstrap.\n\nProject page: [https://www.pontikis.n"
},
{
"path": "MIT_LICENSE",
"chars": 1085,
"preview": "Copyright (c) 2014 Christos Pontikis, http://www.pontikis.net\n\nPermission is hereby granted, free of charge, to any pers"
},
{
"path": "README.md",
"chars": 1116,
"preview": "bs_grid\n=======\n\nbs_grid is a jQuery Datagrid plugin, based on Twitter Bootstrap.\n\nCopyright Christos Pontikis [http://w"
},
{
"path": "bs_grid.jquery.json",
"chars": 1257,
"preview": "{\n \"name\": \"bs_grid\",\n \"version\": \"0.9.2\",\n \"title\": \"Bootstrap Datagrid\",\n \"author\": {\n \"name\": \"Chr"
},
{
"path": "jquery.bs_grid.bs2.css",
"chars": 3171,
"preview": "/*\n * bs_grid v0.9.2 CSS (for Bootstrap 2) ****************************************\n*/\n\n/*\nDO NOT CHANGE this file, as i"
},
{
"path": "jquery.bs_grid.css",
"chars": 1322,
"preview": "/*\n * bs_grid v0.9.2 CSS **********************************************************\n*/\n\n/*\nDO NOT CHANGE this file, as i"
},
{
"path": "jquery.bs_grid.js",
"chars": 62557,
"preview": "/**\n * @fileOverview bs_grid is a jQuery datagrid plugin based on Twitter Bootstrap.\n * <p>License MIT\n * "
},
{
"path": "localization/el.bs2.js",
"chars": 979,
"preview": "/**\n * bs_grid v0.9.2 localization - GREEK (bootstrap 2 version) *******************\n *\n * DO NOT CHANGE this file, as i"
},
{
"path": "localization/el.js",
"chars": 1026,
"preview": "/**\n * bs_grid v0.9.2 localization - GREEK *****************************************\n *\n * DO NOT CHANGE this file, as i"
},
{
"path": "localization/en.bs2.js",
"chars": 936,
"preview": "/**\n * bs_grid v0.9.2 localization - ENGLISH (bootstrap 2 version) *****************\n *\n * DO NOT CHANGE this file, as i"
},
{
"path": "localization/en.js",
"chars": 981,
"preview": "/**\n * bs_grid v0.9.2 localization - ENGLISH ***************************************\n *\n * DO NOT CHANGE this file, as i"
},
{
"path": "localization/ru.bs2.js",
"chars": 968,
"preview": "/**\n * bs_grid v0.9.2 localization - ENGLISH (bootstrap 2 version) *****************\n *\n * DO NOT CHANGE this file, as i"
},
{
"path": "localization/ru.js",
"chars": 1013,
"preview": "/**\n * bs_grid v0.9.2 localization - ENGLISH ***************************************\n *\n * DO NOT CHANGE this file, as i"
},
{
"path": "server_side/php/ajax_page_data.dist.php",
"chars": 2116,
"preview": "<?php\n/**\n * ajax_page_data.dist.php, bs_grid ajax fetch page data template script\n *\n * Sample php file getting totalro"
},
{
"path": "server_side/php/bs_grid.php",
"chars": 9128,
"preview": "<?php\n\n/**\n * bs_grid, helper class for jquery.bs_grid plugin, handles server operations (mainly through AJAX requests)."
}
]
About this extraction
This page contains the full source code of the pontikis/bs_grid GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 16 files (86.8 KB), approximately 18.9k tokens, and a symbol index with 11 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.