diff --git a/CHANGES.rst b/CHANGES.rst
index 1cb0a5a..1f58fdc 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,7 +4,8 @@ Changelog
0.74 (unreleased)
-----------------
-- Nothing changed yet.
+- Display category infos on categorized item.
+ [chris-adam]
0.73 (2026-04-01)
diff --git a/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py b/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py
index 86c1eec..042f8b6 100644
--- a/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py
+++ b/src/collective/iconifiedcategory/behaviors/iconifiedcategorization.py
@@ -140,6 +140,7 @@ def signed(self):
def to_approve(self):
return getattr(aq_base(self.context), 'to_approve', False)
+ @property
def approved(self):
return getattr(aq_base(self.context), 'approved', False)
diff --git a/src/collective/iconifiedcategory/browser/configure.zcml b/src/collective/iconifiedcategory/browser/configure.zcml
index 178f5ee..5857b81 100644
--- a/src/collective/iconifiedcategory/browser/configure.zcml
+++ b/src/collective/iconifiedcategory/browser/configure.zcml
@@ -59,6 +59,16 @@
permission="zope2.View"
/>
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/collective/iconifiedcategory/browser/templates/categorized-element-icons.pt b/src/collective/iconifiedcategory/browser/templates/categorized-element-icons.pt
new file mode 100644
index 0000000..51f5501
--- /dev/null
+++ b/src/collective/iconifiedcategory/browser/templates/categorized-element-icons.pt
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/collective/iconifiedcategory/browser/templates/categorized-item-info-viewlet.pt b/src/collective/iconifiedcategory/browser/templates/categorized-item-info-viewlet.pt
new file mode 100644
index 0000000..37f915a
--- /dev/null
+++ b/src/collective/iconifiedcategory/browser/templates/categorized-item-info-viewlet.pt
@@ -0,0 +1,9 @@
+
+
+
+
+
+
diff --git a/src/collective/iconifiedcategory/browser/viewlets.py b/src/collective/iconifiedcategory/browser/viewlets.py
index d50f3d6..202aa63 100644
--- a/src/collective/iconifiedcategory/browser/viewlets.py
+++ b/src/collective/iconifiedcategory/browser/viewlets.py
@@ -7,8 +7,23 @@
:license: GPL, see LICENCE.txt for more details.
"""
+from collective.iconifiedcategory.browser.views import CategorizedElementsMixin
from plone.app.layout.viewlets import common as base
class CategorizedChildViewlet(base.ViewletBase):
""" """
+
+
+class CategorizedItemInfoViewlet(CategorizedElementsMixin, base.ViewletBase):
+ """Viewlet showing the category status icons on a categorized item's view page."""
+
+ def __init__(self, context, request, view, manager=None):
+ super(CategorizedItemInfoViewlet, self).__init__(context, request, view, manager)
+ self.element = self.context.aq_parent.categorized_elements[self.context.UID()]
+
+ def show(self, element, attr_prefix):
+ return element['{0}_activated'.format(attr_prefix)]
+
+ def show_download(self, element):
+ return False
diff --git a/src/collective/iconifiedcategory/browser/views.py b/src/collective/iconifiedcategory/browser/views.py
index dfcf8dd..a7aa1e8 100644
--- a/src/collective/iconifiedcategory/browser/views.py
+++ b/src/collective/iconifiedcategory/browser/views.py
@@ -22,12 +22,68 @@
from Products.CMFCore.permissions import View
from Products.CMFCore.utils import _checkPermission
from Products.Five import BrowserView
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.component import getMultiAdapter
from zope.component.interfaces import ComponentLookupError
import json
+class CategorizedElementsMixin(object):
+ """Mixin providing shared icon rendering for categorized elements."""
+
+ _element_icons = ViewPageTemplateFile('templates/categorized-element-icons.pt')
+
+ def element_icons_html(self, element):
+ """Render the status icon spans for the given element."""
+ return self._element_icons(element=element)
+
+ def get_css_classses_for(self, functionnality, element):
+ """ """
+ css_classes = []
+ if functionnality == "to_print":
+ css_classes.append("iconified-print")
+ if element['to_print'] is None:
+ css_classes.append('deactivated')
+ elif element['to_print'] is True:
+ css_classes.append('active')
+ elif functionnality == "signed":
+ css_classes.append("iconified-signed")
+ if element['to_sign'] is False:
+ css_classes.append('deactivated')
+ elif element['signed'] is True:
+ css_classes.append('active')
+ elif functionnality == "approved":
+ css_classes.append("iconified-approved")
+ if element['to_approve'] is False:
+ css_classes.append('deactivated')
+ elif element['approved'] is True:
+ css_classes.append('active')
+ else:
+ # default behavior
+ css_classes.append("iconified-{0}".format(functionnality))
+ if element[functionnality] is True:
+ css_classes.append('active')
+ return " ".join(css_classes)
+
+ def get_tag_title_for(self, functionnality, element):
+ """ """
+ msg = ''
+ if functionnality == "to_print":
+ msg = print_message(to_print_value=element['to_print'])
+ elif functionnality == "signed":
+ msg = signed_message(to_sign_value=element['to_sign'],
+ signed_value=element['signed'])
+ elif functionnality == "approved":
+ msg = approved_message(to_approve_value=element['to_approve'],
+ approved_value=element['approved'])
+ else:
+ # default behavior, a boolean message
+ msg = boolean_message(attr_name=functionnality,
+ value=element[functionnality])
+ return msg
+
+
class CategorizedChildView(BrowserView):
""" """
@@ -82,7 +138,7 @@ def get_management_url(self):
return "{0}/@@iconifiedcategory".format(self.context.absolute_url())
-class CategorizedChildInfosView(BrowserView):
+class CategorizedChildInfosView(CategorizedElementsMixin, BrowserView):
""" """
def __init__(self, context, request):
""" """
@@ -171,52 +227,6 @@ def _show_detail(self, detail_type):
"""Made to be overrided."""
return True
- def get_css_classses_for(self, functionnality, element):
- """ """
- css_classes = []
- if functionnality == "to_print":
- css_classes.append("iconified-print")
- if element['to_print'] is None:
- css_classes.append('deactivated')
- elif element['to_print'] is True:
- css_classes.append('active')
- elif functionnality == "signed":
- css_classes.append("iconified-signed")
- if element['to_sign'] is False:
- css_classes.append('deactivated')
- elif element['signed'] is True:
- css_classes.append('active')
- elif functionnality == "approved":
- css_classes.append("iconified-approved")
- if element['to_approve'] is False:
- css_classes.append('deactivated')
- elif element['approved'] is True:
- css_classes.append('active')
- else:
- # default behavior
- css_classes.append("iconified-{0}".format(functionnality))
- if element[functionnality] is True:
- css_classes.append('active')
- return " ".join(css_classes)
-
- def get_tag_title_for(self, functionnality, element):
- """ """
- msg = ''
- if functionnality == "to_print":
- msg = print_message(to_print_value=element['to_print'])
- elif functionnality == "signed":
- msg = signed_message(to_sign_value=element['to_sign'],
- signed_value=element['signed'])
- elif functionnality == "approved":
- msg = approved_message(to_approve_value=element['to_approve'],
- approved_value=element['approved'])
- else:
- # default behavior, a boolean message
- msg = boolean_message(attr_name=functionnality,
- value=element[functionnality])
- return msg
-
-
def check_can_view(obj, request):
""" """
try: