rl-core-front 0.19.8 → 0.19.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/_services/api/schema.d.ts +42 -4
- package/src/_utils/format.ts +37 -0
- package/src/components/ui/data-table.tsx +94 -2
- package/src/components/ui/segmented-control.tsx +33 -0
- package/src/features/queues/components/index.ts +2 -0
- package/src/features/queues/components/queue-job-detail.tsx +224 -0
- package/src/features/queues/hooks/use-queue-jobs.ts +140 -58
- package/src/features/queues/queues-screen.tsx +126 -104
- package/src/features/queues/services/queues.service.ts +43 -8
- package/src/i18n/messages/en.ts +13 -1
- package/src/i18n/messages/pt.ts +13 -1
- package/src/index.ts +5 -0
|
@@ -4,6 +4,8 @@ import type { components } from "#core/_services/api/schema";
|
|
|
4
4
|
/** Tipos derivados do `openapi.json` (§5) — não redigitar a forma da resposta. */
|
|
5
5
|
export type QueueJob = components["schemas"]["QueueJobResponse"];
|
|
6
6
|
export type QueueCounts = components["schemas"]["QueueCountsResponse"];
|
|
7
|
+
export type QueueStateCounts =
|
|
8
|
+
components["schemas"]["QueueStateCountsResponse"];
|
|
7
9
|
|
|
8
10
|
export interface Paginated<T> {
|
|
9
11
|
items: T[];
|
|
@@ -27,15 +29,40 @@ export enum QueueJobState {
|
|
|
27
29
|
/**
|
|
28
30
|
* As filas do sistema. Espelha o `QUEUE_NAMES` do backend.
|
|
29
31
|
*
|
|
30
|
-
* São
|
|
31
|
-
*
|
|
32
|
-
* consumidor de relatórios roubar o trabalho
|
|
32
|
+
* São três porque cada consumidor isolado tem a sua: um worker do BullMQ puxa
|
|
33
|
+
* **qualquer** job da fila em que está registrado, sem filtrar por nome, então
|
|
34
|
+
* misturá-las faria o consumidor de relatórios roubar o trabalho da conversão de
|
|
35
|
+
* imagem e falhar por não ter handler para ele.
|
|
33
36
|
*/
|
|
34
37
|
export enum QueueName {
|
|
35
38
|
JOBS = "jobs",
|
|
36
39
|
EXPORTS = "exports",
|
|
40
|
+
IMAGES = "images",
|
|
37
41
|
}
|
|
38
42
|
|
|
43
|
+
/**
|
|
44
|
+
* "Todas as filas" — o que a tela mostra por padrão.
|
|
45
|
+
*
|
|
46
|
+
* Espelha o `ALL_QUEUES` do backend, e existe porque a fila não é um modo de
|
|
47
|
+
* tela: quem entra aqui quer saber o que falhou no sistema, não o que falhou em
|
|
48
|
+
* `exports` e depois em `images`, um par de cada vez. Vale só para ler — as
|
|
49
|
+
* ações mandam a fila do próprio job (`job.queue`), porque o id do BullMQ é uma
|
|
50
|
+
* sequência por fila.
|
|
51
|
+
*/
|
|
52
|
+
export const ALL_QUEUES = "all";
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* A fila de um job, como a API a devolve.
|
|
56
|
+
*
|
|
57
|
+
* Vem do schema, e não do `QueueName`: quem chama passa tanto `QueueName.IMAGES`
|
|
58
|
+
* quanto o `job.queue` que veio da resposta, e um `enum` de string do TypeScript
|
|
59
|
+
* aceita o primeiro e recusa o segundo — o valor da API é um literal, e literal
|
|
60
|
+
* não entra em `enum`. Assim os dois servem, sem `as` em lugar nenhum.
|
|
61
|
+
*/
|
|
62
|
+
export type QueueJobQueue = QueueJob["queue"];
|
|
63
|
+
|
|
64
|
+
export type QueueScope = QueueJobQueue | typeof ALL_QUEUES;
|
|
65
|
+
|
|
39
66
|
export interface QueueJobsQuery {
|
|
40
67
|
state: QueueJobState;
|
|
41
68
|
page: number;
|
|
@@ -43,11 +70,18 @@ export interface QueueJobsQuery {
|
|
|
43
70
|
/** Campo da whitelist do backend (`SORTABLE_JOB_FIELDS`). */
|
|
44
71
|
sortBy?: string;
|
|
45
72
|
sortDir?: "ASC" | "DESC";
|
|
46
|
-
queue?:
|
|
73
|
+
queue?: QueueScope;
|
|
47
74
|
}
|
|
48
75
|
|
|
49
76
|
export const queuesService = {
|
|
50
|
-
|
|
77
|
+
/**
|
|
78
|
+
* O total de cada estado e o recorte de cada fila, numa resposta.
|
|
79
|
+
*
|
|
80
|
+
* Os dois juntos porque a tela precisa dos dois: o total vira cartão, e o
|
|
81
|
+
* recorte vira o número ao lado de cada fila — que é o que diz onde está a
|
|
82
|
+
* falha antes de alguém clicar.
|
|
83
|
+
*/
|
|
84
|
+
counts(queue?: QueueScope): Promise<QueueCounts> {
|
|
51
85
|
return api
|
|
52
86
|
.get<QueueCounts>("/queues/counts", { params: { queue } })
|
|
53
87
|
.then((r) => r.data);
|
|
@@ -57,7 +91,8 @@ export const queuesService = {
|
|
|
57
91
|
* Uma página de jobs de **um** estado.
|
|
58
92
|
*
|
|
59
93
|
* O estado é obrigatório: no Redis cada estado é uma estrutura própria, e
|
|
60
|
-
* "todos" não é uma consulta que exista.
|
|
94
|
+
* "todos" não é uma consulta que exista. A fila, sim — com `all` o backend
|
|
95
|
+
* junta as três e intercala pelo mais recente.
|
|
61
96
|
*/
|
|
62
97
|
list(query: QueueJobsQuery): Promise<Paginated<QueueJob>> {
|
|
63
98
|
return api
|
|
@@ -65,13 +100,13 @@ export const queuesService = {
|
|
|
65
100
|
.then((r) => r.data);
|
|
66
101
|
},
|
|
67
102
|
|
|
68
|
-
retry(id: string, queue
|
|
103
|
+
retry(id: string, queue: QueueJobQueue): Promise<void> {
|
|
69
104
|
return api
|
|
70
105
|
.post(`/queues/jobs/${id}/retry`, undefined, { params: { queue } })
|
|
71
106
|
.then(() => undefined);
|
|
72
107
|
},
|
|
73
108
|
|
|
74
|
-
remove(id: string, queue
|
|
109
|
+
remove(id: string, queue: QueueJobQueue): Promise<void> {
|
|
75
110
|
return api
|
|
76
111
|
.delete(`/queues/jobs/${id}`, { params: { queue } })
|
|
77
112
|
.then(() => undefined);
|
package/src/i18n/messages/en.ts
CHANGED
|
@@ -127,9 +127,20 @@ export const en: Messages = {
|
|
|
127
127
|
stateFailed: "Failed",
|
|
128
128
|
stateDelayed: "Delayed",
|
|
129
129
|
queue: "Queue",
|
|
130
|
+
queueAll: "All",
|
|
130
131
|
queueJobs: "General",
|
|
131
132
|
queueExports: "Reports",
|
|
132
|
-
|
|
133
|
+
queueImages: "Images",
|
|
134
|
+
payload: "Job payload",
|
|
135
|
+
result: "Result",
|
|
136
|
+
finishedAt: "Finished at",
|
|
137
|
+
duration: "Duration",
|
|
138
|
+
attemptsOf: "{made} of {max}",
|
|
139
|
+
stacktrace: "Stack trace",
|
|
140
|
+
stacktraceAttempt: "Stack trace — attempt {n}",
|
|
141
|
+
copyError: "Copy error",
|
|
142
|
+
copied: "Error copied",
|
|
143
|
+
copyFailed: "Could not copy",
|
|
133
144
|
},
|
|
134
145
|
shortcuts: {
|
|
135
146
|
title: "Keyboard shortcuts",
|
|
@@ -198,6 +209,7 @@ export const en: Messages = {
|
|
|
198
209
|
view: "List format",
|
|
199
210
|
viewList: "List",
|
|
200
211
|
viewGrid: "Cards",
|
|
212
|
+
detail: "Show row details",
|
|
201
213
|
reorder: "Drag to reorder",
|
|
202
214
|
reorderSorted: "Clear the column sorting to drag rows",
|
|
203
215
|
reorderGrouped: "Rows cannot be reordered while the list is grouped",
|
package/src/i18n/messages/pt.ts
CHANGED
|
@@ -129,9 +129,20 @@ export const pt = {
|
|
|
129
129
|
stateFailed: "Falhos",
|
|
130
130
|
stateDelayed: "Agendados",
|
|
131
131
|
queue: "Fila",
|
|
132
|
+
queueAll: "Todas",
|
|
132
133
|
queueJobs: "Geral",
|
|
133
134
|
queueExports: "Relatórios",
|
|
134
|
-
|
|
135
|
+
queueImages: "Imagens",
|
|
136
|
+
payload: "Conteúdo do job",
|
|
137
|
+
result: "Resultado",
|
|
138
|
+
finishedAt: "Terminou em",
|
|
139
|
+
duration: "Duração",
|
|
140
|
+
attemptsOf: "{made} de {max}",
|
|
141
|
+
stacktrace: "Rastro do erro",
|
|
142
|
+
stacktraceAttempt: "Rastro do erro — tentativa {n}",
|
|
143
|
+
copyError: "Copiar erro",
|
|
144
|
+
copied: "Erro copiado",
|
|
145
|
+
copyFailed: "Não foi possível copiar",
|
|
135
146
|
},
|
|
136
147
|
shortcuts: {
|
|
137
148
|
title: "Atalhos de teclado",
|
|
@@ -200,6 +211,7 @@ export const pt = {
|
|
|
200
211
|
view: "Formato da listagem",
|
|
201
212
|
viewList: "Lista",
|
|
202
213
|
viewGrid: "Cartões",
|
|
214
|
+
detail: "Ver detalhes da linha",
|
|
203
215
|
reorder: "Arraste para reordenar",
|
|
204
216
|
reorderSorted:
|
|
205
217
|
"Limpe a ordenação por coluna para arrastar as linhas",
|
package/src/index.ts
CHANGED
|
@@ -24,10 +24,15 @@ export { QueuesScreen } from "#core/features/queues/queues-screen";
|
|
|
24
24
|
export type {
|
|
25
25
|
QueueCounts,
|
|
26
26
|
QueueJob,
|
|
27
|
+
QueueJobQueue,
|
|
27
28
|
QueueJobsQuery,
|
|
29
|
+
QueueScope,
|
|
30
|
+
QueueStateCounts,
|
|
28
31
|
} from "#core/features/queues/services/queues.service";
|
|
29
32
|
export {
|
|
33
|
+
ALL_QUEUES,
|
|
30
34
|
QueueJobState,
|
|
35
|
+
QueueName,
|
|
31
36
|
queuesService,
|
|
32
37
|
} from "#core/features/queues/services/queues.service";
|
|
33
38
|
export { RbacScreen } from "#core/features/rbac/rbac-screen";
|