- Lobo layout: provide new part: image grid; make sure image is not repeated if
it already appears in header part
This commit is contained in:
parent
4996a51bc6
commit
0390c4084b
4 changed files with 58 additions and 46 deletions
|
@ -6,6 +6,8 @@ $Id$
|
||||||
1.1
|
1.1
|
||||||
---
|
---
|
||||||
|
|
||||||
|
- Lobo layout: provide new part: image grid; make sure image is not repeated if
|
||||||
|
it already appears in header part
|
||||||
- new special view 'listsubobjects' for nodes
|
- new special view 'listsubobjects' for nodes
|
||||||
- allow for adoption of relations to a predicate interface;
|
- allow for adoption of relations to a predicate interface;
|
||||||
with example implementation for a 'has Role' predicate in loops.organize
|
with example implementation for a 'has Role' predicate in loops.organize
|
||||||
|
|
|
@ -66,11 +66,11 @@
|
||||||
<!-- parts for displaying resources -->
|
<!-- parts for displaying resources -->
|
||||||
|
|
||||||
<zope:adapter
|
<zope:adapter
|
||||||
name="lobo_rg3"
|
name="lobo_ig3"
|
||||||
for="loops.interfaces.IConcept
|
for="loops.interfaces.IConcept
|
||||||
loops.browser.skin.Lobo"
|
loops.browser.skin.Lobo"
|
||||||
provides="zope.interface.Interface"
|
provides="zope.interface.Interface"
|
||||||
factory="loops.browser.lobo.standard.ResourceGrid3"
|
factory="loops.browser.lobo.standard.ImageGrid3"
|
||||||
permission="zope.View" />
|
permission="zope.View" />
|
||||||
|
|
||||||
</configure>
|
</configure>
|
||||||
|
|
|
@ -67,18 +67,16 @@
|
||||||
|
|
||||||
<!-- resources listing macros -->
|
<!-- resources listing macros -->
|
||||||
|
|
||||||
<metal:block define-macro="rgrid">
|
<metal:block define-macro="imagegrid"
|
||||||
<tal:cell repeat="cell part/getResources">
|
tal:define="showImageLink python:True">
|
||||||
|
<tal:cell repeat="cell part/getImages">
|
||||||
<div tal:attributes="class cell/cssClass;
|
<div tal:attributes="class cell/cssClass;
|
||||||
style cell/style">
|
style cell/style">
|
||||||
<a tal:attributes="href cell/targetUrl;
|
|
||||||
title cell/description">
|
|
||||||
<metal:image use-macro="item/macros/image" />
|
<metal:image use-macro="item/macros/image" />
|
||||||
<div class="legend">
|
<div class="legend">
|
||||||
<b tal:content="cell/title" /><br />
|
<b tal:content="cell/title" /><br />
|
||||||
<i tal:content="cell/description" />
|
<i tal:content="cell/description" />
|
||||||
</div>
|
</div>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</tal:cell>
|
</tal:cell>
|
||||||
</metal:block>
|
</metal:block>
|
||||||
|
|
|
@ -31,7 +31,6 @@ from cybertools.typology.interfaces import IType
|
||||||
from loops.browser.concept import ConceptView as BaseConceptView
|
from loops.browser.concept import ConceptView as BaseConceptView
|
||||||
from loops.browser.concept import ConceptRelationView as BaseConceptRelationView
|
from loops.browser.concept import ConceptRelationView as BaseConceptRelationView
|
||||||
from loops.browser.resource import ResourceView as BaseResourceView
|
from loops.browser.resource import ResourceView as BaseResourceView
|
||||||
from loops.browser.resource import ResourceRelationView as BaseResourceRelationView
|
|
||||||
from loops.common import adapted, baseObject
|
from loops.common import adapted, baseObject
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,7 +63,6 @@ class ConceptView(BaseConceptView):
|
||||||
|
|
||||||
def __init__(self, context, request):
|
def __init__(self, context, request):
|
||||||
super(ConceptView, self).__init__(baseObject(context), request)
|
super(ConceptView, self).__init__(baseObject(context), request)
|
||||||
self.adapted = context
|
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def resources(self):
|
def resources(self):
|
||||||
|
@ -78,6 +76,11 @@ class ConceptView(BaseConceptView):
|
||||||
result['files'].append(r)
|
result['files'].append(r)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def images(self):
|
||||||
|
for r in self.resources['images']:
|
||||||
|
yield r
|
||||||
|
|
||||||
# properties from base class: title, description, renderedDescription
|
# properties from base class: title, description, renderedDescription
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
|
@ -113,23 +116,15 @@ class ConceptView(BaseConceptView):
|
||||||
@Lazy
|
@Lazy
|
||||||
def img(self):
|
def img(self):
|
||||||
self.registerDojoLightbox() # also provides access to info popup
|
self.registerDojoLightbox() # also provides access to info popup
|
||||||
for r in self.resources['images']:
|
for r in self.parentView.parent.images:
|
||||||
url = self.nodeView.getUrlForTarget(r)
|
# fetch from iterator on layout object: avoid duplicates
|
||||||
src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize))
|
url = self.nodeView.getUrlForTarget(r)
|
||||||
return dict(src=src, url=url,
|
src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize))
|
||||||
cssClass=self.parentView.imageCssClass)
|
return dict(src=src, url=url,
|
||||||
|
cssClass=self.parentView.imageCssClass)
|
||||||
|
|
||||||
|
|
||||||
class ConceptRelationView(BaseConceptRelationView, ConceptView):
|
class Layout(Base, ConceptView):
|
||||||
|
|
||||||
def __init__(self, relation, request, contextIsSecond=False,
|
|
||||||
parent=None, idx=0):
|
|
||||||
BaseConceptRelationView.__init__(self, relation, request, contextIsSecond)
|
|
||||||
self.parentView = parent
|
|
||||||
self.idx = idx
|
|
||||||
|
|
||||||
|
|
||||||
class Layout(Base):
|
|
||||||
|
|
||||||
macroName = 'layout'
|
macroName = 'layout'
|
||||||
|
|
||||||
|
@ -140,11 +135,13 @@ class Layout(Base):
|
||||||
parts = (self.options('parts') or
|
parts = (self.options('parts') or
|
||||||
self.typeOptions('parts') or
|
self.typeOptions('parts') or
|
||||||
['h1', 'g3'])
|
['h1', 'g3'])
|
||||||
|
ti = adapted(self.context.conceptType).typeInterface
|
||||||
for p in parts:
|
for p in parts:
|
||||||
viewName = 'lobo_' + p
|
viewName = 'lobo_' + p
|
||||||
view = component.queryMultiAdapter((self.context, self.request),
|
view = component.queryMultiAdapter((self.context, self.request),
|
||||||
name=viewName)
|
name=viewName)
|
||||||
if view is not None:
|
if view is not None:
|
||||||
|
view.parent = self
|
||||||
result.append(view)
|
result.append(view)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@ -175,6 +172,12 @@ class BasePart(Base):
|
||||||
view.parentView = self
|
view.parentView = self
|
||||||
return view
|
return view
|
||||||
|
|
||||||
|
def getImages(self):
|
||||||
|
result = []
|
||||||
|
for idx, img in enumerate(self.parent.images):
|
||||||
|
result.append(ResourceView(img, self.request, parent=self, idx=idx))
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class Grid3(BasePart):
|
class Grid3(BasePart):
|
||||||
|
|
||||||
|
@ -212,13 +215,41 @@ class Header2(BasePart):
|
||||||
cssClass = ['span-4', 'span-2 last', 'clear']
|
cssClass = ['span-4', 'span-2 last', 'clear']
|
||||||
|
|
||||||
|
|
||||||
# layout components for presenting lists of resources
|
# resource parts
|
||||||
|
|
||||||
class ResourceRelationView(BaseResourceRelationView):
|
|
||||||
|
class ImageGrid3(BasePart):
|
||||||
|
|
||||||
|
macroName = 'imagegrid'
|
||||||
|
imageSize = 'small'
|
||||||
|
height = 'auto; padding-bottom: 10px'
|
||||||
|
gridPattern = ['span-2', 'span-2', 'span-2 last']
|
||||||
|
|
||||||
|
|
||||||
|
# relation views, used for cells (components) of lists and grids
|
||||||
|
|
||||||
|
class ConceptRelationView(BaseConceptRelationView, ConceptView):
|
||||||
|
|
||||||
def __init__(self, relation, request, contextIsSecond=False,
|
def __init__(self, relation, request, contextIsSecond=False,
|
||||||
parent=None, idx=0):
|
parent=None, idx=0):
|
||||||
BaseResourceRelationView.__init__(self, relation, request, contextIsSecond)
|
BaseConceptRelationView.__init__(self, relation, request, contextIsSecond)
|
||||||
|
self.parentView = parent
|
||||||
|
self.idx = idx
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def img(self):
|
||||||
|
self.registerDojoLightbox() # also provides access to info popup
|
||||||
|
for r in self.images:
|
||||||
|
url = self.nodeView.getUrlForTarget(r)
|
||||||
|
src = ('%s/mediaasset.html?v=%s' % (url, self.parentView.imageSize))
|
||||||
|
return dict(src=src, url=url,
|
||||||
|
cssClass=self.parentView.imageCssClass)
|
||||||
|
|
||||||
|
|
||||||
|
class ResourceView(BaseResourceView):
|
||||||
|
|
||||||
|
def __init__(self, resource, request, parent=None, idx=0):
|
||||||
|
BaseResourceView.__init__(self, resource, request)
|
||||||
self.parentView = parent
|
self.parentView = parent
|
||||||
self.idx = idx
|
self.idx = idx
|
||||||
|
|
||||||
|
@ -244,22 +275,3 @@ class ResourceRelationView(BaseResourceRelationView):
|
||||||
return dict(src=src, url=url,
|
return dict(src=src, url=url,
|
||||||
cssClass=self.parentView.imageCssClass)
|
cssClass=self.parentView.imageCssClass)
|
||||||
|
|
||||||
class ResourcesPart(BasePart):
|
|
||||||
|
|
||||||
def getResources(self):
|
|
||||||
result = []
|
|
||||||
resourceRels = self.context.getResourceRelations()
|
|
||||||
for idx, r in enumerate(resourceRels):
|
|
||||||
result.append(ResourceRelationView(r, self.request,
|
|
||||||
contextIsSecond=True, parent=self, idx=idx))
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
class ResourceGrid3(ResourcesPart):
|
|
||||||
|
|
||||||
macroName = 'rgrid'
|
|
||||||
imageSize = 'small'
|
|
||||||
height = 'auto; padding-bottom: 10px'
|
|
||||||
gridPattern = ['span-2', 'span-2', 'span-2 last']
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue