feat: implement bulk action confirmation modal and related functionality

- Updated request methods for batch operations in constants.ts to use PUT instead of POST.
- Added new translation keys for bulk actions in English and Indonesian language files.
- Created BulkActionConfirmationModal component to handle bulk lifecycle actions with progress tracking and summary display.
- Introduced SummaryPanel component to show aggregated results of bulk actions.
- Enhanced BulkActionMenu to support custom bulk actions and improved action handling based on selected rows.
- Integrated bulk action handling in EnterpriseDataTable, allowing for batch processing of selected entities.
- Added new types for bulk action modal state and results in entity.ts.
- Exported BulkActionConfirmationModal from the module index for accessibility.
This commit is contained in:
Firman Ramdhani
2026-07-23 11:47:23 +07:00
parent 0243b6aa96
commit 4e13423409
11 changed files with 977 additions and 69 deletions
@@ -279,10 +279,10 @@ export abstract class BaseRemoteDataServices<E extends BaseEntity = BaseEntity,
});
}
/** Delete multiple entities by IDs. */
batchDelete(ids: EntityId[], config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
/** Delete multiple entities by IDs. Optionally sends form data as `meta` in the request body. */
batchDelete(ids: EntityId[], meta?: Record<string, unknown>, config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
return this.execute<void>(DESCRIPTORS.batchDelete, {
config: { ...config, data: { ids } },
config: { ...config, data: { ids, ...(meta ? { meta } : {}) } },
});
}
@@ -296,10 +296,10 @@ export abstract class BaseRemoteDataServices<E extends BaseEntity = BaseEntity,
});
}
/** Activate multiple entities. */
batchActivate(ids: EntityId[], config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
/** Activate multiple entities. Optionally sends form data as `meta` in the request body. */
batchActivate(ids: EntityId[], meta?: Record<string, unknown>, config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
return this.execute<void>(DESCRIPTORS.batchActivate, {
config: { ...config, data: { ids } },
config: { ...config, data: { ids, ...(meta ? { meta } : {}) } },
});
}
@@ -311,10 +311,10 @@ export abstract class BaseRemoteDataServices<E extends BaseEntity = BaseEntity,
});
}
/** Deactivate multiple entities. */
batchDeactivate(ids: EntityId[], config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
/** Deactivate multiple entities. Optionally sends form data as `meta` in the request body. */
batchDeactivate(ids: EntityId[], meta?: Record<string, unknown>, config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
return this.execute<void>(DESCRIPTORS.batchDeactivate, {
config: { ...config, data: { ids } },
config: { ...config, data: { ids, ...(meta ? { meta } : {}) } },
});
}
@@ -328,10 +328,10 @@ export abstract class BaseRemoteDataServices<E extends BaseEntity = BaseEntity,
});
}
/** Confirm processing of multiple data records. */
batchConfirmData(ids: EntityId[], config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
/** Confirm processing of multiple data records. Optionally sends form data as `meta` in the request body. */
batchConfirmData(ids: EntityId[], meta?: Record<string, unknown>, config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
return this.execute<void>(DESCRIPTORS.batchConfirmData, {
config: { ...config, data: { ids } },
config: { ...config, data: { ids, ...(meta ? { meta } : {}) } },
});
}
@@ -343,10 +343,10 @@ export abstract class BaseRemoteDataServices<E extends BaseEntity = BaseEntity,
});
}
/** Cancel processing of multiple data records. */
batchCancelData(ids: EntityId[], config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
/** Cancel processing of multiple data records. Optionally sends form data as `meta` in the request body. */
batchCancelData(ids: EntityId[], meta?: Record<string, unknown>, config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
return this.execute<void>(DESCRIPTORS.batchCancelData, {
config: { ...config, data: { ids } },
config: { ...config, data: { ids, ...(meta ? { meta } : {}) } },
});
}
@@ -360,10 +360,10 @@ export abstract class BaseRemoteDataServices<E extends BaseEntity = BaseEntity,
});
}
/** Rollback multiple transactions. */
batchRollbackData(ids: EntityId[], config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
/** Rollback multiple transactions. Optionally sends form data as `meta` in the request body. */
batchRollbackData(ids: EntityId[], meta?: Record<string, unknown>, config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
return this.execute<void>(DESCRIPTORS.batchRollbackData, {
config: { ...config, data: { ids } },
config: { ...config, data: { ids, ...(meta ? { meta } : {}) } },
});
}
@@ -375,10 +375,10 @@ export abstract class BaseRemoteDataServices<E extends BaseEntity = BaseEntity,
});
}
/** Hold multiple transactions. */
batchHoldData(ids: EntityId[], config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
/** Hold multiple transactions. Optionally sends form data as `meta` in the request body. */
batchHoldData(ids: EntityId[], meta?: Record<string, unknown>, config?: AxiosRequestConfig): Promise<ApiResponse<void>> {
return this.execute<void>(DESCRIPTORS.batchHoldData, {
config: { ...config, data: { ids } },
config: { ...config, data: { ids, ...(meta ? { meta } : {}) } },
});
}
}
@@ -33,22 +33,22 @@ export const DEFAULT_METHODS: RequestMethodMap = {
createMethod: 'POST',
editMethod: 'PUT',
deleteMethod: 'DELETE',
batchDeleteMethod: 'POST',
batchDeleteMethod: 'PUT',
activateMethod: 'PATCH',
batchActivateMethod: 'POST',
batchActivateMethod: 'PUT',
deactivateMethod: 'PATCH',
batchDeactivateMethod: 'POST',
batchDeactivateMethod: 'PUT',
confirmDataMethod: 'PATCH',
batchConfirmDataMethod: 'POST',
batchConfirmDataMethod: 'PUT',
cancelDataMethod: 'PATCH',
batchCancelDataMethod: 'POST',
batchCancelDataMethod: 'PUT',
rollbackDataMethod: 'PATCH',
batchRollbackDataMethod: 'POST',
batchRollbackDataMethod: 'PUT',
holdDataMethod: 'PATCH',
batchHoldDataMethod: 'POST',
batchHoldDataMethod: 'PUT',
};
// ─── Operation Descriptors ──────────────────────────────────────