trying to use Dojo ComboBox for searching...

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1330 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2006-09-07 11:58:03 +00:00
parent 029632fde7
commit a843474545
4 changed files with 60 additions and 3 deletions

View file

@ -13,6 +13,10 @@ function focusOpener() {
}
}
function listConceptsForComboBox() {
return [['Zope', 'zope'], ]
}
function submitReplacing(targetId, formId, actionUrl) {
dojo.io.updateNode(targetId, {
url: actionUrl,

View file

@ -23,6 +23,7 @@ loops.search package.
$Id$
"""
from zope.app import zapi
from zope import interface, component
from zope.app.catalog.interfaces import ICatalog
from zope.app.pagetemplate import ViewPageTemplateFile
@ -49,6 +50,16 @@ class Search(BaseView):
def macro(self):
return template.macros['search']
def initDojo(self):
self.registerDojo()
cm = self.controller.macros
jsCall = 'dojo.require("dojo.widget.ComboBox")'
cm.register('js-execute', jsCall, jsCall=jsCall)
@Lazy
def catalog(self):
return component.getUtility(ICatalog)
@property
def rowNum(self):
""" Return the rowNum to be used for identifying the current search
@ -67,6 +78,27 @@ class Search(BaseView):
for t in ITypeManager(self.context).types
if 'concept' in t.qualifiers]))
def listConcepts(self):
request = self.request
request.response.setHeader('Content-Type', 'text/json; charset=UTF-8')
text = request.get('searchString', '')
print 'text:', text
#if not text:
# return ''
type = request.get('search.3.type', 'loops:concept:*')
if type.endswith('*'):
start = type[:-1]
end = start + '\x7f'
else:
start = end = type
cat = self.catalog
if text:
result = cat.searchResults(loops_type=(start, end), loops_text=text+'*')
else:
result = cat.searchResults(loops_type=(start, end))
return str([[o.title.encode('UTF-8'), zapi.getName(o).encode('UTF-8')]
for o in result])
def submitReplacing(self, targetId, formId, view):
self.registerDojo()
return 'return submitReplacing("%s", "%s", "%s")' % (
@ -93,11 +125,15 @@ class SearchResults(BaseView):
result = set()
request = self.request
r3 = self.queryConcepts()
type = request.get('search.1.text', 'loops:resource:*')
type = request.get('search.1.text', 'loops:*')
text = request.get('search.2.text')
if not r3 and not text and '*' in type: # there should be some sort of selection...
return result
if text or not '*' in type:
#if r3 and type != 'loops:*':
# typeName = type.split(':')[-1]
# r3 = set(o for o in r3 if self.isType(o, typeName))
#if text or not '*' in loops:
if text or type != 'loops:*': # TODO: this may be highly inefficient! see above
useTitle = request.get('search.2.title')
useFull = request.get('search.2.full')
r1 = set()

View file

@ -15,6 +15,14 @@
permission="zope.View"
/>
<browser:page
name="listConceptsForComboBox.js"
for="loops.interfaces.ILoopsObject"
class="loops.search.browser.Search"
attribute="listConcepts"
permission="zope.View"
/>
<browser:page
name="searchresults.html"
for="loops.interfaces.ILoopsObject"

View file

@ -127,7 +127,7 @@
<metal:text define-macro="concept">
<div>
<h3>Search via related conceps</h3>
<h3>Search via related concepts</h3>
<label for="type"
tal:attributes="for string:$idPrefix.type">Type:</label>
<select name="type"
@ -148,6 +148,15 @@
<input type="button" value="+"
title="Add type"
tal:condition="nothing" />&nbsp;
<div tal:define="dummy item/initDojo">
<select dojoType="comboBox"
dataUrl="listConceptsForComboBox.js"
dataProviderClass="dojo.widget.incrementalComboBoxDataProvider"
tal:attributes="name string:$namePrefix.text1;
dataUrl string:${context/@@absolute_url}/listConceptsForComboBox.js?searchString=%{searchString}">
<option value="zope">Zope</option>
</select>
</div>
</div>
</metal:text>