[PUI] API Endpoint refactor (#6358)

* Cleanup SupplierPartTable

* Show PurchaseOrder table on SupplierPart page

* Perform edit actions as PATCH requests

* Implement ManufacturerPartParameter table

* Fix link

* supplier part link fix

* Add new ApiEndpoints enumeration

* Refactor calls to ApiState

* Revert previous change

* remove unused imports
This commit is contained in:
Oliver 2024-01-30 16:36:32 +11:00 committed by GitHub
parent b42f3de357
commit 282ecebc39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
76 changed files with 392 additions and 561 deletions

View File

@ -3,7 +3,7 @@ import { useQuery } from '@tanstack/react-query';
import { useEffect, useState } from 'react';
import { api } from '../App';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { apiUrl } from '../states/ApiState';
import { StatisticItem } from './items/DashboardItem';
import { ErrorItem } from './items/ErrorItem';
@ -17,7 +17,7 @@ export function DashboardItemProxy({
}: {
id: string;
text: string;
url: ApiPaths;
url: ApiEndpoints;
params: any;
autoupdate: boolean;
}) {

View File

@ -20,7 +20,7 @@ import {
} from 'react-hook-form';
import { api, queryClient } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import {
NestedDict,
constructField,
@ -60,7 +60,7 @@ export interface ApiFormAction {
* @param onFormError : A callback function to call when the form is submitted with errors.
*/
export interface ApiFormProps {
url: ApiPaths | string;
url: ApiEndpoints | string;
pk?: number | string | undefined;
pathParams?: PathParams;
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';

View File

@ -17,9 +17,9 @@ import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { api } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { doClassicLogin, doSimpleLogin } from '../../functions/auth';
import { apiUrl, useServerApiState } from '../../states/ApiState';
import { useServerApiState } from '../../states/ApiState';
export function AuthenticationForm() {
const classicForm = useForm({
@ -165,7 +165,7 @@ export function RegistrationForm() {
function handleRegistration() {
setIsRegistering(true);
api
.post(apiUrl(ApiPaths.user_register), registrationForm.values, {
.post(ApiEndpoints.user_register, registrationForm.values, {
headers: { Authorization: '' }
})
.then((ret) => {

View File

@ -15,8 +15,8 @@ import { ContextModalProps } from '@mantine/modals';
import { useQuery } from '@tanstack/react-query';
import { api } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { apiUrl, useServerApiState } from '../../states/ApiState';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useServerApiState } from '../../states/ApiState';
import { useLocalState } from '../../states/LocalState';
import { useUserState } from '../../states/UserState';
import { CopyButton } from '../items/CopyButton';
@ -47,7 +47,7 @@ export function AboutInvenTreeModal({
const { isLoading, data } = useQuery({
queryKey: ['version'],
queryFn: () => api.get(apiUrl(ApiPaths.version)).then((res) => res.data)
queryFn: () => api.get(ApiEndpoints.version).then((res) => res.data)
});
function fillTable(

View File

@ -23,8 +23,7 @@ import { Html5QrcodeResult } from 'html5-qrcode/core';
import { useEffect, useState } from 'react';
import { api } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { apiUrl } from '../../states/ApiState';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
export function QrCodeModal({
context,
@ -66,7 +65,7 @@ export function QrCodeModal({
handlers.append(decodedText);
api
.post(apiUrl(ApiPaths.barcode), { barcode: decodedText })
.post(ApiEndpoints.barcode, { barcode: decodedText })
.then((response) => {
showNotification({
title: response.data?.success || t`Unknown response`,

View File

@ -7,9 +7,8 @@ import { useNavigate, useParams } from 'react-router-dom';
import { api } from '../../App';
import { navTabs as mainNavTabs } from '../../defaults/links';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { InvenTreeStyle } from '../../globalStyle';
import { apiUrl } from '../../states/ApiState';
import { ScanButton } from '../items/ScanButton';
import { MainMenu } from './MainMenu';
import { NavHoverMenu } from './NavHoverMenu';
@ -38,7 +37,7 @@ export function Header() {
queryKey: ['notification-count'],
queryFn: async () => {
return api
.get(apiUrl(ApiPaths.notifications_list), {
.get(ApiEndpoints.notifications_list, {
params: {
read: false,
limit: 1

View File

@ -15,7 +15,7 @@ import { useNavigate } from 'react-router-dom';
import { Link } from 'react-router-dom';
import { api } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { apiUrl } from '../../states/ApiState';
import { StylishText } from '../items/StylishText';
@ -36,7 +36,7 @@ export function NotificationDrawer({
queryKey: ['notifications', opened],
queryFn: async () =>
api
.get(apiUrl(ApiPaths.notifications_list), {
.get(ApiEndpoints.notifications_list, {
params: {
read: false,
limit: 10
@ -115,7 +115,10 @@ export function NotificationDrawer({
color="gray"
variant="hover"
onClick={() => {
let url = apiUrl(ApiPaths.notifications_list, notification.pk);
let url = apiUrl(
ApiEndpoints.notifications_list,
notification.pk
);
api
.patch(url, {
read: true

View File

@ -6,8 +6,7 @@ import { useQuery } from '@tanstack/react-query';
import { useNavigate } from 'react-router-dom';
import { api } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { apiUrl } from '../../states/ApiState';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { StylishText } from '../items/StylishText';
export function PartCategoryTree({
@ -26,7 +25,7 @@ export function PartCategoryTree({
queryKey: ['part_category_tree', opened],
queryFn: async () =>
api
.get(apiUrl(ApiPaths.category_tree), {})
.get(ApiEndpoints.category_tree, {})
.then((response) =>
response.data.map((category: any) => {
return {

View File

@ -30,10 +30,9 @@ import { useEffect, useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { api } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { ModelType } from '../../enums/ModelType';
import { UserRoles } from '../../enums/Roles';
import { apiUrl } from '../../states/ApiState';
import { useUserSettingsState } from '../../states/SettingsState';
import { useUserState } from '../../states/UserState';
import { RenderInstance } from '../render/Instance';
@ -258,7 +257,7 @@ export function SearchDrawer({
});
return api
.post(apiUrl(ApiPaths.api_search), params)
.post(ApiEndpoints.api_search, params)
.then(function (response) {
return response.data;
})

View File

@ -6,8 +6,7 @@ import { useQuery } from '@tanstack/react-query';
import { useNavigate } from 'react-router-dom';
import { api } from '../../App';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { apiUrl } from '../../states/ApiState';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { StylishText } from '../items/StylishText';
export function StockLocationTree({
@ -26,7 +25,7 @@ export function StockLocationTree({
queryKey: ['stock_location_tree', opened],
queryFn: async () =>
api
.get(apiUrl(ApiPaths.stock_location_tree), {})
.get(ApiEndpoints.stock_location_tree, {})
.then((response) =>
response.data.map((location: any) => {
return {

View File

@ -1,6 +1,6 @@
import { t } from '@lingui/macro';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { ModelType } from '../../enums/ModelType';
interface ModelInformationInterface {
@ -8,7 +8,7 @@ interface ModelInformationInterface {
label_multiple: string;
url_overview?: string;
url_detail?: string;
api_endpoint?: ApiPaths;
api_endpoint?: ApiEndpoints;
cui_detail?: string;
}
@ -23,14 +23,14 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/part',
url_detail: '/part/:pk/',
cui_detail: '/part/:pk/',
api_endpoint: ApiPaths.part_list
api_endpoint: ApiEndpoints.part_list
},
partparametertemplate: {
label: t`Part Parameter Template`,
label_multiple: t`Part Parameter Templates`,
url_overview: '/partparametertemplate',
url_detail: '/partparametertemplate/:pk/',
api_endpoint: ApiPaths.part_parameter_template_list
api_endpoint: ApiEndpoints.part_parameter_template_list
},
supplierpart: {
label: t`Supplier Part`,
@ -38,7 +38,7 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/supplierpart',
url_detail: '/purchasing/supplier-part/:pk/',
cui_detail: '/supplier-part/:pk/',
api_endpoint: ApiPaths.supplier_part_list
api_endpoint: ApiEndpoints.supplier_part_list
},
manufacturerpart: {
label: t`Manufacturer Part`,
@ -46,15 +46,15 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/manufacturerpart',
url_detail: '/purchasing/manufacturer-part/:pk/',
cui_detail: '/manufacturer-part/:pk/',
api_endpoint: ApiPaths.manufacturer_part_list
api_endpoint: ApiEndpoints.manufacturer_part_list
},
partcategory: {
label: t`Part Category`,
label_multiple: t`Part Categories`,
url_overview: '/partcategory',
url_detail: '/partcategory/:pk/',
url_overview: '/part/category',
url_detail: '/part/category/:pk/',
cui_detail: '/part/category/:pk/',
api_endpoint: ApiPaths.category_list
api_endpoint: ApiEndpoints.category_list
},
stockitem: {
label: t`Stock Item`,
@ -62,7 +62,7 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/stock/item',
url_detail: '/stock/item/:pk/',
cui_detail: '/stock/item/:pk/',
api_endpoint: ApiPaths.stock_item_list
api_endpoint: ApiEndpoints.stock_item_list
},
stocklocation: {
label: t`Stock Location`,
@ -70,12 +70,12 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/stock/location',
url_detail: '/stock/location/:pk/',
cui_detail: '/stock/location/:pk/',
api_endpoint: ApiPaths.stock_location_list
api_endpoint: ApiEndpoints.stock_location_list
},
stockhistory: {
label: t`Stock History`,
label_multiple: t`Stock Histories`,
api_endpoint: ApiPaths.stock_tracking_list
api_endpoint: ApiEndpoints.stock_tracking_list
},
build: {
label: t`Build`,
@ -83,7 +83,7 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/build',
url_detail: '/build/:pk/',
cui_detail: '/build/:pk/',
api_endpoint: ApiPaths.build_order_list
api_endpoint: ApiEndpoints.build_order_list
},
company: {
label: t`Company`,
@ -91,14 +91,14 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/company',
url_detail: '/company/:pk/',
cui_detail: '/company/:pk/',
api_endpoint: ApiPaths.company_list
api_endpoint: ApiEndpoints.company_list
},
projectcode: {
label: t`Project Code`,
label_multiple: t`Project Codes`,
url_overview: '/project-code',
url_detail: '/project-code/:pk/',
api_endpoint: ApiPaths.project_code_list
api_endpoint: ApiEndpoints.project_code_list
},
purchaseorder: {
label: t`Purchase Order`,
@ -106,12 +106,12 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/purchasing/purchase-order',
url_detail: '/purchasing/purchase-order/:pk/',
cui_detail: '/order/purchase-order/:pk/',
api_endpoint: ApiPaths.purchase_order_list
api_endpoint: ApiEndpoints.purchase_order_list
},
purchaseorderline: {
label: t`Purchase Order Line`,
label_multiple: t`Purchase Order Lines`,
api_endpoint: ApiPaths.purchase_order_line_list
api_endpoint: ApiEndpoints.purchase_order_line_list
},
salesorder: {
label: t`Sales Order`,
@ -119,14 +119,14 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/sales/sales-order',
url_detail: '/sales/sales-order/:pk/',
cui_detail: '/order/sales-order/:pk/',
api_endpoint: ApiPaths.sales_order_list
api_endpoint: ApiEndpoints.sales_order_list
},
salesordershipment: {
label: t`Sales Order Shipment`,
label_multiple: t`Sales Order Shipments`,
url_overview: '/salesordershipment',
url_detail: '/salesordershipment/:pk/',
api_endpoint: ApiPaths.sales_order_shipment_list
api_endpoint: ApiEndpoints.sales_order_shipment_list
},
returnorder: {
label: t`Return Order`,
@ -134,34 +134,34 @@ export const ModelInformationDict: ModelDictory = {
url_overview: '/sales/return-order',
url_detail: '/sales/return-order/:pk/',
cui_detail: '/order/return-order/:pk/',
api_endpoint: ApiPaths.return_order_list
api_endpoint: ApiEndpoints.return_order_list
},
address: {
label: t`Address`,
label_multiple: t`Addresses`,
url_overview: '/address',
url_detail: '/address/:pk/',
api_endpoint: ApiPaths.address_list
api_endpoint: ApiEndpoints.address_list
},
contact: {
label: t`Contact`,
label_multiple: t`Contacts`,
url_overview: '/contact',
url_detail: '/contact/:pk/',
api_endpoint: ApiPaths.contact_list
api_endpoint: ApiEndpoints.contact_list
},
owner: {
label: t`Owner`,
label_multiple: t`Owners`,
url_overview: '/owner',
url_detail: '/owner/:pk/',
api_endpoint: ApiPaths.owner_list
api_endpoint: ApiEndpoints.owner_list
},
user: {
label: t`User`,
label_multiple: t`Users`,
url_overview: '/user',
url_detail: '/user/:pk/',
api_endpoint: ApiPaths.user_list
api_endpoint: ApiEndpoints.user_list
}
};

View File

@ -9,7 +9,7 @@ import { ReactNode, useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { formatPriceRange } from '../../../defaults/formatters';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { bomItemFields } from '../../../forms/BomForms';
@ -320,7 +320,7 @@ export function BomTable({
hidden: !user.hasChangeRole(UserRoles.part),
onClick: () => {
openEditApiForm({
url: ApiPaths.bom_list,
url: ApiEndpoints.bom_list,
pk: record.pk,
title: t`Edit Bom Item`,
fields: bomItemFields(),
@ -337,7 +337,7 @@ export function BomTable({
hidden: !user.hasDeleteRole(UserRoles.part),
onClick: () => {
openDeleteApiForm({
url: ApiPaths.bom_list,
url: ApiEndpoints.bom_list,
pk: record.pk,
title: t`Delete Bom Item`,
successMessage: t`Bom item deleted`,
@ -355,7 +355,7 @@ export function BomTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.bom_list)}
url={apiUrl(ApiEndpoints.bom_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { getDetailUrl } from '../../../functions/urls';
import { useTable } from '../../../hooks/UseTable';
@ -84,7 +84,7 @@ export function UsedInTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.bom_list)}
url={apiUrl(ApiEndpoints.bom_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -8,7 +8,7 @@ import {
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { getDetailUrl } from '../../../functions/urls';
import { useTable } from '../../../hooks/UseTable';
@ -223,7 +223,7 @@ export default function BuildLineTable({ params = {} }: { params?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.build_line_list)}
url={apiUrl(ApiEndpoints.build_line_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -3,7 +3,7 @@ import { useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { renderDate } from '../../../defaults/formatters';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { getDetailUrl } from '../../../functions/urls';
import { useTable } from '../../../hooks/UseTable';
@ -135,7 +135,7 @@ export function BuildOrderTable({ params = {} }: { params?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.build_order_list)}
url={apiUrl(ApiEndpoints.build_order_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import { addressFields } from '../../../forms/CompanyForms';
import {
@ -123,7 +123,7 @@ export function AddressTable({
hidden: !can_edit,
onClick: () => {
openEditApiForm({
url: ApiPaths.address_list,
url: ApiEndpoints.address_list,
pk: record.pk,
title: t`Edit Address`,
fields: addressFields(),
@ -136,7 +136,7 @@ export function AddressTable({
hidden: !can_delete,
onClick: () => {
openDeleteApiForm({
url: ApiPaths.address_list,
url: ApiEndpoints.address_list,
pk: record.pk,
title: t`Delete Address`,
successMessage: t`Address deleted`,
@ -156,7 +156,7 @@ export function AddressTable({
fields['company'].value = companyId;
openCreateApiForm({
url: ApiPaths.address_list,
url: ApiEndpoints.address_list,
title: t`Add Address`,
fields: fields,
successMessage: t`Address created`,
@ -180,7 +180,7 @@ export function AddressTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.address_list)}
url={apiUrl(ApiEndpoints.address_list)}
tableState={table}
columns={columns}
props={{

View File

@ -3,7 +3,7 @@ import { Group, Text } from '@mantine/core';
import { useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { useTable } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
import { Thumbnail } from '../../images/Thumbnail';
@ -55,7 +55,7 @@ export function CompanyTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.company_list)}
url={apiUrl(ApiEndpoints.company_list)}
tableState={table}
columns={columns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import { contactFields } from '../../../forms/CompanyForms';
import {
@ -71,7 +71,7 @@ export function ContactTable({
hidden: !can_edit,
onClick: () => {
openEditApiForm({
url: ApiPaths.contact_list,
url: ApiEndpoints.contact_list,
pk: record.pk,
title: t`Edit Contact`,
fields: contactFields(),
@ -84,7 +84,7 @@ export function ContactTable({
hidden: !can_delete,
onClick: () => {
openDeleteApiForm({
url: ApiPaths.contact_list,
url: ApiEndpoints.contact_list,
pk: record.pk,
title: t`Delete Contact`,
successMessage: t`Contact deleted`,
@ -104,7 +104,7 @@ export function ContactTable({
fields['company'].value = companyId;
openCreateApiForm({
url: ApiPaths.contact_list,
url: ApiEndpoints.contact_list,
title: t`Create Contact`,
fields: fields,
successMessage: t`Contact created`,
@ -128,7 +128,7 @@ export function ContactTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.contact_list)}
url={apiUrl(ApiEndpoints.contact_list)}
tableState={table}
columns={columns}
props={{

View File

@ -7,7 +7,7 @@ import { IconExternalLink, IconFileUpload } from '@tabler/icons-react';
import { ReactNode, useEffect, useMemo, useState } from 'react';
import { api } from '../../../App';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import {
addAttachment,
deleteAttachment,
@ -78,7 +78,7 @@ export function AttachmentTable({
model,
pk
}: {
endpoint: ApiPaths;
endpoint: ApiEndpoints;
pk: number;
model: string;
}): ReactNode {

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { TableState } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
import { TableColumn } from '../Column';
@ -42,7 +42,7 @@ export function NotificationTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.notifications_list)}
url={apiUrl(ApiEndpoints.notifications_list)}
tableState={tableState}
columns={columns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { partCategoryFields } from '../../../forms/PartForms';
@ -81,7 +81,7 @@ export function PartCategoryTable({ parentId }: { parentId?: any }) {
}
openCreateApiForm({
url: apiUrl(ApiPaths.category_list),
url: apiUrl(ApiEndpoints.category_list),
title: t`Add Part Category`,
fields: fields,
onFormSuccess(data: any) {
@ -115,7 +115,7 @@ export function PartCategoryTable({ parentId }: { parentId?: any }) {
hidden: !can_edit,
onClick: () => {
openEditApiForm({
url: ApiPaths.category_list,
url: ApiEndpoints.category_list,
pk: record.pk,
title: t`Edit Part Category`,
fields: partCategoryFields({}),
@ -131,7 +131,7 @@ export function PartCategoryTable({ parentId }: { parentId?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.category_list)}
url={apiUrl(ApiEndpoints.category_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { Text } from '@mantine/core';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import {
openCreateApiForm,
@ -101,7 +101,7 @@ export function PartParameterTable({ partId }: { partId: any }) {
hidden: !user.hasChangeRole(UserRoles.part),
onClick: () => {
openEditApiForm({
url: ApiPaths.part_parameter_list,
url: ApiEndpoints.part_parameter_list,
pk: record.pk,
title: t`Edit Part Parameter`,
fields: {
@ -124,7 +124,7 @@ export function PartParameterTable({ partId }: { partId: any }) {
hidden: !user.hasDeleteRole(UserRoles.part),
onClick: () => {
openDeleteApiForm({
url: ApiPaths.part_parameter_list,
url: ApiEndpoints.part_parameter_list,
pk: record.pk,
title: t`Delete Part Parameter`,
successMessage: t`Part parameter deleted`,
@ -146,7 +146,7 @@ export function PartParameterTable({ partId }: { partId: any }) {
}
openCreateApiForm({
url: ApiPaths.part_parameter_list,
url: ApiEndpoints.part_parameter_list,
title: t`Add Part Parameter`,
fields: {
part: {
@ -175,7 +175,7 @@ export function PartParameterTable({ partId }: { partId: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.part_parameter_list)}
url={apiUrl(ApiEndpoints.part_parameter_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import { partParameterTemplateFields } from '../../../forms/PartForms';
import {
@ -77,7 +77,7 @@ export default function PartParameterTemplateTable() {
hidden: !user.hasChangeRole(UserRoles.part),
onClick: () => {
openEditApiForm({
url: ApiPaths.part_parameter_template_list,
url: ApiEndpoints.part_parameter_template_list,
pk: record.pk,
title: t`Edit Parameter Template`,
fields: partParameterTemplateFields(),
@ -90,7 +90,7 @@ export default function PartParameterTemplateTable() {
hidden: !user.hasDeleteRole(UserRoles.part),
onClick: () => {
openDeleteApiForm({
url: ApiPaths.part_parameter_template_list,
url: ApiEndpoints.part_parameter_template_list,
pk: record.pk,
title: t`Delete Parameter Template`,
successMessage: t`Parameter template deleted`,
@ -106,7 +106,7 @@ export default function PartParameterTemplateTable() {
const addParameterTemplate = useCallback(() => {
openCreateApiForm({
url: ApiPaths.part_parameter_template_list,
url: ApiEndpoints.part_parameter_template_list,
title: t`Create Parameter Template`,
fields: partParameterTemplateFields(),
successMessage: t`Parameter template created`,
@ -126,7 +126,7 @@ export default function PartParameterTemplateTable() {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.part_parameter_template_list)}
url={apiUrl(ApiEndpoints.part_parameter_template_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -4,7 +4,7 @@ import { ReactNode, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { formatPriceRange } from '../../../defaults/formatters';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { shortenString } from '../../../functions/tables';
import { getDetailUrl } from '../../../functions/urls';
@ -271,7 +271,7 @@ export function PartListTable({ props }: { props: InvenTreeTableProps }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.part_list)}
url={apiUrl(ApiEndpoints.part_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import { partTestTemplateFields } from '../../../forms/PartForms';
import {
@ -79,7 +79,7 @@ export default function PartTestTemplateTable({ partId }: { partId: number }) {
hidden: !can_edit,
onClick: () => {
openEditApiForm({
url: ApiPaths.part_test_template_list,
url: ApiEndpoints.part_test_template_list,
pk: record.pk,
title: t`Edit Test Template`,
fields: partTestTemplateFields(),
@ -92,7 +92,7 @@ export default function PartTestTemplateTable({ partId }: { partId: number }) {
hidden: !can_delete,
onClick: () => {
openDeleteApiForm({
url: ApiPaths.part_test_template_list,
url: ApiEndpoints.part_test_template_list,
pk: record.pk,
title: t`Delete Test Template`,
successMessage: t`Test Template deleted`,
@ -111,7 +111,7 @@ export default function PartTestTemplateTable({ partId }: { partId: number }) {
fields['part'].value = partId;
openCreateApiForm({
url: ApiPaths.part_test_template_list,
url: ApiEndpoints.part_test_template_list,
title: t`Create Test Template`,
fields: fields,
successMessage: t`Template created`,
@ -133,7 +133,7 @@ export default function PartTestTemplateTable({ partId }: { partId: number }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.part_test_template_list)}
url={apiUrl(ApiEndpoints.part_test_template_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -4,7 +4,7 @@ import { IconLayersLinked } from '@tabler/icons-react';
import { ReactNode, useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import { openCreateApiForm, openDeleteApiForm } from '../../../functions/forms';
import { useTable } from '../../../hooks/UseTable';
@ -69,7 +69,7 @@ export function RelatedPartTable({ partId }: { partId: number }): ReactNode {
const addRelatedPart = useCallback(() => {
openCreateApiForm({
title: t`Add Related Part`,
url: ApiPaths.related_part_list,
url: ApiEndpoints.related_part_list,
fields: {
part_1: {
hidden: true,
@ -108,7 +108,7 @@ export function RelatedPartTable({ partId }: { partId: number }): ReactNode {
hidden: !user.hasDeleteRole(UserRoles.part),
onClick: () => {
openDeleteApiForm({
url: ApiPaths.related_part_list,
url: ApiEndpoints.related_part_list,
pk: record.pk,
title: t`Delete Related Part`,
successMessage: t`Related part deleted`,
@ -124,7 +124,7 @@ export function RelatedPartTable({ partId }: { partId: number }): ReactNode {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.related_part_list)}
url={apiUrl(ApiEndpoints.related_part_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { Code } from '@mantine/core';
import { useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { useTable } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
import { TableColumn } from '../Column';
@ -43,7 +43,7 @@ export function PluginErrorTable({ props }: { props: InvenTreeTableProps }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.plugin_registry_status)}
url={apiUrl(ApiEndpoints.plugin_registry_status)}
tableState={table}
columns={registryErrorTableColumns}
props={{

View File

@ -24,7 +24,7 @@ import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { api } from '../../../App';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { openEditApiForm } from '../../../functions/forms';
import { useCreateApiFormModal } from '../../../hooks/UseForm';
import { useInstance } from '../../../hooks/UseInstance';
@ -82,7 +82,7 @@ export function PluginDrawer({
refreshInstance,
instanceQuery: { isFetching, error }
} = useInstance<PluginI>({
endpoint: ApiPaths.plugin_list,
endpoint: ApiEndpoints.plugin_list,
pk: id,
throwError: true
});
@ -127,7 +127,7 @@ export function PluginDrawer({
onClick: () => {
openEditApiForm({
title: t`Edit plugin`,
url: ApiPaths.plugin_list,
url: ApiEndpoints.plugin_list,
pk: id,
fields: {
active: {}
@ -334,7 +334,7 @@ export function PluginListTable({ props }: { props: InvenTreeTableProps }) {
confirm: t`Confirm`
},
onConfirm: () => {
let url = apiUrl(ApiPaths.plugin_list, plugin_id) + 'activate/';
let url = apiUrl(ApiEndpoints.plugin_list, plugin_id) + 'activate/';
const id = 'plugin-activate';
@ -403,7 +403,7 @@ export function PluginListTable({ props }: { props: InvenTreeTableProps }) {
const installPluginModal = useCreateApiFormModal({
title: t`Install plugin`,
url: ApiPaths.plugin_install,
url: ApiEndpoints.plugin_install,
fields: {
packagename: {},
url: {},
@ -428,7 +428,7 @@ export function PluginListTable({ props }: { props: InvenTreeTableProps }) {
const reloadPlugins = useCallback(() => {
api
.post(apiUrl(ApiPaths.plugin_reload), {
.post(apiUrl(ApiEndpoints.plugin_reload), {
full_reload: true,
force_reload: true,
collect_plugins: true
@ -482,7 +482,7 @@ export function PluginListTable({ props }: { props: InvenTreeTableProps }) {
}}
/>
<InvenTreeTable
url={apiUrl(ApiPaths.plugin_list)}
url={apiUrl(ApiEndpoints.plugin_list)}
tableState={table}
columns={pluginTableColumns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import { useManufacturerPartParameterFields } from '../../../forms/CompanyForms';
import { openDeleteApiForm, openEditApiForm } from '../../../functions/forms';
@ -52,7 +52,7 @@ export default function ManufacturerPartParameterTable({
hidden: !user.hasChangeRole(UserRoles.purchase_order),
onClick: () => {
openEditApiForm({
url: ApiPaths.manufacturer_part_parameter_list,
url: ApiEndpoints.manufacturer_part_parameter_list,
pk: record.pk,
title: t`Edit Parameter`,
fields: fields,
@ -66,7 +66,7 @@ export default function ManufacturerPartParameterTable({
onClick: () => {
record.pk &&
openDeleteApiForm({
url: ApiPaths.manufacturer_part_parameter_list,
url: ApiEndpoints.manufacturer_part_parameter_list,
pk: record.pk,
title: t`Delete Parameter`,
onFormSuccess: table.refreshTable,
@ -82,7 +82,7 @@ export default function ManufacturerPartParameterTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.manufacturer_part_parameter_list)}
url={apiUrl(ApiEndpoints.manufacturer_part_parameter_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { ReactNode, useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { useManufacturerPartFields } from '../../../forms/CompanyForms';
@ -91,7 +91,7 @@ export function ManufacturerPartTable({ params }: { params: any }): ReactNode {
onClick: () => {
record.pk &&
openEditApiForm({
url: ApiPaths.manufacturer_part_list,
url: ApiEndpoints.manufacturer_part_list,
pk: record.pk,
title: t`Edit Manufacturer Part`,
fields: editManufacturerPartFields,
@ -105,7 +105,7 @@ export function ManufacturerPartTable({ params }: { params: any }): ReactNode {
onClick: () => {
record.pk &&
openDeleteApiForm({
url: ApiPaths.manufacturer_part_list,
url: ApiEndpoints.manufacturer_part_list,
pk: record.pk,
title: t`Delete Manufacturer Part`,
successMessage: t`Manufacturer part deleted`,
@ -121,7 +121,7 @@ export function ManufacturerPartTable({ params }: { params: any }): ReactNode {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.manufacturer_part_list)}
url={apiUrl(ApiEndpoints.manufacturer_part_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -5,7 +5,7 @@ import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ProgressBar } from '../../../components/items/ProgressBar';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { purchaseOrderLineItemFields } from '../../../forms/PurchaseOrderForms';
@ -73,7 +73,7 @@ export function PurchaseOrderLineItemTable({
});
openEditApiForm({
url: ApiPaths.purchase_order_line_list,
url: ApiEndpoints.purchase_order_line_list,
pk: record.pk,
title: t`Edit Line Item`,
fields: fields,
@ -222,7 +222,7 @@ export function PurchaseOrderLineItemTable({
const addLine = useCallback(() => {
openCreateApiForm({
url: ApiPaths.purchase_order_line_list,
url: ApiEndpoints.purchase_order_line_list,
title: t`Add Line Item`,
fields: purchaseOrderLineItemFields({
create: true,
@ -252,7 +252,7 @@ export function PurchaseOrderLineItemTable({
return (
<InvenTreeTable
url={apiUrl(ApiPaths.purchase_order_line_list)}
url={apiUrl(ApiEndpoints.purchase_order_line_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { notYetImplemented } from '../../../functions/notifications';
@ -116,7 +116,7 @@ export function PurchaseOrderTable({ params }: { params?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.purchase_order_list)}
url={apiUrl(ApiEndpoints.purchase_order_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -3,7 +3,7 @@ import { Text } from '@mantine/core';
import { ReactNode, useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { useSupplierPartFields } from '../../../forms/CompanyForms';
@ -161,7 +161,7 @@ export function SupplierPartTable({ params }: { params: any }): ReactNode {
});
const { modal: addSupplierPartModal, open: openAddSupplierPartForm } =
useCreateApiFormModal({
url: ApiPaths.supplier_part_list,
url: ApiEndpoints.supplier_part_list,
title: t`Add Supplier Part`,
fields: addSupplierPartFields,
onFormSuccess: table.refreshTable,
@ -194,7 +194,7 @@ export function SupplierPartTable({ params }: { params: any }): ReactNode {
onClick: () => {
record.pk &&
openEditApiForm({
url: ApiPaths.supplier_part_list,
url: ApiEndpoints.supplier_part_list,
pk: record.pk,
title: t`Edit Supplier Part`,
fields: editSupplierPartFields,
@ -208,7 +208,7 @@ export function SupplierPartTable({ params }: { params: any }): ReactNode {
onClick: () => {
record.pk &&
openDeleteApiForm({
url: ApiPaths.supplier_part_list,
url: ApiEndpoints.supplier_part_list,
pk: record.pk,
title: t`Delete Supplier Part`,
successMessage: t`Supplier part deleted`,
@ -226,7 +226,7 @@ export function SupplierPartTable({ params }: { params: any }): ReactNode {
<>
{addSupplierPartModal}
<InvenTreeTable
url={apiUrl(ApiPaths.supplier_part_list)}
url={apiUrl(ApiEndpoints.supplier_part_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { notYetImplemented } from '../../../functions/notifications';
@ -112,7 +112,7 @@ export function ReturnOrderTable({ params }: { params?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.return_order_list)}
url={apiUrl(ApiEndpoints.return_order_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { notYetImplemented } from '../../../functions/notifications';
@ -113,7 +113,7 @@ export function SalesOrderTable({ params }: { params?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.sales_order_list)}
url={apiUrl(ApiEndpoints.sales_order_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -4,7 +4,7 @@ import { IconReload } from '@tabler/icons-react';
import { useCallback, useMemo } from 'react';
import { api } from '../../../App';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { useTable } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
import { ActionButton } from '../../buttons/ActionButton';
@ -33,7 +33,7 @@ export function CurrencyTable() {
const refreshCurrencies = useCallback(() => {
api
.post(apiUrl(ApiPaths.currency_refresh), {})
.post(apiUrl(ApiEndpoints.currency_refresh), {})
.then(() => {
table.refreshTable();
showNotification({
@ -62,7 +62,7 @@ export function CurrencyTable() {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.currency_list)}
url={apiUrl(ApiEndpoints.currency_list)}
tableState={table}
columns={columns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import {
openCreateApiForm,
@ -54,7 +54,7 @@ export default function CustomUnitsTable() {
hidden: !user.hasChangeRole(UserRoles.admin),
onClick: () => {
openEditApiForm({
url: ApiPaths.custom_unit_list,
url: ApiEndpoints.custom_unit_list,
pk: record.pk,
title: t`Edit custom unit`,
fields: {
@ -71,7 +71,7 @@ export default function CustomUnitsTable() {
hidden: !user.hasDeleteRole(UserRoles.admin),
onClick: () => {
openDeleteApiForm({
url: ApiPaths.custom_unit_list,
url: ApiEndpoints.custom_unit_list,
pk: record.pk,
title: t`Delete custom unit`,
successMessage: t`Custom unit deleted`,
@ -87,7 +87,7 @@ export default function CustomUnitsTable() {
const addCustomUnit = useCallback(() => {
openCreateApiForm({
url: ApiPaths.custom_unit_list,
url: ApiEndpoints.custom_unit_list,
title: t`Add custom unit`,
fields: {
name: {},
@ -112,7 +112,7 @@ export default function CustomUnitsTable() {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.custom_unit_list)}
url={apiUrl(ApiEndpoints.custom_unit_list)}
tableState={table}
columns={columns}
props={{

View File

@ -3,7 +3,7 @@ import { Drawer, Text } from '@mantine/core';
import { useDisclosure } from '@mantine/hooks';
import { useCallback, useMemo, useState } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { openDeleteApiForm } from '../../../functions/forms';
import { useTable } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
@ -46,7 +46,7 @@ export default function ErrorReportTable() {
RowDeleteAction({
onClick: () => {
openDeleteApiForm({
url: ApiPaths.error_report_list,
url: ApiEndpoints.error_report_list,
pk: record.pk,
title: t`Delete error report`,
onFormSuccess: table.refreshTable,
@ -72,7 +72,7 @@ export default function ErrorReportTable() {
})}
</Drawer>
<InvenTreeTable
url={apiUrl(ApiPaths.error_report_list)}
url={apiUrl(ApiEndpoints.error_report_list)}
tableState={table}
columns={columns}
props={{

View File

@ -3,7 +3,7 @@ import { Drawer, Text } from '@mantine/core';
import { useDisclosure } from '@mantine/hooks';
import { useMemo, useState } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { useTable } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
import { StylishText } from '../../items/StylishText';
@ -62,7 +62,7 @@ export default function FailedTasksTable() {
})}
</Drawer>
<InvenTreeTable
url={apiUrl(ApiPaths.task_failed_list)}
url={apiUrl(ApiEndpoints.task_failed_list)}
tableState={table}
columns={columns}
props={{

View File

@ -3,7 +3,7 @@ import { Group, LoadingOverlay, Stack, Text, Title } from '@mantine/core';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { openCreateApiForm, openDeleteApiForm } from '../../../functions/forms';
import { useInstance } from '../../../hooks/UseInstance';
import { useTable } from '../../../hooks/UseTable';
@ -32,7 +32,7 @@ export function GroupDrawer({
refreshInstance,
instanceQuery: { isFetching, error }
} = useInstance({
endpoint: ApiPaths.group_list,
endpoint: ApiEndpoints.group_list,
pk: id,
throwError: true
});
@ -57,7 +57,7 @@ export function GroupDrawer({
<Stack>
<EditApiForm
props={{
url: ApiPaths.group_list,
url: ApiEndpoints.group_list,
pk: id,
fields: {
name: {}
@ -110,7 +110,7 @@ export function GroupTable() {
RowDeleteAction({
onClick: () => {
openDeleteApiForm({
url: ApiPaths.group_list,
url: ApiEndpoints.group_list,
pk: record.pk,
title: t`Delete group`,
successMessage: t`Group deleted`,
@ -124,7 +124,7 @@ export function GroupTable() {
const addGroup = useCallback(() => {
openCreateApiForm({
url: ApiPaths.group_list,
url: ApiEndpoints.group_list,
title: t`Add group`,
fields: { name: {} },
onFormSuccess: table.refreshTable,
@ -161,7 +161,7 @@ export function GroupTable() {
}}
/>
<InvenTreeTable
url={apiUrl(ApiPaths.group_list)}
url={apiUrl(ApiEndpoints.group_list)}
tableState={table}
columns={columns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { useTable } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
import { TableColumn } from '../Column';
@ -44,7 +44,7 @@ export default function PendingTasksTable() {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.task_pending_list)}
url={apiUrl(ApiEndpoints.task_pending_list)}
tableState={table}
columns={columns}
props={{

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { UserRoles } from '../../../enums/Roles';
import {
openCreateApiForm,
@ -44,7 +44,7 @@ export default function ProjectCodeTable() {
hidden: !user.hasChangeRole(UserRoles.admin),
onClick: () => {
openEditApiForm({
url: ApiPaths.project_code_list,
url: ApiEndpoints.project_code_list,
pk: record.pk,
title: t`Edit project code`,
fields: {
@ -61,7 +61,7 @@ export default function ProjectCodeTable() {
hidden: !user.hasDeleteRole(UserRoles.admin),
onClick: () => {
openDeleteApiForm({
url: ApiPaths.project_code_list,
url: ApiEndpoints.project_code_list,
pk: record.pk,
title: t`Delete project code`,
successMessage: t`Project code deleted`,
@ -77,7 +77,7 @@ export default function ProjectCodeTable() {
const addProjectCode = useCallback(() => {
openCreateApiForm({
url: ApiPaths.project_code_list,
url: ApiEndpoints.project_code_list,
title: t`Add project code`,
fields: {
code: {},
@ -101,7 +101,7 @@ export default function ProjectCodeTable() {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.project_code_list)}
url={apiUrl(ApiEndpoints.project_code_list)}
tableState={table}
columns={columns}
props={{

View File

@ -3,7 +3,7 @@ import { Group, Text } from '@mantine/core';
import { IconCircleCheck, IconCircleX } from '@tabler/icons-react';
import { useMemo } from 'react';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { useTable } from '../../../hooks/UseTable';
import { apiUrl } from '../../../states/ApiState';
import { TableColumn } from '../Column';
@ -53,7 +53,7 @@ export default function ScheduledTasksTable() {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.task_scheduled_list)}
url={apiUrl(ApiEndpoints.task_scheduled_list)}
tableState={table}
columns={columns}
props={{}}

View File

@ -5,7 +5,7 @@ import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { Link } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { openCreateApiForm, openDeleteApiForm } from '../../../functions/forms';
import { useInstance } from '../../../hooks/UseInstance';
import { useTable } from '../../../hooks/UseTable';
@ -44,7 +44,7 @@ export function UserDrawer({
refreshInstance,
instanceQuery: { isFetching, error }
} = useInstance<UserDetailI>({
endpoint: ApiPaths.user_list,
endpoint: ApiEndpoints.user_list,
pk: id,
throwError: true
});
@ -75,7 +75,7 @@ export function UserDrawer({
<Stack>
<EditApiForm
props={{
url: ApiPaths.user_list,
url: ApiEndpoints.user_list,
pk: id,
fields: {
username: {},
@ -204,7 +204,7 @@ export function UserTable() {
RowDeleteAction({
onClick: () => {
openDeleteApiForm({
url: ApiPaths.user_list,
url: ApiEndpoints.user_list,
pk: record.pk,
title: t`Delete user`,
successMessage: t`User deleted`,
@ -218,7 +218,7 @@ export function UserTable() {
const addUser = useCallback(() => {
openCreateApiForm({
url: ApiPaths.user_list,
url: ApiEndpoints.user_list,
title: t`Add user`,
fields: {
username: {},
@ -256,7 +256,7 @@ export function UserTable() {
}}
/>
<InvenTreeTable
url={apiUrl(ApiPaths.user_list)}
url={apiUrl(ApiEndpoints.user_list)}
tableState={table}
columns={columns}
props={{

View File

@ -4,7 +4,7 @@ import { ReactNode, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { formatCurrency, renderDate } from '../../../defaults/formatters';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { getDetailUrl } from '../../../functions/urls';
import { useTable } from '../../../hooks/UseTable';
@ -339,7 +339,7 @@ export function StockItemTable({ params = {} }: { params?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.stock_item_list)}
url={apiUrl(ApiEndpoints.stock_item_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { ApiPaths } from '../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../enums/ApiEndpoints';
import { ModelType } from '../../../enums/ModelType';
import { UserRoles } from '../../../enums/Roles';
import { stockLocationFields } from '../../../forms/StockForms';
@ -104,7 +104,7 @@ export function StockLocationTable({ parentId }: { parentId?: any }) {
}
openCreateApiForm({
url: apiUrl(ApiPaths.stock_location_list),
url: apiUrl(ApiEndpoints.stock_location_list),
title: t`Add Stock Location`,
fields: fields,
onFormSuccess(data: any) {
@ -138,7 +138,7 @@ export function StockLocationTable({ parentId }: { parentId?: any }) {
hidden: !can_edit,
onClick: () => {
openEditApiForm({
url: ApiPaths.stock_location_list,
url: ApiEndpoints.stock_location_list,
pk: record.pk,
title: t`Edit Stock Location`,
fields: stockLocationFields({}),
@ -154,7 +154,7 @@ export function StockLocationTable({ parentId }: { parentId?: any }) {
return (
<InvenTreeTable
url={apiUrl(ApiPaths.stock_location_list)}
url={apiUrl(ApiEndpoints.stock_location_list)}
tableState={table}
columns={tableColumns}
props={{

View File

@ -1,12 +1,12 @@
import { t } from '@lingui/macro';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
interface DashboardItems {
id: string;
text: string;
icon: string;
url: ApiPaths;
url: ApiEndpoints;
params: any;
}
export const dashboardItems: DashboardItems[] = [
@ -14,119 +14,119 @@ export const dashboardItems: DashboardItems[] = [
id: 'starred-parts',
text: t`Subscribed Parts`,
icon: 'fa-bell',
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
params: { starred: true }
},
{
id: 'starred-categories',
text: t`Subscribed Categories`,
icon: 'fa-bell',
url: ApiPaths.category_list,
url: ApiEndpoints.category_list,
params: { starred: true }
},
{
id: 'latest-parts',
text: t`Latest Parts`,
icon: 'fa-newspaper',
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
params: { ordering: '-creation_date', limit: 10 }
},
{
id: 'bom-validation',
text: t`BOM Waiting Validation`,
icon: 'fa-times-circle',
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
params: { bom_valid: false }
},
{
id: 'recently-updated-stock',
text: t`Recently Updated`,
icon: 'fa-clock',
url: ApiPaths.stock_item_list,
url: ApiEndpoints.stock_item_list,
params: { part_detail: true, ordering: '-updated', limit: 10 }
},
{
id: 'low-stock',
text: t`Low Stock`,
icon: 'fa-flag',
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
params: { low_stock: true }
},
{
id: 'depleted-stock',
text: t`Depleted Stock`,
icon: 'fa-times',
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
params: { depleted_stock: true }
},
{
id: 'stock-to-build',
text: t`Required for Build Orders`,
icon: 'fa-bullhorn',
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
params: { stock_to_build: true }
},
{
id: 'expired-stock',
text: t`Expired Stock`,
icon: 'fa-calendar-times',
url: ApiPaths.stock_item_list,
url: ApiEndpoints.stock_item_list,
params: { expired: true }
},
{
id: 'stale-stock',
text: t`Stale Stock`,
icon: 'fa-stopwatch',
url: ApiPaths.stock_item_list,
url: ApiEndpoints.stock_item_list,
params: { stale: true, expired: true }
},
{
id: 'build-pending',
text: t`Build Orders In Progress`,
icon: 'fa-cogs',
url: ApiPaths.build_order_list,
url: ApiEndpoints.build_order_list,
params: { active: true }
},
{
id: 'build-overdue',
text: t`Overdue Build Orders`,
icon: 'fa-calendar-times',
url: ApiPaths.build_order_list,
url: ApiEndpoints.build_order_list,
params: { overdue: true }
},
{
id: 'po-outstanding',
text: t`Outstanding Purchase Orders`,
icon: 'fa-sign-in-alt',
url: ApiPaths.purchase_order_list,
url: ApiEndpoints.purchase_order_list,
params: { supplier_detail: true, outstanding: true }
},
{
id: 'po-overdue',
text: t`Overdue Purchase Orders`,
icon: 'fa-calendar-times',
url: ApiPaths.purchase_order_list,
url: ApiEndpoints.purchase_order_list,
params: { supplier_detail: true, overdue: true }
},
{
id: 'so-outstanding',
text: t`Outstanding Sales Orders`,
icon: 'fa-sign-out-alt',
url: ApiPaths.sales_order_list,
url: ApiEndpoints.sales_order_list,
params: { customer_detail: true, outstanding: true }
},
{
id: 'so-overdue',
text: t`Overdue Sales Orders`,
icon: 'fa-calendar-times',
url: ApiPaths.sales_order_list,
url: ApiEndpoints.sales_order_list,
params: { customer_detail: true, overdue: true }
},
{
id: 'news',
text: t`Current News`,
icon: 'fa-newspaper',
url: ApiPaths.news,
url: ApiEndpoints.news,
params: {}
}
];

View File

@ -1,106 +1,92 @@
/*
* Enumeration of available API endpoints.
*
* In the cases where endpoints can be accessed with a primary key,
* the primary key should be appended to the endpoint.
* The exception to this is when the endpoint provides an :id parameter.
*/
export enum ApiPaths {
api_server_info = 'api-server-info',
api_search = 'api-search',
export enum ApiEndpoints {
api_server_info = '',
// User information
user_me = 'api-user-me',
user_roles = 'api-user-roles',
user_token = 'api-user-token',
user_simple_login = 'api-user-simple-login',
user_reset = 'api-user-reset',
user_reset_set = 'api-user-reset-set',
user_sso = 'api-user-sso',
user_sso_remove = 'api-user-sso-remove',
user_emails = 'api-user-emails',
user_email_verify = 'api-user-email-verify',
user_email_primary = 'api-user-email-primary',
user_email_remove = 'api-user-email-remove',
user_logout = 'api-user-logout',
user_register = 'api-user-register',
// User API endpoints
user_list = 'user/',
user_me = 'user/me/',
user_roles = 'user/roles/',
user_token = 'user/token/',
user_simple_login = 'email/generate/',
user_reset = 'auth/password/reset/', // Note leading prefix here
user_reset_set = 'auth/password/reset/confirm/', // Note leading prefix here
user_sso = 'auth/social/',
user_sso_remove = 'auth/social/:id/disconnect/',
user_emails = 'auth/emails/',
user_email_remove = 'auth/emails/:id/remove/',
user_email_verify = 'auth/emails/:id/verify/',
user_email_primary = 'auth/emails/:id/primary/',
user_logout = 'auth/logout/',
user_register = 'auth/registration/',
user_list = 'api-user-list',
group_list = 'api-group-list',
owner_list = 'api-owner-list',
currency_list = 'currency/exchange/',
currency_refresh = 'currency/refresh/',
task_overview = 'background-task/',
task_pending_list = 'background-task/pending/',
task_scheduled_list = 'background-task/scheduled/',
task_failed_list = 'background-task/failed/',
api_search = 'search/',
settings_global_list = 'settings/global/',
settings_user_list = 'settings/user/',
notifications_list = 'notifications/',
barcode = 'barcode/',
news = 'news/',
global_status = 'generic/status/',
version = 'version/',
sso_providers = 'auth/providers/',
group_list = 'user/group/',
owner_list = 'user/owner/',
build_order_list = 'build/',
build_order_attachment_list = 'build/attachment/',
build_line_list = 'build/line/',
bom_list = 'bom/',
task_overview = 'api-task-overview',
task_pending_list = 'api-task-pending-list',
task_scheduled_list = 'api-task-scheduled-list',
task_failed_list = 'api-task-failed-list',
// Part API endpoints
part_list = 'part/',
part_parameter_list = 'part/parameter/',
part_parameter_template_list = 'part/parameter/template/',
category_list = 'part/category/',
category_tree = 'part/category/tree/',
related_part_list = 'part/related/',
part_attachment_list = 'part/attachment/',
part_test_template_list = 'part/test-template/',
settings_global_list = 'api-settings-global-list',
settings_user_list = 'api-settings-user-list',
notifications_list = 'api-notifications-list',
company_list = 'company/',
contact_list = 'company/contact/',
address_list = 'company/address/',
company_attachment_list = 'company/attachment/',
supplier_part_list = 'company/part/',
manufacturer_part_list = 'company/part/manufacturer/',
manufacturer_part_attachment_list = 'company/part/manufacturer/attachment/',
manufacturer_part_parameter_list = 'company/part/manufacturer/parameter/',
currency_list = 'api-currency-list',
currency_refresh = 'api-currency-refresh',
barcode = 'api-barcode',
news = 'news',
global_status = 'api-global-status',
version = 'api-version',
sso_providers = 'api-sso-providers',
// Build order URLs
build_order_list = 'api-build-list',
build_order_attachment_list = 'api-build-attachment-list',
build_line_list = 'api-build-line-list',
// BOM URLs
bom_list = 'api-bom-list',
// Part URLs
part_list = 'api-part-list',
category_list = 'api-category-list',
category_tree = 'api-category-tree',
related_part_list = 'api-related-part-list',
part_attachment_list = 'api-part-attachment-list',
part_parameter_list = 'api-part-parameter-list',
part_parameter_template_list = 'api-part-parameter-template-list',
part_test_template_list = 'api-part-test-template-list',
// Company URLs
company_list = 'api-company-list',
company_attachment_list = 'api-company-attachment-list',
supplier_part_list = 'api-supplier-part-list',
manufacturer_part_list = 'api-manufacturer-part-list',
manufacturer_part_attachment_list = 'api-manufacturer-part-attachment-list',
manufacturer_part_parameter_list = 'api-manufacturer-part-parameter-list',
address_list = 'api-address-list',
contact_list = 'api-contact-list',
// Stock Item URLs
stock_item_list = 'api-stock-item-list',
stock_tracking_list = 'api-stock-tracking-list',
stock_location_list = 'api-stock-location-list',
stock_location_tree = 'api-stock-location-tree',
stock_attachment_list = 'api-stock-attachment-list',
// Purchase Order URLs
purchase_order_list = 'api-purchase-order-list',
purchase_order_line_list = 'api-purchase-order-line-list',
purchase_order_attachment_list = 'api-purchase-order-attachment-list',
// Sales Order URLs
sales_order_list = 'api-sales-order-list',
sales_order_attachment_list = 'api-sales-order-attachment-list',
sales_order_shipment_list = 'api_sales_order_shipment_list',
// Return Order URLs
return_order_list = 'api-return-order-list',
return_order_attachment_list = 'api-return-order-attachment-list',
// Plugin URLs
plugin_list = 'api-plugin-list',
plugin_setting_list = 'api-plugin-settings',
plugin_install = 'api-plugin-install',
plugin_reload = 'api-plugin-reload',
plugin_registry_status = 'api-plugin-registry-status',
error_report_list = 'api-error-report-list',
project_code_list = 'api-project-code-list',
custom_unit_list = 'api-custom-unit-list'
// Stock API endpoints
stock_item_list = 'stock/',
stock_tracking_list = 'stock/track/',
stock_location_list = 'stock/location/',
stock_location_tree = 'stock/location/tree/',
stock_attachment_list = 'stock/attachment/',
purchase_order_list = 'order/po/',
purchase_order_line_list = 'order/po-line/',
purchase_order_attachment_list = 'order/po/attachment/',
sales_order_list = 'order/so/',
sales_order_attachment_list = 'order/so/attachment/',
sales_order_shipment_list = 'order/so/shipment/',
return_order_list = 'order/ro/',
return_order_attachment_list = 'order/ro/attachment/',
plugin_list = 'plugins/',
plugin_setting_list = 'plugins/:plugin/settings/',
plugin_registry_status = 'plugins/status/',
plugin_install = 'plugins/install/',
plugin_reload = 'plugins/reload/',
error_report_list = 'error-report/',
project_code_list = 'project-code/',
custom_unit_list = 'units/'
}

View File

@ -1,7 +1,7 @@
import { t } from '@lingui/macro';
import { ApiFormFieldSet } from '../components/forms/fields/ApiFormField';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import {
openCreateApiForm,
openDeleteApiForm,
@ -31,7 +31,7 @@ export function addAttachment({
attachmentType,
callback
}: {
endpoint: ApiPaths;
endpoint: ApiEndpoints;
model: string;
pk: number;
attachmentType: 'file' | 'link';
@ -76,7 +76,7 @@ export function editAttachment({
attachmentType,
callback
}: {
endpoint: ApiPaths;
endpoint: ApiEndpoints;
model: string;
pk: number;
attachmentType: 'file' | 'link';
@ -114,7 +114,7 @@ export function deleteAttachment({
pk,
callback
}: {
endpoint: ApiPaths;
endpoint: ApiEndpoints;
pk: number;
callback: () => void;
}) {

View File

@ -12,7 +12,7 @@ import {
import { useEffect, useMemo, useState } from 'react';
import { ApiFormFieldSet } from '../components/forms/fields/ApiFormField';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { openEditApiForm } from '../functions/forms';
/**
@ -144,7 +144,7 @@ export function editCompany({
}) {
openEditApiForm({
title: t`Edit Company`,
url: ApiPaths.company_list,
url: ApiEndpoints.company_list,
pk: pk,
fields: companyFields(),
successMessage: t`Company updated`,

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { IconPackages } from '@tabler/icons-react';
import { ApiFormFieldSet } from '../components/forms/fields/ApiFormField';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { openCreateApiForm, openEditApiForm } from '../functions/forms';
/**
@ -104,7 +104,7 @@ export function partFields({
export function createPart() {
openCreateApiForm({
title: t`Create Part`,
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
successMessage: t`Part created`,
fields: partFields({})
});
@ -123,7 +123,7 @@ export function editPart({
}) {
openEditApiForm({
title: t`Edit Part`,
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
pk: part_id,
fields: partFields({ editing: true }),
successMessage: t`Part updated`,

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/macro';
import { useMemo, useState } from 'react';
import { ApiFormFieldSet } from '../components/forms/fields/ApiFormField';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { useCreateApiFormModal, useEditApiFormModal } from '../hooks/UseForm';
/**
@ -105,7 +105,7 @@ export function useCreateStockItem() {
const fields = useStockFields({ create: true });
return useCreateApiFormModal({
url: ApiPaths.stock_item_list,
url: ApiEndpoints.stock_item_list,
fields: fields,
title: t`Create Stock Item`
});
@ -125,7 +125,7 @@ export function useEditStockItem({
const fields = useStockFields({ create: false });
return useEditApiFormModal({
url: ApiPaths.stock_item_list,
url: ApiEndpoints.stock_item_list,
pk: item_id,
fields: fields,
title: t`Edit Stock Item`,

View File

@ -4,7 +4,7 @@ import { IconCheck } from '@tabler/icons-react';
import axios from 'axios';
import { api } from '../App';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { apiUrl, useServerApiState } from '../states/ApiState';
import { useLocalState } from '../states/LocalState';
import { useSessionState } from '../states/SessionState';
@ -19,7 +19,7 @@ export const doClassicLogin = async (username: string, password: string) => {
// Get token from server
const token = await axios
.get(apiUrl(ApiPaths.user_token), {
.get(apiUrl(ApiEndpoints.user_token), {
auth: { username, password },
baseURL: host,
timeout: 2000,
@ -54,7 +54,7 @@ export const doClassicLogout = async () => {
setToken(undefined);
// Logout from the server session
await api.post(apiUrl(ApiPaths.user_logout));
await api.post(apiUrl(ApiEndpoints.user_logout));
notifications.show({
title: t`Logout successful`,
@ -69,7 +69,7 @@ export const doClassicLogout = async () => {
export const doSimpleLogin = async (email: string) => {
const { host } = useLocalState.getState();
const mail = await axios
.post(apiUrl(ApiPaths.user_simple_login), {
.post(apiUrl(ApiEndpoints.user_simple_login), {
email: email
})
.then((response) => response.data)
@ -96,7 +96,7 @@ export const doTokenLogin = (token: string) => {
export function handleReset(navigate: any, values: { email: string }) {
api
.post(apiUrl(ApiPaths.user_reset), values, {
.post(apiUrl(ApiEndpoints.user_reset), values, {
headers: { Authorization: '' }
})
.then((val) => {
@ -127,7 +127,7 @@ export function checkLoginState(
no_redirect?: boolean
) {
api
.get(apiUrl(ApiPaths.user_token), {
.get(apiUrl(ApiEndpoints.user_token), {
timeout: 2000,
params: {
name: 'inventree-web-app'

View File

@ -11,7 +11,7 @@ import {
ApiFormFieldType
} from '../components/forms/fields/ApiFormField';
import { StylishText } from '../components/items/StylishText';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { PathParams, apiUrl } from '../states/ApiState';
import { invalidResponse, permissionDenied } from './notifications';
import { generateUniqueId } from './uid';
@ -20,7 +20,7 @@ import { generateUniqueId } from './uid';
* Construct an API url from the provided ApiFormProps object
*/
export function constructFormUrl(
url: ApiPaths | string,
url: ApiEndpoints | string,
pk?: string | number,
pathParams?: PathParams
): string {

View File

@ -2,7 +2,7 @@ import { useQuery } from '@tanstack/react-query';
import { useCallback, useState } from 'react';
import { api } from '../App';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { PathParams, apiUrl } from '../states/ApiState';
/**
@ -25,7 +25,7 @@ export function useInstance<T = any>({
refetchOnWindowFocus = false,
throwError = false
}: {
endpoint: ApiPaths;
endpoint: ApiEndpoints;
pk?: string | undefined;
hasPrimaryKey?: boolean;
params?: any;

View File

@ -14,7 +14,7 @@ import { useNavigate, useSearchParams } from 'react-router-dom';
import { api } from '../../App';
import { LanguageContext } from '../../contexts/LanguageContext';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { apiUrl } from '../../states/ApiState';
export default function Set_Password() {
@ -58,7 +58,7 @@ export default function Set_Password() {
// Set password with call to backend
api
.post(
apiUrl(ApiPaths.user_reset_set),
apiUrl(ApiEndpoints.user_reset_set),
{
uid: uid,
token: token,

View File

@ -8,7 +8,7 @@ import { OptionsApiForm } from '../../components/forms/ApiForm';
import { PlaceholderPill } from '../../components/items/Placeholder';
import { StylishText } from '../../components/items/StylishText';
import { StatusRenderer } from '../../components/render/StatusRenderer';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { ModelType } from '../../enums/ModelType';
import {
createPart,
@ -28,14 +28,14 @@ import { useCreateApiFormModal } from '../../hooks/UseForm';
const fields = partCategoryFields({});
function ApiFormsPlayground() {
const editCategoryForm: OpenApiFormProps = {
url: ApiPaths.category_list,
url: ApiEndpoints.category_list,
pk: 2,
title: 'Edit Category',
fields: fields
};
const createAttachmentForm: OpenApiFormProps = {
url: ApiPaths.part_attachment_list,
url: ApiEndpoints.part_attachment_list,
title: 'Create Attachment',
successMessage: 'Attachment uploaded',
fields: {
@ -70,7 +70,7 @@ function ApiFormsPlayground() {
const { modal: createPartModal, open: openCreatePart } =
useCreateApiFormModal({
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
title: 'Create part',
fields: partFieldsState,
preFormContent: (
@ -106,7 +106,7 @@ function ApiFormsPlayground() {
<Card sx={{ padding: '30px' }}>
<OptionsApiForm
props={{
url: ApiPaths.part_list,
url: ApiEndpoints.part_list,
method: 'POST',
fields: {
active: {

View File

@ -49,7 +49,7 @@ import { StylishText } from '../../components/items/StylishText';
import { TitleWithDoc } from '../../components/items/TitleWithDoc';
import { RenderInstance } from '../../components/render/Instance';
import { ModelInformationDict } from '../../components/render/ModelType';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { ModelType } from '../../enums/ModelType';
import { notYetImplemented } from '../../functions/notifications';
import { IS_DEV_OR_DEMO } from '../../main';
@ -143,7 +143,7 @@ export default function Scan() {
function runBarcode(value: string, id?: string) {
api
.post(apiUrl(ApiPaths.barcode), { barcode: value })
.post(apiUrl(ApiEndpoints.barcode), { barcode: value })
.then((response) => {
// update item in history
if (!id) return;

View File

@ -5,7 +5,7 @@ import { useToggle } from '@mantine/hooks';
import { api } from '../../../../App';
import { EditButton } from '../../../../components/items/EditButton';
import { ApiPaths } from '../../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../../enums/ApiEndpoints';
import { apiUrl } from '../../../../states/ApiState';
import { useUserState } from '../../../../states/UserState';
@ -17,7 +17,7 @@ export function AccountDetailPanel() {
const form = useForm({ initialValues: user });
const [editing, setEditing] = useToggle([false, true] as const);
function SaveData(values: any) {
api.put(apiUrl(ApiPaths.user_me), values).then((res) => {
api.put(apiUrl(ApiEndpoints.user_me), values).then((res) => {
if (res.status === 200) {
setEditing();
fetchUserState();

View File

@ -19,7 +19,7 @@ import { useEffect, useState } from 'react';
import { api, queryClient } from '../../../../App';
import { PlaceholderPill } from '../../../../components/items/Placeholder';
import { ApiPaths } from '../../../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../../../enums/ApiEndpoints';
import { apiUrl } from '../../../../states/ApiState';
import { useUserState } from '../../../../states/UserState';
@ -30,7 +30,7 @@ export function SecurityContent() {
const { isLoading: isLoadingProvider, data: dataProvider } = useQuery({
queryKey: ['sso-providers'],
queryFn: () =>
api.get(apiUrl(ApiPaths.sso_providers)).then((res) => res.data)
api.get(apiUrl(ApiEndpoints.sso_providers)).then((res) => res.data)
});
// evaluate if security options are enabled
@ -95,10 +95,11 @@ function EmailContent({}: {}) {
const [user] = useUserState((state) => [state.user]);
const { isLoading, data, refetch } = useQuery({
queryKey: ['emails'],
queryFn: () => api.get(apiUrl(ApiPaths.user_emails)).then((res) => res.data)
queryFn: () =>
api.get(apiUrl(ApiEndpoints.user_emails)).then((res) => res.data)
});
function runServerAction(url: ApiPaths) {
function runServerAction(url: ApiEndpoints) {
api
.post(apiUrl(url, undefined, { id: value }), {})
.then(() => {
@ -109,7 +110,7 @@ function EmailContent({}: {}) {
function addEmail() {
api
.post(apiUrl(ApiPaths.user_emails), {
.post(apiUrl(ApiEndpoints.user_emails), {
email: newEmailValue,
user: user?.pk
})
@ -175,13 +176,19 @@ function EmailContent({}: {}) {
</Grid.Col>
<Grid.Col span={6}>
<Group>
<Button onClick={() => runServerAction(ApiPaths.user_email_primary)}>
<Button
onClick={() => runServerAction(ApiEndpoints.user_email_primary)}
>
<Trans>Make Primary</Trans>
</Button>
<Button onClick={() => runServerAction(ApiPaths.user_email_verify)}>
<Button
onClick={() => runServerAction(ApiEndpoints.user_email_verify)}
>
<Trans>Re-send Verification</Trans>
</Button>
<Button onClick={() => runServerAction(ApiPaths.user_email_remove)}>
<Button
onClick={() => runServerAction(ApiEndpoints.user_email_remove)}
>
<Trans>Remove</Trans>
</Button>
</Group>
@ -200,7 +207,8 @@ function SsoContent({ dataProvider }: { dataProvider: any | undefined }) {
const [currentProviders, setcurrentProviders] = useState<[]>();
const { isLoading, data } = useQuery({
queryKey: ['sso-list'],
queryFn: () => api.get(apiUrl(ApiPaths.user_sso)).then((res) => res.data)
queryFn: () =>
api.get(apiUrl(ApiEndpoints.user_sso)).then((res) => res.data)
});
useEffect(() => {
@ -222,7 +230,7 @@ function SsoContent({ dataProvider }: { dataProvider: any | undefined }) {
function removeProvider() {
api
.post(apiUrl(ApiPaths.user_sso_remove, undefined, { id: value }))
.post(apiUrl(ApiEndpoints.user_sso_remove, undefined, { id: value }))
.then(() => {
queryClient.removeQueries({
queryKey: ['sso-list']

View File

@ -13,7 +13,7 @@ import { api } from '../App';
import { PageDetail } from '../components/nav/PageDetail';
import { PanelGroup } from '../components/nav/PanelGroup';
import { NotificationTable } from '../components/tables/notifications/NotificationsTable';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { useTable } from '../hooks/UseTable';
import { apiUrl } from '../states/ApiState';
@ -37,7 +37,7 @@ export default function NotificationsPage() {
color: 'green',
icon: <IconCircleCheck />,
onClick: () => {
let url = apiUrl(ApiPaths.notifications_list, record.pk);
let url = apiUrl(ApiEndpoints.notifications_list, record.pk);
api
.patch(url, {
read: true
@ -64,7 +64,7 @@ export default function NotificationsPage() {
title: t`Mark as unread`,
icon: <IconCircleX />,
onClick: () => {
let url = apiUrl(ApiPaths.notifications_list, record.pk);
let url = apiUrl(ApiEndpoints.notifications_list, record.pk);
api
.patch(url, {
@ -81,7 +81,7 @@ export default function NotificationsPage() {
icon: <IconTrash />,
onClick: () => {
api
.delete(apiUrl(ApiPaths.notifications_list, record.pk))
.delete(apiUrl(ApiEndpoints.notifications_list, record.pk))
.then((response) => {
readTable.refreshTable();
});

View File

@ -34,7 +34,7 @@ import { BuildOrderTable } from '../../components/tables/build/BuildOrderTable';
import { AttachmentTable } from '../../components/tables/general/AttachmentTable';
import { StockItemTable } from '../../components/tables/stock/StockItemTable';
import { NotesEditor } from '../../components/widgets/MarkdownEditor';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { ModelType } from '../../enums/ModelType';
import { buildOrderFields } from '../../forms/BuildForms';
import { openEditApiForm } from '../../functions/forms';
@ -55,7 +55,7 @@ export default function BuildDetail() {
refreshInstance,
instanceQuery
} = useInstance({
endpoint: ApiPaths.build_order_list,
endpoint: ApiEndpoints.build_order_list,
pk: id,
params: {
part_detail: true
@ -166,7 +166,7 @@ export default function BuildDetail() {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.build_order_attachment_list}
endpoint={ApiEndpoints.build_order_attachment_list}
model="build"
pk={Number(id)}
/>
@ -178,7 +178,7 @@ export default function BuildDetail() {
icon: <IconNotes />,
content: (
<NotesEditor
url={apiUrl(ApiPaths.build_order_list, build.pk)}
url={apiUrl(ApiEndpoints.build_order_list, build.pk)}
data={build.notes ?? ''}
allowEdit={true}
/>
@ -195,7 +195,7 @@ export default function BuildDetail() {
build.pk &&
openEditApiForm({
url: ApiPaths.build_order_list,
url: ApiEndpoints.build_order_list,
pk: build.pk,
title: t`Edit Build Order`,
fields: fields,

View File

@ -1,11 +1,11 @@
import { t } from '@lingui/macro';
import { Button, Stack, Text } from '@mantine/core';
import { Button, Stack } from '@mantine/core';
import { useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import { PageDetail } from '../../components/nav/PageDetail';
import { BuildOrderTable } from '../../components/tables/build/BuildOrderTable';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { buildOrderFields } from '../../forms/BuildForms';
import { openCreateApiForm } from '../../functions/forms';
@ -17,7 +17,7 @@ export default function BuildIndex() {
const newBuildOrder = useCallback(() => {
openCreateApiForm({
url: ApiPaths.build_order_list,
url: ApiEndpoints.build_order_list,
title: t`Add Build Order`,
fields: buildOrderFields(),
successMessage: t`Build order created`,

View File

@ -37,7 +37,7 @@ import { ReturnOrderTable } from '../../components/tables/sales/ReturnOrderTable
import { SalesOrderTable } from '../../components/tables/sales/SalesOrderTable';
import { StockItemTable } from '../../components/tables/stock/StockItemTable';
import { NotesEditor } from '../../components/widgets/MarkdownEditor';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { UserRoles } from '../../enums/Roles';
import { editCompany } from '../../forms/CompanyForms';
import { useInstance } from '../../hooks/UseInstance';
@ -62,7 +62,7 @@ export default function CompanyDetail(props: CompanyDetailProps) {
refreshInstance,
instanceQuery
} = useInstance({
endpoint: ApiPaths.company_list,
endpoint: ApiEndpoints.company_list,
pk: id,
params: {},
refetchOnMount: true
@ -158,7 +158,7 @@ export default function CompanyDetail(props: CompanyDetailProps) {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.company_attachment_list}
endpoint={ApiEndpoints.company_attachment_list}
model="company"
pk={company.pk ?? -1}
/>
@ -170,7 +170,7 @@ export default function CompanyDetail(props: CompanyDetailProps) {
icon: <IconNotes />,
content: (
<NotesEditor
url={apiUrl(ApiPaths.company_list, company.pk)}
url={apiUrl(ApiEndpoints.company_list, company.pk)}
data={company?.notes ?? ''}
allowEdit={true}
/>

View File

@ -14,14 +14,14 @@ import { PanelGroup, PanelType } from '../../components/nav/PanelGroup';
import { AttachmentTable } from '../../components/tables/general/AttachmentTable';
import ManufacturerPartParameterTable from '../../components/tables/purchasing/ManufacturerPartParameterTable';
import { SupplierPartTable } from '../../components/tables/purchasing/SupplierPartTable';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useInstance } from '../../hooks/UseInstance';
export default function ManufacturerPartDetail() {
const { id } = useParams();
const { instance: manufacturerPart, instanceQuery } = useInstance({
endpoint: ApiPaths.manufacturer_part_list,
endpoint: ApiEndpoints.manufacturer_part_list,
pk: id,
hasPrimaryKey: true,
params: {
@ -69,7 +69,7 @@ export default function ManufacturerPartDetail() {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.manufacturer_part_attachment_list}
endpoint={ApiEndpoints.manufacturer_part_attachment_list}
model="manufacturer_part"
pk={manufacturerPart?.pk}
/>

View File

@ -12,14 +12,14 @@ import { useParams } from 'react-router-dom';
import { PageDetail } from '../../components/nav/PageDetail';
import { PanelGroup, PanelType } from '../../components/nav/PanelGroup';
import { PurchaseOrderTable } from '../../components/tables/purchasing/PurchaseOrderTable';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useInstance } from '../../hooks/UseInstance';
export default function SupplierPartDetail() {
const { id } = useParams();
const { instance: supplierPart, instanceQuery } = useInstance({
endpoint: ApiPaths.supplier_part_list,
endpoint: ApiEndpoints.supplier_part_list,
pk: id,
hasPrimaryKey: true,
params: {

View File

@ -14,7 +14,7 @@ import { PanelGroup, PanelType } from '../../components/nav/PanelGroup';
import { PartCategoryTree } from '../../components/nav/PartCategoryTree';
import { PartCategoryTable } from '../../components/tables/part/PartCategoryTable';
import { PartListTable } from '../../components/tables/part/PartTable';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useInstance } from '../../hooks/UseInstance';
/**
@ -36,7 +36,7 @@ export default function CategoryDetail({}: {}) {
refreshInstance,
instanceQuery
} = useInstance({
endpoint: ApiPaths.category_list,
endpoint: ApiEndpoints.category_list,
hasPrimaryKey: true,
pk: id,
params: {

View File

@ -52,7 +52,7 @@ import { SupplierPartTable } from '../../components/tables/purchasing/SupplierPa
import { SalesOrderTable } from '../../components/tables/sales/SalesOrderTable';
import { StockItemTable } from '../../components/tables/stock/StockItemTable';
import { NotesEditor } from '../../components/widgets/MarkdownEditor';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { editPart } from '../../forms/PartForms';
import { useInstance } from '../../hooks/UseInstance';
import { apiUrl } from '../../states/ApiState';
@ -73,7 +73,7 @@ export default function PartDetail() {
refreshInstance,
instanceQuery
} = useInstance({
endpoint: ApiPaths.part_list,
endpoint: ApiEndpoints.part_list,
pk: id,
params: {
path_detail: true
@ -233,7 +233,7 @@ export default function PartDetail() {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.part_attachment_list}
endpoint={ApiEndpoints.part_attachment_list}
model="part"
pk={part.pk ?? -1}
/>
@ -245,7 +245,7 @@ export default function PartDetail() {
icon: <IconNotes />,
content: (
<NotesEditor
url={apiUrl(ApiPaths.part_list, part.pk)}
url={apiUrl(ApiEndpoints.part_list, part.pk)}
data={part.notes ?? ''}
allowEdit={true}
/>

View File

@ -26,7 +26,7 @@ import { AttachmentTable } from '../../components/tables/general/AttachmentTable
import { PurchaseOrderLineItemTable } from '../../components/tables/purchasing/PurchaseOrderLineItemTable';
import { StockItemTable } from '../../components/tables/stock/StockItemTable';
import { NotesEditor } from '../../components/widgets/MarkdownEditor';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useInstance } from '../../hooks/UseInstance';
import { apiUrl } from '../../states/ApiState';
import { useUserState } from '../../states/UserState';
@ -40,7 +40,7 @@ export default function PurchaseOrderDetail() {
const user = useUserState();
const { instance: order, instanceQuery } = useInstance({
endpoint: ApiPaths.purchase_order_list,
endpoint: ApiEndpoints.purchase_order_list,
pk: id,
params: {
supplier_detail: true
@ -79,7 +79,7 @@ export default function PurchaseOrderDetail() {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.purchase_order_attachment_list}
endpoint={ApiEndpoints.purchase_order_attachment_list}
model="order"
pk={Number(id)}
/>
@ -91,7 +91,7 @@ export default function PurchaseOrderDetail() {
icon: <IconNotes />,
content: (
<NotesEditor
url={apiUrl(ApiPaths.purchase_order_list, id)}
url={apiUrl(ApiEndpoints.purchase_order_list, id)}
data={order.notes ?? ''}
allowEdit={true}
/>

View File

@ -8,7 +8,7 @@ import { PageDetail } from '../../components/nav/PageDetail';
import { PanelGroup, PanelType } from '../../components/nav/PanelGroup';
import { AttachmentTable } from '../../components/tables/general/AttachmentTable';
import { NotesEditor } from '../../components/widgets/MarkdownEditor';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useInstance } from '../../hooks/UseInstance';
import { apiUrl } from '../../states/ApiState';
@ -19,7 +19,7 @@ export default function ReturnOrderDetail() {
const { id } = useParams();
const { instance: order, instanceQuery } = useInstance({
endpoint: ApiPaths.return_order_list,
endpoint: ApiEndpoints.return_order_list,
pk: id,
params: {
customer_detail: true
@ -39,7 +39,7 @@ export default function ReturnOrderDetail() {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.return_order_attachment_list}
endpoint={ApiEndpoints.return_order_attachment_list}
model="order"
pk={Number(id)}
/>
@ -51,7 +51,7 @@ export default function ReturnOrderDetail() {
icon: <IconNotes />,
content: (
<NotesEditor
url={apiUrl(ApiPaths.return_order_list, id)}
url={apiUrl(ApiEndpoints.return_order_list, id)}
data={order.notes ?? ''}
allowEdit={true}
/>

View File

@ -17,7 +17,7 @@ import { PanelGroup, PanelType } from '../../components/nav/PanelGroup';
import { BuildOrderTable } from '../../components/tables/build/BuildOrderTable';
import { AttachmentTable } from '../../components/tables/general/AttachmentTable';
import { NotesEditor } from '../../components/widgets/MarkdownEditor';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useInstance } from '../../hooks/UseInstance';
import { apiUrl } from '../../states/ApiState';
@ -28,7 +28,7 @@ export default function SalesOrderDetail() {
const { id } = useParams();
const { instance: order, instanceQuery } = useInstance({
endpoint: ApiPaths.sales_order_list,
endpoint: ApiEndpoints.sales_order_list,
pk: id,
params: {
customer_detail: true
@ -77,7 +77,7 @@ export default function SalesOrderDetail() {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.sales_order_attachment_list}
endpoint={ApiEndpoints.sales_order_attachment_list}
model="order"
pk={Number(id)}
/>
@ -89,7 +89,7 @@ export default function SalesOrderDetail() {
icon: <IconNotes />,
content: (
<NotesEditor
url={apiUrl(ApiPaths.sales_order_list, id)}
url={apiUrl(ApiEndpoints.sales_order_list, id)}
data={order.notes ?? ''}
allowEdit={true}
/>

View File

@ -9,7 +9,7 @@ import { PanelGroup, PanelType } from '../../components/nav/PanelGroup';
import { StockLocationTree } from '../../components/nav/StockLocationTree';
import { StockItemTable } from '../../components/tables/stock/StockItemTable';
import { StockLocationTable } from '../../components/tables/stock/StockLocationTable';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useInstance } from '../../hooks/UseInstance';
export default function Stock() {
@ -27,7 +27,7 @@ export default function Stock() {
refreshInstance,
instanceQuery
} = useInstance({
endpoint: ApiPaths.stock_location_list,
endpoint: ApiEndpoints.stock_location_list,
hasPrimaryKey: true,
pk: id,
params: {

View File

@ -36,7 +36,7 @@ import { StockLocationTree } from '../../components/nav/StockLocationTree';
import { AttachmentTable } from '../../components/tables/general/AttachmentTable';
import { StockItemTable } from '../../components/tables/stock/StockItemTable';
import { NotesEditor } from '../../components/widgets/MarkdownEditor';
import { ApiPaths } from '../../enums/ApiEndpoints';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { useEditStockItem } from '../../forms/StockForms';
import { useInstance } from '../../hooks/UseInstance';
import { apiUrl } from '../../states/ApiState';
@ -54,7 +54,7 @@ export default function StockDetail() {
refreshInstance,
instanceQuery
} = useInstance({
endpoint: ApiPaths.stock_item_list,
endpoint: ApiEndpoints.stock_item_list,
pk: id,
params: {
part_detail: true,
@ -114,7 +114,7 @@ export default function StockDetail() {
icon: <IconPaperclip />,
content: (
<AttachmentTable
endpoint={ApiPaths.stock_attachment_list}
endpoint={ApiEndpoints.stock_attachment_list}
model="stock_item"
pk={Number(id)}
/>
@ -126,7 +126,7 @@ export default function StockDetail() {
icon: <IconNotes />,
content: (
<NotesEditor
url={apiUrl(ApiPaths.stock_item_list, id)}
url={apiUrl(ApiEndpoints.stock_item_list, id)}
data={stockitem.notes ?? ''}
allowEdit={true}
/>

View File

@ -5,7 +5,7 @@ import { api } from '../App';
import { StatusCodeListInterface } from '../components/render/StatusRenderer';
import { statusCodeList } from '../defaults/backendMappings';
import { emptyServerAPI } from '../defaults/defaults';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { ModelType } from '../enums/ModelType';
import { AuthProps, ServerAPIProps } from './states';
@ -27,14 +27,14 @@ export const useServerApiState = create<ServerApiStateProps>()(
fetchServerApiState: async () => {
// Fetch server data
await api
.get(apiUrl(ApiPaths.api_server_info))
.get(ApiEndpoints.api_server_info)
.then((response) => {
set({ server: response.data });
})
.catch(() => {});
// Fetch status data for rendering labels
await api
.get(apiUrl(ApiPaths.global_status))
.get(ApiEndpoints.global_status)
.then((response) => {
const newStatusLookup: StatusLookup = {} as StatusLookup;
for (const key in response.data) {
@ -47,7 +47,7 @@ export const useServerApiState = create<ServerApiStateProps>()(
// Fetch login/SSO behaviour
await api
.get(apiUrl(ApiPaths.sso_providers), {
.get(ApiEndpoints.sso_providers, {
headers: { Authorization: '' }
})
.then((response) => {
@ -72,182 +72,17 @@ export function apiPrefix(): string {
return '/api/';
}
/**
* Return the endpoint associated with a given API path
*/
export function apiEndpoint(path: ApiPaths): string {
switch (path) {
case ApiPaths.api_server_info:
return '';
case ApiPaths.user_list:
return 'user/';
case ApiPaths.owner_list:
return 'user/owner/';
case ApiPaths.user_me:
return 'user/me/';
case ApiPaths.user_roles:
return 'user/roles/';
case ApiPaths.user_token:
return 'user/token/';
case ApiPaths.user_simple_login:
return 'email/generate/';
case ApiPaths.user_reset:
// Note leading prefix here
return 'auth/password/reset/';
case ApiPaths.user_reset_set:
// Note leading prefix here
return 'auth/password/reset/confirm/';
case ApiPaths.user_sso:
return 'auth/social/';
case ApiPaths.user_sso_remove:
return 'auth/social/:id/disconnect/';
case ApiPaths.user_emails:
return 'auth/emails/';
case ApiPaths.user_email_remove:
return 'auth/emails/:id/remove/';
case ApiPaths.user_email_verify:
return 'auth/emails/:id/verify/';
case ApiPaths.user_email_primary:
return 'auth/emails/:id/primary/';
case ApiPaths.user_logout:
return 'auth/logout/';
case ApiPaths.user_register:
return 'auth/registration/';
case ApiPaths.currency_list:
return 'currency/exchange/';
case ApiPaths.currency_refresh:
return 'currency/refresh/';
case ApiPaths.task_overview:
return 'background-task/';
case ApiPaths.task_pending_list:
return 'background-task/pending/';
case ApiPaths.task_scheduled_list:
return 'background-task/scheduled/';
case ApiPaths.task_failed_list:
return 'background-task/failed/';
case ApiPaths.api_search:
return 'search/';
case ApiPaths.settings_global_list:
return 'settings/global/';
case ApiPaths.settings_user_list:
return 'settings/user/';
case ApiPaths.notifications_list:
return 'notifications/';
case ApiPaths.barcode:
return 'barcode/';
case ApiPaths.news:
return 'news/';
case ApiPaths.global_status:
return 'generic/status/';
case ApiPaths.version:
return 'version/';
case ApiPaths.sso_providers:
return 'auth/providers/';
case ApiPaths.group_list:
return 'user/group/';
case ApiPaths.owner_list:
return 'user/owner/';
case ApiPaths.build_order_list:
return 'build/';
case ApiPaths.build_order_attachment_list:
return 'build/attachment/';
case ApiPaths.build_line_list:
return 'build/line/';
case ApiPaths.bom_list:
return 'bom/';
case ApiPaths.part_list:
return 'part/';
case ApiPaths.part_parameter_list:
return 'part/parameter/';
case ApiPaths.part_parameter_template_list:
return 'part/parameter/template/';
case ApiPaths.category_list:
return 'part/category/';
case ApiPaths.category_tree:
return 'part/category/tree/';
case ApiPaths.related_part_list:
return 'part/related/';
case ApiPaths.part_attachment_list:
return 'part/attachment/';
case ApiPaths.part_test_template_list:
return 'part/test-template/';
case ApiPaths.company_list:
return 'company/';
case ApiPaths.contact_list:
return 'company/contact/';
case ApiPaths.address_list:
return 'company/address/';
case ApiPaths.company_attachment_list:
return 'company/attachment/';
case ApiPaths.supplier_part_list:
return 'company/part/';
case ApiPaths.manufacturer_part_list:
return 'company/part/manufacturer/';
case ApiPaths.manufacturer_part_attachment_list:
return 'company/part/manufacturer/attachment/';
case ApiPaths.manufacturer_part_parameter_list:
return 'company/part/manufacturer/parameter/';
case ApiPaths.stock_item_list:
return 'stock/';
case ApiPaths.stock_tracking_list:
return 'stock/track/';
case ApiPaths.stock_location_list:
return 'stock/location/';
case ApiPaths.stock_location_tree:
return 'stock/location/tree/';
case ApiPaths.stock_attachment_list:
return 'stock/attachment/';
case ApiPaths.purchase_order_list:
return 'order/po/';
case ApiPaths.purchase_order_line_list:
return 'order/po-line/';
case ApiPaths.purchase_order_attachment_list:
return 'order/po/attachment/';
case ApiPaths.sales_order_list:
return 'order/so/';
case ApiPaths.sales_order_attachment_list:
return 'order/so/attachment/';
case ApiPaths.sales_order_shipment_list:
return 'order/so/shipment/';
case ApiPaths.return_order_list:
return 'order/ro/';
case ApiPaths.return_order_attachment_list:
return 'order/ro/attachment/';
case ApiPaths.plugin_list:
return 'plugins/';
case ApiPaths.plugin_setting_list:
return 'plugins/:plugin/settings/';
case ApiPaths.plugin_registry_status:
return 'plugins/status/';
case ApiPaths.plugin_install:
return 'plugins/install/';
case ApiPaths.plugin_reload:
return 'plugins/reload/';
case ApiPaths.error_report_list:
return 'error-report/';
case ApiPaths.project_code_list:
return 'project-code/';
case ApiPaths.custom_unit_list:
return 'units/';
default:
return '';
}
}
export type PathParams = Record<string, string | number>;
/**
* Construct an API URL with an endpoint and (optional) pk value
*/
export function apiUrl(
path: ApiPaths | string,
endpoint: ApiEndpoints | string,
pk?: any,
pathParams?: PathParams
): string {
let _url = path;
if (Object.values(ApiPaths).includes(path as ApiPaths)) {
_url = apiEndpoint(path as ApiPaths);
}
let _url = endpoint;
// If the URL does not start with a '/', add the API prefix
if (!_url.startsWith('/')) {
@ -255,8 +90,12 @@ export function apiUrl(
}
if (_url && pk) {
if (_url.indexOf(':id') >= 0) {
_url = _url.replace(':id', `${pk}`);
} else {
_url += `${pk}/`;
}
}
if (_url && pathParams) {
for (const key in pathParams) {

View File

@ -4,7 +4,7 @@
import { create, createStore } from 'zustand';
import { api } from '../App';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { isTrue } from '../functions/conversion';
import { PathParams, apiUrl } from './ApiState';
import { Setting, SettingsLookup } from './states';
@ -13,7 +13,7 @@ export interface SettingsStateProps {
settings: Setting[];
lookup: SettingsLookup;
fetchSettings: () => void;
endpoint: ApiPaths;
endpoint: ApiEndpoints;
pathParams?: PathParams;
getSetting: (key: string, default_value?: string) => string; // Return a raw setting value
isSet: (key: string, default_value?: boolean) => boolean; // Check a "boolean" setting
@ -26,10 +26,10 @@ export const useGlobalSettingsState = create<SettingsStateProps>(
(set, get) => ({
settings: [],
lookup: {},
endpoint: ApiPaths.settings_global_list,
endpoint: ApiEndpoints.settings_global_list,
fetchSettings: async () => {
await api
.get(apiUrl(ApiPaths.settings_global_list))
.get(apiUrl(ApiEndpoints.settings_global_list))
.then((response) => {
set({
settings: response.data,
@ -56,10 +56,10 @@ export const useGlobalSettingsState = create<SettingsStateProps>(
export const useUserSettingsState = create<SettingsStateProps>((set, get) => ({
settings: [],
lookup: {},
endpoint: ApiPaths.settings_user_list,
endpoint: ApiEndpoints.settings_user_list,
fetchSettings: async () => {
await api
.get(apiUrl(ApiPaths.settings_user_list))
.get(apiUrl(ApiEndpoints.settings_user_list))
.then((response) => {
set({
settings: response.data,
@ -94,11 +94,11 @@ export const createPluginSettingsState = ({
return createStore<SettingsStateProps>()((set, get) => ({
settings: [],
lookup: {},
endpoint: ApiPaths.plugin_setting_list,
endpoint: ApiEndpoints.plugin_setting_list,
pathParams,
fetchSettings: async () => {
await api
.get(apiUrl(ApiPaths.plugin_setting_list, undefined, { plugin }))
.get(apiUrl(ApiEndpoints.plugin_setting_list, undefined, { plugin }))
.then((response) => {
const settings = response.data;
set({

View File

@ -1,7 +1,7 @@
import { create } from 'zustand';
import { api } from '../App';
import { ApiPaths } from '../enums/ApiEndpoints';
import { ApiEndpoints } from '../enums/ApiEndpoints';
import { UserPermissions, UserRoles } from '../enums/Roles';
import { doClassicLogout } from '../functions/auth';
import { apiUrl } from './ApiState';
@ -37,7 +37,7 @@ export const useUserState = create<UserStateProps>((set, get) => ({
fetchUserState: async () => {
// Fetch user data
await api
.get(apiUrl(ApiPaths.user_me), {
.get(apiUrl(ApiEndpoints.user_me), {
timeout: 2000
})
.then((response) => {
@ -58,7 +58,7 @@ export const useUserState = create<UserStateProps>((set, get) => ({
// Fetch role data
await api
.get(apiUrl(ApiPaths.user_roles))
.get(apiUrl(ApiEndpoints.user_roles))
.then((response) => {
const user: UserProps = get().user as UserProps;