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 { Divider, Skeleton, Stack } from '@mantine/core';
import { Skeleton, Stack } from '@mantine/core';
import {
IconBellCog,
IconCategory,
IconClipboardList,
IconBox,
IconBuildingFactory2,
IconCurrencyDollar,
IconFileAnalytics,
IconFingerprint,
@@ -13,10 +13,7 @@ import {
IconQrcode,
IconServerCog,
IconShoppingCart,
IconTag,
IconTools,
IconTruckDelivery,
IconTruckReturn
IconTruckDelivery
} from '@tabler/icons-react';
import { lazy, useMemo } from 'react';
@@ -81,25 +78,32 @@ export default function SystemSettings() {
label: t`Authentication`,
icon: <IconFingerprint />,
content: (
<GlobalSettingList
keys={[
'LOGIN_ENABLE_PWD_FORGOT',
'LOGIN_MAIL_REQUIRED',
'LOGIN_ENFORCE_MFA',
'LOGIN_ENABLE_REG',
'LOGIN_SIGNUP_MAIL_TWICE',
'LOGIN_SIGNUP_PWD_TWICE',
'SIGNUP_GROUP',
'LOGIN_SIGNUP_MAIL_RESTRICTION',
'LOGIN_ENABLE_SSO',
'LOGIN_ENABLE_SSO_REG',
'LOGIN_SIGNUP_SSO_AUTO',
'LOGIN_ENABLE_SSO_GROUP_SYNC',
'SSO_GROUP_MAP',
'SSO_GROUP_KEY',
'SSO_REMOVE_GROUPS'
]}
/>
<Stack gap='xs'>
<GlobalSettingList
keys={[
'LOGIN_ENABLE_PWD_FORGOT',
'LOGIN_MAIL_REQUIRED',
'LOGIN_ENFORCE_MFA',
'LOGIN_ENABLE_REG',
'LOGIN_SIGNUP_MAIL_TWICE',
'LOGIN_SIGNUP_PWD_TWICE'
]}
/>
<GlobalSettingList
heading={t`Single Sign-On (SSO) Settings`}
keys={[
'LOGIN_ENABLE_SSO',
'LOGIN_ENABLE_SSO_REG',
'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',
label: t`Reporting`,
@@ -184,7 +182,9 @@ export default function SystemSettings() {
'REPORT_ENABLE',
'REPORT_DEFAULT_PAGE_SIZE',
'REPORT_DEBUG_MODE',
'REPORT_LOG_ERRORS'
'REPORT_LOG_ERRORS',
'LABEL_ENABLE',
'LABEL_DPI'
]}
/>
)
@@ -198,67 +198,72 @@ export default function SystemSettings() {
{
name: 'parts',
label: t`Parts`,
icon: <IconCategory />,
icon: <IconBox />,
content: (
<GlobalSettingList
keys={[
'PART_NAME_FORMAT',
'PART_IPN_REGEX',
'PART_ALLOW_DUPLICATE_IPN',
'PART_ALLOW_EDIT_IPN',
'PART_ALLOW_DELETE_FROM_ASSEMBLY',
'PART_ENABLE_REVISION',
'PART_REVISION_ASSEMBLY_ONLY',
'PART_SHOW_RELATED',
'PART_CREATE_INITIAL',
'PART_CREATE_SUPPLIER',
'PART_TEMPLATE',
'PART_ASSEMBLY',
'PART_COMPONENT',
'PART_TRACKABLE',
'PART_PURCHASEABLE',
'PART_SALABLE',
'PART_VIRTUAL',
'PART_COPY_BOM',
'PART_BOM_ALLOW_ZERO_QUANTITY',
'PART_COPY_PARAMETERS',
'PART_COPY_TESTS',
'PART_CATEGORY_PARAMETERS',
'PART_CATEGORY_DEFAULT_ICON'
]}
/>
<Stack gap='xs'>
<GlobalSettingList
keys={[
'PART_NAME_FORMAT',
'PART_IPN_REGEX',
'PART_ALLOW_DUPLICATE_IPN',
'PART_ALLOW_EDIT_IPN',
'PART_ALLOW_DELETE_FROM_ASSEMBLY',
'PART_ENABLE_REVISION',
'PART_REVISION_ASSEMBLY_ONLY',
'PART_SHOW_RELATED',
'PART_BOM_ALLOW_ZERO_QUANTITY',
'PART_CATEGORY_DEFAULT_ICON'
]}
/>
<GlobalSettingList
heading={t`Part Creation`}
keys={[
'PART_CREATE_INITIAL',
'PART_CREATE_SUPPLIER',
'PART_TEMPLATE',
'PART_ASSEMBLY',
'PART_COMPONENT',
'PART_TRACKABLE',
'PART_PURCHASEABLE',
'PART_SALABLE',
'PART_VIRTUAL',
'PART_COPY_BOM',
'PART_COPY_PARAMETERS',
'PART_COPY_TESTS',
'PART_CATEGORY_PARAMETERS'
]}
/>
</Stack>
)
},
{
name: 'stock',
label: t`Stock`,
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: (
<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
heading={t`Part Stocktake`}
keys={[
@@ -269,7 +274,6 @@ export default function SystemSettings() {
'STOCKTAKE_DELETE_DAYS'
]}
/>
<Divider />
<GlobalSettingList
heading={t`Stock Tracking`}
keys={[
@@ -281,11 +285,12 @@ export default function SystemSettings() {
)
},
{
name: 'buildorders',
label: t`Build Orders`,
icon: <IconTools />,
name: 'manufacturing',
label: t`Manufacturing`,
icon: <IconBuildingFactory2 />,
content: (
<GlobalSettingList
heading={t`Build Orders`}
keys={[
'BUILDORDER_REFERENCE_PATTERN',
'BUILDORDER_EXTERNAL_BUILDS',
@@ -300,11 +305,12 @@ export default function SystemSettings() {
)
},
{
name: 'purchaseorders',
label: t`Purchase Orders`,
name: 'purchasing',
label: t`Purchasing`,
icon: <IconShoppingCart />,
content: (
<GlobalSettingList
heading={t`Purchase Orders`}
keys={[
'PURCHASEORDER_REFERENCE_PATTERN',
'PURCHASEORDER_REQUIRE_RESPONSIBLE',
@@ -316,40 +322,37 @@ export default function SystemSettings() {
)
},
{
name: 'salesorders',
label: t`Sales Orders`,
name: 'sales',
label: t`Sales`,
icon: <IconTruckDelivery />,
content: (
<GlobalSettingList
keys={[
'SALESORDER_REFERENCE_PATTERN',
'SALESORDER_REQUIRE_RESPONSIBLE',
'SALESORDER_DEFAULT_SHIPMENT',
'SALESORDER_EDIT_COMPLETED_ORDERS',
'SALESORDER_SHIP_COMPLETE',
'SALESORDER_SHIPMENT_REQUIRES_CHECK'
]}
/>
)
},
{
name: 'returnorders',
label: t`Return Orders`,
icon: <IconTruckReturn />,
content: (
<GlobalSettingList
keys={[
'RETURNORDER_ENABLED',
'RETURNORDER_REFERENCE_PATTERN',
'RETURNORDER_REQUIRE_RESPONSIBLE',
'RETURNORDER_EDIT_COMPLETED_ORDERS'
]}
/>
<Stack gap='xs'>
<GlobalSettingList
heading={t`Sales Orders`}
keys={[
'SALESORDER_REFERENCE_PATTERN',
'SALESORDER_REQUIRE_RESPONSIBLE',
'SALESORDER_DEFAULT_SHIPMENT',
'SALESORDER_EDIT_COMPLETED_ORDERS',
'SALESORDER_SHIP_COMPLETE',
'SALESORDER_SHIPMENT_REQUIRES_CHECK'
]}
/>
<GlobalSettingList
heading={t`Return Orders`}
keys={[
'RETURNORDER_ENABLED',
'RETURNORDER_REFERENCE_PATTERN',
'RETURNORDER_REQUIRE_RESPONSIBLE',
'RETURNORDER_EDIT_COMPLETED_ORDERS'
]}
/>
</Stack>
)
},
{
name: 'plugins',
label: t`Plugin Settings`,
label: t`Plugins`,
icon: <IconPlugConnected />,
content: <PluginSettingsGroup global={true} />
}
+6 -8
View File
@@ -178,7 +178,6 @@ test('Settings - Global', async ({ browser }) => {
await loadTab(page, 'Pricing');
await loadTab(page, 'Parts');
await loadTab(page, 'Stock', true);
await loadTab(page, 'Stock History');
await loadTab(page, 'Notifications');
await page
@@ -195,7 +194,7 @@ test('Settings - Global', async ({ browser }) => {
.getByText('URL that is used to send messages to a slack channel')
.waitFor();
await loadTab(page, 'Plugin Settings');
await loadTab(page, 'Plugins');
await page
.getByText('The settings below are specific to each available plugin')
.waitFor();
@@ -236,13 +235,12 @@ test('Settings - Admin', async ({ browser }) => {
await loadTab(page, 'Barcodes');
await loadTab(page, 'Notifications');
await loadTab(page, 'Pricing');
await loadTab(page, 'Labels');
await loadTab(page, 'Reporting');
await loadTab(page, 'Build Orders');
await loadTab(page, 'Purchase Orders');
await loadTab(page, 'Sales Orders');
await loadTab(page, 'Return Orders');
await loadTab(page, 'Parts');
await loadTab(page, 'Stock');
await loadTab(page, 'Manufacturing');
await loadTab(page, 'Purchasing');
await loadTab(page, 'Sales');
// Admin Center
await page.getByRole('button', { name: 'admin' }).click();