2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-07-02 19:50:59 +00:00

[Feature] Override global settings (#9718)

* Provide mechanism for config to override global settings

* Ensure overrides are observed on save

* Refactor

* Add "read_only" field to serializer

* Prevent editing for read_only settings

* Bump API version

* Update docs

* Secure logs

* Override applies to default_value

* override get_setting method

* Add unit test

* Utilize new approach to override SITE_URL

* Docs updates

* Docs tweaks

* Shortcut for get_global_setting

* Remove previous change

- Allow validation to be performed within the InvenTreeSetting class

* Override INVENTREE_BASE_URL setting

* Handle error on worker boot

* Tweak unit test
This commit is contained in:
Oliver
2025-06-07 20:08:34 +10:00
committed by GitHub
parent 12677ccf22
commit 4b71130ebe
14 changed files with 178 additions and 23 deletions

View File

@ -33,6 +33,7 @@ export interface Setting {
plugin?: string;
method?: string;
required?: boolean;
read_only?: boolean;
}
export interface SettingChoice {

View File

@ -9,7 +9,7 @@ import {
useMantineColorScheme
} from '@mantine/core';
import { IconEdit } from '@tabler/icons-react';
import { useEffect, useMemo, useState } from 'react';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { ModelInformationDict } from '@lib/enums/ModelInformation';
import { ModelType } from '@lib/enums/ModelType';
@ -51,6 +51,23 @@ function SettingValue({
const [modelInstance, setModelInstance] = useState<any>(null);
// Launch the edit dialog for this setting
const editSetting = useCallback(() => {
if (!setting.read_only) {
onEdit(setting);
}
}, [setting, onEdit]);
// Toggle the setting value (if it is a boolean)
const toggleSetting = useCallback(
(event: any) => {
if (!setting.read_only) {
onToggle(setting, event.currentTarget.checked);
}
},
[setting, onToggle]
);
// Does this setting map to an internal database model?
const modelType: ModelType | null = useMemo(() => {
if (setting.model_name) {
@ -89,7 +106,8 @@ function SettingValue({
<Button
aria-label={`edit-setting-${setting.key}`}
variant='subtle'
onClick={() => onEdit(setting)}
disabled={setting.read_only}
onClick={editSetting}
>
<IconEdit />
</Button>
@ -104,8 +122,9 @@ function SettingValue({
size='sm'
radius='lg'
aria-label={`toggle-setting-${setting.key}`}
disabled={setting.read_only}
checked={setting.value.toLowerCase() == 'true'}
onChange={(event) => onToggle(setting, event.currentTarget.checked)}
onChange={toggleSetting}
style={{
paddingRight: '20px'
}}
@ -118,7 +137,8 @@ function SettingValue({
<Button
aria-label={`edit-setting-${setting.key}`}
variant='subtle'
onClick={() => onEdit(setting)}
disabled={setting.read_only}
onClick={editSetting}
>
{valueText}
</Button>
@ -127,7 +147,8 @@ function SettingValue({
<Button
aria-label={`edit-setting-${setting.key}`}
variant='subtle'
onClick={() => onEdit(setting)}
disabled={setting.read_only}
onClick={editSetting}
>
<IconEdit />
</Button>