From 6c1351ad7230c5f35bdd335504dd78517a3ab5e7 Mon Sep 17 00:00:00 2001 From: megan_w Date: Tue, 1 Apr 2008 10:38:56 +0000 Subject: [PATCH] KTS-3161 "Allow the user to change the ordering of the browse columns" Fixed. Added the logic to change the order. --- lib/browse/columnentry.inc.php | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- plugins/ktcore/admin/manageViews.php | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------- templates/ktcore/misc/columns/edit_view.smarty | 34 +++++++++++++++++++++++----------- 3 files changed, 290 insertions(+), 89 deletions(-) diff --git a/lib/browse/columnentry.inc.php b/lib/browse/columnentry.inc.php index f2902e4..18c961d 100644 --- a/lib/browse/columnentry.inc.php +++ b/lib/browse/columnentry.inc.php @@ -6,46 +6,46 @@ * KnowledgeTree Open Source Edition * Document Management Made Simple * Copyright (C) 2004 - 2008 The Jam Warehouse Software (Pty) Limited - * + * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. - * + * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. - * + * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by - * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices - * must display the words "Powered by KnowledgeTree" and retain the original - * copyright notice. + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. * Contributor( s): ______________________________________ * */ - + class KTColumnEntry extends KTEntity { - + /** role object primary key */ var $sViewNamespace; var $sColumnNamespace; - var $iPosition; + var $iPosition; var $sConfigArray; var $bRequired; - + var $_aFieldToSelect = array( 'iId' => 'id', 'sColumnNamespace' => 'column_namespace', @@ -54,24 +54,24 @@ class KTColumnEntry extends KTEntity { 'sConfigArray' => 'config_array', 'bRequired' => 'required' ); - + var $_bUsePearError = true; - function getColumnNamespace() { return $this->sColumnNamespace; } + function getColumnNamespace() { return $this->sColumnNamespace; } function setColumnNamespace($sNewValue) { $this->sColumnNamespace = $sNewValue; } - function getViewNamespace() { return $this->sViewNamespace; } + function getViewNamespace() { return $this->sViewNamespace; } function setViewNamespace($sNewValue) { $this->sViewNamespace = $sNewValue; } - function getPosition() { return $this->iPosition; } + function getPosition() { return $this->iPosition; } function setPosition($iNewValue) { $this->iPosition = $iNewValue; } - function getConfigArray() { return unserialize($this->sConfigArray); } + function getConfigArray() { return unserialize($this->sConfigArray); } function setConfigArray($aNewValue) { $this->sConfigArray = serialize($aNewValue); } - function getRequired() { return $this->bRequired; } + function getRequired() { return $this->bRequired; } function setRequired($bNewValue) { $this->bRequired = $bNewValue; } - + function _fieldValues () { return array( 'column_namespace' => $this->sColumnNamespace, - 'view_namespace' => $this->sViewNamespace, + 'view_namespace' => $this->sViewNamespace, 'config_array' => $this->sConfigArray, 'position' => $this->iPosition, 'required' => $this->bRequired, @@ -81,22 +81,172 @@ class KTColumnEntry extends KTEntity { function _table () { return KTUtil::getTableName('column_entries'); } function get($iEntryId) { return KTEntityUtil::get('KTColumnEntry', $iEntryId); } function & getList($sWhereClause = null) { return KTEntityUtil::getList2('KTColumnEntry', $sWhereClause); } - function & createFromArray($aOptions) { - // transparently convert the options. - + function & createFromArray($aOptions) { + // transparently convert the options. + $aOptions['configarray'] = serialize(KTUtil::arrayGet($aOptions, 'config', array())); unset($aOptions['config']); - - return KTEntityUtil::createFromArray('KTColumnEntry', $aOptions); - } - + + return KTEntityUtil::createFromArray('KTColumnEntry', $aOptions); + } + function & getByView($sViewNamespace, $aOptions = null) { if (is_null($aOptions)) { $aOptions = array(); } $aOptions['multi'] = true; + $aOptions['orderby'] = 'position'; $aSelect = array('view_namespace' => $sViewNamespace); - + return KTEntityUtil::getByDict('KTColumnEntry', $aSelect, $aOptions); } + /** + * Get the postion of the last entry + */ + function getNextEntryPosition($sViewNamespace){ + $sql = "SELECT position FROM column_entries + WHERE view_namespace = ? + ORDER BY position DESC LIMIT 1"; + $aParams = array($sViewNamespace); + + $result = DBUtil::getResultArray(array($sql, $aParams)); + + if(PEAR::isError($result) || empty($result)){ + return 1000; + } + return $result[0]['position'] + 1; + } + + /** + * Reset the order of the columns + * + */ + function reorderColumns($sViewNamespace) { + // Get the columns in the order they'll appear - first by position then by id + $sql = "SELECT id, position FROM column_entries + WHERE view_namespace = ? + ORDER BY position, id ASC"; + $aParams = array($sViewNamespace); + + $result = DBUtil::getResultArray(array($sql, $aParams)); + + if(PEAR::isError($result) || empty($result)){ + return false; + } + + // Set all positions to be unique and in order + foreach($result as $key => $column){ + $position = $column['position']; + + // If the column position is correct in the order, continue + if($position == $key){ + continue; + } + + // Reset the position + $aFields = array(); + $aFields['position'] = $key; + + $res = DBUtil::autoUpdate('column_entries', $aFields, $column['id']); + } + return true; + } + + /** + * Get the next postion up / down + */ + function getNextPosition($sViewNamespace, $iId, $position, $dir = 'up') { + switch($dir){ + case 'down': + $comp = '>'; + $order = 'ASC'; + break; + default: + $comp = '<'; + $order = 'DESC'; + } + + // Get the column above / below to swop position + $sql = "SELECT id, position FROM column_entries + WHERE view_namespace = ? AND (position {$comp} ? OR (position = ? AND id {$comp} ?)) + ORDER BY position {$order} LIMIT 1"; + $aParams = array($sViewNamespace, $position, $position, $iId); + + $result = DBUtil::getOneResult(array($sql, $aParams)); + + if(PEAR::isError($result) || empty($result)){ + return false; + } + return $result; + } + + /** + * Get the updated position of the column + * + * @param int $iId + * @return int + */ + function getNewPosition($iId){ + // Get the new position + $sql = "SELECT id, position FROM column_entries + WHERE id = ?"; + $aParams = array($iId); + $result = DBUtil::getOneResult(array($sql, $aParams)); + + if(PEAR::isError($result) || empty($result)){ + return false; + } + return $result['position']; + } + + /** + * Update the position of a column + */ + function updatePosition($iId, $position) { + $aFields = array('position' => $position); + DBUtil::autoUpdate('column_entries', $aFields, $iId); + } + + /** + * Move the display position of the column up / down + */ + function movePosition($sViewNamespace, $iId, $dir = 'up') { + $position = $this->getPosition(); + + // Get the column to swop position with + $next = $this->getNextPosition($sViewNamespace, $iId, $position, $dir); + if($next === false){ + return false; + } + + // Get position of the next column up / down + $newPos = $next['position']; + $iNextId = $next['id']; + + if($newPos == $position){ + // 2 columns have the same position - reorder them + $res = $this->reorderColumns($sViewNamespace); + if($res === false){ + return false; + } + + $position = $this->getNewPosition($iId); + if($position === false){ + return false; + } + + // Get the column to swop with + $next = $this->getNextPosition($sViewNamespace, $iId, $position, $dir); + if($next === false){ + return false; + } + $newPos = $next['position']; + $iNextId = $next['id']; + } + + // update the columns + $this->updatePosition($iId, $newPos); + $this->updatePosition($iNextId, $position); + return true; + } } ?> \ No newline at end of file diff --git a/plugins/ktcore/admin/manageViews.php b/plugins/ktcore/admin/manageViews.php index 1106325..9ddd9fb 100644 --- a/plugins/ktcore/admin/manageViews.php +++ b/plugins/ktcore/admin/manageViews.php @@ -1,36 +1,36 @@ . - * + * * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. - * + * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. - * + * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by - * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices - * must display the words "Powered by KnowledgeTree" and retain the original - * copyright notice. + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. * Contributor( s): ______________________________________ */ @@ -38,42 +38,42 @@ require_once(KT_LIB_DIR . '/templating/templating.inc.php'); require_once(KT_LIB_DIR . '/widgets/reorderdisplay.inc.php'); require_once(KT_LIB_DIR . '/dispatcher.inc.php'); require_once(KT_LIB_DIR . '/browse/columnregistry.inc.php'); - + class ManageViewDispatcher extends KTAdminDispatcher { function check() { - + $this->aBreadcrumbs[] = array('url' => $_SERVER['PHP_SELF'], 'name' => _kt('Manage Views')); return parent::check(); } function do_main() { $oTemplating =& KTTemplating::getSingleton(); - $oTemplate = $oTemplating->loadTemplate('ktcore/misc/columns/select_view'); - - $oColumnRegistry =& KTColumnRegistry::getSingleton(); - + $oTemplate = $oTemplating->loadTemplate('ktcore/misc/columns/select_view'); + + $oColumnRegistry =& KTColumnRegistry::getSingleton(); + $aViews = $oColumnRegistry->getViews(); - $aTemplateData = array( - 'context' => $this, + $aTemplateData = array( + 'context' => $this, 'views' => $aViews, ); return $oTemplate->render($aTemplateData); } - function do_editView() { + function do_editView() { $oTemplating =& KTTemplating::getSingleton(); - $oTemplate = $oTemplating->loadTemplate('ktcore/misc/columns/edit_view'); - - $oColumnRegistry =& KTColumnRegistry::getSingleton(); + $oTemplate = $oTemplating->loadTemplate('ktcore/misc/columns/edit_view'); + + $oColumnRegistry =& KTColumnRegistry::getSingleton(); $aColumns = $oColumnRegistry->getColumnsForView($_REQUEST['viewNS']); //var_dump($aColumns); exit(0); $aAllColumns = $oColumnRegistry->getColumns(); - $view_name = $oColumnRegistry->getViewName($_REQUEST['viewNS']); + $view_name = $oColumnRegistry->getViewName(($_REQUEST['viewNS'])); $this->oPage->setTitle($view_name); - $this->oPage->setBreadcrumbDetails($view_name); + $this->oPage->setBreadcrumbDetails($view_name); $aOptions = array(); $vocab = array(); @@ -83,59 +83,98 @@ class ManageViewDispatcher extends KTAdminDispatcher { $aOptions['vocab'] = $vocab; $add_field = new KTLookupWidget(_kt("Columns"), _kt("Select a column to add to the view. Please note that while you can add multiple copies of a column, they will all behave as a single column"), 'column_ns', null, $this->oPage, true, null, $aErrors = null, $aOptions); - $aTemplateData = array( + $aTemplateData = array( 'context' => $this, 'current_columns' => $aColumns, 'all_columns' => $aAllColumns, 'view' => $_REQUEST['viewNS'], 'add_field' => $add_field, ); - return $oTemplate->render($aTemplateData); - } - - function do_deleteEntry() { - $entry_id = KTUtil::arrayGet($_REQUEST, 'entry_id'); - $view = KTUtil::arrayGet($_REQUEST, 'viewNS'); - - // none of these conditions can be reached "normally". - + return $oTemplate->render($aTemplateData); + } + + function do_deleteEntry() { + $entry_id = KTUtil::arrayGet($_REQUEST, 'entry_id'); + $view = KTUtil::arrayGet($_REQUEST, 'viewNS'); + + // none of these conditions can be reached "normally". + $oEntry = KTColumnEntry::get($entry_id); if (PEAR::isError($oEntry)) { $this->errorRedirectToMain(_kt("Unable to locate the entry")); } - + if ($oEntry->getRequired()) { $this->errorRedirectToMain(_kt("That column is required")); } - + if ($oEntry->getViewNamespace() != $view) { $this->errorRedirectToMain(_kt("That column is not for the specified view")); } - + $res = $oEntry->delete(); - + if (PEAR::isError($res)) { $this->errorRedirectToMain(sprintf(_kt("Failed to remove that column: %s"), $res->getMessage())); - } - + } + $this->successRedirectTo("editView", _kt("Deleted Entry"), sprintf("viewNS=%s", $view)); - } - + } + function do_addEntry() { - $column_ns = KTUtil::arrayGet($_REQUEST, 'column_ns'); - $view = KTUtil::arrayGet($_REQUEST, 'viewNS'); + $column_ns = KTUtil::arrayGet($_REQUEST, 'column_ns'); + $view = KTUtil::arrayGet($_REQUEST, 'viewNS'); - $this->startTransaction(); - + $this->startTransaction(); + + $position = KTColumnEntry::getNextEntryPosition($view); $oEntry = KTColumnEntry::createFromArray(array( 'ColumnNamespace' => $column_ns, 'ViewNamespace' => $view, - 'Position' => 1000, // start it at the bottom + 'Position' => $position, // start it at the bottom 'config' => array(), // stub, for now. 'Required' => 0 - )); + )); + + $this->successRedirectTo("editView", _kt("Added Entry"), sprintf("viewNS=%s", $view)); + } + + function do_orderUp(){ + $entryId = $_REQUEST['entry_id']; + $view = $_REQUEST['viewNS']; + + $oEntry = KTColumnEntry::get($entryId); + if (PEAR::isError($oEntry)) { + $this->errorRedirectTo('editView', _kt('Unable to locate the column entry'), "viewNS={$view}"); + exit(); + } + + $res = $oEntry->movePosition($view, $entryId, 'up'); + if (PEAR::isError($res)) { + $this->errorRedirectTo('editView', $res->getMessage(), "viewNS={$view}"); + exit(); + } + + $this->redirectTo('editView', "viewNS={$view}"); + } + + function do_orderDown(){ + $entryId = $_REQUEST['entry_id']; + $view = $_REQUEST['viewNS']; + + $oEntry = KTColumnEntry::get($entryId); + if (PEAR::isError($oEntry)) { + $this->errorRedirectTo('editView', _kt('Unable to locate the column entry'), "viewNS={$view}"); + exit(); + } + + $res = $oEntry->movePosition($view, $entryId, 'down'); + if (PEAR::isError($res)) { + $this->errorRedirectTo('editView', $res->getMessage(), "viewNS={$view}"); + exit(); + } - $this->successRedirectTo("editView", _kt("Added Entry"), sprintf("viewNS=%s", $view)); + $this->redirectTo("editView", "viewNS={$view}"); } } diff --git a/templates/ktcore/misc/columns/edit_view.smarty b/templates/ktcore/misc/columns/edit_view.smarty index 0508464..eb2ddd4 100644 --- a/templates/ktcore/misc/columns/edit_view.smarty +++ b/templates/ktcore/misc/columns/edit_view.smarty @@ -1,29 +1,41 @@

{i18n}Edit View{/i18n}

-

{i18n}The columns included in this view are displayed below. To add additional columns into the +

{i18n}The columns included in this view are displayed below. To add additional columns into the view, use the form below the list. To remove items, click on the "delete" icon next to the column name. Note that some columns may be required -in a given view. Also, while you can +in a given view. Also, while you can have multiple copies of a given column in a specific view this is not recommended.{/i18n}

{if (!empty($current_columns))} - - + + + - {foreach from=$current_columns item=oColumn} + {foreach name=cols from=$current_columns item=oColumn} {if $oColumn->getRequiredInView()} - {else} - + {else} + {/if} - + + + + {/foreach}
{i18n}Column{/i18n}{i18n}Delete{/i18n}{i18n}Column{/i18n}{i18n}Delete{/i18n}{i18n}Position{/i18n}
{$oColumn->getName()}{i18n}Delete{/i18n}{i18n}Delete{/i18n}
+ {if !$smarty.foreach.cols.first} + {i18n}Reorder up{/i18n} + {/if} + + {if !$smarty.foreach.cols.last} + {i18n}Reorder down{/i18n} + {/if} +
@@ -38,9 +50,9 @@ have multiple copies of a given column in a specific view this is not recommende {$add_field->render()}
- + - -
+ + \ No newline at end of file -- libgit2 0.21.4