Added tablesorter and improved Table()
This commit is contained in:
@@ -8,10 +8,35 @@
|
||||
* @author Deon George
|
||||
* @copyright (c) 2009-2013 Deon George
|
||||
* @license http://dev.leenooks.net/license.html
|
||||
* @uses Style
|
||||
*/
|
||||
abstract class lnApp_Table {
|
||||
public static function resolve($d,$key) {
|
||||
private $data = NULL;
|
||||
private $columns = array(); // Our columns that we need to display
|
||||
private $jssort = FALSE; // Use the JS pager and sorter
|
||||
private $other = ''; // If we are only listing x items, this will be the other summary line
|
||||
private $other_col = NULL; // If we are only listing x items, this will be the other summary line
|
||||
private $po = NULL; // If we are paging the results, this is the page we are displaying
|
||||
private $page = FALSE; // If we should page the results
|
||||
private $page_rows = 0; // Number of rows per page
|
||||
private $prepend = array(); // Our datafomrating that we need to use
|
||||
|
||||
public function __toString() {
|
||||
return (string) $this->render();
|
||||
}
|
||||
|
||||
public function columns($cols) {
|
||||
$this->columns = $cols;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function data($data) {
|
||||
$this->data = $data;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function evaluate($d,$key) {
|
||||
if (is_array($d) AND isset($d[$key]))
|
||||
$x = $d[$key];
|
||||
|
||||
@@ -25,26 +50,185 @@ abstract class lnApp_Table {
|
||||
else
|
||||
$x = $d->display($key);
|
||||
|
||||
if (isset($this->prepend[$key])) {
|
||||
foreach ($this->prepend[$key] as $act => $data) {
|
||||
switch ($act) {
|
||||
case 'url': $x = HTML::anchor($data.$x,$x);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $x;
|
||||
}
|
||||
|
||||
public static function factory() {
|
||||
return new Table;
|
||||
}
|
||||
|
||||
public function jssort($bool) {
|
||||
$this->jssort = $bool;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function page_items($num) {
|
||||
$this->page = TRUE;
|
||||
$this->page_rows = $num;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function prepend($cols) {
|
||||
$this->prepend = $cols;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function process() {
|
||||
$result = array();
|
||||
|
||||
$row = 0;
|
||||
foreach ($this->data as $o) {
|
||||
$row++;
|
||||
$c = 0;
|
||||
|
||||
// If we are HTML paging
|
||||
if ($this->page) {
|
||||
if ($row < $this->po->current_first_item())
|
||||
continue;
|
||||
elseif ($row > $this->po->current_last_item())
|
||||
break;
|
||||
}
|
||||
|
||||
// If we are just listing page_rows items and a summary line as a result of exceeding that
|
||||
if ($this->other_col AND $row>$this->page_rows) {
|
||||
$this->other += Table::resolve($o,$this->other_col);
|
||||
|
||||
// Otherwise rendering our rows
|
||||
} else {
|
||||
foreach ($this->columns as $col => $label) {
|
||||
$c++;
|
||||
|
||||
$result[$row]['val'][$c] = $this->evaluate($o,$col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$output = '';
|
||||
|
||||
// If we need to page the results
|
||||
if ($this->page) {
|
||||
$this->po = new Pagination(array(
|
||||
'total_items'=>count($this->data),
|
||||
'items_per_page'=>$this->page_rows,
|
||||
));
|
||||
|
||||
$output .= (string)$this->po;
|
||||
|
||||
}
|
||||
|
||||
$output .= View::factory('table')
|
||||
->set('jssort',$this->jssort AND ! $this->page)
|
||||
->set('other',$this->other)
|
||||
->set('th',$this->columns)
|
||||
->set('td',$this->process());
|
||||
|
||||
// Use the javascript paging
|
||||
if ($this->jssort AND ! $this->page) {
|
||||
Script::factory()
|
||||
->type('stdin')
|
||||
->data('
|
||||
$(document).ready(function() {
|
||||
$.extend($.tablesorter.themes.bootstrap, {
|
||||
// these classes are added to the table. To see other table classes available,
|
||||
// look here: http://twitter.github.com/bootstrap/base-css.html#tables
|
||||
table : "table table-striped",
|
||||
header : "bootstrap-header", // give the header a gradient background
|
||||
footerRow : "",
|
||||
footerCells: "",
|
||||
icons : "", // add "icon-white" to make them white; this icon class is added to the <i> in the header
|
||||
sortNone : "bootstrap-icon-unsorted",
|
||||
sortAsc : "icon-chevron-up",
|
||||
sortDesc : "icon-chevron-down",
|
||||
active : "", // applied when column is sorted
|
||||
hover : "", // use custom css here - bootstrap class may not override it
|
||||
filterRow : "", // filter row class
|
||||
even : "", // odd row zebra striping
|
||||
odd : "" // even row zebra striping
|
||||
});
|
||||
|
||||
$("#list-table").tablesorter({
|
||||
theme: "bootstrap",
|
||||
widthFixed : true,
|
||||
headerTemplate : "{content} {icon}", // Add icon for jui theme; new in v2.7!
|
||||
widgets: [ "uitheme", "stickyHeaders", "filter" ],
|
||||
|
||||
}).tablesorterPager({
|
||||
// target the pager markup - see the HTML block below
|
||||
container : $(".pager"),
|
||||
output : "{startRow} - {endRow} / {filteredRows} ({totalRows})",
|
||||
fixedHeight: true,
|
||||
removeRows : false,
|
||||
cssGoto : ".gotoPage"
|
||||
|
||||
});
|
||||
});
|
||||
');
|
||||
|
||||
Script::factory()
|
||||
->type('file')
|
||||
->data('media/vendor/mottie-tablesorter/js/jquery.tablesorter.min.js');
|
||||
|
||||
Script::factory()
|
||||
->type('file')
|
||||
->data('media/vendor/mottie-tablesorter/js/jquery.tablesorter.widgets.min.js');
|
||||
|
||||
Script::factory()
|
||||
->type('file')
|
||||
->data('media/vendor/mottie-tablesorter/js/jquery.tablesorter.pager.min.js');
|
||||
|
||||
Style::factory()
|
||||
->type('file')
|
||||
->data('media/vendor/mottie-tablesorter/css/theme.bootstrap.css');
|
||||
Style::factory()
|
||||
->type('file')
|
||||
->data('media/vendor/mottie-tablesorter/css/jquery.tablesorter.pager.css');
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
//ZZ
|
||||
public static function display($data,$rows,array $cols,array $option) {
|
||||
if (! (array)$data)
|
||||
return '';
|
||||
$prepend = $headers = array();
|
||||
|
||||
$pag = NULL;
|
||||
$view = $output = $button = '';
|
||||
foreach ($cols as $k=>$v) {
|
||||
if (isset($v['label']))
|
||||
$headers[$k] = $v['label'];
|
||||
if (isset($v['url']))
|
||||
$prepend[$k] = array('url'=>$v['url']);
|
||||
}
|
||||
|
||||
if (isset($option['type']) AND $option['type'])
|
||||
switch ($option['type']) {
|
||||
case 'select':
|
||||
$view = 'table/select';
|
||||
return static::factory()
|
||||
->data($data)
|
||||
->jssort(TRUE)
|
||||
->page_items($rows)
|
||||
->columns($headers)
|
||||
->prepend($prepend);
|
||||
|
||||
/*
|
||||
if (! empty($option['button']))
|
||||
$button = implode('',$option['button']);
|
||||
else
|
||||
$button = Form::button('Submit','View/Edit',array('class'=>'form_button','type'=>'submit'));
|
||||
|
||||
// This JS is failing, any pressing of select all, unselect all, toggle is propaging up and submitting the form
|
||||
|
||||
Script::factory()
|
||||
->type('stdin')
|
||||
->data('
|
||||
@@ -153,104 +337,17 @@ $(document).ready(function() {
|
||||
});
|
||||
});
|
||||
');
|
||||
|
||||
$output .= Form::open((isset($option['form']) ? $option['form'] : ''));
|
||||
|
||||
if (! empty($option['hidden']))
|
||||
$output .= '<div>'.implode('',$option['hidden']).'</div>';
|
||||
|
||||
break;
|
||||
|
||||
case 'list':
|
||||
default:
|
||||
Script::factory()
|
||||
->type('stdin')
|
||||
->data('
|
||||
// Bind our actions
|
||||
$(document).ready(function() {
|
||||
// Our mouse over row highlight
|
||||
$("#list-table tr:not(.head)").hover(function() {
|
||||
$(this).children().toggleClass("highlight");
|
||||
},
|
||||
function() {
|
||||
$(this).children().toggleClass("highlight");
|
||||
});
|
||||
});
|
||||
');
|
||||
}
|
||||
|
||||
If (! $view)
|
||||
$view = 'table/list';
|
||||
|
||||
if (isset($option['page']) AND $option['page']) {
|
||||
$pag = new Pagination(array(
|
||||
'total_items'=>count($data),
|
||||
'items_per_page'=>$rows,
|
||||
));
|
||||
|
||||
$output .= (string)$pag;
|
||||
}
|
||||
|
||||
$other = $i = 0;
|
||||
$td = $th = array();
|
||||
foreach ($cols as $col => $details) {
|
||||
$th[$col] = isset($details['label']) ? $details['label'] : '';
|
||||
$td[$col]['class'] = isset($details['class']) ? $details['class'] : '';
|
||||
$td[$col]['url'] = isset($details['url']) ? $details['url'] : '';
|
||||
}
|
||||
|
||||
$output .= View::factory($view.'_head')
|
||||
->set('th',array_values($th));
|
||||
|
||||
foreach ($data as $do) {
|
||||
if ($pag) {
|
||||
if (++$i < $pag->current_first_item())
|
||||
continue;
|
||||
elseif ($i > $pag->current_last_item())
|
||||
break;
|
||||
}
|
||||
|
||||
if ($pag OR ($i++ < $rows) OR is_null($rows)) {
|
||||
foreach (array_keys($cols) as $col)
|
||||
$td[$col]['value'] = Table::resolve($do,$col);
|
||||
|
||||
$output .= View::factory($view.'_body')
|
||||
->set('td',$td);
|
||||
|
||||
} elseif (isset($option['show_other']) AND ($col=$option['show_other'])) {
|
||||
$other += Table::resolve($do,$col);
|
||||
}
|
||||
}
|
||||
|
||||
if ($other)
|
||||
$output .= View::factory($view.'_xtra')
|
||||
->set('td',array_values($cols))
|
||||
->set('count',$i-$rows)
|
||||
->set('other',$other);
|
||||
|
||||
$output .= View::factory($view.'_foot')
|
||||
->set('button',$button);
|
||||
|
||||
if (isset($option['type']) AND $option['type'])
|
||||
switch ($option['type']) {
|
||||
case 'select':
|
||||
$output .= Form::close();
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
public static function post($key,$i='id') {
|
||||
if (isset($_POST[$i]))
|
||||
Session::instance()->set('page_table_view'.$key,$_POST[$i]);
|
||||
*/
|
||||
}
|
||||
|
||||
// This enables us to page through many selected items
|
||||
// @todo This is currently not usable, since our JS above needs to be fixed to work with tablesorter
|
||||
public static function page($key) {
|
||||
// We have preference for parameters passed to the action.
|
||||
if (is_null($id = Request::current()->param('id'))) {
|
||||
|
||||
// First save our POST id data into the session, so we dont need it when going to each page
|
||||
if (isset($_POST['id']) AND is_array($_POST['id']))
|
||||
Table::post($key,'id');
|
||||
Session::instance()->set('page_table_view'.$key,'id');
|
||||
|
||||
if ($ids = Session::instance()->get('page_table_view'.$key)) {
|
||||
$pag = new Pagination(array(
|
||||
@@ -260,7 +357,6 @@ $(document).ready(function() {
|
||||
|
||||
return array($ids[$pag->current_first_item()-1],(string)$pag);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If we get here, then there is no previous data to retrieve.
|
||||
|
Reference in New Issue
Block a user