. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, 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 * 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. * Contributor( s): ______________________________________ */ // more advanced, intelligent columns. require_once(KT_LIB_DIR . '/browse/advancedcolumns.inc.php'); class AdvancedTitleColumn extends AdvancedColumn { var $name = 'title'; var $namespace = 'ktcore.columns.title'; var $sortable = true; var $aOptions = array(); var $aIconPaths = array(); var $link_folders = true; var $link_documents = true; function setOptions($aOptions) { $this->link_folders = KTUtil::arrayGet($aOptions, 'link_folders', $this->link_folders, false); $this->link_documents = KTUtil::arrayGet($aOptions, 'link_documents', $this->link_documents, false); parent::setOptions($aOptions); } function AdvancedTitleColumn() { $this->label = _kt("Title"); } // what is used for sorting // query addition is: // [0] => join claus // [1] => join params // [2] => ORDER function addToFolderQuery() { return array(null, null, "F.name", ); } function addToDocumentQuery() { return array(null, null, "DM.name" ); } function renderFolderLink($aDataRow) { /* this check has to be done so that any titles longer than 40 characters is not displayed incorrectly. as mozilla cannot wrap text without white spaces */ global $default; $charLength = (isset($default->titleCharLength)) ? $default->titleCharLength : 40; if (mb_strlen($aDataRow["folder"]->getName(), 'UTF-8') > $charLength) { mb_internal_encoding("UTF-8"); $outStr = htmlentities(mb_substr($aDataRow["folder"]->getName(), 0, $charLength, 'UTF-8')."...", ENT_NOQUOTES, 'UTF-8'); }else{ $outStr = htmlentities($aDataRow["folder"]->getName(), ENT_NOQUOTES, 'UTF-8'); } if($this->link_folders) { $outStr = '' . $outStr . ''; } return $outStr; } function renderDocumentLink($aDataRow) { /* this check has to be done so that any titles longer than 40 characters is not displayed incorrectly. as mozilla cannot wrap text without white spaces */ global $default; $charLength = (isset($default->titleCharLength)) ? $default->titleCharLength : 40; if (mb_strlen($aDataRow["document"]->getName(), 'UTF-8') > $charLength) { mb_internal_encoding("UTF-8"); $outStr = htmlentities(mb_substr($aDataRow["document"]->getName(), 0, $charLength, 'UTF-8')."...", ENT_NOQUOTES, 'UTF-8'); }else{ $outStr = htmlentities($aDataRow["document"]->getName(), ENT_NOQUOTES, 'UTF-8'); } if($this->link_documents) { $outStr = 'getFilename(), ENT_QUOTES, 'UTF-8').'">' . $outStr . ''; } return $outStr; } function buildDocumentLink($aDataRow) { if($aDataRow['document']->isSymbolicLink()){ $iDocId = $aDataRow['document']->getRealDocumentId(); }else{ $iDocId = $aDataRow["document"]->getId(); } $url = KTBrowseUtil::getUrlForDocument($iDocId); if($aDataRow['document']->isSymbolicLink()){ $aDataRow['document']->switchToRealCore(); $url .= "&fShortcutFolder=".$aDataRow['document']->getFolderId(); } return $url; } // 'folder_link' allows you to link to a different URL when you're connecting, instead of addQueryStringSelf // 'direct_folder' means that you want to go to 'browse folder' // 'qs_params' is an array (or string!) of params to add to the link function buildFolderLink($aDataRow) { if (is_null(KTUtil::arrayGet($this->aOptions, 'direct_folder'))) { $dest = KTUtil::arrayGet($this->aOptions, 'folder_link'); if($aDataRow['folder']->isSymbolicLink()){ $params = array('fFolderId' => $aDataRow['folder']->getLinkedFolderId(), 'fShortcutFolder' => $aDataRow['folder']->getParentID()); }else{ $params = array('fFolderId' => $aDataRow['folder']->getId()); } $params = kt_array_merge(KTUtil::arrayGet($this->aOptions, 'qs_params', array()), $params); if (empty($dest)) { return KTUtil::addQueryStringSelf($params); } else { return KTUtil::addQueryString($dest, $params); } } else { if($aDataRow['folder']->isSymbolicLink()){ return KTBrowseUtil::getUrlForFolder($aDataRow['folder']->getLinkedFolder())."&fShortcutFolder=".$aDataRow['folder']->getParentID(); }else{ return KTBrowseUtil::getUrlForFolder($aDataRow['folder']); } } } // use inline, since its just too heavy to even _think_ about using smarty. function renderData($aDataRow) { if ($aDataRow["type"] == "folder") { $contenttype = 'folder'; $link = $this->renderFolderLink($aDataRow); // If folder is a shortcut display the shortcut mime icon if($aDataRow['folder']->isSymbolicLink()){ $contenttype .= '_shortcut'; } // Separate the link from the mime icon to allow for right-to-left languages return "
 
