2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 11:36:44 +00:00

[PUI] Updates for AdminButton (#8434)

* [PUI] Updates for AdminButton

- Hide if django admin interface is disabled
- Use correct admin URL

* Adjust InfoView

* Add playwright tests
This commit is contained in:
Oliver 2024-11-06 09:27:43 +11:00 committed by GitHub
parent 93a8090e99
commit 245803b0d4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 32 additions and 6 deletions

View File

@ -236,6 +236,9 @@ class InfoView(AjaxView):
'platform': InvenTree.version.inventreePlatform() if is_staff else None, 'platform': InvenTree.version.inventreePlatform() if is_staff else None,
'installer': InvenTree.version.inventreeInstaller() if is_staff else None, 'installer': InvenTree.version.inventreeInstaller() if is_staff else None,
'target': InvenTree.version.inventreeTarget() if is_staff else None, 'target': InvenTree.version.inventreeTarget() if is_staff else None,
'django_admin': settings.INVENTREE_ADMIN_URL
if (is_staff and settings.INVENTREE_ADMIN_ENABLED)
else None,
} }
return JsonResponse(data) return JsonResponse(data)

View File

@ -39,7 +39,8 @@ export default defineConfig({
command: 'invoke dev.server -a 127.0.0.1:8000', command: 'invoke dev.server -a 127.0.0.1:8000',
env: { env: {
INVENTREE_DEBUG: 'True', INVENTREE_DEBUG: 'True',
INVENTREE_PLUGINS_ENABLED: 'True' INVENTREE_PLUGINS_ENABLED: 'True',
INVENTREE_ADMIN_URL: 'test-admin'
}, },
url: 'http://127.0.0.1:8000/api/', url: 'http://127.0.0.1:8000/api/',
reuseExistingServer: !process.env.CI, reuseExistingServer: !process.env.CI,

View File

@ -3,6 +3,7 @@ import { IconUserStar } from '@tabler/icons-react';
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import { ModelType } from '../../enums/ModelType'; import { ModelType } from '../../enums/ModelType';
import { useServerApiState } from '../../states/ApiState';
import { useLocalState } from '../../states/LocalState'; import { useLocalState } from '../../states/LocalState';
import { useUserState } from '../../states/UserState'; import { useUserState } from '../../states/UserState';
import { ModelInformationDict } from '../render/ModelType'; import { ModelInformationDict } from '../render/ModelType';
@ -24,6 +25,7 @@ export type AdminButtonProps = {
*/ */
export default function AdminButton(props: Readonly<AdminButtonProps>) { export default function AdminButton(props: Readonly<AdminButtonProps>) {
const user = useUserState(); const user = useUserState();
const server = useServerApiState();
const enabled: boolean = useMemo(() => { const enabled: boolean = useMemo(() => {
// Only users with superuser permission will see this button // Only users with superuser permission will see this button
@ -31,10 +33,13 @@ export default function AdminButton(props: Readonly<AdminButtonProps>) {
return false; return false;
} }
// TODO: Check if the server has the admin interface enabled
const modelDef = ModelInformationDict[props.model]; const modelDef = ModelInformationDict[props.model];
// Check if the server has the admin interface enabled
if (!server.server.django_admin) {
return false;
}
// No admin URL associated with the model // No admin URL associated with the model
if (!modelDef.admin_url) { if (!modelDef.admin_url) {
return false; return false;
@ -57,8 +62,8 @@ export default function AdminButton(props: Readonly<AdminButtonProps>) {
return; return;
} }
// TODO: Check the actual "admin" URL (it may be custom) // Generate the URL for the admin interface
const url = `${host}/admin${modelDef.admin_url}${props.pk}/`; const url = `${host}/${server.server.django_admin}${modelDef.admin_url}${props.pk}/`;
if (event?.ctrlKey || event?.shiftKey) { if (event?.ctrlKey || event?.shiftKey) {
// Open the link in a new tab // Open the link in a new tab

View File

@ -18,7 +18,8 @@ export const emptyServerAPI = {
platform: null, platform: null,
installer: null, installer: null,
target: null, target: null,
default_locale: null default_locale: null,
django_admin: null
}; };
export interface SiteMarkProps { export interface SiteMarkProps {

View File

@ -47,6 +47,7 @@ export interface ServerAPIProps {
installer: null | string; installer: null | string;
target: null | string; target: null | string;
default_locale: null | string; default_locale: null | string;
django_admin: null | string;
} }
export interface AuthProps { export interface AuthProps {

View File

@ -110,3 +110,18 @@ test('Company', async ({ page }) => {
await page.getByText('Enter a valid URL.').waitFor(); await page.getByText('Enter a valid URL.').waitFor();
await page.getByRole('button', { name: 'Cancel' }).click(); await page.getByRole('button', { name: 'Cancel' }).click();
}); });
/**
* Test for integration of django admin button
*/
test('Admin Button', async ({ page }) => {
await doQuickLogin(page, 'admin', 'inventree');
await page.goto(`${baseUrl}/company/1/details`);
// Click on the admin button
await page.getByLabel(/action-button-open-in-admin/).click();
await page.waitForURL('**/test-admin/company/company/1/change/**');
await page.getByRole('heading', { name: 'Change Company' }).waitFor();
await page.getByRole('link', { name: 'View on site' }).waitFor();
});