diff --git a/bin/openoffice/DocumentConverter.py b/bin/openoffice/DocumentConverter.py new file mode 100644 index 0000000..238e05c --- /dev/null +++ b/bin/openoffice/DocumentConverter.py @@ -0,0 +1,139 @@ +# +# PyODConverter (Python OpenDocument Converter) v0.9 - 2007-04-05 +# +# This script converts a document from one office format to another by +# connecting to an OpenOffice.org instance via Python-UNO bridge. +# +# Copyright (C) 2007 Mirko Nasato +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +# +DEFAULT_OPENOFFICE_PORT = 8100 + +import uno +from os.path import abspath, splitext +from com.sun.star.beans import PropertyValue +from com.sun.star.connection import NoConnectException + +FAMILY_PRESENTATION = "Presentation" +FAMILY_SPREADSHEET = "Spreadsheet" +FAMILY_TEXT = "Text" + +FAMILY_BY_EXTENSION = { + "odt": FAMILY_TEXT, + "sxw": FAMILY_TEXT, + "doc": FAMILY_TEXT, + "rtf": FAMILY_TEXT, + "txt": FAMILY_TEXT, + "wpd": FAMILY_TEXT, + "html": FAMILY_TEXT, + "ods": FAMILY_SPREADSHEET, + "sxc": FAMILY_SPREADSHEET, + "xls": FAMILY_SPREADSHEET, + "odp": FAMILY_PRESENTATION, + "sxi": FAMILY_PRESENTATION, + "ppt": FAMILY_PRESENTATION +} + +FILTER_BY_EXTENSION = { + "pdf": { + FAMILY_TEXT: "writer_pdf_Export", + FAMILY_SPREADSHEET: "calc_pdf_Export", + FAMILY_PRESENTATION: "impress_pdf_Export" + }, + "html": { + FAMILY_TEXT: "HTML (StarWriter)", + FAMILY_SPREADSHEET: "HTML (StarCalc)", + FAMILY_PRESENTATION: "impress_html_Export" + }, + "odt": { FAMILY_TEXT: "writer8" }, + "doc": { FAMILY_TEXT: "MS Word 97" }, + "rtf": { FAMILY_TEXT: "Rich Text Format" }, + "txt": { FAMILY_TEXT: "Text" }, + "ods": { FAMILY_SPREADSHEET: "calc8" }, + "xls": { FAMILY_SPREADSHEET: "MS Excel 97" }, + "odp": { FAMILY_PRESENTATION: "impress8" }, + "ppt": { FAMILY_PRESENTATION: "MS PowerPoint 97" }, + "swf": { FAMILY_PRESENTATION: "impress_flash_Export" } +} + + +class DocumentConversionException(Exception): + + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + + +def _unoProps(**args): + props = [] + for key in args: + prop = PropertyValue() + prop.Name = key + prop.Value = args[key] + props.append(prop) + return tuple(props) + + +class DocumentConverter: + + def __init__(self, port=DEFAULT_OPENOFFICE_PORT): + localContext = uno.getComponentContext() + resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext) + try: + context = resolver.resolve("uno:socket,host=localhost,port=%s;urp;StarOffice.ComponentContext" % port) + except NoConnectException: + raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port + self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context) + + def convert(self, inputFile, outputFile): + inputExt = self._fileExt(inputFile) + outputExt = self._fileExt(outputFile) + + filterName = self._filterName(inputExt, outputExt) + + inputUrl = self._fileUrl(argv[1]) + outputUrl = self._fileUrl(argv[2]) + + document = self.desktop.loadComponentFromURL(inputUrl, "_blank", 0, _unoProps(Hidden=True, ReadOnly=True)) + document.storeToURL(outputUrl, _unoProps(FilterName=filterName)) + document.close(True) + + def _filterName(self, inputExt, outputExt): + try: + family = FAMILY_BY_EXTENSION[inputExt] + except KeyError: + raise DocumentConversionException, "unknown input format: '%s'" % inputExt + try: + filterByFamily = FILTER_BY_EXTENSION[outputExt] + except KeyError: + raise DocumentConversionException, "unknown output format: '%s'" % outputExt + try: + return filterByFamily[family] + except KeyError: + raise DocumentConversionException, "unsupported conversion: from '%s' to '%s'" % (inputExt, outputExt) + + def _fileExt(self, path): + ext = splitext(path)[1] + if ext is not None: + return ext[1:].lower() + + def _fileUrl(self, path): + return uno.systemPathToFileUrl(abspath(path)) + + +if __name__ == "__main__": + from sys import argv, exit + + if len(argv) < 3: + print "USAGE: " + argv[0] + " " + exit(255) + + try: + converter = DocumentConverter() + converter.convert(argv[1], argv[2]) + except DocumentConversionException, exception: + print "ERROR! " + str(exception) + exit(1) + diff --git a/bin/openoffice/pdfgen.py b/bin/openoffice/pdfgen.py index b5f63b0..f7b3246 100755 --- a/bin/openoffice/pdfgen.py +++ b/bin/openoffice/pdfgen.py @@ -45,7 +45,7 @@ try: ### Get Service Manager context = uno.getComponentContext() resolver = context.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", context) - ctx = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") + ctx = resolver.resolve("uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext") smgr = ctx.ServiceManager ### Load document diff --git a/config/config.ini b/config/config.ini index fa0ea98..e071fd0 100644 --- a/config/config.ini +++ b/config/config.ini @@ -339,6 +339,13 @@ safemode = on explorerMetadataCapture = true officeMetadataCapture = true +; settings for the Disk Usage dashlet [DiskUsage] -warningThreshold=5 -urgentThreshold=1 +; When free space in a mount point is less than this percentage, +; the disk usage dashlet will will highlight the mount in ORANGE +warningThreshold=10 + +; When free space in a mount point is less than this percentage, +; the disk usage dashlet will will highlight the mount in RED +urgentThreshold=5 + diff --git a/lib/discussions/DiscussionThread.inc b/lib/discussions/DiscussionThread.inc index 6e59a52..2fcbf37 100644 --- a/lib/discussions/DiscussionThread.inc +++ b/lib/discussions/DiscussionThread.inc @@ -8,7 +8,7 @@ * License Version 1.1.2 ("License"); You may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.knowledgetree.com/KPL - * + * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. * See the License for the specific language governing rights and @@ -19,9 +19,9 @@ * (ii) the KnowledgeTree copyright notice * in the same form as they appear in the distribution. See the License for * requirements. - * + * * The Original Code is: KnowledgeTree Open Source - * + * * The Initial Developer of the Original Code is The Jam Warehouse Software * (Pty) Ltd, trading as KnowledgeTree. * Portions created by The Jam Warehouse Software (Pty) Ltd are Copyright @@ -34,15 +34,15 @@ class DiscussionThread extends KTEntity{ var $_bUsePearError = true; var $iDocumentId; - var $iFirstCommentId = -1; - var $iLastCommentId = -1; + var $iFirstCommentId = null; + var $iLastCommentId = null; var $iNumberOfViews = 0; var $iNumberOfReplies = 0; var $iState = 0; var $iCloseMetadataVersion = 0; var $sCloseReason = ""; var $iCreatorId; - + var $_aFieldToSelect = array( 'iId' => 'id', 'iDocumentId' => 'document_id', @@ -55,7 +55,7 @@ class DiscussionThread extends KTEntity{ 'sCloseReason' => 'close_reason', 'iCreatorId' => 'creator_id', ); - + /** * DiscussionThread Constructor */ @@ -82,21 +82,21 @@ class DiscussionThread extends KTEntity{ function incrementNumberOfViews() { $this->iNumberOfViews += 1; } function getNumberOfReplies(){ return $this->iNumberOfReplies; } function incrementNumberOfReplies(){ $this->iNumberOfReplies += 1; } - function setNumberOfReplies($iValue){ $this->iNumberOfReplies = $iValue; } + function setNumberOfReplies($iValue){ $this->iNumberOfReplies = $iValue; } function getState(){ return $this->iState; } function setState($iValue){ $this->iState = $iValue; } function getCloseMetadataVersion(){ return $this->iCloseMetadataVersion; } function setCloseMetadataVersion($iValue){ $this->iCloseMetadataVersion = $iValue; } function getCloseReason(){ return $this->sCloseReason; } function setCloseReason($sValue){ $this->sCloseReason = $sValue; } - - + + /** * Get a All commentId's seperated by a comma "," */ function getAllCommentId() { global $default; - + $sql = $default->db; $aQuery = array("SELECT id FROM $default->discussion_threads_table WHERE document_id = ? ORDER BY id",/*ok*/ $this->iDocumentId); @@ -104,28 +104,28 @@ class DiscussionThread extends KTEntity{ if ($result) { $sql->next_record(); $iThreadId = $sql->f("id"); - + $aQuery = array("SELECT id FROM $default->discussion_comments_table WHERE thread_id = ? ORDER BY date DESC",/*ok*/ $iThreadId); $result = $sql->query($aQuery); - - if ($result) { + + if ($result) { while ($sql->next_record()) { if ($sql->f("id") > 0) { - $sAllCommentId .= $sql->f("id") . ","; + $sAllCommentId .= $sql->f("id") . ","; } else { - //Id not valid - } + //Id not valid + } } - return $sAllCommentId ; + return $sAllCommentId ; } return false; } else { // No Thread for document return false; - } - } - + } + } + /** * Static function * Get a list of DiscussionThreads @@ -137,15 +137,15 @@ class DiscussionThread extends KTEntity{ function getList($sWhereClause = null) { return KTEntityUtil::getList(DiscussionThread::_table(), 'DiscussionThread', $sWhereClause); } - + function getThreadIdforDoc($iDocumentId){ - global $default; + global $default; $sql = $default->db; $result = $sql->query(array("SELECT id FROM $default->discussion_threads_table WHERE document_id = ?", $iDocumentId));/*ok*/ - if ($result) { + if ($result) { if ($sql->next_record()) { if ($sql->f("id") > 0) { - return $sql->f("id"); + return $sql->f("id"); } else { return "false"; } @@ -154,8 +154,8 @@ class DiscussionThread extends KTEntity{ } return false; } - - + + function &get($iId) { return KTEntityUtil::get('DiscussionThread', $iId); } diff --git a/lib/validation/dispatchervalidation.inc.php b/lib/validation/dispatchervalidation.inc.php index 40422e5..5e539be 100644 --- a/lib/validation/dispatchervalidation.inc.php +++ b/lib/validation/dispatchervalidation.inc.php @@ -225,6 +225,26 @@ class KTDispatcherValidation { return $sString; } + function validateIllegalCharacters($sString, $aOptions = null) { + $sString = trim($sString); + if (empty($sString)) { + $aOptions['message'] = KTUtil::arrayGet($aOptions, + 'message', _kt("An empty string was given")); + $this->handleError($aOptions); + } + + // illegal characters: /\ <>|%+':"?* + $pattern = "[\*|\%|\\\|\/|\<|\>|\+|\:|\?|\||\'|\"]"; + if(preg_match($pattern, $sString)){ + $sChars = "\/<>|%+*':\"?"; + $sMessage = sprintf(_kt('The value you have entered is invalid. The following characters are not allowed: %s'), $sChars); + $aOptions['message'] = KTUtil::arrayGet($aOptions, 'illegal_character_message', $sMessage); + $this->handleError($aOptions); + } + + return $sString; + } + // validate a STRING to an integer function validateInteger($sInteger, $aOptions = null) { $sInteger = trim($sInteger); diff --git a/plugins/housekeeper/HouseKeeperPlugin.php b/plugins/housekeeper/HouseKeeperPlugin.php index 793600b..5391514 100644 --- a/plugins/housekeeper/HouseKeeperPlugin.php +++ b/plugins/housekeeper/HouseKeeperPlugin.php @@ -1,4 +1,4 @@ -registerValidator('KTStringValidator', 'ktcore.validators.string', 'KTValidators.php'); + $this->registerValidator('KTIllegalCharValidator', 'ktcore.validators.illegal_char', 'KTValidators.php'); $this->registerValidator('KTEntityValidator', 'ktcore.validators.entity', 'KTValidators.php'); $this->registerValidator('KTRequiredValidator', 'ktcore.validators.required', 'KTValidators.php'); $this->registerValidator('KTEmailValidator', 'ktcore.validators.emailaddress', 'KTValidators.php'); @@ -183,6 +184,7 @@ class KTCorePlugin extends KTPlugin { $this->registerValidator('KTFieldsetValidator', 'ktcore.validators.fieldset', 'KTValidators.php'); $this->registerValidator('KTFileValidator', 'ktcore.validators.file', 'KTValidators.php'); $this->registerValidator('KTRequiredFileValidator', 'ktcore.validators.requiredfile', 'KTValidators.php'); + $this->registerValidator('KTFileIllegalCharValidator', 'ktcore.validators.fileillegalchar', 'KTValidators.php'); $this->registerValidator('KTArrayValidator', 'ktcore.validators.array', 'KTValidators.php'); // criterion diff --git a/plugins/ktcore/KTFolderActions.php b/plugins/ktcore/KTFolderActions.php index 8c4e096..bb42722 100644 --- a/plugins/ktcore/KTFolderActions.php +++ b/plugins/ktcore/KTFolderActions.php @@ -96,7 +96,12 @@ class KTFolderAddFolderAction extends KTFolderAction { $oForm->setValidators(array( array('ktcore.validators.string', array( 'test' => 'name', - 'output' => 'name')), + 'output' => 'name', + )), + array('ktcore.validators.illegal_char', array( + 'test' => 'name', + 'output' => 'name', + )), )); return $oForm; diff --git a/plugins/ktcore/KTValidators.php b/plugins/ktcore/KTValidators.php index 5faccfb..de68cbb 100644 --- a/plugins/ktcore/KTValidators.php +++ b/plugins/ktcore/KTValidators.php @@ -89,6 +89,53 @@ class KTStringValidator extends KTValidator { } } +class KTIllegalCharValidator extends KTValidator { + var $sNamespace = 'ktcore.validators.illegal_char'; + var $sWarning; + + function configure($aOptions) { + $res = parent::configure($aOptions); + if (PEAR::isError($res)) { + return $res; + } + + $sChars = "\/*<>|%+':\"?"; + $sWarning = sprintf(_kt('The value you have entered is invalid. The following characters are not allowed: %s'), $sChars); + $this->sWarning = KTUtil::arrayGet($aOptions, 'illegal_character_warning', $sWarning); + + $this->bTrim = KTUtil::arrayGet($aOptions, 'trim', true, false); + } + + function validate($data) { + $results = array(); + $errors = array(); + + // very simple if we're required and not present, fail + // otherwise, its ok. + $val = KTUtil::arrayGet($data, $this->sInputVariable); + + if ($this->bTrim) { + $val = trim($val); + } + + // illegal characters: \/ *<>|%+':"? + $pattern = "[\*|\%|\\\|\/|\<|\>|\+|\:|\?|\||\'|\"]"; + // "'^[^:]+:(?:[0-9a-z\.\?&-_=\+\/]+[\.]{1})*(?:[0-9a-z\.\?&-_=\+\/]+\.)[a-z]{2,3}.*$'i" + if(preg_match($pattern, $val)){ + $errors[$this->sBasename] = $this->sWarning; + } + + if ($this->bProduceOutput) { + $results[$this->sOutputVariable] = $val; + } + + return array( + 'errors' => $errors, + 'results' => $results, + ); + } +} + class KTEntityValidator extends KTValidator { var $sNamespace = 'ktcore.validators.entity'; @@ -429,6 +476,52 @@ class KTFileValidator extends KTValidator { } } +class KTFileIllegalCharValidator extends KTValidator { + var $sNamespace = 'ktcore.validators.fileillegalchar'; + var $sWarning; + + function configure($aOptions) { + $res = parent::configure($aOptions); + if (PEAR::isError($res)) { + return $res; + } + + $sChars = "\/*<>|%+':\"?"; + $sWarning = sprintf(_kt('The name of the document selected is invalid. The following characters are not allowed: %s'), $sChars); + $this->sWarning = KTUtil::arrayGet($aOptions, 'file_illegal_character_warning', $sWarning); + + $this->bTrim = KTUtil::arrayGet($aOptions, 'trim', true, false); + } + + function validate($data) { + $results = array(); + $errors = array(); + + $aFile = (array) KTUtil::arrayGet($data, $this->sInputVariable); + + // Get the file name + $val = $aFile['name']; + if ($this->bTrim) { + $val = trim($val); + } + + // illegal characters: \/ *<>|%+':"? + $pattern = "[\*|\%|\\\|\/|\<|\>|\+|\:|\?|\||\'|\"]"; + if(preg_match($pattern, $val)){ + $errors[$this->sBasename] = $this->sWarning; + } + + if ($this->bProduceOutput) { + $results[$this->sOutputVariable] = $aFile; + } + + return array( + 'errors' => $errors, + 'results' => $results, + ); + } +} + class KTArrayValidator extends KTValidator { var $sNamespace = 'ktcore.validators.array'; diff --git a/plugins/ktcore/document/Rename.php b/plugins/ktcore/document/Rename.php index 571382a..7c0ac13 100644 --- a/plugins/ktcore/document/Rename.php +++ b/plugins/ktcore/document/Rename.php @@ -77,7 +77,7 @@ class KTDocumentRenameAction extends KTDocumentAction { $fields = array(); $fields[] = new KTStaticTextWidget(_kt('Current file name'), _kt('The current file name is shown below:'), 'oldfilename', $this->oDocument->getFileName(), $this->oPage, false); - $fields[] = new KTStringWidget(_kt('New file name'), _kt('The name to which the current file should be renamed.'), 'filename', "", $this->oPage, true); + $fields[] = new KTStringWidget(_kt('New file name'), _kt('The name to which the current file should be renamed.'), 'filename', $this->oDocument->getFileName(), $this->oPage, true); $oTemplate->setData(array( 'context' => &$this, @@ -95,6 +95,7 @@ class KTDocumentRenameAction extends KTDocumentAction { 'max_str_len' => 255, ); $this->oValidator->validateString($sFilename, $aOptions); + $this->oValidator->validateIllegalCharacters($sFilename, $aOptions); $res = KTDocumentUtil::rename($this->oDocument, $sFilename, $this->oUser); if (PEAR::isError($res)) { diff --git a/plugins/ktcore/folder/Rename.php b/plugins/ktcore/folder/Rename.php index 5806bb0..61dfc5f 100644 --- a/plugins/ktcore/folder/Rename.php +++ b/plugins/ktcore/folder/Rename.php @@ -55,7 +55,7 @@ class KTFolderRenameAction extends KTFolderAction { $oTemplate =& $this->oValidator->validateTemplate('ktcore/folder/rename'); $fields = array(); - $fields[] = new KTStringWidget(_kt('New folder name'), _kt('The name to which the current folder should be renamed.'), 'foldername', "", $this->oPage, true); + $fields[] = new KTStringWidget(_kt('New folder name'), _kt('The name to which the current folder should be renamed.'), 'foldername', $this->oFolder->getName(), $this->oPage, true); $oTemplate->setData(array( 'context' => &$this, @@ -72,6 +72,7 @@ class KTFolderRenameAction extends KTFolderAction { $sFolderName = KTUtil::arrayGet($_REQUEST, 'foldername'); $aErrorOptions['defaultmessage'] = _kt("No folder name given"); $sFolderName = $this->oValidator->validateString($sFolderName, $aErrorOptions); + $sFolderName = $this->oValidator->validateIllegalCharacters($sFolderName, $aErrorOptions); $sOldFolderName = $this->oFolder->getName(); if ($this->oFolder->getId() != 1) { diff --git a/plugins/ktcore/folder/addDocument.php b/plugins/ktcore/folder/addDocument.php index 5c00889..60f99dc 100644 --- a/plugins/ktcore/folder/addDocument.php +++ b/plugins/ktcore/folder/addDocument.php @@ -132,10 +132,18 @@ class KTFolderAddDocumentAction extends KTFolderAction { 'test' => 'file', 'output' => 'file', )), + array('ktcore.validators.fileillegalchar', array( + 'test' => 'file', + 'output' => 'file', + )), array('ktcore.validators.string', array( 'test' => 'document_name', 'output' => 'document_name', )), + array('ktcore.validators.illegal_char', array( + 'test' => 'document_name', + 'output' => 'document_name', + )), array('ktcore.validators.entity', array( 'test' => 'document_type', 'output' => 'document_type', diff --git a/plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php b/plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php index 05caedb..be57c12 100644 --- a/plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php +++ b/plugins/ktstandard/ldap/ldapbaseauthenticationprovider.inc.php @@ -146,6 +146,7 @@ class KTLDAPBaseAuthenticationProvider extends KTAuthenticationProvider { if (empty($aConfig)) { $aConfig = array('serverport'=>389); } + $aConfig['searchattributes'] = KTUtil::arrayGet($aConfig, 'searchattributes', split(',', 'cn,mail,sAMAccountName')); $aConfig['objectclasses'] = KTUtil::arrayGet($aConfig, 'objectclasses', split(',', 'user,inetOrgPerson,posixAccount')); $fields = array(); @@ -210,6 +211,44 @@ class KTLDAPBaseAuthenticationProvider extends KTAuthenticationProvider { } $oSource->setConfig(serialize($aConfig)); $res = $oSource->update(); + + //force a commit here to keep any data entered into the fields + //when redirected to the do_editSourceProvider function above the $oSource object will + //now contain the information entered by the user. + if ($this->bTransactionStarted) { + $this->commitTransaction(); + } + + $aErrorOptions = array( + 'redirect_to' => array('editSourceProvider', sprintf('source_id=%d', $oSource->getId())), + ); + $aErrorOptions['message'] = _kt("No server name provided"); + $sName = KTUtil::arrayGet($_REQUEST, 'servername'); + $sName = $this->oValidator->validateString($sName, $aErrorOptions); + + $aErrorOptions['message'] = _kt("No Base DN provided"); + $sName = KTUtil::arrayGet($_REQUEST, 'basedn'); + $sName = $this->oValidator->validateString($sName, $aErrorOptions); + + $aErrorOptions['message'] = _kt("No Search User provided"); + $sName = KTUtil::arrayGet($_REQUEST, 'searchuser'); + $sName = $this->oValidator->validateString($sName, $aErrorOptions); + + $aErrorOptions['message'] = _kt("No Search Password provided"); + $sName = KTUtil::arrayGet($_REQUEST, 'searchpassword'); + $sName = $this->oValidator->validateString($sName, $aErrorOptions); + + $aErrorOptions['message'] = _kt("No Search Attributes provided"); + $sName = KTUtil::arrayGet($_REQUEST, 'searchattributes_nls'); + $sName = $this->oValidator->validateString($sName, $aErrorOptions); + + $aErrorOptions['message'] = _kt("No Object Classes provided"); + $sName = KTUtil::arrayGet($_REQUEST, 'objectclasses_nls'); + $sName = $this->oValidator->validateString($sName, $aErrorOptions); + + + + $this->successRedirectTo('viewsource', _kt("Configuration updated"), 'source_id=' . $oSource->getId()); } // }}} diff --git a/skins/kts_blue/kt-ie-morph.css b/skins/kts_blue/kt-ie-morph.css index 140bb49..79a751b 100644 --- a/skins/kts_blue/kt-ie-morph.css +++ b/skins/kts_blue/kt-ie-morph.css @@ -43,36 +43,109 @@ } /* Portlets */ +#portletbar .portlet { + background: url(portlet_bg_collapsed.gif) top left repeat-x; + margin: 0 0 0 0; +} + +#portletbar .portlet.expanded { + background: url(portlet_bg.gif) top left repeat-x; + border: 1px solid #ccc; + margin: 0 0 0 0; +} + +#portletbar .portlet .portletTopRight { + display: none; +} + +#portletbar .portlet.expanded .portletTopRight { + display: none; +} + +#portletbar .portlet .portletbodyBottomLeft { + display: none; +} + +#portletbar .portlet.expanded .portletbodyBottomLeft { + display: none; +} + +#portletbar .portlet .portletbodyBottomRight { + display: none; +} + +#portletbar .portlet.expanded .portletbodyBottomRight { + display: none; +} + +#portletbar .portlet .portletTopRepeat { + display: none; +} +#portletbar .portlet.expanded .portletTopRepeat { + display: none; +} + +#portletbar .portlet.expanded .portletbody { + background: none; + border: none; + background-color: white; +} +/* #portletbar .portlet.expanded h4 { background: url(minus.gif) 10px 45% no-repeat; } #portletbar .portlet.expanded .portletTopRepeat { - background: url(portlet_bg.gif) top left repeat-x; + display: none; } -#portletbar .portlet.expanded { - background: url(portlet_corner_topleft.gif) top left no-repeat; +#portletbar .portlet .expanded { + background: url(portlet_bg.gif) top left repeat-x; + border: 1px solid #ccc; + margin: 0 0 0 0; } #portletbar .portlet.expanded .portletTopRight { - background: url(portlet_corner_topright.gif) top right no-repeat; + display: none; } -#portletbar .portlet.portletTopRepeat { - background: url(portlet_bg_collapsed.gif) top left repeat-x; +#portletbar .portlet .portletbodyBottomLeft { + display: none; } -#portletbar.portlet { - background: url(portlet_corner_topleft_collapsed.gif) top left no-repeat; +#portletbar .portlet.expanded .portletbodyBottomLeft { + display: none; } -#portletbar .portlet.portletTopRight { - background: url(portlet_corner_topright_collapsed.gif) top right no-repeat; +#portletbar .portlet .portletbodyBottomRight { + display: none; } +#portletbar .portlet.expanded .portletbodyBottomRight { + display: none; +} + +#portletbar .portlet .portletTopRepeat { + display: none; +} + +#portletbar .portlet { + background: url(portlet_bg_collapsed.gif) top left repeat-x; + margin: 0 0 0 0; +} + +#portletbar .portlet .portletTopRight { + display: none; +} + +#portletbar .portlet.expanded .portletbody { + background: none; + border: none; + background-color: white; +}*/ + .collapsible.expanded h4 { background: url(minus.gif) 10px 50% no-repeat; diff --git a/sql/mysql/upgrade/3.5.0/relation_friendly.sql b/sql/mysql/upgrade/3.5.0/relation_friendly.sql index e682449..92b77b7 100644 --- a/sql/mysql/upgrade/3.5.0/relation_friendly.sql +++ b/sql/mysql/upgrade/3.5.0/relation_friendly.sql @@ -19,3 +19,5 @@ alter table folder_transactions change user_id user_id int null; alter table folders change parent_id parent_id int null; update documents set owner_id=null where owner_id=0; update folders set parent_id=null where parent_id=0; +alter table discussion_threads change first_comment_id first_comment_id int null; +alter table discussion_threads change last_comment_id last_comment_id int null; diff --git a/templates/ktcore/search2/manage_saved_search.smarty b/templates/ktcore/search2/manage_saved_search.smarty index 5fcdc8f..a4934bb 100644 --- a/templates/ktcore/search2/manage_saved_search.smarty +++ b/templates/ktcore/search2/manage_saved_search.smarty @@ -13,7 +13,7 @@ newsletters, etc.) based on a category or fieldset value.{/i18n}

-{i18n arg_options=$options}Create a new saved search using #options.{/i18n} +{i18n arg_options=$options}Create a new saved search using #options#.{/i18n}