diff --git a/fields/ref.py b/fields/ref.py index 23d05c5..2df23f7 100644 --- a/fields/ref.py +++ b/fields/ref.py @@ -38,21 +38,16 @@ class Ref(Field): # defined. If we are on a forward reference, the "nav" parameter is added to # the URL for allowing to navigate from one object to the next/previous one. pxObjectTitle = Px(''' - + pageName=field.isBack and field.back.pageName or 'main'"> ::tied.o.getSupTitle(navInfo) - :(not includeShownInfo) and \ - tied.o.getShownValue('title') or field.getReferenceLabel(tied) - ::tied.o.getSubTitle()''') + ::tied.o.getListTitle(nav=navInfo, target=target, page=pageName, \ + inPopup=inPopup) + ::sub + ''') # This PX displays buttons for triggering global actions on several linked # objects (delete many, unlink many,...) diff --git a/gen/mixins/__init__.py b/gen/mixins/__init__.py index 11b6186..9a3c6da 100644 --- a/gen/mixins/__init__.py +++ b/gen/mixins/__init__.py @@ -951,6 +951,44 @@ class BaseMixin: if hasattr(obj, 'getSubBreadCrumb'): return obj.getSubBreadCrumb() return '' + def getListTitle(self, mode='link', nav='', target=None, page='main', + inPopup=False, selectJs=None): + '''Gets the title as it must appear in lists of objects (ie in lists of + tied objects in a Ref, in query results...). + + In most cases, a title must appear as a link that leads to the object + view layout. In this case (p_mode == "link"): + * p_nav is the navigation parameter allowing navigation between + this object and others; + * p_target specifies if the link must be opened in the popup or not; + * p_page specifies which page to show on the target object view; + * p_inPopup indicates if we are already in the popup or not. + + Another p_mode is "select". In this case, we are in a popup for + selecting objects: every title must not be a link, but clicking on it + must trigger Javascript code (in p_selectJs) that will select this + object. + + The last p_mode is "text". In this case, we simply show the object + title but with no tied action (link, select). + ''' + # Compute common parts + cssClass = self.getCssFor('title') + title = self.getShownValue('title') + if mode == 'link': + inPopup = inPopup or (target.target != '_self') + url = self.getUrl(page=page, nav=nav, inPopup=inPopup) + onClick = target.openPopup and \ + (' onclick="%s"' % target.openPopup) or '' + res = '%s' % \ + (url, cssClass, target.target, onClick, title) + elif mode == 'select': + res = '%s' % \ + (cssClass, selectJs, title) + elif mode == 'text': + res = '%s' % (cssClass, title) + return res + # Workflow methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def initializeWorkflow(self): '''Called when an object is created, be it temp or not, for initializing diff --git a/gen/wrappers/ToolWrapper.py b/gen/wrappers/ToolWrapper.py index d99934e..929a9f7 100644 --- a/gen/wrappers/ToolWrapper.py +++ b/gen/wrappers/ToolWrapper.py @@ -317,17 +317,13 @@ class ToolWrapper(AbstractWrapper): + titleMode=inPopup and 'select' or 'link'; + pageName=zobj.getDefaultViewPage(); + selectJs=inPopup and 'onSelectObject(%s,%s,%s)' % (q(cbId), \ + q(rootHookId), q(uiSearch.initiator.url))"> ::sup - :zobj.getShownValue('title') - :obj.title + ::zobj.getListTitle(mode=titleMode, nav=navInfo, target=target, \ + page=pageName, inPopup=inPopup, selectJs=selectJs) ::sub @@ -478,7 +474,6 @@ class ToolWrapper(AbstractWrapper): (q(ajaxHookId), q(ztool.absolute_url()), q(className), \ q(searchName),int(inPopup)); showNewSearch=showNewSearch|True; - enableLinks=enableLinks|not inPopup; newSearchUrl='%s/search?className=%s%s' % \ (ztool.absolute_url(), className, refUrlPart); showSubTitles=req.get('showSubTitles', 'true') == 'true';