diff --git a/lib/browse/Criteria.inc b/lib/browse/Criteria.inc index b0d3c73..2c64c4e 100644 --- a/lib/browse/Criteria.inc +++ b/lib/browse/Criteria.inc @@ -621,12 +621,69 @@ class GenericMetadataCriterion extends BrowseCriterion { } // If there's no lookup, just use the standard text input - if ($this->oField->getHasLookup() == false) { + if ($this->oField->getHasLookup() == false && $this->oField->getHasInetLookup() == false) { $this->bContains = true; // contains return parent::searchWidget($aRequest, $aPreValue); } + + if($this->oField->getHasInetLookup() == true) + { + + //$this->bContains = true; + $this->bString = false; + $sRet = $this->getNotWidget($aPreValue); + + $innerJoin = $aPreValue[$this->getWidgetBase()."_join"]; + + $andSelected = ""; + $orSelected = ""; + if($innerJoin == "AND") + { + $andSelected = "selected=\"selected\""; + } + elseif($innerJoin == "OR") + { + $orSelected = "selected=\"selected\""; + } + + $sRet .= "\n"; + + if($this->oField->getInetLookupType() == "multiwithlist") + { + $sRet .= "\n"; + } + elseif($this->oField->getInetLookupType() == "multiwithcheckboxes") + { + $sRet .= "
"; + $aSearch = array('document_field_id = ?', $this->getID()); + $aMetaData = MetaData::getByDocumentField(DocumentField::get($this->getID()));/*ok*/ + + foreach ($aMetaData as $oMetaData) { + $sSelStr = ''; + if (in_array($oMetaData->getName(), $preval)) { $sSelStr = ' checked="true"'; } + $sRet .= "getWidgetBase() . "\" class=\"multiple\" value=\"" . $oMetaData->getName() . "\"" . $sSelStr . " /> ". $oMetaData->getName()."
"; + } + $sRet .= "
"; + } + return $sRet; + } + $this->bContains = false; // is $sRet = $this->getNotWidget($aPreValue); + $sRet .= "';\n + inner += '';\n + inner += '';\n + inner += '';\n + div.innerHTML = inner;\n + document.getElementById('lookup_'+id).focus();\n + }\n\n + + function closeLookupEdit(id) + {\n + value = document.getElementById('original_'+id).value;\n + document.getElementById(id).innerHTML = value;\n + }\n\n"; + + $this->oPage->requireJSStandalone($sJavaScript); + + $lookups =& MetaData::getByDocumentField($this->oField); + $args = $this->meldPersistQuery("","metadataMultiAction", true); + + $oTemplate =& $this->oValidator->validateTemplate("ktcore/metadata/admin/manage_lookups"); + $oTemplate->setData(array( + 'context' => $this, + 'field_name' => $this->oField->getName(), + 'lookups' => $lookups, + 'args' => $args, + )); + return $oTemplate->render(); + } + + // {{{ do_metadataMultiAction + /** + * call metadata multiaction methods + * @param. + * @return. + * + * iNET Process + */ + function do_metadataMultiAction() { + $subaction = array_keys(KTUtil::arrayGet($_REQUEST, 'submit', array())); + $this->oValidator->notEmpty($subaction, array("message" => _kt("No action specified"))); + $subaction = $subaction[0]; + $method = null; + if (method_exists($this, 'lookup_' . $subaction)) { + $method = 'lookup_' . $subaction; + } + $this->oValidator->notEmpty($method, array("message" => _kt("Unknown action specified"))); + return $this->$method(); + } + // }}} + + // {{{ lookup_remove + /** + * remove lookup value. + * @param + * @return + * + * iNET Process + */ + function lookup_remove() { + $oFieldset =& $this->oValidator->validateFieldset($_REQUEST['fFieldsetId']); + $oField =& DocumentField::get($_REQUEST['fFieldId']); + $aMetadata = KTUtil::arrayGet($_REQUEST, 'metadata'); + if (empty($aMetadata)) { + $this->errorRedirectTo('managelookups', _kt('No lookups selected')); + } + foreach ($_REQUEST['metadata'] as $iMetaDataId) { + $oMetaData =& MetaData::get($iMetaDataId); + if (PEAR::isError($oMetaData)) { + $this->errorRedirectTo('managelookups', _kt('Invalid lookup selected')); + } + $oMetaData->delete(); + } + $this->successRedirectTo('managelookups', _kt('Lookups removed')); + exit(0); + } + // }}} + + // {{{ lookup_disable + /** + * disable lookup value. + * @param + * @return + * + * iNET Process + */ + function lookup_disable() { + $oFieldset =& $this->oValidator->validateFieldset($_REQUEST['fFieldsetId']); + $oField =& DocumentField::get($_REQUEST['fFieldId']); + $aMetadata = KTUtil::arrayGet($_REQUEST, 'metadata'); + if (empty($aMetadata)) { + $this->errorRedirectTo('managelookups', _kt('No lookups selected')); + } + foreach ($_REQUEST['metadata'] as $iMetaDataId) { + $oMetaData =& MetaData::get($iMetaDataId); + if (PEAR::isError($oMetaData)) { + $this->errorRedirectTo('managelookups', _kt('Invalid lookup selected')); + } + $oMetaData->setDisabled(true); + $oMetaData->update(); + } + $this->successRedirectTo('managelookups', _kt('Lookups disabled')); + exit(0); + } + // }}} + + /** + * Save the edited lookup values + * + * @param. + * @return. + * + *iNET Process + */ + function lookup_edit(){ + $aLookupValues = $_REQUEST['lookup']; + + if(empty($aLookupValues)){ + $this->errorRedirectTo('managelookups', _kt('No lookups were selected for editing')); + exit; + } + + foreach ($aLookupValues as $iMetaDataId => $sValue){ + $oMetaData = MetaData::get($iMetaDataId); + if (PEAR::isError($oMetaData)) { + $this->addErrorMessage(_kt('Invalid lookup selected').': '.$sValue); + continue; + + } + if(empty($sValue)){ + $this->addErrorMessage(_kt('Lookup cannot be empty').': '.$oMetaData->getName()); + if(count($aLookupValues) == 1){ + $this->redirectTo('managelookups'); + } + continue; + } + $oMetaData->setName($sValue); + $oMetaData->update(); + } + + $this->successRedirectTo('managelookups', _kt('Lookup values saved')); + exit(0); + } + + // {{{ lookup_enable + /** + * enable lookup value + * @param + * @return + * + * iNET Process + */ + function lookup_toggleenabled() { + $oFieldset =& $this->oValidator->validateFieldset($_REQUEST['fFieldsetId']); + $oField =& DocumentField::get($_REQUEST['fFieldId']); + $aMetadata = KTUtil::arrayGet($_REQUEST, 'metadata'); + if (empty($aMetadata)) { + $this->errorRedirectTo('managelookups', _kt('No lookups selected')); + } + foreach ($_REQUEST['metadata'] as $iMetaDataId) { + $oMetaData =& MetaData::get($iMetaDataId); + if (PEAR::isError($oMetadata)) { + $this->errorRedirectTo('managelookups', _kt('Invalid lookup selected')); + } + $oMetaData->setDisabled(!$oMetaData->getDisabled()); + $oMetaData->update(); + } + $this->successRedirectTo('managelookups', _kt('Status Toggled')); + exit(0); + } + // }}} + + // {{{ lookup_togglestickiness + /** + * toggle stickiness of lookup values + * @param + * @return + * + * iNET Process + */ + function lookup_togglestickiness() { + $oFieldset =& $this->oValidator->validateFieldset($_REQUEST['fFieldsetId']); + $oField =& DocumentField::get($_REQUEST['fFieldId']); + $aMetadata = KTUtil::arrayGet($_REQUEST, 'metadata'); + if (empty($aMetadata)) { + $this->errorRedirectTo('managelookups', _kt('No lookups selected')); + } + foreach ($_REQUEST['metadata'] as $iMetaDataId) { + $oMetaData =& MetaData::get($iMetaDataId); + if (PEAR::isError($oMetaData)) { + $this->errorRedirectTo('managelookups', _kt('Invalid lookups selected')); + } + $bStuck = (boolean)$oMetaData->getIsStuck(); + $oMetaData->setIsStuck(!$bStuck); + $oMetaData->update(); + } + $this->successRedirectTo('managelookups', _kt('Lookup stickiness toggled')); + exit(0); + } + // }}} + +// {{{ TREE + // create and display the tree editing form. + /** + * create and display the tree editing form. + * @param. + * @return template + * + * iNET Process + */ + function do_managetree() { + global $default; + // extract. + $iFieldsetId = KTUtil::getId($this->oFieldset); + $iFieldId = KTUtil::getId($this->oField); + + $oFieldset =& $this->oFieldset; + $oField =& $this->oField; + + $this->oPage->setBreadcrumbDetails(_kt('edit lookup tree')); + + $field_id = $iFieldId; + $current_node = KTUtil::arrayGet($_REQUEST, 'current_node', 0); + $subaction = KTUtil::arrayGet($_REQUEST, 'subaction'); + + // validate + if (empty($field_id)) { return $this->errorRedirectToMain(_kt("Must select a field to edit.")); } + $oField =& DocumentField::get($field_id); + if (PEAR::isError($oField)) { return $this->errorRedirectToMain(_kt("Invalid field.")); } + + $aErrorOptions = array( + 'redirect_to' => array('editTree', sprintf('field_id=%d', $field_id)), + ); + + // under here we do the subaction rendering. + // we do this so we don't have to do _very_ strange things with multiple actions. + + $fieldTree =& new MDTree(); + $fieldTree->buildForField($oField->getId()); + + if ($subaction !== null) { + $target = 'managetree'; + $msg = _kt('Changes saved.'); + if ($subaction === "addCategory") { + $new_category = KTUtil::arrayGet($_REQUEST, 'category_name'); + if (empty($new_category)) { + return $this->errorRedirectTo("managetree", _kt("Must enter a name for the new category."), array("field_id" => $field_id, "fFieldsetId" => $iFieldsetId)); + } else { + $this->subact_addCategory($field_id, $current_node, $new_category, $fieldTree); + } + $msg = _kt('Category added'). ': ' . $new_category; + } + if ($subaction === "deleteCategory") { + $this->subact_deleteCategory($fieldTree, $current_node); + $current_node = 0; // clear out, and don't try and render the newly deleted category. + $msg = _kt('Category removed.'); + } + if ($subaction === "linkKeywords") { + $keywords = KTUtil::arrayGet($_REQUEST, 'keywordsToAdd'); + $aErrorOptions['message'] = _kt("No keywords selected"); + $this->oValidator->notEmpty($keywords, $aErrorOptions); + $this->subact_linkKeywords($fieldTree, $current_node, $keywords); + $current_node = 0; // clear out, and don't try and render the newly deleted category. + $msg = _kt('Keywords added to category.'); + } + if ($subaction === "unlinkKeyword") { + $keyword = KTUtil::arrayGet($_REQUEST, 'keyword_id'); + $this->subact_unlinkKeyword($fieldTree, $keyword); + $msg = _kt('Keyword moved to base of tree.'); + } + // now redirect + $query = sprintf('field_id=%d&fFieldsetId=%d', $field_id, $iFieldsetId); + return $this->successRedirectTo($target, $msg, $query); + } + if ($fieldTree->root === null) { + return $this->errorRedirectToMain(_kt("Error building tree. Is this a valid tree-lookup field?")); + } + + // FIXME extract this from MDTree (helper method?) + $free_metadata = MetaData::getList('document_field_id = '.$oField->getId().' AND (treeorg_parent = 0 OR treeorg_parent IS NULL) AND (disabled = 0)'); + + // render edit template. + + $oTemplate = $this->oValidator->validateTemplate("ktcore/metadata/admin/edit_lookuptree"); + $renderedTree = $this->_evilTreeRenderer($fieldTree); + + $this->oPage->setTitle(_kt('Edit Lookup Tree')); + + if ($current_node == 0) { $category_name = 'Root'; } + else { + $oNode = MDTreeNode::get($current_node); + $category_name = $oNode->getName(); + } + + $aTemplateData = array( + "context" => $this, + "args" => $this->meldPersistQuery("","managetree", true), + "field" => $oField, + "oFieldset" => $oFieldset, + "tree" => $fieldTree, + "renderedTree" => $renderedTree, + "currentNode" => $current_node, + 'category_name' => $category_name, + "freechildren" => $free_metadata, + + ); + return $oTemplate->render($aTemplateData); + } + /** + * Adds a category + * @return + * @param $field_id Object + * @param $current_node Object + * @param $new_category Object + * @param $constructedTree Object + * + * iNET Process + */ + function subact_addCategory($field_id, $current_node, $new_category, &$constructedTree) { + $newCategory = MDTreeNode::createFromArray(array ( + "iFieldId" => $field_id, + "sName" => $new_category, + "iParentNode" => $current_node, + )); + if (PEAR::isError($newCategory)) + { + return false; + } + $constructedTree->addNode($newCategory); + return true; + } + /** + * Deletes a catagory + * @return + * @param $constructedTree Object + * @param $current_node Object + */ + function subact_deleteCategory(&$constructedTree, $current_node) { + $constructedTree->deleteNode($current_node); + return true; + } + + /** + * + * @param $constructedTree object + * @param $keywords + * @return true. + * + * iNET Process + */ + function subact_unlinkKeyword(&$constructedTree, $keyword) { + $oKW = MetaData::get($keyword); + if (PEAR::isError($oKW)) { + return true; + } + $constructedTree->reparentKeyword($oKW->getId(), 0); + return true; + } + + /** + * + * @param $constructedTree object + * @param $current_node node id + * @param $keywords array + * @return true. + * + * iNET Process + */ + function subact_linkKeywords(&$constructedTree, $current_node, $keywords) { + foreach ($keywords as $md_id) + { + $constructedTree->reparentKeyword($md_id, $current_node); + } + return true; + } + + /* ----------------------- EVIL HACK -------------------------- + * + * This whole thing needs to replaced, as soon as I work out how + * to non-sucking Smarty recursion. + */ + + /** + * render to subnode of tree + * + * @param $subnode node + * @param $treeToRender object + * @Return string + * + * iNET Process + */ + function _evilTreeRecursion($subnode, $treeToRender) + { + // deliver us from evil.... + $iFieldId = $treeToRender->field_id; + $oField = DocumentField::get($iFieldId); + $iFieldsetId = $oField->getParentFieldsetId(); + + $treeStr = "'; + return $treeStr; + + } + + // I can't seem to do recursion in smarty, and recursive templates seems a bad solution. + // Come up with a better way to do this (? NBM) + + /** + * render tree + * + * @param $treeToRender object + * @return tree string + * + * iNET Process + */ + function _evilTreeRenderer($treeToRender) { + //global $default; + + $treeStr = ""; + $stack = array(); + $exitstack = array(); + + // since the root is virtual, we need to fake it here. + // the inner section is generised. + $treeStr .= ''; + + return $treeStr; + } + + // BS: don't hate me. + // BD: sorry. I hate you. + /** + * KT function + * + * @param $iFieldsetId ID + * @param $iFieldId ID + * @param $bIsKeyword boolean + * @param $current_node node ID + * @return string. + * + * iNET Process + */ + function _evilActionHelper($iFieldsetId, $iFieldId, $bIsKeyword, $current_node) { + $actionStr = " ("; + if ($bIsKeyword === true) { + $actionStr .= '' . _kt('unlink') . ''; + } else { + $actionStr .= '' . _kt('attach keywords') . ' '; + $actionStr .= '| ' . _kt('delete') . ''; + } + $actionStr .= ")"; + return $actionStr; + } + /** + * Deletes a field + * @return + * + * iNET Process + */ + function do_deletefield() { + $res = $this->oField->delete(); + if (PEAR::isError($res)) { + $this->errorRedirectToParent(sprintf(_kt("Unable to delete field: %s"), $res->getMessage())); + } + + $this->successRedirectToParent(_kt("Field deleted.")); + } + + /** + * Move field up in the order + * + * iNET Process + */ + function do_orderUp() { + $iId = $this->oField->getID(); + $iFieldsetId = $this->oField->getParentFieldsetId(); + + $res = $this->oField->movePosition($iFieldsetId, $iId, 'up'); + if ($res === false) { + $this->errorRedirectToParent(_kt("Unable to move field up")); + } + + $this->successRedirectToParent(_kt("Field moved up.")); + } + + /** + * Move field down in the order + * + * iNET Process + */ + function do_orderDown() { + $iId = $this->oField->getID(); + $iFieldsetId = $this->oField->getParentFieldsetId(); + + $res = $this->oField->movePosition($iFieldsetId, $iId, 'down'); + if ($res === false) { + $this->errorRedirectToParent(_kt("Unable to move field down")); + } + + $this->successRedirectToParent(_kt("Field moved down.")); + } +} + +?> diff --git a/plugins/multiselect/js/hideadminlink.js b/plugins/multiselect/js/hideadminlink.js new file mode 100644 index 0000000..dcc25fc --- /dev/null +++ b/plugins/multiselect/js/hideadminlink.js @@ -0,0 +1,18 @@ +//To hide the link for existing document fieldset +JQ(document).ready(function(){ + var elems = JQ("dl.panel_menu").find("a"); + for (i = 0; i < elems.length; i++) { + if(elems[i].href.search("kt_path_info=documents/fieldmanagement2") > -1) + { + JQ(elems[i]).parent("dt").hide(); + } + } + + var elemsDesc = JQ("dl.panel_menu").find("dd"); + for (i = 0; i < elemsDesc.length; i++) { + if(elemsDesc[i].innerHTML.search("Manage the different types of information that can be associated with classes of documents.") > -1) + { + JQ(elemsDesc[i]).hide(); + } + } +}); diff --git a/plugins/multiselect/js/hidelink.js b/plugins/multiselect/js/hidelink.js new file mode 100644 index 0000000..74cc10c --- /dev/null +++ b/plugins/multiselect/js/hidelink.js @@ -0,0 +1,20 @@ +//To hide the link for existing bulk upload link +JQ(document).ready(function(){ + var elems = JQ("ul.actionlist").find("a"); + for (i = 0; i < elems.length; i++) { + if(elems[i].href.search("kt_path_info=ktcore.actions.folder.bulkUpload") > -1 || elems[i].href.search("kt_path_info=inetfoldermetadata.actions.folder.bulkUpload") > -1) + { + JQ(elems[i]).parent("li").hide(); + } + } +}); +// added by SL:2009-03-04 +JQ(document).ready(function(){ + var elems = JQ("ul.actionlist").find("a"); + for (i = 0; i < elems.length; i++) { + if(elems[i].href.search("kt_path_info=ktcore.actions.folder.bulkImport") > -1 || elems[i].href.search("kt_path_info=inetfoldermetadata.actions.folder.bulkUpload") > -1) + { + JQ(elems[i]).parent("li").hide(); + } + } +}); \ No newline at end of file diff --git a/plugins/multiselect/js/jquery-1.2.6.js b/plugins/multiselect/js/jquery-1.2.6.js new file mode 100644 index 0000000..4a9ad53 --- /dev/null +++ b/plugins/multiselect/js/jquery-1.2.6.js @@ -0,0 +1,3551 @@ +(function(){ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ + +// Map over jQuery in case of overwrite +var _jQuery = window.jQuery, +// Map over the $ in case of overwrite + _$ = window.$; + +var jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); +}; + +// A simple way to check for HTML strings or ID strings +// (both of which we optimize for) +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, + +// Is it a simple selector + isSimple = /^.[^:#\[\.]*$/, + +// Will speed up references to undefined, and allows munging its name. + undefined; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + return this; + } + // Handle HTML strings + if ( typeof selector == "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Make sure an element was located + if ( elem ){ + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + return jQuery( elem ); + } + selector = []; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); + + return this.setArray(jQuery.makeArray(selector)); + }, + + // The current version of jQuery being used + jquery: "1.2.6", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // The number of elements contained in the matched element set + length: 0, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + var ret = -1; + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( name.constructor == String ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text != "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) + // The elements to wrap the target around + jQuery( html, this[0].ownerDocument ) + .clone() + .insertBefore( this[0] ) + .map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }) + .append(this); + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, false, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, true, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + find: function( selector ) { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? + jQuery.unique( elems ) : + elems ); + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] != undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, this ) ); + }, + + not: function( selector ) { + if ( selector.constructor == String ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ) ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector == 'string' ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return this.is( "." + selector ); + }, + + val: function( value ) { + if ( value == undefined ) { + + if ( this.length ) { + var elem = this[0]; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + + // Everything else, we just grab the value + } else + return (this[0].value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if( value.constructor == Number ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( value.constructor == Array && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value == undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + data: function( key, value ){ + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ + jQuery.data( this, key, value ); + }); + }, + + removeData: function( key ){ + return this.each(function(){ + jQuery.removeData( this, key ); + }); + }, + + domManip: function( args, table, reverse, callback ) { + var clone = this.length > 1, elems; + + return this.each(function(){ + if ( !elems ) { + elems = jQuery.clean( args, this.ownerDocument ); + + if ( reverse ) + elems.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); + + var scripts = jQuery( [] ); + + jQuery.each(elems, function(){ + var elem = clone ? + jQuery( this ).clone( true )[0] : + this; + + // execute all scripts after the elements have been injected + if ( jQuery.nodeName( elem, "script" ) ) + scripts = scripts.add( elem ); + else { + // Remove any inner scripts for later evaluation + if ( elem.nodeType == 1 ) + scripts = scripts.add( jQuery( "script", elem ).remove() ); + + // Inject the elements into the document + callback.call( obj, elem ); + } + }); + + scripts.each( evalScript ); + }); + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( target.constructor == Boolean ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target != "object" && typeof target != "function" ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy == "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +var expando = "jQuery" + now(), uuid = 0, windowData = {}, + // exclude the following css properties to add px + exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning this function. + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.browser.msie ) + script.text = data; + else + script.appendChild( document.createTextNode( data ) ); + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? + jQuery.cache[ id ][ name ] : + id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + + for ( name in jQuery.cache[ id ] ) + break; + + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length == undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length == undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames != undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // A helper method for determining if an element's values are broken + function color( elem ) { + if ( !jQuery.browser.safari ) + return false; + + // defaultView is cached + var ret = defaultView.getComputedStyle( elem, null ); + return !ret || ret.getPropertyValue("color") == ""; + } + + // We need to handle opacity special in IE + if ( name == "opacity" && jQuery.browser.msie ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + // Opera sometimes will give the wrong display answer, this fixes it, see #2037 + if ( jQuery.browser.opera && name == "display" ) { + var save = style.outline; + style.outline = "0 solid black"; + style.outline = save; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle && !color( elem ) ) + ret = computedStyle.getPropertyValue( name ); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + var swap = [], stack = [], a = elem, i = 0; + + // Locate all of the parent display: none elements + for ( ; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( ; i < stack.length; i++ ) + if ( color( stack[ i ] ) ) { + swap[ i ] = stack[ i ].style.display; + stack[ i ].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = name == "display" && swap[ stack.length - 1 ] != null ? + "none" : + ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; + + // Finally, revert the display styles back + for ( i = 0; i < swap.length; i++ ) + if ( swap[ i ] != null ) + stack[ i ].style.display = swap[ i ]; + } + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context ) { + var ret = []; + context = context || document; + // !context.createElement fails in IE with an error but returns typeof 'object' + if (typeof context.createElement == 'undefined') + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + jQuery.each(elems, function(i, elem){ + if ( !elem ) + return; + + if ( elem.constructor == Number ) + elem += ''; + + // Convert html string into DOM nodes + if ( typeof elem == "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div"); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
" ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and +{/literal} + +
+ {i18n}Advanced Search{/i18n} + +{capture assign=options} +{i18n}Search Criteria Editor{/i18n} +{/capture} + +{i18n arg_options=$options}The #options# may also be used to create more complex search criteria expressions.{/i18n} +

+{capture assign=options} + +{/capture} + + +{i18n arg_options=$options}Return items which match #options# of the criteria groups specified.{/i18n} + +
+
+
+ {i18n}Criteria Group{/i18n} + + {capture assign=options} + + {/capture} + + {i18n arg_options=$options}Return items which match #options# of the criteria specified below.{/i18n} +
+ +
+
+ + + + + + +
+
+
{i18n}No criteria have been selected for the criteria group.{/i18n} +

+ +

+
+ +
+
+ + + + + + +
+ +
+
+ + + +
+ +
+ + +
+ {i18n}Click on a field above to add it to the criteria group.{/i18n} +
+
+
+
+
+
+
+
+ + +
+ + +
+ diff --git a/plugins/multiselect/templates/manage_field.smarty b/plugins/multiselect/templates/manage_field.smarty new file mode 100644 index 0000000..04f5c97 --- /dev/null +++ b/plugins/multiselect/templates/manage_field.smarty @@ -0,0 +1,55 @@ +{capture assign=sCSS} +{literal} +.twocolumn { + width: 60%; + margin-right: 1em; + float: left; + min-width: 28em; +} + +.second { + width: 30%; + margin-right: 0; +} + +{/literal} +{/capture} +{$context->oPage->requireCSSStandalone($sCSS)} + +

{i18n arg_field_name=$field_name}Manage Field: #field_name#{/i18n}

+ +

{i18n}This page will allow you to manage the different +aspects of this particular field.{/i18n}

+ +{if ($field->getHasLookup() or $field->getHasInetLookup())} +
+{/if} + {$form->render()} +{if ($field->getHasLookup() or $field->getHasInetLookup())} +
+
+
+ {i18n}Extra Options{/i18n} + +

{i18n}Different fields have different actions and options available.{/i18n}

+ +

+ {i18n}Add Lookup Values{/i18n} + {i18n}Add Lookup Values{/i18n} +

+ + +

+ {i18n}Manage Lookup Values{/i18n} + {i18n}Manage Lookup Values{/i18n} +

+ {if $field->getHasLookupTree()} +

+ {i18n}Manage Lookup Tree Structure{/i18n} + {i18n}Manage Lookup Tree Structure{/i18n} +

+ {/if} +
+
+{/if} +
diff --git a/plugins/multiselect/templates/multiselect/selection.smarty b/plugins/multiselect/templates/multiselect/selection.smarty new file mode 100644 index 0000000..ecf2b68 --- /dev/null +++ b/plugins/multiselect/templates/multiselect/selection.smarty @@ -0,0 +1,30 @@ +
+ +

{$description}

+ {if empty($vocab)} +
{$context->sEmptyMessage}
+ {else} + +{/if} +
\ No newline at end of file diff --git a/plugins/multiselect/templates/multiselect/simple_selection.smarty b/plugins/multiselect/templates/multiselect/simple_selection.smarty new file mode 100644 index 0000000..06d8caa --- /dev/null +++ b/plugins/multiselect/templates/multiselect/simple_selection.smarty @@ -0,0 +1,23 @@ +
+ +

{$description}

+ {if empty($vocab)} +
{$context->sEmptyMessage}
+ {else} + + {* radio or checkboxes *} + {if $options.multi} + {foreach item=lookup key=lookup_key from=$vocab} + selected($lookup_key)}checked="true"{/if}>{$lookup}
+ {/foreach} + {else} + {if $options.initial_string} + selected('')}checked="true"{/if}>{$options.initial_string}
+ {/if} + {foreach item=lookup key=lookup_key from=$vocab} + selected($lookup_key)}checked="true"{/if}>{$lookup}
+ {/foreach} + {/if} + + {/if} +
\ No newline at end of file diff --git a/resources/js/constructed_search.js b/resources/js/constructed_search.js index 9e3c443..3c8b76d 100644 --- a/resources/js/constructed_search.js +++ b/resources/js/constructed_search.js @@ -120,10 +120,18 @@ function do_addNewCriteria(destination_cell, crit_id, table_id, req) { for (var i=0; i0) $fieldset_str .= ','; - $fid = $field['id']; - $name= searchfix($field['name']); - $desc = searchfix($field['description']); - $datatype=$field['datatype']; - $control=$field['control']; - $fieldset_str .= "\n\t\t{id:\"$fid\", name:\"$name\", description:\"$desc\", datatype:\"$datatype\", control:\"$control\", options: ["; + $fid = $field['id']; + $name= searchfix($field['name']); + $desc = searchfix($field['description']); + $datatype=$field['datatype']; + $control=$field['control']; + + if(KTPluginUtil::pluginIsActive('inet.multiselect.lookupvalue.plugin') && isset($field['inetlookup_type']) && $field['inetlookup_type'] != "") { + $inetlookup_type=$field['inetlookup_type']; + $fieldset_str .= "\n\t\t{id:\"$fid\", name:\"$name\", description:\"$desc\", datatype:\"$datatype\", control:\"$control\", inetlookup_type:\"$inetlookup_type\" , options: ["; + } else { + $fieldset_str .= "\n\t\t{id:\"$fid\", name:\"$name\", description:\"$desc\", datatype:\"$datatype\", control:\"$control\", options: ["; + } + $options = $field['options']; $oo = 0; if (!is_array($options)) @@ -453,20 +460,40 @@ class SearchHelper if ($fieldsetID < 0) { $documentTypeID = sanitizeForSQL(-$fieldsetID); - $sql = "SELECT - df.id, df.name, df.data_type, df.has_lookup, df.has_lookuptree, df.description + + if(KTPluginUtil::pluginIsActive('inet.multiselect.lookupvalue.plugin')) { + $sql = "SELECT + df.id, df.name, df.data_type, df.has_lookup,df.has_inetlookup, df.inetlookup_type , df.has_lookuptree, df.description FROM document_type_fields_link dtfl - INNER JOIN document_fields df on dtfl.field_id=df.id + INNER JOIN document_fields df on dtfl.field_id=df.id WHERE dtfl.document_type_id=$documentTypeID ORDER BY df.name"; - } + } else { + + $sql = "SELECT + df.id, df.name, df.data_type, df.has_lookup, df.has_lookuptree, df.description + FROM + document_type_fields_link dtfl + INNER JOIN document_fields df on dtfl.field_id=df.id + WHERE + dtfl.document_type_id=$documentTypeID + ORDER BY + df.name"; + } + } else { $fieldsetID = sanitizeForSQL($fieldsetID); - $sql = "SELECT id, name, data_type, has_lookup, has_lookuptree, description FROM document_fields WHERE parent_fieldset=$fieldsetID ORDER BY name"; + if(KTPluginUtil::pluginIsActive('inet.multiselect.lookupvalue.plugin')) + { + $sql = "SELECT id, name, data_type, has_lookup,has_inetlookup, inetlookup_type, has_lookuptree, description FROM document_fields WHERE parent_fieldset=$fieldsetID ORDER BY name"; + } else { + $sql = "SELECT id, name, data_type, has_lookup, has_lookuptree, description FROM document_fields WHERE parent_fieldset=$fieldsetID ORDER BY name"; + } + } $rs = DBUtil::getResultArray($sql); @@ -487,14 +514,23 @@ class SearchHelper $options = array(); $haslookup =$item['has_lookup'] + 0 > 0; $hastree = ($item['has_lookuptree']+0 > 1); - - if ($haslookup || $hastree) + $hasinetlookup=$item['has_inetlookup'] + 0 > 0; + + if ($haslookup || $hastree || $hasinetlookup) { $type = 'lookup'; $sql = "select id, name from metadata_lookup where document_field_id=$fieldid"; $options = DBUtil::getResultArray($sql); } + + $inetlookup_type = ""; + if($hasinetlookup) + { + $type = 'inetlookup'; + $inetlookup_type = $item['inetlookup_type']; + } + /*if ($hastree) { $type = 'lookup'; @@ -515,6 +551,7 @@ class SearchHelper 'description'=>$item['description'], 'datatype'=>$item['data_type'], 'control'=>$type, + 'inetlookup_type' => $inetlookup_type, 'options'=>$options ); @@ -775,7 +812,7 @@ function resolveSearchShortcuts($result) { $id = $row['id']; $linked_id = $row['linked_folder_id']; - + $shortFolder = new FolderShortcutResultItem($id, $result['folders'][$linked_id]); $shortFolder->parentId = $row['parent_id']; $shortFolder->linkedId = $row['linked_folder_id']; diff --git a/setup/wizard/lib/services/windowsOpenOffice.php b/setup/wizard/lib/services/windowsOpenOffice.php index b506978..f06afb8 100644 --- a/setup/wizard/lib/services/windowsOpenOffice.php +++ b/setup/wizard/lib/services/windowsOpenOffice.php @@ -42,10 +42,121 @@ class windowsOpenOffice extends windowsService { + // utility + public $util; + // path to office + private $path; + // host + private $host; + // pid running + private $pidFile; + // port to bind to + private $port; + // bin folder + private $bin; + // office executable + private $soffice; + // office log file + private $log; + private $options; + private $winservice; public function __construct() { - $this->name = "KTOpenOfficeTest"; + $this->name = "openoffice"; + $this->util = new InstallUtil(); } + + public function load() { + // hack for testing + $this->setPort("8100"); + $this->setHost("127.0.0.1"); + $this->setLog("openoffice.log"); + $this->setBin("C:\Program Files (x86)\OpenOffice.org 3\program\soffice.bin"); + $this->setBin("C:\Program Files (x86)\ktdms\openoffice\program\soffice.bin"); + $this->setBin("C:\Program Files (x86)\ktdms\openoffice.2.4\program\soffice.bin"); + $this->setWinservice("winserv.exe"); + $this->setOption(); + } + + private function setPort($port = "8100") { + $this->port = $port; + } + + public function getPort() { + return $this->port; + } + + private function setHost($host = "127.0.0.1") { + $this->host = $host; + } + + public function getHost() { + return $this->host; + } + + private function setLog($log = "openoffice.log") { + $this->log = $log; + } + + public function getLog() { + return $this->log; + } + + private function setBin($bin = "soffice") { + $this->bin = $bin; + } + + public function getBin() { + return $this->bin; + } + + private function setWinservice($winservice = "winserv.exe") { + $this->winservice = SYS_BIN_DIR . $winservice; + } + + public function getWinservice() { + return $this->winservice; + } + + private function setOption() { + $this->options = "-displayname {$this->name} -start auto \"{$this->bin}\" -headless -invisible " + . "-accept=socket,host={$this->host},port={$this->port};urp;"; + } + + public function getOption() { + return $this->options; + } + + public function install() { + $status = $this->status(); + + if($status == '') { + $cmd = "\"{$this->winservice}\" install $this->name $this->options"; + $response = $this->util->pexec($cmd); + return $response; + } + else { + return $status; + } + } + +// public function start() { +// $state = $this->status(); +// if($state != 'STARTED') { +// $cmd = 'sc start ' . $this->name; +// $response = $this->util->pexec($cmd); +// +// return $response; +// } elseif ($state == '') { +// // Start Service +// return true; +// } else { +// // Service Running Already +// return true; +// } +// +// return false; +// } } ?> \ No newline at end of file diff --git a/setup/wizard/lib/services/windowsScheduler.php b/setup/wizard/lib/services/windowsScheduler.php index a11c07f..a71378e 100644 --- a/setup/wizard/lib/services/windowsScheduler.php +++ b/setup/wizard/lib/services/windowsScheduler.php @@ -181,12 +181,17 @@ class windowsScheduler extends windowsService { fclose($fp); } } - $response = win32_create_service(array( - 'service' => $this->name, - 'display' => $this->name, - 'path' => $this->getSchedulerScriptPath() - )); - return $response; + + // TODO what if it does not exist? check how the dmsctl.bat does this + if (function_exists('win32_create_service')) + { + $response = win32_create_service(array( + 'service' => $this->name, + 'display' => $this->name, + 'path' => $this->getSchedulerScriptPath() + )); + return $response; + } } return $state; } diff --git a/templates/ktcore/forms/widgets/selection.smarty b/templates/ktcore/forms/widgets/selection.smarty index 81fd308..7761dbb 100644 --- a/templates/ktcore/forms/widgets/selection.smarty +++ b/templates/ktcore/forms/widgets/selection.smarty @@ -9,8 +9,17 @@ {/if} {foreach item=lookup key=lookup_key from=$vocab} - - + {if $options.multi} + {capture assign=selected}{""}{/capture} + {foreach item=value1 key=key from=$value} + {if $value1 == $lookup_key} + {capture assign=selected}selected='selected'{/capture} + {/if} + {/foreach} + + {else} + + {* multiselect change start *}{/if} {/foreach} {/if}