mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-16 20:15:44 +00:00
94 lines
2.2 KiB
TypeScript
94 lines
2.2 KiB
TypeScript
import type { NavigateFunction } from 'react-router-dom';
|
|
import { ModelInformationDict } from '../enums/ModelInformation';
|
|
import type { ModelType } from '../enums/ModelType';
|
|
import { apiUrl } from './Api';
|
|
import { cancelEvent } from './Events';
|
|
|
|
export const getBaseUrl = (): string =>
|
|
(window as any).INVENTREE_SETTINGS?.base_url || 'web';
|
|
|
|
/**
|
|
* Returns the detail view URL for a given model type.
|
|
* This is the UI URL, not the API URL.
|
|
*/
|
|
export function getDetailUrl(
|
|
model: ModelType,
|
|
pk: number | string,
|
|
absolute?: boolean
|
|
): string {
|
|
const modelInfo = ModelInformationDict[model];
|
|
|
|
if (pk === undefined || pk === null) {
|
|
return '';
|
|
}
|
|
|
|
if (!!pk && modelInfo && modelInfo.url_detail) {
|
|
const url = modelInfo.url_detail.replace(':pk', pk.toString());
|
|
const base = getBaseUrl();
|
|
|
|
if (absolute && base) {
|
|
return `/${base}${url}`;
|
|
} else {
|
|
return url;
|
|
}
|
|
}
|
|
|
|
console.error(`No detail URL found for model ${model} <${pk}>`);
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Returns the API detail URL for a given model type.
|
|
*/
|
|
export function getApiUrl(
|
|
model: ModelType,
|
|
pk: number | string
|
|
): string | undefined {
|
|
const modelInfo = ModelInformationDict[model];
|
|
|
|
if (pk === undefined || pk === null) {
|
|
return '';
|
|
}
|
|
|
|
if (!!pk && modelInfo && modelInfo.api_endpoint) {
|
|
return apiUrl(modelInfo.api_endpoint, pk);
|
|
}
|
|
|
|
console.error(`No API detail URL found for model ${model} <${pk}>`);
|
|
return undefined;
|
|
}
|
|
|
|
/*
|
|
* Navigate to a provided link.
|
|
* - If the link is to be opened externally, open it in a new tab.
|
|
* - Otherwise, navigate using the provided navigate function.
|
|
*/
|
|
export const navigateToLink = (
|
|
link: string,
|
|
navigate: NavigateFunction,
|
|
event: any
|
|
) => {
|
|
cancelEvent(event);
|
|
|
|
const base = `/${getBaseUrl()}`;
|
|
|
|
if (event?.ctrlKey || event?.shiftKey) {
|
|
// Open the link in a new tab
|
|
let url = link;
|
|
if (link.startsWith('/') && !link.startsWith(base)) {
|
|
url = `${base}${link}`;
|
|
}
|
|
window.open(url, '_blank');
|
|
} else {
|
|
// Navigate internally
|
|
let url = link;
|
|
|
|
if (link.startsWith(base)) {
|
|
// Strip the base URL from the link
|
|
url = link.replace(base, '');
|
|
}
|
|
|
|
navigate(url);
|
|
}
|
|
};
|