Adds a PanelMixin plugin mixin class

Intended to allow rendering of custom panels on pages
This commit is contained in:
Oliver Walters 2022-05-06 21:32:11 +10:00
parent 170cb54490
commit 28e16616e5
3 changed files with 69 additions and 1 deletions

View File

@ -542,3 +542,47 @@ class APICallMixin:
if simple_response: if simple_response:
return response.json() return response.json()
return response return response
class PanelMixin:
"""
Mixin which allows integration of custom 'panels' into a particular page.
The mixin provides a number of key functionalities:
- Adds an (initially hidden) panel to the page
- Allows rendering of custom templated content to the panel
- Adds a menu item to the 'navbar' on the left side of the screen
- Allows custom javascript to be run when the panel is initially loaded
The PanelMixin class allows multiple panels to be returned for any page,
and also allows the plugin to return panels for many different pages.
Any class implementing this mixin must provide the 'get_custom_panels' method,
which dynamically returns the custom panels for a particular page.
This method is provided with:
- page: The name of the page e.g. 'part-detail'
- instance: The model instance specific to the page
- request: The request object responsible for the page load
It must return a list of CustomPanel class instances (see below).
Note that as this is called dynamically (per request),
then the actual panels returned can vary depending on the particular request or page
"""
class CustomPanel:
...
class MixinMeta:
MIXIN_NAME = 'Panel'
def __init__(self):
super().__init__()
self.add_mixin('panel', True, __class__)
def get_custom_panels(self, page, instance, request):
raise NotImplementedError(f"{__class__} is missing the 'get_custom_panels' method")

View File

@ -2,7 +2,8 @@
Utility class to enable simpler imports Utility class to enable simpler imports
""" """
from ..builtin.integration.mixins import APICallMixin, AppMixin, LabelPrintingMixin, SettingsMixin, EventMixin, ScheduleMixin, UrlsMixin, NavigationMixin from ..builtin.integration.mixins import APICallMixin, AppMixin, LabelPrintingMixin, SettingsMixin, EventMixin, ScheduleMixin, UrlsMixin, NavigationMixin, PanelMixin
from common.notifications import SingleNotificationMethod, BulkNotificationMethod from common.notifications import SingleNotificationMethod, BulkNotificationMethod
from ..builtin.action.mixins import ActionMixin from ..builtin.action.mixins import ActionMixin
@ -17,6 +18,7 @@ __all__ = [
'ScheduleMixin', 'ScheduleMixin',
'SettingsMixin', 'SettingsMixin',
'UrlsMixin', 'UrlsMixin',
'PanelMixin',
'ActionMixin', 'ActionMixin',
'BarcodeMixin', 'BarcodeMixin',
'SingleNotificationMethod', 'SingleNotificationMethod',

View File

@ -0,0 +1,22 @@
"""
Sample plugin which renders custom panels on certain pages
"""
from plugin import IntegrationPluginBase
from plugin.mixins import PanelMixin
class CustomPanelSample(PanelMixin, IntegrationPluginBase):
"""
A sample plugin which renders some custom panels.
"""
PLUGIN_NAME = "CustomPanelExample"
PLUGIN_SLUG = "panel"
PLUGIN_TITLE = "Custom Panel Example"
def get_custom_panels(self, page, instance, request):
print("get_custom_panels:")
return []