From 277748d08e181498a244489016cdf8061b901fc5 Mon Sep 17 00:00:00 2001 From: Lena Daxenbichler Date: Fri, 18 Apr 2025 11:20:31 +0200 Subject: [PATCH 01/13] implement a categorized add menu in contextmenu using some logic from cone.light --- src/cone/app/browser/authoring.py | 42 +++++++++++++ .../app/browser/templates/add_dropdown.pt | 59 +++++++++++++++---- src/cone/app/interfaces.py | 4 ++ src/cone/app/model.py | 6 ++ 4 files changed, 99 insertions(+), 12 deletions(-) diff --git a/src/cone/app/browser/authoring.py b/src/cone/app/browser/authoring.py index c3fe74b8..a9b03e03 100644 --- a/src/cone/app/browser/authoring.py +++ b/src/cone/app/browser/authoring.py @@ -12,6 +12,7 @@ from cone.app.browser.form import FormTarget from cone.app.browser.utils import make_query from cone.app.browser.utils import make_url +from cone.app.interfaces import ICategories from cone.app.model import AdapterNode from cone.app.model import BaseNode from cone.app.model import get_node_info @@ -311,6 +312,47 @@ def default_addmodel_factory(parent, nodeinfo): permission='add', strict=False) class AddDropdown(Tile): + def category_id(self, category): + return 'add-category-cat-{0}'.format(category) + + @property + def addables(self): + addables = list() + for addable in self.model.nodeinfo.addables: + if not security.node_available(self.model, addable): + continue + addables.append(addable) + return addables + + @property + def categories(self): + # expects ``categories`` property on model class + ret = list() + addables = self.addables + if not addables: + return ret + node_infos = [get_node_info(addable) for addable in addables] + # lookup categories + categories = set() + for info in node_infos: + cls = info.node + for cat in cls.categories: + categories.add(cat) + # create items + for category in categories: + category_items = list() + for info in node_infos: + cls = info.node + if category in cls.categories: + item = self.make_item(cls.node_info_name, info) + category_items.append(item) + ret.append((category, category_items)) + return sorted(ret, key=lambda x: x[0]) + + @property + def has_categories(self): + return ICategories.providedBy(self.model) + def make_item(self, info_name, info): model = self.model request = self.request diff --git a/src/cone/app/browser/templates/add_dropdown.pt b/src/cone/app/browser/templates/add_dropdown.pt index 9a3b49d6..03ea6e90 100644 --- a/src/cone/app/browser/templates/add_dropdown.pt +++ b/src/cone/app/browser/templates/add_dropdown.pt @@ -8,23 +8,58 @@ Add -