2
0
mirror of https://github.com/inventree/InvenTree.git synced 2026-04-28 13:54:25 +00:00

[UI] Adjust system settings (#11808)

* Adjust system settings

- Rearrange settings to match major menu groups
- Split long settings panels into separate lists

Co-authored-by: Copilot <copilot@github.com>

* Adjust playwright tests

---------

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Oliver
2026-04-26 15:46:05 +10:00
committed by GitHub
parent 594b6e09b3
commit b8f13b8aa9
2 changed files with 128 additions and 127 deletions
@@ -1,9 +1,9 @@
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { Divider, Skeleton, Stack } from '@mantine/core'; import { Skeleton, Stack } from '@mantine/core';
import { import {
IconBellCog, IconBellCog,
IconCategory, IconBox,
IconClipboardList, IconBuildingFactory2,
IconCurrencyDollar, IconCurrencyDollar,
IconFileAnalytics, IconFileAnalytics,
IconFingerprint, IconFingerprint,
@@ -13,10 +13,7 @@ import {
IconQrcode, IconQrcode,
IconServerCog, IconServerCog,
IconShoppingCart, IconShoppingCart,
IconTag, IconTruckDelivery
IconTools,
IconTruckDelivery,
IconTruckReturn
} from '@tabler/icons-react'; } from '@tabler/icons-react';
import { lazy, useMemo } from 'react'; import { lazy, useMemo } from 'react';
@@ -81,25 +78,32 @@ export default function SystemSettings() {
label: t`Authentication`, label: t`Authentication`,
icon: <IconFingerprint />, icon: <IconFingerprint />,
content: ( content: (
<GlobalSettingList <Stack gap='xs'>
keys={[ <GlobalSettingList
'LOGIN_ENABLE_PWD_FORGOT', keys={[
'LOGIN_MAIL_REQUIRED', 'LOGIN_ENABLE_PWD_FORGOT',
'LOGIN_ENFORCE_MFA', 'LOGIN_MAIL_REQUIRED',
'LOGIN_ENABLE_REG', 'LOGIN_ENFORCE_MFA',
'LOGIN_SIGNUP_MAIL_TWICE', 'LOGIN_ENABLE_REG',
'LOGIN_SIGNUP_PWD_TWICE', 'LOGIN_SIGNUP_MAIL_TWICE',
'SIGNUP_GROUP', 'LOGIN_SIGNUP_PWD_TWICE'
'LOGIN_SIGNUP_MAIL_RESTRICTION', ]}
'LOGIN_ENABLE_SSO', />
'LOGIN_ENABLE_SSO_REG', <GlobalSettingList
'LOGIN_SIGNUP_SSO_AUTO', heading={t`Single Sign-On (SSO) Settings`}
'LOGIN_ENABLE_SSO_GROUP_SYNC', keys={[
'SSO_GROUP_MAP', 'LOGIN_ENABLE_SSO',
'SSO_GROUP_KEY', 'LOGIN_ENABLE_SSO_REG',
'SSO_REMOVE_GROUPS' 'LOGIN_SIGNUP_SSO_AUTO',
]} 'LOGIN_ENABLE_SSO_GROUP_SYNC',
/> 'SSO_GROUP_MAP',
'SSO_GROUP_KEY',
'SSO_REMOVE_GROUPS',
'SIGNUP_GROUP',
'LOGIN_SIGNUP_MAIL_RESTRICTION'
]}
/>
</Stack>
) )
}, },
{ {
@@ -168,12 +172,6 @@ export default function SystemSettings() {
</> </>
) )
}, },
{
name: 'labels',
label: t`Labels`,
icon: <IconTag />,
content: <GlobalSettingList keys={['LABEL_ENABLE', 'LABEL_DPI']} />
},
{ {
name: 'reporting', name: 'reporting',
label: t`Reporting`, label: t`Reporting`,
@@ -184,7 +182,9 @@ export default function SystemSettings() {
'REPORT_ENABLE', 'REPORT_ENABLE',
'REPORT_DEFAULT_PAGE_SIZE', 'REPORT_DEFAULT_PAGE_SIZE',
'REPORT_DEBUG_MODE', 'REPORT_DEBUG_MODE',
'REPORT_LOG_ERRORS' 'REPORT_LOG_ERRORS',
'LABEL_ENABLE',
'LABEL_DPI'
]} ]}
/> />
) )
@@ -198,67 +198,72 @@ export default function SystemSettings() {
{ {
name: 'parts', name: 'parts',
label: t`Parts`, label: t`Parts`,
icon: <IconCategory />, icon: <IconBox />,
content: ( content: (
<GlobalSettingList <Stack gap='xs'>
keys={[ <GlobalSettingList
'PART_NAME_FORMAT', keys={[
'PART_IPN_REGEX', 'PART_NAME_FORMAT',
'PART_ALLOW_DUPLICATE_IPN', 'PART_IPN_REGEX',
'PART_ALLOW_EDIT_IPN', 'PART_ALLOW_DUPLICATE_IPN',
'PART_ALLOW_DELETE_FROM_ASSEMBLY', 'PART_ALLOW_EDIT_IPN',
'PART_ENABLE_REVISION', 'PART_ALLOW_DELETE_FROM_ASSEMBLY',
'PART_REVISION_ASSEMBLY_ONLY', 'PART_ENABLE_REVISION',
'PART_SHOW_RELATED', 'PART_REVISION_ASSEMBLY_ONLY',
'PART_CREATE_INITIAL', 'PART_SHOW_RELATED',
'PART_CREATE_SUPPLIER', 'PART_BOM_ALLOW_ZERO_QUANTITY',
'PART_TEMPLATE', 'PART_CATEGORY_DEFAULT_ICON'
'PART_ASSEMBLY', ]}
'PART_COMPONENT', />
'PART_TRACKABLE', <GlobalSettingList
'PART_PURCHASEABLE', heading={t`Part Creation`}
'PART_SALABLE', keys={[
'PART_VIRTUAL', 'PART_CREATE_INITIAL',
'PART_COPY_BOM', 'PART_CREATE_SUPPLIER',
'PART_BOM_ALLOW_ZERO_QUANTITY', 'PART_TEMPLATE',
'PART_COPY_PARAMETERS', 'PART_ASSEMBLY',
'PART_COPY_TESTS', 'PART_COMPONENT',
'PART_CATEGORY_PARAMETERS', 'PART_TRACKABLE',
'PART_CATEGORY_DEFAULT_ICON' 'PART_PURCHASEABLE',
]} 'PART_SALABLE',
/> 'PART_VIRTUAL',
'PART_COPY_BOM',
'PART_COPY_PARAMETERS',
'PART_COPY_TESTS',
'PART_CATEGORY_PARAMETERS'
]}
/>
</Stack>
) )
}, },
{ {
name: 'stock', name: 'stock',
label: t`Stock`, label: t`Stock`,
icon: <IconPackages />, icon: <IconPackages />,
content: (
<GlobalSettingList
keys={[
'SERIAL_NUMBER_GLOBALLY_UNIQUE',
'STOCK_DELETE_DEPLETED_DEFAULT',
'STOCK_BATCH_CODE_TEMPLATE',
'STOCK_ENABLE_EXPIRY',
'STOCK_STALE_DAYS',
'STOCK_ALLOW_EXPIRED_SALE',
'STOCK_ALLOW_EXPIRED_BUILD',
'STOCK_OWNERSHIP_CONTROL',
'STOCK_LOCATION_DEFAULT_ICON',
'STOCK_SHOW_INSTALLED_ITEMS',
'STOCK_ENFORCE_BOM_INSTALLATION',
'STOCK_ALLOW_OUT_OF_STOCK_TRANSFER',
'TEST_STATION_DATA'
]}
/>
)
},
{
name: 'stock-history',
label: t`Stock History`,
icon: <IconClipboardList />,
content: ( content: (
<Stack gap='xs'> <Stack gap='xs'>
<GlobalSettingList
keys={[
'SERIAL_NUMBER_GLOBALLY_UNIQUE',
'STOCK_DELETE_DEPLETED_DEFAULT',
'STOCK_BATCH_CODE_TEMPLATE',
'STOCK_OWNERSHIP_CONTROL',
'STOCK_LOCATION_DEFAULT_ICON',
'STOCK_SHOW_INSTALLED_ITEMS',
'STOCK_ENFORCE_BOM_INSTALLATION',
'STOCK_ALLOW_OUT_OF_STOCK_TRANSFER',
'TEST_STATION_DATA'
]}
/>
<GlobalSettingList
heading={t`Stock Expiry`}
keys={[
'STOCK_ENABLE_EXPIRY',
'STOCK_STALE_DAYS',
'STOCK_ALLOW_EXPIRED_SALE',
'STOCK_ALLOW_EXPIRED_BUILD'
]}
/>
<GlobalSettingList <GlobalSettingList
heading={t`Part Stocktake`} heading={t`Part Stocktake`}
keys={[ keys={[
@@ -269,7 +274,6 @@ export default function SystemSettings() {
'STOCKTAKE_DELETE_DAYS' 'STOCKTAKE_DELETE_DAYS'
]} ]}
/> />
<Divider />
<GlobalSettingList <GlobalSettingList
heading={t`Stock Tracking`} heading={t`Stock Tracking`}
keys={[ keys={[
@@ -281,11 +285,12 @@ export default function SystemSettings() {
) )
}, },
{ {
name: 'buildorders', name: 'manufacturing',
label: t`Build Orders`, label: t`Manufacturing`,
icon: <IconTools />, icon: <IconBuildingFactory2 />,
content: ( content: (
<GlobalSettingList <GlobalSettingList
heading={t`Build Orders`}
keys={[ keys={[
'BUILDORDER_REFERENCE_PATTERN', 'BUILDORDER_REFERENCE_PATTERN',
'BUILDORDER_EXTERNAL_BUILDS', 'BUILDORDER_EXTERNAL_BUILDS',
@@ -300,11 +305,12 @@ export default function SystemSettings() {
) )
}, },
{ {
name: 'purchaseorders', name: 'purchasing',
label: t`Purchase Orders`, label: t`Purchasing`,
icon: <IconShoppingCart />, icon: <IconShoppingCart />,
content: ( content: (
<GlobalSettingList <GlobalSettingList
heading={t`Purchase Orders`}
keys={[ keys={[
'PURCHASEORDER_REFERENCE_PATTERN', 'PURCHASEORDER_REFERENCE_PATTERN',
'PURCHASEORDER_REQUIRE_RESPONSIBLE', 'PURCHASEORDER_REQUIRE_RESPONSIBLE',
@@ -316,40 +322,37 @@ export default function SystemSettings() {
) )
}, },
{ {
name: 'salesorders', name: 'sales',
label: t`Sales Orders`, label: t`Sales`,
icon: <IconTruckDelivery />, icon: <IconTruckDelivery />,
content: ( content: (
<GlobalSettingList <Stack gap='xs'>
keys={[ <GlobalSettingList
'SALESORDER_REFERENCE_PATTERN', heading={t`Sales Orders`}
'SALESORDER_REQUIRE_RESPONSIBLE', keys={[
'SALESORDER_DEFAULT_SHIPMENT', 'SALESORDER_REFERENCE_PATTERN',
'SALESORDER_EDIT_COMPLETED_ORDERS', 'SALESORDER_REQUIRE_RESPONSIBLE',
'SALESORDER_SHIP_COMPLETE', 'SALESORDER_DEFAULT_SHIPMENT',
'SALESORDER_SHIPMENT_REQUIRES_CHECK' 'SALESORDER_EDIT_COMPLETED_ORDERS',
]} 'SALESORDER_SHIP_COMPLETE',
/> 'SALESORDER_SHIPMENT_REQUIRES_CHECK'
) ]}
}, />
{ <GlobalSettingList
name: 'returnorders', heading={t`Return Orders`}
label: t`Return Orders`, keys={[
icon: <IconTruckReturn />, 'RETURNORDER_ENABLED',
content: ( 'RETURNORDER_REFERENCE_PATTERN',
<GlobalSettingList 'RETURNORDER_REQUIRE_RESPONSIBLE',
keys={[ 'RETURNORDER_EDIT_COMPLETED_ORDERS'
'RETURNORDER_ENABLED', ]}
'RETURNORDER_REFERENCE_PATTERN', />
'RETURNORDER_REQUIRE_RESPONSIBLE', </Stack>
'RETURNORDER_EDIT_COMPLETED_ORDERS'
]}
/>
) )
}, },
{ {
name: 'plugins', name: 'plugins',
label: t`Plugin Settings`, label: t`Plugins`,
icon: <IconPlugConnected />, icon: <IconPlugConnected />,
content: <PluginSettingsGroup global={true} /> content: <PluginSettingsGroup global={true} />
} }
+6 -8
View File
@@ -178,7 +178,6 @@ test('Settings - Global', async ({ browser }) => {
await loadTab(page, 'Pricing'); await loadTab(page, 'Pricing');
await loadTab(page, 'Parts'); await loadTab(page, 'Parts');
await loadTab(page, 'Stock', true); await loadTab(page, 'Stock', true);
await loadTab(page, 'Stock History');
await loadTab(page, 'Notifications'); await loadTab(page, 'Notifications');
await page await page
@@ -195,7 +194,7 @@ test('Settings - Global', async ({ browser }) => {
.getByText('URL that is used to send messages to a slack channel') .getByText('URL that is used to send messages to a slack channel')
.waitFor(); .waitFor();
await loadTab(page, 'Plugin Settings'); await loadTab(page, 'Plugins');
await page await page
.getByText('The settings below are specific to each available plugin') .getByText('The settings below are specific to each available plugin')
.waitFor(); .waitFor();
@@ -236,13 +235,12 @@ test('Settings - Admin', async ({ browser }) => {
await loadTab(page, 'Barcodes'); await loadTab(page, 'Barcodes');
await loadTab(page, 'Notifications'); await loadTab(page, 'Notifications');
await loadTab(page, 'Pricing'); await loadTab(page, 'Pricing');
await loadTab(page, 'Labels');
await loadTab(page, 'Reporting'); await loadTab(page, 'Reporting');
await loadTab(page, 'Parts');
await loadTab(page, 'Build Orders'); await loadTab(page, 'Stock');
await loadTab(page, 'Purchase Orders'); await loadTab(page, 'Manufacturing');
await loadTab(page, 'Sales Orders'); await loadTab(page, 'Purchasing');
await loadTab(page, 'Return Orders'); await loadTab(page, 'Sales');
// Admin Center // Admin Center
await page.getByRole('button', { name: 'admin' }).click(); await page.getByRole('button', { name: 'admin' }).click();