From 587ad8d09db1f9462e44084a32dfea7280925492 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 12 Aug 2024 00:25:57 +0000 Subject: [PATCH] Framework for a sample plugin which implements custom panels --- .../base/integration/UserInterfaceMixin.py | 2 +- .../InvenTree/plugin/mixins/__init__.py | 4 +-- .../integration/user_interface_sample.py | 31 +++++++++++++++++++ .../AdminCenter/PluginManagementPanel.tsx | 23 ++++++++------ 4 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py diff --git a/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py b/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py index c025880f62..6e1c349360 100644 --- a/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py +++ b/src/backend/InvenTree/plugin/base/integration/UserInterfaceMixin.py @@ -8,7 +8,7 @@ import logging logger = logging.getLogger('inventree') -class UserIterfaceMixin: +class UserInterfaceMixin: """Plugin mixin class which handles injection of custom elements into the front-end interface. - All content is accessed via the API, as requested by the user interface. diff --git a/src/backend/InvenTree/plugin/mixins/__init__.py b/src/backend/InvenTree/plugin/mixins/__init__.py index 958197511c..04a70b6bd6 100644 --- a/src/backend/InvenTree/plugin/mixins/__init__.py +++ b/src/backend/InvenTree/plugin/mixins/__init__.py @@ -14,7 +14,7 @@ from plugin.base.integration.ReportMixin import ReportMixin from plugin.base.integration.ScheduleMixin import ScheduleMixin from plugin.base.integration.SettingsMixin import SettingsMixin from plugin.base.integration.UrlsMixin import UrlsMixin -from plugin.base.integration.UserInterfaceMixin import UserIterfaceMixin +from plugin.base.integration.UserInterfaceMixin import UserInterfaceMixin from plugin.base.integration.ValidationMixin import ValidationMixin from plugin.base.label.mixins import LabelPrintingMixin from plugin.base.locate.mixins import LocateMixin @@ -32,7 +32,7 @@ __all__ = [ 'SettingsContentMixin', 'SettingsMixin', 'UrlsMixin', - 'UserIterfaceMixin', + 'UserInterfaceMixin', 'PanelMixin', 'ActionMixin', 'BarcodeMixin', diff --git a/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py b/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py new file mode 100644 index 0000000000..cbd3999ef9 --- /dev/null +++ b/src/backend/InvenTree/plugin/samples/integration/user_interface_sample.py @@ -0,0 +1,31 @@ +"""Sample plugin which demonstrates user interface integrations.""" + +from django.utils.translation import gettext_lazy as _ + +from plugin import InvenTreePlugin +from plugin.mixins import SettingsMixin, UserInterfaceMixin + + +class SampleUserInterfacePlugin(SettingsMixin, UserInterfaceMixin, InvenTreePlugin): + """A sample plugin which demonstrates user interface integrations.""" + + NAME = 'SampleUI' + SLUG = 'sampleui' + TITLE = 'Sample User Interface Plugin' + DESCRIPTION = 'A sample plugin which demonstrates user interface integrations' + VERSION = '1.0' + + SETTINGS = { + 'ENABLE_PART_PANELS': { + 'name': _('Enable Part Panels'), + 'description': _('Enable custom panels for Part views'), + 'default': True, + 'validator': bool, + }, + 'ENABLE_PURCHASE_ORDER_PANELS': { + 'name': _('Enable Purchase Order Panels'), + 'description': _('Enable custom panels for Purchase Order views'), + 'default': False, + 'validator': bool, + }, + } diff --git a/src/frontend/src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx b/src/frontend/src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx index 476b0adaf6..7dca628bcd 100644 --- a/src/frontend/src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx +++ b/src/frontend/src/pages/Index/Settings/AdminCenter/PluginManagementPanel.tsx @@ -1,12 +1,14 @@ import { Trans, t } from '@lingui/macro'; import { Accordion, Alert, Stack } from '@mantine/core'; import { IconInfoCircle } from '@tabler/icons-react'; +import { userInfo } from 'os'; import { lazy } from 'react'; import { StylishText } from '../../../../components/items/StylishText'; import { GlobalSettingList } from '../../../../components/settings/SettingList'; import { Loadable } from '../../../../functions/loading'; import { useServerApiState } from '../../../../states/ApiState'; +import { useUserState } from '../../../../states/UserState'; const PluginListTable = Loadable( lazy(() => import('../../../../tables/plugin/PluginListTable')) @@ -21,6 +23,8 @@ export default function PluginManagementPanel() { (state) => state.server.plugins_enabled ); + const user = useUserState(); + return ( {!pluginsEnabled && ( @@ -45,15 +49,6 @@ export default function PluginManagementPanel() { - - - {t`Plugin Errors`} - - - - - - {t`Plugin Settings`} @@ -73,6 +68,16 @@ export default function PluginManagementPanel() { /> + {user.isSuperuser() && ( + + + {t`Plugin Errors`} + + + + + + )} );