From b08b869b1c2b7714bcff0e165abd4032f0e997fe Mon Sep 17 00:00:00 2001 From: Brad Shuttleworth Date: Fri, 30 Sep 2005 15:19:29 +0000 Subject: [PATCH] first layer of the Boolean Search AJAX UI. --- presentation/lookAndFeel/knowledgeTree/js/constructed_search.js | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ presentation/lookAndFeel/knowledgeTree/js/taillog.js | 20 ++++++++++++++++++++ presentation/lookAndFeel/knowledgeTree/search/ajaxBooleanSearch.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ presentation/lookAndFeel/knowledgeTree/search/booleanSearch.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ presentation/lookAndFeel/knowledgeTree/search/booleanSearchUtil.inc | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ templates/ktcore/boolean_search.smarty | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 508 insertions(+), 0 deletions(-) create mode 100644 presentation/lookAndFeel/knowledgeTree/js/constructed_search.js create mode 100644 presentation/lookAndFeel/knowledgeTree/js/taillog.js create mode 100644 presentation/lookAndFeel/knowledgeTree/search/ajaxBooleanSearch.php create mode 100644 presentation/lookAndFeel/knowledgeTree/search/booleanSearch.php create mode 100644 presentation/lookAndFeel/knowledgeTree/search/booleanSearchUtil.inc create mode 100644 templates/ktcore/boolean_search.smarty diff --git a/presentation/lookAndFeel/knowledgeTree/js/constructed_search.js b/presentation/lookAndFeel/knowledgeTree/js/constructed_search.js new file mode 100644 index 0000000..65cd7c8 --- /dev/null +++ b/presentation/lookAndFeel/knowledgeTree/js/constructed_search.js @@ -0,0 +1,165 @@ +// simple event stacking. +// i don't like Mochikit's one. + +function attachToElementEvent(elem, event_name, func) { + // catch IE (grumble) + if (elem.attachEvent) { + elem.attachEvent('on'+event_name, func); + } else { + elem.addEventListener(event_name, func, false); + } +} + +function removeFromElementEvent(elem, event_name, func) { + // catch IE (grumble) + if (elem.detachEvent) { + elem.detachEvent('on'+event_name, func); + } else { + elem.removeEventListener(event_name, func, false); + } +} + +// quick and dirty helper - find the nearest parent item matching tagName. +// FIXME steal the klass or tagName logic from MochiK. +function breadcrumbFind(elem, tagName) { + var stopTag = 'BODY'; + var currentTag = elem.tagName; + var currentElem = elem; + while ((currentTag != stopTag) && (currentTag != tagName)) { + currentElem = currentElem.parentNode; + currentTag = currentElem.tagName; + } + if (currentTag == tagName) { + return currentElem; + } else { + return null; + } +} + +var autoIndexCriteria = Array(); + +// initiate the criteria creation process. +function addNewCriteria(add_button) { + var parent_row = breadcrumbFind(add_button, 'TR'); + simpleLog('DEBUG','addNewCriteria found parent row: '+parent_row); + var select_source = parent_row.getElementsByTagName('select'); + if (select_source.length == 0) { + simpleLog('ERROR','addNewCriteria found no criteria specification source.: '+parent_row); + } else { + var select = select_source[0]; + } + var notify_source = parent_row.getElementsByTagName('p'); + if (notify_source.length == 0) { + simpleLog('ERROR','addNewCriteria found no message storage in row: '+parent_row); + } else { + var notify_message = notify_source[0]; + } + + + // make this one identifiable. + autoIndexCriteria.push(0); + var critId = autoIndexCriteria.length; + + // ok, warn the user that we're loading the item. + replaceChildNodes(notify_message, 'loading...'); + var newCriteriaText = scrapeText(select.options[select.selectedIndex])+' '; // FIXME insert the "input" here. + replaceChildNodes(select.parentNode, newCriteriaText, INPUT({'type':'hidden', 'name':'boolean_search['+critId+'][\'type\']','value':select.value})); // works thanks to DOM co-ercion. + createAdditionalCriteriaOption(); + var removeButton = INPUT({'type':'button', 'value':'Remove'}); + attachToElementEvent(removeButton, 'click', partial(removeCriteria, removeButton)); + add_button.parentNode.replaceChild(removeButton, add_button); + + + // fetch. + var dest_cell = notify_message.parentNode; + var targeturl='ajaxBooleanSearch.php?action=getNewCriteria&type='+select.value+'&critId='+critId; + simpleLog('DEBUG','addNewCriteria initiating request to: '+targeturl); + + var deferred = doSimpleXMLHttpRequest(targeturl); + deferred.addCallbacks(partial(do_addNewCriteria, dest_cell, critId), handleAjaxError); +} + + +// FIXME multi-select items using PHP array[] syntax won't work. we'd need to: +// - check for the presence of [ or ]. if so, use everything before [ as +// the key, and append everything after [. +// actually replace the contents of the specified td with the responseText. +function do_addNewCriteria(destination_cell, crit_id, req) { + simpleLog('DEBUG','replacing content of cell with: \n'+req.responseText); + destination_cell.innerHTML = req.responseText; + // whatever was passed in almost certainly has the wrong name, but that's what + // will be expected in the backend. + // wrap it so we don't get clashes. + + var inputs = destination_cell.getElementsByTagName('INPUT'); + var selects = destination_cell.getElementsByTagName('SELECT'); + + for (var i=0; i