Compare commits

..

27 Commits

Author SHA1 Message Date
Abijah bda18fc78a Changed field last_key to key_last
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1047 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-04 00:47:16 +00:00
Abijah d903fcb9e3 Added bigger limit options to the customer list for receipts
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1046 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-04 00:30:49 +00:00
Abijah 01a6984a53 Added timestamp when the lock last had a keychange.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1045 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 15:54:35 +00:00
Abijah 30fdc10648 Changed quantity to not show up if just 1. Set field order for edit to match view
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1044 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 07:29:06 +00:00
Abijah 87d6d93493 Fixed bug causing crash if locks in use exceeds the number of locks that are supposed to exist
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1043 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 07:22:06 +00:00
Abijah 11a9ca903b Added ability to lock unlock any unit, and to track that based on the actual locks that are on it, not the lock status.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1042 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 07:08:29 +00:00
Abijah 0d59351341 Changed the lock screen to look a bit less clunky
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1041 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 06:44:57 +00:00
Abijah 13f62edbd7 Added ability to delete a lock
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1040 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 06:33:56 +00:00
Abijah ec0363325c Added more lock functionality, and fixed a couple bugs
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1039 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 06:04:00 +00:00
Abijah e08afdd8b1 First pass at implementing a new lock tracking mechnism. Not complete, but the basics seem to work
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1038 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 03:25:29 +00:00
Abijah 8249ecc5cd Fixed defect found from visual inspection
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1037 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-03 03:05:03 +00:00
Abijah f50db1a34b Added ability to get a customer's running balance. It's quite flaky, doesn't tolerate having a grid with sub-pages, is actually incorrect for at least some customers (not sure why), but it helps answer a fundamental question for most customers. If I had a better solution, I would surely go for it.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1036 97e9348a-65ac-dc4b-aefc-98561f571b83
2014-03-02 18:26:01 +00:00
Abijah f85481c7ec Removed the Quickbooks Invoice/Credits, since I created a line item in quickbooks for the credits and enter the whole thing in one shot.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1035 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 21:30:24 +00:00
Abijah 75c635a5ea Added customer ID to customer grid
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1034 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 02:09:40 +00:00
Abijah 4cc81c2ebc Added ability to re-open a lease
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1033 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 02:00:51 +00:00
Abijah 20df22a002 Changed sort order on the deposit slip, since date received is not useful to a bank teller.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1032 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 01:36:44 +00:00
Abijah 49a379d799 Changed column widths, spurred by the deposit slips not showing the item numbers fully, while giving too much room to Type
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1031 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 01:31:25 +00:00
Abijah 98d9849914 Merge in the hosted_migration_20130215 branch to the v0.3_work branch
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1030 97e9348a-65ac-dc4b-aefc-98561f571b83
2013-12-05 01:24:21 +00:00
abijah 20284046c3 Fixed bug charging customers again when there is not charge through date.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1019 97e9348a-65ac-dc4b-aefc-98561f571b83
2012-11-17 18:20:48 +00:00
abijah 99a98cbc7d Added some minor view tweaks
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1018 97e9348a-65ac-dc4b-aefc-98561f571b83
2012-11-17 18:18:36 +00:00
abijah fc9226594c Added customer link on the receipts page
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1017 97e9348a-65ac-dc4b-aefc-98561f571b83
2012-08-07 00:14:54 +00:00
abijah 352bdbbf49 Fixed non-backward compatible jqGrid issue caused during upgrade from 3.8.x to 4.0.0 (grid.postext.js module is no longer supported and is now a plugin)
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1016 97e9348a-65ac-dc4b-aefc-98561f571b83
2012-08-07 00:11:03 +00:00
abijah 11fbdf0701 Upgraded to jqGrid 4.4.0
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1015 97e9348a-65ac-dc4b-aefc-98561f571b83
2012-08-06 17:57:49 +00:00
abijah 2519f4c8a7 Added support for account name and number on the deposit slips
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1014 97e9348a-65ac-dc4b-aefc-98561f571b83
2012-08-06 17:33:21 +00:00
abijah b6ed57c02c Checking in changes from some time ago, changing the reports screen to give direct Quickbooks invoice and credits info.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1013 97e9348a-65ac-dc4b-aefc-98561f571b83
2012-06-14 01:32:44 +00:00
abijah 4dffa540a0 Fixed a long standing bug preventing proper display of the customer-contact relationship fields.
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1010 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-05-11 19:19:08 +00:00
abijah 3d1c4d2492 Added income / expense reports that produce results suitable for entry into quickbooks as per the current paradigm
git-svn-id: file:///svn-source/pmgr/branches/v0.3_work@1009 97e9348a-65ac-dc4b-aefc-98561f571b83
2011-03-30 16:57:28 +00:00
52 changed files with 3008 additions and 1307 deletions
+14 -19
View File
@@ -1,25 +1,20 @@
<IfModule mod_rewrite.c> <IfModule mod_rewrite.c>
RewriteEngine on RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L] RewriteRule ^$ webroot/ [L]
# Need this prevent a 400 error without trailing /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) webroot/$1 [L]
</IfModule> </IfModule>
# Lets deny everyone -- its a clean slate! # Need to make sure directories can't be listed, since the rewrite
order deny,allow # rule excludes rewriting when an actual directory is requested
deny from all Options -Indexes
# Now allow local access
# Localhost
# allow from 127.0.0
# Local subnet
# allow from 192.168.7
# Provide a mechanism for user authentication # Provide a mechanism for user authentication
AuthType Digest AuthType Basic
AuthName "Property Manager" AuthName "Valley Storage"
AuthUserFile "D:/Website/auth/pmgr.htpasswd" AuthUserFile "/home/perki2/valley_storage.pmgr.htpasswd"
Require valid-user Require valid-user
# Instead of satisfy all (too restrictive)
# This allows EITHER local domain OR authenticated user
satisfy any
+86 -17
View File
@@ -37,7 +37,7 @@
class AppController extends Controller { class AppController extends Controller {
var $uses = array('Option', 'Permission'); var $uses = array('Option', 'Permission');
var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid'); var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid');
var $components = array('DebugKit.Toolbar'); //var $components = array('DebugKit.Toolbar');
var $sidemenu = array('areas' => array('SITE' => false, 'REPORT' => false, 'CONTROLLER' => false, 'ACTION' => false, 'SANDBOX' => false)); var $sidemenu = array('areas' => array('SITE' => false, 'REPORT' => false, 'CONTROLLER' => false, 'ACTION' => false, 'SANDBOX' => false));
var $std_area = 10; var $std_area = 10;
@@ -200,6 +200,9 @@ class AppController extends Controller {
$this->addSideMenuLink('Units', $this->addSideMenuLink('Units',
array('controller' => 'units', 'action' => 'index'), null, array('controller' => 'units', 'action' => 'index'), null,
'SITE'); 'SITE');
$this->addSideMenuLink('Locks',
array('controller' => 'locks', 'action' => 'index'), null,
'SITE');
$this->addSideMenuLink('Leases', $this->addSideMenuLink('Leases',
array('controller' => 'leases', 'action' => 'index'), null, array('controller' => 'leases', 'action' => 'index'), null,
'SITE'); 'SITE');
@@ -272,14 +275,26 @@ class AppController extends Controller {
$this->addSideMenuLink('Unpaid Charges', $this->addSideMenuLink('Unpaid Charges',
array('controller' => 'statement_entries', 'action' => 'unpaid'), null, array('controller' => 'statement_entries', 'action' => 'unpaid'), null,
'REPORT'); 'REPORT');
$this->addSideMenuLink('Lease Up',
array('controller' => 'leases', 'action' => 'overview'), null,
'REPORT');
$this->addSideMenuLink('Unit Summary', $this->addSideMenuLink('Unit Summary',
array('controller' => 'units', 'action' => 'overview'), null, array('controller' => 'units', 'action' => 'overview'), null,
'REPORT'); 'REPORT');
$this->addSideMenuLink('Monthly Charges', $this->addSideMenuLink('Lease Up',
array('controller' => 'statement_entries', 'action' => 'chargesbymonth'), null, array('controller' => 'leases', 'action' => 'overview'), null,
'REPORT');
/* $this->addSideMenuLink('Monthly Income', */
/* array('controller' => 'statement_entries', 'action' => 'incomebymonth'), null, */
/* 'REPORT'); */
/* $this->addSideMenuLink('Monthly Expenses', */
/* array('controller' => 'statement_entries', 'action' => 'expensebymonth'), null, */
/* 'REPORT'); */
/* $this->addSideMenuLink('Quickbook Invoice', */
/* array('controller' => 'statement_entries', 'action' => 'incomebymonth', 4, 1), null, */
/* 'REPORT'); */
/* $this->addSideMenuLink('Quickbook Credits', */
/* array('controller' => 'statement_entries', 'action' => 'expensebymonth', 4, 0), null, */
/* 'REPORT'); */
$this->addSideMenuLink('Monthly Income',
array('controller' => 'statement_entries', 'action' => 'netbymonth'), null,
'REPORT'); 'REPORT');
} }
else { else {
@@ -349,8 +364,8 @@ class AppController extends Controller {
if ($this->dev() && !$this->Option->enabled('dev')) if ($this->dev() && !$this->Option->enabled('dev'))
$this->redirect("/"); $this->redirect("/");
if ($this->dev()) if (!$this->dev())
Configure::write('debug', 2); Configure::write('debug', '0');
$this->addDefaultSideMenuLinks(); $this->addDefaultSideMenuLinks();
//$this->sideMenuEnable('SITE', $this->op_area, false); //$this->sideMenuEnable('SITE', $this->op_area, false);
@@ -452,7 +467,8 @@ class AppController extends Controller {
App::import('Helper', 'Html'); App::import('Helper', 'Html');
$url = HtmlHelper::url($url, true); $url = HtmlHelper::url($url, true);
if (headers_sent()) { if (headers_sent() ||
($this->dev() && $this->Option->enabled('dev'))) {
// If we've already sent the headers, it's because // If we've already sent the headers, it's because
// we're debugging, and our debug output has gotten // we're debugging, and our debug output has gotten
// out before the redirect. That's probably a good // out before the redirect. That's probably a good
@@ -526,6 +542,9 @@ class AppController extends Controller {
// Retreive the appropriate subset of data // Retreive the appropriate subset of data
$records = $this->gridDataRecords($params, $model, $pagination); $records = $this->gridDataRecords($params, $model, $pagination);
// If subtotaling, figure out the running total before pagination...
$this->gridDataRecordsRunningSubtotal($params, $model, $pagination);
// Post process the records // Post process the records
$this->gridDataPostProcess($params, $model, $records); $this->gridDataPostProcess($params, $model, $records);
@@ -639,6 +658,9 @@ class AppController extends Controller {
$query = array_intersect_key($this->gridDataCountTableSet($params, $model), $query = array_intersect_key($this->gridDataCountTableSet($params, $model),
array('link'=>1, 'contain'=>1)); array('link'=>1, 'contain'=>1));
// Conditions for the count
$query['fields'] = array($this->gridDataCountField($params, $model));
// Conditions for the count // Conditions for the count
$query['conditions'] = $this->gridDataCountConditionSet($params, $model); $query['conditions'] = $this->gridDataCountConditionSet($params, $model);
@@ -668,6 +690,10 @@ class AppController extends Controller {
array('link'=>1, 'contain'=>1)); array('link'=>1, 'contain'=>1));
} }
function gridDataCountField(&$params, &$model) {
return "COUNT(DISTINCT `".$model->alias.'`.`'.$model->primaryKey."`) AS 'count'";
}
function gridDataCountConditions(&$params, &$model) { function gridDataCountConditions(&$params, &$model) {
// Same conditions for counting as for retreiving // Same conditions for counting as for retreiving
return $this->gridDataConditions($params, $model); return $this->gridDataConditions($params, $model);
@@ -1022,6 +1048,53 @@ class AppController extends Controller {
return $model->find($type, $query); return $model->find($type, $query);
} }
function gridDataRecordsRunningSubtotal(&$params, $model, $pagination) {
// REVISIT <AP>: 20090722
// Horrible solution to something that should be done
// in SQL. Doesn't really work, but for a grid that contains
// ALL records, and is sorted on the correct field, it does
// actually work.
//
// If this function worked correctly, this mechanism would also
// work for grids that did not contain ALL records.
$subtotals = array();
foreach ($params['post']['fields'] AS $field) {
if (preg_match('/subtotal-(.*)$/', $field, $matches))
$subtotals[] = array('field' => $matches[1],
'name' => $field,
'amount' => 0);
}
// This part, if functioning, should do a sub-total off all records
// that are not part of the grid, instead of starting at zero, so that
// the totals come out correctly for the each record entry.
/* $pagination['start'] = $pagination['start'] + $pagination['limit']; */
/* $pagination['limit'] = 10000000; */
/* // Retreive the appropriate subset of data */
/* $params_copy = $params; */
/* $records = $this->gridDataRecords($params_copy, $model, $pagination); */
/* foreach ($records AS &$record) { */
/* foreach ($subtotals AS &$subtotal) { */
/* $field = $subtotal['field']; */
/* if (preg_match("/\./", $field)) { */
/* list($tbl, $col) = explode(".", $field); */
/* $record['subtotal-'.$tbl][$col] = */
/* ($subtotal['amount'] += $record[$tbl][$col]); */
/* } */
/* else { */
/* $record[$model->alias]['subtotal-'.$field] = */
/* ($subtotal['amount'] += $record[$model->alias][$field]); */
/* } */
/* } */
/* } */
$params['subtotals'] = $subtotals;
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
@@ -1072,15 +1145,11 @@ class AppController extends Controller {
// REVISIT <AP>: 20090722 // REVISIT <AP>: 20090722
// Horrible solution to something that should be done // Horrible solution to something that should be done
// in SQL. But, it works for now, so what the heck... // in SQL. Doesn't really work, but for a grid that contains
// ALL records, and is sorted on the correct field, it does
// actually work.
$subtotals = array(); $subtotals = $params['subtotals'];
foreach ($params['post']['fields'] AS $field) {
if (preg_match('/subtotal-(.*)$/', $field, $matches))
$subtotals[] = array('field' => $matches[1],
'name' => $field,
'amount' => 0);
}
foreach ($records AS &$record) { foreach ($records AS &$record) {
foreach ($subtotals AS &$subtotal) { foreach ($subtotals AS &$subtotal) {
-5
View File
@@ -1,5 +0,0 @@
@echo off
mysqldump --user=pmgr --password=pmgruser --opt property_manager > H:\pmgr_dev.sql
mysql --user=pmgr --password=pmgruser --database=pmgr_dev < H:\pmgr_dev.sql
del H:\pmgr_dev.sql
echo Build Complete!
-5
View File
@@ -1,5 +0,0 @@
@echo off
mysqldump --user=pmgr --password=pmgruser --opt property_manager > H:\pmgr_sand.sql
mysql --user=pmgr --password=pmgruser --database=pmgr_sand < H:\pmgr_sand.sql
del H:\pmgr_sand.sql
echo Build Complete!
+1 -1
View File
@@ -38,7 +38,7 @@
* In production mode, flash messages redirect after a time interval. * In production mode, flash messages redirect after a time interval.
* In development mode, you need to click the flash message to continue. * In development mode, you need to click the flash message to continue.
*/ */
Configure::write('debug', 0); Configure::write('debug', 2);
/** /**
* Application wide charset encoding * Application wide charset encoding
*/ */
+6 -6
View File
@@ -5,17 +5,17 @@ class DATABASE_CONFIG {
'driver' => 'mysql', 'driver' => 'mysql',
'persistent' => false, 'persistent' => false,
'host' => 'localhost', 'host' => 'localhost',
'login' => 'pmgr', 'login' => 'perki2_pmgruser',
'password' => 'pmgruser', 'password' => 'pmgrauth',
'database' => 'property_manager', 'database' => 'perki2_pmgr',
'prefix' => 'pmgr_', 'prefix' => '',
); );
function __construct() { function __construct() {
if (devbox()) if (devbox())
$this->default['database'] = 'pmgr_dev'; $this->default['database'] = 'perki2_pmgr_dev';
if (sandbox()) if (sandbox())
$this->default['database'] = 'pmgr_sand'; $this->default['database'] = 'perki2_pmgr_sand';
} }
} }
?> ?>
+25 -14
View File
@@ -334,15 +334,6 @@ class LeasesController extends AppController {
* - Closes a lease to any further action * - Closes a lease to any further action
*/ */
// REVISIT <AP>: 20090809
// While cleaning up the sitelink data, then delete reldep()
function reldep($id) {
$this->Lease->id = $id;
$stamp = $this->Lease->field('moveout_date');
$this->Lease->releaseSecurityDeposits($id, $stamp);
$this->redirect(array('action'=>'view', $id));
}
function close($id) { function close($id) {
// REVISIT <AP>: 20090708 // REVISIT <AP>: 20090708
// We should probably seek confirmation first... // We should probably seek confirmation first...
@@ -355,6 +346,21 @@ class LeasesController extends AppController {
$this->redirect(array('action'=>'view', $id)); $this->redirect(array('action'=>'view', $id));
} }
/**************************************************************************
**************************************************************************
**************************************************************************
* action: open
* - Re-opens a lease for further action
*/
function open($id) {
// REVISIT <AP>: 20131204
// We should probably seek confirmation first, since this wipes out
// the old close date, with no way to restore that date.
$this->Lease->reopen($id);
$this->redirect(array('action'=>'view', $id));
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
@@ -574,13 +580,18 @@ class LeasesController extends AppController {
$this->addSideMenuLink('Write-Off', $this->addSideMenuLink('Write-Off',
array('action' => 'bad_debt', $id), null, array('action' => 'bad_debt', $id), null,
'ACTION'); 'ACTION');
if ($this->Lease->closeable($id))
$this->addSideMenuLink('Close',
array('action' => 'close', $id), null,
'ACTION');
} }
if ($this->Lease->closeable($id))
$this->addSideMenuLink('Close',
array('action' => 'close', $id), null,
'ACTION');
if ($this->Lease->isClosed($id))
$this->addSideMenuLink('Re-Open',
array('action' => 'open', $id), null,
'ACTION');
// Prepare to render // Prepare to render
$title = 'Lease: #' . $lease['Lease']['id']; $title = 'Lease: #' . $lease['Lease']['id'];
$this->set(compact('lease', 'title', $this->set(compact('lease', 'title',
+216
View File
@@ -0,0 +1,216 @@
<?php
class LocksController extends AppController {
/**************************************************************************
**************************************************************************
**************************************************************************
* override: addGridViewSideMenuLinks
* - Adds grid view navigation side menu links
*/
function addGridViewSideMenuLinks() {
parent::addGridViewSideMenuLinks();
$this->addSideMenuLink('List',
array('controller' => 'locks', 'action' => 'all'), null,
'CONTROLLER');
$this->addSideMenuLink('Add',
array('controller' => 'locks', 'action' => 'add'), null,
'CONTROLLER');
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: index / all
* - Generate a listing of locks
*/
function index() { $this->all(); }
function all() { $this->gridView('Locks', 'all'); }
/**************************************************************************
**************************************************************************
**************************************************************************
* virtuals: gridData
* - With the application controller handling the gridData action,
* these virtual functions ensure that the correct data is passed
* to jqGrid.
*/
/* function gridDataCountTables(&$params, &$model) { */
/* return array('link' => array('Unit')); */
/* } */
function gridDataTables(&$params, &$model) {
$tables = parent::gridDataTables($params, $model);
$tables['link']['LocksUnit'] = array();
return $tables;
}
function gridDataFields(&$params, &$model) {
$fields = parent::gridDataFields($params, $model);
$fields[] = 'COUNT(LocksUnit.id) AS inuse';
$fields[] = 'IF(Lock.qty > COUNT(LocksUnit.id), Lock.qty - COUNT(LocksUnit.id), 0) AS avail';
return $fields;
}
function gridDataPostProcessLinks(&$params, &$model, &$records, $links) {
$links['Lock'] = array('name');
return parent::gridDataPostProcessLinks($params, $model, $records, $links);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: view
* - Displays information about a specific entry
*/
function view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'locks', 'action'=>'index'));
}
// Get the lock and related fields
$this->Lock->id = $id;
$lock = $this->Lock->find
('first', array
('contain' => array(),
));
//$lock['Lock'] = $lock[0] + $lock['lock'];
//unset($lock[0]);
$this->addSideMenuLink('Edit',
array('action' => 'edit', $id), null,
'ACTION');
$this->addSideMenuLink('Delete',
array('action' => 'delete', $id), null,
'ACTION');
$this->set(compact('lock'));
// Prepare to render.
$title = "Lock : {$lock['Lock']['name']}";
$this->set(compact('title'));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: edit
* - Edit customer information
*/
function edit($id = null) {
if (isset($this->data)) {
// Check to see if the operation was cancelled.
if (isset($this->params['form']['cancel'])) {
if (isset($this->data['Lock']['id']))
$this->redirect(array('action'=>'view', $this->data['Lock']['id']));
$this->redirect(array('action'=>'index'));
}
// Save the lock and all associated data
if (!$this->Lock->saveLock($this->data)) {
$this->Session->setFlash("LOCK SAVE FAILED", true);
pr("LOCK SAVE FAILED");
}
// View the lock by redirect
$this->redirect(array('action'=>'view', $this->Lock->id));
}
if ($id) {
// Get details on this customer, its contacts and leases
$lock = $this->Lock->find
('first', array
('conditions' => array('Lock.id' => $id),
));
$this->data = $lock;
$title = 'Lock: ' . $this->data['Lock']['name'] . " : Edit";
}
else {
$title = "Enter New Lock Information";
$this->data = array();
}
// Prepare to render.
//pr($this->data);
$this->set(compact('title'));
$this->render('edit');
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: add
* - Add a new lock
*/
function add() {
$this->edit();
}
/**************************************************************************
**************************************************************************
**************************************************************************
* action: delete
* - Deletes an old lock
*/
function delete($id) {
if (isset($this->data)) {
// Check to see if the operation was cancelled.
if (isset($this->params['form']['cancel'])) {
if (isset($this->data['Lock']['id']))
$this->redirect(array('action'=>'view', $this->data['Lock']['id']));
$this->redirect(array('action'=>'index'));
}
// Delete the lock and all associated data
if (!$this->Lock->destroy($this->data['Lock']['id'])) {
$this->Session->setFlash(__('Failed to delete lock.', true));
$this->redirect(array('action'=>'view', $this->data['Lock']['id']));
}
// It's gone. Go back to the list of locks
$this->redirect(array('controller' => 'locks', 'action'=>'index'));
}
// User must specify an ID.
if (!$id) {
$this->Session->setFlash(__('Invalid Item.', true));
$this->redirect(array('controller' => 'locks', 'action'=>'index'));
}
// Get the lock and related fields
$this->Lock->id = $id;
$lock = $this->Lock->find
('first', array
('contain' => array('Unit'),
));
// Make sure the lock isn't in use.
if (isset($lock['Unit']) && count($lock['Unit']) > 0) {
$this->Session->setFlash(__('Lock currently on units. Cannot be deleted!', true));
$this->redirect(array('action'=>'view', $id));
}
// Prepare to render.
$this->data = $lock;
$title = "Delete Lock : {$lock['Lock']['name']}";
$this->set(compact('title'));
}
}
@@ -260,38 +260,65 @@ class StatementEntriesController extends AppController {
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
* action: chargesbymonth * action: incexpbymonth
* - Displays charges by month * - Displays income and/or expenses by month
*/ */
function chargesbymonth($months = 12) { function incexpbymonth($accts, $security_deposits, $months) {
$datefrom = 'DATE(NOW() - INTERVAL '.($months-1).' MONTH - INTERVAL DAY(NOW())-1 DAY)';
$dateto = 'NOW()';
/* $datefrom = '"2009-01-01"'; */
/* $dateto = '"2012-12-31"'; */
$result = $this->StatementEntry->find $result = $this->StatementEntry->find
('all', ('all',
array('link' => array('Account' => array('fields' => 'name')), array('link' => array('Account' => array('fields' => 'name')),
'fields' => array_merge(array('MONTHNAME(effective_date) AS month', 'fields' => array_merge(array('MONTHNAME(effective_date) AS month',
'YEAR(effective_date) AS year'), 'YEAR(effective_date) AS year'),
$this->StatementEntry->chargeDisbursementFields(true)), $this->StatementEntry->chargeDisbursementFields(true)),
'conditions' => array('Account.type' => 'INCOME', 'conditions' => array('Account.type' => $accts,
'effective_date >= DATE(NOW() - INTERVAL '.($months-1).' MONTH - INTERVAL DAY(NOW())-1 DAY)', "effective_date >= $datefrom",
'effective_date <= NOW()', "effective_date <= $dateto",
), ),
'group' => array('YEAR(effective_date)', 'MONTH(effective_date)', 'Account.id'), 'group' => array('YEAR(effective_date)', 'MONTH(effective_date)', 'Account.id'),
'order' => array('YEAR(effective_date) DESC', 'MONTH(effective_date) DESC', 'Account.name'), 'order' => array('YEAR(effective_date) DESC', 'MONTH(effective_date) DESC', 'Account.type',
'IF(Account.id = '.$this->StatementEntry->Account->rentAccountID().', "---", Account.name)'),
)); ));
$overview = array('months' => array(), 'charges' => 0); if ($security_deposits) {
foreach ($result AS $row) { $sdresult = $this->StatementEntry->Transaction->LedgerEntry->find
('all',
array('link' => array('Transaction' => array('StatementEntry' => array('fields' => 'effective_date'),
'fields' => array()),
'Account' => array('fields' => 'name')),
'fields' => array_merge(array('MONTHNAME(effective_date) AS month',
'YEAR(effective_date) AS year'),
$this->StatementEntry->Transaction->LedgerEntry->debitCreditFields(true)),
'conditions' => array('LedgerEntry.account_id' => $this->StatementEntry->Account->securityDepositAccountID(),
"effective_date >= $datefrom",
"effective_date <= $dateto",
'StatementEntry.id = (SELECT MIN(id) FROM statement_entries WHERE transaction_id = `Transaction`.id)'
),
'group' => array('YEAR(effective_date)', 'MONTH(effective_date)', 'Account.id'),
'order' => array('YEAR(effective_date) DESC', 'MONTH(effective_date) DESC', 'Account.type', 'Account.name'),
));
} else {
$sdresult = array();
}
$overview = array('months' => array(), 'amount' => 0);
foreach (array_merge($result, $sdresult) AS $row) {
$mname = $row[0]['month'] .', '. $row[0]['year']; $mname = $row[0]['month'] .', '. $row[0]['year'];
if (empty($overview['months'][$mname])) if (empty($overview['months'][$mname]))
$overview['months'][$mname] = array('name' => $mname, $overview['months'][$mname] = array('name' => $mname,
'subs' => array(), 'subs' => array(),
'charges' => 0); 'amount' => 0);
$month = &$overview['months'][$mname]; $month = &$overview['months'][$mname];
$month['subs'][] = array('name' => $row['Account']['name'], $month['subs'][] = array('name' => $row['Account']['name'],
'charges' => $row[0]['balance']); 'amount' => $row[0]['balance']);
$month['charges'] += $row[0]['balance']; $month['amount'] += $row[0]['balance'];
$overview['charges'] += $row[0]['balance']; $overview['amount'] += $row[0]['balance'];
} }
// Enable the Reports menu section // Enable the Reports menu section
@@ -299,8 +326,26 @@ class StatementEntriesController extends AppController {
// Prepare to render. // Prepare to render.
$this->set('months', $months); $this->set('months', $months);
$this->set('title', 'Monthly Charges');
$this->set(compact('overview')); $this->set(compact('overview'));
$this->render('chargesbymonth');
}
function incomebymonth($months = 12, $invoice = false) {
$this->set('title', 'Monthly Gross Income');
$this->set('reptype', 'Gross Income');
$this->incexpbymonth(array('INCOME'), $invoice, $months);
}
function expensebymonth($months = 12) {
$this->set('title', 'Gross Monthly Expenses');
$this->set('reptype', 'Gross Expenses');
$this->incexpbymonth(array('EXPENSE'), false, $months);
}
function netbymonth($months = 12) {
$this->set('title', 'Net Monthly Income');
$this->set('reptype', 'Net Income');
$this->incexpbymonth(array('INCOME', 'EXPENSE'), true, $months);
} }
+5 -4
View File
@@ -93,7 +93,8 @@ class TransactionsController extends AppController {
$fields[] = ("IF(Transaction.type = 'DEPOSIT'," . $fields[] = ("IF(Transaction.type = 'DEPOSIT'," .
" COUNT(DepositTender.id)," . " COUNT(DepositTender.id)," .
" COUNT(StatementEntry.id)) AS entries"); " COUNT(StatementEntry.id)) AS entries");
return $fields; return array_merge($fields,
$this->Transaction->LedgerEntry->debitCreditFields(false, true, 'Transaction'));
} }
function gridDataConditions(&$params, &$model) { function gridDataConditions(&$params, &$model) {
@@ -468,7 +469,7 @@ class TransactionsController extends AppController {
function deposit_slip($id) { function deposit_slip($id) {
// Find the deposit transaction // Find the deposit transaction
$this->Transaction->id = $id; $this->Transaction->id = $id;
$deposit = $this->Transaction->find('first', array('contain' => false)); $deposit = $this->Transaction->find('first', array('contain' => array('Account')));
// Get a summary of all forms of tender in the deposit // Get a summary of all forms of tender in the deposit
$tenders = $this->Transaction->find $tenders = $this->Transaction->find
@@ -503,8 +504,8 @@ class TransactionsController extends AppController {
foreach ($deposit['types'] AS $type) foreach ($deposit['types'] AS $type)
$deposit_total += $type['total']; $deposit_total += $type['total'];
if ($deposit['Transaction']['amount'] != $deposit_total) if (abs($deposit['Transaction']['amount'] - $deposit_total) >= .001)
$this->INTERNAL_ERROR("Deposit items do not add up to deposit slip total"); $this->INTERNAL_ERROR("Deposit items ($deposit_total) do not add up to deposit slip total (".$deposit['Transaction']['amount'].")");
$this->addSideMenuLink('View', $this->addSideMenuLink('View',
array('action' => 'view', $id), null, array('action' => 'view', $id), null,
+2 -2
View File
@@ -91,8 +91,8 @@ class UnitSizesController extends AppController {
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionUnavailable() . ', 1, 0)) AS unavailable'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionUnavailable() . ', 1, 0)) AS unavailable';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionAvailable() . ', 1, 0)) AS available'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionAvailable() . ', 1, 0)) AS available';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) AS occupied'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) AS occupied';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 0, 1)) / COUNT(unit.id) AS vacancy'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 0, 1)) / COUNT(Unit.id) AS vacancy';
$fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) / COUNT(unit.id) AS occupancy'; $fields[] = 'SUM(IF(' . $this->UnitSize->Unit->conditionOccupied() . ', 1, 0)) / COUNT(Unit.id) AS occupancy';
return $fields; return $fields;
} }
+77 -17
View File
@@ -83,6 +83,7 @@ class UnitsController extends AppController {
function gridDataTables(&$params, &$model) { function gridDataTables(&$params, &$model) {
$link = $this->gridDataCountTables($params, $model); $link = $this->gridDataCountTables($params, $model);
$link['link']['CurrentLease']['StatementEntry'] = array('fields' => array()); $link['link']['CurrentLease']['StatementEntry'] = array('fields' => array());
$link['link']['Lock'];
return $link; return $link;
} }
@@ -213,7 +214,7 @@ class UnitsController extends AppController {
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
* action: lock/unlock * action: lock/unlock/lien
* - Transitions the unit into / out of the LOCKED state * - Transitions the unit into / out of the LOCKED state
*/ */
@@ -221,8 +222,73 @@ class UnitsController extends AppController {
$this->Unit->updateStatus($id, $status, true); $this->Unit->updateStatus($id, $status, true);
$this->redirect(array('action' => 'view', $id)); $this->redirect(array('action' => 'view', $id));
} }
function lock($id) { $this->status($id, 'LOCKED'); }
function unlock($id) { $this->status($id, 'OCCUPIED'); } function lock($id) {
if (isset($this->data)) {
$id = $this->id = $this->data['Unit']['id'];
// Check to see if the operation was cancelled.
if (isset($this->params['form']['cancel'])) {
if (isset($id))
$this->redirect(array('action'=>'view', $id));
$this->redirect(array('action'=>'index'));
}
// Figure out which locks the user put on
$locks = array();
if (isset($this->data['Lock']) && is_array($this->data['Lock'])) {
foreach ($this->data['Lock'] AS $lock) {
$locks[] = $lock['id'];
}
}
// Save the lock and all associated data
if (!$this->Unit->lockUnit($id, $locks)) {
$this->Session->setFlash("UNIT LOCK FAILED", true);
pr("UNIT LOCK FAILED");
}
// If it's no longer locked, change status to OCCUPIED
// Could still be liened... but that would be odd.
if (count($locks) == 0)
$this->status($id, 'OCCUPIED');
// If we're not liened, we must now just be locked
if (!$this->Unit->liened(intval($id)))
$this->status($id, 'LOCKED');
// Otherwise, don't change anything.
$this->redirect(array('action' => 'view', $id));
}
if (!$id)
$this->INTERNAL_ERROR("$id cannot be NULL");
// Get all locks on this unit
$this->data = $this->Unit->find
('first',
array('contain' => array('Lock' => array('id')),
'fields' => array('id', 'name'),
'conditions' => array('Unit.id' => $id)
));
$locks = $this->Unit->Lock->lockList();
/* $locksold = $locks; */
/* foreach ($locksold AS $name) { */
/* $locks[$name] = $name; */
/* } */
$this->set(compact('locks'));
// Prepare to render.
//pr($this->data);
$this->set(compact('title'));
// $this->render('lock');
}
function unlock($id) { $this->lock($id); }
function lien($id) { $this->status($id, 'LIENED'); }
/************************************************************************** /**************************************************************************
@@ -306,6 +372,7 @@ class UnitsController extends AppController {
array('contain' => array('contain' =>
array(// Models array(// Models
'UnitSize', 'UnitSize',
'Lock',
'Lease' => array('Customer'), 'Lease' => array('Customer'),
'CurrentLease' => array('Customer') 'CurrentLease' => array('Customer')
), ),
@@ -331,23 +398,16 @@ class UnitsController extends AppController {
$outstanding_deposit = $this->Unit->Lease->securityDepositBalance($unit['CurrentLease']['id']); $outstanding_deposit = $this->Unit->Lease->securityDepositBalance($unit['CurrentLease']['id']);
} }
// If the unit is occupied, but not locked, provide a // Add a mechanism to lock ANY unit, regardless of status
// mechanism to do so. This doesn't have to be restricted $this->addSideMenuLink($this->Unit->lockCount($id) == 0 ? 'Lock' : 'Relock/Unlock',
// to past due customers. There are times we need to array('action' => 'lock', $id), null,
// overlock customers in good standing, such as if their 'ACTION');
// lock breaks, is cut, or missing for any reason.
if ($this->Unit->occupied($unit['Unit']['status']) &&
!$this->Unit->locked($unit['Unit']['status']))
$this->addSideMenuLink('Lock',
array('action' => 'Lock', $id), null,
'ACTION');
// If the unit is locked, provide an option to unlock it, // If the unit is locked, but not liened, give option to lien.
// unless it's locked due to lien, which is not so simple.
if ($this->Unit->locked($unit['Unit']['status']) && if ($this->Unit->locked($unit['Unit']['status']) &&
!$this->Unit->liened($unit['Unit']['status'])) !$this->Unit->liened($unit['Unit']['status']))
$this->addSideMenuLink('Unlock', $this->addSideMenuLink('Lien',
array('action' => 'unlock', $id), null, array('action' => 'lien', $id), null,
'ACTION'); 'ACTION');
// If there is a current lease on this unit, then provide // If there is a current lease on this unit, then provide
+7 -33
View File
@@ -4,31 +4,6 @@ class UtilController extends AppController {
var $uses = array(); var $uses = array();
/**************************************************************************
**************************************************************************
**************************************************************************
* function: reset_data
* - Development function. TO BE DELETED
*/
function reset_data() {
$this->layout = null;
$this->autoLayout = false;
$this->autoRender = false;
Configure::write('debug', '0');
$script = $_SERVER['DOCUMENT_ROOT'] . '/pmgr/build.cmd';
echo "<P>" . date('r') . "\n";
//echo "<P>Script: $script" . "\n";
$handle = popen($script . ' 2>&1', 'r');
//echo "<P>Handle: $handle; " . gettype($handle) . "\n";
echo "<P><PRE>\n";
while (($read = fread($handle, 2096))) {
echo $read;
}
echo "</PRE>\n";
pclose($handle);
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
@@ -40,21 +15,20 @@ class UtilController extends AppController {
$this->autoLayout = false; $this->autoLayout = false;
$this->autoRender = false; $this->autoRender = false;
Configure::write('debug', '0'); Configure::write('debug', '0');
$script = preg_replace('%/webroot/index.php$%',
'/build_'.$type.'box.cmd',
$_SERVER['SCRIPT_FILENAME']);
// REVISIT <AP>: 20090828 $usrpass = '--user=perki2_pmgruser --password=pmgrauth';
// Just use system call $boxdb = 'perki2_pmgr_' . $type;
$handle = popen($script . ' 2>&1', 'r');
$handle = popen("mysqldump $usrpass --opt perki2_pmgr" .
" | mysql $usrpass --database=$boxdb", 'r');
while (($read = fread($handle, 2096))) { while (($read = fread($handle, 2096))) {
// Do nothing // Do nothing
} }
pclose($handle); pclose($handle);
$url = $_SERVER['HTTP_REFERER']; $url = $_SERVER['HTTP_REFERER'];
if (empty($url)) if (empty($url) || $url == 'undefined')
$url = "/"; $url = "/$type";
$this->redirect($url); $this->redirect($url);
} }
+1 -1
View File
@@ -91,7 +91,7 @@ class Contact extends AppModel {
// If the user has entered all new data, we need to // If the user has entered all new data, we need to
// save that as a brand new entry. // save that as a brand new entry.
if (!isset($item['id'])) { if (!isset($item['id']) || $item['source'] == 'new') {
$I = new $class(); $I = new $class();
$I->create(); $I->create();
if (!$I->save($item, false)) { if (!$I->save($item, false)) {
+49
View File
@@ -347,6 +347,8 @@ class Lease extends AppModel {
$this->pr(17, compact('date', 'charge_through_date') $this->pr(17, compact('date', 'charge_through_date')
+ array('date_str' => date('Y-m-d', $date), + array('date_str' => date('Y-m-d', $date),
'charge_through_date_str' => date('Y-m-d', $charge_through_date))); 'charge_through_date_str' => date('Y-m-d', $charge_through_date)));
if (!$charge_through_date)
return $this->prReturn(null);
if ($charge_through_date >= $date) if ($charge_through_date >= $date)
return $this->prReturn(null); return $this->prReturn(null);
@@ -726,6 +728,53 @@ class Lease extends AppModel {
} }
/**************************************************************************
**************************************************************************
**************************************************************************
* function: reopen
* - Re-Opens the lease for further action
*/
function reopen($id) {
$this->prEnter(compact('id'));
if (!$this->isClosed($id))
return $this->prReturn(false);
// Reset the data
$this->create();
$this->id = $id;
// Set the close date
$this->data['Lease']['close_date'] = null;
// Save it!
$this->save($this->data, false);
// Update the current lease count for the customer
$this->Customer->updateLeaseCount($this->field('customer_id'));
return $this->prReturn(true);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: isClosed
* - Checks to see if the lease is closed
*/
function isClosed($id) {
$this->prEnter(compact('id'));
$this->recursive = -1;
$this->read(null, $id);
return $this->prReturn(!empty($this->data['Lease']['close_date']));
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
+110
View File
@@ -0,0 +1,110 @@
<?php
class Lock extends AppModel {
var $name = 'Lock';
var $validate = array(
'id' => array('numeric'),
'name' => array('notempty'),
'key' => array('notempty')
);
var $hasMany = array(
'LocksUnits'
);
var $hasAndBelongsToMany = array(
'Unit'
);
var $default_log_level = array('log' => 30, 'show' => 15);
/**************************************************************************
**************************************************************************
**************************************************************************
* function: saveLock
* - save data about a new or existing lock
*/
function saveLock($data) {
$this->prEnter(compact('data'));
$id = $data['Lock']['id'];
if ($id) {
$this->id = $id;
// Save the old key
$oldkey = $this->field('key');
$this->pr(5, compact('oldkey'));
if ($this->field('key') != $data['Lock']['key']) {
$data['Lock']['key_last'] = $this->field('key');
$data['Lock']['key_ts'] = date('Y-m-d G:i:s');
}
/* // Find the number of outstanding locks in use */
/* $locks = $this->find('first', */
/* array('link' => array('Unit' => array('fields' => array('Unit.id'))), */
/* 'fields' => 'SUM(Unit.id) AS inuse', */
/* 'conditions' => array('Lock.id' => $id), */
/* )); */
/* $this->pr(5, compact('locks')); */
/* // Can't reduce the locks if there are all in use */
/* if ($locks[0]['inuse'] > $data['Lock']['qty']) */
/* return $this->prReturn(false); */
}
else {
// Brand new lock
}
if (!$data['Lock']['qty'])
$data['Lock']['qty'] = 1;
// Everything looks good... save it!
return $this->prReturn($this->save($data, false));
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: destroy
* - destroys a lock
*/
function destroy($id) {
$this->prEnter(compact('id'));
// Can't delete a lock that's in use... check.
$this->id = $id;
$lock = $this->find
('first', array
('contain' => array('Unit'),
));
// If it's in use, bail with error
$this->pr(1, $lock);
if (isset($lock['Unit']) && count($lock['Unit']) > 0)
return $this->prReturn(false);
// Otherwise, attempt to delete the lock from the database
return $this->prReturn($this->delete());
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: lockList
* - list of all locks in the system
*/
function lockList() {
return $this->find('list',
array('order' =>
array('name'),
));
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
class LocksUnit extends AppModel {
var $primaryKey = false;
var $belongsTo = array(
'Lock',
'Unit',
);
}
?>
+56
View File
@@ -25,6 +25,11 @@ class Unit extends AppModel {
var $hasMany = array( var $hasMany = array(
'Lease', 'Lease',
'LocksUnit'
);
var $hasAndBelongsToMany = array(
'Lock'
); );
//var $default_log_level = array('log' => 30, 'show' => 15); //var $default_log_level = array('log' => 30, 'show' => 15);
@@ -209,6 +214,57 @@ class Unit extends AppModel {
} }
/**************************************************************************
**************************************************************************
**************************************************************************
* function: lockUnit
* - Put lock on unit
*/
function lockUnit($id, $lock_ids) {
$this->prEnter(compact('id', 'lock_ids'));
$this->id = $id;
// Remove any exising locks for this unit
$this->LocksUnit->deleteAll
(array('unit_id' => $id), false);
// We'll proceed forward as much as possible, even
// if we encounter an error. For now, we'll assume
// the operation will succeed.
$ret = true;
// Go through each lock, and put them on the unit
foreach ($lock_ids AS $lock_id) {
$pair['unit_id'] = $id;
$pair['lock_id'] = $lock_id;
// Save the relationship between lock and unit
$LU = new LocksUnit();
if (!$LU->save($pair, false))
$ret = false;
}
return $this->prReturn($ret);
}
/**************************************************************************
**************************************************************************
**************************************************************************
* function: lockCount
* - Number of locks on a unit
*/
function lockCount($id) {
$this->prEnter(compact('id'));
return $this->prReturn($this->find
('count', array
('fields' => array("COUNT(Lock.id) AS count"),
'link' => array('Lock'),
'conditions' => array('Unit.id' => $id),
)));
}
/************************************************************************** /**************************************************************************
************************************************************************** **************************************************************************
************************************************************************** **************************************************************************
@@ -1,471 +1,471 @@
<?php <?php
/* SVN FILE: $Id$ */ /* SVN FILE: $Id$ */
/** /**
* DebugKit DebugToolbar Component * DebugKit DebugToolbar Component
* *
* *
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP : Rapid Development Framework <http://www.cakephp.org/> * CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc. * Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204 * 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104 * Las Vegas, Nevada 89104
* *
* Licensed under The MIT License * Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. * Redistributions of files must retain the above copyright notice.
* *
* @filesource * @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc. * @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake * @package cake
* @subpackage cake.cake.libs. * @subpackage cake.cake.libs.
* @since CakePHP v 1.2.0.4487 * @since CakePHP v 1.2.0.4487
* @version $Revision$ * @version $Revision$
* @modifiedby $LastChangedBy$ * @modifiedby $LastChangedBy$
* @lastmodified $Date$ * @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License * @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
class ToolbarComponent extends Object { class ToolbarComponent extends Object {
/** /**
* Controller instance reference * Controller instance reference
* *
* @var object * @var object
*/ */
var $controller; var $controller;
/** /**
* Components used by DebugToolbar * Components used by DebugToolbar
* *
* @var array * @var array
*/ */
var $components = array('RequestHandler'); var $components = array('RequestHandler');
/** /**
* The default panels the toolbar uses. * The default panels the toolbar uses.
* which panels are used can be configured when attaching the component * which panels are used can be configured when attaching the component
* *
* @var array * @var array
*/ */
var $_defaultPanels = array('session', 'request', 'sqlLog', 'timer', 'log', 'memory', 'variables'); var $_defaultPanels = array('session', 'request', 'sqlLog', 'timer', 'log', 'memory', 'variables');
/** /**
* Loaded panel objects. * Loaded panel objects.
* *
* @var array * @var array
*/ */
var $panels = array(); var $panels = array();
/** /**
* fallback for javascript settings * fallback for javascript settings
* *
* @var array * @var array
**/ **/
var $_defaultJavascript = array( var $_defaultJavascript = array(
'behavior' => '/debug_kit/js/js_debug_toolbar' 'behavior' => '/debug_kit/js/js_debug_toolbar'
); );
/** /**
* javascript files component will be using. * javascript files component will be using.
* *
* @var array * @var array
**/ **/
var $javascript = array(); var $javascript = array();
/** /**
* initialize * initialize
* *
* If debug is off the component will be disabled and not do any further time tracking * If debug is off the component will be disabled and not do any further time tracking
* or load the toolbar helper. * or load the toolbar helper.
* *
* @return bool * @return bool
**/ **/
function initialize(&$controller, $settings) { function initialize(&$controller, $settings) {
if (Configure::read('debug') == 0) { if (Configure::read('debug') == 0) {
$this->enabled = false; $this->enabled = false;
return false; return false;
} }
App::import('Vendor', 'DebugKit.DebugKitDebugger'); App::import('Vendor', 'DebugKit.DebugKitDebugger');
DebugKitDebugger::startTimer('componentInit', __('Component initialization and startup', true)); DebugKitDebugger::startTimer('componentInit', __('Component initialization and startup', true));
if (!isset($settings['panels'])) { if (!isset($settings['panels'])) {
$settings['panels'] = $this->_defaultPanels; $settings['panels'] = $this->_defaultPanels;
} }
if (isset($settings['javascript'])) { if (isset($settings['javascript'])) {
$settings['javascript'] = $this->_setJavascript($settings['javascript']); $settings['javascript'] = $this->_setJavascript($settings['javascript']);
} else { } else {
$settings['javascript'] = $this->_defaultJavascript; $settings['javascript'] = $this->_defaultJavascript;
} }
$this->_loadPanels($settings['panels']); $this->_loadPanels($settings['panels']);
unset($settings['panels']); unset($settings['panels']);
$this->_set($settings); $this->_set($settings);
$this->controller =& $controller; $this->controller =& $controller;
return false; return false;
} }
/** /**
* Component Startup * Component Startup
* *
* @return bool * @return bool
**/ **/
function startup(&$controller) { function startup(&$controller) {
$currentViewClass = $controller->view; $currentViewClass = $controller->view;
$this->_makeViewClass($currentViewClass); $this->_makeViewClass($currentViewClass);
$controller->view = 'DebugKit.Debug'; $controller->view = 'DebugKit.Debug';
if (!isset($controller->params['url']['ext']) || (isset($controller->params['url']['ext']) && $controller->params['url']['ext'] == 'html')) { if (!isset($controller->params['url']['ext']) || (isset($controller->params['url']['ext']) && $controller->params['url']['ext'] == 'html')) {
$format = 'Html'; $format = 'Html';
} else { } else {
$format = 'FirePhp'; $format = 'FirePhp';
} }
$controller->helpers['DebugKit.Toolbar'] = array('output' => sprintf('DebugKit.%sToolbar', $format)); $controller->helpers['DebugKit.Toolbar'] = array('output' => sprintf('DebugKit.%sToolbar', $format));
$panels = array_keys($this->panels); $panels = array_keys($this->panels);
foreach ($panels as $panelName) { foreach ($panels as $panelName) {
$this->panels[$panelName]->startup($controller); $this->panels[$panelName]->startup($controller);
} }
DebugKitDebugger::stopTimer('componentInit'); DebugKitDebugger::stopTimer('componentInit');
DebugKitDebugger::startTimer('controllerAction', __('Controller Action', true)); DebugKitDebugger::startTimer('controllerAction', __('Controller Action', true));
} }
/** /**
* beforeRender callback * beforeRender callback
* *
* Calls beforeRender on all the panels and set the aggregate to the controller. * Calls beforeRender on all the panels and set the aggregate to the controller.
* *
* @return void * @return void
**/ **/
function beforeRender(&$controller) { function beforeRender(&$controller) {
DebugKitDebugger::stopTimer('controllerAction'); DebugKitDebugger::stopTimer('controllerAction');
$vars = array(); $vars = array();
$panels = array_keys($this->panels); $panels = array_keys($this->panels);
foreach ($panels as $panelName) { foreach ($panels as $panelName) {
$panel =& $this->panels[$panelName]; $panel =& $this->panels[$panelName];
$vars[$panelName]['content'] = $panel->beforeRender($controller); $vars[$panelName]['content'] = $panel->beforeRender($controller);
$elementName = Inflector::underscore($panelName) . '_panel'; $elementName = Inflector::underscore($panelName) . '_panel';
if (isset($panel->elementName)) { if (isset($panel->elementName)) {
$elementName = $panel->elementName; $elementName = $panel->elementName;
} }
$vars[$panelName]['elementName'] = $elementName; $vars[$panelName]['elementName'] = $elementName;
$vars[$panelName]['plugin'] = $panel->plugin; $vars[$panelName]['plugin'] = $panel->plugin;
$vars[$panelName]['disableTimer'] = true; $vars[$panelName]['disableTimer'] = true;
} }
$controller->set(array('debugToolbarPanels' => $vars, 'debugToolbarJavascript' => $this->javascript)); $controller->set(array('debugToolbarPanels' => $vars, 'debugToolbarJavascript' => $this->javascript));
DebugKitDebugger::startTimer('controllerRender', __('Render Controller Action', true)); DebugKitDebugger::startTimer('controllerRender', __('Render Controller Action', true));
} }
/** /**
* Load Panels used in the debug toolbar * Load Panels used in the debug toolbar
* *
* @return void * @return void
* @access protected * @access protected
**/ **/
function _loadPanels($panels) { function _loadPanels($panels) {
foreach ($panels as $panel) { foreach ($panels as $panel) {
$className = $panel . 'Panel'; $className = $panel . 'Panel';
if (!class_exists($className) && !App::import('Vendor', $className)) { if (!class_exists($className) && !App::import('Vendor', $className)) {
trigger_error(sprintf(__('Could not load DebugToolbar panel %s', true), $panel), E_USER_WARNING); trigger_error(sprintf(__('Could not load DebugToolbar panel %s', true), $panel), E_USER_WARNING);
continue; continue;
} }
$panelObj = new $className(); $panelObj = new $className();
if (is_subclass_of($panelObj, 'DebugPanel') || is_subclass_of($panelObj, 'debugpanel')) { if (is_subclass_of($panelObj, 'DebugPanel') || is_subclass_of($panelObj, 'debugpanel')) {
$this->panels[$panel] =& $panelObj; $this->panels[$panel] =& $panelObj;
} }
} }
} }
/** /**
* Set the javascript to user scripts. * Set the javascript to user scripts.
* *
* Set either script key to false to exclude it from the rendered layout. * Set either script key to false to exclude it from the rendered layout.
* *
* @param array $scripts Javascript config information * @param array $scripts Javascript config information
* @return array * @return array
* @access protected * @access protected
**/ **/
function _setJavascript($scripts) { function _setJavascript($scripts) {
$behavior = false; $behavior = false;
if (!is_array($scripts)) { if (!is_array($scripts)) {
$scripts = (array)$scripts; $scripts = (array)$scripts;
} }
if (isset($scripts[0])) { if (isset($scripts[0])) {
$behavior = $scripts[0]; $behavior = $scripts[0];
} }
if (isset($scripts['behavior'])) { if (isset($scripts['behavior'])) {
$behavior = $scripts['behavior']; $behavior = $scripts['behavior'];
} }
if (!$behavior) { if (!$behavior) {
return array(); return array();
} elseif ($behavior === true) { } elseif ($behavior === true) {
$behavior = 'js'; $behavior = 'js';
} }
if (strpos($behavior, '/') !== 0) { if (strpos($behavior, '/') !== 0) {
$behavior .= '_debug_toolbar'; $behavior .= '_debug_toolbar';
} }
$pluginFile = APP . 'plugins' . DS . 'debug_kit' . DS . 'vendors' . DS . 'js' . DS . $behavior . '.js'; $pluginFile = APP . 'plugins' . DS . 'debug_kit' . DS . 'vendors' . DS . 'js' . DS . $behavior . '.js';
if (file_exists($pluginFile)) { if (file_exists($pluginFile)) {
$behavior = '/debug_kit/js/' . $behavior . '.js'; $behavior = '/debug_kit/js/' . $behavior . '.js';
} }
return compact('behavior'); return compact('behavior');
} }
/** /**
* Makes the DoppleGangerView class if it doesn't already exist. * Makes the DoppleGangerView class if it doesn't already exist.
* This allows DebugView to be compatible with all view classes. * This allows DebugView to be compatible with all view classes.
* *
* @param string $baseClassName * @param string $baseClassName
* @access protected * @access protected
* @return void * @return void
*/ */
function _makeViewClass($baseClassName) { function _makeViewClass($baseClassName) {
if (!class_exists('DoppelGangerView')) { if (!class_exists('DoppelGangerView')) {
App::import('View', $baseClassName); App::import('View', $baseClassName);
if (strpos('View', $baseClassName) === false) { if (strpos('View', $baseClassName) === false) {
$baseClassName .= 'View'; $baseClassName .= 'View';
} }
$class = "class DoppelGangerView extends $baseClassName {}"; $class = "class DoppelGangerView extends $baseClassName {}";
eval($class); eval($class);
} }
} }
} }
/** /**
* Debug Panel * Debug Panel
* *
* Abstract class for debug panels. * Abstract class for debug panels.
* *
* @package cake.debug_kit * @package cake.debug_kit
*/ */
class DebugPanel extends Object { class DebugPanel extends Object {
/** /**
* Defines which plugin this panel is from so the element can be located. * Defines which plugin this panel is from so the element can be located.
* *
* @var string * @var string
*/ */
var $plugin = null; var $plugin = null;
/** /**
* startup the panel * startup the panel
* *
* Pull information from the controller / request * Pull information from the controller / request
* *
* @param object $controller Controller reference. * @param object $controller Controller reference.
* @return void * @return void
**/ **/
function startup(&$controller) { } function startup(&$controller) { }
/** /**
* Prepare output vars before Controller Rendering. * Prepare output vars before Controller Rendering.
* *
* @param object $controller Controller reference. * @param object $controller Controller reference.
* @return void * @return void
**/ **/
function beforeRender(&$controller) { } function beforeRender(&$controller) { }
} }
/** /**
* Variables Panel * Variables Panel
* *
* Provides debug information on the View variables. * Provides debug information on the View variables.
* *
* @package cake.debug_kit.panels * @package cake.debug_kit.panels
**/ **/
class VariablesPanel extends DebugPanel { class VariablesPanel extends DebugPanel {
var $plugin = 'debug_kit'; var $plugin = 'debug_kit';
} }
/** /**
* Session Panel * Session Panel
* *
* Provides debug information on the Session contents. * Provides debug information on the Session contents.
* *
* @package cake.debug_kit.panels * @package cake.debug_kit.panels
**/ **/
class SessionPanel extends DebugPanel { class SessionPanel extends DebugPanel {
var $plugin = 'debug_kit'; var $plugin = 'debug_kit';
/** /**
* beforeRender callback * beforeRender callback
* *
* @param object $controller * @param object $controller
* @access public * @access public
* @return array * @return array
*/ */
function beforeRender(&$controller) { function beforeRender(&$controller) {
return $controller->Session->read(); return $controller->Session->read();
} }
} }
/** /**
* Request Panel * Request Panel
* *
* Provides debug information on the Current request params. * Provides debug information on the Current request params.
* *
* @package cake.debug_kit.panels * @package cake.debug_kit.panels
**/ **/
class RequestPanel extends DebugPanel { class RequestPanel extends DebugPanel {
var $plugin = 'debug_kit'; var $plugin = 'debug_kit';
/** /**
* beforeRender callback - grabs request params * beforeRender callback - grabs request params
* *
* @return array * @return array
**/ **/
function beforeRender(&$controller) { function beforeRender(&$controller) {
$out = array(); $out = array();
$out['params'] = $controller->params; $out['params'] = $controller->params;
if (isset($controller->Cookie)) { if (isset($controller->Cookie)) {
$out['cookie'] = $controller->Cookie->read(); $out['cookie'] = $controller->Cookie->read();
} }
$out['get'] = $_GET; $out['get'] = $_GET;
$out['currentRoute'] = Router::currentRoute(); $out['currentRoute'] = Router::currentRoute();
return $out; return $out;
} }
} }
/** /**
* Timer Panel * Timer Panel
* *
* Provides debug information on all timers used in a request. * Provides debug information on all timers used in a request.
* *
* @package cake.debug_kit.panels * @package cake.debug_kit.panels
**/ **/
class TimerPanel extends DebugPanel { class TimerPanel extends DebugPanel {
var $plugin = 'debug_kit'; var $plugin = 'debug_kit';
/** /**
* startup - add in necessary helpers * startup - add in necessary helpers
* *
* @return void * @return void
**/ **/
function startup(&$controller) { function startup(&$controller) {
if (!in_array('Number', $controller->helpers)) { if (!in_array('Number', $controller->helpers)) {
$controller->helpers[] = 'Number'; $controller->helpers[] = 'Number';
} }
} }
} }
/** /**
* Memory Panel * Memory Panel
* *
* Provides debug information on the memory consumption. * Provides debug information on the memory consumption.
* *
* @package cake.debug_kit.panels * @package cake.debug_kit.panels
**/ **/
class MemoryPanel extends DebugPanel { class MemoryPanel extends DebugPanel {
var $plugin = 'debug_kit'; var $plugin = 'debug_kit';
/** /**
* startup - add in necessary helpers * startup - add in necessary helpers
* *
* @return void * @return void
**/ **/
function startup(&$controller) { function startup(&$controller) {
if (!in_array('Number', $controller->helpers)) { if (!in_array('Number', $controller->helpers)) {
$controller->helpers[] = 'Number'; $controller->helpers[] = 'Number';
} }
} }
} }
/** /**
* sqlLog Panel * sqlLog Panel
* *
* Provides debug information on the SQL logs and provides links to an ajax explain interface. * Provides debug information on the SQL logs and provides links to an ajax explain interface.
* *
* @package cake.debug_kit.panels * @package cake.debug_kit.panels
**/ **/
class sqlLogPanel extends DebugPanel { class sqlLogPanel extends DebugPanel {
var $plugin = 'debug_kit'; var $plugin = 'debug_kit';
var $dbConfigs = array(); var $dbConfigs = array();
/** /**
* get db configs. * get db configs.
* *
* @param string $controller * @param string $controller
* @access public * @access public
* @return void * @return void
*/ */
function startUp(&$controller) { function startUp(&$controller) {
if (!class_exists('ConnectionManager')) { if (!class_exists('ConnectionManager')) {
$this->dbConfigs = array(); $this->dbConfigs = array();
return false; return false;
} }
$this->dbConfigs = ConnectionManager::sourceList(); $this->dbConfigs = ConnectionManager::sourceList();
return true; return true;
} }
/** /**
* Get Sql Logs for each DB config * Get Sql Logs for each DB config
* *
* @param string $controller * @param string $controller
* @access public * @access public
* @return void * @return void
*/ */
function beforeRender(&$controller) { function beforeRender(&$controller) {
$queryLogs = array(); $queryLogs = array();
if (!class_exists('ConnectionManager')) { if (!class_exists('ConnectionManager')) {
return array(); return array();
} }
foreach ($this->dbConfigs as $configName) { foreach ($this->dbConfigs as $configName) {
$db =& ConnectionManager::getDataSource($configName); $db =& ConnectionManager::getDataSource($configName);
if ($db->isInterfaceSupported('showLog')) { if ($db->isInterfaceSupported('showLog')) {
ob_start(); ob_start();
$db->showLog(); $db->showLog();
$queryLogs[$configName] = ob_get_clean(); $queryLogs[$configName] = ob_get_clean();
} }
} }
return $queryLogs; return $queryLogs;
} }
} }
/** /**
* Log Panel - Reads log entries made this request. * Log Panel - Reads log entries made this request.
* *
* @package cake.debug_kit.panels * @package cake.debug_kit.panels
*/ */
class LogPanel extends DebugPanel { class LogPanel extends DebugPanel {
var $plugin = 'debug_kit'; var $plugin = 'debug_kit';
/** /**
* Log files to scan * Log files to scan
* *
* @var array * @var array
*/ */
var $logFiles = array('error.log', 'debug.log'); var $logFiles = array('error.log', 'debug.log');
/** /**
* startup * startup
* *
* @return void * @return void
**/ **/
function startup(&$controller) { function startup(&$controller) {
if (!class_exists('CakeLog')) { if (!class_exists('CakeLog')) {
App::import('Core', 'Log'); App::import('Core', 'Log');
} }
} }
/** /**
* beforeRender Callback * beforeRender Callback
* *
* @return array * @return array
**/ **/
function beforeRender(&$controller) { function beforeRender(&$controller) {
$this->startTime = DebugKitDebugger::requestStartTime(); $this->startTime = DebugKitDebugger::requestStartTime();
$this->currentTime = DebugKitDebugger::requestTime(); $this->currentTime = DebugKitDebugger::requestTime();
$out = array(); $out = array();
foreach ($this->logFiles as $log) { foreach ($this->logFiles as $log) {
$file = LOGS . $log; $file = LOGS . $log;
if (!file_exists($file)) { if (!file_exists($file)) {
continue; continue;
} }
$out[$log] = $this->_parseFile($file); $out[$log] = $this->_parseFile($file);
} }
return $out; return $out;
} }
/** /**
* parse a log file and find the relevant entries * parse a log file and find the relevant entries
* *
* @param string $filename Name of file to read * @param string $filename Name of file to read
* @access protected * @access protected
* @return array * @return array
*/ */
function _parseFile($filename) { function _parseFile($filename) {
$file = new File($filename); $file = new File($filename);
$contents = $file->read(); $contents = $file->read();
$timePattern = '/(\d{4}-\d{2}\-\d{2}\s\d{1,2}\:\d{1,2}\:\d{1,2})/'; $timePattern = '/(\d{4}-\d{2}\-\d{2}\s\d{1,2}\:\d{1,2}\:\d{1,2})/';
$chunks = preg_split($timePattern, $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $chunks = preg_split($timePattern, $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0, $len = count($chunks); $i < $len; $i += 2) { for ($i = 0, $len = count($chunks); $i < $len; $i += 2) {
if (strtotime($chunks[$i]) < $this->startTime) { if (strtotime($chunks[$i]) < $this->startTime) {
unset($chunks[$i], $chunks[$i + 1]); unset($chunks[$i], $chunks[$i + 1]);
} }
} }
return array_values($chunks); return array_values($chunks);
} }
} }
?> ?>
@@ -1,144 +1,144 @@
<?php <?php
/* SVN FILE: $Id$ */ /* SVN FILE: $Id$ */
/** /**
* DebugView test Case * DebugView test Case
* *
* *
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP : Rapid Development Framework <http://www.cakephp.org/> * CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc. * Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204 * 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104 * Las Vegas, Nevada 89104
* *
* Licensed under The MIT License * Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. * Redistributions of files must retain the above copyright notice.
* *
* @filesource * @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc. * @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake * @package cake
* @subpackage cake.cake.libs. * @subpackage cake.cake.libs.
* @since CakePHP v 1.2.0.4487 * @since CakePHP v 1.2.0.4487
* @version $Revision$ * @version $Revision$
* @modifiedby $LastChangedBy$ * @modifiedby $LastChangedBy$
* @lastmodified $Date$ * @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License * @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
App::import('Core', 'View'); App::import('Core', 'View');
if (!class_exists('DoppelGangerView')) { if (!class_exists('DoppelGangerView')) {
class DoppelGangerView extends View {} class DoppelGangerView extends View {}
} }
App::import('View', 'DebugKit.Debug'); App::import('View', 'DebugKit.Debug');
App::import('Vendor', 'DebugKit.DebugKitDebugger'); App::import('Vendor', 'DebugKit.DebugKitDebugger');
/** /**
* Debug View Test Case * Debug View Test Case
* *
* @package debug_kit.tests * @package debug_kit.tests
*/ */
class DebugViewTestCase extends CakeTestCase { class DebugViewTestCase extends CakeTestCase {
/** /**
* set Up test case * set Up test case
* *
* @return void * @return void
**/ **/
function setUp() { function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/'); Router::parse('/');
$this->Controller =& ClassRegistry::init('Controller'); $this->Controller =& ClassRegistry::init('Controller');
$this->View = new DebugView($this->Controller, false); $this->View =& new DebugView($this->Controller, false);
$this->_debug = Configure::read('debug'); $this->_debug = Configure::read('debug');
} }
/** /**
* start Case - switch view paths * start Case - switch view paths
* *
* @return void * @return void
**/ **/
function startCase() { function startCase() {
$this->_viewPaths = Configure::read('viewPaths'); $this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array( Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS, TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS, APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS ROOT . DS . LIBS . 'view' . DS
)); ));
} }
/** /**
* test that element timers are working * test that element timers are working
* *
* @return void * @return void
**/ **/
function testElementTimers() { function testElementTimers() {
$result = $this->View->element('test_element'); $result = $this->View->element('test_element');
$this->assertPattern('/^this is the test element$/', $result); $this->assertPattern('/^this is the test element$/', $result);
$result = DebugKitDebugger::getTimers(); $result = DebugKitDebugger::getTimers();
$this->assertTrue(isset($result['render_test_element.ctp'])); $this->assertTrue(isset($result['render_test_element.ctp']));
} }
/** /**
* test rendering and ensure that timers are being set. * test rendering and ensure that timers are being set.
* *
* @access public * @access public
* @return void * @return void
*/ */
function testRenderTimers() { function testRenderTimers() {
$this->Controller->viewPath = 'posts'; $this->Controller->viewPath = 'posts';
$this->Controller->action = 'index'; $this->Controller->action = 'index';
$this->Controller->params = array( $this->Controller->params = array(
'action' => 'index', 'action' => 'index',
'controller' => 'posts', 'controller' => 'posts',
'plugin' => null, 'plugin' => null,
'url' => array('url' => 'posts/index'), 'url' => array('url' => 'posts/index'),
'base' => null, 'base' => null,
'here' => '/posts/index', 'here' => '/posts/index',
); );
$this->Controller->layout = 'default'; $this->Controller->layout = 'default';
$View = new DebugView($this->Controller, false); $View =& new DebugView($this->Controller, false);
$View->render('index'); $View->render('index');
$result = DebugKitDebugger::getTimers(); $result = DebugKitDebugger::getTimers();
$this->assertEqual(count($result), 3); $this->assertEqual(count($result), 3);
$this->assertTrue(isset($result['viewRender'])); $this->assertTrue(isset($result['viewRender']));
$this->assertTrue(isset($result['render_default.ctp'])); $this->assertTrue(isset($result['render_default.ctp']));
$this->assertTrue(isset($result['render_index.ctp'])); $this->assertTrue(isset($result['render_index.ctp']));
} }
/** /**
* Test for correct loading of helpers into custom view * Test for correct loading of helpers into custom view
* *
* @return void * @return void
*/ */
function testLoadHelpers() { function testLoadHelpers() {
$loaded = array(); $loaded = array();
$result = $this->View->_loadHelpers($loaded, array('Html', 'Javascript', 'Number')); $result = $this->View->_loadHelpers($loaded, array('Html', 'Javascript', 'Number'));
$this->assertTrue(is_object($result['Html'])); $this->assertTrue(is_object($result['Html']));
$this->assertTrue(is_object($result['Javascript'])); $this->assertTrue(is_object($result['Javascript']));
$this->assertTrue(is_object($result['Number'])); $this->assertTrue(is_object($result['Number']));
} }
/** /**
* reset the view paths * reset the view paths
* *
* @return void * @return void
**/ **/
function endCase() { function endCase() {
Configure::write('viewPaths', $this->_viewPaths); Configure::write('viewPaths', $this->_viewPaths);
} }
/** /**
* tear down function * tear down function
* *
* @return void * @return void
**/ **/
function tearDown() { function tearDown() {
unset($this->View, $this->Controller); unset($this->View, $this->Controller);
DebugKitDebugger::clearTimers(); DebugKitDebugger::clearTimers();
Configure::write('debug', $this->_debug); Configure::write('debug', $this->_debug);
} }
} }
?> ?>
@@ -1,137 +1,137 @@
<?php <?php
/* SVN FILE: $Id$ */ /* SVN FILE: $Id$ */
/** /**
* Toolbar Abstract Helper Test Case * Toolbar Abstract Helper Test Case
* *
* *
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP : Rapid Development Framework <http://www.cakephp.org/> * CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc. * Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204 * 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104 * Las Vegas, Nevada 89104
* *
* Licensed under The MIT License * Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. * Redistributions of files must retain the above copyright notice.
* *
* @filesource * @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc. * @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake * @package cake
* @subpackage debug_kit.tests.views.helpers * @subpackage debug_kit.tests.views.helpers
* @version $Revision$ * @version $Revision$
* @modifiedby $LastChangedBy$ * @modifiedby $LastChangedBy$
* @lastmodified $Date$ * @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License * @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
App::import('Helper', 'DebugKit.FirePhpToolbar'); App::import('Helper', 'DebugKit.FirePhpToolbar');
App::import('Core', array('View', 'Controller')); App::import('Core', array('View', 'Controller'));
require_once APP . 'plugins' . DS . 'debug_kit' . DS . 'tests' . DS . 'cases' . DS . 'test_objects.php'; require_once APP . 'plugins' . DS . 'debug_kit' . DS . 'tests' . DS . 'cases' . DS . 'test_objects.php';
FireCake::getInstance('TestFireCake'); FireCake::getInstance('TestFireCake');
class FirePhpToolbarHelperTestCase extends CakeTestCase { class FirePhpToolbarHelperTestCase extends CakeTestCase {
/** /**
* setUp * setUp
* *
* @return void * @return void
**/ **/
function setUp() { function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/'); Router::parse('/');
$this->Toolbar = new ToolbarHelper(array('output' => 'DebugKit.FirePhpToolbar')); $this->Toolbar =& new ToolbarHelper(array('output' => 'DebugKit.FirePhpToolbar'));
$this->Toolbar->FirePhpToolbar = new FirePhpToolbarHelper(); $this->Toolbar->FirePhpToolbar =& new FirePhpToolbarHelper();
$this->Controller =& ClassRegistry::init('Controller'); $this->Controller =& ClassRegistry::init('Controller');
if (isset($this->_debug)) { if (isset($this->_debug)) {
Configure::write('debug', $this->_debug); Configure::write('debug', $this->_debug);
} }
} }
/** /**
* start Case - switch view paths * start Case - switch view paths
* *
* @return void * @return void
**/ **/
function startCase() { function startCase() {
$this->_viewPaths = Configure::read('viewPaths'); $this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array( Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS, TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS, APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS ROOT . DS . LIBS . 'view' . DS
)); ));
$this->_debug = Configure::read('debug'); $this->_debug = Configure::read('debug');
$this->firecake =& FireCake::getInstance(); $this->firecake =& FireCake::getInstance();
} }
/** /**
* test neat array (dump)creation * test neat array (dump)creation
* *
* @return void * @return void
*/ */
function testMakeNeatArray() { function testMakeNeatArray() {
$this->Toolbar->makeNeatArray(array(1,2,3)); $this->Toolbar->makeNeatArray(array(1,2,3));
$result = $this->firecake->sentHeaders; $result = $this->firecake->sentHeaders;
$this->assertTrue(isset($result['X-Wf-1-1-1-1'])); $this->assertTrue(isset($result['X-Wf-1-1-1-1']));
$this->assertPattern('/\[1,2,3\]/', $result['X-Wf-1-1-1-1']); $this->assertPattern('/\[1,2,3\]/', $result['X-Wf-1-1-1-1']);
} }
/** /**
* testAfterlayout element rendering * testAfterlayout element rendering
* *
* @return void * @return void
*/ */
function testAfterLayout(){ function testAfterLayout(){
$this->Controller->viewPath = 'posts'; $this->Controller->viewPath = 'posts';
$this->Controller->action = 'index'; $this->Controller->action = 'index';
$this->Controller->params = array( $this->Controller->params = array(
'action' => 'index', 'action' => 'index',
'controller' => 'posts', 'controller' => 'posts',
'plugin' => null, 'plugin' => null,
'url' => array('url' => 'posts/index', 'ext' => 'xml'), 'url' => array('url' => 'posts/index', 'ext' => 'xml'),
'base' => null, 'base' => null,
'here' => '/posts/index', 'here' => '/posts/index',
); );
$this->Controller->layout = 'default'; $this->Controller->layout = 'default';
$this->Controller->uses = null; $this->Controller->uses = null;
$this->Controller->components = array('DebugKit.Toolbar'); $this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->constructClasses(); $this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller); $this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller); $this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller); $this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render(); $result = $this->Controller->render();
$this->assertNoPattern('/debug-toolbar/', $result); $this->assertNoPattern('/debug-toolbar/', $result);
$result = $this->firecake->sentHeaders; $result = $this->firecake->sentHeaders;
$this->assertTrue(is_array($result)); $this->assertTrue(is_array($result));
} }
/** /**
* endTest() * endTest()
* *
* @return void * @return void
*/ */
function endTest() { function endTest() {
TestFireCake::reset(); TestFireCake::reset();
} }
/** /**
* reset the view paths * reset the view paths
* *
* @return void * @return void
**/ **/
function endCase() { function endCase() {
Configure::write('viewPaths', $this->_viewPaths); Configure::write('viewPaths', $this->_viewPaths);
} }
/** /**
* tearDown * tearDown
* *
* @access public * @access public
* @return void * @return void
*/ */
function tearDown() { function tearDown() {
unset($this->Toolbar, $this->Controller); unset($this->Toolbar, $this->Controller);
ClassRegistry::removeObject('view'); ClassRegistry::removeObject('view');
ClassRegistry::flush(); ClassRegistry::flush();
Router::reload(); Router::reload();
} }
} }
?> ?>
@@ -1,358 +1,358 @@
<?php <?php
/* SVN FILE: $Id$ */ /* SVN FILE: $Id$ */
/** /**
* Toolbar HTML Helper Test Case * Toolbar HTML Helper Test Case
* *
* *
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP : Rapid Development Framework <http://www.cakephp.org/> * CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright 2006-2008, Cake Software Foundation, Inc. * Copyright 2006-2008, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204 * 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104 * Las Vegas, Nevada 89104
* *
* Licensed under The MIT License * Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. * Redistributions of files must retain the above copyright notice.
* *
* @filesource * @filesource
* @copyright Copyright 2006-2008, Cake Software Foundation, Inc. * @copyright Copyright 2006-2008, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake * @package cake
* @subpackage debug_kit.tests.views.helpers * @subpackage debug_kit.tests.views.helpers
* @version $Revision$ * @version $Revision$
* @modifiedby $LastChangedBy$ * @modifiedby $LastChangedBy$
* @lastmodified $Date$ * @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License * @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
App::import('Helper', array('DebugKit.HtmlToolbar', 'Html', 'Javascript')); App::import('Helper', array('DebugKit.HtmlToolbar', 'Html', 'Javascript'));
App::import('Core', array('View', 'Controller')); App::import('Core', array('View', 'Controller'));
class HtmlToolbarHelperTestCase extends CakeTestCase { class HtmlToolbarHelperTestCase extends CakeTestCase {
/** /**
* setUp * setUp
* *
* @return void * @return void
**/ **/
function setUp() { function setUp() {
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::parse('/'); Router::parse('/');
$this->Toolbar = new ToolbarHelper(array('output' => 'DebugKit.HtmlToolbar')); $this->Toolbar =& new ToolbarHelper(array('output' => 'DebugKit.HtmlToolbar'));
$this->Toolbar->HtmlToolbar = new HtmlToolbarHelper(); $this->Toolbar->HtmlToolbar =& new HtmlToolbarHelper();
$this->Toolbar->HtmlToolbar->Html = new HtmlHelper(); $this->Toolbar->HtmlToolbar->Html =& new HtmlHelper();
$this->Toolbar->HtmlToolbar->Javascript = new JavascriptHelper(); $this->Toolbar->HtmlToolbar->Javascript =& new JavascriptHelper();
$this->Controller =& ClassRegistry::init('Controller'); $this->Controller =& ClassRegistry::init('Controller');
if (isset($this->_debug)) { if (isset($this->_debug)) {
Configure::write('debug', $this->_debug); Configure::write('debug', $this->_debug);
} }
} }
/** /**
* start Case - switch view paths * start Case - switch view paths
* *
* @return void * @return void
**/ **/
function startCase() { function startCase() {
$this->_viewPaths = Configure::read('viewPaths'); $this->_viewPaths = Configure::read('viewPaths');
Configure::write('viewPaths', array( Configure::write('viewPaths', array(
TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS, TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS,
APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS, APP . 'plugins' . DS . 'debug_kit' . DS . 'views'. DS,
ROOT . DS . LIBS . 'view' . DS ROOT . DS . LIBS . 'view' . DS
)); ));
$this->_debug = Configure::read('debug'); $this->_debug = Configure::read('debug');
} }
/** /**
* test Neat Array formatting * test Neat Array formatting
* *
* @return void * @return void
**/ **/
function testMakeNeatArray() { function testMakeNeatArray() {
$in = false; $in = false;
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(false)', '/li', '<li', '<strong', '0' , '/strong', '(false)', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = null; $in = null;
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(null)', '/li', '<li', '<strong', '0' , '/strong', '(null)', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = true; $in = true;
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', '0' , '/strong', '(true)', '/li', '<li', '<strong', '0' , '/strong', '(true)', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = array('key' => 'value'); $in = array('key' => 'value');
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li', '<li', '<strong', 'key', '/strong', 'value', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = array('key' => null); $in = array('key' => null);
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', '(null)', '/li', '<li', '<strong', 'key', '/strong', '(null)', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = array('key' => 'value', 'foo' => 'bar'); $in = array('key' => 'value', 'foo' => 'bar');
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li', '<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong', 'bar', '/li', '<li', '<strong', 'foo', '/strong', 'bar', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = array( $in = array(
'key' => 'value', 'key' => 'value',
'foo' => array( 'foo' => array(
'this' => 'deep', 'this' => 'deep',
'another' => 'value' 'another' => 'value'
) )
); );
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li', '<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong', '<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1')), array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'this', '/strong', 'deep', '/li', '<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li', '<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul', '/ul',
'/li', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = array( $in = array(
'key' => 'value', 'key' => 'value',
'foo' => array( 'foo' => array(
'this' => 'deep', 'this' => 'deep',
'another' => 'value' 'another' => 'value'
), ),
'lotr' => array( 'lotr' => array(
'gandalf' => 'wizard', 'gandalf' => 'wizard',
'bilbo' => 'hobbit' 'bilbo' => 'hobbit'
) )
); );
$result = $this->Toolbar->makeNeatArray($in, 1); $result = $this->Toolbar->makeNeatArray($in, 1);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0 expanded'), 'ul' => array('class' => 'neat-array depth-0 expanded'),
'<li', '<strong', 'key', '/strong', 'value', '/li', '<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong', '<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1')), array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'this', '/strong', 'deep', '/li', '<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li', '<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul', '/ul',
'/li', '/li',
'<li', '<strong', 'lotr', '/strong', '<li', '<strong', 'lotr', '/strong',
array('ul' => array('class' => 'neat-array depth-1')), array('ul' => array('class' => 'neat-array depth-1')),
'<li', '<strong', 'gandalf', '/strong', 'wizard', '/li', '<li', '<strong', 'gandalf', '/strong', 'wizard', '/li',
'<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li', '<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li',
'/ul', '/ul',
'/li', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$result = $this->Toolbar->makeNeatArray($in, 2); $result = $this->Toolbar->makeNeatArray($in, 2);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0 expanded'), 'ul' => array('class' => 'neat-array depth-0 expanded'),
'<li', '<strong', 'key', '/strong', 'value', '/li', '<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'foo', '/strong', '<li', '<strong', 'foo', '/strong',
array('ul' => array('class' => 'neat-array depth-1 expanded')), array('ul' => array('class' => 'neat-array depth-1 expanded')),
'<li', '<strong', 'this', '/strong', 'deep', '/li', '<li', '<strong', 'this', '/strong', 'deep', '/li',
'<li', '<strong', 'another', '/strong', 'value', '/li', '<li', '<strong', 'another', '/strong', 'value', '/li',
'/ul', '/ul',
'/li', '/li',
'<li', '<strong', 'lotr', '/strong', '<li', '<strong', 'lotr', '/strong',
array('ul' => array('class' => 'neat-array depth-1 expanded')), array('ul' => array('class' => 'neat-array depth-1 expanded')),
'<li', '<strong', 'gandalf', '/strong', 'wizard', '/li', '<li', '<strong', 'gandalf', '/strong', 'wizard', '/li',
'<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li', '<li', '<strong', 'bilbo', '/strong', 'hobbit', '/li',
'/ul', '/ul',
'/li', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
$in = array('key' => 'value', 'array' => array()); $in = array('key' => 'value', 'array' => array());
$result = $this->Toolbar->makeNeatArray($in); $result = $this->Toolbar->makeNeatArray($in);
$expected = array( $expected = array(
'ul' => array('class' => 'neat-array depth-0'), 'ul' => array('class' => 'neat-array depth-0'),
'<li', '<strong', 'key', '/strong', 'value', '/li', '<li', '<strong', 'key', '/strong', 'value', '/li',
'<li', '<strong', 'array', '/strong', '(empty)', '/li', '<li', '<strong', 'array', '/strong', '(empty)', '/li',
'/ul' '/ul'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
} }
/** /**
* Test injection of toolbar * Test injection of toolbar
* *
* @return void * @return void
**/ **/
function testInjectToolbar() { function testInjectToolbar() {
$this->Controller->viewPath = 'posts'; $this->Controller->viewPath = 'posts';
$this->Controller->action = 'index'; $this->Controller->action = 'index';
$this->Controller->params = array( $this->Controller->params = array(
'action' => 'index', 'action' => 'index',
'controller' => 'posts', 'controller' => 'posts',
'plugin' => null, 'plugin' => null,
'url' => array('url' => 'posts/index'), 'url' => array('url' => 'posts/index'),
'base' => null, 'base' => null,
'here' => '/posts/index', 'here' => '/posts/index',
); );
$this->Controller->helpers = array('Html', 'Javascript', 'DebugKit.Toolbar'); $this->Controller->helpers = array('Html', 'Javascript', 'DebugKit.Toolbar');
$this->Controller->layout = 'default'; $this->Controller->layout = 'default';
$this->Controller->uses = null; $this->Controller->uses = null;
$this->Controller->components = array('DebugKit.Toolbar'); $this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->constructClasses(); $this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller); $this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller); $this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller); $this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render(); $result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result); $result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<div id\="debug-kit-toolbar">.+</div></body>#', $result); $this->assertPattern('#<div id\="debug-kit-toolbar">.+</div></body>#', $result);
} }
/** /**
* test injection of javascript * test injection of javascript
* *
* @return void * @return void
**/ **/
function testJavascriptInjection() { function testJavascriptInjection() {
$this->Controller->viewPath = 'posts'; $this->Controller->viewPath = 'posts';
$this->Controller->uses = null; $this->Controller->uses = null;
$this->Controller->action = 'index'; $this->Controller->action = 'index';
$this->Controller->params = array( $this->Controller->params = array(
'action' => 'index', 'action' => 'index',
'controller' => 'posts', 'controller' => 'posts',
'plugin' => null, 'plugin' => null,
'url' => array('url' => 'posts/index'), 'url' => array('url' => 'posts/index'),
'base' => '/', 'base' => '/',
'here' => '/posts/index', 'here' => '/posts/index',
); );
$this->Controller->helpers = array('Javascript', 'Html'); $this->Controller->helpers = array('Javascript', 'Html');
$this->Controller->components = array('DebugKit.Toolbar'); $this->Controller->components = array('DebugKit.Toolbar');
$this->Controller->layout = 'default'; $this->Controller->layout = 'default';
$this->Controller->constructClasses(); $this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller); $this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller); $this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller); $this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render(); $result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result); $result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<script\s*type="text/javascript"\s*src="/debug_kit/js/js_debug_toolbar.js"\s*>\s?</script>#', $result); $this->assertPattern('#<script\s*type="text/javascript"\s*src="/debug_kit/js/js_debug_toolbar.js"\s*>\s?</script>#', $result);
} }
/** /**
* test Injection of user defined javascript * test Injection of user defined javascript
* *
* @return void * @return void
**/ **/
function testCustomJavascriptInjection() { function testCustomJavascriptInjection() {
$this->Controller->viewPath = 'posts'; $this->Controller->viewPath = 'posts';
$this->Controller->uses = null; $this->Controller->uses = null;
$this->Controller->action = 'index'; $this->Controller->action = 'index';
$this->Controller->params = array( $this->Controller->params = array(
'action' => 'index', 'action' => 'index',
'controller' => 'posts', 'controller' => 'posts',
'plugin' => null, 'plugin' => null,
'url' => array('url' => 'posts/index'), 'url' => array('url' => 'posts/index'),
'base' => '/', 'base' => '/',
'here' => '/posts/index', 'here' => '/posts/index',
); );
$this->Controller->helpers = array('Javascript', 'Html'); $this->Controller->helpers = array('Javascript', 'Html');
$this->Controller->components = array('DebugKit.Toolbar' => array('javascript' => array('my_custom'))); $this->Controller->components = array('DebugKit.Toolbar' => array('javascript' => array('my_custom')));
$this->Controller->layout = 'default'; $this->Controller->layout = 'default';
$this->Controller->constructClasses(); $this->Controller->constructClasses();
$this->Controller->Component->initialize($this->Controller); $this->Controller->Component->initialize($this->Controller);
$this->Controller->Component->startup($this->Controller); $this->Controller->Component->startup($this->Controller);
$this->Controller->Component->beforeRender($this->Controller); $this->Controller->Component->beforeRender($this->Controller);
$result = $this->Controller->render(); $result = $this->Controller->render();
$result = str_replace(array("\n", "\r"), '', $result); $result = str_replace(array("\n", "\r"), '', $result);
$this->assertPattern('#<script\s*type="text/javascript"\s*src="js/my_custom_debug_toolbar.js"\s*>\s?</script>#', $result); $this->assertPattern('#<script\s*type="text/javascript"\s*src="js/my_custom_debug_toolbar.js"\s*>\s?</script>#', $result);
} }
/** /**
* test message creation * test message creation
* *
* @return void * @return void
*/ */
function testMessage() { function testMessage() {
$result = $this->Toolbar->message('test', 'one, two'); $result = $this->Toolbar->message('test', 'one, two');
$expected = array( $expected = array(
'<p', '<p',
'<strong', 'test', '/strong', '<strong', 'test', '/strong',
' one, two', ' one, two',
'/p', '/p',
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
} }
/** /**
* Test Table generation * Test Table generation
* *
* @return void * @return void
*/ */
function testTable() { function testTable() {
$rows = array( $rows = array(
array(1,2), array(1,2),
array(3,4), array(3,4),
); );
$result = $this->Toolbar->table($rows); $result = $this->Toolbar->table($rows);
$expected = array( $expected = array(
'table' => array('class' =>'debug-table'), 'table' => array('class' =>'debug-table'),
array('tr' => array('class' => 'odd')), array('tr' => array('class' => 'odd')),
'<td', '1', '/td', '<td', '1', '/td',
'<td', '2', '/td', '<td', '2', '/td',
'/tr', '/tr',
array('tr' => array('class' => 'even')), array('tr' => array('class' => 'even')),
'<td', '3', '/td', '<td', '3', '/td',
'<td', '4', '/td', '<td', '4', '/td',
'/tr', '/tr',
'/table' '/table'
); );
$this->assertTags($result, $expected); $this->assertTags($result, $expected);
} }
/** /**
* reset the view paths * reset the view paths
* *
* @return void * @return void
**/ **/
function endCase() { function endCase() {
Configure::write('viewPaths', $this->_viewPaths); Configure::write('viewPaths', $this->_viewPaths);
} }
/** /**
* tearDown * tearDown
* *
* @access public * @access public
* @return void * @return void
*/ */
function tearDown() { function tearDown() {
unset($this->Toolbar, $this->Controller); unset($this->Toolbar, $this->Controller);
ClassRegistry::removeObject('view'); ClassRegistry::removeObject('view');
ClassRegistry::flush(); ClassRegistry::flush();
} }
} }
?> ?>
@@ -30,14 +30,14 @@ $timers = DebugKitDebugger::getTimers();
?> ?>
<h2><?php __('Timers'); ?></h2> <h2><?php __('Timers'); ?></h2>
<p class="request-time"> <p class="request-time">
<?php $totalTime = sprintf(__('%s (seconds)', true), DebugKitDebugger::requestTime()); ?> <?php $totalTime = sprintf(__('%.6s (seconds)', true), DebugKitDebugger::requestTime()); ?>
<?php echo $toolbar->message(__('Total Request Time:', true), $totalTime)?> <?php echo $toolbar->message(__('Total Request Time:', true), $totalTime)?>
</p> </p>
<?php foreach ($timers as $timerName => $timeInfo): <?php foreach ($timers as $timerName => $timeInfo):
$rows[] = array( $rows[] = array(
$timeInfo['message'], $timeInfo['message'],
$timeInfo['time'] sprintf(__('%.6s', true), $timeInfo['time'])
); );
$headers = array(__('Message', true), __('time in seconds', true)); $headers = array(__('Message', true), __('time in seconds', true));
endforeach; endforeach;
+9
View File
@@ -0,0 +1,9 @@
abijah:Property Manager:a2369e3cc9e231ea6f02ce799a8b9970
anja:Property Manager:4539d5a6e58dd5895f2f3891d29705b0
kevin:Property Manager:f01accc9f5e5cdfc028dcf0cca837cf1
adam:Property Manager:ae6835569bb2fc0a0a4a773580ac8cda
shirley:Property Manager:e7e9d674c700796c99cdbf3cf105e739
admin:Property Manager:bab2226685d9b4b66220db8df80f1822
dev:Property Manager:e5c27b3c025e47239a45daceea2c0a00
vasst:Property Manager:523abc6c2b8458b463d5a9baa4f58f2e
answerfirst:Property Manager:6ac128447fab8be985c74ba7539c39b3
+1 -1
View File
@@ -100,7 +100,7 @@ echo $this->element('ledger_entries', array
'filter' => array('Account.id' => $account['id']), 'filter' => array('Account.id' => $account['id']),
'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance', 'exclude' => array('Account', 'Amount', 'Cr/Dr', 'Balance',
empty($account['receipts']) ? 'Tender' : null), empty($account['receipts']) ? 'Tender' : null),
'include' => array('Debit', 'Credit', 'Sub-Total'), 'include' => array('Transaction', 'Debit', 'Credit', 'Sub-Total'),
'limit' => 50, 'limit' => 50,
))); )));
+15 -3
View File
@@ -68,7 +68,7 @@ function contactMethodDiv($obj, $type, $legend, $values = null) {
'</DIV>' . "\n" . '</DIV>' . "\n" .
// BEGIN method-div // BEGIN method-div
'<div id="'.$type.'-%{id}-method-div"' . "\n" . '<div id="'.$type.'-%{id}-method-div"' . '>' . "\n" .
$obj->element $obj->element
('form_table', ('form_table',
@@ -131,14 +131,18 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('type' => array('label_attributes' => array('class' => 'required'), ('type' => array('label_attributes' => array('class' => 'required'),
'opts' => array('options' => $obj->varstore['phoneTypes']), 'opts' => array('autocomplete' => 'off',
'options' => $obj->varstore['phoneTypes']),
'after' => "Physical type of the phone."), 'after' => "Physical type of the phone."),
'phone' => array('label_attributes' => array('class' => 'required empty'), 'phone' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required: Phone number."), 'after' => "Required: Phone number."),
'ext' => array('name' => "Extension", 'ext' => array('name' => "Extension",
'label_attributes' => array('class' => 'optional empty'), 'label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Extension number."), 'after' => "Optional: Extension number."),
'comment' => array('label_attributes' => array('class' => 'optional empty'), 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Comments about this phone number."), 'after' => "Optional: Comments about this phone number."),
); );
} }
@@ -167,17 +171,23 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('address' => array('label_attributes' => array('class' => 'required empty'), ('address' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required: First line of mailing address."), 'after' => "Required: First line of mailing address."),
'city' => array('label_attributes' => array('class' => 'required empty'), 'city' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required."), 'after' => "Required."),
'state' => array('label_attributes' => array('class' => 'required empty'), 'state' => array('label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required."), 'after' => "Required."),
'postcode' => array('name' => 'Zip Code', 'postcode' => array('name' => 'Zip Code',
'label_attributes' => array('class' => 'required empty'), 'label_attributes' => array('class' => 'required empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Required."), 'after' => "Required."),
'country' => array('label_attributes' => array('class' => 'optional empty'), 'country' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: USA is presumed."), 'after' => "Optional: USA is presumed."),
'comment' => array('label_attributes' => array('class' => 'optional empty'), 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Comments about this mailing address."), 'after' => "Optional: Comments about this mailing address."),
); );
} }
@@ -208,8 +218,10 @@ function contactMethodTypeDiv($obj, $type, $stype, $values = null) {
elseif ($stype === 'new') { elseif ($stype === 'new') {
$fields = array $fields = array
('email' => array('label_attributes' => array('class' => 'required empty'), ('email' => array('label_attributes' => array('class' => 'required empty'),
'after' => "Required: E-mail address."), 'opts' => array('autocomplete' => 'off'),
'after' => "Required: E-mail address."),
'comment' => array('label_attributes' => array('class' => 'optional empty'), 'comment' => array('label_attributes' => array('class' => 'optional empty'),
'opts' => array('autocomplete' => 'off'),
'after' => "Optional: Comments about this email address."), 'after' => "Optional: Comments about this email address."),
); );
} }
+1 -1
View File
@@ -66,7 +66,7 @@ function customerContactDiv($obj, $values = null, $primary = false) {
'</DIV>' . "\n" . '</DIV>' . "\n" .
// BEGIN contact-div // BEGIN contact-div
'<div id="contact-%{id}-contact-div"' . "\n" . '<div id="contact-%{id}-contact-div">' . "\n" .
$obj->element $obj->element
('form_table', ('form_table',
+5 -2
View File
@@ -157,7 +157,10 @@ function onRowSelect(grid_id, customer_id) {
$("#customer-id").val(customer_id); $("#customer-id").val(customer_id);
// Set the customer name, so the user knows who the receipt is for // Set the customer name, so the user knows who the receipt is for
$("#receipt-customer-name").html($(grid_id).getCell(customer_id, 'Customer-name')); $("#receipt-customer-name")
.html('<A HREF="view/' + customer_id + '">'
+ $(grid_id).getCell(customer_id, 'Customer-name')
+ '</A>');
// Hide the "no customer" message and show the current customer // Hide the "no customer" message and show the current customer
$(".customer-selection-invalid").hide(); $(".customer-selection-invalid").hide();
@@ -298,7 +301,7 @@ echo $this->element('customers', array
), ),
'action' => 'current', 'action' => 'current',
'nolinks' => true, 'nolinks' => true,
'limit' => 10, 'limit' => 20,
))); )));
echo ('<DIV CLASS="receipt grid-selection-text">' . echo ('<DIV CLASS="receipt grid-selection-text">' .
+45 -1
View File
@@ -105,6 +105,27 @@ echo $this->element('ledger_entries', array
))); )));
/**********************************************************************
* Invoice History
*/
/* NOT COMPLETED
echo $this->element('transactions', array
(// Grid configuration
'config' => array
('caption' => 'Invoices',
'limit' => 5,
'filter' => array('Customer.id' => $customer['Customer']['id'],
'Transaction.type' => 'INVOICE',
),
//'include' => array(),
'exclude' => array('Type'),
'remap' => array('ID' => 'Invoice',
//'Timestamp' => 'Date',
'Entries' => 'Charges'),
)));
NOT COMPLETED */
/********************************************************************** /**********************************************************************
* Lease History * Lease History
*/ */
@@ -136,13 +157,14 @@ echo $this->element('contacts', array
/********************************************************************** /**********************************************************************
* Customer Account History * Customer Statement History
*/ */
echo $this->element('statement_entries', array echo $this->element('statement_entries', array
(// Grid configuration (// Grid configuration
'config' => array 'config' => array
('caption' => 'Customer Statement', ('caption' => 'Customer Statement',
'grid_setup' => array('hiddengrid' => true),
'filter' => array('Customer.id' => $customer['Customer']['id'], 'filter' => array('Customer.id' => $customer['Customer']['id'],
'type !=' => 'VOID'), 'type !=' => 'VOID'),
//'include' => array('Sub-Total'), //'include' => array('Sub-Total'),
@@ -150,6 +172,28 @@ echo $this->element('statement_entries', array
))); )));
/**********************************************************************
* Customer Transaction History
*/
echo $this->element('transactions', array
(// Grid configuration
'config' => array
('caption' => 'Balance History',
'limit' => 10000,
'limitOptions' => array('10000'),
'sort_column' => 'Timestamp',
'sort_order' => 'ASC',
'grid_setup' => array('hiddengrid' => true),
'filter' => array('Customer.id' => $customer['Customer']['id']),
'include' => array('Comment', 'PosNeg', 'Balance'),
'exclude' => array('Amount', 'Entries'),
'remap' => array(//'ID' => 'Invoice',
'PosNeg' => 'Amount',
//'Entries' => 'Charges',
),
)));
/* End "detail supporting" div */ /* End "detail supporting" div */
echo '</div>' . "\n"; echo '</div>' . "\n";
+1
View File
@@ -2,6 +2,7 @@
// Define the table columns // Define the table columns
$cols = array(); $cols = array();
$cols['Customer'] = array('index' => 'Customer.id', 'formatter' => 'id');
$cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum'); $cols['Relationship'] = array('index' => 'ContactsCustomer.type', 'formatter' => 'enum');
$cols['Name'] = array('index' => 'Customer.name', 'formatter' => 'longname'); $cols['Name'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Last Name'] = array('index' => 'PrimaryContact.last_name', 'formatter' => 'name'); $cols['Last Name'] = array('index' => 'PrimaryContact.last_name', 'formatter' => 'name');
+1 -1
View File
@@ -113,7 +113,7 @@ foreach ($fields AS $field => $config) {
if (isset($config['with_value_after'])) if (isset($config['with_value_after']))
$value = $value . $config['with_value_after']; $value = $value . $config['with_value_after'];
elseif (isset($with_value_after)) elseif (isset($with_value_after))
$value = $valeu . $with_value_after; $value = $value . $with_value_after;
$cells[] = $value; $cells[] = $value;
if ($include_after) { if ($include_after) {
+3 -2
View File
@@ -50,6 +50,7 @@ if (!isset($grid_setup))
$html->css('ui.jqgrid', null, null, false); $html->css('ui.jqgrid', null, null, false);
$javascript->link('jqGrid/grid.locale-en', false); $javascript->link('jqGrid/grid.locale-en', false);
$javascript->link('jqGrid/jquery.jqGrid.min', false); $javascript->link('jqGrid/jquery.jqGrid.min', false);
$javascript->link('jqGrid/grid.postext', false);
$javascript->link('pmgr_jqGrid', false); $javascript->link('pmgr_jqGrid', false);
@@ -129,12 +130,12 @@ foreach ($jqGridColumns AS $header => &$col) {
elseif ($col['formatter'] === 'currency') { elseif ($col['formatter'] === 'currency') {
// Use our custom formatting for currency // Use our custom formatting for currency
$col['formatter'] = array('--special' => 'currencyFormatter'); $col['formatter'] = array('--special' => 'currencyFormatter');
$default['width'] = 85; $default['width'] = 65;
$default['align'] = 'right'; $default['align'] = 'right';
} }
elseif ($col['formatter'] === 'date') { elseif ($col['formatter'] === 'date') {
$default['formatoptions'] = array('newformat' => 'm/d/Y'); $default['formatoptions'] = array('newformat' => 'm/d/Y');
$default['width'] = 95; $default['width'] = 90;
$default['align'] = 'center'; $default['align'] = 'center';
} }
elseif (preg_match("/^(long|short)?name$/", elseif (preg_match("/^(long|short)?name$/",
+20
View File
@@ -0,0 +1,20 @@
<?php /* -*- mode:PHP -*- */
// Define the table columns
$cols = array();
$cols['Name'] = array('index' => 'name', 'formatter' => 'name');
$cols['Comment'] = array('index' => 'comment', 'formatter' => 'comment');
$cols['Key/Combo'] = array('index' => 'key', 'formatter' => 'number');
$cols['Previous Key'] = array('index' => 'key_last', 'formatter' => 'number');
$cols['Quantity'] = array('index' => 'qty', 'formatter' => 'number');
$cols['In Use'] = array('index' => 'inuse', 'formatter' => 'number');
$cols['Available'] = array('index' => 'avail', 'formatter' => 'number');
// Render the grid
$grid
->columns($cols)
->sortField('Name')
->defaultFields(array('Name'))
->searchFields(array('Name'))
->render($this, isset($config) ? $config : null,
array_diff(array_keys($cols), array('Previous Key')));
+1 -1
View File
@@ -5,7 +5,7 @@ $cols = array();
$cols['Date'] = array('index' => 'Transaction.stamp', 'formatter' => 'date'); $cols['Date'] = array('index' => 'Transaction.stamp', 'formatter' => 'date');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname'); $cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Item'] = array('index' => 'Tender.name', 'formatter' => 'longname'); $cols['Item'] = array('index' => 'Tender.name', 'formatter' => 'longname');
$cols['Type'] = array('index' => 'TenderType.name', 'formatter' => 'name'); $cols['Type'] = array('index' => 'TenderType.name', 'formatter' => 'shortname');
$cols['Comment'] = array('index' => 'Tender.comment', 'formatter' => 'comment'); $cols['Comment'] = array('index' => 'Tender.comment', 'formatter' => 'comment');
$cols['Amount'] = array('index' => 'LedgerEntry.amount', 'formatter' => 'currency'); $cols['Amount'] = array('index' => 'LedgerEntry.amount', 'formatter' => 'currency');
$cols['Sub-Total'] = array('index' => 'subtotal-LedgerEntry.amount', 'formatter' => 'currency'); $cols['Sub-Total'] = array('index' => 'subtotal-LedgerEntry.amount', 'formatter' => 'currency');
+5 -3
View File
@@ -11,9 +11,11 @@ $cols['ID'] = array('index' => 'Transaction.id', 'formatter' =
$cols['Type'] = array('index' => 'Transaction.type', 'formatter' => 'enum'); $cols['Type'] = array('index' => 'Transaction.type', 'formatter' => 'enum');
$cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname'); $cols['Customer'] = array('index' => 'Customer.name', 'formatter' => 'longname');
$cols['Timestamp'] = array('index' => 'Transaction.stamp', 'formatter' => 'date'); $cols['Timestamp'] = array('index' => 'Transaction.stamp', 'formatter' => 'date');
$cols['Amount'] = array('index' => 'Transaction.amount', 'formatter' => 'currency'); $cols['Comment'] = array('index' => 'Transaction.comment', 'formatter' => 'comment', 'sortable' => false);
$cols['Entries'] = array('index' => 'entries', 'formatter' => 'number'); $cols['Entries'] = array('index' => 'entries', 'formatter' => 'number');
$cols['Comment'] = array('index' => 'Transaction.comment', 'formatter' => 'comment'); $cols['Amount'] = array('index' => 'Transaction.amount', 'formatter' => 'currency');
$cols['PosNeg'] = array('index' => 'balance', 'formatter' => 'currency');
$cols['Balance'] = array('index' => 'subtotal-balance', 'formatter' => 'currency', 'sortable' => false);
// Render the grid // Render the grid
$grid $grid
@@ -22,4 +24,4 @@ $grid
->defaultFields(array('ID', 'Timestamp')) ->defaultFields(array('ID', 'Timestamp'))
->searchFields(array('Type', 'Comment')) ->searchFields(array('Type', 'Comment'))
->render($this, isset($config) ? $config : null, ->render($this, isset($config) ? $config : null,
array_merge($include, array_diff(array_keys($cols), array('Customer', 'Comment')))); array_merge($include, array_diff(array_keys($cols), array('Customer', 'PosNeg', 'Balance', 'Comment'))));
+1 -1
View File
@@ -75,7 +75,7 @@
echo $html->css('print', null, array('media' => 'print')) . "\n"; echo $html->css('print', null, array('media' => 'print')) . "\n";
echo $html->css('sidemenu') . "\n"; echo $html->css('sidemenu') . "\n";
echo $javascript->link('jquery-1.3.2.min') . "\n"; echo $javascript->link('jquery-1.7.2.min') . "\n";
echo $javascript->link('jquery-ui-1.7.2.custom.min') . "\n"; echo $javascript->link('jquery-ui-1.7.2.custom.min') . "\n";
//echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js') . "\n"; //echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js') . "\n";
//echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js') . "\n"; //echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js') . "\n";
+18
View File
@@ -0,0 +1,18 @@
<?php /* -*- mode:PHP -*- */
; // alignment
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Lock Delete
*/
echo '<div class="lock delete">' . "\n";
echo $form->create('Lock', array('action' => 'delete')) . "\n";
echo $form->input('id') . "\n";
echo $form->submit('Delete Lock') . "\n";
echo $form->submit('Cancel', array('name' => 'cancel')) . "\n";
echo $form->end() . "\n";
echo '</div>' . "\n";
+48
View File
@@ -0,0 +1,48 @@
<?php /* -*- mode:PHP -*- */
//pr($this->data);
?>
<script type="text/javascript"><!--
// Reset the form
function newKey(dig) {
$('#LockKey').val(("000000000" + Math.floor(Math.random()*(Math.pow(10,dig)))) . slice(-1*dig));
}
--></script>
<?php
; // alignment
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Lock Edit
*/
echo '<div class="lock edit">' . "\n";
echo $form->create('Lock', array('action' => 'edit')) . "\n";
echo $form->input('id') . "\n";
echo($this->element
('form_table',
array('class' => 'item lock detail',
'caption' => isset($this->data['Lock']) ? 'Edit Lock' : 'New Lock',
'fields' => array
('name' => array('label_attributes' => array('class' => 'empty'),
'after' => ("Name of the Lock Set")),
'qty' => array('label_attributes' => array('class' => 'empty'),
'after' => ("Quantity")),
'key' => array('label_attributes' => array('class' => 'empty'),
'after' => ('(<A HREF="#" ONCLICK="newKey(4); return false;">New</A>) Key Code / Combination')),
'comment' => array('label_attributes' => array('class' => 'optional empty'),
'after' => 'Optional: Comments about this lock set.'),
))) . "\n");
echo $form->submit(isset($this->data['Lock']) ? 'Update' : 'Add New Lock') . "\n";
echo $form->submit('Cancel', array('name' => 'cancel')) . "\n";
echo $form->end() . "\n";
echo '</div>' . "\n";
+60
View File
@@ -0,0 +1,60 @@
<?php /* -*- mode:PHP -*- */
echo '<div class="lock view">' . "\n";
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Lock Detail Main Section
*/
$lock = $lock['Lock'];
$rows = array();
$rows[] = array('Name', $lock['name']);
if ($lock['qty'] > 1)
$rows[] = array('Quantity', $lock['qty']);
$rows[] = array('Key', $lock['key']);
if (!empty($lock['key_last'])) {
$rows[] = array('Previous Key', $lock['key_last'] . " (Changed on " . FormatHelper::datetime($lock['key_ts']) . ")");
}
$rows[] = array('Comment', $lock['comment']);
echo $this->element('table',
array('class' => 'item lock detail',
'caption' => 'Lock Information',
'rows' => $rows,
'column_class' => array('field', 'value')));
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Supporting Elements Section
*/
echo '<div CLASS="detail supporting">' . "\n";
/**********************************************************************
* Unit Entries
*/
echo $this->element('units', array
(// Grid configuration
'config' => array
('caption' => "Units locked by " . $lock['name'],
'filter' => array('Lock.id' => $lock['id']),
'include' => array('Comment'),
'exclude' => array('Size', 'Area', 'Rent'),
)));
/* End "detail supporting" div */
echo '</div>' . "\n";
/* End page div */
echo '</div>' . "\n";
@@ -10,11 +10,11 @@ echo '<div class="statement_entry overview">' . "\n";
*/ */
$rows = array(); $rows = array();
$rows[] = array("$months Month Charges", FormatHelper::currency($overview['charges'])); $rows[] = array("$months Month Total", FormatHelper::currency($overview['amount']) . " / (" . FormatHelper::currency($overview['amount'] / $months) . " per month)");
echo $this->element('table', echo $this->element('table',
array('class' => 'item statement_entry detail', array('class' => 'item statement_entry detail',
'caption' => 'Monthly Charges', 'caption' => $reptype,
'rows' => $rows, 'rows' => $rows,
'column_class' => array('field', 'value'))); 'column_class' => array('field', 'value')));
@@ -38,11 +38,11 @@ foreach ($overview['months'] AS $month) {
$odd = 1; $odd = 1;
foreach ($month['subs'] AS $sub) { foreach ($month['subs'] AS $sub) {
$row_class[] = array('subitem', $odd ? 'oddrow' : 'evenrow'); $row_class[] = array('subitem', $odd ? 'oddrow' : 'evenrow');
$rows[] = array($sub['name'], FormatHelper::currency($sub['charges'])); $rows[] = array($sub['name'], FormatHelper::currency($sub['amount']));
$odd = !$odd; $odd = !$odd;
} }
$row_class[] = 'grand'; $row_class[] = 'grand';
$rows[] = array('Total for '.$month['name'], FormatHelper::currency($month['charges'])); $rows[] = array('Total for '.$month['name'], FormatHelper::currency($month['amount']));
} }
echo $this->element('table', echo $this->element('table',
+10 -2
View File
@@ -2,11 +2,18 @@
//style="display:inline; //style="display:inline;
echo('<H2 style="display:inline;">Deposit Slip: ' . echo('<H2 style="display:inline;">Deposit Slip: ' .
FormatHelper::datetime($deposit['Transaction']['stamp']) FormatHelper::date($deposit['Transaction']['stamp'])
. '</H2>' . "\n"); . '</H2><br>' . "\n");
/* echo('(' . */ /* echo('(' . */
/* FormatHelper::age($deposit['Transaction']['stamp'], 60) */ /* FormatHelper::age($deposit['Transaction']['stamp'], 60) */
/* . ')<BR>' . "\n"); */ /* . ')<BR>' . "\n"); */
if ($deposit['Account']['external_name'] || $deposit['Account']['external_account']) {
echo('<H2 style="display:inline;">' .
($deposit['Account']['external_name'] ? $deposit['Account']['external_name'] : '') .
($deposit['Account']['external_name'] && $deposit['Account']['external_account'] ? ': ' : '') .
($deposit['Account']['external_account'] ? 'Account #' . $deposit['Account']['external_account'] : '') .
'</H2><br>' . "\n");
}
//pr(compact('deposit')); //pr(compact('deposit'));
@@ -57,6 +64,7 @@ else {
'config' => array 'config' => array
( (
'caption' => 'Deposited Items', 'caption' => 'Deposited Items',
'sort_column' => 'Item',
'filter' => array('deposit_transaction_id' 'filter' => array('deposit_transaction_id'
=> $deposit['Transaction']['id'], => $deposit['Transaction']['id'],
), ),
+11 -10
View File
@@ -95,16 +95,17 @@ if ($transaction['type'] === 'INVOICE' ||
* Ledger Entries * Ledger Entries
*/ */
echo $this->element('ledger_entries', array if (0) {
(// Grid configuration echo $this->element('ledger_entries', array
'config' => array (// Grid configuration
( 'config' => array
'caption' => 'Ledger Entries', (
'filter' => array('Transaction.id' => $transaction['id'], 'caption' => 'Ledger Entries',
'Account.id !=' => $account['id']), 'filter' => array('Transaction.id' => $transaction['id'],
'exclude' => array('Transaction'), 'Account.id !=' => $account['id']),
))); 'exclude' => array('Transaction'),
)));
}
/* /\********************************************************************** */ /* /\********************************************************************** */
/* * Tenders Deposited */ /* * Tenders Deposited */
+1 -1
View File
@@ -68,7 +68,7 @@ echo '<div CLASS="detail supporting">' . "\n";
/********************************************************************** /**********************************************************************
* Ledger Entries * Unit Entries
*/ */
echo $this->element('units', array echo $this->element('units', array
+132
View File
@@ -0,0 +1,132 @@
<?php /* -*- mode:PHP -*- */
/**********************************************************************
* Because we make use of functions here,
* we need to put our top level variables somewhere
* we can access them.
*/
$this->varstore = compact('locks');
function lockDiv($obj) {
$div =
// BEGIN lock-div
'<DIV>' . "\n" .
// BEGIN lock-fieldset
'<FIELDSET CLASS="lock subset">' . "\n" .
'<LEGEND>Lock #%{id} (%{remove})</LEGEND>' . "\n" .
// BEGIN lock-n-div
'<div id="lock-%{id}-div">' . "\n" .
$obj->element
('form_table',
array('class' => "item lock entry",
'field_prefix' => 'Lock.%{id}',
'fields' => array
(
'id' => array('name' => 'Select Lock',
'opts' => array('options' => $obj->varstore['locks'])),
))) . "\n" .
// END lock-n-div
'</div>' . "\n" .
// END lock-fieldset
'</FIELDSET>' . "\n" .
// END lock-div
'</DIV>'
;
return $div;
}
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Javascript
*/
?>
<script type="text/javascript"><!--
function addLock(flash) {
addDiv('lock-entry-id', 'lock', 'locks', flash, <?php
echo FormatHelper::phpVarToJavascript
(lockDiv($this),
null,
' ');
?>
);
}
// Reset the form
function resetForm() {
$('#locks').html('');
$('#lock-entry-id').val(1);
<?php foreach ($this->data['Lock'] AS $lock): ?>
addDiv('lock-entry-id', 'lock', 'locks', false, <?php
echo FormatHelper::phpVarToJavascript
(lockDiv($this),
null,
' ');
?>
);
$('#Lock'+($('#lock-entry-id').val()-1)+'Id').val(<?php echo $lock['id'] ?>);
<?php endforeach; ?>
if ($("#lock-entry-id").val() == 1) {
addDiv('lock-entry-id', 'lock', 'locks', false, <?php
echo FormatHelper::phpVarToJavascript
(lockDiv($this),
null,
' ');
?>
);
}
}
$(document).ready(function(){
resetForm();
});
--></script>
<?php
; // alignment
/**********************************************************************
**********************************************************************
**********************************************************************
**********************************************************************
* Unit-Lock Edit
*/
echo '<div class="unit-lock edit">' . "\n";
echo $form->create('Unit', array('action' => 'lock')) . "\n";
echo $form->hidden('id') . "\n";
?>
<div CLASS="dynamic-set">
<h3>Set Locks on Unit <?php echo $this->data['Unit']['name']; ?></h3>
<input type="hidden" id="lock-entry-id" value="0">
<div id="locks"></div>
<fieldset> <legend>
<a href="#" onClick="addLock(true); return false;">Add a Lock</a>
</legend> </fieldset>
</div>
<?php
; // Alignment
echo $form->submit('Update Locks') . "\n";
echo $form->submit('Cancel', array('name' => 'cancel')) . "\n";
echo $form->end() . "\n";
echo '</div>' . "\n";
+13
View File
@@ -13,12 +13,25 @@ $leases = $unit['Lease'];
$current_lease = $unit['CurrentLease']; $current_lease = $unit['CurrentLease'];
$unit_size = $unit['UnitSize']; $unit_size = $unit['UnitSize'];
if (isset($unit['Lock']))
$locks = $unit['Lock'];
if (isset($unit['Unit'])) if (isset($unit['Unit']))
$unit = $unit['Unit']; $unit = $unit['Unit'];
$rows = array(); $rows = array();
$rows[] = array('Name', $unit['name']); $rows[] = array('Name', $unit['name']);
$rows[] = array('Status', $unit['status']); $rows[] = array('Status', $unit['status']);
if (count($locks) > 0) {
$links = array();
foreach ($locks AS $lock) {
$links[] = $html->link($lock['name'],
array('controller' => 'locks',
'action' => 'view',
$lock['id']));
}
$rows[] = array('Locks', count($locks) . ": " . implode(", ", $links));
}
$rows[] = array('Size', $html->link($unit_size['name'], $rows[] = array('Size', $html->link($unit_size['name'],
array('controller' => 'unit_sizes', array('controller' => 'unit_sizes',
'action' => 'view', 'action' => 'view',
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -55,7 +55,7 @@
* *
*/ */
if (!defined('CAKE_CORE_INCLUDE_PATH')) { if (!defined('CAKE_CORE_INCLUDE_PATH')) {
define('CAKE_CORE_INCLUDE_PATH', 'D:\Website\localhost\CakePHP'); define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . APP_DIR . DS . 'CakePHP');
} }
/** /**
+169 -1
View File
@@ -1 +1,169 @@
(function(a){a.jgrid={defaults:{recordtext:"View {0} - {1} of {2}",emptyrecords:"No records to view",loadtext:"Loading...",pgtext:"Page {0} of {1}"},search:{caption:"Search...",Find:"Find",Reset:"Reset",odata:["equal","not equal","less","less or equal","greater","greater or equal","begins with","does not begin with","is in","is not in","ends with","does not end with","contains","does not contain"],groupOps:[{op:"AND",text:"all"},{op:"OR",text:"any"}],matchText:" match",rulesText:" rules"},edit:{addCaption:"Add Record",editCaption:"Edit Record",bSubmit:"Submit",bCancel:"Cancel",bClose:"Close",saveData:"Data has been changed! Save changes?",bYes:"Yes",bNo:"No",bExit:"Cancel",msg:{required:"Field is required",number:"Please, enter valid number",minValue:"value must be greater than or equal to ",maxValue:"value must be less than or equal to",email:"is not a valid e-mail",integer:"Please, enter valid integer value",date:"Please, enter valid date value",url:"is not a valid URL. Prefix required ('http://' or 'https://')"}},view:{caption:"View Record",bClose:"Close"},del:{caption:"Delete",msg:"Delete selected record(s)?",bSubmit:"Delete",bCancel:"Cancel"},nav:{edittext:"",edittitle:"Edit selected row",addtext:"",addtitle:"Add new row",deltext:"",deltitle:"Delete selected row",searchtext:"",searchtitle:"Find records",refreshtext:"",refreshtitle:"Reload Grid",alertcap:"Warning",alerttext:"Please, select row",viewtext:"",viewtitle:"View selected row"},col:{caption:"Show/Hide Columns",bSubmit:"Submit",bCancel:"Cancel"},errors:{errcap:"Error",nourl:"No url is set",norecords:"No records to process",model:"Length of colNames <> colModel!"},formatter:{integer:{thousandsSeparator:" ",defaultValue:"0"},number:{decimalSeparator:".",thousandsSeparator:" ",decimalPlaces:2,defaultValue:"0.00"},currency:{decimalSeparator:".",thousandsSeparator:" ",decimalPlaces:2,prefix:"",suffix:"",defaultValue:"0.00"},date:{dayNames:["Sun","Mon","Tue","Wed","Thr","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],AmPm:["am","pm","AM","PM"],S:function(b){return b<11||b>13?["st","nd","rd","th"][Math.min((b-1)%10,3)]:"th"},srcformat:"Y-m-d",newformat:"d/m/Y",masks:{ISO8601Long:"Y-m-d H:i:s",ISO8601Short:"Y-m-d",ShortDate:"n/j/Y",LongDate:"l, F d, Y",FullDateTime:"l, F d, Y g:i:s A",MonthDay:"F d",ShortTime:"g:i A",LongTime:"g:i:s A",SortableDateTime:"Y-m-d\\TH:i:s",UniversalSortableDateTime:"Y-m-d H:i:sO",YearMonth:"F, Y"},reformatAfterEdit:false},baseLinkUrl:"",showAction:"",target:"",checkbox:{disabled:true},idName:"id"}}})(jQuery); ;(function($){
/**
* jqGrid English Translation
* Tony Tomov tony@trirand.com
* http://trirand.com/blog/
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
**/
$.jgrid = $.jgrid || {};
$.extend($.jgrid,{
defaults : {
recordtext: "View {0} - {1} of {2}",
emptyrecords: "No records to view",
loadtext: "Loading...",
pgtext : "Page {0} of {1}"
},
search : {
caption: "Search...",
Find: "Find",
Reset: "Reset",
odata : ['equal', 'not equal', 'less', 'less or equal','greater','greater or equal', 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain'],
groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ],
matchText: " match",
rulesText: " rules"
},
edit : {
addCaption: "Add Record",
editCaption: "Edit Record",
bSubmit: "Submit",
bCancel: "Cancel",
bClose: "Close",
saveData: "Data has been changed! Save changes?",
bYes : "Yes",
bNo : "No",
bExit : "Cancel",
msg: {
required:"Field is required",
number:"Please, enter valid number",
minValue:"value must be greater than or equal to ",
maxValue:"value must be less than or equal to",
email: "is not a valid e-mail",
integer: "Please, enter valid integer value",
date: "Please, enter valid date value",
url: "is not a valid URL. Prefix required ('http://' or 'https://')",
nodefined : " is not defined!",
novalue : " return value is required!",
customarray : "Custom function should return array!",
customfcheck : "Custom function should be present in case of custom checking!"
}
},
view : {
caption: "View Record",
bClose: "Close"
},
del : {
caption: "Delete",
msg: "Delete selected record(s)?",
bSubmit: "Delete",
bCancel: "Cancel"
},
nav : {
edittext: "",
edittitle: "Edit selected row",
addtext:"",
addtitle: "Add new row",
deltext: "",
deltitle: "Delete selected row",
searchtext: "",
searchtitle: "Find records",
refreshtext: "",
refreshtitle: "Reload Grid",
alertcap: "Warning",
alerttext: "Please, select row",
viewtext: "",
viewtitle: "View selected row"
},
col : {
caption: "Select columns",
bSubmit: "Ok",
bCancel: "Cancel"
},
errors : {
errcap : "Error",
nourl : "No url is set",
norecords: "No records to process",
model : "Length of colNames <> colModel!"
},
formatter : {
integer : {thousandsSeparator: ",", defaultValue: '0'},
number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'},
currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
date : {
dayNames: [
"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
],
monthNames: [
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
],
AmPm : ["am","pm","AM","PM"],
S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},
srcformat: 'Y-m-d',
newformat: 'n/j/Y',
masks : {
// see http://php.net/manual/en/function.date.php for PHP format used in jqGrid
// and see http://docs.jquery.com/UI/Datepicker/formatDate
// and https://github.com/jquery/globalize#dates for alternative formats used frequently
// one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many
// information about date, time, numbers and currency formats used in different countries
// one should just convert the information in PHP format
ISO8601Long:"Y-m-d H:i:s",
ISO8601Short:"Y-m-d",
// short date:
// n - Numeric representation of a month, without leading zeros
// j - Day of the month without leading zeros
// Y - A full numeric representation of a year, 4 digits
// example: 3/1/2012 which means 1 March 2012
ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy"
// long date:
// l - A full textual representation of the day of the week
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
// Y - A full numeric representation of a year, 4 digits
LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy"
// long date with long time:
// l - A full textual representation of the day of the week
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
// Y - A full numeric representation of a year, 4 digits
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// s - Seconds, with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt"
// month day:
// F - A full textual representation of a month
// d - Day of the month, 2 digits with leading zeros
MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd"
// short time (without seconds)
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt"
// long time (with seconds)
// g - 12-hour format of an hour without leading zeros
// i - Minutes with leading zeros
// s - Seconds, with leading zeros
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt"
SortableDateTime: "Y-m-d\\TH:i:s",
UniversalSortableDateTime: "Y-m-d H:i:sO",
// month with year
// Y - A full numeric representation of a year, 4 digits
// F - A full textual representation of a month
YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy"
},
reformatAfterEdit : false
},
baseLinkUrl: '',
showAction: '',
target: '',
checkbox : {disabled:true},
idName : 'id'
}
});
})(jQuery);
+64
View File
@@ -0,0 +1,64 @@
;(function($){
/**
* jqGrid extension
* Paul Tiseo ptiseo@wasteconsultants.com
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl-2.0.html
**/
$.jgrid.extend({
getPostData : function(){
var $t = this[0];
if(!$t.grid) { return; }
return $t.p.postData;
},
setPostData : function( newdata ) {
var $t = this[0];
if(!$t.grid) { return; }
// check if newdata is correct type
if ( typeof(newdata) === 'object' ) {
$t.p.postData = newdata;
}
else {
alert("Error: cannot add a non-object postData value. postData unchanged.");
}
},
appendPostData : function( newdata ) {
var $t = this[0];
if(!$t.grid) { return; }
// check if newdata is correct type
if ( typeof(newdata) === 'object' ) {
$.extend($t.p.postData, newdata);
}
else {
alert("Error: cannot append a non-object postData value. postData unchanged.");
}
},
setPostDataItem : function( key, val ) {
var $t = this[0];
if(!$t.grid) { return; }
$t.p.postData[key] = val;
},
getPostDataItem : function( key ) {
var $t = this[0];
if(!$t.grid) { return; }
return $t.p.postData[key];
},
removePostDataItem : function( key ) {
var $t = this[0];
if(!$t.grid) { return; }
delete $t.p.postData[key];
},
getUserData : function(){
var $t = this[0];
if(!$t.grid) { return; }
return $t.p.userData;
},
getUserDataItem : function( key ) {
var $t = this[0];
if(!$t.grid) { return; }
return $t.p.userData[key];
}
});
})(jQuery);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long