2
0
mirror of https://github.com/inventree/InvenTree.git synced 2026-06-09 18:34:26 +00:00

Merge branch 'master' of https://github.com/inventree/InvenTree into dependabot/pip/docs/gitpython-3.1.50

This commit is contained in:
Matthias Mair
2026-05-09 14:17:07 +02:00
88 changed files with 42896 additions and 41028 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -6,8 +6,6 @@ from django.db import migrations, models
def add_integer_line_number(apps, schema_editor): def add_integer_line_number(apps, schema_editor):
"""Add integer line numbers to existing line items.""" """Add integer line numbers to existing line items."""
print("\nUpdating line items to add integer line numbers:")
for model in [ for model in [
apps.get_model('order', 'PurchaseOrderLineItem'), apps.get_model('order', 'PurchaseOrderLineItem'),
apps.get_model('order', 'ReturnOrderLineItem'), apps.get_model('order', 'ReturnOrderLineItem'),
@@ -27,7 +25,7 @@ def add_integer_line_number(apps, schema_editor):
pass pass
if len(items) > 0: if len(items) > 0:
print(f"- Updating {len(items)} items for model {model._meta.model_name}") print(f"- Updating {len(items)} line items for model {model._meta.model_name}")
model.objects.bulk_update(items, ['line_int'], batch_size=250) model.objects.bulk_update(items, ['line_int'], batch_size=250)
+3
View File
@@ -29,3 +29,6 @@ dist-ssr
/playwright/.cache/ /playwright/.cache/
/.nyc_output/ /.nyc_output/
/coverage/ /coverage/
# Report generation
stats.html
@@ -1,8 +1,14 @@
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { IconCode } from '@tabler/icons-react'; import { IconCode } from '@tabler/icons-react';
import { lazy } from 'react';
import type { Editor } from '../TemplateEditor'; import type { Editor } from '../TemplateEditor';
import { CodeEditorComponent } from './CodeEditor';
const CodeEditorComponent = lazy(() =>
import('./CodeEditor').then((module) => ({
default: module.CodeEditorComponent
}))
);
export const CodeEditor: Editor = { export const CodeEditor: Editor = {
key: 'code', key: 'code',
@@ -1,8 +1,14 @@
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { IconFileTypePdf } from '@tabler/icons-react'; import { IconFileTypePdf } from '@tabler/icons-react';
import { lazy } from 'react';
import type { PreviewArea } from '../TemplateEditor'; import type { PreviewArea } from '../TemplateEditor';
import { PdfPreviewComponent } from './PdfPreview';
const PdfPreviewComponent = lazy(() =>
import('./PdfPreview').then((module) => ({
default: module.PdfPreviewComponent
}))
);
export const PdfPreview: PreviewArea = { export const PdfPreview: PreviewArea = {
key: 'pdf-preview', key: 'pdf-preview',
@@ -3,10 +3,12 @@ import { Skeleton } from '@mantine/core';
import { IconNotes } from '@tabler/icons-react'; import { IconNotes } from '@tabler/icons-react';
import type { ModelType } from '@lib/enums/ModelType'; import type { ModelType } from '@lib/enums/ModelType';
import { lazy } from 'react';
import { useUserState } from '../../states/UserState'; import { useUserState } from '../../states/UserState';
import NotesEditor from '../editors/NotesEditor';
import type { PanelType } from './Panel'; import type { PanelType } from './Panel';
const NotesEditor = lazy(() => import('../editors/NotesEditor'));
export default function NotesPanel({ export default function NotesPanel({
model_type, model_type,
model_id, model_id,
+23 -5
View File
@@ -9,15 +9,33 @@ import { ModalsProvider } from '@mantine/modals';
import { Notifications } from '@mantine/notifications'; import { Notifications } from '@mantine/notifications';
import { ContextMenuProvider } from 'mantine-contextmenu'; import { ContextMenuProvider } from 'mantine-contextmenu';
import { useShallow } from 'zustand/react/shallow'; import { useShallow } from 'zustand/react/shallow';
import { AboutInvenTreeModal } from '../components/modals/AboutInvenTreeModal';
import { LicenseModal } from '../components/modals/LicenseModal';
import { QrModal } from '../components/modals/QrModal';
import { ServerInfoModal } from '../components/modals/ServerInfoModal';
import { useLocalState } from '../states/LocalState'; import { useLocalState } from '../states/LocalState';
import { LanguageContext } from './LanguageContext'; import { LanguageContext } from './LanguageContext';
import { colorSchema } from './colorSchema'; import { colorSchema } from './colorSchema';
import type { JSX } from 'react'; // Lazy load the various modal dialogs - they are not needed immediately, and this can help to reduce the initial bundle size
const AboutInvenTreeModal = lazy(() =>
import('../components/modals/AboutInvenTreeModal').then((module) => ({
default: module.AboutInvenTreeModal
}))
);
const LicenseModal = lazy(() =>
import('../components/modals/LicenseModal').then((module) => ({
default: module.LicenseModal
}))
);
const QrModal = lazy(() =>
import('../components/modals/QrModal').then((module) => ({
default: module.QrModal
}))
);
const ServerInfoModal = lazy(() =>
import('../components/modals/ServerInfoModal').then((module) => ({
default: module.ServerInfoModal
}))
);
import { type JSX, lazy } from 'react';
export function ThemeContext({ export function ThemeContext({
children children
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+16 -19
View File
@@ -9,20 +9,22 @@ import 'mantine-contextmenu/styles.css';
import 'mantine-datatable/styles.css'; import 'mantine-datatable/styles.css';
import 'react-grid-layout/css/styles.css'; import 'react-grid-layout/css/styles.css';
import 'react-resizable/css/styles.css'; import 'react-resizable/css/styles.css';
import * as MantineCore from '@mantine/core';
import * as MantineNotifications from '@mantine/notifications';
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import * as ReactDOMClient from 'react-dom/client';
import './styles/overrides.css';
// Lingui imports (required for plugin translation) import type * as LinguiCore from '@lingui/core';
import * as LinguiCore from '@lingui/core'; import type * as LinguiReact from '@lingui/react';
import * as LinguiReact from '@lingui/react'; // Global types to be exported for use in plugins
import type * as MantineCore from '@mantine/core';
import type * as MantineNotifications from '@mantine/notifications';
import * as React from 'react';
import type * as ReactDOM from 'react-dom';
import * as ReactDOMClient from 'react-dom/client';
import './styles/overrides.css';
import { getBaseUrl } from '@lib/functions/Navigation'; import { getBaseUrl } from '@lib/functions/Navigation';
import type { HostList } from '@lib/types/Server'; import type { HostList } from '@lib/types/Server';
import MainView from './views/MainView'; import MainView from './views/MainView';
import { loadWindowGlobals } from './window';
// define settings // define settings
declare global { declare global {
@@ -43,6 +45,8 @@ declare global {
ReactDOMClient: typeof ReactDOMClient; ReactDOMClient: typeof ReactDOMClient;
MantineCore: typeof MantineCore; MantineCore: typeof MantineCore;
MantineNotifications: typeof MantineNotifications; MantineNotifications: typeof MantineNotifications;
LinguiCore: typeof LinguiCore;
LinguiReact: typeof LinguiReact;
} }
} }
@@ -106,16 +110,6 @@ if (window.INVENTREE_SETTINGS.sentry_dsn) {
environment: window.INVENTREE_SETTINGS.environment || 'default' environment: window.INVENTREE_SETTINGS.environment || 'default'
}); });
} }
// Expose global objects for the plugin system
(window as any).React = React;
(window as any).ReactDOM = ReactDOM;
(window as any).ReactDOMClient = ReactDOMClient;
(window as any).MantineCore = MantineCore;
(window as any).MantineNotifications = MantineNotifications;
(window as any).LinguiCore = LinguiCore;
(window as any).LinguiReact = LinguiReact;
// Redirect to base url if on / // Redirect to base url if on /
if (window.location.pathname === '/') { if (window.location.pathname === '/') {
window.location.replace(`/${getBaseUrl()}`); window.location.replace(`/${getBaseUrl()}`);
@@ -128,3 +122,6 @@ ReactDOMClient.createRoot(
<MainView /> <MainView />
</React.StrictMode> </React.StrictMode>
); );
// Load globals onto the window object, so that they can be accessed by plugins without requiring direct imports
loadWindowGlobals();
@@ -2,7 +2,13 @@ import { YesNoButton } from '@lib/components/YesNoButton';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints'; import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { ModelType } from '@lib/enums/ModelType'; import { ModelType } from '@lib/enums/ModelType';
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { TemplateTable } from '../../../../tables/settings/TemplateTable'; import { lazy } from 'react';
const TemplateTable = lazy(() =>
import('../../../../tables/settings/TemplateTable').then((module) => ({
default: module.TemplateTable
}))
);
function ReportTemplateTable() { function ReportTemplateTable() {
return ( return (
+38
View File
@@ -0,0 +1,38 @@
/**
* Expose certain globals to the window object, so that they can be accessed by plugins,
* without requiring plugins to import these dependencies directly.
*/
export function loadWindowGlobals() {
// (window as any).React = React;
import('react').then((module) => {
window.React = module;
});
// (window as any).ReactDOM = ReactDOM;
import('react-dom').then((module) => {
window.ReactDOM = module;
});
// (window as any).ReactDOMClient = ReactDOMClient;
import('react-dom/client').then((module) => {
window.ReactDOMClient = module;
});
// (window as any).MantineCore = MantineCore;
import('@mantine/core').then((module) => {
window.MantineCore = module;
});
// (window as any).MantineNotifications = MantineNotifications;
import('@mantine/notifications').then((module) => {
window.MantineNotifications = module;
});
import('@lingui/core').then((module) => {
window.LinguiCore = module;
});
import('@lingui/react').then((module) => {
window.LinguiReact = module;
});
}
+3 -3
View File
@@ -3139,9 +3139,9 @@ fast-equals@^4.0.3:
integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg== integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==
fast-uri@^3.0.1: fast-uri@^3.0.1:
version "3.1.0" version "3.1.2"
resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec"
integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==
fdir@^6.4.3, fdir@^6.4.4, fdir@^6.5.0: fdir@^6.4.3, fdir@^6.4.4, fdir@^6.5.0:
version "6.5.0" version "6.5.0"