$link"; } else { $type = ''; $size = ''; if($aDataRow['document']->isSymbolicLink()){ // If document is a shortcut - display the shortcut mime type $type = 'shortcut'; }else{ // Display the document size if it is not a shortcut $size = $this->prettySize($aDataRow["document"]->getSize()); $size = " ($size)"; } $link = $this->renderDocumentLink($aDataRow); $contenttype = $this->_mimeHelper($aDataRow["document"]->getMimeTypeId(), $type); // Separate the link from the mime icon and the size to allow for right-to-left languages return "
 
$link
$size"; } } function prettySize($size) { $finalSize = $size; $label = 'b'; if ($finalSize > 1000) { $label='Kb'; $finalSize = floor($finalSize/1000); } if ($finalSize > 1000) { $label='Mb'; $finalSize = floor($finalSize/1000); } return $finalSize . $label; } function _mimeHelper($iMimeTypeId, $type = null) { require_once(KT_LIB_DIR . '/mime.inc.php'); return KTMime::getIconPath($iMimeTypeId, $type); } } /* * Column to handle dates */ class AdvancedDateColumn extends AdvancedColumn { var $name = 'datecolumn'; var $document_field_function; var $folder_field_function; var $sortable = true; var $document_sort_column; var $folder_sort_column; var $namespace = 'ktcore.columns.genericdate'; function AdvancedDateColumn() { $this->label = _kt('Generic Date Function'); } // use inline, since its just too heavy to even _think_ about using smarty. function renderData($aDataRow) { $outStr = ''; if (($aDataRow["type"] == "folder") && (!is_null($this->folder_field_function))) { $res = call_user_func(array($aDataRow["folder"], $this->folder_field_function)); $dColumnDate = strtotime($res); // now reformat this into something "pretty" return date("Y-m-d H:i", $dColumnDate); } else if (($aDataRow["type"] == "document") && (!is_null($this->document_field_function))) { $res = call_user_func(array($aDataRow["document"], $this->document_field_function)); $dColumnDate = strtotime($res); // now reformat this into something "pretty" return date("Y-m-d H:i", $dColumnDate); } else { return '—'; } return $outStr; } function addToFolderQuery() { return array(null, null, null); } function addToDocumentQuery() { return array(null, null, $this->document_sort_column); } } class CreationDateColumn extends AdvancedDateColumn { var $document_field_function = 'getCreatedDateTime'; var $folder_field_function = null; var $document_sort_column = "D.created"; var $folder_sort_column = null; var $namespace = 'ktcore.columns.creationdate'; function CreationDateColumn() { $this->label = _kt('Created'); } } class ModificationDateColumn extends AdvancedDateColumn { var $document_field_function = 'getLastModifiedDate'; var $folder_field_function = null; var $document_sort_column = "D.modified"; var $folder_sort_column = null; var $namespace = 'ktcore.columns.modificationdate'; function ModificationDateColumn() { $this->label = _kt('Modified'); } } class AdvancedUserColumn extends AdvancedColumn { var $document_field_function; var $folder_field_function; var $sortable = false; // by default var $document_sort_column = 'creator_id'; var $folder_sort_column = 'creator_id'; var $namespace = 'ktcore.columns.genericuser'; function AdvancedUserColumn() { $this->label = null; // abstract. } // use inline, since its just too heavy to even _think_ about using smarty. function renderData($aDataRow) { $iUserId = null; if (($aDataRow["type"] == "folder") && (!is_null($this->folder_field_function))) { if (method_exists($aDataRow['folder'], $this->folder_field_function)) { $iUserId = call_user_func(array($aDataRow['folder'], $this->folder_field_function)); } } else if (($aDataRow["type"] == "document") && (!is_null($this->document_field_function))) { if (method_exists($aDataRow['document'], $this->document_field_function)) { $iUserId = call_user_func(array($aDataRow['document'], $this->document_field_function)); } } if (is_null($iUserId)) { return '—'; } $oUser = User::get($iUserId); if (PEAR::isError($oUser) || $oUser == false) { return '—'; } else { return htmlentities($oUser->getName(), ENT_NOQUOTES, 'UTF-8'); } } function addToFolderQuery() { $sUsersTable = KTUtil::getTableName('users'); $sJoinSQL = "LEFT JOIN {$sUsersTable} AS users_order_join ON F.{$this->folder_sort_column} = users_order_join.id"; return array($sJoinSQL, null, 'users_order_join.name'); } function addToDocumentQuery() { $sUsersTable = KTUtil::getTableName('users'); $sJoinSQL = "LEFT JOIN {$sUsersTable} AS users_order_join ON D.{$this->document_sort_column} = users_order_join.id"; return array($sJoinSQL, null, 'users_order_join.name'); } } class CreatorColumn extends AdvancedUserColumn { var $document_field_function = "getCreatorID"; var $folder_field_function = "getCreatorID"; var $sortable = true; // by default var $document_sort_column = 'creator_id'; var $folder_sort_column = 'creator_id'; var $namespace = 'ktcore.columns.creator'; function CreatorColumn() { $this->label = _kt("Creator"); // abstract. } } class AdvancedSelectionColumn extends AdvancedColumn { var $rangename = null; var $show_folders = true; var $show_documents = true; var $namespace = "ktcore.columns.selection"; function AdvancedSelectionColumn() { $this->label = ''; } function setOptions($aOptions) { AdvancedColumn::setOptions($aOptions); $this->rangename = KTUtil::arrayGet($this->aOptions, 'rangename', $this->rangename); $this->show_folders = KTUtil::arrayGet($this->aOptions, 'show_folders', $this->show_folders, false); $this->show_documents = KTUtil::arrayGet($this->aOptions, 'show_documents', $this->show_documents, false); } function renderHeader($sReturnURL) { global $main; $main->requireJSResource("resources/js/toggleselect.js"); return sprintf('', $this->rangename); } // only include the _f or _d IF WE HAVE THE OTHER TYPE. function renderData($aDataRow) { $localname = htmlentities($this->rangename,ENT_QUOTES,'UTF-8'); if (($aDataRow["type"] === "folder") && ($this->show_folders)) { if ($this->show_documents) { $localname .= "_f[]"; } $v = $aDataRow["folderid"]; } else if (($aDataRow["type"] === "document") && $this->show_documents) { if ($this->show_folders) { $localname .= "_d[]"; } $v = $aDataRow["docid"]; } else { return ' '; } return sprintf('', $localname, $v); } // no label, but we do have a title function getName() { return _kt("Multiple Selection"); } } class AdvancedSingleSelectionColumn extends AdvancedSelectionColumn { var $namespace = 'ktcore.columns.singleselection'; function AdvancedSingleSelectionColumn() { parent::AdvancedSelectionColumn(); $this->label = null; } function renderHeader() { global $main; //include some javascript to force real single selections if($this->show_folders && $this->show_documents){ $main->requireJSResource("resources/js/singleselect.js"); } return ' '; } // only include the _f or _d IF WE HAVE THE OTHER TYPE. function renderData($aDataRow) { $localname = $this->rangename; if (($aDataRow["type"] === "folder") && ($this->show_folders)) { if ($this->show_documents) { $localname .= "_f"; } $v = $aDataRow["folderid"]; } else if (($aDataRow["type"] === "document") && $this->show_documents) { if ($this->show_folders) { $localname .= "_d"; } $v = $aDataRow["docid"]; } else { return ' '; } $return = 'show_folders && $this->show_documents){ $return .= 'onClick="forceSingleSelect(this)" '; } $return .='/>'; return $return; } // no label, but we do have a title function getName() { return _kt("Single Selection"); } } class AdvancedWorkflowColumn extends AdvancedColumn { var $namespace = 'ktcore.columns.workflow_state'; var $sortable = false; function AdvancedWorkflowColumn() { $this->label = _kt("Workflow State"); $this->sortable = false; } // use inline, since its just too heavy to even _think_ about using smarty. function renderData($aDataRow) { // only _ever_ show this for documents. if ($aDataRow["type"] === "folder") { return ' '; } $oWorkflow = KTWorkflowUtil::getWorkflowForDocument($aDataRow['document']); $oState = KTWorkflowUtil::getWorkflowStateForDocument($aDataRow['document']); if (($oState == null) || ($oWorkflow == null)) { return '—'; } else { return sprintf('%s %s', htmlentities($oState->getName(), ENT_NOQUOTES, 'UTF-8'), htmlentities($oWorkflow->getName(), ENT_NOQUOTES, 'UTF-8') ); } } } class CheckedOutByColumn extends AdvancedColumn { var $namespace = 'ktcore.columns.checkedout_by'; var $sortable = false; function CheckedOutByColumn() { $this->label = _kt('Checked Out By'); $this->sortable = false; } function renderData($aDataRow) { // only show this for documents. if ($aDataRow['type'] === 'folder') { return ' '; } // Check if document is checked out $bIsCheckedOut = $aDataRow['document']->getIsCheckedOut(); if($bIsCheckedOut){ // Get the user id $iUserId = $aDataRow['document']->getCheckedOutUserID(); $oUser = User::get($iUserId); $sUser = $oUser->getName(); return ''.htmlentities($sUser, ENT_NOQUOTES, 'UTF-8').''; } return '—'; } } class DocumentTypeColumn extends AdvancedColumn { var $namespace = 'ktcore.columns.document_type'; var $sortable = false; function DocumentTypeColumn() { $this->label = _kt('Document Type'); $this->sortable = false; } function renderData($aDataRow) { // only show this for documents. if ($aDataRow['type'] === 'folder') { return ' '; } // Check if document is checked out $iDocTypeId = $aDataRow['document']->getDocumentTypeID(); if(!empty($iDocTypeId)){ $oDocumentType = DocumentType::get($iDocTypeId); $sType = $oDocumentType->getName(); return ''.htmlentities($sType, ENT_NOQUOTES, 'UTF-8').''; } return '—'; } } class AdvancedDownloadColumn extends AdvancedColumn { var $namespace = 'ktcore.columns.download'; function AdvancedDownloadColumn() { $this->label = null; } function renderHeader($sReturnURL) { return ' '; } function renderData($aDataRow) { // only _ever_ show this for documents. if ($aDataRow["type"] === "folder") { return ' '; } $link = KTUtil::ktLink('action.php','ktcore.actions.document.view', 'fDocumentId=' . $aDataRow['document']->getId()); return sprintf('%s', $link, _kt('Download Document'), _kt('Download Document')); } function getName() { return _kt('Download'); } } class DocumentIDColumn extends AdvancedColumn { var $bSortable = false; var $namespace = 'ktcore.columns.docid'; function DocumentIDColumn() { $this->label = _kt("Document ID"); } function renderData($aDataRow) { // only _ever_ show this for documents. if ($aDataRow["type"] === "folder") { return ' '; } return htmlentities($aDataRow['document']->getId(), ENT_NOQUOTES, 'UTF-8'); } } class ContainingFolderColumn extends AdvancedColumn { var $namespace = 'ktcore.columns.containing_folder'; function ContainingFolderColumn() { $this->label = _kt("View Folder"); } function renderData($aDataRow) { // only _ever_ show this for documents. if ($aDataRow["type"] === "folder") { return ' '; } $link = KTBrowseUtil::getUrlForFolder($aDataRow['document']->getFolderId()); return sprintf('%s', $link, _kt('View Folder'), _kt('View Folder')); } function getName() { return _kt('Opening Containing Folder'); } } ?>