Add queue management dashboard (#15202)
Adds a comprehensive queue management interface to the admin panel for viewing and managing background jobs. **Features:** - Queue detail pages showing paginated job lists (50 per page) - Filter jobs by state: completed, failed, active, waiting, delayed, paused - Checkbox selection with bulk actions (delete jobs, retry failed jobs) - Per-job dropdown menu for individual retry/delete - Expandable rows showing error messages, stack traces, and job data - Relative timestamps with hover tooltips - Display attempt counts on failed jobs - Dynamic retention policy info from backend **Changes:** - Backend: New AdminPanelQueueService with GraphQL endpoints for job listing, retry, and delete - Frontend: Queue detail page with QueueJobsTable component - Updated retention policy: completed jobs kept 4 hours, failed jobs kept 7 days (max 1000 each) - Added JobState enum for type safety <img width="634" height="696" alt="Screenshot_2025-10-20_at_11 45 25" src="https://github.com/user-attachments/assets/c67bcd27-26cf-47f5-9575-3cd5684d006b" /> <img width="484" height="680" alt="Screenshot_2025-10-20_at_11 45 14" src="https://github.com/user-attachments/assets/68725cc6-b3ec-4098-99ca-f9a717d6f8f1" /> <img width="490" height="643" alt="Screenshot_2025-10-20_at_11 45 05" src="https://github.com/user-attachments/assets/b68a5809-33ff-4452-b48b-741aff7f1dd6" /> <img width="685" height="662" alt="Screenshot 2025-10-20 at 13 15 01" src="https://github.com/user-attachments/assets/eeb5207b-de5c-4b18-bdde-392892053dab" />
This commit is contained in:
+2
-2
@@ -1,7 +1,7 @@
|
||||
import { Field, ObjectType } from '@nestjs/graphql';
|
||||
|
||||
@ObjectType()
|
||||
export class AutocompleteResultDto {
|
||||
@ObjectType('AutocompleteResult')
|
||||
export class AutocompleteResultDTO {
|
||||
@Field()
|
||||
text: string;
|
||||
|
||||
|
||||
+6
-6
@@ -1,7 +1,7 @@
|
||||
import { Field, Float, ObjectType } from '@nestjs/graphql';
|
||||
|
||||
@ObjectType()
|
||||
export class LocationDto {
|
||||
@ObjectType('Location')
|
||||
export class LocationDTO {
|
||||
@Field(() => Float, { nullable: true })
|
||||
lat?: number;
|
||||
|
||||
@@ -9,8 +9,8 @@ export class LocationDto {
|
||||
lng?: number;
|
||||
}
|
||||
|
||||
@ObjectType()
|
||||
export class PlaceDetailsResultDto {
|
||||
@ObjectType('PlaceDetailsResult')
|
||||
export class PlaceDetailsResultDTO {
|
||||
@Field({ nullable: true })
|
||||
state?: string;
|
||||
|
||||
@@ -23,6 +23,6 @@ export class PlaceDetailsResultDto {
|
||||
@Field({ nullable: true })
|
||||
country?: string;
|
||||
|
||||
@Field(() => LocationDto, { nullable: true })
|
||||
location?: LocationDto;
|
||||
@Field(() => LocationDTO, { nullable: true })
|
||||
location?: LocationDTO;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { UseGuards } from '@nestjs/common';
|
||||
import { Args, Query, Resolver } from '@nestjs/graphql';
|
||||
|
||||
import { AutocompleteResultDto } from 'src/engine/core-modules/geo-map/dtos/autocomplete-result.dto';
|
||||
import { PlaceDetailsResultDto } from 'src/engine/core-modules/geo-map/dtos/place-details-result.dto';
|
||||
import { AutocompleteResultDTO } from 'src/engine/core-modules/geo-map/dtos/autocomplete-result.dto';
|
||||
import { PlaceDetailsResultDTO } from 'src/engine/core-modules/geo-map/dtos/place-details-result.dto';
|
||||
import { GeoMapService } from 'src/engine/core-modules/geo-map/services/geo-map.service';
|
||||
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
|
||||
|
||||
@@ -11,7 +11,7 @@ import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
|
||||
export class GeoMapResolver {
|
||||
constructor(private readonly geoMapService: GeoMapService) {}
|
||||
|
||||
@Query(() => [AutocompleteResultDto])
|
||||
@Query(() => [AutocompleteResultDTO])
|
||||
async getAutoCompleteAddress(
|
||||
@Args('address') address: string,
|
||||
@Args('token') token: string,
|
||||
@@ -26,7 +26,7 @@ export class GeoMapResolver {
|
||||
);
|
||||
}
|
||||
|
||||
@Query(() => PlaceDetailsResultDto)
|
||||
@Query(() => PlaceDetailsResultDTO)
|
||||
async getAddressDetails(
|
||||
@Args('placeId') placeId: string,
|
||||
@Args('token') token: string,
|
||||
|
||||
Reference in New Issue
Block a user