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:
@ -33,6 +33,7 @@ export interface Setting {
|
||||
plugin?: string;
|
||||
method?: string;
|
||||
required?: boolean;
|
||||
read_only?: boolean;
|
||||
}
|
||||
|
||||
export interface SettingChoice {
|
||||
|
@ -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>
|
||||
|
Reference in New Issue
Block a user