diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt
index 025a46b..c2f465d 100644
--- a/docs/HISTORY.txt
+++ b/docs/HISTORY.txt
@@ -1,6 +1,15 @@
Changelog
=========
+5.6 - (2024-11-11)
+---------------------------
+* Feature: customized actions endpoint to allow passing of props to the
+ actions endpoint
+ [ichim-david - refs #271001]
+* Feature: customized breadcrumbs endpoint to add portal_type info to the
+ items served by the breadcrumbs endpoint
+ [ichim-david - refs #271001]
+
5.5 - (2024-10-18)
---------------------------
* Change: Fix broken brain error at the upgrade svg step - refs #276995
diff --git a/eea/volto/policy/browser/breadcrumbs.py b/eea/volto/policy/browser/breadcrumbs.py
new file mode 100644
index 0000000..28b77e6
--- /dev/null
+++ b/eea/volto/policy/browser/breadcrumbs.py
@@ -0,0 +1,62 @@
+"""Breadcrumbs"""
+
+# -*- coding: utf-8 -*-
+from Acquisition import aq_base
+from Acquisition import aq_inner
+from plone.app.layout.navigation.interfaces import INavigationRoot
+from plone.app.layout.navigation.root import getNavigationRoot
+from Products.CMFPlone import utils
+from Products.CMFPlone.browser.interfaces import INavigationBreadcrumbs
+from Products.CMFPlone.browser.navigation import get_view_url
+from Products.CMFPlone.defaultpage import check_default_page_via_view
+from Products.CMFPlone.interfaces import IHideFromBreadcrumbs
+from Products.Five import BrowserView
+from zope.component import getMultiAdapter
+from zope.interface import implementer
+
+
+@implementer(INavigationBreadcrumbs)
+class PhysicalNavigationBreadcrumbs(BrowserView):
+ """EEA Physical Navigation Breadcrumbs"""
+
+ def breadcrumbs(self):
+ """breadcrumbs"""
+ context = aq_inner(self.context)
+ request = self.request
+ container = utils.parent(context)
+ _name, item_url = get_view_url(context)
+ # EEA add portal_type info to breadcrumbs
+ last_crumb = {
+ "absolute_url": item_url,
+ "Title": utils.pretty_title_or_id(context, context),
+ "portal_type": context.portal_type,
+ "nav_title": getattr(aq_base(context), "nav_title", ""),
+ }
+
+ if container is None:
+ return (last_crumb,)
+
+ # Replicate Products.CMFPlone.browser.navigation.
+ # RootPhysicalNavigationBreadcrumbs.breadcrumbs()
+ # cause it is not registered during tests
+ if INavigationRoot.providedBy(context):
+ return ()
+
+ view = getMultiAdapter((container, request),
+ name="eea_breadcrumbs_view")
+ base = tuple(view.breadcrumbs())
+
+ # Some things want to be hidden from the breadcrumbs
+ if IHideFromBreadcrumbs.providedBy(context):
+ return base
+
+ rootPath = getNavigationRoot(context)
+ itemPath = "/".join(context.getPhysicalPath())
+
+ # don't show default pages in breadcrumbs or pages above the navigation
+ # root
+ if not check_default_page_via_view(
+ context, request
+ ) and not rootPath.startswith(itemPath):
+ base += (last_crumb,)
+ return base
diff --git a/eea/volto/policy/browser/configure.zcml b/eea/volto/policy/browser/configure.zcml
index f98073e..56ca705 100644
--- a/eea/volto/policy/browser/configure.zcml
+++ b/eea/volto/policy/browser/configure.zcml
@@ -27,4 +27,13 @@
permission="cmf.ManagePortal"
/>
+
+
diff --git a/eea/volto/policy/restapi/services/actions/__init__.py b/eea/volto/policy/restapi/services/actions/__init__.py
new file mode 100644
index 0000000..ad4b2dc
--- /dev/null
+++ b/eea/volto/policy/restapi/services/actions/__init__.py
@@ -0,0 +1 @@
+""" EEA Actions overrides """
diff --git a/eea/volto/policy/restapi/services/actions/configure.zcml b/eea/volto/policy/restapi/services/actions/configure.zcml
new file mode 100644
index 0000000..9518899
--- /dev/null
+++ b/eea/volto/policy/restapi/services/actions/configure.zcml
@@ -0,0 +1,13 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/eea/volto/policy/restapi/services/actions/get.py b/eea/volto/policy/restapi/services/actions/get.py
new file mode 100644
index 0000000..a8076c6
--- /dev/null
+++ b/eea/volto/policy/restapi/services/actions/get.py
@@ -0,0 +1,54 @@
+"""Breadcrumbs"""
+
+from zope.component import getMultiAdapter
+from zope.component import adapter
+from zope.i18n import translate
+from zope.interface import implementer
+from zope.interface import Interface
+from plone.restapi.interfaces import IExpandableElement, IPloneRestapiLayer
+from plone.restapi.services.actions.get import Actions
+
+
+@implementer(IExpandableElement)
+@adapter(Interface, IPloneRestapiLayer)
+class EEAActions(Actions):
+ """EEA Actions"""
+
+ def __call__(self, expand=False):
+ """ """
+ result = {"actions": {"@id":
+ f"{self.context.absolute_url()}/@actions"}}
+ if not expand:
+ return result
+
+ context_state = getMultiAdapter(
+ (self.context, self.request), name="plone_context_state"
+ )
+
+ categories = self.request.form.get("categories", self.all_categories)
+ filtered_action_props = {
+ "category",
+ "link_target",
+ "available",
+ "visible",
+ "allowed",
+ "modal",
+ }
+ data = {}
+ for category in categories:
+ category_action_data = []
+ actions = context_state.actions(category=category)
+ for action in actions:
+ # EEA allow actions props to be served by the endpoint except
+ # for the ones listed in filtered_action_props
+ action_data = {
+ key: translate(value, context=self.request)
+ if key == "title"
+ else value
+ for key, value in action.items()
+ if key not in filtered_action_props
+ }
+
+ category_action_data.append(action_data)
+ data[category] = category_action_data
+ return {"actions": data}
diff --git a/eea/volto/policy/restapi/services/breadcrumbs/__init__.py b/eea/volto/policy/restapi/services/breadcrumbs/__init__.py
new file mode 100644
index 0000000..55fce9f
--- /dev/null
+++ b/eea/volto/policy/restapi/services/breadcrumbs/__init__.py
@@ -0,0 +1 @@
+""" Breadcrumbs """
diff --git a/eea/volto/policy/restapi/services/breadcrumbs/configure.zcml b/eea/volto/policy/restapi/services/breadcrumbs/configure.zcml
new file mode 100644
index 0000000..4e37599
--- /dev/null
+++ b/eea/volto/policy/restapi/services/breadcrumbs/configure.zcml
@@ -0,0 +1,13 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/eea/volto/policy/restapi/services/breadcrumbs/get.py b/eea/volto/policy/restapi/services/breadcrumbs/get.py
new file mode 100644
index 0000000..268e694
--- /dev/null
+++ b/eea/volto/policy/restapi/services/breadcrumbs/get.py
@@ -0,0 +1,45 @@
+"""Breadcrumbs"""
+
+from zope.component import getMultiAdapter
+from zope.component import adapter
+from zope.interface import implementer
+from zope.interface import Interface
+from plone.restapi.interfaces import IExpandableElement, IPloneRestapiLayer
+from plone.restapi.services.breadcrumbs.get import Breadcrumbs
+
+
+@implementer(IExpandableElement)
+@adapter(Interface, IPloneRestapiLayer)
+class EEABreadcrumbs(Breadcrumbs):
+ """EEA Breadcrumbs"""
+
+ def __call__(self, expand=False):
+ """ """
+ result = {"breadcrumbs": {
+ "@id": f"{self.context.absolute_url()}/@breadcrumbs"}}
+ if not expand:
+ return result
+
+ portal_state = getMultiAdapter(
+ (self.context, self.request), name="plone_portal_state"
+ )
+ breadcrumbs_view = getMultiAdapter(
+ (self.context, self.request), name="eea_breadcrumbs_view"
+ )
+ items = []
+ # EEA add portal_type info to breadcrumbs
+ for crumb in breadcrumbs_view.breadcrumbs():
+ item = {
+ "title": crumb["Title"],
+ "portal_type": crumb.get("portal_type", ""),
+ "@id": crumb["absolute_url"],
+ }
+ if crumb.get("nav_title", False):
+ item.update({"title": crumb["nav_title"]})
+
+ items.append(item)
+
+ result["breadcrumbs"]["items"] = items
+ result["breadcrumbs"]["root"] = portal_state.navigation_root()\
+ .absolute_url()
+ return result
diff --git a/eea/volto/policy/restapi/services/configure.zcml b/eea/volto/policy/restapi/services/configure.zcml
index b5e2ec6..22b3396 100644
--- a/eea/volto/policy/restapi/services/configure.zcml
+++ b/eea/volto/policy/restapi/services/configure.zcml
@@ -3,4 +3,6 @@
xmlns:zcml="http://namespaces.zope.org/zcml"
>
+
+
diff --git a/eea/volto/policy/restapi/services/contextnavigation/get.py b/eea/volto/policy/restapi/services/contextnavigation/get.py
index 3daa848..9f68835 100644
--- a/eea/volto/policy/restapi/services/contextnavigation/get.py
+++ b/eea/volto/policy/restapi/services/contextnavigation/get.py
@@ -243,6 +243,7 @@ def recurse(self, children, level, bottomLevel):
@adapter(Interface, IPloneRestapiLayer)
class EEAContextNavigation:
"""Custom context navigation"""
+
def __init__(self, context, request):
self.context = context
self.request = request
@@ -255,7 +256,6 @@ def __call__(self, expand=False, prefix="expand.contextnavigation."):
}
if not expand:
return result
- print("REQUEST FORM", self.request.form)
data = eea_extract_data(
IEEANavigationPortlet,
self.request.form,
diff --git a/eea/volto/policy/version.txt b/eea/volto/policy/version.txt
index 9ad974f..2df33d7 100644
--- a/eea/volto/policy/version.txt
+++ b/eea/volto/policy/version.txt
@@ -1 +1 @@
-5.5
+5.6