This commit is contained in:
Ahmed Bouhuolia
2025-11-19 22:59:30 +02:00
parent 2b384b2f6f
commit 5eafd23bf8
75 changed files with 1986 additions and 826 deletions

View File

@@ -0,0 +1,43 @@
// @ts-nocheck
import { useCallback } from 'react';
import { DialogsName } from '@/constants/dialogs';
import { useDialogActions } from '@/hooks/state';
export const useBulkDeleteDialog = (
dialogName: DialogsName,
validateBulkDeleteMutation,
) => {
const { openDialog, closeDialog } = useDialogActions();
const { mutateAsync: validateBulkDelete, isLoading } =
validateBulkDeleteMutation;
const openBulkDeleteDialog = useCallback(
async (ids: number[]) => {
if (!ids?.length) {
return;
}
const { deletableCount = 0, nonDeletableCount = 0 } =
await validateBulkDelete(ids);
const totalSelected = deletableCount + nonDeletableCount || ids.length;
openDialog(dialogName, {
ids,
deletableCount,
undeletableCount: nonDeletableCount,
totalSelected,
});
},
[dialogName, openDialog, validateBulkDelete],
);
const closeBulkDeleteDialog = useCallback(() => {
closeDialog(dialogName);
}, [closeDialog, dialogName]);
return {
openBulkDeleteDialog,
closeBulkDeleteDialog,
isValidatingBulkDelete: isLoading,
};
};

View File

@@ -158,7 +158,22 @@ export function useBulkDeleteAccounts(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('accounts/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'accounts/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.

View File

@@ -140,6 +140,20 @@ export function useBulkDeleteBills(props) {
);
}
export function useValidateBulkDeleteBills(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('bills/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
const transformBillsResponse = (response) => ({
bills: response.data.bills,
pagination: transformPagination(response.data.pagination),

View File

@@ -119,7 +119,22 @@ export function useBulkDeleteCreditNotes(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('credit-notes/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'credit-notes/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -130,6 +145,20 @@ export function useBulkDeleteCreditNotes(props) {
);
}
export function useValidateBulkDeleteCreditNotes(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('credit-notes/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
const transformCreditNotes = (res) => ({
creditNotes: res.data.credit_notes,
pagination: transformPagination(res.data.pagination),

View File

@@ -132,7 +132,22 @@ export function useBulkDeleteEstimates(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('sale-estimates/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'sale-estimates/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -143,6 +158,20 @@ export function useBulkDeleteEstimates(props) {
);
}
export function useValidateBulkDeleteEstimates(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('sale-estimates/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
/**
* Mark the given estimate as delivered.
*/

View File

@@ -110,7 +110,22 @@ export function useBulkDeleteExpenses(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('expenses/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'expenses/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -121,6 +136,20 @@ export function useBulkDeleteExpenses(props) {
);
}
export function useValidateBulkDeleteExpenses(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('expenses/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
/**
* Edits the given expense.
*/

View File

@@ -133,7 +133,22 @@ export function useBulkDeleteInvoices(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('sale-invoices/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'sale-invoices/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -144,6 +159,35 @@ export function useBulkDeleteInvoices(props) {
);
}
export interface ValidateBulkDeleteInvoicesResponse {
deletableCount: number;
nonDeletableCount: number;
deletableIds: number[];
nonDeletableIds: number[];
}
export function useValidateBulkDeleteInvoices(
props?: UseMutationOptions<
ValidateBulkDeleteInvoicesResponse,
Error,
number[]
>,
) {
const apiRequest = useApiRequest();
return useMutation<
ValidateBulkDeleteInvoicesResponse,
Error,
number[]
>(
(ids) =>
apiRequest
.post('sale-invoices/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
props,
);
}
const transformInvoices = (res) => ({
invoices: res.data.sales_invoices,
pagination: transformPagination(res.data.pagination),

View File

@@ -96,7 +96,22 @@ export function useBulkDeleteManualJournals(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('manual-journals/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'manual-journals/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -107,6 +122,20 @@ export function useBulkDeleteManualJournals(props) {
);
}
export function useValidateBulkDeleteManualJournals(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('manual-journals/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
/**
* Publishes the given manual journal.
*/

View File

@@ -158,7 +158,22 @@ export function useBulkDeletePaymentReceives(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('payments-received/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'payments-received/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -169,6 +184,20 @@ export function useBulkDeletePaymentReceives(props) {
);
}
export function useValidateBulkDeletePaymentReceives(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('payments-received/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
/**
* Retrieve specific payment receive.
* @param {number} id - Payment receive.

View File

@@ -112,7 +112,22 @@ export function useBulkDeleteReceipts(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('sale-receipts/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'sale-receipts/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -123,6 +138,20 @@ export function useBulkDeleteReceipts(props) {
);
}
export function useValidateBulkDeleteReceipts(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('sale-receipts/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
/**
* Deletes the given sale invoice.
*/

View File

@@ -121,7 +121,22 @@ export function useBulkDeleteVendorCredits(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) => apiRequest.post('vendor-credits/bulk-delete', { ids }),
({
ids,
skipUndeletable = false,
}: {
ids: number[];
skipUndeletable?: boolean;
}) =>
apiRequest.post(
'vendor-credits/bulk-delete',
{ ids },
{
params: skipUndeletable
? { skip_undeletable: true }
: undefined,
},
),
{
onSuccess: () => {
// Common invalidate queries.
@@ -132,6 +147,20 @@ export function useBulkDeleteVendorCredits(props) {
);
}
export function useValidateBulkDeleteVendorCredits(props) {
const apiRequest = useApiRequest();
return useMutation(
(ids: number[]) =>
apiRequest
.post('vendor-credits/validate-bulk-delete', { ids })
.then((res) => transformToCamelCase(res.data)),
{
...props,
},
);
}
const transformVendorCreditsResponse = (response) => ({
vendorCredits: response.data.vendor_credits,
pagination: transformPagination(response.data.pagination),

View File

@@ -77,9 +77,13 @@ export const useSidebarSubmenu = () => {
* Dialogs actions.
*/
export const useDialogActions = () => {
const dispatch = useDispatch();
return {
openDialog: useDispatchAction(openDialog),
closeDialog: useDispatchAction(closeDialog),
openDialog: (name: string, payload?: {}) =>
dispatch(openDialog(name, payload)),
closeDialog: (name: string, payload?: {}) =>
dispatch(closeDialog(name, payload)),
};
};